diff --git a/inc/dd.h b/inc/dd.h
index dff2b44..4d67447 100644
--- a/inc/dd.h
+++ b/inc/dd.h
@@ -22,6 +22,10 @@ HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpd
 HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB);
 HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter);
 
+#define FIX_CHILDS_DISABLED 0
+#define FIX_CHILDS_DETECT 1
+#define FIX_CHILDS_DETECT_PAINT 2
+
 #define RESLIST_NORMAL 0
 #define RESLIST_MINI 1
 #define RESLIST_FULL 2
@@ -117,7 +121,7 @@ typedef struct CNCDDRAW
     BOOL resizable;
     BOOL nonexclusive;
     BOOL fixpitch;
-    BOOL fixchildwindows;
+    int fixchilds;
     BOOL fixwndprochook;
     BOOL d3d9linear;
     BOOL gdilinear;
diff --git a/src/config.c b/src/config.c
index efea4a8..fa96347 100644
--- a/src/config.c
+++ b/src/config.c
@@ -49,7 +49,7 @@ void cfg_load()
     g_ddraw->resizable = cfg_get_bool("resizable", TRUE);
     g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE);
     g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE);
-    g_ddraw->fixchildwindows = cfg_get_bool("fixchildwindows", TRUE);
+    g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT);
     g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE);
     g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE);
     g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE);
@@ -282,7 +282,7 @@ static void cfg_create_ini()
             "; Should the window be resizable by the user in windowed mode?\n"
             "resizable=true\n"
             "\n"
-            "; Enable linear (D3DTEXF_LINEAR) upscaling filter for the direct3d9 renderer (16 bit color depth games only)\n"
+            "; Enable linear (D3DTEXF_LINEAR) upscaling filter for the direct3d9 renderer\n"
             "d3d9linear=true\n"
             "\n"
             "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n"
@@ -329,6 +329,10 @@ static void cfg_create_ini()
             "; Note: Set this to 2 if your chosen resolution is not working, set to 1 if the game is crashing\n"
             "resolutions=0\n"
             "\n"
+            "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint\n"
+            "; Note: Disables upscaling if a child window was detected\n"
+            "fixchilds=2\n"
+            "\n"
             "\n"
             "\n"
             "; ### Game specific settings ###\n"
@@ -641,7 +645,7 @@ static void cfg_create_ini()
             "\n"
             "; Deadlock 2\n"
             "[DEADLOCK]\n"
-            "fixchildwindows=false\n"
+            "fixchilds=0\n"
             "adjmouse=false\n"
             "maintas=false\n"
             "boxing=false\n"
@@ -869,7 +873,7 @@ static void cfg_create_ini()
             "nonexclusive=true\n"
             "maxgameticks=60\n"
             "adjmouse=true\n"
-            "fixchildwindows=false\n"
+            "fixchilds=1\n"
             "maintas=false\n"
             "boxing=false\n"
             "\n"
diff --git a/src/render_d3d9.c b/src/render_d3d9.c
index 05c0290..9e93450 100644
--- a/src/render_d3d9.c
+++ b/src/render_d3d9.c
@@ -421,22 +421,25 @@ DWORD WINAPI d3d9_render_main(void)
                 IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
             }
 
-            g_ddraw->child_window_exists = FALSE;
-            EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
-
-            if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
+            if (g_ddraw->fixchilds)
             {
-                if (g_ddraw->child_window_exists)
-                {
-                    IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
+                g_ddraw->child_window_exists = FALSE;
+                EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
 
-                    if (!needs_update && d3d9_update_vertices(FALSE, FALSE))
-                        needs_update = TRUE;
-                }
-                else if (needs_update)
+                if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
                 {
-                    if (d3d9_update_vertices(FALSE, TRUE))
-                        needs_update = FALSE;
+                    if (g_ddraw->child_window_exists)
+                    {
+                        IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
+
+                        if (!needs_update && d3d9_update_vertices(FALSE, FALSE))
+                            needs_update = TRUE;
+                    }
+                    else if (needs_update)
+                    {
+                        if (d3d9_update_vertices(FALSE, TRUE))
+                            needs_update = FALSE;
+                    }
                 }
             }
         }
diff --git a/src/render_gdi.c b/src/render_gdi.c
index c216ccc..74528f3 100644
--- a/src/render_gdi.c
+++ b/src/render_gdi.c
@@ -72,8 +72,11 @@ DWORD WINAPI gdi_render_main(void)
             if (g_ddraw->vhack)
                 InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack);
 
-            g_ddraw->child_window_exists = FALSE;
-            EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
+            if (g_ddraw->fixchilds)
+            {
+                g_ddraw->child_window_exists = FALSE;
+                EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
+            }
 
             if (g_ddraw->primary->palette)
             {
diff --git a/src/render_ogl.c b/src/render_ogl.c
index b25801c..ad2c017 100644
--- a/src/render_ogl.c
+++ b/src/render_ogl.c
@@ -664,28 +664,31 @@ static void ogl_render()
                     g_ogl.use_opengl = FALSE;
             }
 
-            g_ddraw->child_window_exists = FALSE;
-            EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
-
-            if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
+            if (g_ddraw->fixchilds)
             {
-                if (g_ddraw->child_window_exists)
-                {
-                    glClear(GL_COLOR_BUFFER_BIT);
+                g_ddraw->child_window_exists = FALSE;
+                EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
 
-                    if (!needs_update)
+                if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
+                {
+                    if (g_ddraw->child_window_exists)
                     {
-                        glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height);
-                        needs_update = TRUE;
-                    }
-                }
-                else if (needs_update)
-                {
-                    glViewport(
-                        g_ddraw->render.viewport.x, g_ddraw->render.viewport.y,
-                        g_ddraw->render.viewport.width, g_ddraw->render.viewport.height);
+                        glClear(GL_COLOR_BUFFER_BIT);
 
-                    needs_update = FALSE;
+                        if (!needs_update)
+                        {
+                            glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height);
+                            needs_update = TRUE;
+                        }
+                    }
+                    else if (needs_update)
+                    {
+                        glViewport(
+                            g_ddraw->render.viewport.x, g_ddraw->render.viewport.y,
+                            g_ddraw->render.viewport.width, g_ddraw->render.viewport.height);
+
+                        needs_update = FALSE;
+                    }
                 }
             }
         }
diff --git a/src/utils.c b/src/utils.c
index 6c808fe..d136f67 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -374,7 +374,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
     {
         g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE;
 
-        if (g_ddraw->fixchildwindows)
+        if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_PAINT)
         {
             HDC dst_dc = GetDC(hwnd);
             HDC src_dc;