diff --git a/core/modules/comment/comment.info.yml b/core/modules/comment/comment.info.yml
index ea529a4..d81583e 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 d5b7f0c..c1451eb 100644
--- a/core/modules/comment/src/CommentForm.php
+++ b/core/modules/comment/src/CommentForm.php
@@ -15,6 +15,8 @@
 use Drupal\Core\Entity\EntityConstraintViolationListInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 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;
@@ -71,6 +73,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()];
@@ -100,7 +104,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', array('entity_type' => $entity->getEntityTypeId(), 'entity' => $entity->id(), 'field_name' => $field_name));
     }
 
@@ -118,7 +122,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 d37ab61..5140b16 100644
--- a/core/modules/comment/src/CommentLazyBuilders.php
+++ b/core/modules/comment/src/CommentLazyBuilders.php
@@ -110,6 +110,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 81a6f67..61a6bcd 100644
--- a/core/modules/comment/src/Controller/CommentController.php
+++ b/core/modules/comment/src/Controller/CommentController.php
@@ -252,6 +252,7 @@ public function getReplyForm(Request $request, EntityInterface $entity, $field_n
       'pid' => $pid,
       'entity_type' => $entity->getEntityTypeId(),
       'field_name' => $field_name,
+      'uid' => $this->currentUser()->id(),
     ));
     $build['comment_form'] = $this->entityFormBuilder()->getForm($comment);
 
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index 08dc5ed..88568fd 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -262,27 +262,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'))
@@ -291,9 +323,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'))
@@ -344,6 +381,18 @@ public static function bundleFieldDefinitions(EntityTypeInterface $entity_type,
   }
 
   /**
+   * 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}
    */
   public function hasParentComment() {
@@ -554,7 +603,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/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php b/core/modules/comment/src/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
index 1e84084..84b5694 100644
--- a/core/modules/comment/src/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
+++ b/core/modules/comment/src/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
@@ -194,6 +194,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         // Only show the add comment form if the user has permission.
         $elements['#cache']['contexts'][] = 'user.roles';
         if ($this->currentUser->hasPermission('post comments')) {
+
           $output['comment_form'] = [
             '#lazy_builder' => ['comment.lazy_builders:renderForm', [
               $entity->getEntityTypeId(),
diff --git a/core/modules/comment/src/Tests/CommentAnonymousTest.php b/core/modules/comment/src/Tests/CommentAnonymousTest.php
index b7e5bd8..0a0568b 100644
--- a/core/modules/comment/src/Tests/CommentAnonymousTest.php
+++ b/core/modules/comment/src/Tests/CommentAnonymousTest.php
@@ -93,8 +93,8 @@ function testAnonymous() {
 
     // Ensure anonymous users cannot post in the name of registered users.
     $edit = array(
-      '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(),
     );
@@ -120,7 +120,7 @@ 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(), array('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/src/Tests/CommentInterfaceTest.php b/core/modules/comment/src/Tests/CommentInterfaceTest.php
index 47f5b09..bdb5272 100644
--- a/core/modules/comment/src/Tests/CommentInterfaceTest.php
+++ b/core/modules/comment/src/Tests/CommentInterfaceTest.php
@@ -99,19 +99,19 @@ public function testCommentInterface() {
     )));
 
     // Test changing the comment author to "Anonymous".
-    $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->getSubject(), array('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(), array('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(), array('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/src/Tests/CommentPreviewTest.php b/core/modules/comment/src/Tests/CommentPreviewTest.php
index eadb837..8eca3ea 100644
--- a/core/modules/comment/src/Tests/CommentPreviewTest.php
+++ b/core/modules/comment/src/Tests/CommentPreviewTest.php
@@ -140,9 +140,9 @@ 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');
@@ -160,7 +160,7 @@ 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.');
 
@@ -172,7 +172,7 @@ 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.');
 
@@ -180,7 +180,7 @@ function testCommentEditPreviewSave() {
     $displayed = array();
     $displayed['subject[0][value]'] = (string) current($this->xpath("//input[@id='edit-subject-0-value']/@value"));
     $displayed['comment_body[0][value]'] = (string) current($this->xpath("//textarea[@id='edit-comment-body-0-value']"));
-    $displayed['uid'] = (string) current($this->xpath("//input[@id='edit-uid']/@value"));
+    $displayed['uid[0][target_id'] = (string) current($this->xpath("//input[@id='edit-uid']/@value"));
     $displayed['date[date]'] = (string) current($this->xpath("//input[@id='edit-date-date']/@value"));
     $displayed['date[time]'] = (string) current($this->xpath("//input[@id='edit-date-time']/@value"));
     $this->drupalPostForm('comment/' . $comment->id() . '/edit', $displayed, t('Save'));
diff --git a/core/modules/comment/src/Tests/CommentStatisticsTest.php b/core/modules/comment/src/Tests/CommentStatisticsTest.php
index d87205d..bd81016 100644
--- a/core/modules/comment/src/Tests/CommentStatisticsTest.php
+++ b/core/modules/comment/src/Tests/CommentStatisticsTest.php
@@ -108,7 +108,7 @@ function testCommentNodeCommentStatistics() {
 
     // Post comment #3 as anonymous.
     $this->drupalGet('comment/reply/node/' . $this->node->id() . '/comment');
-    $anonymous_comment = $this->postComment($this->node, $this->randomMachineName(), '', array('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/src/Tests/CommentTestBase.php b/core/modules/comment/src/Tests/CommentTestBase.php
index 17eccb9..c52cc83 100644
--- a/core/modules/comment/src/Tests/CommentTestBase.php
+++ b/core/modules/comment/src/Tests/CommentTestBase.php
@@ -101,9 +101,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'.
@@ -111,7 +110,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 = array(), $field_name = 'comment') {
     $edit = array();
     $edit['comment_body[0][value]'] = $comment;
 
@@ -339,7 +338,7 @@ public function setCommentSettings($name, $value, $message, $field_name = 'comme
    *   Contact info is available.
    */
   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/src/Tests/CommentTranslationUITest.php b/core/modules/comment/src/Tests/CommentTranslationUITest.php
index 1246aa8..796a133 100644
--- a/core/modules/comment/src/Tests/CommentTranslationUITest.php
+++ b/core/modules/comment/src/Tests/CommentTranslationUITest.php
@@ -164,7 +164,7 @@ protected function doTestAuthoringInfo() {
         'created' => REQUEST_TIME - mt_rand(0, 1000),
       );
       $edit = array(
-        '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 fd607d2..f88aa51 100644
--- a/core/modules/comment/tests/src/Kernel/CommentFieldAccessTest.php
+++ b/core/modules/comment/tests/src/Kernel/CommentFieldAccessTest.php
@@ -148,6 +148,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 f096a6e..27f87cc 100644
--- a/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceWidgetSettings.php
+++ b/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceWidgetSettings.php
@@ -59,6 +59,7 @@ public function getSettings($widget_type, $widget_settings) {
         'placeholder' => '',
       ),
       'email_textfield' => array(
+        'size' => $size,
         'placeholder' => '',
       ),
       'link' => array(
