diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c
index 96b18a4bbcbfb2bc608105db93c06a30aa23efba..c5887eec7227051e4798926ae276b4462e1e9637 100644
--- a/src/conio/ciolib.c
+++ b/src/conio/ciolib.c
@@ -89,6 +89,7 @@ CIOLIBEXPORT int ciolib_initial_window_height = -1;
 CIOLIBEXPORT int ciolib_initial_window_width = -1;
 CIOLIBEXPORT double ciolib_initial_scaling = 0;
 CIOLIBEXPORT int ciolib_initial_mode = C80;
+CIOLIBEXPORT enum ciolib_scaling ciolib_initial_scaling_type = CIOLIB_SCALING_INTERNAL;
 CIOLIBEXPORT const uint32_t *ciolib_r2yptr;
 CIOLIBEXPORT const uint32_t *ciolib_y2rptr;
 
@@ -151,6 +152,8 @@ CIOLIBEXPORT void ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr);
 CIOLIBEXPORT void ciolib_setwinsize(int width, int height);
 CIOLIBEXPORT void ciolib_setwinposition(int x, int y);
 CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void);
+CIOLIBEXPORT void ciolib_setscaling_type(enum ciolib_scaling);
+CIOLIBEXPORT enum ciolib_scaling ciolib_getscaling_type(void);
 
 #if defined(WITH_SDL)
 int sdl_video_initialized = 0;
@@ -202,6 +205,8 @@ static int try_gdi_init(int mode)
 		cio_api.replace_font = bitmap_replace_font;
 		cio_api.beep = gdi_beep;
 		cio_api.mousepointer=gdi_mousepointer;
+		cio_api.setscaling_type=gdi_setscaling_type;
+		cio_api.getscaling_type=gdi_getscaling_type;
 		return(1);
 	}
 	return(0);
@@ -255,6 +260,8 @@ static int try_sdl_init(int mode)
 		cio_api.replace_font = bitmap_replace_font;
 		cio_api.beep = sdl_beep;
 		cio_api.mousepointer=sdl_mousepointer;
+		cio_api.setscaling_type=sdl_setscaling_type;
+		cio_api.getscaling_type=sdl_getscaling_type;
 		return(1);
 	}
 	return(0);
@@ -1971,6 +1978,19 @@ CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void)
 	return conio_fontdata[font].cp;
 }
 
+CIOLIBEXPORT enum ciolib_scaling ciolib_getscaling_type(void)
+{
+	if (cio_api.getscaling != NULL)
+		return cio_api.getscaling();
+	return CIOLIB_SCALING_INTERNAL;
+}
+
+CIOLIBEXPORT void ciolib_setscaling_type(enum ciolib_scaling newval)
+{
+	if (cio_api.setscaling_type != NULL)
+		cio_api.setscaling_type(newval);
+}
+
 #if defined(__DARWIN__)
 #ifdef main
 #undef main
diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h
index ad18824b01e3f2c30399f22ce3967af08ab3c1e3..2a08c827c97eaccd542ef876a8a3bf62b266aefa 100644
--- a/src/conio/ciolib.h
+++ b/src/conio/ciolib.h
@@ -228,6 +228,11 @@ enum
 	_NORMALCURSOR
 };
 
+enum ciolib_scaling {
+	CIOLIB_SCALING_INTERNAL,
+	CIOLIB_SCALING_EXTERNAL,
+};
+
 struct text_info {
 	unsigned char winleft;        /* left window coordinate */
 	unsigned char wintop;         /* top window coordinate */
@@ -303,19 +308,20 @@ typedef struct {
 	int		mode;
 	int		mouse;
 	uint64_t	options;
-#define	CONIO_OPT_LOADABLE_FONTS	1
-#define CONIO_OPT_BLINK_ALT_FONT	2
-#define CONIO_OPT_BOLD_ALT_FONT		4
-#define CONIO_OPT_BRIGHT_BACKGROUND	8
-#define CONIO_OPT_PALETTE_SETTING	16
-#define CONIO_OPT_SET_PIXEL			32
-#define CONIO_OPT_CUSTOM_CURSOR		64
-#define CONIO_OPT_FONT_SELECT		128
-#define CONIO_OPT_SET_TITLE			256
-#define CONIO_OPT_SET_NAME			512
-#define CONIO_OPT_SET_ICON			1024
-#define CONIO_OPT_EXTENDED_PALETTE	2048
-#define CONIO_OPT_BLOCKY_SCALING	4096
+#define	CONIO_OPT_LOADABLE_FONTS    (1 <<  1)
+#define CONIO_OPT_BLINK_ALT_FONT    (1 <<  2)
+#define CONIO_OPT_BOLD_ALT_FONT     (1 <<  3)
+#define CONIO_OPT_BRIGHT_BACKGROUND (1 <<  4)
+#define CONIO_OPT_PALETTE_SETTING   (1 <<  5)
+#define CONIO_OPT_SET_PIXEL         (1 <<  6)
+#define CONIO_OPT_CUSTOM_CURSOR     (1 <<  7)
+#define CONIO_OPT_FONT_SELECT       (1 <<  8)
+#define CONIO_OPT_SET_TITLE         (1 <<  9)
+#define CONIO_OPT_SET_NAME          (1 << 10)
+#define CONIO_OPT_SET_ICON          (1 << 11)
+#define CONIO_OPT_EXTENDED_PALETTE  (1 << 12)
+#define CONIO_OPT_BLOCKY_SCALING    (1 << 13)
+#define CONIO_OPT_EXTERNAL_SCALING  (1 << 14)
 	void	(*clreol)		(void);
 	int		(*puttext)		(int,int,int,int,void *);
 	int		(*vmem_puttext)		(int,int,int,int,struct vmem_cell *);
@@ -386,6 +392,8 @@ typedef struct {
 	int	(*checkfont)(int font_num);
 	void	(*setwinsize)	(int width, int height);
 	void	(*setwinposition)	(int x, int y);
+	void	(*setscaling_type)	(enum ciolib_scaling);
+	enum ciolib_scaling (*getscaling_type)	(void);
 } cioapi_t;
 
 #define _conio_kbhit()		kbhit()
@@ -408,6 +416,7 @@ CIOLIBEXPORTVAR int ciolib_initial_window_height;
 CIOLIBEXPORTVAR int ciolib_initial_window_width;
 CIOLIBEXPORTVAR double ciolib_initial_scaling;
 CIOLIBEXPORTVAR int ciolib_initial_mode;
+CIOLIBEXPORTVAR enum ciolib_scaling ciolib_initial_scaling_type;
 CIOLIBEXPORTVAR const uint32_t *ciolib_r2yptr;
 CIOLIBEXPORTVAR const uint32_t *ciolib_y2rptr;
 
@@ -489,6 +498,8 @@ CIOLIBEXPORT void ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr);
 CIOLIBEXPORT void ciolib_setwinsize(int width, int height);
 CIOLIBEXPORT void ciolib_setwinposition(int x, int y);
 CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void);
+CIOLIBEXPORT void ciolib_setscaling_type(enum ciolib_scaling);
+CIOLIBEXPORT enum ciolib_scaling ciolib_getscaling_type(void);
 
 /* DoorWay specific stuff that's only applicable to ANSI mode. */
 CIOLIBEXPORT void ansi_ciolib_setdoorway(int enable);
@@ -575,6 +586,8 @@ CIOLIBEXPORT void ansi_ciolib_setdoorway(int enable);
 	#define setwinsize(a,b)			ciolib_setwinsize(a,b)
 	#define setwinposition(a,b)		ciolib_setwinposition(a,b)
 	#define getcodepage()			ciolib_getcodepage()
+	#define setscaling_type(a)		ciolib_setscaling_type(a)
+	#define getscaling_type()		ciolib_getscaling_type()
 #endif
 
 #ifdef WITH_SDL
diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c
index 8faf7dccd2567a1e6fd34bf7c4f2eb96a177d3ca..e3b11026c0724720c57e7aad3dffff63ff32a6d1 100644
--- a/src/conio/sdl_con.c
+++ b/src/conio/sdl_con.c
@@ -329,25 +329,6 @@ void sdl_flush(void)
 	sdl_user_func(SDL_USEREVENT_FLUSH);
 }
 
-/*
- * Returns true if the specified width/height can use the
- * internal scaler
- *
- * vstat lock must be held
- */
-static bool
-window_can_scale_internally(struct video_stats *vs)
-{
-	double ival;
-	double fval = modf(vstat.scaling, &ival);
-
-	// TODO: Add toggle for software scaling
-	return true;
-	if (fval == 0.0)
-		return true;
-	return false;
-}
-
 static int sdl_init_mode(int mode, bool init)
 {
 	int w, h;
@@ -374,10 +355,12 @@ static int sdl_init_mode(int mode, bool init)
 		h = 0;
 	}
 	bitmap_drv_init_mode(mode, &bitmap_width, &bitmap_height, w, h);
-	if (init && ciolib_initial_scaling) {
-		bitmap_get_scaled_win_size(ciolib_initial_scaling, &vstat.winwidth, &vstat.winheight, 0, 0);
+	if (init) {
+		internal_scaling = (ciolib_initial_scaling_type == CIOLIB_SCALING_INTERNAL);
+		if (ciolib_initial_scaling) {
+			bitmap_get_scaled_win_size(ciolib_initial_scaling, &vstat.winwidth, &vstat.winheight, 0, 0);
+		}
 	}
-	internal_scaling = window_can_scale_internally(&vstat);
 	pthread_mutex_lock(&sdl_mode_mutex);
 	sdl_mode = true;
 	pthread_mutex_unlock(&sdl_mode_mutex);
@@ -409,7 +392,7 @@ int sdl_init(int mode)
 #ifdef _WIN32
 		FreeConsole();
 #endif
-		cio_api.options |= CONIO_OPT_PALETTE_SETTING | CONIO_OPT_SET_TITLE | CONIO_OPT_SET_NAME | CONIO_OPT_SET_ICON;
+		cio_api.options |= CONIO_OPT_PALETTE_SETTING | CONIO_OPT_SET_TITLE | CONIO_OPT_SET_NAME | CONIO_OPT_SET_ICON | CONIO_OPT_EXTERNAL_SCALING;
 		return(0);
 	}
 
@@ -461,7 +444,6 @@ static void internal_setwinsize(struct video_stats *vs, bool force)
 		vstat.scaling = sdl_getscaling();
 	}
 	pthread_mutex_unlock(&vstatlock);
-	internal_scaling = window_can_scale_internally(vs);
 	if (changed)
 		setup_surfaces(vs);
 }
@@ -610,7 +592,6 @@ static void setup_surfaces(struct video_stats *vs)
 	pthread_mutex_lock(&win_mutex);
 	idealw = vs->winwidth;
 	idealh = vs->winheight;
-	internal_scaling = window_can_scale_internally(vs);
 	sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, internal_scaling ? "0" : "2");
 
 	if (win == NULL) {
@@ -620,10 +601,12 @@ static void setup_surfaces(struct video_stats *vs)
 			vs->winwidth = idealw;
 			vs->winheight = idealh;
 			sdl.RenderClear(renderer);
-			if (internal_scaling)
+			if (internal_scaling) {
 				newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh);
-			else
+			}
+			else {
 				newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, vs->scrnwidth, vs->scrnheight);
+			}
 
 			if (texture)
 				sdl.DestroyTexture(texture);
@@ -640,10 +623,12 @@ static void setup_surfaces(struct video_stats *vs)
 		sdl.GetWindowSize(win, &idealw, &idealh);
 		vs->winwidth = idealw;
 		vs->winheight = idealh;
-		if (internal_scaling)
+		if (internal_scaling) {
 			newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh);
-		else
+		}
+		else {
 			newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, vs->scrnwidth, vs->scrnheight);
+		}
 		sdl.RenderClear(renderer);
 		if (texture)
 			sdl.DestroyTexture(texture);
@@ -1279,3 +1264,34 @@ sdl_setscaling(double newval)
 	pthread_mutex_unlock(&vstatlock);
 	sdl_setwinsize(w, h);
 }
+
+enum ciolib_scaling
+sdl_getscaling_type(void)
+{
+	enum ciolib_scaling ret;
+
+	pthread_mutex_lock(&vstatlock);
+	ret = (internal_scaling ? CIOLIB_SCALING_INTERNAL : CIOLIB_SCALING_EXTERNAL);
+	pthread_mutex_unlock(&vstatlock);
+	return ret;
+}
+
+void
+sdl_setscaling_type(enum ciolib_scaling newval)
+{
+	struct video_stats cvstat = vstat;
+	int w, h;
+
+	update_cvstat(&cvstat);
+	pthread_mutex_lock(&vstatlock);
+	if ((newval == CIOLIB_SCALING_INTERNAL) != internal_scaling) {
+		internal_scaling = (newval == CIOLIB_SCALING_INTERNAL);
+		w = vstat.winwidth;
+		h = vstat.winheight;
+		pthread_mutex_unlock(&vstatlock);
+		sdl_user_func_ret(SDL_USEREVENT_SETVIDMODE, w, h);
+	}
+	else {
+		pthread_mutex_unlock(&vstatlock);
+	}
+}
diff --git a/src/conio/sdl_con.h b/src/conio/sdl_con.h
index 56d6a5c97471df317595ba3c1b843dddecb90844..569391c9cf0ed39c0bb146240d7e732543f2df37 100644
--- a/src/conio/sdl_con.h
+++ b/src/conio/sdl_con.h
@@ -40,6 +40,8 @@ void sdl_beep(void);
 int sdl_mousepointer(enum ciolib_mouse_ptr type);
 double sdl_getscaling(void);
 void sdl_setscaling(double newval);
+enum ciolib_scaling sdl_getscaling_type(void);
+void sdl_setscaling_type(enum ciolib_scaling newval);
 
 #if defined(__DARWIN__)
 void sdl_init_darwin(void *args);
diff --git a/src/conio/win32gdi.c b/src/conio/win32gdi.c
index ad1900f9dff88c6310890d1a21c9779c236ccc6e..c2ad288ce58e8d1c8ae971c14117752775f170f7 100644
--- a/src/conio/win32gdi.c
+++ b/src/conio/win32gdi.c
@@ -24,6 +24,7 @@ static int xoff, yoff;
 static int dwidth = 640;
 static int dheight = 480;
 static bool init_success;
+static enum ciolib_scaling stype;
 
 #define WM_USER_INVALIDATE WM_USER
 #define WM_USER_SETSIZE (WM_USER + 1)
@@ -57,6 +58,7 @@ static pthread_mutex_t gdi_headlock;
 static pthread_mutex_t winpos_lock;
 static pthread_mutex_t rect_lock;
 static pthread_mutex_t off_lock;
+static pthread_mutex_t stypelock;
 
 // Internal implementation
 
@@ -251,17 +253,16 @@ gdi_handle_wm_paint(HWND hwnd)
 	static HDC memDC = NULL;
 	static HBITMAP di = NULL;
 	static int diw = -1, dih = -1;
-	static int sww = -1, swh = -1;
-	static int lww = -1, lwh = -1;
 
 	PAINTSTRUCT ps;
 	struct rectlist *list;
 	HDC winDC;
 	int w,h;
 	int sw,sh;
-	int xscale, yscale;
+	int vsw,vsh;
 	struct graphics_buffer *gb;
 	void *data;
+	enum ciolib_scaling st;
 
 	list = get_rect();
 	if (list == NULL)
@@ -269,32 +270,54 @@ gdi_handle_wm_paint(HWND hwnd)
 	pthread_mutex_lock(&vstatlock);
 	w = vstat.winwidth;
 	h = vstat.winheight;
+	vsw = vstat.scrnwidth;
+	vsh = vstat.scrnheight;
 	bitmap_get_scaled_win_size(vstat.scaling, &sw, &sh, vstat.winwidth, vstat.winheight);
 	pthread_mutex_unlock(&vstatlock);
-	gb = do_scale(list, sw, sh);
-	if (di == NULL || diw != gb->w || dih != gb->h) {
-		lww = -1;
-		if (di != NULL) {
-			DeleteObject(di);
-			di = NULL;
+	pthread_mutex_lock(&off_lock);
+	dwidth = sw;
+	dheight = sh;
+	pthread_mutex_unlock(&off_lock);
+	pthread_mutex_lock(&stypelock);
+	st = stype;
+	pthread_mutex_unlock(&stypelock);
+	if (st == CIOLIB_SCALING_INTERNAL) {
+		gb = do_scale(list, sw, sh);
+		if (di == NULL || diw != gb->w || dih != gb->h) {
+			if (di != NULL) {
+				DeleteObject(di);
+				di = NULL;
+			}
+			diw = gb->w;
+			b5hdr.bV5Width = gb->w;
+			dih = gb->h;
+			b5hdr.bV5Height = -gb->h;
+			b5hdr.bV5SizeImage = gb->w * gb->h * 4;
 		}
-		diw = gb->w;
-		b5hdr.bV5Width = gb->w;
-		dih = gb->h;
-		b5hdr.bV5Height = -gb->h;
-		b5hdr.bV5SizeImage = gb->w * gb->h * 4;
-		pthread_mutex_lock(&off_lock);
-		dwidth = diw;
-		dheight = dih;
-		pthread_mutex_unlock(&off_lock);
+		data = gb->data;
+	}
+	else {
+		if (di == NULL || diw != vsw || dih != vsh) {
+			if (di != NULL) {
+				DeleteObject(di);
+				di = NULL;
+			}
+			diw = vsw;
+			b5hdr.bV5Width = vsw;
+			dih = vsh;
+			b5hdr.bV5Height = -vsh;
+			b5hdr.bV5SizeImage = vsw * vsh * 4;
+		}
+		sw = vsw;
+		sh = vsh;
+		data = list->data;
 	}
 	pthread_mutex_lock(&off_lock);
 	if (maximized) {
-		xoff = (w - diw) / 2;
-		yoff = (h - dih) / 2;
+		xoff = (w - dwidth) / 2;
+		yoff = (h - dheight) / 2;
 	}
 	pthread_mutex_unlock(&off_lock);
-	data = gb->data;
 	winDC = BeginPaint(hwnd, &ps);
 	if (memDC == NULL) {
 		memDC = CreateCompatibleDC(winDC);
@@ -303,10 +326,13 @@ gdi_handle_wm_paint(HWND hwnd)
 		di = CreateDIBitmap(winDC, (BITMAPINFOHEADER *)&b5hdr, CBM_INIT, data, (BITMAPINFO *)&b5hdr, DIB_RGB_COLORS);
 	else
 		SetDIBits(winDC, di, 0, dih, data, (BITMAPINFO *)&b5hdr, DIB_RGB_COLORS);
-	// Clear to black first
 	di = SelectObject(memDC, di);
 	pthread_mutex_lock(&off_lock);
-	BitBlt(winDC, xoff, yoff, dwidth, dheight, memDC, 0, 0, SRCCOPY);
+	if (st == CIOLIB_SCALING_INTERNAL)
+		BitBlt(winDC, xoff, yoff, dwidth, dheight, memDC, 0, 0, SRCCOPY);
+	else
+		StretchBlt(winDC, xoff, yoff, dwidth, dheight, memDC, 0, 0, sw, sh, SRCCOPY);
+	// Clear around image
 	if (xoff > 0) {
 		BitBlt(winDC, 0, 0, xoff - 1, h, memDC, 0, 0, BLACKNESS);
 		BitBlt(winDC, xoff + dwidth, 0, w, h, memDC, 0, 0, BLACKNESS);
@@ -326,7 +352,8 @@ gdi_handle_wm_paint(HWND hwnd)
 	pthread_mutex_unlock(&off_lock);
 	EndPaint(hwnd, &ps);
 	di = SelectObject(memDC, di);
-	release_buffer(gb);
+	if (st == CIOLIB_SCALING_INTERNAL)
+		release_buffer(gb);
 	return 0;
 }
 
@@ -725,6 +752,7 @@ gdi_thread(void *arg)
 	if (ciolib_initial_scaling != 0) {
 		bitmap_get_scaled_win_size(ciolib_initial_scaling, &vstat.winwidth, &vstat.winheight, 0, 0);
 	}
+	stype = ciolib_initial_scaling_type;
 	// Now make the inside of the window the size we want (sigh)
 	r.left = r.top = 0;
 	r.right = vstat.winwidth;
@@ -1019,6 +1047,7 @@ gdi_initciolib(int mode)
 	pthread_mutex_init(&winpos_lock, NULL);
 	pthread_mutex_init(&rect_lock, NULL);
 	pthread_mutex_init(&off_lock, NULL);
+	pthread_mutex_init(&stypelock, NULL);
 	init_sem = CreateSemaphore(NULL, 0, INT_MAX, NULL);
 
 	return(gdi_init(mode));
@@ -1108,3 +1137,26 @@ gdi_setscaling(double newval)
 	pthread_mutex_unlock(&vstatlock);
 	gdi_setwinsize(w, h);
 }
+
+enum ciolib_scaling
+gdi_getscaling_type(void)
+{
+	enum ciolib_scaling ret;
+
+	// TODO: I hate having nested locks like this. :(
+	pthread_mutex_lock(&stypelock);
+	ret = stype;
+	pthread_mutex_unlock(&stypelock);
+	return ret;
+}
+
+void
+gdi_setscaling_type(enum ciolib_scaling newtype)
+{
+	int w, h;
+
+	pthread_mutex_lock(&stypelock);
+	stype = newtype;
+	pthread_mutex_unlock(&stypelock);
+
+}
diff --git a/src/conio/win32gdi.h b/src/conio/win32gdi.h
index 0c8c8f4492ee094206245743f5e6733b48fc6b74..ea26a2992990324d1811f52a1a7d9bf25f15a9c9 100644
--- a/src/conio/win32gdi.h
+++ b/src/conio/win32gdi.h
@@ -21,5 +21,7 @@ void gdi_setwinposition(int x, int y);
 void gdi_setwinsize(int w, int h);
 double gdi_getscaling(void);
 void gdi_setscaling(double newval);
+enum ciolib_scaling gdi_getscaling_type(void);
+void gdi_setscaling_type(enum ciolib_scaling newtype);
 
 #endif
diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index d6419d001488f0c8fc8fdbd787876ac564f304b1..40be50b6240e9e386dc7506375dfe358811cccfb 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -267,6 +267,8 @@ static char *conn_type_help = "`Connection Type`\n\n"
 
 static char *YesNo[3] = {"Yes", "No", ""};
 
+static char *scaling_names[4] = {"Blocky", "Pointy", "External"};
+
 ini_style_t  ini_style = {
         /* key_len */
 	15,
@@ -1757,6 +1759,27 @@ custom_mode_adjusted(int *cur, char **opt)
 	    opt);
 }
 
+static int
+settings_to_scale(void)
+{
+	int i = 0;
+
+	if (!settings.blocky)
+		i |= 1;
+	if (settings.extern_scale)
+		i |= 2;
+	if (i > 2)
+		i = 2;
+	return i;
+}
+
+static void
+scale_to_settings(int i)
+{
+	settings.blocky = (i & 1) ? false : true;
+	settings.extern_scale = (i & 2) ? true : false;
+}
+
 void
 change_settings(int connected)
 {
@@ -1807,8 +1830,8 @@ change_settings(int connected)
 		    "        The complete path to the user's BBS list.\n\n"
 		    "~ TERM For Shell ~\n"
 		    "        The value to set the TERM envirnonment variable to goes here.\n\n"
-		    "~ Blocky Scaling ~\n"
-		    "        Toggle \"blocky\" scaling.\n\n"
+		    "~ Scaling ~\n"
+		    "        Cycle scaling type.\n\n"
 		    "~ Custom Screen Mode ~\n"
 		    "        Configure the Custom screen mode.\n\n";
 		SAFEPRINTF(opts[0], "Confirm Program Exit    %s", settings.confirm_close ? "Yes" : "No");
@@ -1826,7 +1849,7 @@ change_settings(int connected)
 		SAFEPRINTF(opts[8], "Modem Dial String       %s", settings.mdm.dial_string);
 		SAFEPRINTF(opts[9], "List Path               %s", settings.list_path);
 		SAFEPRINTF(opts[10], "TERM For Shell          %s", settings.TERM);
-		sprintf(opts[11], "Blocky Scaling          %s", settings.blocky ? "On" : "Off");
+		sprintf(opts[11],   "Scaling                 %s", scaling_names[settings_to_scale()]);
 		if (connected)
 			opt[12] = NULL;
 		else
@@ -2091,12 +2114,19 @@ change_settings(int connected)
 					check_exit(false);
 				break;
 			case 11:
-				settings.blocky = !settings.blocky;
+				i = settings_to_scale();
+				i++;
+				if (i == 3)
+					i = 0;
+				scale_to_settings(i);
+
 				iniSetBool(&inicontents, "SyncTERM", "BlockyScaling", settings.blocky, &ini_style);
+				iniSetBool(&inicontents, "SyncTERM", "ExternalScaling", settings.extern_scale, &ini_style);
 				if (settings.blocky)
 					cio_api.options |= CONIO_OPT_BLOCKY_SCALING;
 				else
 					cio_api.options &= ~CONIO_OPT_BLOCKY_SCALING;
+				setscaling_type(settings.extern_scale ? CIOLIB_SCALING_EXTERNAL : CIOLIB_SCALING_INTERNAL);
 				break;
 			case 12:
 				uifc.helpbuf = "`Custom Screen Mode`\n\n"
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index d9db4fea585b48b98a802ba46c6e6da2edbd91cf..b47e999d2a08e236bff7bcaf8bbddf7fba84dc86 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -1330,6 +1330,7 @@ load_settings(struct syncterm_settings *set)
 	iniReadString(inifile, "SyncTERM", "ListPath", set->list_path, set->list_path);
 	set->scaling_factor = iniReadFloat(inifile, "SyncTERM", "ScalingFactor", 0);
 	set->blocky = iniReadBool(inifile, "SyncTERM", "BlockyScaling", true);
+	set->extern_scale = iniReadBool(inifile, "SyncTERM", "ExternalScaling", false);
 
         // TODO: Add this to the UI somewhere.
 	set->left_just = iniReadBool(inifile, "SyncTERM", "LeftJustify", false);
@@ -1703,6 +1704,7 @@ main(int argc, char **argv)
 		cio_api.options |= CONIO_OPT_BLOCKY_SCALING;
 	else
 		cio_api.options &= ~CONIO_OPT_BLOCKY_SCALING;
+	ciolib_initial_scaling_type = (settings.extern_scale ? CIOLIB_SCALING_EXTERNAL : CIOLIB_SCALING_INTERNAL);
 #ifdef HAS_BITMAP
 	ciolib_r2yptr = r2y;
 	ciolib_y2rptr = y2r;
diff --git a/src/syncterm/syncterm.h b/src/syncterm/syncterm.h
index b91201c600fb42fa1feca0ac84721a47818d9f1c..4f6031743415a85d3cd29c22d7c4c56aef83ea4a 100644
--- a/src/syncterm/syncterm.h
+++ b/src/syncterm/syncterm.h
@@ -76,6 +76,7 @@ struct syncterm_settings {
 	int                   window_height;
 	int                   left_just;
 	int                   blocky;
+	int                   extern_scale;
 };
 
 extern char                    *inpath;