diff --git a/core/modules/language/src/Plugin/Field/FieldWidget/LanguageWidget.php b/core/modules/language/src/Plugin/Field/FieldWidget/LanguageWidget.php
new file mode 100644
index 0000000..ce18945
--- /dev/null
+++ b/core/modules/language/src/Plugin/Field/FieldWidget/LanguageWidget.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\language\Plugin\Field\LanguageWidget.
+ */
+
+namespace Drupal\language\Plugin\Field\FieldWidget;
+
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
+
+/**
+ * Plugin implementation of the 'lancode' widget.
+ *
+ * @FieldWidget(
+ *   id = "language_select",
+ *   label = @Translation("Language"),
+ *   field_types = {
+ *     "list_string"
+ *   }
+ * )
+ */
+class LanguageWidget extends WidgetBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
+    $language_configuration = \Drupal::moduleHandler()->invoke('language', 'get_default_configuration', array('node', $items->getEntity()->getType()));
+    $element = array(
+      '#title' => t('Language'),
+      '#type' => 'language_select',
+      '#default_value' => $items->getEntity()->language()->getId(),
+      '#languages' => LanguageInterface::STATE_ALL,
+      '#access' => isset($language_configuration['language_show']) && $language_configuration['language_show'],
+    );
+
+    return $element;
+  }
+
+}
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index b5bb8f8..e7f0eb5 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -349,7 +349,10 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The node language code.'))
-      ->setRevisionable(TRUE);
+      ->setRevisionable(TRUE)
+      ->setDisplayOptions('form', array(
+        'type' => 'language_select',
+      ));
 
     $fields['title'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Title'))
diff --git a/core/modules/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index a214282..706a4d6 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -107,16 +107,6 @@ public function form(array $form, FormStateInterface $form_state) {
       '#type' => 'hidden',
       '#default_value' => $node->getChangedTime(),
     );
-
-    $language_configuration = \Drupal::moduleHandler()->invoke('language', 'get_default_configuration', array('node', $node->getType()));
-    $form['langcode'] = array(
-      '#title' => t('Language'),
-      '#type' => 'language_select',
-      '#default_value' => $node->getUntranslated()->language()->id,
-      '#languages' => LanguageInterface::STATE_ALL,
-      '#access' => isset($language_configuration['language_show']) && $language_configuration['language_show'],
-    );
-
     $form['advanced'] = array(
       '#type' => 'vertical_tabs',
       '#attributes' => array('class' => array('entity-meta')),
