Index: kernel/generic/include/cap/cap.h
===================================================================
--- kernel/generic/include/cap/cap.h	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/include/cap/cap.h	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -70,4 +70,8 @@
 } kobject_ops_t;
 
+extern kobject_ops_t *kobject_ops[];
+
+#define KOBJECT_OP(k)	kobject_ops[(k)->type]
+
 /*
  * Everything in kobject_t except for the atomic reference count, the capability
@@ -82,6 +86,4 @@
 	/** List of published capabilities associated with the kobject */
 	list_t caps_list;
-
-	kobject_ops_t *ops;
 
 	union {
@@ -139,6 +141,5 @@
 extern kobject_t *kobject_alloc(unsigned int);
 extern void kobject_free(kobject_t *);
-extern void kobject_initialize(kobject_t *, kobject_type_t, void *,
-    kobject_ops_t *);
+extern void kobject_initialize(kobject_t *, kobject_type_t, void *);
 extern kobject_t *kobject_get(struct task *, cap_handle_t, kobject_type_t);
 extern void kobject_add_ref(kobject_t *);
Index: kernel/generic/include/ipc/ipc.h
===================================================================
--- kernel/generic/include/ipc/ipc.h	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/include/ipc/ipc.h	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -172,4 +172,6 @@
 extern answerbox_t *ipc_box_0;
 
+extern kobject_ops_t call_kobject_ops;
+
 extern void ipc_init(void);
 
Index: kernel/generic/include/ipc/ipcrsc.h
===================================================================
--- kernel/generic/include/ipc/ipcrsc.h	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/include/ipc/ipcrsc.h	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -40,4 +40,6 @@
 #include <cap/cap.h>
 
+extern kobject_ops_t phone_kobject_ops;
+
 extern errno_t phone_alloc(task_t *, bool, cap_phone_handle_t *, kobject_t **);
 extern void phone_dealloc(cap_phone_handle_t);
Index: kernel/generic/include/ipc/irq.h
===================================================================
--- kernel/generic/include/ipc/irq.h	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/include/ipc/irq.h	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -46,4 +46,7 @@
 #include <typedefs.h>
 #include <adt/list.h>
+#include <cap/cap.h>
+
+extern kobject_ops_t irq_kobject_ops;
 
 extern irq_ownership_t ipc_irq_top_half_claim(irq_t *);
Index: kernel/generic/include/synch/syswaitq.h
===================================================================
--- kernel/generic/include/synch/syswaitq.h	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/include/synch/syswaitq.h	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -38,4 +38,7 @@
 #include <typedefs.h>
 #include <abi/cap.h>
+#include <cap/cap.h>
+
+extern kobject_ops_t waitq_kobject_ops;
 
 extern void sys_waitq_init(void);
Index: kernel/generic/src/cap/cap.c
===================================================================
--- kernel/generic/src/cap/cap.c	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/src/cap/cap.c	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -83,4 +83,8 @@
 #include <mm/slab.h>
 #include <adt/list.h>
+#include <synch/syswaitq.h>
+#include <ipc/ipcrsc.h>
+#include <ipc/ipc.h>
+#include <ipc/irq.h>
 
 #include <limits.h>
@@ -94,4 +98,11 @@
 static slab_cache_t *cap_cache;
 static slab_cache_t *kobject_cache;
+
+kobject_ops_t *kobject_ops[KOBJECT_TYPE_MAX] = {
+	[KOBJECT_TYPE_CALL] = &call_kobject_ops,
+	[KOBJECT_TYPE_IRQ] = &irq_kobject_ops,
+	[KOBJECT_TYPE_PHONE] = &phone_kobject_ops,
+	[KOBJECT_TYPE_WAITQ] = &waitq_kobject_ops
+};
 
 static size_t caps_hash(const ht_link_t *item)
@@ -412,8 +423,6 @@
  * @param type  Type of the kernel object.
  * @param raw   Raw pointer to the encapsulated object.
- * @param ops   Pointer to kernel object operations for the respective type.
- */
-void kobject_initialize(kobject_t *kobj, kobject_type_t type, void *raw,
-    kobject_ops_t *ops)
+ */
+void kobject_initialize(kobject_t *kobj, kobject_type_t type, void *raw)
 {
 	atomic_store(&kobj->refcnt, 1);
@@ -424,5 +433,4 @@
 	kobj->type = type;
 	kobj->raw = raw;
-	kobj->ops = ops;
 }
 
@@ -474,5 +482,5 @@
 {
 	if (atomic_postdec(&kobj->refcnt) == 1) {
-		kobj->ops->destroy(kobj->raw);
+		KOBJECT_OP(kobj)->destroy(kobj->raw);
 		kobject_free(kobj);
 	}
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/src/ipc/ipc.c	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -100,5 +100,5 @@
 }
 
-static kobject_ops_t call_kobject_ops = {
+kobject_ops_t call_kobject_ops = {
 	.destroy = call_destroy
 };
@@ -127,5 +127,5 @@
 
 	_ipc_call_init(call);
-	kobject_initialize(kobj, KOBJECT_TYPE_CALL, call, &call_kobject_ops);
+	kobject_initialize(kobj, KOBJECT_TYPE_CALL, call);
 	call->kobject = kobj;
 
Index: kernel/generic/src/ipc/ipcrsc.c
===================================================================
--- kernel/generic/src/ipc/ipcrsc.c	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/src/ipc/ipcrsc.c	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -52,5 +52,5 @@
 }
 
-static kobject_ops_t phone_kobject_ops = {
+kobject_ops_t phone_kobject_ops = {
 	.destroy = phone_destroy
 };
@@ -94,6 +94,5 @@
 		phone->hangup_call = hcall;
 
-		kobject_initialize(kobj, KOBJECT_TYPE_PHONE, phone,
-		    &phone_kobject_ops);
+		kobject_initialize(kobj, KOBJECT_TYPE_PHONE, phone);
 		phone->kobject = kobj;
 
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/src/ipc/irq.c	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -306,5 +306,5 @@
 }
 
-static kobject_ops_t irq_kobject_ops = {
+kobject_ops_t irq_kobject_ops = {
 	.destroy = irq_destroy
 };
@@ -385,5 +385,5 @@
 	irq_spinlock_unlock(&irq_uspace_hash_table_lock, true);
 
-	kobject_initialize(kobject, KOBJECT_TYPE_IRQ, irq, &irq_kobject_ops);
+	kobject_initialize(kobject, KOBJECT_TYPE_IRQ, irq);
 	cap_publish(TASK, handle, kobject);
 
Index: kernel/generic/src/synch/syswaitq.c
===================================================================
--- kernel/generic/src/synch/syswaitq.c	(revision 5667dcafabd2d4011aab17d1ae71978ce3d3cd45)
+++ kernel/generic/src/synch/syswaitq.c	(revision 46a8c3cd2588984cf4d1b909ed12113e2f780298)
@@ -54,5 +54,5 @@
 }
 
-static kobject_ops_t waitq_kobject_ops = {
+kobject_ops_t waitq_kobject_ops = {
 	.destroy = waitq_destroy
 };
@@ -100,5 +100,5 @@
 		return (sys_errno_t) ENOMEM;
 	}
-	kobject_initialize(kobj, KOBJECT_TYPE_WAITQ, wq, &waitq_kobject_ops);
+	kobject_initialize(kobj, KOBJECT_TYPE_WAITQ, wq);
 
 	cap_handle_t handle;
