diff --git a/Sound/Tidal/Context.hs b/Sound/Tidal/Context.hs
--- a/Sound/Tidal/Context.hs
+++ b/Sound/Tidal/Context.hs
@@ -10,3 +10,4 @@
 import Sound.Tidal.Dirt as C
 import Sound.Tidal.Strategies as C
 import Sound.Tidal.Tempo as C
+import Sound.Tidal.Time as C
diff --git a/Sound/Tidal/Stream.hs b/Sound/Tidal/Stream.hs
--- a/Sound/Tidal/Stream.hs
+++ b/Sound/Tidal/Stream.hs
@@ -39,7 +39,7 @@
 
 type OscPattern = Pattern OscMap
 
-latency = 0.06
+latency = 0.04
 
 defaultDatum :: Param -> Maybe Datum
 defaultDatum (S _ (Just x)) = Just $ string x
@@ -69,17 +69,12 @@
 isSubset :: (Eq a) => [a] -> [a] -> Bool
 isSubset xs ys = all (\x -> elem x ys) xs
 
-tpb = 1
-bpb = 2
-
 toMessage :: UDP -> OscShape -> Tempo -> Int -> (Double, OscMap) -> Maybe (IO ())
-toMessage s shape change ticks (o, m) =
+toMessage s shape change cycle (o, m) =
   do m' <- applyShape' shape m
-     let beat = fromIntegral ticks / fromIntegral tpb
-         logicalNow = (logicalTime change beat)
-         beat' = (fromIntegral ticks + 1) / fromIntegral tpb
-         logicalPeriod = (logicalTime change (beat + 1)) - logicalNow
-         --logicalOnset = ntpr_to_ut $ logicalNow + (logicalPeriod * o) + latency
+     let cycleD = (fromIntegral cycle) :: Double
+         logicalNow = (logicalTime change cycleD)
+         logicalPeriod = (logicalTime change (cycleD + 1)) - logicalNow
          logicalOnset = logicalNow + (logicalPeriod * o) + latency
          sec = floor logicalOnset
          usec = floor $ 1000000 * (logicalOnset - (fromIntegral sec))
@@ -112,7 +107,7 @@
 stream :: String -> Int -> OscShape -> IO (OscPattern -> IO ())
 stream address port shape 
   = do patternM <- start address port shape
-       return $ \p -> do swapMVar patternM (slow bpb p)
+       return $ \p -> do swapMVar patternM p
                          return ()
 
 streamcallback :: (OscPattern -> IO ()) -> String -> Int -> OscShape -> IO (OscPattern -> IO ())
@@ -123,31 +118,16 @@
        return f'
 
 onTick :: UDP -> OscShape -> MVar (OscPattern) -> Tempo -> Int -> IO ()
-onTick s shape patternM change beats
+onTick s shape patternM change cycles
   = do p <- readMVar patternM
-       let --tpb' = 2 :: Integer
-           tpb' = 1
-           beats' = (fromIntegral beats) :: Integer
-           a = beats' % tpb'
-           b = (beats' + 1) % tpb'
+       let cycles' = (fromIntegral cycles) :: Integer
+           a = cycles' % 1
+           b = (cycles' + 1) % 1
            messages = mapMaybe 
-                      (toMessage s shape change beats) 
+                      (toMessage s shape change cycles) 
                       (seqToRelOnsets (a, b) p)
-       --putStrLn $ (show a) ++ ", " ++ (show b)
-       --putStrLn $ "tick " ++ show ticks ++ " = " ++ show messages
        E.catch (sequence_ messages) (\msg -> putStrLn $ "oops " ++ show (msg :: E.SomeException))
        return ()
-
-{-ticker :: IO (MVar Rational)
-ticker = do mv <- newMVar 0
-            --forkIO $ clocked "ticker" "127.0.0.1" "127.0.0.1" tpb (f mv)
-            forkIO $ clocked (f mv)
-            return mv
-  where f mv change ticks = do swapMVar mv ((fromIntegral ticks) / (fromIntegral tpb))
-  where f mv ticks = do swapMVar mv (fromIntegral ticks)
-                        return ()
-        tpb = 32
--}
 
 make :: (a -> Datum) -> OscShape -> String -> Pattern a -> OscPattern
 make toOsc s nm p = fmap (\x -> Map.singleton nParam (defaultV x)) p
diff --git a/Sound/Tidal/Tempo.hs b/Sound/Tidal/Tempo.hs
--- a/Sound/Tidal/Tempo.hs
+++ b/Sound/Tidal/Tempo.hs
@@ -46,7 +46,7 @@
 
 tempoMVar :: IO (MVar (Tempo))
 tempoMVar = do now <- getCurrentTime
-               mv <- newMVar (Tempo now 0 (126/60))
+               mv <- newMVar (Tempo now 0 0.5)
                forkIO $ clocked $ f mv
                return mv
   where f mv change _ = do swapMVar mv change
@@ -101,9 +101,17 @@
      forkIO $ connectClient False clockip mTempo mBps
      return (mTempo, mBps)
 
+bpsUtils :: IO ((Double -> IO (), IO (Rational)))
+bpsUtils = do (mTempo, mBps) <- runClient
+              let bpsSetter b = putMVar mBps b
+                  currentTime = do tempo <- readMVar mTempo
+                                   now <- beatNow tempo
+                                   return $ toRational now
+              return (bpsSetter, currentTime)
+
 bpsSetter :: IO (Double -> IO ())
-bpsSetter = do (_, mBps) <- runClient 
-               return $ (\b -> putMVar mBps b)
+bpsSetter = do (f, _) <- bpsUtils
+               return f
 
 clocked :: (Tempo -> Int -> IO ()) -> IO ()
 clocked callback = 
diff --git a/tidal.cabal b/tidal.cabal
--- a/tidal.cabal
+++ b/tidal.cabal
@@ -1,5 +1,5 @@
 name:                tidal
-version:             0.4
+version:             0.4.1
 synopsis:            Pattern language for improvised music
 -- description:         
 homepage:            http://yaxu.org/tidal/
diff --git a/tidal.el b/tidal.el
--- a/tidal.el
+++ b/tidal.el
@@ -68,7 +68,8 @@
   (tidal-send-string "d7 <- dirtStream")
   (tidal-send-string "d8 <- dirtStream")
   (tidal-send-string "d9 <- dirtStream")
-  (tidal-send-string "bps <- bpsSetter")
+  (tidal-send-string "(cps, getNow) <- bpsUtils")
+  (tidal-send-string "let bps x = cps (x/2)")
   (tidal-send-string "let hush = mapM_ ($ silence) [d1,d2,d3,d4,d5,d6,d7,d8,d9]")
   (tidal-send-string "let solo = (>>) hush")
   (tidal-send-string ":set prompt \"tidal> \"")
@@ -126,9 +127,19 @@
     (insert "main = do\n")
     (insert (if tidal-literate-p (tidal-unlit s) s))))
 
+
+(defun tidal-get-now ()
+  "Store the current cycle position in a variable called 'now'."
+  (interactive)
+  (tidal-send-string "now' <- getNow")
+  (tidal-send-string "let now = nextSam now'")
+  (tidal-send-string "let retrig = (now ~>)")
+  )
+
 (defun tidal-run-line ()
   "Send the current line to the interpreter."
   (interactive)
+  (tidal-get-now)
   (let* ((s (buffer-substring (line-beginning-position)
 			      (line-end-position)))
 	 (s* (if tidal-literate-p
@@ -142,6 +153,7 @@
 (defun tidal-run-multiple-lines ()
   "Send the current region to the interpreter as a single line."
   (interactive)
+  (tidal-get-now)
   (save-excursion
    (mark-paragraph)
    (let* ((s (buffer-substring-no-properties (region-beginning)
