diff --git a/core/modules/file/src/Plugin/Field/FieldType/FileItem.php b/core/modules/file/src/Plugin/Field/FieldType/FileItem.php
index 58416044483efa225104c57b717110ac8e20bb8e..1633147b2b4e780444b5d519ff2fda2e1584729b 100644
--- a/core/modules/file/src/Plugin/Field/FieldType/FileItem.php
+++ b/core/modules/file/src/Plugin/Field/FieldType/FileItem.php
@@ -51,7 +51,7 @@ public static function defaultStorageSettings() {
   public static function defaultFieldSettings() {
     return array(
       'file_extensions' => 'txt',
-      'file_directory' => '',
+      'file_directory' => '[date:custom:Y]-[date:custom:m]',
       'max_filesize' => '',
       'description_field' => 0,
     ) + parent::defaultFieldSettings();
@@ -267,7 +267,22 @@ public static function validateMaxFilesize($element, FormStateInterface $form_st
    * @see token_replace()
    */
   public function getUploadLocation($data = array()) {
-    $settings = $this->getSettings();
+    return static::doGetUploadLocation($this->getSettings(), $data);
+  }
+
+  /**
+   * Determines the URI for a file field.
+   *
+   * @param array $settings
+   *   The array of field settings.
+   * @param array $data
+   *   An array of token objects to pass to token_replace().
+   *
+   * @return string
+   *   An unsanitized file directory URI with tokens replaced. The result of
+   *   the token replacement is then converted to plain text and returned.
+   */
+  protected static function doGetUploadLocation(array $settings, $data = []) {
     $destination = trim($settings['file_directory'], '/');
 
     // Replace tokens. As the tokens might contain HTML we convert it to plain
@@ -312,7 +327,7 @@ public static function generateSampleValue(FieldDefinitionInterface $field_defin
     $settings = $field_definition->getSettings();
 
     // Prepare destination.
-    $dirname = $settings['uri_scheme'] . '://' . $settings['file_directory'];
+    $dirname = static::doGetUploadLocation($settings);
     file_prepare_directory($dirname, FILE_CREATE_DIRECTORY);
 
     // Generate a file entity.
diff --git a/core/modules/file/src/Tests/FileFieldPathTest.php b/core/modules/file/src/Tests/FileFieldPathTest.php
index 346fc7a27d2a4cd16e69fe45972cfd2068dae3d0..acafd4bf1406e050daea4d1c73d7786b5be4feac 100644
--- a/core/modules/file/src/Tests/FileFieldPathTest.php
+++ b/core/modules/file/src/Tests/FileFieldPathTest.php
@@ -19,20 +19,29 @@ class FileFieldPathTest extends FileFieldTestBase {
    * Tests the normal formatter display on node display.
    */
   function testUploadPath() {
+    /** @var \Drupal\node\NodeStorageInterface $node_storage */
     $node_storage = $this->container->get('entity.manager')->getStorage('node');
     $field_name = strtolower($this->randomMachineName());
     $type_name = 'article';
     $this->createFileField($field_name, 'node', $type_name);
+    /** @var \Drupal\file\FileInterface $test_file */
     $test_file = $this->getTestFile('text');
 
     // Create a new node.
     $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
 
-    // Check that the file was uploaded to the file root.
+    // Check that the file was uploaded to the correct location.
     $node_storage->resetCache(array($nid));
     $node = $node_storage->load($nid);
-    $node_file = File::load($node->{$field_name}->target_id);
-    $this->assertPathMatch('public://' . $test_file->getFilename(), $node_file->getFileUri(), format_string('The file %file was uploaded to the correct path.', array('%file' => $node_file->getFileUri())));
+    /** @var \Drupal\file\FileInterface $node_file */
+    $node_file = $node->{$field_name}->entity;
+    $date_formatter = $this->container->get('date.formatter');
+    $expected_filename =
+      'public://' .
+      $date_formatter->format(REQUEST_TIME, 'custom', 'Y') . '-' .
+      $date_formatter->format(REQUEST_TIME, 'custom', 'm') . '/' .
+      $test_file->getFilename();
+    $this->assertPathMatch($expected_filename, $node_file->getFileUri(), format_string('The file %file was uploaded to the correct path.', array('%file' => $node_file->getFileUri())));
 
     // Change the path to contain multiple subdirectories.
     $this->updateFileField($field_name, $type_name, array('file_directory' => 'foo/bar/baz'));
diff --git a/core/profiles/standard/config/install/field.field.node.article.field_image.yml b/core/profiles/standard/config/install/field.field.node.article.field_image.yml
index b69d60319172296ea3e9852a19fb7345b6ce9635..b4b1c1466b7dcf3e37f29dee9494a6d36796a359 100644
--- a/core/profiles/standard/config/install/field.field.node.article.field_image.yml
+++ b/core/profiles/standard/config/install/field.field.node.article.field_image.yml
@@ -17,7 +17,7 @@ translatable: true
 default_value: {  }
 default_value_callback: ''
 settings:
-  file_directory: field/image
+  file_directory: '[date:custom:Y]-[date:custom:m]'
   file_extensions: 'png gif jpg jpeg'
   max_filesize: ''
   max_resolution: ''
diff --git a/core/profiles/standard/config/install/field.field.user.user.user_picture.yml b/core/profiles/standard/config/install/field.field.user.user.user_picture.yml
index 514508500a6f31ce9c3da2d6809deb497e5c0bf5..b2e61f661730d81cf939357b831877288256e3eb 100644
--- a/core/profiles/standard/config/install/field.field.user.user.user_picture.yml
+++ b/core/profiles/standard/config/install/field.field.user.user.user_picture.yml
@@ -18,7 +18,7 @@ default_value: {  }
 default_value_callback: ''
 settings:
   file_extensions: 'png gif jpg jpeg'
-  file_directory: pictures
+  file_directory: 'pictures/[date:custom:Y]-[date:custom:m]'
   max_filesize: '30 KB'
   alt_field: false
   title_field: false