diff --git a/src/render.c b/src/render.c
index ac7d6c8..f166741 100644
--- a/src/render.c
+++ b/src/render.c
@@ -118,6 +118,7 @@ static void SetMaxFPS()
     ddraw->fpsLimiter.tickLengthNs = 0;
     ddraw->fpsLimiter.ticklength = 0;
 
+    /*
     if (OpenGL_ExtExists("WGL_EXT_swap_control_tear", ddraw->render.hDC))
     {
         if (wglSwapIntervalEXT)
@@ -125,20 +126,21 @@ static void SetMaxFPS()
             if (ddraw->vsync)
             {
                 wglSwapIntervalEXT(-1);
-                maxFPS = 0;
+                maxFPS = ddraw->mode.dmDisplayFrequency;
             }
             else
                 wglSwapIntervalEXT(0);
         }
     }
-    else if (OpenGL_ExtExists("WGL_EXT_swap_control", ddraw->render.hDC))
+    else */
+    if (OpenGL_ExtExists("WGL_EXT_swap_control", ddraw->render.hDC))
     {
         if (wglSwapIntervalEXT)
         {
             if (ddraw->vsync)
             {
                 wglSwapIntervalEXT(1);
-                maxFPS = 0;
+                maxFPS = ddraw->mode.dmDisplayFrequency;
             }
             else
                 wglSwapIntervalEXT(0);
@@ -793,20 +795,29 @@ static void Render()
         {
             if (ddraw->fpsLimiter.hTimer)
             {
-                FILETIME ft = { 0 };
-                GetSystemTimeAsFileTime(&ft);
-
-                if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
+                if (ddraw->vsync)
                 {
-                    memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER));
+                    WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2);
+                    LARGE_INTEGER liDueTime = { .QuadPart = -ddraw->fpsLimiter.tickLengthNs };
+                    SetWaitableTimer(ddraw->fpsLimiter.hTimer, &liDueTime, 0, NULL, NULL, FALSE);
                 }
                 else
                 {
-                    WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2);
-                }
+                    FILETIME ft = { 0 };
+                    GetSystemTimeAsFileTime(&ft);
 
-                ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs;
-                SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE);
+                    if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
+                    {
+                        memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER));
+                    }
+                    else
+                    {
+                        WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2);
+                    }
+
+                    ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs;
+                    SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE);
+                }
             }
             else
             {
diff --git a/src/render_d3d9.c b/src/render_d3d9.c
index f247bcc..10968f7 100644
--- a/src/render_d3d9.c
+++ b/src/render_d3d9.c
@@ -278,10 +278,10 @@ static void SetMaxFPS()
     ddraw->fpsLimiter.tickLengthNs = 0;
     ddraw->fpsLimiter.ticklength = 0;
 
-    if (maxFPS < 0)
+    if (maxFPS < 0 || ddraw->vsync)
         maxFPS = ddraw->mode.dmDisplayFrequency;
 
-    if (maxFPS > 1000 || ddraw->vsync)
+    if (maxFPS > 1000)
         maxFPS = 0;
 
     if (maxFPS > 0)
@@ -419,25 +419,34 @@ DWORD WINAPI render_d3d9_main(void)
 #if _DEBUG
         DrawFrameInfoEnd();
 #endif
-
+        
         if (ddraw->fpsLimiter.ticklength > 0)
         {
             if (ddraw->fpsLimiter.hTimer)
             {
-                FILETIME ft = { 0 };
-                GetSystemTimeAsFileTime(&ft);
-
-                if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
+                if (ddraw->vsync)
                 {
-                    memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER));
+                    WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2);
+                    LARGE_INTEGER liDueTime = { .QuadPart = -ddraw->fpsLimiter.tickLengthNs };
+                    SetWaitableTimer(ddraw->fpsLimiter.hTimer, &liDueTime, 0, NULL, NULL, FALSE);
                 }
                 else
                 {
-                    WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2);
-                }
+                    FILETIME ft = { 0 };
+                    GetSystemTimeAsFileTime(&ft);
 
-                ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs;
-                SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE);
+                    if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
+                    {
+                        memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER));
+                    }
+                    else
+                    {
+                        WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2);
+                    }
+
+                    ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs;
+                    SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE);
+                }
             }
             else
             {
diff --git a/src/settings.c b/src/settings.c
index abb2d65..4bfaf3e 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -48,12 +48,10 @@ void Settings_Load()
     WindowRect.top = GetInt("posY", -32000);
 
     ddraw->render.maxfps = GetInt("maxfps", 125);
-    if (ddraw->render.maxfps <= 1000)
-    {
-        if (ddraw->accurateTimers)
-            ddraw->fpsLimiter.hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
-        //can't fully set it up here due to missing ddraw->mode.dmDisplayFrequency
-    }
+
+    if (ddraw->accurateTimers || ddraw->vsync)
+        ddraw->fpsLimiter.hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
+    //can't fully set it up here due to missing ddraw->mode.dmDisplayFrequency
 
     int maxTicks = GetInt("maxgameticks", 0);
     if (maxTicks > 0 && maxTicks <= 1000)