Index: /trunk/src/VBox/Devices/Network/DevE1000.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 47498)
+++ /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 47499)
@@ -6424,9 +6424,10 @@
     PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);
     bool fOldUp = !!(STATUS & STATUS_LU);
-    bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP;
-
+    bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME;
+
+    /* old state was connected but STATUS not yet written by guest */
     if (   fNewUp != fOldUp
-        || (!fNewUp && pThis->fCableConnected)) /* old state was connected but STATUS not
-                                                  * yet written by guest */
+        || (!fNewUp && pThis->fCableConnected)
+        || (pThis->fCableConnected && enmState == PDMNETWORKLINKSTATE_DOWN_RESUME))
     {
         if (fNewUp)
@@ -6449,6 +6450,16 @@
             e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
         }
+
         if (pThis->pDrvR3)
-            pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);
+        {
+            /*
+             * Send a UP link state to the driver below if the network adapter is only
+             * temproarily disconnected due to resume event.
+             */
+            if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
+                pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_UP);
+            else
+                pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);
+        }
     }
     return VINF_SUCCESS;
Index: /trunk/src/VBox/Devices/Network/DevPCNet.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevPCNet.cpp	(revision 47498)
+++ /trunk/src/VBox/Devices/Network/DevPCNet.cpp	(revision 47499)
@@ -4666,19 +4666,17 @@
     PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, INetworkConfig);
     bool fLinkUp;
-    if (    enmState != PDMNETWORKLINKSTATE_DOWN
-        &&  enmState != PDMNETWORKLINKSTATE_UP)
-    {
-        AssertMsgFailed(("Invalid parameter enmState=%d\n", enmState));
-        return VERR_INVALID_PARAMETER;
-    }
+
+    AssertMsgReturn(enmState > PDMNETWORKLINKSTATE_INVALID && enmState <= PDMNETWORKLINKSTATE_DOWN_RESUME,
+                    ("Invalid link state: enmState=%d\n", enmState), VERR_INVALID_PARAMETER);
 
     /* has the state changed? */
-    fLinkUp = enmState == PDMNETWORKLINKSTATE_UP;
-    if (pThis->fLinkUp != fLinkUp)
+    fLinkUp = enmState == PDMNETWORKLINKSTATE_UP || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME;
+    if (   pThis->fLinkUp != fLinkUp
+        || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
     {
         pThis->fLinkUp = fLinkUp;
         if (fLinkUp)
         {
-            /* connect  with a delay of 5 seconds */
+            /* Connect with a configured delay. */
             pThis->fLinkTempDown = true;
             pThis->cLinkDownReported = 0;
@@ -4697,5 +4695,14 @@
         Assert(!PDMCritSectIsOwner(&pThis->CritSect));
         if (pThis->pDrvR3)
-            pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);
+        {
+            /*
+             * Send a UP link state to the driver below if the network adapter is only
+             * temproarily disconnected due to resume event.
+             */
+            if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
+                pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_UP);
+            else
+                pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);
+        }
     }
     return VINF_SUCCESS;
Index: /trunk/src/VBox/Devices/Network/DevVirtioNet.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevVirtioNet.cpp	(revision 47498)
+++ /trunk/src/VBox/Devices/Network/DevVirtioNet.cpp	(revision 47499)
@@ -998,7 +998,8 @@
     PVNETSTATE pThis = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig);
     bool fOldUp = !!(STATUS & VNET_S_LINK_UP);
-    bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP;
-
-    if (fNewUp != fOldUp)
+    bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME;
+
+    if (   fNewUp != fOldUp
+        || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
     {
         if (fNewUp)
@@ -1015,5 +1016,14 @@
         }
         if (pThis->pDrv)
-            pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, enmState);
+        {
+            /*
+             * Send a UP link state to the driver below if the network adapter is only
+             * temproarily disconnected due to resume event.
+             */
+            if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
+                pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, PDMNETWORKLINKSTATE_UP);
+            else
+                pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, enmState);
+        }
     }
     return VINF_SUCCESS;
Index: /trunk/src/VBox/Devices/Network/DrvIntNet.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvIntNet.cpp	(revision 47498)
+++ /trunk/src/VBox/Devices/Network/DrvIntNet.cpp	(revision 47499)
@@ -1035,4 +1035,6 @@
     LogFlow(("drvR3IntNetPowerResume\n"));
     PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET);
+    VMRESUMEREASON enmReason = PDMDrvHlpVMGetResumeReason(pDrvIns);
+
     if (!pThis->fActivateEarlyDeactivateLate)
     {
@@ -1042,30 +1044,62 @@
         drvR3IntNetSetActive(pThis, true /* fActive */);
     }
-    if (   PDMDrvHlpVMTeleportedAndNotFullyResumedYet(pDrvIns)
-        && pThis->pIAboveConfigR3)
-    {
-        /*
-         * We've just been teleported and need to drop a hint to the switch
-         * since we're likely to have changed to a different port.  We just
-         * push out some ethernet frame that doesn't mean anything to anyone.
-         * For this purpose ethertype 0x801e was chosen since it was registered
-         * to Sun (dunno what it is/was used for though).
-         */
-        union
+
+    switch (enmReason)
+    {
+        case VMRESUMEREASON_HOST_RESUME:
         {
-            RTNETETHERHDR   Hdr;
-            uint8_t         ab[128];
-        } Frame;
-        RT_ZERO(Frame);
-        Frame.Hdr.DstMac.au16[0] = 0xffff;
-        Frame.Hdr.DstMac.au16[1] = 0xffff;
-        Frame.Hdr.DstMac.au16[2] = 0xffff;
-        Frame.Hdr.EtherType      = RT_H2BE_U16_C(0x801e);
-        int rc = pThis->pIAboveConfigR3->pfnGetMac(pThis->pIAboveConfigR3, &Frame.Hdr.SrcMac);
-        if (RT_SUCCESS(rc))
-            rc = drvR3IntNetResumeSend(pThis, &Frame, sizeof(Frame));
-        if (RT_FAILURE(rc))
-            LogRel(("IntNet#%u: Sending dummy frame failed: %Rrc\n", pDrvIns->iInstance, rc));
-    }
+            uint32_t u32TrunkType;
+            int rc = CFGMR3QueryU32(pDrvIns->pCfg, "TrunkType", &u32TrunkType);
+            AssertRC(rc);
+
+            /*
+             * Only do the disconnect for bridged networking. Host-only and
+             * internal networks are not affected by a host resume.
+             */
+            if (   RT_SUCCESS(rc)
+                && u32TrunkType == kIntNetTrunkType_NetFlt)
+            {
+                rc = pThis->pIAboveConfigR3->pfnSetLinkState(pThis->pIAboveConfigR3,
+                                                             PDMNETWORKLINKSTATE_DOWN_RESUME);
+                AssertRC(rc);
+            }
+            break;
+        }
+        case VMRESUMEREASON_TELEPORTED:
+        case VMRESUMEREASON_TELEPORT_FAILED:
+        {
+            if (   PDMDrvHlpVMTeleportedAndNotFullyResumedYet(pDrvIns)
+                   && pThis->pIAboveConfigR3)
+            {
+                /*
+                 * We've just been teleported and need to drop a hint to the switch
+                 * since we're likely to have changed to a different port.  We just
+                 * push out some ethernet frame that doesn't mean anything to anyone.
+                 * For this purpose ethertype 0x801e was chosen since it was registered
+                 * to Sun (dunno what it is/was used for though).
+                 */
+                union
+                {
+                    RTNETETHERHDR   Hdr;
+                    uint8_t         ab[128];
+                } Frame;
+                RT_ZERO(Frame);
+                Frame.Hdr.DstMac.au16[0] = 0xffff;
+                Frame.Hdr.DstMac.au16[1] = 0xffff;
+                Frame.Hdr.DstMac.au16[2] = 0xffff;
+                Frame.Hdr.EtherType      = RT_H2BE_U16_C(0x801e);
+                int rc = pThis->pIAboveConfigR3->pfnGetMac(pThis->pIAboveConfigR3, 
+                                                           &Frame.Hdr.SrcMac);
+                if (RT_SUCCESS(rc))
+                    rc = drvR3IntNetResumeSend(pThis, &Frame, sizeof(Frame));
+                if (RT_FAILURE(rc))
+                    LogRel(("IntNet#%u: Sending dummy frame failed: %Rrc\n", 
+                            pDrvIns->iInstance, rc));
+            }
+            break;
+        }
+        default: /* ignore every other resume reason else */
+            break;
+    } /* end of switch(enmReason) */
 }
 
Index: /trunk/src/VBox/Devices/Network/DrvNAT.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 47498)
+++ /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 47499)
@@ -970,4 +970,29 @@
     PDRVNAT pThis = PDMINS_2_DATA(pDrvIns, PDRVNAT);
     drvNATSetMac(pThis);
+}
+
+
+/**
+ * @interface_method_impl{PDMDEVREG,pfnResume}
+ */
+static DECLCALLBACK(void) drvNATResume(PPDMDRVINS pDrvIns)
+{
+    PDRVNAT pThis = PDMINS_2_DATA(pDrvIns, PDRVNAT);
+    VMRESUMEREASON enmReason = PDMDrvHlpVMGetResumeReason(pDrvIns);
+
+    switch (enmReason)
+    {
+        case VMRESUMEREASON_HOST_RESUME:
+            /*
+             * Host resumed from a suspend and the network might have changed.
+             * Disconnect the guest from the network temporarily to let it pick up the changes.
+             */
+            pThis->pIAboveConfig->pfnSetLinkState(pThis->pIAboveConfig, 
+                                                  PDMNETWORKLINKSTATE_DOWN_RESUME);
+            return;
+        default: /* Ignore every other resume reason. */
+            /* do nothing */
+            return;
+    }
 }
 
@@ -1446,5 +1471,5 @@
     NULL,
     /* pfnResume */
-    NULL,
+    drvNATResume,
     /* pfnAttach */
     NULL,
