Index: uspace/lib/libc/include/device/hw_res.h
===================================================================
--- uspace/lib/libc/include/device/hw_res.h	(revision c1a8ae52fba8b8b7f0dfe4c310347c3d44299e2b)
+++ uspace/lib/libc/include/device/hw_res.h	(revision 5dc96227c454d26dad2ed3642e8fb99b68d212c8)
@@ -39,4 +39,24 @@
 #include <bool.h>
 
+// HW resource provider interface
+
+typedef enum {
+	GET_RESOURCE_LIST = 0,
+	ENABLE_INTERRUPT	
+} hw_res_funcs_t;
+
+/** HW resource types. */
+typedef enum {
+	INTERRUPT,
+	IO_RANGE, 
+	MEM_RANGE
+} hw_res_type_t;
+
+typedef enum {
+	LITTLE_ENDIAN = 0,
+	BIG_ENDIAN
+} endianness_t;
+
+
 /** HW resource (e.g. interrupt, memory register, i/o register etc.). */
 typedef struct hw_resource {
@@ -74,4 +94,5 @@
 
 
+
 bool get_hw_resources(int dev_phone, hw_resource_list_t *hw_resources);
 
Index: uspace/lib/libc/include/ipc/dev_iface.h
===================================================================
--- uspace/lib/libc/include/ipc/dev_iface.h	(revision c1a8ae52fba8b8b7f0dfe4c310347c3d44299e2b)
+++ uspace/lib/libc/include/ipc/dev_iface.h	(revision 5dc96227c454d26dad2ed3642e8fb99b68d212c8)
@@ -47,23 +47,3 @@
 
 
-
-// HW resource provider interface
-
-typedef enum {
-	GET_RESOURCE_LIST = 0,
-	ENABLE_INTERRUPT	
-} hw_res_funcs_t;
-
-/** HW resource types. */
-typedef enum {
-	INTERRUPT,
-	IO_RANGE, 
-	MEM_RANGE
-} hw_res_type_t;
-
-typedef enum {
-	LITTLE_ENDIAN = 0,
-	BIG_ENDIAN
-} endianness_t;
-
 #endif
Index: uspace/srv/drivers/isa/isa.c
===================================================================
--- uspace/srv/drivers/isa/isa.c	(revision c1a8ae52fba8b8b7f0dfe4c310347c3d44299e2b)
+++ uspace/srv/drivers/isa/isa.c	(revision 5dc96227c454d26dad2ed3642e8fb99b68d212c8)
@@ -51,9 +51,41 @@
 
 #include <driver.h>
+#include <resource.h>
+
 #include <devman.h>
 #include <ipc/devman.h>
+#include <device/hw_res.h>
 
 #define NAME "isa"
 #define CHILD_DEV_CONF_PATH "/srv/drivers/isa/isa.dev"
+
+#define ISA_MAX_HW_RES 4
+
+typedef struct isa_child_data {
+	hw_resource_list_t hw_resources;	
+} isa_child_data_t;
+
+static hw_resource_list_t * isa_get_child_resources(device_t *dev)
+{
+	isa_child_data_t *dev_data = (isa_child_data_t *)dev->driver_data;
+	if (NULL == dev_data) {
+		return NULL;
+	}
+	return &dev_data->hw_resources;
+}
+
+static bool isa_enable_child_interrupt(device_t *dev) 
+{
+	// TODO
+	
+	return false;
+}
+
+static resource_iface_t isa_child_res_iface = {
+	&isa_get_child_resources,
+	&isa_enable_child_interrupt	
+};
+
+static device_class_t isa_child_class;
 
 static bool isa_add_device(device_t *dev);
@@ -71,8 +103,4 @@
 	.driver_ops = &isa_ops
 };
-
-typedef struct isa_child_data {
-	hw_resource_list_t hw_resources;	
-} isa_child_data_t;
 
 
@@ -154,6 +182,19 @@
 }
 
-static char * str_get_line(char *str) {
-	return strtok(str, "\n");
+static char * str_get_line(char *str, char **next) {
+	char *line = str;
+	while (0 != *str && '\n' != *str) {
+		str++;
+	} 
+	
+	if (0 != *str) {
+		*next = str + 1;
+	} else {
+		*next = NULL;
+	}
+	
+	*str = 0;	
+	
+	return line;
 }
 
@@ -180,10 +221,10 @@
 	
 	// alloc output buffer
-	size_t len = str_size(line);
-	char *name = malloc(len + 1);
+	size_t size = str_size(line) + 1;
+	char *name = malloc(size);
 	
 	if (NULL != name) {
 		// copy the result to the output buffer
-		str_cpy(name, len, line);
+		str_cpy(name, size, line);
 	}
 
@@ -201,7 +242,33 @@
 
 
-void isa_child_set_irq(device_t *dev, int irq)
-{
-	// TODO
+static void isa_child_set_irq(device_t *dev, int irq)
+{
+	isa_child_data_t *data = (isa_child_data_t *)dev->driver_data;
+	
+	size_t count = data->hw_resources.count;
+	hw_resource_t *resources = data->hw_resources.resources;
+	
+	if (count < ISA_MAX_HW_RES) {
+		resources[count].type = INTERRUPT;
+		resources[count].res.interrupt.irq = irq;
+		
+		data->hw_resources.count++;
+	}	
+}
+
+static void isa_child_set_io_range(device_t *dev, size_t addr, size_t len)
+{
+	isa_child_data_t *data = (isa_child_data_t *)dev->driver_data;
+	
+	size_t count = data->hw_resources.count;
+	hw_resource_t *resources = data->hw_resources.resources;
+	
+	if (count < ISA_MAX_HW_RES) {
+		resources[count].type = IO_RANGE;
+		resources[count].res.io_range.address = addr;
+		resources[count].res.io_range.size = len;
+		resources[count].res.io_range.endianness = LITTLE_ENDIAN;		
+		data->hw_resources.count++;
+	}	
 }
 
@@ -212,5 +279,5 @@
 	
 	val = skip_spaces(val);	
-	irq = strtol(val, &end, 0x10);
+	irq = (int)strtol(val, &end, 0x10);
 	
 	if (val != end) {
@@ -221,10 +288,67 @@
 static void get_dev_io_range(device_t *dev, char *val)
 {
-	// TODO
-}
-
-static void get_dev_macth_id(device_t *dev, char *val)
-{
-	// TODO
+	size_t addr, len;
+	char *end = NULL;
+	
+	val = skip_spaces(val);	
+	addr = strtol(val, &end, 0x10);
+	
+	if (val == end) {
+		return;
+	}
+	
+	val = skip_spaces(end);	
+	len = strtol(val, &end, 0x10);
+	
+	if (val == end) {
+		return;
+	}
+	
+	isa_child_set_io_range(dev, addr, len);
+}
+
+static void get_match_id(char **id, char *val)
+{
+	char *end = val;
+	
+	while (isspace(*end)) {
+		end++;
+	}	
+	*end = 0;
+	
+	size_t size = str_size(val) + 1;
+	*id = (char *)malloc(size);
+	str_cpy(*id, size, val);	
+}
+
+static void get_dev_match_id(device_t *dev, char *val)
+{	
+	char *id = NULL;
+	int score = 0;
+	char *end = NULL;
+	
+	val = skip_spaces(val);	
+	
+	score = (int)strtol(val, &end, 0x10);
+	if (val == end) {
+		return;
+	}
+	
+	match_id_t *match_id = create_match_id();
+	if (NULL == match_id) {
+		return;
+	}
+	
+	val = skip_spaces(end);	
+	get_match_id(&id, val);
+	if (NULL == id) {
+		delete_match_id(match_id);
+		return;
+	}
+	
+	match_id->id = id;
+	match_id->score = score;
+	
+	add_match_id(&dev->match_ids, match_id);
 }
 
@@ -242,20 +366,26 @@
 		get_dev_irq(dev, val);		
 	} else if (NULL != (val = strtok(line, "match"))) {
-		get_dev_macth_id(dev, val);
+		get_dev_match_id(dev, val);
 	} 	
 }
 
+static void child_alloc_hw_res(device_t *dev) 
+{
+	isa_child_data_t *data = (isa_child_data_t *)dev->driver_data;
+	data->hw_resources.resources = 
+		(hw_resource_t *)malloc(sizeof(hw_resource_t) * ISA_MAX_HW_RES);
+	
+}
+
 static char * read_isa_dev_info(char *dev_conf, device_t *parent)
 {
 	char *line;
-	bool cont = true;
 	char *dev_name = NULL;
 	
 	// skip empty lines
-	while (cont) {
-		line = dev_conf;		
-		dev_conf = str_get_line(line);
-		
-		if (NULL == dev_conf) {
+	while (true) {	
+		line = str_get_line(dev_conf, &dev_conf);
+		
+		if (NULL == line) {
 			// no more lines
 			return NULL;
@@ -264,8 +394,4 @@
 		if (!line_empty(line)) {
 			break;
-		}
-		
-		if (NULL == dev_conf) {
-			return NULL;
 		}
 	}
@@ -284,17 +410,23 @@
 	dev->name = dev_name;
 	
+	// allocate buffer for the list of hardware resources of the device
+	child_alloc_hw_res(dev);
+	
 	// get properties of the device (match ids, irq and io range)
-	cont = true;
-	while (cont) {
-		line = dev_conf;		
-		dev_conf = str_get_line(line);
-		cont = line_empty(line);
+	while (true) {		
+		line = str_get_line(dev_conf, &dev_conf);
+		
+		if (line_empty(line)) {
+			// no more device properties
+			break;
+		}
+		
 		// get the device's property from the configuration line and store it in the device structure
-		if (cont) {
-			get_dev_prop(dev, line);
-		}		
-	}
-	
-	// TODO class & interfaces !!!
+		get_dev_prop(dev, line);
+	}
+	
+	// set a class (including the corresponding set of interfaces) to the device
+	dev->class = &isa_child_class;
+	
 	child_device_register(dev, parent);
 	
@@ -328,7 +460,14 @@
 }
 
+static void isa_init() 
+{
+	isa_child_class.id = 0; // TODO
+	isa_child_class.interfaces[HW_RES_DEV_IFACE] = &isa_child_res_iface;
+}
+
 int main(int argc, char *argv[])
 {
 	printf(NAME ": HelenOS ISA bus driver\n");	
+	isa_init();
 	return driver_main(&isa_driver);
 }
