Index: uspace/srv/devman/devman.c
===================================================================
--- uspace/srv/devman/devman.c	(revision c9f3b45c6db879f3774a8e1052c76615112ebaad)
+++ uspace/srv/devman/devman.c	(revision 5159ae9cfe175971e2b16fd2a8cf120ffefe7cf2)
@@ -807,23 +807,56 @@
  */
 dev_class_info_t * add_device_to_class(node_t *dev, dev_class_t *cl, const char *base_dev_name)
-{
+{	
 	dev_class_info_t *info = create_dev_class_info();
-	info->dev_class = cl;
-	info->dev = dev;
-	
-	// add the device to the class
-	fibril_mutex_lock(&cl->mutex);
-	list_append(&info->link, &cl->devices);
-	fibril_mutex_unlock(&cl->mutex);
-	
-	// add the class to the device
-	list_append(&info->dev_classes, &dev->classes);
-	
-	// create unique name for the device within the class
-	info->dev_name = create_dev_name_for_class(cl, base_dev_name);	
+	if (NULL != info) {
+		info->dev_class = cl;
+		info->dev = dev;
+		
+		// add the device to the class
+		fibril_mutex_lock(&cl->mutex);
+		list_append(&info->link, &cl->devices);
+		fibril_mutex_unlock(&cl->mutex);
+		
+		// add the class to the device
+		list_append(&info->dev_classes, &dev->classes);
+		
+		// create unique name for the device within the class
+		info->dev_name = create_dev_name_for_class(cl, base_dev_name);	
+	}
 	
 	return info;
 }
 
+dev_class_t * get_dev_class(class_list_t *class_list, char *class_name)
+{
+	dev_class_t *cl;
+	fibril_mutex_lock(&class_list->classes_mutex);	
+	cl = find_dev_class_no_lock(class_list, class_name);
+	if (NULL == cl) {
+		cl = create_dev_class();
+		if (NULL != cl) {
+			cl->name = class_name;	
+			cl->base_dev_name = "";
+			add_dev_class_no_lock(class_list, cl);
+		}		
+	}	
+	fibril_mutex_unlock(&class_list->classes_mutex);
+	return cl;
+}
+
+dev_class_t * find_dev_class_no_lock(class_list_t *class_list, const char *class_name)
+{
+	dev_class_t *cl;
+	link_t *link = class_list->classes.next;
+	while (link != &class_list->classes) {
+		cl = list_get_instance(link, dev_class_t, link);
+		if (0 == str_cmp(cl->name, class_name)) {
+			return cl;
+		}
+	}
+	
+	return NULL;	
+}
+
 /** @}
  */
Index: uspace/srv/devman/devman.h
===================================================================
--- uspace/srv/devman/devman.h	(revision c9f3b45c6db879f3774a8e1052c76615112ebaad)
+++ uspace/srv/devman/devman.h	(revision 5159ae9cfe175971e2b16fd2a8cf120ffefe7cf2)
@@ -158,8 +158,8 @@
 	link_t link;	
 	/** List of dev_class_info structures - one for each device registered by this class.*/
-	link_t devices;	
-	/** Default base name for the device within the class, might be overrided by the driver.*/
+	link_t devices;
+	/** Default base name for the device within the class, might be overrided by the driver.*/	
 	const char *base_dev_name;
-	/** Unique numerical identifier appened to the base name of the newly added device.*/
+	/** Unique numerical identifier of the newly added device.*/
 	size_t curr_dev_idx;
 	/** Synchronize access to the list of devices in this class. */
@@ -185,4 +185,12 @@
 } dev_class_info_t;
 
+/** The list of device classes. */
+typedef struct class_list {
+	/** List of classes */
+	link_t classes;
+	/** Fibril mutex for list of classes. */
+	fibril_mutex_t classes_mutex;	
+} class_list_t;
+
 // Match ids and scores
 
@@ -282,10 +290,11 @@
 {
 	node_t *res = malloc(sizeof(node_t));
+	
 	if (res != NULL) {
 		memset(res, 0, sizeof(node_t));
+		list_initialize(&res->children);
+		list_initialize(&res->match_ids.ids);
+		list_initialize(&res->classes);
 	}
-	
-	list_initialize(&res->children);
-	list_initialize(&res->match_ids.ids);
 	
 	return res;
@@ -364,4 +373,5 @@
 	if (NULL != cl) {
 		memset(cl, 0, sizeof(dev_class_t));
+		list_initialize(&cl->devices);
 		fibril_mutex_initialize(&cl->mutex);
 	}
@@ -394,4 +404,18 @@
 dev_class_info_t * add_device_to_class(node_t *dev, dev_class_t *cl, const char *base_dev_name);
 
+static inline void init_class_list(class_list_t *class_list)
+{
+	list_initialize(&class_list->classes);
+	fibril_mutex_initialize(&class_list->classes_mutex);
+}
+
+dev_class_t * get_dev_class(class_list_t *class_list, char *class_name);
+dev_class_t * find_dev_class_no_lock(class_list_t *class_list, const char *class_name);
+
+static inline void add_dev_class_no_lock(class_list_t *class_list, dev_class_t *cl)
+{
+	list_append(&cl->link, &class_list->classes);
+}
+
 #endif
 
Index: uspace/srv/devman/main.c
===================================================================
--- uspace/srv/devman/main.c	(revision c9f3b45c6db879f3774a8e1052c76615112ebaad)
+++ uspace/srv/devman/main.c	(revision 5159ae9cfe175971e2b16fd2a8cf120ffefe7cf2)
@@ -60,4 +60,5 @@
 static driver_list_t drivers_list;
 static dev_tree_t device_tree;
+static class_list_t class_list;
 
 
@@ -240,4 +241,33 @@
 	// try to find suitable driver and assign it to the device	
 	assign_driver(node, &drivers_list);	
+}
+
+static void devman_add_device_to_class(ipc_callid_t callid, ipc_call_t *call)
+{		
+	device_handle_t handle = IPC_GET_ARG1(*call);
+	
+	// Get class name
+	char *class_name;
+	int rc = async_data_write_accept((void **)&class_name, true, 0, 0, 0, 0);
+	if (rc != EOK) {
+		ipc_answer_0(callid, rc);
+		return;
+	}	
+	
+	node_t *dev = find_dev_node(&device_tree, handle);
+	if (NULL == dev) {
+		ipc_answer_0(callid, ENOENT);
+		return;
+	}
+	
+	dev_class_t *cl = get_dev_class(&class_list, class_name);
+	
+	dev_class_info_t *class_info = add_device_to_class(dev, cl, NULL);
+	
+	// TODO register the device's class alias by devmapper
+	
+	printf(NAME ": device '%s' added to class '%s', class name '%s' was asigned to it\n", dev->pathname, class_name, class_info->dev_name);
+	
+	ipc_answer_0(callid, EOK);	
 }
 
@@ -294,4 +324,7 @@
 		case DEVMAN_ADD_CHILD_DEVICE:
 			devman_add_child(callid, &call);
+			break;
+		case DEVMAN_ADD_DEVICE_TO_CLASS:
+			devman_add_device_to_class(callid, &call);
 			break;
 		default:
@@ -444,4 +477,6 @@
 	}
 
+	init_class_list(&class_list);
+	
 	return true;
 }
