diff --git a/Mac/Lib/quietconsole.py b/Mac/Lib/quietconsole.py
new file mode 100644
index 0000000..21e7755
--- /dev/null
+++ b/Mac/Lib/quietconsole.py
@@ -0,0 +1,110 @@
+"""quietconsole - A module to keep console I/O quiet but dump it when needed"""
+import types
+import sys
+
+class _PseudoStdin:
+	def __init__(self, stdouterr):
+		self.keep_stdin = sys.stdin
+		sys.stdin = self
+		self.keep_stdouterr = stdouterr
+		
+	def __del__(self):
+		self.keep_stdin = self.keep_stdouterr = None
+		
+	def _revert(self):
+		"""Return to old state, with true stdio"""
+		if self.keep_stdin == None:
+			return
+		sys.stdin = self.keep_stdin
+		self.keep_stdin = None
+		self.keep_stdouterr._revert(1)
+		self.keep_stdouterr = None
+		
+	def read(self, *args):
+		self._revert()
+		return apply(sys.stdin.read, args)
+		
+	def readlines(self, *args):
+		self._revert()
+		return apply(sys.stdin.readlines, args)
+	
+	def readline(self, *args):
+		self._revert()
+		return apply(sys.stdin.readline, args)
+		
+	def close(self):
+		self._revert()
+		sys.stdin.close()
+		
+class _PseudoStdouterr:
+	def __init__(self):
+		self.keep_stdout = sys.stdout
+		self.keep_stderr = sys.stderr
+		sys.stdout = sys.stderr = self
+		self.data = []
+		
+	def __del__(self):
+		self.keep_stdout = self.keep_stderr = None
+		
+	def _revert(self, dumpdata=0):
+		if self.keep_stdout == None:
+			return
+		sys.stdout = self.keep_stdout
+		sys.stderr = self.keep_stderr
+		sys.keep_stdout = self.keep_stderr = None
+		if dumpdata and self.data:
+			for d in self.data:
+				sys.stdout.write(d)
+		self.data = None
+		
+	def write(self, arg):
+		self.data.append(arg)
+		
+	def writelines(self, arg):
+		for d in arg:
+			self.data.append(arg)
+			
+	def close(self):
+		self.keep_stdout = self.keep_stderr = self.data = None
+		
+beenhere = 0
+		
+def install():
+	global beenhere
+	if beenhere:
+		return
+	beenhere = 1
+	# There's no point in re-installing if the console has been active
+	obj = _PseudoStdouterr()
+	_PseudoStdin(obj)
+	# No need to keep the objects, they're saved in sys.std{in,out,err}
+	
+def revert():
+	if type(sys.stdin) == types.FileType:
+		return	# Not installed
+	sys.stdin._revert()
+	
+def _test():
+	import time
+	install()
+	print "You will not see this yet"
+	time.sleep(1)
+	print "You will not see this yet"
+	time.sleep(1)
+	print "You will not see this yet"
+	time.sleep(1)
+	print "You will not see this yet"
+	time.sleep(1)
+	print "You will not see this yet"
+	time.sleep(1)
+	print "5 seconds have passed, now you may type something"
+	rv = sys.stdin.readline()
+	print "You typed", rv
+	
+if __name__ == '__main__':
+	_test()
+	
+	
+		
+		
+		
