diff --git a/core/includes/file.inc b/core/includes/file.inc
index 0e69bfe..ba69bcd 100644
--- a/core/includes/file.inc
+++ b/core/includes/file.inc
@@ -568,6 +568,9 @@ function file_load($fid) {
 function file_save(stdClass $file) {
   $file->timestamp = REQUEST_TIME;
   $file->filesize = filesize($file->uri);
+  if (empty($file->langcode)) {
+    $file->langcode = LANGUAGE_NONE;
+  }
 
   // Load the stored entity, if any.
   if (!empty($file->fid) && !isset($file->original)) {
diff --git a/core/modules/simpletest/tests/file.test b/core/modules/simpletest/tests/file.test
index a369a44..a186360 100644
--- a/core/modules/simpletest/tests/file.test
+++ b/core/modules/simpletest/tests/file.test
@@ -2011,11 +2011,12 @@ class FileSaveTest extends FileHookTestCase {
     $this->assertEqual($loaded_file->status, $file->status, t("Status was saved correctly."));
     $this->assertEqual($saved_file->filesize, filesize($file->uri), t("File size was set correctly."), 'File');
     $this->assertTrue($saved_file->timestamp > 1, t("File size was set correctly."), 'File');
-
+    $this->assertEqual($loaded_file->langcode, LANGUAGE_NONE, t("Langcode was defaulted correctly."));
 
     // Resave the file, updating the existing record.
     file_test_reset();
     $saved_file->status = 7;
+    $saved_file->langcode = 'en';
     $resaved_file = file_save($saved_file);
 
     // Check that the correct hooks were called.
@@ -2026,6 +2027,7 @@ class FileSaveTest extends FileHookTestCase {
     $loaded_file = db_query('SELECT * FROM {file_managed} f WHERE f.fid = :fid', array(':fid' => $saved_file->fid))->fetch(PDO::FETCH_OBJ);
     $this->assertNotNull($loaded_file, t("Record still exists in the database."), 'File');
     $this->assertEqual($loaded_file->status, $saved_file->status, t("Status was saved correctly."));
+    $this->assertEqual($loaded_file->langcode, 'en', t("Langcode was saved correctly."));
   }
 }
 
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index d8112e6..40e3ae0 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -814,6 +814,13 @@ function system_schema() {
         'not null' => TRUE,
         'default' => '',
       ),
+      'langcode' => array(
+        'description' => 'The {language}.langcode of this file.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
       'filemime' => array(
         'description' => "The file's MIME type.",
         'type' => 'varchar',
@@ -1666,6 +1673,36 @@ function system_update_8002() {
 }
 
 /**
+ * Add langcode field to the file_managed table.
+ *
+ * @see http://drupal.org/node/1444992
+ */
+function system_update_8003() {
+  $langcode_field = array(
+    'description' => 'The {language}.langcode of this file.',
+    'type' => 'varchar',
+    'length' => 12,
+    'not null' => TRUE,
+    'default' => '',
+    'initial' => LANGUAGE_NONE,
+  );
+
+  // If a Drupal 7 contrib module already added a langcode field to support
+  // internationalization, keep it, but standardize the specification.
+  // Otherwise, add the field. According to the documentation of
+  // db_change_field(), indeces using the field should be dropped first; if the
+  // contrib module created any indeces, it is its responsibility to drop them
+  // in an update function that runs before this one, which it can enforce via
+  // hook_update_dependencies().
+  if (db_field_exists('file_managed', 'langcode')) {
+    db_change_field('file_managed', 'langcode', 'langcode', $langcode_field);
+  }
+  else {
+    db_add_field('file_managed', 'langcode', $langcode_field);
+  }
+}
+
+/**
  * @} End of "defgroup updates-7.x-to-8.x"
  * The next series of updates should start at 9000.
  */
