diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index 393318a..aedd496 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -1595,6 +1595,9 @@ function comment_delete($cid) {
  *   The comment to delete.
  */
 function comment_delete_multiple($cids) {
+  // Enqueue larger operations.
+  $cids = system_workers_bulk_split(__FUNCTION__, $cids);
+
   $comments = comment_load_multiple($cids);
   if ($comments) {
     $transaction = db_transaction();
diff --git a/modules/node/node.module b/modules/node/node.module
index 1ecc093..c5a2316 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -1193,6 +1193,9 @@ function node_delete($nid) {
 function node_delete_multiple($nids) {
   $transaction = db_transaction();
   if (!empty($nids)) {
+    // Enqueue larger operations.
+    $nids = system_workers_bulk_split(__FUNCTION__, $nids);
+
     $nodes = node_load_multiple($nids, array());
 
     try {
diff --git a/modules/system/system.module b/modules/system/system.module
index 946ef0c..948f935 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -3031,6 +3031,50 @@ function system_cron() {
 }
 
 /**
+ * Implements hook_cron_queue_info().
+ */
+function system_cron_queue_info() {
+  $queues['system_workers'] = array(
+    'worker callback' => 'system_queue_worker',
+    'time' => 15,
+    'reliable' => TRUE,
+  );
+  return $queues;
+}
+
+/**
+ * Simple job queue worker.
+ */
+function system_queue_worker($data) {
+  return call_user_func_array($data['callback'], $data['arguments']);
+}
+
+/**
+ * Helper function. Conditionally splits big sets of data into chunks before
+ * processing them. In case they are bigger than the allowed threshold -
+ * variable 'queue_bulk_threshold', we add the remaining to the queue and
+ * return just the first set.
+ *
+ * @param $callback - The callback for the job being added
+ * @param $items - An array of items to be processed
+ *
+ * @return chunk with items to be processed, not bigger than the threshold
+ */
+function system_workers_bulk_split($callback, $items) {
+  $threshold = variable_get('queue_bulk_threshold', 20);
+
+  if (count($items) > $threshold) {
+    $jobs = array_chunk($items, $threshold);
+    $items = array_pop($jobs);
+    foreach ($jobs as $job) {
+      DrupalQueue::addJob($callback, array($job));
+    }
+  }
+
+  return $items;
+}
+
+/**
  * Implements hook_flush_caches().
  */
 function system_flush_caches() {
diff --git a/modules/system/system.queue.inc b/modules/system/system.queue.inc
index 00d3940..e6c85c7 100644
--- a/modules/system/system.queue.inc
+++ b/modules/system/system.queue.inc
@@ -94,6 +94,18 @@ class DrupalQueue {
     }
     return $queues[$name];
   }
+
+  /**
+   * Add a simple job to the queue.
+   *
+   * @param $callback
+   *   The name of the function to be called when the queue is processed next.
+   * @param $arguments
+   *   The arguments to the callback.
+   */
+  public static function addJob($callback, $arguments = array()) {
+    return DrupalQueue::get('system_workers', TRUE)->createItem(array('callback' => $callback, 'arguments' => $arguments));
+  }
 }
 
 interface DrupalQueueInterface {
diff --git a/modules/user/user.module b/modules/user/user.module
index 044ad46..370d765 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -2445,6 +2445,9 @@ function user_delete($uid) {
  */
 function user_delete_multiple(array $uids) {
   if (!empty($uids)) {
+    // Enqueue larger operations.
+    $uids = system_workers_bulk_split(__FUNCTION__, $uids);
+
     $accounts = user_load_multiple($uids, array());
 
     $transaction = db_transaction();
