diff --git a/Mac/Tools/IDE/PyBrowser.py b/Mac/Tools/IDE/PyBrowser.py
index d59fb7e..67831c0 100644
--- a/Mac/Tools/IDE/PyBrowser.py
+++ b/Mac/Tools/IDE/PyBrowser.py
@@ -143,6 +143,7 @@
 		newcol = -1
 		#W.SetCursor('fist')
 		while Evt.Button():
+			Evt.WaitNextEvent(0, 1, None)  # needed for OSX
 			(x, y) = Evt.GetMouse()
 			if (x, y) <> lastpoint:
 				newcol = x + diff
@@ -307,7 +308,7 @@
 				title = title + ': ' + name
 		self.w = w = W.Window((300, 400), title, minsize = (100, 100))
 		w.info = W.TextBox((18, 8, -70, 15))
-		w.updatebutton = W.Button((-64, 4, 50, 16), 'Update', self.update)
+		w.updatebutton = W.BevelButton((-64, 4, 50, 16), 'Update', self.update)
 		w.browser = BrowserWidget((-1, 24, 1, -14), None)
 		w.bind('cmdu', w.updatebutton.push)
 		w.open()
diff --git a/Mac/Tools/IDE/PyDebugger.py b/Mac/Tools/IDE/PyDebugger.py
index 56a0658..4bbac26 100644
--- a/Mac/Tools/IDE/PyDebugger.py
+++ b/Mac/Tools/IDE/PyDebugger.py
@@ -681,7 +681,6 @@
 	
 	def __init__(self, debugger):
 		self.debugger = debugger
-		import Lists
 		self.w = W.Window((300, 250), 'Breakpoints', minsize = (200, 200))
 		self.w.panes = W.HorizontalPanes((8, 8, -8, -32), (0.3, 0.7))
 		self.w.panes.files = W.List(None, callback = self.filehit)		#, flags = Lists.lOnlyOne)
diff --git a/Mac/Tools/IDE/PyEdit.py b/Mac/Tools/IDE/PyEdit.py
index 1bebe6e..828b697 100644
--- a/Mac/Tools/IDE/PyEdit.py
+++ b/Mac/Tools/IDE/PyEdit.py
@@ -174,7 +174,7 @@
 		return '<%s>' % self.title
 	
 	def setupwidgets(self, text):
-		topbarheight = 28
+		topbarheight = 24
 		popfieldwidth = 80
 		self.lastlineno = None
 		
@@ -197,9 +197,9 @@
 		
 		self.bevelbox = W.BevelBox((0, 0, 0, topbarheight))
 		self.hline = W.HorizontalLine((0, topbarheight, 0, 0))
-		self.infotext = W.TextBox((175, 7, -4, 14), backgroundcolor = (0xe000, 0xe000, 0xe000))
-		self.runbutton = W.Button((6, 5, 60, 16), runButtonLabels[0], self.run)
-		self.runselbutton = W.Button((78, 5, 90, 16), runSelButtonLabels[0], self.runselection)
+		self.infotext = W.TextBox((175, 6, -4, 14), backgroundcolor = (0xe000, 0xe000, 0xe000))
+		self.runbutton = W.BevelButton((6, 4, 80, 16), runButtonLabels[0], self.run)
+		self.runselbutton = W.BevelButton((90, 4, 80, 16), runSelButtonLabels[0], self.runselection)
 		
 		# bind some keys
 		editor.bind("cmdr", self.runbutton.push)
@@ -801,6 +801,7 @@
 		pattern = pattern + notwordcharspat
 	return re.compile(pattern)
 
+
 class SearchEngine:
 	
 	def __init__(self):
diff --git a/Mac/Tools/IDE/W.py b/Mac/Tools/IDE/W.py
index 22b1ea1..397b211 100644
--- a/Mac/Tools/IDE/W.py
+++ b/Mac/Tools/IDE/W.py
@@ -31,7 +31,8 @@
 	return prefs.defaultfont
 
 def Message(text):
-	import EasyDialogs, Qd, string
+	import EasyDialogs, string
+	from Carbon import Qd
 	Qd.InitCursor()
 	text = string.replace(text, "\n", "\r")
 	if not text:
diff --git a/Mac/Tools/IDE/Wapplication.py b/Mac/Tools/IDE/Wapplication.py
index 136d4ff..8839c90 100644
--- a/Mac/Tools/IDE/Wapplication.py
+++ b/Mac/Tools/IDE/Wapplication.py
@@ -9,7 +9,7 @@
 
 from Carbon import Menu; MenuToolbox = Menu; del Menu
 
-KILLUNKNOWNWINDOWS=1	# Set to 0 for debugging.
+KILLUNKNOWNWINDOWS = 0  # Set to 0 for debugging.
 
 class Application(FrameWork.Application):
 	
diff --git a/Mac/Tools/IDE/Wbase.py b/Mac/Tools/IDE/Wbase.py
index be75d8a..8019d06 100644
--- a/Mac/Tools/IDE/Wbase.py
+++ b/Mac/Tools/IDE/Wbase.py
@@ -1,4 +1,4 @@
-from Carbon import Evt, Qd, QuickDraw, Win
+from Carbon import App, Evt, Qd, QuickDraw, Win
 import string
 from types import *
 import sys
@@ -329,15 +329,7 @@
 	def drawselframe(self, onoff):
 		if not self._parentwindow._hasselframes:
 			return
-		thickrect = Qd.InsetRect(self._bounds, -3, -3)
-		state = Qd.GetPenState()
-		Qd.PenSize(2, 2)
-		if onoff:
-			Qd.PenPat(Qd.qd.black)
-		else:
-			Qd.PenPat(Qd.qd.white)
-		Qd.FrameRect(thickrect)
-		Qd.SetPenState(state)
+		App.DrawThemeFocusRect(self._bounds, onoff)
 	
 	def adjust(self, oldbounds):
 		self.SetPort()
diff --git a/Mac/Tools/IDE/Wcontrols.py b/Mac/Tools/IDE/Wcontrols.py
index 879dab5..2579449 100644
--- a/Mac/Tools/IDE/Wcontrols.py
+++ b/Mac/Tools/IDE/Wcontrols.py
@@ -17,6 +17,7 @@
 		self._min = min
 		self._max = max
 		self._enabled = 1
+		self._viewsize = 0
 	
 	def open(self):
 		self._calcbounds()
@@ -29,8 +30,8 @@
 						self._max, 
 						self._procID, 
 						0)
-		self.SetPort()
-		#self.GetWindow().ValidWindowRect(self._bounds)
+		if self._viewsize:
+			self._control.SetControlViewSize(self._viewsize)
 		self.enable(self._enabled)
 	
 	def adjust(self, oldbounds):
@@ -75,9 +76,11 @@
 			self._control.Draw1Control()
 	
 	def test(self, point):
-		ctltype, control = Ctl.FindControl(point, self._parentwindow.wid)
-		if self._enabled and control == self._control:
+		if Qd.PtInRect(point, self._bounds) and self._enabled:
 			return 1
+		#ctltype, control = Ctl.FindControl(point, self._parentwindow.wid)
+		#if self._enabled and control == self._control:
+		#	return 1
 	
 	def click(self, point, modifiers):
 		if not self._enabled:
@@ -112,16 +115,19 @@
 	
 	"""Standard push button."""
 	
+	procID = Controls.pushButProc | Controls.useWFont
+	
 	def __init__(self, possize, title = "Button", callback = None):
-		procID = Controls.pushButProc | Controls.useWFont
-		ControlWidget.__init__(self, possize, title, procID, callback, 0, 0, 1)
+		ControlWidget.__init__(self, possize, title, self.procID, callback, 0, 0, 1)
 		self._isdefault = 0
 	
 	def push(self):
 		if not self._enabled:
 			return
+		# emulate the pushing of the button
 		import time
 		self._control.HiliteControl(Controls.kControlButtonPart)
+		Qd.QDFlushPortBuffer(self._parentwindow.wid, None)  # needed under OSX
 		time.sleep(0.1)
 		self._control.HiliteControl(0)
 		if self._callback:
@@ -139,7 +145,25 @@
 		if self._visible:
 			self._control.Draw1Control()
 	
+	def open(self):
+		ControlWidget.open(self)
+		if self._isdefault:
+			self._setdefault(self._isdefault)
+	
 	def _setdefault(self, onoff):
+		c = self._control
+		if c is not None:
+			if onoff:
+				data = "\xFF"
+			else:
+				data = "\0"
+			# hide before changing state, otherwise the button isn't always
+			# redrawn correctly, although it's quite different under Aqua
+			# and Classic...
+			c.HideControl()
+			c.SetControlData(Controls.kControlNoPart,
+					Controls.kControlPushButtonDefaultTag, data)
+			c.ShowControl()
 		self._isdefault = onoff
 	
 	def adjust(self, oldbounds):
@@ -152,6 +176,10 @@
 		ControlWidget.adjust(self, oldbounds)
 
 
+class BevelButton(Button):
+	procID = Controls.kControlBevelButtonNormalBevelProc | Controls.useWFont
+
+
 class CheckBox(ControlWidget):
 	
 	"""Standard checkbox."""
@@ -250,13 +278,22 @@
 			Wbase.CallbackCall(self._callback, 1, '--')
 	
 	def setmin(self, min):
-		self._control.SetControl32BitMinimum(min)
+		if self._control is not None:
+			self._control.SetControl32BitMinimum(min)
+		else:
+			self._min = min
 	
 	def setmax(self, max):
-		self._control.SetControl32BitMaximum(max)
+		if self._control is not None:
+			self._control.SetControl32BitMaximum(max)
+		else:
+			self._max = max
 	
-	def setviewsize(self, view):
-		self._control.SetControlViewSize(view)
+	def setviewsize(self, viewsize):
+		if self._control is not None:
+			self._control.SetControlViewSize(viewsize)
+		else:
+			self._viewsize = viewsize
 	
 	def getmin(self):
 		return self._control.GetControl32BitMinimum()
@@ -312,7 +349,7 @@
 	def draw(self, visRgn = None):
 		if self._visible:
 			self._control.Draw1Control()
-			Qd.FrameRect(self._bounds)
+			#Qd.FrameRect(self._bounds)
 	
 	def adjust(self, oldbounds):
 		self.SetPort()
diff --git a/Mac/Tools/IDE/Widgets.rsrc b/Mac/Tools/IDE/Widgets.rsrc
index ea2d55c..ddeab7c 100644
--- a/Mac/Tools/IDE/Widgets.rsrc
+++ b/Mac/Tools/IDE/Widgets.rsrc
Binary files differ
diff --git a/Mac/Tools/IDE/Wlists.py b/Mac/Tools/IDE/Wlists.py
index 4cb3cf2..a05b804 100644
--- a/Mac/Tools/IDE/Wlists.py
+++ b/Mac/Tools/IDE/Wlists.py
@@ -5,6 +5,8 @@
 from Carbon.List import LNew, CreateCustomList, GetListPort
 from Carbon.Lists import kListDefUserProcType, lInitMsg, lDrawMsg, lHiliteMsg, lCloseMsg
 from Carbon.QuickDraw import hilitetransfermode
+from Carbon import App
+from Carbon.Appearance import kThemeStateActive, kThemeStateInactive, kThemeStatePressed
 
 
 class List(Wbase.SelectableWidget):
@@ -253,22 +255,24 @@
 			if not visRgn:
 				visRgn = self._parentwindow.wid.GetWindowPort().visRgn
 			self._list.LUpdate(visRgn)
-			Qd.FrameRect(self._bounds)
-			if self._selected and self._activated:
-				self.drawselframe(1)
+			App.DrawThemeListBoxFrame(self._bounds, kThemeStateActive)
+			#if self._selected and self._activated:
+			#	self.drawselframe(1)
 	
 	def select(self, onoff, isclick = 0):
 		if Wbase.SelectableWidget.select(self, onoff):
 			return
 		self.SetPort()
-		self.drawselframe(onoff)
+		state = [kThemeStateActive, kThemeStatePressed][onoff]
+		App.DrawThemeListBoxFrame(self._bounds, kThemeStateActive)
+		#self.drawselframe(onoff)
 	
 	def activate(self, onoff):
 		self._activated = onoff
 		if self._visible:
 			self._list.LActivate(onoff)
-			if self._selected:
-				self.drawselframe(onoff)
+			#if self._selected:
+			#	self.drawselframe(onoff)
 	
 	def get(self):
 		return self.items
@@ -449,6 +453,7 @@
 				Qd.MoveTo(left + 4, top + ascent + linefeed)
 				Qd.DrawText(line2, 0, len(line2))
 			Qd.PenPat("\x11\x11\x11\x11\x11\x11\x11\x11")
+			bottom = top + theList.cellSize[1]
 			Qd.MoveTo(left, bottom - 1)
 			Qd.LineTo(right, bottom - 1)
 		if selected:
diff --git a/Mac/Tools/IDE/Wtext.py b/Mac/Tools/IDE/Wtext.py
index 0d9203d..183f4d8 100644
--- a/Mac/Tools/IDE/Wtext.py
+++ b/Mac/Tools/IDE/Wtext.py
@@ -1,6 +1,8 @@
 from Carbon import Evt, Events, Fm, Fonts
 from Carbon import Qd, Res, Scrap
 from Carbon import TE, TextEdit, Win
+from Carbon import App
+from Carbon.Appearance import kThemeStateActive, kThemeStateInactive
 import waste
 import WASTEconst
 import Wbase
@@ -55,25 +57,29 @@
 class _ScrollWidget:
 	
 	# to be overridden
-	def getscrollbarvalues(self):
+	def getscrollrects(self):
+		"""Return (destrect, viewrect)."""
 		return None, None
 	
 	# internal method
-	def updatescrollbars(self):
-		vx, vy = self.getscrollbarvalues()
-		if self._parent._barx:
-			if vx <> None:
-				self._parent._barx.enable(1)
-				self._parent._barx.set(vx)
-			else:
-				self._parent._barx.enable(0)
-		if self._parent._bary:
-			if vy <> None:
-				self._parent._bary.enable(1)
-				self._parent._bary.set(vy)
-			else:
-				self._parent._bary.enable(0)
 	
+	def updatescrollbars(self):
+		(dl, dt, dr, db), (vl, vt, vr, vb) = self.getscrollrects()
+		if self._parent._barx:
+			viewwidth = vr - vl
+			destwidth = dr - dl
+			bar = self._parent._barx
+			bar.setmax(destwidth - viewwidth)
+			bar.setviewsize(viewwidth)
+			bar.set(vl - dl)
+		if self._parent._bary:
+			viewheight = vb - vt
+			destheight = db - dt
+			bar = self._parent._bary
+			bar.setmax(destheight - viewheight)
+			bar.setviewsize(viewheight)
+			bar.set(vt - dt)
+
 
 UNDOLABELS = [	# Indexed by WEGetUndoInfo() value
 	None, "", "typing", "Cut", "Paste", "Clear", "Drag", "Style",
@@ -373,6 +379,7 @@
 			if self._selected and self._activated:
 				self.drawselframe(1)
 			Qd.FrameRect(self._bounds)
+			#App.DrawThemeEditTextFrame(self._bounds, kThemeStateActive)
 	
 	# scrolling
 	def scrollpageup(self):
@@ -385,13 +392,13 @@
 	
 	def scrolltop(self):
 		if self._parent._bary and self._parent._bary._enabled:
-			self.vscroll(0)
+			self.vscroll(self._parent._bary.getmin())
 		if self._parent._barx and self._parent._barx._enabled:
-			self.hscroll(0)
+			self.hscroll(self._parent._barx.getmin())
 	
 	def scrollbottom(self):
 		if self._parent._bary and self._parent._bary._enabled:
-			self.vscroll(32767)
+			self.vscroll(self._parent._bary.getmax())
 	
 	# menu handlers
 	def domenu_copy(self, *args):
@@ -469,20 +476,15 @@
 		self.selectall()
 	
 	# private
-	def getscrollbarvalues(self):
-		dr = self.ted.WEGetDestRect()
-		vr = self.ted.WEGetViewRect()
-		vx = Wcontrols._scalebarvalue(dr[0], dr[2], vr[0], vr[2])
-		vy = Wcontrols._scalebarvalue(dr[1], dr[3], vr[1], vr[3])
-		return vx, vy
+	def getscrollrects(self):
+		return self.ted.WEGetDestRect(), self.ted.WEGetViewRect()
 	
 	def vscroll(self, value):
 		lineheight = self.ted.WEGetHeight(0, 1)
 		dr = self.ted.WEGetDestRect()
 		vr = self.ted.WEGetViewRect()
-		destheight = dr[3] - dr[1]
 		viewheight = vr[3] - vr[1]
-		viewoffset = maxdelta = vr[1] - dr[1]
+		maxdelta = vr[1] - dr[1]
 		mindelta = vr[3] - dr[3]
 		if value == "+":
 			delta = lineheight
@@ -493,11 +495,7 @@
 		elif value == "--":
 			delta = lineheight - viewheight
 		else:	# in thumb
-			cur = (32767L * viewoffset) / (destheight - viewheight)
-			delta = (cur-value)*(destheight - viewheight)/32767
-			if abs(delta - viewoffset) <=2:
-				# compensate for irritating rounding error
-				delta = viewoffset
+			delta = vr[1] - dr[1] - value
 		delta = min(maxdelta, delta)
 		delta = max(mindelta, delta)
 		self.ted.WEScroll(0, delta)
@@ -519,11 +517,12 @@
 		elif value == "--":
 			delta = 0.5 * (vr[0] - vr[2])
 		else:	# in thumb
-			cur = (32767 * viewoffset) / (destwidth - viewwidth)
-			delta = (cur-value)*(destwidth - viewwidth)/32767
-			if abs(delta - viewoffset) <=2:
-				# compensate for irritating rounding error
-				delta = viewoffset
+			delta = vr[0] - dr[0] - value
+			#cur = (32767 * viewoffset) / (destwidth - viewwidth)
+			#delta = (cur-value)*(destwidth - viewwidth)/32767
+			#if abs(delta - viewoffset) <=2:
+			#	# compensate for irritating rounding error
+			#	delta = viewoffset
 		delta = min(maxdelta, delta)
 		delta = max(mindelta, delta)
 		self.ted.WEScroll(delta, 0)
@@ -923,6 +922,7 @@
 					if autoscroll:
 						self.ted.WEFeatureFlag(WASTEconst.weFAutoScroll, 0)
 					self.ted.WESetSelection(count, count + 1)
+					Qd.QDFlushPortBuffer(self._parentwindow.wid, None)  # needed under OSX
 					time.sleep(0.2)
 					self.ted.WESetSelection(selstart, selend)
 					if autoscroll:
