diff --git a/build.gradle.kts b/build.gradle.kts
index 25783b207e..42b17e13e2 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,15 +1,5 @@
-import io.papermc.paperweight.util.*
-import io.papermc.paperweight.util.constants.*
 import org.gradle.api.tasks.testing.logging.TestExceptionFormat
 import org.gradle.api.tasks.testing.logging.TestLogEvent
-import java.io.IOException
-import java.net.URI
-import java.nio.file.FileVisitResult
-import java.nio.file.Files
-import java.nio.file.SimpleFileVisitor
-import kotlin.io.path.*
-import java.nio.file.Path
-import kotlin.random.Random
 
 plugins {
     id("io.papermc.paperweight.core") version "2.0.0-beta.16" apply false
@@ -82,248 +72,3 @@ tasks.register("printPaperVersion") {
         println(paperVersion.get())
     }
 }
-
-/*
-// Used when updating to a new Minecraft version
-tasks.register("pickUpdateDirectory") {
-    val issue = providers.gradleProperty("updateTaskListIssue").get()
-    val patchesFolder = layout.projectDirectory.dir("paper-server/patches/").convertToPath()
-    val storage = layout.cache.resolve("last-updating-folder").also { it.parent.createDirectories() }
-
-    doLast {
-        val html = URI(issue).toURL().readText()
-
-        val beginMarker = "```[tasklist]"
-        val start = html.indexOf(beginMarker)
-        val end = html.indexOf("```", start + beginMarker.length)
-        val taskList = html.substring(start + beginMarker.length, end)
-
-        // Extract all incomplete tasks and select a random one
-        val incompleteTasks = taskList.split("\\n").filter { it.startsWith("- [ ]") }.map { it.replace("- [ ] ", "") }
-        if (incompleteTasks.isEmpty()) {
-            error("No incomplete tasks found in the task list.")
-        }
-
-        val next = incompleteTasks[Random.nextInt(incompleteTasks.size)]
-
-        println("checking out $next...")
-        val dir = patchesFolder.resolve("unapplied").resolve(next)
-        if (!dir.exists()) {
-            error("Unapplied patch folder $next does not exist, did someone else already check it out and forgot to mark it?")
-        }
-        dir.listDirectoryEntries("*.patch").forEach { patch ->
-            patch.copyTo(patchesFolder.resolve("sources").resolve(next).resolve(patch.fileName).also { it.createDirectories() }, overwrite = true)
-            patch.deleteIfExists()
-        }
-        if (dir.listDirectoryEntries().isEmpty()) {
-            dir.deleteIfExists()
-        }
-
-        storage.writeText(next)
-        println("please tick the box in the issue: $issue")
-        println("if you don't finish it, uncheck the task again after you commited")
-    }
-}
-
-tasks.register("showUpdateDirectories") {
-    val patchDir = layout.projectDirectory.dir("paper-server/patches/unapplied/").convertToPath()
-
-    doLast {
-        Files.walkFileTree(patchDir, object : SimpleFileVisitor<Path>() {
-            override fun postVisitDirectory(dir: Path?, exc: IOException?): FileVisitResult {
-                dir?.takeIf { it.listDirectoryEntries("*.patch").isNotEmpty() }?.let {
-                    println("- [ ] ${patchDir.relativize(it).pathString.replace("\\", "/")}")
-                }
-                return FileVisitResult.CONTINUE
-            }
-        })
-    }
-}
-
-tasks.register("moveUpdateDirectory") {
-    notCompatibleWithConfigurationCache("This task is interactive")
-    fun expandUserHome(path: String): Path {
-        return Path.of(path.replaceFirst("^~".toRegex(), System.getProperty("user.home")))
-    }
-
-    val input = providers.fileContents(layout.projectDirectory.file("$CACHE_PATH/last-updating-folder")).asText.map { it.trim() }
-    val patchFolder = layout.projectDirectory.dir("paper-server/patches/sources").dir(input)
-    val sourceFolder = layout.projectDirectory.dir("paper-server/src/minecraft/java").dir(input)
-    val targetFolder = providers.gradleProperty("cleanPaperRepo").map {
-        expandUserHome(it).resolve(input.get())
-    }
-
-    fun copy(back: Boolean = false) {
-        patchFolder.path.listDirectoryEntries().forEach {
-            val relative = patchFolder.path.relativize(it).toString().replace(".patch", "")
-            val source = sourceFolder.path.resolve(relative)
-            val target = targetFolder.get().resolve(relative)
-            if (target.isDirectory()) { return@forEach }
-            if (back) {
-                target.copyTo(source, overwrite = true)
-            } else {
-                source.copyTo(target, overwrite = true)
-            }
-        }
-    }
-
-    doLast {
-        if (!targetFolder.isPresent) {
-            error("cleanPaperRepo is required, define it in gradle.properties")
-        }
-        copy()
-        val files = patchFolder.path.listDirectoryEntries().map { it.fileName.toString().replace(".patch", "") }
-        println("Copied $files from $sourceFolder to $targetFolder")
-        println("Make the files compile, then press enter to copy them back!")
-        System.`in`.read()
-        copy(back = true)
-        println("copied back!")
-    }
-}
-
-// see gradle.properties
-if (providers.gradleProperty("updatingMinecraft").getOrElse("false").toBoolean()) {
-    tasks.collectAtsFromPatches {
-        val dir = layout.projectDirectory.dir("patches/unapplied/server")
-        if (dir.path.isDirectory()) {
-            extraPatchDir = dir
-        }
-    }
-    tasks.withType<io.papermc.paperweight.tasks.RebuildGitPatches>().configureEach {
-        filterPatches = false
-    }
-    tasks.register("continueServerUpdate", RebasePatches::class) {
-        description = "Moves the next X patches from unapplied to applied, and applies them. X being the number of patches that apply cleanly, plus the terminal failure if any."
-        projectDir = project.projectDir
-        appliedPatches = file("patches/server")
-        unappliedPatches = file("patches/unapplied/server")
-        applyTaskName = "applyServerPatches"
-        patchedDir = "Paper-Server"
-    }
-}
-
-@UntrackedTask(because = "Does not make sense to track state")
-abstract class RebasePatches : BaseTask() {
-    @get:Internal
-    abstract val projectDir: DirectoryProperty
-
-    @get:InputFiles
-    abstract val appliedPatches: DirectoryProperty
-
-    @get:InputFiles
-    abstract val unappliedPatches: DirectoryProperty
-
-    @get:Input
-    abstract val applyTaskName: Property<String>
-
-    @get:Input
-    abstract val patchedDir: Property<String>
-
-    private fun unapplied(): List<Path> =
-        unappliedPatches.path.listDirectoryEntries("*.patch").sortedBy { it.name }
-
-    private fun appliedLoc(patch: Path): Path = appliedPatches.path.resolve(unappliedPatches.path.relativize(patch))
-
-    companion object {
-        val regex = Pattern.compile("Patch failed at ([0-9]{4}) (.*)")
-        val continuationRegex = Pattern.compile("^\\s{1}.+\$")
-        const val subjectPrefix = "Subject: [PATCH] "
-    }
-
-    @TaskAction
-    fun run() {
-        val patchedDirPath = projectDir.path.resolve(patchedDir.get())
-        if (patchedDirPath.isDirectory()) {
-            val status = Git(patchedDirPath)("status").getText()
-            if (status.contains("You are in the middle of an am session.")) {
-                throw PaperweightException("Cannot continue update when $patchedDirPath is in the middle of an am session.")
-            }
-        }
-
-        val unapplied = unapplied()
-        for (patch in unapplied) {
-            patch.copyTo(appliedLoc(patch))
-        }
-
-        val out = ByteArrayOutputStream()
-        val proc = ProcessBuilder()
-            .directory(projectDir.path)
-            .command("./gradlew", applyTaskName.get())
-            .redirectErrorStream(true)
-            .start()
-
-        val f = redirect(proc.inputStream, out)
-
-        val exit = proc.waitFor()
-        f.get()
-
-        if (exit != 0) {
-            val outStr = String(out.toByteArray())
-            val matcher = regex.matcher(outStr)
-            if (!matcher.find()) error("Could not determine failure point")
-            val failedSubjectFragment = matcher.group(2)
-            val failed = unapplied.single { p ->
-                p.useLines { lines ->
-                    val collect = mutableListOf<String>()
-                    for (line in lines) {
-                        if (line.startsWith(subjectPrefix)) {
-                            collect += line
-                        } else if (collect.size == 1) {
-                            if (continuationRegex.matcher(line).matches()) {
-                                collect += line
-                            } else {
-                                break
-                            }
-                        }
-                    }
-                    val subjectLine = collect.joinToString("").substringAfter(subjectPrefix)
-                    subjectLine.startsWith(failedSubjectFragment)
-                }
-            }
-
-            // delete successful & failure point from unapplied patches dir
-            for (path in unapplied) {
-                path.deleteIfExists()
-                if (path == failed) {
-                    break
-                }
-            }
-
-            // delete failed from patches dir
-            var started = false
-            for (path in unapplied) {
-                if (path == failed) {
-                    started = true
-                    continue
-                }
-                if (started) {
-                    appliedLoc(path).deleteIfExists()
-                }
-            }
-
-            // Delete the build file before resetting the AM session in case it has compilation errors
-            patchedDirPath.resolve("build.gradle.kts").deleteIfExists()
-            // Apply again to reset the am session (so it ends on the failed patch, to allow us to rebuild after fixing it)
-            val apply2 = ProcessBuilder()
-                .directory(projectDir.path)
-                .command("./gradlew", applyTaskName.get())
-                .redirectErrorStream(true)
-                .start()
-
-            val f1 = redirect(apply2.inputStream, System.out)
-            apply2.waitFor()
-            f1.get()
-
-            logger.lifecycle(outStr)
-            logger.lifecycle("Patch failed at $failed; See Git output above.")
-        } else {
-            unapplied.forEach { it.deleteIfExists() }
-            logger.lifecycle("All patches applied!")
-        }
-
-        val git = Git(projectDir.path)
-        git("add", appliedPatches.path.toString() + "/*").runSilently()
-        git("add", unappliedPatches.path.toString() + "/*").runSilently()
-    }
-}
- */
diff --git a/paper-api/build.gradle.kts b/paper-api/build.gradle.kts
index 461e8b87c5..a0c35b7cd9 100644
--- a/paper-api/build.gradle.kts
+++ b/paper-api/build.gradle.kts
@@ -9,13 +9,13 @@ java {
     withJavadocJar()
 }
 
-val annotationsVersion = "26.0.1"
+val annotationsVersion = "26.0.2"
 // Keep in sync with paper-server adventure-text-serializer-ansi dep
 val adventureVersion = "4.21.0-mc1215-SNAPSHOT" // FIXME move to release asap
 val adventureJavadocVersion = "4.20.0" // Fixme remove me
 val bungeeCordChatVersion = "1.21-R0.2-deprecated+build.21"
-val slf4jVersion = "2.0.9"
-val log4jVersion = "2.17.1"
+val slf4jVersion = "2.0.16"
+val log4jVersion = "2.24.1"
 
 val apiAndDocs: Configuration by configurations.creating {
     attributes {
@@ -41,7 +41,6 @@ abstract class MockitoAgentProvider : CommandLineArgumentProvider {
 }
 
 dependencies {
-
     // api dependencies are listed transitively to API consumers
     api("com.google.guava:guava:33.3.1-jre")
     api("com.google.code.gson:gson:2.11.0")
@@ -49,9 +48,6 @@ dependencies {
     api("org.joml:joml:1.10.8") {
         isTransitive = false // https://github.com/JOML-CI/JOML/issues/352
     }
-    api("com.googlecode.json-simple:json-simple:1.1.1") {
-        isTransitive = false // includes junit
-    }
     api("it.unimi.dsi:fastutil:8.5.15")
     api("org.apache.logging.log4j:log4j-api:$log4jVersion")
     api("org.slf4j:slf4j-api:$slf4jVersion")
@@ -81,18 +77,18 @@ dependencies {
     compileOnly(annotations)
     testCompileOnly(annotations)
 
-    val checkerQual = "org.checkerframework:checker-qual:3.33.0"
+    val checkerQual = "org.checkerframework:checker-qual:3.49.2"
     compileOnlyApi(checkerQual)
     testCompileOnly(checkerQual)
 
     api("org.jspecify:jspecify:1.0.0")
 
     // Test dependencies
-    testImplementation("org.apache.commons:commons-lang3:3.12.0")
-    testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
+    testImplementation("org.apache.commons:commons-lang3:3.17.0")
+    testImplementation("org.junit.jupiter:junit-jupiter:5.12.2")
     testImplementation("org.hamcrest:hamcrest:2.2")
     testImplementation("org.mockito:mockito-core:5.14.1")
-    testImplementation("org.ow2.asm:asm-tree:9.7.1")
+    testImplementation("org.ow2.asm:asm-tree:9.8")
     mockitoAgent("org.mockito:mockito-core:5.14.1") { isTransitive = false } // configure mockito agent that is needed in newer java versions
     testRuntimeOnly("org.junit.platform:junit-platform-launcher")
 }
diff --git a/paper-server/build.gradle.kts b/paper-server/build.gradle.kts
index de81c7506b..5b2b555e5b 100644
--- a/paper-server/build.gradle.kts
+++ b/paper-server/build.gradle.kts
@@ -144,35 +144,37 @@ dependencies {
       all its classes to check if they are plugins.
       Scanning takes about 1-2 seconds so adding this speeds up the server start.
      */
-    implementation("org.apache.logging.log4j:log4j-core:2.19.0")
-    log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.19.0") // Needed to generate meta for our Log4j plugins
+    implementation("org.apache.logging.log4j:log4j-core:2.24.1")
+    log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.24.1") // Needed to generate meta for our Log4j plugins
     runtimeOnly(log4jPlugins.output)
     alsoShade(log4jPlugins.output)
 
     implementation("com.velocitypowered:velocity-native:3.4.0-SNAPSHOT") {
         isTransitive = false
     }
-    implementation("io.netty:netty-codec-haproxy:4.1.115.Final") // Add support for proxy protocol
+    implementation("io.netty:netty-codec-haproxy:4.1.118.Final") // Add support for proxy protocol
     implementation("org.apache.logging.log4j:log4j-iostreams:2.24.1")
-    implementation("org.ow2.asm:asm-commons:9.7.1")
+    implementation("org.ow2.asm:asm-commons:9.8")
     implementation("org.spongepowered:configurate-yaml:4.2.0-20250225.064233-199")
     implementation("org.spongepowered:configurate-core:4.2.0-20250225.064233-204") // Pinned dependency of above pinned yaml snapshot.
-    implementation("commons-lang:commons-lang:2.6")
-    runtimeOnly("org.xerial:sqlite-jdbc:3.47.0.0")
-    runtimeOnly("com.mysql:mysql-connector-j:9.1.0")
+
+    // Deps that were previously in the API but have now been moved here for backwards compat, eventually to be removed
+    runtimeOnly("commons-lang:commons-lang:2.6")
+    runtimeOnly("org.xerial:sqlite-jdbc:3.49.1.0")
+    runtimeOnly("com.mysql:mysql-connector-j:9.2.0")
     runtimeOnly("com.lmax:disruptor:3.4.4")
 
     runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6")
     runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
     runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18")
 
-    testImplementation("io.github.classgraph:classgraph:4.8.47") // For mob goal test
-    testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
-    testImplementation("org.junit.platform:junit-platform-suite-engine:1.10.0")
+    testImplementation("io.github.classgraph:classgraph:4.8.179") // For mob goal test
+    testImplementation("org.junit.jupiter:junit-jupiter:5.12.2")
+    testImplementation("org.junit.platform:junit-platform-suite-engine:1.12.2")
     testImplementation("org.hamcrest:hamcrest:2.2")
     testImplementation("org.mockito:mockito-core:5.14.1")
     mockitoAgent("org.mockito:mockito-core:5.14.1") { isTransitive = false } // Configure mockito agent that is needed in newer java versions
-    testImplementation("org.ow2.asm:asm-tree:9.7.1")
+    testImplementation("org.ow2.asm:asm-tree:9.8")
     testImplementation("org.junit-pioneer:junit-pioneer:2.2.0") // CartesianTest
 
     implementation("net.neoforged:srgutils:1.0.9") // Mappings handling
diff --git a/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java b/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java
index 2b7070e0ce..422f2d0aaf 100644
--- a/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java
+++ b/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java
@@ -3,7 +3,7 @@ package io.papermc.paper.util;
 import com.sun.security.auth.module.NTSystem;
 import com.sun.security.auth.module.UnixSystem;
 import java.util.Set;
-import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang3.SystemUtils;
 
 public class ServerEnvironment {
     private static final boolean RUNNING_AS_ROOT_OR_ADMIN;
diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java b/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java
index ce799e6550..5abdcc7d91 100644
--- a/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java
+++ b/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java
@@ -20,7 +20,7 @@ import java.util.stream.Collectors;
 import net.minecraft.Util;
 import net.minecraft.server.dedicated.DedicatedServer;
 import net.minecraft.world.item.component.ResolvableProfile;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.bukkit.Bukkit;
 import org.bukkit.configuration.serialization.SerializableAs;
 import org.bukkit.craftbukkit.CraftServer;