Index: uspace/lib/libc/include/ipc/dev_iface.h
===================================================================
--- uspace/lib/libc/include/ipc/dev_iface.h	(revision ca97cad5803ad9a8511c331f8c9583385867b64d)
+++ uspace/lib/libc/include/ipc/dev_iface.h	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
@@ -38,4 +38,5 @@
 	HW_RES_DEV_IFACE = 0,	
 	CHAR_DEV_IFACE,
+	IOCTL_DEV_IFACE,
 	// TODO add more interfaces
 	DEV_IFACE_MAX
Index: uspace/lib/libdrv/Makefile
===================================================================
--- uspace/lib/libdrv/Makefile	(revision ca97cad5803ad9a8511c331f8c9583385867b64d)
+++ uspace/lib/libdrv/Makefile	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
@@ -38,5 +38,6 @@
 	generic/dev_iface.c \
 	generic/remote_res.c \
-	generic/remote_char.c
+	generic/remote_char.c \
+	generic/remote_ioctl.c
 
 include ../Makefile.common
Index: uspace/lib/libdrv/generic/dev_iface.c
===================================================================
--- uspace/lib/libdrv/generic/dev_iface.c	(revision ca97cad5803ad9a8511c331f8c9583385867b64d)
+++ uspace/lib/libdrv/generic/dev_iface.c	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
@@ -39,9 +39,11 @@
 #include "remote_res.h"
 #include "remote_char.h"
+#include "remote_ioctl.h"
  
 static iface_dipatch_table_t remote_ifaces = {
 	.ifaces = {
 		&remote_res_iface,
-		&remote_char_iface
+		&remote_char_iface,
+		&remote_ioctl_iface
 	}
 };
Index: uspace/lib/libdrv/generic/remote_ioctl.c
===================================================================
--- uspace/lib/libdrv/generic/remote_ioctl.c	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
+++ uspace/lib/libdrv/generic/remote_ioctl.c	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2010 Lenka Trochtova 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libdrv
+ * @{
+ */
+/** @file
+ */
+
+#include <ipc/ipc.h>
+#include <async.h>
+#include <errno.h>
+
+#include "ioctl.h"
+#include "driver.h"
+
+static void remote_ioctl(device_t *dev, void *iface, ipc_callid_t callid, ipc_call_t *call);
+
+/** Remote ioctl interface operations. 
+ */
+static remote_iface_func_ptr_t remote_ioctl_iface_ops [] = {
+	&remote_ioctl
+}; 
+ 
+/** Remote ioctl interface structure. 
+ * Interface for processing request from remote clients addressed to the ioctl interface.
+ */
+remote_iface_t remote_char_iface = {
+	.method_count = sizeof(remote_ioctl_iface_ops) / sizeof(remote_iface_func_ptr_t),
+	.methods = remote_ioctl_iface_ops
+};
+
+static void remote_ioctl(device_t *dev, void *iface, ipc_callid_t callid, ipc_call_t *call)
+{
+	ioctl_iface_t *ioctl_iface = (ioctl_iface_t *)iface;
+	
+	ipc_callid_t cidin, cidout;	
+	int ctlcode;
+	size_t inlen = 0, outlen = 0, retlen = 0;
+	void *inbuf, *outbuf;
+	int ret;
+	
+	
+	if (!async_data_read_receive(&cidin, &inlen)) {
+		// TODO handle protocol error
+		ipc_answer_0(callid, EINVAL);
+		return;
+	}
+	
+	if (!async_data_write_receive(&cidout, &outlen)) {
+		// TODO handle protocol error
+		ipc_answer_0(callid, EINVAL);
+		return;
+    }
+	
+	if (NULL == ioctl_iface->ioctl) {
+		async_data_read_finalize(cidin, NULL, 0);
+		async_data_write_finalize(cidout, NULL, 0);
+		ipc_answer_0(callid, ENOTSUP);
+		return;
+	}	
+	
+	inbuf = malloc(inlen);
+	if (NULL == inbuf) {
+		async_data_read_finalize(cidin, NULL, 0);
+		async_data_write_finalize(cidout, NULL, 0);
+		ipc_answer_0(callid, ENOMEM);
+		return;
+	}
+	
+	outbuf = malloc(outlen);
+	if (NULL == outbuf) {
+		free(inbuf);
+		async_data_read_finalize(cidin, NULL, 0);
+		async_data_write_finalize(cidout, NULL, 0);
+		ipc_answer_0(callid, ENOMEM);
+	}
+	
+	ctlcode = (int)IPC_GET_ARG1(*call);
+	
+	async_data_read_finalize(cidin, inbuf, inlen);
+	ret = (*ioctl_iface->ioctl)(dev, ctlcode, inbuf, inlen, outbuf, outlen, &retlen);
+	async_data_write_finalize(cidout, outbuf, retlen);
+	ipc_answer_1(callid, ret, retlen);	
+	free(outbuf);
+	free(inbuf);
+}
+
+ /**
+ * @}
+ */
Index: uspace/lib/libdrv/include/dev_iface.h
===================================================================
--- uspace/lib/libdrv/include/dev_iface.h	(revision ca97cad5803ad9a8511c331f8c9583385867b64d)
+++ uspace/lib/libdrv/include/dev_iface.h	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
@@ -38,6 +38,4 @@
 
 
-// TODO declare device interface structures here
-
 #endif
 
Index: uspace/lib/libdrv/include/ioctl.h
===================================================================
--- uspace/lib/libdrv/include/ioctl.h	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
+++ uspace/lib/libdrv/include/ioctl.h	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2010 Lenka Trochtova 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libdrv
+ * @{
+ */
+/** @file
+ */
+#ifndef LIBDRV_IOCTL_H_
+#define LIBDRV_IOCTL_H_
+
+#include "driver.h"
+
+typedef struct ioctl_iface {
+	int (*ioctl)(device_t *dev, int ctlcode, void *inbuf, size_t inlen, void *outbuf, size_t outlen, size_t *retlen);	
+} ioctl_iface_t;
+
+#endif
+
+/**
+ * @}
+ */
Index: uspace/lib/libdrv/include/remote_ioctl.h
===================================================================
--- uspace/lib/libdrv/include/remote_ioctl.h	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
+++ uspace/lib/libdrv/include/remote_ioctl.h	(revision ab1aa87184444de8e5870afe8f92c410eecdb966)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2010 Lenka Trochtova 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libdrv
+ * @{
+ */
+/** @file
+ */
+#ifndef LIBDRV_REMOTE_IOCTL_H_
+#define LIBDRV_REMOTE_IOCTL_H_
+
+remote_iface_t remote_ioctl_iface;
+
+#endif
+
+/**
+ * @}
+ */
