diff --git a/modules/paragraphs_library/paragraphs_library.module b/modules/paragraphs_library/paragraphs_library.module
index e2ea38d..79dbcaa 100644
--- a/modules/paragraphs_library/paragraphs_library.module
+++ b/modules/paragraphs_library/paragraphs_library.module
@@ -7,6 +7,96 @@
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\views\ViewExecutable;
+use \Drupal\paragraphs_library\Entity\LibraryItem;
+use \Drupal\Component\Utility\NestedArray;
+use \Drupal\Core\Field\WidgetBase;
+use \Drupal\paragraphs\Entity\Paragraph;
+
+/**
+ * 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) {
+    // Add the "Convert to library item" option only to paragraphs.
+    if ($context['widget']->getPluginId() == 'paragraphs') {
+      $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.
+      $paragraph = $widget_state['paragraphs'][$context['delta']];
+      $paragraphs_entity = isset($paragraph) ? $paragraph['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('Add to library'),
+          '#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().
@@ -21,6 +111,7 @@ 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..f5d9e6b 100644
--- a/modules/paragraphs_library/src/Entity/LibraryItem.php
+++ b/modules/paragraphs_library/src/Entity/LibraryItem.php
@@ -2,9 +2,12 @@
 
 namespace Drupal\paragraphs_library\Entity;
 
+use Drupal\Component\Utility\Unicode;
+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 +98,23 @@ class LibraryItem extends ContentEntityBase implements LibraryItemInterface {
     return $fields;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function createFromParagraph(ParagraphInterface $paragraph) {
+    $summary = $paragraph->getSummary();
+
+    if (strlen($summary) > 50) {
+      $summary = Unicode::truncate($summary, 50);
+    }
+
+    $label = $paragraph->getType() . ': ' . $summary;
+    $library_item = static::create([
+      'label' => $label,
+      '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 ca15958..8c0a8f5 100644
--- a/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php
+++ b/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php
@@ -20,20 +20,31 @@ class ParagraphsLibraryItemTest extends ParagraphsExperimentalTestBase {
    *
    * @var array
    */
-  public static $modules = ['views', 'paragraphs_library'];
+  public static $modules = [
+    'views',
+    'paragraphs_library',
+    'paragraphs_collection_test',
+    'link',
+  ];
+
+  /**
+   * {@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.
     $paragraph_type = 'text_paragraph';
     $this->addParagraphsType($paragraph_type);
     static::fieldUIAddNewField('admin/structure/paragraphs_type/' . $paragraph_type, 'text', 'Text', 'text_long', [], []);
-
     // Add a new library item.
     $this->drupalGet('admin/content/paragraphs');
     $this->clickLink('Add library item');
@@ -138,4 +149,29 @@ class ParagraphsLibraryItemTest extends ParagraphsExperimentalTestBase {
     $this->assertEqual($element[0]->p->__toString(), 're_usable_text_new', 'Paragraphs summary available.');
   }
 
+  /**
+   * 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][paragraphs_text][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/1');
+    $this->assertText('Random text for testing converting into library.');
+  }
+
 }
