diff --git a/src/dd.c b/src/dd.c
index 9027306..54ab14c 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -1006,13 +1006,31 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
             }
         }
 
-        if ((!d3d9_active || g_config.nonexclusive) &&
-            ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
+        if (!d3d9_active || g_config.nonexclusive)
         {
-            g_ddraw->render.run = FALSE;
-            g_config.windowed = TRUE;
-            g_config.fullscreen = TRUE;
-            return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags);
+            if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
+            {
+                g_ddraw->render.run = FALSE;
+                g_config.windowed = TRUE;
+                g_config.fullscreen = TRUE;
+                return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags);
+            }
+
+            /*
+                Fix wayland bug:
+                ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed
+            */
+            if (g_ddraw->wine &&
+                (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) ||
+                    g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN)))
+            {
+                ChangeDisplaySettings(NULL, 0);
+
+                g_ddraw->render.run = FALSE;
+                g_config.windowed = TRUE;
+                g_config.fullscreen = TRUE;
+                return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags);
+            }
         }
 
         if (g_ddraw->wine)
diff --git a/src/hook.c b/src/hook.c
index 4aa653d..1d73afe 100644
--- a/src/hook.c
+++ b/src/hook.c
@@ -479,6 +479,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook)
                     BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0;
 
                     if (is_local ||
+                        _strcmpi(mod_filename, "mciavi32") == 0 ||
                         _strcmpi(mod_filename, "MSVFW32") == 0 ||
                         _strcmpi(mod_filename, "quartz") == 0 ||
                         _strcmpi(mod_filename, "winmm") == 0)
@@ -555,6 +556,7 @@ void hook_revert(HOOKLIST* hooks)
                     BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0;
 
                     if (is_local ||
+                        _strcmpi(mod_filename, "mciavi32") == 0 ||
                         _strcmpi(mod_filename, "MSVFW32") == 0 ||
                         _strcmpi(mod_filename, "quartz") == 0 ||
                         _strcmpi(mod_filename, "winmm") == 0)
diff --git a/src/utils.c b/src/utils.c
index 617beb8..028b93c 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -472,6 +472,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
 
         if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || 
             strcmp(class_name, "VideoRenderer") == 0 ||
+            strcmp(class_name, "MCIAVI") == 0 ||
             strcmp(class_name, "AVIWnd32") == 0 || 
             strcmp(class_name, "Afx:400000:3") == 0 ||
             strcmp(class_name, "MCIWndClass") == 0)
diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c
index 3f9da2c..a165b39 100644
--- a/src/winapi_hooks.c
+++ b/src/winapi_hooks.c
@@ -840,9 +840,26 @@ int WINAPI fake_StretchDIBits(
     UINT iUsage,
     DWORD rop)
 {
-    if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd)
+    HWND hwnd = WindowFromDC(hdc);
+
+    char class_name[MAX_PATH] = { 0 };
+
+    if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd)
     {
-        if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette))
+        GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
+    }
+
+    if (g_ddraw && g_ddraw->hwnd &&
+        (hwnd == g_ddraw->hwnd ||
+            (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) &&
+                (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
+                    strcmp(class_name, "MCIAVI") == 0 ||
+                    strcmp(class_name, "AVIWnd32") == 0 ||
+                    strcmp(class_name, "Afx:400000:3") == 0 ||
+                    strcmp(class_name, "VideoRenderer") == 0 ||
+                    strcmp(class_name, "MCIWndClass") == 0))))
+    {
+        if (0) // g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette))
         {
             HDC primary_dc;
             dds_GetDC(g_ddraw->primary, &primary_dc);
@@ -870,11 +887,11 @@ int WINAPI fake_StretchDIBits(
                 return result;
             }
         }
-        else if (g_ddraw->width > 0)
+        else if (g_ddraw->width > 0 && g_ddraw->render.hdc)
         {
             return
                 real_StretchDIBits(
-                    hdc,
+                    g_ddraw->render.hdc,
                     xDest + g_ddraw->render.viewport.x,
                     yDest + g_ddraw->render.viewport.y,
                     (int)(DestWidth * g_ddraw->render.scale_w),