diff --git a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
index 8f541fbf45..2a6918c441 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
@@ -199,6 +199,11 @@ namespace Ryujinx.HLE.HOS.Services.Android
 
             SendFrameBuffer(Context, Slot);
 
+            if (Context.Device.EnableDeviceVsync)
+            {
+                Context.Device.VsyncEvent.WaitOne();
+            }
+
             return MakeReplyParcel(Context, 1280, 720, 0, 0, 0);
         }
 
diff --git a/Ryujinx.HLE/Switch.cs b/Ryujinx.HLE/Switch.cs
index 70bd7060ec..a3f874ee59 100644
--- a/Ryujinx.HLE/Switch.cs
+++ b/Ryujinx.HLE/Switch.cs
@@ -7,6 +7,7 @@ using Ryujinx.HLE.Input;
 using Ryujinx.HLE.Logging;
 using Ryujinx.HLE.Memory;
 using System;
+using System.Threading;
 
 namespace Ryujinx.HLE
 {
@@ -28,6 +29,12 @@ namespace Ryujinx.HLE
 
         public Hid Hid { get; private set; }
 
+        public bool EnableDeviceVsync { get; set; } = true;
+
+        public AutoResetEvent VsyncEvent { get; private set; }
+
+        public event EventHandler Finish;
+
         public Switch(IGalRenderer Renderer, IAalOutput AudioOut)
         {
             if (Renderer == null)
@@ -55,6 +62,8 @@ namespace Ryujinx.HLE
             Statistics = new PerformanceStatistics();
 
             Hid = new Hid(this, System.HidSharedMem.PA);
+
+            VsyncEvent = new AutoResetEvent(true);
         }
 
         public void LoadCart(string ExeFsDir, string RomFsFile = null)
@@ -109,6 +118,8 @@ namespace Ryujinx.HLE
             if (Disposing)
             {
                 System.Dispose();
+
+                VsyncEvent.Dispose();
             }
         }
     }
diff --git a/Ryujinx/Config.cs b/Ryujinx/Config.cs
index 2c02c50f19..748d1dbf87 100644
--- a/Ryujinx/Config.cs
+++ b/Ryujinx/Config.cs
@@ -33,6 +33,8 @@ namespace Ryujinx
 
             Device.System.State.DockedMode = Convert.ToBoolean(Parser.Value("Docked_Mode"));
 
+            Device.EnableDeviceVsync = Convert.ToBoolean(Parser.Value("Enable_Vsync"));
+
             string[] FilteredLogClasses = Parser.Value("Logging_Filtered_Classes").Split(',', StringSplitOptions.RemoveEmptyEntries);
 
             //When the classes are specified on the list, we only
diff --git a/Ryujinx/Ryujinx.conf b/Ryujinx/Ryujinx.conf
index 6e15a6ac29..c497c08112 100644
--- a/Ryujinx/Ryujinx.conf
+++ b/Ryujinx/Ryujinx.conf
@@ -25,6 +25,9 @@ Logging_Filtered_Classes =
 #Enable or Disable Docked Mode
 Docked_Mode = false
 
+#Enable Game Vsync
+Enable_Vsync = true
+
 #Controller Device Index
 GamePad_Index = 0
 
diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs
index e7eb26137b..8adff9c00d 100644
--- a/Ryujinx/Ui/GLScreen.cs
+++ b/Ryujinx/Ui/GLScreen.cs
@@ -258,13 +258,16 @@ namespace Ryujinx
             double HostFps = Device.Statistics.GetSystemFrameRate();
             double GameFps = Device.Statistics.GetGameFrameRate();
 
-            NewTitle = $"Ryujinx | Host FPS: {HostFps:0.0} | Game FPS: {GameFps:0.0}";
+            NewTitle = $"Ryujinx | Host FPS: {HostFps:0.0} | Game FPS: {GameFps:0.0} | Game Vsync: " +
+               (Device.EnableDeviceVsync ? "On" : "Off");
 
             TitleEvent = true;
 
             SwapBuffers();
 
             Device.System.SignalVsync();
+
+            Device.VsyncEvent.Set();
         }
 
         protected override void OnUnload(EventArgs e)