Index: /trunk/src/VBox/Devices/Network/slirp/ip_input.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/ip_input.c	(revision 13703)
+++ /trunk/src/VBox/Devices/Network/slirp/ip_input.c	(revision 13704)
@@ -201,7 +201,23 @@
 			ip = ip_reass(pData, (struct ipasfrag *)ip, fp);
 			if (ip == 0)
+#ifndef VBOX_WITH_SYNC_SLIRP
 				return;
+#else
+                        {
+                            rc = RTSemMutexRelease(m->m_mutex);
+                            AssertReleaseRC(rc);
+                            return;
+                        }
+#endif
 			ipstat.ips_reassembled++;
+#ifndef VBOX_WITH_SYNC_SLIRP
 			m = dtom(pData, ip);
+#else
+                        rc = RTSemMutexRelease(m->m_mutex);
+                        AssertReleaseRC(rc);
+			m = dtom(pData, ip);
+                        rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
+                        AssertReleaseRC(rc);
+#endif
 		} else
 			if (fp)
Index: /trunk/src/VBox/Devices/Network/slirp/slirp.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 13703)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 13704)
@@ -233,4 +233,6 @@
     rc = RTSemMutexCreate(&pData->tcb_mutex);
     AssertReleaseRC(rc);
+    rc = RTSemMutexCreate(&pData->tcp_last_so_mutex);
+    AssertReleaseRC(rc);
     rc = RTSemMutexCreate(&pData->udb_mutex);
     AssertReleaseRC(rc);
@@ -786,5 +788,5 @@
 	   if_start(pData);
 #else
-#if 1
+#if 0
         if (link_up) {
             RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT);
Index: /trunk/src/VBox/Devices/Network/slirp/slirp_state.h
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp_state.h	(revision 13703)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp_state.h	(revision 13704)
@@ -149,6 +149,10 @@
 #ifdef VBOX_WITH_SYNC_SLIRP
     /*
+     * tcp_last_so_mutex used for control access to tcp_last_so pointer
+     */
+    RTSEMMUTEX tcp_last_so_mutex;
+    /*
      * tcb_mutex used for control access to tcb queue of sockets
-     * servising TCP connections and tcp_last_so field
+     * servising TCP connections
      */
     RTSEMMUTEX tcb_mutex;
Index: /trunk/src/VBox/Devices/Network/slirp/socket.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/socket.c	(revision 13703)
+++ /trunk/src/VBox/Devices/Network/slirp/socket.c	(revision 13704)
@@ -104,5 +104,5 @@
     }
     else if (so->so_type == IPPROTO_TCP) {
-        RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
+        RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT);
     }
     else {
@@ -122,5 +122,5 @@
     }
     else if (so->so_type == IPPROTO_TCP) {
-        RTSemMutexRelease(pData->tcb_mutex);
+        RTSemMutexRelease(pData->tcp_last_so_mutex);
     }
     else {
Index: /trunk/src/VBox/Devices/Network/slirp/tcp_input.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/tcp_input.c	(revision 13703)
+++ /trunk/src/VBox/Devices/Network/slirp/tcp_input.c	(revision 13704)
@@ -246,4 +246,19 @@
 	DEBUG_ARGS((dfd," m = %8lx  iphlen = %2d  inso = %lx\n",
 		    (long )m, iphlen, (long )inso ));
+#ifdef VBOX_WITH_SYNC_SLIRP
+#if 0
+#define return                                      \
+do {                                                \
+    fprintf(stderr, "%s:%d\n", __FILE__, __LINE__); \
+    return;                                         \
+}while(0)
+#endif
+
+        int rc;
+        if (inso != NULL) {
+            rc = RTSemMutexRequest(inso->so_mutex, RT_INDEFINITE_WAIT);
+            AssertReleaseRC(rc);
+        }
+#endif
 
 	/*
@@ -256,4 +271,8 @@
 		tp = sototcpcb(so);
 		m = so->so_m;
+#ifdef VBOX_WITH_SYNC_SLIRP
+                rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
+                AssertReleaseRC(rc);
+#endif
 		so->so_m = 0;
 		ti = so->so_ti;
@@ -263,4 +282,8 @@
 		goto cont_conn;
 	}
+#ifdef VBOX_WITH_SYNC_SLIRP
+        rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
+        AssertReleaseRC(rc);
+#endif
 
 
@@ -356,13 +379,45 @@
 	 */
 findso:
+#ifdef VBOX_WITH_SYNC_SLIRP
+        rc = RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT);
+        AssertReleaseRC(rc);
+#endif
 	so = tcp_last_so;
+#ifdef VBOX_WITH_SYNC_SLIRP
+        /* this checking for making sure that we're not trying to hold mutex on head list*/
+        if (tcp_last_so != &tcb) {
+            rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
+            AssertReleaseRC(rc);
+        }
+        rc = RTSemMutexRelease(pData->tcp_last_so_mutex);
+        AssertReleaseRC(rc);
+#endif
 	if (so->so_fport != ti->ti_dport ||
 	    so->so_lport != ti->ti_sport ||
 	    so->so_laddr.s_addr != ti->ti_src.s_addr ||
 	    so->so_faddr.s_addr != ti->ti_dst.s_addr) {
+#ifndef VBOX_WITH_SYNC_SLIRP
 		so = solookup(&tcb, ti->ti_src, ti->ti_sport,
 			       ti->ti_dst, ti->ti_dport);
 		if (so)
 			tcp_last_so = so;
+#else
+                /*To make sure that we don't try to release mutex on head of the socket queue*/
+                if (so != &tcb) {
+                    rc = RTSemMutexRelease(so->so_mutex);
+                    AssertReleaseRC(rc);
+                }
+		so = solookup(&tcb, ti->ti_src, ti->ti_sport,
+			       ti->ti_dst, ti->ti_dport);
+		if (so) {
+                        rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
+                        AssertReleaseRC(rc);
+                        rc = RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT);
+                        AssertReleaseRC(rc);
+			tcp_last_so = so;
+                        rc = RTSemMutexRelease(pData->tcp_last_so_mutex);
+                        AssertReleaseRC(rc);
+                }
+#endif
 		++tcpstat.tcps_socachemiss;
 	}
@@ -387,6 +442,19 @@
 	  if ((so = socreate()) == NULL)
 	    goto dropwithreset;
+#ifdef VBOX_WITH_SYNC_SLIRP
+          rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
+          AssertReleaseRC(rc);
+#endif
 	  if (tcp_attach(pData, so) < 0) {
+#ifdef VBOX_WITH_SYNC_SLIRP
+            rc = RTSemMutexRelease(so->so_mutex);
+            AssertReleaseRC(rc);
+            rc = RTSemMutexDestroy(so->so_mutex);
+            AssertReleaseRC(rc);
+#endif
 	    free(so); /* Not sofree (if it failed, it's not insqued) */
+#ifdef VBOX_WITH_SYNC_SLIRP
+            so = NULL;
+#endif
 	    goto dropwithreset;
 	  }
@@ -506,4 +574,10 @@
 				tp->snd_una = ti->ti_ack;
 				m_freem(pData, m);
+#ifdef VBOX_WITH_SYNC_SLIRP
+                                if (m != NULL) {
+                                    rc = RTSemMutexRelease(m->m_mutex);
+                                    AssertReleaseRC(rc);
+                                }
+#endif
 
 				/*
@@ -535,5 +609,8 @@
 				if (so->so_snd.sb_cc)
 					(void) tcp_output(pData, tp);
-
+#ifdef VBOX_WITH_SYNC_SLIRP
+                                rc = RTSemMutexRelease(so->so_mutex);
+                                AssertReleaseRC(rc);
+#endif
 				return;
 			}
@@ -575,4 +652,12 @@
 			tp->t_flags |= TF_ACKNOW;
 			tcp_output(pData, tp);
+#ifdef VBOX_WITH_SYNC_SLIRP
+                                rc = RTSemMutexRelease(so->so_mutex);
+                                AssertReleaseRC(rc);
+                                if (m != NULL) {
+                                    rc = RTSemMutexRelease(m->m_mutex);
+                                    AssertReleaseRC(rc);
+                                }
+#endif
 			return;
 		}
@@ -675,4 +760,10 @@
 	    tp = tcp_close(pData, tp);
 	    m_free(pData, m);
+#ifdef VBOX_WITH_SYNC_SLIRP
+            if (m != NULL) {
+                rc = RTSemMutexRelease(m->m_mutex);
+                AssertReleaseRC(rc);
+            }
+#endif
 	  } else {
 	    /*
@@ -687,4 +778,12 @@
 	    tp->t_state = TCPS_SYN_RECEIVED;
 	  }
+#ifdef VBOX_WITH_SYNC_SLIRP
+          rc = RTSemMutexRelease(so->so_mutex);
+          AssertReleaseRC(rc);
+          if (m != NULL) {
+            rc = RTSemMutexRelease(m->m_mutex);
+            AssertReleaseRC(rc);
+          }
+#endif
 	  return;
 
@@ -1444,4 +1543,13 @@
 		(void) tcp_output(pData, tp);
 	}
+#ifdef VBOX_WITH_SYNC_SLIRP
+          rc = RTSemMutexRelease(so->so_mutex);
+          AssertReleaseRC(rc);
+
+          if (m != NULL) {
+            rc = RTSemMutexRelease(m->m_mutex);
+            AssertReleaseRC(rc);
+          }
+#endif
 	return;
 
@@ -1456,4 +1564,12 @@
 	tp->t_flags |= TF_ACKNOW;
 	(void) tcp_output(pData, tp);
+#ifdef VBOX_WITH_SYNC_SLIRP
+          rc = RTSemMutexRelease(so->so_mutex);
+          AssertReleaseRC(rc);
+          if (m != NULL) {
+            rc = RTSemMutexRelease(m->m_mutex);
+            AssertReleaseRC(rc);
+          }
+#endif
 	return;
 
@@ -1468,4 +1584,12 @@
 	}
 
+#ifdef VBOX_WITH_SYNC_SLIRP
+          rc = RTSemMutexRelease(so->so_mutex);
+          AssertReleaseRC(rc);
+          if (m != NULL) {
+            rc = RTSemMutexRelease(m->m_mutex);
+            AssertReleaseRC(rc);
+          }
+#endif
 	return;
 
@@ -1475,6 +1599,17 @@
 	 */
 	m_free(pData, m);
+#ifdef VBOX_WITH_SYNC_SLIRP
+          rc = RTSemMutexRelease(so->so_mutex);
+          AssertReleaseRC(rc);
+          if (m != NULL) {
+            rc = RTSemMutexRelease(m->m_mutex);
+            AssertReleaseRC(rc);
+          }
+#endif
 
 	return;
+#ifdef VBOX_WITH_SYNC_SLIRP
+#undef return
+#endif
 }
 
Index: /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c	(revision 13703)
+++ /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c	(revision 13704)
@@ -277,5 +277,5 @@
 /*	free(tp, M_PCB);  */
 #ifdef VBOX_WITH_SYNC_SLIRP
-        RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
+        RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT);
         /*sofree destrys so_mutex*/
         RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
@@ -294,5 +294,5 @@
 	tcpstat.tcps_closed++;
 #ifdef VBOX_WITH_SYNC_SLIRP
-        RTSemMutexRelease(pData->tcb_mutex);
+        RTSemMutexRelease(pData->tcp_last_so_mutex);
 #endif
 	return ((struct tcpcb *)0);
@@ -456,4 +456,11 @@
 	DEBUG_CALL("tcp_connect");
 	DEBUG_ARG("inso = %lx", (long)inso);
+#ifdef VBOX_WITH_SYNC_SLIRP
+        int rc;
+        rc = RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
+        AssertReleaseRC(rc);
+        rc = RTSemMutexRequest(inso->so_mutex, RT_INDEFINITE_WAIT);
+        AssertReleaseRC(rc);
+#endif
 
 	/*
@@ -468,10 +475,36 @@
 			/* If it failed, get rid of the pending connection */
 			closesocket(accept(inso->s,(struct sockaddr *)&addr,&addrlen));
+#ifdef VBOX_WITH_SYNC_SLIRP
+                        rc = RTSemMutexRelease(inso->so_mutex);
+                        AssertReleaseRC(rc);
+                        rc = RTSemMutexRelease(pData->tcb_mutex);
+                        AssertReleaseRC(rc);
+#endif
 			return;
 		}
+#ifdef VBOX_WITH_SYNC_SLIRP
+                rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
+                AssertReleaseRC(rc);
+#endif
 		if (tcp_attach(pData, so) < 0) {
+#ifndef VBOX_WITH_SYNC_SLIRP
 			free(so); /* NOT sofree */
+#else
+                        rc = RTSemMutexRelease(inso->so_mutex);
+                        AssertReleaseRC(rc);
+                        rc = RTSemMutexRelease(so->so_mutex);
+                        AssertReleaseRC(rc);
+                        RTSemMutexDestroy(so->so_mutex);
+                        rc = RTSemMutexRelease(pData->tcb_mutex);
+                        AssertReleaseRC(rc);
+                        free(so);
+                        so = NULL;
+#endif
 			return;
 		}
+#ifdef VBOX_WITH_SYNC_SLIRP
+                rc = RTSemMutexRelease(pData->tcb_mutex);
+                AssertReleaseRC(rc);
+#endif
 		so->so_laddr = inso->so_laddr;
 		so->so_lport = inso->so_lport;
@@ -482,4 +515,12 @@
 	if ((s = accept(inso->s,(struct sockaddr *)&addr,&addrlen)) < 0) {
 		tcp_close(pData, sototcpcb(so)); /* This will sofree() as well */
+#ifdef VBOX_WITH_SYNC_SLIRP
+                if (so != inso) {
+                    rc = RTSemMutexRelease(inso->so_mutex);
+                    AssertReleaseRC(rc);
+                }
+                rc = RTSemMutexRelease(so->so_mutex);
+                AssertReleaseRC(rc);
+#endif
 		return;
 	}
@@ -504,4 +545,10 @@
 					   /* if it's not FACCEPTONCE, it's already NOFDREF */
 	}
+#ifdef VBOX_WITH_SYNC_SLIRP
+        if (so != inso) {
+            rc = RTSemMutexRelease(inso->so_mutex);
+            AssertReleaseRC(rc);
+        }
+#endif
 	so->s = s;
 
@@ -526,4 +573,8 @@
 	tcp_sendseqinit(tp);
 	tcp_output(pData, tp);
+#ifdef VBOX_WITH_SYNC_SLIRP
+        rc = RTSemMutexRelease(so->so_mutex);
+        AssertReleaseRC(rc);
+#endif
 }
 
@@ -537,9 +588,16 @@
 	   return -1;
 #ifdef VBOX_WITH_SYNC_SLIRP
+        int rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
+        AssertReleaseRC(rc);
         so->so_type = IPPROTO_TCP;
 
-        RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
+        rc = RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
+        AssertReleaseRC(rc);
 	insque(pData, so, &tcb);
-        RTSemMutexRelease(pData->tcb_mutex);
+        rc = RTSemMutexRelease(pData->tcb_mutex);
+        AssertReleaseRC(rc);
+
+        rc = RTSemMutexRelease(so->so_mutex);
+        AssertReleaseRC(rc);
 #else
 	insque(pData, so, &tcb);
Index: /trunk/src/VBox/Devices/Network/slirp/udp.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/udp.c	(revision 13703)
+++ /trunk/src/VBox/Devices/Network/slirp/udp.c	(revision 13704)
@@ -498,4 +498,10 @@
 
 	sofree(pData, so);
+#ifdef VBOX_WITH_SYNC_SLIRP
+        if (so != NULL) {
+            rc = RTSemMutexRelease(so->so_mutex);
+            AssertReleaseRC(rc);
+        }
+#endif
 }
 
@@ -824,4 +830,8 @@
 	if (bind(so->s,(struct sockaddr *)&addr, addrlen) < 0) {
 		udp_detach(pData, so);
+#ifdef VBOX_WITH_SYNC_SLIRP
+                rc = RTSemMutexRelease(so->so_mutex);
+                AssertReleaseRC(rc);
+#endif
 		return NULL;
 	}
