Index: uspace/srv/net/tl/udp/udp.c
===================================================================
--- uspace/srv/net/tl/udp/udp.c	(revision f3cb50e24355752d6a7cbc4304159cb08ed2e92e)
+++ uspace/srv/net/tl/udp/udp.c	(revision de229f8e24200a50c6b6ddc7e461db12f3c9e0d8)
@@ -636,8 +636,6 @@
 	// get udp header
 	data = packet_get_data(packet);
-	if (!data) {
-		pq_release_remote(udp_globals.net_phone, packet_id);
-		return NO_DATA;
-	}
+	if (!data)
+		return udp_release_and_return(packet, NO_DATA);
 	header = (udp_header_ref) data;
 
@@ -645,8 +643,6 @@
 	result = packet_get_addr(packet, (uint8_t **) &addr, NULL);
 	rc = tl_set_address_port(addr, result, ntohs(header->source_port));
-	if (rc != EOK) {
-		pq_release_remote(udp_globals.net_phone, packet_id);
-		return rc;
-	}
+	if (rc != EOK)
+		return udp_release_and_return(packet, rc);
 	*addrlen = (size_t) result;
 
@@ -666,10 +662,8 @@
 		return rc;
 
-	// release the packet
 	dyn_fifo_pop(&socket->received);
-	pq_release_remote(udp_globals.net_phone, packet_get_id(packet));
-
-	// return the total length
-	return (int) length;
+
+	// release the packet and return the total length
+	return udp_release_and_return(packet, (int) length);
 }
 
