diff --git a/gradint-build/mac/start-gradint.app/espeak-OSX.zip b/gradint-build/mac/start-gradint.app/espeak-OSX.zip
index 165f255cdf2a63cdf7de58647f235103f2d55a2b..5db422bcf1f8bd3c2a652941af6c442baa9fd9a7 100644
Binary files a/gradint-build/mac/start-gradint.app/espeak-OSX.zip and b/gradint-build/mac/start-gradint.app/espeak-OSX.zip differ
diff --git a/gradint-build/src/frontend.py b/gradint-build/src/frontend.py
index 7595006fc0aeaf14de3d3b5930fef22742dcbe59..a18f18539031dfba4b4e6e5db4b8e17f9caa06d0 100644
--- a/gradint-build/src/frontend.py
+++ b/gradint-build/src/frontend.py
@@ -262,25 +262,28 @@ def make_output_row(parent):
         if not hasattr(app,"scriptVariant"): app.scriptVariant = Tkinter.StringVar(app)
         count = 0
         for variant in GUI_translations["@variants-"+firstLanguage]:
-            Tkinter.Radiobutton(row, text=u" "+variant+u" ", variable=app.scriptVariant, value=str(count), indicatoron=0).pack({"side":"left"})
+            Tkinter.Radiobutton(row, text=u" "+variant+u" ", variable=app.scriptVariant, value=str(count), indicatoron=forceRadio).pack({"side":"left"})
             count += 1
         app.scriptVariant.set(str(scriptVariants.get(firstLanguage,0)))
     if not gotSox: return row # can't do any file output without sox
-    if not hasattr(app,"outputTo"): app.outputTo = Tkinter.StringVar(app) # NB app not parent (as parent is no longer app)
+    if not hasattr(app,"outputTo"):
+        app.outputTo = Tkinter.StringVar(app) # NB app not parent (as parent is no longer app)
+        app.outputTo.set("0") # not "" or get tri-state boxes on OS X 10.6
     if not row:
         row = Tkinter.Frame(parent)
         row.pack(fill=Tkinter.X,expand=1)
     rightrow = addRightRow(row) # to show beginners this row probably isn't the most important thing despite being in a convenient place, we'll right-align
     def addFiletypeButton(fileType):
-        t = Tkinter.Radiobutton(rightrow, text=" "+fileType.upper()+" ", variable=app.outputTo, value=fileType, indicatoron=0)
+        ftu = fileType.upper()
+        t = Tkinter.Radiobutton(rightrow, text=" "+ftu+" ", variable=app.outputTo, value=fileType, indicatoron=forceRadio)
         bindUpDown(t,True)
-        addStatus(t,"Select this to save a lesson or\na phrase to a%s %s file" % (cond(fileType[0] in "AEFHILMNORSX","n",""),fileType))
+        addStatus(t,"Select this to save a lesson or\na phrase to a%s %s file" % (cond(ftu[0] in "AEFHILMNORSX","n",""),ftu))
         t.pack({"side":"left"})
     if winsound or mingw32: got_windows_encoder = fileExists(programFiles+"\\Windows Media Components\\Encoder\\WMCmd.vbs")
     elif cygwin: got_windows_encoder = fileExists(programFiles+"/Windows Media Components/Encoder/WMCmd.vbs")
     else: got_windows_encoder = 0
     Tkinter.Label(rightrow,text=localise("To")+":").pack({"side":"left"})
-    t=Tkinter.Radiobutton(rightrow, text=" "+localise("Speaker")+" ", variable=app.outputTo, value="", indicatoron=0)
+    t=Tkinter.Radiobutton(rightrow, text=" "+localise("Speaker")+" ", variable=app.outputTo, value="0", indicatoron=forceRadio) # (must be value="0" not value="" for OS X 10.6 otherwise the other buttons become tri-state)
     addStatus(t,"Select this to send all sounds to\nthe speaker, not to files on disk")
     bindUpDown(t,True)
     t.pack({"side":"left"})
@@ -513,12 +516,14 @@ def startTk():
               else: v=0
               if not v==scriptVariants.get(firstLanguage,0): self.setVariant(v)
             if hasattr(self,"outputTo"):
+              outTo = self.outputTo.get()
+              if outTo=="0": outTo=""
               if hasattr(self,"TestTextButton"):
-                if self.outputTo.get(): self.TestTextButton["text"]=localise("To")+" "+self.outputTo.get().upper()
+                if outTo: self.TestTextButton["text"]=localise("To")+" "+outTo.upper()
                 else: self.TestTextButton["text"]=localise("Speak")
                 # used to be called "Test" instead of "Speak", but some people didn't understand that THEY'RE doing the testing (not the computer)
               if hasattr(self,"MakeLessonButton"):
-                if self.outputTo.get(): self.MakeLessonButton["text"]=localise("Make")+" "+self.outputTo.get().upper()
+                if outTo: self.MakeLessonButton["text"]=localise("Make")+" "+outTo.upper()
                 else: self.MakeLessonButton["text"]=localise("Start lesson") # less confusing for beginners than "Make lesson", if someone else has set up the words
             if hasattr(self,"BriefIntButton"):
                 if emergency_lessonHold_to < time.time(): t=localise("Brief interrupt")
@@ -1496,7 +1501,7 @@ def transliterates_differently(text,lang):
 
 gui_output_counter = 1
 def gui_outputTo_start():
-    if hasattr(app,"outputTo") and app.outputTo.get():
+    if hasattr(app,"outputTo") and app.outputTo.get() and not app.outputTo.get()=="0":
         global outputFile ; outputFile=None
         try: os.mkdir(gui_output_directory)
         except: pass
diff --git a/gradint-build/src/users.py b/gradint-build/src/users.py
index bc6523d6a529854309207aea967ec7f7577aadcd..86d83afe695ec5eec7bbbb62fa8b087bdb608b35 100644
--- a/gradint-build/src/users.py
+++ b/gradint-build/src/users.py
@@ -14,6 +14,8 @@
 settingsFile = "settings"+dottxt
 user0 = (samplesDirectory,vocabFile,progressFile,progressFileBackup,pickledProgressFile,settingsFile)
 
+forceRadio = cond(macsound and sys.version_info >= (2,6),1,0) # OS X 10.6 doesn't display indicatoron=0 very well
+
 def addUserToFname(fname,userNo):
   if not userNo or not fname: return fname
   elif os.sep in fname: return fname+"-user"+str(userNo)
@@ -89,9 +91,10 @@ def updateUserRow(fromMainMenu=0):
         r=Tkinter.Radiobutton(row, text=names[i], variable=app.userNo, value=str(i), takefocus=0)
         r.grid(row=i+1,column=0,sticky="w")
         r["command"]=lambda i=i,*args: select_userNumber(i)
-        r2=Tkinter.Radiobutton(row, text="Select", variable=app.userNo, value=str(i), indicatoron=0) ; bindUpDown(r2,True)
-        r2.grid(row=i+1,column=1,sticky="e")
-        r2["command"]=lambda i=i,*args: select_userNumber(i)
+        if not forceRadio:
+           r2=Tkinter.Radiobutton(row, text="Select", variable=app.userNo, value=str(i), indicatoron=0) ; bindUpDown(r2,True)
+           r2.grid(row=i+1,column=1,sticky="e")
+           r2["command"]=lambda i=i,*args: select_userNumber(i)
         addButton(row,"Rename",lambda e=None,i=i,r=r,row=row:renameUser(i,r,row),"nopack").grid(row=i+1,column=2,sticky="e")
         addButton(row,"Delete",lambda e=None,i=i:deleteUser(i),"nopack").grid(row=i+1,column=3,sticky="e")
       else:
diff --git a/gradint-build/windows/espeak-windows.7z b/gradint-build/windows/espeak-windows.7z
index 1942f46d4a33d7b2763c73ddd81265989fc0c95a..a1529ac660776630535fd4846393080b709c9a2c 100644
Binary files a/gradint-build/windows/espeak-windows.7z and b/gradint-build/windows/espeak-windows.7z differ