Index: uspace/srv/devmap/devmap.c
===================================================================
--- uspace/srv/devmap/devmap.c	(revision 1cab2f41d3b3a29bc963530c32633b36bad078ab)
+++ uspace/srv/devmap/devmap.c	(revision db24058f476a95ab9afb349b07aba2936c53ed79)
@@ -47,5 +47,6 @@
 #include <ipc/devmap.h>
 
-#define NAME  "devmap"
+#define NAME          "devmap"
+#define NULL_DEVICES  256
 
 /** Representation of device driver.
@@ -98,6 +99,8 @@
 static FIBRIL_MUTEX_INITIALIZE(drivers_list_mutex);
 static FIBRIL_MUTEX_INITIALIZE(create_handle_mutex);
+static FIBRIL_MUTEX_INITIALIZE(null_devices_mutex);
 
 static dev_handle_t last_handle = 0;
+static devmap_device_t *null_devices[NULL_DEVICES];
 
 static dev_handle_t devmap_create_handle(void)
@@ -619,19 +622,41 @@
 }
 
-/** Initialize device mapper.
- *
- *
- */
-static bool devmap_init(void)
-{
+static void devmap_null_create(ipc_callid_t iid, ipc_call_t *icall)
+{
+	fibril_mutex_lock(&null_devices_mutex);
+	
+	unsigned int i;
+	bool fnd = false;
+	
+	for (i = 0; i < NULL_DEVICES; i++) {
+		if (null_devices[i] == NULL) {
+			fnd = true;
+			break;
+		}
+	}
+	
+	if (!fnd) {
+		fibril_mutex_unlock(&null_devices_mutex);
+		ipc_answer_0(iid, ENOMEM);
+		return;
+	}
+	
 	/* Create NULL device entry */
 	devmap_device_t *device = (devmap_device_t *) malloc(sizeof(devmap_device_t));
-	if (device == NULL)
-		return false;
-	
-	device->name = str_dup("null");
+	if (device == NULL) {
+		fibril_mutex_unlock(&null_devices_mutex);
+		ipc_answer_0(iid, ENOMEM);
+		return;
+	}
+	
+	char null[DEVMAP_NAME_MAXLEN];
+	snprintf(null, DEVMAP_NAME_MAXLEN, "null%u", i);
+	
+	device->name = str_dup(null);
 	if (device->name == NULL) {
+		fibril_mutex_unlock(&null_devices_mutex);
 		free(device);
-		return false;
+		ipc_answer_0(iid, ENOMEM);
+		return;
 	}
 	
@@ -645,8 +670,47 @@
 	device->driver = NULL;
 	
-	/* Insert device into list of all devices  */
+	/* Insert device into list of all devices
+	   and into null devices array */
 	list_append(&device->devices, &devices_list);
+	null_devices[i] = device;
 	
 	fibril_mutex_unlock(&devices_list_mutex);
+	fibril_mutex_unlock(&null_devices_mutex);
+	
+	ipc_answer_1(iid, EOK, (ipcarg_t) i);
+}
+
+static void devmap_null_destroy(ipc_callid_t iid, ipc_call_t *icall)
+{
+	fibril_mutex_lock(&null_devices_mutex);
+	
+	ipcarg_t i = IPC_GET_ARG1(*icall);
+	
+	if (null_devices[i] == NULL) {
+		ipc_answer_0(iid, ENOENT);
+		return;
+	}
+	
+	devmap_device_unregister_core(null_devices[i]);
+	null_devices[i] = NULL;
+	
+	fibril_mutex_unlock(&null_devices_mutex);
+	
+	ipc_answer_0(iid, EOK);
+}
+
+/** Initialize device mapper.
+ *
+ *
+ */
+static bool devmap_init(void)
+{
+	fibril_mutex_lock(&null_devices_mutex);
+	
+	unsigned int i;
+	for (i = 0; i < NULL_DEVICES; i++)
+		null_devices[i] = NULL;
+	
+	fibril_mutex_unlock(&null_devices_mutex);
 	
 	return true;
@@ -702,5 +766,5 @@
 	}
 	
-	if (NULL != driver) {
+	if (driver != NULL) {
 		/*
 		 * Unregister the device driver and all its devices.
@@ -733,4 +797,10 @@
 		case DEVMAP_DEVICE_GET_NAME:
 			devmap_get_name(callid, &call);
+			break;
+		case DEVMAP_DEVICE_NULL_CREATE:
+			devmap_null_create(callid, &call);
+			break;
+		case DEVMAP_DEVICE_NULL_DESTROY:
+			devmap_null_destroy(callid, &call);
 			break;
 		case DEVMAP_DEVICE_GET_COUNT:
@@ -784,5 +854,5 @@
 	/* Set a handler of incomming connections */
 	async_set_client_connection(devmap_connection);
-
+	
 	/* Register device mapper at naming service */
 	ipcarg_t phonead;
