diff --git a/Spigot-API-Patches/Make-JavaPluginLoader-thread-safe.patch b/Spigot-API-Patches/Make-JavaPluginLoader-thread-safe.patch
new file mode 100644
index 0000000000..a6febb4a55
--- /dev/null
+++ b/Spigot-API-Patches/Make-JavaPluginLoader-thread-safe.patch
@@ -0,0 +1,55 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Trigary <trigary0@gmail.com>
+Date: Wed, 15 Apr 2020 01:24:55 -0400
+Subject: [PATCH] Make JavaPluginLoader thread-safe
+
+
+diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
+index 8ff228ce..c0884f27 100644
+--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
++++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
+@@ -0,0 +0,0 @@ public final class JavaPluginLoader implements PluginLoader {
+     final Server server;
+     private final Pattern[] fileFilters = new Pattern[]{Pattern.compile("\\.jar$")};
+     private final Map<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>();
++    private final Map<String, java.util.concurrent.locks.ReentrantReadWriteLock> classLoadLock = new java.util.HashMap<String, java.util.concurrent.locks.ReentrantReadWriteLock>(); // Paper
++    private final Map<String, Integer> classLoadLockCount = new java.util.HashMap<String, Integer>(); // Paper
+     private final List<PluginClassLoader> loaders = new CopyOnWriteArrayList<PluginClassLoader>();
+ 
+     /**
+@@ -0,0 +0,0 @@ public final class JavaPluginLoader implements PluginLoader {
+ 
+     @Nullable
+     Class<?> getClassByName(final String name) {
++        // Paper start - make MT safe
++        java.util.concurrent.locks.ReentrantReadWriteLock lock;
++        synchronized (classLoadLock) {
++            lock = classLoadLock.computeIfAbsent(name, (x) -> new java.util.concurrent.locks.ReentrantReadWriteLock());
++            classLoadLockCount.compute(name, (x, prev) -> prev != null ? prev + 1 : 1);
++        }
++        lock.writeLock().lock();try {
++        // Paper end
+         Class<?> cachedClass = classes.get(name);
+ 
+         if (cachedClass != null) {
+@@ -0,0 +0,0 @@ public final class JavaPluginLoader implements PluginLoader {
+                 }
+             }
+         }
++        // Paper start - make MT safe
++        } finally {
++            synchronized (classLoadLock) {
++                lock.writeLock().unlock();
++                if (classLoadLockCount.get(name) == 1) {
++                    classLoadLock.remove(name);
++                    classLoadLockCount.remove(name);
++                } else {
++                    classLoadLockCount.compute(name, (x, prev) -> prev - 1);
++                }
++            }
++        }
++        // Paper end
+         return null;
+     }
+ 
+--
\ No newline at end of file