diff --git a/ddraw.rc b/ddraw.rc
index 505c063..9883af7 100644
--- a/ddraw.rc
+++ b/ddraw.rc
@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 1,1,4,0
-PRODUCTVERSION 1,1,4,0
+FILEVERSION 1,1,4,1
+PRODUCTVERSION 1,1,4,1
 {
     BLOCK "StringFileInfo"
     {
@@ -8,13 +8,13 @@ PRODUCTVERSION 1,1,4,0
         {
             VALUE "CompanyName", "cncnet.org"
             VALUE "FileDescription", "DirectDraw replacement for C&C95 and Red Alert"
-            VALUE "FileVersion", "1.1.4.0"
+            VALUE "FileVersion", "1.1.4.1"
             VALUE "InternalName", "ddraw"
             VALUE "LegalCopyright", "Copyright (c) 2010-2017"
             VALUE "LegalTrademarks", ""
             VALUE "OriginalFileName", "ddraw.dll"
             VALUE "ProductName", "DirectDraw replacement for C&C95 and Red Alert"
-            VALUE "ProductVersion", "1.1.4.0"
+            VALUE "ProductVersion", "1.1.4.1"
             VALUE "Comments", "https://cncnet.org"
         }
     }
diff --git a/inc/main.h b/inc/main.h
index 4f65e1b..4c07df6 100644
--- a/inc/main.h
+++ b/inc/main.h
@@ -73,14 +73,10 @@ typedef struct IDirectDrawImpl
     HWND hWnd;
     LRESULT CALLBACK (*WndProc)(HWND, UINT, WPARAM, LPARAM);
     struct { float x; float y; } cursor;
-    POINT center;
     struct { int width; int height; } cursorclip;
     BOOL locked;
-    BOOL adjmouse;
-    BOOL mhack;
     BOOL devmode;
     BOOL vsync;
-    float sensitivity;
     BOOL vhack;
 	BOOL isredalert;
     DWORD WINAPI (*renderer)(void);
diff --git a/src/main.c b/src/main.c
index 96a7847..1c8754f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -296,12 +296,6 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
                 if (This->render.width > This->mode.dmPelsWidth || This->render.height > This->mode.dmPelsHeight)
                 {
                     // chosen game resolution higher than current resolution, use window mode for this case
-                    if (!This->mhack)
-                    {
-                        This->mhack = TRUE;
-                        mouse_init();
-                    }
-                    
                     This->windowed = TRUE;
                 }
                 else
@@ -331,12 +325,6 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
                             This->render.mode.dmPelsWidth = This->render.width;
                             This->render.mode.dmPelsHeight = This->render.height;
                             
-                            if (!This->mhack)
-                            {
-                                This->mhack = TRUE;
-                                mouse_init();
-                            }
-                            
                             This->windowed = TRUE;
                         }
                     }
@@ -443,12 +431,6 @@ void ToggleFullscreen()
     {
         if(ChangeDisplaySettings(&ddraw->mode, 0) == DISP_CHANGE_SUCCESSFUL)
         {
-            if (!ddraw->devmode && !ddraw->mhack)
-            {
-                ddraw->mhack = TRUE;
-                mouse_init();
-            }
-            
             if (!ddraw->border)
             {
                 SetWindowLong(ddraw->hWnd, GWL_STYLE, GetWindowLong(ddraw->hWnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU));
@@ -590,7 +572,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
         case WM_LBUTTONUP:
         case WM_RBUTTONUP:
         case WM_MBUTTONUP:
-            if (ddraw->mhack && !ddraw->locked)
+            if (!ddraw->devmode && !ddraw->locked)
             {
                 ddraw->cursor.x = LOWORD(lParam) * ((float)ddraw->width / ddraw->render.width);
                 ddraw->cursor.y = HIWORD(lParam) * ((float)ddraw->height / ddraw->render.height);
@@ -604,22 +586,18 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
         case WM_RBUTTONDOWN:
         case WM_MBUTTONDOWN:
         case WM_MOUSEMOVE:
-            if (ddraw->mhack)
-            {
-                if (!ddraw->locked)
-                {
-                    return 0;
-                }
 
-                fake_GetCursorPos(NULL); /* update our own cursor */
-                lParam = MAKELPARAM(ddraw->cursor.x, ddraw->cursor.y);
+            if (!ddraw->devmode && !ddraw->locked)
+            {
+                return 0;
             }
 
+            ddraw->cursor.x = GET_X_LPARAM(lParam);
+            ddraw->cursor.y = GET_Y_LPARAM(lParam);
+
             if (ddraw->devmode)
             {
                 mouse_lock();
-                ddraw->cursor.x = GET_X_LPARAM(lParam);
-                ddraw->cursor.y = GET_Y_LPARAM(lParam);
             }
             break;
 
@@ -895,12 +873,6 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
             "vsync=false\n"
             "; scaling filter, nearest = sharp, linear = smooth (OpenGL only)\n"
             "filter=nearest\n"
-            "; automatic mouse sensitivity scaling\n"
-            "adjmouse=false\n"
-            "; manual sensitivity scaling, 0 = disabled, 0.5 = half, 1.0 = normal\n"
-            "sensitivity=0.0\n"
-            "; enable C&C/RA mouse hack\n"
-            "mhack=false\n"
             "; enable C&C video resize hack, auto = auto-detect game, true = forced, false = disabled\n"
             "vhack=false\n"
             "; switch between OpenGL (opengl) and software (gdi) renderers, latter supports less features but might be faster depending on the GPU\n"
@@ -994,35 +966,11 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
     {
         This->render.filter = 0;
     }
-
-    GetPrivateProfileStringA("ddraw", "adjmouse", "FALSE", tmp, sizeof(tmp), SettingsIniPath);
-    if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1')
-    {
-        This->adjmouse = TRUE;
-    }
-    else
-    {
-        This->adjmouse = FALSE;
-    }
-
-    GetPrivateProfileStringA("ddraw", "mhack", "TRUE", tmp, sizeof(tmp), SettingsIniPath);
-    if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1')
-    {
-        This->mhack = TRUE;
-    }
-    else
-    {
-        This->mhack = FALSE;
-    }
-    
-    if (This->windowed)
-        This->mhack = TRUE;
         
     GetPrivateProfileStringA("ddraw", "devmode", "FALSE", tmp, sizeof(tmp), SettingsIniPath);
     if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1')
     {
         This->devmode = TRUE;
-        This->mhack = FALSE;
     }
     else
     {
@@ -1039,9 +987,6 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
         This->vsync = FALSE;
     }
 
-    GetPrivateProfileStringA("ddraw", "sensitivity", "0", tmp, sizeof(tmp), SettingsIniPath);
-    This->sensitivity = strtof(tmp, NULL);
-
     GetPrivateProfileStringA("ddraw", "vhack", "false", tmp, sizeof(tmp), SettingsIniPath);
     if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1')
     {
diff --git a/src/mouse.c b/src/mouse.c
index e3780f6..dcf442e 100644
--- a/src/mouse.c
+++ b/src/mouse.c
@@ -24,7 +24,7 @@
 #define MAX_HOOKS 16
 
 BOOL mouse_active = FALSE;
-int real_height = 0;
+int yAdjust = 0;
 
 struct hook { char name[32]; void *func; };
 struct hack
@@ -35,47 +35,6 @@ struct hack
 
 BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
 {
-    POINT pt;
-
-    if(mouse_active && ddraw->locked)
-    {
-        GetCursorPos(&pt);
-
-        if(ddraw->sensitivity > 0 && ddraw->sensitivity < 10)
-        {
-            ddraw->cursor.x += (pt.x - ddraw->center.x) * ddraw->sensitivity;
-            ddraw->cursor.y += (pt.y - ddraw->center.y) * ddraw->sensitivity;
-        }
-        else if(ddraw->adjmouse)
-        {
-            ddraw->cursor.x += (pt.x - ddraw->center.x) * ((float)ddraw->width / ddraw->render.width);
-            ddraw->cursor.y += (pt.y - ddraw->center.y) * ((float)ddraw->height / ddraw->render.height);
-        }
-        else
-        {
-            ddraw->cursor.x += pt.x - ddraw->center.x;
-            ddraw->cursor.y += pt.y - ddraw->center.y;
-        }
-
-        if(ddraw->cursor.x < 0) ddraw->cursor.x = 0;
-        if(ddraw->cursor.y < 0) ddraw->cursor.y = 0;
-        if(ddraw->cursor.x > ddraw->cursorclip.width-1) ddraw->cursor.x = ddraw->cursorclip.width-1;
-
-        if(real_height > 0 && real_height < ddraw->cursorclip.height)
-        {
-            if(ddraw->cursor.y > real_height-1) ddraw->cursor.y = real_height-1;
-        }
-        else
-        {
-            if(ddraw->cursor.y > ddraw->cursorclip.height-1) ddraw->cursor.y = ddraw->cursorclip.height-1;
-        }
-
-        if(pt.x != ddraw->center.x || pt.y != ddraw->center.y)
-        {
-            SetCursorPos(ddraw->center.x, ddraw->center.y);
-        }
-    }
-
     if (lpPoint)
     {
         lpPoint->x = (int)ddraw->cursor.x;
@@ -89,7 +48,8 @@ BOOL WINAPI fake_ClipCursor(const RECT *lpRect)
     if(lpRect)
     {
         /* hack for 640x480 mode */
-        real_height = lpRect->bottom;
+        if (lpRect->bottom == 400 && ddraw->height == 480)
+            yAdjust = 40;
     }
     return TRUE;
 }
@@ -195,12 +155,25 @@ void mouse_lock()
 
     if (mouse_active && !ddraw->locked)
     {
-        GetWindowRect(ddraw->hWnd, &rc);
+        // Get the window client area.
+        GetClientRect(ddraw->hWnd, &rc);
         
-        ddraw->center.x = (rc.right + rc.left) / 2;
-        ddraw->center.y = (rc.top + rc.bottom) / 2;
+        // stretching fix
+        rc.right -= (ddraw->render.width - ddraw->width);
+        rc.bottom -= (ddraw->render.height - ddraw->height);
 
-        SetCursorPos(ddraw->center.x, ddraw->center.y);
+        // Convert the client area to screen coordinates.
+        POINT pt = { rc.left, rc.top };
+        POINT pt2 = { rc.right, rc.bottom };
+        ClientToScreen(ddraw->hWnd, &pt);
+        ClientToScreen(ddraw->hWnd, &pt2);
+        
+        SetRect(&rc, pt.x, pt.y, pt2.x, pt2.y);
+        
+        rc.bottom -= yAdjust * 2;
+
+        SetCursorPos(rc.left + ddraw->cursor.x, rc.top + ddraw->cursor.y - yAdjust);
+        
         SetCapture(ddraw->hWnd);
         ClipCursor(&rc);
 
@@ -212,7 +185,6 @@ void mouse_lock()
 void mouse_unlock()
 {
     RECT rc;
-    POINT pt;
 
     if (ddraw->devmode)
     {
@@ -229,28 +201,31 @@ void mouse_unlock()
     {
         ddraw->locked = FALSE;
 
-        GetWindowRect(ddraw->hWnd, &rc);
-
-        pt.x = (rc.right - rc.left - ddraw->render.width) / 2;
-        pt.y = (rc.bottom - rc.top - ddraw->render.height - pt.x);
-        rc.left += pt.x;
-        rc.top += pt.y;
-
-        SetCursorPos(rc.left + (ddraw->cursor.x * ddraw->render.width / ddraw->width), rc.top + (ddraw->cursor.y * ddraw->render.height / ddraw->height));
+        // Get the window client area.
+        GetClientRect(ddraw->hWnd, &rc);
+        
+        // Convert the client area to screen coordinates.
+        POINT pt = { rc.left, rc.top };
+        POINT pt2 = { rc.right, rc.bottom };
+        ClientToScreen(ddraw->hWnd, &pt);
+        ClientToScreen(ddraw->hWnd, &pt2);
+        SetRect(&rc, pt.x, pt.y, pt2.x, pt2.y);
+       
         while(ShowCursor(TRUE) < 0);
         SetCursor(LoadCursor(NULL, IDC_ARROW));
 
         ClipCursor(NULL);
         ReleaseCapture();
+        
+        SetCursorPos(
+            rc.left + (ddraw->cursor.x  * ((float)ddraw->render.width / ddraw->width)), 
+            rc.top + ((ddraw->cursor.y + yAdjust) * ((float)ddraw->render.height / ddraw->height)));
 
     }
 }
 
 void mouse_init()
 {
-    if(ddraw->mhack || ddraw->devmode)
-    {
-        hack_iat(&hacks[0]);
-        mouse_active = TRUE;
-    }
+    hack_iat(&hacks[0]);
+    mouse_active = TRUE;
 }