diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c
index 99010d4..0e304d5 100644
--- a/drivers/staging/android/binder.c
+++ b/drivers/staging/android/binder.c
@@ -32,6 +32,8 @@
 #include <linux/uaccess.h>
 #include <linux/vmalloc.h>
 
+#include <linux/kthread.h>
+
 #include "binder.h"
 
 static DEFINE_MUTEX(binder_lock);
@@ -47,6 +49,9 @@ static struct binder_node *binder_context_mgr_node;
 static uid_t binder_context_mgr_uid = -1;
 static int binder_last_id;
 
+static struct task_struct *binder_deferred_task;
+static DECLARE_WAIT_QUEUE_HEAD(binder_deferred_wq);
+
 static int binder_read_proc_proc(char *page, char **start, off_t off,
 				 int count, int *eof, void *data);
 
@@ -3050,14 +3055,23 @@ static void binder_deferred_release(struct binder_proc *proc)
 	kfree(proc);
 }
 
-static void binder_deferred_func(struct work_struct *work)
+static int binder_deferred_thread(void *ignore)
 {
 	struct binder_proc *proc;
 	struct files_struct *files;
-
+	int ret;
 	int defer;
-	do {
+
+	for (;;) {
+
+		do {
+			ret = wait_event_interruptible(binder_deferred_wq, !hlist_empty(&binder_deferred_list));
+		} while (ret == -ERESTARTSYS);
+		if (kthread_should_stop())
+			break;
+
 		mutex_lock(&binder_lock);
+
 		mutex_lock(&binder_deferred_lock);
 		if (!hlist_empty(&binder_deferred_list)) {
 			proc = hlist_entry(binder_deferred_list.first,
@@ -3072,36 +3086,42 @@ static void binder_deferred_func(struct work_struct *work)
 		mutex_unlock(&binder_deferred_lock);
 
 		files = NULL;
-		if (defer & BINDER_DEFERRED_PUT_FILES) {
-			files = proc->files;
-			if (files)
-				proc->files = NULL;
-		}
 
-		if (defer & BINDER_DEFERRED_FLUSH)
-			binder_deferred_flush(proc);
+		if (proc != NULL) {
+
+			if (defer & BINDER_DEFERRED_PUT_FILES) {
+				files = proc->files;
+				if (files)
+					proc->files = NULL;
+			}
+
+			if (defer & BINDER_DEFERRED_FLUSH)
+				binder_deferred_flush(proc);
 
-		if (defer & BINDER_DEFERRED_RELEASE)
-			binder_deferred_release(proc); /* frees proc */
+			if (defer & BINDER_DEFERRED_RELEASE)
+				binder_deferred_release(proc); /* frees proc */
+		}
 
 		mutex_unlock(&binder_lock);
+
 		if (files)
 			put_files_struct(files);
-	} while (proc);
+
+	}
+
+	return 0;
 }
-static DECLARE_WORK(binder_deferred_work, binder_deferred_func);
 
 static void
 binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer)
 {
 	mutex_lock(&binder_deferred_lock);
 	proc->deferred_work |= defer;
-	if (hlist_unhashed(&proc->deferred_work_node)) {
+	if (hlist_unhashed(&proc->deferred_work_node))
 		hlist_add_head(&proc->deferred_work_node,
 				&binder_deferred_list);
-		schedule_work(&binder_deferred_work);
-	}
 	mutex_unlock(&binder_deferred_lock);
+	wake_up_interruptible(&binder_deferred_wq);
 }
 
 static char *print_binder_transaction(char *buf, char *end, const char *prefix,
@@ -3759,6 +3779,12 @@ static int __init binder_init(void)
 				       binder_read_proc_transaction_log,
 				       &binder_transaction_log_failed);
 	}
+
+	if (ret == 0) {
+		binder_deferred_task = kthread_run(binder_deferred_thread, NULL, "binder_deferred_thread");
+		if (binder_deferred_task == NULL)
+			ret = PTR_ERR(binder_deferred_task);
+	}
 	return ret;
 }
 
