diff --git a/feeds.module b/feeds.module
index 8785f22..7a2b564 100644
--- a/feeds.module
+++ b/feeds.module
@@ -73,6 +73,9 @@ function feeds_cron_job_scheduler_info() {
   $info['feeds_importer_expire'] = array(
     'queue name' => 'feeds_importer_expire',
   );
+  $info['feeds_push_unsubscribe'] = array(
+    'queue name' => 'feeds_push_unsubscribe',
+  );
   return $info;
 }
 
@@ -93,6 +96,10 @@ function feeds_cron_queue_info() {
     'worker callback' => 'feeds_importer_expire',
     'time' => 15,
   );
+  $queues['feeds_push_unsubscribe'] = array(
+    'worker callback' => 'feeds_push_unsubscribe',
+    'time' => 15,
+  );
   return $queues;
 }
 
@@ -148,6 +155,15 @@ function feeds_importer_expire($job) {
 }
 
 /**
+ * Scheduler callback for unsubscribing from PuSH hubs.
+ */
+function feeds_push_unsubscribe($job) {
+  $source = feeds_source($job['type'], $job['id']);
+  $fetcher = feeds_plugin('FeedsHTTPFetcher', $source->importer->id);
+  $fetcher->unsubscribe($source);
+}
+
+/**
  * Batch API worker callback. Used by FeedsSource::startBatchAPIJob().
  *
  * @see FeedsSource::startBatchAPIJob().
diff --git a/plugins/FeedsHTTPFetcher.inc b/plugins/FeedsHTTPFetcher.inc
index 27dd013..d8cb17d 100644
--- a/plugins/FeedsHTTPFetcher.inc
+++ b/plugins/FeedsHTTPFetcher.inc
@@ -173,7 +173,20 @@ class FeedsHTTPFetcher extends FeedsFetcher {
    */
   public function sourceDelete(FeedsSource $source) {
     if ($this->config['use_pubsubhubbub']) {
-      $this->unsubscribe($source);
+      // If we're in a feed node, queue the unsubscribe,
+      // else process immediately.
+      if ($source->feed_nid) {
+        $job = array(
+          'type' => $source->id,
+          'id' => $source->feed_nid,
+          'period' => 0,
+          'periodic' => FALSE,
+        );
+        JobScheduler::get('feeds_push_unsubscribe')->set($job);
+      }
+      else {
+        $this->unsubscribe($source);
+      }
     }
   }
 
