diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 436abd6..fc89b1c 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -331,19 +331,20 @@ SciKernelFunction kfunct_mappers[] = {
 	DEFUN("SetQuitStr", kSetQuitStr, "r"),
 	DEFUN("ShowMovie", kShowMovie, "..*"),
 	DEFUN("SetVideoMode", kSetVideoMode, "i"),
-	DEFUN("Platform", kPlatform, "i*"),
-	DEFUN("TextColors", kTextColors, ".*"),
 	DEFUN("TextFonts", kTextFonts, ".*"),
+	DEFUN("TextColors", kTextColors, ".*"),
+	DEFUN("Platform", kPlatform, "i*"),
 
 #if 0
 	// Stub functions
-	DEFUN("PalVary", kPalVary, "ii*"),
 	DEFUN("ShiftScreen", kShiftScreen, ".*"),
 	DEFUN("MemorySegment", kMemorySegment, ".*"),
 	DEFUN("ListOps", kListOps, ".*"),
 	DEFUN("ATan", kATan, ".*"),
 	DEFUN("MergePoly", kMergePoly, ".*"),
 	DEFUN("AssertPalette", kAssertPalette, ".*"),
+	DEFUN("TextColors", kTextColors, ".*"),
+	DEFUN("TextFonts", kTextFonts, ".*"),
 	DEFUN("Record", kRecord, ".*"),
 	DEFUN("PlayBack", kPlayBack, ".*"),
 	DEFUN("DbugStr", kDbugStr, ".*"),
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index 2e9025e..477a328 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -452,10 +452,17 @@ reg_t kResCheck(EngineState *s, int argc, reg_t *argv);
 reg_t kSetQuitStr(EngineState *s, int argc, reg_t *argv);
 reg_t kShowMovie(EngineState *s, int argc, reg_t *argv);
 reg_t kSetVideoMode(EngineState *s, int argc, reg_t *argv);
+reg_t kTextFonts(EngineState *s, int argc, reg_t *argv);
+reg_t kTextColors(EngineState *s, int argc, reg_t *argv);
 reg_t kStrSplit(EngineState *s, int argc, reg_t *argv);
 reg_t kPlatform(EngineState *s, int argc, reg_t *argv);
-reg_t kTextColors(EngineState *s, int argc, reg_t *argv);
-reg_t kTextFonts(EngineState *s, int argc, reg_t *argv);
+
+// The Unknown/Unnamed kernel function
+reg_t kStub(EngineState *s, int argc, reg_t *argv);
+// for unimplemented kernel functions
+reg_t kNOP(EngineState *s, int argc, reg_t *argv);
+// for kernel functions that don't do anything
+
 
 } // End of namespace Sci
 
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index c2d709c..fcf4a9d 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -337,7 +337,13 @@ reg_t kSetCursor(EngineState *s, int argc, reg_t *argv) {
 }
 
 reg_t kMoveCursor(EngineState *s, int argc, reg_t *argv) {
-	s->gui->moveCursor(argv[0].toSint16(), argv[1].toSint16());
+	int16 x, y;
+
+	if (argc == 2) {
+		x = argv[0].toSint16();
+		y = argv[1].toSint16();
+		s->gui->moveCursor(x, y);
+	}
 	return s->r_acc;
 }
 
@@ -525,6 +531,13 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) {
 	int maxwidth = (argc > 3) ? argv[3].toUint16() : 0;
 	int font_nr = argv[2].toUint16();
 
+	Common::String sep_str;
+	const char *sep = NULL; 
+	if ((argc > 4) && (argv[4].segment)) {
+		sep_str = s->segMan->getString(argv[4]);
+		sep = sep_str.c_str();
+	}
+
 	dest[0] = dest[1] = NULL_REG;
 
 	if (text.empty() || !dest) { // Empty text
@@ -532,9 +545,10 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) {
 		debugC(2, kDebugLevelStrings, "GetTextSize: Empty string\n");
 		return s->r_acc;
 	}
+// #####
 
 	textWidth = dest[3].toUint16(); textHeight = dest[2].toUint16();
-	s->gui->textSize(text.c_str(), font_nr, maxwidth, &textWidth, &textHeight);
+	s->gui->textSize(s->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight);
 	debugC(2, kDebugLevelStrings, "GetTextSize '%s' -> %dx%d\n", text.c_str(), textWidth, textHeight);
 
 	dest[2] = make_reg(0, textHeight);
@@ -544,6 +558,7 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) {
 
 reg_t kWait(EngineState *s, int argc, reg_t *argv) {
 	int sleep_time = argv[0].toUint16();
+
 #if 0
 	uint32 time;
 
@@ -554,12 +569,12 @@ reg_t kWait(EngineState *s, int argc, reg_t *argv) {
 	sleep_time *= g_debug_sleeptime_factor;
 	gfxop_sleep(s->gfx_state, sleep_time * 1000 / 60);
 
+	// Reset speed throttler: Game is playing along nicely anyway
+	if (sleep_time > 0)
+		s->speedThrottler->reset();
 #endif
 
-	// FIXME: we should not be asking from the GUI to wait. The kernel sounds
-	// like a better place
-	s->gui->wait(sleep_time);
-
+	s->gui->wait(sleep_time);   // FIXME: remove
 	return s->r_acc;
 }
 
@@ -894,7 +909,7 @@ reg_t kDrawPic(EngineState *s, int argc, reg_t *argv) {
 	if (argc >= 2)
 		style = argv[1].toUint16();
 	if (argc >= 3) {
-		if (!s->_kernel->usesOldGfxFunctions())
+		if (!((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions())
 			flags = !argv[2].toUint16();
 		else
 			flags = argv[2].toUint16();
@@ -1460,7 +1475,7 @@ static void _k_draw_control(EngineState *s, reg_t obj, bool inverse) {
 		cursor = GET_SEL32V(obj, cursor);
 
 		if (cursor > (signed)text.size())
-			cursor = strlen(text.c_str());
+			cursor = text.size();
 
 //		update_cursor_limits(&s->save_dir_edit_offset, &cursor, max);	FIXME: get rid of this?
 		ADD_TO_CURRENT_PICTURE_PORT(sciw_new_edit_control(s->port, obj, area, text.c_str(), font_nr, (unsigned)cursor, (int8)inverse));
@@ -1528,9 +1543,9 @@ static void _k_draw_control(EngineState *s, reg_t obj, bool inverse) {
 					selection = i + 1;
 			}
 		}
-
 		ADD_TO_CURRENT_PICTURE_PORT(sciw_new_list_control(s->port, obj, area, font_nr, entries_list, entries_nr,
 		                          list_top, selection, (int8)inverse));
+
 		free(entries_list);
 		delete[] strings;
 	}
@@ -2839,7 +2854,6 @@ reg_t kShakeScreen(EngineState *s, int argc, reg_t *argv) {
 reg_t kDisplay(EngineState *s, int argc, reg_t *argv) {
 	reg_t textp = argv[0];
 	int index = (argc > 1) ? argv[1].toUint16() : 0;
-
 	Common::String text;
 
 	if (textp.segment) {
diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp
index e46f707..5d0cbf1 100644
--- a/engines/sci/engine/kmisc.cpp
+++ b/engines/sci/engine/kmisc.cpp
@@ -131,8 +131,7 @@ reg_t kGetTime(EngineState *s, int argc, reg_t *argv) {
 
 	switch (mode) {
 	case K_NEW_GETTIME_TICKS :
-		retval = s->gui->getTimeTicks();	// FIXME
-		//retval = start_time * 60 / 1000;
+		retval = s->gui->getTimeTicks();
 		debugC(2, kDebugLevelTime, "GetTime(elapsed) returns %d", retval);
 		break;
 	case K_NEW_GETTIME_TIME_12HOUR :
diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h
index a8dbce5..398cccd 100644
--- a/engines/sci/engine/state.h
+++ b/engines/sci/engine/state.h
@@ -177,6 +177,7 @@ public:
 	/* Non-VM information */
 
 	SciGUI *gui; /* Currently active GUI */
+	SciGUI *gui32;
 
 	GfxState *gfx_state; /**< Graphics state and driver */
 	gfx_pixmap_t *old_screen; /**< Old screen content: Stored during kDrawPic() for kAnimate() */
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 2413998..5cd493e 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -915,6 +915,8 @@ void run_vm(EngineState *s, int restoring) {
 				if (!oldScriptHeader)
 					argc += scriptState.restAdjust;
 
+				//warning("kcall %X (%s)", opparams[0], kfun.orig_name.c_str());
+
 				if (kfun.signature
 						&& !kernel_matches_signature(s->segMan, kfun.signature, argc, scriptState.xs->sp + 1)) {
 					error("[VM] Invalid arguments to kernel call %x", opparams[0]);
diff --git a/engines/sci/gfx/gfx_driver.h b/engines/sci/gfx/gfx_driver.h
index 1143d8e..3627820 100644
--- a/engines/sci/gfx/gfx_driver.h
+++ b/engines/sci/gfx/gfx_driver.h
@@ -225,14 +225,14 @@ public:
 	void setPointer(gfx_pixmap_t *pointer, Common::Point *hotspot);
 	/** @} */
 
-	gfx_mode_t *getMode() { return _mode; }
-	byte *getVisual0() { return _visual[0]; }
-
 	/**
 	 * Animates palette
 	 */
 	void animatePalette(int fromColor, int toColor, int stepCount);
 
+	gfx_mode_t *getMode() { return _mode; }
+	byte *getVisual0() { return _visual[0]; }
+
 private:
 	gfx_pixmap_t *_priority[2];
 	byte *_visual[2];
diff --git a/engines/sci/gfx/res_pic.cpp b/engines/sci/gfx/res_pic.cpp
index cb628b9..7819cff 100644
--- a/engines/sci/gfx/res_pic.cpp
+++ b/engines/sci/gfx/res_pic.cpp
@@ -141,6 +141,7 @@ void gfxr_init_static_palette() {
 gfxr_pic_t *gfxr_init_pic(gfx_mode_t *mode, int ID, bool sci1) {
 	gfxr_pic_t *pic = (gfxr_pic_t*)malloc(sizeof(gfxr_pic_t));
 
+	assert(pic);
 	pic->mode = mode;
 
 	pic->control_map = gfx_pixmap_alloc_index_data(gfx_new_pixmap(320, 200, ID, 2, 0));
@@ -1154,6 +1155,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 	// Main loop
 	while (pos < size) {
 		op = *(resource + pos++);
+		warning("%X at %d", op, pos - 1);
 
 		switch (op) {
 
@@ -1213,6 +1215,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 
 			GET_ABS_COORDS(x, y);
 
+			warning("pattern %d %d", y, x);
 			_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
 			                   pattern_size, pattern_nr, style->brush_mode, titlebar_size);
 
@@ -1224,6 +1227,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 
 				GET_REL_COORDS(x, y);
 
+				warning("pattern %d %d", y, x);
 				_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
 				                   pattern_size, pattern_nr, style->brush_mode, titlebar_size);
 			}
@@ -1241,6 +1245,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 #if 0
 				fprintf(stderr, " to %d,%d\n", x, y);
 #endif
+				warning("line %d %d -> %d %d", oldy, oldx, y, x);
 				_gfxr_draw_line(pic, oldx, oldy, x, y, color, priority, control, drawenable, line_mode,
 				                PIC_OP_MEDIUM_LINES, titlebar_size);
 				oldx = x;
@@ -1253,6 +1258,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 			GET_ABS_COORDS(oldx, oldy);
 			while (*(resource + pos) < PIC_OP_FIRST) {
 				GET_ABS_COORDS(x, y);
+				warning("line %d %d -> %d %d", oldy, oldx, y, x);
 				_gfxr_draw_line(pic, oldx, oldy, x, y, color, priority, control, drawenable, line_mode,
 				                PIC_OP_LONG_LINES, titlebar_size);
 				oldx = x;
@@ -1267,6 +1273,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 			y = oldy;
 			while (*(resource + pos) < PIC_OP_FIRST) {
 				GET_REL_COORDS(x, y);
+				warning("line %d %d -> %d %d", oldy, oldx, y, x);
 				_gfxr_draw_line(pic, oldx, oldy, x, y, color, priority, control, drawenable, line_mode,
 				                PIC_OP_SHORT_LINES, titlebar_size);
 				oldx = x;
@@ -1288,6 +1295,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 
 				else
 #endif
+					warning("fill %d %d", y, x);
 					_gfxr_fill_1(pic, x, y + titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ?
 					             color : 0, priority, control, drawenable, titlebar_size);
 			}
@@ -1309,6 +1317,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 
 				GET_ABS_COORDS(x, y);
 
+				warning("pattern %d %d", y, x);
 				_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
 				                   pattern_size, pattern_nr, style->brush_mode, titlebar_size);
 			}
@@ -1336,6 +1345,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 
 			GET_ABS_COORDS(oldx, oldy);
 
+			warning("pattern %d %d", oldy, oldx);
 			_gfxr_draw_pattern(pic, oldx, oldy, color, priority, control, drawenable, pattern_code,
 			                   pattern_size, pattern_nr, style->brush_mode, titlebar_size);
 
@@ -1349,6 +1359,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
 
 				GET_MEDREL_COORDS(x, y);
 
+				warning("pattern %d %d", y, x);
 				_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
 				                   pattern_size, pattern_nr, style->brush_mode, titlebar_size);
 			}
diff --git a/engines/sci/gfx/res_view.cpp b/engines/sci/gfx/res_view.cpp
index cbe26b9..124804f 100644
--- a/engines/sci/gfx/res_view.cpp
+++ b/engines/sci/gfx/res_view.cpp
@@ -371,6 +371,7 @@ gfx_pixmap_t *gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *reso
 // [CellCount:WORD] [Unknown:WORD] [CellOffset0:WORD] [CellOffset1:WORD]...
 // SCI11:
 // [HeaderSize:WORD] [LoopCount:BYTE] [Unknown:BYTE] [??:WORD] [??:WORD] [PaletteOffset:WORD]
+
 gfxr_view_t *getVGAView(int id, byte *resource, int size, ViewType viewType) {
 	uint16 palOffset = READ_LE_UINT16(resource + V1_PALETTE_OFFSET + ((viewType == kViewVga11) ? 2 : 0));
 	uint16 headerSize = (viewType == kViewVga11) ? READ_LE_UINT16(resource + V2_HEADER_SIZE) : 0;
@@ -391,6 +392,7 @@ gfxr_view_t *getVGAView(int id, byte *resource, int size, ViewType viewType) {
 		view->palette = NULL;
 	}
 
+
 	view->loops = (gfxr_loop_t *)calloc(view->loops_nr, sizeof(gfxr_loop_t));
 
 	for (int i = 0; i < view->loops_nr; i++) {
diff --git a/engines/sci/gui/gui_gfx.cpp b/engines/sci/gui/gui_gfx.cpp
index 56ce2ec..9efc1ad 100644
--- a/engines/sci/gui/gui_gfx.cpp
+++ b/engines/sci/gui/gui_gfx.cpp
@@ -762,7 +762,8 @@ sciMemoryHandle SciGUIgfx::SaveBits(const Common::Rect &rect, byte screenMask) {
 	sciMemoryHandle memoryId;
 	byte *memoryPtr;
 	int size;
-	
+	reg_t test;
+
 	Common::Rect r(rect.left, rect.top, rect.right, rect.bottom);
 	r.clip(_curPort->rect);
 	if (r.isEmpty()) // nothing to save
diff --git a/engines/sci/gui/gui_picture.cpp b/engines/sci/gui/gui_picture.cpp
index 1f2218a..45e7fbe 100644
--- a/engines/sci/gui/gui_picture.cpp
+++ b/engines/sci/gui/gui_picture.cpp
@@ -326,11 +326,12 @@ const byte vector_defaultEGApalette[PIC_EGAPALETTE_SIZE] = {
 void SciGUIpicture::drawVectorData(byte *data, int dataSize) {
 	byte pic_op;
 	byte pic_color = 0, pic_priority = 0x0F, pic_control = 0x0F;
+	uint16 temp;
 	int16 x = 0, y = 0, oldx, oldy;
 	byte EGApalette = 0;
 	byte EGAindex = 0;
 	byte EGApalettes[PIC_EGAPALETTE_TOTALSIZE] = {0};
-	bool EGAmapping = false;
+	bool EGAmapping = !_s->resMan->isVGA();
 	int curPos = 0;
 	uint16 size;
 	byte byte;
@@ -342,9 +343,10 @@ void SciGUIpicture::drawVectorData(byte *data, int dataSize) {
 	if (_EGApaletteNo >= PIC_EGAPALETTE_COUNT)
 		_EGApaletteNo = 0;
 
-	if (getSciVersion() >= SCI_VERSION_1_EGA)
+	if (getSciVersion() >= SCI_VERSION_1_EARLY)
 		sci1 = true;
 
+
 	for (i = 0; i < PIC_EGAPALETTE_TOTALSIZE; i += PIC_EGAPALETTE_SIZE)
 		memcpy(&EGApalettes[i], &vector_defaultEGApalette, sizeof(vector_defaultEGApalette));
 
diff --git a/engines/sci/gui/gui_windowmgr.h b/engines/sci/gui/gui_windowmgr.h
index 5bac4ed..bc7ea47 100644
--- a/engines/sci/gui/gui_windowmgr.h
+++ b/engines/sci/gui/gui_windowmgr.h
@@ -39,7 +39,7 @@ public:
 	SCILanguage getSCILanguage();
 	char* StrSplit(char*buff, const char*msg, const char*fmt);
 	char* getIntlString(char*buff, const char*msg, const char*fmt, SCILanguage lang, SCILanguage prop);
-	sciWnd *SciGUIwindowMgr::NewWindow(Common::Rect *rect, Common::Rect *rect2, const char *title, uint16 style, uint16 arg8, uint16 argA);
+	sciWnd *NewWindow(Common::Rect *rect, Common::Rect *rect2, const char *title, uint16 style, uint16 arg8, uint16 argA);
 	void DrawWindow(sciWnd *wnd);
 	void DisposeWindow(sciWnd *pWnd, int16 arg2);
 	void UpdateWindow(sciWnd *wnd);
diff --git a/engines/sci/gui32/gui32.cpp b/engines/sci/gui32/gui32.cpp
index 0f504e8..0120cfd 100644
--- a/engines/sci/gui32/gui32.cpp
+++ b/engines/sci/gui32/gui32.cpp
@@ -72,7 +72,7 @@ SciGUI32::~SciGUI32() {
 }
 
 void SciGUI32::init(bool oldGfxFunctions) {
-	_usesOldGfxFunctions = oldGfxFunctions;
+	usesOldGfxFunctions = oldGfxFunctions;
 	activated_icon_bar = false;
 	port_origin_x = 0;
 	port_origin_y = 0;
@@ -94,7 +94,6 @@ void SciGUI32::wait(int16 ticks) {
 	ticks *= g_debug_sleeptime_factor;
 	gfxop_sleep(s->gfx_state, ticks * 1000 / 60);
 
-
 	// Reset speed throttler: Game is playing along nicely anyway
 	if (ticks > 0)
 		s->speedThrottler->reset();
@@ -544,7 +543,7 @@ void SciGUI32::drawPicture(sciResourceId pictureId, uint16 showStyle, uint16 fla
 
 	s->priority_first = 42;
 
-	if (_usesOldGfxFunctions)
+	if (usesOldGfxFunctions)
 		s->priority_last = 200;
 	else
 		s->priority_last = 190;
@@ -686,7 +685,7 @@ void SciGUI32::graphRestoreBox(reg_t handle) {
 }
 
 void SciGUI32::paletteSet(int resourceNo, int flags) {
-	//warning("STUB");
+	warning("STUB");
 }
 
 int16 SciGUI32::paletteFind(int r, int g, int b) {
diff --git a/engines/sci/gui32/gui32.h b/engines/sci/gui32/gui32.h
index 7c606a8..7b0576d 100644
--- a/engines/sci/gui32/gui32.h
+++ b/engines/sci/gui32/gui32.h
@@ -69,7 +69,7 @@ public:
 private:
 	OSystem *_system;
 	EngineState *s;
-	bool _usesOldGfxFunctions;
+	bool usesOldGfxFunctions;
 
 	bool activated_icon_bar;	// FIXME: Avoid non-const global vars
 	int port_origin_x;	// FIXME: Avoid non-const global vars
diff --git a/engines/sci/module.mk b/engines/sci/module.mk
index ad572a1..fd5b7aa 100644
--- a/engines/sci/module.mk
+++ b/engines/sci/module.mk
@@ -64,7 +64,7 @@ MODULE_OBJS = \
 	gui/gui_screen.o \
 	gui/gui_view.o \
 	gui/gui_windowmgr.o \
-	gui32/gui32.o \	
+	gui32/gui32.o \
 	sfx/core.o \
 	sfx/iterator.o \
 	sfx/songlib.o \
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index 11c86d8..afaeb26 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -155,8 +155,8 @@ Common::Error SciEngine::run() {
 	_gamestate->gfx_state = &gfx_state;
 
 	// GUI change
-	//_gamestate->gui = new SciGUI(_system, _gamestate);    // new
-	_gamestate->gui = new SciGUI32(_system, _gamestate);  // old
+	_gamestate->gui = new SciGUI(_system, _gamestate);
+	_gamestate->gui32 = new SciGUI32(_system, _gamestate);
 
 	// Assign default values to the config manager, in case settings are missing
 	ConfMan.registerDefault("dither_mode", "0");
@@ -188,7 +188,6 @@ Common::Error SciEngine::run() {
 		warning("Game initialization failed: Error in sound subsystem. Aborting...");
 		return Common::kUnknownError;
 	}
-
 	_gamestate->gui->init(_kernel->usesOldGfxFunctions());
 
 	printf("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion()).c_str());
