Index: launcher/launch/steps/PatchLWJGL.cpp
--- launcher/launch/steps/PatchLWJGL.cpp.orig
+++ launcher/launch/steps/PatchLWJGL.cpp
@@ -0,0 +1,119 @@
+#include "PatchLWJGL.h"
+#include <QSaveFile>
+#include <launch/LaunchTask.h>
+#include <minecraft/GradleSpecifier.h>
+#include <minecraft/Library.h>
+#include <minecraft/OneSixVersionFormat.h>
+
+void PatchLWJGL::executeTask()
+{
+    qDebug() << "Patching instance's LWJGL to use system libraries.";
+
+    auto component = m_components->getComponent("org.lwjgl3");
+    bool isLwjgl3 = true;
+
+    if (component == nullptr) {
+        component = m_components->getComponent("org.lwjgl");
+
+        if (component == nullptr) {
+            emitFailed(tr("Failed to find LWJGL component for this Minecraft instance."));
+            return;
+        }
+
+        isLwjgl3 = false;
+    }
+
+    qDebug() << "Checking if instance's LWJGL is customized";
+
+    if (component->customize()) {
+        qDebug() << "Instance's LWJGL is not customized, will patch.";
+
+        auto vfile = component->getVersionFile();
+        vfile->version = "System";
+        vfile->libraries = QList<LibraryPtr>();
+
+        if (isLwjgl3) {
+            qDebug() << "Instance uses LWJGL 3, applying appropriate patches.";
+
+            QList<QString> libs = { "lwjgl-glfw", "lwjgl-openal", "lwjgl-opengl", "lwjgl-stb", "lwjgl-tinyfd", "lwjgl" };
+
+            QList<QString> nativeLibs = { "lwjgl-opengl", "lwjgl-stb", "lwjgl-tinyfd", "lwjgl" };
+
+            for (auto& libName : libs) {
+                LibraryPtr lib(new Library());
+                lib->setHint("local");
+                lib->setPath(QString(LWJGL3_DIR) + libName + ".jar");
+                lib->setRawName(GradleSpecifier("org.lwjgl:" + libName + ":system"));
+                vfile->libraries.append(lib);
+            }
+
+            for (auto& libName : nativeLibs) {
+                LibraryPtr lib(new Library());
+                lib->setHint("local");
+                lib->setPath(QString(LWJGL3_DIR) + libName + "-natives-openbsd.jar");
+                lib->setRawName(GradleSpecifier("org.lwjgl:" + libName + ":system"));
+                lib->setNative(true);
+                vfile->libraries.append(lib);
+            }
+        } else {
+            qDebug() << "Instance uses LWJGL 2, applying appropriate patches.";
+
+            QString lwjglDir(LWJGL_DIR);
+
+            LibraryPtr jinput(new Library());
+            jinput->setHint("local");
+            jinput->setPath(lwjglDir + "jinput.jar");
+            jinput->setRawName(GradleSpecifier("net.java.jinput:jinput:system"));
+            vfile->libraries.append(jinput);
+
+            LibraryPtr lwjgl(new Library());
+            lwjgl->setHint("local");
+            lwjgl->setPath(lwjglDir + "lwjgl.jar");
+            lwjgl->setRawName(GradleSpecifier("org.lwjgl.lwjgl:lwjgl:system"));
+            vfile->libraries.append(lwjgl);
+
+            LibraryPtr lwjglUtil(new Library());
+            lwjglUtil->setHint("local");
+            lwjglUtil->setPath(lwjglDir + "lwjgl_util.jar");
+            lwjglUtil->setRawName(GradleSpecifier("org.lwjgl.lwjgl:lwjgl_util:system"));
+            vfile->libraries.append(lwjglUtil);
+        }
+
+        qDebug() << "Writing patch file.";
+
+        auto filename = component->getFilename();
+        auto document = OneSixVersionFormat::versionFileToJson(vfile);
+
+        QSaveFile jsonFile(filename);
+        if (!jsonFile.open(QIODevice::WriteOnly)) {
+            emitFailed(tr("Failed to open patch file for writing."));
+            return;
+        }
+
+        jsonFile.write(document.toJson());
+        if (!jsonFile.commit()) {
+            emitFailed(tr("Failed to commit patch file."));
+            return;
+        }
+
+        qDebug() << "Reloading instance's component list.";
+
+        m_components->reload(m_mode);
+
+        qDebug() << "Instance should now use the system-wide LWJGL library!";
+    } else {
+        qDebug() << "Instance's LWJGL is customized/patched, leaving it as-is.";
+    }
+
+    emitSucceeded();
+}
+
+bool PatchLWJGL::canAbort() const
+{
+    return false;
+}
+
+bool PatchLWJGL::abort()
+{
+    return false;
+}
