diff --git a/init/demo.c b/init/demo.c
new file mode 100644
index 0000000000000000000000000000000000000000..43649b5a96d8949c132d2556611bf17dbf13c235
--- /dev/null
+++ b/init/demo.c
@@ -0,0 +1,253 @@
+
+/**
+ * This creates a number processing nodes in a processing network.
+ * Two special trackers are used for input and output.
+ */
+
+
+#include <kernel/kernel.h>
+#include <kernel/kmem.h>
+#include <kernel/kthread.h>
+
+#include <data_proc_task.h>
+#include <data_proc_tracker.h>
+#include <data_proc_net.h>
+
+
+#define CRIT_LEVEL	10
+
+#define OP_ADD		0x1234
+#define OP_SUB		0x1235
+#define OP_MUL		0x1236
+
+#define STEPS	3
+
+
+
+int op_output(unsigned long op_code, struct proc_task *t)
+{
+	ssize_t i;
+	ssize_t n;
+
+	unsigned int *p = NULL;
+
+
+	n = pt_get_nmemb(t);
+	printk("OUT: op code %d, %d items\n", op_code, n);
+
+	if (!n)
+		goto exit;
+
+
+	p = (unsigned int *) pt_get_data(t);
+	if (!p)
+		goto exit;
+
+
+
+	for (i = 0; i < n; i++) {
+		printk("\t%d\n", p[i]);
+	}
+
+exit:
+	kfree(p);	/* clean up our data buffer */
+
+	pt_destroy(t);
+
+	return PN_TASK_SUCCESS;
+}
+
+
+int op_add(unsigned long op_code, struct proc_task *t)
+{
+
+	ssize_t i;
+	ssize_t n;
+
+	unsigned int *p;
+
+
+	n = pt_get_nmemb(t);
+
+	if (!n)
+		return PN_TASK_SUCCESS;
+
+
+	p = (unsigned int *) pt_get_data(t);
+
+	if (!p)	/* we have elements but data is NULL, error*/
+		return PN_TASK_DESTROY;
+
+	printk("ADD: op code %d, %d items\n", op_code, n);
+
+	for (i = 0; i < n; i++) {
+		p[i] += 10;
+	}
+
+
+	return PN_TASK_SUCCESS;
+}
+
+int op_sub(unsigned long op_code, struct proc_task *t)
+{
+
+	ssize_t i;
+	ssize_t n;
+
+	unsigned int *p;
+
+
+	n = pt_get_nmemb(t);
+
+	if (!n)
+		return PN_TASK_SUCCESS;
+
+
+	p = (unsigned int *) pt_get_data(t);
+
+	if (!p)	/* we have elements but data is NULL, error*/
+		return PN_TASK_DESTROY;
+
+	printk("SUB: op code %d, %d items\n", op_code, n);
+
+	for (i = 0; i < n; i++) {
+		p[i] -= 2;
+	}
+
+
+	return PN_TASK_SUCCESS;
+}
+
+int op_mul(unsigned long op_code, struct proc_task *t)
+{
+
+	ssize_t i;
+	ssize_t n;
+
+	unsigned int *p;
+
+
+	n = pt_get_nmemb(t);
+
+	if (!n)
+		return PN_TASK_SUCCESS;
+
+
+	p = (unsigned int *) pt_get_data(t);
+
+	if (!p)	/* we have elements but data is NULL, error*/
+		return PN_TASK_DESTROY;
+
+	printk("MUL: op code %d, %d items\n", op_code, n);
+
+	for (i = 0; i < n; i++) {
+		p[i] *= 3;
+	}
+
+
+	return PN_TASK_SUCCESS;
+}
+
+
+int pn_prepare_nodes(struct proc_net *pn)
+{
+	struct proc_tracker *pt;
+
+
+	/* create and add processing node trackers for the each operation */
+
+	pt = pt_track_create(op_add, OP_ADD, CRIT_LEVEL);
+	BUG_ON(!pt);
+	BUG_ON(pn_add_node(pn, pt));
+
+	pt = pt_track_create(op_sub, OP_SUB, CRIT_LEVEL);
+	BUG_ON(!pt);
+	BUG_ON(pn_add_node(pn, pt));
+
+	pt = pt_track_create(op_mul, OP_MUL, CRIT_LEVEL);
+	BUG_ON(!pt);
+	BUG_ON(pn_add_node(pn, pt));
+
+	BUG_ON(pn_create_output_node(pn, op_output));
+
+	return 0;
+}
+
+
+
+void pn_new_input_task(struct proc_net *pn, size_t n)
+{
+	struct proc_task *t;
+
+	static int seq;
+
+	int i;
+	unsigned int *data;
+
+
+	t = pt_create(NULL, 0, STEPS, 0, seq++);
+
+	BUG_ON(!t);
+
+	BUG_ON(pt_add_step(t, OP_ADD, NULL));
+	BUG_ON(pt_add_step(t, OP_SUB, NULL));
+	BUG_ON(pt_add_step(t, OP_MUL, NULL));
+
+
+
+	data = kzalloc(sizeof(unsigned int) * n);
+
+	for (i = 0; i < n; i++)
+		data[i] = i;
+
+	pt_set_data(t, data, n * sizeof(unsigned int));
+	pt_set_nmemb(t, n);
+
+
+	pn_input_task(pn, t);
+}
+
+
+int demo(void *p __attribute__((unused)))
+{
+	struct proc_net *pn;
+
+	printk("DEMO STARTING\n");
+
+	pn = pn_create();
+
+	BUG_ON(!pn);
+
+	pn_prepare_nodes(pn);
+
+
+	pn_new_input_task(pn, 5);
+	pn_new_input_task(pn, 0);
+	pn_new_input_task(pn, 3);
+
+	pn_process_inputs(pn);
+
+	while (pn_process_next(pn));
+
+	pn_process_outputs(pn);
+
+
+	printk("DEMO COMPLETE\n");
+
+	return 0;
+}
+
+
+void demo_start(void)
+{
+	struct task_struct *t;
+
+	t = kthread_create(demo, NULL, KTHREAD_CPU_AFFINITY_NONE, "DEMO");
+
+	/* allocate 98% of the cpu */
+	kthread_set_sched_edf(t, 100*1000, 99*1000, 98*1000);
+
+	if (kthread_wake_up(t) < 0)
+		printk("---- IASW NOT SCHEDULABLE---\n");
+}
+
diff --git a/kernel/kthread.c b/kernel/kthread.c
index c86697f0ec9b7478e047c0b0d0da67f0346ee8cf..113bbbd9519244da9f0c947602cd0bfd8aae40b7 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -100,7 +100,7 @@ int kthread_wake_up(struct task_struct *task)
 		return -EINVAL;
 
 	ret = sched_enqueue(task);
-	if(ret)
+	if (ret)
 		return ret;
 
 	flags = arch_local_irq_save();
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 0bc8ae5a653aa824cac5720a2335ea3711e62ca2..cbf692b93f9b55640b62584b092ccf7c001494f4 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -266,7 +266,9 @@ int sched_enqueue(struct task_struct *task)
 	if (ret)
 		return ret;
 
-	task->sched->enqueue_task(task);
+	ret = task->sched->enqueue_task(task);
+	if (ret)
+		return ret;
 
 	return 0;
 }