diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c
index ef48b3b27f716f94f842e4da755b9d2ceb2d88a1..a5a582bc642d83cf77524a503cf6ce4784e505c9 100644
--- a/src/conio/bitmap_con.c
+++ b/src/conio/bitmap_con.c
@@ -1572,16 +1572,25 @@ struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, ui
 	return pixels;
 }
 
-uint32_t *bitmap_get_modepalette(void)
+uint32_t *bitmap_get_modepalette(uint32_t p[16])
 {
 	uint32_t *ret;
 
 	pthread_mutex_lock(&vstatlock);
-	ret = vstat.palette;
+	memcpy(p, vstat.palette, sizeof(vstat.palette));
+	ret = p;
 	pthread_mutex_unlock(&vstatlock);
 	return ret;
 }
 
+int bitmap_set_modepalette(uint32_t p[16])
+{
+	pthread_mutex_lock(&vstatlock);
+	memcpy(vstat.palette, p, sizeof(vstat.palette));
+	pthread_mutex_unlock(&vstatlock);
+	return 0;
+}
+
 /***********************/
 /* Called from drivers */
 /***********************/
diff --git a/src/conio/bitmap_con.h b/src/conio/bitmap_con.h
index bbe6b90c4af85e2763cd27eaca6d68a20313d85e..8edebbe6d9fe8cc83071e00f23c4ae3e651978f2 100644
--- a/src/conio/bitmap_con.h
+++ b/src/conio/bitmap_con.h
@@ -28,7 +28,7 @@ int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp);
 int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour);
 int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *, void *mask);
 struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey);
-uint32_t *bitmap_get_modepalette(void);
+uint32_t *bitmap_get_modepalette(uint32_t p[16]);
 #endif
 
 #ifdef BITMAP_CIOLIB_DRIVER
diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c
index eb658209110aba97a26c6924076f9a8eaae901a4..937c868f15489e2e9ef0755700813d7a1179a852 100644
--- a/src/conio/ciolib.c
+++ b/src/conio/ciolib.c
@@ -134,7 +134,8 @@ CIOLIBEXPORT struct ciolib_screen * CIOLIBCALL ciolib_savescreen(void);
 CIOLIBEXPORT void CIOLIBCALL ciolib_freescreen(struct ciolib_screen *);
 CIOLIBEXPORT int CIOLIBCALL ciolib_restorescreen(struct ciolib_screen *scrn);
 CIOLIBEXPORT void CIOLIBCALL ciolib_setcolour(uint32_t fg, uint32_t bg);
-CIOLIBEXPORT uint32_t * CIOLIBCALL ciolib_get_modepalette(void);
+CIOLIBEXPORT uint32_t * CIOLIBCALL ciolib_get_modepalette(uint32_t p[16]);
+CIOLIBEXPORT int CIOLIBCALL ciolib_set_modepalette(uint32_t p[16]);
 
 #if defined(WITH_SDL) || defined(WITH_SDL_AUDIO)
 int sdl_video_initialized = 0;
@@ -1890,11 +1891,20 @@ CIOLIBEXPORT void CIOLIBCALL ciolib_setcolour(uint32_t fg, uint32_t bg)
 	ciolib_bg = bg;
 }
 
-CIOLIBEXPORT uint32_t * CIOLIBCALL ciolib_get_modepalette(void)
+CIOLIBEXPORT uint32_t * CIOLIBCALL ciolib_get_modepalette(uint32_t p[16])
 {
 	CIOLIB_INIT();
 
 	if (cio_api.get_modepalette)
-		return cio_api.get_modepalette();
+		return cio_api.get_modepalette(p);
 	return NULL;
 }
+
+CIOLIBEXPORT int CIOLIBCALL ciolib_set_modepalette(uint32_t p[16])
+{
+	CIOLIB_INIT();
+
+	if (cio_api.set_modepalette)
+		return cio_api.set_modepalette(p);
+	return 0;
+}
diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h
index 804a9de116d42fc28568dbb98b556edcf52ca399..60e100b9b5387441933b77c542b70a456dafc3fb 100644
--- a/src/conio/ciolib.h
+++ b/src/conio/ciolib.h
@@ -360,7 +360,8 @@ typedef struct {
 	int		(*setpixel)	(uint32_t x, uint32_t y, uint32_t colour);
 	struct ciolib_pixels *(*getpixels)(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey);
 	int		(*setpixels)(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask);
-	uint32_t 	*(*get_modepalette)(void);
+	uint32_t 	*(*get_modepalette)(uint32_t[16]);
+	int	(*set_modepalette)(uint32_t[16]);
 } cioapi_t;
 
 CIOLIBEXPORTVAR cioapi_t cio_api;
@@ -448,7 +449,8 @@ CIOLIBEXPORT struct ciolib_screen * CIOLIBCALL ciolib_savescreen(void);
 CIOLIBEXPORT void CIOLIBCALL ciolib_freescreen(struct ciolib_screen *);
 CIOLIBEXPORT int CIOLIBCALL ciolib_restorescreen(struct ciolib_screen *scrn);
 CIOLIBEXPORT void CIOLIBCALL ciolib_setcolour(uint32_t fg, uint32_t bg);
-CIOLIBEXPORT uint32_t * CIOLIBCALL ciolib_get_modepalette(void);
+CIOLIBEXPORT uint32_t * CIOLIBCALL ciolib_get_modepalette(uint32_t[16]);
+CIOLIBEXPORT int CIOLIBCALL ciolib_set_modepalette(uint32_t[16]);
 
 /* DoorWay specific stuff that's only applicable to ANSI mode. */
 CIOLIBEXPORT void CIOLIBCALL ansi_ciolib_setdoorway(int enable);
@@ -524,7 +526,8 @@ CIOLIBEXPORT void CIOLIBCALL ansi_ciolib_setdoorway(int enable);
 	#define freescreen(a)			ciolib_freescreen(a)
 	#define restorescreen(a)		ciolib_restorescreen(a)
 	#define setcolour(a,b)			ciolib_setcolour(a,b)
-	#define get_modepalette()		ciolib_get_modepalette()
+	#define get_modepalette(a)		ciolib_get_modepalette(a)
+	#define set_modepalette(a)		ciolib_set_modepalette(a)
 #endif
 
 #ifdef WITH_SDL
diff --git a/src/conio/cterm.c b/src/conio/cterm.c
index aa527644edfe83d839a8e154bb0027e1bfdf8143..f8ab1447518ebc2cf7e638279c09408de47105fc 100644
--- a/src/conio/cterm.c
+++ b/src/conio/cterm.c
@@ -3024,13 +3024,14 @@ CIOLIBEXPORT char* CIOLIBCALL cterm_write(struct cterminal * cterm, const void *
 	int	olddmc;
 	int oldptnm;
 	uint32_t *mpalette;
+	uint32_t palette[16];
 
 	if(!cterm->started)
 		cterm_start(cterm);
 
 	/* Now rejigger the current modes palette... */
 	/* TODO: We need a way to remap instead of fuckery */
-	mpalette = get_modepalette();
+	mpalette = get_modepalette(palette);
 	if (mpalette) {
 		for (i=0; i < 16; i++) {
 			mpalette[i] += 16;
@@ -3764,6 +3765,7 @@ CIOLIBEXPORT char* CIOLIBCALL cterm_write(struct cterminal * cterm, const void *
 	if (mpalette) {
 		for (i=0; i < 16; i++)
 			mpalette[i] -= 16;
+		set_modepalette(mpalette);
 	}
 
 	return(retbuf);