diff --git a/appveyor.yml b/appveyor.yml
index 25b95d292791f5dc11e67431133b3fbc8fcb6c0d..b0544a90b549ab0e526e2f0902a8b4093837478f 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -47,7 +47,7 @@ before_build:
 - upx -V
 - ccache -V
 - ccache -s
-- set SRB2_MFLAGS=-C src MINGW=1 WARNINGMODE=1 GCC53=1 CCACHE=1
+- set SRB2_MFLAGS=-C src MINGW=1 WARNINGMODE=1 GCC63=1 CCACHE=1
 
 build_script:
 - cmd: mingw32-make.exe %SRB2_MFLAGS% %CONFIGURATION%=1 clean
diff --git a/src/Makefile.cfg b/src/Makefile.cfg
index 72404becca345b380fb9a60795f3a05734337db3..80d018c4b5993ad01e1ddbfd34cff1f2564a3398 100644
--- a/src/Makefile.cfg
+++ b/src/Makefile.cfg
@@ -7,6 +7,23 @@
 # and other things
 #
 
+
+ifdef GCC63
+GCC62=1
+endif
+
+ifdef GCC62
+GCC61=1
+endif
+
+ifdef GCC61
+GCC54=1
+endif
+
+ifdef GCC54
+GCC53=1
+endif
+
 ifdef GCC53
 GCC52=1
 endif
@@ -164,19 +181,29 @@ ifdef GCC45
 WFLAGS+=-Wunsuffixed-float-constants
 endif
 endif
+
 ifdef NOLDWARNING
 LDFLAGS+=-Wl,--as-needed
 endif
+
 ifdef ERRORMODE
 WFLAGS+=-Werror
 endif
+
+WFLAGS+=$(OLDWFLAGS)
+
 ifdef GCC43
  #WFLAGS+=-Wno-error=clobbered
 endif
 ifdef GCC46
  WFLAGS+=-Wno-error=suggest-attribute=noreturn
 endif
-WFLAGS+=$(OLDWFLAGS)
+ifdef GCC54
+ WFLAGS+=-Wno-logical-op -Wno-error=logical-op
+endif
+ifdef GCC61
+ WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare
+endif
 
 
 #indicate platform and what interface use with
diff --git a/src/d_main.c b/src/d_main.c
index 63f6bd02c68dfe075a362eee29c83fad88a25619..b23ffebb476dc6e80b6d8e138ddc28a4aa792cf0 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -187,7 +187,7 @@ UINT8 altdown = 0; // 0x1 left, 0x2 right
 //
 static inline void D_ModifierKeyResponder(event_t *ev)
 {
-	if (ev->type == ev_keydown) switch (ev->data1)
+	if (ev->type == ev_keydown || ev->type == ev_console) switch (ev->data1)
 	{
 		case KEY_LSHIFT: shiftdown |= 0x1; return;
 		case KEY_RSHIFT: shiftdown |= 0x2; return;
diff --git a/src/d_net.c b/src/d_net.c
index fae1ea311dcf87f1f19c4eb9b6781de4e7e26bf4..7f16c302d1c3267c0f1b5476b3e4b10cbfb6593f 100644
--- a/src/d_net.c
+++ b/src/d_net.c
@@ -991,12 +991,14 @@ void Command_Droprate(void)
 	packetdroprate = droprate;
 }
 
+#ifndef NONET
 static boolean ShouldDropPacket(void)
 {
 	return (packetdropquantity[netbuffer->packettype])
 		|| (packetdroprate != 0 && rand() < (RAND_MAX * (packetdroprate / 100.f))) || packetdroprate == 100;
 }
 #endif
+#endif
 
 //
 // HSendPacket
diff --git a/src/g_game.c b/src/g_game.c
index 5e04af496327329e2f54c00cec4912beb5535b35..1eef85ada2a88dea8f5b09286d69b43bc256a816 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -2901,7 +2901,7 @@ static void G_DoCompleted(void)
 	if (nextmap < NUMMAPS && !mapheaderinfo[nextmap])
 		P_AllocMapHeader(nextmap);
 
-	if (skipstats)
+	if (skipstats && !modeattacking) // Don't skip stats if we're in record attack
 		G_AfterIntermission();
 	else
 	{
diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c
index 54dd9485439db543f69f846480ef3719ea32ad88..3a0bf70544b4b63e25f64b00595e5d2976eb758b 100644
--- a/src/hardware/r_opengl/r_opengl.c
+++ b/src/hardware/r_opengl/r_opengl.c
@@ -1836,7 +1836,7 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
 	}
 }
 
-static inline void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
+static  void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
 {
 	INT32     val, count, pindex;
 	GLfloat s, t;
diff --git a/src/r_segs.c b/src/r_segs.c
index a4264eea5d7259ed9b34ba941d5c91c04174b9c1..ecf707e0f5f6132b4d0ed5df0143ccb8778a9a08 100644
--- a/src/r_segs.c
+++ b/src/r_segs.c
@@ -723,10 +723,13 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
 // Loop through R_DrawMaskedColumn calls
 static void R_DrawRepeatMaskedColumn(column_t *col)
 {
-	do {
+	while (sprtopscreen < sprbotscreen) {
 		R_DrawMaskedColumn(col);
-		sprtopscreen += dc_texheight*spryscale;
-	} while (sprtopscreen < sprbotscreen);
+		if ((INT64)sprtopscreen + dc_texheight*spryscale > (INT64)INT32_MAX) // prevent overflow
+			sprtopscreen = INT32_MAX;
+		else
+			sprtopscreen += dc_texheight*spryscale;
+	}
 }
 
 static void R_DrawRepeatFlippedMaskedColumn(column_t *col)
diff --git a/src/r_things.c b/src/r_things.c
index e9080dc050a7a66979f8fee8ab040602dd665a40..cbfcae21c8721179922e7abb0c6d0c3b90183433 100644
--- a/src/r_things.c
+++ b/src/r_things.c
@@ -957,12 +957,18 @@ static void R_DrawPrecipitationVisSprite(vissprite_t *vis)
 #endif
 	fixed_t frac;
 	patch_t *patch;
+	INT64 overflow_test;
 
 	//Fab : R_InitSprites now sets a wad lump number
 	patch = W_CacheLumpNum(vis->patch, PU_CACHE);
 	if (!patch)
 		return;
 
+	// Check for overflow
+	overflow_test = (INT64)centeryfrac - (((INT64)vis->texturemid*vis->scale)>>FRACBITS);
+	if (overflow_test < 0) overflow_test = -overflow_test;
+	if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) return; // fixed point mult would overflow
+
 	if (vis->transmap)
 	{
 		colfunc = fuzzcolfunc;