diff --git a/Mac/Lib/test/twedit.py b/Mac/Lib/test/twedit.py
new file mode 100644
index 0000000..11913c9
--- /dev/null
+++ b/Mac/Lib/test/twedit.py
@@ -0,0 +1,86 @@
+# Test waste module.
+# Draw a window in which the user can type.
+#
+# This test expects Win, Evt and FrameWork (and anything used by those)
+# to work.
+#
+# Actually, it is more a test of FrameWork by now....
+
+from FrameWork import *
+import Win
+import Qd
+import waste
+import WASTEconst
+import os
+
+class WasteWindow(Window):
+	def open(self, name):
+		r = (40, 40, 400, 300)
+		w = Win.NewWindow(r, name, 1, 0, -1, 1, 0x55555555)
+		r2 = (0, 0, 400-40-16, 300-40-16)
+		Qd.SetPort(w)
+		flags = WASTEconst.weDoAutoScroll | WASTEconst.weDoOutlineHilite | \
+			WASTEconst.weDoMonoStyled 
+		self.ted = waste.WENew(r2, r2, flags)
+		w.DrawGrowIcon()
+		self.wid = w
+		self.do_postopen()
+		
+	def do_idle(self):
+		self.ted.WEIdle()
+		
+	def do_activate(self, onoff, evt):
+		if onoff:
+			self.ted.WEActivate()
+		else:
+			self.ted.WEDeactivate()
+
+	def do_update(self, wid, event):
+		Qd.EraseRect(wid.GetWindowPort().portRect)
+		self.ted.WEUpdate(wid.GetWindowPort().visRgn)
+		
+	def do_contentclick(self, local, modifiers, evt):
+		(what, message, when, where, modifiers) = evt
+		self.ted.WEClick(local, modifiers, when)
+
+	def do_char(self, ch, event):
+		(what, message, when, where, modifiers) = event
+		self.ted.WEKey(ord(ch), modifiers)
+
+class TestWaste(Application):
+	def __init__(self):
+		Application.__init__(self)
+		self.num = 0
+		self.listoflists = []
+		
+	def makeusermenus(self):
+		self.filemenu = m = Menu(self.menubar, "File")
+		self.newitem = MenuItem(m, "New window...", "O", self.open)
+		self.quititem = MenuItem(m, "Quit", "Q", self.quit)
+	
+	def open(self, *args):
+		w = WasteWindow(self)
+		w.open('Window %d'%self.num)
+		self.num = self.num + 1
+		self.listoflists.append(w)
+		
+	def quit(self, *args):
+		raise self
+
+	def do_about(self, id, item, window, event):
+		EasyDialogs.Message("""Test the WASTE interface.
+		Simple window in which you can type""")
+		
+	def do_idle(self, *args):
+		for l in self.listoflists:
+			l.do_idle()
+
+def main():
+	print 'Open app'
+	App = TestWaste()
+	print 'run'
+	App.mainloop()
+	
+if __name__ == '__main__':
+	main()
+	
