Repository: compiler-explorer/compiler-explorer
Pull request #7113 (2024-11-21 21:03:34)

Support system properties in the R8/D8 invocation
This change supports JVM system property input by reordering user-input compiler options that begin with '-D' or '-J'. The latter is an R8/D8 convention; the 'J' is stripped before being used.

Other compiler options are assumed to still apply to R8/D8.

<!-- THIS COMMENT IS INVISIBLE IN THE FINAL PR, BUT FEEL FREE TO REMOVE IT
Thanks for taking the time to improve CE. We really appreciate it.
  Before opening the PR, please make sure that the tests & linter pass their checks,
  by running `make check`.
  In the best case scenario, you are also adding tests to back up your changes,
  but don't sweat it if you don't. We can discuss them at a later date.
Feel free to append your name to the CONTRIBUTORS.md file
Thanks again, we really appreciate this!
-->



Patch:
diff --git a/etc/config/c++.amazon.properties b/etc/config/c++.amazon.properties
index 4d22cdb52..fdd3bd0fb 100644
--- a/etc/config/c++.amazon.properties
+++ b/etc/config/c++.amazon.properties
@@ -5124,7 +5124,7 @@ libs.qt.versions.680.path=/app/qt/include/QtCore
 
 libs.quill.name=Quill
 libs.quill.description=C++ Low Latency Logging Library
-libs.quill.versions=611:700:721:730
+libs.quill.versions=611:700:721:730:750
 libs.quill.url=https://github.com/odygrd/quill
 libs.quill.versions.611.version=6.1.1
 libs.quill.versions.611.path=/opt/compiler-explorer/libs/quill/v6.1.1/quill/include
@@ -5134,6 +5134,8 @@ libs.quill.versions.721.version=7.2.1
 libs.quill.versions.721.path=/opt/compiler-explorer/libs/quill/v7.2.1/include
 libs.quill.versions.730.version=7.3.0
 libs.quill.versions.730.path=/opt/compiler-explorer/libs/quill/v7.3.0/include
+libs.quill.versions.750.version=7.5.0
+libs.quill.versions.750.path=/opt/compiler-explorer/libs/quill/v7.5.0/include
 
 libs.rangesv3.name=range-v3
 libs.rangesv3.versions=trunk:030:035:036:091:0100:0110:0120
diff --git a/etc/config/csharp.amazon.properties b/etc/config/csharp.amazon.properties
index 9169c92b4..6d486dbec 100644
--- a/etc/config/csharp.amazon.properties
+++ b/etc/config/csharp.amazon.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetlegacy
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy:&dotnetlegacy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80csharpcoreclr
+defaultCompiler=dotnet90csharpcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkcsharpcoreclr:dotnet80csharpcoreclr:dotnet70csharpcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkcsharpcoreclr:dotnet90csharpcoreclr:dotnet80csharpcoreclr:dotnet70csharpcoreclr:dotnet60csharpcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkcsharpcrossgen2:dotnet80csharpcrossgen2:dotnet70csharpcrossgen2:dotnet60csharpcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkcsharpcrossgen2:dotnet90csharpcrossgen2:dotnet80csharpcrossgen2:dotnet70csharpcrossgen2:dotnet60csharpcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkcsharpmono
+group.dotnetmono.compilers=dotnettrunkcsharpmono:dotnet90csharpmono:dotnet80csharpmono:dotnet70csharpmono:dotnet60csharpmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,10 +24,15 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkcsharpildasm
+group.dotnetildasm.compilers=dotnettrunkcsharpildasm:dotnet90csharpildasm:dotnet80csharpildasm:dotnet70csharpildasm:dotnet60csharpildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkcsharpilspy:dotnet90csharpilspy:dotnet80csharpilspy:dotnet70csharpilspy:dotnet60csharpilspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 group.dotnetlegacy.compilers=dotnettrunkcsharp:dotnet707csharp:dotnet703csharp:dotnet701csharp:dotnet6018csharp:dotnet6014csharp:dotnet6011csharp
 group.dotnetlegacy.compilerCategories=legacy
@@ -36,20 +41,32 @@ group.dotnetlegacy.groupName=Legacy
 
 # CoreCLR compilers
 
-compiler.dotnet70csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70csharpcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpcoreclr.buildConfig=Release
+compiler.dotnet60csharpcoreclr.langVersion=latest
+
+compiler.dotnet70csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcoreclr.buildConfig=Release
 compiler.dotnet70csharpcoreclr.langVersion=latest
 
-compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80csharpcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80csharpcoreclr.buildConfig=Release
 compiler.dotnet80csharpcoreclr.langVersion=latest
 
+compiler.dotnet90csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcoreclr.buildConfig=Release
+compiler.dotnet90csharpcoreclr.langVersion=latest
+
 compiler.dotnettrunkcsharpcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkcsharpcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkcsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpcoreclr.buildConfig=Release
 compiler.dotnettrunkcsharpcoreclr.langVersion=preview
@@ -57,26 +74,32 @@ compiler.dotnettrunkcsharpcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60csharpcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60csharpcrossgen2.buildConfig=Release
 compiler.dotnet60csharpcrossgen2.langVersion=latest
 
-compiler.dotnet70csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70csharpcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcrossgen2.buildConfig=Release
 compiler.dotnet70csharpcrossgen2.langVersion=latest
 
-compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80csharpcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80csharpcrossgen2.buildConfig=Release
 compiler.dotnet80csharpcrossgen2.langVersion=latest
 
+compiler.dotnet90csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcrossgen2.buildConfig=Release
+compiler.dotnet90csharpcrossgen2.langVersion=latest
+
 compiler.dotnettrunkcsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkcsharpcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkcsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpcrossgen2.buildConfig=Release
 compiler.dotnettrunkcsharpcrossgen2.langVersion=preview
@@ -84,8 +107,32 @@ compiler.dotnettrunkcsharpcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60csharpmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpmono.name=.NET 6.0 Mono
+compiler.dotnet60csharpmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpmono.buildConfig=Release
+compiler.dotnet60csharpmono.langVersion=latest
+
+compiler.dotnet70csharpmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpmono.name=.NET 7.0 Mono
+compiler.dotnet70csharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70csharpmono.buildConfig=Release
+compiler.dotnet70csharpmono.langVersion=latest
+
+compiler.dotnet80csharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpmono.name=.NET 8.0 Mono
+compiler.dotnet80csharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpmono.buildConfig=Release
+compiler.dotnet80csharpmono.langVersion=latest
+
+compiler.dotnet90csharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpmono.name=.NET 9.0 Mono
+compiler.dotnet90csharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpmono.buildConfig=Release
+compiler.dotnet90csharpmono.langVersion=latest
+
 compiler.dotnettrunkcsharpmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpmono.name=.NET Mono (main)
+compiler.dotnettrunkcsharpmono.name=.NET (main) Mono
 compiler.dotnettrunkcsharpmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpmono.buildConfig=Release
 compiler.dotnettrunkcsharpmono.langVersion=preview
@@ -94,21 +141,78 @@ compiler.dotnettrunkcsharpmono.isNightly=true
 # NativeAOT compilers
 
 compiler.dotnettrunkcsharpnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkcsharpnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkcsharpnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpnativeaot.buildConfig=Release
 compiler.dotnettrunkcsharpnativeaot.langVersion=preview
 compiler.dotnettrunkcsharpnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60csharpildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpildasm.buildConfig=Release
+compiler.dotnet60csharpildasm.langVersion=latest
+
+compiler.dotnet70csharpildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70csharpildasm.buildConfig=Release
+compiler.dotnet70csharpildasm.langVersion=latest
+
+compiler.dotnet80csharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpildasm.buildConfig=Release
+compiler.dotnet80csharpildasm.langVersion=latest
+
+compiler.dotnet90csharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpildasm.buildConfig=Release
+compiler.dotnet90csharpildasm.langVersion=latest
 
 compiler.dotnettrunkcsharpildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkcsharpildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkcsharpildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpildasm.buildConfig=Release
 compiler.dotnettrunkcsharpildasm.langVersion=preview
 compiler.dotnettrunkcsharpildasm.isNightly=true
 
+# ILSpy compilers
+
+compiler.dotnet60csharpilspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpilspy.name=.NET 6.0 ILSpy
+compiler.dotnet60csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpilspy.buildConfig=Release
+compiler.dotnet60csharpilspy.langVersion=latest
+
+compiler.dotnet70csharpilspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpilspy.name=.NET 7.0 ILSpy
+compiler.dotnet70csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70csharpilspy.buildConfig=Release
+compiler.dotnet70csharpilspy.langVersion=latest
+
+compiler.dotnet80csharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpilspy.name=.NET 8.0 ILSpy
+compiler.dotnet80csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpilspy.buildConfig=Release
+compiler.dotnet80csharpilspy.langVersion=latest
+
+compiler.dotnet90csharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpilspy.name=.NET 9.0 ILSpy
+compiler.dotnet90csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpilspy.buildConfig=Release
+compiler.dotnet90csharpilspy.langVersion=latest
+
+compiler.dotnettrunkcsharpilspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkcsharpilspy.name=.NET (main) ILSpy
+compiler.dotnettrunkcsharpilspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkcsharpilspy.buildConfig=Release
+compiler.dotnettrunkcsharpilspy.langVersion=preview
+compiler.dotnettrunkcsharpilspy.isNightly=true
+
 # Legacy compilers (for backwards compatibility, don't add new compilers here)
 
 compiler.dotnet6011csharp.exe=/opt/compiler-explorer/dotnet-v6.0.11/.dotnet/dotnet
diff --git a/etc/config/csharp.defaults.properties b/etc/config/csharp.defaults.properties
index 9169c92b4..6d486dbec 100644
--- a/etc/config/csharp.defaults.properties
+++ b/etc/config/csharp.defaults.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetlegacy
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy:&dotnetlegacy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80csharpcoreclr
+defaultCompiler=dotnet90csharpcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkcsharpcoreclr:dotnet80csharpcoreclr:dotnet70csharpcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkcsharpcoreclr:dotnet90csharpcoreclr:dotnet80csharpcoreclr:dotnet70csharpcoreclr:dotnet60csharpcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkcsharpcrossgen2:dotnet80csharpcrossgen2:dotnet70csharpcrossgen2:dotnet60csharpcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkcsharpcrossgen2:dotnet90csharpcrossgen2:dotnet80csharpcrossgen2:dotnet70csharpcrossgen2:dotnet60csharpcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkcsharpmono
+group.dotnetmono.compilers=dotnettrunkcsharpmono:dotnet90csharpmono:dotnet80csharpmono:dotnet70csharpmono:dotnet60csharpmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,10 +24,15 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkcsharpildasm
+group.dotnetildasm.compilers=dotnettrunkcsharpildasm:dotnet90csharpildasm:dotnet80csharpildasm:dotnet70csharpildasm:dotnet60csharpildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkcsharpilspy:dotnet90csharpilspy:dotnet80csharpilspy:dotnet70csharpilspy:dotnet60csharpilspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 group.dotnetlegacy.compilers=dotnettrunkcsharp:dotnet707csharp:dotnet703csharp:dotnet701csharp:dotnet6018csharp:dotnet6014csharp:dotnet6011csharp
 group.dotnetlegacy.compilerCategories=legacy
@@ -36,20 +41,32 @@ group.dotnetlegacy.groupName=Legacy
 
 # CoreCLR compilers
 
-compiler.dotnet70csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70csharpcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpcoreclr.buildConfig=Release
+compiler.dotnet60csharpcoreclr.langVersion=latest
+
+compiler.dotnet70csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcoreclr.buildConfig=Release
 compiler.dotnet70csharpcoreclr.langVersion=latest
 
-compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80csharpcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80csharpcoreclr.buildConfig=Release
 compiler.dotnet80csharpcoreclr.langVersion=latest
 
+compiler.dotnet90csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcoreclr.buildConfig=Release
+compiler.dotnet90csharpcoreclr.langVersion=latest
+
 compiler.dotnettrunkcsharpcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkcsharpcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkcsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpcoreclr.buildConfig=Release
 compiler.dotnettrunkcsharpcoreclr.langVersion=preview
@@ -57,26 +74,32 @@ compiler.dotnettrunkcsharpcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60csharpcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60csharpcrossgen2.buildConfig=Release
 compiler.dotnet60csharpcrossgen2.langVersion=latest
 
-compiler.dotnet70csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70csharpcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcrossgen2.buildConfig=Release
 compiler.dotnet70csharpcrossgen2.langVersion=latest
 
-compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80csharpcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80csharpcrossgen2.buildConfig=Release
 compiler.dotnet80csharpcrossgen2.langVersion=latest
 
+compiler.dotnet90csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcrossgen2.buildConfig=Release
+compiler.dotnet90csharpcrossgen2.langVersion=latest
+
 compiler.dotnettrunkcsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkcsharpcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkcsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpcrossgen2.buildConfig=Release
 compiler.dotnettrunkcsharpcrossgen2.langVersion=preview
@@ -84,8 +107,32 @@ compiler.dotnettrunkcsharpcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60csharpmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpmono.name=.NET 6.0 Mono
+compiler.dotnet60csharpmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpmono.buildConfig=Release
+compiler.dotnet60csharpmono.langVersion=latest
+
+compiler.dotnet70csharpmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpmono.name=.NET 7.0 Mono
+compiler.dotnet70csharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70csharpmono.buildConfig=Release
+compiler.dotnet70csharpmono.langVersion=latest
+
+compiler.dotnet80csharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpmono.name=.NET 8.0 Mono
+compiler.dotnet80csharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpmono.buildConfig=Release
+compiler.dotnet80csharpmono.langVersion=latest
+
+compiler.dotnet90csharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpmono.name=.NET 9.0 Mono
+compiler.dotnet90csharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpmono.buildConfig=Release
+compiler.dotnet90csharpmono.langVersion=latest
+
 compiler.dotnettrunkcsharpmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpmono.name=.NET Mono (main)
+compiler.dotnettrunkcsharpmono.name=.NET (main) Mono
 compiler.dotnettrunkcsharpmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpmono.buildConfig=Release
 compiler.dotnettrunkcsharpmono.langVersion=preview
@@ -94,21 +141,78 @@ compiler.dotnettrunkcsharpmono.isNightly=true
 # NativeAOT compilers
 
 compiler.dotnettrunkcsharpnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkcsharpnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkcsharpnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpnativeaot.buildConfig=Release
 compiler.dotnettrunkcsharpnativeaot.langVersion=preview
 compiler.dotnettrunkcsharpnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60csharpildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpildasm.buildConfig=Release
+compiler.dotnet60csharpildasm.langVersion=latest
+
+compiler.dotnet70csharpildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70csharpildasm.buildConfig=Release
+compiler.dotnet70csharpildasm.langVersion=latest
+
+compiler.dotnet80csharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpildasm.buildConfig=Release
+compiler.dotnet80csharpildasm.langVersion=latest
+
+compiler.dotnet90csharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpildasm.buildConfig=Release
+compiler.dotnet90csharpildasm.langVersion=latest
 
 compiler.dotnettrunkcsharpildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkcsharpildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkcsharpildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkcsharpildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkcsharpildasm.buildConfig=Release
 compiler.dotnettrunkcsharpildasm.langVersion=preview
 compiler.dotnettrunkcsharpildasm.isNightly=true
 
+# ILSpy compilers
+
+compiler.dotnet60csharpilspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60csharpilspy.name=.NET 6.0 ILSpy
+compiler.dotnet60csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60csharpilspy.buildConfig=Release
+compiler.dotnet60csharpilspy.langVersion=latest
+
+compiler.dotnet70csharpilspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70csharpilspy.name=.NET 7.0 ILSpy
+compiler.dotnet70csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70csharpilspy.buildConfig=Release
+compiler.dotnet70csharpilspy.langVersion=latest
+
+compiler.dotnet80csharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpilspy.name=.NET 8.0 ILSpy
+compiler.dotnet80csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpilspy.buildConfig=Release
+compiler.dotnet80csharpilspy.langVersion=latest
+
+compiler.dotnet90csharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpilspy.name=.NET 9.0 ILSpy
+compiler.dotnet90csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpilspy.buildConfig=Release
+compiler.dotnet90csharpilspy.langVersion=latest
+
+compiler.dotnettrunkcsharpilspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkcsharpilspy.name=.NET (main) ILSpy
+compiler.dotnettrunkcsharpilspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkcsharpilspy.buildConfig=Release
+compiler.dotnettrunkcsharpilspy.langVersion=preview
+compiler.dotnettrunkcsharpilspy.isNightly=true
+
 # Legacy compilers (for backwards compatibility, don't add new compilers here)
 
 compiler.dotnet6011csharp.exe=/opt/compiler-explorer/dotnet-v6.0.11/.dotnet/dotnet
diff --git a/etc/config/fsharp.amazon.properties b/etc/config/fsharp.amazon.properties
index 500d40a0c..7b152c20b 100644
--- a/etc/config/fsharp.amazon.properties
+++ b/etc/config/fsharp.amazon.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetlegacy
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy:&dotnetlegacy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80fsharpcoreclr
+defaultCompiler=dotnet90fsharpcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkfsharpcoreclr:dotnet80fsharpcoreclr:dotnet70fsharpcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkfsharpcoreclr:dotnet90fsharpcoreclr:dotnet80fsharpcoreclr:dotnet70fsharpcoreclr:dotnet60fsharpcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkfsharpcrossgen2:dotnet80fsharpcrossgen2:dotnet70fsharpcrossgen2:dotnet60fsharpcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkfsharpcrossgen2:dotnet90fsharpcrossgen2:dotnet80fsharpcrossgen2:dotnet70fsharpcrossgen2:dotnet60fsharpcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkfsharpmono
+group.dotnetmono.compilers=dotnettrunkfsharpmono:dotnet90fsharpmono:dotnet80fsharpmono:dotnet70fsharpmono:dotnet60fsharpmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,10 +24,15 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkfsharpildasm
+group.dotnetildasm.compilers=dotnettrunkfsharpildasm:dotnet90fsharpildasm:dotnet80fsharpildasm:dotnet70fsharpildasm:dotnet60fsharpildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkfsharpilspy:dotnet90fsharpilspy:dotnet80fsharpilspy:dotnet70fsharpilspy:dotnet60fsharpilspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 group.dotnetlegacy.compilers=dotnettrunkfsharp:dotnet707fsharp:dotnet703fsharp:dotnet701fsharp:dotnet6018fsharp:dotnet6014fsharp:dotnet6011fsharp
 group.dotnetlegacy.compilerCategories=legacy
@@ -36,20 +41,32 @@ group.dotnetlegacy.groupName=Legacy
 
 # CoreCLR compilers
 
-compiler.dotnet70fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70fsharpcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpcoreclr.buildConfig=Release
+compiler.dotnet60fsharpcoreclr.langVersion=latest
+
+compiler.dotnet70fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcoreclr.buildConfig=Release
 compiler.dotnet70fsharpcoreclr.langVersion=latest
 
-compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80fsharpcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80fsharpcoreclr.buildConfig=Release
 compiler.dotnet80fsharpcoreclr.langVersion=latest
 
+compiler.dotnet90fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcoreclr.buildConfig=Release
+compiler.dotnet90fsharpcoreclr.langVersion=latest
+
 compiler.dotnettrunkfsharpcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkfsharpcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkfsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpcoreclr.buildConfig=Release
 compiler.dotnettrunkfsharpcoreclr.langVersion=preview
@@ -57,26 +74,32 @@ compiler.dotnettrunkfsharpcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60fsharpcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60fsharpcrossgen2.buildConfig=Release
 compiler.dotnet60fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet70fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70fsharpcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcrossgen2.buildConfig=Release
 compiler.dotnet70fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80fsharpcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80fsharpcrossgen2.buildConfig=Release
 compiler.dotnet80fsharpcrossgen2.langVersion=latest
 
+compiler.dotnet90fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcrossgen2.buildConfig=Release
+compiler.dotnet90fsharpcrossgen2.langVersion=latest
+
 compiler.dotnettrunkfsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkfsharpcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkfsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpcrossgen2.buildConfig=Release
 compiler.dotnettrunkfsharpcrossgen2.langVersion=preview
@@ -84,8 +107,32 @@ compiler.dotnettrunkfsharpcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60fsharpmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpmono.name=.NET 6.0 Mono
+compiler.dotnet60fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpmono.buildConfig=Release
+compiler.dotnet60fsharpmono.langVersion=latest
+
+compiler.dotnet70fsharpmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpmono.name=.NET 7.0 Mono
+compiler.dotnet70fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70fsharpmono.buildConfig=Release
+compiler.dotnet70fsharpmono.langVersion=latest
+
+compiler.dotnet80fsharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpmono.name=.NET 8.0 Mono
+compiler.dotnet80fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpmono.buildConfig=Release
+compiler.dotnet80fsharpmono.langVersion=latest
+
+compiler.dotnet90fsharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpmono.name=.NET 9.0 Mono
+compiler.dotnet90fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpmono.buildConfig=Release
+compiler.dotnet90fsharpmono.langVersion=latest
+
 compiler.dotnettrunkfsharpmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpmono.name=.NET Mono (main)
+compiler.dotnettrunkfsharpmono.name=.NET (main) Mono
 compiler.dotnettrunkfsharpmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpmono.buildConfig=Release
 compiler.dotnettrunkfsharpmono.langVersion=preview
@@ -94,21 +141,78 @@ compiler.dotnettrunkfsharpmono.isNightly=true
 # NativeAOT compilers
 
 compiler.dotnettrunkfsharpnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkfsharpnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkfsharpnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpnativeaot.buildConfig=Release
 compiler.dotnettrunkfsharpnativeaot.langVersion=preview
 compiler.dotnettrunkfsharpnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60fsharpildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpildasm.buildConfig=Release
+compiler.dotnet60fsharpildasm.langVersion=latest
+
+compiler.dotnet70fsharpildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70fsharpildasm.buildConfig=Release
+compiler.dotnet70fsharpildasm.langVersion=latest
+
+compiler.dotnet80fsharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpildasm.buildConfig=Release
+compiler.dotnet80fsharpildasm.langVersion=latest
+
+compiler.dotnet90fsharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpildasm.buildConfig=Release
+compiler.dotnet90fsharpildasm.langVersion=latest
 
 compiler.dotnettrunkfsharpildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkfsharpildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkfsharpildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpildasm.buildConfig=Release
 compiler.dotnettrunkfsharpildasm.langVersion=preview
 compiler.dotnettrunkfsharpildasm.isNightly=true
 
+# ILSpy compilers
+
+compiler.dotnet60fsharpilspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpilspy.name=.NET 6.0 ILSpy
+compiler.dotnet60fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpilspy.buildConfig=Release
+compiler.dotnet60fsharpilspy.langVersion=latest
+
+compiler.dotnet70fsharpilspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpilspy.name=.NET 7.0 ILSpy
+compiler.dotnet70fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70fsharpilspy.buildConfig=Release
+compiler.dotnet70fsharpilspy.langVersion=latest
+
+compiler.dotnet80fsharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpilspy.name=.NET 8.0 ILSpy
+compiler.dotnet80fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpilspy.buildConfig=Release
+compiler.dotnet80fsharpilspy.langVersion=latest
+
+compiler.dotnet90fsharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpilspy.name=.NET 9.0 ILSpy
+compiler.dotnet90fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpilspy.buildConfig=Release
+compiler.dotnet90fsharpilspy.langVersion=latest
+
+compiler.dotnettrunkfsharpilspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkfsharpilspy.name=.NET (main) ILSpy
+compiler.dotnettrunkfsharpilspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkfsharpilspy.buildConfig=Release
+compiler.dotnettrunkfsharpilspy.langVersion=preview
+compiler.dotnettrunkfsharpilspy.isNightly=true
+
 # Legacy compilers (for backwards compatibility, don't add new compilers here)
 
 compiler.dotnet6011fsharp.exe=/opt/compiler-explorer/dotnet-v6.0.11/.dotnet/dotnet
diff --git a/etc/config/fsharp.defaults.properties b/etc/config/fsharp.defaults.properties
index 500d40a0c..7b152c20b 100644
--- a/etc/config/fsharp.defaults.properties
+++ b/etc/config/fsharp.defaults.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetlegacy
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy:&dotnetlegacy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80fsharpcoreclr
+defaultCompiler=dotnet90fsharpcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkfsharpcoreclr:dotnet80fsharpcoreclr:dotnet70fsharpcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkfsharpcoreclr:dotnet90fsharpcoreclr:dotnet80fsharpcoreclr:dotnet70fsharpcoreclr:dotnet60fsharpcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkfsharpcrossgen2:dotnet80fsharpcrossgen2:dotnet70fsharpcrossgen2:dotnet60fsharpcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkfsharpcrossgen2:dotnet90fsharpcrossgen2:dotnet80fsharpcrossgen2:dotnet70fsharpcrossgen2:dotnet60fsharpcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkfsharpmono
+group.dotnetmono.compilers=dotnettrunkfsharpmono:dotnet90fsharpmono:dotnet80fsharpmono:dotnet70fsharpmono:dotnet60fsharpmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,10 +24,15 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkfsharpildasm
+group.dotnetildasm.compilers=dotnettrunkfsharpildasm:dotnet90fsharpildasm:dotnet80fsharpildasm:dotnet70fsharpildasm:dotnet60fsharpildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkfsharpilspy:dotnet90fsharpilspy:dotnet80fsharpilspy:dotnet70fsharpilspy:dotnet60fsharpilspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 group.dotnetlegacy.compilers=dotnettrunkfsharp:dotnet707fsharp:dotnet703fsharp:dotnet701fsharp:dotnet6018fsharp:dotnet6014fsharp:dotnet6011fsharp
 group.dotnetlegacy.compilerCategories=legacy
@@ -36,20 +41,32 @@ group.dotnetlegacy.groupName=Legacy
 
 # CoreCLR compilers
 
-compiler.dotnet70fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70fsharpcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpcoreclr.buildConfig=Release
+compiler.dotnet60fsharpcoreclr.langVersion=latest
+
+compiler.dotnet70fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcoreclr.buildConfig=Release
 compiler.dotnet70fsharpcoreclr.langVersion=latest
 
-compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80fsharpcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80fsharpcoreclr.buildConfig=Release
 compiler.dotnet80fsharpcoreclr.langVersion=latest
 
+compiler.dotnet90fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcoreclr.buildConfig=Release
+compiler.dotnet90fsharpcoreclr.langVersion=latest
+
 compiler.dotnettrunkfsharpcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkfsharpcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkfsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpcoreclr.buildConfig=Release
 compiler.dotnettrunkfsharpcoreclr.langVersion=preview
@@ -57,26 +74,32 @@ compiler.dotnettrunkfsharpcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60fsharpcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60fsharpcrossgen2.buildConfig=Release
 compiler.dotnet60fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet70fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70fsharpcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcrossgen2.buildConfig=Release
 compiler.dotnet70fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80fsharpcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80fsharpcrossgen2.buildConfig=Release
 compiler.dotnet80fsharpcrossgen2.langVersion=latest
 
+compiler.dotnet90fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcrossgen2.buildConfig=Release
+compiler.dotnet90fsharpcrossgen2.langVersion=latest
+
 compiler.dotnettrunkfsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkfsharpcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkfsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpcrossgen2.buildConfig=Release
 compiler.dotnettrunkfsharpcrossgen2.langVersion=preview
@@ -84,8 +107,32 @@ compiler.dotnettrunkfsharpcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60fsharpmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpmono.name=.NET 6.0 Mono
+compiler.dotnet60fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpmono.buildConfig=Release
+compiler.dotnet60fsharpmono.langVersion=latest
+
+compiler.dotnet70fsharpmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpmono.name=.NET 7.0 Mono
+compiler.dotnet70fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70fsharpmono.buildConfig=Release
+compiler.dotnet70fsharpmono.langVersion=latest
+
+compiler.dotnet80fsharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpmono.name=.NET 8.0 Mono
+compiler.dotnet80fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpmono.buildConfig=Release
+compiler.dotnet80fsharpmono.langVersion=latest
+
+compiler.dotnet90fsharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpmono.name=.NET 9.0 Mono
+compiler.dotnet90fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpmono.buildConfig=Release
+compiler.dotnet90fsharpmono.langVersion=latest
+
 compiler.dotnettrunkfsharpmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpmono.name=.NET Mono (main)
+compiler.dotnettrunkfsharpmono.name=.NET (main) Mono
 compiler.dotnettrunkfsharpmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpmono.buildConfig=Release
 compiler.dotnettrunkfsharpmono.langVersion=preview
@@ -94,21 +141,78 @@ compiler.dotnettrunkfsharpmono.isNightly=true
 # NativeAOT compilers
 
 compiler.dotnettrunkfsharpnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkfsharpnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkfsharpnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpnativeaot.buildConfig=Release
 compiler.dotnettrunkfsharpnativeaot.langVersion=preview
 compiler.dotnettrunkfsharpnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60fsharpildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpildasm.buildConfig=Release
+compiler.dotnet60fsharpildasm.langVersion=latest
+
+compiler.dotnet70fsharpildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70fsharpildasm.buildConfig=Release
+compiler.dotnet70fsharpildasm.langVersion=latest
+
+compiler.dotnet80fsharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpildasm.buildConfig=Release
+compiler.dotnet80fsharpildasm.langVersion=latest
+
+compiler.dotnet90fsharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpildasm.buildConfig=Release
+compiler.dotnet90fsharpildasm.langVersion=latest
 
 compiler.dotnettrunkfsharpildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkfsharpildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkfsharpildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkfsharpildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkfsharpildasm.buildConfig=Release
 compiler.dotnettrunkfsharpildasm.langVersion=preview
 compiler.dotnettrunkfsharpildasm.isNightly=true
 
+# ILSpy compilers
+
+compiler.dotnet60fsharpilspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60fsharpilspy.name=.NET 6.0 ILSpy
+compiler.dotnet60fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60fsharpilspy.buildConfig=Release
+compiler.dotnet60fsharpilspy.langVersion=latest
+
+compiler.dotnet70fsharpilspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70fsharpilspy.name=.NET 7.0 ILSpy
+compiler.dotnet70fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70fsharpilspy.buildConfig=Release
+compiler.dotnet70fsharpilspy.langVersion=latest
+
+compiler.dotnet80fsharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpilspy.name=.NET 8.0 ILSpy
+compiler.dotnet80fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpilspy.buildConfig=Release
+compiler.dotnet80fsharpilspy.langVersion=latest
+
+compiler.dotnet90fsharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpilspy.name=.NET 9.0 ILSpy
+compiler.dotnet90fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpilspy.buildConfig=Release
+compiler.dotnet90fsharpilspy.langVersion=latest
+
+compiler.dotnettrunkfsharpilspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkfsharpilspy.name=.NET (main) ILSpy
+compiler.dotnettrunkfsharpilspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkfsharpilspy.buildConfig=Release
+compiler.dotnettrunkfsharpilspy.langVersion=preview
+compiler.dotnettrunkfsharpilspy.isNightly=true
+
 # Legacy compilers (for backwards compatibility, don't add new compilers here)
 
 compiler.dotnet6011fsharp.exe=/opt/compiler-explorer/dotnet-v6.0.11/.dotnet/dotnet
diff --git a/etc/config/il.amazon.properties b/etc/config/il.amazon.properties
index 53ffa53ae..81fe840ff 100644
--- a/etc/config/il.amazon.properties
+++ b/etc/config/il.amazon.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80ilcoreclr
+defaultCompiler=dotnet90ilcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkilcoreclr:dotnet80ilcoreclr:dotnet70ilcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkilcoreclr:dotnet90ilcoreclr:dotnet80ilcoreclr:dotnet70ilcoreclr:dotnet60ilcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkilcrossgen2:dotnet80ilcrossgen2:dotnet70ilcrossgen2:dotnet60ilcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkilcrossgen2:dotnet90ilcrossgen2:dotnet80ilcrossgen2:dotnet70ilcrossgen2:dotnet60ilcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkilmono
+group.dotnetmono.compilers=dotnettrunkilmono:dotnet90ilmono:dotnet80ilmono:dotnet70ilmono:dotnet60ilmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,27 +24,44 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkilildasm
+group.dotnetildasm.compilers=dotnettrunkilildasm:dotnet90ilildasm:dotnet80ilildasm:dotnet70ilildasm:dotnet60ilildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkililspy:dotnet90ililspy:dotnet80ililspy:dotnet70ililspy:dotnet60ililspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 # CoreCLR compilers
 
-compiler.dotnet70ilcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70ilcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60ilcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ilcoreclr.buildConfig=Release
+compiler.dotnet60ilcoreclr.langVersion=latest
+
+compiler.dotnet70ilcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcoreclr.buildConfig=Release
 compiler.dotnet70ilcoreclr.langVersion=latest
 
-compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80ilcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80ilcoreclr.buildConfig=Release
 compiler.dotnet80ilcoreclr.langVersion=latest
 
+compiler.dotnet90ilcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcoreclr.buildConfig=Release
+compiler.dotnet90ilcoreclr.langVersion=latest
+
 compiler.dotnettrunkilcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkilcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkilcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilcoreclr.buildConfig=Release
 compiler.dotnettrunkilcoreclr.langVersion=preview
@@ -52,26 +69,32 @@ compiler.dotnettrunkilcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60ilcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60ilcrossgen2.buildConfig=Release
 compiler.dotnet60ilcrossgen2.langVersion=latest
 
-compiler.dotnet70ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70ilcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcrossgen2.buildConfig=Release
 compiler.dotnet70ilcrossgen2.langVersion=latest
 
-compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80ilcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80ilcrossgen2.buildConfig=Release
 compiler.dotnet80ilcrossgen2.langVersion=latest
 
+compiler.dotnet90ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcrossgen2.buildConfig=Release
+compiler.dotnet90ilcrossgen2.langVersion=latest
+
 compiler.dotnettrunkilcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkilcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilcrossgen2.buildConfig=Release
 compiler.dotnettrunkilcrossgen2.langVersion=preview
@@ -79,8 +102,32 @@ compiler.dotnettrunkilcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60ilmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilmono.name=.NET 6.0 Mono
+compiler.dotnet60ilmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ilmono.buildConfig=Release
+compiler.dotnet60ilmono.langVersion=latest
+
+compiler.dotnet70ilmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilmono.name=.NET 7.0 Mono
+compiler.dotnet70ilmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70ilmono.buildConfig=Release
+compiler.dotnet70ilmono.langVersion=latest
+
+compiler.dotnet80ilmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilmono.name=.NET 8.0 Mono
+compiler.dotnet80ilmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilmono.buildConfig=Release
+compiler.dotnet80ilmono.langVersion=latest
+
+compiler.dotnet90ilmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilmono.name=.NET 9.0 Mono
+compiler.dotnet90ilmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilmono.buildConfig=Release
+compiler.dotnet90ilmono.langVersion=latest
+
 compiler.dotnettrunkilmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilmono.name=.NET Mono (main)
+compiler.dotnettrunkilmono.name=.NET (main) Mono
 compiler.dotnettrunkilmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilmono.buildConfig=Release
 compiler.dotnettrunkilmono.langVersion=preview
@@ -89,17 +136,74 @@ compiler.dotnettrunkilmono.isNightly=true
 # NativeAOT compilers
 
 compiler.dotnettrunkilnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkilnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkilnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilnativeaot.buildConfig=Release
 compiler.dotnettrunkilnativeaot.langVersion=preview
 compiler.dotnettrunkilnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60ilildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60ilildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ilildasm.buildConfig=Release
+compiler.dotnet60ilildasm.langVersion=latest
+
+compiler.dotnet70ilildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70ilildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70ilildasm.buildConfig=Release
+compiler.dotnet70ilildasm.langVersion=latest
+
+compiler.dotnet80ilildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80ilildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilildasm.buildConfig=Release
+compiler.dotnet80ilildasm.langVersion=latest
+
+compiler.dotnet90ilildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90ilildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilildasm.buildConfig=Release
+compiler.dotnet90ilildasm.langVersion=latest
 
 compiler.dotnettrunkilildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkilildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkilildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilildasm.buildConfig=Release
 compiler.dotnettrunkilildasm.langVersion=preview
 compiler.dotnettrunkilildasm.isNightly=true
+
+# ILSpy compilers
+
+compiler.dotnet60ililspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ililspy.name=.NET 6.0 ILSpy
+compiler.dotnet60ililspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ililspy.buildConfig=Release
+compiler.dotnet60ililspy.langVersion=latest
+
+compiler.dotnet70ililspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ililspy.name=.NET 7.0 ILSpy
+compiler.dotnet70ililspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70ililspy.buildConfig=Release
+compiler.dotnet70ililspy.langVersion=latest
+
+compiler.dotnet80ililspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ililspy.name=.NET 8.0 ILSpy
+compiler.dotnet80ililspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ililspy.buildConfig=Release
+compiler.dotnet80ililspy.langVersion=latest
+
+compiler.dotnet90ililspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ililspy.name=.NET 9.0 ILSpy
+compiler.dotnet90ililspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ililspy.buildConfig=Release
+compiler.dotnet90ililspy.langVersion=latest
+
+compiler.dotnettrunkililspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkililspy.name=.NET (main) ILSpy
+compiler.dotnettrunkililspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkililspy.buildConfig=Release
+compiler.dotnettrunkililspy.langVersion=preview
+compiler.dotnettrunkililspy.isNightly=true
diff --git a/etc/config/il.defaults.properties b/etc/config/il.defaults.properties
index 53ffa53ae..81fe840ff 100644
--- a/etc/config/il.defaults.properties
+++ b/etc/config/il.defaults.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80ilcoreclr
+defaultCompiler=dotnet90ilcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkilcoreclr:dotnet80ilcoreclr:dotnet70ilcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkilcoreclr:dotnet90ilcoreclr:dotnet80ilcoreclr:dotnet70ilcoreclr:dotnet60ilcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkilcrossgen2:dotnet80ilcrossgen2:dotnet70ilcrossgen2:dotnet60ilcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkilcrossgen2:dotnet90ilcrossgen2:dotnet80ilcrossgen2:dotnet70ilcrossgen2:dotnet60ilcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkilmono
+group.dotnetmono.compilers=dotnettrunkilmono:dotnet90ilmono:dotnet80ilmono:dotnet70ilmono:dotnet60ilmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,27 +24,44 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkilildasm
+group.dotnetildasm.compilers=dotnettrunkilildasm:dotnet90ilildasm:dotnet80ilildasm:dotnet70ilildasm:dotnet60ilildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkililspy:dotnet90ililspy:dotnet80ililspy:dotnet70ililspy:dotnet60ililspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 # CoreCLR compilers
 
-compiler.dotnet70ilcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70ilcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60ilcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ilcoreclr.buildConfig=Release
+compiler.dotnet60ilcoreclr.langVersion=latest
+
+compiler.dotnet70ilcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcoreclr.buildConfig=Release
 compiler.dotnet70ilcoreclr.langVersion=latest
 
-compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80ilcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80ilcoreclr.buildConfig=Release
 compiler.dotnet80ilcoreclr.langVersion=latest
 
+compiler.dotnet90ilcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcoreclr.buildConfig=Release
+compiler.dotnet90ilcoreclr.langVersion=latest
+
 compiler.dotnettrunkilcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkilcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkilcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilcoreclr.buildConfig=Release
 compiler.dotnettrunkilcoreclr.langVersion=preview
@@ -52,26 +69,32 @@ compiler.dotnettrunkilcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60ilcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60ilcrossgen2.buildConfig=Release
 compiler.dotnet60ilcrossgen2.langVersion=latest
 
-compiler.dotnet70ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70ilcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcrossgen2.buildConfig=Release
 compiler.dotnet70ilcrossgen2.langVersion=latest
 
-compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80ilcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80ilcrossgen2.buildConfig=Release
 compiler.dotnet80ilcrossgen2.langVersion=latest
 
+compiler.dotnet90ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcrossgen2.buildConfig=Release
+compiler.dotnet90ilcrossgen2.langVersion=latest
+
 compiler.dotnettrunkilcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkilcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilcrossgen2.buildConfig=Release
 compiler.dotnettrunkilcrossgen2.langVersion=preview
@@ -79,8 +102,32 @@ compiler.dotnettrunkilcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60ilmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilmono.name=.NET 6.0 Mono
+compiler.dotnet60ilmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ilmono.buildConfig=Release
+compiler.dotnet60ilmono.langVersion=latest
+
+compiler.dotnet70ilmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilmono.name=.NET 7.0 Mono
+compiler.dotnet70ilmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70ilmono.buildConfig=Release
+compiler.dotnet70ilmono.langVersion=latest
+
+compiler.dotnet80ilmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilmono.name=.NET 8.0 Mono
+compiler.dotnet80ilmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilmono.buildConfig=Release
+compiler.dotnet80ilmono.langVersion=latest
+
+compiler.dotnet90ilmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilmono.name=.NET 9.0 Mono
+compiler.dotnet90ilmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilmono.buildConfig=Release
+compiler.dotnet90ilmono.langVersion=latest
+
 compiler.dotnettrunkilmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilmono.name=.NET Mono (main)
+compiler.dotnettrunkilmono.name=.NET (main) Mono
 compiler.dotnettrunkilmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilmono.buildConfig=Release
 compiler.dotnettrunkilmono.langVersion=preview
@@ -89,17 +136,74 @@ compiler.dotnettrunkilmono.isNightly=true
 # NativeAOT compilers
 
 compiler.dotnettrunkilnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkilnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkilnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilnativeaot.buildConfig=Release
 compiler.dotnettrunkilnativeaot.langVersion=preview
 compiler.dotnettrunkilnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60ilildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ilildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60ilildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ilildasm.buildConfig=Release
+compiler.dotnet60ilildasm.langVersion=latest
+
+compiler.dotnet70ilildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ilildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70ilildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70ilildasm.buildConfig=Release
+compiler.dotnet70ilildasm.langVersion=latest
+
+compiler.dotnet80ilildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80ilildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilildasm.buildConfig=Release
+compiler.dotnet80ilildasm.langVersion=latest
+
+compiler.dotnet90ilildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90ilildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilildasm.buildConfig=Release
+compiler.dotnet90ilildasm.langVersion=latest
 
 compiler.dotnettrunkilildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkilildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkilildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkilildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkilildasm.buildConfig=Release
 compiler.dotnettrunkilildasm.langVersion=preview
 compiler.dotnettrunkilildasm.isNightly=true
+
+# ILSpy compilers
+
+compiler.dotnet60ililspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60ililspy.name=.NET 6.0 ILSpy
+compiler.dotnet60ililspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60ililspy.buildConfig=Release
+compiler.dotnet60ililspy.langVersion=latest
+
+compiler.dotnet70ililspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70ililspy.name=.NET 7.0 ILSpy
+compiler.dotnet70ililspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70ililspy.buildConfig=Release
+compiler.dotnet70ililspy.langVersion=latest
+
+compiler.dotnet80ililspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ililspy.name=.NET 8.0 ILSpy
+compiler.dotnet80ililspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ililspy.buildConfig=Release
+compiler.dotnet80ililspy.langVersion=latest
+
+compiler.dotnet90ililspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ililspy.name=.NET 9.0 ILSpy
+compiler.dotnet90ililspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ililspy.buildConfig=Release
+compiler.dotnet90ililspy.langVersion=latest
+
+compiler.dotnettrunkililspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkililspy.name=.NET (main) ILSpy
+compiler.dotnettrunkililspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkililspy.buildConfig=Release
+compiler.dotnettrunkililspy.langVersion=preview
+compiler.dotnettrunkililspy.isNightly=true
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index 56e9c15a4..50515a3ea 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -469,3 +469,6 @@ levels:
       - Лев Роскошин
       - salusdano
       - Nitin A
+      - Aaron D. Marasco
+      - Tomas Karban
+      - Abdullah Al-Kheshen
diff --git a/etc/config/vb.amazon.properties b/etc/config/vb.amazon.properties
index fc3750646..48b021b2c 100644
--- a/etc/config/vb.amazon.properties
+++ b/etc/config/vb.amazon.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetlegacy
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy:&dotnetlegacy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80vbcoreclr
+defaultCompiler=dotnet90vbcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkvbcoreclr:dotnet80vbcoreclr:dotnet70vbcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkvbcoreclr:dotnet90vbcoreclr:dotnet80vbcoreclr:dotnet70vbcoreclr:dotnet60vbcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkvbcrossgen2:dotnet80vbcrossgen2:dotnet70vbcrossgen2:dotnet60vbcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkvbcrossgen2:dotnet90vbcrossgen2:dotnet80vbcrossgen2:dotnet70vbcrossgen2:dotnet60vbcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkvbmono
+group.dotnetmono.compilers=dotnettrunkvbmono:dotnet90vbmono:dotnet80vbmono:dotnet70vbmono:dotnet60vbmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,10 +24,15 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkvbildasm
+group.dotnetildasm.compilers=dotnettrunkvbildasm:dotnet90vbildasm:dotnet80vbildasm:dotnet70vbildasm:dotnet60vbildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkvbilspy:dotnet90vbilspy:dotnet80vbilspy:dotnet70vbilspy:dotnet60vbilspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 group.dotnetlegacy.compilers=dotnettrunkvb:dotnet707vb:dotnet703vb:dotnet701vb:dotnet6018vb:dotnet6014vb:dotnet6011vb
 group.dotnetlegacy.compilerCategories=legacy
@@ -36,79 +41,178 @@ group.dotnetlegacy.groupName=Legacy
 
 # CoreCLR compilers
 
-compiler.dotnet70vbcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70vbcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60vbcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbcoreclr.buildConfig=Release
+compiler.dotnet60vbcoreclr.langVersion=latest
+
+compiler.dotnet70vbcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcoreclr.buildConfig=Release
 compiler.dotnet70vbcoreclr.langVersion=latest
 
-compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80vbcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80vbcoreclr.buildConfig=Release
 compiler.dotnet80vbcoreclr.langVersion=latest
 
+compiler.dotnet90vbcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcoreclr.buildConfig=Release
+compiler.dotnet90vbcoreclr.langVersion=latest
+
 compiler.dotnettrunkvbcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkvbcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkvbcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbcoreclr.buildConfig=Release
-compiler.dotnettrunkvbcoreclr.langVersion=preview
+compiler.dotnettrunkvbcoreclr.langVersion=latest
 compiler.dotnettrunkvbcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60vbcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60vbcrossgen2.buildConfig=Release
 compiler.dotnet60vbcrossgen2.langVersion=latest
 
-compiler.dotnet70vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70vbcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcrossgen2.buildConfig=Release
 compiler.dotnet70vbcrossgen2.langVersion=latest
 
-compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80vbcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80vbcrossgen2.buildConfig=Release
 compiler.dotnet80vbcrossgen2.langVersion=latest
 
+compiler.dotnet90vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcrossgen2.buildConfig=Release
+compiler.dotnet90vbcrossgen2.langVersion=latest
+
 compiler.dotnettrunkvbcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkvbcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkvbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbcrossgen2.buildConfig=Release
-compiler.dotnettrunkvbcrossgen2.langVersion=preview
+compiler.dotnettrunkvbcrossgen2.langVersion=latest
 compiler.dotnettrunkvbcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60vbmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbmono.name=.NET 6.0 Mono
+compiler.dotnet60vbmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbmono.buildConfig=Release
+compiler.dotnet60vbmono.langVersion=latest
+
+compiler.dotnet70vbmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbmono.name=.NET 7.0 Mono
+compiler.dotnet70vbmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70vbmono.buildConfig=Release
+compiler.dotnet70vbmono.langVersion=latest
+
+compiler.dotnet80vbmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbmono.name=.NET 8.0 Mono
+compiler.dotnet80vbmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbmono.buildConfig=Release
+compiler.dotnet80vbmono.langVersion=latest
+
+compiler.dotnet90vbmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbmono.name=.NET 9.0 Mono
+compiler.dotnet90vbmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbmono.buildConfig=Release
+compiler.dotnet90vbmono.langVersion=latest
+
 compiler.dotnettrunkvbmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbmono.name=.NET Mono (main)
+compiler.dotnettrunkvbmono.name=.NET (main) Mono
 compiler.dotnettrunkvbmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbmono.buildConfig=Release
-compiler.dotnettrunkvbmono.langVersion=preview
+compiler.dotnettrunkvbmono.langVersion=latest
 compiler.dotnettrunkvbmono.isNightly=true
 
 # NativeAOT compilers
 
 compiler.dotnettrunkvbnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkvbnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkvbnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbnativeaot.buildConfig=Release
-compiler.dotnettrunkvbnativeaot.langVersion=preview
+compiler.dotnettrunkvbnativeaot.langVersion=latest
 compiler.dotnettrunkvbnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60vbildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60vbildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbildasm.buildConfig=Release
+compiler.dotnet60vbildasm.langVersion=latest
+
+compiler.dotnet70vbildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70vbildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70vbildasm.buildConfig=Release
+compiler.dotnet70vbildasm.langVersion=latest
+
+compiler.dotnet80vbildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80vbildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbildasm.buildConfig=Release
+compiler.dotnet80vbildasm.langVersion=latest
+
+compiler.dotnet90vbildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90vbildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbildasm.buildConfig=Release
+compiler.dotnet90vbildasm.langVersion=latest
 
 compiler.dotnettrunkvbildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkvbildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkvbildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbildasm.buildConfig=Release
-compiler.dotnettrunkvbildasm.langVersion=preview
+compiler.dotnettrunkvbildasm.langVersion=latest
 compiler.dotnettrunkvbildasm.isNightly=true
 
+# ILSpy compilers
+
+compiler.dotnet60vbilspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbilspy.name=.NET 6.0 ILSpy
+compiler.dotnet60vbilspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbilspy.buildConfig=Release
+compiler.dotnet60vbilspy.langVersion=latest
+
+compiler.dotnet70vbilspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbilspy.name=.NET 7.0 ILSpy
+compiler.dotnet70vbilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70vbilspy.buildConfig=Release
+compiler.dotnet70vbilspy.langVersion=latest
+
+compiler.dotnet80vbilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbilspy.name=.NET 8.0 ILSpy
+compiler.dotnet80vbilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbilspy.buildConfig=Release
+compiler.dotnet80vbilspy.langVersion=latest
+
+compiler.dotnet90vbilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbilspy.name=.NET 9.0 ILSpy
+compiler.dotnet90vbilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbilspy.buildConfig=Release
+compiler.dotnet90vbilspy.langVersion=latest
+
+compiler.dotnettrunkvbilspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkvbilspy.name=.NET (main) ILSpy
+compiler.dotnettrunkvbilspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkvbilspy.buildConfig=Release
+compiler.dotnettrunkvbilspy.langVersion=latest
+compiler.dotnettrunkvbilspy.isNightly=true
+
 # Legacy compilers (for backwards compatibility, don't add new compilers here)
 
 compiler.dotnet6011vb.exe=/opt/compiler-explorer/dotnet-v6.0.11/.dotnet/dotnet
@@ -151,5 +255,5 @@ compiler.dotnettrunkvb.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
 compiler.dotnettrunkvb.name=.NET (main)
 compiler.dotnettrunkvb.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvb.buildConfig=Release
-compiler.dotnettrunkvb.langVersion=preview
+compiler.dotnettrunkvb.langVersion=latest
 compiler.dotnettrunkvb.isNightly=true
diff --git a/etc/config/vb.defaults.properties b/etc/config/vb.defaults.properties
index d3f01bf4b..48b021b2c 100644
--- a/etc/config/vb.defaults.properties
+++ b/etc/config/vb.defaults.properties
@@ -1,20 +1,20 @@
-compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetlegacy
+compilers=&dotnetcoreclr:&dotnetcrossgen2:&dotnetmono:&dotnetnativeaot:&dotnetildasm:&dotnetilspy:&dotnetlegacy
 supportsBinary=true
 needsMulti=false
-defaultCompiler=dotnet80vbcoreclr
+defaultCompiler=dotnet90vbcoreclr
 executionEnvironmentClass=local-dotnet
 
-group.dotnetcoreclr.compilers=dotnettrunkvbcoreclr:dotnet80vbcoreclr:dotnet70vbcoreclr
+group.dotnetcoreclr.compilers=dotnettrunkvbcoreclr:dotnet90vbcoreclr:dotnet80vbcoreclr:dotnet70vbcoreclr:dotnet60vbcoreclr
 group.dotnetcoreclr.compilerCategories=coreclr
 group.dotnetcoreclr.compilerType=dotnetcoreclr
 group.dotnetcoreclr.groupName=.NET CoreCLR
 
-group.dotnetcrossgen2.compilers=dotnettrunkvbcrossgen2:dotnet80vbcrossgen2:dotnet70vbcrossgen2:dotnet60vbcrossgen2
+group.dotnetcrossgen2.compilers=dotnettrunkvbcrossgen2:dotnet90vbcrossgen2:dotnet80vbcrossgen2:dotnet70vbcrossgen2:dotnet60vbcrossgen2
 group.dotnetcrossgen2.compilerCategories=crossgen2
 group.dotnetcrossgen2.compilerType=dotnetcrossgen2
 group.dotnetcrossgen2.groupName=.NET Crossgen2
 
-group.dotnetmono.compilers=dotnettrunkvbmono
+group.dotnetmono.compilers=dotnettrunkvbmono:dotnet90vbmono:dotnet80vbmono:dotnet70vbmono:dotnet60vbmono
 group.dotnetmono.compilerCategories=mono
 group.dotnetmono.compilerType=dotnetmono
 group.dotnetmono.groupName=.NET Mono
@@ -24,10 +24,15 @@ group.dotnetnativeaot.compilerCategories=nativeaot
 group.dotnetnativeaot.compilerType=dotnetnativeaot
 group.dotnetnativeaot.groupName=.NET NativeAOT
 
-group.dotnetildasm.compilers=dotnettrunkvbildasm
+group.dotnetildasm.compilers=dotnettrunkvbildasm:dotnet90vbildasm:dotnet80vbildasm:dotnet70vbildasm:dotnet60vbildasm
 group.dotnetildasm.compilerCategories=ildasm
 group.dotnetildasm.compilerType=dotnetildasm
-group.dotnetildasm.groupName=.NET IL Disassembler
+group.dotnetildasm.groupName=.NET ILDasm
+
+group.dotnetilspy.compilers=dotnettrunkvbilspy:dotnet90vbilspy:dotnet80vbilspy:dotnet70vbilspy:dotnet60vbilspy
+group.dotnetilspy.compilerCategories=ilspy
+group.dotnetilspy.compilerType=dotnetilspy
+group.dotnetilspy.groupName=.NET ILSpy
 
 group.dotnetlegacy.compilers=dotnettrunkvb:dotnet707vb:dotnet703vb:dotnet701vb:dotnet6018vb:dotnet6014vb:dotnet6011vb
 group.dotnetlegacy.compilerCategories=legacy
@@ -36,20 +41,32 @@ group.dotnetlegacy.groupName=Legacy
 
 # CoreCLR compilers
 
-compiler.dotnet70vbcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70vbcoreclr.name=.NET CoreCLR 7.0
-compiler.dotnet70vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet60vbcoreclr.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbcoreclr.name=.NET 6.0 CoreCLR
+compiler.dotnet60vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbcoreclr.buildConfig=Release
+compiler.dotnet60vbcoreclr.langVersion=latest
+
+compiler.dotnet70vbcoreclr.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbcoreclr.name=.NET 7.0 CoreCLR
+compiler.dotnet70vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcoreclr.buildConfig=Release
 compiler.dotnet70vbcoreclr.langVersion=latest
 
-compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80vbcoreclr.name=.NET CoreCLR 8.0
-compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcoreclr.name=.NET 8.0 CoreCLR
+compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80vbcoreclr.buildConfig=Release
 compiler.dotnet80vbcoreclr.langVersion=latest
 
+compiler.dotnet90vbcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcoreclr.name=.NET 9.0 CoreCLR
+compiler.dotnet90vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcoreclr.buildConfig=Release
+compiler.dotnet90vbcoreclr.langVersion=latest
+
 compiler.dotnettrunkvbcoreclr.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbcoreclr.name=.NET CoreCLR (main)
+compiler.dotnettrunkvbcoreclr.name=.NET (main) CoreCLR
 compiler.dotnettrunkvbcoreclr.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbcoreclr.buildConfig=Release
 compiler.dotnettrunkvbcoreclr.langVersion=latest
@@ -57,26 +74,32 @@ compiler.dotnettrunkvbcoreclr.isNightly=true
 
 # Crossgen2 compilers
 
-compiler.dotnet60vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.30/.dotnet/dotnet
-compiler.dotnet60vbcrossgen2.name=.NET Crossgen2 6.0
-compiler.dotnet60vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.30
+compiler.dotnet60vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbcrossgen2.name=.NET 6.0 Crossgen2
+compiler.dotnet60vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
 compiler.dotnet60vbcrossgen2.buildConfig=Release
 compiler.dotnet60vbcrossgen2.langVersion=latest
 
-compiler.dotnet70vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.19/.dotnet/dotnet
-compiler.dotnet70vbcrossgen2.name=.NET Crossgen2 7.0
-compiler.dotnet70vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.19
+compiler.dotnet70vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbcrossgen2.name=.NET 7.0 Crossgen2
+compiler.dotnet70vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcrossgen2.buildConfig=Release
 compiler.dotnet70vbcrossgen2.langVersion=latest
 
-compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.5/.dotnet/dotnet
-compiler.dotnet80vbcrossgen2.name=.NET Crossgen2 8.0
-compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.5
+compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcrossgen2.name=.NET 8.0 Crossgen2
+compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
 compiler.dotnet80vbcrossgen2.buildConfig=Release
 compiler.dotnet80vbcrossgen2.langVersion=latest
 
+compiler.dotnet90vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcrossgen2.name=.NET 9.0 Crossgen2
+compiler.dotnet90vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcrossgen2.buildConfig=Release
+compiler.dotnet90vbcrossgen2.langVersion=latest
+
 compiler.dotnettrunkvbcrossgen2.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbcrossgen2.name=.NET Crossgen2 (main)
+compiler.dotnettrunkvbcrossgen2.name=.NET (main) Crossgen2
 compiler.dotnettrunkvbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbcrossgen2.buildConfig=Release
 compiler.dotnettrunkvbcrossgen2.langVersion=latest
@@ -84,8 +107,32 @@ compiler.dotnettrunkvbcrossgen2.isNightly=true
 
 # Mono compilers
 
+compiler.dotnet60vbmono.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbmono.name=.NET 6.0 Mono
+compiler.dotnet60vbmono.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbmono.buildConfig=Release
+compiler.dotnet60vbmono.langVersion=latest
+
+compiler.dotnet70vbmono.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbmono.name=.NET 7.0 Mono
+compiler.dotnet70vbmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70vbmono.buildConfig=Release
+compiler.dotnet70vbmono.langVersion=latest
+
+compiler.dotnet80vbmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbmono.name=.NET 8.0 Mono
+compiler.dotnet80vbmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbmono.buildConfig=Release
+compiler.dotnet80vbmono.langVersion=latest
+
+compiler.dotnet90vbmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbmono.name=.NET 9.0 Mono
+compiler.dotnet90vbmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbmono.buildConfig=Release
+compiler.dotnet90vbmono.langVersion=latest
+
 compiler.dotnettrunkvbmono.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbmono.name=.NET Mono (main)
+compiler.dotnettrunkvbmono.name=.NET (main) Mono
 compiler.dotnettrunkvbmono.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbmono.buildConfig=Release
 compiler.dotnettrunkvbmono.langVersion=latest
@@ -94,21 +141,78 @@ compiler.dotnettrunkvbmono.isNightly=true
 # NativeAOT compilers
 
 compiler.dotnettrunkvbnativeaot.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbnativeaot.name=.NET NativeAOT (main)
+compiler.dotnettrunkvbnativeaot.name=.NET (main) NativeAOT
 compiler.dotnettrunkvbnativeaot.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbnativeaot.buildConfig=Release
 compiler.dotnettrunkvbnativeaot.langVersion=latest
 compiler.dotnettrunkvbnativeaot.isNightly=true
 
-# IL disassembler compilers
+# ILDasm compilers
+
+compiler.dotnet60vbildasm.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbildasm.name=.NET 6.0 ILDasm
+compiler.dotnet60vbildasm.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbildasm.buildConfig=Release
+compiler.dotnet60vbildasm.langVersion=latest
+
+compiler.dotnet70vbildasm.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbildasm.name=.NET 7.0 ILDasm
+compiler.dotnet70vbildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70vbildasm.buildConfig=Release
+compiler.dotnet70vbildasm.langVersion=latest
+
+compiler.dotnet80vbildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbildasm.name=.NET 8.0 ILDasm
+compiler.dotnet80vbildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbildasm.buildConfig=Release
+compiler.dotnet80vbildasm.langVersion=latest
+
+compiler.dotnet90vbildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbildasm.name=.NET 9.0 ILDasm
+compiler.dotnet90vbildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbildasm.buildConfig=Release
+compiler.dotnet90vbildasm.langVersion=latest
 
 compiler.dotnettrunkvbildasm.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
-compiler.dotnettrunkvbildasm.name=.NET IL Disassembler (main)
+compiler.dotnettrunkvbildasm.name=.NET (main) ILDasm
 compiler.dotnettrunkvbildasm.clrDir=/opt/compiler-explorer/dotnet-trunk
 compiler.dotnettrunkvbildasm.buildConfig=Release
 compiler.dotnettrunkvbildasm.langVersion=latest
 compiler.dotnettrunkvbildasm.isNightly=true
 
+# ILSpy compilers
+
+compiler.dotnet60vbilspy.exe=/opt/compiler-explorer/dotnet-v6.0.36/.dotnet/dotnet
+compiler.dotnet60vbilspy.name=.NET 6.0 ILSpy
+compiler.dotnet60vbilspy.clrDir=/opt/compiler-explorer/dotnet-v6.0.36
+compiler.dotnet60vbilspy.buildConfig=Release
+compiler.dotnet60vbilspy.langVersion=latest
+
+compiler.dotnet70vbilspy.exe=/opt/compiler-explorer/dotnet-v7.0.20/.dotnet/dotnet
+compiler.dotnet70vbilspy.name=.NET 7.0 ILSpy
+compiler.dotnet70vbilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
+compiler.dotnet70vbilspy.buildConfig=Release
+compiler.dotnet70vbilspy.langVersion=latest
+
+compiler.dotnet80vbilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbilspy.name=.NET 8.0 ILSpy
+compiler.dotnet80vbilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbilspy.buildConfig=Release
+compiler.dotnet80vbilspy.langVersion=latest
+
+compiler.dotnet90vbilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbilspy.name=.NET 9.0 ILSpy
+compiler.dotnet90vbilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbilspy.buildConfig=Release
+compiler.dotnet90vbilspy.langVersion=latest
+
+compiler.dotnettrunkvbilspy.exe=/opt/compiler-explorer/dotnet-trunk/.dotnet/dotnet
+compiler.dotnettrunkvbilspy.name=.NET (main) ILSpy
+compiler.dotnettrunkvbilspy.clrDir=/opt/compiler-explorer/dotnet-trunk
+compiler.dotnettrunkvbilspy.buildConfig=Release
+compiler.dotnettrunkvbilspy.langVersion=latest
+compiler.dotnettrunkvbilspy.isNightly=true
+
 # Legacy compilers (for backwards compatibility, don't add new compilers here)
 
 compiler.dotnet6011vb.exe=/opt/compiler-explorer/dotnet-v6.0.11/.dotnet/dotnet
diff --git a/etc/config/vyper.amazon.properties b/etc/config/vyper.amazon.properties
new file mode 100644
index 000000000..3a41e6841
--- /dev/null
+++ b/etc/config/vyper.amazon.properties
@@ -0,0 +1,22 @@
+compilers=&vyper
+defaultCompiler=vyper040
+
+group.vyper.compilers=vyper040:vyper0310:vyper039:vyper038:vyper037:vyper036
+group.vyper.compilerType=vyper
+group.vyper.instructionSet=evm
+group.vyper.versionFlag=--version
+group.vyper.isSemVer=true
+group.vyper.baseName=vyper
+
+compiler.vyper040.exe=/opt/compiler-explorer/vyper/v0.4.0/bin/vyper
+compiler.vyper040.semver=0.4.0
+compiler.vyper0310.exe=/opt/compiler-explorer/vyper/v0.3.10/bin/vyper
+compiler.vyper0310.semver=0.3.10
+compiler.vyper039.exe=/opt/compiler-explorer/vyper/v0.3.9/bin/vyper
+compiler.vyper039.semver=0.3.9
+compiler.vyper038.exe=/opt/compiler-explorer/vyper/v0.3.8/bin/vyper
+compiler.vyper038.semver=0.3.8
+compiler.vyper037.exe=/opt/compiler-explorer/vyper/v0.3.7/bin/vyper
+compiler.vyper037.semver=0.3.7
+compiler.vyper036.exe=/opt/compiler-explorer/vyper/v0.3.6/bin/vyper
+compiler.vyper036.semver=0.3.6
diff --git a/etc/config/vyper.defaults.properties b/etc/config/vyper.defaults.properties
new file mode 100644
index 000000000..ad05a86e8
--- /dev/null
+++ b/etc/config/vyper.defaults.properties
@@ -0,0 +1,9 @@
+compilers=vyper
+compilerType=vyper
+
+versionFlag=--version
+
+compiler.vyper.exe=/path/to/vyper
+compiler.vyper.isSemVer=true
+compiler.vyper.instructionSet=evm
+compiler.vyper.options=--optimize none
diff --git a/examples/vyper/default.vy b/examples/vyper/default.vy
new file mode 100644
index 000000000..b1df67426
--- /dev/null
+++ b/examples/vyper/default.vy
@@ -0,0 +1,15 @@
+stored_number: uint256
+
+@external
+def set_number(num: uint256):
+    self.stored_number = num
+
+@external
+@view
+def get_number() -> uint256:
+    return self.stored_number
+
+@external
+@view
+def square(a: uint256) -> uint256:
+    return a * a
diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts
index e1d25e233..451fc264a 100644
--- a/lib/base-compiler.ts
+++ b/lib/base-compiler.ts
@@ -65,7 +65,7 @@ import type {
     OptPipelineBackendOptions,
     OptPipelineOutput,
 } from '../types/compilation/opt-pipeline-output.interfaces.js';
-import type {CompilerInfo, ICompiler, PreliminaryCompilerInfo} from '../types/compiler.interfaces.js';
+import type {CompilerInfo, PreliminaryCompilerInfo} from '../types/compiler.interfaces.js';
 import {
     BasicExecutionResult,
     ExecutableExecutionOptions,
@@ -180,8 +180,8 @@ export interface SimpleOutputFilenameCompiler {
     getOutputFilename(dirPath: string): string;
 }
 
-export class BaseCompiler implements ICompiler {
-    public compiler: CompilerInfo; // TODO: Some missing types still present in Compiler type
+export class BaseCompiler {
+    public compiler: CompilerInfo;
     public lang: Language;
     protected compileFilename: string;
     protected env: CompilationEnvironment;
@@ -2858,7 +2858,7 @@ export class BaseCompiler implements ICompiler {
         // it for preprocessor output.
         if ((this.compiler.lang === 'c++' || this.compiler.lang === 'c') && options.includes('-E')) {
             for (const key in filters) {
-                filters[key] = false;
+                (filters as any)[key] = false; // `any` cast is needed because filters can contain non-boolean fields
             }
 
             if (filters.binaryObject && !this.compiler.supportsBinaryObject) {
diff --git a/lib/clientstate-normalizer.ts b/lib/clientstate-normalizer.ts
index fbfab23a0..072f69644 100644
--- a/lib/clientstate-normalizer.ts
+++ b/lib/clientstate-normalizer.ts
@@ -145,14 +145,15 @@ export class ClientStateNormalizer {
         }
     }
 
-    addToolToCompiler(compilerId, toolId, args, stdin) {
+    addToolToCompiler(compilerId: number, toolId: string, args: string[], stdin: string) {
         const glCompiler = this.findCompilerInGoldenLayout(this.rootContent!, compilerId);
         if (glCompiler) {
-            let compiler;
+            let compiler: ClientStateCompiler;
             if (glCompiler.componentState.source) {
                 const session = this.normalized.findOrCreateSession(glCompiler.componentState.source);
                 compiler = session.findOrCreateCompiler(compilerId);
-            } else if (glCompiler.componentState.tree) {
+            } else {
+                assert(glCompiler.componentState.tree);
                 const tree = this.normalized.findOrCreateTree(glCompiler.componentState.tree);
                 compiler = tree.findOrCreateCompiler(compilerId);
             }
@@ -516,9 +517,9 @@ class GoldenLayoutComponents {
     createToolComponent(
         session: ClientStateSession | null,
         compilerIndex: number,
-        toolId: number,
-        args,
-        stdin,
+        toolId: string,
+        args: string[],
+        stdin: string,
         customSessionId?,
     ): GoldenLayoutComponentStruct {
         return {
@@ -832,9 +833,9 @@ export class ClientStateGoldenifier extends GoldenLayoutComponents {
     newToolStackFromCompiler(
         session: ClientStateSession,
         compilerIndex: number,
-        toolId,
-        args,
-        stdin,
+        toolId: string,
+        args: string[],
+        stdin: string,
         width: number,
     ): BasicGoldenLayoutStruct {
         return this.newStackWithOneComponent(
diff --git a/lib/compilers/_all.ts b/lib/compilers/_all.ts
index 7d181e882..2a9a63528 100644
--- a/lib/compilers/_all.ts
+++ b/lib/compilers/_all.ts
@@ -57,6 +57,7 @@ export {
     DotNetCoreClrCompiler,
     DotNetCrossgen2Compiler,
     DotNetIlDasmCompiler,
+    DotNetIlSpyCompiler,
     DotNetLegacyCompiler,
     DotNetMonoCompiler,
     DotNetNativeAotCompiler,
@@ -137,6 +138,7 @@ export {TurboCCompiler} from './turboc.js';
 export {TypeScriptNativeCompiler} from './typescript-native.js';
 export {VCompiler} from './v.js';
 export {ValaCompiler} from './vala.js';
+export {VyperCompiler} from './vyper.js';
 export {V8Compiler} from './v8.js';
 export {Win32Compiler} from './win32.js';
 export {Win32Vc6Compiler} from './win32-vc6.js';
diff --git a/lib/compilers/cerberus.ts b/lib/compilers/cerberus.ts
index 94ef8a682..ccd8ab2c2 100644
--- a/lib/compilers/cerberus.ts
+++ b/lib/compilers/cerberus.ts
@@ -125,7 +125,7 @@ export class CerberusCompiler extends BaseCompiler {
         }
 
         const lines = result.asm.split('\n');
-        const plines = lines.map(l => ({text: l}));
+        const plines = lines.map((l: string) => ({text: l}));
         return {
             asm: plines,
             languageId: 'core',
diff --git a/lib/compilers/d8.ts b/lib/compilers/d8.ts
index 69403abf9..5a818befd 100644
--- a/lib/compilers/d8.ts
+++ b/lib/compilers/d8.ts
@@ -51,6 +51,9 @@ export class D8Compiler extends BaseCompiler implements SimpleOutputFilenameComp
 
     minApiArgRegex: RegExp;
 
+    jvmSyspropArgRegex: RegExp;
+    syspropArgRegex: RegExp;
+
     javaId: string;
     kotlinId: string;
 
@@ -64,6 +67,9 @@ export class D8Compiler extends BaseCompiler implements SimpleOutputFilenameComp
 
         this.minApiArgRegex = /^--min-api$/;
 
+        this.jvmSyspropArgRegex = /^-J.*$/;
+        this.syspropArgRegex = /^-D.*$/;
+
         this.javaId = this.compilerProps<string>(`group.${this.compiler.group}.javaId`);
         this.kotlinId = this.compilerProps<string>(`group.${this.compiler.group}.kotlinId`);
 
@@ -154,16 +160,25 @@ export class D8Compiler extends BaseCompiler implements SimpleOutputFilenameComp
         const sourceFileOptionIndex = options.findIndex(option => {
             return option.endsWith('.java') || option.endsWith('.kt');
         });
-        const userOptions = options.slice(0, sourceFileOptionIndex);
+        let userOptions = options.slice(0, sourceFileOptionIndex);
+        const syspropOptions: string[] = [];
         for (const option of userOptions) {
             if (this.minApiArgRegex.test(option)) {
                 useDefaultMinApi = false;
+            } else if (this.jvmSyspropArgRegex.test(option)) {
+                syspropOptions.push(option.replace('-J', '-'));
+            } else if (this.syspropArgRegex.test(option)) {
+                syspropOptions.push(option);
             }
         }
+        userOptions = userOptions.filter(
+            option => !this.jvmSyspropArgRegex.test(option) && !this.syspropArgRegex.test(option),
+        );
 
         const files = await fs.readdir(preliminaryCompilePath, {encoding: 'utf8', recursive: true});
         const classFiles = files.filter(f => f.endsWith('.class'));
         const d8Options = [
+            ...syspropOptions,
             '-cp',
             this.compiler.exe, // R8 jar.
             'com.android.tools.r8.D8', // Main class name for the D8 compiler.
diff --git a/lib/compilers/dosbox-compiler.ts b/lib/compilers/dosbox-compiler.ts
index 0b317c705..eb27ef826 100644
--- a/lib/compilers/dosbox-compiler.ts
+++ b/lib/compilers/dosbox-compiler.ts
@@ -154,7 +154,7 @@ export class DosboxCompiler extends BaseCompiler {
 
         const stdoutFilename = path.join(tempDir, 'STDOUT.TXT');
         const stdout = await fs.readFile(stdoutFilename);
-        (result as any).stdout = stdout.toString('utf8');
+        result.stdout = stdout.toString('utf8');
 
         return result;
     }
diff --git a/lib/compilers/dotnet.ts b/lib/compilers/dotnet.ts
index 63bf6ea43..61b18ec6a 100644
--- a/lib/compilers/dotnet.ts
+++ b/lib/compilers/dotnet.ts
@@ -51,6 +51,7 @@ class DotNetCompiler extends BaseCompiler {
     private readonly crossgen2Path: string;
     private readonly ilcPath: string;
     private readonly ildasmPath: string;
+    private readonly toolsPath: string;
 
     constructor(compilerInfo: PreliminaryCompilerInfo, env: CompilationEnvironment) {
         super(compilerInfo, env);
@@ -65,6 +66,7 @@ class DotNetCompiler extends BaseCompiler {
         this.crossgen2Path = path.join(this.clrBuildDir, 'crossgen2', 'crossgen2');
         this.ilcPath = path.join(this.clrBuildDir, 'ilc-published', 'ilc');
         this.ildasmPath = path.join(this.clrBuildDir, 'ildasm');
+        this.toolsPath = path.join(this.clrBuildDir, 'dotnet-tools', '.store');
 
         this.asm = new DotNetAsmParser();
         this.disassemblyLoaderPath = path.join(this.clrBuildDir, 'DisassemblyLoader', 'DisassemblyLoader.dll');
@@ -271,7 +273,7 @@ class DotNetCompiler extends BaseCompiler {
                 break;
             }
             case 'il': {
-                compilerResult = await this.runIlasm(
+                compilerResult = await this.runIlAsm(
                     compilerInfo.compilerPath,
                     inputFilename,
                     outputFilename,
@@ -562,7 +564,7 @@ do()
         return await super.runCompiler(dotnetPath, [compilerInfo.compilerPath, ...options], inputFilename, execOptions);
     }
 
-    async runIlasm(
+    async runIlAsm(
         ilasmPath: string,
         inputFilename: string,
         outputFilename: string,
@@ -607,7 +609,8 @@ do()
         const programDllPath = path.join(programOutputPath, 'CompilerExplorer.dll');
         const envVarFileContents = ['DOTNET_EnableWriteXorExecute=0'];
         const isIlDasm = this.compiler.group === 'dotnetildasm';
-        const toolOptions: string[] = isIlDasm ? [] : ['--parallelism', '1'];
+        const isIlSpy = this.compiler.group === 'dotnetilspy';
+        const toolOptions: string[] = isIlDasm || isIlSpy ? [] : ['--parallelism', '1'];
         const toolSwitches: string[] = [];
 
         let overrideDiffable = false;
@@ -678,7 +681,7 @@ do()
             }
         }
 
-        if (!isIlDasm) {
+        if (!isIlDasm && !isIlSpy) {
             if (!overrideDiffable) {
                 if (compilerInfo.sdkMajorVersion < 8) {
                     toolOptions.push('--codegenopt', 'JitDiffableDasm=1');
@@ -728,6 +731,19 @@ do()
             if (ilDasmResult.code !== 0) {
                 return ilDasmResult;
             }
+        } else if (isIlSpy) {
+            const ilSpyResult = await this.runIlSpy(
+                execOptions,
+                programDllPath,
+                toolOptions,
+                toolSwitches,
+                this.getOutputFilename(programDir, this.outputFilebase),
+                compilerInfo.sdkMajorVersion <= 6,
+            );
+
+            if (ilSpyResult.code !== 0) {
+                return ilSpyResult;
+            }
         } else if (isCrossgen2) {
             const crossgen2Result = await this.runCrossgen2(
                 compiler,
@@ -758,17 +774,15 @@ do()
                 return ilcResult;
             }
         } else {
-            const envVarFilePath = path.join(programDir, '.env');
-            await fs.writeFile(envVarFilePath, envVarFileContents.join('\n'));
-
             const corerunResult = await this.runCorerunForDisasm(
                 execOptions,
                 this.clrBuildDir,
-                envVarFilePath,
+                envVarFileContents,
                 programDllPath,
                 corerunArgs,
                 this.getOutputFilename(programDir, this.outputFilebase),
                 isMono,
+                compilerInfo.sdkMajorVersion >= 7,
             );
 
             if (corerunResult.code !== 0) {
@@ -794,23 +808,34 @@ do()
     }
 
     async runCorerunForDisasm(
-        execOptions: ExecutionOptions,
+        execOptions: ExecutionOptionsWithEnv,
         coreRoot: string,
-        envPath: string,
+        envVars: string[],
         dllPath: string,
         options: string[],
         outputPath: string,
         isMono: boolean,
+        useEnvFile: boolean,
     ) {
         if (isMono) {
             coreRoot = path.join(coreRoot, 'mono');
         }
 
-        const corerunOptions = ['--clr-path', coreRoot, '--env', envPath].concat([
-            ...options,
-            this.disassemblyLoaderPath,
-            dllPath,
-        ]);
+        const corerunOptions = ['--clr-path', coreRoot].concat([...options, this.disassemblyLoaderPath, dllPath]);
+
+        if (useEnvFile) {
+            const envVarFilePath = path.join(path.dirname(outputPath), '.env');
+            await fs.writeFile(envVarFilePath, envVars.join('\n'));
+            corerunOptions.splice(0, 0, '--env', envVarFilePath);
+        } else {
+            for (const env of envVars) {
+                const delimiterIndex = env.indexOf('=');
+                if (delimiterIndex !== -1) {
+                    execOptions.env[env.substring(0, delimiterIndex)] = env.substring(delimiterIndex + 1);
+                }
+            }
+        }
+
         const compilerExecResult = await this.exec(this.corerunPath, corerunOptions, execOptions);
         const result = this.transformToCompilationResult(compilerExecResult, dllPath);
 
@@ -824,6 +849,38 @@ do()
         return result;
     }
 
+    async runIlSpy(
+        execOptions: ExecutionOptions,
+        dllPath: string,
+        toolOptions: string[],
+        toolSwitches: string[],
+        outputPath: string,
+        useDotNetHost: boolean,
+    ) {
+        const ilspyRoot = path.join(this.toolsPath, 'ilspycmd');
+        const ilspyVersionDirs = await fs.readdir(ilspyRoot);
+        const ilspyVersion = ilspyVersionDirs[0];
+        const ilspyToolsDir = path.join(ilspyRoot, ilspyVersion, 'ilspycmd', ilspyVersion, 'tools');
+        const targetFrameworkDirs = await fs.readdir(ilspyToolsDir);
+        const targetFramework = targetFrameworkDirs[0];
+        const ilspyPath = path.join(ilspyToolsDir, targetFramework, 'any', 'ilspycmd.dll');
+
+        // prettier-ignore
+        const ilspyOptions = [ilspyPath, dllPath, '--disable-updatecheck'].concat(toolOptions).concat(toolSwitches);
+        const compilerPath = useDotNetHost ? this.compiler.exe : this.corerunPath;
+        const compilerExecResult = await this.exec(compilerPath, ilspyOptions, execOptions);
+        const result = this.transformToCompilationResult(compilerExecResult, dllPath);
+
+        await fs.writeFile(
+            outputPath,
+            `// ilspy ${await this.getRuntimeVersion()}\n\n${result.stdout
+                .map(o => o.text)
+                .reduce((a, n) => `${a}\n${n}`, '')}`,
+        );
+
+        return result;
+    }
+
     async runIlDasm(
         execOptions: ExecutionOptions,
         dllPath: string,
@@ -1001,6 +1058,12 @@ export class DotNetIlDasmCompiler extends DotNetCompiler {
     }
 }
 
+export class DotNetIlSpyCompiler extends DotNetCompiler {
+    static get key() {
+        return 'dotnetilspy';
+    }
+}
+
 export class DotNetLegacyCompiler extends DotNetCompiler {
     static get key() {
         return 'dotnetlegacy';
diff --git a/lib/compilers/ldc.ts b/lib/compilers/ldc.ts
index 65ee6e599..edd7be844 100644
--- a/lib/compilers/ldc.ts
+++ b/lib/compilers/ldc.ts
@@ -112,7 +112,7 @@ export class LDCCompiler extends BaseCompiler {
 
         return this.loadASTOutput(
             await this.runCompiler(this.compiler.exe, newOptions, this.filename(inputFilename), execOptions),
-        ) as any;
+        );
     }
 
     async loadASTOutput(result: CompilationResult): Promise<ResultLine[]> {
diff --git a/lib/compilers/nim.ts b/lib/compilers/nim.ts
index dc2940c2e..75002dc07 100644
--- a/lib/compilers/nim.ts
+++ b/lib/compilers/nim.ts
@@ -27,6 +27,7 @@ import path from 'path';
 import fs from 'fs-extra';
 import _ from 'underscore';
 
+import {CompilationResult} from '../../types/compilation/compilation.interfaces.js';
 import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
 import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
 import {unwrap} from '../assert.js';
@@ -91,14 +92,18 @@ export class NimCompiler extends BaseCompiler {
         return path.join(cacheDir, resultName);
     }
 
-    override async postProcess(result, outputFilename: string, filters: ParseFiltersAndOutputOptions) {
+    override async postProcess(
+        result: CompilationResult,
+        outputFilename: string,
+        filters: ParseFiltersAndOutputOptions,
+    ) {
         const options = result.compilationOptions;
         const cacheDir = this.cacheDir(outputFilename);
         try {
-            if (_.intersection(options, ['js', 'check']).length > 0) filters.binary = false;
+            if (_.intersection(options!, ['js', 'check']).length > 0) filters.binary = false;
             else {
                 filters.binary = true;
-                const objFile = this.getCacheFile(options, result.inputFilename, cacheDir);
+                const objFile = this.getCacheFile(options!, result.inputFilename!, cacheDir);
                 await fs.move(unwrap(objFile), outputFilename);
             }
             return super.postProcess(result, outputFilename, filters);
diff --git a/lib/compilers/r8.ts b/lib/compilers/r8.ts
index e1e57647d..1d0342737 100644
--- a/lib/compilers/r8.ts
+++ b/lib/compilers/r8.ts
@@ -132,17 +132,26 @@ export class R8Compiler extends D8Compiler implements SimpleOutputFilenameCompil
         const sourceFileOptionIndex = options.findIndex(option => {
             return option.endsWith('.java') || option.endsWith('.kt');
         });
-        const userOptions = options.slice(0, sourceFileOptionIndex);
+        let userOptions = options.slice(0, sourceFileOptionIndex);
+        const syspropOptions: string[] = [];
         for (const option of userOptions) {
             if (this.minApiArgRegex.test(option)) {
                 useDefaultMinApi = false;
+            } else if (this.jvmSyspropArgRegex.test(option)) {
+                syspropOptions.push(option.replace('-J', '-'));
+            } else if (this.syspropArgRegex.test(option)) {
+                syspropOptions.push(option);
             }
         }
+        userOptions = userOptions.filter(
+            option => !this.jvmSyspropArgRegex.test(option) && !this.syspropArgRegex.test(option),
+        );
 
         const files = await fs.readdir(preliminaryCompilePath);
         const classFiles = files.filter(f => f.endsWith('.class'));
         const r8Options = [
             '-Dcom.android.tools.r8.enableKeepAnnotations=1',
+            ...syspropOptions,
             '-cp',
             this.compiler.exe, // R8 jar.
             'com.android.tools.r8.R8',
diff --git a/lib/compilers/vyper.ts b/lib/compilers/vyper.ts
new file mode 100644
index 000000000..99ad3ea95
--- /dev/null
+++ b/lib/compilers/vyper.ts
@@ -0,0 +1,85 @@
+import path from 'path';
+
+import type {
+    AsmResultSource,
+    ParsedAsmResult,
+    ParsedAsmResultLine,
+} from '../../types/asmresult/asmresult.interfaces.js';
+import {BaseCompiler} from '../base-compiler.js';
+
+export class VyperCompiler extends BaseCompiler {
+    static get key() {
+        return 'vyper';
+    }
+
+    override getOutputFilename(dirPath: string) {
+        return path.join(dirPath, 'output.txt');
+    }
+
+    override optionsForFilter(): string[] {
+        return ['-f', 'opcodes,source_map', '-o', 'output.txt'];
+    }
+
+    override isCfgCompiler() {
+        // TODO: it is possible to extract CFG using rattle and pc_jump_map, might implement in the future
+        return false;
+    }
+
+    override async processAsm(result): Promise<ParsedAsmResult> {
+        if (result.code !== 0) {
+            const stderrOutput = result.stderr.map(entry => entry.text).join('\n');
+            return {asm: [{text: result.asm + '\n\n' + stderrOutput}]};
+        }
+
+        const [opcodesStr, sourceMapStr] = result.asm.split('\n');
+        const sourceMapObj = JSON.parse(sourceMapStr);
+
+        const segments: ParsedAsmResultLine[] = [];
+        const opcodesArray = opcodesStr.split(' ');
+
+        const pcPosMap = sourceMapObj['pc_pos_map'];
+
+        let pc = 0;
+
+        for (let i = 0; i < opcodesArray.length; i++) {
+            const opcode = opcodesArray[i];
+            let disassembly = opcode;
+
+            if (opcode.startsWith('PUSH') && opcode !== 'PUSH0' && i < opcodesArray.length - 1) {
+                disassembly += ` ${opcodesArray[i + 1]}`;
+                i++;
+            }
+
+            const source: AsmResultSource | null =
+                pc in pcPosMap
+                    ? {
+                          file: null,
+                          line: pcPosMap[pc][0],
+                          column: pcPosMap[pc][1],
+                          mainsource: true,
+                      }
+                    : null;
+
+            const asmResultLine: ParsedAsmResultLine = {
+                text: disassembly,
+                opcodes: [opcode],
+                address: pc,
+                disassembly,
+                source,
+            };
+
+            segments.push(asmResultLine);
+
+            if (opcode.startsWith('PUSH')) {
+                const pushBytes = parseInt(opcode.slice(4), 10);
+                pc += 1 + pushBytes;
+            } else {
+                pc += 1;
+            }
+        }
+
+        return {
+            asm: segments,
+        };
+    }
+}
diff --git a/lib/compilers/ylc.ts b/lib/compilers/ylc.ts
index 47e56c093..d1e9c386b 100644
--- a/lib/compilers/ylc.ts
+++ b/lib/compilers/ylc.ts
@@ -71,7 +71,7 @@ export class YLCCompiler extends BaseCompiler {
 
         return this.orderArguments(
             options,
-            '-in=' + inputFilename,
+            inputFilename,
             libIncludes,
             libOptions,
             libPathsAsFlags,
diff --git a/lib/handlers/source.ts b/lib/handlers/source.ts
index 9e49e60ca..b9e064913 100644
--- a/lib/handlers/source.ts
+++ b/lib/handlers/source.ts
@@ -42,7 +42,7 @@ export class SourceHandler {
     }
 
     private getActionForSource(source: Source, action: string): ((...args: unknown[]) => Promise<unknown>) | null {
-        return ALLOWED_ACTIONS.has(action) ? source[action] : null;
+        return ALLOWED_ACTIONS.has(action) ? (source as any)[action] : null;
     }
 
     public handle(req: express.Request, res: express.Response, next: express.NextFunction): void {
diff --git a/lib/languages.ts b/lib/languages.ts
index e8d9a0be9..7bdff9de6 100644
--- a/lib/languages.ts
+++ b/lib/languages.ts
@@ -816,6 +816,17 @@ const definitions: Record<LanguageKey, LanguageDefinition> = {
         previewFilter: null,
         monacoDisassembly: null,
     },
+    vyper: {
+        name: 'Vyper',
+        monaco: 'python',
+        extensions: ['.vy'],
+        alias: [],
+        logoUrl: 'vyper.svg',
+        logoUrlDark: null,
+        formatter: null,
+        previewFilter: null,
+        monacoDisassembly: null,
+    },
     wasm: {
         name: 'WASM',
         monaco: 'wat',
diff --git a/lib/s3-handler.ts b/lib/s3-handler.ts
index 7e7bdc9a9..9b4d43fec 100644
--- a/lib/s3-handler.ts
+++ b/lib/s3-handler.ts
@@ -59,7 +59,8 @@ export class S3Bucket {
         }
     }
 
-    async delete(key, path): Promise<boolean> {
+    // Unused?
+    async delete(key: string, path: string): Promise<boolean> {
         try {
             await this.instance.deleteObject({Bucket: this.bucket, Key: `${path}/${key}`});
         } catch (x: any) {
diff --git a/static/main.ts b/static/main.ts
index 8f75398a7..2a688a906 100644
--- a/static/main.ts
+++ b/static/main.ts
@@ -66,6 +66,7 @@ import {Printerinator} from './print-view.js';
 import {formatISODate, updateAndCalcTopBarHeight} from './utils.js';
 import {localStorage, sessionThenLocalStorage} from './local.js';
 import {setupRealDark, takeUsersOutOfRealDark} from './real-dark.js';
+import {ParseFiltersAndOutputOptions} from './features/filters.interfaces.js';
 
 const logos = require.context('../views/resources/logos', false, /\.(png|svg)$/);
 
@@ -256,15 +257,16 @@ function configFromEmbedded(embeddedUrl: string, defaultLangId: string) {
         throw new Error('Embed url decode error');
     }
     if (params && params.source && params.compiler) {
-        const filters = Object.fromEntries(((params.filters as string) || '').split(',').map(o => [o, true]));
-        // TODO(jeremy-rifkin): Fix types
+        const filters: ParseFiltersAndOutputOptions = Object.fromEntries(
+            ((params.filters as string) || '').split(',').map(o => [o, true]),
+        );
         return {
             content: [
                 {
                     type: 'row',
                     content: [
-                        Components.getEditorWith(1, params.source, filters as any, defaultLangId),
-                        Components.getCompilerWith(1, filters as any, params.options, params.compiler),
+                        Components.getEditorWith(1, params.source, filters, defaultLangId),
+                        Components.getCompilerWith(1, filters, params.options, params.compiler),
                     ],
                 },
             ],
diff --git a/static/panes/diff.ts b/static/panes/diff.ts
index c5b6b1b5b..32511cf7b 100644
--- a/static/panes/diff.ts
+++ b/static/panes/diff.ts
@@ -198,7 +198,7 @@ export class Diff extends MonacoPane<monaco.editor.IStandaloneDiffEditor, DiffSt
     compilers: Record<string | number, CompilerEntry> = {};
     lhs: DiffStateObject;
     rhs: DiffStateObject;
-    selectize: SelectizeType = {} as any; // will be filled in by the constructor
+    selectize: SelectizeType;
     constructor(hub: Hub, container: Container, state: MonacoPaneState & DiffState) {
         super(hub, container, state);
 
diff --git a/static/panes/gccdump-view.ts b/static/panes/gccdump-view.ts
index d52fd395e..90ebbff94 100644
--- a/static/panes/gccdump-view.ts
+++ b/static/panes/gccdump-view.ts
@@ -447,8 +447,7 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
 
             ...parent,
         };
-        // TODO(jeremy-rifkin)
-        return state as any;
+        return state;
     }
 
     override close() {
diff --git a/static/sharing.ts b/static/sharing.ts
index 76ed7ecb9..4c2fe498a 100644
--- a/static/sharing.ts
+++ b/static/sharing.ts
@@ -58,6 +58,16 @@ const shareServices = {
         },
         text: 'Tweet',
     },
+    bluesky: {
+        embedValid: false,
+        logoClass: 'fab fa-bluesky',
+        cssClass: 'share-bluesky',
+        getLink: (title: string, url: string) => {
+            const text = `${title} ${url} via @compiler-explorer.com`;
+            return `https://bsky.app/intent/compose?text=${encodeURIComponent(text)}`;
+        },
+        text: 'Share on Bluesky',
+    },
     reddit: {
         embedValid: false,
         logoClass: 'fab fa-reddit',
diff --git a/static/styles/themes/dark-theme.scss b/static/styles/themes/dark-theme.scss
index f01ad2545..b0d513764 100644
--- a/static/styles/themes/dark-theme.scss
+++ b/static/styles/themes/dark-theme.scss
@@ -566,6 +566,11 @@ textarea.form-control {
     color: white !important;
 }
 
+.share-bluesky {
+    background-color: #0a7aff !important;
+    color: white !important;
+}
+
 #simplecook {
     background-color: #474747 !important;
 }
diff --git a/static/styles/themes/default-theme.scss b/static/styles/themes/default-theme.scss
index 3344c7baa..61386e580 100644
--- a/static/styles/themes/default-theme.scss
+++ b/static/styles/themes/default-theme.scss
@@ -259,6 +259,12 @@ a.navbar-brand img.logo.normal {
     color: white;
 }
 
+#socialshare .share-bluesky,
+.share-bluesky {
+    background-color: #0a7aff;
+    color: white;
+}
+
 #socialshare .share-reddit,
 .share-reddit {
     background-color: #ff4500;
diff --git a/static/styles/themes/one-dark-theme.scss b/static/styles/themes/one-dark-theme.scss
index af7e35e06..907240dc4 100644
--- a/static/styles/themes/one-dark-theme.scss
+++ b/static/styles/themes/one-dark-theme.scss
@@ -622,6 +622,11 @@ textarea.form-control {
     color: #eee !important;
 }
 
+.share-bluesky {
+    background-color: #0a7aff !important;
+    color: #eee !important;
+}
+
 #simplecook {
     background-color: #474747 !important;
 }
diff --git a/static/styles/themes/pink-theme.scss b/static/styles/themes/pink-theme.scss
index 16cbf45be..e9f040133 100644
--- a/static/styles/themes/pink-theme.scss
+++ b/static/styles/themes/pink-theme.scss
@@ -586,6 +586,11 @@ textarea.form-control {
     color: white !important;
 }
 
+.share-bluesky {
+    background-color: #0a7aff !important;
+    color: white !important;
+}
+
 #simplecook {
     background-color: #474747 !important;
 }
diff --git a/types/compiler.interfaces.ts b/types/compiler.interfaces.ts
index 98cea8251..23b548aab 100644
--- a/types/compiler.interfaces.ts
+++ b/types/compiler.interfaces.ts
@@ -22,20 +22,11 @@
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 
-import {
-    ActiveTool,
-    BypassCache,
-    CompilationResult,
-    ExecutionParams,
-    FiledataPair,
-} from './compilation/compilation.interfaces.js';
 import {AllCompilerOverrideOptions} from './compilation/compiler-overrides.interfaces.js';
-import {ICompilerArguments} from './compiler-arguments.interfaces.js';
 import {PossibleRuntimeTools} from './execution/execution.interfaces.js';
-import {ParseFiltersAndOutputOptions} from './features/filters.interfaces.js';
 import {InstructionSet} from './instructionsets.js';
-import {Language, LanguageKey} from './languages.interfaces.js';
-import {Library, SelectedLibraryVersion} from './libraries/libraries.interfaces.js';
+import {LanguageKey} from './languages.interfaces.js';
+import {Library} from './libraries/libraries.interfaces.js';
 import {Tool, ToolInfo} from './tool.interfaces.js';
 
 export type Remote = {
@@ -167,22 +158,3 @@ export type CompilerInfo = {
 export type PreliminaryCompilerInfo = Omit<CompilerInfo, 'version' | 'fullVersion' | 'baseName' | 'disabledFilters'> & {
     version?: string;
 };
-
-export interface ICompiler {
-    possibleArguments: ICompilerArguments;
-    lang: Language;
-    compile(
-        source: string,
-        options: string[],
-        backendOptions: Record<string, any>,
-        filters: ParseFiltersAndOutputOptions,
-        bypassCache: BypassCache,
-        tools: ActiveTool[],
-        executeParameters: ExecutionParams,
-        libraries: SelectedLibraryVersion[],
-        files: FiledataPair[],
-    ): Promise<any>;
-    cmake(files: FiledataPair[], key, bypassCache: BypassCache): Promise<CompilationResult>;
-    initialise(mtime: Date, clientOptions, isPrediscovered: boolean): Promise<ICompiler | null>;
-    getInfo(): CompilerInfo;
-}
diff --git a/types/languages.interfaces.ts b/types/languages.interfaces.ts
index a61631fc8..2ad7b675d 100644
--- a/types/languages.interfaces.ts
+++ b/types/languages.interfaces.ts
@@ -93,6 +93,7 @@ export type LanguageKey =
     | 'v'
     | 'vala'
     | 'vb'
+    | 'vyper'
     | 'wasm'
     | 'zig'
     | 'ylc';
diff --git a/views/menu-other.pug b/views/menu-other.pug
index 3d1a1e5ca..9b1c47ee0 100644
--- a/views/menu-other.pug
+++ b/views/menu-other.pug
@@ -43,6 +43,10 @@ a.dropdown-item(href="https://hachyderm.io/@compiler_explorer" rel="me noopener"
     span.dropdown-icon.fas.fa-paper-plane
     | CE on Mastodon
     | &nbsp;
+a.dropdown-item(href="https://bsky.app/profile/compiler-explorer.com" rel="noopener")
+    span.dropdown-icon.fab.fa-bluesky
+    | CE on Bluesky
+    | &nbsp;
 a.dropdown-item(href="https://xania.org/MattGodbolt" rel="author" target="_blank")
     span.dropdown-icon.fas.fa-address-card
     | About the author
diff --git a/views/resources/logos/vyper.svg b/views/resources/logos/vyper.svg
new file mode 100644
index 000000000..d2c666074
--- /dev/null
+++ b/views/resources/logos/vyper.svg
@@ -0,0 +1,4 @@
+<svg width="338" height="376" viewBox="0 0 338 376" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M195.008 311.356L82.2221 198.603C77.6282 193.823 75.0968 187.356 75.0968 180.139V19.2101C75.0968 9.83746 65.7215 0.464804 56.3461 0.464804H18.7508C9.37539 0.464804 0 9.83746 0 19.2101V206.663C0 216.598 3.6564 226.158 10.6879 233.188L141.943 364.405C149.256 371.716 158.819 375.371 168.476 375.371H187.226C197.633 375.371 205.977 366.936 205.977 356.626V337.974C205.977 328.32 202.321 318.76 195.008 311.45V311.356Z" fill="#9F4CF2"/>
+<path d="M337.514 19.1164C337.514 9.65003 328.233 0.371094 318.764 0.371094H281.168C271.793 0.371094 262.418 9.74375 262.418 19.1164V179.951C262.418 187.168 259.605 193.635 254.917 198.509L217.134 236.281C209.822 243.592 206.165 253.152 206.165 262.806V281.551C206.165 291.955 214.603 300.296 224.916 300.296H243.667C253.23 300.296 262.886 296.641 270.199 289.33L326.451 233.094C333.483 226.065 337.421 216.505 337.421 206.57V19.1164H337.514Z" fill="#9F4CF2"/>
+</svg>


Test patch:
diff --git a/lib/compilers/fake-for-test.ts b/lib/compilers/fake-for-test.ts
index 0ac21db74..699e010d6 100644
--- a/lib/compilers/fake-for-test.ts
+++ b/lib/compilers/fake-for-test.ts
@@ -24,13 +24,18 @@
 
 import _ from 'underscore';
 
-import {BypassCache, ExecutionParams, FiledataPair} from '../../types/compilation/compilation.interfaces.js';
-import type {ICompiler, PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
+import {
+    ActiveTool,
+    BypassCache,
+    ExecutionParams,
+    FiledataPair,
+} from '../../types/compilation/compilation.interfaces.js';
+import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
 import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
 import {SelectedLibraryVersion} from '../../types/libraries/libraries.interfaces.js';
 import {CompilerArguments} from '../compiler-arguments.js';
 
-export class FakeCompiler implements ICompiler {
+export class FakeCompiler {
     public possibleArguments: CompilerArguments;
     public lang: any;
     private compiler: any;
@@ -81,7 +86,7 @@ export class FakeCompiler implements ICompiler {
         backendOptions: Record<string, any>,
         filters: ParseFiltersAndOutputOptions,
         bypassCache: BypassCache,
-        tools,
+        tools: ActiveTool[],
         executeParameters: ExecutionParams,
         libraries: SelectedLibraryVersion[],
         files?: FiledataPair[],