diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index 6a454f46fa907d3b5304d12e41e8e9d87b7cdc3f..df48a37f024d76e6a74011a2375a828e30ff858e 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -772,16 +772,28 @@ void D_RegisterClientCommands(void)
 	// g_input.c
 	CV_RegisterVar(&cv_sideaxis);
 	CV_RegisterVar(&cv_sideaxis2);
+	CV_RegisterVar(&cv_sideaxis3);
+	CV_RegisterVar(&cv_sideaxis4);
 	CV_RegisterVar(&cv_turnaxis);
 	CV_RegisterVar(&cv_turnaxis2);
+	CV_RegisterVar(&cv_turnaxis3);
+	CV_RegisterVar(&cv_turnaxis4);
 	CV_RegisterVar(&cv_moveaxis);
 	CV_RegisterVar(&cv_moveaxis2);
+	CV_RegisterVar(&cv_moveaxis3);
+	CV_RegisterVar(&cv_moveaxis4);
 	CV_RegisterVar(&cv_lookaxis);
 	CV_RegisterVar(&cv_lookaxis2);
+	CV_RegisterVar(&cv_lookaxis3);
+	CV_RegisterVar(&cv_lookaxis4);
 	CV_RegisterVar(&cv_fireaxis);
 	CV_RegisterVar(&cv_fireaxis2);
+	CV_RegisterVar(&cv_fireaxis3);
+	CV_RegisterVar(&cv_fireaxis4);
 	CV_RegisterVar(&cv_firenaxis);
 	CV_RegisterVar(&cv_firenaxis2);
+	CV_RegisterVar(&cv_firenaxis3);
+	CV_RegisterVar(&cv_firenaxis4);
 
 	// WARNING: the order is important when initialising mouse2
 	// we need the mouse2port
@@ -818,8 +830,12 @@ void D_RegisterClientCommands(void)
 	// Analog Control
 	CV_RegisterVar(&cv_analog);
 	CV_RegisterVar(&cv_analog2);
+	CV_RegisterVar(&cv_analog3);
+	CV_RegisterVar(&cv_analog4);
 	CV_RegisterVar(&cv_useranalog);
 	CV_RegisterVar(&cv_useranalog2);
+	CV_RegisterVar(&cv_useranalog3);
+	CV_RegisterVar(&cv_useranalog4);
 
 	// s_sound.c
 	CV_RegisterVar(&cv_soundvolume);
diff --git a/src/g_game.c b/src/g_game.c
index 65f801095a122b1ed014bb05ba49532cf4afd28c..d700f7804a7430b04e0ae2915bfc4d46719dbee4 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1200,8 +1200,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 	{
 		player = &players[fourthdisplayplayer];
 		thiscam = &camera4;
-		lang = localangle3;
-		laim = localaiming3;
+		lang = localangle4;
+		laim = localaiming4;
 		th = turnheld4;
 		kbl = keyboard_look4;
 		G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1);
diff --git a/src/p_user.c b/src/p_user.c
index 67a893604468593cae0ec9b138de0ceebd7bde9e..a3253482ef19af4c592930181abcb5b3c570e78d 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -8354,7 +8354,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
 		camdist = FixedMul(cv_cam_dist.value, mo->scale);
 		camheight = FixedMul(cv_cam_height.value, mo->scale);
 	}
-	else // Camera 2
+	else if (thiscam == &camera2) // Camera 2
 	{
 		camspeed = cv_cam2_speed.value;
 		camstill = cv_cam2_still.value;
@@ -8362,6 +8362,22 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
 		camdist = FixedMul(cv_cam2_dist.value, mo->scale);
 		camheight = FixedMul(cv_cam2_height.value, mo->scale);
 	}
+	else if (thiscam == &camera3) // Camera 3
+	{
+		camspeed = cv_cam3_speed.value;
+		camstill = cv_cam3_still.value;
+		camrotate = cv_cam3_rotate.value;
+		camdist = FixedMul(cv_cam3_dist.value, mo->scale);
+		camheight = FixedMul(cv_cam3_height.value, mo->scale);
+	}
+	else // Camera 4
+	{
+		camspeed = cv_cam4_speed.value;
+		camstill = cv_cam4_still.value;
+		camrotate = cv_cam4_rotate.value;
+		camdist = FixedMul(cv_cam4_dist.value, mo->scale);
+		camheight = FixedMul(cv_cam4_height.value, mo->scale);
+	}
 
 #ifdef REDSANALOG
 	if (P_AnalogMove(player) && (player->cmd.buttons & (BT_FORWARD|BT_BACKWARD)) == (BT_FORWARD|BT_BACKWARD)) {
@@ -8430,10 +8446,18 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
 			{
 				CV_SetValue(&cv_cam_rotate, camrotate + 180);
 			}
-			else
+			else if (thiscam == &camera2)
 			{
 				CV_SetValue(&cv_cam2_rotate, camrotate + 180);
 			}
+			else if (thiscam == &camera3)
+			{
+				CV_SetValue(&cv_cam3_rotate, camrotate + 180);
+			}
+			else
+			{
+				CV_SetValue(&cv_cam3_rotate, camrotate + 180);
+			}
 			player->kartstuff[k_camspin] = 2;
 		}
 		if (player->kartstuff[k_camspin] == -1)
diff --git a/src/r_main.c b/src/r_main.c
index 1c9e87447119eb26b11412aca309313ceab4a12d..b65bc7c714a882e86027cfd92d6149e40a1a3d4d 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -1482,6 +1482,8 @@ void R_RegisterEngineStuff(void)
 	CV_RegisterVar(&cv_homremoval);
 	CV_RegisterVar(&cv_flipcam);
 	CV_RegisterVar(&cv_flipcam2);
+	CV_RegisterVar(&cv_flipcam3);
+	CV_RegisterVar(&cv_flipcam4);
 
 	// Enough for dedicated server
 	if (dedicated)