diff --git a/src/dialogs/PreviewUploadOverlay.cpp b/src/dialogs/PreviewUploadOverlay.cpp
index e850c03bccc36d0fa9e72b01c92423cb7b2ca47a..2e95bd9113ecaf2d3af101526eaf36445ff5da19 100644
--- a/src/dialogs/PreviewUploadOverlay.cpp
+++ b/src/dialogs/PreviewUploadOverlay.cpp
@@ -158,6 +158,8 @@ PreviewUploadOverlay::setPreview(const QImage &src, const QString &mime)
 void
 PreviewUploadOverlay::setPreview(const QByteArray data, const QString &mime)
 {
+    nhlog::ui()->info("Pasting {} bytes of data, mimetype {}", data.size(), mime.toStdString());
+
     auto const &split = mime.split('/');
     auto const &type  = split[1];
 
@@ -166,6 +168,11 @@ PreviewUploadOverlay::setPreview(const QByteArray data, const QString &mime)
     filePath_  = "clipboard." + type;
     isImage_   = false;
 
+    if (mime == "image/svg+xml") {
+        isImage_ = true;
+        image_.loadFromData(data_, mediaType_.toStdString().c_str());
+    }
+
     setLabels(type, mime, data_.size());
     init();
 }
diff --git a/src/main.cpp b/src/main.cpp
index cf7e29e63bc63ccb04e8558df6345d9b967a32f8..f6373d2ac9c44b03177cc74ab5ffe8fe8b6b27e2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -176,12 +176,6 @@ main(int argc, char *argv[])
                           100,
                           userdata);
 
-    if (app.isSecondary()) {
-        // open uri in main instance
-        app.sendMessage(matrixUri.toUtf8());
-        return 0;
-    }
-
     QCommandLineParser parser;
     parser.addHelpOption();
     parser.addVersionOption();
@@ -202,6 +196,15 @@ main(int argc, char *argv[])
 
     parser.process(app);
 
+    // This check needs to happen _after_ process(), so that we actually print help for --help when
+    // Nheko is already running.
+    if (app.isSecondary()) {
+        nhlog::ui()->info("Sending Matrix URL to main application: {}", matrixUri.toStdString());
+        // open uri in main instance
+        app.sendMessage(matrixUri.toUtf8());
+        return 0;
+    }
+
     app.setWindowIcon(QIcon::fromTheme("nheko", QIcon{":/logos/nheko.png"}));
 
     http::init();
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index f0c38c84bfadaa857d87d6791c278f0b41741e78..f518248bed1de090790d105ad0c1b5e66a3d9829 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -45,10 +45,8 @@ InputBar::paste(bool fromMouse)
 {
     const QMimeData *md = nullptr;
 
-    if (fromMouse) {
-        if (QGuiApplication::clipboard()->supportsSelection()) {
-            md = QGuiApplication::clipboard()->mimeData(QClipboard::Selection);
-        }
+    if (fromMouse && QGuiApplication::clipboard()->supportsSelection()) {
+        md = QGuiApplication::clipboard()->mimeData(QClipboard::Selection);
     } else {
         md = QGuiApplication::clipboard()->mimeData(QClipboard::Clipboard);
     }
@@ -69,8 +67,12 @@ InputBar::insertMimeData(const QMimeData *md)
     const auto audio   = formats.filter("audio/", Qt::CaseInsensitive);
     const auto video   = formats.filter("video/", Qt::CaseInsensitive);
 
-    if (!image.empty() && md->hasImage()) {
-        showPreview(*md, "", image);
+    if (md->hasImage()) {
+        if (formats.contains("image/svg+xml", Qt::CaseInsensitive)) {
+            showPreview(*md, "", QStringList("image/svg+xml"));
+        } else {
+            showPreview(*md, "", image);
+        }
     } else if (!audio.empty()) {
         showPreview(*md, "", audio);
     } else if (!video.empty()) {
@@ -653,9 +655,16 @@ InputBar::showPreview(const QMimeData &source, QString path, const QStringList &
       new dialogs::PreviewUploadOverlay(ChatPage::instance());
     previewDialog_->setAttribute(Qt::WA_DeleteOnClose);
 
-    if (source.hasImage())
-        previewDialog_->setPreview(qvariant_cast<QImage>(source.imageData()), formats.front());
-    else if (!path.isEmpty())
+    // Force SVG to _not_ be handled as an image, but as raw data
+    if (source.hasImage() && (!formats.size() || formats.front() != "image/svg+xml")) {
+        if (formats.size() && formats.front().startsWith("image/")) {
+            // known format, keep as-is
+            previewDialog_->setPreview(qvariant_cast<QImage>(source.imageData()), formats.front());
+        } else {
+            // unknown image format, default to image/png
+            previewDialog_->setPreview(qvariant_cast<QImage>(source.imageData()), "image/png");
+        }
+    } else if (!path.isEmpty())
         previewDialog_->setPreview(path);
     else if (!formats.isEmpty()) {
         auto mime = formats.first();
@@ -675,6 +684,12 @@ InputBar::showPreview(const QMimeData &source, QString path, const QStringList &
       &dialogs::PreviewUploadOverlay::confirmUpload,
       this,
       [this](const QByteArray data, const QString &mime, const QString &fn) {
+          if (!data.size()) {
+              nhlog::ui()->warn("Attempted to upload zero-byte file?! Mimetype {}, filename {}",
+                                mime.toStdString(),
+                                fn.toStdString());
+              return;
+          }
           setUploading(true);
 
           setText("");