diff --git a/gradint-build/src/makeevent.py b/gradint-build/src/makeevent.py
index 40fe55ee6ee374cc089997adb3fa5e465b72449f..25d97c4a0a10214720f9fa2eada27fefae3699ee 100644
--- a/gradint-build/src/makeevent.py
+++ b/gradint-build/src/makeevent.py
@@ -230,8 +230,6 @@ if partialsDirectory:
             try: files = os.listdir(partialsDirectory+os.sep+l+os.sep+v)
             except: files = []
             if files: dirsToStat.append((partialsDirectory+os.sep+l+os.sep+v,os.stat(partialsDirectory+os.sep+l+os.sep+v)))
-            def byReverseLength(a,b): return len(b)-len(a)
-            files.sort(byReverseLength) # important if there are some files covering multiple syllables
             def addFile(f):
                 global flags
                 if riscos_sound and "." in f: f=f.replace(".",extsep) # in case made filelist on another system
@@ -262,6 +260,8 @@ if partialsDirectory:
                 elif not "-" in f or f.find('-m')>-1: mid.append(f)
                 elif f.find('-e')>-1 or f.find('-f')>-1: end.append(f) # 'end' or 'finish'
             for f in files: addFile(f)
+            def byReverseLength(a,b): return len(b)-len(a)
+            start.sort(byReverseLength) ; mid.sort(byReverseLength) ; end.sort(byReverseLength) # important if there are some files covering multiple syllables (and do it to start,mid,end not to files initially, so as to catch files within audiodata.dat also)
             def toDict(l): # make the list of filenames into a dict of short-key -> [(long-key, filename) list].  short-key is the shortest possible key.
                 if not l: return {}
                 l2 = [] ; kLen = len(l[0])
diff --git a/gradint-build/src/play.py b/gradint-build/src/play.py
index 2e39b3f5b35f1cf7782df98071a819831d6b5d58..7daced33e94fa893269bfec17b099ad130967de4 100644
--- a/gradint-build/src/play.py
+++ b/gradint-build/src/play.py
@@ -24,7 +24,7 @@ def play(event):
             if not app: doLabel("Emergency brief interrupt: %d" % (emergency_lessonHold_to-time.time()))
             time.sleep(1)
         t = "%d:%02d:%02d" % time.localtime()[3:6]
-    timeout_time = time.time() + 10 # don't loop *forever* if unable to start playing (especially if we're being used in a reminder system etc, it may be best to exit eventually)
+    timeout_time = time.time() + max(10,event.length/3) # don't loop *forever* if unable to start playing (especially if we're being used in a reminder system etc, it may be best to exit eventually)
     if lessonStartTime and not soundCollector:
         if hasattr(event,"max_lateness"): timeout_time = min(timeout_time, lessonStartTime + (copy_of_runner_events[0][2]+event.max_lateness))
         if hasattr(event,"sequenceID") and event.sequenceID in sequenceIDs_to_cancel: timeout_time = 0
diff --git a/gradint-build/windows/espeak-windows.bgz b/gradint-build/windows/espeak-windows.bgz
index c5a05142d59859f4f22b6110b3ef6adddbbed2c2..f0afc5f6826b56c2cf8c2aec4796b4a9eee24b5c 100644
Binary files a/gradint-build/windows/espeak-windows.bgz and b/gradint-build/windows/espeak-windows.bgz differ