diff --git a/data/hotfixes/linux/hotfix-makefile-enable-ra-and-ts.patch b/data/hotfixes/linux/hotfix-makefile-enable-ra-and-ts.patch
new file mode 100644
index 0000000..a83e152
--- /dev/null
+++ b/data/hotfixes/linux/hotfix-makefile-enable-ra-and-ts.patch
@@ -0,0 +1,11 @@
+--- a/Makefile
++++ b/Makefile
+@@ -388,6 +388,8 @@
+ @$(INSTALL_PROGRAM) MaxMind.Db.dll "$(DATA_INSTALL_DIR)"
+ @$(INSTALL_PROGRAM) SmarIrc4net.dll "$(DATA_INSTALL_DIR)"
+
++ @$(CP_R) mods/ra "$(DATA_INSTALL_DIR)/mods/"
++ @$(CP_R) mods/ts "$(DATA_INSTALL_DIR)/mods/"
+ ifneq ($(UNAME_S),Darwin)
+ @$(CP) *.sh "$(DATA_INSTALL_DIR)"
+ endif
diff --git a/data/hotfixes/linux/hotfix-makefile-readlink.patch b/data/hotfixes/linux/hotfix-makefile-readlink.patch
new file mode 100644
index 0000000..3e6f057
--- /dev/null
+++ b/data/hotfixes/linux/hotfix-makefile-readlink.patch
@@ -0,0 +1,14 @@
+--- a/Makefile
++++ b/Makefile
+@@ -427,9 +427,9 @@
+ @echo 'cd "$(gameinstalldir)"' >> openra
+ # Note: this relies on the non-standard -f flag implemented by gnu readlink
+ ifeq ($(DEBUG), $(filter $(DEBUG),false no n off 0))
+- @echo 'mono OpenRA.Game.exe Engine.LaunchPath="$(readlink -f $0)" "$$@"' >> openra
++ @echo 'mono OpenRA.Game.exe Engine.LaunchPath="$$(readlink -f $$0)" "$$@"' >> openra
+ else
+- @echo 'mono --debug OpenRA.Game.exe Engine.LaunchPath="$(readlink -f $0)" "$$@"' >> openra
++ @echo 'mono --debug OpenRA.Game.exe Engine.LaunchPath="$$(readlink -f $$0)" "$$@"' >> openra
+ endif
+ @echo 'if [ $$? != 0 -a $$? != 1 ]' >> openra
+ @echo 'then' >> openra
diff --git a/data/hotfixes/linux/hotfix-ra2-withexitoverlay-revert.patch b/data/hotfixes/linux/hotfix-ra2-withexitoverlay-revert.patch
new file mode 100644
index 0000000..06a10f2
--- /dev/null
+++ b/data/hotfixes/linux/hotfix-ra2-withexitoverlay-revert.patch
@@ -0,0 +1,47 @@
+--- a/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs
++++ b/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs
+@@ -36,13 +36,18 @@
+ public object Create(ActorInitializer init) { return new WithExitOverlay(init.Self, this); }
+ }
+
+- public class WithExitOverlay : INotifyDamageStateChanged, INotifyBuildComplete, INotifySold, INotifyProduction, ITick
++ public class WithExitOverlay : INotifyDamageStateChanged, INotifyBuildComplete, INotifySold, INotifyProduction
+ {
+ readonly Actor self;
+ readonly Animation overlay;
+- bool buildComplete, enable;
++ bool buildComplete;
+ CPos exit;
+
++ bool IsExitBlocked
++ {
++ get { return self.World.ActorMap.GetActorsAt(exit).Any(a => a != self); }
++ }
++
+ public WithExitOverlay(Actor self, WithExitOverlayInfo info)
+ {
+ this.self = self;
+@@ -56,7 +61,7 @@
+
+ var anim = new AnimationWithOffset(overlay,
+ () => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))),
+- () => !buildComplete || !enable);
++ () => !buildComplete || !IsExitBlocked);
+
+ rs.Add(anim, info.Palette, info.IsPlayerPalette);
+ }
+@@ -80,13 +85,6 @@
+ public void UnitProduced(Actor self, Actor other, CPos exit)
+ {
+ this.exit = exit;
+- enable = true;
+- }
+-
+- public void Tick(Actor self)
+- {
+- if (enable)
+- enable = self.World.ActorMap.GetActorsAt(exit).Any(a => a != self);
+ }
+ }
+ }
+\ No newline at end of file
diff --git a/data/hotfixes/windows/hotfix-ra2-withexitoverlay-revert.patch b/data/hotfixes/windows/hotfix-ra2-withexitoverlay-revert.patch
new file mode 100644
index 0000000..8390b6b
--- /dev/null
+++ b/data/hotfixes/windows/hotfix-ra2-withexitoverlay-revert.patch
@@ -0,0 +1,47 @@
+--- a/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs
++++ b/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs
+@@ -36,13 +36,18 @@
+ public object Create(ActorInitializer init) { return new WithExitOverlay(init.Self, this); }
+ }
+
+- public class WithExitOverlay : INotifyDamageStateChanged, INotifyBuildComplete, INotifySold, INotifyProduction, ITick
++ public class WithExitOverlay : INotifyDamageStateChanged, INotifyBuildComplete, INotifySold, INotifyProduction
+ {
+ readonly Actor self;
+ readonly Animation overlay;
+- bool buildComplete, enable;
++ bool buildComplete;
+ CPos exit;
+
++ bool IsExitBlocked
++ {
++ get { return self.World.ActorMap.GetActorsAt(exit).Any(a => a != self); }
++ }
++
+ public WithExitOverlay(Actor self, WithExitOverlayInfo info)
+ {
+ this.self = self;
+@@ -56,7 +61,7 @@
+
+ var anim = new AnimationWithOffset(overlay,
+ () => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))),
+- () => !buildComplete || !enable);
++ () => !buildComplete || !IsExitBlocked);
+
+ rs.Add(anim, info.Palette, info.IsPlayerPalette);
+ }
+@@ -80,13 +85,6 @@
+ public void UnitProduced(Actor self, Actor other, CPos exit)
+ {
+ this.exit = exit;
+- enable = true;
+- }
+-
+- public void Tick(Actor self)
+- {
+- if (enable)
+- enable = self.World.ActorMap.GetActorsAt(exit).Any(a => a != self);
+ }
+ }
+ }
+\ No newline at end of file
diff --git a/data/patches/linux/linux-d2-common.patch b/data/patches/linux/linux-d2-common.patch
new file mode 100644
index 0000000..8e76fcd
--- /dev/null
+++ b/data/patches/linux/linux-d2-common.patch
@@ -0,0 +1,32 @@
+--- a/mods/all/mod.yaml
++++ b/mods/all/mod.yaml
+@@ -18,6 +18,7 @@
+ ./mods/common/OpenRA.Mods.Common.dll
+ ./mods/common/OpenRA.Mods.Cnc.dll
+ ./mods/d2k/OpenRA.Mods.D2k.dll
++ ./mods/d2/OpenRA.Mods.D2.dll
+
+ ChromeLayout:
+
+--- a/mods/d2/mod.yaml
++++ b/mods/d2/mod.yaml
+@@ -5,7 +5,7 @@
+ Author: the OpenRA Developers
+
+ RequiresMods:
+- modchooser: {DEV_VERSION}
++
+
+ Packages:
+ ~^Content/d2
+
+--- a/utility.cmd
++++ b/utility.cmd
+@@ -17,6 +17,7 @@
+ if /I "%mod%" EQU "cnc" (goto help)
+ if /I "%mod%" EQU "ts" (goto help)
+ if /I "%mod%" EQU "d2k" (goto help)
++if /I "%mod%" EQU "d2" (goto help)
+ echo.
+ echo Unknown mod: %mod%
+ echo.
diff --git a/data/patches/linux/linux-d2-ra2-make.patch b/data/patches/linux/linux-d2-ra2-make.patch
new file mode 100644
index 0000000..2e64059
--- /dev/null
+++ b/data/patches/linux/linux-d2-ra2-make.patch
@@ -0,0 +1,87 @@
+--- a/Makefile
++++ b/Makefile
+@@ -155,6 +155,15 @@
+ PROGRAMS += mod_cnc
+ mod_cnc: $(mod_cnc_TARGET)
+
++# Red Alert 2
++mod_ra2_SRCS := $(shell find OpenRA.Mods.RA2/ -iname '*.cs')
++mod_ra2_TARGET = mods/ra2/OpenRA.Mods.RA2.dll
++mod_ra2_KIND = library
++mod_ra2_DEPS = $(STD_MOD_DEPS) $(mod_common_TARGET)
++mod_ra2_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_common_TARGET)
++PROGRAMS += mod_ra2
++mod_ra2: $(mod_ra2_TARGET)
++
+ # Dune 2000
+ mod_d2k_SRCS := $(shell find OpenRA.Mods.D2k/ -iname '*.cs')
+ mod_d2k_TARGET = mods/d2k/OpenRA.Mods.D2k.dll
+@@ -164,6 +173,15 @@
+ PROGRAMS += mod_d2k
+ mod_d2k: $(mod_d2k_TARGET)
+
++# Dune 2
++mod_d2_SRCS := $(shell find OpenRA.Mods.D2/ -iname '*.cs')
++mod_d2_TARGET = mods/d2/OpenRA.Mods.D2.dll
++mod_d2_KIND = library
++mod_d2_DEPS = $(STD_MOD_DEPS) $(mod_common_TARGET)
++mod_d2_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_common_TARGET)
++PROGRAMS += mod_d2
++mod_d2: $(mod_d2_TARGET)
++
+ check-scripts:
+ @echo
+ @echo "Checking for Lua syntax errors..."
+@@ -193,6 +211,12 @@
+ @echo "Checking for code style violations in OpenRA.Mods.D2k..."
+ @mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Mods.D2k
+ @echo
++ @echo "Checking for code style violations in OpenRA.Mods.D2..."
++ @mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Mods.D2
++ @echo
++ @echo "Checking for code style violations in OpenRA.Mods.RA2..."
++ @mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Mods.RA2
++ @echo
+ @echo "Checking for code style violations in OpenRA.Utility..."
+ @mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Utility
+ @echo
+@@ -226,9 +250,15 @@
+ @echo "Testing Tiberian Sun mod MiniYAML..."
+ @mono --debug OpenRA.Utility.exe ts --check-yaml
+ @echo
++ @echo "Testing Red Alert 2 mod MiniYAML..."
++ @mono --debug OpenRA.Utility.exe ra2 --check-yaml
++ @echo
+ @echo "Testing Dune 2000 mod MiniYAML..."
+ @mono --debug OpenRA.Utility.exe d2k --check-yaml
+ @echo
++ @echo "Testing Dune 2 mod MiniYAML..."
++ @mono --debug OpenRA.Utility.exe d2 --check-yaml
++ @echo
+ @echo "Testing Tiberian Dawn mod MiniYAML..."
+ @mono --debug OpenRA.Utility.exe cnc --check-yaml
+ @echo
+@@ -301,7 +331,7 @@
+
+ package: all-dependencies core tools docs version
+
+-mods: mod_common mod_cnc mod_d2k
++mods: mod_common mod_cnc mod_d2k mod_ra2 mod_d2
+
+ all: dependencies core tools
+
+@@ -364,10 +394,14 @@
+ @$(INSTALL_DIR) "$(DATA_INSTALL_DIR)/mods"
+ @$(CP_R) mods/common "$(DATA_INSTALL_DIR)/mods/"
+ @$(INSTALL_PROGRAM) $(mod_common_TARGET) "$(DATA_INSTALL_DIR)/mods/common"
++ @$(CP_R) mods/ra2 "$(DATA_INSTALL_DIR)/mods/"
++ @$(INSTALL_PROGRAM) $(mod_ra2_TARGET) "$(DATA_INSTALL_DIR)/mods/ra2"
+ @$(CP_R) mods/cnc "$(DATA_INSTALL_DIR)/mods/"
+ @$(INSTALL_PROGRAM) $(mod_cnc_TARGET) "$(DATA_INSTALL_DIR)/mods/cnc"
+ @$(CP_R) mods/d2k "$(DATA_INSTALL_DIR)/mods/"
+ @$(INSTALL_PROGRAM) $(mod_d2k_TARGET) "$(DATA_INSTALL_DIR)/mods/d2k"
++ @$(CP_R) mods/d2 "$(DATA_INSTALL_DIR)/mods/"
++ @$(INSTALL_PROGRAM) $(mod_d2_TARGET) "$(DATA_INSTALL_DIR)/mods/d2"
+ @$(CP_R) mods/modchooser "$(DATA_INSTALL_DIR)/mods/"
+
+ @$(INSTALL_DATA) "global mix database.dat" "$(DATA_INSTALL_DIR)/global mix database.dat"
diff --git a/data/patches/linux/linux-ra2-common.patch b/data/patches/linux/linux-ra2-common.patch
new file mode 100644
index 0000000..ebb22e4
--- /dev/null
+++ b/data/patches/linux/linux-ra2-common.patch
@@ -0,0 +1,33 @@
+--- a/mods/all/mod.yaml
++++ b/mods/all/mod.yaml
+@@ -17,6 +17,7 @@
+ Assemblies:
+ ./mods/common/OpenRA.Mods.Common.dll
+ ./mods/common/OpenRA.Mods.Cnc.dll
++ ./mods/ra2/OpenRA.Mods.RA2.dll
+ ./mods/d2k/OpenRA.Mods.D2k.dll
+
+ ChromeLayout:
+
+--- a/mods/ra2/mod.yaml
++++ b/mods/ra2/mod.yaml
+@@ -5,7 +5,7 @@
+ Author: the RA2 mod team
+
+ RequiresMods:
+- modchooser: {DEV_VERSION}
++
+
+ Packages:
+ ~^Content/ra2
+
+--- a/utility.cmd
++++ b/utility.cmd
+@@ -16,6 +16,7 @@
+ if /I "%mod%" EQU "ra" (goto help)
+ if /I "%mod%" EQU "cnc" (goto help)
+ if /I "%mod%" EQU "ts" (goto help)
++if /I "%mod%" EQU "ra2" (goto help)
+ if /I "%mod%" EQU "d2k" (goto help)
+ echo.
+ echo Unknown mod: %mod%
diff --git a/data/patches/linux/linux-ra2-make.patch b/data/patches/linux/linux-ra2-make.patch
index 0d31ada..f19bcf4 100644
--- a/data/patches/linux/linux-ra2-make.patch
+++ b/data/patches/linux/linux-ra2-make.patch
@@ -1,8 +1,8 @@
--- a/Makefile
+++ b/Makefile
-@@ -182,6 +182,15 @@
- PROGRAMS += mod_ts
- mod_ts: $(mod_ts_TARGET)
+@@ -155,6 +155,15 @@
+ PROGRAMS += mod_cnc
+ mod_cnc: $(mod_cnc_TARGET)
+# Red Alert 2
+mod_ra2_SRCS := $(shell find OpenRA.Mods.RA2/ -iname '*.cs')
@@ -13,12 +13,12 @@
+PROGRAMS += mod_ra2
+mod_ra2: $(mod_ra2_TARGET)
+
- check-scripts:
- @echo
- @echo "Checking for Lua syntax errors..."
-@@ -217,6 +226,9 @@
- @echo "Checking for code style violations in OpenRA.Mods.TS..."
- @mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Mods.TS
+ # Dune 2000
+ mod_d2k_SRCS := $(shell find OpenRA.Mods.D2k/ -iname '*.cs')
+ mod_d2k_TARGET = mods/d2k/OpenRA.Mods.D2k.dll
+@@ -193,6 +202,9 @@
+ @echo "Checking for code style violations in OpenRA.Mods.D2k..."
+ @mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Mods.D2k
@echo
+ @echo "Checking for code style violations in OpenRA.Mods.RA2..."
+ @mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Mods.RA2
@@ -26,24 +26,31 @@
@echo "Checking for code style violations in OpenRA.Utility..."
@mono --debug OpenRA.Utility.exe ra --check-code-style OpenRA.Utility
@echo
-@@ -258,6 +270,9 @@
+@@ -226,6 +238,9 @@
+ @echo "Testing Tiberian Sun mod MiniYAML..."
+ @mono --debug OpenRA.Utility.exe ts --check-yaml
@echo
- @echo "Testing Red Alert mod MiniYAML..."
- @mono --debug OpenRA.Utility.exe ra --check-yaml
-+ @echo
+ @echo "Testing Red Alert 2 mod MiniYAML..."
+ @mono --debug OpenRA.Utility.exe ra2 --check-yaml
++ @echo
+ @echo "Testing Dune 2000 mod MiniYAML..."
+ @mono --debug OpenRA.Utility.exe d2k --check-yaml
+ @echo
+@@ -301,7 +316,7 @@
+ package: all-dependencies core tools docs version
- ##### Launchers / Utilities #####
-@@ -394,6 +409,10 @@
- @$(CP_R) mods/d2k "$(DATA_INSTALL_DIR)/mods/"
- @$(INSTALL_PROGRAM) $(mod_d2k_TARGET) "$(DATA_INSTALL_DIR)/mods/d2k"
- @$(CP_R) mods/modchooser "$(DATA_INSTALL_DIR)/mods/"
-+ @$(CP_R) mods/ts "$(DATA_INSTALL_DIR)/mods/"
-+ @$(INSTALL_PROGRAM) $(mod_ts_TARGET) "$(DATA_INSTALL_DIR)/mods/ts"
+-mods: mod_common mod_cnc mod_d2k
++mods: mod_common mod_cnc mod_d2k mod_ra2
+
+ all: dependencies core tools
+
+@@ -364,6 +379,8 @@
+ @$(INSTALL_DIR) "$(DATA_INSTALL_DIR)/mods"
+ @$(CP_R) mods/common "$(DATA_INSTALL_DIR)/mods/"
+ @$(INSTALL_PROGRAM) $(mod_common_TARGET) "$(DATA_INSTALL_DIR)/mods/common"
+ @$(CP_R) mods/ra2 "$(DATA_INSTALL_DIR)/mods/"
+ @$(INSTALL_PROGRAM) $(mod_ra2_TARGET) "$(DATA_INSTALL_DIR)/mods/ra2"
-
- @$(INSTALL_DATA) "global mix database.dat" "$(DATA_INSTALL_DIR)/global mix database.dat"
- @$(INSTALL_DATA) "GeoLite2-Country.mmdb.gz" "$(DATA_INSTALL_DIR)/GeoLite2-Country.mmdb.gz"
+ @$(CP_R) mods/cnc "$(DATA_INSTALL_DIR)/mods/"
+ @$(INSTALL_PROGRAM) $(mod_cnc_TARGET) "$(DATA_INSTALL_DIR)/mods/cnc"
+ @$(CP_R) mods/d2k "$(DATA_INSTALL_DIR)/mods/"
diff --git a/data/patches/windows/windows-d2-common.patch b/data/patches/windows/windows-d2-common.patch
new file mode 100644
index 0000000..4af3025
--- /dev/null
+++ b/data/patches/windows/windows-d2-common.patch
@@ -0,0 +1,32 @@
+--- a/mods/all/mod.yaml
++++ b/mods/all/mod.yaml
+@@ -18,6 +18,7 @@
+ ./mods/common/OpenRA.Mods.Common.dll
+ ./mods/common/OpenRA.Mods.Cnc.dll
+ ./mods/d2k/OpenRA.Mods.D2k.dll
++ ./mods/d2/OpenRA.Mods.D2.dll
+
+ ChromeLayout:
+
+--- a/mods/d2/mod.yaml
++++ b/mods/d2/mod.yaml
+@@ -5,7 +5,7 @@
+ Author: the OpenRA Developers
+
+ RequiresMods:
+- modchooser: {DEV_VERSION}
++
+
+ Packages:
+ ~^Content/d2
+
+--- a/utility.cmd
++++ b/utility.cmd
+@@ -17,6 +17,7 @@
+ if /I "%mod%" EQU "cnc" (goto help)
+ if /I "%mod%" EQU "ts" (goto help)
+ if /I "%mod%" EQU "d2k" (goto help)
++if /I "%mod%" EQU "d2" (goto help)
+ echo.
+ echo Unknown mod: %mod%
+ echo.
diff --git a/data/patches/windows/windows-d2-csproj.patch b/data/patches/windows/windows-d2-csproj.patch
new file mode 100644
index 0000000..82843a9
--- /dev/null
+++ b/data/patches/windows/windows-d2-csproj.patch
@@ -0,0 +1,70 @@
+--- a/OpenRA.Mods.D2/OpenRA.Mods.D2.csproj
++++ b/OpenRA.Mods.D2/OpenRA.Mods.D2.csproj
+@@ -17,8 +17,8 @@
+ prompt
+ bin\Debug\
+
+-
+-
++
++
+
+ TRACE;DEBUG;
+ AllRules.ruleset
+@@ -36,20 +36,20 @@
+ AllRules.ruleset
+ true
+
+-
+-
++
++
+
+ false
+
+
+
+- dependencies\OpenRA.Game.exe
++ ..\OpenRA.Game.exe
+
+
+- dependencies\OpenRA.Mods.Common.dll
++ ..\OpenRA.Mods.Common\OpenRA.Mods.Common.dll
+
+
+- dependencies\Eluant.dll
++ ..\thirdparty\download\Eluant.dll
+ False
+
+
+@@ -59,6 +59,18 @@
+
+
+
++
++
++ {0DFB103F-2962-400F-8C6D-E2C28CCBA633}
++ OpenRA.Game
++ False
++
++
++ {fe6c8cc0-2f07-442a-b29f-17617b3b7fc6}
++ OpenRA.Mods.Common
++ False
++
++
+
+
+
+@@ -72,7 +84,8 @@
+
+
+
+- copy $(TargetPath) $(ProjectDir)..
+-
++ mkdir "$(SolutionDir)mods/d2/"
++copy "$(TargetPath)" "$(SolutionDir)mods/d2/"
++cd "$(SolutionDir)"
+
+
+\ No newline at end of file
diff --git a/data/patches/windows/windows-d2-ra2-make.patch b/data/patches/windows/windows-d2-ra2-make.patch
new file mode 100644
index 0000000..d163cce
--- /dev/null
+++ b/data/patches/windows/windows-d2-ra2-make.patch
@@ -0,0 +1,35 @@
+--- a/make.ps1
++++ b/make.ps1
+@@ -71,7 +71,7 @@
+
+ if ($version -ne $null)
+ {
+- $mods = @("mods/ra/mod.yaml", "mods/cnc/mod.yaml", "mods/d2k/mod.yaml", "mods/ts/mod.yaml", "mods/modchooser/mod.yaml", "mods/all/mod.yaml")
++ $mods = @("mods/ra/mod.yaml", "mods/cnc/mod.yaml", "mods/d2k/mod.yaml", "mods/ts/mod.yaml", "mods/ra2/mod.yaml", "mods/d2/mod.yaml", "mods/modchooser/mod.yaml", "mods/all/mod.yaml")
+ foreach ($mod in $mods)
+ {
+ $replacement = (gc $mod) -Replace "Version:.*", ("Version: {0}" -f $version)
+@@ -111,8 +111,12 @@
+ echo "Testing mods..."
+ echo "Testing Tiberian Sun mod MiniYAML..."
+ ./OpenRA.Utility.exe ts --check-yaml
++ echo "Testing Red Alert 2 mod MiniYAML..."
++ ./OpenRA.Utility.exe ra2 --check-yaml
+ echo "Testing Dune 2000 mod MiniYAML..."
+ ./OpenRA.Utility.exe d2k --check-yaml
++ echo "Testing Dune 2 mod MiniYAML..."
++ ./OpenRA.Utility.exe d2 --check-yaml
+ echo "Testing Tiberian Dawn mod MiniYAML..."
+ ./OpenRA.Utility.exe cnc --check-yaml
+ echo "Testing Red Alert mod MiniYAML..."
+@@ -141,6 +145,10 @@
+ ./OpenRA.Utility.exe cnc --check-code-style OpenRA.Mods.Cnc
+ echo "Checking for code style violations in OpenRA.Mods.D2k..."
+ ./OpenRA.Utility.exe cnc --check-code-style OpenRA.Mods.D2k
++ echo "Checking for code style violations in OpenRA.Mods.D2..."
++ ./OpenRA.Utility.exe d2 --check-code-style OpenRA.Mods.D2
++ echo "Checking for code style violations in OpenRA.Mods.RA2..."
++ ./OpenRA.Utility.exe ra2 --check-code-style OpenRA.Mods.RA2
+ echo "Checking for code style violations in OpenRA.Utility..."
+ ./OpenRA.Utility.exe cnc --check-code-style OpenRA.Utility
+ echo "Checking for code style violations in OpenRA.Test..."
diff --git a/data/patches/windows/windows-d2-ra2-openra-solution.patch b/data/patches/windows/windows-d2-ra2-openra-solution.patch
new file mode 100644
index 0000000..bfba689
--- /dev/null
+++ b/data/patches/windows/windows-d2-ra2-openra-solution.patch
@@ -0,0 +1,28 @@
+--- a/OpenRA.sln
++++ b/OpenRA.sln
+@@ -13,6 +13,10 @@
+ EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.D2k", "OpenRA.Mods.D2k\OpenRA.Mods.D2k.csproj", "{C0B0465C-6BE2-409C-8770-3A9BF64C4344}"
+ EndProject
++Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.D2", "OpenRA.Mods.D2\OpenRA.Mods.D2.csproj", "{C0B0465C-6BE2-409C-8770-3A9BF64C4341}"
++EndProject
++Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.RA2", "OpenRA.Mods.RA2\OpenRA.Mods.RA2.csproj", "{7E1263D2-BA04-48D0-85DB-26C68B782608}"
++EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Platforms.Default", "OpenRA.Platforms.Default\OpenRA.Platforms.Default.csproj", "{33D03738-C154-4028-8EA8-63A3C488A651}"
+ EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.Common", "OpenRA.Mods.Common\OpenRA.Mods.Common.csproj", "{FE6C8CC0-2F07-442A-B29F-17617B3B7FC6}"
+@@ -152,6 +156,14 @@
+ {C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|x86.Build.0 = Debug|x86
+ {C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|x86.ActiveCfg = Release|x86
+ {C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|x86.Build.0 = Release|x86
++ {C0B0465C-6BE2-409C-8770-3A9BF64C4341}.Debug|x86.ActiveCfg = Debug|x86
++ {C0B0465C-6BE2-409C-8770-3A9BF64C4341}.Debug|x86.Build.0 = Debug|x86
++ {C0B0465C-6BE2-409C-8770-3A9BF64C4341}.Release|x86.ActiveCfg = Release|x86
++ {C0B0465C-6BE2-409C-8770-3A9BF64C4341}.Release|x86.Build.0 = Release|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Debug|x86.ActiveCfg = Debug|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Debug|x86.Build.0 = Debug|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Release|x86.ActiveCfg = Release|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Release|x86.Build.0 = Release|x86
+ {33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.ActiveCfg = Debug|x86
+ {33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.Build.0 = Debug|x86
+ {33D03738-C154-4028-8EA8-63A3C488A651}.Release|x86.ActiveCfg = Release|x86
diff --git a/data/patches/windows/windows-ra2-common.patch b/data/patches/windows/windows-ra2-common.patch
new file mode 100644
index 0000000..2c1d1f8
--- /dev/null
+++ b/data/patches/windows/windows-ra2-common.patch
@@ -0,0 +1,33 @@
+--- a/mods/all/mod.yaml
++++ b/mods/all/mod.yaml
+@@ -17,6 +17,7 @@
+ Assemblies:
+ ./mods/common/OpenRA.Mods.Common.dll
+ ./mods/common/OpenRA.Mods.Cnc.dll
++ ./mods/ra2/OpenRA.Mods.RA2.dll
+ ./mods/d2k/OpenRA.Mods.D2k.dll
+
+ ChromeLayout:
+
+--- a/mods/ra2/mod.yaml
++++ b/mods/ra2/mod.yaml
+@@ -5,7 +5,7 @@
+ Author: the RA2 mod team
+
+ RequiresMods:
+- modchooser: {DEV_VERSION}
++
+
+ Packages:
+ ~^Content/ra2
+
+--- a/utility.cmd
++++ b/utility.cmd
+@@ -16,6 +16,7 @@
+ if /I "%mod%" EQU "ra" (goto help)
+ if /I "%mod%" EQU "cnc" (goto help)
+ if /I "%mod%" EQU "ts" (goto help)
++if /I "%mod%" EQU "ra2" (goto help)
+ if /I "%mod%" EQU "d2k" (goto help)
+ echo.
+ echo Unknown mod: %mod%
diff --git a/data/patches/windows/windows-ra2-csproj.patch b/data/patches/windows/windows-ra2-csproj.patch
new file mode 100644
index 0000000..1c3a2af
--- /dev/null
+++ b/data/patches/windows/windows-ra2-csproj.patch
@@ -0,0 +1,97 @@
+--- a/OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj
++++ b/OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj
+@@ -12,7 +12,7 @@
+
+ x86
+
+-
++
+ True
+ Full
+ False
+@@ -21,38 +21,47 @@
+ bin\Debug\
+
+
+-
+-
++
++
+
+
++ AllRules.ruleset
++ true
+
+-
+- False
+- None
++
++ True
++ pdbonly
+ True
+ False
+ TRACE
+ bin\Release\
++ x86
++ prompt
+
+
+-
+-
++
++
+
+
++ AllRules.ruleset
++ true
+
+
++
++
++
+
+
+- dependencies\OpenRA.Game.exe
++ ..\OpenRA.Game.exe
+
+
+- dependencies\OpenRA.Mods.Cnc.dll
++ ..\OpenRA.Mods.Cnc\OpenRA.Mods.Cnc.dll
+
+
+- dependencies\OpenRA.Mods.Common.dll
++ ..\OpenRA.Mods.Common\OpenRA.Mods.Common.dll
+
+
+- dependencies\Eluant.dll
++ ..\thirdparty\download\Eluant.dll
+
+
+
+@@ -61,9 +70,26 @@
+
+
+
++
++ {0DFB103F-2962-400F-8C6D-E2C28CCBA633}
++ OpenRA.Game
++ False
++
++
++ {fe6c8cc0-2f07-442a-b29f-17617b3b7fc6}
++ OpenRA.Mods.Common
++ False
++
++
++
+
+
+
+
+
++
++ mkdir "$(SolutionDir)mods/ra2/"
++copy "$(TargetPath)" "$(SolutionDir)mods/ra2/"
++cd "$(SolutionDir)"
++
+
diff --git a/data/patches/windows/windows-ra2-make.patch b/data/patches/windows/windows-ra2-make.patch
new file mode 100644
index 0000000..ba06d65
--- /dev/null
+++ b/data/patches/windows/windows-ra2-make.patch
@@ -0,0 +1,29 @@
+--- a/make.ps1
++++ b/make.ps1
+@@ -71,7 +71,7 @@
+
+ if ($version -ne $null)
+ {
+- $mods = @("mods/ra/mod.yaml", "mods/cnc/mod.yaml", "mods/d2k/mod.yaml", "mods/ts/mod.yaml", "mods/modchooser/mod.yaml", "mods/all/mod.yaml")
++ $mods = @("mods/ra/mod.yaml", "mods/cnc/mod.yaml", "mods/d2k/mod.yaml", "mods/ts/mod.yaml", "mods/ra2/mod.yaml", "mods/modchooser/mod.yaml", "mods/all/mod.yaml")
+ foreach ($mod in $mods)
+ {
+ $replacement = (gc $mod) -Replace "Version:.*", ("Version: {0}" -f $version)
+@@ -111,6 +111,8 @@
+ echo "Testing mods..."
+ echo "Testing Tiberian Sun mod MiniYAML..."
+ ./OpenRA.Utility.exe ts --check-yaml
++ echo "Testing Red Alert 2 mod MiniYAML..."
++ ./OpenRA.Utility.exe ra2 --check-yaml
+ echo "Testing Dune 2000 mod MiniYAML..."
+ ./OpenRA.Utility.exe d2k --check-yaml
+ echo "Testing Tiberian Dawn mod MiniYAML..."
+@@ -141,6 +143,8 @@
+ ./OpenRA.Utility.exe cnc --check-code-style OpenRA.Mods.Cnc
+ echo "Checking for code style violations in OpenRA.Mods.D2k..."
+ ./OpenRA.Utility.exe cnc --check-code-style OpenRA.Mods.D2k
++ echo "Checking for code style violations in OpenRA.Mods.RA2..."
++ ./OpenRA.Utility.exe ra2 --check-code-style OpenRA.Mods.RA2
+ echo "Checking for code style violations in OpenRA.Utility..."
+ ./OpenRA.Utility.exe cnc --check-code-style OpenRA.Utility
+ echo "Checking for code style violations in OpenRA.Test..."
diff --git a/data/patches/windows/windows-ra2-openra-solution.patch b/data/patches/windows/windows-ra2-openra-solution.patch
new file mode 100644
index 0000000..e6558ee
--- /dev/null
+++ b/data/patches/windows/windows-ra2-openra-solution.patch
@@ -0,0 +1,23 @@
+--- a/OpenRA.sln
++++ b/OpenRA.sln
+@@ -13,6 +13,8 @@
+ EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.D2k", "OpenRA.Mods.D2k\OpenRA.Mods.D2k.csproj", "{C0B0465C-6BE2-409C-8770-3A9BF64C4344}"
+ EndProject
++Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.RA2", "OpenRA.Mods.RA2\OpenRA.Mods.RA2.csproj", "{7E1263D2-BA04-48D0-85DB-26C68B782608}"
++EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Platforms.Default", "OpenRA.Platforms.Default\OpenRA.Platforms.Default.csproj", "{33D03738-C154-4028-8EA8-63A3C488A651}"
+ EndProject
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.Common", "OpenRA.Mods.Common\OpenRA.Mods.Common.csproj", "{FE6C8CC0-2F07-442A-B29F-17617B3B7FC6}"
+@@ -152,6 +154,10 @@
+ {C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|x86.Build.0 = Debug|x86
+ {C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|x86.ActiveCfg = Release|x86
+ {C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|x86.Build.0 = Release|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Debug|x86.ActiveCfg = Debug|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Debug|x86.Build.0 = Debug|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Release|x86.ActiveCfg = Release|x86
++ {7E1263D2-BA04-48D0-85DB-26C68B782608}.Release|x86.Build.0 = Release|x86
+ {33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.ActiveCfg = Debug|x86
+ {33D03738-C154-4028-8EA8-63A3C488A651}.Debug|x86.Build.0 = Debug|x86
+ {33D03738-C154-4028-8EA8-63A3C488A651}.Release|x86.ActiveCfg = Release|x86
+