diff --git a/.circleci/config.yml b/.circleci/config.yml
index 67a3b66b7f759be472dd6c13b93712d2aeef0388..711be39d76fdfb80c4680bbae19c8dd135af0afb 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -21,6 +21,7 @@ jobs:
       #    CCACHE_COMPRESS: true
       #    WFLAGS: -Wno-unsuffixed-float-constants
       #    GCC48: true
+    resource_class: large
     steps:
       - run:
           name: Add i386 arch
@@ -32,6 +33,12 @@ jobs:
             apt-get -qq -y install dirmngr
             apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0B1702D71499D9C25F986507F240F4449D3B0EC6
             echo "deb http://ppa.launchpad.net/stjr/srb2/ubuntu trusty main" >> /etc/apt/sources.list
+      - run:
+          name: Make APT cache folder
+          command: mkdir -p /root/.cache/apt/archives/partial
+      - run:
+          name: Make APT cache usage by _apt
+          command: chown -Rv _apt:root /root/.cache/apt/archives/partial
       - run:
           name: Update APT listing
           command: apt-get -qq update
@@ -43,32 +50,37 @@ jobs:
             - v1-SRB2-APT
       - run:
           name: Install SDK
-          command: apt-get -qq -y --no-install-recommends install git build-essential nasm libpng-dev:i386 libsdl2-mixer-dev:i386 libgme-dev:i386 libcurl4-openssl-dev:i386 libopenmpt-dev:i386 gettext ccache wget gcc-multilib upx openssh-client
-
+          command: apt-get -o Dir::Cache="/root/.cache/apt" -qq -y --no-install-recommends install git build-essential nasm libpng-dev:i386 libsdl2-mixer-dev:i386 libgme-dev:i386 libcurl4-openssl-dev:i386 libopenmpt-dev:i386 gettext ccache wget gcc-multilib upx openssh-client
+      - run:
+          name: make md5sum
+          command: find /root/.cache/apt/archives -type f -print0 | sort -z | xargs -r0 md5sum > /root/.cache/apt_archives.md5
       - save_cache:
-          key: v1-SRB2-APT
+          key: v1-SRB2-APT-{{ checksum "/root/.cache/apt_archives.md5" }}
           paths:
-            - /var/cache/apt/archives
+            - /root/.cache/apt
       - checkout
       - run:
           name: Compile without network support
-          command: make -C src LINUX=1 ERRORMODE=1 -k NONET=1
+          command: make -C src LINUX=1 ERRORMODE=1 -k NONET=1 -j4
       - run:
           name: wipe build
           command: make -C src LINUX=1 cleandep
       - run:
           name: rebuild depend
           command: make -C src LINUX=1 clean
+      - run:
+          name: make master depend file
+          command: find make/linux/SDL/deps/ -type f -print0 | sort -z | xargs -r0 cat > make/linux/SDL.deps
       - restore_cache:
           keys:
-            - v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }}
+            - v1-SRB2-{{ .Branch }}-{{ checksum "make/linux/SDL.deps" }}
       - run:
           name: Compile
-          command: make -C src LINUX=1 ERRORMODE=1 -k
+          command: make -C src LINUX=1 ERRORMODE=1 -k -j4
       - store_artifacts:
-          path: /root/SRB2/bin/Linux/Release/
+          path: /root/SRB2/bin/
           destination: bin
       - save_cache:
-          key: v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }}
+          key: v1-SRB2-{{ .Branch }}-{{ checksum "make/linux/SDL.deps" }}
           paths:
             - /root/.ccache
diff --git a/.gitignore b/.gitignore
index 3eca1c57ab5b806d4d71ce09ea228891a2ed9194..cd828dc116957ceda70d6c5b8a2b929b158f1f80 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,4 @@ Win32_LIB_ASM_Release
 /make
 /bin
 /build
+/build.*
diff --git a/src/b_bot.c b/src/b_bot.c
index f1df5abbd445ee14a62135ddfe65934a35432a66..6c1495c72ff55153b819d2241c66ff81b45de8ed 100644
--- a/src/b_bot.c
+++ b/src/b_bot.c
@@ -30,7 +30,7 @@ void B_UpdateBotleader(player_t *player)
 	{
 		if (players[i].bot || players[i].playerstate != PST_LIVE || players[i].spectator || !players[i].mo)
 			continue;
-		
+
 		if (!player->botleader)
 		{
 			player->botleader = &players[i]; // set default
@@ -85,7 +85,7 @@ static void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
 	boolean stalled = (bmom < scale >> 1) && dist > followthres; // Helps to see if the AI is having trouble catching up
 	boolean samepos = (sonic->x == tails->x && sonic->y == tails->y);
 	boolean blocked = bot->blocked;
-	
+
 	if (!samepos)
 		ang = R_PointToAngle2(tails->x, tails->y, sonic->x, sonic->y);
 
@@ -448,10 +448,10 @@ void B_KeysToTiccmd(mobj_t *mo, ticcmd_t *cmd, boolean forward, boolean backward
 			cmd->forwardmove += MAXPLMOVE<<FRACBITS>>16;
 		if (backward)
 			cmd->forwardmove -= MAXPLMOVE<<FRACBITS>>16;
- 		if (left)
+		if (left)
 			cmd->angleturn += 1280;
 		if (right)
-			cmd->angleturn -= 1280; 
+			cmd->angleturn -= 1280;
 		if (strafeleft)
 			cmd->sidemove -= MAXPLMOVE<<FRACBITS>>16;
 		if (straferight)
@@ -486,7 +486,7 @@ boolean B_CheckRespawn(player_t *player)
 	//We don't have a main player to spawn to!
 	if (!player->botleader)
 		return false;
-	
+
 	sonic = player->botleader->mo;
 	// We can't follow Sonic if he's not around!
 	if (!sonic || sonic->health <= 0)
diff --git a/src/blua/liolib.c b/src/blua/liolib.c
index 5eec97fb4b7b4e5e4f47637b34b0444c1750a334..e029650c0ced525f3bfc56fc9863d9816f6ebb63 100644
--- a/src/blua/liolib.c
+++ b/src/blua/liolib.c
@@ -641,4 +641,3 @@ LUALIB_API int luaopen_io (lua_State *L) {
   lua_pop(L, 1);  /* pop environment for default files */
   return 1;
 }
-
diff --git a/src/d_player.h b/src/d_player.h
index 1067c86814e1398c26f67301a8d9680d773a6fe9..42e9c3a82f2b656bbe9d304159f1ab5c0c7f8a69 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -345,7 +345,7 @@ typedef struct botmem_s
 {
 	boolean lastForward;
 	boolean lastBlocked;
-	boolean blocked;	
+	boolean blocked;
 	UINT8 catchup_tics;
 	UINT8 thinkstate;
 } botmem_t;
@@ -568,7 +568,7 @@ typedef struct player_s
 	UINT16 lastbuttons;
 	botmem_t botmem;
 	boolean blocked;
-	
+
 	tic_t jointime; // Timer when player joins game to change skin/color
 	tic_t quittime; // Time elapsed since user disconnected, zero if connected
 #ifdef HWRENDER
diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 44483e19654c45b3223ddba27451a98a60e2cece..aa2f03f6f8958a246737e92cabff0dee82a7e54a 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -3212,7 +3212,7 @@ static void HWR_Subsector(size_t num)
 					                        *rover->topheight,
 					                        *gl_frontsector->lightlist[light].lightlevel,
 					                        rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector,
- 					                        HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent),
+					                        HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent),
 					                        false, *gl_frontsector->lightlist[light].extra_colormap);
 				}
 				else
diff --git a/src/p_saveg.c b/src/p_saveg.c
index c5195a17aea460c568b58a2eeb4e341e97373ccb..ce7353b95af8afaae4e4b14f707b911124a7d9f9 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -203,7 +203,7 @@ static void P_NetArchivePlayers(void)
 		WRITEUINT8(save_p, players[i].botmem.catchup_tics);
 		WRITEUINT8(save_p, players[i].botmem.thinkstate);
 		WRITEUINT8(save_p, players[i].removing);
-		
+
 		WRITEUINT8(save_p, players[i].blocked);
 		WRITEUINT16(save_p, players[i].lastbuttons);
 
@@ -425,7 +425,7 @@ static void P_NetUnArchivePlayers(void)
 		// Bots //
 		//////////
 		players[i].bot = READUINT8(save_p);
-		
+
 		players[i].botmem.lastForward = READUINT8(save_p);
 		players[i].botmem.lastBlocked = READUINT8(save_p);
 		players[i].botmem.catchup_tics = READUINT8(save_p);
@@ -434,7 +434,7 @@ static void P_NetUnArchivePlayers(void)
 
 		players[i].blocked = READUINT8(save_p);
 		players[i].lastbuttons = READUINT16(save_p);
-		
+
 		////////////////////////////
 		// Conveyor Belt Movement //
 		////////////////////////////
diff --git a/src/p_setup.c b/src/p_setup.c
index 90538de0b7f22c5a4f5c02e45dbf5879cb2aad2e..28bfa65a50601617258755b730a62cac3b485607 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -1273,7 +1273,7 @@ static void P_LoadSidedefs(UINT8 *data)
 					sd->midtexture = get_number(process);
 				}
 
- 				sd->text = Z_Malloc(7, PU_LEVEL, NULL);
+				sd->text = Z_Malloc(7, PU_LEVEL, NULL);
 				if (isfrontside && !(msd->toptexture[0] == '-' && msd->toptexture[1] == '\0'))
 				{
 					M_Memcpy(process,msd->toptexture,8);
diff --git a/src/p_user.c b/src/p_user.c
index 49f21494126f1a704fb6eb32c52dc520e8504c91..87809255df9e3180eb86818e183caa1ebafa66b5 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -1,3 +1,4 @@
+
 // SONIC ROBO BLAST 2
 //-----------------------------------------------------------------------------
 // Copyright (C) 1993-1996 by id Software, Inc.
@@ -1514,8 +1515,8 @@ void P_PlayJingle(player_t *player, jingletype_t jingletype)
 	char newmusic[7];
 	strncpy(newmusic, musname, 7);
 #ifdef HAVE_LUA_MUSICPLUS
- 	if(LUAh_MusicJingle(jingletype, newmusic, &musflags, &looping))
- 		return;
+	if(LUAh_MusicJingle(jingletype, newmusic, &musflags, &looping))
+		return;
 #endif
 	newmusic[6] = 0;
 
@@ -1605,7 +1606,7 @@ boolean P_EvaluateMusicStatus(UINT16 status, const char *musname)
 
 		if (result)
 			break;
- 	}
+	}
 
 	return result;
  }
@@ -1662,8 +1663,8 @@ void P_RestoreMusic(player_t *player)
 	else if (!S_RecallMusic(JT_NONE, false)) // go down the stack
 	{
 		CONS_Debug(DBG_BASIC, "Cannot find any music in resume stack!\n");
-	 	S_ChangeMusicEx(mapmusname, mapmusflags, true, mapmusposition, 0, 0);
- 	}
+		S_ChangeMusicEx(mapmusname, mapmusflags, true, mapmusposition, 0, 0);
+	}
 }
 
 //
diff --git a/src/r_skins.c b/src/r_skins.c
index cd53128d2297558c48ed7d79d026d081f0c1b8a1..92fd6cfae29be2e90c7c55a69aa62fdc58511a6f 100644
--- a/src/r_skins.c
+++ b/src/r_skins.c
@@ -236,7 +236,7 @@ boolean R_SkinUsable(INT32 playernum, INT32 skinnum)
 		// Force 2.
 		return true;
 	}
-	
+
 	if (metalrecording && skinnum == 5)
 	{
 		// Force 3.
diff --git a/src/s_sound.c b/src/s_sound.c
index 752eb275ab8c5a0c7baedae1ee5e45ba12ba2609..f28a77a805329a6255ca39008eac36cfc6d88677 100644
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -2259,9 +2259,9 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32
 		return;
 	newmusic[6] = 0;
 
- 	// No Music (empty string)
+	// No Music (empty string)
 	if (newmusic[0] == 0)
- 	{
+	{
 		if (prefadems)
 			I_FadeSong(0, prefadems, &S_StopMusic);
 		else
@@ -2279,7 +2279,7 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32
 	}
 	else if (strnicmp(music_name, newmusic, 6) || (mflags & MUSIC_FORCERESET) ||
 		(midipref != currentmidi && S_PrefAvailable(midipref, newmusic)))
- 	{
+	{
 		CONS_Debug(DBG_DETAILED, "Now playing song %s\n", newmusic);
 
 		S_StopMusic();
@@ -2302,7 +2302,7 @@ void S_ChangeMusicEx(const char *mmusic, UINT16 mflags, boolean looping, UINT32
 	{
 		I_SetSongPosition(position);
 		I_FadeSong(100, fadeinms, NULL);
- 	}
+}
 	else // reset volume to 100 with same music
 	{
 		I_StopFadingSong();
diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c
index 9cec2a552aecfcc80fc9173b5d37c13d8178c5af..6e971a5d8bca59c40e64ace85a8ed1522e64f859 100644
--- a/src/sdl/i_video.c
+++ b/src/sdl/i_video.c
@@ -1,3 +1,4 @@
+
 // Emacs style mode select   -*- C++ -*-
 // SONIC ROBO BLAST 2
 //-----------------------------------------------------------------------------
@@ -1068,7 +1069,7 @@ void I_GetEvent(void)
 				// update the menu
 				if (currentMenu == &OP_JoystickSetDef)
 					M_SetupJoystickMenu(0);
-			 	break;
+				break;
 			case SDL_QUIT:
 				LUA_HookBool(true, HOOK(GameQuit));
 				I_Quit();
diff --git a/tools/masterserver/structure.sql b/tools/masterserver/structure.sql
index 013c223839813b45cc51454ac4031b3444f9eb60..d431419aa96b3ce3c120f32099f65cf4ab402bf5 100644
--- a/tools/masterserver/structure.sql
+++ b/tools/masterserver/structure.sql
@@ -90,7 +90,7 @@ CREATE TABLE `ms_versions` (
   `mod_vstring` varchar(45) NOT NULL DEFAULT 'v1.0',
   `mod_codebase` int(10) unsigned NOT NULL DEFAULT 205,
   `mod_name` varchar(255) NOT NULL DEFAULT 'Default MOD Name',
-  `mod_url` text NOT NULL 
+  `mod_url` text NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 --
@@ -118,4 +118,4 @@ COMMIT;
 
 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
\ No newline at end of file
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;