diff --git a/Makefile b/Makefile
index fe63e670e5a09602264622031bf6579ae78e1396..1ddea912698f9b74b76a2cb530980d01875e086e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,8 @@
 LINUX ?= /lib/modules/$(shell uname -r)/build
 
 zio-core-objs := zio-cdev.o zio-sys.o
+zio-core-objs += buffers/zio-buf-kmalloc.o triggers/zio-trig-user.o
+
 obj-m = zio-core.o
 obj-m += drivers/
 obj-m += buffers/
diff --git a/buffers/Makefile b/buffers/Makefile
index 9f31881c52ab7ca775eb2e1ae551bbba5f9d508b..a42d21ea9fb6d5041034e1a983a9ef19ca7ee410 100644
--- a/buffers/Makefile
+++ b/buffers/Makefile
@@ -2,7 +2,7 @@ LINUX ?= /lib/modules/$(shell uname -r)/build
 
 EXTRA_CFLAGS += -I$(obj)/../include/
 
-obj-m = zio-buf-kmalloc.o
+# zio-buf-kmalloc.o is now part of zio-core
 
 all:
 	$(MAKE) -C $(LINUX) M=$(shell /bin/pwd) modules
diff --git a/buffers/zio-buf-kmalloc.c b/buffers/zio-buf-kmalloc.c
index 3c3bd9b9ec96cac6e462041dc62b174719e5621e..26a74ddd7f3e8f34944660b7aca30cf34eff8a95 100644
--- a/buffers/zio-buf-kmalloc.c
+++ b/buffers/zio-buf-kmalloc.c
@@ -263,18 +263,17 @@ static struct zio_buffer_type zbk_buffer = {
 	.f_op = &zbk_file_ops,
 };
 
-static int zbk_init(void)
+static int __init zbk_init(void)
 {
 	return zio_register_buf(&zbk_buffer, "kmalloc");
 }
 
-static void zbk_exit(void)
+static void __exit zbk_exit(void)
 {
 	zio_unregister_buf(&zbk_buffer);
 	/* FIXME REMOVE all instances left */
 }
 
-module_init(zbk_init);
-module_exit(zbk_exit);
-MODULE_AUTHOR("Alessandro Rubini");
-MODULE_LICENSE("GPL");
+/* This is the default buffer, and is part of zio-core: no module init/exit */
+int __init  __attribute__((alias("zbk_init"))) zio_default_buffer_init(void);
+void __exit __attribute__((alias("zbk_exit"))) zio_default_buffer_exit(void);
diff --git a/include/linux/zio.h b/include/linux/zio.h
index 29eb04f8febb52a3962834b7920da6c17f318776..6ead3089afaa5a951bfb97c839dc9a316d608011 100644
--- a/include/linux/zio.h
+++ b/include/linux/zio.h
@@ -260,7 +260,13 @@ void __zio_unregister_cdev(void);
 
 int zio_create_chan_devices(struct zio_channel *zchan);
 void zio_destroy_chan_devices(struct zio_channel *zchan);
-#endif /* INTERNAL */
+
+int zio_default_buffer_init(void);
+void zio_default_buffer_exit(void);
+int zio_default_trigger_init(void);
+void zio_default_trigger_exit(void);
+
+#endif /* __ZIO_INTERNAL__ */
 
 #endif /* __KERNEL__ */
 #endif /* __ZIO_H__ */
diff --git a/triggers/Makefile b/triggers/Makefile
index 329d1ccc3a140447378ef4cf2d5c717b7cd31993..b37bc99142eefb037e8a3614bff1bf5c35cef782 100644
--- a/triggers/Makefile
+++ b/triggers/Makefile
@@ -2,9 +2,9 @@ LINUX ?= /lib/modules/$(shell uname -r)/build
 
 EXTRA_CFLAGS += -I$(obj)/../include/
 
+# zio-trig-user.o is now part of zio-core
 obj-m = zio-trig-timer.o
 obj-m += zio-trig-irq.o
-obj-m += zio-trig-user.o
 
 all:
 	$(MAKE) -C $(LINUX) M=$(shell /bin/pwd) modules
diff --git a/triggers/zio-trig-user.c b/triggers/zio-trig-user.c
index c0f5ac87856fddfd79c9fd02cc1822cc56c17390..b24b433b256577c537cae29958432e1913711ac1 100644
--- a/triggers/zio-trig-user.c
+++ b/triggers/zio-trig-user.c
@@ -123,7 +123,7 @@ static void __exit ztu_exit(void)
 	zio_unregister_trig(&ztu_trigger);
 }
 
-module_init(ztu_init);
-module_exit(ztu_exit);
-MODULE_AUTHOR("Alessandro Rubini");
-MODULE_LICENSE("GPL");
+
+/* This is the default trigger, and is part of zio-core: no module init/exit */
+int __init  __attribute__((alias("ztu_init"))) zio_default_trigger_init(void);
+void __exit __attribute__((alias("ztu_exit"))) zio_default_trigger_exit(void);
diff --git a/zio-sys.c b/zio-sys.c
index 216f8428405ffadc8efad5915f64fc9522ba2cd0..2572e38e807bf263bcac68bce93c6931723ba249 100644
--- a/zio-sys.c
+++ b/zio-sys.c
@@ -1762,6 +1762,12 @@ static int __init zio_init(void)
 			"triggers");
 	zlist_register(&zstat->all_buffer_types, zstat->kobj, ZBUF,
 			"buffers");
+	err = zio_default_buffer_init();
+	if (err)
+		pr_warn("%s: cannot register default buffer\n", __func__);
+	err = zio_default_trigger_init();
+	if (err)
+		pr_warn("%s: cannot register default trigger\n", __func__);
 	pr_info("zio-core had been loaded\n");
 	return 0;
 
@@ -1773,6 +1779,8 @@ out_cdev:
 
 static void __exit zio_exit(void)
 {
+	zio_default_trigger_exit();
+	zio_default_buffer_exit();
 	/* Remove the three object lists*/
 	zlist_unregister(&zstat->all_devices);
 	zlist_unregister(&zstat->all_buffer_types);
@@ -1792,6 +1800,7 @@ static void __exit zio_exit(void)
 subsys_initcall(zio_init);
 module_exit(zio_exit);
 
-MODULE_AUTHOR("Federico Vaga <federico.vaga@gmail.com>");
+MODULE_AUTHOR("Federico Vaga and Alessandro Rubini");
+/* Federico wrote the core, Alessandro wrote default trigger and buffer */
 MODULE_DESCRIPTION("ZIO - ZIO Input Output");
 MODULE_LICENSE("GPL");