diff --git a/csound-expression-dynamic.cabal b/csound-expression-dynamic.cabal
--- a/csound-expression-dynamic.cabal
+++ b/csound-expression-dynamic.cabal
@@ -1,5 +1,5 @@
 Name:          csound-expression-dynamic
-Version:       0.0.5
+Version:       0.0.6
 Cabal-Version: >= 1.6
 License:       BSD3
 License-file:  LICENSE
diff --git a/src/Csound/Dynamic/Build/Logic.hs b/src/Csound/Dynamic/Build/Logic.hs
--- a/src/Csound/Dynamic/Build/Logic.hs
+++ b/src/Csound/Dynamic/Build/Logic.hs
@@ -3,7 +3,9 @@
 -- | Boolean instances
 module Csound.Dynamic.Build.Logic(
     when1, whens,
-    ifBegin, ifEnd, elseBegin, elseIfBegin
+    ifBegin, ifEnd, elseBegin, elseIfBegin,
+    untilDo,
+    untilBegin, untilEnd
 ) where
 
 import Control.Monad.Trans.State(State, state, evalState)
@@ -45,6 +47,18 @@
 
 ifEnd :: Monad m => DepT m ()
 ifEnd = stmtOnlyT IfEnd
+
+untilDo :: Monad m => E -> DepT m () -> DepT m ()
+untilDo p body = do
+    untilBegin p
+    body
+    untilEnd
+
+untilBegin :: Monad m => E -> DepT m ()
+untilBegin = withCond UntilBegin
+
+untilEnd :: Monad m => DepT m ()
+untilEnd = stmtOnlyT UntilEnd
 
 withCond :: Monad m => (CondInfo (PrimOr E) -> MainExp (PrimOr E)) -> E -> DepT m ()
 withCond stmt p = depT_ $ noRate $ stmt (condInfo p)
diff --git a/src/Csound/Dynamic/Render/Instr.hs b/src/Csound/Dynamic/Render/Instr.hs
--- a/src/Csound/Dynamic/Render/Instr.hs
+++ b/src/Csound/Dynamic/Render/Instr.hs
@@ -143,9 +143,11 @@
     InitVar v a -> InitVar v $ rec1 Ir a -- rec1 (varRate v) a
     ExpPrim p -> ExpPrim p
     IfBegin _ -> rec2 condRate expr
+    UntilBegin _ -> rec2 condRate expr
     ElseIfBegin _ -> rec2 condRate expr
     ElseBegin -> ElseBegin
     IfEnd -> IfEnd
+    UntilEnd -> UntilEnd
     EmptyExp -> EmptyExp    
     Verbatim a -> Verbatim a
 
diff --git a/src/Csound/Dynamic/Render/Pretty.hs b/src/Csound/Dynamic/Render/Pretty.hs
--- a/src/Csound/Dynamic/Render/Pretty.hs
+++ b/src/Csound/Dynamic/Render/Pretty.hs
@@ -119,6 +119,8 @@
     ElseIfBegin a                   -> left >> (succTab $ text "elseif " <> ppCond a <> text " then")    
     ElseBegin                       -> left >> (succTab $ text "else")
     IfEnd                           -> left >> (tab     $ text "endif")
+    UntilBegin a                    -> succTab          $ text "until " <> ppCond a <> text " do"
+    UntilEnd                        -> left >> (tab     $ text "od")
     EmptyExp                        -> return empty
     Verbatim str                    -> return $ text str
     x -> error $ "unknown expression: " ++ show x
diff --git a/src/Csound/Dynamic/Tfm/Liveness.hs b/src/Csound/Dynamic/Tfm/Liveness.hs
--- a/src/Csound/Dynamic/Tfm/Liveness.hs
+++ b/src/Csound/Dynamic/Tfm/Liveness.hs
@@ -153,5 +153,5 @@
 initSt lastFreshId livenessTab = fmap (Registers initRegs livenessTab) (initSubstTable lastFreshId)
 
 initSubstTable :: Int ->  ST s (SubstTable s)
-initSubstTable n = A.newListArray (0, n) [0 .. n]
+initSubstTable n = A.newListArray (0, n+1) [0 .. n + 1]
 
diff --git a/src/Csound/Dynamic/Types/Exp.hs b/src/Csound/Dynamic/Types/Exp.hs
--- a/src/Csound/Dynamic/Types/Exp.hs
+++ b/src/Csound/Dynamic/Types/Exp.hs
@@ -135,6 +135,9 @@
     | ElseIfBegin (CondInfo a)
     | ElseBegin
     | IfEnd
+    -- | looping constructions
+    | UntilBegin (CondInfo a)
+    | UntilEnd
     -- | Verbatim stmt
     | Verbatim String
     deriving (Show, Eq, Ord, Functor, Foldable, Traversable)  
