diff --git feedapi_eparser.module feedapi_eparser.module
index dbd5c07..55c3b91 100644
--- feedapi_eparser.module
+++ feedapi_eparser.module
@@ -73,8 +73,11 @@ function _feedapi_eparser_load_settings($nid) {
 function feedapi_eparser_feedapi_feed($op, $feed = false) {
   switch ($op) {
     case 'parse':
-      if ($feed) {
-        return feedapi_eparser_feedapi_parse($feed);
+      // FeedAPI api inconsistencies mean we can't rely on the feed nid being
+      // present. We have to have this to function so we just fail if its not
+      // there. FeedAPI bug to fix. http://drupal.org/node/435778
+      if ($feed && isset($feed->nid)) {
+        return feedapi_eparser_load_type_plugin($feed)->parse();
       }
       break;
     case 'compatible':
@@ -94,47 +97,6 @@ function feedapi_eparser_feedapi_feed($op, $feed = false) {
   }
 }
 
-function feedapi_eparser_feedapi_parse($feed) {
-  // FeedAPI api inconsistencies mean we can't rely on the feed nid being
-  // present. We have to have this to function so we just fail if its not
-  // there. FeedAPI bug to fix. http://drupal.org/node/435778
-  if (!isset($feed->nid)) {
-    return;
-  }
-
-  $cid = 'eparse:' . $feed->nid;
-  if ($data = cache_get($cid)) {
-    $source = $data->data;
-  }
-  else {
-
-    // Setup a cloned feed object that includes our eparser settings.
-    // We clone so we don't accidently polute the feed object through a reference.
-    $efeed = drupal_clone($feed);
-    $efeed->eparse = _feedapi_eparser_load_settings($feed->nid);
-
-    // If eparse didn't load something was wrong and we can't continue.
-    if (!isset($efeed->eparse)) {
-      return;
-    }
-
-    $type_plugin = feedapi_eparser_load_type_plugin($efeed);
-    if (!$type_plugin) {
-      return FALSE;
-    }
-
-    if ($type_plugin->init($efeed) !== FALSE && $type_plugin->download() !== FALSE) {
-      $source = $type_plugin->parse();
-    }
-
-    if (isset($source->options->ttl)) {
-      cache_set($cid, $source, 'cache', time() + $source->options->ttl);
-    }
-  }
-
-  return $source;
-}
-
 /**
  * Include some feedapi_eparse include file.
  *
@@ -163,8 +125,44 @@ function _feedapi_eparser_include($name) {
  * Load a type plugin for a feed.
  */
 function feedapi_eparser_load_type_plugin($feed) {
-  _feedapi_eparser_include('plugins');
-  return _feedapi_eparser_load_type_plugin($feed);
+  static $plugin_cache = array();
+
+  if (!isset($plugin_cache[$feed->nid])) {
+
+    // Make sure they've got a new enough ctools version.
+    if (!module_invoke('ctools', 'api_version', '1.1.1')) {
+      return;
+    }
+
+    // Setup a cloned feed object that includes our eparser settings.
+    // We clone so we don't accidently polute the feed object through a reference.
+    $efeed = drupal_clone($feed);
+    $efeed->eparse = _feedapi_eparser_load_settings($feed->nid);
+
+    // If eparse didn't load something was wrong and we can't continue.
+    if (!$efeed->eparse) {
+      return;
+    }
+
+    // We still need to include plugins because its got base classes and
+    // other important things we need still.
+    _feedapi_eparser_include('plugins');
+
+    ctools_include('plugins');
+    $class = ctools_plugin_load_class('eparse', 'type_plugins', $efeed->eparse->type, 'handler');
+    if ($class) {
+      $type_plugin = new $class;
+      if ($type_plugin->init($efeed) !== FALSE) {
+        $plugin_cache[$feed->nid] = $type_plugin;
+      }
+    }
+
+    if (!isset($plugin_cache[$feed->nid])) {
+      $plugin_cache[$feed->nid] = false;
+    }
+  }
+
+  return $plugin_cache[$feed->nid];
 }
 
 /**
diff --git feedapi_eparser.plugins.inc feedapi_eparser.plugins.inc
index e59b9cc..8c600e4 100644
--- feedapi_eparser.plugins.inc
+++ feedapi_eparser.plugins.inc
@@ -297,18 +297,6 @@ function feedapi_eparser_get_plugin_data($name, $type) {
   return $plugins[$type][$name];
 }
 
-function _feedapi_eparser_load_type_plugin($feed) {
-  if (!module_invoke('ctools', 'api_version', '1.1.1')) {
-    return;
-  }
-  ctools_include('plugins');
-  $class = ctools_plugin_load_class('eparse', 'type_plugins', $feed->eparse->type, 'handler');
-  if ($class) {
-    return new $class;
-  }
-  return false;
-}
-
 /**
  * Basic Plugin Interface.
  *
diff --git plugins/FeedapiEparserTypePlugin.inc plugins/FeedapiEparserTypePlugin.inc
index 2e78b77..3819963 100644
--- plugins/FeedapiEparserTypePlugin.inc
+++ plugins/FeedapiEparserTypePlugin.inc
@@ -49,24 +49,39 @@ abstract class FeedapiEparserTypePlugin extends FeedapiEparserPluginBase {
    * A parsed feed object.
    */
   function parse() {
-    // The global context is a bit of a hack but it should work for now...
-    $global_context = $this->getGlobalContext();
 
-    foreach ($this->namespace_plugins as $plugin) {
-      $plugin->parseGlobal($global_context);
+    $cid = 'eparse:' . $this->feed->nid;
+    if ($data = cache_get($cid)) {
+      $this->feed->parsed_source = $data->data;
     }
-    $this->parseGlobal($global_context);
+    else {
+
+      // Before anything else, make sure we download the source.
+      $this->download();
+
+      // The global context is a bit of a hack but it should work for now...
+      $global_context = $this->getGlobalContext();
 
-    $this->feed->parsed_source->items = array();
-    foreach ($this->getItems() as $item) {
-      $destination_item = new stdClass();
       foreach ($this->namespace_plugins as $plugin) {
-        $plugin->parseItem($item, $destination_item);
+        $plugin->parseGlobal($global_context);
       }
+      $this->parseGlobal($global_context);
+
+      $this->feed->parsed_source->items = array();
+      foreach ($this->getItems() as $item) {
+        $destination_item = new stdClass();
+        foreach ($this->namespace_plugins as $plugin) {
+          $plugin->parseItem($item, $destination_item);
+        }
 
-      $this->parseItem($item, $destination_item);
+        $this->parseItem($item, $destination_item);
 
-      $this->feed->parsed_source->items[] = $destination_item;
+        $this->feed->parsed_source->items[] = $destination_item;
+      }
+
+      if (isset($this->feed->parsed_source->options->ttl)) {
+        cache_set($cid, $this->feed->parsed_source, 'cache', time() + $this->feed->parsed_source->options->ttl);
+      }
     }
     return $this->feed->parsed_source;
   }
