diff --git a/core/modules/comment/comment.info.yml b/core/modules/comment/comment.info.yml
index ea529a474c..d81583ef85 100644
--- a/core/modules/comment/comment.info.yml
+++ b/core/modules/comment/comment.info.yml
@@ -5,5 +5,6 @@ package: Core
 version: VERSION
 core: 8.x
 dependencies:
+  - entity_reference
   - text
 configure: comment.admin
diff --git a/core/modules/comment/src/CommentForm.php b/core/modules/comment/src/CommentForm.php
index 98e9ddef96..0aeebd45e1 100644
--- a/core/modules/comment/src/CommentForm.php
+++ b/core/modules/comment/src/CommentForm.php
@@ -12,6 +12,8 @@
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -76,6 +78,8 @@ public function __construct(EntityManagerInterface $entity_manager, AccountInter
   public function form(array $form, FormStateInterface $form_state) {
     /** @var \Drupal\comment\CommentInterface $comment */
     $comment = $this->entity;
+    $form = parent::form($form, $form_state, $comment);
+
     $entity = $this->entityManager->getStorage($comment->getCommentedEntityTypeId())->load($comment->getCommentedEntityId());
     $field_name = $comment->getFieldName();
     $field_definition = $this->entityManager->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle())[$comment->getFieldName()];
@@ -105,7 +109,7 @@ public function form(array $form, FormStateInterface $form_state) {
 
     // If not replying to a comment, use our dedicated page callback for new
     // Comments on entities.
-    if (!$comment->id() && !$comment->hasParentComment()) {
+    if ($comment->isNew() && !$comment->hasParentComment()) {
       $form['#action'] = $this->url('comment.reply', ['entity_type' => $entity->getEntityTypeId(), 'entity' => $entity->id(), 'field_name' => $field_name]);
     }
 
@@ -123,7 +127,32 @@ public function form(array $form, FormStateInterface $form_state) {
       ];
     }
 
-    // Prepare default values for form elements.
+    // Add the author name field depending on the current user.
+    $form['uid']['widget'][0]['target_id']['#required'] = ($this->currentUser->isAnonymous() && $anonymous_contact == COMMENT_ANONYMOUS_MUST_CONTACT);
+    if ($this->currentUser->isAuthenticated() && !$is_admin) {
+      $form['uid']['widget'][0]['target_id']['#type'] = 'item';
+      $form['uid']['widget'][0]['target_id']['#value'] = $this->currentUser->id();
+      $form['uid']['widget'][0]['target_id']['#theme'] = 'username';
+      $form['uid']['widget'][0]['target_id']['#account'] = $this->currentUser;
+    }
+    $form['uid']['#group'] = 'author';
+
+    // Add author email and homepage fields depending on the current user.
+    $form['mail']['widget'][0]['value']['#required'] = ($this->currentUser->isAnonymous() && $anonymous_contact == COMMENT_ANONYMOUS_MUST_CONTACT);
+    $form['mail']['#access'] = $is_admin || $this->currentUser->isAnonymous();
+    $form['mail']['#group'] = 'author';
+    $form['mail']['#access'] = $is_admin || ($this->currentUser->isAnonymous() && $anonymous_contact != COMMENT_ANONYMOUS_MAYNOT_CONTACT);
+
+    $form['homepage']['#group'] = 'author';
+    $form['homepage']['#access'] = $is_admin || ($this->currentUser->isAnonymous() && $anonymous_contact != COMMENT_ANONYMOUS_MAYNOT_CONTACT);
+
+    $form['created']['#group'] = 'author';
+    $form['created']['#access'] = $is_admin;
+
+    $form['name']['#group'] = 'author';
+    $form['name']['#access'] = $is_admin || $this->currentUser->isAnonymous();
+
+    // Prepare default value for status form element.
     $author = '';
     if ($is_admin) {
       if (!$comment->getOwnerId()) {
diff --git a/core/modules/comment/src/CommentLazyBuilders.php b/core/modules/comment/src/CommentLazyBuilders.php
index 730c840897..8709684b41 100644
--- a/core/modules/comment/src/CommentLazyBuilders.php
+++ b/core/modules/comment/src/CommentLazyBuilders.php
@@ -105,6 +105,7 @@ public function renderForm($commented_entity_type_id, $commented_entity_id, $fie
       'field_name' => $field_name,
       'comment_type' => $comment_type_id,
       'pid' => NULL,
+      'uid' => $this->currentUser->id(),
     ];
     $comment = $this->entityManager->getStorage('comment')->create($values);
     return $this->entityFormBuilder->getForm($comment);
diff --git a/core/modules/comment/src/Controller/CommentController.php b/core/modules/comment/src/Controller/CommentController.php
index 560233889c..5500f6f13d 100644
--- a/core/modules/comment/src/Controller/CommentController.php
+++ b/core/modules/comment/src/Controller/CommentController.php
@@ -178,6 +178,7 @@ public function redirectNode(EntityInterface $node) {
         'entity_type' => 'node',
         'entity' => $node->id(),
         'field_name' => $field_name,
+        'uid' => $this->currentUser()->id(),
       ]);
     }
     throw new NotFoundHttpException();
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index 5f5a611565..348b679e9a 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -265,27 +265,59 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDescription(t('The user ID of the comment author.'))
       ->setTranslatable(TRUE)
       ->setSetting('target_type', 'user')
-      ->setDefaultValue(0);
+      ->setSetting('handler', 'default')
+      ->setDefaultValueCallback('Drupal\comment\Entity\Comment::getCurrentUserId')
+      ->setDisplayOptions('form', array(
+        'type' => 'entity_reference_autocomplete',
+        'weight' => 5,
+        'settings' => array(
+          'match_operator' => 'CONTAINS',
+          'size' => '60',
+          'autocomplete_type' => 'tags',
+          'placeholder' => '',
+        ),
+      ))
+      ->setDisplayConfigurable('form', TRUE);
 
     $fields['name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Name'))
       ->setDescription(t("The comment author's name."))
       ->setTranslatable(TRUE)
       ->setSetting('max_length', 60)
-      ->setDefaultValue('');
+      ->setDefaultValue('')
+      ->addConstraint('CommentName', array())
+      ->setDisplayOptions('form', array(
+        'type' => 'string_textfield',
+        'weight' => -15,
+        'settings' => array(
+          'size' => 30,
+        ),
+      ))
+      ->setDisplayConfigurable('form', TRUE);
 
     $fields['mail'] = BaseFieldDefinition::create('email')
       ->setLabel(t('Email'))
-      ->setDescription(t("The comment author's email address."))
-      ->setTranslatable(TRUE);
+      ->setDescription(t('The content of this field is kept private and will not be shown publicly.'))
+      ->setTranslatable(TRUE)
+      ->setDisplayOptions('form', array(
+        'type' => 'email_default',
+        'weight' => -10,
+        'settings' => array(
+          'size' => 30,
+        ),
+      ));
 
     $fields['homepage'] = BaseFieldDefinition::create('uri')
       ->setLabel(t('Homepage'))
-      ->setDescription(t("The comment author's home page address."))
       ->setTranslatable(TRUE)
       // URIs are not length limited by RFC 2616, but we can only store 255
       // characters in our comment DB schema.
-      ->setSetting('max_length', 255);
+      ->setSetting('max_length', 255)
+      ->setDisplayOptions('form', array(
+        'type' => 'uri',
+        'size' => 30,
+        'weight' => -5,
+      ));
 
     $fields['hostname'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Hostname'))
@@ -294,9 +326,14 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setSetting('max_length', 128);
 
     $fields['created'] = BaseFieldDefinition::create('created')
-      ->setLabel(t('Created'))
+      ->setLabel(t('Authored on'))
       ->setDescription(t('The time that the comment was created.'))
-      ->setTranslatable(TRUE);
+      ->setTranslatable(TRUE)
+      ->setDisplayOptions('form', array(
+        'type' => 'datetime_timestamp',
+        'weight' => 10,
+      ))
+      ->setDisplayConfigurable('form', TRUE);
 
     $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
@@ -335,6 +372,18 @@ public static function bundleFieldDefinitions(EntityTypeInterface $entity_type,
     return [];
   }
 
+  /**
+   * Default value callback for 'uid' base field definition.
+   *
+   * @see ::baseFieldDefinitions()
+   *
+   * @return array
+   *   An array of default values.
+   */
+  public static function getCurrentUserId() {
+    return array(\Drupal::currentUser()->id());
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -531,7 +580,7 @@ public function getOwner() {
    * {@inheritdoc}
    */
   public function getOwnerId() {
-    return $this->get('uid')->target_id;
+    return (int) $this->get('uid')->target_id;
   }
 
   /**
diff --git a/core/modules/comment/src/Tests/CommentTestBase.php b/core/modules/comment/src/Tests/CommentTestBase.php
index 3b923ffaf4..1af461685b 100644
--- a/core/modules/comment/src/Tests/CommentTestBase.php
+++ b/core/modules/comment/src/Tests/CommentTestBase.php
@@ -103,9 +103,8 @@ protected function setUp() {
    *   Comment body.
    * @param string $subject
    *   Comment subject.
-   * @param string $contact
-   *   Set to NULL for no contact info, TRUE to ignore success checking, and
-   *   array of values to set contact info.
+   * @param array $contact
+   *   Array of contact info.
    * @param string $field_name
    *   (optional) Field name through which the comment should be posted.
    *   Defaults to 'comment'.
@@ -113,7 +112,7 @@ protected function setUp() {
    * @return \Drupal\comment\CommentInterface|null
    *   The posted comment or NULL when posted comment was not found.
    */
-  public function postComment($entity, $comment, $subject = '', $contact = NULL, $field_name = 'comment') {
+  public function postComment($entity, $comment, $subject = '', $contact = [], $field_name = 'comment') {
     $edit = [];
     $edit['comment_body[0][value]'] = $comment;
 
@@ -342,7 +341,7 @@ public function setCommentSettings($name, $value, $message, $field_name = 'comme
    *   Contact info is available.
    */
   public function commentContactInfoAvailable() {
-    return preg_match('/(input).*?(name="name").*?(input).*?(name="mail").*?(input).*?(name="homepage")/s', $this->getRawContent());
+    return preg_match('/(input).*?(name="name\[0\]\[value\]").*?(input).*?(name="mail\[0\]\[value\]").*?(input).*?(name="homepage\[0\]\[value\]")/s', $this->getRawContent());
   }
 
   /**
diff --git a/core/modules/comment/tests/src/Functional/CommentAnonymousTest.php b/core/modules/comment/tests/src/Functional/CommentAnonymousTest.php
index bd0453796f..332c579335 100644
--- a/core/modules/comment/tests/src/Functional/CommentAnonymousTest.php
+++ b/core/modules/comment/tests/src/Functional/CommentAnonymousTest.php
@@ -98,8 +98,8 @@ public function testAnonymous() {
 
     // Ensure anonymous users cannot post in the name of registered users.
     $edit = [
-      'name' => $this->adminUser->getUsername(),
-      'mail' => $this->randomMachineName() . '@example.com',
+      'name[0][value]' => $this->adminUser->getUsername(),
+      'mail[0][value]' => $this->randomMachineName() . '@example.com',
       'subject[0][value]' => $this->randomMachineName(),
       'comment_body[0][value]' => $this->randomMachineName(),
     ];
@@ -125,7 +125,7 @@ public function testAnonymous() {
     // Post comment with contact info (required).
     $author_name = $this->randomMachineName();
     $author_mail = $this->randomMachineName() . '@example.com';
-    $anonymous_comment3 = $this->postComment($this->node, $this->randomMachineName(), $this->randomMachineName(), ['name' => $author_name, 'mail' => $author_mail]);
+    $anonymous_comment3 = $this->postComment($this->node, $this->randomMachineName(), $this->randomMachineName(), array('name[0][value]' => $author_name, 'mail[0][value]' => $author_mail));
     $this->assertTrue($this->commentExists($anonymous_comment3), 'Anonymous comment with contact info (required) found.');
 
     // Make sure the user data appears correctly when editing the comment.
diff --git a/core/modules/comment/tests/src/Functional/CommentInterfaceTest.php b/core/modules/comment/tests/src/Functional/CommentInterfaceTest.php
index 7342633bbc..0997a967ee 100644
--- a/core/modules/comment/tests/src/Functional/CommentInterfaceTest.php
+++ b/core/modules/comment/tests/src/Functional/CommentInterfaceTest.php
@@ -97,19 +97,19 @@ public function testCommentInterface() {
     ]));
 
     // Test changing the comment author to "Anonymous".
-    $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->getSubject(), ['uid' => '']);
+    $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->getSubject(), array('uid[0][target_id]' => ''));
     $this->assertTrue($comment->getAuthorName() == t('Anonymous') && $comment->getOwnerId() == 0, 'Comment author successfully changed to anonymous.');
 
     // Test changing the comment author to an unverified user.
     $random_name = $this->randomMachineName();
     $this->drupalGet('comment/' . $comment->id() . '/edit');
-    $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->getSubject(), ['name' => $random_name]);
+    $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->getSubject(), array('name[0][value]' => $random_name));
     $this->drupalGet('node/' . $this->node->id());
     $this->assertText($random_name . ' (' . t('not verified') . ')', 'Comment author successfully changed to an unverified user.');
 
     // Test changing the comment author to a verified user.
     $this->drupalGet('comment/' . $comment->id() . '/edit');
-    $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->getSubject(), ['uid' => $this->webUser->getUsername() . ' (' . $this->webUser->id() . ')']);
+    $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->getSubject(), array('uid[0][target_id]' => $this->webUser->getUsername() . ' (' . $this->webUser->id() . ')'));
     $this->assertTrue($comment->getAuthorName() == $this->webUser->getUsername() && $comment->getOwnerId() == $this->webUser->id(), 'Comment author successfully changed to a registered user.');
 
     $this->drupalLogout();
diff --git a/core/modules/comment/tests/src/Functional/CommentPreviewTest.php b/core/modules/comment/tests/src/Functional/CommentPreviewTest.php
index 91544b6367..6b8e254a38 100644
--- a/core/modules/comment/tests/src/Functional/CommentPreviewTest.php
+++ b/core/modules/comment/tests/src/Functional/CommentPreviewTest.php
@@ -139,9 +139,9 @@ public function testCommentEditPreviewSave() {
     $date = new DrupalDateTime('2008-03-02 17:23');
     $edit['subject[0][value]'] = $this->randomMachineName(8);
     $edit['comment_body[0][value]'] = $this->randomMachineName(16);
-    $edit['uid'] = $web_user->getUsername() . ' (' . $web_user->id() . ')';
-    $edit['date[date]'] = $date->format('Y-m-d');
-    $edit['date[time]'] = $date->format('H:i:s');
+    $edit['uid[0][target_id]'] = $web_user->getUsername() . ' (' . $web_user->id() . ')';
+    $edit['created[0][value][date]'] = $date->format('Y-m-d');
+    $edit['created[0][value][time]'] = $date->format('H:i:s');
     $raw_date = $date->getTimestamp();
     $expected_text_date = format_date($raw_date);
     $expected_form_date = $date->format('Y-m-d');
@@ -159,7 +159,7 @@ public function testCommentEditPreviewSave() {
     // Check that the subject, comment, author and date fields are displayed with the correct values.
     $this->assertFieldByName('subject[0][value]', $edit['subject[0][value]'], 'Subject field displayed.');
     $this->assertFieldByName('comment_body[0][value]', $edit['comment_body[0][value]'], 'Comment field displayed.');
-    $this->assertFieldByName('uid', $edit['uid'], 'Author field displayed.');
+    $this->assertFieldByName('uid[0][target_id]', $edit['uid'], 'Author field displayed.');
     $this->assertFieldByName('date[date]', $edit['date[date]'], 'Date field displayed.');
     $this->assertFieldByName('date[time]', $edit['date[time]'], 'Time field displayed.');
 
@@ -171,7 +171,7 @@ public function testCommentEditPreviewSave() {
     $this->drupalGet('comment/' . $comment->id() . '/edit');
     $this->assertFieldByName('subject[0][value]', $edit['subject[0][value]'], 'Subject field displayed.');
     $this->assertFieldByName('comment_body[0][value]', $edit['comment_body[0][value]'], 'Comment field displayed.');
-    $this->assertFieldByName('uid', $edit['uid'], 'Author field displayed.');
+    $this->assertFieldByName('uid[0][target_id]', $edit['uid'], 'Author field displayed.');
     $this->assertFieldByName('date[date]', $expected_form_date, 'Date field displayed.');
     $this->assertFieldByName('date[time]', $expected_form_time, 'Time field displayed.');
 
@@ -179,7 +179,7 @@ public function testCommentEditPreviewSave() {
     $displayed = [];
     $displayed['subject[0][value]'] = current($this->xpath("//input[@id='edit-subject-0-value']"))->getValue();
     $displayed['comment_body[0][value]'] = current($this->xpath("//textarea[@id='edit-comment-body-0-value']"))->getValue();
-    $displayed['uid'] = current($this->xpath("//input[@id='edit-uid']"))->getValue();
+    $displayed['uid[0][target_id'] = (string) current($this->xpath("//input[@id='edit-uid']/@value"));
     $displayed['date[date]'] = current($this->xpath("//input[@id='edit-date-date']"))->getValue();
     $displayed['date[time]'] = current($this->xpath("//input[@id='edit-date-time']"))->getValue();
     $this->drupalPostForm('comment/' . $comment->id() . '/edit', $displayed, t('Save'));
diff --git a/core/modules/comment/tests/src/Functional/CommentStatisticsTest.php b/core/modules/comment/tests/src/Functional/CommentStatisticsTest.php
index 4a0eae0879..95bbcc505b 100644
--- a/core/modules/comment/tests/src/Functional/CommentStatisticsTest.php
+++ b/core/modules/comment/tests/src/Functional/CommentStatisticsTest.php
@@ -103,7 +103,7 @@ public function testCommentNodeCommentStatistics() {
 
     // Post comment #3 as anonymous.
     $this->drupalGet('comment/reply/node/' . $this->node->id() . '/comment');
-    $anonymous_comment = $this->postComment($this->node, $this->randomMachineName(), '', ['name' => $this->randomMachineName()]);
+    $anonymous_comment = $this->postComment($this->node, $this->randomMachineName(), '', array('name[0][value]' => $this->randomMachineName()));
     $comment_loaded = Comment::load($anonymous_comment->id());
 
     // Checks the new values of node comment statistics with comment #3.
diff --git a/core/modules/comment/tests/src/Functional/CommentTranslationUITest.php b/core/modules/comment/tests/src/Functional/CommentTranslationUITest.php
index daac938fa3..ca0e2bf53f 100644
--- a/core/modules/comment/tests/src/Functional/CommentTranslationUITest.php
+++ b/core/modules/comment/tests/src/Functional/CommentTranslationUITest.php
@@ -163,7 +163,7 @@ protected function doTestAuthoringInfo() {
         'created' => REQUEST_TIME - mt_rand(0, 1000),
       ];
       $edit = [
-        'uid' => $user->getUsername() . ' (' . $user->id() . ')',
+        'uid[0][target_id]' => $user->getUsername() . '(' . $user->id() . ')',
         'date[date]' => format_date($values[$langcode]['created'], 'custom', 'Y-m-d'),
         'date[time]' => format_date($values[$langcode]['created'], 'custom', 'H:i:s'),
       ];
diff --git a/core/modules/comment/tests/src/Kernel/CommentFieldAccessTest.php b/core/modules/comment/tests/src/Kernel/CommentFieldAccessTest.php
index 1e0fd72129..0d5d74a89c 100644
--- a/core/modules/comment/tests/src/Kernel/CommentFieldAccessTest.php
+++ b/core/modules/comment/tests/src/Kernel/CommentFieldAccessTest.php
@@ -145,6 +145,10 @@ public function testAccessToAdministrativeFields() {
     $instance->setSetting('anonymous', COMMENT_ANONYMOUS_MAY_CONTACT);
     $instance->save();
 
+    $instance = FieldConfig::loadByName('entity_test', 'entity_test', 'comment');
+    $instance->settings['anonymous'] = COMMENT_ANONYMOUS_MAY_CONTACT;
+    $instance->save();
+
     // Create three "Comments". One is owned by our edit-enabled user.
     $comment1 = Comment::create([
       'entity_type' => 'entity_test',
diff --git a/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceWidgetSettings.php b/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceWidgetSettings.php
index 62c982963f..a9d7eb605b 100644
--- a/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceWidgetSettings.php
+++ b/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceWidgetSettings.php
@@ -54,6 +54,7 @@ public function getSettings($widget_type, $widget_settings) {
         'placeholder' => '',
       ],
       'email_textfield' => [
+        'size' => $size,
         'placeholder' => '',
       ],
       'link' => [
