diff --git a/source/blood/src/blood.cpp b/source/blood/src/blood.cpp
index c1c66dcba..b256dfcb4 100644
--- a/source/blood/src/blood.cpp
+++ b/source/blood/src/blood.cpp
@@ -357,18 +357,6 @@ int gHealthTemp[kMaxPlayers];
 vec3_t startpos;
 int16_t startang, startsectnum;
 
-static void drawLoadingScreen(void)
-{
-    char buffer[80];
-    if (gGameOptions.nGameType == 0)
-    {
-        strcpy(buffer, GStrings("TXTB_LLEVEL"));
-    }
-    else
-        strcpy(buffer, GStrings(FStringf("TXTB_NETGT%d", gGameOptions.nGameType)));
-    viewLoadingScreen(2049, buffer, levelGetTitle(), NULL);
-}
-
 void StartLevel(GAMEOPTIONS *gameOptions)
 {
 	STAT_Update(0);
diff --git a/source/blood/src/d_menu.cpp b/source/blood/src/d_menu.cpp
index 272c3b5c8..fde52516f 100644
--- a/source/blood/src/d_menu.cpp
+++ b/source/blood/src/d_menu.cpp
@@ -263,7 +263,8 @@ FSavegameInfo GameInterface::GetSaveSig()
 	return { SAVESIG_BLD, MINSAVEVER_BLD, SAVEVER_BLD };
 }
 
-void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text)
+// This also gets used by the summary and the loading screen
+void DrawMenuCaption(const char* text)
 {
 	double scalex = 1.; // Expand the box if the text is longer
 	int width = BigFont->StringWidth(text);
@@ -274,6 +275,11 @@ void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text)
 	DrawText(twod, BigFont, CR_UNDEFINED, 160 - width/2, 20 - tileHeight(4193) / 2, text, DTA_FullscreenScale, 3, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200, TAG_DONE);
 }
 
+void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text)
+{
+	Blood::DrawMenuCaption(text);
+}
+
 void GameInterface::DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool bg)
 {
 	if (text)
diff --git a/source/blood/src/endgame.cpp b/source/blood/src/endgame.cpp
index 3f17e9c6b..d7679d99f 100644
--- a/source/blood/src/endgame.cpp
+++ b/source/blood/src/endgame.cpp
@@ -45,6 +45,50 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 BEGIN_BLD_NS
 
+enum
+{
+    kLoadScreenCRC = -2051908571,
+    kLoadScreenWideBackWidth = 256,
+    kLoadScreenWideSideWidth = 128,
+
+};
+
+
+static int bLoadScreenCrcMatch = -1;
+
+static void drawTextScreenBackground(void)
+{
+    if (bLoadScreenCrcMatch == -1) bLoadScreenCrcMatch = tileGetCRC32(kLoadScreen) == kLoadScreenCRC;
+
+    if ((blood_globalflags & BLOOD_FORCE_WIDELOADSCREEN) || (bLoadScreenCrcMatch))
+    {
+        if (yxaspect >= 65536)
+        {
+            DrawTexture(twod, tileGetTexture(kLoadScreen), 0, 0, DTA_FullscreenEx, 3, TAG_DONE);
+        }
+        else
+        {
+            int width = scale(xdim, 240, ydim);
+            int nCount = (width + kLoadScreenWideBackWidth - 1) / kLoadScreenWideBackWidth;
+            for (int i = 0; i < nCount; i++)
+            {
+                DrawTexture(twod, tileGetTexture(kLoadScreenWideBack), (i * kLoadScreenWideBackWidth), 0,
+                    DTA_VirtualWidth, width, DTA_VirtualHeight, 200, DTA_KeepRatio, true, TAG_DONE);
+            }
+            DrawTexture(twod, tileGetTexture(kLoadScreenWideLeft), 0, 0, DTA_VirtualWidth, width, DTA_VirtualHeight, 200, DTA_KeepRatio, true, DTA_TopLeft, true, TAG_DONE);
+            DrawTexture(twod, tileGetTexture(kLoadScreenWideRight), width - tileWidth(kLoadScreenWideRight), 0, DTA_TopLeft, true,
+                DTA_VirtualWidth, width, DTA_VirtualHeight, 200, DTA_KeepRatio, true, TAG_DONE);
+            DrawTexture(twod, tileGetTexture(kLoadScreenWideMiddle), (width - tileWidth(kLoadScreenWideMiddle))/2, 0, DTA_TopLeft, true,
+                DTA_VirtualWidth, width, DTA_VirtualHeight, 200, DTA_KeepRatio, true, TAG_DONE);
+        }
+    }
+    else
+    {
+        DrawTexture(twod, tileGetTexture(kLoadScreen), 0, 0, DTA_FullscreenEx, 3, TAG_DONE);
+    }
+}
+
+
 CEndGameMgr::CEndGameMgr()
 {
     at0 = 0;
@@ -52,14 +96,13 @@ CEndGameMgr::CEndGameMgr()
 
 void CEndGameMgr::Draw(void)
 {
-    viewLoadingScreenWide();
+    drawTextScreenBackground();
     int nHeight;
     viewGetFontInfo(1, NULL, NULL, &nHeight);
-	DrawTexture(twod, tileGetTexture(2038, true), 160, 20, DTA_FullscreenScale, 3, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200, DTA_CenterOffsetRel, true, TAG_DONE);
     int nY = 20 - nHeight / 2;
     if (gGameOptions.nGameType == 0)
     {
-        viewDrawText(1, GStrings("TXTB_LEVELSTATS"), 160, nY, -128, 0, 1, 0);
+        DrawMenuCaption(GStrings("TXTB_LEVELSTATS"));
         if (CCheatMgr::m_bPlayerCheated)
         {
             viewDrawText(3, GStrings("TXTB_CHEATED"), 160, 32, -128, 0, 1, 1);
@@ -69,7 +112,7 @@ void CEndGameMgr::Draw(void)
     }
     else
     {
-        viewDrawText(1, GStrings("TXTB_FRAGSTATS"), 160, nY, -128, 0, 1, 0);
+        DrawMenuCaption(GStrings("TXTB_FRAGSTATS"));
         gKillMgr.Draw();
     }
     if (/*dword_28E3D4 != 1 && */((int)totalclock&32))
@@ -273,4 +316,37 @@ void EndGameLoadSaveConstruct(void)
     myLoadSave = new EndGameLoadSave();
 }
 
+
+class DBloodLoadScreen : public DScreenJob
+{
+    std::function<int(void)> callback;
+    const char *pzLoadingScreenText1;
+    MapRecord* rec;
+
+public:
+    DBloodLoadScreen(const char* caption, MapRecord* maprec, std::function<int(void)> callback_) : DScreenJob(fadein | fadeout), callback(callback_), rec(maprec)
+    {
+        if (gGameOptions.nGameType == 0) pzLoadingScreenText1 = GStrings("TXTB_LLEVEL");
+        else pzLoadingScreenText1 = GStrings(FStringf("TXTB_NETGT%d", gGameOptions.nGameType));
+    }
+
+    int Frame(uint64_t clock, bool skiprequest)
+    {
+        twod->ClearScreen();
+        drawTextScreenBackground();
+        DrawMenuCaption(pzLoadingScreenText1);
+        viewDrawText(1, rec->DisplayName(), 160, 50, -128, 0, 1, 1);
+        viewDrawText(3, GStrings("TXTB_PLSWAIT"), 160, 134, -128, 0, 1, 1);
+
+        // Initiate the level load once the page has been faded in completely.
+        if (callback && GetFadeState() == visible)
+        {
+            callback();
+            callback = nullptr;
+        }
+        if (clock > 5'000'000'000) return 0;	// make sure the screen stays long enough to be seen.
+        return skiprequest ? -1 : 1;
+    }
+};
+
 END_BLD_NS
diff --git a/source/blood/src/inifile.cpp b/source/blood/src/inifile.cpp
index e50097167..2941ae690 100644
--- a/source/blood/src/inifile.cpp
+++ b/source/blood/src/inifile.cpp
@@ -139,72 +139,6 @@ void IniFile::Load()
     }
     else
         curNode->next = &head;
-#if 0
-    if (fp)
-    {
-        while (fgets(buffer, sizeof(buffer), fp) != NULL)
-        {
-            char *ch = strchr(buffer, '\n');
-            if (ch != NULL) {
-                ch[0] = '\0';
-            }
-
-            // do the same for carriage return?
-            ch = strchr(buffer, '\r');
-            if (ch != NULL) {
-                ch[0] = '\0';
-            }
-
-            char *pBuffer = buffer;
-
-            // remove whitespace from buffer
-            while (isspace(*pBuffer)) {
-                pBuffer++;
-            }
-
-            curNode->next = (FNODE*)malloc(strlen(pBuffer) + sizeof(FNODE));
-            dassert(curNode->next != NULL);
-
-            anotherNode = curNode;
-            curNode = curNode->next;
-
-
-            strcpy(curNode->name, pBuffer);
-
-            /*
-                check for:
-                ; - comment line. continue and grab a new line  (59)
-                [ - start of section marker                     (91)
-                ] - end of section marker                       (93)
-                = - key and value seperator                     (61)
-            */
-
-            switch (*pBuffer)
-            {
-            case 0:
-            case ';': // comment line
-                break;
-            case '[':
-                if (!strchr(pBuffer, ']'))
-                {
-                    free(curNode);
-                    curNode = anotherNode;
-                }
-                break;
-            default:
-
-                if (strchr(pBuffer, '=') <= pBuffer) {
-                    free(curNode);
-                    curNode = anotherNode;
-                }
-                break;
-            }
-        }
-        fclose(fp);
-    }
-
-    curNode->next = &head;
-#endif
 }
 
 void IniFile::Save(void)
diff --git a/source/blood/src/misc.h b/source/blood/src/misc.h
index eb277d854..52e012013 100644
--- a/source/blood/src/misc.h
+++ b/source/blood/src/misc.h
@@ -123,5 +123,6 @@ void tilePrecacheTile(int nTile, int nType = 1);
 char tileGetSurfType(int hit);
 
 void scrLoadPalette(void);
+void DrawMenuCaption(const char* text);
 
 END_BLD_NS
diff --git a/source/blood/src/network.cpp b/source/blood/src/network.cpp
index 9e46c3d49..e57c990a3 100644
--- a/source/blood/src/network.cpp
+++ b/source/blood/src/network.cpp
@@ -930,13 +930,6 @@ void netInitialize(bool bConsole)
 
         numplayers = 1;
         // Wait for clients
-        if (!bConsole)
-        {
-            char buffer[128];
-            sprintf(buffer, "Waiting for players (%i\\%i)", numplayers, gNetPlayers);
-            viewLoadingScreen(2518, "Network Game", NULL, buffer);
-            videoNextPage();
-        }
         while (numplayers < gNetPlayers)
         {
             handleevents();
@@ -974,13 +967,6 @@ void netInitialize(bool bConsole)
                             break;
                         }
                     }
-                    if (!bConsole)
-                    {
-                        char buffer[128];
-                        sprintf(buffer, "Waiting for players (%i\\%i)", numplayers, gNetPlayers);
-                        viewLoadingScreen(2518, "Network Game", NULL, buffer);
-                        videoNextPage();
-                    }
                     break;
                 }
                 case ENET_EVENT_TYPE_DISCONNECT:
@@ -1006,13 +992,6 @@ void netInitialize(bool bConsole)
                             }
                         }
                     }
-                    if (!bConsole)
-                    {
-                        char buffer[128];
-                        sprintf(buffer, "Waiting for players (%i\\%i)", numplayers, gNetPlayers);
-                        viewLoadingScreen(2518, "Network Game", NULL, buffer);
-                        videoNextPage();
-                    }
                     break;
                 }
                 default:
@@ -1070,11 +1049,6 @@ void netInitialize(bool bConsole)
         ENetEvent event;
         sprintf(buffer, "Connecting to %s:%u", gNetAddress, gNetPort);
         Printf("%s\n", buffer);
-        if (!bConsole)
-        {
-            viewLoadingScreen(2518, "Network Game", NULL, buffer);
-            videoNextPage();
-        }
         gNetENetClient = enet_host_create(NULL, 1, BLOOD_ENET_CHANNEL_MAX, 0, 0);
         enet_address_set_host(&gNetENetAddress, gNetAddress);
         gNetENetAddress.port = gNetPort;
@@ -1095,11 +1069,6 @@ void netInitialize(bool bConsole)
             return;
         }
         bool bWaitServer = true;
-        if (!bConsole)
-        {
-            viewLoadingScreen(2518, "Network Game", NULL, "Waiting for server response");
-            videoNextPage();
-        }
         while (bWaitServer)
         {
             handleevents();
diff --git a/source/blood/src/sbar.cpp b/source/blood/src/sbar.cpp
index 5b19bc087..d4793751f 100644
--- a/source/blood/src/sbar.cpp
+++ b/source/blood/src/sbar.cpp
@@ -287,13 +287,13 @@ private:
     void drawInventory(PLAYER* pPlayer, int x, int y)
     {
         int packs[5];
-        //if (pPlayer->packItemTime)
+        if (pPlayer->packItemTime)
         {
             int nPacks = 0;
             int width = 0;
             for (int i = 0; i < 5; i++)
             {
-                //if (pPlayer->packSlots[i].curAmount)
+                if (pPlayer->packSlots[i].curAmount)
                 {
                     packs[nPacks++] = i;
                     width += tilesiz[gPackIcons[i]].x + 1;
@@ -772,7 +772,6 @@ private:
         BeginHUD(320, 200, 1);
         viewDrawPowerUps(pPlayer);
 
-        viewDrawCtfHud(arg);
         if (gGameOptions.nGameType >= 1)
         {
             if (gGameOptions.nGameType == 3)
diff --git a/source/blood/src/view.cpp b/source/blood/src/view.cpp
index 6f2066324..dcfe4def5 100644
--- a/source/blood/src/view.cpp
+++ b/source/blood/src/view.cpp
@@ -125,7 +125,6 @@ int xscale, yscale, xstep, ystep;
 int gScreenTilt;
 
 
-bool bLoadScreenCrcMatch = false;
 
 void RotateYZ(int *pX, int *pY, int *pZ, int ang)
 {
@@ -1156,7 +1155,6 @@ void viewInit(void)
         dword_172CE0[i][2] = mulscale16(wrand(), 2048);
     }
     gViewMap.sub_25C38(0, 0, gZoom, 0, gFollowMap);
-    bLoadScreenCrcMatch = tileGetCRC32(kLoadScreen) == kLoadScreenCRC;
 }
 
 void viewResizeView(int size)
@@ -2896,90 +2894,6 @@ bool GameInterface::GenerateSavePic()
 }
 
 
-
-int nLoadingScreenTile;
-char pzLoadingScreenText1[256], pzLoadingScreenText2[256], pzLoadingScreenText3[256];
-
-void viewLoadingScreenWide(void)
-{
-    if ((blood_globalflags&BLOOD_FORCE_WIDELOADSCREEN) || (bLoadScreenCrcMatch))
-    {
-        if (yxaspect >= 65536)
-        {
-            rotatesprite(160<<16, 100<<16, 65536, 0, kLoadScreen, 0, 0, 1024+64+8+2, 0, 0, xdim-1, ydim-1);
-        }
-        else
-        {
-            int width = scale(xdim, 240, ydim);
-            int nCount = (width+kLoadScreenWideBackWidth-1)/kLoadScreenWideBackWidth;
-            for (int i = 0; i < nCount; i++)
-            {
-                rotatesprite_fs((i*kLoadScreenWideBackWidth)<<16, 0, 65536, 0, kLoadScreenWideBack, 0, 0, 256+64+16+8+2);
-            }
-            rotatesprite_fs((kLoadScreenWideSideWidth>>1)<<16, 200<<15, 65536, 0, kLoadScreenWideLeft, 0, 0, 256+8+2);
-            rotatesprite_fs((320-(kLoadScreenWideSideWidth>>1))<<16, 200<<15, 65536, 0, kLoadScreenWideRight, 0, 0, 512+8+2);
-            rotatesprite_fs(320<<15, 200<<15, 65536, 0, kLoadScreenWideMiddle, 0, 0, 8+2);
-        }
-    }
-    else
-        rotatesprite(160<<16, 100<<16, 65536, 0, kLoadScreen, 0, 0, 64+8+2, 0, 0, xdim-1, ydim-1);
-}
-
-void viewLoadingScreenUpdate(const char *pzText4, int nPercent)
-{
-    int vc;
-    viewGetFontInfo(1, NULL, NULL, &vc);
-    twod->ClearScreen();
-    if (nLoadingScreenTile == kLoadScreen)
-        viewLoadingScreenWide();
-    else if (nLoadingScreenTile)
-    {
-        rotatesprite(160<<16, 100<<16, 65536, 0, nLoadingScreenTile, 0, 0, 74, 0, 0, xdim-1, ydim-1);
-    }
-    if (pzLoadingScreenText1[0])
-    {
-        rotatesprite(160<<16, 20<<16, 65536, 0, 2038, -128, 0, 78, 0, 0, xdim-1, ydim-1);
-        viewDrawText(1, pzLoadingScreenText1, 160, 20-vc/2, -128, 0, 1, 1);
-    }
-    if (pzLoadingScreenText2[0])
-    {
-        viewDrawText(1, pzLoadingScreenText2, 160, 50, -128, 0, 1, 1);
-    }
-    if (pzLoadingScreenText3[0])
-    {
-        viewDrawText(1, pzLoadingScreenText3, 160, 70, -128, 0, 1, 1);
-    }
-    if (pzText4)
-    {
-        viewDrawText(3, pzText4, 160, 124, -128, 0, 1, 1);
-    }
-
-#if 0
-    if (nPercent != -1)
-        TileHGauge(2260, 86, 110, nPercent, 100, 0, 131072);
-#endif
-
-    viewDrawText(3, GStrings("TXTB_PLSWAIT"), 160, 134, -128, 0, 1, 1);
-}
-
-void viewLoadingScreen(int nTile, const char *pText, const char *pText2, const char *pText3)
-{
-    nLoadingScreenTile = nTile;
-    if (pText)
-        strncpy(pzLoadingScreenText1, pText, 256);
-    else
-        pzLoadingScreenText1[0] = 0;
-    if (pText2)
-        strncpy(pzLoadingScreenText2, pText2, 256);
-    else
-        pzLoadingScreenText2[0] = 0;
-    if (pText3)
-        strncpy(pzLoadingScreenText3, pText3, 256);
-    else
-        pzLoadingScreenText3[0] = 0;
-    viewLoadingScreenUpdate(NULL, -1);
-}
-
 #define LOW_FPS 60
 #define SLOW_FRAME_TIME 20
 
diff --git a/source/blood/src/view.h b/source/blood/src/view.h
index 275a03869..8dd24c1c5 100644
--- a/source/blood/src/view.h
+++ b/source/blood/src/view.h
@@ -67,9 +67,6 @@ enum
 {
     kCrosshairTile = 2319,
     kLoadScreen = 2049,
-    kLoadScreenCRC = -2051908571,
-    kLoadScreenWideBackWidth = 256,
-    kLoadScreenWideSideWidth = 128,
     kLoadScreenWideBack = 9216,
     kLoadScreenWideLeft = 9217,
     kLoadScreenWideRight = 9218,
@@ -141,9 +138,6 @@ void viewSetErrorMessage(const char *pMessage);
 void DoLensEffect(void);
 void UpdateDacs(int nPalette, bool bNoTint = false);
 void viewDrawScreen(bool sceneonly = false);
-void viewLoadingScreenWide(void);
-void viewLoadingScreenUpdate(const char *pzText4 = NULL, int nPercent = -1);
-void viewLoadingScreen(int nTile, const char *pText, const char *pText2, const char *pText3);
 void viewUpdateDelirium(void);
 void viewUpdateShake(void);
 void viewSetSystemMessage(const char* pMessage, ...);