diff --git a/1033202-98-feeds-generic_entity_processor.patch b/1033202-98-feeds-generic_entity_processor.patch
new file mode 100644
index 0000000..b80766e
--- /dev/null
+++ b/1033202-98-feeds-generic_entity_processor.patch
@@ -0,0 +1,255 @@
+diff --git a/feeds.module b/feeds.module
+index 54eb3a2..fe71a8f 100644
+--- a/feeds.module
++++ b/feeds.module
+@@ -1108,20 +1108,8 @@ function feeds_get_subscription_jobs() {
+  * Implements hook_entity_property_info_alter().
+  */
+ function feeds_entity_property_info_alter(&$info) {
+-  // Gather entities supported by Feeds processors.
+-  $processors = FeedsPlugin::byType('processor');
+-  $supported_entities = array();
+-  foreach ($processors as $processor) {
+-    $instance = feeds_plugin($processor['handler']['class'], '__none__');
+-    if (method_exists($instance, 'entityType')) {
+-      $supported_entities[] = $instance->entityType();
+-    }
+-  }
+-  // Feeds processors can fake the entity info. Only set the property for
+-  // defined entities.
+-  $supported_entities = array_intersect(array_keys($info), $supported_entities);
+-
+-  foreach ($supported_entities as $entity_type) {
++  // Add the feed_nid property to all entities.
++  foreach ($info as $entity_type => $entity_info) {
+     $info[$entity_type]['properties']['feed_nid'] = array(
+       'label' => 'Feed NID',
+       'type' => 'integer',
+diff --git a/feeds.plugins.inc b/feeds.plugins.inc
+index 26d9bff..52964e8 100644
+--- a/feeds.plugins.inc
++++ b/feeds.plugins.inc
+@@ -140,6 +140,29 @@ function _feeds_feeds_plugins() {
+       'path' => $path,
+     ),
+   );
++  if (module_exists('entity')) {
++    foreach (entity_get_info() as $type => $entity_info) {
++      // @todo: test for saving and whatever else necessary?
++      if (entity_type_supports($type, 'create')) {
++        $info['FeedsEntityProcessor' . drupal_ucfirst($type)] = array(
++          'name' => 'Entity processor ' . $entity_info['label'],
++          // @todo: Use plural label if there.
++          'description' => 'Create and update ' . $entity_info['label'] . 's.',
++          'help' => 'Create and update ' . $entity_info['label'] . 's from parsed content.',
++          'plugin_key' => 'FeedsEntityProcessor',
++          'handler' => array(
++            'parent' => 'FeedsProcessor',
++            'class' => 'FeedsEntityProcessor',
++            'file' => 'FeedsEntityProcessor.inc',
++            'path' => $path,
++          ),
++          // Add in the entity type used.
++          // @see FeedsEntityProcessor::entityType()
++          'type' => $type,
++        );
++      }
++    }
++  }
+   $info['FeedsUserProcessor'] = array(
+     'name' => 'User processor',
+     'description' => 'Create users.',
+diff --git a/feeds_ui/feeds_ui.admin.inc b/feeds_ui/feeds_ui.admin.inc
+index b66f963..454c935 100644
+--- a/feeds_ui/feeds_ui.admin.inc
++++ b/feeds_ui/feeds_ui.admin.inc
+@@ -430,6 +430,7 @@ function feeds_ui_plugin_form($form, &$form_state, $importer, $type) {
+   $form = array();
+   $form['#importer'] = $importer;
+   $form['#plugin_type'] = $type;
++  $config = $importer->getConfig();
+ 
+   foreach ($plugins as $key => $plugin) {
+     $form['plugin_key'][$key] = array(
+@@ -438,7 +439,7 @@ function feeds_ui_plugin_form($form, &$form_state, $importer, $type) {
+       '#title' => check_plain($plugin['name']),
+       '#description' => filter_xss(isset($plugin['help']) ? $plugin['help'] : $plugin['description']),
+       '#return_value' => $key,
+-      '#default_value' => ($plugin['handler']['class'] == get_class($importer->$type)) ? $key : '',
++      '#default_value' => ($key == $config[$type]['plugin_key']) ? $key : '',
+     );
+   }
+   $form['submit'] = array(
+diff --git a/plugins/FeedsEntityProcessor.inc b/plugins/FeedsEntityProcessor.inc
+new file mode 100644
+index 0000000..028f1ad
+--- /dev/null
++++ b/plugins/FeedsEntityProcessor.inc
+@@ -0,0 +1,167 @@
++<?php
++/**
++ * @file
++ * Class definition of FeedsentityProcessor.
++ */
++
++/**
++ * Creates entities from feed items.
++ */
++class FeedsEntityProcessor extends FeedsProcessor {
++  /**
++   * Define entity type.
++   */
++  public function entityType() {
++    $importer = feeds_importer($this->id);
++    $plugin_key = $importer->config['processor']['plugin_key'];
++    $plugin_info = ctools_get_plugins('feeds', 'plugins', $plugin_key);
++    return $plugin_info['type'];
++  }
++
++  /**
++   * Implements parent::entityInfo().
++   */
++  protected function entityInfo() {
++    $info = parent::entityInfo();
++    $info += array('label plural' => $info['label']);
++    return $info;
++  }
++
++  /**
++   * Creates a new entity in memory and returns it.
++   */
++  protected function newEntity(FeedsSource $source) {
++    $entity = entity_property_values_create_entity($this->entityType(), $this->config['values'])->value();
++    $entity->language = LANGUAGE_NONE;
++    return $entity;
++  }
++
++  /**
++   * Loads an existing entity.
++   *
++   * If the update existing method is not FEEDS_UPDATE_EXISTING, only the entity
++   * table will be loaded, foregoing the entity_load API for better performance.
++   */
++  protected function entityLoad(FeedsSource $source, $id) {
++    $result = entity_load($this->entityType(), array($id));
++    return reset($result);
++  }
++
++  /**
++   * Save a entity.
++   */
++  public function entitysave($entity) {
++    entity_save($this->entityType(), $entity);
++  }
++
++  /**
++   * Delete a series of entities.
++   */
++  protected function entityDeleteMultiple($ids) {
++    entity_delete_multiple($this->entityType(), $ids);
++  }
++  /**
++   * Override parent::configDefaults().
++   */
++  public function configDefaults() {
++    return array(
++      'values' => array(),
++    ) + parent::configDefaults();
++  }
++
++  /**
++   * Override parent::configForm().
++   */
++  public function configForm(&$form_state) {
++    $form = parent::configForm($form_state);
++    $form['values']['#tree'] = TRUE;
++    $form['input_format']['#description'] = t('Select the input format for the %entity to be created.', array('%entity' => $this->entityType()));
++
++    $wrapper = entity_metadata_wrapper($this->entityType());
++    foreach ($wrapper->getPropertyInfo() as $name => $property) {
++      if (!empty($property['required'])) {
++        $form['values'][$name] = array(
++          '#type' => 'textfield',
++          '#title' => $property['label'],
++          '#description' => isset($property['description']) ? $property['description'] : '',
++          '#default_value' => isset($this->config['values'][$name]) ? $this->config['values'][$name] : NULL,
++          '#required' => TRUE,
++        );
++        if (!empty($property['options list'])) {
++          $form['values'][$name]['#type'] = 'select';
++          $form['values'][$name]['#options'] = $wrapper->$name->optionsList();
++        }
++        // @todo: Maybe implement per data-type forms like Rules does?
++        $form['values'][$name]['#description'] .= ' ' . t('Expected data type: %type.', array('%type' => $wrapper->$name->type()));
++        if ($wrapper->$name instanceof EntityDrupalWrapper) {
++          $info = $wrapper->$name->entityInfo();
++          $id_info = $wrapper->$name->get($info['entity keys']['id'])->info();
++          $form['values'][$name]['#description'] .= ' ' . t('Just enter the identifier of the entity, i.e. %id', array('%id' => $id_info['label']));
++        }
++      }
++    }
++    return $form;
++  }
++
++  public function configFormSubmit(&$values) {
++    parent::configFormSubmit($values);
++  }
++
++  /**
++   * Override setTargetElement to operate on a target item that is a entity.
++   */
++  public function setTargetElement(FeedsSource $source, $target_item, $target_element, $value) {
++    $wrapper = entity_metadata_wrapper($this->entityType(), $target_item);
++    switch ($target_element) {
++      case 'url':
++      case 'guid':
++        $target_item->feeds_item->$target_element = $value;
++        break;
++      default:
++        $wrapper->$target_element->set($value);
++        break;
++    }
++  }
++
++  /**
++   * Return available mapping targets.
++   */
++  public function getMappingTargets() {
++    // Get a wrapper with the right bundle info.
++    $entity_info = $this->entityInfo();
++    $info = array('bundle' => NULL);
++
++    if (isset($entity_info['entity keys']['bundle']) && isset($this->config['values'][$entity_info['entity keys']['bundle']])) {
++      $info['bundle'] = $this->config['values'][$entity_info['entity keys']['bundle']];
++    }
++    else {
++      $info['bundle'] = $this->entityType();
++    }
++
++    $wrapper = entity_metadata_wrapper($this->entityType(), NULL, $info);
++    // @todo: maybe restrict to data types feeds can deal with.
++    foreach ($wrapper->getPropertyInfo() as $name => $property) {
++      if (!empty($property['setter callback'])) {
++        $targets[$name] = array(
++          'name' => $property['label'],
++          'description' => isset($property['description']) ? $property['description'] : NULL,
++        );
++      }
++    }
++    $targets[$entity_info['entity keys']['id']]['optional_unique'] = TRUE;
++
++    // Add general GUID target
++    $targets['guid'] = array(
++      'name' => t('GUID'),
++      'description' => t('The globally unique identifier of the item. E. g. the feed item GUID in the case of a syndication feed. May be unique.'),
++      'optional_unique' => TRUE,
++    );
++
++    // Let other modules expose mapping targets.
++    self::loadMappers();
++    $type = $this->entityType();
++    drupal_alter('feeds_processor_targets', $targets, $type, $info['bundle']);
++
++    return $targets;
++  }
++}
diff --git a/feeds.module b/feeds.module
index 54eb3a2..fe71a8f 100644
--- a/feeds.module
+++ b/feeds.module
@@ -1108,20 +1108,8 @@ function feeds_get_subscription_jobs() {
  * Implements hook_entity_property_info_alter().
  */
 function feeds_entity_property_info_alter(&$info) {
-  // Gather entities supported by Feeds processors.
-  $processors = FeedsPlugin::byType('processor');
-  $supported_entities = array();
-  foreach ($processors as $processor) {
-    $instance = feeds_plugin($processor['handler']['class'], '__none__');
-    if (method_exists($instance, 'entityType')) {
-      $supported_entities[] = $instance->entityType();
-    }
-  }
-  // Feeds processors can fake the entity info. Only set the property for
-  // defined entities.
-  $supported_entities = array_intersect(array_keys($info), $supported_entities);
-
-  foreach ($supported_entities as $entity_type) {
+  // Add the feed_nid property to all entities.
+  foreach ($info as $entity_type => $entity_info) {
     $info[$entity_type]['properties']['feed_nid'] = array(
       'label' => 'Feed NID',
       'type' => 'integer',
diff --git a/feeds.plugins.inc b/feeds.plugins.inc
index 26d9bff..52964e8 100644
--- a/feeds.plugins.inc
+++ b/feeds.plugins.inc
@@ -140,6 +140,29 @@ function _feeds_feeds_plugins() {
       'path' => $path,
     ),
   );
+  if (module_exists('entity')) {
+    foreach (entity_get_info() as $type => $entity_info) {
+      // @todo: test for saving and whatever else necessary?
+      if (entity_type_supports($type, 'create')) {
+        $info['FeedsEntityProcessor' . drupal_ucfirst($type)] = array(
+          'name' => 'Entity processor ' . $entity_info['label'],
+          // @todo: Use plural label if there.
+          'description' => 'Create and update ' . $entity_info['label'] . 's.',
+          'help' => 'Create and update ' . $entity_info['label'] . 's from parsed content.',
+          'plugin_key' => 'FeedsEntityProcessor',
+          'handler' => array(
+            'parent' => 'FeedsProcessor',
+            'class' => 'FeedsEntityProcessor',
+            'file' => 'FeedsEntityProcessor.inc',
+            'path' => $path,
+          ),
+          // Add in the entity type used.
+          // @see FeedsEntityProcessor::entityType()
+          'type' => $type,
+        );
+      }
+    }
+  }
   $info['FeedsUserProcessor'] = array(
     'name' => 'User processor',
     'description' => 'Create users.',
diff --git a/feeds_ui/feeds_ui.admin.inc b/feeds_ui/feeds_ui.admin.inc
index b66f963..454c935 100644
--- a/feeds_ui/feeds_ui.admin.inc
+++ b/feeds_ui/feeds_ui.admin.inc
@@ -430,6 +430,7 @@ function feeds_ui_plugin_form($form, &$form_state, $importer, $type) {
   $form = array();
   $form['#importer'] = $importer;
   $form['#plugin_type'] = $type;
+  $config = $importer->getConfig();
 
   foreach ($plugins as $key => $plugin) {
     $form['plugin_key'][$key] = array(
@@ -438,7 +439,7 @@ function feeds_ui_plugin_form($form, &$form_state, $importer, $type) {
       '#title' => check_plain($plugin['name']),
       '#description' => filter_xss(isset($plugin['help']) ? $plugin['help'] : $plugin['description']),
       '#return_value' => $key,
-      '#default_value' => ($plugin['handler']['class'] == get_class($importer->$type)) ? $key : '',
+      '#default_value' => ($key == $config[$type]['plugin_key']) ? $key : '',
     );
   }
   $form['submit'] = array(
diff --git a/plugins/FeedsEntityProcessor.inc b/plugins/FeedsEntityProcessor.inc
new file mode 100644
index 0000000..028f1ad
--- /dev/null
+++ b/plugins/FeedsEntityProcessor.inc
@@ -0,0 +1,167 @@
+<?php
+/**
+ * @file
+ * Class definition of FeedsentityProcessor.
+ */
+
+/**
+ * Creates entities from feed items.
+ */
+class FeedsEntityProcessor extends FeedsProcessor {
+  /**
+   * Define entity type.
+   */
+  public function entityType() {
+    $importer = feeds_importer($this->id);
+    $plugin_key = $importer->config['processor']['plugin_key'];
+    $plugin_info = ctools_get_plugins('feeds', 'plugins', $plugin_key);
+    return $plugin_info['type'];
+  }
+
+  /**
+   * Implements parent::entityInfo().
+   */
+  protected function entityInfo() {
+    $info = parent::entityInfo();
+    $info += array('label plural' => $info['label']);
+    return $info;
+  }
+
+  /**
+   * Creates a new entity in memory and returns it.
+   */
+  protected function newEntity(FeedsSource $source) {
+    $entity = entity_property_values_create_entity($this->entityType(), $this->config['values'])->value();
+    $entity->language = LANGUAGE_NONE;
+    return $entity;
+  }
+
+  /**
+   * Loads an existing entity.
+   *
+   * If the update existing method is not FEEDS_UPDATE_EXISTING, only the entity
+   * table will be loaded, foregoing the entity_load API for better performance.
+   */
+  protected function entityLoad(FeedsSource $source, $id) {
+    $result = entity_load($this->entityType(), array($id));
+    return reset($result);
+  }
+
+  /**
+   * Save a entity.
+   */
+  public function entitysave($entity) {
+    entity_save($this->entityType(), $entity);
+  }
+
+  /**
+   * Delete a series of entities.
+   */
+  protected function entityDeleteMultiple($ids) {
+    entity_delete_multiple($this->entityType(), $ids);
+  }
+  /**
+   * Override parent::configDefaults().
+   */
+  public function configDefaults() {
+    return array(
+      'values' => array(),
+    ) + parent::configDefaults();
+  }
+
+  /**
+   * Override parent::configForm().
+   */
+  public function configForm(&$form_state) {
+    $form = parent::configForm($form_state);
+    $form['values']['#tree'] = TRUE;
+    $form['input_format']['#description'] = t('Select the input format for the %entity to be created.', array('%entity' => $this->entityType()));
+
+    $wrapper = entity_metadata_wrapper($this->entityType());
+    foreach ($wrapper->getPropertyInfo() as $name => $property) {
+      if (!empty($property['required'])) {
+        $form['values'][$name] = array(
+          '#type' => 'textfield',
+          '#title' => $property['label'],
+          '#description' => isset($property['description']) ? $property['description'] : '',
+          '#default_value' => isset($this->config['values'][$name]) ? $this->config['values'][$name] : NULL,
+          '#required' => TRUE,
+        );
+        if (!empty($property['options list'])) {
+          $form['values'][$name]['#type'] = 'select';
+          $form['values'][$name]['#options'] = $wrapper->$name->optionsList();
+        }
+        // @todo: Maybe implement per data-type forms like Rules does?
+        $form['values'][$name]['#description'] .= ' ' . t('Expected data type: %type.', array('%type' => $wrapper->$name->type()));
+        if ($wrapper->$name instanceof EntityDrupalWrapper) {
+          $info = $wrapper->$name->entityInfo();
+          $id_info = $wrapper->$name->get($info['entity keys']['id'])->info();
+          $form['values'][$name]['#description'] .= ' ' . t('Just enter the identifier of the entity, i.e. %id', array('%id' => $id_info['label']));
+        }
+      }
+    }
+    return $form;
+  }
+
+  public function configFormSubmit(&$values) {
+    parent::configFormSubmit($values);
+  }
+
+  /**
+   * Override setTargetElement to operate on a target item that is a entity.
+   */
+  public function setTargetElement(FeedsSource $source, $target_item, $target_element, $value) {
+    $wrapper = entity_metadata_wrapper($this->entityType(), $target_item);
+    switch ($target_element) {
+      case 'url':
+      case 'guid':
+        $target_item->feeds_item->$target_element = $value;
+        break;
+      default:
+        $wrapper->$target_element->set($value);
+        break;
+    }
+  }
+
+  /**
+   * Return available mapping targets.
+   */
+  public function getMappingTargets() {
+    // Get a wrapper with the right bundle info.
+    $entity_info = $this->entityInfo();
+    $info = array('bundle' => NULL);
+
+    if (isset($entity_info['entity keys']['bundle']) && isset($this->config['values'][$entity_info['entity keys']['bundle']])) {
+      $info['bundle'] = $this->config['values'][$entity_info['entity keys']['bundle']];
+    }
+    else {
+      $info['bundle'] = $this->entityType();
+    }
+
+    $wrapper = entity_metadata_wrapper($this->entityType(), NULL, $info);
+    // @todo: maybe restrict to data types feeds can deal with.
+    foreach ($wrapper->getPropertyInfo() as $name => $property) {
+      if (!empty($property['setter callback'])) {
+        $targets[$name] = array(
+          'name' => $property['label'],
+          'description' => isset($property['description']) ? $property['description'] : NULL,
+        );
+      }
+    }
+    $targets[$entity_info['entity keys']['id']]['optional_unique'] = TRUE;
+
+    // Add general GUID target
+    $targets['guid'] = array(
+      'name' => t('GUID'),
+      'description' => t('The globally unique identifier of the item. E. g. the feed item GUID in the case of a syndication feed. May be unique.'),
+      'optional_unique' => TRUE,
+    );
+
+    // Let other modules expose mapping targets.
+    self::loadMappers();
+    $type = $this->entityType();
+    drupal_alter('feeds_processor_targets', $targets, $type, $info['bundle']);
+
+    return $targets;
+  }
+}
