Index: uspace/srv/devman/devman.c
===================================================================
--- uspace/srv/devman/devman.c	(revision c47e1a8fb8e2a2556518fd57f186595422ca4484)
+++ uspace/srv/devman/devman.c	(revision d51ee2b4b8df06f1db92623840353f34771a405b)
@@ -736,4 +736,58 @@
 }
 
+/** Create unique device name within the class. 
+ * 
+ * @param cl the class.
+ * @param base_dev_name contains base name for the device 
+ * if it was specified by the driver when it registered the device by the class; 
+ * NULL if driver specified no base name.
+ * @return the unique name for the device within the class.
+ */
+char * create_dev_name_for_class(dev_class_t *cl, const char *base_dev_name)
+{
+	char *dev_name;
+	const char *base_name;
+	if (NULL != base_dev_name) {
+		base_name = base_dev_name;
+	} else {
+		base_name = cl->base_dev_name;
+	}
+	
+	size_t idx = get_new_class_dev_idx(cl);
+	asprintf(&dev_name, "%s%d", base_name, idx);
+	return dev_name;	
+}
+
+/** Add the device to the class.
+ * 
+ * The device may be added to multiple classes and a class may contain multiple devices.
+ * The class and the device are associated with each other by the dev_class_info_t structure.
+ * 
+ * @param dev the device.
+ * @param class the class.
+ * @param base_dev_name the base name of the device within the class if specified by the driver,
+ * NULL otherwise.
+ * @return dev_class_info_t structure which associates the device with the class.
+ */
+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);	
+	
+	return info;
+}
+
 /** @}
  */
Index: uspace/srv/devman/devman.h
===================================================================
--- uspace/srv/devman/devman.h	(revision c47e1a8fb8e2a2556518fd57f186595422ca4484)
+++ uspace/srv/devman/devman.h	(revision d51ee2b4b8df06f1db92623840353f34771a405b)
@@ -41,4 +41,5 @@
 #include <ipc/ipc.h>
 #include <ipc/devman.h>
+#include <ipc/devmap.h>
 #include <fibril_synch.h>
 #include <atomic.h>
@@ -52,5 +53,4 @@
 
 struct node;
-
 typedef struct node node_t;
 
@@ -126,4 +126,6 @@
 	    owned by one driver */
 	link_t driver_devices;
+	/** The list of device classes to which this device belongs.*/
+	link_t classes;
 };
 
@@ -139,5 +141,36 @@
 } dev_tree_t;
 
-
+typedef struct dev_class {	
+	/** The name of the class.*/
+	const char *name;
+	/** Pointer to the previous and next class in the list of registered classes.*/
+	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.*/
+	const char *base_dev_name;
+	/** Unique numerical identifier appened to the base name of the newly added device.*/
+	size_t curr_dev_idx;
+	/** Synchronize access to the list of devices in this class. */
+	fibril_mutex_t mutex;
+} dev_class_t;
+
+/** Provides n-to-m mapping between device nodes and classes 
+ * - each device may be register to the arbitrary number of classes 
+ * and each class may contain the arbitrary number of devices. */
+typedef struct dev_class_info {
+	/** The class.*/
+	dev_class_t *dev_class;
+	/** The device.*/
+	node_t *dev;
+	/** Pointer to the previous and next class info in the list of devices registered by the class.*/
+	link_t link;
+	/** Pointer to the previous and next class info in the list of classes by which the device is registered.*/
+	link_t dev_classes;
+	/** The name of the device within the class.*/
+	char *dev_name;	
+	/** The handle of the device by device mapper in the class namespace.*/
+	dev_handle_t devmap_handle;
+} dev_class_info_t;
 
 // Match ids and scores
@@ -289,4 +322,45 @@
 bool insert_dev_node(dev_tree_t *tree, node_t *node, char *dev_name, node_t *parent);
 
+// Device classes
+
+/** Create device class. 
+ *   
+ * @return device class.
+ */
+static inline dev_class_t * create_dev_class()
+{
+	dev_class_t *cl = (dev_class_t *)malloc(sizeof(dev_class_t));
+	if (NULL != cl) {
+		memset(cl, 0, sizeof(dev_class_t));
+		fibril_mutex_initialize(&cl->mutex);
+	}
+	return cl;	
+}
+
+/** Create device class info. 
+ * 
+ * @return device class info.
+ */
+static inline dev_class_info_t * create_dev_class_info()
+{
+	dev_class_info_t *info = (dev_class_info_t *)malloc(sizeof(dev_class_info_t));
+	if (NULL != info) {
+		memset(info, 0, sizeof(dev_class_info_t));
+	}
+	return info;	
+}
+
+static inline size_t get_new_class_dev_idx(dev_class_t *cl)
+{
+	size_t dev_idx;
+	fibril_mutex_lock(&cl->mutex);
+	dev_idx = ++cl->curr_dev_idx;
+	fibril_mutex_unlock(&cl->mutex);
+	return dev_idx;
+}
+
+char * create_dev_name_for_class(dev_class_t *cl, const char *base_dev_name);
+dev_class_info_t * add_device_to_class(node_t *dev, dev_class_t *cl, const char *base_dev_name);
+
 #endif
 
