Index: uspace/lib/nic/include/nic.h
===================================================================
--- uspace/lib/nic/include/nic.h	(revision fbcdeb887f643e4a875e51120a2ddbf6fe35e4b3)
+++ uspace/lib/nic/include/nic.h	(revision 3ea725ee9357bf071bf8fe559b9dcee7aeafc943)
@@ -77,7 +77,8 @@
  *
  * @param nic_data
- * @param packet	Pointer to the packet to be sent
- */
-typedef void (*write_packet_handler)(nic_t *, packet_t *);
+ * @param data		Pointer to frame data
+ * @param size		Size of frame data in bytes
+ */
+typedef void (*send_frame_handler)(nic_t *, void *, size_t);
 /**
  * The handler for transitions between driver states.
@@ -206,5 +207,5 @@
 extern int nic_get_resources(nic_t *, hw_res_list_parsed_t *);
 extern void nic_set_specific(nic_t *, void *);
-extern void nic_set_write_packet_handler(nic_t *, write_packet_handler);
+extern void nic_set_send_frame_handler(nic_t *, send_frame_handler);
 extern void nic_set_state_change_handlers(nic_t *,
 	state_change_handler, state_change_handler, state_change_handler);
Index: uspace/lib/nic/include/nic_driver.h
===================================================================
--- uspace/lib/nic/include/nic_driver.h	(revision fbcdeb887f643e4a875e51120a2ddbf6fe35e4b3)
+++ uspace/lib/nic/include/nic_driver.h	(revision 3ea725ee9357bf071bf8fe559b9dcee7aeafc943)
@@ -134,5 +134,5 @@
 	 * Called with the main_lock locked for reading.
 	 */
-	write_packet_handler write_packet;
+	send_frame_handler send_frame;
 	/**
 	 * Event handler called when device goes to the ACTIVE state.
Index: uspace/lib/nic/include/nic_impl.h
===================================================================
--- uspace/lib/nic/include/nic_impl.h	(revision fbcdeb887f643e4a875e51120a2ddbf6fe35e4b3)
+++ uspace/lib/nic/include/nic_impl.h	(revision 3ea725ee9357bf071bf8fe559b9dcee7aeafc943)
@@ -48,5 +48,5 @@
 
 extern int nic_get_address_impl(ddf_fun_t *dev_fun, nic_address_t *address);
-extern int nic_send_message_impl(ddf_fun_t *dev_fun, packet_id_t packet_id);
+extern int nic_send_frame_impl(ddf_fun_t *dev_fun, void *data, size_t size);
 extern int nic_connect_to_nil_impl(ddf_fun_t *dev_fun, services_t nil_service,
 	int device_id);
Index: uspace/lib/nic/src/nic_driver.c
===================================================================
--- uspace/lib/nic/src/nic_driver.c	(revision fbcdeb887f643e4a875e51120a2ddbf6fe35e4b3)
+++ uspace/lib/nic/src/nic_driver.c	(revision 3ea725ee9357bf071bf8fe559b9dcee7aeafc943)
@@ -114,6 +114,6 @@
 		if (!iface->set_state)
 			iface->set_state = nic_set_state_impl;
-		if (!iface->send_message)
-			iface->send_message = nic_send_message_impl;
+		if (!iface->send_frame)
+			iface->send_frame = nic_send_frame_impl;
 		if (!iface->connect_to_nil)
 			iface->connect_to_nil = nic_connect_to_nil_impl;
@@ -168,9 +168,9 @@
  *
  * @param nic_data
- * @param wpfunc		Function handling the write_packet request
- */
-void nic_set_write_packet_handler(nic_t *nic_data, write_packet_handler wpfunc)
-{
-	nic_data->write_packet = wpfunc;
+ * @param sffunc	Function handling the send_frame request
+ */
+void nic_set_send_frame_handler(nic_t *nic_data, send_frame_handler sffunc)
+{
+	nic_data->send_frame = sffunc;
 }
 
@@ -765,5 +765,5 @@
 	nic_data->poll_mode = NIC_POLL_IMMEDIATE;
 	nic_data->default_poll_mode = NIC_POLL_IMMEDIATE;
-	nic_data->write_packet = NULL;
+	nic_data->send_frame = NULL;
 	nic_data->on_activating = NULL;
 	nic_data->on_going_down = NULL;
Index: uspace/lib/nic/src/nic_impl.c
===================================================================
--- uspace/lib/nic/src/nic_impl.c	(revision fbcdeb887f643e4a875e51120a2ddbf6fe35e4b3)
+++ uspace/lib/nic/src/nic_impl.c	(revision 3ea725ee9357bf071bf8fe559b9dcee7aeafc943)
@@ -39,6 +39,4 @@
 #include <ipc/services.h>
 #include <ns.h>
-#include <packet_client.h>
-#include <packet_remote.h>
 #include "nic_driver.h"
 #include "nic_impl.h"
@@ -159,46 +157,25 @@
 
 /**
- * Default implementation of the send_message method.
+ * Default implementation of the send_frame method.
  * Send messages to the network.
  *
  * @param	fun
- * @param	packet_id	ID of the first packet in a queue of sent packets
+ * @param	data	Frame data
+ * @param 	size	Frame size in bytes
  *
  * @return EOK		If the message was sent
- * @return EBUSY	If the device is not in state when the packet can be set.
- * @return EINVAL	If the packet ID is invalid
- */
-int nic_send_message_impl(ddf_fun_t *fun, packet_id_t packet_id)
-{
-	nic_t *nic_data = (nic_t *) fun->driver_data;
-	packet_t *packet, *next;
+ * @return EBUSY	If the device is not in state when the frame can be sent.
+ */
+int nic_send_frame_impl(ddf_fun_t *fun, void *data, size_t size)
+{
+	nic_t *nic_data = (nic_t *) fun->driver_data;
 
 	fibril_rwlock_read_lock(&nic_data->main_lock);
 	if (nic_data->state != NIC_STATE_ACTIVE || nic_data->tx_busy) {
 		fibril_rwlock_read_unlock(&nic_data->main_lock);
-		pq_release_remote(nic_data->net_session, packet_id);
 		return EBUSY;
 	}
 
-	int rc = packet_translate_remote(nic_data->net_session, &packet, packet_id);
-
-	if (rc != EOK) {
-		fibril_rwlock_read_unlock(&nic_data->main_lock);
-		return EINVAL;
-	}
-
-	/*
-	 * Process the packet queue. Each sent packet must be detached from the
-	 * queue and destroyed. This is why the cycle differs from loopback's
-	 * cycle, where the packets are immediately used in upper layers and
-	 * therefore they must not be destroyed (released).
-	 */
-	assert(nic_data->write_packet != NULL);
-	do {
-		next = pq_detach(packet);
-		nic_data->write_packet(nic_data, packet);
-		packet = next;
-	} while (packet);
-	fibril_rwlock_read_unlock(&nic_data->main_lock);
+	nic_data->send_frame(nic_data, data, size);
 	return EOK;
 }
