Index: kernel/generic/src/ipc/ipcrsc.c
===================================================================
--- kernel/generic/src/ipc/ipcrsc.c	(revision fc0de8c33fadd1f6730eb0465b89c7afa861fe56)
+++ kernel/generic/src/ipc/ipcrsc.c	(revision 2df21755623b239a0d57f0639a0bfcf636cd3d5b)
@@ -44,9 +44,9 @@
 #include <stdlib.h>
 
-static void phone_destroy(void *arg)
+static void phone_destroy(kobject_t *arg)
 {
-	phone_t *phone = (phone_t *) arg;
+	phone_t *phone = phone_from_kobject(arg);
 	if (phone->hangup_call)
-		kobject_put(phone->hangup_call->kobject);
+		kobject_put(&phone->hangup_call->kobject);
 	slab_free(phone_cache, phone);
 }
@@ -76,15 +76,9 @@
 			return ENOMEM;
 		}
-		kobject_t *kobj = kobject_alloc(FRAME_ATOMIC);
-		if (!kobj) {
-			cap_free(TASK, handle);
-			slab_free(phone_cache, phone);
-			return ENOMEM;
-		}
+
 		call_t *hcall = ipc_call_alloc();
 		if (!hcall) {
 			cap_free(TASK, handle);
 			slab_free(phone_cache, phone);
-			free(kobj);
 			return ENOMEM;
 		}
@@ -94,13 +88,10 @@
 		phone->hangup_call = hcall;
 
-		kobject_initialize(kobj, KOBJECT_TYPE_PHONE, phone);
-		phone->kobject = kobj;
-
 		if (publish)
-			cap_publish(task, handle, kobj);
+			cap_publish(task, handle, &phone->kobject);
 
 		*phandle = handle;
 		if (kobject)
-			*kobject = kobj;
+			*kobject = &phone->kobject;
 	}
 	return rc;
