diff --git a/includes/FeedsSource.inc b/includes/FeedsSource.inc
index 98cd0f1..a68f96c 100644
--- a/includes/FeedsSource.inc
+++ b/includes/FeedsSource.inc
@@ -90,6 +90,11 @@ class FeedsState {
   public $failed;
 
   /**
+   * IDs of entities to be removed.
+   */
+   public $to_be_removed;
+
+  /**
    * Constructor, initialize variables.
    */
   public function __construct() {
diff --git a/plugins/FeedsNodeProcessor.inc b/plugins/FeedsNodeProcessor.inc
index f2db596..90325bd 100644
--- a/plugins/FeedsNodeProcessor.inc
+++ b/plugins/FeedsNodeProcessor.inc
@@ -1,5 +1,7 @@
 <?php
 
+define('FEEDS_UNPUBLISH_NON_EXISTENT', 'unpublish');
+
 /**
  * @file
  * Class definition of FeedsNodeProcessor.
@@ -206,6 +208,7 @@ class FeedsNodeProcessor extends FeedsProcessor {
       '#description' => t('Select after how much time nodes should be deleted. The node\'s published date will be used for determining the node\'s age, see Mapping settings.'),
       '#default_value' => $this->config['expire'],
     );
+    $form['update_non_existent']['#options'][FEEDS_UNPUBLISH_NON_EXISTENT] = 'Unpublish non existent nodes';
     return $form;
   }
 
@@ -380,4 +383,35 @@ class FeedsNodeProcessor extends FeedsProcessor {
     }
     return 0;
   }
+
+/**
+   * Overwrites FeedsProcessor::clean() to allow unpublish instead of delete.
+   */
+  protected function clean($state) {
+    $info = $this->entityInfo();
+
+    // We clean only if needed.
+    if (!isset($this->config['update_non_existent']) || $this->config['update_non_existent'] == FEEDS_SKIP_NON_EXISTENT) {
+      return;
+    }
+
+    $total = count($state->to_be_removed);
+    if ($total) {
+      if ($this->config['update_non_existent'] == FEEDS_DELETE_NON_EXISTENT) {
+        $this->entityDeleteMultiple($state->to_be_removed);
+        $state->deleted += $total;
+      }
+      else if ($this->config['update_non_existent'] == FEEDS_UNPUBLISH_NON_EXISTENT) {
+        foreach ($state->to_be_removed as $nid) {
+          $node = node_load($nid);
+          if ($node->status == 0) {
+            continue;
+          }
+          node_unpublish_action($node);
+          node_save($node);
+          $state->updated ++;
+        }
+      }
+    }
+  }
 }
diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
index aea7df6..0b2d8c3 100755
--- a/plugins/FeedsProcessor.inc
+++ b/plugins/FeedsProcessor.inc
@@ -9,6 +9,9 @@
 define('FEEDS_SKIP_EXISTING', 0);
 define('FEEDS_REPLACE_EXISTING', 1);
 define('FEEDS_UPDATE_EXISTING', 2);
+// Options for handling content in Drupal but not in source data.
+define('FEEDS_SKIP_NON_EXISTENT', 'skip');
+define('FEEDS_DELETE_NON_EXISTENT', 'delete');
 
 // Default limit for creating items on a page load, not respected by all
 // processors.
@@ -177,10 +180,18 @@ abstract class FeedsProcessor extends FeedsPlugin {
   public function process(FeedsSource $source, FeedsParserResult $parser_result) {
     $state = $source->state(FEEDS_PROCESS);
 
+    if (!isset($state->to_be_removed)) {
+      $this->initEntitiesToBeRemoved($source, $state);
+    }
+
     while ($item = $parser_result->shiftItem()) {
 
       // Check if this item already exists.
       $entity_id = $this->existingEntityId($source, $parser_result);
+      // If it's included in the feed, it must not be removed on clean.
+      if ($entity_id) {
+        unset($state->to_be_removed[$entity_id]);
+      }
       $skip_existing = $this->config['update_existing'] == FEEDS_SKIP_EXISTING;
 
       // If it exists, and we are not updating, pass onto the next item.
@@ -261,6 +272,11 @@ abstract class FeedsProcessor extends FeedsPlugin {
     if ($source->progressImporting() != FEEDS_BATCH_COMPLETE) {
       return;
     }
+
+    // Remove not included items if needed.
+    // What actually happens to removed items depends on clean function.
+    $this->clean($state);
+
     $info = $this->entityInfo();
     $tokens = array(
       '@entity' => strtolower($info['label']),
@@ -287,6 +303,16 @@ abstract class FeedsProcessor extends FeedsPlugin {
         ),
       );
     }
+    if ($state->deleted) {
+      $messages[] = array(
+       'message' => format_plural(
+          $state->deleted,
+          'Removed @number @entity.',
+          'Removed @number @entities.',
+          array('@number' => $state->deleted) + $tokens
+        ),
+      );
+    }
     if ($state->failed) {
       $messages[] = array(
        'message' => format_plural(
@@ -310,6 +336,56 @@ abstract class FeedsProcessor extends FeedsPlugin {
   }
 
   /**
+   * Initialize the array of entities to remove with all existing entities
+   * previously imported from the source.
+   * Partially copied from clear() function.
+   * @todo Pool this?
+   */
+  protected function initEntitiesToBeRemoved($source, $state) {
+    $state->to_be_removed = array();
+    // We fill it only if needed.
+    if (!isset($this->config['update_non_existent']) || $this->config['update_non_existent'] == FEEDS_SKIP_NON_EXISTENT) {
+      return;
+    }
+    // Build base select statement.
+    $info = $this->entityInfo();
+    $select = db_select($info['base table'], 'e');
+    $select->addField('e', $info['entity keys']['id'], 'entity_id');
+    $select->join(
+      'feeds_item',
+      'fi',
+      "e.{$info['entity keys']['id']} = fi.entity_id AND fi.entity_type = '{$this->entityType()}'");
+    $select->condition('fi.id', $this->id);
+    $select->condition('fi.feed_nid', $source->feed_nid);
+    $entities = $select->execute();
+    // If not found on process, existing entities will be deleted.
+    foreach ($entities as $entity) {
+      // Obviously, items which are still included in the source feed will be
+      // removed from this array when processed.
+      $state->to_be_removed[$entity->entity_id] = $entity->entity_id;
+    }
+  }
+
+  /**
+   * Delete entities which were not found on process.
+   * @todo batch delete?
+   */
+  protected function clean($state) {
+    $info = $this->entityInfo();
+
+    // We clean only if needed.
+    if (!isset($this->config['update_non_existent']) || $this->config['update_non_existent'] == FEEDS_SKIP_NON_EXISTENT) {
+      return;
+    }
+
+    $total = count($state->to_be_removed);
+    if ($total) {
+      $this->entityDeleteMultiple($state->to_be_removed);
+      $state->deleted += $total;
+    }
+  }
+
+  /**
    * Remove all stored results or stored results up to a certain time for a
    * source.
    *
@@ -535,6 +611,7 @@ abstract class FeedsProcessor extends FeedsPlugin {
       'input_format' => NULL,
       'skip_hash_check' => FALSE,
       'bundle' => $bundle,
+      'update_non_existent' => FEEDS_SKIP_NON_EXISTENT,
     );
   }
 
@@ -594,6 +671,16 @@ abstract class FeedsProcessor extends FeedsPlugin {
       '#default_value' => isset($this->config['input_format']) ? $this->config['input_format'] : 'plain_text',
       '#required' => TRUE,
     );
+    $form['update_non_existent'] = array(
+      '#type' => 'radios',
+      '#title' => t('Update entities missing in the feed'),
+      '#description' => t('Select how entities missing in the feed should be updated.'),
+      '#options' => array(
+        FEEDS_SKIP_NON_EXISTENT => 'Skip non existent entities',
+        FEEDS_DELETE_NON_EXISTENT => 'Delete non existent entities',
+      ),
+      '#default_value' => $this->config['update_non_existent'],
+    );
 
     return $form;
   }
