diff --git a/src/Element/Tablefield.php b/src/Element/Tablefield.php
index 160c063..67a60d3 100644
--- a/src/Element/Tablefield.php
+++ b/src/Element/Tablefield.php
@@ -68,15 +68,46 @@ class Tablefield extends FormElement {
 
     $element['tablefield']['table'] = [
       '#type' => 'table',
+      '#tabledrag' => [
+        [
+          'action' => 'order',
+          'relationship' => 'sibling',
+          'group' => 'table-rows-weight',
+        ],
+      ],
     ];
     // Assign value.
-    $rows = isset($element['#rows']) ? $element['#rows'] : \Drupal::config('tablefield.settings')->get('rows');
-    $cols = isset($element['#cols']) ? $element['#cols'] : \Drupal::config('tablefield.settings')->get('cols');
+    $rows_amount = isset($element['#rows']) ? $element['#rows'] : \Drupal::config('tablefield.settings')
+      ->get('rows');
+    $cols_amount = isset($element['#cols']) ? $element['#cols'] : \Drupal::config('tablefield.settings')
+      ->get('cols');
+
+    $rows = [];
+    $value = !empty($value['tablefield']['table']) ? $value['tablefield']['table'] : $value;
+    for ($i = 0; $i < $rows_amount; $i++) {
+      $weight = isset($value[$i]['weight']) ? $value[$i]['weight'] : 0;
+      $row = [
+        // Tabledrag requires id property.
+        'id' => [
+          '#markup' => '',
+        ],
+        'weight' => [
+          '#type' => 'weight',
+          '#title' => t('Weight'),
+          '#title_display' => 'invisible',
+          '#default_value' => $weight,
+          '#attributes' => ['class' => ['table-rows-weight']],
+        ],
+        '#attributes' => [
+          'class' => ['draggable'],
+        ],
+        '#weight' => $weight,
+      ];
 
-    for ($i = 0; $i < $rows; $i++) {
-      for ($ii = 0; $ii < $cols; $ii++) {
+      $rows[$i] = $row;
+      for ($ii = 0; $ii < $cols_amount; $ii++) {
         if (!empty($element['#locked_cells'][$i][$ii]) && !empty($element['#lock'])) {
-          $element['tablefield']['table'][$i][$ii] = [
+          $rows[$i][$ii] = [
             '#type' => 'item',
             '#value' => $element['#locked_cells'][$i][$ii],
             '#title' => $element['#locked_cells'][$i][$ii],
@@ -84,7 +115,7 @@ class Tablefield extends FormElement {
         }
         else {
           $cell_value = isset($value[$i][$ii]) ? $value[$i][$ii] : '';
-          $element['tablefield']['table'][$i][$ii] = [
+          $rows[$i][$ii] = [
             '#type' => $input_type,
             '#maxlength' => 2048,
             '#size' => 0,
@@ -98,13 +129,17 @@ class Tablefield extends FormElement {
       }
     }
 
+    // Sort rows by weight property before adding them to the table.
+    uasort($rows, 'Drupal\Component\Utility\SortArray::sortByWeightProperty');
+    $element['tablefield']['table'] += $rows;
+
     // To change number of rows.
     if (!empty($element['#addrow'])) {
       $element['tablefield']['addrow']['row_value'] = [
         '#title' => t('How many rows'),
         '#type' => 'hidden',
-        '#default_value' => $rows,
-        '#value' => $rows,
+        '#default_value' => $rows_amount,
+        '#value' => $rows_amount,
       ];
       $element['tablefield']['addrow']['addrow'] = [
         '#type' => 'submit',
@@ -135,11 +170,11 @@ class Tablefield extends FormElement {
         '#type' => 'value',
         'cols' => [
           '#type' => 'value',
-          '#value' => $cols,
+          '#value' => $cols_amount,
         ],
         'rows' => [
           '#type' => 'value',
-          '#value' => $rows,
+          '#value' => $rows_amount,
         ],
       ];
     }
@@ -153,14 +188,14 @@ class Tablefield extends FormElement {
         '#title' => t('How many Columns'),
         '#type' => 'textfield',
         '#size' => 5,
-        '#default_value' => $cols,
+        '#default_value' => $cols_amount,
       ];
 
       $element['tablefield']['rebuild']['rows'] = [
         '#title' => t('How many Rows'),
         '#type' => 'textfield',
         '#size' => 5,
-        '#default_value' => $rows,
+        '#default_value' => $rows_amount,
       ];
       $element['tablefield']['rebuild']['rebuild'] = [
         '#type' => 'submit',
diff --git a/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php b/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php
index c3a62f7..8027869 100644
--- a/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/TablefieldFormatter.php
@@ -140,7 +140,9 @@ class TablefieldFormatter extends FormatterBase implements ContainerFactoryPlugi
         unset($tabledata['caption']);
 
         // Run the table through input filters.
-        foreach ($tabledata as $row_key => $row) {
+        foreach ($tabledata as $row_key => &$row) {
+          // We shouldn't show weight column here.
+          unset($row['weight']);
           foreach ($row as $col_key => $cell) {
             $tabledata[$row_key][$col_key] = [
               'data' => empty($table->format) ? $cell : check_markup($cell, $table->format),
diff --git a/src/Plugin/Field/FieldType/TablefieldItem.php b/src/Plugin/Field/FieldType/TablefieldItem.php
index 079981e..7f2caec 100644
--- a/src/Plugin/Field/FieldType/TablefieldItem.php
+++ b/src/Plugin/Field/FieldType/TablefieldItem.php
@@ -175,6 +175,11 @@ class TablefieldItem extends FieldItemBase {
       unset($values['value']['caption']);
       $values['rebuild']['rows'] = isset($values['value']) ? count($values['value']) : 0;
       $values['rebuild']['cols'] = isset($values['value'][0]) ? count($values['value'][0]) : 0;
+
+      // Decrement amount of cols if there is a weight column.
+      if (isset($values['value'][0]['weight'])) {
+        $values['rebuild']['cols']--;
+      }
     }
 
     if (isset($values['caption'])) {
