diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 1d22278..b80a2a0 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -184,7 +184,10 @@ 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);
+      // Since we are getting and not setting, 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 {
@@ -202,6 +205,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;
     }
@@ -213,9 +217,35 @@ class Entity implements EntityInterface {
   }
 
   /**
-   * Determines the language code to use for accessing a field value in a certain language.
+   * Determines the language code for accessing a field value.
+   *
+   * If the entity is language-specific and the field is translatable, the
+   * langcode is used to access the field value. Otherwise,
+   * LANGUAGE_NOT_SPECIFIED should be used to access the field value, as in the
+   * case of a field shared among all language versions of an entity. When the
+   * field is not translatable and the langcode attempted is not
+   * LANGUAGE_NOT_SPECIFIED an exception is thrown in strict mode, or NULL is
+   * returned in non-strict mode.
+   *
+   * @param $field
+   *   Field the language code is being determined for.
+   * @param $langcode
+   *   (optional) The language code attempting to be applied to the field.
+   * @param $strict
+   *   (optional) Flag for how strict to be, which takes a Boolean TRUE/FALSE
+   *   value. This flag exists so we can be differently strict for invalid
+   *   langcodes when setting and getting field values. When $strict is TRUE,
+   *   an exception is thrown if the field is non-translatable and the langcode
+   *   is anything other than LANGUAGE_NOT_SPECIFIED. When $strict is FALSE,
+   *   NULL is returned instead of an exception being thrown. For example, the
+   *   EntityInterface set() uses $strict TRUE, and the EntityInterface get()
+   *   uses $strict FALSE.
+   *
+   * @return
+   *   The langcode if appropriate, LANGUAGE_NOT_SPECIFIED for non-translatable
+   *   fields, or NULL when an invalid langcode was used in non-strict mode.
    */
-  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)) {
@@ -224,9 +254,19 @@ 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);
+      // Field was non-translatable but the attempted langcode was something
+      // other than LANGUAGE_NOT_SPECIFIED.
+      if ($langcode != NULL && $langcode != LANGUAGE_NOT_SPECIFIED) {
+        // Only throw Exception in strict mode.
+        if ($strict) {
+          throw new EntityStorageException(format_string("Field @field_name is not translatable and only works with langcode = LANGUAGE_NOT_SPECIFIED", array('@field_name' => $field['field_name'])));
+        }
+        else {
+          return NULL;
+        }
+      }
+      // Field was non-translatable and the langcode was LANGUAGE_NOT_SPECIFIED.
+      return LANGUAGE_NOT_SPECIFIED;
     }
   }
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
index 805d52c..40d1488 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
@@ -11,6 +11,7 @@ use Exception;
 use InvalidArgumentException;
 use Drupal\simpletest\WebTestBase;
 use Drupal\Core\Language\Language;
+use Drupal\entity\EntityStorageException;
 
 /**
  * Tests entity translation.
@@ -87,18 +88,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.
