diff --git a/plugins/FeedsNodeProcessor.inc b/plugins/FeedsNodeProcessor.inc
index 2cfdf30..4170c92 100644
--- a/plugins/FeedsNodeProcessor.inc
+++ b/plugins/FeedsNodeProcessor.inc
@@ -36,11 +36,10 @@ class FeedsNodeProcessor extends FeedsProcessor {
    * Creates a new node in memory and returns it.
    */
   protected function newEntity(FeedsSource $source) {
-    $node = new stdClass();
+    $node = parent::newEntity($source);
     $node->type = $this->bundle();
     $node->changed = REQUEST_TIME;
     $node->created = REQUEST_TIME;
-    $node->language = LANGUAGE_NONE;
     $node->is_new = TRUE;
     node_object_prepare($node);
     // Populate properties that are set by node_object_prepare().
@@ -127,6 +126,8 @@ class FeedsNodeProcessor extends FeedsProcessor {
    * Validates a node.
    */
   protected function entityValidate($entity) {
+    parent::entityValidate($entity);
+
     if (!isset($entity->uid) || !is_numeric($entity->uid)) {
        $entity->uid = $this->config['author'];
     }
diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
index e8b4b49..22a75ae 100644
--- a/plugins/FeedsProcessor.inc
+++ b/plugins/FeedsProcessor.inc
@@ -82,13 +82,22 @@ abstract class FeedsProcessor extends FeedsPlugin {
   /**
    * Create a new entity.
    *
-   * @param $source
+   * @param FeedsSource $source
    *   The feeds source that spawns this entity.
    *
-   * @return
+   * @return object
    *   A new entity object.
    */
-  protected abstract function newEntity(FeedsSource $source);
+  protected function newEntity(FeedsSource $source) {
+    $entity = new stdClass();
+
+    $info = $this->entityInfo();
+    if (!empty($info['entity keys']['language'])) {
+      $entity->{$info['entity keys']['language']} = $this->entityLanguage();
+    }
+
+    return $entity;
+  }
 
   /**
    * Load an existing entity.
@@ -105,28 +114,46 @@ abstract class FeedsProcessor extends FeedsPlugin {
    *   existing ids first.
    */
   protected function entityLoad(FeedsSource $source, $entity_id) {
+    $info = $this->entityInfo();
+
     if ($this->config['update_existing'] == FEEDS_UPDATE_EXISTING) {
       $entities = entity_load($this->entityType(), array($entity_id));
-      return reset($entities);
+      $entity = reset($entities);
+    }
+    else {
+      $args = array(':entity_id' => $entity_id);
+      $table = db_escape_table($info['base table']);
+      $key = db_escape_field($info['entity keys']['id']);
+      $entity = db_query("SELECT * FROM {" . $table . "} WHERE $key = :entity_id", $args)->fetchObject();
     }
 
-    $info = $this->entityInfo();
-
-    $args = array(':entity_id' => $entity_id);
-
-    $table = db_escape_table($info['base table']);
-    $key = db_escape_field($info['entity keys']['id']);
+    if ($entity && !empty($info['entity keys']['language'])) {
+      $entity->{$info['entity keys']['language']} = $this->entityLanguage();
+    }
 
-    return db_query("SELECT * FROM {" . $table . "} WHERE $key = :entity_id", $args)->fetchObject();
+    return $entity;
   }
 
   /**
-   * Validate an entity.
+   * Validates an entity.
    *
    * @throws FeedsValidationException $e
-   *   If validation fails.
+   *   Thrown if validation fails.
    */
-  protected function entityValidate($entity) {}
+  protected function entityValidate($entity) {
+    $info = $this->entityInfo();
+    if (empty($info['entity keys']['language'])) {
+      return;
+    }
+
+    // Ensure that a valid language is always set.
+    $key = $info['entity keys']['language'];
+    $languages = language_list('enabled');
+
+    if (empty($entity->$key) || !isset($languages[1][$entity->$key])) {
+      $entity->$key = $this->entityLanguage();
+    }
+  }
 
   /**
    * Access check for saving an enity.
@@ -166,6 +193,20 @@ abstract class FeedsProcessor extends FeedsPlugin {
   }
 
   /**
+   * Returns the current language for entities.
+   *
+   * This checks if the configuration value is valid.
+   *
+   * @return string
+   *   The current language code.
+   */
+  protected function entityLanguage() {
+    $languages = language_list('enabled');
+
+    return isset($languages[1][$this->config['language']]) ? $this->config['language'] : LANGUAGE_NONE;
+  }
+
+  /**
    * @}
    */
 
@@ -775,6 +816,7 @@ abstract class FeedsProcessor extends FeedsPlugin {
       'input_format' => NULL,
       'skip_hash_check' => FALSE,
       'bundle' => $bundle,
+      'language' => LANGUAGE_NONE,
     );
   }
 
@@ -801,6 +843,16 @@ abstract class FeedsProcessor extends FeedsPlugin {
       );
     }
 
+    if (module_exists('locale') && !empty($info['entity keys']['language'])) {
+      $form['language'] = array(
+        '#type' => 'select',
+        '#options' => array(LANGUAGE_NONE => t('Language neutral')) + locale_language_list('name'),
+        '#title' => t('Language'),
+        '#required' => TRUE,
+        '#default_value' => $this->config['language'],
+      );
+    }
+
     $tokens = array('@entities' => strtolower($info['label plural']));
 
     $form['update_existing'] = array(
diff --git a/plugins/FeedsTermProcessor.inc b/plugins/FeedsTermProcessor.inc
index f69819f..da95304 100644
--- a/plugins/FeedsTermProcessor.inc
+++ b/plugins/FeedsTermProcessor.inc
@@ -31,9 +31,10 @@ class FeedsTermProcessor extends FeedsProcessor {
    */
   protected function newEntity(FeedsSource $source) {
     $vocabulary = $this->vocabulary();
-    $term = new stdClass();
+    $term = parent::newEntity($source);
     $term->vid = $vocabulary->vid;
     $term->vocabulary_machine_name = $vocabulary->machine_name;
+
     return $term;
   }
 
@@ -41,6 +42,8 @@ class FeedsTermProcessor extends FeedsProcessor {
    * Validates a term.
    */
   protected function entityValidate($term) {
+    parent::entityValidate($term);
+
     if (drupal_strlen($term->name) == 0) {
       throw new FeedsValidationException(t('Term name missing.'));
     }
diff --git a/plugins/FeedsUserProcessor.inc b/plugins/FeedsUserProcessor.inc
index 778c72b..47d26e5 100644
--- a/plugins/FeedsUserProcessor.inc
+++ b/plugins/FeedsUserProcessor.inc
@@ -37,10 +37,11 @@ class FeedsUserProcessor extends FeedsProcessor {
    * Creates a new user account in memory and returns it.
    */
   protected function newEntity(FeedsSource $source) {
-    $account = new stdClass();
+    $account = parent::newEntity($source);
     $account->uid = 0;
     $account->roles = array_filter($this->config['roles']);
     $account->status = $this->config['status'];
+
     return $account;
   }
 
@@ -59,6 +60,8 @@ class FeedsUserProcessor extends FeedsProcessor {
    * Validates a user account.
    */
   protected function entityValidate($account) {
+    parent::entityValidate($account);
+
     if (empty($account->name) || empty($account->mail) || !valid_email_address($account->mail)) {
       throw new FeedsValidationException(t('User name missing or email not valid.'));
     }
