diff --git a/feeds.module b/feeds.module
index 8785f22..0bb5cc1 100644
--- a/feeds.module
+++ b/feeds.module
@@ -398,6 +398,16 @@ function feeds_exit() {
   if (drupal_static('feeds_log_error', FALSE)) {
     watchdog('feeds', 'Feeds reported errors, visit the Feeds log for details.', array(), WATCHDOG_ERROR, 'admin/reports/dblog/feeds');
   }
+
+  // Process any pending PuSH subscriptions.
+  if ($subscriptions = &drupal_static('feeds_pubsubhubbub_subscribe_jobs', array())) {
+    foreach ($subscriptions as $sub) {
+      $sub['fetcher']->subscribe($sub['source']);
+    }
+
+    // Empty out the processed array.
+    $subscriptions = array();
+  }
 }
 
 /**
@@ -565,6 +575,8 @@ function feeds_node_insert($node) {
 function feeds_node_update($node) {
   // Source attached to node.
   if ($importer_id = feeds_get_importer_id($node->type)) {
+    $is_feeds_node = &drupal_static('feeds_is_feeds_node_save', FALSE);
+    $is_feeds_node = TRUE;
     $source = feeds_source($importer_id, $node->nid);
     $source->addConfig($node->feeds);
     $source->save();
diff --git a/plugins/FeedsHTTPFetcher.inc b/plugins/FeedsHTTPFetcher.inc
index 27dd013..d2ebd93 100644
--- a/plugins/FeedsHTTPFetcher.inc
+++ b/plugins/FeedsHTTPFetcher.inc
@@ -164,6 +164,16 @@ class FeedsHTTPFetcher extends FeedsFetcher {
    */
   public function sourceSave(FeedsSource $source) {
     if ($this->config['use_pubsubhubbub']) {
+      // If this is a node save, move the subscribe to hook_exit().
+      if (drupal_static('feeds_is_feeds_node_save', FALSE)) {
+        $subscribe_jobs = &drupal_static('feeds_pubsubhubbub_subscribe_jobs');
+        if (!isset($subscribe_jobs)) {
+          $subscribe_jobs = array();
+        }
+        $subscribe_jobs[] = array('fetcher' => $this, 'source' => $source);
+      }
+    }
+    else {
       $this->subscribe($source);
     }
   }
