diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 785c81c..1d3817a 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -27,7 +27,7 @@ class Entity implements IteratorAggregate, EntityInterface {
    *
    * @var string
    */
-  public $langcode = LANGUAGE_NOT_SPECIFIED;
+  public $langcode;
 
   /**
    * The entity type.
@@ -68,6 +68,7 @@ class Entity implements IteratorAggregate, EntityInterface {
    */
   public function __construct(array $values, $entity_type) {
     $this->entityType = $entity_type;
+    $this->langcode = language_default()->langcode;
     // Set initial values.
     foreach ($values as $key => $value) {
       $this->$key = $value;
diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 4a03975..6d2c9fb 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormController.php
@@ -80,6 +80,15 @@ public function form(array $form, array &$form_state, EntityInterface $entity) {
     if (!empty($info['fieldable'])) {
       field_attach_form($entity, $form, $form_state, $this->getFormLangcode($form_state));
     }
+    if (!isset($form['langcode'])) {
+      // If the form did not specify otherwise, default to keeping the existing
+      // language of the entity or defaulting to the site default language for
+      // new entities.
+      $form['langcode'] = array(
+        '#type' => 'value',
+        '#value' => !$entity->isNew() ? $entity->langcode : language_default()->langcode,
+      );
+    }
     return $form;
   }
 
diff --git a/core/modules/block/custom_block/config/custom_block.type.basic.yml b/core/modules/block/custom_block/config/custom_block.type.basic.yml
index 1b0e2f8..58e87d7 100644
--- a/core/modules/block/custom_block/config/custom_block.type.basic.yml
+++ b/core/modules/block/custom_block/config/custom_block.type.basic.yml
@@ -2,3 +2,4 @@ id: basic
 label: Basic block
 revision: '0'
 description: A basic block contains a title and a body.
+langcode: en
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
index d94e476..eee184a 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
@@ -64,6 +64,10 @@ public function testCustomBlockTypeCreation() {
     $this->drupalPost('admin/structure/custom-blocks/add', $edit, t('Save'));
     $block_type = entity_load('custom_block_type', 'foo');
     $this->assertTrue($block_type, 'The new block type has been created.');
+
+    // Check that the block type was created in site default language.
+    $default_langcode = language_default()->langcode;
+    $this->assertEqual($block_type->langcode, $default_langcode);
   }
 
   /**
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php
index 490e434..207f20b 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php
@@ -104,7 +104,7 @@ protected function createTests() {
         'cache' => '1',
         'admin_label' => t('Test block html id'),
       ),
-      'langcode' => LANGUAGE_NOT_SPECIFIED,
+      'langcode' => language_default()->langcode,
     );
     $this->assertIdentical($actual_properties, $expected_properties, 'The block properties are exported correctly.');
 
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
index 90ae934..84fbc97 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
@@ -35,13 +35,14 @@ public static function getInfo() {
    */
   function testCRUD() {
     $manifest_name = 'manifest.config_test.dynamic';
+    $default_langcode = language_default()->langcode;
     // Verify default properties on a newly created empty entity.
     $empty = entity_create('config_test', array());
     $this->assertIdentical($empty->id, NULL);
     $this->assertTrue($empty->uuid);
     $this->assertIdentical($empty->label, NULL);
     $this->assertIdentical($empty->style, NULL);
-    $this->assertIdentical($empty->langcode, LANGUAGE_NOT_SPECIFIED);
+    $this->assertIdentical($empty->langcode, $default_langcode);
 
     // Verify ConfigEntity properties/methods on the newly created empty entity.
     $this->assertIdentical($empty->isNew(), TRUE);
@@ -55,7 +56,7 @@ function testCRUD() {
     $this->assertTrue($empty->get('uuid'));
     $this->assertIdentical($empty->get('label'), NULL);
     $this->assertIdentical($empty->get('style'), NULL);
-    $this->assertIdentical($empty->get('langcode'), LANGUAGE_NOT_SPECIFIED);
+    $this->assertIdentical($empty->get('langcode'), $default_langcode);
 
     // Verify Entity properties/methods on the newly created empty entity.
     $this->assertIdentical($empty->isNewRevision(), FALSE);
@@ -97,7 +98,7 @@ function testCRUD() {
     $this->assertNotEqual($config_test->uuid, $empty->uuid);
     $this->assertIdentical($config_test->label, $expected['label']);
     $this->assertIdentical($config_test->style, $expected['style']);
-    $this->assertIdentical($config_test->langcode, LANGUAGE_NOT_SPECIFIED);
+    $this->assertIdentical($config_test->langcode, $default_langcode);
 
     // Verify methods on the newly created entity.
     $this->assertIdentical($config_test->isNew(), TRUE);
diff --git a/core/modules/contact/config/contact.category.feedback.yml b/core/modules/contact/config/contact.category.feedback.yml
index 8aff8c6..aae9098 100644
--- a/core/modules/contact/config/contact.category.feedback.yml
+++ b/core/modules/contact/config/contact.category.feedback.yml
@@ -3,3 +3,4 @@ label: 'Website feedback'
 recipients: []
 reply: ''
 weight: '0'
+langcode: en
diff --git a/core/modules/contact/lib/Drupal/contact/Tests/ContactSitewideTest.php b/core/modules/contact/lib/Drupal/contact/Tests/ContactSitewideTest.php
index bdc98ef..1ea830b 100644
--- a/core/modules/contact/lib/Drupal/contact/Tests/ContactSitewideTest.php
+++ b/core/modules/contact/lib/Drupal/contact/Tests/ContactSitewideTest.php
@@ -82,6 +82,11 @@ function testSiteWideContact() {
     $this->addCategory($id = drupal_strtolower($this->randomName(16)), $label = $this->randomName(16), implode(',', array($recipients[0])), '', TRUE);
     $this->assertRaw(t('Category %label has been added.', array('%label' => $label)));
 
+    // Check that the category was created in site default language.
+    $langcode = config('contact.category.' . $id)->get('langcode');
+    $default_langcode = language_default()->langcode;
+    $this->assertEqual($langcode, $default_langcode);
+
     // Make sure the newly created category is included in the list of categories.
     $this->assertNoUniqueText($label, 'New category included in categories list.');
 
diff --git a/core/modules/file/lib/Drupal/file/Tests/SaveTest.php b/core/modules/file/lib/Drupal/file/Tests/SaveTest.php
index e2611e5..6589cd2 100644
--- a/core/modules/file/lib/Drupal/file/Tests/SaveTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/SaveTest.php
@@ -43,7 +43,7 @@ function testFileSave() {
     $this->assertEqual($loaded_file->status, $file->status, t("Status was saved correctly."));
     $this->assertEqual($file->filesize, filesize($file->uri), t("File size was set correctly."), 'File');
     $this->assertTrue($file->timestamp > 1, t("File size was set correctly."), 'File');
-    $this->assertEqual($loaded_file->langcode, LANGUAGE_NOT_SPECIFIED, t("Langcode was defaulted correctly."));
+    $this->assertEqual($loaded_file->langcode, language_default()->langcode, t("Langcode was defaulted correctly."));
 
     // Resave the file, updating the existing record.
     file_test_reset();
diff --git a/core/modules/filter/filter.admin.inc b/core/modules/filter/filter.admin.inc
index 806c1d7..246f286 100644
--- a/core/modules/filter/filter.admin.inc
+++ b/core/modules/filter/filter.admin.inc
@@ -169,6 +169,11 @@ function filter_admin_format_form($form, &$form_state, $format) {
     '#disabled' => !empty($format->format),
     '#weight' => -20,
   );
+  // @todo Remove once moved to FilterFormatFormController.
+  $form['langcode'] = array(
+    '#type' => 'value',
+    '#value' => !$format->isNew() ? $format->langcode : language_default()->langcode,
+  );
 
   // Add user role access selection.
   $form['roles'] = array(
diff --git a/core/modules/filter/lib/Drupal/filter/Tests/FilterCrudTest.php b/core/modules/filter/lib/Drupal/filter/Tests/FilterCrudTest.php
index f516b0c..884ea2f 100644
--- a/core/modules/filter/lib/Drupal/filter/Tests/FilterCrudTest.php
+++ b/core/modules/filter/lib/Drupal/filter/Tests/FilterCrudTest.php
@@ -84,6 +84,7 @@ function testTextFormatCrud() {
    */
   function verifyTextFormat($format) {
     $t_args = array('%format' => $format->name);
+    $default_langcode = language_default()->langcode;
 
     // Verify filter_format_load().
     $filter_format = filter_format_load($format->format);
@@ -91,6 +92,8 @@ function verifyTextFormat($format) {
     $this->assertEqual($filter_format->name, $format->name, format_string('filter_format_load: Proper title for text format %format.', $t_args));
     $this->assertEqual($filter_format->cache, $format->cache, format_string('filter_format_load: Proper cache indicator for text format %format.', $t_args));
     $this->assertEqual($filter_format->weight, $format->weight, format_string('filter_format_load: Proper weight for text format %format.', $t_args));
+    // Check that the filter was created in site default language.
+    $this->assertEqual($format->langcode, $default_langcode, format_string('filter_format_load: Proper language code for text format %format.', $t_args));
 
     // Verify the 'cache' text format property according to enabled filters.
     $filter_info = filter_get_filters();
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
index 04070c9..d483824 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
@@ -44,7 +44,7 @@ public function testUserPictureUpgrade() {
     $this->assertIdentical($instance['settings']['default_image'], $file->id(), 'Default user picture has been migrated.');
     $this->assertEqual($file->uri, 'public://user_pictures_dir/druplicon.png', 'File id matches the uri expected.');
     $this->assertEqual($file->filename, 'druplicon.png');
-    $this->assertEqual($file->langcode, LANGUAGE_NOT_SPECIFIED);
+    $this->assertEqual($file->langcode, language_default()->langcode);
     $this->assertEqual($file->filemime, 'image/png');
     $this->assertFalse(empty($file->uuid));
 
diff --git a/core/modules/user/config/user.role.anonymous.yml b/core/modules/user/config/user.role.anonymous.yml
index 11defb0..1947f35 100644
--- a/core/modules/user/config/user.role.anonymous.yml
+++ b/core/modules/user/config/user.role.anonymous.yml
@@ -1,3 +1,4 @@
 id: anonymous
 label: Anonymous user
 weight: 0
+langcode: en
diff --git a/core/modules/user/config/user.role.authenticated.yml b/core/modules/user/config/user.role.authenticated.yml
index dc4b65d..16df96d 100644
--- a/core/modules/user/config/user.role.authenticated.yml
+++ b/core/modules/user/config/user.role.authenticated.yml
@@ -1,3 +1,4 @@
 id: authenticated
 label: Authenticated user
 weight: 1
+langcode: en
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php
index d322a64..0025873 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php
@@ -32,6 +32,7 @@ function setUp() {
    */
   function testRoleAdministration() {
     $this->drupalLogin($this->admin_user);
+    $default_langcode = language_default()->langcode;
 
     // Test adding a role. (In doing so, we use a role name that happens to
     // correspond to an integer, to test that the role administration pages
@@ -43,6 +44,9 @@ function testRoleAdministration() {
     $role = entity_load('user_role', $role_name);
     $this->assertTrue(is_object($role), 'The role was successfully retrieved from the database.');
 
+    // Check that the role was created in site default language.
+    $this->assertEqual($role->langcode, $default_langcode);
+
     // Try adding a duplicate role.
     $this->drupalPost(NULL, $edit, t('Add role'));
     $this->assertRaw(t('The machine-readable name is already in use. It must be unique.'), 'Duplicate role warning displayed.');
diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc
index c3931d8..882cef2 100644
--- a/core/modules/user/user.admin.inc
+++ b/core/modules/user/user.admin.inc
@@ -1004,6 +1004,11 @@ function user_admin_role($form, $form_state, $role) {
       'source' => array('role', 'label'),
     ),
   );
+  // @todo Remove once moved to RoleFormController.
+  $form['role']['langcode'] = array(
+    '#type' => 'value',
+    '#value' => !$role->isNew() ? $role->langcode : language_default()->langcode,
+  );
   $form['role']['weight'] = array(
     '#type' => 'value',
     '#value' => $role->weight,
