Index: trunk/src/VBox/Frontends/VBoxManage/VBoxManageBandwidthControl.cpp
===================================================================
--- trunk/src/VBox/Frontends/VBoxManage/VBoxManageBandwidthControl.cpp	(revision 41881)
+++ trunk/src/VBox/Frontends/VBoxManage/VBoxManageBandwidthControl.cpp	(revision 41882)
@@ -82,6 +82,6 @@
             return "Invalid limit specifier\n";
     }
-    if (*pLimit <= 0)
-        return "Limit must be positive\n";
+    if (*pLimit < 0)
+        return "Limit cannot be negative\n";
     if (*pLimit > INT64_MAX / iMultiplier)
         return "Limit is too big\n";
Index: trunk/src/VBox/Main/src-server/BandwidthControlImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/BandwidthControlImpl.cpp	(revision 41881)
+++ trunk/src/VBox/Main/src-server/BandwidthControlImpl.cpp	(revision 41882)
@@ -412,7 +412,7 @@
 STDMETHODIMP BandwidthControl::CreateBandwidthGroup(IN_BSTR aName, BandwidthGroupType_T aType, LONG64 aMaxBytesPerSec)
 {
-    if (aMaxBytesPerSec <= 0)
+    if (aMaxBytesPerSec < 0)
         return setError(E_INVALIDARG,
-                        tr("Bandwidth group limit must be positive"));
+                        tr("Bandwidth group limit cannot be negative"));
 
     AutoCaller autoCaller(this);
Index: trunk/src/VBox/Main/src-server/BandwidthGroupImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/BandwidthGroupImpl.cpp	(revision 41881)
+++ trunk/src/VBox/Main/src-server/BandwidthGroupImpl.cpp	(revision 41882)
@@ -284,7 +284,7 @@
 STDMETHODIMP BandwidthGroup::COMSETTER(MaxBytesPerSec)(LONG64 aMaxBytesPerSec)
 {
-    if (aMaxBytesPerSec <= 0)
+    if (aMaxBytesPerSec < 0)
         return setError(E_INVALIDARG,
-                        tr("Bandwidth group limit must be positive"));
+                        tr("Bandwidth group limit cannot be negative"));
 
     AutoCaller autoCaller(this);
Index: trunk/src/VBox/VMM/VMMR3/PDMNetShaper.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR3/PDMNetShaper.cpp	(revision 41881)
+++ trunk/src/VBox/VMM/VMMR3/PDMNetShaper.cpp	(revision 41882)
@@ -243,4 +243,8 @@
     //int rc = RTCritSectEnter(&pBwGroup->cs); AssertRC(rc);
 
+    /* Check if the group is disabled. */
+    if (pBwGroup->cbTransferPerSecMax == 0)
+        return;
+
     PPDMNSFILTER pFilter = pBwGroup->pFiltersHead;
     while (pFilter)
@@ -370,23 +374,29 @@
     int rc = RTCritSectEnter(&pBwGroup->cs); AssertRC(rc);
     bool fAllowed = true;
-    /* Re-fill the bucket first */
-    uint64_t tsNow = RTTimeSystemNanoTS();
-    uint32_t uTokensAdded = (tsNow - pBwGroup->tsUpdatedLast)*pBwGroup->cbTransferPerSecMax/(1000*1000*1000);
-    uint32_t uTokens = RT_MIN(pBwGroup->cbBucketSize, uTokensAdded + pBwGroup->cbTokensLast);
-
-    if (cbTransfer > uTokens)
-    {
-        fAllowed = false;
-        ASMAtomicWriteBool(&pFilter->fChoked, true);
+    if (pBwGroup->cbTransferPerSecMax)
+    {
+        /* Re-fill the bucket first */
+        uint64_t tsNow = RTTimeSystemNanoTS();
+        uint32_t uTokensAdded = (tsNow - pBwGroup->tsUpdatedLast)*pBwGroup->cbTransferPerSecMax/(1000*1000*1000);
+        uint32_t uTokens = RT_MIN(pBwGroup->cbBucketSize, uTokensAdded + pBwGroup->cbTokensLast);
+
+        if (cbTransfer > uTokens)
+        {
+            fAllowed = false;
+            ASMAtomicWriteBool(&pFilter->fChoked, true);
+        }
+        else
+        {
+            pBwGroup->tsUpdatedLast = tsNow;
+            pBwGroup->cbTokensLast = uTokens - cbTransfer;
+        }
+        Log2((LOG_FN_FMT "BwGroup=%#p{%s} cbTransfer=%u uTokens=%u uTokensAdded=%u fAllowed=%RTbool\n",
+              __PRETTY_FUNCTION__, pBwGroup, pBwGroup->pszName, cbTransfer, uTokens, uTokensAdded, fAllowed));
     }
     else
-    {
-        pBwGroup->tsUpdatedLast = tsNow;
-        pBwGroup->cbTokensLast = uTokens - cbTransfer;
-    }
+        Log2((LOG_FN_FMT "BwGroup=%#p{%s} disabled fAllowed=%RTbool\n",
+              __PRETTY_FUNCTION__, pBwGroup, pBwGroup->pszName, fAllowed));
 
     rc = RTCritSectLeave(&pBwGroup->cs); AssertRC(rc);
-    Log2((LOG_FN_FMT "BwGroup=%#p{%s} cbTransfer=%u uTokens=%u uTokensAdded=%u fAllowed=%RTbool\n",
-          __PRETTY_FUNCTION__, pBwGroup, pBwGroup->pszName, cbTransfer, uTokens, uTokensAdded, fAllowed));
     return fAllowed;
 }
