diff --git a/Mac/Lib/FrameWork.py b/Mac/Lib/FrameWork.py
index 36e951a..613f263 100644
--- a/Mac/Lib/FrameWork.py
+++ b/Mac/Lib/FrameWork.py
@@ -27,6 +27,7 @@
 import EasyDialogs
 
 kHighLevelEvent = 23	# Don't know what header file this should come from
+SCROLLBARWIDTH = 16		# Again, not a clue...
 
 
 # Map event 'what' field to strings
@@ -358,14 +359,14 @@
 	
 	def addmenu(self, title, after = 0):
 		id = self.getnextid()
-		print 'Newmenu', title, id # XXXX
+		if DEBUG: print 'Newmenu', title, id # XXXX
 		m = NewMenu(id, title)
 		m.InsertMenu(after)
 		DrawMenuBar()
 		return id, m
 		
 	def delmenu(self, id):
-		print 'Delmenu', id # XXXX
+		if DEBUG: print 'Delmenu', id # XXXX
 		DeleteMenu(id)
 	
 	def addpopup(self, title = ''):
@@ -611,6 +612,89 @@
 		else:
 			if DEBUG: print "FindControl(%s, %s) -> (%s, %s)" % \
 				(local, window, ctltype, control)
+			self.do_contentclick(local, modifiers, event)
+			
+class ScrolledWindow(ControlsWindow):
+	def __init__(self, parent):
+		self.barx = self.bary = None
+		ControlsWindow.__init__(self, parent)
+
+	def scrollbars(self, wantx=1, wanty=1):
+		SetPort(self.wid)
+		self.barx = self.bary = None
+		x0, y0, x1, y1 = self.wid.GetWindowPort().portRect
+		vx, vy = self.getscrollbarvalues()
+		if wantx:
+			rect = x0-1, y1-(SCROLLBARWIDTH-1), x1-(SCROLLBARWIDTH-2), y1+1
+			self.barx = NewControl(self.wid, rect, "", 1, vx, 0, 32767, 16, 0)
+		if wanty:
+			rect = x1-(SCROLLBARWIDTH-1), y0-1, x1+1, y1-(SCROLLBARWIDTH-2)
+			self.bary = NewControl(self.wid, rect, "", 1, vy, 0, 32767, 16, 0)
+			
+	def do_postclose(self):
+		self.barx = self.bary = None
+		ControlsWindow.do_postclose(self)
+		
+	def do_activate(self, onoff, event):
+		if onoff:
+			onoff = 0
+		else:
+			onoff = 255
+		if self.barx:
+			self.barx.HiliteControl(onoff)
+		if self.bary:
+			self.bary.HiliteControl(onoff)
+			
+	def do_postresize(self, width, height, window):
+		l, t, r, b = self.wid.GetWindowPort().portRect
+		if self.barx:
+			self.barx.MoveControl(l-1, b-(SCROLLBARWIDTH-1))
+			self.barx.SizeControl((r-l)-(SCROLLBARWIDTH-2), SCROLLBARWIDTH)
+		if self.bary:
+			self.bary.MoveControl(r-(SCROLLBARWIDTH-1), t-1)
+			self.bary.SizeControl(SCROLLBARWIDTH, (b-t)-(SCROLLBARWIDTH-2))
+		InvalRect((l, t, r, b))
+
+	def do_controlhit(self, window, control, pcode, event):
+		if control == self.barx:
+			bar = self.barx
+			which = 'x'
+		elif control == self.bary:
+			bar = self.bary
+			which = 'y'
+		else:
+			return 0
+		value = None
+		if pcode == inUpButton:
+			what = '-'
+		elif pcode == inDownButton:
+			what = '+'
+		elif pcode == inPageUp:
+			what = '--'
+		elif pcode == inPageDown:
+			what = '++'
+		else:
+			what = 'set'
+			value = bar.GetControlValue()
+		self.scrollbar_callback(which, what, value)
+		self.updatescrollbars()
+		return 1
+		
+	def updatescrollbars(self):
+		SetPort(self.wid)
+		vx, vy = self.getscrollbarvalues()
+		if self.barx:
+			self.barx.SetControlValue(vx)
+		if self.bary:
+			self.bary.SetControlValue(vy)
+			
+	# To be overridden:
+	
+	def getscrollbarvalues(self):
+		return 0, 0
+		
+	def scrollbar_callback(self, which, what, value):
+		print 'scroll', which, what, value
 	
 class DialogWindow(Window):
 	"""A modeless dialog window"""
diff --git a/Mac/Lib/test/tscrollwin.py b/Mac/Lib/test/tscrollwin.py
new file mode 100644
index 0000000..40e9d67
--- /dev/null
+++ b/Mac/Lib/test/tscrollwin.py
@@ -0,0 +1,86 @@
+# Test FrameWork scrollbars
+# 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 TE
+import os
+
+class MyWindow(ScrolledWindow):
+	def open(self, name):
+		r = (40, 40, 400, 300)
+		w = Win.NewWindow(r, name, 1, 0, -1, 1, 0x55555555)
+		self.ourrect = 0, 0, 360-SCROLLBARWIDTH-1, 260-SCROLLBARWIDTH-1
+		Qd.SetPort(w)
+		w.DrawGrowIcon()
+		self.wid = w
+		self.do_postopen()
+		self.vx = self.vy = 0
+		self.scrollbars()
+		
+	def getscrollbarvalues(self):
+		return self.vx, self.vy
+		
+	def scrollbar_callback(self, which, what, value):
+		if what == '-':
+			delta = -1
+		elif what == '--':
+			delta = -100
+		elif what == '+':
+			delta = 1
+		elif what == '++':
+			delta = 100
+			
+		if which == 'x':
+			if value:
+				self.vx = value
+			else:
+				self.vx = self.vx + delta
+		else:
+			if value:
+				self.vy = value
+			else:
+				self.vy = self.vy + delta
+		Win.InvalRect(self.ourrect)
+
+	def do_update(self, wid, event):
+		Qd.EraseRect(self.ourrect)
+		Qd.MoveTo(40, 40)
+		Qd.DrawString("x=%d, y=%d"%(self.vx, self.vy))
+
+class TestSW(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 = MyWindow(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 scrolling FrameWork windows""")
+
+def main():
+	App = TestSW()
+	App.mainloop()
+	
+if __name__ == '__main__':
+	main()
+	
