diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c
index f06aea3487..ff8ab2d5c4 100644
--- a/gfx/display_servers/dispserv_win32.c
+++ b/gfx/display_servers/dispserv_win32.c
@@ -116,7 +116,7 @@ static void win32_display_server_destroy(void *data)
 
    if (win32_orig_width > 0 && win32_orig_height > 0)
       video_display_server_set_resolution(win32_orig_width, win32_orig_height,
-            win32_orig_refresh, (float)win32_orig_refresh, crt_center, 0);
+            win32_orig_refresh, (float)win32_orig_refresh, crt_center, 0, 0);
 
 #ifdef HAS_TASKBAR_EXT
    if (g_taskbarList)
@@ -210,7 +210,7 @@ static bool win32_display_server_set_window_decorations(void *data, bool on)
 }
 
 static bool win32_display_server_set_resolution(void *data,
-      unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index)
+      unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset)
 {
    DEVMODE curDevmode;
    int iModeNum;
diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c
index 715cb9752d..e67361535a 100644
--- a/gfx/display_servers/dispserv_x11.c
+++ b/gfx/display_servers/dispserv_x11.c
@@ -44,7 +44,9 @@ static char new_mode[250]       = {0};
 static char xrandr[250]         = {0};
 static char fbset[150]          = {0};
 static char output[500]         = {0};
-static char output4[500]         = {0};
+static char output4[500]        = {0};
+static char crt_name[10]        = {0}; 
+static int crt_name_id          = 0;
 static bool crt_en              = false;
 static unsigned crtid           = 20;
 static XRRModeInfo crt_rrmode;
@@ -127,7 +129,7 @@ static bool x11_display_server_set_window_decorations(void *data, bool on)
 }
 
 static bool x11_display_server_set_resolution(void *data,
-      unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index)
+      unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset)
 {
    int screen;
    Window window;
@@ -150,6 +152,9 @@ static bool x11_display_server_set_resolution(void *data,
    float pixel_clock        = 0;
 
    crt_en                   = true;
+   crt_name_id += 1;
+   snprintf(crt_name, sizeof(crt_name), "CRT%d", crt_name_id);
+
 
    snprintf(old_mode, sizeof(old_mode), "%s", new_mode);
 
@@ -161,7 +166,7 @@ static bool x11_display_server_set_resolution(void *data,
    video_monitor_set_refresh_rate(hz);
 
    /* following code is the mode line generator */
-   hsp    = (width * 1.140) + x_offset;
+   hsp    = (width * 1.140) - (xoffset*4);
    hfp    = width * 1.055;
    pwidth = width;
 
@@ -228,20 +233,20 @@ static bool x11_display_server_set_resolution(void *data,
    /* create interlaced newmode from modline variables */
    if (height < 300)
    {
-      snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"CRT_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d -hsync -vsync", width, height, hz, pixel_clock,
+      snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%s_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d -hsync -vsync",crt_name, width, height, hz, pixel_clock,
             width, hfp, hsp, hbp, height, vfp, vsp, vbp);
       system(xrandr);
    }
    /* create interlaced newmode from modline variables */
    if (height > 300)
    {
-      snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"CRT_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d interlace -hsync -vsync", width, height, hz, pixel_clock,
+      snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%s_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d interlace -hsync -vsync",crt_name, width, height, hz, pixel_clock,
             width, hfp, hsp, hbp, height, vfp, vsp, vbp);
       system(xrandr);
    }
 
    /* variable for new mode */
-   snprintf(new_mode, sizeof(new_mode), "CRT_%dx%d_%0.2f", width, height, hz);
+   snprintf(new_mode, sizeof(new_mode), "%s_%dx%d_%0.2f",crt_name, width, height, hz);
 
    /* need to run loops for DVI0 - DVI-2 and VGA0 - VGA-2 outputs to
     * add and delete modes */
diff --git a/gfx/video_crt_switch.c b/gfx/video_crt_switch.c
index 494315653c..b6e83698fc 100644
--- a/gfx/video_crt_switch.c
+++ b/gfx/video_crt_switch.c
@@ -41,6 +41,7 @@ static unsigned ra_set_core_hz    = 0;
 static unsigned orig_width        = 0;
 static unsigned orig_height       = 0;
 static int crt_center_adjust      = 0;
+static int crt_tmp_center_adjust  = 0;
 
 static bool first_run             = true;
 
@@ -97,7 +98,7 @@ void crt_aspect_ratio_switch(unsigned width, unsigned height)
 static void switch_res_crt(unsigned width, unsigned height)
 {
    video_display_server_set_resolution(width, height,
-         ra_set_core_hz, ra_core_hz, crt_center_adjust, crt_index);
+         ra_set_core_hz, ra_core_hz, crt_center_adjust, crt_index, crt_center_adjust);
 #if defined(HAVE_VIDEOCORE)
    crt_rpi_switch(width, height, ra_core_hz);
    video_monitor_set_refresh_rate(ra_core_hz);
@@ -119,7 +120,7 @@ static void crt_screen_setup_aspect(unsigned width, unsigned height)
    if (height == 4)
    {
       /* detect menu only */
-      if (width < 1920)
+      if (width < 700)
          width = 320;
 
       height = 240;
@@ -181,13 +182,19 @@ void crt_switch_res_core(unsigned width, unsigned height,
 {
    /* ra_core_hz float passed from within
     * void video_driver_monitor_adjust_system_rates(void) */
+   if (width == 4 )
+   {
+      width = 320;
+      height = 240;
+   }
 
-   ra_core_width  = width;
    ra_core_height = height;
    ra_core_hz     = hz;
 
    if (dynamic == true)
       ra_core_width = crt_compute_dynamic_width(width);
+   else 
+      ra_core_width  = width;
 
    crt_center_adjust = crt_switch_center_adjust;
    crt_index  = monitor_index;
@@ -206,12 +213,13 @@ void crt_switch_res_core(unsigned width, unsigned height,
    /* Detect resolution change and switch */
    if (
       (ra_tmp_height != ra_core_height) ||
-      (ra_core_width != ra_tmp_width)
+      (ra_core_width != ra_tmp_width) || (crt_center_adjust != crt_tmp_center_adjust)
       )
-      crt_screen_setup_aspect(width, height);
+      crt_screen_setup_aspect(ra_core_width, ra_core_height);
 
    ra_tmp_height  = ra_core_height;
    ra_tmp_width   = ra_core_width;
+    crt_tmp_center_adjust = crt_center_adjust;
 
    /* Check if aspect is correct, if not change */
    if (video_driver_get_aspect_ratio() != fly_aspect)
@@ -231,20 +239,22 @@ void crt_video_restore(void)
 
 int crt_compute_dynamic_width(int width)
 {
-   double p_clock    = 18000000;
+   double p_clock    = 15000000;
    int min_height    = 261;
    int dynamic_width = 0;
    #if defined(HAVE_VIDEOCORE)
       double p_clock = 32000000;
    #endif
 
-   for (int i =1; i < 10; i++)
+   for (int i =0; i < 10; i++)
    {
-      dynamic_width = (width*0.5)*i;
+      dynamic_width = (width*1.5)*i;
       if ((dynamic_width * min_height * ra_core_hz) > p_clock)
-         return dynamic_width;   
+         break;
+      
+     
    }
-  return width;
+  return dynamic_width;
 }
 
 #if defined(HAVE_VIDEOCORE)
@@ -296,7 +306,7 @@ static void crt_rpi_switch(int width, int height, float hz)
       roundw = 1.34;
    hfp = width * 0.065;
 
-   hsp = width * 0.1433-hfp;
+   hsp = width * 0.1433-hfp+(crt_center_adjust*4);
 
    hbp = width * 0.3-hsp-hfp;
 
diff --git a/gfx/video_display_server.c b/gfx/video_display_server.c
index 31d1b3a5b0..065e5e16c6 100644
--- a/gfx/video_display_server.c
+++ b/gfx/video_display_server.c
@@ -90,10 +90,10 @@ bool video_display_server_set_window_decorations(bool on)
 }
 
 bool video_display_server_set_resolution(unsigned width, unsigned height,
-      int int_hz, float hz, int center, int monitor_index)
+      int int_hz, float hz, int center, int monitor_index, int xoffset)
 {
    if (current_display_server && current_display_server->set_resolution)
-      return current_display_server->set_resolution(current_display_server_data, width, height, int_hz, hz, center, monitor_index);
+      return current_display_server->set_resolution(current_display_server_data, width, height, int_hz, hz, center, monitor_index, xoffset);
    return false;
 }
 
diff --git a/gfx/video_display_server.h b/gfx/video_display_server.h
index 8cb3be269f..55de52ba6d 100644
--- a/gfx/video_display_server.h
+++ b/gfx/video_display_server.h
@@ -41,7 +41,7 @@ typedef struct video_display_server
    bool (*set_window_progress)(void *data, int progress, bool finished);
    bool (*set_window_decorations)(void *data, bool on);
    bool (*set_resolution)(void *data, unsigned width,
-         unsigned height, int int_hz, float hz, int center, int monitor_index);
+         unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset);
    void *(*get_resolution_list)(void *data,
          unsigned *size);
    const char *(*get_output_options)(void *data);
@@ -60,7 +60,7 @@ bool video_display_server_set_window_decorations(bool on);
 
 bool video_display_server_set_resolution(
       unsigned width, unsigned height,
-      int int_hz, float hz, int center, int monitor_index);
+      int int_hz, float hz, int center, int monitor_index, int xoffset);
 
 void *video_display_server_get_resolution_list(unsigned *size);
 
diff --git a/gfx/video_driver.c b/gfx/video_driver.c
index 28ee36f792..9ad45bd950 100644
--- a/gfx/video_driver.c
+++ b/gfx/video_driver.c
@@ -2648,11 +2648,12 @@ void video_driver_frame(const void *data, unsigned width,
          width = 3840;
       if (video_info.crt_switch_resolution_super == 1920)
          width = 1920;
+      
       if (video_info.crt_switch_resolution_super == 1)
          video_driver_crt_dynamic_super_width = true;
       else 
          video_driver_crt_dynamic_super_width = false;
-
+      
       crt_switch_res_core(width, height, video_driver_core_hz, video_info.crt_switch_resolution, video_info.crt_switch_center_adjust, video_info.monitor_index, video_driver_crt_dynamic_super_width);
    }
    else if (!video_info.crt_switch_resolution)
diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c
index 466f949b30..3b58c68cbe 100644
--- a/menu/cbs/menu_cbs_ok.c
+++ b/menu/cbs/menu_cbs_ok.c
@@ -4725,7 +4725,7 @@ static int action_ok_push_dropdown_item_resolution(const char *path,
       refreshrate = strtoul(pch, NULL, 0);
 
    if (video_display_server_set_resolution(width, height,
-         refreshrate, (float)refreshrate, 0, 0))
+         refreshrate, (float)refreshrate, 0, 0, 0))
    {
       settings_t *settings = config_get_ptr();
 
diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index d2bd18bc49..d95b3bdf88 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -1195,10 +1195,11 @@ static void setting_get_string_representation_crt_switch_resolution_super(
       return;
 
    if (*setting->value.target.unsigned_integer == 0)
-      strlcpy(s, msg_hash_to_str(MSG_NATIVE), len);
+      strlcpy(s, "NATIVE", len);
    else
       snprintf(s, len, "%d", *setting->value.target.unsigned_integer);
 /* TO DO make 1 read as DYNAMIC */
+
    if (*setting->value.target.unsigned_integer == 1)
       strlcpy(s, "DYNAMIC", len);
    else