Index: uspace/lib/net/tl/socket_core.c
===================================================================
--- uspace/lib/net/tl/socket_core.c	(revision 22e80508d6f0e4e31f772cc48a69d3548fbb9e12)
+++ uspace/lib/net/tl/socket_core.c	(revision 6b0b5085f6bc7e20d2ccf94b45b70e6c4d5262df)
@@ -83,14 +83,8 @@
 {
 	/* If bound */
-	
-	// FIXME:
-	// Temporary workaround for ticket #521
-	// (causes port leak)
-#if 0
 	if (socket->port) {
 		/* Release the port */
 		socket_port_release(global_sockets, socket);
 	}
-#endif
 	
 	dyn_fifo_destroy(&socket->accepted);
Index: uspace/srv/net/udp/sock.c
===================================================================
--- uspace/srv/net/udp/sock.c	(revision 22e80508d6f0e4e31f772cc48a69d3548fbb9e12)
+++ uspace/srv/net/udp/sock.c	(revision 6b0b5085f6bc7e20d2ccf94b45b70e6c4d5262df)
@@ -289,5 +289,5 @@
 	    (udp_sockdata_t *) sock_core->specific_data;
 	
-	if ((sock_core->port == 0) || (sock_core->port == -1)) {
+	if (sock_core->port <= 0) {
 		/* Implicitly bind socket to port */
 		int rc = socket_bind_free_port(&gsock, sock_core,
@@ -299,4 +299,5 @@
 		
 		assert(sock_core->port > 0);
+		
 		udp_error_t urc = udp_uc_set_local_port(socket->assoc,
 		    sock_core->port);
@@ -307,4 +308,6 @@
 			goto out;
 		}
+		
+		last_used_port = sock_core->port;
 	}
 	
