Index: uspace/srv/net/socket/socket_client.c
===================================================================
--- uspace/srv/net/socket/socket_client.c	(revision 91001e26b14a5356ec8cf4cdeb642890b919a12d)
+++ uspace/srv/net/socket/socket_client.c	(revision 7d31f7ccc521dc4f0fc2b66a9f9788656377698d)
@@ -560,5 +560,8 @@
 		fibril_rwlock_write_unlock( & socket_globals.lock );
 		fibril_condvar_wait( & socket->accept_signal, & socket->accept_lock );
+		// drop the accept lock to avoid deadlock
+		fibril_mutex_unlock( & socket->accept_lock );
 		fibril_rwlock_write_lock( & socket_globals.lock );
+		fibril_mutex_lock( & socket->accept_lock );
 	}
 	-- socket->blocked;
@@ -759,5 +762,8 @@
 		fibril_rwlock_read_unlock( & socket_globals.lock );
 		fibril_condvar_wait( & socket->receive_signal, & socket->receive_lock );
+		// drop the receive lock to avoid deadlock
+		fibril_mutex_unlock( & socket->receive_lock );
 		fibril_rwlock_read_lock( & socket_globals.lock );
+		fibril_mutex_lock( & socket->receive_lock );
 	}
 	-- socket->blocked;
Index: uspace/srv/net/tl/icmp/icmp.c
===================================================================
--- uspace/srv/net/tl/icmp/icmp.c	(revision 91001e26b14a5356ec8cf4cdeb642890b919a12d)
+++ uspace/srv/net/tl/icmp/icmp.c	(revision 7d31f7ccc521dc4f0fc2b66a9f9788656377698d)
@@ -343,4 +343,6 @@
 		result = ERROR_CODE;
 
+		// drop the reply mutex
+		fibril_mutex_unlock( & reply->mutex );
 		// lock the globals again and clean up
 		fibril_rwlock_write_lock( & icmp_globals.lock );
Index: uspace/srv/net/tl/udp/udp.c
===================================================================
--- uspace/srv/net/tl/udp/udp.c	(revision 91001e26b14a5356ec8cf4cdeb642890b919a12d)
+++ uspace/srv/net/tl/udp/udp.c	(revision 7d31f7ccc521dc4f0fc2b66a9f9788656377698d)
@@ -420,5 +420,4 @@
 	struct sockaddr *		addr;
 	size_t					addrlen;
-	fibril_rwlock_t			lock;
 	ipc_call_t				answer;
 	int						answer_count;
@@ -434,5 +433,4 @@
 
 	socket_cores_initialize( & local_sockets );
-	fibril_rwlock_initialize( & lock );
 
 	while( keep_on_going ){
@@ -449,8 +447,6 @@
 				break;
 			case NET_SOCKET:
-				fibril_rwlock_write_lock( & lock );
 				* SOCKET_SET_SOCKET_ID( answer ) = SOCKET_GET_SOCKET_ID( call );
 				res = socket_create( & local_sockets, app_phone, NULL, SOCKET_SET_SOCKET_ID( answer ));
-				fibril_rwlock_write_unlock( & lock );
 				if( res == EOK ){
 					if( tl_get_ip_packet_dimension( udp_globals.ip_phone, & udp_globals.dimensions, DEVICE_INVALID_ID, & packet_dimension ) == EOK ){
@@ -465,9 +461,7 @@
 				res = data_receive(( void ** ) & addr, & addrlen );
 				if( res == EOK ){
-					fibril_rwlock_read_lock( & lock );
 					fibril_rwlock_write_lock( & udp_globals.lock );
 					res = socket_bind( & local_sockets, & udp_globals.sockets, SOCKET_GET_SOCKET_ID( call ), addr, addrlen, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, udp_globals.last_used_port );
 					fibril_rwlock_write_unlock( & udp_globals.lock );
-					fibril_rwlock_read_unlock( & lock );
 					free( addr );
 				}
@@ -476,5 +470,4 @@
 				res = data_receive(( void ** ) & addr, & addrlen );
 				if( res == EOK ){
-					fibril_rwlock_read_lock( & lock );
 					fibril_rwlock_write_lock( & udp_globals.lock );
 					res = udp_sendto_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), addr, addrlen, SOCKET_GET_DATA_FRAGMENTS( call ), SOCKET_SET_DATA_FRAGMENT_SIZE( answer ), SOCKET_GET_FLAGS( call ));
@@ -484,14 +477,11 @@
 						answer_count = 2;
 					}
-					fibril_rwlock_read_unlock( & lock );
 					free( addr );
 				}
 				break;
 			case NET_SOCKET_RECVFROM:
-				fibril_rwlock_read_lock( & lock );
 				fibril_rwlock_write_lock( & udp_globals.lock );
 				res = udp_recvfrom_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), SOCKET_GET_FLAGS( call ), & addrlen );
 				fibril_rwlock_write_unlock( & udp_globals.lock );
-				fibril_rwlock_read_unlock( & lock );
 				if( res > 0 ){
 					* SOCKET_SET_READ_DATA_LENGTH( answer ) = res;
@@ -502,9 +492,7 @@
 				break;
 			case NET_SOCKET_CLOSE:
-				fibril_rwlock_write_lock( & lock );
 				fibril_rwlock_write_lock( & udp_globals.lock );
 				res = socket_destroy( udp_globals.net_phone, SOCKET_GET_SOCKET_ID( call ), & local_sockets, & udp_globals.sockets, NULL );
 				fibril_rwlock_write_unlock( & udp_globals.lock );
-				fibril_rwlock_write_unlock( & lock );
 				break;
 			case NET_SOCKET_GETSOCKOPT:
