diff --git includes/FeedsBatch.inc includes/FeedsBatch.inc
index 9311013..b8468cd 100644
--- includes/FeedsBatch.inc
+++ includes/FeedsBatch.inc
@@ -9,72 +9,39 @@
  * @see FeedsSource class
  * @see FeedsFetcher class
  */
-class FeedsImportBatch {
-
-  protected $url;
-  protected $file_path;
+abstract class FeedsImportBatch {
   protected $raw;
   protected $items;
   protected $link;
 
   /**
-   * Constructor.
-   *
-   * Either $url or $file_path must be given.
-   */
-  public function __construct($url = NULL, $file_path = NULL) {
-    $this->url = $url;
-    $this->file_path = $file_path;
-    $this->items = array();
-  }
-
-  /**
    * @return
    *   The raw content of the feed.
    */
   public function getRaw() {
     if (empty($this->raw)) {
-      // Prefer file.
-      if ($this->file_path) {
-        $this->raw = file_get_contents(realpath($this->file_path));
-      }
-      elseif ($this->url) {
-        feeds_include_library('http_request.inc', 'http_request');
-        $result = http_request_get($this->url);
-        if ($result->code != 200) {
-          throw new Exception(t('Download of @url failed with code !code.', array('@url' => $this->url, '!code' => $result->code)));
-        }
-        $this->raw = $result->data;
-      }
+      $this->import();
     }
     return $this->raw;
   }
 
   /**
+   * Import the data into $this->raw.
+   */
+  protected abstract function import();
+
+  /**
    * @return
    *   Path to the feed. This path is relative to Drupal's root directory.
    *   If the feed is not local, getFilePath downloads it to file directory.
    */
-  public function getFilePath() {
-    if (!isset($this->file_path)) {
-      $dest = file_destination(file_directory_path() .'/feeds/'. get_class($this) .'_'. md5($this->url) .'_'. time(), FILE_EXISTS_RENAME);
-      $this->file_path = file_save_data($this->getRaw(), $dest);
-      if($this->file_path === 0) {
-        throw new Exception(t('Cannot write content to %dest', array('%dest' => $dest)));
-      }
-    }
-    return $this->file_path;
-  }
+  public abstract function getFilePath();
 
   /**
    * @return
    *   URL to the document.
    */
-  public function getURL() {
-    if (!isset($this->url) && isset($this->file)) {
-      return $_GLOBALS['base_url'] .'/'. $this->file;
-    }
-  }
+  public abstract function getURL();
 
   /**
    * @return
@@ -145,3 +112,86 @@ class FeedsImportBatch {
     $this->items[] = $item;
   }
 }
+
+/**
+ * Class for URL Batch Importers.
+ */
+class FeedsImportBatchUrl extends FeedsImportBatch {
+  protected $url;
+
+  /**
+   * Constructor.
+   */
+  public function __construct($url) {
+    $this->url = $url;
+    $this->items = array();
+  }
+
+  /**
+   * Override FeedsBatchImport::import()
+   */
+  protected function import() {
+    // @TODO: because of getFilePath should we check $this->file_path?
+    feeds_include_library('http_request.inc', 'http_request');
+    $result = http_request_get($this->url);
+    if ($result->code != 200) {
+      throw new Exception(t('Download of @url failed with code !code.', array('@url' => $this->url, '!code' => $result->code)));
+    }
+    $this->raw = $result->data;
+  }
+
+  /**
+   * Override FeedsImportBatch::getURL().
+   */
+  public function getURL() {
+    return $this->url;
+  }
+
+  /**
+   * Override FeedsImportBatch::getFilePath().
+   */
+  public function getFilePath() {
+    if (!isset($this->file_path)) {
+      $dest = file_destination(file_directory_path() .'/feeds/'. get_class($this) .'_'. md5($this->url) .'_'. time(), FILE_EXISTS_RENAME);
+      $this->file_path = file_save_data($this->getRaw(), $dest);
+      if($this->file_path === 0) {
+        throw new Exception(t('Cannot write content to %dest', array('%dest' => $dest)));
+      }
+    }
+    return $this->file_path;
+  }
+}
+
+class FeedsImportBatchFile extends FeedsImportBatch {
+  protected $file_path;
+
+  /**
+   * Constructor.
+   */
+  public function __construct($file_path) {
+    $this->file_path = $file_path;
+    $this->items = array();
+  }
+
+  /**
+   * Override FeedsImportBatch::import().
+   */
+  protected function import() {
+    $this->raw = file_get_contents(realpath($this->file_path));
+  }
+
+  /**
+   * Override FeedsImportBatch::getURL().
+   */
+  public function getURL() {
+    // @TODO: $this->file ????
+    return $_GLOBALS['base_url'] . '/' . $this->file;
+  }
+
+  /**
+   * Override FeedsImportBatch::getFilePath().
+   */
+  public function getFilePath() {
+    return $this->file_path;
+  }
+}
diff --git plugins/FeedsFileFetcher.inc plugins/FeedsFileFetcher.inc
index a8f85be..051a4f5 100644
--- plugins/FeedsFileFetcher.inc
+++ plugins/FeedsFileFetcher.inc
@@ -16,7 +16,7 @@ class FeedsFileFetcher extends FeedsFetcher {
    */
   public function fetch(FeedsSource $source) {
     $source_config = $source->getConfigFor($this);
-    return new FeedsImportBatch(NULL, $source_config['source']);
+    return new FeedsImportBatchFile($source_config['source']);
   }
 
   /**
diff --git plugins/FeedsHTTPFetcher.inc plugins/FeedsHTTPFetcher.inc
index 6e7b5ee..50bbf69 100644
--- plugins/FeedsHTTPFetcher.inc
+++ plugins/FeedsHTTPFetcher.inc
@@ -16,7 +16,7 @@ class FeedsHTTPFetcher extends FeedsFetcher {
    */
   public function fetch(FeedsSource $source) {
     $source_config = $source->getConfigFor($this);
-    return new FeedsImportBatch($source_config['source']);
+    return new FeedsImportBatchURL($source_config['source']);
   }
 
   /**
@@ -51,5 +51,4 @@ class FeedsHTTPFetcher extends FeedsFetcher {
   public function configDefaults() {
     return array('auto_detect_feeds' => FALSE);
   }
-}
-
+}
\ No newline at end of file
