diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e46f5dc37fb5b650165ef49004b5f5177511483..34cc12f3c51f7d92244418329ba9a683ead58a27 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
 # DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
 # Version change is fine.
 project(SRB2
-	VERSION 2.2.4
+	VERSION 2.2.5
 	LANGUAGES C)
 
 if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
diff --git a/appveyor.yml b/appveyor.yml
index 5d599a516c4bcf78e67b4dc0b5e2f2505df1df48..2a8183b2007a89ff5f896e496fa0a9276dbe2f2d 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: 2.2.4.{branch}-{build}
+version: 2.2.5.{branch}-{build}
 os: MinGW
 
 environment:
@@ -110,8 +110,8 @@ after_build:
 - set BUILDSARCHIVE=%REPO%-%CONFIGURATION%.7z
 - cmd: 7z a %BUILD_ARCHIVE% %BUILD_PATH% -xr!.gitignore
 - appveyor PushArtifact %BUILD_ARCHIVE%
-- cmd: copy %BUILD_ARCHIVE% %BUILDSARCHIVE%
-- appveyor PushArtifact %BUILDSARCHIVE%
+#- cmd: copy %BUILD_ARCHIVE% %BUILDSARCHIVE%
+#- appveyor PushArtifact %BUILDSARCHIVE%
 ##############################
 # DEPLOYER SCRIPT
 ##############################
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7a3f0564d3dc269239dcccae7e0e1af7200ae9e7..cdcce0faa9107c1114fa803824ce9e6d7b5492b9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -429,7 +429,6 @@ if(${SRB2_CONFIG_HWRENDER})
 		${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2load.c
 		${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md3load.c
 		${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_model.c
-		${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_trick.c
 		${CMAKE_CURRENT_SOURCE_DIR}/hardware/u_list.c
 	)
 
diff --git a/src/Makefile b/src/Makefile
index e00c84bc9ff63277e33a23b6fbab392c6c94a384..606e65930eac04d8cc483bb0ad394a5c83f19045 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -224,7 +224,7 @@ ifdef NOHW
 else
 	OPTS+=-DHWRENDER
 	OBJS+=$(OBJDIR)/hw_bsp.o $(OBJDIR)/hw_draw.o $(OBJDIR)/hw_light.o \
-		 $(OBJDIR)/hw_main.o $(OBJDIR)/hw_clip.o $(OBJDIR)/hw_md2.o $(OBJDIR)/hw_cache.o $(OBJDIR)/hw_trick.o \
+		 $(OBJDIR)/hw_main.o $(OBJDIR)/hw_clip.o $(OBJDIR)/hw_md2.o $(OBJDIR)/hw_cache.o \
 		 $(OBJDIR)/hw_md2load.o $(OBJDIR)/hw_md3load.o $(OBJDIR)/hw_model.o $(OBJDIR)/u_list.o $(OBJDIR)/hw_batching.o
 endif
 
diff --git a/src/command.c b/src/command.c
index f5c02d877dadb087efce2d0ecfcb825ae66acdb2..091dbd8f124826105089b1b24e2a8158052eb5e3 100644
--- a/src/command.c
+++ b/src/command.c
@@ -1574,7 +1574,7 @@ static void CV_SetCVar(consvar_t *var, const char *value, boolean stealth)
 		// send the value of the variable
 		UINT8 buf[128];
 		UINT8 *p = buf;
-		if (!(server || (IsPlayerAdmin(consoleplayer))))
+		if (!(server || (addedtogame && IsPlayerAdmin(consoleplayer))))
 		{
 			CONS_Printf(M_GetText("Only the server or admin can change: %s %s\n"), var->name, var->string);
 			return;
diff --git a/src/config.h.in b/src/config.h.in
index 3b25799657cdd10cec5e35f6e06775c6edf48b4a..def5d67ce337e5520c20a65e3d96ff12bfb1c3af 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -30,12 +30,13 @@
  * Last updated 2020 / 02 / 22 - v2.2.2 - patch.pk3
  * Last updated 2020 / 05 / 10 - v2.2.3 - player.dta & patch.pk3
  * Last updated 2020 / 05 / 11 - v2.2.4 - patch.pk3
+ * Last updated 2020 / 07 / 07 - v2.2.5 - player.dta & patch.pk3
  */
 #define ASSET_HASH_SRB2_PK3   "0277c9416756627004e83cbb5b2e3e28"
 #define ASSET_HASH_ZONES_PK3  "f7e88afb6af7996a834c7d663144bead"
-#define ASSET_HASH_PLAYER_DTA "8a4507ddf9bc0682c09174400f26ad65"
+#define ASSET_HASH_PLAYER_DTA "3a48810db46c7790bd373d7e05af5221"
 #ifdef USE_PATCH_DTA
-#define ASSET_HASH_PATCH_PK3  "bbbf6af3b20349612ee06e0b55979a76"
+#define ASSET_HASH_PATCH_PK3  "57af2ba105dc4eb1e5b8e39e6aafaa4d"
 #endif
 
 #endif
diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index 78d4555bd3b8af9214de0ab2cf73dae9a34cac0a..a1e3976bc5c4e268ef4be770c7d474a634b2faf3 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -5159,7 +5159,7 @@ static void SV_SendTics(void)
 		{
 			// assert supposedtics[n]>=nettics[n]
 			realfirsttic = supposedtics[n];
-			lasttictosend = min(maketic, realfirsttic + CLIENTBACKUPTICS);
+			lasttictosend = min(maketic, nettics[n] + CLIENTBACKUPTICS);
 
 			if (realfirsttic >= lasttictosend)
 			{
diff --git a/src/dehacked.c b/src/dehacked.c
index 258cc1f468a5f19841d98b908c29337a5ada4c72..99d4883f6de75ebec0e3275a7d19e0c04a4f248a 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -3082,6 +3082,7 @@ static actionpointer_t actionpointers[] =
 	{{A_NapalmScatter},          "A_NAPALMSCATTER"},
 	{{A_SpawnFreshCopy},         "A_SPAWNFRESHCOPY"},
 	{{A_FlickySpawn},            "A_FLICKYSPAWN"},
+	{{A_FlickyCenter},           "A_FLICKYCENTER"},
 	{{A_FlickyAim},              "A_FLICKYAIM"},
 	{{A_FlickyFly},              "A_FLICKYFLY"},
 	{{A_FlickySoar},             "A_FLICKYSOAR"},
diff --git a/src/doomdef.h b/src/doomdef.h
index 1f90a6f7f492776c212b0deecdfed1924bb33a2c..a994d5990af772de09d403ca679edab68c4b743b 100644
--- a/src/doomdef.h
+++ b/src/doomdef.h
@@ -143,9 +143,9 @@ extern char logfilename[1024];
 // we use comprevision and compbranch instead.
 #else
 #define VERSION    202 // Game version
-#define SUBVERSION 4  // more precise version number
-#define VERSIONSTRING "v2.2.4"
-#define VERSIONSTRINGW L"v2.2.4"
+#define SUBVERSION 5  // more precise version number
+#define VERSIONSTRING "v2.2.5"
+#define VERSIONSTRINGW L"v2.2.5"
 // Hey! If you change this, add 1 to the MODVERSION below!
 // Otherwise we can't force updates!
 #endif
@@ -204,7 +204,7 @@ extern char logfilename[1024];
 // Will always resemble the versionstring, 205 = 2.0.5, 210 = 2.1, etc.
 #define CODEBASE 220
 
-// The Modification ID; must be obtained from Rob ( https://mb.srb2.org/private.php?do=newpm&u=546 ).
+// The Modification ID; must be obtained from a Master Server Admin ( https://mb.srb2.org/showgroups.php ).
 // DO NOT try to set this otherwise, or your modification will be unplayable through the Master Server.
 // "18" is the default mod ID for version 2.2
 #define MODID 18
@@ -213,7 +213,7 @@ extern char logfilename[1024];
 // it's only for detection of the version the player is using so the MS can alert them of an update.
 // Only set it higher, not lower, obviously.
 // Note that we use this to help keep internal testing in check; this is why v2.2.0 is not version "1".
-#define MODVERSION 44
+#define MODVERSION 45
 
 // To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
 // Increment MINOREXECVERSION whenever a config change is needed that does not correspond
diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index ef7df5eec42ed2c807839921be004722016af63c..bde19dca0b43834a2d4440b3bff313d775b27bb9 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -2990,34 +2990,10 @@ static void HWR_Subsector(size_t num)
 	//gr_cursectorlight.blue  = light;
 	//gr_cursectorlight.alpha = light;
 
-// ----- for special tricks with HW renderer -----
-	if (gr_frontsector->pseudoSector)
-	{
-		cullFloorHeight = locFloorHeight = gr_frontsector->virtualFloorheight;
-		cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight;
-	}
-	else if (gr_frontsector->virtualFloor)
-	{
-		///@TODO Is this whole virtualFloor mess even useful? I don't think it even triggers ever.
-		cullFloorHeight = locFloorHeight = gr_frontsector->virtualFloorheight;
-		if (gr_frontsector->virtualCeiling)
-			cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight;
-		else
-			cullCeilingHeight = locCeilingHeight = gr_frontsector->ceilingheight;
-	}
-	else if (gr_frontsector->virtualCeiling)
-	{
-		cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight;
-		cullFloorHeight   = locFloorHeight   = gr_frontsector->floorheight;
-	}
-	else
-	{
-		cullFloorHeight   = P_GetSectorFloorZAt  (gr_frontsector, viewx, viewy);
-		cullCeilingHeight = P_GetSectorCeilingZAt(gr_frontsector, viewx, viewy);
-		locFloorHeight    = P_GetSectorFloorZAt  (gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y);
-		locCeilingHeight  = P_GetSectorCeilingZAt(gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y);
-	}
-// ----- end special tricks -----
+	cullFloorHeight   = P_GetSectorFloorZAt  (gr_frontsector, viewx, viewy);
+	cullCeilingHeight = P_GetSectorCeilingZAt(gr_frontsector, viewx, viewy);
+	locFloorHeight    = P_GetSectorFloorZAt  (gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y);
+	locCeilingHeight  = P_GetSectorCeilingZAt(gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y);
 
 	if (gr_frontsector->ffloors)
 	{
@@ -3327,7 +3303,7 @@ static void HWR_RenderBSPNode(INT32 bspnum)
 
 	// Decide which side the view point is on
 	INT32 side;
-	
+
 	rs_numbspcalls++;
 
 	// Found a subsector?
@@ -4270,7 +4246,7 @@ static int CompareVisSprites(const void *p1, const void *p2)
 	int idiff;
 	float fdiff;
 	float tz1, tz2;
-	
+
 	// Make transparent sprites last. Comment from the previous sort implementation:
 	// Sryder:	Oh boy, while it's nice having ALL the sprites sorted properly, it fails when we bring MD2's into the
 	//			mix and they want to be translucent. So let's place all the translucent sprites and MD2's AFTER
@@ -4532,7 +4508,7 @@ static void HWR_CreateDrawNodes(void)
 	// However, in reality we shouldn't be re-copying and shifting all this information
 	// that is already lying around. This should all be in some sort of linked list or lists.
 	sortindex = Z_Calloc(sizeof(size_t) * (numplanes + numpolyplanes + numwalls), PU_STATIC, NULL);
-	
+
 	rs_hw_nodesorttime = I_GetTimeMicros();
 
 	for (i = 0; i < numplanes; i++, p++)
@@ -4552,7 +4528,7 @@ static void HWR_CreateDrawNodes(void)
 		sortnode[p].wall = &wallinfo[i];
 		sortindex[p] = p;
 	}
-	
+
 	rs_numdrawnodes = p;
 
 	// p is the number of stuff to sort
@@ -4589,7 +4565,7 @@ static void HWR_CreateDrawNodes(void)
 	}
 
 	rs_hw_nodesorttime = I_GetTimeMicros() - rs_hw_nodesorttime;
-	
+
 	rs_hw_nodedrawtime = I_GetTimeMicros();
 
 	// Okay! Let's draw it all! Woo!
@@ -4626,7 +4602,7 @@ static void HWR_CreateDrawNodes(void)
 				sortnode[sortindex[i]].wall->lightlevel, sortnode[sortindex[i]].wall->wallcolormap);
 		}
 	}
-	
+
 	rs_hw_nodedrawtime = I_GetTimeMicros() - rs_hw_nodedrawtime;
 
 	numwalls = 0;
@@ -5898,7 +5874,6 @@ consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_SAVE|CV_CALL, grfilt
 consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t,
                              CV_granisotropic_OnChange, 0, NULL, NULL, 0, 0, NULL};
 
-consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
 consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
 
 consvar_t cv_grbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -5938,9 +5913,8 @@ void HWR_AddCommands(void)
 	CV_RegisterVar(&cv_grshaders);
 
 	CV_RegisterVar(&cv_grfiltermode);
-	CV_RegisterVar(&cv_grcorrecttricks);
 	CV_RegisterVar(&cv_grsolvetjoin);
-	
+
 	CV_RegisterVar(&cv_renderstats);
 	CV_RegisterVar(&cv_grbatching);
 
diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h
index 21bd7ddb3ed12081428f8eeb74667083db0340e3..7336bba0f524a41aaee196ab57e8834fe254c6a1 100644
--- a/src/hardware/hw_main.h
+++ b/src/hardware/hw_main.h
@@ -52,7 +52,6 @@ boolean HWR_Screenshot(const char *pathname);
 
 void HWR_AddCommands(void);
 void HWR_AddSessionCommands(void);
-void HWR_CorrectSWTricks(void);
 void transform(float *cx, float *cy, float *cz);
 FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
 INT32 HWR_GetTextureUsed(void);
@@ -87,7 +86,6 @@ extern consvar_t cv_grmodelinterpolation;
 extern consvar_t cv_grmodellighting;
 extern consvar_t cv_grfiltermode;
 extern consvar_t cv_granisotropicmode;
-extern consvar_t cv_grcorrecttricks;
 extern consvar_t cv_fovchange;
 extern consvar_t cv_grsolvetjoin;
 extern consvar_t cv_grshearing;
diff --git a/src/hardware/hw_trick.c b/src/hardware/hw_trick.c
deleted file mode 100644
index 82d81b5b2520925835ed635faf392a0469239fb5..0000000000000000000000000000000000000000
--- a/src/hardware/hw_trick.c
+++ /dev/null
@@ -1,914 +0,0 @@
-// Emacs style mode select   -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright (C) 1998-2001 by DooM Legacy Team.
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//-----------------------------------------------------------------------------
-/// \file
-/// \brief special trick routines to make some SW tricks look OK with
-///	HW rendering. This includes:
-///	- deepwatereffect (e.g. tnt/map02)
-///	- invisible staircase (e.g. eternal/map02)
-///	- floating ceilings (e.g. eternal/map03)
-///
-///	It is not guaranteed that it looks identical to the SW mode,
-///	but it looks in most of the cases far better than having
-///	holes in the architecture, HOM, etc.
-///
-///	It fixes as well missing textures, which are replaced by either
-///	a default texture or the midtexture.
-///
-///	words of notice:
-///	pseudosectors, as mentioned in this file, are sectors where both
-///	sidedefs point to the same sector. This expression is also used
-///	for sectors which are enclosed by another sector but have no
-///	correct sidedefs at all
-///
-///	if a vertex is inside a poly is determined by the angles between
-///	this vertex and all angles on the linedefs (imagine walking along
-///	a circle always facing a certain point inside/outside the circle;
-///	if inside, angle have taken all values [0..pi), otherwise the
-///	range was < pi/2
-
-#include <math.h>
-#include "../doomdef.h"
-#include "../doomstat.h"
-
-#ifdef HWRENDER
-#include "hw_glob.h"
-#include "hw_dll.h"
-#include "../r_local.h"
-#include "../i_system.h"
-
-//
-// add a line to a sectors list of lines
-//
-static void addLineToChain(sector_t *sector, line_t *line)
-{
-	linechain_t *thisElem = NULL, *nextElem;
-
-	if (!sector)
-		return;
-
-	nextElem = sector->sectorLines;
-
-	while (nextElem) // walk through chain
-	{
-		thisElem = nextElem;
-		nextElem = thisElem->next;
-	}
-
-	// add a new element into the chain
-	if (thisElem)
-	{
-		thisElem->next = malloc(sizeof (linechain_t));
-		if (thisElem->next)
-		{
-			thisElem->next->line = line;
-			thisElem->next->next = NULL;
-		}
-		else
-		{
-			I_Error("Out of memory in addLineToChain(.)\n");
-		}
-	}
-	else // first element in chain
-	{
-		sector->sectorLines =  malloc(sizeof (linechain_t));
-		if (sector->sectorLines)
-		{
-			sector->sectorLines->line = line;
-			sector->sectorLines->next = NULL;
-		}
-		else
-		{
-			I_Error("Out of memory in addLineToChain(.)\n");
-		}
-	}
-}
-
-//
-// We dont want a memory hole, do we?;-)
-//
-static void releaseLineChains(void)
-{
-	linechain_t *thisElem, *nextElem;
-	sector_t *sector;
-	size_t i;
-
-	for (i = 0; i < numsectors; i++)
-	{
-		sector = &sectors[i];
-		nextElem = sector->sectorLines;
-
-		while (nextElem)
-		{
-			thisElem = nextElem;
-			nextElem = thisElem->next;
-			free(thisElem);
-		}
-
-		sector->sectorLines = NULL;
-	}
-}
-
-//
-// check if a pseudo sector is valid by checking all its linedefs
-//
-static boolean isPSectorValid(sector_t *sector)
-{
-	linechain_t *thisElem, *nextElem;
-
-	if (!sector->pseudoSector) // check only pseudosectors, others dont care
-	{
-#ifdef PARANOIA
-		CONS_Debug(DBG_RENDER, "Alert! non-pseudosector fed to isPSectorClosed()\n");
-#endif
-		return false;
-	}
-
-	nextElem = sector->sectorLines;
-
-	while (nextElem)
-	{
-		thisElem = nextElem;
-		nextElem = thisElem->next;
-		if (thisElem->line->frontsector != thisElem->line->backsector)
-			return false;
-	}
-	return true;
-}
-
-//
-// angles are always phiMax-phiMin [0...2\pi)
-//
-FUNCMATH static double phiDiff(double phiMin, double phiMax)
-{
-	double result;
-
-	result = phiMax-phiMin;
-
-	if (result < 0.0l)
-		result += 2.0l*M_PIl;
-
-	return result;
-}
-
-//
-// sort phi's so that enclosed angle < \pi
-//
-static void sortPhi(double phi1, double phi2, double *phiMin, double *phiMax)
-{
-	if (phiDiff(phi1, phi2) < M_PIl)
-	{
-		*phiMin = phi1;
-		*phiMax = phi2;
-	}
-	else
-	{
-		*phiMin = phi2;
-		*phiMax = phi1;
-	}
-}
-
-//
-// return if angle(phi1, phi2) is bigger than \pi
-// if so, the vertex lies inside the poly
-//
-FUNCMATH static boolean biggerThanPi(double phi1, double phi2)
-{
-	if (phiDiff(phi1, phi2) > M_PIl)
-		return true;
-
-	return false;
-}
-
-#define DELTAPHI (M_PIl/100.0l) // some small phi << \pi
-
-//
-// calculate bounds for minimum angle
-//
-static void phiBounds(double phi1, double phi2, double *phiMin, double *phiMax)
-{
-	double phi1Tmp, phi2Tmp;
-	double psi1, psi2, psi3, psi4, psi5, psi6, psi7; // for optimization
-
-	sortPhi(phi1, phi2, &phi1Tmp, &phi2Tmp);
-	phi1 = phi1Tmp;
-	phi2 = phi2Tmp;
-
-	// check start condition
-	if (*phiMin > M_PIl || *phiMax > M_PIl)
-	{
-		*phiMin = phi1;
-		*phiMax = phi2;
-		return;
-	}
-
-	// 6 cases:
-	// new angles inbetween phiMin, phiMax -> forget it
-	// new angles enclose phiMin -> set phiMin
-	// new angles enclose phiMax -> set phiMax
-	// new angles completely outside phiMin, phiMax -> leave largest area free
-	// new angles close the range completely!
-	// new angles enlarges range on both sides
-
-	psi1 = phiDiff(*phiMin, phi1);
-	psi2 = phiDiff(*phiMin, phi2);
-	psi3 = phiDiff(*phiMax, phi1);
-	psi4 = phiDiff(*phiMax, phi2);
-	psi5 = phiDiff(*phiMin, *phiMax);
-	psi6 = (double)(2.0l*M_PIl - psi5); // phiDiff(*phiMax, *phiMin);
-	psi7 = (double)(2.0l*M_PIl - psi2); // phiDiff(phi2, *phiMin);
-
-	// case 1 & 5!
-	if ((psi1 <= psi5) && (psi2 <= psi5))
-	{
-		if (psi1 <= psi2) // case 1
-		{
-			return;
-		}
-		else // case 5
-		{
-			// create some artificial interval here not to get into numerical trouble
-			// in fact we know now the sector is completely enclosed -> base for computational optimization
-			*phiMax = 0.0l;
-			*phiMin = DELTAPHI;
-			return;
-		}
-	}
-
-	// case 2
-	if ((psi1 >= psi5) && (psi2 <= psi5))
-	{
-		*phiMin = phi1;
-		return;
-	}
-
-	// case 3
-	if ((psi3 >= psi6) && (psi4 <= psi6))
-	{
-		*phiMax = phi2;
-		return;
-	}
-
-	// case 4 & 6
-#ifdef PARANOIA
-	if ((psi3 <= psi6) && (psi4 <= psi6)) // FIXME: isn't this case implicitly true anyway??
-#endif
-	{
-		if (psi3 <= psi4) //case 4
-		{
-			if (psi3 >= psi7)
-			{
-				*phiMin = phi1;
-				return;
-			}
-			else
-			{
-				*phiMax = phi2;
-				return;
-			}
-		}
-		else // case 6
-		{
-			*phiMin = phi1;
-			*phiMax = phi2;
-			return;
-		}
-	}
-
-#ifdef PARANOIA
-	CONS_Debug(DBG_RENDER, "phiMin = %f, phiMax = %f, phi1 = %f, phi2 = %f\n", *phiMin, *phiMax, phi1, phi2);
-	I_Error("phiBounds() out of range!\n");
-#endif
-}
-
-//
-// Check if a vertex lies inside a sector
-// This works for "well-behaved" convex polygons
-// If we need it mathematically correct, we need to sort the
-// linedefs first so we have them in a row, then walk along the linedefs,
-// but this is a bit overdone
-//
-static inline boolean isVertexInside(vertex_t *vertex, sector_t *sector)
-{
-	double xa, ya, xe, ye;
-	linechain_t *chain;
-	double phiMin, phiMax;
-	double phi1, phi2;
-
-	chain = sector->sectorLines;
-	phiMin = phiMax = 10.0l*M_PIl; // some value > \pi
-
-	while (chain)
-	{
-		// start and end vertex
-		xa = (double)chain->line->v1->x - (double)vertex->x;
-		ya = (double)chain->line->v1->y - (double)vertex->y;
-		xe = (double)chain->line->v2->x - (double)vertex->x;
-		ye = (double)chain->line->v2->y - (double)vertex->y;
-
-		// angle phi of connection between the vertices and the x-axis
-		phi1 = atan2(ya, xa);
-		phi2 = atan2(ye, xe);
-
-		// if we have just started, we can have to create start bounds for phi
-
-		phiBounds(phi1, phi2, &phiMin, &phiMax);
-		chain = chain->next;
-	}
-
-	return biggerThanPi(phiMin, phiMax);
-}
-
-
-#define MAXSTACK 256 // Not more than 256 polys in each other?
-//
-// generate a list of sectors which enclose the given sector
-//
-static void generateStacklist(sector_t *thisSector)
-{
-	size_t i, stackCnt = 0;
-	sector_t *locStacklist[MAXSTACK];
-	sector_t *checkSector;
-
-	for (i = 0; i < numsectors; i++)
-	{
-		checkSector = &sectors[i];
-
-		if (checkSector == thisSector) // dont check self
-			continue;
-
-		// buggy sector?
-		if (!thisSector->sectorLines)
-			continue;
-
-		// check if an arbitrary vertex of thisSector lies inside the checkSector
-		if (isVertexInside(thisSector->sectorLines->line->v1, checkSector))
-		{
-			// if so, the thisSector lies inside the checkSector
-			locStacklist[stackCnt] = checkSector;
-			stackCnt++;
-
-			if (MAXSTACK-1 == stackCnt) // beware of the SIGSEGV! and consider terminating NULL!
-				break;
-		}
-	}
-
-	thisSector->stackList = malloc(sizeof (sector_t *) * (stackCnt+1));
-	if (NULL == thisSector->stackList)
-	{
-		I_Error("Out of memory error in generateStacklist()");
-	}
-
-	locStacklist[stackCnt] = NULL; // terminating NULL
-
-	memcpy(thisSector->stackList, locStacklist, sizeof (sector_t *) * (stackCnt+1));
-}
-
-//
-// Bubble sort the stacklist with rising lineoutlengths
-//
-static void sortStacklist(sector_t *sector)
-{
-	sector_t **list;
-	sector_t *sec1, *sec2;
-	boolean finished;
-	size_t i;
-
-	list = sector->stackList;
-	finished = false;
-
-	if (!*list)
-		return; // nothing to sort
-
-	while (!finished)
-	{
-		i = 0;
-		finished = true;
-
-		while (*(list+i+1))
-		{
-			sec1 = *(list+i);
-			sec2 = *(list+i+1);
-
-			if (sec1->lineoutLength > sec2->lineoutLength)
-			{
-				*(list+i) = sec2;
-				*(list+i+1) = sec1;
-				finished = false;
-			}
-			i++;
-		}
-	}
-}
-
-//
-// length of a line in euclidian sense
-//
-static double lineLength(line_t *line)
-{
-	double dx, dy, length;
-
-	dx = (double) line->v1->x - (double) line->v2->x;
-	dy = (double) line->v1->y - (double) line->v2->y;
-
-	length = hypot(dx, dy);
-
-	return length;
-}
-
-
-//
-// length of the sector lineout
-//
-static double calcLineoutLength(sector_t *sector)
-{
-	linechain_t *chain;
-	double length = 0.0L;
-	chain = sector->sectorLines;
-
-	while (chain) // sum up lengths of all lines
-	{
-		length += lineLength(chain->line);
-		chain = chain->next;
-	}
-	return length;
-}
-
-//
-// Calculate length of the sectors lineout
-//
-static void calcLineouts(sector_t *sector)
-{
-	size_t secCount = 0;
-	sector_t *encSector = *(sector->stackList);
-
-	while (encSector)
-	{
-		if (encSector->lineoutLength < 0.0L) // if length has not yet been calculated
-		{
-			encSector->lineoutLength = calcLineoutLength(encSector);
-		}
-
-		secCount++;
-		encSector = *((sector->stackList) + secCount);
-	}
-}
-
-//
-// Free Stacklists of all sectors
-//
-static void freeStacklists(void)
-{
-	size_t i;
-
-	for (i = 0; i < numsectors; i++)
-	{
-		if (sectors[i].stackList)
-		{
-			free(sectors[i].stackList);
-			sectors[i].stackList = NULL;
-		}
-	}
-}
-
-//
-// if more than half of the toptextures are missing
-//
-static boolean areToptexturesMissing(sector_t *thisSector)
-{
-	linechain_t *thisElem, *nextElem = thisSector->sectorLines;
-	sector_t *frontSector, *backSector;
-	size_t nomiss = 0;
-	side_t *sidel, *sider;
-
-	while (nextElem) // walk through chain
-	{
-		thisElem = nextElem;
-		nextElem = thisElem->next;
-
-		frontSector = thisElem->line->frontsector;
-		backSector  = thisElem->line->backsector;
-
-		if (frontSector == backSector) // skip damn renderer tricks here
-			continue;
-
-		if (!frontSector || !backSector)
-			continue;
-
-		sider = &sides[thisElem->line->sidenum[0]];
-		sidel = &sides[thisElem->line->sidenum[1]];
-
-		if (backSector->ceilingheight < frontSector->ceilingheight)
-		{
-			if (sider->toptexture != 0)
-			{
-				nomiss++;
-				break; // we can stop here if decision criterium is ==0
-			}
-		}
-		else if (backSector->ceilingheight > frontSector->ceilingheight)
-		{
-			if (sidel->toptexture != 0)
-			{
-				nomiss++;
-				break; // we can stop here if decision criterium is ==0
-			}
-		}
-	}
-
-	return nomiss == 0;
-}
-
-//
-// are more textures missing than present?
-//
-static boolean areBottomtexturesMissing(sector_t *thisSector)
-{
-	linechain_t *thisElem, *nextElem = thisSector->sectorLines;
-	sector_t *frontSector, *backSector;
-	size_t nomiss = 0;
-	side_t *sidel, *sider;
-
-	while (nextElem) // walk through chain
-	{
-		thisElem = nextElem;
-		nextElem = thisElem->next;
-
-		frontSector = thisElem->line->frontsector;
-		backSector  = thisElem->line->backsector;
-
-		if (frontSector == backSector) // skip damn renderer tricks here
-			continue;
-
-		if (!frontSector || !backSector)
-			continue;
-
-		sider = &sides[thisElem->line->sidenum[0]];
-		sidel = &sides[thisElem->line->sidenum[1]];
-
-		if (backSector->floorheight > frontSector->floorheight)
-		{
-			if (sider->bottomtexture != 0)
-			{
-				nomiss++;
-				break; // we can stop here if decision criterium is ==0
-			}
-		}
-
-		else if (backSector->floorheight < frontSector->floorheight)
-		{
-			if (sidel->bottomtexture != 0)
-			{
-				nomiss++;
-				break; // we can stop here if decision criterium is ==0
-			}
-		}
-	}
-
-	//    return missing >= nomiss;
-	return nomiss == 0;
-}
-
-//
-// check if no adjacent sector has same ceiling height
-//
-static boolean isCeilingFloating(sector_t *thisSector)
-{
-	sector_t *adjSector, *refSector = NULL, *frontSector, *backSector;
-	linechain_t *thisElem, *nextElem;
-
-	if (!thisSector)
-		return false;
-
-	nextElem = thisSector->sectorLines;
-
-	while (nextElem) // walk through chain
-	{
-		thisElem = nextElem;
-		nextElem = thisElem->next;
-
-		frontSector = thisElem->line->frontsector;
-		backSector  = thisElem->line->backsector;
-
-		if (frontSector == thisSector)
-			adjSector = backSector;
-		else
-			adjSector = frontSector;
-
-		if (!adjSector) // assume floating sectors have surrounding sectors
-			return false;
-
-		if (adjSector->c_slope) // Don't bother with slopes
-			return false;
-
-		if (!refSector)
-		{
-			refSector = adjSector;
-			continue;
-		}
-
-		// if adjacent sector has same height or more than one adjacent sector exists -> stop
-		if (thisSector->ceilingheight == adjSector->ceilingheight || refSector != adjSector)
-			return false;
-	}
-
-	// now check for walltextures
-	if (!areToptexturesMissing(thisSector))
-		return false;
-
-	return true;
-}
-
-//
-// check if no adjacent sector has same ceiling height
-// FIXME: throw that together with isCeilingFloating??
-//
-static boolean isFloorFloating(sector_t *thisSector)
-{
-	sector_t *adjSector, *refSector = NULL, *frontSector, *backSector;
-	linechain_t *thisElem, *nextElem;
-
-	if (!thisSector)
-		return false;
-
-	nextElem = thisSector->sectorLines;
-
-	while (nextElem) // walk through chain
-	{
-		thisElem = nextElem;
-		nextElem = thisElem->next;
-
-		frontSector = thisElem->line->frontsector;
-		backSector  = thisElem->line->backsector;
-
-		if (frontSector == thisSector)
-			adjSector = backSector;
-		else
-			adjSector = frontSector;
-
-		if (!adjSector) // assume floating sectors have surrounding sectors
-			return false;
-
-		if (adjSector->f_slope) // Don't bother with slopes
-			return false;
-
-		if (!refSector)
-		{
-			refSector = adjSector;
-			continue;
-		}
-
-		// if adjacent sector has same height or more than one adjacent sector exists -> stop
-		if (thisSector->floorheight == adjSector->floorheight || refSector != adjSector)
-			return false;
-	}
-
-	// now check for walltextures
-	if (!areBottomtexturesMissing(thisSector))
-		return false;
-
-	return true;
-}
-
-//
-// estimate ceilingheight according to height of adjacent sector
-//
-static fixed_t estimateCeilHeight(sector_t *thisSector)
-{
-	sector_t *adjSector;
-
-	if (!thisSector || !thisSector->sectorLines || !thisSector->sectorLines->line)
-		return 0;
-
-	adjSector = thisSector->sectorLines->line->frontsector;
-	if (adjSector == thisSector)
-		adjSector = thisSector->sectorLines->line->backsector;
-
-	if (!adjSector)
-		return 0;
-
-	return adjSector->ceilingheight;
-}
-
-//
-// estimate ceilingheight according to height of adjacent sector
-//
-static fixed_t estimateFloorHeight(sector_t *thisSector)
-{
-	sector_t *adjSector;
-
-	if (!thisSector || !thisSector->sectorLines || !thisSector->sectorLines->line)
-		return 0;
-
-	adjSector = thisSector->sectorLines->line->frontsector;
-	if (adjSector == thisSector)
-		adjSector = thisSector->sectorLines->line->backsector;
-
-	if (!adjSector)
-		return 0;
-
-	return adjSector->floorheight;
-}
-
-#define CORRECT_FLOAT_EXPERIMENTAL
-
-// --------------------------------------------------------------------------
-// Some levels have missing sidedefs, which produces HOM, so lets try to compensate for that
-// and some levels have deep water trick, invisible staircases etc.
-// --------------------------------------------------------------------------
-// FIXME: put some nice default texture in legacy.dat and use it
-void HWR_CorrectSWTricks(void)
-{
-	size_t i;
-	size_t k;
-	line_t *ld;
-	side_t *sidel = NULL, *sider;
-	sector_t *secl, *secr;
-	sector_t **sectorList;
-	sector_t *outSector;
-
-	if ((0 == cv_grcorrecttricks.value))
-		return;
-
-	// determine lines for sectors
-	for (i = 0; i < numlines; i++)
-	{
-		ld = &lines[i];
-		secr = ld->frontsector;
-		secl = ld->backsector;
-
-		if (secr == secl)
-		{
-			secr->pseudoSector = true; // special renderer trick?
-			addLineToChain(secr, ld);
-		}
-		else
-		{
-			addLineToChain(secr, ld);
-			addLineToChain(secl, ld);
-		}
-	}
-
-	// preprocessing
-	for (i = 0; i < numsectors; i++)
-	{
-		sector_t *checkSector;
-
-		checkSector = &sectors[i];
-
-		// identify real pseudosectors first
-		if (checkSector->pseudoSector)
-		{
-			if (!isPSectorValid(checkSector)) // drop invalid pseudo sectors
-			{
-				checkSector->pseudoSector = false;
-			}
-		}
-
-		// determine enclosing sectors for pseudosectors ... used later
-		if (checkSector->pseudoSector)
-		{
-			generateStacklist(checkSector);
-			calcLineouts(checkSector);
-			sortStacklist(checkSector);
-		}
-	}
-
-	// set virtual floor heights for pseudo sectors
-	// required for deep water effect e.g.
-	for (i = 0; i < numsectors; i++)
-	{
-		if (sectors[i].pseudoSector)
-		{
-			sectorList = sectors[i].stackList;
-			k = 0;
-			while (*(sectorList+k))
-			{
-				outSector = *(sectorList+k);
-				if (!outSector->pseudoSector)
-				{
-					sectors[i].virtualFloorheight = outSector->floorheight;
-					sectors[i].virtualCeilingheight = outSector->ceilingheight;
-					break;
-				}
-				k++;
-			}
-			if (*(sectorList+k) == NULL) // sorry, did not work :(
-			{
-				sectors[i].virtualFloorheight = sectors[i].floorheight;
-				sectors[i].virtualCeilingheight = sectors[i].ceilingheight;
-			}
-		}
-	}
-#ifdef CORRECT_FLOAT_EXPERIMENTAL
-	// correct ceiling/floor heights of totally floating sectors
-	for (i = 0; i < numsectors; i++)
-	{
-		sector_t *floatSector;
-
-		floatSector = &sectors[i];
-
-		// correct height of floating sectors
-		if (isCeilingFloating(floatSector))
-		{
-			floatSector->virtualCeilingheight = estimateCeilHeight(floatSector);
-			floatSector->virtualCeiling = true;
-		}
-		if (isFloorFloating(floatSector))
-		{
-			floatSector->virtualFloorheight = estimateFloorHeight(floatSector);
-			floatSector->virtualFloor = true;
-		}
-	}
-#endif
-
-	// now for the missing textures
-	for (i = 0; i < numlines; i++)
-	{
-		ld = &lines[i];
-		sider = &sides[ld->sidenum[0]];
-		if (ld->sidenum[1] != 0xffff)
-			sidel = &sides[ld->sidenum[1]];
-
-		secr = ld->frontsector;
-		secl = ld->backsector;
-
-		if (secr == secl) // special renderer trick
-			continue; // we cant correct missing textures here
-
-		if (secl) // only if there is a backsector
-		{
-			if (secr->pseudoSector || secl->pseudoSector)
-				continue;
-			if (!secr->virtualFloor && !secl->virtualFloor)
-			{
-				if (secl->floorheight > secr->floorheight)
-				{
-					// now check if r-sidedef is correct
-					if (sider->bottomtexture == 0)
-					{
-						if (sider->midtexture == 0)
-							sider->bottomtexture = 0; // Tails // More redwall sky shenanigans
-						else
-							sider->bottomtexture = sider->midtexture;
-					}
-				}
-				else if (secl->floorheight < secr->floorheight)
-				{
-					// now check if l-sidedef is correct
-					if (sidel->bottomtexture == 0)
-					{
-						if (sidel->midtexture == 0)
-							sidel->bottomtexture = 0; // Tails // More redwall sky shenanigans
-						else
-							sidel->bottomtexture = sidel->midtexture;
-					}
-				}
-			}
-
-			if (!secr->virtualCeiling && !secl->virtualCeiling)
-			{
-					if (secl->ceilingheight < secr->ceilingheight)
-				{
-					// now check if r-sidedef is correct
-					if (sider->toptexture == 0)
-					{
-						if (sider->midtexture == 0)
-							sider->toptexture = 0; // Tails // When this was REDWALL it was causing issues in the sky sometimes
-						else
-							sider->toptexture = sider->midtexture;
-					}
-				}
-				else if (secl->ceilingheight > secr->ceilingheight)
-				{
-					// now check if l-sidedef is correct
-					if (sidel->toptexture == 0)
-					{
-						if (sidel->midtexture == 0)
-							sidel->toptexture = 0; // Tails // When this was REDWALL it was causing issues in the sky sometimes
-						else
-							sidel->toptexture = sidel->midtexture;
-					}
-				}
-			}
-		} // if (NULL != secl)
-	} // for (i = 0; i < numlines; i++)
-
-	// release all linechains
-	releaseLineChains();
-	freeStacklists();
-}
-
-#endif // HWRENDER
diff --git a/src/info.c b/src/info.c
index 36806eca337acaa31ca779b7215960bac7b723c4..778f1f7418c97e9cd3af6c05787c79c8e15aa4e5 100644
--- a/src/info.c
+++ b/src/info.c
@@ -21803,11 +21803,11 @@ skincolor_t skincolors[MAXSKINCOLORS] = {
 	{"Super Orange 4", {0x00, 0xd0, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x44, 0x45, 0x46}, SKINCOLOR_SAPPHIRE, 4,  V_ORANGEMAP, false}, // SKINCOLOR_SUPERORANGE4
 	{"Super Orange 5", {0xd0, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x44, 0x45, 0x46, 0x47}, SKINCOLOR_SAPPHIRE, 3,  V_ORANGEMAP, false}, // SKINCOLOR_SUPERORANGE5
 
-	{"Super Gold 1", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x51, 0x52, 0x53, 0x48}, SKINCOLOR_CORNFLOWER, 15, 0,           false}, // SKINCOLOR_SUPERGOLD1
-	{"Super Gold 2", {0x00, 0x50, 0x51, 0x52, 0x53, 0x53, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x40, 0x41}, SKINCOLOR_CORNFLOWER, 9,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD2
-	{"Super Gold 3", {0x51, 0x52, 0x53, 0x53, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x40, 0x41, 0x42, 0x43}, SKINCOLOR_CORNFLOWER, 8,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD3
-	{"Super Gold 4", {0x53, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46}, SKINCOLOR_CORNFLOWER, 8,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD4
-	{"Super Gold 5", {0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47}, SKINCOLOR_CORNFLOWER, 8,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD5
+	{"Super Gold 1", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x51, 0x52, 0x53, 0x48, 0x48, 0x48}, SKINCOLOR_CORNFLOWER, 15, 0,           false}, // SKINCOLOR_SUPERGOLD1
+	{"Super Gold 2", {0x00, 0x50, 0x51, 0x52, 0x53, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x40, 0x41, 0x41, 0x41}, SKINCOLOR_CORNFLOWER, 9,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD2
+	{"Super Gold 3", {0x51, 0x52, 0x53, 0x53, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x40, 0x41, 0x42, 0x43, 0x43, 0x43}, SKINCOLOR_CORNFLOWER, 8,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD3
+	{"Super Gold 4", {0x53, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46, 0x46}, SKINCOLOR_CORNFLOWER, 8,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD4
+	{"Super Gold 5", {0x48, 0x48, 0x49, 0x49, 0x49, 0x40, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x47}, SKINCOLOR_CORNFLOWER, 8,  V_YELLOWMAP, false}, // SKINCOLOR_SUPERGOLD5
 
 	{"Super Peridot 1", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x58, 0x58, 0xbc, 0xbc, 0xbc}, SKINCOLOR_COBALT, 15, 0,            false}, // SKINCOLOR_SUPERPERIDOT1
 	{"Super Peridot 2", {0x00, 0x58, 0x58, 0x58, 0xbc, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe}, SKINCOLOR_COBALT, 4,  V_PERIDOTMAP, false}, // SKINCOLOR_SUPERPERIDOT2
diff --git a/src/m_menu.c b/src/m_menu.c
index 98178c15c34f51e0f05e2e5ed003886a36f2aa9d..dba792e903f5f8e1134f343815f6b41815a9f3c7 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -1942,7 +1942,7 @@ static menu_t SP_NightsGhostDef =
 static menu_t SP_MarathonDef =
 {
 	MTREE2(MN_SP_MAIN, MN_SP_MARATHON),
-	"M_ATTACK", // temporary
+	"M_RATHON",
 	sizeof(SP_MarathonMenu)/sizeof(menuitem_t),
 	&MainDef,  // Doesn't matter.
 	SP_MarathonMenu,
@@ -10709,7 +10709,7 @@ void M_DrawMarathon(void)
 			recatkdrawtimer -= (10*TICRATE);
 	}
 
-	//M_DrawMenuTitle();
+	M_DrawMenuTitle();
 
 	// draw menu (everything else goes on top of it)
 	// Sadly we can't just use generic mode menus because we need some extra hacks
diff --git a/src/m_misc.c b/src/m_misc.c
index c527d22960ae18a2ad6ccaa90793c68292c438f5..216fde056c001690899debd7ad1ff2b2f982604b 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -162,7 +162,7 @@ consvar_t cv_zlib_memorya = {"apng_memory_level", "(Max Memory) 9", CV_SAVE, zli
 consvar_t cv_zlib_levela = {"apng_compress_level", "4", CV_SAVE, zlib_level_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 consvar_t cv_zlib_strategya = {"apng_strategy", "RLE", CV_SAVE, zlib_strategy_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 consvar_t cv_zlib_window_bitsa = {"apng_window_size", "32k", CV_SAVE, zlib_window_bits_t, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_apng_delay = {"apng_speed", "1/2x", CV_SAVE, apng_delay_t, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_apng_delay = {"apng_speed", "1x", CV_SAVE, apng_delay_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 
 boolean takescreenshot = false; // Take a screenshot this tic
 
diff --git a/src/p_enemy.c b/src/p_enemy.c
index 9571b0b4a5a8244998ba0bc873ad444380880dfb..fd30f8e38a54924284776da4b7a11cba46612e50 100644
--- a/src/p_enemy.c
+++ b/src/p_enemy.c
@@ -5214,7 +5214,7 @@ void A_SignPlayer(mobj_t *actor)
 
 	actor->tracer->color = signcolor;
 	if (signcolor && signcolor < numskincolors)
-		signframe += (15 - skincolors[facecolor].invshade);
+		signframe += (15 - skincolors[skincolors[signcolor].invcolor].invshade);
 	actor->tracer->frame = signframe;
 }
 
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 62bcad500c90e8ac48c875e8cdbbb1e16da083ef..c26308a59d653353ecb324e24c2a0f26070815de 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -442,7 +442,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
 
 			mobj->sprite2 = spr2;
 			mobj->frame = frame|(st->frame&~FF_FRAMEMASK);
-			if (mobj->color >= FIRSTSUPERCOLOR && mobj->color < numskincolors) // Super colours? Super bright!
+			if (player->powers[pw_super] || (player->powers[pw_carry] == CR_NIGHTSMODE && (player->charflags & (SF_SUPER|SF_NONIGHTSSUPER)) == SF_SUPER)) // Super colours? Super bright!
 				mobj->frame |= FF_FULLBRIGHT;
 		}
 		// Regular sprites
diff --git a/src/p_setup.c b/src/p_setup.c
index 942deecf8015122e2a5bb41c720401f3101989f6..b16e13faad56535afaca2a46bc76f511aa2ec614 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -995,17 +995,6 @@ static void P_InitializeSector(sector_t *ss)
 
 	ss->extra_colormap = NULL;
 
-#ifdef HWRENDER // ----- for special tricks with HW renderer -----
-	ss->pseudoSector = false;
-	ss->virtualFloor = false;
-	ss->virtualFloorheight = 0;
-	ss->virtualCeiling = false;
-	ss->virtualCeilingheight = 0;
-	ss->sectorLines = NULL;
-	ss->stackList = NULL;
-	ss->lineoutLength = -1.0l;
-#endif // ----- end special tricks -----
-
 	ss->gravity = NULL;
 	ss->verticalflip = false;
 	ss->flags = SF_FLIPSPECIAL_FLOOR;
@@ -3825,8 +3814,6 @@ void HWR_SetupLevel(void)
 	HWR_ResetLights();
 #endif
 
-	// Correct missing sidedefs & deep water trick
-	HWR_CorrectSWTricks();
 	HWR_CreatePlanePolygons((INT32)numnodes - 1);
 }
 #endif
diff --git a/src/r_defs.h b/src/r_defs.h
index a36568192ebbd320a58b88a58c079e15ba76d833..fd868ee97daed196294a650a1ec4836acc9da403 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -221,20 +221,6 @@ typedef struct r_lightlist_s
 	INT32 lightnum;
 } r_lightlist_t;
 
-// ----- for special tricks with HW renderer -----
-
-//
-// For creating a chain with the lines around a sector
-//
-typedef struct linechain_s
-{
-	struct line_s *line;
-	struct linechain_s *next;
-} linechain_t;
-// ----- end special tricks -----
-
-
-
 // Slopes
 typedef enum {
 	SL_NOPHYSICS = 1, /// This plane will have no physics applied besides the positioning.
@@ -348,17 +334,6 @@ typedef struct sector_s
 	// per-sector colormaps!
 	extracolormap_t *extra_colormap;
 
-#ifdef HWRENDER // ----- for special tricks with HW renderer -----
-	boolean pseudoSector;
-	boolean virtualFloor;
-	fixed_t virtualFloorheight;
-	boolean virtualCeiling;
-	fixed_t virtualCeilingheight;
-	linechain_t *sectorLines;
-	struct sector_s **stackList;
-	double lineoutLength;
-#endif // ----- end special tricks -----
-
 	// This points to the master's floorheight, so it can be changed in realtime!
 	fixed_t *gravity; // per-sector gravity
 	boolean verticalflip; // If gravity < 0, then allow flipped physics
diff --git a/src/sdl/Srb2SDL-vc10.vcxproj b/src/sdl/Srb2SDL-vc10.vcxproj
index c24104b925afab8e35558285b9f6a88dfd95e36e..38b3d1538733c6aa8f764d671c8225aa13e5bfc9 100644
--- a/src/sdl/Srb2SDL-vc10.vcxproj
+++ b/src/sdl/Srb2SDL-vc10.vcxproj
@@ -382,7 +382,6 @@
     <ClCompile Include="..\hardware\hw_md2load.c" />
     <ClCompile Include="..\hardware\hw_md3load.c" />
     <ClCompile Include="..\hardware\hw_model.c" />
-    <ClCompile Include="..\hardware\hw_trick.c" />
     <ClCompile Include="..\hardware\r_opengl\r_opengl.c" />
     <ClCompile Include="..\hardware\u_list.c" />
     <ClCompile Include="..\hu_stuff.c" />
diff --git a/src/sdl/Srb2SDL-vc10.vcxproj.filters b/src/sdl/Srb2SDL-vc10.vcxproj.filters
index 2f0aec7ca3851b6bf1f1760feafec1d50a9d506d..e49074d3becad90724f0a8f2f3209d69aa28af1d 100644
--- a/src/sdl/Srb2SDL-vc10.vcxproj.filters
+++ b/src/sdl/Srb2SDL-vc10.vcxproj.filters
@@ -672,9 +672,6 @@
     <ClCompile Include="..\hardware\hw_model.c">
       <Filter>Hw_Hardware</Filter>
     </ClCompile>
-    <ClCompile Include="..\hardware\hw_trick.c">
-      <Filter>Hw_Hardware</Filter>
-    </ClCompile>
     <ClCompile Include="..\hardware\u_list.c">
       <Filter>Hw_Hardware</Filter>
     </ClCompile>
diff --git a/src/sdl/Srb2SDL-vc9.vcproj b/src/sdl/Srb2SDL-vc9.vcproj
index 9ef4301cc2b0bf605e7440086b89c79fba54b663..39184f4094882786baeede4c9b0763db684dd026 100644
--- a/src/sdl/Srb2SDL-vc9.vcproj
+++ b/src/sdl/Srb2SDL-vc9.vcproj
@@ -2550,46 +2550,6 @@
 				RelativePath="..\hardware\hw_md2.h"
 				>
 			</File>
-			<File
-				RelativePath="..\hardware\hw_trick.c"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Debug|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-			</File>
 			<File
 				RelativePath="..\hardware\hws_data.h"
 				>
diff --git a/src/sdl/Srb2SDL.dsp b/src/sdl/Srb2SDL.dsp
index 879113ca2f0d7c6f8a71e7e709303224046cb91f..435820cb050ca1cf0e1778e94234e4950bf35ac5 100644
--- a/src/sdl/Srb2SDL.dsp
+++ b/src/sdl/Srb2SDL.dsp
@@ -7,19 +7,19 @@
 CFG=Srb2SDL - Win32 Debug
 !MESSAGE This is not a valid makefile. To build this project using NMAKE,
 !MESSAGE use the Export Makefile command and run
-!MESSAGE 
+!MESSAGE
 !MESSAGE NMAKE /f "Srb2SDL.mak".
-!MESSAGE 
+!MESSAGE
 !MESSAGE You can specify a configuration when running NMAKE
 !MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
+!MESSAGE
 !MESSAGE NMAKE /f "Srb2SDL.mak" CFG="Srb2SDL - Win32 Debug"
-!MESSAGE 
+!MESSAGE
 !MESSAGE Possible choices for configuration are:
-!MESSAGE 
+!MESSAGE
 !MESSAGE "Srb2SDL - Win32 Release" (based on "Win32 (x86) Console Application")
 !MESSAGE "Srb2SDL - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE 
+!MESSAGE
 
 # Begin Project
 # PROP AllowPerConfigDependencies 0
@@ -85,7 +85,7 @@ LINK32=link.exe
 # ADD LINK32 SDL.lib SDL_mixer.lib user32.lib advapi32.lib ws2_32.lib /nologo /subsystem:console /pdb:"C:\srb2demo2\srb2sdldebug.pdb" /debug /machine:I386 /out:"C:\srb2demo2\srb2sdldebug.exe" /pdbtype:sept
 # SUBTRACT LINK32 /pdb:none
 
-!ENDIF 
+!ENDIF
 
 # Begin Target
 
@@ -213,7 +213,7 @@ SOURCE=.\SDL_main\SDL_win32_main.c
 
 # PROP Exclude_From_Build 1
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # Begin Source File
@@ -274,7 +274,7 @@ InputName=tmap
 
 # End Custom Build
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # Begin Source File
@@ -308,7 +308,7 @@ InputName=tmap_mmx
 
 # End Custom Build
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # Begin Source File
@@ -339,7 +339,7 @@ InputName=tmap_vc
 
 # End Custom Build
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # End Group
@@ -608,10 +608,6 @@ SOURCE=..\hardware\hw_md2.h
 # End Source File
 # Begin Source File
 
-SOURCE=..\hardware\hw_trick.c
-# End Source File
-# Begin Source File
-
 SOURCE=..\hardware\hws_data.h
 # End Source File
 # End Group
diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
index 27e015ef7ca01bfa82727ad7987e62d46d9d5ce0..b24ae2814985d04b3674aaf5afa3c09628dcd78c 100644
--- a/src/sdl/i_system.c
+++ b/src/sdl/i_system.c
@@ -108,7 +108,7 @@ int TimeFunction(int requested_frequency);
 #endif
 #endif
 
-#if (defined (__unix__) && !defined (_MSDOS)) || defined (UNIXCOMMON)
+#if (defined (__unix__) && !defined (_MSDOS)) || (defined (UNIXCOMMON) && !defined(__APPLE__))
 #include <errno.h>
 #include <sys/wait.h>
 #define NEWSIGNALHANDLER
diff --git a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj
index de12201f5dc080390a9accea387021637c75aee5..5ceb0540811715f8ed89c200bf4d3b8b5210bdb3 100644
--- a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj
+++ b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj
@@ -1120,13 +1120,6 @@
 			path = ../../hardware/hw_md2.h;
 			refType = 2;
 		};
-		84177743085A106C000C01D8 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			name = hw_trick.c;
-			path = ../../hardware/hw_trick.c;
-			refType = 2;
-		};
 		84177744085A106C000C01D8 = {
 			fileEncoding = 30;
 			isa = PBXFileReference;
diff --git a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
index 745513eeb3542cbf68d6515c09cb8e6abc56db97..a7d9022f1b4afa9acdfd14a4fc24b0c299569996 100644
--- a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
+++ b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
@@ -19,7 +19,6 @@
 		1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */; };
 		1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6E0B67CC2B00BAD059 /* hw_main.c */; };
 		1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE700B67CC2B00BAD059 /* hw_md2.c */; };
-		1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE720B67CC2B00BAD059 /* hw_trick.c */; };
 		1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */; };
 		1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE900B67CC8400BAD059 /* d_main.c */; };
 		1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE910B67CC8500BAD059 /* d_net.c */; };
@@ -192,7 +191,6 @@
 		1E44AE6F0B67CC2B00BAD059 /* hw_main.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_main.h; path = ../../hardware/hw_main.h; sourceTree = SOURCE_ROOT; };
 		1E44AE700B67CC2B00BAD059 /* hw_md2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_md2.c; path = ../../hardware/hw_md2.c; sourceTree = SOURCE_ROOT; };
 		1E44AE710B67CC2B00BAD059 /* hw_md2.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_md2.h; path = ../../hardware/hw_md2.h; sourceTree = SOURCE_ROOT; };
-		1E44AE720B67CC2B00BAD059 /* hw_trick.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_trick.c; path = ../../hardware/hw_trick.c; sourceTree = SOURCE_ROOT; };
 		1E44AE730B67CC2B00BAD059 /* hws_data.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hws_data.h; path = ../../hardware/hws_data.h; sourceTree = SOURCE_ROOT; };
 		1E44AE8A0B67CC6000BAD059 /* asm_defs.inc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.pascal; name = asm_defs.inc; path = ../../asm_defs.inc; sourceTree = SOURCE_ROOT; };
 		1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_clisrv.c; path = ../../d_clisrv.c; sourceTree = SOURCE_ROOT; };
@@ -546,7 +544,6 @@
 				1E44AE6F0B67CC2B00BAD059 /* hw_main.h */,
 				1E44AE700B67CC2B00BAD059 /* hw_md2.c */,
 				1E44AE710B67CC2B00BAD059 /* hw_md2.h */,
-				1E44AE720B67CC2B00BAD059 /* hw_trick.c */,
 				1E44AE730B67CC2B00BAD059 /* hws_data.h */,
 			);
 			name = Hw_Hardware;
@@ -1080,7 +1077,6 @@
 				1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */,
 				1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */,
 				1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */,
-				1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */,
 				1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */,
 				1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */,
 				1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */,
@@ -1219,7 +1215,7 @@
 		C01FCF4B08A954540054247B /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				CURRENT_PROJECT_VERSION = 2.2.4;
+				CURRENT_PROJECT_VERSION = 2.2.5;
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"$(inherited)",
 					NORMALSRB2,
@@ -1231,7 +1227,7 @@
 		C01FCF4C08A954540054247B /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				CURRENT_PROJECT_VERSION = 2.2.4;
+				CURRENT_PROJECT_VERSION = 2.2.5;
 				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_PREPROCESSOR_DEFINITIONS = (
diff --git a/src/win32/Srb2win-vc10.vcxproj b/src/win32/Srb2win-vc10.vcxproj
index 387d65da9074249929ac24044d38942d2cd26f04..5fe723f37b85001b708caf560d1ae2def0a2e682 100644
--- a/src/win32/Srb2win-vc10.vcxproj
+++ b/src/win32/Srb2win-vc10.vcxproj
@@ -234,7 +234,6 @@
     <ClCompile Include="..\hardware\hw_md2load.c" />
     <ClCompile Include="..\hardware\hw_md3load.c" />
     <ClCompile Include="..\hardware\hw_model.c" />
-    <ClCompile Include="..\hardware\hw_trick.c" />
     <ClCompile Include="..\hardware\u_list.c" />
     <ClCompile Include="..\hu_stuff.c" />
     <ClCompile Include="..\info.c" />
diff --git a/src/win32/Srb2win-vc10.vcxproj.filters b/src/win32/Srb2win-vc10.vcxproj.filters
index 2f380c47343f8a15be0f02393970086af4b74b40..7b96bf16b11966134e93647a4a15754d537e21ba 100644
--- a/src/win32/Srb2win-vc10.vcxproj.filters
+++ b/src/win32/Srb2win-vc10.vcxproj.filters
@@ -108,9 +108,6 @@
     <ClCompile Include="..\hardware\hw_md2.c">
       <Filter>Hw_Hardware</Filter>
     </ClCompile>
-    <ClCompile Include="..\hardware\hw_trick.c">
-      <Filter>Hw_Hardware</Filter>
-    </ClCompile>
     <ClCompile Include="..\hardware\hw3sound.c">
       <Filter>Hw_Hardware</Filter>
     </ClCompile>
diff --git a/src/win32/Srb2win-vc9.vcproj b/src/win32/Srb2win-vc9.vcproj
index 4c17bb6f74bec52209d79ac5fc03854f674e5438..b3ba54c10a63e2cbf864c349370cb448b6e8a7fb 100644
--- a/src/win32/Srb2win-vc9.vcproj
+++ b/src/win32/Srb2win-vc9.vcproj
@@ -2291,46 +2291,6 @@
 				RelativePath="..\hardware\hw_md2.h"
 				>
 			</File>
-			<File
-				RelativePath="..\hardware\hw_trick.c"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Debug|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions=""
-					/>
-				</FileConfiguration>
-			</File>
 			<File
 				RelativePath="..\hardware\hws_data.h"
 				>
diff --git a/src/win32/Srb2win.dsp b/src/win32/Srb2win.dsp
index 501bd26b804c8abda66084cf93b78c8ed0618fdd..d87230a39010f39f427ce4d1b055456918fb50bc 100644
--- a/src/win32/Srb2win.dsp
+++ b/src/win32/Srb2win.dsp
@@ -7,19 +7,19 @@
 CFG=Srb2win - Win32 Debug
 !MESSAGE This is not a valid makefile. To build this project using NMAKE,
 !MESSAGE use the Export Makefile command and run
-!MESSAGE 
+!MESSAGE
 !MESSAGE NMAKE /f "Srb2win.mak".
-!MESSAGE 
+!MESSAGE
 !MESSAGE You can specify a configuration when running NMAKE
 !MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
+!MESSAGE
 !MESSAGE NMAKE /f "Srb2win.mak" CFG="Srb2win - Win32 Debug"
-!MESSAGE 
+!MESSAGE
 !MESSAGE Possible choices for configuration are:
-!MESSAGE 
+!MESSAGE
 !MESSAGE "Srb2win - Win32 Release" (based on "Win32 (x86) Application")
 !MESSAGE "Srb2win - Win32 Debug" (based on "Win32 (x86) Application")
-!MESSAGE 
+!MESSAGE
 
 # Begin Project
 # PROP AllowPerConfigDependencies 0
@@ -84,7 +84,7 @@ LINK32=link.exe
 # ADD LINK32 dxguid.lib user32.lib gdi32.lib winmm.lib advapi32.lib ws2_32.lib dinput.lib /nologo /subsystem:windows /profile /debug /machine:I386 /out:"C:\srb2demo2\srb2debug.exe"
 # SUBTRACT LINK32 /nodefaultlib
 
-!ENDIF 
+!ENDIF
 
 # Begin Target
 
@@ -148,7 +148,7 @@ SOURCE=.\Srb2win.rc
 
 !ELSEIF  "$(CFG)" == "Srb2win - Win32 Debug"
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # Begin Source File
@@ -233,7 +233,7 @@ InputName=tmap
 
 # End Custom Build
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # Begin Source File
@@ -266,7 +266,7 @@ InputName=tmap_mmx
 
 # End Custom Build
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # Begin Source File
@@ -298,7 +298,7 @@ InputName=tmap_vc
 
 # End Custom Build
 
-!ENDIF 
+!ENDIF
 
 # End Source File
 # End Group
@@ -567,10 +567,6 @@ SOURCE=..\hardware\hw_md2.h
 # End Source File
 # Begin Source File
 
-SOURCE=..\hardware\hw_trick.c
-# End Source File
-# Begin Source File
-
 SOURCE=..\hardware\hws_data.h
 # End Source File
 # End Group
diff --git a/src/win32/Srb2win.rc b/src/win32/Srb2win.rc
index d7e3383b057ad301a86464edda29f8a4bfd63cc8..c6ec8dff325de2e9396220f4bd978e5c617d452f 100644
--- a/src/win32/Srb2win.rc
+++ b/src/win32/Srb2win.rc
@@ -66,8 +66,8 @@ END
 #include "../doomdef.h" // Needed for version string
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,2,0,0
- PRODUCTVERSION 2,2,0,0
+ FILEVERSION 2,2,5,0
+ PRODUCTVERSION 2,2,5,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L