diff --git a/app/Uploads/Attachment.php b/app/Uploads/Attachment.php
index 6e55003a9..3367594ef 100644
--- a/app/Uploads/Attachment.php
+++ b/app/Uploads/Attachment.php
@@ -38,4 +38,14 @@ class Attachment extends Ownable
         }
         return url('/attachments/' . $this->id);
     }
+
+    public function htmlLink(): string
+    {
+        return '<a target="_blank" href="'.e($this->getUrl()).'">'.e($this->name).'</a>';
+    }
+
+    public function markdownLink(): string
+    {
+
+    }
 }
diff --git a/resources/js/components/sortable-list.js b/resources/js/components/sortable-list.js
index d2b39ff95..db50352b8 100644
--- a/resources/js/components/sortable-list.js
+++ b/resources/js/components/sortable-list.js
@@ -2,6 +2,11 @@ import Sortable from "sortablejs";
 
 /**
  * SortableList
+ *
+ * Can have data set on the dragged items by setting a 'data-drag-content' attribute.
+ * This attribute must contain JSON where the keys are content types and the values are
+ * the data to set on the data-transfer.
+ *
  * @extends {Component}
  */
 class SortableList {
@@ -14,7 +19,21 @@ class SortableList {
             animation: 150,
             onSort: () => {
                 this.$emit('sort', {ids: sortable.toArray()});
-            }
+            },
+            setData(dataTransferItem, dragEl) {
+                console.log('cat');
+                const jsonContent = dragEl.getAttribute('data-drag-content');
+                if (jsonContent) {
+                    const contentByType = JSON.parse(jsonContent);
+                    dataTransferItem.setData('bookstack/json', jsonContent);
+                    for (const [type, content] of Object.entries(contentByType)) {
+                        dataTransferItem.setData(type, content);
+                    }
+                }
+            },
+            revertOnSpill: true,
+            dropBubble: true,
+            dragoverBubble: false,
         });
     }
 }
diff --git a/resources/js/components/wysiwyg-editor.js b/resources/js/components/wysiwyg-editor.js
index 98a5e95c4..92a678fbd 100644
--- a/resources/js/components/wysiwyg-editor.js
+++ b/resources/js/components/wysiwyg-editor.js
@@ -639,6 +639,7 @@ class WysiwygEditor {
                 });
 
                 editor.on('drop', function (event) {
+                    console.log('drop')
                     let dom = editor.dom,
                         rng = tinymce.dom.RangeUtils.getCaretRangeFromPoint(event.clientX, event.clientY, editor.getDoc());
 
diff --git a/resources/views/attachments/manager-list.blade.php b/resources/views/attachments/manager-list.blade.php
index 06ab5f912..671864a3b 100644
--- a/resources/views/attachments/manager-list.blade.php
+++ b/resources/views/attachments/manager-list.blade.php
@@ -3,6 +3,7 @@
         <div component="ajax-delete-row"
              option:ajax-delete-row:url="{{ url('/attachments/' . $attachment->id) }}"
              data-id="{{ $attachment->id }}"
+             data-drag-content="{{ json_encode(['text/html' => $attachment->htmlLink()]) }}"
              class="card drag-card">
             <div class="handle">@icon('grip')</div>
             <div class="py-s">