diff --git a/AfterEffect/MineExplosion.hs b/AfterEffect/MineExplosion.hs
--- a/AfterEffect/MineExplosion.hs
+++ b/AfterEffect/MineExplosion.hs
@@ -10,14 +10,15 @@
 import Data.Maybe
 import ResourceTracker
 import GHC.Float
+import Common
 
 data MineExplosion =
   MineExplosion { center :: WrapPoint
-                , timeRemaining :: Double
+                , timeRemaining :: Time
                 , soundSource :: Maybe Source
                 , wrapMap :: WrapMap
                 , resourceTracker :: ResourceTracker
-                , animClock :: Double
+                , animClock :: Time
                 }
 
 new :: ResourceTracker -> WrapMap -> WrapPoint -> MineExplosion
diff --git a/AfterEffect/SimpleExplosion.hs b/AfterEffect/SimpleExplosion.hs
--- a/AfterEffect/SimpleExplosion.hs
+++ b/AfterEffect/SimpleExplosion.hs
@@ -10,18 +10,19 @@
 import Data.Maybe
 import ResourceTracker
 import GHC.Float
+import Common
 
 data SimpleExplosion =
   SimpleExplosion { center :: WrapPoint
-                  , timeRemaining :: Double
+                  , timeRemaining :: Time
                   , soundSource :: Maybe Source
                   , wrapMap :: WrapMap
                   , resourceTracker :: ResourceTracker
-                  , animClock :: Double
-                  , velocity :: (Double, Double)
+                  , animClock :: Time
+                  , velocity :: Velocity
                   }
 
-new :: ResourceTracker -> WrapMap -> WrapPoint -> (Double, Double) -> SimpleExplosion
+new :: ResourceTracker -> WrapMap -> WrapPoint -> Velocity -> SimpleExplosion
 new rt wmap center' velocity' =
   SimpleExplosion { center = center'
                   , timeRemaining = 3.0
diff --git a/Animation.hs b/Animation.hs
--- a/Animation.hs
+++ b/Animation.hs
@@ -4,9 +4,10 @@
 import Moving
 import Data.WrapAround
 import Sound.ALUT
+import Common
 
 class Animation a where
-  image :: a -> Double -> Picture
+  image :: a -> Time -> Picture
 
 class Audible a where
   processAudio :: a -> WrapPoint -> IO a
diff --git a/BigAsteroid.hs b/BigAsteroid.hs
--- a/BigAsteroid.hs
+++ b/BigAsteroid.hs
@@ -10,6 +10,7 @@
 import GHC.Float
 import Combat
 import Data.Maybe
+import Common
 
 asteroidRadius = 30.0
 
@@ -18,12 +19,12 @@
 data BigAsteroid =
   BigAsteroid { location :: WrapPoint
            , idealTargetLocation :: Maybe WrapPoint
-           , velocity :: (Double, Double)
+           , velocity :: Velocity
            , wrapMap :: WrapMap
            , animDefault0 :: Picture
            }
 
-new :: ResourceTracker -> WrapMap -> WrapPoint -> (Double, Double) -> BigAsteroid
+new :: ResourceTracker -> WrapMap -> WrapPoint -> Velocity -> BigAsteroid
 new rt wmap location velocity =
   let pic = fromMaybe
               (Scale 0.20 0.20
diff --git a/Common.hs b/Common.hs
new file mode 100644
--- /dev/null
+++ b/Common.hs
@@ -0,0 +1,10 @@
+module Common where
+
+-- seconds
+type Time = Double
+
+-- Radians
+type Angle = Double
+
+-- mysterious unit but usually same as pixels
+type Velocity = (Double, Double)
diff --git a/Display.hs b/Display.hs
--- a/Display.hs
+++ b/Display.hs
@@ -16,6 +16,7 @@
 import Unit
 import Item
 import ResourceTracker
+import Trigonometry
 
 data Displayable = forall a. (Locatable a, Animation a) => Displayable a
 
@@ -46,6 +47,8 @@
                let (x, y) = vectorRelation wmap wp viewCenterWp in
                let pic = image displayable undefined in
                [ Translate (double2Float x) (double2Float y) pic ] in
+    let lanceLives x = if isNothing (lance arena')
+                         then Blank else x in
     let deflectorBar' = Translate 65.0 370.0
                           (case lance arena' of
                              Just x -> deflectorBar (deflectorCharge x)
@@ -85,19 +88,29 @@
                               integrityAssessment) in
     let sP = Translate 450.0 330.0
                (sensorPanel arena' (100.0, 100.0)) in
+    let levelMessage = case levelMessageTimer u of
+                         Nothing -> Blank
+                         Just mt -> if mt `doubleRem` 0.5 < 0.25
+                                      then Blank
+                                      else Translate (-200.0) 150.0
+                                             (Text
+                                               ("level "
+                                                 ++ show (level u + 1))) in
     return $ Pictures $ displayables
                         ++ [ pship'
-                           , deflectorText'
-                           , deflectorBar'
-                           , levelText
-                           , livesText
-                           , sP
+                           , lanceLives $ deflectorText'
+                           , lanceLives $ deflectorBar'
+                           , lanceLives $ levelText
+                           , lanceLives $ livesText
+                           , lanceLives $ sP
                            , godText
-                           , integrityText
-                           , integrityTextL2
-                           , Translate (-400.0) 340.0 (inventoryDisplay
-                                                        (lance arena')
-                                                        (resourceTracker u))
+                           , lanceLives $ integrityText
+                           , lanceLives $ integrityTextL2
+                           , lanceLives $ Translate (-400.0) 340.0
+                                            (inventoryDisplay
+                                               (lance arena')
+                                                  (resourceTracker u))
+                           , lanceLives $ levelMessage
                            ]
 
 inventoryDisplay :: Maybe Lance -> ResourceTracker -> Picture
diff --git a/Lance.hs b/Lance.hs
--- a/Lance.hs
+++ b/Lance.hs
@@ -36,6 +36,7 @@
 import qualified AfterEffect.SimpleExplosion as SimpleExplosion
 import Sound.ALUT
 import Item
+import Common
 
 radialVelocity = pi -- radians per second
 
@@ -52,7 +53,7 @@
 
 type LanceInventory = [Bool]
 
-data Lance = Lance { angle :: Double -- radians
+data Lance = Lance { angle :: Angle -- radians
                    , center :: WrapPoint
                    , rotationalThrusters :: RotationDirection
                    , idealTargetCenter :: Maybe WrapPoint
@@ -67,7 +68,7 @@
 
                    -- firing
                    , launchTube :: [Projectile]
-                   , sinceLastShot :: Double
+                   , sinceLastShot :: Time
                    , fireTrigger :: Bool
                    , currentWeapon :: Int
                    , inventory :: LanceInventory
@@ -171,7 +172,7 @@
 shielded :: Lance -> Bool
 shielded lance = deflectorCharge lance >= 1.0 && deflector lance
 
-updateAngle :: Double -> Lance -> Lance
+updateAngle :: Time -> Lance -> Lance
 updateAngle t lance
   | rotationalThrusters lance == CW
       = lance { angle = angle lance - radialVelocity * t}
@@ -361,7 +362,7 @@
                                    else min 2.0 (charge + t * 0.05) in
   lance { deflectorCharge = charge' }
 
-updateIdealTargetCenter :: Double -> Lance -> Lance
+updateIdealTargetCenter :: Time -> Lance -> Lance
 updateIdealTargetCenter t lance =
   lance { idealTargetCenter = Just (M.idealNewLocation (wrapMap lance)
                                                        (center lance)
@@ -369,7 +370,7 @@
                                                        t)
         }
 
-updateVelocity :: Double -> Lance -> Lance
+updateVelocity :: Time -> Lance -> Lance
 updateVelocity t lance
   | linearThrusters lance =
       lance { velocity = M.calcNewVelocity
diff --git a/Moving.hs b/Moving.hs
--- a/Moving.hs
+++ b/Moving.hs
@@ -5,11 +5,12 @@
 import Trigonometry
 import Data.List (find)
 import Control.Monad (join)
+import Common
 
 maxExpectedVelocity = 1000 -- should equal max velocity of fastest object in arena
 
 calcNewVelocity
-  :: (Double, Double) -> Double -> Double -> Double -> Double -> (Double, Double)
+  :: Velocity -> Double -> Angle -> Double -> Time -> (Double, Double)
 calcNewVelocity oVelocity accelerationRate thrustAngle maxVelocity t =
   let (vXo, vYo) = oVelocity in
   let acceleration = t * accelerationRate in
@@ -27,7 +28,7 @@
   let finalY = sin aVN * finalMag in
   (finalX, finalY)
 
-idealNewLocation :: WrapMap -> WrapPoint -> (Double, Double) -> Double -> WrapPoint
+idealNewLocation :: WrapMap -> WrapPoint -> Velocity -> Time -> WrapPoint
 idealNewLocation wmap oLocation (velX, velY) t =
   addPoints' wmap oLocation velocity'
   where velocity' = (velX * t, velY * t)
@@ -37,13 +38,13 @@
 
 class (Locatable a) => Moving a where
 
-  velocity :: a -> (Double, Double)
+  velocity :: a -> Velocity
 
 class (Moving a) => Colliding a where
 
   collisionRadius :: a -> Double
 
-data Collision = Collision { time :: Double -- since start of collision detection
+data Collision = Collision { time :: Time -- since start of collision detection
                                            -- window frame
                            , center1 :: WrapPoint -- at point of collision
                            , center2 :: WrapPoint -- likewise
@@ -52,7 +53,7 @@
 -- Double refers to time window for checking for collision
 collision :: (Colliding a, Colliding b)
   => WrapMap
-  -> Double
+  -> Time
   -> a
   -> b
   -> Maybe Collision
@@ -82,7 +83,7 @@
 collisionWindow wmap range obj1 obj2 =
   W.distance wmap (center obj1) (center obj2) <= range
 
-collisionScan :: (Colliding a, Colliding b) => WrapMap -> a -> [b] -> Double -> Maybe Collision
+collisionScan :: (Colliding a, Colliding b) => WrapMap -> a -> [b] -> Time -> Maybe Collision
 collisionScan wmap c cs t =
   let relAsteroids =
         [ a | a <- cs
diff --git a/Projectile/Blade.hs b/Projectile/Blade.hs
--- a/Projectile/Blade.hs
+++ b/Projectile/Blade.hs
@@ -15,6 +15,7 @@
 import Data.Maybe
 import ResourceTracker
 import GHC.Float
+import Common
 
 velocityC = 250.0
 rangeC = 1500.0
@@ -24,17 +25,17 @@
 speed = velocityC
 
 data Blade =
-  Blade { velocity :: (Double, Double)
+  Blade { velocity :: Velocity
         , center :: WrapPoint
         , rangeLeft :: Double
         , wrapMap :: WrapMap
         , idealNewCenter :: Maybe WrapPoint
-        , clock :: Double
+        , clock :: Time
         , resourceTracker :: ResourceTracker
         }
 
 -- angle is radians
-new :: WrapMap -> ResourceTracker -> Double -> WrapPoint -> (Double, Double) -> Blade
+new :: WrapMap -> ResourceTracker -> Angle -> WrapPoint -> Velocity -> Blade
 new wmap rt angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -86,7 +87,7 @@
          , clock = clock self + t
          }
 
-updateIdealTargetCenter :: Double -> Blade -> Blade
+updateIdealTargetCenter :: Time -> Blade -> Blade
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/BulletMI.hs b/Projectile/BulletMI.hs
--- a/Projectile/BulletMI.hs
+++ b/Projectile/BulletMI.hs
@@ -9,22 +9,23 @@
 import Graphics.Gloss.Data.Color
 import Data.WrapAround
 import qualified Moving as M
+import Common
 
 velocityC = 400.0
 rangeC = 500.0
 
 data BulletMI =
-  BulletMI { velocity :: (Double, Double)
+  BulletMI { velocity :: Velocity
             , center :: WrapPoint
             , rangeLeft :: Double
             , wrapMap :: WrapMap
             , idealNewCenter :: Maybe WrapPoint
             , impacted :: Bool
-            , clock :: Double
+            , clock :: Time
             }
 
 -- angle is radians
-new :: WrapMap -> Double -> WrapPoint -> (Double, Double) -> BulletMI
+new :: WrapMap -> Angle -> WrapPoint -> Velocity -> BulletMI
 new wmap angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -83,7 +84,7 @@
          , idealNewCenter = Nothing
          }
 
-updateIdealTargetCenter :: Double -> BulletMI -> BulletMI
+updateIdealTargetCenter :: Time -> BulletMI -> BulletMI
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/BulletMII.hs b/Projectile/BulletMII.hs
--- a/Projectile/BulletMII.hs
+++ b/Projectile/BulletMII.hs
@@ -9,22 +9,23 @@
 import Graphics.Gloss.Data.Color
 import Data.WrapAround
 import qualified Moving as M
+import Common
 
 velocityC = 400.0
 rangeC = 700.0
 
 data BulletMII =
-  BulletMII { velocity :: (Double, Double)
+  BulletMII { velocity :: Velocity
             , center :: WrapPoint
             , rangeLeft :: Double
             , wrapMap :: WrapMap
             , idealNewCenter :: Maybe WrapPoint
             , impacted :: Bool
-            , clock :: Double
+            , clock :: Time
             }
 
 -- angle is radians
-new :: WrapMap -> Double -> WrapPoint -> (Double, Double) -> BulletMII
+new :: WrapMap -> Angle -> WrapPoint -> Velocity -> BulletMII
 new wmap angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -83,7 +84,7 @@
          , idealNewCenter = Nothing
          }
 
-updateIdealTargetCenter :: Double -> BulletMII -> BulletMII
+updateIdealTargetCenter :: Time -> BulletMII -> BulletMII
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/BulletMkI.hs b/Projectile/BulletMkI.hs
--- a/Projectile/BulletMkI.hs
+++ b/Projectile/BulletMkI.hs
@@ -9,22 +9,23 @@
 import Graphics.Gloss.Data.Color
 import Data.WrapAround
 import qualified Moving as M
+import Common
 
 velocityC = 700.0
 rangeC = 1000.0
 
 data BulletMkI =
-  BulletMkI { velocity :: (Double, Double)
+  BulletMkI { velocity :: Velocity
             , center :: WrapPoint
             , rangeLeft :: Double
             , wrapMap :: WrapMap
             , idealNewCenter :: Maybe WrapPoint
             , impacted :: Bool
-            , clock :: Double
+            , clock :: Time
             }
 
 -- angle is radians
-new :: WrapMap -> Double -> WrapPoint -> (Double, Double) -> BulletMkI
+new :: WrapMap -> Angle -> WrapPoint -> Velocity -> BulletMkI
 new wmap angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -83,7 +84,7 @@
          , idealNewCenter = Nothing
          }
 
-updateIdealTargetCenter :: Double -> BulletMkI -> BulletMkI
+updateIdealTargetCenter :: Time -> BulletMkI -> BulletMkI
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/BulletSI.hs b/Projectile/BulletSI.hs
--- a/Projectile/BulletSI.hs
+++ b/Projectile/BulletSI.hs
@@ -9,22 +9,23 @@
 import Graphics.Gloss.Data.Color
 import Data.WrapAround
 import qualified Moving as M
+import Common
 
 velocityC = 400.0
 rangeC = 500.0
 
 data BulletSI =
-  BulletSI { velocity :: (Double, Double)
+  BulletSI { velocity :: Velocity
             , center :: WrapPoint
             , rangeLeft :: Double
             , wrapMap :: WrapMap
             , idealNewCenter :: Maybe WrapPoint
             , impacted :: Bool
-            , clock :: Double
+            , clock :: Time
             }
 
 -- angle is radians
-new :: WrapMap -> Double -> WrapPoint -> (Double, Double) -> BulletSI
+new :: WrapMap -> Angle -> WrapPoint -> Velocity -> BulletSI
 new wmap angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -83,7 +84,7 @@
          , idealNewCenter = Nothing
          }
 
-updateIdealTargetCenter :: Double -> BulletSI -> BulletSI
+updateIdealTargetCenter :: Time -> BulletSI -> BulletSI
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/BulletSII.hs b/Projectile/BulletSII.hs
--- a/Projectile/BulletSII.hs
+++ b/Projectile/BulletSII.hs
@@ -10,6 +10,7 @@
 import Graphics.Gloss.Data.Color
 import Data.WrapAround
 import qualified Moving as M
+import Common
 
 velocityC = 600.0
 rangeC = 1000.0
@@ -17,17 +18,17 @@
 speed = velocityC
 
 data BulletSII =
-  BulletSII { velocity :: (Double, Double)
+  BulletSII { velocity :: Velocity
             , center :: WrapPoint
             , rangeLeft :: Double
             , wrapMap :: WrapMap
             , idealNewCenter :: Maybe WrapPoint
             , impacted :: Bool
-            , clock :: Double
+            , clock :: Time
             }
 
 -- angle is radians
-new :: WrapMap -> Double -> WrapPoint -> (Double, Double) -> BulletSII
+new :: WrapMap -> Angle -> WrapPoint -> Velocity -> BulletSII
 new wmap angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -86,7 +87,7 @@
          , idealNewCenter = Nothing
          }
 
-updateIdealTargetCenter :: Double -> BulletSII -> BulletSII
+updateIdealTargetCenter :: Time -> BulletSII -> BulletSII
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/Cannon.hs b/Projectile/Cannon.hs
--- a/Projectile/Cannon.hs
+++ b/Projectile/Cannon.hs
@@ -10,6 +10,7 @@
 import Data.WrapAround
 import qualified Moving as M
 import GHC.Float
+import Common
 
 velocityC = 500.0
 rangeC = 800.0
@@ -21,17 +22,17 @@
 radiusC = 12.0
 
 data Cannon =
-  Cannon { velocity :: (Double, Double)
+  Cannon { velocity :: Velocity
          , center :: WrapPoint
          , rangeLeft :: Double
          , wrapMap :: WrapMap
          , idealNewCenter :: Maybe WrapPoint
          , integrity :: Double
-         , clock :: Double
+         , clock :: Time
          }
 
 -- angle is radians
-new :: WrapMap -> Double -> WrapPoint -> (Double, Double) -> Cannon
+new :: WrapMap -> Angle -> WrapPoint -> Velocity -> Cannon
 new wmap angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -90,7 +91,7 @@
          , idealNewCenter = Nothing
          }
 
-updateIdealTargetCenter :: Double -> Cannon -> Cannon
+updateIdealTargetCenter :: Time -> Cannon -> Cannon
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/Mine.hs b/Projectile/Mine.hs
--- a/Projectile/Mine.hs
+++ b/Projectile/Mine.hs
@@ -13,6 +13,7 @@
 import Data.Maybe
 import qualified AfterEffect.MineExplosion as MineExplosion
 import AfterEffect
+import Common
 
 detRadius = 100.0
 punch = 1.0
@@ -20,7 +21,7 @@
 data Mine =
   Mine { center :: WrapPoint
        , impacted :: Bool
-       , clock :: Double
+       , clock :: Time
        , resourceTracker :: ResourceTracker
        , wrapMap :: WrapMap
        }
diff --git a/Projectile/Nuke.hs b/Projectile/Nuke.hs
--- a/Projectile/Nuke.hs
+++ b/Projectile/Nuke.hs
@@ -11,6 +11,7 @@
 import qualified Moving as M
 import ResourceTracker
 import Data.Maybe
+import Common
 
 velocityC = 200.0
 
@@ -20,17 +21,17 @@
 detTime = 1.5
 
 data Nuke =
-  Nuke { velocity :: (Double, Double)
+  Nuke { velocity :: Velocity
        , center :: WrapPoint
        , wrapMap :: WrapMap
        , idealNewCenter :: Maybe WrapPoint
-       , clock :: Double
+       , clock :: Time
        , initialBlastCompleted :: Bool
        , resourceTracker :: ResourceTracker
        }
 
 -- angle is radians
-new :: WrapMap -> ResourceTracker -> Double -> WrapPoint -> (Double, Double) -> Nuke
+new :: WrapMap -> ResourceTracker -> Angle -> WrapPoint -> Velocity -> Nuke
 new wmap rt angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -102,7 +103,7 @@
          , initialBlastCompleted = clock self >= detTime
          }
 
-updateIdealTargetCenter :: Double -> Nuke -> Nuke
+updateIdealTargetCenter :: Time -> Nuke -> Nuke
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Projectile/Pellet.hs b/Projectile/Pellet.hs
--- a/Projectile/Pellet.hs
+++ b/Projectile/Pellet.hs
@@ -10,6 +10,7 @@
 import Graphics.Gloss.Data.Color
 import Data.WrapAround
 import qualified Moving as M
+import Common
 
 velocityC = 600.0
 rangeC = 300.0
@@ -18,7 +19,7 @@
 range = rangeC
 
 data Pellet =
-  Pellet { velocity :: (Double, Double)
+  Pellet { velocity :: Velocity
          , center :: WrapPoint
          , rangeLeft :: Double
          , wrapMap :: WrapMap
@@ -27,7 +28,7 @@
          }
 
 -- angle is radians
-new :: WrapMap -> Double -> WrapPoint -> (Double, Double) -> Pellet
+new :: WrapMap -> Angle -> WrapPoint -> Velocity -> Pellet
 new wmap angle center' (vpx, vpy) =
   let x = cos angle * velocityC in
   let y = sin angle * velocityC in
@@ -71,7 +72,7 @@
          , idealNewCenter = Nothing
          }
 
-updateIdealTargetCenter :: Double -> Pellet -> Pellet
+updateIdealTargetCenter :: Time -> Pellet -> Pellet
 updateIdealTargetCenter t self =
   let newLoc = M.idealNewLocation (wrapMap self)
                                   (center self)
diff --git a/Step.hs b/Step.hs
--- a/Step.hs
+++ b/Step.hs
@@ -25,7 +25,10 @@
 import System.Exit
 import Resources
 import Sound.ALUT
+import Common
 
+delayOnDeath = 4.0
+
 stepUniverse :: Float -> Universe -> IO Universe
 stepUniverse t u =
   let t' = float2Double t in
@@ -36,7 +39,7 @@
      return u'
 
 
-handleLives :: (Double, Universe) -> IO (Double, Universe)
+handleLives :: (Time, Universe) -> IO (Time, Universe)
 handleLives (t, u) =
   do let a = arena u
      let wmap = Universe.wrapMap a
@@ -54,7 +57,7 @@
                                   a { lance = Just (Lance.new rt wmap
                                                      (wrappoint wmap (0, 0)))
                                     }
-                              , delayRemaining = 2.0
+                              , delayRemaining = delayOnDeath
                               }
                           )
                      else return
@@ -66,11 +69,11 @@
                                     }
                               , level = 0
                               , lives = 3
-                              , delayRemaining = 2.0
+                              , delayRemaining = delayOnDeath
                               }
                           )             
 
-handleNewLevel :: (Double, Universe) -> IO (Double, Universe)
+handleNewLevel :: (Time, Universe) -> IO (Time, Universe)
 handleNewLevel (t, u)
     | not (null (simpleUnits (arena u)) && null (smartUnits (arena u)))
       && not (skipLevel u)
@@ -96,6 +99,7 @@
                      }
                , level = level u + 1
                , skipLevel = False
+               , levelMessageTimer = Just 0.0
                }
      return (t, u')
 
@@ -110,7 +114,7 @@
 --              if level u >= length (levels u)
 --                then
 
-handlePureUpdates :: (Double, Universe) -> IO (Double, Universe)
+handlePureUpdates :: (Time, Universe) -> IO (Time, Universe)
 handlePureUpdates (t, u) = return $ ( handleExpiration
                                      . handlePostUpdates
                                      . handleCollisions
@@ -119,10 +123,21 @@
                                      . handlePreUpdates
                                      . handleVisionUpdates
                                      . fixFocus
+                                     . handleUniverseCounters
                                      ) (t, u)
 
+handleUniverseCounters :: (Time, Universe) -> (Time, Universe)
+handleUniverseCounters (t, u) =
+  let u' = u { levelMessageTimer = case levelMessageTimer u of
+                                     Nothing -> Nothing
+                                     Just mt -> if mt > 1.5
+                                                  then Nothing
+                                                  else Just (mt + t)
+             , panelActivationTimer = panelActivationTimer u + t
+             } in
+  (t, u')
 
-handleSound :: (Double, Universe) -> IO (Double, Universe)
+handleSound :: (Time, Universe) -> IO (Time, Universe)
 handleSound (t, u) =
   let arena' = arena u in
     do let listenerCoords = case lance arena' of
@@ -153,7 +168,7 @@
        return (t, u')
                           
 
-handleExpiration :: (Double, Universe) -> (Double, Universe)
+handleExpiration :: (Time, Universe) -> (Time, Universe)
 handleExpiration (t, u) =
   let arena' = arena u in
 
@@ -206,7 +221,7 @@
                                 Just a -> (nxs, nAFX ++ a)
                                
 
-handleLanceLaunches :: (Double, Universe) -> (Double, Universe)
+handleLanceLaunches :: (Time, Universe) -> (Time, Universe)
 handleLanceLaunches (t, u) =
   let arena' = arena u in
   case lance arena' of
@@ -220,7 +235,7 @@
                                 } in
                        (t, u')
 
-handleUnitLaunches :: (Double, Universe) -> (Double, Universe)
+handleUnitLaunches :: (Time, Universe) -> (Time, Universe)
 handleUnitLaunches (t, u) =
   let arena' = arena u in
   let (simpleUnits', unitProjectiles') =
@@ -250,9 +265,9 @@
   (t, u')
 
 handleUpdatesCore :: (forall a. (InternallyUpdating a
-                       => (a -> Double -> a)))
-                       -> (Double, Universe)
-                       -> (Double, Universe)
+                       => (a -> Time -> a)))
+                       -> (Time, Universe)
+                       -> (Time, Universe)
 handleUpdatesCore f (t, u) =
   let arena' = arena u in
   let lance' = do llance <- lance arena'
@@ -278,13 +293,13 @@
              } in
   (t, u')
 
-handlePreUpdates :: (Double, Universe) -> (Double, Universe)
+handlePreUpdates :: (Time, Universe) -> (Time, Universe)
 handlePreUpdates (t, u) = handleUpdatesCore Updating.preUpdate (t, u)
 
-handlePostUpdates :: (Double, Universe) -> (Double, Universe)
+handlePostUpdates :: (Time, Universe) -> (Time, Universe)
 handlePostUpdates (t, u) = handleUpdatesCore Updating.postUpdate (t, u)
 
-handleVisionUpdates :: (Double, Universe) -> (Double, Universe)
+handleVisionUpdates :: (Time, Universe) -> (Time, Universe)
 handleVisionUpdates (t, u) =
   let a = arena u in
   let u' = u { arena =
@@ -438,7 +453,7 @@
               Just _ -> let nx = processItem x y in
                          collisionHandler nx ys nys
 
-handleCollisions :: (Double, Universe) -> (Double, Universe)
+handleCollisions :: (Time, Universe) -> (Time, Universe)
 handleCollisions (t, u) =
 
   ( handleCollisionsLanceItems
diff --git a/Unit/Simple/Turret.hs b/Unit/Simple/Turret.hs
--- a/Unit/Simple/Turret.hs
+++ b/Unit/Simple/Turret.hs
@@ -17,6 +17,7 @@
 import qualified AfterEffect.SimpleExplosion as SimpleExplosion
 import Data.Maybe
 import Sound.ALUT
+import Common
 
 radialVelocity = pi/6 -- radians per second
 
@@ -26,13 +27,13 @@
 
 maxIntegrity = 2.0
 
-data Turret = Turret { turretAngle :: Double -- radians
-                     , velocity :: (Double, Double)
+data Turret = Turret { turretAngle :: Angle -- radians
+                     , velocity :: Velocity
                      , center :: WrapPoint
                      , idealTargetLocation :: Maybe WrapPoint
                      , wrapMap :: WrapMap
                      , launchTube :: [Projectile]
-                     , sinceLastShot :: Double
+                     , sinceLastShot :: Time
                      , integrity :: Double
                      , animDefault0 :: Picture
                      , resourceTracker :: ResourceTracker
@@ -80,8 +81,8 @@
 new :: ResourceTracker
         -> WrapMap
         -> WrapPoint
-        -> Double
-        -> Double
+        -> Angle
+        -> Angle
         -> Turret
 new rt wmap center' tAngle mAngle =
   let pic = fromMaybe
@@ -153,7 +154,7 @@
                                      (velocity self) )
 
 
-updateIdealTargetLocation :: Double -> Turret -> Turret
+updateIdealTargetLocation :: Time -> Turret -> Turret
 updateIdealTargetLocation t self =
   self { idealTargetLocation = Just (M.idealNewLocation (wrapMap self)
                                                         (center self)
diff --git a/Unit/Smart/ATank.hs b/Unit/Smart/ATank.hs
--- a/Unit/Smart/ATank.hs
+++ b/Unit/Smart/ATank.hs
@@ -19,6 +19,7 @@
 import Universe hiding (wrapMap, resourceTracker)
 import qualified Universe as U
 import Sound.ALUT
+import Common
 
 radialVelocity = pi/4 -- radians per second
 
@@ -30,13 +31,13 @@
 
 accelerationRate = 40
 
-data ATank = ATank { angle :: Double -- radians
-                 , velocity :: (Double, Double)
+data ATank = ATank { angle :: Angle -- radians
+                 , velocity :: Velocity
                  , center :: WrapPoint
                  , idealTargetLocation :: Maybe WrapPoint
                  , wrapMap :: WrapMap
                  , launchTube :: [Projectile]
-                 , sinceLastShot :: Double
+                 , sinceLastShot :: Time
                  , integrity :: Double
                  , vision :: Maybe Arena
                  , resourceTracker :: ResourceTracker
@@ -84,7 +85,7 @@
 new :: ResourceTracker
         -> WrapMap
         -> WrapPoint
-        -> Double
+        -> Angle
         -> ATank
 new rt wmap center' angle' =
   ATank { center = center'
@@ -123,7 +124,7 @@
                                 | otherwise = 0.0 in
                           self { angle = angle self + adj }
 
-updateVelocity :: Double -> ATank -> ATank
+updateVelocity :: Time -> ATank -> ATank
 updateVelocity t self =
   self { velocity = M.calcNewVelocity
                       (velocity self)
@@ -192,7 +193,7 @@
                                     (center self)
                                     (M.center l))
 
-updateIdealTargetLocation :: Double -> ATank -> ATank
+updateIdealTargetLocation :: Time -> ATank -> ATank
 updateIdealTargetLocation t self =
   self { idealTargetLocation = Just (M.idealNewLocation (wrapMap self)
                                                         (center self)
diff --git a/Unit/Smart/Death.hs b/Unit/Smart/Death.hs
--- a/Unit/Smart/Death.hs
+++ b/Unit/Smart/Death.hs
@@ -20,6 +20,7 @@
 import Universe hiding (wrapMap, resourceTracker)
 import qualified Universe as U
 import Sound.ALUT
+import Common
 
 radialVelocity = pi -- radians per second
 
@@ -37,14 +38,14 @@
 
 shotDelay_spread = 2.0
 
-data Death = Death { angle :: Double -- radians
-                   , velocity :: (Double, Double)
+data Death = Death { angle :: Angle -- radians
+                   , velocity :: Velocity
                    , center :: WrapPoint
                    , idealTargetLocation :: Maybe WrapPoint
                    , wrapMap :: WrapMap
                    , launchTube :: [Projectile]
-                   , sinceLastShot_sniper :: Double
-                   , sinceLastShot_spread :: Double
+                   , sinceLastShot_sniper :: Time
+                   , sinceLastShot_spread :: Time
                    , integrity :: Double
                    , vision :: Maybe Arena
                    , resourceTracker :: ResourceTracker
@@ -90,7 +91,7 @@
 new :: ResourceTracker
         -> WrapMap
         -> WrapPoint
-        -> Double
+        -> Angle
         -> Death
 new rt wmap center' angle' =
   Death { center = center'
@@ -248,7 +249,7 @@
                                     (center self)
                                     (M.center l))
 
-updateIdealTargetLocation :: Double -> Death -> Death
+updateIdealTargetLocation :: Time -> Death -> Death
 updateIdealTargetLocation t self =
   self { idealTargetLocation = Just (M.idealNewLocation (wrapMap self)
                                                         (center self)
diff --git a/Unit/Smart/Ninja.hs b/Unit/Smart/Ninja.hs
--- a/Unit/Smart/Ninja.hs
+++ b/Unit/Smart/Ninja.hs
@@ -19,6 +19,7 @@
 import Universe hiding (wrapMap, resourceTracker)
 import qualified Universe as U
 import Sound.ALUT
+import Common
 
 radialVelocity = pi/2 -- radians per second
 
@@ -34,13 +35,13 @@
 
 shotDelay = 5.0
 
-data Ninja = Ninja { angle :: Double -- radians
-                   , velocity :: (Double, Double)
+data Ninja = Ninja { angle :: Angle -- radians
+                   , velocity :: Velocity
                    , center :: WrapPoint
                    , idealTargetLocation :: Maybe WrapPoint
                    , wrapMap :: WrapMap
                    , launchTube :: [Projectile]
-                   , sinceLastShot :: Double
+                   , sinceLastShot :: Time
                    , integrity :: Double
                    , vision :: Maybe Arena
                    , resourceTracker :: ResourceTracker
@@ -87,7 +88,7 @@
 new :: ResourceTracker
         -> WrapMap
         -> WrapPoint
-        -> Double
+        -> Angle
         -> Ninja
 new rt wmap center' angle' =
   Ninja { center = center'
@@ -129,7 +130,7 @@
                                 | otherwise = 0.0 in
                           self { angle = angle self + adj }
 
-updateVelocity :: Double -> Ninja -> Ninja
+updateVelocity :: Time -> Ninja -> Ninja
 updateVelocity t self =
   let thrustingVelocity = M.calcNewVelocity
                               (velocity self)
@@ -221,7 +222,7 @@
                                      (M.velocity l)
                                      (M.velocity self))
 
-updateIdealTargetLocation :: Double -> Ninja -> Ninja
+updateIdealTargetLocation :: Time -> Ninja -> Ninja
 updateIdealTargetLocation t self =
   self { idealTargetLocation = Just (M.idealNewLocation (wrapMap self)
                                                         (center self)
diff --git a/Unit/Smart/Saucer.hs b/Unit/Smart/Saucer.hs
--- a/Unit/Smart/Saucer.hs
+++ b/Unit/Smart/Saucer.hs
@@ -19,6 +19,7 @@
 import Universe hiding (wrapMap, resourceTracker)
 import qualified Universe as U
 import Sound.ALUT
+import Common
 
 radialVelocity = pi -- radians per second
 
@@ -34,13 +35,13 @@
 
 shotDelay = 0.10
 
-data Saucer = Saucer { angle :: Double -- radians
-                     , velocity :: (Double, Double)
+data Saucer = Saucer { angle :: Angle -- radians
+                     , velocity :: Velocity
                      , center :: WrapPoint
                      , idealTargetLocation :: Maybe WrapPoint
                      , wrapMap :: WrapMap
                      , launchTube :: [Projectile]
-                     , sinceLastShot :: Double
+                     , sinceLastShot :: Time
                      , integrity :: Double
                      , vision :: Maybe Arena
                      , resourceTracker :: ResourceTracker
@@ -89,7 +90,7 @@
 new :: ResourceTracker
         -> WrapMap
         -> WrapPoint
-        -> Double
+        -> Angle
         -> Saucer
 new rt wmap center' angle' =
   Saucer { center = center'
@@ -132,7 +133,7 @@
                                 | otherwise = 0.0 in
                           self { angle = angle self + adj }
 
-updateVelocity :: Double -> Saucer -> Saucer
+updateVelocity :: Time -> Saucer -> Saucer
 updateVelocity t self =
   let thrustingVelocity = M.calcNewVelocity
                               (velocity self)
@@ -226,7 +227,7 @@
                        , 5.498
                        ]
 
-updateIdealTargetLocation :: Double -> Saucer -> Saucer
+updateIdealTargetLocation :: Time -> Saucer -> Saucer
 updateIdealTargetLocation t self =
   self { idealTargetLocation = Just (M.idealNewLocation (wrapMap self)
                                                         (center self)
diff --git a/Unit/Smart/Sniper.hs b/Unit/Smart/Sniper.hs
--- a/Unit/Smart/Sniper.hs
+++ b/Unit/Smart/Sniper.hs
@@ -19,6 +19,7 @@
 import Universe hiding (wrapMap, resourceTracker)
 import qualified Universe as U
 import Sound.ALUT
+import Common
 
 radialVelocity = pi/6 -- radians per second
 
@@ -34,13 +35,13 @@
 
 shotDelay = 4.0
 
-data Sniper = Sniper { angle :: Double -- radians
-                     , velocity :: (Double, Double)
+data Sniper = Sniper { angle :: Angle -- radians
+                     , velocity :: Velocity
                      , center :: WrapPoint
                      , idealTargetLocation :: Maybe WrapPoint
                      , wrapMap :: WrapMap
                      , launchTube :: [Projectile]
-                     , sinceLastShot :: Double
+                     , sinceLastShot :: Time
                      , integrity :: Double
                      , vision :: Maybe Arena
                      , resourceTracker :: ResourceTracker
@@ -88,7 +89,7 @@
 new :: ResourceTracker
         -> WrapMap
         -> WrapPoint
-        -> Double
+        -> Angle
         -> Sniper
 new rt wmap center' angle' =
   Sniper { center = center'
@@ -127,7 +128,7 @@
                                 | otherwise = 0.0 in
                           self { angle = angle self + adj }
 
-updateVelocity :: Double -> Sniper -> Sniper
+updateVelocity :: Time -> Sniper -> Sniper
 updateVelocity t self =
   self { velocity = M.calcNewVelocity
                       (velocity self)
@@ -201,7 +202,7 @@
                                      (M.velocity l)
                                      (M.velocity self))
 
-updateIdealTargetLocation :: Double -> Sniper -> Sniper
+updateIdealTargetLocation :: Time -> Sniper -> Sniper
 updateIdealTargetLocation t self =
   self { idealTargetLocation = Just (M.idealNewLocation (wrapMap self)
                                                         (center self)
diff --git a/Unit/Smart/Tank.hs b/Unit/Smart/Tank.hs
--- a/Unit/Smart/Tank.hs
+++ b/Unit/Smart/Tank.hs
@@ -19,6 +19,7 @@
 import Universe hiding (wrapMap, resourceTracker)
 import qualified Universe as U
 import Sound.ALUT
+import Common
 
 radialVelocity = pi/6 -- radians per second
 
@@ -30,13 +31,13 @@
 
 accelerationRate = 30
 
-data Tank = Tank { angle :: Double -- radians
-                 , velocity :: (Double, Double)
+data Tank = Tank { angle :: Angle -- radians
+                 , velocity :: Velocity
                  , center :: WrapPoint
                  , idealTargetLocation :: Maybe WrapPoint
                  , wrapMap :: WrapMap
                  , launchTube :: [Projectile]
-                 , sinceLastShot :: Double
+                 , sinceLastShot :: Time
                  , integrity :: Double
                  , vision :: Maybe Arena
                  , resourceTracker :: ResourceTracker
@@ -84,7 +85,7 @@
 new :: ResourceTracker
         -> WrapMap
         -> WrapPoint
-        -> Double
+        -> Angle
         -> Tank
 new rt wmap center' angle' =
   Tank { center = center'
@@ -123,7 +124,7 @@
                                 | otherwise = 0.0 in
                           self { angle = angle self + adj }
 
-updateVelocity :: Double -> Tank -> Tank
+updateVelocity :: Time -> Tank -> Tank
 updateVelocity t self =
   self { velocity = M.calcNewVelocity
                       (velocity self)
@@ -192,7 +193,7 @@
                                     (center self)
                                     (M.center l))
 
-updateIdealTargetLocation :: Double -> Tank -> Tank
+updateIdealTargetLocation :: Time -> Tank -> Tank
 updateIdealTargetLocation t self =
   self { idealTargetLocation = Just (M.idealNewLocation (wrapMap self)
                                                         (center self)
diff --git a/Universe.hs b/Universe.hs
--- a/Universe.hs
+++ b/Universe.hs
@@ -10,6 +10,7 @@
             )
 import ResourceTracker
 import Item
+import Common
 
 data Arena = Arena { lance :: Maybe Lance
                    , lastFocus :: WrapPoint
@@ -31,6 +32,8 @@
                          , delayRemaining :: Double
                          , resourceTracker :: ResourceTracker
                          , skipLevel :: Bool
+                         , levelMessageTimer :: Maybe Time
+                         , panelActivationTimer :: Time
                          }
 
 blankArena width height =
diff --git a/Updating.hs b/Updating.hs
--- a/Updating.hs
+++ b/Updating.hs
@@ -3,10 +3,11 @@
 import {-# SOURCE #-} AfterEffect ( AfterEffect )
 import {-# SOURCE #-} Universe ( Arena )
 
--- Double is elapsed time in seconds
+import Common
+
 class InternallyUpdating a where
-  preUpdate :: a -> Double -> a
-  postUpdate :: a -> Double -> a
+  preUpdate :: a -> Time -> a
+  postUpdate :: a -> Time -> a
 
 {- 
   Objects that exist temporarily or that may die after being wounded a certain
diff --git a/edge.cabal b/edge.cabal
--- a/edge.cabal
+++ b/edge.cabal
@@ -7,7 +7,7 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.8
+Version:             0.8.2
 
 -- A short (one-line) description of the package.
 Synopsis:            Top view space combat arcade game
@@ -23,7 +23,7 @@
                      Good luck commander!
 
 -- URL for the project homepage or repository.
-Homepage:            http://frigidcode.com
+Homepage:            http://frigidcode.com/code/edge
 
 -- The license under which the package is released.
 License:             GPL-3
@@ -72,6 +72,7 @@
   Other-modules:     Lance
                      , Asteroid
                      , BigAsteroid
+                     , Common
                      , Trigonometry
                      , Animation
                      , Star
diff --git a/edge.hs b/edge.hs
--- a/edge.hs
+++ b/edge.hs
@@ -48,5 +48,7 @@
                      , delayRemaining = 2.0
                      , resourceTracker = rt
                      , skipLevel = False
+                     , levelMessageTimer = Nothing
+                     , panelActivationTimer = 0.0
                      }
 
