diff --git a/cores/arduino/USB/PluggableUSB.cpp b/cores/arduino/USB/PluggableUSB.cpp
index 0f2d08c0d8d49efb5b0631e63ce5f2b446b1b6a2..4c52c1fad7434b49beb524f0884ee8d15543598f 100644
--- a/cores/arduino/USB/PluggableUSB.cpp
+++ b/cores/arduino/USB/PluggableUSB.cpp
@@ -52,6 +52,15 @@ int PluggableUSB_::getDescriptor(USBSetup& setup)
 	return 0;
 }
 
+void PluggableUSB_::getShortName(char *iSerialNum)
+{
+       PluggableUSBModule* node;
+       for (node = rootNode; node; node = node->next) {
+               iSerialNum += node->getShortName(iSerialNum);
+       }
+       *iSerialNum = 0;
+}
+
 bool PluggableUSB_::setup(USBSetup& setup)
 {
 	PluggableUSBModule* node;
diff --git a/cores/arduino/USB/PluggableUSB.h b/cores/arduino/USB/PluggableUSB.h
index eb18ca2537a030e09186a47b57b6f39e7a6365b5..4e08e5dfcb5a78dd58cf198480d19d0a27e2669f 100644
--- a/cores/arduino/USB/PluggableUSB.h
+++ b/cores/arduino/USB/PluggableUSB.h
@@ -35,6 +35,7 @@ protected:
   virtual bool setup(USBSetup& setup) = 0;
   virtual int getInterface(uint8_t* interfaceCount) = 0;
   virtual int getDescriptor(USBSetup& setup) = 0;
+  virtual uint8_t getShortName(char *name) { name[0] = 'A'+pluggedInterface; return 1; }
 
   uint8_t pluggedInterface;
   uint8_t pluggedEndpoint;
@@ -55,6 +56,7 @@ public:
   int getInterface(uint8_t* interfaceCount);
   int getDescriptor(USBSetup& setup);
   bool setup(USBSetup& setup);
+  void getShortName(char *iSerialNum);
 
 private:
   uint8_t lastIf;
diff --git a/cores/arduino/USB/USBCore.cpp b/cores/arduino/USB/USBCore.cpp
index a584a638e6e15026fbccea3b8f10ac00be08f4cf..9642c2aadc80b0a2a02b55fe5c7166f88dc7989a 100644
--- a/cores/arduino/USB/USBCore.cpp
+++ b/cores/arduino/USB/USBCore.cpp
@@ -66,8 +66,8 @@ const uint8_t STRING_MANUFACTURER[] = USB_MANUFACTURER;
 
 
 //	DEVICE DESCRIPTOR
-const DeviceDescriptor USB_DeviceDescriptorB = D_DEVICE(0xEF, 0x02, 0x01, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, 0, 1);
-const DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0x00, 0x00, 0x00, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, 0, 1);
+const DeviceDescriptor USB_DeviceDescriptorB = D_DEVICE(0xEF, 0x02, 0x01, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, ISERIAL, 1);
+const DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0x00, 0x00, 0x00, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, ISERIAL, 1);
 
 //==================================================================
 
@@ -208,6 +208,13 @@ bool USBDeviceClass::sendDescriptor(USBSetup &setup)
 		else if (setup.wValueL == IMANUFACTURER) {
 			return sendStringDescriptor(STRING_MANUFACTURER, setup.wLength);
 		}
+		else if (setup.wValueL == ISERIAL) {
+#ifdef PLUGGABLE_USB_ENABLED
+			char name[ISERIAL_MAX_LEN];
+			PluggableUSB().getShortName(name);
+			return sendStringDescriptor((uint8_t*)name, setup.wLength);
+#endif
+		}
 		else {
 			return false;
 		}
diff --git a/cores/arduino/USB/USBDesc.h b/cores/arduino/USB/USBDesc.h
index 2282a71820d86f1b3201e36d721dc146a4996d05..e4335aa911655ddf4e15760d155519867d7189ae 100644
--- a/cores/arduino/USB/USBDesc.h
+++ b/cores/arduino/USB/USBDesc.h
@@ -41,8 +41,11 @@
 #define CDC_TX CDC_ENDPOINT_IN
 #endif
 
+#define ISERIAL_MAX_LEN        20
+
 // Defined string description
 #define IMANUFACTURER	1
-#define IPRODUCT		2
+#define IPRODUCT    2
+#define ISERIAL    3
 
 #endif /* __USBDESC_H__ */
diff --git a/libraries/HID/HID.cpp b/libraries/HID/HID.cpp
index 94bf9f5985e3743967f68c2150f65a1d3c10e762..34995fe67881168f3bf973df0e378e7924c74ca4 100644
--- a/libraries/HID/HID.cpp
+++ b/libraries/HID/HID.cpp
@@ -60,6 +60,16 @@ int HID_::getDescriptor(USBSetup& setup)
 	return total;
 }
 
+uint8_t HID_::getShortName(char *name)
+{
+       name[0] = 'H';
+       name[1] = 'I';
+       name[2] = 'D';
+       name[3] = 'A' + (descriptorSize & 0x0F);
+       name[4] = 'A' + ((descriptorSize >> 4) & 0x0F);
+       return 5;
+}
+
 void HID_::AppendDescriptor(HIDSubDescriptor *node)
 {
 	if (!rootNode) {
diff --git a/libraries/HID/HID.h b/libraries/HID/HID.h
index e5dfa3395322c330550bf51ecedc4f6b229118d1..9499b726c0b1763317c64b473c6a894c543628fb 100644
--- a/libraries/HID/HID.h
+++ b/libraries/HID/HID.h
@@ -96,6 +96,7 @@ protected:
   int getInterface(uint8_t* interfaceCount);
   int getDescriptor(USBSetup& setup);
   bool setup(USBSetup& setup);
+  uint8_t getShortName(char* name);
 
 private:
   uint32_t epType[1];