diff --git a/core/modules/entity/lib/Drupal/entity/Entity.php b/core/modules/entity/lib/Drupal/entity/Entity.php
index 7e73024..7107d33 100644
--- a/core/modules/entity/lib/Drupal/entity/Entity.php
+++ b/core/modules/entity/lib/Drupal/entity/Entity.php
@@ -180,7 +180,9 @@ class Entity implements EntityInterface {
     $entity_info = $this->entityInfo();
     if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
       $field = field_info_field($property_name);
-      $langcode = $this->getFieldLangcode($field, $langcode);
+      // We call getFieldLangcode with strict = FALSE, so if we request a field
+      // with a invalid language we don't throw an exception.
+      $langcode = $this->getFieldLangcode($field, $langcode, FALSE);
       return isset($this->{$property_name}[$langcode]) ? $this->{$property_name}[$langcode] : NULL;
     }
     else {
@@ -198,6 +200,7 @@ class Entity implements EntityInterface {
     $entity_info = $this->entityInfo();
     if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
       $field = field_info_field($property_name);
+      // This will throw an exception if the $langcode is invalid.
       $langcode = $this->getFieldLangcode($field, $langcode);
       $this->{$property_name}[$langcode] = $value;
     }
@@ -211,7 +214,7 @@ class Entity implements EntityInterface {
   /**
    * Determines the language code to use for accessing a field value in a certain language.
    */
-  protected function getFieldLangcode($field, $langcode = NULL) {
+  protected function getFieldLangcode($field, $langcode = NULL, $strict = TRUE) {
     // Only apply the given langcode if the entity is language-specific.
     // Otherwise translatable fields are handled as non-translatable fields.
     if (field_is_translatable($this->entityType, $field) && ($default_language = $this->language()) && !language_is_locked($this->langcode)) {
@@ -220,9 +223,18 @@ class Entity implements EntityInterface {
       return isset($langcode) ? $langcode : $default_language->langcode;
     }
     else {
-      // If there is a langcode defined for this field, just return it. Otherwise
-      // return LANGUAGE_NOT_SPECIFIED.
-      return (isset($this->langcode) ? $this->langcode : LANGUAGE_NOT_SPECIFIED);
+      if ($langcode != NULL && $langcode != LANGUAGE_NOT_SPECIFIED) {
+        // Only throw Exception in strict mode.
+        if ($strict) {
+          $field_name = $field['field_name'];
+          throw new EntityStorageException("Field $field_name is not translatable and does only work with langcode = LANGUAGE_NOT_SPECIFIED");
+        }
+        else {
+          return NULL;
+        }
+      }
+      // For non-translatable the langcode is LANGUAGE_NOT_SPECIFIED.
+      return LANGUAGE_NOT_SPECIFIED;
     }
   }
 
diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
index 9875b39..18cfab3 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
@@ -10,6 +10,7 @@ namespace Drupal\entity\Tests;
 use Exception;
 use InvalidArgumentException;
 use Drupal\simpletest\WebTestBase;
+use Drupal\entity\EntityStorageException;
 
 /**
  * Tests entity translation.
@@ -86,18 +87,22 @@ class EntityTranslationTest extends WebTestBase {
     $value = $entity->get($this->field_name);
     $this->assertEqual($value, array(0 => array('value' => 'default value')), 'Untranslated value retrieved.');
 
+    $message = "An exception is thrown when trying to set a field with an invalid language";
+
     // Set the value in a certain language. As the entity is not
-    // language-specific it should use the default language and so ignore the
-    // specified language.
-    $entity->set($this->field_name, array(0 => array('value' => 'default value2')), $this->langcodes[1]);
-    $value = $entity->get($this->field_name);
-    $this->assertEqual($value, array(0 => array('value' => 'default value2')), 'Untranslated value updated.');
-    $this->assertFalse($entity->translations(), 'No translations are available');
+    // language-specific it will throw an exception.
+    try {
+      $entity->set($this->field_name, array(0 => array('value' => 'default value2')), $this->langcodes[1]);
+      $this->fail($message);
+    }
+    catch (EntityStorageException $e) {
+      $this->assertTrue($e instanceof EntityStorageException, $message);
+    }
 
-    // Test getting a field value using the default language for a not
+    // Test getting a field value using a specific language for a not
     // language-specific entity.
     $value = $entity->get($this->field_name, $this->langcodes[1]);
-    $this->assertEqual($value, array(0 => array('value' => 'default value2')), 'Untranslated value retrieved.');
+    $this->assertNull($value, 'Returned NULL for getter with invalid language.');
 
     // Now, make the entity language-specific by assigning a language and test
     // translating it.
