diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h
index 372871e..fa61709 100644
--- a/Mac/Include/macglue.h
+++ b/Mac/Include/macglue.h
@@ -130,6 +130,8 @@
 void PyMac_Exit(int);
 void PyMac_InitApplication(void);
 void PyMac_OutputSeen(void);
+void PyMac_OutputNotSeen(void);
+int PyMac_GetDelayConsoleFlag(void);
 #ifdef USE_MAC_APPLET_SUPPORT
 void PyMac_InitApplet(void);
 #endif
diff --git a/Mac/Include/pythonresources.h b/Mac/Include/pythonresources.h
index 9bb8998..29026a8 100644
--- a/Mac/Include/pythonresources.h
+++ b/Mac/Include/pythonresources.h
@@ -137,7 +137,7 @@
 #define PYTHONOPTIONS_ID 228
 #define PYTHONOPTIONSOVERRIDE_ID 229
 
-#define POPT_VERSION_CURRENT	6	/* Current version number */
+#define POPT_VERSION_CURRENT	7	/* Current version number */
 #define   POPT_KEEPCONSOLE_NEVER  0
 #define   POPT_KEEPCONSOLE_OUTPUT 1
 #define   POPT_KEEPCONSOLE_ERROR  2
@@ -158,6 +158,7 @@
 	unsigned char	tabwarn;
 	unsigned char	nosite;
 	unsigned char	nonavservice;
+	unsigned char	delayconsole;
 } PyMac_PrefRecord;
 #endif
 
diff --git a/Mac/Lib/pythonprefs.py b/Mac/Lib/pythonprefs.py
index 81d095f..0ae3e36 100644
--- a/Mac/Lib/pythonprefs.py
+++ b/Mac/Lib/pythonprefs.py
@@ -16,14 +16,14 @@
 OVERRIDE_GUSI_ID = 10241
 
 # version
-CUR_VERSION=6
+CUR_VERSION=7
 
 preffilename = PstringLoader(AnyResLoader('STR ', resname=PREFNAME_NAME)).load()
 pref_fss = preferencefile(preffilename, 'Pyth', 'pref')
 
 class PoptLoader(VersionLoader):
 	def __init__(self, loader):
-		VersionLoader.__init__(self, "bbbbbbbbbbbbb", loader)
+		VersionLoader.__init__(self, "bbbbbbbbbbbbbb", loader)
 		
 	def versioncheck(self, data):
 		if data[0] == CUR_VERSION:
@@ -44,16 +44,11 @@
 		tp = self.data[0:4]
 		cr = self.data[4:8]
 		flags = ord(self.data[9])
-		delay = ((flags & 0x20) == 0x20)
-		return cr, tp, delay
+		return cr, tp
 		
-	def save(self, (cr, tp, delay)):
+	def save(self, (cr, tp)):
 		flags = ord(self.data[9])
-		if delay:
-			flags = flags | 0x20
-		else:
-			flags = flags & ~0x20
-		newdata = tp + cr + self.data[8] + chr(flags) + self.data[10:]
+		newdata = tp + cr + self.data[8:]
 		self.loader.save(newdata)
 		
 popt_default_default = NullLoader(chr(CUR_VERSION) + 8*'\0')
@@ -85,23 +80,23 @@
 		diralias = self.dir.load()
 		dirfss, dummy = macfs.RawAlias(diralias).Resolve()
 		dict['dir'] = dirfss
-		dict['creator'], dict['type'], dict['delayconsole'] = self.gusi.load()
+		dict['creator'], dict['type'] = self.gusi.load()
 		flags = self.popt.load()
 		dict['version'], dict['inspect'], dict['verbose'], dict['optimize'], \
 			dict['unbuffered'], dict['debugging'], dummy, dict['keep_console'], \
 			dict['nointopt'], dict['noargs'], dict['tabwarn'], \
-			dict['nosite'], dict['nonavservice'] = flags
+			dict['nosite'], dict['nonavservice'], dict['delayconsole'] = flags
 		return dict
 		
 	def save(self, dict):
 		self.path.save(dict['path'])
 		diralias = macfs.FSSpec(dict['dir']).NewAlias().data
 		self.dir.save(diralias)
-		self.gusi.save((dict['creator'], dict['type'], dict['delayconsole']))
+		self.gusi.save((dict['creator'], dict['type']))
 		flags = dict['version'], dict['inspect'], dict['verbose'], dict['optimize'], \
 			dict['unbuffered'], dict['debugging'], 0, dict['keep_console'], \
 			dict['nointopt'], dict['noargs'], dict['tabwarn'], \
-			dict['nosite'], dict['nonavservice']
+			dict['nosite'], dict['nonavservice'], dict['delayconsole']
 		self.popt.save(flags)
 
 def AppletOptions(file):
diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c
index ade635e..6321421 100644
--- a/Mac/Python/macglue.c
+++ b/Mac/Python/macglue.c
@@ -539,6 +539,25 @@
 	return 0;
 }
 
+#if 0
+/*
+** This routine is called if we know that an external library yielded
+** to background tasks, so we shouldn't count that time in our computation
+** of how much CPU we used.
+** This happens with SIOUX, and the routine is called from our modified
+** GUSISIOUX.
+*/
+void
+PyMac_LibraryDidYield(int howlong)
+{
+	unsigned long maxnextcheck = (unsigned long)LMGetTicks() + schedparams.check_interval;
+	
+	schedparams.next_check = schedparams.next_check + howlong;
+	if (schedparams.next_check > maxnextcheck )
+		schedparams.next_check = maxnextcheck;
+}
+#endif
+
 int
 PyOS_InterruptOccurred()
 {
diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c
index 8dfbdaf..09d8648 100644
--- a/Mac/Python/macmain.c
+++ b/Mac/Python/macmain.c
@@ -53,9 +53,9 @@
 #ifdef USE_MAC_SHARED_LIBRARY
 extern PyMac_AddLibResources(void);
 #endif
-#ifdef USE_GUSI
-#include "GUSISIOUX.h"
-#endif
+//#ifdef USE_GUSI
+//#include "GUSISIOUX.h"
+//#endif
 
 #define STARTUP "PythonStartup"
 
@@ -71,6 +71,14 @@
 static char **orig_argv;
 static int  orig_argc;
 
+/* A flag which remembers whether the user has acknowledged all the console
+** output (by typing something)
+*/
+#define STATE_UNKNOWN 0
+#define STATE_LASTREAD 1
+#define STATE_LASTWRITE 2
+int console_output_state = STATE_UNKNOWN;
+
 PyMac_PrefRecord PyMac_options;
 
 static void Py_Main(int, char **); /* Forward */
@@ -544,12 +552,20 @@
 void
 PyMac_OutputSeen()
 {
-#ifdef GUSISIOUX_STATE_UNKNOWN
-	gusisioux_state = GUSISIOUX_STATE_LASTREAD;
-#endif
+	console_output_state = STATE_LASTREAD;
 }
 
 /*
+** Set the "unseen output" flag
+*/
+void
+PyMac_OutputNotSeen()
+{
+	console_output_state = STATE_LASTWRITE;
+}
+	
+
+/*
 ** Terminate application
 */
 void
@@ -569,15 +585,11 @@
 		keep = 0;
 		break;
 	case POPT_KEEPCONSOLE_OUTPUT:
-#ifdef GUSISIOUX_STATE_UNKNOWN
-		if (gusisioux_state == GUSISIOUX_STATE_LASTWRITE ||
-				gusisioux_state == GUSISIOUX_STATE_UNKNOWN )
+		if (console_output_state == STATE_LASTWRITE ||
+				console_output_state == STATE_UNKNOWN )
 			keep = 1;
 		else
 			keep = 0;
-#else
-		keep = 1;
-#endif
 		break;
 	case POPT_KEEPCONSOLE_ERROR:
 		keep = (status != 0);
@@ -636,3 +648,9 @@
 {
 	return PyMac_GetPythonDir();
 }
+
+int
+PyMac_GetDelayConsoleFlag()
+{
+	return (int)PyMac_options.delayconsole;
+}
\ No newline at end of file
diff --git a/Mac/Python/pyGUSISIOUX.cp b/Mac/Python/pyGUSISIOUX.cp
new file mode 100644
index 0000000..795e10e
--- /dev/null
+++ b/Mac/Python/pyGUSISIOUX.cp
@@ -0,0 +1,209 @@
+/*
+** Modified version of GUSISIOUX.cp especially for Python.
+** Changes (by Jack):
+** - Optionally delay the console window until something is written to it.
+** - Tell the upper layers whether the last command was a read or a write.
+** - Tell SIOUX not to use WaitNextEvent (both Python and SIOUX trying to be
+**   nice to background apps means we're yielding almost 100% of the time).
+** - Make sure signals are processed when returning from read/write.
+*/
+#define GUSI_SOURCE
+#include "GUSIInternal.h"
+#include "GUSISIOUX.h"
+#include "GUSIDevice.h"
+#include "GUSIDescriptor.h"
+#include "GUSIBasics.h"
+#include "GUSIDiag.h"
+//#ifndef WITHOUT_JACK_MODS
+//#include "GUSIConfig.h"
+//#endif
+
+#include <LowMem.h>
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <console.h>
+
+#include "Python.h"
+#include "macglue.h"
+extern Boolean SIOUXUseWaitNextEvent;
+
+class GUSISIOUXSocket : public GUSISocket {
+public:
+	~GUSISIOUXSocket();
+	
+	
+ssize_t	read(const GUSIScatterer & buffer);
+ssize_t write(const GUSIGatherer & buffer);
+virtual int	ioctl(unsigned int request, va_list arg);
+virtual int	fstat(struct stat * buf);
+virtual int	isatty();
+bool select(bool * canRead, bool * canWrite, bool *);
+
+	static GUSISIOUXSocket *	Instance();
+private:
+	static GUSISIOUXSocket *	sInstance;
+	
+	GUSISIOUXSocket();
+	bool initialized;
+	void Initialize();
+	bool fDelayConsole;
+};
+class GUSISIOUXDevice : public GUSIDevice {
+public:
+	static GUSISIOUXDevice *	Instance();
+
+	
+virtual bool Want(GUSIFileToken & file);
+virtual GUSISocket * open(GUSIFileToken &, int flags);
+private:
+	GUSISIOUXDevice() 								{}
+	
+	static GUSISIOUXDevice *	sInstance;
+};
+GUSISIOUXSocket * GUSISIOUXSocket::sInstance;
+
+GUSISIOUXSocket * GUSISIOUXSocket::Instance()
+{
+	if (!sInstance)
+		if (sInstance = new GUSISIOUXSocket)
+			sInstance->AddReference();
+
+	return sInstance;
+}
+// This declaration lies about the return type
+extern "C" void SIOUXHandleOneEvent(EventRecord *userevent);
+
+GUSISIOUXSocket::GUSISIOUXSocket() 
+{
+	if (PyMac_GetDelayConsoleFlag())
+		fDelayConsole = true;
+	else
+		fDelayConsole = false;
+	if ( fDelayConsole )
+		initialized = 0;
+	else
+		Initialize();
+	/* Tell the upper layers there's no unseen output */
+	PyMac_OutputSeen();
+}
+
+void
+GUSISIOUXSocket::Initialize()
+{
+	initialized = 1;
+	InstallConsole(0);
+	GUSISetHook(GUSI_EventHook+nullEvent, 	(GUSIHook)SIOUXHandleOneEvent);
+	GUSISetHook(GUSI_EventHook+mouseDown, 	(GUSIHook)SIOUXHandleOneEvent);
+	GUSISetHook(GUSI_EventHook+mouseUp, 	(GUSIHook)SIOUXHandleOneEvent);
+	GUSISetHook(GUSI_EventHook+updateEvt, 	(GUSIHook)SIOUXHandleOneEvent);
+	GUSISetHook(GUSI_EventHook+diskEvt, 	(GUSIHook)SIOUXHandleOneEvent);
+	GUSISetHook(GUSI_EventHook+activateEvt, (GUSIHook)SIOUXHandleOneEvent);
+	GUSISetHook(GUSI_EventHook+osEvt, 		(GUSIHook)SIOUXHandleOneEvent);
+}
+GUSISIOUXSocket::~GUSISIOUXSocket()
+{
+	if ( !initialized ) return;
+	RemoveConsole();
+}
+ssize_t GUSISIOUXSocket::read(const GUSIScatterer & buffer)
+{
+	if ( !initialized ) Initialize();
+	GUSIStdioFlush();
+	PyMac_OutputSeen();
+	return buffer.SetLength(
+		ReadCharsFromConsole((char *) buffer.Buffer(), (int)buffer.Length()));
+	GUSIContext::Yield(kGUSIPoll);
+}
+ssize_t GUSISIOUXSocket::write(const GUSIGatherer & buffer)
+{
+	ssize_t rv;
+			
+	if ( !initialized ) Initialize();
+	PyMac_OutputNotSeen();
+	SIOUXUseWaitNextEvent = false;
+	rv = WriteCharsToConsole((char *) buffer.Buffer(), (int)buffer.Length());
+	GUSIContext::Yield(kGUSIPoll);
+	return rv;
+}
+int GUSISIOUXSocket::ioctl(unsigned int request, va_list)
+{
+	switch (request)	{
+	case FIOINTERACTIVE:
+		return 0;
+	default:
+		return GUSISetPosixError(EOPNOTSUPP);
+	}
+}
+int	GUSISIOUXSocket::fstat(struct stat * buf)
+{
+	GUSISocket::fstat(buf);
+	buf->st_mode =	S_IFCHR | 0666;
+	
+	return 0;
+}
+int GUSISIOUXSocket::isatty()
+{ 
+	return 1;
+}
+static bool input_pending()
+{
+#if !TARGET_API_MAC_CARBON
+	// Jack thinks that completely removing this code is a bit
+	// too much...
+	QHdrPtr eventQueue = LMGetEventQueue();
+	EvQElPtr element = (EvQElPtr)eventQueue->qHead;
+	
+	// now, count the number of pending keyDown events.
+	while (element != nil) {
+		if (element->evtQWhat == keyDown || element->evtQWhat == autoKey)
+			return true;
+		element = (EvQElPtr)element->qLink;
+	}
+#endif
+	return false;
+}
+
+bool GUSISIOUXSocket::select(bool * canRead, bool * canWrite, bool *)
+{
+	if ( !initialized ) Initialize();
+	bool cond = false;
+	if (canRead)
+		if (*canRead = input_pending())
+			cond = true;
+	if (canWrite)
+		cond = *canWrite = true;
+		
+	return cond;
+}
+GUSISIOUXDevice * GUSISIOUXDevice::sInstance;
+GUSISIOUXDevice * GUSISIOUXDevice::Instance()
+{
+	if (!sInstance)
+		sInstance = new GUSISIOUXDevice();
+	return sInstance;
+}
+bool GUSISIOUXDevice::Want(GUSIFileToken & file)
+{
+	switch (file.WhichRequest()) {
+	case GUSIFileToken::kWillOpen:
+		return file.IsDevice() && (file.StrStdStream(file.Path()) > -1);
+	default:
+		return false;
+	}
+}
+GUSISocket * GUSISIOUXDevice::open(GUSIFileToken &, int)
+{
+	return GUSISIOUXSocket::Instance();
+}
+void GUSISetupConsoleDescriptors()
+{
+	GUSIDescriptorTable * table = GUSIDescriptorTable::Instance();
+	GUSISIOUXSocket *     SIOUX = GUSISIOUXSocket::Instance();
+	
+	table->InstallSocket(SIOUX);
+	table->InstallSocket(SIOUX);
+	table->InstallSocket(SIOUX);
+}
diff --git a/Mac/Resources/pythonpath.r b/Mac/Resources/pythonpath.r
index 2739b19..b127d9f 100644
--- a/Mac/Resources/pythonpath.r
+++ b/Mac/Resources/pythonpath.r
@@ -25,6 +25,7 @@
 	byte newStandardExceptions = 0, oldStandardExceptions = 1;
 	byte sitePython = 0, noSitePython = 1;
 	byte navService = 0, noNavService = 1;
+	byte noDelayConsole = 0, delayConsole = 1;
 };
 
 type 'TMPL' {
@@ -53,6 +54,7 @@
 		"Old standard exceptions",		'DBYT',
 		"No site-python support",		'DBYT',
 		"No NavServices in macfs",		'DBYT',
+		"Delay console window",			'DBYT',
 	}
 };
 
@@ -72,6 +74,7 @@
 	newStandardExceptions,
 	sitePython,
 	navService,
+	noDelayConsole,
 };
 
 /* The sys.path initializer */
