Index: uspace/srv/devman/main.c
===================================================================
--- uspace/srv/devman/main.c	(revision 5cd136abc29be1860cb1f40730725d7f1d76a017)
+++ uspace/srv/devman/main.c	(revision 9a66bc2ed74a9425386a5a8717ee6155578308a0)
@@ -258,8 +258,12 @@
 }
 
-static void devman_forward(ipc_callid_t iid, ipc_call_t *icall, bool drv_to_parent) {
-	device_handle_t handle;
+static void devman_forward(ipc_callid_t iid, ipc_call_t *icall, bool drv_to_parent) {	
+	
+	device_handle_t handle = IPC_GET_ARG2(*icall);
+	printf(NAME ": devman_forward - trying to forward connection to device with handle %x.\n", handle);
+	
 	node_t *dev = find_dev_node(&device_tree, handle);
 	if (NULL == dev) {
+		printf(NAME ": devman_forward error - no device with handle %x was found.\n", handle);
 		ipc_answer_0(iid, ENOENT);
 		return;
@@ -269,10 +273,13 @@
 	
 	if (drv_to_parent) {
-		driver = dev->parent->drv;
+		if (NULL != dev->parent) {
+			driver = dev->parent->drv;		
+		}
 	} else {
 		driver = dev->drv;		
 	}
 	
-	if (NULL == driver) {		
+	if (NULL == driver) {	
+		printf(NAME ": devman_forward error - no driver to connect to.\n", handle);
 		ipc_answer_0(iid, ENOENT);
 		return;	
@@ -286,4 +293,9 @@
 	}
 	
+	if (driver->phone <= 0) {
+		printf(NAME ": devman_forward: cound not forward to driver %s (the driver's phone is %x).\n", driver->name, driver->phone);
+		return;
+	}
+	printf(NAME ": devman_forward: forward to driver %s with phone %d.\n", driver->name, driver->phone);
 	ipc_forward_fast(iid, driver->phone, method, dev->handle, 0, IPC_FF_NONE);	
 }
Index: uspace/srv/drivers/rootia32/rootia32.c
===================================================================
--- uspace/srv/drivers/rootia32/rootia32.c	(revision 5cd136abc29be1860cb1f40730725d7f1d76a017)
+++ uspace/srv/drivers/rootia32/rootia32.c	(revision 9a66bc2ed74a9425386a5a8717ee6155578308a0)
@@ -50,10 +50,11 @@
 #include <ipc/devman.h>
 #include <ipc/dev_iface.h>
+#include <resource.h>
 
 #define NAME "rootia32"
 
-typedef struct rootia32_dev_data {
+typedef struct rootia32_child_dev_data {
 	hw_resource_list_t hw_resources;	
-} rootia32_dev_data_t;
+} rootia32_child_dev_data_t;
 
 static bool rootia32_add_device(device_t *dev);
@@ -82,5 +83,5 @@
 };
 
-static rootia32_dev_data_t pci_data = {
+static rootia32_child_dev_data_t pci_data = {
 	.hw_resources = {
 		1, 
@@ -89,7 +90,28 @@
 };
 
+static hw_resource_list_t * rootia32_get_child_resources(device_t *dev)
+{
+	rootia32_child_dev_data_t *data = (rootia32_child_dev_data_t *)dev->driver_data;
+	if (NULL == data) {
+		return NULL;
+	}
+	return &data->hw_resources;
+}
+
+static bool rootia32_enable_child_interrupt(device_t *dev) 
+{
+	// TODO
+	
+	return false;
+}
+
+static resource_iface_t child_res_iface = {
+	&rootia32_get_child_resources,
+	&rootia32_enable_child_interrupt	
+};
+
 static bool rootia32_add_child(
 	device_t *parent, const char *name, const char *str_match_id, 
-	rootia32_dev_data_t *drv_data) 
+	rootia32_child_dev_data_t *drv_data) 
 {
 	printf(NAME ": adding new child device '%s'.\n", name);
@@ -113,4 +135,7 @@
 	match_id->score = 100;
 	add_match_id(&child->match_ids, match_id);	
+	
+	// add an interface to the device
+	device_set_iface(child, HW_RES_DEV_IFACE, &child_res_iface);
 	
 	// register child  device
@@ -151,5 +176,4 @@
 	if (!rootia32_add_children(dev)) {
 		printf(NAME ": failed to add child devices for platform ia32.\n");
-		return false;
 	}
 	
