Index: /trunk/src/VBox/Devices/Network/DrvNAT.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 35921)
+++ /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 35922)
@@ -472,6 +472,5 @@
         {
             RTMemFree(pSgBuf);
-            /** @todo Implement the VERR_TRY_AGAIN semantics. */
-            return VERR_NO_MEMORY;
+            return VERR_TRY_AGAIN;
         }
     }
@@ -487,6 +486,5 @@
             RTMemFree(pSgBuf->pvUser);
             RTMemFree(pSgBuf);
-            /** @todo Implement the VERR_TRY_AGAIN semantics. */
-            return VERR_NO_MEMORY;
+            return VERR_TRY_AGAIN;
         }
     }
@@ -907,4 +905,14 @@
     AssertRC(rc);
     drvNATUrgRecvWakeup(pThis->pDrvIns, pThis->pUrgRecvThread);
+}
+
+/**
+ * Function called by slirp to wake up device after VERR_TRY_AGAIN
+ */
+void slirp_output_pending(void *pvUser)
+{
+    PDRVNAT pThis = (PDRVNAT)pvUser;
+    Assert(pThis);
+    pThis->pIAboveNet->pfnXmitPending(pThis->pIAboveNet);
 }
 
Index: /trunk/src/VBox/Devices/Network/slirp/libslirp.h
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/libslirp.h	(revision 35921)
+++ /trunk/src/VBox/Devices/Network/slirp/libslirp.h	(revision 35922)
@@ -70,4 +70,5 @@
 int slirp_can_output(void * pvUser);
 void slirp_output(void * pvUser, struct mbuf *m, const uint8_t *pkt, int pkt_len);
+void slirp_output_pending(void * pvUser);
 void slirp_urg_output(void *pvUser, struct mbuf *, const uint8_t *pu8Buf, int cb);
 void slirp_post_sent(PNATState pData, void *pvArg);
Index: /trunk/src/VBox/Devices/Network/slirp/misc.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/misc.c	(revision 35921)
+++ /trunk/src/VBox/Devices/Network/slirp/misc.c	(revision 35922)
@@ -126,6 +126,21 @@
     uma_zone_t master_zone;
     void *area;
+    bool fPending;  /* has some sense only in case master_zone == NULL */
 };
 
+static inline bool slirp_zone_has_pending(uma_zone_t zone)
+{
+    return (   zone->master_zone == NULL
+            && zone->fPending);
+}
+
+static inline void slirp_zone_check_and_send_pending(uma_zone_t zone)
+{
+    if (slirp_zone_has_pending(zone))
+    {
+        zone->fPending = false;
+        slirp_output_pending(zone->pData->pvUser);
+    }
+}
 
 static void *slirp_uma_alloc(uma_zone_t zone,
@@ -152,8 +167,10 @@
                 LIST_REMOVE(it, list);
                 LIST_INSERT_HEAD(&zone->used_items, it, list);
+                slirp_zone_check_and_send_pending(zone);
                 ret = (void *)&it[1];
             }
             else
             {
+                AssertMsgFailed(("NAT: item initialization failed for zone %s\n", zone->name));
                 ret = NULL;
             }
@@ -165,5 +182,6 @@
             /* We're on master zone and we cant allocate more */
             Log2(("NAT: no room on %s zone\n", zone->name));
-            AssertMsgFailed(("NAT: OOM!"));
+            /* AssertMsgFailed(("NAT: OOM!")); */
+            zone->fPending = true;
             break;
         }
@@ -225,4 +243,5 @@
     LIST_INSERT_HEAD(&zone->free_items, it, list);
     zone->cur_items--;
+    slirp_zone_check_and_send_pending(zone);
     RTCritSectLeave(&zone->csZone);
 }
@@ -378,4 +397,5 @@
         master_zone->cur_items--;
         RTCritSectLeave(&master_zone->csZone);
+        slirp_zone_check_and_send_pending(master_zone);
     }
 }
Index: /trunk/src/VBox/Devices/Network/slirp/slirp.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 35921)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 35922)
@@ -992,8 +992,4 @@
                 CONTINUE_NO_UNLOCK(udp);
             }
-            else
-            {
-                do_slowtimo = 1; /* Let socket expire */
-            }
         }
 
