diff --git a/sites/all/modules/feeds/feeds.module b/sites/all/modules/feeds/feeds.module
index bf4ded2..579e1e0 100644
--- a/sites/all/modules/feeds/feeds.module
+++ b/sites/all/modules/feeds/feeds.module
@@ -416,7 +416,14 @@ function feeds_access($action, $param) {
   // Check for permissions if feed id is present, otherwise return FALSE.
   if ($importer_id) {
     if (user_access('administer feeds') || user_access("{$action} {$importer_id} feeds")) {
-      return TRUE;
+      if ($action == 'import' && isset($param->nid)) {
+        $source = feeds_source($importer_id, $param->nid);
+        $source_config = $source->getConfigFor($source->importer->fetcher);
+        return !empty($source_config['source']);
+      }
+      else {
+        return TRUE;
+      }
     }
   }
   return FALSE;
@@ -615,7 +622,7 @@ function feeds_node_insert($node) {
   if (isset($node->feeds) && $importer_id = feeds_get_importer_id($node->type)) {
     $source = feeds_source($importer_id, $node->nid);
     // Start import if requested.
-    if (feeds_importer($importer_id)->config['import_on_create'] && !isset($node->feeds['suppress_import'])) {
+    if (feeds_importer($importer_id)->config['import_on_create'] && !isset($node->feeds['suppress_import']) && !empty($source_config['source'])) {
       $source->startImport();
     }
     // Schedule source and importer.
diff --git a/sites/all/modules/feeds/plugins/FeedsFetcher.inc b/sites/all/modules/feeds/plugins/FeedsFetcher.inc
index 33457de..3f6dc7c 100644
--- a/sites/all/modules/feeds/plugins/FeedsFetcher.inc
+++ b/sites/all/modules/feeds/plugins/FeedsFetcher.inc
@@ -222,4 +222,28 @@ abstract class FeedsFetcher extends FeedsPlugin {
    *   $source, NULL otherwise.
    */
   public function importPeriod(FeedsSource $source) {}
+
+  /**
+   * Override parent::configDefaults().
+   */
+  public function configDefaults() {
+    return array(
+      'source_required' => TRUE,
+    );
+  }
+
+  /**
+   * Override parent::configForm().
+   */
+  public function configForm(&$form_state) {
+    $form = array();
+    // @todo Disable this option on stand-alone importers importer.
+    $form['source_required'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Require feed'),
+      '#description' => t('Ensure a URL is provided when saving a feed.'),
+      '#default_value' => $this->config['source_required'],
+    );
+    return $form;
+  }
 }
diff --git a/sites/all/modules/feeds/plugins/FeedsFileFetcher.inc b/sites/all/modules/feeds/plugins/FeedsFileFetcher.inc
index 5e8e116..2889808 100644
--- a/sites/all/modules/feeds/plugins/FeedsFileFetcher.inc
+++ b/sites/all/modules/feeds/plugins/FeedsFileFetcher.inc
@@ -112,6 +112,7 @@ class FeedsFileFetcher extends FeedsFetcher {
         '#theme' => 'feeds_upload',
         '#file_info' => empty($source_config['fid']) ? NULL : file_load($source_config['fid']),
         '#size' => 10,
+        '#required' => ($this->config['direct'] && $this->config['source_required']),
       );
     }
     else {
@@ -152,7 +153,9 @@ class FeedsFileFetcher extends FeedsFetcher {
         $values['file'] = $file;
       }
       elseif (empty($values['source'])) {
-        form_set_error('feeds][FeedsFileFetcher][source', t('Please upload a file.'));
+        if ($this->config['source_required']) {
+          form_set_error('feeds][FeedsFileFetcher][source', t('Please upload a file.'));
+        }
       }
       else {
         // File present from previous upload. Nothing to validate.
@@ -211,7 +214,7 @@ class FeedsFileFetcher extends FeedsFetcher {
     $schemes = $this->getSchemes();
     $scheme = in_array('private', $schemes) ? 'private' : 'public';
 
-    return array(
+    return parent::configDefaults() + array(
       'allowed_extensions' => 'txt csv tsv xml opml',
       'direct' => FALSE,
       'directory' => $scheme . '://feeds',
@@ -223,7 +226,8 @@ class FeedsFileFetcher extends FeedsFetcher {
    * Overrides parent::configForm().
    */
   public function configForm(&$form_state) {
-    $form = array();
+    $form = parent::configForm($form_state);
+    $form['source_required']['#description'] = t('Ensure a file is provided when saving a feed.');
     $form['allowed_extensions'] = array(
       '#type' => 'textfield',
       '#title' => t('Allowed file extensions'),
diff --git a/sites/all/modules/feeds/plugins/FeedsHTTPFetcher.inc b/sites/all/modules/feeds/plugins/FeedsHTTPFetcher.inc
index 4e7afc7..0880aef 100644
--- a/sites/all/modules/feeds/plugins/FeedsHTTPFetcher.inc
+++ b/sites/all/modules/feeds/plugins/FeedsHTTPFetcher.inc
@@ -103,7 +103,7 @@ class FeedsHTTPFetcher extends FeedsFetcher {
    * Override parent::configDefaults().
    */
   public function configDefaults() {
-    return array(
+    return parent::configDefaults() + array(
       'auto_detect_feeds' => FALSE,
       'use_pubsubhubbub' => FALSE,
       'designated_hub' => '',
@@ -115,7 +115,7 @@ class FeedsHTTPFetcher extends FeedsFetcher {
    * Override parent::configForm().
    */
   public function configForm(&$form_state) {
-    $form = array();
+    $form = parent::configForm($form_state);
     $form['auto_detect_feeds'] = array(
       '#type' => 'checkbox',
       '#title' => t('Auto detect feeds'),
@@ -163,7 +163,7 @@ class FeedsHTTPFetcher extends FeedsFetcher {
       '#description' => t('Enter a feed URL.'),
       '#default_value' => isset($source_config['source']) ? $source_config['source'] : '',
       '#maxlength' => NULL,
-      '#required' => TRUE,
+      '#required' => $this->config['source_required'],
     );
     return $form;
   }
@@ -175,8 +175,10 @@ class FeedsHTTPFetcher extends FeedsFetcher {
     $values['source'] = trim($values['source']);
 
     if (!feeds_valid_url($values['source'], TRUE)) {
-      $form_key = 'feeds][' . get_class($this) . '][source';
-      form_set_error($form_key, t('The URL %source is invalid.', array('%source' => $values['source'])));
+      if ($this->config['source_required']) {
+        $form_key = 'feeds][' . get_class($this) . '][source';
+        form_set_error($form_key, t('The URL %source is invalid.', array('%source' => $values['source'])));
+      }
     }
     elseif ($this->config['auto_detect_feeds']) {
       feeds_include_library('http_request.inc', 'http_request');
