diff --git a/addons/apl/ACE_CSW_m3_tripod.p3d b/addons/apl/ACE_CSW_m3_tripod.p3d
index 1d112d5a17..0ad274ad9c 100644
Binary files a/addons/apl/ACE_CSW_m3_tripod.p3d and b/addons/apl/ACE_CSW_m3_tripod.p3d differ
diff --git a/addons/apl/ACE_CSW_mortarBaseplate.p3d b/addons/apl/ACE_CSW_mortarBaseplate.p3d
index 9da30112b1..1dfee12c2a 100644
Binary files a/addons/apl/ACE_CSW_mortarBaseplate.p3d and b/addons/apl/ACE_CSW_mortarBaseplate.p3d differ
diff --git a/addons/apl/ace_csw_tripod_ags30.p3d b/addons/apl/ace_csw_tripod_ags30.p3d
new file mode 100644
index 0000000000..11dd8fc0f2
Binary files /dev/null and b/addons/apl/ace_csw_tripod_ags30.p3d differ
diff --git a/addons/apl/ace_csw_tripod_kord.p3d b/addons/apl/ace_csw_tripod_kord.p3d
new file mode 100644
index 0000000000..f2c1d67410
Binary files /dev/null and b/addons/apl/ace_csw_tripod_kord.p3d differ
diff --git a/addons/apl/ace_csw_tripod_m122.p3d b/addons/apl/ace_csw_tripod_m122.p3d
new file mode 100644
index 0000000000..38e4199fe2
Binary files /dev/null and b/addons/apl/ace_csw_tripod_m122.p3d differ
diff --git a/addons/apl/ace_csw_tripod_m220.p3d b/addons/apl/ace_csw_tripod_m220.p3d
new file mode 100644
index 0000000000..c3632b12c3
Binary files /dev/null and b/addons/apl/ace_csw_tripod_m220.p3d differ
diff --git a/addons/apl/ace_csw_tripod_spg9.p3d b/addons/apl/ace_csw_tripod_spg9.p3d
new file mode 100644
index 0000000000..ec19e4f103
Binary files /dev/null and b/addons/apl/ace_csw_tripod_spg9.p3d differ
diff --git a/addons/apl/data/csw_nsv.rvmat b/addons/apl/data/csw_nsv.rvmat
new file mode 100644
index 0000000000..46ea387b23
--- /dev/null
+++ b/addons/apl/data/csw_nsv.rvmat
@@ -0,0 +1,95 @@
+ambient[]={1,1,1,1.000000};
+diffuse[]={1,1,1,1.000000};
+forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000};
+emmisive[]={0.000000,0.000000,0.000000,1.000000};
+specular[]={1,1,1,1.000000};
+specularPower=40.000000;
+PixelShaderID="super";
+VertexShaderID="super";
+class Stage1
+{
+	texture = "z\ace\addons\apl\data\csw_nsv_nohq.paa";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class Stage2
+{
+	texture="a3\weapons_f\Data\DetailMaps\metal_detail_dt.paa";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={8.0000,0.000000,0.000000};
+		up[]={0.000000,8.0000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class Stage3
+{
+	texture="#(argb,8,8,3)color(0,0,0,0,MC)";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class Stage4
+{
+	texture = "#(argb,8,8,3)color(1,1,1,1,AS)";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class Stage5
+{
+	texture = "z\ace\addons\apl\data\csw_nsv_smdi.paa";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class Stage6
+{
+	texture = "#(ai,32,128,1)fresnel(3.38,5.33)";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class Stage7
+{
+	texture="a3\data_f\env_land_co.paa";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class StageTI {
+	texture = "a3\data_f\default_vehicle_ti_ca.paa";
+};
diff --git a/addons/apl/data/csw_nsv_co.paa b/addons/apl/data/csw_nsv_co.paa
new file mode 100644
index 0000000000..f7af35c0b8
Binary files /dev/null and b/addons/apl/data/csw_nsv_co.paa differ
diff --git a/addons/apl/data/csw_nsv_nohq.paa b/addons/apl/data/csw_nsv_nohq.paa
new file mode 100644
index 0000000000..299de50ad7
Binary files /dev/null and b/addons/apl/data/csw_nsv_nohq.paa differ
diff --git a/addons/apl/data/csw_nsv_smdi.paa b/addons/apl/data/csw_nsv_smdi.paa
new file mode 100644
index 0000000000..09f7758e75
Binary files /dev/null and b/addons/apl/data/csw_nsv_smdi.paa differ
diff --git a/addons/apl/data/csw_spg9.rvmat b/addons/apl/data/csw_spg9.rvmat
new file mode 100644
index 0000000000..21de1208fd
--- /dev/null
+++ b/addons/apl/data/csw_spg9.rvmat
@@ -0,0 +1,92 @@
+ambient[] = {1.0,1.0,1.0,1.0};
+diffuse[] = {1.0,1.0,1.0,1.0};
+forcedDiffuse[] = {0.0,0.0,0.0,0.0};
+emmisive[] = {0.0,0.0,0.0,1.0};
+specular[] = {0.545,0.545,0.545,1.0};
+specularPower = 100.0;
+PixelShaderID = "Super";
+VertexShaderID = "Super";
+class Stage1
+{
+	texture = "z\ace\addons\apl\data\csw_spg9_nohq.paa";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,1.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
+class Stage2
+{
+	texture = "a3\weapons_f\Data\DetailMaps\metal_detail_dt.paa";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {8.0,0.0,0.0};
+		up[] = {0.0,2.0,0.0};
+		dir[] = {0.0,0.0,1.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
+class Stage3
+{
+	texture = "#(argb,8,8,3)color(0,0,0,0,MC)";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,1.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
+class Stage4
+{
+	texture = "#(argb,8,8,3)color(1,1,1,1,AS)";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,1.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
+class Stage5
+{
+	texture = "z\ace\addons\apl\data\csw_spg9_smdi.paa";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,1.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
+class Stage6
+{
+	texture = "#(ai,32,128,1)fresnel(1.89,1.02)";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,1.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
+class Stage7
+{
+	texture="a3\data_f\env_land_co.paa";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,1.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
diff --git a/addons/apl/data/csw_spg9_co.paa b/addons/apl/data/csw_spg9_co.paa
new file mode 100644
index 0000000000..c7b6694e9b
Binary files /dev/null and b/addons/apl/data/csw_spg9_co.paa differ
diff --git a/addons/apl/data/csw_spg9_nohq.paa b/addons/apl/data/csw_spg9_nohq.paa
new file mode 100644
index 0000000000..718e536492
Binary files /dev/null and b/addons/apl/data/csw_spg9_nohq.paa differ
diff --git a/addons/apl/data/csw_spg9_smdi.paa b/addons/apl/data/csw_spg9_smdi.paa
new file mode 100644
index 0000000000..345a664a12
Binary files /dev/null and b/addons/apl/data/csw_spg9_smdi.paa differ
diff --git a/addons/apl/data/csw_tow_merge.rvmat b/addons/apl/data/csw_tow_merge.rvmat
new file mode 100644
index 0000000000..55db8aba2a
--- /dev/null
+++ b/addons/apl/data/csw_tow_merge.rvmat
@@ -0,0 +1,32 @@
+ambient[]={1.000000,1.000000,1.000000,1.000000};
+diffuse[]={1.000000,1.000000,1.000000,1.000000};
+forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000};
+emmisive[]={0.000000,0.000000,0.000000,1.000000};
+specular[]={0.3000000,0.3000000,0.3000000,1.000000};
+specularPower=100.000000;
+PixelShaderID="NormalMapSpecularDIMap";
+VertexShaderID="NormalMap";
+class Stage1
+{
+	texture="z\ace\addons\apl\data\csw_tow_merge_nohq.paa";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
+class Stage2
+{
+	texture="z\ace\addons\apl\data\csw_tow_merge_smdi.paa";
+	uvSource="tex";
+	class uvTransform
+	{
+		aside[]={1.000000,0.000000,0.000000};
+		up[]={0.000000,1.000000,0.000000};
+		dir[]={0.000000,0.000000,0.000000};
+		pos[]={0.000000,0.000000,0.000000};
+	};
+};
\ No newline at end of file
diff --git a/addons/apl/data/csw_tow_merge_co.paa b/addons/apl/data/csw_tow_merge_co.paa
new file mode 100644
index 0000000000..5d16cd54d4
Binary files /dev/null and b/addons/apl/data/csw_tow_merge_co.paa differ
diff --git a/addons/apl/data/csw_tow_merge_nohq.paa b/addons/apl/data/csw_tow_merge_nohq.paa
new file mode 100644
index 0000000000..a02ec97769
Binary files /dev/null and b/addons/apl/data/csw_tow_merge_nohq.paa differ
diff --git a/addons/apl/data/csw_tow_merge_smdi.paa b/addons/apl/data/csw_tow_merge_smdi.paa
new file mode 100644
index 0000000000..91090de9b4
Binary files /dev/null and b/addons/apl/data/csw_tow_merge_smdi.paa differ
diff --git a/addons/apl/data/csw_tripod_ags.rvmat b/addons/apl/data/csw_tripod_ags.rvmat
new file mode 100644
index 0000000000..3e435eb6db
--- /dev/null
+++ b/addons/apl/data/csw_tripod_ags.rvmat
@@ -0,0 +1,32 @@
+ambient[] = {1.0,1.0,1.0,1.0};
+diffuse[] = {1.0,1.0,1.0,1.0};
+forcedDiffuse[] = {0.0,0.0,0.0,0.0};
+emmisive[] = {0.0,0.0,0.0,0.0};
+specular[] = {0.3,0.3,0.3,1.0};
+specularPower = 256.0;
+PixelShaderID = "NormalMapSpecularDIMap";
+VertexShaderID = "NormalMap";
+class Stage1
+{
+	texture = "z\ace\addons\apl\data\csw_tripod_ags_nohq.paa";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,0.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
+class Stage2
+{
+	texture = "z\ace\addons\apl\data\csw_tripod_ags_smdi.paa";
+	uvSource = "tex";
+	class uvTransform
+	{
+		aside[] = {1.0,0.0,0.0};
+		up[] = {0.0,1.0,0.0};
+		dir[] = {0.0,0.0,0.0};
+		pos[] = {0.0,0.0,0.0};
+	};
+};
diff --git a/addons/apl/data/csw_tripod_ags_co.paa b/addons/apl/data/csw_tripod_ags_co.paa
new file mode 100644
index 0000000000..93e2367188
Binary files /dev/null and b/addons/apl/data/csw_tripod_ags_co.paa differ
diff --git a/addons/apl/data/csw_tripod_ags_nohq.paa b/addons/apl/data/csw_tripod_ags_nohq.paa
new file mode 100644
index 0000000000..ddad36a44a
Binary files /dev/null and b/addons/apl/data/csw_tripod_ags_nohq.paa differ
diff --git a/addons/apl/data/csw_tripod_ags_smdi.paa b/addons/apl/data/csw_tripod_ags_smdi.paa
new file mode 100644
index 0000000000..561bcc8178
Binary files /dev/null and b/addons/apl/data/csw_tripod_ags_smdi.paa differ
diff --git a/addons/csw/Cfg3den.hpp b/addons/csw/Cfg3den.hpp
new file mode 100644
index 0000000000..dfac0f5475
--- /dev/null
+++ b/addons/csw/Cfg3den.hpp
@@ -0,0 +1,38 @@
+class ctrlCombo;
+class Cfg3DEN {
+    class Attributes {
+        class Title;
+        class Combo: Title {
+            class Controls {
+                class Title;
+                class Value;
+            };
+        };
+        class GVAR(assemblyModeControl): Combo {
+            class Controls: Controls {
+                class Title: Title {};
+                class Value: Value {
+                    class Items {
+                        class Disable {
+                            text = "$STR_DISABLED";
+                            value = 0;
+                        };
+                        class Enable {
+                            text = "$STR_CONFIG_JOYSTICK_ENABLED";
+                            value = 1;
+                        };
+                        class EnableAndEmpty {
+                            text = CSTRING(eden_enableAndEmpty);
+                            value = 2;
+                        };
+                        class Default {
+                            text = "$STR_VEHICLE_DEFAULT";
+                            value = 3;
+                            default = 1;
+                        };
+                    };
+                };
+            };
+        };
+    };
+};
diff --git a/addons/csw/CfgMagazineGroups.hpp b/addons/csw/CfgMagazineGroups.hpp
index 8a9e0ed31b..697403f963 100644
--- a/addons/csw/CfgMagazineGroups.hpp
+++ b/addons/csw/CfgMagazineGroups.hpp
@@ -36,6 +36,7 @@ class GVAR(groups) {
         rhs_mag_127x108mm_50 = 1;
         rhs_mag_127x108mm_100 = 1;
         rhs_mag_127x108mm_150 = 1;
+        rhs_mag_127x108mm_300 = 1;
         CUP_150Rnd_127x108_KORD_M = 1;
         CUP_50Rnd_127x108_KORD_M = 1;
         CUP_50Rnd_TE3_LRT5_127x107_DSHKM_M = 1; // not sure why cup uses 107 for the DSHKM?
@@ -52,14 +53,18 @@ class GVAR(groups) {
     class ACE_1Rnd_82mm_Mo_HE {
         ACE_1Rnd_82mm_Mo_HE = 1;
         8Rnd_82mm_Mo_shells = 1;
+        rhs_12Rnd_m821_HE = 1;
+        rhs_mag_3vo18_10 = 1;
     };
     class ACE_1Rnd_82mm_Mo_Smoke {
         ACE_1Rnd_82mm_Mo_Smoke = 1;
         8Rnd_82mm_Mo_Smoke_white = 1;
+        rhs_mag_d832du_10 = 1;
     };
     class ACE_1Rnd_82mm_Mo_Illum {
         ACE_1Rnd_82mm_Mo_Illum = 1;
         8Rnd_82mm_Mo_Flare_white = 1;
+        rhs_mag_3vs25m_10 = 1;
     };
     class ACE_1Rnd_82mm_Mo_HE_Guided {
         ACE_1Rnd_82mm_Mo_HE_Guided = 1;
@@ -69,7 +74,7 @@ class GVAR(groups) {
         ACE_1Rnd_82mm_Mo_HE_LaserGuided = 1;
         8Rnd_82mm_Mo_LG = 1;
     };
-
+    
     // A3 Titans (Spike) - just use handheld magazines
     class Titan_AT {
         1Rnd_GAT_missiles = 1;
diff --git a/addons/csw/CfgVehicles.hpp b/addons/csw/CfgVehicles.hpp
index 812943d346..ecd438fa64 100644
--- a/addons/csw/CfgVehicles.hpp
+++ b/addons/csw/CfgVehicles.hpp
@@ -1,17 +1,3 @@
-#define ENABLE_CSW_ATTRIBUTE class Attributes { \
-        class GVAR(enableCSW) { \
-            property = QGVAR(enableCSW); \
-            control = "Checkbox"; \
-            displayName = CSTRING(eden_enableCSW); \
-            tooltip = CSTRING(eden_enableCSW_tooltip); \
-            expression = QUOTE(_this setVariable[ARR_3(QQGVAR(enableCSW), _value, true)];); \
-            typeName = "BOOL"; \
-            condition = "objectVehicle"; \
-            defaultValue = true; \
-        }; \
-    }
-
-
 class CfgVehicles {
     class Man;
     class CAManBase: Man {
@@ -37,14 +23,14 @@ class CfgVehicles {
         accuracy = 1000;
         destrType = "DestructDefault";
 
-        ace_dragging_canDrag = 1;
-        ace_dragging_dragPosition[] = {0, 2, 0};
-        ace_dragging_canCarry = 1;
-        ace_dragging_carryPosition[] = {0, 2, 0};
+        EGVAR(dragging,canDrag) = 1;
+        EGVAR(dragging,dragPosition)[] = {0, 2, 0};
+        EGVAR(dragging,canCarry) = 1;
+        EGVAR(dragging,carryPosition)[] = {0, 2, 0};
 
         class ACE_Actions {
             class ACE_MainActions {
-                displayName = CSTRING(Tripod_displayName);
+                displayName = CSTRING(genericTripod_displayName);
                 selection = "";
                 distance = 2.5;
                 condition = "true";
@@ -66,21 +52,58 @@ class CfgVehicles {
         author = ECSTRING(common,ACETeam);
         scope = 2;
         model = QPATHTOEF(apl,ACE_CSW_m3_tripod.p3d);
-        displayName = CSTRING(Tripod_displayName);
+        displayName = CSTRING(m3Tripod_displayName);
         class ADDON {
             disassembleTo = QGVAR(m3CarryTripod);
         };
     };
     class GVAR(m3TripodLow): GVAR(m3Tripod) {
-        author = ECSTRING(common,ACETeam);
-        scope = 2;
-        model = QPATHTOEF(apl,ACE_CSW_m3_tripod.p3d);
-        displayName = CSTRING(Tripod_displayName);
         class ADDON {
             disassembleTo = QGVAR(m3CarryTripodLow);
         };
     };
-    class GVAR(mortarBaseplate): GVAR(m3Tripod) {
+    class GVAR(kordTripod): GVAR(baseTripod) {
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ace_csw_tripod_kord.p3d);
+        displayName = CSTRING(kordTripod_displayName);
+        class ADDON {
+            disassembleTo = QGVAR(kordCarryTripod);
+        };
+    };
+    class GVAR(kordTripodLow): GVAR(kordTripod) {
+        class ADDON {
+            disassembleTo = QGVAR(kordCarryTripod);
+        };
+    };
+    class GVAR(sag30Tripod): GVAR(baseTripod) {
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ace_csw_tripod_ags30.p3d);
+        displayName = CSTRING(sag30Tripod_displayName);
+        class ADDON {
+            disassembleTo = QGVAR(sag30CarryTripod);
+        };
+    };
+    class GVAR(m220Tripod): GVAR(baseTripod) {
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ace_csw_tripod_m220.p3d);
+        displayName = CSTRING(m220Tripod_displayName);
+        class ADDON {
+            disassembleTo = QGVAR(m220CarryTripod);
+        };
+    };
+    class GVAR(spg9Tripod): GVAR(baseTripod) {
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ace_csw_tripod_spg9.p3d);
+        displayName = CSTRING(spg9_Tripod);
+        class ADDON {
+            disassembleTo = QGVAR(spg9CarryTripod);
+        };
+    };
+    class GVAR(mortarBaseplate): GVAR(baseTripod) {
         author = ECSTRING(common,ACETeam);
         scope = 2;
         model = QPATHTOEF(apl,ACE_CSW_mortarBaseplate.p3d);
@@ -108,6 +131,7 @@ class CfgVehicles {
     class StaticMGWeapon: StaticWeapon {};
 
     class HMG_01_base_F: StaticMGWeapon {
+        // ENABLE_CSW_ATTRIBUTE;
         class ADDON {
             enabled = 1;
             proxyWeapon = QGVAR(HMG_Static);
@@ -142,6 +166,7 @@ class CfgVehicles {
 
     class GMG_TriPod;
     class GMG_01_base_F: GMG_TriPod {
+        // ENABLE_CSW_ATTRIBUTE;
         class ADDON {
             enabled = 1;
             proxyWeapon = QGVAR(GMG_20mm); // Weapon Proxy (Shorter Reload Time) [CfgWeapons]
@@ -175,6 +200,7 @@ class CfgVehicles {
 
 
     class AT_01_base_F: StaticMGWeapon {
+        // ENABLE_CSW_ATTRIBUTE;
         class ADDON {
             enabled = 1;
             proxyWeapon = QGVAR(Titan_AT_Static);
@@ -188,6 +214,7 @@ class CfgVehicles {
     };
 
     class AA_01_base_F: StaticMGWeapon {
+        // ENABLE_CSW_ATTRIBUTE;
         class ADDON {
             enabled = 1;
             proxyWeapon = QGVAR(Titan_AA_Static); // Weapon Proxy (Shorter Reload Time) [CfgWeapons]
@@ -203,6 +230,7 @@ class CfgVehicles {
 
     class StaticMortar: StaticWeapon {};
     class Mortar_01_base_F: StaticMortar {
+        // ENABLE_CSW_ATTRIBUTE;
         class ADDON {
             enabled = 1;
             magazineLocation = "";
diff --git a/addons/csw/CfgWeapons.hpp b/addons/csw/CfgWeapons.hpp
index c70e17b0b1..c3b0d3354a 100644
--- a/addons/csw/CfgWeapons.hpp
+++ b/addons/csw/CfgWeapons.hpp
@@ -16,7 +16,7 @@ class CfgWeapons {
         class WeaponSlotsInfo: WeaponSlotsInfo {
             mass = 440;
         };
-        displayName = CSTRING(TripodFolded_displayName);
+        displayName = CSTRING(m3TripodFolded_displayName);
         author = ECSTRING(common,ACETeam);
         scope = 2;
         model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
@@ -27,8 +27,88 @@ class CfgWeapons {
         class ADDON: ADDON {
             deploy = QGVAR(m3TripodLow);
         };
-        displayName = CSTRING(TripodLowFolded_displayName);
+        displayName = CSTRING(m3TripodLowFolded_displayName);
     };
+
+    class GVAR(kordCarryTripod): Launcher_Base_F {
+        class ADDON {
+            type = "mount";
+            deployTime = 4;
+            pickupTime = 4;
+            deploy = QGVAR(kordTripod);
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 350;
+        };
+        displayName = CSTRING(kordTripodFolded_displayName);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = QPATHTOF(UI\Tripod_Icon.paa);
+    };
+
+    class GVAR(kordCarryTripodLow): GVAR(kordCarryTripod) {
+        class ADDON {
+            deploy = QGVAR(kordTripodLow);
+        };
+        displayName = CSTRING(kordTripodFoldedLow_displayName);
+    };
+
+    class GVAR(m220CarryTripod): Launcher_Base_F {
+        class ADDON {
+            type = "mount";
+            deployTime = 10;
+            pickupTime = 6;
+            deploy = QGVAR(m220Tripod);
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 210;
+        };
+        displayName = CSTRING(m220TripodFolded_displayName);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = QPATHTOF(UI\Tripod_Icon.paa);
+    };
+
+    class GVAR(spg9CarryTripod): Launcher_Base_F {
+        class ADDON {
+            type = "mount";
+            deployTime = 5;
+            pickupTime = 3;
+            deploy = QGVAR(spg9Tripod);
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 260;
+        };
+        displayName = CSTRING(spg9_TripodFolded);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = QPATHTOF(UI\Tripod_Icon.paa);
+    };
+
+    class GVAR(sag30CarryTripod): Launcher_Base_F {
+        class ADDON {
+            type = "mount";
+            deployTime = 4;
+            pickupTime = 4;
+            deploy = QGVAR(sag30Tripod);
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 260;
+        };
+        displayName = CSTRING(sag30TripodFolded_displayName);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = QPATHTOF(UI\Tripod_Icon.paa);
+    };
+
     class GVAR(carryMortarBaseplate): Launcher_Base_F {
         class ADDON {
             type = "mount";
@@ -39,7 +119,7 @@ class CfgWeapons {
         class WeaponSlotsInfo: WeaponSlotsInfo {
             mass = 290; // M3A1 baseblate weight
         };
-        displayName = CSTRING(mortarBaseplate_displayName);
+        displayName = CSTRING(mortarBaseplateBag_displayName);
         author = ECSTRING(common,ACETeam);
         scope = 2;
         model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
@@ -48,6 +128,7 @@ class CfgWeapons {
     };
 
 
+
     // Weapons:
     class GVAR(staticATCarry): Launcher_Base_F {
         class ADDON {
@@ -144,26 +225,18 @@ class CfgWeapons {
         class WeaponSlotsInfo: WeaponSlotsInfo {
             mass = 620; // M252 Mortar Weight
         };
-        displayName = CSTRING(StaticMortarBag_displayName);
+        displayName = CSTRING(mk6MortarBag_displayName);
         author = ECSTRING(common,ACETeam);
         scope = 2;
         model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
         modes[] = {};
         picture = QPATHTOF(UI\StaticHGMG_Icon.paa);
     };
-    
-    // Proxy Weapons
 
-    class HMG_static;
-    class GVAR(HMG_Static): HMG_Static {
-        magazineReloadTime = 0.5;
-    };
-    
-    class GMG_20mm;
-    class GVAR(GMG_20mm): GMG_20mm {
-        magazineReloadTime = 0.5;
-    };
-    
+    // Proxy Weapons
+    CREATE_CSW_PROXY(HMG_Static);
+    CREATE_CSW_PROXY(GMG_20mm);
+
     class missiles_titan_static;
     class EGVAR(javelin,Titan_Static): missiles_titan_static {}; // if ace_javelin does not exist, this will just inherit from the base weapon
     class GVAR(Titan_AT_Static): EGVAR(javelin,Titan_Static) {
@@ -173,8 +246,8 @@ class CfgWeapons {
     class GVAR(Titan_AA_Static) : missiles_titan_static {
         magazineReloadTime = 0.5;
     };
-    
-    
+
+
     /*
     class GVAR(staticAutoHMGCarry): Launcher_Base_F {
         class ADDON {
diff --git a/addons/csw/XEH_PREP.hpp b/addons/csw/XEH_PREP.hpp
index 455ffa5e0a..7bde8c3c0f 100644
--- a/addons/csw/XEH_PREP.hpp
+++ b/addons/csw/XEH_PREP.hpp
@@ -1,5 +1,7 @@
 TRACE_1("",QUOTE(ADDON));
 
+PREP(aceRearmGetCarryMagazines);
+
 PREP(ai_handleFired);
 
 PREP(assemble_canDeployTripod);
diff --git a/addons/csw/config.cpp b/addons/csw/config.cpp
index 4aef60630b..9478e7e798 100644
--- a/addons/csw/config.cpp
+++ b/addons/csw/config.cpp
@@ -1,4 +1,5 @@
 #include "script_component.hpp"
+#include "script_config_macros_csw.hpp"
 
 class CfgPatches {
     class ADDON {
@@ -14,6 +15,7 @@ class CfgPatches {
     };
 };
 
+#include "Cfg3den.hpp"
 #include "CfgEventHandlers.hpp"
 #include "CfgVehicles.hpp"
 #include "CfgWeapons.hpp"
diff --git a/addons/csw/cswDesign.txt b/addons/csw/cswDesign.txt
deleted file mode 100644
index 960fb43bf6..0000000000
--- a/addons/csw/cswDesign.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-Settings:
-
-    defaultBehaviour:
-        Normal - Untouched [full mags, normal backpack disassemble]
-        Advanced - [Realistic mags, side unloading]
-    handleExtraMagazines
-        Extra magazines on ground
-        Ignore extra magazines
-
-Vehicle:
-    3den attribute controls if [useSetting, normal or advanced]
-    
-configs:
-
-CfgWeapons:
-    class GVAR(m3CarryTripod): Launcher_Base_F {
-        class ADDON {
-            type = "mount";
-            deployTime = 3;
-            pickupTime = 3;
-            deploy = QGVAR(m3Tripod);
-        };
-
-    class GVAR(staticATCarry): Launcher_Base_F {
-        class ADDON {
-            type = "weapon";
-            deployTime = 8;
-            pickupTime = 15;
-            class assembleTo {
-                tripodCfgVehicle = staticCfgVehicle;
-            };
-        };
-
-
-
-
-CfgVehicles:
-    class GVAR(m3Tripod): // Tripod Example
-        class ADDON {
-            disassembleTo = QGVAR(m3CarryTripod);
-        
-        
-    class Mortar_01_base_F: // Static Weapon Example
-        class ADDON {
-            enabled = 1;
-            magazineLocation = "";
-            disassembleWeapon = ""; // secondary weapon classname
-            disassembleTurret = ""; // CfgVehicle
-            desiredAmmo = 100; //
-            ammoLoadTime = 5;
-            ammoUnloadTime = 5;
-
-            
diff --git a/addons/csw/data/model.cfg b/addons/csw/data/model.cfg
index aa9fa5af7c..7adabdac10 100644
--- a/addons/csw/data/model.cfg
+++ b/addons/csw/data/model.cfg
@@ -6,8 +6,11 @@ class CfgSkeletons {
     };
     class ACE_CSW_Tripod_Skeleton: Default {};
     class ACE_CSW_M3_Tripod_Skeleton: Default {};
-    // class ACE_CSW_FoldedTripod_Skeleton: Default {};
-    // class ACE_CSW_ammoBox_Skeleton: Default {};
+    class ace_csw_tripod_ags30_Skeleton: Default {};
+    class ace_csw_tripod_kord_Skeleton: Default {};
+    class ace_csw_tripod_m122_Skeleton: Default {};
+    class ace_csw_tripod_m220_Skeleton: Default {};
+    class ace_csw_tripod_spg9_Skeleton: Default {};
     class ACE_CSW_WeaponBag_Skeleton: Default {};
     class ACE_CSW_mortarBaseplate_Skeleton: Default {};
 };
@@ -27,16 +30,31 @@ class CfgModels {
         sections[] = {};
         skeletonName = "ACE_CSW_M3_Tripod_Skeleton";
     };
-    /* class ACE_CSW_FoldedTripod: Default {
+    class ace_csw_tripod_ags30 : Default {
         sectionsInherit = "";
         sections[] = {};
-        skeletonName = "ACE_CSW_FoldedTripod_Skeleton";
+        skeletonName = "ace_csw_tripod_ags30_Skeleton";
     };
-    class ACE_CSW_ammoBox: Default {
+    class ace_csw_tripod_kord : Default {
         sectionsInherit = "";
         sections[] = {};
-        skeletonName = "ACE_CSW_ammoBox_Skeleton";
-    }; */
+        skeletonName = "ace_csw_tripod_kord_Skeleton";
+    };
+    class ace_csw_tripod_m122 : Default {
+        sectionsInherit = "";
+        sections[] = {};
+        skeletonName = "ace_csw_tripod_m122_Skeleton";
+    };
+    class ace_csw_tripod_m220 : Default {
+        sectionsInherit = "";
+        sections[] = {};
+        skeletonName = "ace_csw_tripod_m220_Skeleton";
+    };
+    class ace_csw_tripod_spg9 : Default {
+        sectionsInherit = "";
+        sections[] = {};
+        skeletonName = "ace_csw_tripod_spg9_Skeleton";
+    };
     class ACE_CSW_Bag: Default {
         sectionsInherit = "";
         sections[] = {};
diff --git a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf
new file mode 100644
index 0000000000..ac64f636e8
--- /dev/null
+++ b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf
@@ -0,0 +1,50 @@
+#include "script_component.hpp"
+/*
+ * Author: PabstMirror
+ * Helper function for ace_rearm; Gets magazines that should be loaded by csw
+ *
+ * Arguments:
+ * 0: Vehicle <OBJECT>
+ * 1: Specific Turret or pass bool to check all turrets <ARRAY><BOOL>(default: true)
+ *
+ * Return Value:
+ * [0: compatible veh mags, 1: carry mags] <ARRAY>
+ *
+ * Example:
+ * [cursorObject, [0]] call ace_csw_fnc_aceRearmGetCarryMagazines
+ *
+ * Public: No
+ */
+
+params ["_vehicle", ["_targetTurret", true, [[], true]]];
+
+if (!(_vehicle isKindOf "StaticWeapon")) exitWith { [[],[]] }; // limit to statics for now
+// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
+if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_vehicle getVariable [QGVAR(assemblyMode), 3]))}) exitWith { [[],[]] };
+
+private _turretMagsCSW = [];
+private _allCarryMags = [];
+{
+    private _turretPath = _x;
+    if ((_targetTurret isEqualTo true) || {_turretPath isEqualTo _targetTurret}) then {
+        {
+            private _weapon = _x;
+            {
+                private _xMag = _x;
+                private _carryMag = GVAR(vehicleMagCache) getVariable _xMag;
+                if (isNil "_carryMag") then {
+                    private _groups = "getNumber (_x >> _xMag) == 1" configClasses (configFile >> QGVAR(groups));
+                    _carryMag = configName (_groups param [0, configNull]);
+                    GVAR(vehicleMagCache) setVariable [_x, _carryMag];
+                    TRACE_2("setting cache",_xMag,_carryMag);
+                };
+                if (_carryMag != "") then {
+                    _turretMagsCSW pushBackUnique _xMag;
+                    _allCarryMags pushBackUnique _carryMag;
+                };
+            } forEach ([_weapon] call CBA_fnc_compatibleMagazines);
+        } forEach (_vehicle weaponsTurret _turretPath);
+    };
+} forEach (allTurrets _vehicle);
+
+[_turretMagsCSW, _allCarryMags]
diff --git a/addons/csw/functions/fnc_ai_handleFired.sqf b/addons/csw/functions/fnc_ai_handleFired.sqf
index 43876f3b87..f85c74fd20 100644
--- a/addons/csw/functions/fnc_ai_handleFired.sqf
+++ b/addons/csw/functions/fnc_ai_handleFired.sqf
@@ -75,7 +75,7 @@ if (_bestAmmoToSend == -1) exitWith {ERROR("No ammo");};
 
 // Remove the mag from the source
 if (_reloadSource isKindOf "CaManBase") then {
-    [_reloadSource, _reloadMag, _bestAmmoToSend] call ace_common_fnc_removeSpecificMagazine;
+    [_reloadSource, _reloadMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine);
 } else {
     [_reloadSource, _reloadMag, 1, _bestAmmoToSend] call CBA_fnc_removeMagazineCargo;
 };
diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf
index 21a88709d6..ef40e03b3c 100644
--- a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf
+++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf
@@ -17,9 +17,10 @@
 
 params ["_staticWeapon"];
 
-private _assemblyMode = [false, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 2]);
-private _crewed = (crew _staticWeapon) isEqualTo [];
+// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
+private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 3]);
+private _notCrewed = (crew _staticWeapon) isEqualTo [];
 private _deadCrew = !(alive (gunner _staticWeapon)); // need to eject body???
 
-_assemblyMode && {(!_crewed) || _deadCrew}
+_assemblyMode && {_notCrewed || _deadCrew}
 
diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf
index 7bae44a350..ba7f15777a 100644
--- a/addons/csw/functions/fnc_assemble_deployTripod.sqf
+++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf
@@ -32,6 +32,12 @@
 
         // Create a tripod
         private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"];
+        // Because the tripod can be a "full weapon" we disable any data that will allow it to be loaded
+        _cswTripod setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set enabled&unload assembly mode and broadcast
+        if (!GVAR(defaultAssemblyMode)) then {
+            TRACE_1("global disableVanillaAssembly event",_cswTripod); // handles it being assembled when setting is disabled
+            [QGVAR(disableVanillaAssembly), [_cswTripod]] call CBA_fnc_globalEvent;
+        };
 
         private _posATL = _player getRelPos [2, 0];
         _posATL set [2, ((getPosATL _player) select 2) + 0.5];
diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf
index 1c27352606..12b5938bb9 100644
--- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf
+++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf
@@ -43,15 +43,18 @@
         [{
             params ["_assembledClassname", "_tripodDir", "_tripodPos"];
             private _csw = createVehicle [_assembledClassname, [0, 0, 0], [], 0, "NONE"];
-            _csw setVariable [QGVAR(assemblyMode), 1, true]; // Explicitly set advanced assembly mode and broadcast
-            _csw setVariable [QGVAR(emptyWeapon), true, false]; // unload gun, shouldn't need broadcast for this as it will be local to us
+            // Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
+            _csw setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set advanced assembly mode + unload, and broadcast
             if (!GVAR(defaultAssemblyMode)) then {
                 TRACE_1("global disableVanillaAssembly event",_csw); // handles it being assembled when setting is disabled
                 [QGVAR(disableVanillaAssembly), [_csw]] call CBA_fnc_globalEvent;
             };
             _csw setDir _tripodDir;
             _csw setPosATL _tripodPos;
-            _csw setVectorUp (surfaceNormal _tripodPos);
+            if ((_tripodPos select 2) < 0.5) then {
+                _csw setVectorUp (surfaceNormal _tripodPos);
+            };
+            TRACE_2("csw placed",_csw,_assembledClassname);
         }, [_assembledClassname, _tripodDir, _tripodPos]] call CBA_fnc_execNextFrame;
     };
 
diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf
index bc35f44f6d..1b131d4a3b 100644
--- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf
+++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf
@@ -25,7 +25,8 @@
     private _pickupTime = getNumber(configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "pickupTime");
     TRACE_4("",typeOf _staticWeapon,_carryWeaponClassname,_turretClassname,_pickupTime);
     if (!isClass (configFile >> "CfgWeapons" >> _carryWeaponClassname)) exitWith {ERROR_1("bad weapon classname [%1]",_carryWeaponClassname);};
-    if (!isClass (configFile >> "CfgVehicles" >> _turretClassname)) exitWith {ERROR_1("bad turret classname [%1]",_turretClassname);};
+    // Turret classname can equal nothing if the deploy bag is the "whole" weapon. e.g Kornet, Metis, other ATGMs
+    if (!(_turretClassname isEqualTo "") && {!isClass (configFile >> "CfgVehicles" >> _turretClassname)}) exitWith {ERROR_1("bad turret classname [%1]",_turretClassname);};
 
     private _onFinish = {
         params ["_args"];
@@ -53,29 +54,33 @@
             };
         } forEach (magazinesAllTurrets _staticWeapon);
 
-        private _cswTripod = createVehicle [_turretClassname, [0, 0, 0], [], 0, "NONE"];
-        [_cswTripod, _staticWeapon] call (missionNamespace getVariable _onDisassembleFunc);
+        if !(_turretClassname isEqualTo "") then {
+            private _cswTripod = createVehicle [_turretClassname, [0, 0, 0], [], 0, "NONE"];
+            // Delay a frame so weapon has a chance to be deleted
+            [{
+                params ["_cswTripod", "_weaponDir", "_weaponPos"];
+                _cswTripod setDir _weaponDir;
+                _cswTripod setPosATL _weaponPos;
+                _cswTripod setVelocity [0, 0, -0.05];
+                _cswTripod setVectorUp (surfaceNormal _weaponPos);
+            }, [_cswTripod, _weaponDir, _weaponPos]] call CBA_fnc_execNextFrame;
+            [_cswTripod, _staticWeapon] call (missionNamespace getVariable _onDisassembleFunc);
+        };
 
-        LOG("delete weapon");
-        deleteVehicle _staticWeapon;
-
-        // Delay a frame so weapon has a chance to be deleted
         [{
-            params ["_player", "_cswTripod", "_weaponDir", "_weaponPos", "_carryWeaponClassname"];
-            _cswTripod setDir _weaponDir;
-            _cswTripod setPosATL _weaponPos;
-            _cswTripod setVelocity [0, 0, -0.05];
-            _cswTripod setVectorUp (surfaceNormal _weaponPos);
-
+            params ["_player", "_weaponPos", "_carryWeaponClassname"];
             if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith {
                 _player addWeapon _carryWeaponClassname;
             };
-            private _weaponRelPos = _cswTripod getRelPos RELATIVE_DIRECTION(90);
+            private _weaponRelPos = _weaponPos getPos RELATIVE_DIRECTION(90);
             private _weaponHolder = createVehicle ["groundWeaponHolder", [0, 0, 0], [], 0, "NONE"];
             _weaponHolder setDir random [0, 180, 360];
             _weaponHolder setPosATL [_weaponRelPos select 0, _weaponRelPos select 1, _weaponPos select 2];
             _weaponHolder addWeaponCargoGlobal [_carryWeaponClassname, 1];
-        }, [_player, _cswTripod, _weaponDir, _weaponPos, _carryWeaponClassname]] call CBA_fnc_execNextFrame;
+        }, [_player, _weaponPos, _carryWeaponClassname]] call CBA_fnc_execNextFrame;
+
+        LOG("delete weapon");
+        deleteVehicle _staticWeapon;
 
         LOG("end");
     };
diff --git a/addons/csw/functions/fnc_proxyWeapon.sqf b/addons/csw/functions/fnc_proxyWeapon.sqf
index 198a4fbe28..3e47fddadd 100644
--- a/addons/csw/functions/fnc_proxyWeapon.sqf
+++ b/addons/csw/functions/fnc_proxyWeapon.sqf
@@ -7,30 +7,33 @@
  * 0: Weapon <OBJECT>
  * 1: Turret <ARRAY>
  * 2: Proxy weapon needed <BOOL>
+ * 2: Weapon should be emptied <BOOL>
  *
  * Return Value:
  * None
  *
  * Example:
- * [weapon, [0], true] call ace_csw_fnc_proxyWeapon
+ * [weapon, [0], true, false] call ace_csw_fnc_proxyWeapon
  *
  * Public: No
  */
 
-params ["_staticWeapon", "_turret", "_needed"];
+params ["_staticWeapon", "_turret", "_needed", "_emptyWeapon"];
+TRACE_4("proxyWeapon",_staticWeapon,_turret,_needed,_emptyWeapon);
 
-if (_staticWeapon getVariable [format [QGVAR(proxyHandled_%1), _turret], false]) exitWith { TRACE_1("proxy weapon already handled",_staticWeapon); };
+if (_staticWeapon getVariable [format [QGVAR(proxyHandled_%1), _turret], false]) exitWith { TRACE_1("already handled",typeOf _staticWeapon); };
 
 private _typeOf = typeOf _staticWeapon;
 private _proxyWeapon = getText(configFile >> "CfgVehicles" >> _typeOf >> "ace_csw" >> "proxyWeapon");
-TRACE_5("proxyWeapon",_staticWeapon,_turret,_needed,_typeOf,_proxyWeapon);
 
-if (_proxyWeapon == "") exitWith { TRACE_1("proxyWeapon not defined",_proxyWeapon); };
+TRACE_2("",_typeOf,_proxyWeapon);
+if (_proxyWeapon == "") exitWith {};
 
 private _currentWeapon = (_staticWeapon weaponsTurret [0]) param [0, "#none"];
 if ((missionNamespace getVariable [_proxyWeapon, objNull]) isEqualType {}) then { // check if string is a function
     TRACE_1("Calling proxyWeapon function",_proxyWeapon);
-    _proxyWeapon = [_staticWeapon, _turret, _currentWeapon, _needed] call (missionNamespace getVariable _proxyWeapon);
+    // This function may replace magazines or do other things to the static weapon
+    _proxyWeapon = [_staticWeapon, _turret, _currentWeapon, _needed, _emptyWeapon] call (missionNamespace getVariable _proxyWeapon);
     _needed = _proxyWeapon != "";
 };
 if (!_needed) exitWith { TRACE_2("not needed",_needed,_proxyWeapon); };
diff --git a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf
index bbf2b8dc39..8e6f3ce500 100644
--- a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf
+++ b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf
@@ -43,7 +43,7 @@ private _return = [];
                 if (((getNumber (_carryGroup >> _x)) == 1) && {_loadInfo = [_vehicle, _turretPath, _carryMag, _player] call FUNC(reload_canLoadMagazine); _loadInfo select 0}) exitWith {
                     _return pushBack [_carryMag, _turretPath, _loadInfo];
                 };
-            } forEach (getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"));
+            } forEach ([_weapon] call CBA_fnc_compatibleMagazines);
         } forEach _carriedMagazines;
     } forEach (_vehicle weaponsTurret _turretPath);
 } forEach (allTurrets _vehicle);
diff --git a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf
index 55d10dd4b7..841192864a 100644
--- a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf
+++ b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf
@@ -52,7 +52,7 @@ if (_canAdd) then {
             TRACE_1("Removing emtpy mag",_loadedMag);
             _vehicle removeMagazinesTurret [_loadedMag, _turret];
         };
-        [_vehicle, _turret, true] call FUNC(proxyWeapon); // Check if we need to add proxy weapon now
+        [_vehicle, _turret, true, false] call FUNC(proxyWeapon); // Check if we need to add proxy weapon now
         private _newMag = [_vehicle, _turret, _carryMag] call FUNC(reload_getVehicleMagazine);
         TRACE_2("Adding new mag",_newMag,_ammoUsed);
         _vehicle addMagazineTurret [_newMag, _turret, _ammoUsed];
diff --git a/addons/csw/functions/fnc_staticWeaponInit.sqf b/addons/csw/functions/fnc_staticWeaponInit.sqf
index 2e820ca594..4ce86f3c49 100644
--- a/addons/csw/functions/fnc_staticWeaponInit.sqf
+++ b/addons/csw/functions/fnc_staticWeaponInit.sqf
@@ -31,10 +31,13 @@ if (_configEnabled && {_staticWeapon turretLocal [0]}) then { // if turret is lo
     [{
         params ["_staticWeapon"];
         if (!alive _staticWeapon) exitWith { TRACE_1("dead/deleted",_staticWeapon); };
-        private _assemblyMode = [false, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 2]);
+        // Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
+        private _assemblyModeIndex = _staticWeapon getVariable [QGVAR(assemblyMode), 3];
+        private _emptyWeapon = _assemblyModeIndex isEqualTo 2;
+        private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select _assemblyModeIndex;
         TRACE_2("turretLocal",_staticWeapon,_assemblyMode);
-        [_staticWeapon, [0], _assemblyMode] call FUNC(proxyWeapon);
-        [_staticWeapon, _assemblyMode] call FUNC(staticWeaponInit_unloadExtraMags);
+        [_staticWeapon, [0], _assemblyMode, _emptyWeapon] call FUNC(proxyWeapon);
+        [_staticWeapon, _assemblyMode, _emptyWeapon] call FUNC(staticWeaponInit_unloadExtraMags);
     }, [_staticWeapon]] call CBA_fnc_execNextFrame;  // need to wait a frame to allow setting object vars during assembly
 };
 
@@ -42,7 +45,7 @@ if (_assemblyConfig) then {
     [{
         params ["_staticWeapon"];
         if (!alive _staticWeapon) exitWith { TRACE_1("dead/deleted",_staticWeapon); };
-        private _assemblyMode = [false, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 2]);
+        private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 3]);
         TRACE_2("assemblyConfig present",_staticWeapon,_assemblyMode);
         if (_assemblyMode) then { // Disable vanilla assembly if assemblyMode eanbled
             [QGVAR(disableVanillaAssembly), [_staticWeapon]] call CBA_fnc_localEvent;
@@ -65,7 +68,7 @@ if (hasInterface && {!(_typeOf in GVAR(initializedStaticTypes))}) then {
     private _magazineLocation = getText (configFile >> "CfgVehicles" >> _typeOf >> QUOTE(ADDON) >> "magazineLocation");
     private _condition = { //IGNORE_PRIVATE_WARNING ["_target", "_player"];
         // If magazine handling is enabled or weapon assembly/disassembly is enabled we enable ammo handling
-        if ((GVAR(ammoHandling) == 0) && {!([false, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 2]))}) exitWith { false };
+        if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_target getVariable [QGVAR(assemblyMode), 3]))}) exitWith { false };
         [_player, _target, ["isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith)
     };
     private _childenCode = {
diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf
index a5eddfe6a6..bd73df878c 100644
--- a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf
+++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf
@@ -5,24 +5,19 @@
  *
  * Arguments:
  * 0: Weapon <OBJECT>
+ * 1: Using advanced assembly <BOOL>
  *
  * Return Value:
  * None
  *
  * Example:
- * [weapon] call ace_csw_fnc_staticWeaponInit_unloadExtraMags
+ * [cursorObject, false] call ace_csw_fnc_staticWeaponInit_unloadExtraMags
  *
  * Public: No
  */
 
-params ["_staticWeapon"];
-TRACE_1("staticWeaponInit_unloadExtraMags",_staticWeapon);
-if (!alive _staticWeapon) exitWith {TRACE_1("dead/deleted",alive _staticWeapon);};
-
-private _assemblyMode = [false, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 2]);
-private _emptyWeapon = _staticWeapon getVariable [QGVAR(emptyWeapon), false];
-TRACE_2("",_assemblyMode,_emptyWeapon);
-
+params ["_staticWeapon", "_assemblyMode", "_emptyWeapon"];
+TRACE_3("staticWeaponInit_unloadExtraMags",_staticWeapon,_assemblyMode,_emptyWeapon);
 if (!_assemblyMode) exitWith {};
 
 private _desiredAmmo = getNumber (configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "desiredAmmo");
@@ -31,7 +26,7 @@ if (_emptyWeapon) then {
     _desiredAmmo = 0;
     _storeExtraMagazines = false;
 };
-TRACE_2("settings",_desiredAmmo,_storeExtraMagazines);
+TRACE_3("settings",_emptyWeapon,_desiredAmmo,_storeExtraMagazines);
 
 private _magsToRemove = [];
 private _loadedMagazineInfo = [];
diff --git a/addons/csw/script_component.hpp b/addons/csw/script_component.hpp
index ab263d6dec..29521039f2 100644
--- a/addons/csw/script_component.hpp
+++ b/addons/csw/script_component.hpp
@@ -2,10 +2,10 @@
 #define COMPONENT_BEAUTIFIED Crew-Served Weapons
 #include "\z\ace\addons\main\script_mod.hpp"
 
-#define FAST_PROGRESSBARS
-#define DEBUG_MODE_FULL
-#define DISABLE_COMPILE_CACHE
-#define ENABLE_PERFORMANCE_COUNTERS
+// #define FAST_PROGRESSBARS
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
 
 #ifdef DEBUG_ENABLED_CSW
     #define DEBUG_MODE_FULL
diff --git a/addons/csw/script_config_macros_csw.hpp b/addons/csw/script_config_macros_csw.hpp
new file mode 100644
index 0000000000..1a0e1b3be5
--- /dev/null
+++ b/addons/csw/script_config_macros_csw.hpp
@@ -0,0 +1,15 @@
+#define CREATE_CSW_PROXY(weapon) class ##weapon; class GVAR(weapon): ##weapon { magazineReloadTime = 0.5; }
+
+// Need to be careful about breaking Attributes inheritance, doesn't seem to be any standard
+#define ENABLE_CSW_ATTRIBUTE class Attributes { \
+        class EGVAR(CSW,assemblyMode) { \
+            property = QEGVAR(CSW,assemblyMode); \
+            control = QEGVAR(CSW,assemblyModeControl); \
+            displayName = ECSTRING(CSW,eden_enableCSW); \
+            tooltip = ECSTRING(CSW,eden_enableCSW_tooltip); \
+            expression = QUOTE( if (_value != 3) then {_this setVariable [ARR_3('%s',_value,true)]} ); \
+            typeName = "NUMBER"; \
+            condition = "objectVehicle"; \
+            defaultValue = 3; \
+        }; \
+    }
diff --git a/addons/csw/stringtable.xml b/addons/csw/stringtable.xml
index e71400da6c..b16543e55a 100644
--- a/addons/csw/stringtable.xml
+++ b/addons/csw/stringtable.xml
@@ -4,9 +4,6 @@
         <Key ID="STR_ACE_CSW_displayName">
             <English>Crew Served Weapons</English>
         </Key>
-        <Key ID="STR_ACE_CSW_Tripod_displayName">
-            <English>CSW Tripod</English>
-        </Key>
         <Key ID="STR_ACE_CSW_PlaceTripod_displayName">
             <English>Place Tripod</English>
         </Key>
@@ -75,12 +72,6 @@
         <Key ID="STR_ACE_CSW_ammoHandling_description">
             <English>Allow loading and unloading magazines</English>
         </Key>
-        <Key ID="STR_ACE_CSW_aiReloading_displayName">
-            <English>AI Reloading</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_aiReloading_description">
-            <English>AI will attempt to reload static weapons with available ammo</English>
-        </Key>
         <Key ID="STR_ACE_CSW_progressBarTimeCoefficent_displayName">
             <English>Interaction Time Coefficent</English>
         </Key>
@@ -90,9 +81,6 @@
         <Key ID="STR_ACE_CSW_Pickup_displayName">
             <English>Pickup Tripod</English>
         </Key>
-        <Key ID="STR_ACE_CSW_Move_displayName">
-            <English>Move Tripod</English>
-        </Key>
         <Key ID="STR_ACE_CSW_MountWeapon_displayName">
             <English>Mount Weapon</English>
         </Key>
@@ -102,12 +90,6 @@
         <Key ID="STR_ACE_CSW_AssembleCSW_progressBar">
             <English>Assembling Gun...</English>
         </Key>
-        <Key ID="STR_ACE_CSW_LoadingAmmo_progressBar">
-            <English>Loading Ammo...</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_UnloadingAmmo_progressBar">
-            <English>Unloading Ammo...</English>
-        </Key>
         <Key ID="STR_ACE_CSW_PickupTripod_progressBar">
             <English>Picking Up Tripod...</English>
         </Key>
@@ -120,44 +102,17 @@
         <Key ID="STR_ACE_CSW_eden_enableCSW_tooltip">
             <English>Enables Crew Served ability on this weapon</English>
         </Key>
-        <Key ID="STR_ACE_CSW_genericDescription">
-            <English>Used to reload crew served weapons</English>
+        <Key ID="STR_ACE_CSW_eden_enableAndEmpty">
+            <English>Enabled and Leave Weapon Empty</English>
         </Key>
-        <Key ID="STR_ACE_CSW_TripodFolded_displayName">
-            <English>[CSW] Deployable Tripod</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_TripodLowFolded_displayName">
-            <English>[CSW] Deployable Tripod (Low)</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_mortarBaseplate_displayName">
-            <English>[CSW] Mk6 Mortar Baseplate</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticMortarBag_displayName">
-            <English>[CSW] Mk6 Mortar Tube</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticATWeapon_displayName">
-            <English>[CSW] Mini-Spike Launcher (AT)</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticAAWeapon_displayName">
-            <English>[CSW] Mini-Spike Launcher (AA)</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticHMGWeapon_displayName">
-            <English>[CSW] XM312</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticAutoHMGWeapon_displayName">
-            <English>[CSW] XM312A</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticHMGTallWeapon_displayName">
-            <English>[CSW] XM312 (High)</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticGMGWeapon_displayName">
-            <English>[CSW] XM307</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticAutoGMGWeapon_displayName">
-            <English>[CSW] XM307A</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_StaticGMGTallWeapon_displayName">
-            <English>[CSW] XM307 (High)</English>
+        <Key ID="STR_ACE_CSW_genericTripod_displayName">
+          <English>Tripod</English>
+          <French>Trépied</French>
+          <Spanish>Trípode</Spanish>
+          <Italian>Treppiede</Italian>
+          <Polish>Trójnóg</Polish>
+          <German>Dreibein</German>
+          <Turkish>Üçayak</Turkish>
         </Key>
         <Key ID="STR_ACE_CSW_StaticATBag_displayName">
             <English>[CSW] Static Mini-Spike Launcher (AT)</English>
@@ -171,30 +126,12 @@
         <Key ID="STR_ACE_CSW_StaticAutoHMGBag_displayName">
             <English>[CSW] Static XM312 Gun (Autonomous)</English>
         </Key>
-        <Key ID="STR_ACE_CSW_StaticHMGTallBag_displayName">
-            <English>[CSW] Static XM312 Gun (High)</English>
-        </Key>
         <Key ID="STR_ACE_CSW_StaticGMGBag_displayName">
             <English>[CSW] Static XM307 Gun</English>
         </Key>
         <Key ID="STR_ACE_CSW_StaticAutoGMGBag_displayName">
             <English>[CSW] Static XM307 Gun (Autonomous)</English>
         </Key>
-        <Key ID="STR_ACE_CSW_StaticGMGTallBag_displayName">
-            <English>[CSW] Static XM307 Gun (High)</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_HMGStatic_displayName">
-            <English>[CSW] HMG Static</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_GMGStatic_displayName">
-            <English>[CSW] GMG Static</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_ATStatic_displayName">
-            <English>[CSW] AT Static</English>
-        </Key>
-        <Key ID="STR_ACE_CSW_AAStatic_displayName">
-            <English>[CSW] AA Static</English>
-        </Key>
         <Key ID="STR_ACE_CSW_127x108_displayName">
             <English>[CSW] 12.7x108mm HMG Belt</English>
         </Key>
@@ -213,8 +150,89 @@
         <Key ID="STR_ACE_CSW_GMGBelt_displayName">
             <English>[CSW] 20mm Grenade GMG Belt</English>
         </Key>
-        <Key ID="STR_ACE_CSW_mag_127x108">
-            <English>[CSW] 12.7 x 108 mm Ammo Belt</English>
+        <Key ID="STR_ACE_CSW_m3Tripod_displayName">
+            <English>M3 Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_kordTripodFolded_displayName">
+            <English>[CSW] 6P57 Deployable Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_kordTripodFoldedLow_displayName">
+            <English>[CSW] 6P57 Deployable Tripod (Low)</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_m220TripodFolded_displayName">
+            <English>[CSW] M220 Deployable Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_sag30TripodFolded_displayName">
+            <English>[CSW] SAG-30 Deployable Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_kordTripod_displayName">
+            <English>6P57 Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_sag30Tripod_displayName">
+            <English>SAG-30 Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_m220Tripod_displayName">
+            <English>M220 Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_m3TripodFolded_displayName">
+            <English>[CSW] M3 Deployable Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_m3TripodLowFolded_displayName">
+            <English>[CSW] M3 Deployable Tripod (Low)</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_mortarBaseplateBag_displayName">
+            <English>[CSW] Mortar Baseplate</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_mortarBaseplate_displayName">
+            <English>Mortar Baseplate</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_mk6MortarBag_displayName">
+            <English>[CSW] Mk6 Mortar Tube</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_m252_tube">
+            <English>[CSW] M252 Tube Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_m2_gun">
+            <English>[CSW] M2 Gun Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_mk19_gun">
+            <English>[CSW] MK19 Gun Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_tow_tube">
+            <English>[CSW] BGM-71 TOW Launcher Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_dshk_gun">
+            <English>[CSW] DSHK Gun Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_2b14_tube">
+            <English>[CSW] 2B14 Tube Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_nsv_gun">
+            <English>[CSW] NSV Gun Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_kord_gun">
+            <English>[CSW] KORD Gun Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_ags30_gun">
+            <English>[CSW] AGS-30 Gun Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_metis_tube">
+            <English>[CSW] 9k115 Metis Launcher Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_kornet_launcher">
+            <English>[CSW] 9m113 Kornet Launcher</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_spg9_Tripod">
+            <English>SPG-9 Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_spg9_TripodFolded">
+            <English>[CSW] SPG-9 Deployable Tripod</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_spg9_tube">
+            <English>[CSW] SPG-9 Launcher Bag</English>
+        </Key>
+        <Key ID="STR_ACE_CSW_spg9m_tube">
+            <English>[CSW] SPG-9M Launcher Bag</English>
         </Key>
     </Package>
 </Project>
diff --git a/addons/dragon/CfgAmmo.hpp b/addons/dragon/CfgAmmo.hpp
index faccdfb1cd..033239013f 100644
--- a/addons/dragon/CfgAmmo.hpp
+++ b/addons/dragon/CfgAmmo.hpp
@@ -2,7 +2,7 @@ class CfgAmmo {
     class ammo_Penetrator_Base;
     class M_Scalpel_AT;
     class Rocket_03_AP_F;
-    
+
     class GVAR(penetrator_super): ammo_Penetrator_Base {
         caliber = 60;
         warheadName = "HEAT";
@@ -25,7 +25,7 @@ class CfgAmmo {
         airFriction = 0.5;
         fuseDistance = 75;
         whistleDist = 2;
-        
+
         hit = 100;
         indirectHit = 9;
         indirectHitRange = 1;
@@ -34,7 +34,7 @@ class CfgAmmo {
         cost = 500;
         simulationStep = 0.005;
         maxControlRange = 1500;
-        
+
         class ace_missileguidance {
             minDeflection = 0;
             maxDeflection = 0;
@@ -59,7 +59,7 @@ class CfgAmmo {
             correctionDistance = 30;
             missileLeadDistance = 0;
             offsetFromCrosshair[] = { 0, 0, 0 };
-            
+
             serviceInterval = 0.33; // how many seconds between pops
             serviceCharges = 32; // how many charges are in this missile
             serviceChargeAcceleration = 6.5;
@@ -69,7 +69,7 @@ class CfgAmmo {
             attackProfiles[] = {"DRAGON"};
         };
     };
-    
+
     class GVAR(super) : GVAR(dragonBase) {
         submunitionAmmo = QGVAR(penetrator_super);
         submunitionDirectionType = "SubmunitionModelDirection";
@@ -96,7 +96,7 @@ class CfgAmmo {
 
             correctionDistance = 30;
             missileLeadDistance = 0;
-            
+
             serviceInterval = 0.33; // how many seconds between pops
             serviceCharges = 60; // how many charges are in this missile
             serviceChargeAcceleration = 6.5;
@@ -106,7 +106,7 @@ class CfgAmmo {
             attackProfiles[] = {"DRAGON"};
         };
     };
-    
+
     class ShellBase;
     class GVAR(serviceCharge) : ShellBase {
         hit = 1;
diff --git a/addons/dragon/CfgVehicles.hpp b/addons/dragon/CfgVehicles.hpp
index c1c690c52e..faac05bbe9 100644
--- a/addons/dragon/CfgVehicles.hpp
+++ b/addons/dragon/CfgVehicles.hpp
@@ -122,11 +122,13 @@ class CfgVehicles {
                     displayName = CSTRING(attachSight);
                     condition = QUOTE(call FUNC(sightCanAttach));
                     statement = QUOTE(call FUNC(sightAttach));
+                    icon = QPATHTOF(data\m47_daysight_interaction_attach.paa);
                 };
                 class GVAR(detachSight) {
                     displayName = CSTRING(detachSight);
                     condition = QUOTE(call FUNC(sightCanDetach));
                     statement = QUOTE(call FUNC(sightDetach));
+                    icon = QPATHTOF(data\m47_daysight_interaction_detach.paa);
                 };
             };
         };
diff --git a/addons/dragon/CfgWeapons.hpp b/addons/dragon/CfgWeapons.hpp
index f9c7f262ae..9cb58e2c1f 100644
--- a/addons/dragon/CfgWeapons.hpp
+++ b/addons/dragon/CfgWeapons.hpp
@@ -10,22 +10,22 @@ class CfgWeapons {
     class launch_Titan_F: launch_Titan_base {
         class WeaponSlotsInfo;
     };
-    
+
     class GVAR(super): launch_Titan_F {
         model = QPATHTOF(models\ace_m47_magazine.p3d);
         picture = QPATHTOF(data\m47_dragon_item_ca.paa);
         magazines[] = {};
-        displayName = CSTRING(dragonName);
+        displayName = CSTRING(dragonNameCarry); // add [CSW] prefix to make it clearer in arsenal that this is a deployable weapon
         descriptionShort = CSTRING(dragonDescription);
         scope = 2;
-        
+
         class ACE_CSW {
             type = "mount";
             deployTime = 2;
             pickupTime = 2;
             deploy = QGVAR(staticBase);
         };
-        
+
         class WeaponSlotsInfo: WeaponSlotsInfo {
             mass = 253;
         };
@@ -36,14 +36,14 @@ class CfgWeapons {
         EGVAR(overpressure,angle) = 90;
         EGVAR(overpressure,range) = 30;
         EGVAR(overpressure,damage) = 0.85;
-        
+
         initSpeed = 120;
-        
+
         displayName = CSTRING(dragonName);
         descriptionShort = CSTRING(dragonDescription);
         magazines[] = { QGVAR(super) };
-    };    
-    
+    };
+
     // need a weapon in order to rotate turret
     class GVAR(dummyStatic): Default {
         cursor = "";
@@ -55,7 +55,7 @@ class CfgWeapons {
         optics = 0;
         enableAttack = 0;
     };
-    
+
     class GVAR(sight): Binocular {
         displayName = CSTRING(sightName);
         model = QPATHTOF(models\ace_m47_optic.p3d);
diff --git a/addons/dragon/XEH_postInit.sqf b/addons/dragon/XEH_postInit.sqf
index 690f392447..0305fe772a 100644
--- a/addons/dragon/XEH_postInit.sqf
+++ b/addons/dragon/XEH_postInit.sqf
@@ -19,10 +19,14 @@
     GVAR(pfID) = [{
         params ["_args"];
         (_this select 0) params ["_vehicle", "_lastView"];
-        
+
         if ((!alive _vehicle) || {!alive ACE_player} || {(vehicle ACE_player) != _vehicle}) exitWith {
             TRACE_1("exiting PFEH",GVAR(pfID));
             [GVAR(pfID)] call CBA_fnc_removePerFrameHandler;
+            if ((alive _vehicle) && {!alive gunner _vehicle}) then {
+                TRACE_1("reseting rest rotate anim",_vehicle);
+                _vehicle animate ["rest_rotate", -0.35];
+            };
         };
 
         if (cameraView in ["INTERNAL", "EXTERNAL"]) then {
diff --git a/addons/dragon/config.cpp b/addons/dragon/config.cpp
index 10a1d285db..78d836936e 100644
--- a/addons/dragon/config.cpp
+++ b/addons/dragon/config.cpp
@@ -6,7 +6,7 @@ class CfgPatches {
         units[] = {};
         weapons[] = {};
         requiredVersion = REQUIRED_VERSION;
-        requiredAddons[] = {"ace_common","ace_missileguidance","ace_hot","ace_csw"};
+        requiredAddons[] = {"ace_hot","ace_csw"};
         author = ECSTRING(common,ACETeam);
         authors[] = {"Brandon (TCVM)"};
         url = ECSTRING(main,URL);
diff --git a/addons/dragon/data/m47_daysight_interaction_attach.paa b/addons/dragon/data/m47_daysight_interaction_attach.paa
new file mode 100644
index 0000000000..0a9e19b461
Binary files /dev/null and b/addons/dragon/data/m47_daysight_interaction_attach.paa differ
diff --git a/addons/dragon/data/m47_daysight_interaction_detach.paa b/addons/dragon/data/m47_daysight_interaction_detach.paa
new file mode 100644
index 0000000000..7a0d5eb22e
Binary files /dev/null and b/addons/dragon/data/m47_daysight_interaction_detach.paa differ
diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf
index e717b32f70..b7adb597f5 100644
--- a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf
+++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf
@@ -30,9 +30,9 @@ if ((_distanceToProjectile > _seekerMaxRangeSqr) || _wireCut || { !alive _shoote
     // wire snap, random direction
     if (!_wireCut) then {
         _attackProfileStateParams set [1, true];
-        playSound3D ["a3\sounds_f\air\sfx\SL_rope_break.wss", objNull, false, AGLtoASL (_shooter modelToWorld _wireCutSource), 150, 1, 25];
+        playSound3D ["a3\sounds_f\air\sfx\SL_rope_break.wss", objNull, false, AGLtoASL (_shooter modelToWorld _wireCutSource), 5, 1, 25];
     };
-    
+
     if (_serviceChargeCount > 0 && {(_lastTime - CBA_missionTime) <= 0}) then {
         _attackProfileStateParams set [5, CBA_missionTime + 0.05 + random 0.1];
         private _randomVector = [(random 2) - 1, random 1, (random 2) - 1];
@@ -41,7 +41,7 @@ if ((_distanceToProjectile > _seekerMaxRangeSqr) || _wireCut || { !alive _shoote
         _charge setPosASL (_projectilePos vectorAdd ((_randomVector vectorMultiply -1) vectorMultiply 0.025));
         _attackProfileStateParams set [7, _serviceChargeCount - 1];
     };
-    
+
     _retPos
 };
 
@@ -50,10 +50,10 @@ if (_distanceToProjectile <= _seekerMinRangeSqr || { _serviceChargeCount <= 0 }
 // if the time between updates is less than the pop time we want to fire the rockets OR if the missile wants to make a major correction pop it rapidly
 if (((_lastTime - CBA_missionTime) <= 0) || {(_lastTime - CBA_missionTime) < (_serviceInterval / 2) && (_projectilePos vectorDistance _seekerTargetPos > 1)}) then {
     _attackProfileStateParams set [5, CBA_missionTime + _serviceInterval];
-        
+
     private _vectorToCrosshair = vectorNormalized (_projectile worldToModel (ASLToAGL _seekerTargetPos));
     private _vectorToPos = vectorNormalized (((_projectile vectorWorldToModelVisual (_shooter weaponDirection _weapon)) vectorMultiply (_dragonSpeed * _serviceInterval)) vectorAdd (_vectorToCrosshair vectorMultiply _maxCorrectableDistance));
-                
+
     if ((_vectorToPos select 2) < 0) then {
         _vectorToPos set [2, 0];
     } else {
@@ -66,10 +66,10 @@ if (((_lastTime - CBA_missionTime) <= 0) || {(_lastTime - CBA_missionTime) < (_s
     };
 
     _projectile setVelocityModelSpace ((velocityModelSpace _projectile) vectorAdd (_vectorToPos vectorMultiply _serviceChargeAcceleration));
-    
+
     private _charge = createVehicle [QGVAR(serviceCharge), [0, 0, 0], [], 0, "NONE"];
     _charge setPosASL (_projectilePos vectorAdd ((_vectorToCrosshair vectorMultiply -1) vectorMultiply 0.025));
-    
+
     _attackProfileStateParams set [7, _serviceChargeCount - 1];
 };
 
diff --git a/addons/dragon/functions/fnc_sightAttach.sqf b/addons/dragon/functions/fnc_sightAttach.sqf
index a97f160d9d..6ad5df2077 100644
--- a/addons/dragon/functions/fnc_sightAttach.sqf
+++ b/addons/dragon/functions/fnc_sightAttach.sqf
@@ -6,6 +6,7 @@
  * Arguments:
  * 0: Target <OBJECT>
  * 1: Unit Performing Action <OBJECT>
+ * 2: Is event (function recursives globaly to set weapon where turret is local) <BOOL> (default: false)
  *
  * Return Value:
  * Can Attach Sighting Unit <BOOL>
@@ -19,7 +20,7 @@
 params ["_target", "_unit", ["_event", false]];
 TRACE_3("sightAttach",_target,_unit,_event);
 
-if (_event isEqualTo true) then {
+if (_event isEqualTo true) then { // this is actually needed as 3rd arg may not be bool
     if (!(_target turretLocal [0])) exitWith {};
     _target setVariable [QGVAR(sightAttached), true, true];
     _target animate ["optic_hide", 0];
diff --git a/addons/dragon/functions/fnc_sightCanAttach.sqf b/addons/dragon/functions/fnc_sightCanAttach.sqf
index ca7d05539d..9ec742d19b 100644
--- a/addons/dragon/functions/fnc_sightCanAttach.sqf
+++ b/addons/dragon/functions/fnc_sightCanAttach.sqf
@@ -15,10 +15,9 @@
  *
  * Public: No
  */
- 
+
 params ["_target", "_unit"];
 
 (alive _target)
-// && {!(_target getVariable [QGVAR(fired), false])}
 && {!(_target getVariable [QGVAR(sightAttached), ((typeOf _target) == QGVAR(staticAssembled))])}
 && {QGVAR(sight) in (weapons _unit)}
diff --git a/addons/dragon/functions/fnc_sightCanDetach.sqf b/addons/dragon/functions/fnc_sightCanDetach.sqf
index 49c7684509..92c4a9a913 100644
--- a/addons/dragon/functions/fnc_sightCanDetach.sqf
+++ b/addons/dragon/functions/fnc_sightCanDetach.sqf
@@ -15,9 +15,8 @@
  *
  * Public: No
  */
- 
+
 params ["_target", "_unit"];
 
 (alive _target)
-// && {!(_target getVariable [QGVAR(fired), false])}
 && {_target getVariable [QGVAR(sightAttached), ((typeOf _target) == QGVAR(staticAssembled))]}
diff --git a/addons/dragon/functions/fnc_sightDetach.sqf b/addons/dragon/functions/fnc_sightDetach.sqf
index 2ee9bcfa46..161a13ba64 100644
--- a/addons/dragon/functions/fnc_sightDetach.sqf
+++ b/addons/dragon/functions/fnc_sightDetach.sqf
@@ -6,6 +6,7 @@
  * Arguments:
  * 0: Target <OBJECT>
  * 1: Unit Performing Action <OBJECT>
+ * 2: Is event (function recursives globaly to set weapon where turret is local) <BOOL> (default: false)
  *
  * Return Value:
  * Can Attach Sighting Unit <BOOL>
@@ -21,7 +22,7 @@ params ["_target", "_unit"];
 params ["_target", "_unit", ["_event", false]];
 TRACE_3("sightDetach",_target,_unit,_event);
 
-if (_event isEqualTo true) then {
+if (_event isEqualTo true) then { // this is actually needed as 3rd arg may not be bool
     if (!(_target turretLocal [0])) exitWith {};
     _target setVariable [QGVAR(sightAttached), false, true];
     _target animate ["optic_hide", 1];
diff --git a/addons/dragon/models/M47.p3d b/addons/dragon/models/M47.p3d
deleted file mode 100644
index 9554efe7f8..0000000000
Binary files a/addons/dragon/models/M47.p3d and /dev/null differ
diff --git a/addons/dragon/models/M47_loaded.p3d b/addons/dragon/models/M47_loaded.p3d
deleted file mode 100644
index 7afe797185..0000000000
Binary files a/addons/dragon/models/M47_loaded.p3d and /dev/null differ
diff --git a/addons/dragon/models/ace_m47_static.p3d b/addons/dragon/models/ace_m47_static.p3d
index 3579797142..b14d66d5c7 100644
Binary files a/addons/dragon/models/ace_m47_static.p3d and b/addons/dragon/models/ace_m47_static.p3d differ
diff --git a/addons/dragon/stringtable.xml b/addons/dragon/stringtable.xml
index e9d3ff2eb6..e4713c0802 100644
--- a/addons/dragon/stringtable.xml
+++ b/addons/dragon/stringtable.xml
@@ -1,15 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project name="ACE">
     <Package name="dragon">
+        <Key ID="STR_ACE_dragon_dragonNameCarry">
+            <English>[CSW] M47 Super-Dragon</English>
+        </Key>
         <Key ID="STR_ACE_dragon_dragonName">
             <English>M47 Super-Dragon</English>
         </Key>
-        <Key ID="STR_ACE_dragon_dragonNoSight">
-            <English>M47 Super-Dragon (No Sight)</English>
-        </Key>
-        <Key ID="STR_ACE_dragon_dragonSight">
-            <English>M47 Super-Dragon (With Sight)</English>
-        </Key>
         <Key ID="STR_ACE_dragon_attachSight">
             <English>Attach Sight</English>
         </Key>
diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml
index 19358ae018..84a55ff177 100644
--- a/addons/realisticnames/stringtable.xml
+++ b/addons/realisticnames/stringtable.xml
@@ -11,7 +11,7 @@
             <Russian>XM312</Russian>
             <Portuguese>XM312</Portuguese>
             <Hungarian>XM312</Hungarian>
-            <Italian>XM312A</Italian>
+            <Italian>XM312</Italian>
             <Japanese>XM312</Japanese>
             <Korean>XM312</Korean>
             <Chinese>XM312重機槍</Chinese>
diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf
index 79b976f322..cb54ca5c1e 100644
--- a/addons/rearm/functions/fnc_addRearmActions.sqf
+++ b/addons/rearm/functions/fnc_addRearmActions.sqf
@@ -5,38 +5,44 @@
  *
  * Arguments:
  * 0: Ammo Truck <OBJECT>
+ * 1: Player <OBJECT>
  *
  * Return Value:
  * ChildActions <ARRAY>
  *
  * Example:
- * [tank] call ace_rearm_fnc_addRearmActions
+ * [tank, player] call ace_rearm_fnc_addRearmActions
  *
  * Public: No
  */
 
-params ["_truck"];
+params ["_truck", "_player"];
 
 private _vehicles = nearestObjects [_truck, ["AllVehicles"], 20];
 _vehicles = _vehicles select {(_x != _truck) && {!(_x isKindOf "CAManBase")} && {!(_x getVariable [QGVAR(disabled), false])}};
 
-if (missionNamespace getVariable [QEGVAR(mk6mortar,useAmmoHandling), false]) then {
-    _vehicles = _vehicles select {!(_x isKindOf "Mortar_01_base_F")};
-};
-
+private _cswCarryMagazines = [];
 private _vehicleActions = [];
 {
     private _vehicle = _x;
-    
+
     // Array of magazines that can be rearmed in the vehicle
     private _needRearmMags = ([_vehicle] call FUNC(getNeedRearmMagazines)) apply {_x select 0};
-    
+
     // _needRearmMags without duplicates
     private _magazineHelper = _needRearmMags arrayIntersect _needRearmMags;
 
     _magazineHelper = _magazineHelper select {[_truck, _x] call FUNC(hasEnoughSupply)};
+
+    if (["ace_csw"] call EFUNC(common,isModLoaded)) then {
+        ([_vehicle] call EFUNC(csw,aceRearmGetCarryMagazines)) params ["_turretMagsCSW", "_allCarryMags"];
+        TRACE_3("csw compat",_vehicle,_turretMagsCSW,_allCarryMags);
+        _cswCarryMagazines append _allCarryMags;
+        _magazineHelper = _magazineHelper - _turretMagsCSW;
+    };
+
     TRACE_2("can add",_x,_magazineHelper);
-    
+
     if (!(_magazineHelper isEqualTo [])) then {
         private _icon = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Icon");
         if !((_icon select [0, 1]) == "\") then {
@@ -80,10 +86,29 @@ private _vehicleActions = [];
                 {},
                 []
             ] call EFUNC(interact_menu,createAction);
-            
+
             _vehicleActions pushBack [_action, _actions, _truck];
         };
     };
 } forEach _vehicles;
 
+if (!(_cswCarryMagazines isEqualTo [])) then {
+    _cswCarryMagazines = _cswCarryMagazines arrayIntersect _cswCarryMagazines;
+    _cswCarryMagazines = _cswCarryMagazines select {[_truck, _x] call FUNC(hasEnoughSupply)};
+    private _baseAction = [QGVAR(cswTake), "CSW", "", {}, {true}] call EFUNC(interact_menu,createAction);
+    private _subActions = _cswCarryMagazines apply {
+        private _action = [
+            _x,
+            _x call FUNC(getMagazineName),
+            getText(configFile >> "CfgMagazines" >> _x >> "picture"),
+            {_this call FUNC(takeAmmo)},
+            {true},
+            {},
+            [_x, _player]
+        ] call EFUNC(interact_menu,createAction);
+        [_action, [], _truck];
+    };
+    _vehicleActions pushBack [_baseAction, _subActions, _truck];
+};
+
 _vehicleActions
diff --git a/addons/rearm/functions/fnc_getMagazineName.sqf b/addons/rearm/functions/fnc_getMagazineName.sqf
index 1871cedbf7..f83d71e470 100644
--- a/addons/rearm/functions/fnc_getMagazineName.sqf
+++ b/addons/rearm/functions/fnc_getMagazineName.sqf
@@ -26,6 +26,8 @@ if (isNil "_magName") then {
         WARNING_1("Magazine is missing display name [%1]",_className);
     };
 
+    if ((_displayName select [0,6]) == "[CSW] ") then { _displayName = _displayName select [6]; };
+
     GVAR(magazineNameCache) setVariable [_className, _displayName];
     GVAR(originalMagazineNames) pushBack _displayName;
     TRACE_2("Adding to cache",_className,_displayName);
diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf
index e2a06075d5..9dbcf463eb 100644
--- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf
+++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf
@@ -33,19 +33,19 @@ private _magazineInfo = [];
 private _pylonConfigs = configProperties [configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"];
 {
     private _pylonConfig = _x;
-    
+
     // Strangely, a 1-based index.
     private _pylonIndex = _forEachIndex + 1;
-    
+
     // Retrieving pylon magazine by index. If the pylon is empty, it is marked with "".
     private _pylonMagazine = (getPylonMagazines _vehicle) select (_pylonIndex - 1);
-    
+
     // Only care about pylons that have a magazine.
     if (!(_pylonMagazine isEqualTo "")) then {
-    
+
         private _maxRounds = getNumber (configFile >> "CfgMagazines" >> _pylonMagazine >> "count");
         private _currentRounds = _vehicle ammoOnPylon _pylonIndex;
-        
+
         if (_currentRounds < _maxRounds) then {
             // getPylonTurret expects 0 based index, and returns driver turret as [-1]
             private _pylonTurret = [_vehicle, (_pylonIndex - 1)] call EFUNC(common,getPylonTurret);
@@ -62,13 +62,13 @@ private _turrets = [_vehicle] call FUNC(getAllRearmTurrets);
 
     // _magazines without duplicates
     private _magazineClasses = _magazines arrayIntersect _magazines;
-    
+
     {
         private _magazineClass = _x;
-        
+
         private _maxMagazines = [_vehicle, _turretPath, _magazineClass] call FUNC(getMaxMagazines);
         private _maxRoundsPerMag = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count");
-        
+
         /* Array of ammo counts in every magazine. Example: [200, 200, 152] means 2 mags with 200
          * rounds and 1 mag with 152 rounds. */
         private _currentRounds = [_vehicle, _turretPath, _magazineClass] call FUNC(getTurretMagazineAmmo);
@@ -77,9 +77,10 @@ private _turrets = [_vehicle] call FUNC(getAllRearmTurrets);
         /* If there is space for new magazines or if some magazines are not full, add the magazine
          * type to _magazineInfo. */
         if ((_currentMagazines < _maxMagazines) || {({_x < _maxRoundsPerMag} count _currentRounds) > 0}) then {
+            if (_magazineClass == "FakeWeapon") exitWith {};
             _magazineInfo pushBack [_magazineClass, _turretPath, false, -1, _maxMagazines, _currentMagazines, _maxRoundsPerMag, _currentRounds];
         };
-        
+
     } forEach _magazineClasses;
 } forEach _turrets;
 
diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf
index 6d48cd338f..8bf8244dd7 100644
--- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf
+++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf
@@ -22,6 +22,14 @@ TRACE_3("rearmEntireVehicleSuccessLocal",_truck,_vehicle,_turretPath);
 
 // Fetching all rearmable magazines in this turret
 private _magazines = ([_vehicle] call FUNC(getNeedRearmMagazines)) select {(_x select 1) isEqualTo _turretPath};
+if (["ace_csw"] call EFUNC(common,isModLoaded)) then {
+    ([_vehicle, _turretPath] call EFUNC(csw,aceRearmGetCarryMagazines)) params ["_turretMagsCSW", "_allCarryMags"];
+    TRACE_1("skipping",_turretMagsCSW);
+    _magazines = _magazines select {
+        _x params ["_magazineClass"];
+        (_turretMagsCSW findIf {_x == _magazineClass}) == -1
+    };
+};
 {
     _x params ["_magazineClass", "_magTurretPath", "_isPylonMag", "_pylonIndex", "_maxMagazines", "_currentMagazines", "_maxRoundsPerMag", "_currentRounds"];
 
diff --git a/addons/rearm/functions/fnc_takeAmmo.sqf b/addons/rearm/functions/fnc_takeAmmo.sqf
index f4a7339edc..1c1e325de8 100644
--- a/addons/rearm/functions/fnc_takeAmmo.sqf
+++ b/addons/rearm/functions/fnc_takeAmmo.sqf
@@ -8,7 +8,7 @@
  * 1: Unit <OBJECT>
  * 2: Params <ARRAY>
  *   0: Magazine Classname <STRING>
- *   1: Vehicle to be armed <OBJECT>
+ *   1: Vehicle to be armed or player <OBJECT>
  *
  * Return Value:
  * None
@@ -27,12 +27,18 @@ TRACE_5("takeAmmo",_truck,_unit,_args,_magazineClass,_vehicle);
 
 REARM_HOLSTER_WEAPON;
 
+private _targetName = if (_vehicle == _unit) then {
+    "CSW"
+} else {
+    getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")
+};
+
 [
     TIME_PROGRESSBAR(REARM_DURATION_TAKE select _idx),
-    [_unit, _magazineClass, _truck],
+    [_unit, _magazineClass, _truck, _vehicle],
     FUNC(takeSuccess),
     "",
-    format [localize LSTRING(TakeAction), _magazineClass call FUNC(getMagazineName), getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")],
+    format [localize LSTRING(TakeAction), _magazineClass call FUNC(getMagazineName), _targetName],
     {true},
     ["isnotinside"]
 ] call EFUNC(common,progressBar);
diff --git a/addons/rearm/functions/fnc_takeSuccess.sqf b/addons/rearm/functions/fnc_takeSuccess.sqf
index 3986b21484..e00d430f99 100644
--- a/addons/rearm/functions/fnc_takeSuccess.sqf
+++ b/addons/rearm/functions/fnc_takeSuccess.sqf
@@ -8,19 +8,20 @@
  *   0: Unit <OBJECT>
  *   1: Magazine Classname <STRING>
  *   2: Ammo Truck <OBJECT>
+ *   3: Target Vehicle or Player <OBJECT>
  *
  * Return Value:
  * None
  *
  * Example:
- * [[player, "500Rnd_127x99_mag_Tracer_Red"]] call ace_rearm_fnc_takeSuccess
+ * [[player, "500Rnd_127x99_mag_Tracer_Red", ammoTruck, targetVehicle]] call ace_rearm_fnc_takeSuccess
  *
  * Public: No
  */
 
 params ["_args"];
-_args params ["_unit", "_magazineClass", "_truck"];
-TRACE_3("takeSuccess",_unit,_magazineClass,_truck);
+_args params ["_unit", "_magazineClass", "_truck", "_vehicle"];
+TRACE_4("takeSuccess",_unit,_magazineClass,_truck,_vehicle);
 
 private _success = true;
 if (GVAR(supply) > 0) then {
@@ -28,6 +29,13 @@ if (GVAR(supply) > 0) then {
 };
 if !(_success) exitWith {WARNING_2("takeSuccess failed to take [%1] from [%2]",_magazineClass,_truck);};
 
+if (_vehicle == _unit) exitWith {
+    ([_magazineClass] call FUNC(getCaliber)) params ["", "_idx"];
+    private _rounds = (REARM_COUNT select _idx);
+    TRACE_4("passing to csw",_unit,_magazineClass,_idx,_rounds);
+    [_unit, _magazineClass, _rounds] call EFUNC(csw,reload_handleReturnAmmo);
+};
+
 [_unit, "forceWalk", "ACE_rearm", true] call EFUNC(common,statusEffect_set);
 [_unit, "blockThrow", "ACE_rearm", true] call EFUNC(common,statusEffect_set);
 private _dummy = [_unit, _magazineClass] call FUNC(createDummy);
diff --git a/docs/wiki/framework/crew-served-weapons-framework.md b/docs/wiki/framework/crew-served-weapons-framework.md
index a83aa02c6f..3f64b09587 100644
--- a/docs/wiki/framework/crew-served-weapons-framework.md
+++ b/docs/wiki/framework/crew-served-weapons-framework.md
@@ -39,6 +39,7 @@ class CfgVehicles {
             disassembleTurret = QGVAR(m3TripodLow); // Which tripod will appear when weapon has been disassembled
             ammoLoadTime = 7; // How long it takes in seconds to load ammo into the weapon           
             ammoUnloadTime = 5; // How long it takes in seconds to unload ammo from the weapon
+            desiredAmmo = 69; // When the weapon is reloaded it will try and reload to this ammo capacity
             disassembleFunc = "myCoolFunction.sqf"; // A callback function for when the CSW gets disassembled. Arguments: [tripod, staticWeapon]
         };
     };
@@ -55,6 +56,7 @@ class CfgMagazines {
         type=256; // Must be 256 to show up in Arsenal
         count = 100; // How much ammo gets added per "Load Ammo" selection
         model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // default ammo box model
+        //ace_isbelt = 1; // Needed if your magazine has belt linking
     };
 };
 ```
@@ -63,22 +65,22 @@ class CfgMagazines {
 
 ```cpp
 class CfgWeapons {
-    class ace_csw_base_carry;
-    class banana_carry_weapon: ace_csw_base_carry {
-        class ace_csw_options {
-            assembleTo = "banana_csw"; // What the weapon will assemble into
-            baseTripod = "banana_tripod"; // The tripod which the weapon can be assembled onto (Default is "ace_csw_m3Tripod")
+    class Launcher_Base_F;
+    class banana_carry_weapon: Launcher_Base_F {
+        class ACE_CSW {
             type = "weapon"; // What type of carry it is. Must always be "weapon" for the carry weapon
+            deployTime = 4; // How long it takes to deploy the weapon onto the tripod
+            pickupTime = 4; // How long it takes to disassemble weapon from the tripod
+            class assembleTo {
+                ace_csw_m3Tripod = "banana_csw_mod1"; // What tripod can this weapon deploy onto, and what vehicle will it spawn when it is deployed
+                banana_tripod = "banana_csw";
+            };
         };
     };
     
     class HMG_Static;
-    class banana_weapon: HMG_Static {
-        class ace_csw_options {
-            deployTime = 10; // Time in seconds it takes to mount the weapon on the tripod
-            pickupTime = 12; // Time in seconds it takes to dismount the weapon from the tripod
-        };
-        magazines[] = { banana_ammo }; // You must have both the dummy and real ammunition
+    class banana_proxy_weapon: HMG_Static {
+        magazineReloadTime = 0.5; // Proxy weapons are spawned onto the CSW when it is assembled. Because ammo loading times use defined values in the magazine, this number needs to be low to ensure low latency
     };
 };
 ```
@@ -87,8 +89,8 @@ class CfgWeapons {
 
 ```cpp
     class ace_csw_groups { // Ammo that can be loaded into this CSW
-        class banana_ammo { // The magazine which will be loaded into the weapon
-            banana_dummy_ammo = 1; // Ammo that is loaded into the weapon as per CfgWeapons >> weapon >> magazines
+        class banana_ammo { // The magazine which the player can place into their inventory
+            banana_dummy_ammo = 1; // Magazine that is loaded into the weapon as per CfgWeapons >> weapon >> magazines
         };
         
         // Optional
@@ -99,6 +101,9 @@ class CfgWeapons {
         /*
           Ammo types already defined by CSW:
             - ace_csw_100Rnd_127x99_mag
+            - ace_csw_100Rnd_127x99_mag_red
+            - ace_csw_100Rnd_127x99_mag_green
+            - ace_csw_100Rnd_127x99_mag_yellow
             - ace_csw_50Rnd_127x108_mag
             - ace_csw_20Rnd_20mm_G_belt
             - ACE_1Rnd_82mm_Mo_HE
@@ -129,14 +134,14 @@ class CfgVehicles {
 
 ```cpp
 class CfgWeapons {
-    class ace_csw_base_carry;
-    class banana_carry_tripod: ace_csw_base_carry {
-        class GVAR(options) {
-                deployTime = 166; // How much time in seconds it takes to deploy the tripod
-                pickupTime = 12; // How much time in seconds it takes to pickup the tripod
-                type = "mount";  // What type of carry it is. Must always be "mount" for the carry tripod
-                deploy = "banana_tripod"; // What will be deployed when "Deploy Tripod" is selected
-            };
+    class Launcher_Base_F;
+    class banana_carry_tripod: Launcher_Base_F {
+        class ACE_CSW {
+            type = "mount"; // What type of carry it is. Must always be "mount" for the tripod
+            deployTime = 4; // How long it takes to deploy the tripod
+            pickupTime = 4; // How long it takes to pickup the tripod
+            deploy = "banana_tripod"; // what vehicle will spawn when the tripod is deployed
+        };
     };
 };
-```
\ No newline at end of file
+```
diff --git a/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp b/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp
new file mode 100644
index 0000000000..4eb8f84779
--- /dev/null
+++ b/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp
@@ -0,0 +1,18 @@
+#define CREATE_MAGAZINE_GROUP(ammo) class GVAR(ammo) { rhs_##ammo = 1; }
+class ace_csw_groups {
+    CREATE_MAGAZINE_GROUP(mag_9M131M);
+    CREATE_MAGAZINE_GROUP(mag_9M131F);
+    CREATE_MAGAZINE_GROUP(mag_9m133);
+    CREATE_MAGAZINE_GROUP(mag_9m133f);
+    CREATE_MAGAZINE_GROUP(mag_9m1331);
+    CREATE_MAGAZINE_GROUP(mag_9m133m2);
+    CREATE_MAGAZINE_GROUP(mag_PG9V);
+    CREATE_MAGAZINE_GROUP(mag_PG9N);
+    CREATE_MAGAZINE_GROUP(mag_PG9VNT);
+    CREATE_MAGAZINE_GROUP(mag_OG9VM);
+    CREATE_MAGAZINE_GROUP(mag_OG9V);
+    CREATE_MAGAZINE_GROUP(mag_VOG30_30);
+    CREATE_MAGAZINE_GROUP(mag_GPD30_30);
+    CREATE_MAGAZINE_GROUP(mag_VOG17m_30);
+};
+
diff --git a/optionals/compat_rhs_afrf3/CfgMagazines.hpp b/optionals/compat_rhs_afrf3/CfgMagazines.hpp
index 1ce1a43b04..81a942f526 100644
--- a/optionals/compat_rhs_afrf3/CfgMagazines.hpp
+++ b/optionals/compat_rhs_afrf3/CfgMagazines.hpp
@@ -14,4 +14,136 @@ class cfgMagazines {
     class rhs_mag_127x108mm_1470 : rhs_mag_127x108mm_50 {
         ace_isbelt = 0;
     };
+    class RHS_mag_VOG30_30: VehicleMagazine {
+        ace_isbelt = 1;
+    };
+    class RHS_mag_GPD30_30: RHS_mag_VOG30_30 {};
+
+    // RHS magazines for crew handled ammo
+    class rhs_mag_9M131M;
+    class GVAR(mag_9M131M): rhs_mag_9M131M {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 55;
+        model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d";
+        picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa";
+    };
+    class rhs_mag_9M131F;
+    class GVAR(mag_9M131F): rhs_mag_9M131F {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 55;
+        model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d";
+        picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa";
+    };
+    class rhs_mag_9m133;
+    class GVAR(mag_9m133): rhs_mag_9m133 {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 55;
+        model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d";
+        picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa";
+    };
+    class rhs_mag_9m133f;
+    class GVAR(mag_9m133f): rhs_mag_9m133f {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 55;
+        model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d";
+        picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa";
+    };
+    class rhs_mag_9m1331;
+    class GVAR(mag_9m1331): rhs_mag_9m1331 {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 55;
+        model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d";
+        picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa";
+    };
+    class rhs_mag_9m133m2;
+    class GVAR(mag_9m133m2): rhs_mag_9m133m2 {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 55;
+        model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d";
+        picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa";
+    };
+    class rhs_mag_PG9V;
+    class GVAR(mag_PG9V): rhs_mag_PG9V {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 80;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa";
+    };
+    class rhs_mag_PG9N;
+    class GVAR(mag_PG9N): rhs_mag_PG9N {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 80;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa";
+    };
+    class rhs_mag_PG9VNT;
+    class GVAR(mag_PG9VNT): rhs_mag_PG9VNT {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 80;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa";
+    };
+    class rhs_mag_OG9VM;
+    class GVAR(mag_OG9VM): rhs_mag_OG9VM {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 80;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa";
+    };
+    class rhs_mag_OG9V;
+    class GVAR(mag_OG9V): rhs_mag_OG9V {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 80;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa";
+    };
+
+    class GVAR(mag_VOG30_30): RHS_mag_VOG30_30 {
+        scope = 2;
+        type = 256;
+        count = 30;
+        mass = 40;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa);
+    };
+    class GVAR(mag_GPD30_30): RHS_mag_GPD30_30 {
+        scope = 2;
+        type = 256;
+        count = 30;
+        mass = 40;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa);
+    };
+    class RHS_mag_VOG17m_30;
+    class GVAR(mag_VOG17m_30): RHS_mag_VOG17m_30 {
+        scope = 2;
+        type = 256;
+        count = 30;
+        mass = 40;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa);
+    };
+
 };
diff --git a/optionals/compat_rhs_afrf3/CfgVehicles.hpp b/optionals/compat_rhs_afrf3/CfgVehicles.hpp
index 068f22280c..b614807536 100644
--- a/optionals/compat_rhs_afrf3/CfgVehicles.hpp
+++ b/optionals/compat_rhs_afrf3/CfgVehicles.hpp
@@ -233,6 +233,17 @@ class CfgVehicles {
                 position = "";
             };
         };
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_SPG9);
+            magazineLocation = "_target selectionPosition 'breach'";
+            disassembleWeapon = QGVAR(spg9_carry);
+            disassembleTurret = QEGVAR(csw,spg9Tripod);
+            desiredAmmo = 1;
+            ammoLoadTime = 5;
+            ammoUnloadTime = 3;
+        };
     };
     class rhs_Kornet_Base: AT_01_base_F {
         class ACE_Actions: ACE_Actions {
@@ -241,10 +252,109 @@ class CfgVehicles {
                 selection = "tripod";
             };
         };
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_9K133_launcher);
+            magazineLocation = "_target selectionPosition 'gun'";
+            disassembleWeapon = QGVAR(kornet_carry);
+            disassembleTurret = "";
+            desiredAmmo = 1;
+            ammoLoadTime = 7;
+            ammoUnloadTime = 5;
+        };
     };
 
     class rhs_assault_umbts;
     class rhs_assault_umbts_engineer: rhs_assault_umbts {
         EGVAR(logistics_wirecutter,hasWirecutter) = 1;
     };
+
+    class StaticMortar: StaticWeapon {};
+    class rhs_2b14_82mm_Base: StaticMortar {
+        class ACE_Actions: ACE_Actions {
+            class ACE_MainActions: ACE_MainActions {
+                position = "";
+                selection = ""; // no good selections for this mortar
+            };
+        };
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            magazineLocation = "";
+            proxyWeapon = QGVAR(rhs_weap_2b14);
+            disassembleWeapon = QGVAR(2b14_carry); // carry weapon [CfgWeapons]
+            disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles]
+            desiredAmmo = 1;
+            ammoLoadTime = 3;
+            ammoUnloadTime = 3;
+        };
+    };
+
+    class rhs_nsv_tripod_base: StaticMGWeapon {
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_nsvt_effects);
+            magazineLocation = "_target selectionPosition 'magazine'";
+            disassembleWeapon = QGVAR(nsv_carry);
+            disassembleTurret = QEGVAR(csw,kordTripodLow);
+            desiredAmmo = 50;
+            ammoLoadTime = 10;
+            ammoUnloadTime = 8;
+        };
+    };
+
+    class RHS_KORD_Base: rhs_nsv_tripod_base {
+        class ACE_CSW: ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_KORD);
+            disassembleWeapon = QGVAR(kord_carry);
+            disassembleTurret = QEGVAR(csw,kordTripodLow);
+        };
+    };
+
+    class RHS_KORD_high_base: RHS_KORD_Base {
+        class ACE_CSW: ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_KORD);
+            disassembleWeapon = QGVAR(kord_carry);
+            disassembleTurret = QEGVAR(csw,kordTripod);
+        };
+    };
+
+    class StaticGrenadeLauncher: StaticWeapon {};
+    class RHS_AGS30_TriPod_base: StaticGrenadeLauncher {
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_AGS30);
+            magazineLocation = "_target selectionPosition 'magazine'";
+            disassembleWeapon = QGVAR(ags30_carry);
+            disassembleTurret = QEGVAR(csw,sag30Tripod);
+            desiredAmmo = 30;
+            ammoLoadTime = 10;
+            ammoUnloadTime = 8;
+        };
+    };
+
+    class rhs_SPG9M_base: rhs_SPG9_base {
+        class ACE_CSW: ACE_CSW {
+            enabled = 1;
+            disassembleWeapon = QGVAR(spg9m_carry);
+        };
+    };
+
+    class rhs_Metis_Base: AT_01_base_F {
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_9K115_2_launcher);
+            magazineLocation = "_target selectionPosition 'gun'";
+            disassembleWeapon = QGVAR(metis_carry);
+            disassembleTurret = "";
+            desiredAmmo = 1;
+            ammoLoadTime = 7;
+            ammoUnloadTime = 5;
+        };
+    };
 };
diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp
index f09d1cc787..b654aa0f66 100644
--- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp
+++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp
@@ -1,13 +1,12 @@
-
 class CfgWeapons {
-    
+
     class NVGoggles;
     class rhs_1PN138: NVGoggles { // Monocular
         modelOptics = "";
         EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa);
         EGVAR(nightvision,bluRadius) = 0.13;
     };
-    
+
     class hgun_Rook40_F;
     class rhs_weap_pya: hgun_Rook40_F {
         ACE_barrelTwist = 254.0;
@@ -110,7 +109,10 @@ class CfgWeapons {
             };
         };
     };
-    class Launcher_Base_F;
+    class Launcher;
+    class Launcher_Base_F: Launcher {
+        class WeaponSlotsInfo;
+    };
     class rhs_weap_rpg7: Launcher_Base_F {
         ace_reloadlaunchers_enabled = 1;
     };
@@ -141,4 +143,157 @@ class CfgWeapons {
         ace_overpressure_range = 15;
         ace_overpressure_damage = 0.5;
     };
+
+    CREATE_CSW_PROXY(rhs_weap_2b14);
+    CREATE_CSW_PROXY(rhs_weap_nsvt_effects);
+    CREATE_CSW_PROXY(rhs_weap_KORD);
+    CREATE_CSW_PROXY(RHS_weap_AGS30);
+    CREATE_CSW_PROXY(rhs_weap_SPG9);
+    CREATE_CSW_PROXY(rhs_weap_9K133_launcher);
+    CREATE_CSW_PROXY(rhs_weap_9K115_2_launcher);
+
+    class GVAR(2b14_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 20;
+            pickupTime = 25;
+            class assembleTo {
+                EGVAR(csw,mortarBaseplate) = "rhs_2b14_82mm_msv";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 670; // 2B14 Mortar Weight
+        };
+        displayName = ECSTRING(CSW,2b14_tube);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\podnos_2b14_ca.paa";
+    };
+
+    class GVAR(nsv_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,kordTripodLow) = "RHS_NSV_TriPod_MSV";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 550;
+        };
+        displayName = ECSTRING(CSW,nsv_gun);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\mg\bis_kord\kord_CA.paa";
+    };
+
+    class GVAR(kord_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,kordTripod) = "rhs_KORD_high_MSV";
+                EGVAR(csw,kordTripodLow) = "rhs_KORD_MSV";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 550;
+        };
+        displayName = ECSTRING(CSW,kord_gun);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\kord6u16sp_ca.paa";
+    };
+
+    class GVAR(ags30_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,sag30Tripod) = "RHS_AGS30_TriPod_MSV";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 400; // https://odin.tradoc.army.mil/mediawiki/index.php/AGS-17_Russian_30mm_Automatic_Grenade_Launcher
+        };
+        displayName = ECSTRING(CSW,ags30_gun);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\ags_static_CA.paa";
+    };
+
+    class GVAR(spg9_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,spg9Tripod) = "rhsgref_ins_SPG9";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 1000;
+        };
+        displayName = ECSTRING(csw,spg9_tube);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\spg9_CA.paa";
+    };
+    class GVAR(spg9m_carry): GVAR(spg9_carry) {
+        class ACE_CSW {
+            class assembleTo {
+                EGVAR(csw,spg9Tripod) = "rhs_SPG9M_MSV";
+            };
+        };
+        displayName = ECSTRING(csw,spg9m_tube);
+    };
+
+    class GVAR(metis_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "mount";
+            deployTime = 4;
+            pickupTime = 4;
+            deploy = "rhs_Metis_9k115_2_msv";
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 300;
+        };
+        displayName = ECSTRING(csw,metis_tube);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\metis_at13_CA.paa";
+    };
+
+    class GVAR(kornet_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "mount";
+            deployTime = 4;
+            pickupTime = 4;
+            deploy = "rhs_Kornet_9M133_2_msv";
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 600;
+        };
+        displayName = ECSTRING(csw,kornet_launcher);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\metis_at13_CA.paa";
+    };
 };
diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp
index b7cfe3f233..1e253eb125 100644
--- a/optionals/compat_rhs_afrf3/config.cpp
+++ b/optionals/compat_rhs_afrf3/config.cpp
@@ -1,4 +1,5 @@
 #include "script_component.hpp"
+#include "\z\ace\addons\csw\script_config_macros_csw.hpp"
 
 class CfgPatches {
     class ADDON {
@@ -6,7 +7,7 @@ class CfgPatches {
         units[] = {};
         weapons[] = {};
         requiredVersion = REQUIRED_VERSION;
-        requiredAddons[] = {"ace_rearm", "ace_refuel", "ace_repair", "rhs_c_weapons", "rhs_c_troops", "rhs_c_bmd", "rhs_c_bmp", "rhs_c_bmp3", "rhs_c_a2port_armor", "rhs_c_btr", "rhs_c_sprut", "rhs_c_t72", "rhs_c_tanks", "rhs_c_a2port_air", "rhs_c_a2port_car", "rhs_c_cars", "rhs_c_trucks", "rhs_c_2s3", "rhs_c_rva", "rhs_c_heavyweapons"};
+        requiredAddons[] = {"ace_csw", "ace_rearm", "ace_refuel", "ace_repair", "rhs_c_weapons", "rhs_c_troops", "rhs_c_bmd", "rhs_c_bmp", "rhs_c_bmp3", "rhs_c_a2port_armor", "rhs_c_btr", "rhs_c_sprut", "rhs_c_t72", "rhs_c_tanks", "rhs_c_a2port_air", "rhs_c_a2port_car", "rhs_c_cars", "rhs_c_trucks", "rhs_c_2s3", "rhs_c_rva", "rhs_c_heavyweapons"};
         author = ECSTRING(common,ACETeam);
         authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"};
         url = ECSTRING(main,URL);
@@ -19,3 +20,5 @@ class CfgPatches {
 #include "CfgMagazines.hpp"
 #include "CfgWeapons.hpp"
 #include "CfgVehicles.hpp"
+#include "CfgMagazineGroups.hpp"
+
diff --git a/optionals/compat_rhs_gref3/CfgVehicles.hpp b/optionals/compat_rhs_gref3/CfgVehicles.hpp
index 3ac81df2fe..94beb20e53 100644
--- a/optionals/compat_rhs_gref3/CfgVehicles.hpp
+++ b/optionals/compat_rhs_gref3/CfgVehicles.hpp
@@ -4,4 +4,25 @@ class CfgVehicles {
         // Canoes are propelled by paddlers
         EGVAR(refuel,canReceive) = 0;
     };
+
+    class StaticMGWeapon;
+    class rhs_DSHKM_base: StaticMGWeapon {
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_DSHKM);
+            magazineLocation = "_target selectionPosition 'otocvez'";
+            disassembleWeapon = QGVAR(dshkm_carry);
+            disassembleTurret = QEGVAR(csw,kordTripod);
+            desiredAmmo = 50;
+            ammoLoadTime = 10;
+            ammoUnloadTime = 8;
+        };
+    };
+    class rhs_DSHkM_Mini_TriPod_base: rhs_DSHKM_base {
+        class ACE_CSW: ACE_CSW {
+            enabled = 1;
+            disassembleTurret = QEGVAR(csw,kordTripodLow);
+        };
+    };
 };
diff --git a/optionals/compat_rhs_gref3/CfgWeapons.hpp b/optionals/compat_rhs_gref3/CfgWeapons.hpp
index d851d598e0..18681cae13 100644
--- a/optionals/compat_rhs_gref3/CfgWeapons.hpp
+++ b/optionals/compat_rhs_gref3/CfgWeapons.hpp
@@ -1,4 +1,3 @@
-
 class CfgWeapons {
     class rhs_weap_kar98k_Base_F;
     class rhs_weap_kar98k: rhs_weap_kar98k_Base_F {
@@ -81,4 +80,31 @@ class CfgWeapons {
     class rhs_weap_mg42_base: Rifle_Base_F {
         ACE_Overheating_allowSwapBarrel = 1;
     };
+
+    CREATE_CSW_PROXY(rhs_weap_DSHKM);
+
+    class Launcher;
+    class Launcher_Base_F: Launcher {
+        class WeaponSlotsInfo;
+    };
+    class GVAR(dshkm_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,kordTripod) = "rhsgref_ins_DSHKM";
+                EGVAR(csw,kordTripodLow) = "rhsgref_ins_DSHKM_Mini_TriPod";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 740;
+        };
+        displayName = ECSTRING(csw,dshk_gun);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsafrf\addons\rhs_heavyweapons\data\mapico\icomap_DShKM_CA.paa";
+    };
 };
diff --git a/optionals/compat_rhs_gref3/config.cpp b/optionals/compat_rhs_gref3/config.cpp
index a8f8e14773..b5aae10911 100644
--- a/optionals/compat_rhs_gref3/config.cpp
+++ b/optionals/compat_rhs_gref3/config.cpp
@@ -1,4 +1,5 @@
 #include "script_component.hpp"
+#include "\z\ace\addons\csw\script_config_macros_csw.hpp"
 
 class CfgPatches {
     class ADDON {
@@ -6,7 +7,7 @@ class CfgPatches {
         units[] = {};
         weapons[] = {};
         requiredVersion = REQUIRED_VERSION;
-        requiredAddons[] = {"rhsgref_main", "rhsgref_c_weapons"};
+        requiredAddons[] = {"ace_csw", "rhsgref_main", "rhsgref_c_weapons"};
         author = ECSTRING(common,ACETeam);
         authors[] = {"PabstMirror", "Ruthberg", "Anton"};
         url = ECSTRING(main,URL);
diff --git a/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp b/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp
new file mode 100644
index 0000000000..44d29c1f8a
--- /dev/null
+++ b/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp
@@ -0,0 +1,24 @@
+#define CREATE_MAGAZINE_GROUP(ammo) class GVAR(ammo) { rhs_##ammo = 1; }
+class ace_csw_groups {
+    CREATE_MAGAZINE_GROUP(mag_TOW);
+    CREATE_MAGAZINE_GROUP(mag_TOWB);
+    CREATE_MAGAZINE_GROUP(mag_ITOW);
+    CREATE_MAGAZINE_GROUP(mag_TOW2);
+    CREATE_MAGAZINE_GROUP(mag_TOW2A);
+    CREATE_MAGAZINE_GROUP(mag_TOW2b);
+    CREATE_MAGAZINE_GROUP(mag_TOW2b_aero);
+    CREATE_MAGAZINE_GROUP(mag_TOW2bb);
+    class GVAR(48Rnd_40mm_MK19) {
+        RHS_48Rnd_40mm_MK19 = 1;
+        RHS_96Rnd_40mm_MK19 = 1;
+    };
+    class GVAR(48Rnd_40mm_MK19_M430I) {
+        RHS_48Rnd_40mm_MK19_M430I = 1;
+        RHS_96Rnd_40mm_MK19_M430I = 1;
+    };
+    class GVAR(48Rnd_40mm_MK19_M1001) {
+        RHS_48Rnd_40mm_MK19_M1001 = 1;
+        RHS_96Rnd_40mm_MK19_M1001 = 1;
+    };
+};
+
diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp
index 454c09a98c..f4cbaaf759 100644
--- a/optionals/compat_rhs_usf3/CfgMagazines.hpp
+++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp
@@ -51,4 +51,105 @@ class cfgMagazines {
         ammo = "ACE_Hellfire_AGM114N";
     };
 
+    // RHS magazines for crew handled ammo
+    class rhs_mag_TOW;
+    class GVAR(mag_TOW): rhs_mag_TOW {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200; // Actually should be 440 but ARMA uses weight and volume in the same number
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+    class rhs_mag_TOWB;
+    class GVAR(mag_TOWB): rhs_mag_TOWB {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+    class rhs_mag_ITOW;
+    class GVAR(mag_ITOW): rhs_mag_ITOW {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+    class rhs_mag_TOW2;
+    class GVAR(mag_TOW2): rhs_mag_TOW2 {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+    class rhs_mag_TOW2A;
+    class GVAR(mag_TOW2A): rhs_mag_TOW2A {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+    class rhs_mag_TOW2b;
+    class GVAR(mag_TOW2b): rhs_mag_TOW2b {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+    class rhs_mag_TOW2b_aero;
+    class GVAR(mag_TOW2b_aero): rhs_mag_TOW2b_aero {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+    class rhs_mag_TOW2bb;
+    class GVAR(mag_TOW2bb): rhs_mag_TOW2bb {
+        scope = 2;
+        type = 256;
+        count = 1;
+        mass = 200;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
+        picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa";
+    };
+
+    class GVAR(48Rnd_40mm_MK19): RHS_48Rnd_40mm_MK19 {
+        scope = 2;
+        type = 256;
+        count = 48;
+        mass = 40;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is
+        picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa);
+    };
+    class RHS_48Rnd_40mm_MK19_M430I;
+    class GVAR(48Rnd_40mm_MK19_M430I): RHS_48Rnd_40mm_MK19_M430I {
+        scope = 2;
+        type = 256;
+        count = 48;
+        mass = 40;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is
+        picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa);
+    };
+    class RHS_48Rnd_40mm_MK19_M1001;
+    class GVAR(48Rnd_40mm_MK19_M1001): RHS_48Rnd_40mm_MK19_M1001 {
+        scope = 2;
+        type = 256;
+        count = 48;
+        mass = 40;
+        model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // ammo can instead of any special model so no one gets especially confused over what it is
+        picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa);
+    };
+
 };
diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp
index 02c4fff408..503dc9c79b 100644
--- a/optionals/compat_rhs_usf3/CfgVehicles.hpp
+++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp
@@ -300,6 +300,70 @@ class CfgVehicles {
                 selection = "main_gun";
             };
         };
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            magazineLocation = "";
+            proxyWeapon = QGVAR(rhs_mortar_81mm);
+            disassembleWeapon = QGVAR(m252_carry); // carry weapon [CfgWeapons]
+            disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles]
+            desiredAmmo = 1;
+            ammoLoadTime = 3;
+            ammoUnloadTime = 3;
+        };
+    };
+
+    class StaticMGWeapon: StaticWeapon {};
+
+    class rhs_m2staticmg_base: StaticMGWeapon {
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_M2);
+            magazineLocation = "_target selectionPosition 'magazine'";
+            disassembleWeapon = QGVAR(m2_carry);
+            disassembleTurret = QEGVAR(csw,m3Tripod);
+            desiredAmmo = 100;
+            ammoLoadTime = 10;
+            ammoUnloadTime = 8;
+        };
+    };
+
+    class RHS_M2StaticMG_MiniTripod_base: rhs_m2staticmg_base {
+        class ACE_CSW: ACE_CSW {
+            enabled = 1;
+            disassembleTurret = QEGVAR(csw,m3TripodLow);
+        };
+    };
+
+    class StaticGrenadeLauncher: StaticWeapon {};
+    class RHS_MK19_TriPod_base: StaticGrenadeLauncher {
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_MK19);
+            magazineLocation = "_target selectionPosition 'magazine'";
+            disassembleWeapon = QGVAR(mk19_carry);
+            disassembleTurret = QEGVAR(csw,m3TripodLow);
+            desiredAmmo = 48;
+            ammoLoadTime = 10;
+            ammoUnloadTime = 8;
+        };
+    };
+
+    class StaticATWeapon: StaticWeapon {};
+    class RHS_TOW_TriPod_base: StaticATWeapon {
+        // ENABLE_CSW_ATTRIBUTE;
+        class ACE_CSW {
+            enabled = 1;
+            proxyWeapon = QGVAR(rhs_weap_TOW_Launcher_static);
+            magazineLocation = "_target selectionPosition 'tube'";
+            disassembleWeapon = QGVAR(tow_carry);
+            disassembleTurret = QEGVAR(csw,m220Tripod);
+            desiredAmmo = 1;
+            ammoLoadTime = 8;
+            ammoUnloadTime = 5;
+        };
     };
 
     class rhsusf_infantry_usmc_base;
diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp
index f108c93fda..5c48a166f7 100644
--- a/optionals/compat_rhs_usf3/CfgWeapons.hpp
+++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp
@@ -1,4 +1,3 @@
-
 class CfgWeapons {
     class NVGoggles;
     class rhsusf_ANPVS_14: NVGoggles { // Monocular
@@ -231,7 +230,10 @@ class CfgWeapons {
         };
     };
 
-    class Launcher_Base_F;
+    class Launcher;
+    class Launcher_Base_F: Launcher {
+        class WeaponSlotsInfo;
+    };
     class rhs_weap_smaw: Launcher_Base_F {
         ace_reloadlaunchers_enabled = 1;
         ace_overpressure_angle = 45;
@@ -420,4 +422,91 @@ class CfgWeapons {
     class RHS_jetpilot_usaf: H_HelmetB {
         HEARING_PROTECTION_VICCREW
     };
+
+    CREATE_CSW_PROXY(rhs_mortar_81mm);
+    CREATE_CSW_PROXY(RHS_M2);
+    CREATE_CSW_PROXY(RHS_MK19);
+    CREATE_CSW_PROXY(Rhs_weap_TOW_Launcher_static);
+
+    class GVAR(m252_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 20;
+            pickupTime = 25;
+            class assembleTo {
+                EGVAR(csw,mortarBaseplate) = "RHS_M252_WD";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 620; // M252 Mortar Weight
+        };
+        displayName = ECSTRING(CSW,m252_tube);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\mortar_m251_CA.paa";
+    };
+
+    class GVAR(m2_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,m3Tripod) = "RHS_M2StaticMG_WD";
+                EGVAR(csw,m3TripodLow) = "RHS_M2StaticMG_MiniTripod_WD";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 840;
+        };
+        displayName = ECSTRING(CSW,m2_gun);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsusf\addons\rhsusf_editorPreviews\data\rhs_M2StaticMG_D.paa";
+    };
+
+    class GVAR(mk19_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,m3TripodLow) = "RHS_MK19_TriPod_WD";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 770;
+        };
+        displayName = ECSTRING(CSW,mk19_gun);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\mk19_stat_CA.paa";
+    };
+
+    class GVAR(tow_carry): Launcher_Base_F {
+        class ACE_CSW {
+            type = "weapon";
+            deployTime = 4;
+            pickupTime = 4;
+            class assembleTo {
+                EGVAR(csw,m220Tripod) = "RHS_TOW_TriPod_WD";
+            };
+        };
+        class WeaponSlotsInfo: WeaponSlotsInfo {
+            mass = 500;
+        };
+        displayName = ECSTRING(CSW,tow_tube);
+        author = ECSTRING(common,ACETeam);
+        scope = 2;
+        model = QPATHTOEF(apl,ACE_CSW_Bag.p3d);
+        modes[] = {};
+        picture = "\rhsusf\addons\rhsusf_heavyweapons\data\Ico\tow_static_CA.paa";
+    };
 };
+
diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp
index 59aaa625bd..26441eff35 100644
--- a/optionals/compat_rhs_usf3/config.cpp
+++ b/optionals/compat_rhs_usf3/config.cpp
@@ -1,4 +1,5 @@
 #include "script_component.hpp"
+#include "\z\ace\addons\csw\script_config_macros_csw.hpp"
 
 class CfgPatches {
     class ADDON {
@@ -6,7 +7,7 @@ class CfgPatches {
         units[] = {};
         weapons[] = {};
         requiredVersion = REQUIRED_VERSION;
-        requiredAddons[] = {"ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor", "rhsusf_c_melb"};
+        requiredAddons[] = {"ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "ace_csw", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor", "rhsusf_c_melb"};
         author = ECSTRING(common,ACETeam);
         authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut"};
         url = ECSTRING(main,URL);
@@ -21,3 +22,5 @@ class CfgPatches {
 #include "CfgWeapons.hpp"
 #include "CfgVehicles.hpp"
 #include "CfgGlasses.hpp"
+#include "CfgMagazineGroups.hpp"
+