diff --git a/modules/paragraphs_library/paragraphs_library.module b/modules/paragraphs_library/paragraphs_library.module
index 486776b..41b0d75 100644
--- a/modules/paragraphs_library/paragraphs_library.module
+++ b/modules/paragraphs_library/paragraphs_library.module
@@ -5,6 +5,102 @@
  * Main module file for the Paragraphs Library module.
  */
 
+use \Drupal\paragraphs_library\Entity\LibraryItem;
+use \Drupal\Component\Utility\NestedArray;
+use \Drupal\Core\Field\WidgetBase;
+use \Drupal\Core\Form\FormStateInterface;
+use \Drupal\paragraphs\Entity\Paragraph;
+use \Drupal\paragraphs\ParagraphInterface;
+
+/**
+ * Implements hook_field_widget_form_alter().
+ */
+function paragraphs_library_field_widget_form_alter(&$element, FormStateInterface $form_state, $context) {
+  $field_definition = $context['items']->getFieldDefinition();
+  $target_type = $field_definition->getSetting('target_type');
+  if ($target_type) {
+    $entity_type = \Drupal::entityTypeManager()->getDefinition($target_type);
+
+    // Add the "Convert to library item" option only to paragraphs.
+    if ($entity_type && $entity_type->isSubclassOf(ParagraphInterface::class)) {
+      $parents = $element['#field_parents'];
+      $field_name = $field_definition->getName();
+      $widget_state = WidgetBase::getWidgetState($parents, $field_name, $form_state);
+
+      // Don't allow conversion of library items.
+      $paragraphs_entity = isset($widget_state['paragraphs'][$context['delta']])
+        ? $widget_state['paragraphs'][$context['delta']]['entity'] : FALSE;
+      if ($paragraphs_entity && $paragraphs_entity->bundle() != 'from_library') {
+        $id_prefix = implode('-', array_merge($parents, array($field_name, $context['delta'])));
+
+        $element['top']['links']['make_library_item'] = [
+          '#type' => 'submit',
+          '#value' => t('Convert to library item'),
+          '#name' => strtr($id_prefix, '-', '_') . '_make_library_item',
+          '#weight' => 503,
+          '#submit' => ['make_library_item_submit'],
+          '#limit_validation_errors' => [
+            array_merge($parents, [$field_name, 'add_more']),
+          ],
+          '#delta' => $context['delta'],
+          '#ajax' => [
+            'callback' => [
+              '\Drupal\paragraphs\Plugin\Field\FieldWidget\ParagraphsWidget',
+              'itemAjax',
+            ],
+            'wrapper' => $widget_state['ajax_wrapper_id'],
+            'effect' => 'fade',
+          ],
+          '#access' => $paragraphs_entity->access('update'),
+          '#prefix' => '<li class="make-library-item">',
+          '#suffix' => '</li>',
+        ];
+      }
+    }
+  }
+}
+
+/**
+ * Make library item submit callback.
+ *
+ * @param array $form
+ *   The element form array.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ *   The form state object.
+ */
+function make_library_item_submit(array $form, FormStateInterface $form_state) {
+  $button = $form_state->getTriggeringElement();
+  // Go one level up in the form, to the widgets container.
+  $element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -4));
+  $field_name = $element['#field_name'];
+  $parents = $element['#field_parents'];
+
+  // Inserting new element in the array.
+  $widget_state = WidgetBase::getWidgetState($parents, $field_name, $form_state);
+  $delta = $button['#delta'];
+  $widget_state['items_count'];
+  $widget_state['real_item_count']++;
+  $widget_state['original_deltas'] = array_merge($widget_state['original_deltas'], ['1' => 1]);
+
+  $library_item = LibraryItem::createFromParagraph($widget_state['paragraphs'][$delta]['entity']);
+  $library_item->save();
+
+  // Replace this paragraph with a library reference one.
+  $paragraph_item = [
+    'entity' => Paragraph::create([
+      'type' => 'from_library',
+      'field_reusable_paragraph' => $library_item,
+    ]),
+    'display' => $widget_state['paragraphs'][$delta]['display'],
+    'mode' => 'edit',
+  ];
+
+
+  $widget_state['paragraphs'][$delta] = $paragraph_item;
+  WidgetBase::setWidgetState($parents, $field_name, $form_state, $widget_state);
+  $form_state->setRebuild();
+}
+
 /**
  * Implements hook_preprocess_HOOK().
  */
@@ -17,4 +113,5 @@ function paragraphs_library_preprocess_paragraph(&$variables) {
     // This will remove all fields other then field_reusable_paragraph.
     $variables['content'] = $view_builder->build($library_item_render_array)['paragraphs'];
   }
+
 }
diff --git a/modules/paragraphs_library/src/Entity/LibraryItem.php b/modules/paragraphs_library/src/Entity/LibraryItem.php
index 116c580..f94f7e0 100644
--- a/modules/paragraphs_library/src/Entity/LibraryItem.php
+++ b/modules/paragraphs_library/src/Entity/LibraryItem.php
@@ -2,9 +2,11 @@
 
 namespace Drupal\paragraphs_library\Entity;
 
+use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\paragraphs\ParagraphInterface;
 use Drupal\paragraphs_library\LibraryItemInterface;
 
 /**
@@ -95,4 +97,16 @@ class LibraryItem extends ContentEntityBase implements LibraryItemInterface {
     return $fields;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function createFromParagraph(ParagraphInterface $paragraph) {
+    $library_item = static::create([
+      'label' => $paragraph->label() ?: t('Paragraphs library item placeholder @date', ['@date' => (new DrupalDateTime())->__toString()]),
+      'paragraphs' => $paragraph,
+    ]);
+
+    return $library_item;
+  }
+
 }
diff --git a/modules/paragraphs_library/src/LibraryItemInterface.php b/modules/paragraphs_library/src/LibraryItemInterface.php
index 97e8277..099b25e 100644
--- a/modules/paragraphs_library/src/LibraryItemInterface.php
+++ b/modules/paragraphs_library/src/LibraryItemInterface.php
@@ -3,8 +3,22 @@
 namespace Drupal\paragraphs_library;
 
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\paragraphs\ParagraphInterface;
 
 /**
  * Provides an interface defining a paragraphs entity.
  */
-interface LibraryItemInterface extends ContentEntityInterface { }
+interface LibraryItemInterface extends ContentEntityInterface {
+
+  /**
+   * Creates a library entity from a paragraph entity.
+   *
+   * @param \Drupal\paragraphs\ParagraphInterface $paragraph
+   *   The paragraph entity.
+   *
+   * @return \Drupal\paragraphs_library\LibraryItemInterface
+   *   The library item entity.
+   */
+  public static function createFromParagraph(ParagraphInterface $paragraph);
+
+}
diff --git a/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php b/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php
index b1a2899..ad8675c 100644
--- a/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php
+++ b/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php
@@ -20,13 +20,24 @@ class ParagraphsLibraryItemTest extends ParagraphsExperimentalTestBase {
    *
    * @var array
    */
-  public static $modules = ['views', 'paragraphs_library'];
+  public static $modules = [
+    'views',
+    'paragraphs_library',
+    'paragraphs_collection_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->addParagraphedContentType('paragraphed_test', 'field_paragraphs');
+  }
 
   /**
    * Tests the library items workflow for paragraphs.
    */
   public function testLibraryItems() {
-    $this->addParagraphedContentType('paragraphed_test', 'field_paragraphs');
     $this->loginAsAdmin(['create paragraphed_test content', 'edit any paragraphed_test content', 'administer paragraphs library']);
 
     // Add a Paragraph type with a text field.
@@ -107,4 +118,29 @@ class ParagraphsLibraryItemTest extends ParagraphsExperimentalTestBase {
     $this->assertText('re_usable_text_new');
   }
 
+  /**
+   * Tests converting paragraph item into library.
+   */
+  public function testConvertParagraphIntoLibrary() {
+    $this->loginAsAdmin([
+      'create paragraphed_test content',
+      'edit any paragraphed_test content',
+      'administer paragraphs library',
+    ]);
+    $this->drupalGet('node/add/paragraphed_test');
+    $this->drupalPostForm(NULL, NULL, 'Add Text');
+    $edit = [
+      'field_paragraphs[0][subform][field_text_demo][0][value]' => 'Random text for testing converting into library.',
+    ];
+    $this->drupalPostAjaxForm(NULL, $edit, 'field_paragraphs_0_make_library_item');
+    $this->assertText('From library');
+    $this->assertText('Reusable paragraph');
+    $edit = [
+      'title[0][value]' => 'TextParagraphs',
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save and publish');
+    $this->drupalGet('node/2');
+    $this->assertText('Random text for testing converting into library.');
+  }
+
 }
