Index: trunk/include/VBox/log.h
===================================================================
--- trunk/include/VBox/log.h	(revision 40644)
+++ trunk/include/VBox/log.h	(revision 40652)
@@ -260,4 +260,6 @@
     /** The common network service group */
     LOG_GROUP_NET_SERVICE,
+    /** Network traffic shaper driver group. */
+    LOG_GROUP_NET_SHAPER,
     /** PATM group. */
     LOG_GROUP_PATM,
@@ -491,4 +493,5 @@
     "NET_FLT_DRV",  \
     "NET_SERVICE",  \
+    "NET_SHAPER",   \
     "PATM",         \
     "PDM",          \
Index: trunk/include/VBox/vmm/mm.h
===================================================================
--- trunk/include/VBox/vmm/mm.h	(revision 40644)
+++ trunk/include/VBox/vmm/mm.h	(revision 40652)
@@ -101,4 +101,7 @@
     MM_TAG_PDM_USB_USER,
     MM_TAG_PDM_LUN,
+#ifdef VBOX_WITH_NETSHAPER
+    MM_TAG_PDM_NET_SHAPER,
+#endif /* VBOX_WITH_NETSHAPER */
     MM_TAG_PDM_QUEUE,
     MM_TAG_PDM_THREAD,
Index: trunk/include/VBox/vmm/pdmdrv.h
===================================================================
--- trunk/include/VBox/vmm/pdmdrv.h	(revision 40644)
+++ trunk/include/VBox/vmm/pdmdrv.h	(revision 40652)
@@ -34,4 +34,7 @@
 #include <VBox/vmm/pdmcommon.h>
 #include <VBox/vmm/pdmasynccompletion.h>
+#ifdef VBOX_WITH_NETSHAPER
+#include <VBox/vmm/pdmnetshaper.h>
+#endif /* VBOX_WITH_NETSHAPER */
 #include <VBox/vmm/pdmblkcache.h>
 #include <VBox/vmm/tm.h>
@@ -1165,4 +1168,27 @@
                                                                 const char *pszDesc));
 
+#ifdef VBOX_WITH_NETSHAPER
+    /**
+     * Attaches network filter driver to a bandwidth group.
+     *
+     * @returns VBox status code.
+     * @param   pDrvIns         The driver instance.
+     * @param   pcszBwGroup     Name of the bandwidth group to attach to.
+     * @param   pFilter         Pointer to the filter we attach.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnNetShaperAttach,(PPDMDRVINS pDrvIns, const char *pszBwGroup,
+                                                  PPDMNSFILTER pFilter));
+
+
+    /**
+     * Detaches network filter driver to a bandwidth group.
+     *
+     * @returns VBox status code.
+     * @param   pDrvIns         The driver instance.
+     * @param   pFilter         Pointer to the filter we attach.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnNetShaperDetach,(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter));
+#endif /* VBOX_WITH_NETSHAPER */
+
 
     /**
@@ -1704,4 +1730,22 @@
 # endif
 
+# ifdef VBOX_WITH_NETSHAPER
+/**
+ * @copydoc PDMDRVHLP::pfnNetShaperAttach
+ */
+DECLINLINE(int) PDMDrvHlpNetShaperAttach(PPDMDRVINS pDrvIns, const char *pcszBwGroup, PPDMNSFILTER pFilter)
+{
+    return pDrvIns->pHlpR3->pfnNetShaperAttach(pDrvIns, pcszBwGroup, pFilter);
+}
+
+/**
+ * @copydoc PDMDRVHLP::pfnNetShaperDetach
+ */
+DECLINLINE(int) PDMDrvHlpNetShaperDetach(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter)
+{
+    return pDrvIns->pHlpR3->pfnNetShaperDetach(pDrvIns, pFilter);
+}
+# endif
+
 /**
  * @copydoc PDMDRVHLP::pfnCritSectInit
Index: trunk/include/VBox/vmm/pdmnetshaper.h
===================================================================
--- trunk/include/VBox/vmm/pdmnetshaper.h	(revision 40652)
+++ trunk/include/VBox/vmm/pdmnetshaper.h	(revision 40652)
@@ -0,0 +1,99 @@
+/** @file
+ * PDM - Pluggable Device Manager, Network Shaper.
+ */
+
+/*
+ * Copyright (C) 2007-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___VBox_vmm_pdmnetshaper_h
+#define ___VBox_vmm_pdmnetshaper_h
+
+#include <VBox/types.h>
+#include <VBox/err.h>
+#include <VBox/vmm/pdmnetifs.h>
+#include <iprt/assert.h>
+#include <iprt/sg.h>
+
+
+#define PDM_NETSHAPER_MIN_BUCKET_SIZE 65536 /* bytes */
+#define PDM_NETSHAPER_MAX_LATENCY     100   /* milliseconds */
+
+RT_C_DECLS_BEGIN
+
+typedef struct PDMNSFILTER
+{
+    /** [R3] Pointer to the next group in the list. */
+    struct PDMNSFILTER      *pNext;
+    /** [R3] Pointer to the bandwidth group. */
+    struct PDMNSBWGROUP     *pBwGroupR3;
+    /** Becomes true when filter fails to obtain bandwidth. */
+    bool                     fChoked;
+    /** The driver this filter is aggregated into. */
+    PPDMINETWORKDOWN         pIDrvNet;
+} PDMNSFILTER;
+
+/** @defgroup grp_pdm_net_shaper  The PDM Network Shaper API
+ * @ingroup grp_pdm
+ * @{
+ */
+
+/** Pointer to a PDM filter handle. */
+typedef struct PDMNSFILTER *PPDMNSFILTER;
+/** Pointer to a network shaper. */
+typedef struct PDMNETSHAPER *PPDMNETSHAPER;
+
+
+/**
+ * Obtain bandwidth in a bandwidth group.
+ *
+ * @returns VBox status code.
+ * @param   pFilter         Pointer to the filter that allocates bandwidth.
+ * @param   cbTransfer      Number of bytes to allocate.
+ */
+VMMR3DECL(bool) PDMR3NsAllocateBandwidth(PPDMNSFILTER pFilter, uint32_t cbTransfer);
+
+/**
+ * Attach network filter driver from bandwidth group.
+ *
+ * @returns VBox status code.
+ * @param   pVM             Handle of VM.
+ * @param   pDrvIns         The driver instance.
+ * @param   pcszBwGroup     Name of the bandwidth group to attach to.
+ * @param   pFilter         Pointer to the filter we attach.
+ */
+VMMR3DECL(int) PDMR3NsAttach(PVM pVM, PPDMDRVINS pDrvIns, const char *pcszBwGroup, PPDMNSFILTER pFilter);
+
+/**
+ * Detach network filter driver from bandwidth group.
+ *
+ * @returns VBox status code.
+ * @param   pVM             Handle of VM.
+ * @param   pDrvIns         The driver instance.
+ * @param   pFilter         Pointer to the filter we detach.
+ */
+VMMR3DECL(int) PDMR3NsDetach(PVM pVM, PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
