diff --git a/Mac/Lib/test/tmenu.py b/Mac/Lib/test/tmenu.py
deleted file mode 100644
index bc972a8..0000000
--- a/Mac/Lib/test/tmenu.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# Create hierarchical menus for some volumes.
-
-import os
-from Menu import *
-import macfs
-import sys
-
-def main():
-	global oldbar
-	my_volumes = []
-	while 1:
-		fss, ok = macfs.GetDirectory()
-		if not ok:
-			break
-		my_volumes.append(fss.as_pathname())
-	if not my_volumes:
-		return
-	oldbar = GetMenuBar()
-	ClearMenuBar()
-	makevolmenus(my_volumes)
-	DrawMenuBar()
-
-def reset():
-	oldbar.SetMenuBar()
-	DrawMenuBar()
-
-id = 1
-def nextid():
-	global id
-	nid = id
-	id = id+1
-	return nid
-
-def makevolmenus(volumes):
-	for vol in volumes:
-		makevolmenu(vol)
-
-def makevolmenu(vol):
-	menu = NewMenu(nextid(), vol)
-	adddirectory(menu, vol)
-	menu.InsertMenu(0)
-
-def adddirectory(menu, dir, maxdepth = 1):
-	print "adddirectory:", `dir`, maxdepth
-	files = os.listdir(dir)
-	item = 0
-	for file in files:
-		item = item+1
-		menu.AppendMenu('x')		# add a dummy string
-		menu.SetMenuItemText(item, file)	# set the actual text
-		fullname = os.path.join(dir, file)
-		if os.path.isdir(fullname):
-			menu.SetMenuItemText(item, ':' + file + ':')	# append colons
-			if maxdepth > 0:
-				id = nextid()
-				submenu = NewMenu(id, fullname)
-				adddirectory(submenu, fullname, maxdepth-1)
-				submenu.InsertMenu(-1)
-				# If the 'Cmd' is 0x1B, then the 'Mark' is the submenu id
-				menu.SetItemMark(item, id)
-				menu.SetItemCmd(item, 0x1B)
-	if not files:
-		menu.AppendMenu(':')	# dummy item to make it selectable
-	return menu
-
-if __name__ == '__main__':
-	main()
-	sys.exit(1)   # To allow the user to interact...
