diff --git a/examples/dokk/dokk.py b/examples/dokk/dokk.py
index 553dd2571ab4dcc843238cf3669f83f70a637cc5..e1c510fbcc4ba9d3cf71d6b1496cfa76df795bda 100644
--- a/examples/dokk/dokk.py
+++ b/examples/dokk/dokk.py
@@ -44,6 +44,5 @@ class Dokk(object):
   def _LoadLevel(self):
     if self._current_level is not None:
       self._current_level.Close()
-    self.gl_win.ClearHUDObjects()
     self._current_level = level.Level(self.levels_[self._current_index])
     self.gl_win.SetLevel(self._current_level)
diff --git a/examples/dokk/level.py b/examples/dokk/level.py
index a9e8b3e22180c6fe7074cce92c006e67dc1d3c06..85236e4ddd443cdefddd1de78b6bbef2b402326c 100644
--- a/examples/dokk/level.py
+++ b/examples/dokk/level.py
@@ -1,12 +1,12 @@
 import os
 import time
 from PyQt4 import QtCore, QtGui
-from ost import io, gfx, qa, geom
+from ost import io, gfx, geom
 from ligand import Ligand
 from surface import Surface
 from protein import Protein
 from score_updater import ScoreUpdater
-from config import *
+from config import Config, TopTen
 from dokk import Dokk
 from level_messages import LevelIntro
 from level_messages import LevelEnd
@@ -17,20 +17,17 @@ class Level(QtCore.QObject):
   def __init__(self, name, parent=None):
     QtCore.QObject.__init__(self,parent)
     self.name_=name
-    self.Load()
-    self.hud = None
     
     self.endtime = 0
     self.stop_time = 0
+
+    self.Load()    
+    self.LoadHUD()
     
     self.timer = QtCore.QTimer()
     self.timer.setSingleShot(True)
     self.connect(self.timer,QtCore.SIGNAL("timeout()"),self.Finished)
-    self.li = LevelIntro(self.config)
-    self.connect(self.li,QtCore.SIGNAL("Finished()"),self._IntroEnd)
-    self.le = None
-    self.hni = None
-    self.level_info = LevelInfo(self)
+        
     Dokk().gl_win.SetLockInput(True)
     self._started = False
     self.emit(QtCore.SIGNAL("Stopped()"))
@@ -52,6 +49,17 @@ class Level(QtCore.QObject):
     self.su = ScoreUpdater(self)
     self.transform_ = gfx.Scene().GetTransform()
     
+  def LoadHUD(self):
+    self.hud_level_intro = LevelIntro(self.config)
+    self.connect(self.hud_level_intro,QtCore.SIGNAL("Finished()"),self._IntroEnd)
+    self.hud_level_end_tt = LevelEnd(self.config.TT)
+    self.connect(self.hud_level_end_tt,QtCore.SIGNAL("Finished()"),self._FinishEnd)
+    self.hud_level_end_ntt = LevelEnd(self.config.NTT)
+    self.connect(self.hud_level_end_ntt,QtCore.SIGNAL("Finished()"),self._FinishEnd)
+    self.hud_name_input = HUDNameInput()
+    self.connect(self.hud_name_input,QtCore.SIGNAL("Finished()"),self._FinishEnterName)
+    self.level_info = LevelInfo(self)
+    
   def RotateAxis(self, axis, angle):
     self.ligand.RotateAxis(axis, angle)
     
@@ -103,24 +111,30 @@ class Level(QtCore.QObject):
   def Reset(self):
     self.endtime = 0
     self.stop_time = 0
+    self.CleanHUD()
+    self.ResetPos()
+    self.emit(QtCore.SIGNAL("Stopped()"))
+  
+  def CleanHUD(self):
+    self.hud_level_end_tt.Stop()
+    self.hud_level_end_ntt.Stop()
+    self.hud_level_intro.Stop()
+    self.hud_name_input.Stop()
     Dokk().gl_win.ClearHUDObjects()
-    if self.le is not None:
-      self.le.Stop()
-    self.li.Stop()
-    self.hni = None
-    
+  
+  def ResetPos(self):
     self.ligand.Reset()
     gfx.Scene().SetTransform(self.transform_)
     gfx.Scene().SetCenter(self.surface.go.GetCenter())
     gfx.Scene().RequestRedraw()
-    self.su.UpdateScores()
+    self.UpdateScores()
     
   def Solve(self):
     self.ligand.Solve()
     gfx.Scene().SetTransform(self.transform_)
     gfx.Scene().SetCenter(self.surface.go.GetCenter())
     gfx.Scene().RequestRedraw()
-    self.su.UpdateScores()
+    self.UpdateScores()
   
   def Finished(self):
     self._started = False
@@ -128,26 +142,22 @@ class Level(QtCore.QObject):
     self.stop_time = time.time()
     Dokk().gl_win.SetLockInput(True)
     if self.GetRank() > 0:
-      self.le = LevelEnd(self.config.TT)
+      self.hud_level_end_tt.Start()
     else:
-      self.le = LevelEnd(self.config.NTT)
-    self.connect(self.le,QtCore.SIGNAL("Finished()"),self._FinishEnd)
-    self.le.Start()
-        
+      self.hud_level_end_ntt.Start()
+
   def Begin(self):
     self.Reset()
-    self.su.UpdateScores()
-    self.li.Start()
+    self.UpdateScores()
+    self.hud_level_intro.Start()
     self._started = True
-    self.emit(QtCore.SIGNAL("Started()"))
+    self.emit(QtCore.SIGNAL("Started()"))    
     
   def Close(self):
     gfx.Scene().SetTransform(self.transform_)
     self.emit(QtCore.SIGNAL("Closed()"))
-    if self.le is not None:
-      self.le.Stop()
-    self.li.Stop()
     self._started = False
+    self.CleanHUD()
     self.surface.Close()
     self.protein.Close()
     self.ligand.Close()
@@ -157,16 +167,15 @@ class Level(QtCore.QObject):
       Dokk().gl_win.SetLockInput(False)
       self.timer.start(int(self.config.Level["TIME"]))
       self.endtime = float(time.time()+(int(self.config.Level["TIME"]))/1000.0)
+      self.emit(QtCore.SIGNAL("Started()"))
       
   def _FinishEnd(self):
     if bool(int(self.config.Level["SAVE"])) and self.GetRank()>0:
-      self.hni = HUDNameInput()
-      self.connect(self.hni,QtCore.SIGNAL("Finished()"),self._FinishEnterName)
+      self.hud_name_input.Start()
     else:
       self.Reset()
       self.emit(QtCore.SIGNAL("Stopped()"))
       
   def _FinishEnterName(self):
-    self.topten.SetValue(self.hni.GetName(),self.GetScore())
-    self.Reset()
-    self.emit(QtCore.SIGNAL("Stopped()"))
+    self.topten.SetValue(self.hud_name_input.GetName(),self.GetScore())
+    self.Reset()
\ No newline at end of file
diff --git a/examples/dokk/level_info.py b/examples/dokk/level_info.py
index ab1b48e2df3c19d50705215a4951ff856dafc095..934a4beae4589108ccfec043b42c1bfd53690dc1 100644
--- a/examples/dokk/level_info.py
+++ b/examples/dokk/level_info.py
@@ -13,34 +13,35 @@ class LevelInfo(QtCore.QObject):
     
     self.highscore = HighScore(level.topten)
     self.level_info = LevelDetails(level.config.Level["NAME"],level.config.Level["DIFFICULTY"])
-    self.connect(level,QtCore.SIGNAL("Start()"),self.Finish)
+    self.connect(level,QtCore.SIGNAL("Started()"),self.Finish)
     self.connect(level,QtCore.SIGNAL("Stopped()"),self.Start)
-    self.connect(level,QtCore.SIGNAL("Closed()"),self.Close)
+    self.connect(level,QtCore.SIGNAL("Closed()"),self.Finish)
     self.connect(self.timer,QtCore.SIGNAL("timeout()"),self.Timeout)
     
-    self.closed = False
+    self.start = False
   def Start(self):
+    self.start = True
     self.timer.start(1000)
     
   def Finish(self):
+    self.start = False
     self.highscore.Finish()
     self.level_info.Finish()
     
   def Timeout(self):
-    if not self.closed:
+    if self.start:
       self.highscore.Start()
       self.level_info.Start()
-    
-  def Close(self):
-    self.closed = True
-    self.Finish()
-    
+   
       
 class HighScore(QtCore.QObject):
   def __init__(self, topten, parent=None):
     QtCore.QObject.__init__(self, parent)
     self.topten = topten
-      
+    
+    self.hud_text = None
+    self.hud_bg = None
+        
   def Start(self):
     text = "%-2s%5s%-6s%5s%+6s"%("#", "", "Name", "", "Score")
     i=1
@@ -50,35 +51,41 @@ class HighScore(QtCore.QObject):
        i += 1
        data = self.topten.GetData(i)
     rect = QtCore.QRect(QtCore.QPoint(60, 200), QtCore.QSize(24*20, (i+2)*30))
-    self.bg = RectHUDObject(-1,rect, bg_color=QtGui.QColor(128,128,128,200))
-    dokk.Dokk().gl_win.AddHUDObject(self.bg)
+    self.hud_bg = RectHUDObject(-1,rect, bg_color=QtGui.QColor(128,128,128,200))
+    dokk.Dokk().gl_win.AddHUDObject(self.hud_bg)
     self.hud_text = RectTextHUDObject(text, rect=rect, time=-1, font=QtGui.QFont("Courier",20))
     dokk.Dokk().gl_win.AddHUDObject(self.hud_text)
                   
   def Finish(self):
-    dokk.Dokk().gl_win.RemoveHUDObject(self.hud_text)
-    dokk.Dokk().gl_win.RemoveHUDObject(self.bg)
+    if self.hud_text:
+      dokk.Dokk().gl_win.RemoveHUDObject(self.hud_text)
+    if self.hud_bg:
+      dokk.Dokk().gl_win.RemoveHUDObject(self.hud_bg)
     
 class LevelDetails(QtCore.QObject):
   def __init__(self, name, difficulty, parent=None):
     QtCore.QObject.__init__(self, parent)
     self.name = name
     self.difficulty = difficulty
-      
+    
+    self.hud_name_text = None
+    self.hud_diffi_text = None
+    self.hud_bg = None
+    
   def Start(self):
     name_len = len(self.name)
     xpos = dokk.Dokk().gl_win.Width()/2 - (name_len*30)/2
     rect = QtCore.QRect(QtCore.QPoint(xpos, 55), QtCore.QSize(name_len*30, 105))
-    self.bg = RectHUDObject(-1,rect, bg_color=QtGui.QColor(128,128,128,200))
-    dokk.Dokk().gl_win.AddHUDObject(self.bg)
+    self.hud_bg = RectHUDObject(-1,rect, bg_color=QtGui.QColor(128,128,128,200))
+    dokk.Dokk().gl_win.AddHUDObject(self.hud_bg)
     text = "%s\n"%self.name
-    self.name_text = RectTextHUDObject(text, rect=rect, time=-1, font=QtGui.QFont("Verdana",30))
+    self.hud_name_text = RectTextHUDObject(text, rect=rect, time=-1, font=QtGui.QFont("Verdana",30))
     text = "%s"%self.difficulty
-    self.diffi_text = TextHUDObject(text, QtCore.QPoint(dokk.Dokk().gl_win.Width()/2 - (len(text)*12)/2, 135), time=-1, font=QtGui.QFont("Courier",15))
-    dokk.Dokk().gl_win.AddHUDObject(self.name_text)
-    dokk.Dokk().gl_win.AddHUDObject(self.diffi_text)
+    self.hud_diffi_text = TextHUDObject(text, QtCore.QPoint(dokk.Dokk().gl_win.Width()/2 - (len(text)*12)/2, 135), time=-1, font=QtGui.QFont("Courier",15))
+    dokk.Dokk().gl_win.AddHUDObject(self.hud_name_text)
+    dokk.Dokk().gl_win.AddHUDObject(self.hud_diffi_text)
                   
   def Finish(self):
-    dokk.Dokk().gl_win.RemoveHUDObject(self.diffi_text)
-    dokk.Dokk().gl_win.RemoveHUDObject(self.name_text)
-    dokk.Dokk().gl_win.RemoveHUDObject(self.bg)
\ No newline at end of file
+    dokk.Dokk().gl_win.RemoveHUDObject(self.hud_diffi_text)
+    dokk.Dokk().gl_win.RemoveHUDObject(self.hud_name_text)
+    dokk.Dokk().gl_win.RemoveHUDObject(self.hud_bg)
\ No newline at end of file
diff --git a/examples/dokk/name_enter.py b/examples/dokk/name_enter.py
index aba55ab8b40c6bdae427fe3aa6d0892b70712b6d..c0090a99328de53409c80fa893f7e8852354a181 100644
--- a/examples/dokk/name_enter.py
+++ b/examples/dokk/name_enter.py
@@ -13,9 +13,10 @@ class NameEnter(QtCore.QObject):
     QtCore.QObject.__init__(self, parent)
     self.spnav = gui.SpnavInput.GetQThread()
     self.spnav.start()
-    QtCore.QObject.connect(self.spnav,QtCore.SIGNAL("deviceTransformed(int,int,int,int,int,int)"), self.InputChanged)
-    QtCore.QObject.connect(self.spnav,QtCore.SIGNAL("deviceButtonPressed(int)"), self.ToggleInputMode)     
-
+    
+    self.Reset()
+    
+  def Reset(self):
     self.letter_pos = 0
     self.al_len = len(ALPHABET)
     self.letter_score = 0
@@ -25,8 +26,6 @@ class NameEnter(QtCore.QObject):
     self.name_len = len(self.name)
     self.name_score = 0
     
-    self.int = 0
-    
   def InputChanged(self, tx,ty,tz,rx,ry,rz):
     if(abs(tx) > abs(tz)):
       self.name_score += tx
@@ -52,6 +51,15 @@ class NameEnter(QtCore.QObject):
   def GetName(self):
     return self.name
   
+  def Start(self):
+    self.Reset()
+    QtCore.QObject.connect(self.spnav,QtCore.SIGNAL("deviceTransformed(int,int,int,int,int,int)"), self.InputChanged)
+    QtCore.QObject.connect(self.spnav,QtCore.SIGNAL("deviceButtonPressed(int)"), self.ToggleInputMode)     
+    
+  def Stop(self):
+    QtCore.QObject.disconnect(self.spnav,QtCore.SIGNAL("deviceTransformed(int,int,int,int,int,int)"), self.InputChanged)
+    QtCore.QObject.disconnect(self.spnav,QtCore.SIGNAL("deviceButtonPressed(int)"), self.ToggleInputMode)
+      
   def __SetLetterPos(self):
     self.letter_pos = self.letter_pos % self.al_len
     self.__SetName()
@@ -74,9 +82,15 @@ class HUDNameInput(QtCore.QObject):
     QtCore.QObject.__init__(self, parent)
     self.ne = NameEnter()
     self.connect(self.ne,QtCore.SIGNAL("Changed()"),self.Update)
-    self.connect(self.ne,QtCore.SIGNAL("Finished()"),self.Finished)
+    self.connect(self.ne,QtCore.SIGNAL("Finished()"),self.Finish)
     self.huds = list()
-        
+
+    self.hud_text = None
+    self.bg = None
+      
+  def Start(self):
+    self.ne.Start()
+    del(self.huds[:])
     rect = QtCore.QRect(QtCore.QPoint(60, 60), QtCore.QSize(dokk.Dokk().gl_win.Width()-120, 220))
     self.bg = RectHUDObject(-1,rect, bg_color=QtGui.QColor(128,128,128,200))
     dokk.Dokk().gl_win.AddHUDObject(self.bg)
@@ -106,9 +120,15 @@ class HUDNameInput(QtCore.QObject):
       else:
         self.huds[i].color = QtGui.QColor(255,255,255)
         
-  def Finished(self):
+  def Stop(self):
+    self.ne.Stop()
     for hud in self.huds:
       dokk.Dokk().gl_win.RemoveHUDObject(hud)
-    dokk.Dokk().gl_win.RemoveHUDObject(self.hud_text)
-    dokk.Dokk().gl_win.RemoveHUDObject(self.bg)
+    if self.hud_text:
+      dokk.Dokk().gl_win.RemoveHUDObject(self.hud_text)
+    if self.bg:
+      dokk.Dokk().gl_win.RemoveHUDObject(self.bg)
+      
+  def Finish(self):
+    self.Stop()
     self.emit(QtCore.SIGNAL("Finished()"))
\ No newline at end of file
diff --git a/examples/dokk/spnav_input.py b/examples/dokk/spnav_input.py
index 898411554b45caf5225f8806c1d75d1e70a996f2..82b873d747359a62570370f8d711ed5ac151eb5e 100644
--- a/examples/dokk/spnav_input.py
+++ b/examples/dokk/spnav_input.py
@@ -75,6 +75,8 @@ class SpnavInputDevice(QtCore.QObject):
         self.rot_hud.text= "Rotation Enabled: %s"%self.rot
         self.rot_hud.time = 2000
         self.rot_hud.Reset()
+      elif button == 7:
+        self.level.Reset()
       elif button == 10:
         self.level.Finished()
       elif button == 11:
@@ -82,4 +84,4 @@ class SpnavInputDevice(QtCore.QObject):
       elif button == 12:
         self.level.Solve()
       elif button == 13:
-        self.level.Reset()
+        self.level.ResetPos()