Index: /trunk/src/VBox/Main/include/USBProxyBackend.h
===================================================================
--- /trunk/src/VBox/Main/include/USBProxyBackend.h	(revision 60757)
+++ /trunk/src/VBox/Main/include/USBProxyBackend.h	(revision 60758)
@@ -56,4 +56,6 @@
     virtual const com::Utf8Str &i_getBackend();
     uint32_t i_getRefCount();
+
+    virtual bool i_isDevReEnumerationRequired();
 
     /** @name Interface for the USBController and the Host object.
@@ -156,4 +158,6 @@
     virtual void releaseDeviceCompleted(HostUSBDevice *aDevice, bool aSuccess);
 
+    virtual bool i_isDevReEnumerationRequired();
+
 protected:
     virtual int wait(RTMSINTERVAL aMillies);
@@ -294,4 +298,6 @@
     virtual void releaseDeviceCompleted(HostUSBDevice *aDevice, bool aSuccess);
 
+    virtual bool i_isDevReEnumerationRequired();
+
 protected:
     virtual int wait(RTMSINTERVAL aMillies);
@@ -324,4 +330,6 @@
     virtual int captureDevice (HostUSBDevice *aDevice);
     virtual int releaseDevice (HostUSBDevice *aDevice);
+
+    virtual bool i_isDevReEnumerationRequired();
 
 protected:
Index: /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp	(revision 60757)
+++ /trunk/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp	(revision 60758)
@@ -469,9 +469,9 @@
      */
     LogFlowThisFunc(("{%s} capturing the device.\n", mName));
-#if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS) || defined(RT_OS_SOLARIS) /* PORTME */
-    i_setState(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_UsedByVM, kHostUSBDeviceSubState_AwaitingDetach);
-#else
-    i_setState(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_UsedByVM);
-#endif
+    if (mUSBProxyBackend->i_isDevReEnumerationRequired())
+        i_setState(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_UsedByVM, kHostUSBDeviceSubState_AwaitingDetach);
+    else
+        i_setState(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_UsedByVM);
+
     mMachine = aMachine;
     mMaskedIfs = aMaskedIfs;
@@ -731,9 +731,9 @@
      * Try release it.
      */
-#if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS) /* PORTME */
-    i_startTransition(kHostUSBDeviceState_ReleasingToHost, kHostUSBDeviceState_Unused, kHostUSBDeviceSubState_AwaitingDetach);
-#else
-    i_startTransition(kHostUSBDeviceState_ReleasingToHost, kHostUSBDeviceState_Unused);
-#endif
+    if (mUSBProxyBackend->i_isDevReEnumerationRequired())
+        i_startTransition(kHostUSBDeviceState_ReleasingToHost, kHostUSBDeviceState_Unused, kHostUSBDeviceSubState_AwaitingDetach);
+    else
+        i_startTransition(kHostUSBDeviceState_ReleasingToHost, kHostUSBDeviceState_Unused);
+
     alock.release();
     int rc = mUSBProxyBackend->releaseDevice(this);
@@ -784,9 +784,9 @@
      * Do the job.
      */
-#if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS) /* PORTME */
-    i_startTransition(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_HeldByProxy, kHostUSBDeviceSubState_AwaitingDetach);
-#else
-    i_startTransition(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_HeldByProxy);
-#endif
+    if (mUSBProxyBackend->i_isDevReEnumerationRequired())
+        i_startTransition(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_HeldByProxy, kHostUSBDeviceSubState_AwaitingDetach);
+    else
+        i_startTransition(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_HeldByProxy);
+
     alock.release();
     int rc = mUSBProxyBackend->captureDevice(this);
Index: /trunk/src/VBox/Main/src-server/USBProxyBackend.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/USBProxyBackend.cpp	(revision 60757)
+++ /trunk/src/VBox/Main/src-server/USBProxyBackend.cpp	(revision 60758)
@@ -234,4 +234,13 @@
 
 bool USBProxyBackend::isFakeUpdateRequired()
+{
+    return false;
+}
+
+/**
+ * Returns whether devices reported by this backend go through a de/re-attach
+ * and device re-enumeration cycle when they are captured or released.
+ */
+bool USBProxyBackend::i_isDevReEnumerationRequired()
 {
     return false;
Index: /trunk/src/VBox/Main/src-server/darwin/USBProxyBackendDarwin.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/darwin/USBProxyBackendDarwin.cpp	(revision 60757)
+++ /trunk/src/VBox/Main/src-server/darwin/USBProxyBackendDarwin.cpp	(revision 60758)
@@ -222,4 +222,14 @@
 
 
+/**
+ * Returns whether devices reported by this backend go through a de/re-attach
+ * and device re-enumeration cycle when they are captured or released.
+ */
+bool USBProxyBackendDarwin::i_isDevReEnumerationRequired()
+{
+    return true;
+}
+
+
 int USBProxyBackendDarwin::wait(RTMSINTERVAL aMillies)
 {
Index: /trunk/src/VBox/Main/src-server/solaris/USBProxyBackendSolaris.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/solaris/USBProxyBackendSolaris.cpp	(revision 60757)
+++ /trunk/src/VBox/Main/src-server/solaris/USBProxyBackendSolaris.cpp	(revision 60758)
@@ -461,4 +461,14 @@
 
 /**
+ * Returns whether devices reported by this backend go through a de/re-attach
+ * and device re-enumeration cycle when they are captured or released.
+ */
+bool USBProxyBackendSolaris::i_isDevReEnumerationRequired()
+{
+    return true;
+}
+
+
+/**
  * Wrapper called by walkDeviceNode.
  *
Index: /trunk/src/VBox/Main/src-server/win/USBProxyBackendWindows.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/win/USBProxyBackendWindows.cpp	(revision 60757)
+++ /trunk/src/VBox/Main/src-server/win/USBProxyBackendWindows.cpp	(revision 60758)
@@ -227,4 +227,14 @@
 
 
+/**
+ * Returns whether devices reported by this backend go through a de/re-attach
+ * and device re-enumeration cycle when they are captured or released.
+ */
+bool USBProxyBackendWindows::i_isDevReEnumerationRequired()
+{
+    return true;
+}
+
+
 int USBProxyBackendWindows::wait(unsigned aMillies)
 {
