diff --git a/css/paragraphs.modal.css b/css/paragraphs.modal.css
index 22a368d..121aa34 100644
--- a/css/paragraphs.modal.css
+++ b/css/paragraphs.modal.css
@@ -17,7 +17,17 @@ ul.paragraphs-add-dialog-list input.field-add-more-submit {
   padding: 5px;
 }
 
-.paragraphs-add-dialog-row input {
+.paragraphs-add-dialog-row button {
   width: 100%;
   min-width: 200px;
 }
+
+input.paragraph-type-add-modal-button , .widget {
+ max-width: 30px;
+ padding-left: 8px;
+ padding-right: 10px;
+}
+
+.adminimal .button , .button{
+ transition: all 1s !important;
+}
diff --git a/css/paragraphs.modal.scss b/css/paragraphs.modal.scss
index 0da0fe1..87fae2c 100644
--- a/css/paragraphs.modal.scss
+++ b/css/paragraphs.modal.scss
@@ -16,8 +16,18 @@ ul.paragraphs-add-dialog-list {
 .paragraphs-add-dialog-row {
   padding: 5px;
 
-  input {
+  button {
     width: 100%;
     min-width: 200px;
   }
 }
+
+input.paragraph-type-add-modal-button , .widget {
+ max-width: 30px;
+ padding-left: 8px;
+ padding-right: 10px;
+}
+
+.adminimal .button , .button{
+ transition: all 1s !important;
+}
diff --git a/css/paragraphs.widget.css b/css/paragraphs.widget.css
index 4670cfa..cac2f6f 100644
--- a/css/paragraphs.widget.css
+++ b/css/paragraphs.widget.css
@@ -18,10 +18,6 @@
   margin-bottom: 10px;
 }
 
-.js .field--widget-paragraphs td {
-  padding: 10px 0;
-}
-
 .js .field--widget-paragraphs .field-multiple-drag {
   vertical-align: top;
 }
@@ -96,9 +92,9 @@
     width: 100%;
     padding: 10px 0;
     height: 30px;
-    margin-top: -1.8em;
-    margin-bottom: -0.2em;
-    display: inline;
+    text-align: center;
+    position: relative;
+    top: -30px;
   }
 }
 
@@ -147,3 +143,15 @@
   float: right;
   margin-right: -10px;
 }
+
+#first_button_wrapper {
+  text-align: left;
+  margin-left: 0px;
+  top: 0px;
+}
+
+[dir="rtl"] #first_button_wrapper {
+  text-align: right;
+  margin-right: 0px;
+  top: 0px;
+}
+
diff --git a/css/paragraphs.widget.scss b/css/paragraphs.widget.scss
index 2db7d2a..cac1728 100644
--- a/css/paragraphs.widget.scss
+++ b/css/paragraphs.widget.scss
@@ -32,10 +32,6 @@
       margin-bottom: 10px;
     }
 
-    td { // stylelint-disable-line selector-no-type
-      padding: 10px 0;
-    }
-
     .field-multiple-drag {
       vertical-align: top;
     }
@@ -105,12 +101,11 @@
 
   @media screen and (min-width: 600px) {
     .paragraph-type-add-modal {
-      width: 100%;
       padding: 10px 0;
       height: 30px;
-      margin-top: -1.8em;
-      margin-bottom: -0.2em;
-      display: inline;
+      text-align:  center;
+      position: relative;
+      top: -30px;
     }
   }
 
@@ -160,3 +155,15 @@
   float: right;
   margin-right: -10px;
 }
+
+#first_button_wrapper {
+  text-align: left;
+  margin-left: 0px;
+  top: 0px;
+}
+
+[dir="rtl"] #first_button_wrapper {
+  text-align: right;
+  margin-right: 0px;
+  top: 0px;
+}
diff --git a/js/paragraphs.modal.js b/js/paragraphs.modal.js
index 41fd515..2cccc86 100644
--- a/js/paragraphs.modal.js
+++ b/js/paragraphs.modal.js
@@ -8,6 +8,104 @@
   'use strict';
 
   /**
+   * Handling of hover state for add buttons.
+   *
+   * @type {Object}
+   */
+  Drupal.behaviors.modalHover = {
+    attach: function (context) {
+      $("input[name*='first_button_add_modal']").css('max-width','99em');
+      $("input[name*='first_button_add_modal']").parent().attr("id", "first_button_wrapper");
+      $('.paragraph-type-add-modal-button').hover(
+          function() {
+            if ($(this).attr('name') != 'first_button_add_modal')
+                $(this).css('max-width','99em');
+          },
+          function() {
+            if ($(this).attr('name') != 'first_button_add_modal') {
+              $(this).css({
+                'max-width': '30px',
+                'padding-left': '8px',
+                'padding-right': '10px',
+                });
+            }
+          }
+      );
+    }
+  }
+
+  /**
+   * Method to clone template and apply data on it.
+   *
+   * @param {Object} $template
+   *   jQuery element for template element used for cloning.
+   * @param {Object} data
+   *   Data object used to apply on template.
+   *
+   * @return {Object}
+   *   Returns cloned template with applied data on it.
+   *
+   * @private
+   */
+  var _templateClone = function ($template, data) {
+    var $templateClone = $template
+      .clone()
+      .appendTo($template.parent());
+
+    // Adjust all CSS classes with suffix "-template".
+    var classEnding = '-template';
+    $.each(
+      $templateClone.attr('class').toString().split(' '),
+      function (index, className) {
+        if (className.substr(-classEnding.length) === classEnding) {
+          var newClassName = className.substr(0, className.length - classEnding.length);
+          $templateClone
+            .removeClass(className)
+            .toggleClass(newClassName);
+        }
+      }
+    );
+
+    _templateApplyData($templateClone, data);
+
+    return $templateClone;
+  };
+
+  /**
+   * Method to apply data on template element.
+   *
+   * For more information about template please take a look at documentation
+   * provided in: templates/paragraphs-add-dialog.html.twig
+   *
+   * @param {Object} $templateElement
+   *   jQuery element for template element.
+   * @param {Object} data
+   *   Data object used to apply on template.
+   *
+   * @private
+   */
+  var _templateApplyData = function ($templateElement, data) {
+    $.each(data, function (name, value) {
+      var selector = '[data-' + name + ']';
+
+      $templateElement.find(selector)
+        .addBack(selector)
+        .each(function (index, childElement) {
+          var $child = $(childElement);
+          var attrName = $child.attr('data-' + name);
+          $child.removeAttr('data-' + name);
+
+          if (attrName === 'content') {
+            $child.text(value);
+          }
+          else {
+            $child.attr(attrName, value);
+          }
+        });
+    });
+  };
+
+  /**
    * Click handler for click "Add" button between paragraphs.
    *
    * @type {Object}
@@ -18,12 +116,42 @@
         .once('add-click-handler')
         .on('click', function (event) {
           var $button = $(this);
-          var $add_more_wrapper = $button.parent().siblings('.paragraphs-add-dialog');
-          Drupal.paragraphsAddModal.openDialog($add_more_wrapper);
 
           // Stop default execution of click event.
           event.preventDefault();
           event.stopPropagation();
+          // Global data for dialog template.
+          // delta: '' -> means that paragraph will be added to end of list.
+          var config = {delta: ''};
+
+          // Get wrapper of elements used for submitting of add paragraph
+          // functionality. It's also used as context for opening of dialog.
+          var $addMoreWrapper;
+          if ($button.attr('name') === 'first_button_add_modal') {
+            // Case for last button in list (of for empty list).
+            $addMoreWrapper = $button
+              .parent()
+              .siblings('.js-hide')
+              .parent();
+          }
+          else {
+            // For button between paragraphs.
+            $addMoreWrapper = $button
+              .closest('table')
+              .parent()
+              .find('.paragraphs-add-dialog-template')
+              .parent();
+
+            // Set delta to correct position in list of paragraphs.
+            config.delta = $button.closest('tr').index();
+          }
+
+          // Get types from ComboBox.
+          var paragraphTypes = Drupal.paragraphsAddModal.getParagraphTypes($addMoreWrapper.find('[name$="[add_more_select]"]'));
+
+          // Open dialog in context of "add_more" element, with provided
+          // configuration and list of paragraph types.
+          Drupal.paragraphsAddModal.openDialog($addMoreWrapper, config, paragraphTypes);
         });
     }
   };
@@ -36,37 +164,111 @@
   Drupal.paragraphsAddModal = {};
 
   /**
+   * Fetch list of paragraph types from options provided in combobox.
+   *
+   * @param {Object} $typeComboBox
+   *   jQuery element of combobox with list of available paragraph types.
+   *
+   * @return {Array}
+   *   List of paragraph type objects with type and it's name.
+   */
+  Drupal.paragraphsAddModal.getParagraphTypes = function ($typeComboBox) {
+    var paragraphTypes = [];
+
+    $typeComboBox.find('option').each(function (index, optionElement) {
+      var $option = $(optionElement);
+
+      paragraphTypes.push(
+        {
+          'type': $option.attr('value'),
+          'type-name': $option.text()
+        }
+      );
+    });
+
+    return paragraphTypes;
+  };
+
+  /**
    * Open modal dialog for adding new paragraph in list.
    *
    * @param {Object} $context
    *   jQuery element of form wrapper used to submit request for adding new
    *   paragraph to list. Wrapper also contains dialog template.
    */
-  Drupal.paragraphsAddModal.openDialog = function ($context) {
+  Drupal.paragraphsAddModal.openDialog = function ($context, config, paragraphTypes) {
 
-    $context.dialog({
+    // Get dialog template and apply data on it.
+    var $dialogTemplate = $('.paragraphs-add-dialog-template', $context);
+    var $dialog = _templateClone($dialogTemplate, config);
+
+   // Get row template and duplicate it for every paragraph type.
+    var $rowTemplate = $dialog.find('.paragraphs-add-dialog-row-template');
+    for (var i = 0; i < paragraphTypes.length; i++) {
+      _templateClone($rowTemplate, paragraphTypes[i]);
+    }
+    $rowTemplate.remove();
+
+    // Open dialog after data is applied on template.
+    $dialog.dialog({
       modal: true,
       resizable: false,
-      title: drupalSettings.paragraphs.title,
       width: 'auto',
       close: function () {
         var $dialog = $(this);
 
         // Destroy dialog object.
         $dialog.dialog('destroy');
+        // Remove created html element for dialog.
+        $dialog.remove();
       }
     });
 
     // Close the dialog after a button was clicked.
-    $('.field-add-more-submit', $context)
-      .each(function () {
-      // Use mousedown event, because we are using ajax in the modal add mode
-      // which explicitly suppresses the click event.
-      $(this).on('mousedown', function () {
+    // Attach behaviours to dialog action triggering elements.
+    $('.paragraphs-add-type-trigger-element', $dialog)
+      .once('add-click-handler')
+      .on('mousedown', function (event) {
         var $this = $(this);
+        // Stop default execution of click event.
+        event.preventDefault();
+        event.stopPropagation();
+
+        Drupal.paragraphsAddModal.setValues(
+          $context,
+          {
+            add_more_select: $this.attr('data-type'),
+            add_more_delta: $this.attr('data-delta')
+          }
+        );
+
+        // Close dialog afterwards.
         $this.closest('div.ui-dialog-content').dialog('close');
       });
-    });
   };
 
+  /**
+   * Method to set hidden fields and trigger adding of paragraph.
+   *
+   * @param {Object} $context
+   *   Jquery object containing element where form for submitting exists.
+   * @param {Object} options
+   *   Object with key value pair, where key is name of field that should be set
+   *   and value is value for that field.
+   */
+  Drupal.paragraphsAddModal.setValues = function ($context, options) {
+    var $submitButton = $('.js-hide input[name$="_add_more"]', $context);
+    var $wrapper = $submitButton.parent();
+
+    // Set all field values defined in options.
+    $.each(options, function (fieldName, fieldValue) {
+      var $field = $wrapper.find('[name$="[' + fieldName + ']"]');
+
+      if ($field) {
+        $field.val(fieldValue);
+      }
+    });
+    // Trigger ajax call on add button.
+    $submitButton.trigger('mousedown');
+   };
 }(jQuery, Drupal, drupalSettings));
diff --git a/src/Plugin/Field/FieldWidget/ParagraphsWidget.php b/src/Plugin/Field/FieldWidget/ParagraphsWidget.php
index e8eaeb2..954ea45 100644
--- a/src/Plugin/Field/FieldWidget/ParagraphsWidget.php
+++ b/src/Plugin/Field/FieldWidget/ParagraphsWidget.php
@@ -259,17 +259,6 @@ class ParagraphsWidget extends WidgetBase {
         }
       }
     }
-    elseif (isset($widget_state['selected_bundle'])) {
-
-      $entity_type = $entity_manager->getDefinition($target_type);
-      $bundle_key = $entity_type->getKey('bundle');
-
-      $paragraphs_entity = $entity_manager->getStorage($target_type)->create(array(
-        $bundle_key => $widget_state['selected_bundle'],
-      ));
-
-      $item_mode = 'edit';
-    }
 
     if ($item_mode == 'closed') {
       // Validate closed paragraphs and expand if needed.
@@ -672,6 +661,11 @@ class ParagraphsWidget extends WidgetBase {
       $widget_state['paragraphs'][$delta]['display'] = $display;
       $widget_state['paragraphs'][$delta]['mode'] = $item_mode;
 
+      //Display the in between add button
+      if ($this->getSetting('add_mode') == 'modal') {
+        $this->buildInBetweenAddButton($element, $id_prefix);
+      }
+
       static::setWidgetState($parents, $field_name, $form_state, $widget_state);
     }
     else {
@@ -682,6 +676,47 @@ class ParagraphsWidget extends WidgetBase {
   }
 
   /**
+   * Builds an add paragraph button between paragraphs for opening of modal.
+   *
+   * @param array $element
+   *   Render element.
+   * @param string $id_prefix
+   *   Prefix.
+   */
+  protected function buildInBetweenAddButton(array &$element, $id_prefix) {
+    if (empty($this->uuid)) {
+      $this->uuid = \Drupal::service('uuid')->generate();
+    }
+
+    $element[$id_prefix . '_area'] = [
+      '#type' => 'container',
+      '#attributes' => [
+        'class' => [
+          'paragraph-type-add-modal',
+          'first-button',
+        ],
+      ],
+      '#access' => !$this->isTranslating,
+      '#weight' => -2000,
+    ];
+
+    $element[$id_prefix . '_area']['add_more'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('+   Add @title', ['@title' => $this->getSetting('title')]),
+      '#name' => strtr($id_prefix, '-', '_') . '_add_modal',
+      '#attributes' => [
+        'class' => [
+          'paragraph-type-add-modal-button',
+          'button',
+          'js-show',
+        ],
+      ],
+    ];
+
+    $element['#attached']['library'][] = 'paragraphs/drupal.paragraphs.modal';
+  }
+
+  /**
    * Builds an add paragraph button for opening of modal form.
    *
    * @param array $element
@@ -976,7 +1011,7 @@ class ParagraphsWidget extends WidgetBase {
       return $add_more_elements;
     }
 
-    if (in_array($this->getSetting('add_mode'), ['button', 'dropdown', 'modal'])) {
+    if (in_array($this->getSetting('add_mode'), ['button', 'dropdown'])) {
       return $this->buildButtonsAddMode();
     }
 
@@ -1160,7 +1195,22 @@ class ParagraphsWidget extends WidgetBase {
     $field_name = $this->fieldDefinition->getName();
     $field_title = $this->fieldDefinition->getLabel();
     $setting_title = $this->getSetting('title');
-    $add_more_elements['add_more_select'] = [
+    $add_more_elements = [];
+
+    // Append template for modal add paragraph dialog.
+    $add_more_elements['paragraphs_add_dialog_template'] = $this->getModalAddDialogTemplate();
+    // Add button at end of list, when modal dialog is used to add paragraphs.
+    if ($this->getSetting('add_mode') == 'modal') {
+      $this->buildInBetweenAddButton($add_more_elements, 'first-button');
+
+      // Selection form elements.
+      $selection_form_elements['add_more_delta'] = [
+        '#type' => 'hidden',
+        '#title' => 'Delta',
+      ];
+    }
+
+    $selection_form_elements['add_more_select'] = [
       '#type' => 'select',
       '#options' => $this->getAccessibleOptions(),
       '#title' => $this->t('@title type', ['@title' => $setting_title]),
@@ -1173,7 +1223,7 @@ class ParagraphsWidget extends WidgetBase {
       $text = $this->t('Add another @title', ['@title' => $setting_title]);
     }
 
-    $add_more_elements['add_more_button'] = [
+    $selection_form_elements['add_more_button'] = [
       '#type' => 'submit',
       '#name' => strtr($this->fieldIdPrefix, '-', '_') . '_add_more',
       '#value' => $text,
@@ -1187,7 +1237,17 @@ class ParagraphsWidget extends WidgetBase {
       ],
     ];
 
-    $add_more_elements['add_more_button']['#suffix'] = $this->t(' to %type', ['%type' => $field_title]);
+    $selection_form_elements['add_more_button']['#suffix'] = $this->t(' to %type', ['%type' => $title]);
+
+    // If we have a modal, the selection form should be hidden.
+    if ($this->getSetting('add_mode') == 'modal') {
+      $add_more_elements['selection_form'] = $selection_form_elements;
+      $add_more_elements['selection_form']['#type'] = 'container';
+      $add_more_elements['selection_form']['#attributes']['class'][] = 'js-hide';
+    }
+    else {
+      $add_more_elements = $selection_form_elements;
+    }
     return $add_more_elements;
   }
 
@@ -1199,6 +1259,11 @@ class ParagraphsWidget extends WidgetBase {
     // Go one level up in the form, to the widgets container.
     $element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -2));
 
+    // The structure of modal is different.
+    if (!isset($element['#field_name'])) {
+      $element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -3));
+    }
+
     // Add a DIV around the delta receiving the Ajax effect.
     $delta = $element['#max_delta'];
     $element[$delta]['#prefix'] = '<div class="ajax-new-content">' . (isset($element[$delta]['#prefix']) ? $element[$delta]['#prefix'] : '');
@@ -1215,6 +1280,10 @@ class ParagraphsWidget extends WidgetBase {
 
     // Go one level up in the form, to the widgets container.
     $element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -2));
+    // The structure of modal is different.
+    if (!isset($element['#field_name'])) {
+      $element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -3));
+    }
     $field_name = $element['#field_name'];
     $parents = $element['#field_parents'];
 
@@ -1223,21 +1292,120 @@ class ParagraphsWidget extends WidgetBase {
 
     if ($widget_state['real_item_count'] < $element['#cardinality'] || $element['#cardinality'] == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
       $widget_state['items_count']++;
+      $widget_state['real_item_count']++;
     }
 
+    $position = $widget_state['real_item_count'] - 1;
     if (isset($button['#bundle_machine_name'])) {
       $widget_state['selected_bundle'] = $button['#bundle_machine_name'];
     }
+    elseif ($widget_state['add_mode'] == 'modal') {
+      $widget_state['selected_bundle'] = $element['add_more']['selection_form']['add_more_select']['#value'];
+      if ($element['add_more']['selection_form']['add_more_delta']['#value'] !== "") {
+        $position = $element['add_more']['selection_form']['add_more_delta']['#value'];
+      }
+    }
     else {
       $widget_state['selected_bundle'] = $element['add_more']['add_more_select']['#value'];
     }
 
+    //Create new paragraph entity.
+    $entity_type = \Drupal::entityTypeManager()->getDefinition('paragraph');
+    $bundle_key = $entity_type->getKey('bundle');
+
+    $paragraphs_entity = \Drupal::entityTypeManager()->getStorage('paragraph')->create(array(
+      $bundle_key => $widget_state['selected_bundle'],
+    ));
+
+    $paragraph = [
+      'entity' => $paragraphs_entity,
+      'mode' => 'edit',
+    ];
+
+    if (isset($widget_state['paragraphs'][$position])) {
+      $paragraph['display'] = $widget_state['paragraphs'][$position]['display'];
+    }
+
+    // Add paragraph to the widget state.
+    // This also creates it, when it doesn't exist.
+    $widget_state['paragraphs'][] = $paragraph;
+
+    // If we use a modal, we have to place the new paragraph
+    // in the correct position.
+    if ($widget_state['add_mode'] == 'modal') {
+      // Clean form_state.
+      $user_input = $user_input_save = $form_state->getUserInput();
+
+      // Temporarily remove 'add_more' from array.
+      unset($user_input[$field_name]['add_more']);
+
+      self::normalizeWeights($user_input[$field_name], $position);
+
+      // It is important, that the key maps with the one from $widget_state
+      // The weight handles the position.
+      $key = count($widget_state['paragraphs']) - 1;
+      $item[$key] = [
+        'subform' => [],
+        '_weight' => $position,
+      ];
+
+      $user_input[$field_name] += $item;
+
+      // Add back 'add_more'.
+      $user_input[$field_name]['add_more'] = $user_input_save[$field_name];
+
+      $form_state->setUserInput($user_input);
+    }
+
     static::setWidgetState($parents, $field_name, $form_state, $widget_state);
 
     $form_state->setRebuild();
   }
 
   /**
+   * This resets the weights, ascending, starting from 0.
+   *
+   * It keeps the indices.
+   *
+   * E.g. [-6, -5, -4] will become [0, 1, 2]
+   *
+   * Starting at position, the elements will get weight+1, to make space
+   * for a new element.
+   *
+   * E.g. [-6, -5, -4], position = 1, will become [ 0,  2,  3]
+   *
+   * @param array $array
+   *   The array, which weights should be normalised.
+   * @param int $position
+   *   The position from which on the weights will be increased by 1.
+   */
+  private static function normalizeWeights(array &$array, $position) {
+    $weigth = 0;
+    foreach ($array as &$value) {
+      if ($weigth == $position) {
+        $weigth++;
+      }
+      $value['_weight'] = $weigth;
+      $weigth++;
+    }
+  }
+
+  /**
+   * Returns render array for template of add paragraph modal dialog.
+   *
+   * @return array
+   *   Render array.
+   */
+  protected function getModalAddDialogTemplate() {
+    return [
+      '#theme' => 'paragraphs_add_dialog',
+      '#attached' => [
+        'library' => ['paragraphs/drupal.paragraphs.modal'],
+      ],
+    ];
+  }
+
+  /**
    * Creates a duplicate of the paragraph entity.
    */
   public static function duplicateSubmit(array $form, FormStateInterface $form_state) {
diff --git a/templates/paragraphs-add-dialog.html.twig b/templates/paragraphs-add-dialog.html.twig
index 9706712..edc9339 100644
--- a/templates/paragraphs-add-dialog.html.twig
+++ b/templates/paragraphs-add-dialog.html.twig
@@ -11,13 +11,11 @@
  * @ingroup themeable
  */
 #}
-{{ add }}
-<div class="paragraphs-add-dialog js-hide">
-    <ul class="paragraphs-add-dialog-list">
-    {% for button in buttons %}
-      <li class="paragraphs-add-dialog-row">
-        {{ button }}
-      </li>
-    {% endfor %}
+<div class="paragraphs-add-dialog-template" title="{{ 'Add paragraph'|t }}" style="display: none;">
+	<ul class="paragraphs-add-dialog-list">
+		<li class="paragraphs-add-dialog-row-template">
+      <button class="paragraphs-add-type-trigger-element button" data-type-name="content" data-type="data-type"
+                    data-delta="data-delta"></button>
+    </li>
   </ul>
 </div>
