diff --git a/modules/paragraphs_library/paragraphs_library.module b/modules/paragraphs_library/paragraphs_library.module
index e2ea38d..96ae10b 100644
--- a/modules/paragraphs_library/paragraphs_library.module
+++ b/modules/paragraphs_library/paragraphs_library.module
@@ -6,7 +6,88 @@
  */
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\paragraphs\Plugin\Field\FieldWidget\ParagraphsWidget;
 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_paragraph_widget_dropbutton_alter().
+ */
+function paragraphs_library_paragraph_widget_dropbutton_alter(&$links, &$context) {
+  $field_definition = $context['items']->getFieldDefinition();
+  $parents = $context['element']['#field_parents'];
+  $field_name = $field_definition->getName();
+  $widget_state = $context['widget'];
+  // Don't allow conversion of library items.
+  $bundle = isset($context['widget']['selected_bundle']) ? $context['widget']['selected_bundle'] : FALSE;
+  if ($bundle != 'from_library') {
+    $id_prefix = implode('_', array_merge($parents, array($field_name, $context['delta'])));
+    $links['add_to_library'] = [
+      '#type' => 'submit',
+      '#value' => t('Add to library'),
+      '#name' => $id_prefix . '_add_to_library',
+      '#weight' => 503,
+      '#submit' => ['paragraphs_collection_make_library_item_submit'],
+      '#limit_validation_errors' => [
+        array_merge($parents, [$field_name, 'add_to_library']),
+      ],
+      '#delta' => $context['delta'],
+      '#ajax' => [
+        'callback' => [
+          ParagraphsWidget::class,
+          'itemAjax',
+        ],
+        'wrapper' => $widget_state['ajax_wrapper_id'],
+        'effect' => 'fade',
+      ],
+      '#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 paragraphs_collection_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'];
+
+  // Replacing 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().
diff --git a/modules/paragraphs_library/src/Entity/LibraryItem.php b/modules/paragraphs_library/src/Entity/LibraryItem.php
index 116c580..eb32cb4 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,20 @@ class LibraryItem extends ContentEntityBase implements LibraryItemInterface {
     return $fields;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function createFromParagraph(ParagraphInterface $paragraph) {
+    $summary = $paragraph->getSummary();
+    $summary = Unicode::truncate($summary, 50);
+
+    $label = $paragraph->getParagraphType()->label() . ': ' . $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..1557bc4 100644
--- a/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php
+++ b/modules/paragraphs_library/src/Tests/ParagraphsLibraryItemTest.php
@@ -20,13 +20,25 @@ 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.
@@ -138,4 +150,44 @@ 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_add_to_library');
+    $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.');
+
+    // Create library item from existing paragraph item.
+    $this->drupalGet('node/add/paragraphed_test');
+    $this->drupalPostForm(NULL, NULL, 'Add Text');
+    $edit = [
+      'title[0][value]' => 'NodeTitle',
+      'field_paragraphs[0][subform][paragraphs_text][0][value]' => 'Random text for testing converting into library.',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and publish'));
+    $node = $this->getNodeByTitle('NodeTitle');
+    $this->drupalGet('node/' . $node->id() . '/edit');
+    $this->drupalPostAjaxForm(NULL, $edit, 'field_paragraphs_0_add_to_library');
+    $this->drupalGet('/admin/content/paragraphs');
+    $this->assertText('Text');
+    $this->assertText('Random text for testing converting into library.');
+  }
+
 }
