diff --git a/digestive-functors-heist.cabal b/digestive-functors-heist.cabal
--- a/digestive-functors-heist.cabal
+++ b/digestive-functors-heist.cabal
@@ -1,5 +1,5 @@
 Name:          digestive-functors-heist
-Version:       0.6.2.1
+Version:       0.7.0.0
 Synopsis:      Heist frontend for the digestive-functors library
 Description:   Heist frontend for the digestive-functors library
 Homepage:      http://github.com/jaspervdj/digestive-functors
@@ -21,7 +21,7 @@
   Build-depends:
     base               >= 4      && < 5,
     blaze-builder      >= 0.3    && < 0.4,
-    digestive-functors >= 0.6    && < 0.7,
+    digestive-functors >= 0.6.1  && < 0.7,
     heist              >= 0.11.1 && < 0.13,
     mtl                >= 2      && < 2.2,
     text               >= 0.11   && < 0.12,
diff --git a/src/Text/Digestive/Heist.hs b/src/Text/Digestive/Heist.hs
--- a/src/Text/Digestive/Heist.hs
+++ b/src/Text/Digestive/Heist.hs
@@ -138,6 +138,12 @@
 
 
 --------------------------------------------------------------------------------
+-- | 
+setDisabled :: Text -> View v -> [(Text, Text)] -> [(Text, Text)]
+setDisabled ref view = if viewDisabled ref view then (("disabled",""):) else id
+
+
+--------------------------------------------------------------------------------
 -- | Generate an input field with a supplied type. Example:
 --
 -- > <dfInput type="date" ref="date" />
@@ -146,7 +152,7 @@
     (ref, attrs) <- getRefAttributes Nothing
     let ref'  = absoluteRef ref view
         value = fieldInputText ref view
-    return $ makeElement "input" [] $ addAttrs attrs
+    return $ makeElement "input" [] $ addAttrs attrs $ setDisabled ref view
         [("id", ref'), ("name", ref'), ("value", value)]
 
 
@@ -159,7 +165,7 @@
     (ref, attrs) <- getRefAttributes Nothing
     let ref'  = absoluteRef ref view
         value = fieldInputText ref view
-    return $ makeElement "input" [] $ addAttrs attrs
+    return $ makeElement "input" [] $ addAttrs attrs $ setDisabled ref view
         [("type", "text"), ("id", ref'), ("name", ref'), ("value", value)]
 
 
@@ -172,8 +178,8 @@
     (ref, attrs) <- getRefAttributes Nothing
     let ref'  = absoluteRef ref view
         value = fieldInputText ref view
-    return $ makeElement "textarea" [X.TextNode value] $ addAttrs attrs
-        [("id", ref'), ("name", ref')]
+    return $ makeElement "textarea" [X.TextNode value] $ addAttrs attrs $
+        setDisabled ref view [("id", ref'), ("name", ref')]
 
 
 --------------------------------------------------------------------------------
@@ -185,7 +191,7 @@
     (ref, attrs) <- getRefAttributes Nothing
     let ref'  = absoluteRef ref view
         value = fieldInputText ref view
-    return $ makeElement "input" [] $ addAttrs attrs
+    return $ makeElement "input" [] $ addAttrs attrs $ setDisabled ref view
         [("type", "password"), ("id", ref'), ("name", ref'), ("value", value)]
 
 
@@ -198,7 +204,7 @@
     (ref, attrs) <- getRefAttributes Nothing
     let ref'  = absoluteRef ref view
         value = fieldInputText ref view
-    return $ makeElement "input" [] $ addAttrs attrs
+    return $ makeElement "input" [] $ addAttrs attrs $ setDisabled ref view
         [("type", "hidden"), ("id", ref'), ("name", ref'), ("value", value)]
 
 
@@ -218,7 +224,7 @@
             (attr sel ("selected", "selected") [("value", value i)])
             [X.TextNode c]
 
-    return $ makeElement "select" kids $ addAttrs attrs
+    return $ makeElement "select" kids $ addAttrs attrs $ setDisabled ref view
         [("id", ref'), ("name", ref')]
 
 
@@ -240,7 +246,7 @@
             (attr sel ("selected", "selected") [("value", value i)])
             [X.TextNode c]
 
-    return $ makeElement "select" kids $ addAttrs attrs
+    return $ makeElement "select" kids $ addAttrs attrs $ setDisabled ref view
         [("id", ref'), ("name", ref')]
 
 
@@ -280,7 +286,7 @@
     let ref'  = absoluteRef ref view
         value = fieldInputBool ref view
     return $ makeElement "input" [] $ addAttrs attrs $
-        attr value ("checked", "checked") $
+        attr value ("checked", "checked") $ setDisabled ref view
         [("type", "checkbox"), ("id", ref'), ("name", ref')]
 
 
@@ -293,7 +299,7 @@
     (ref, attrs) <- getRefAttributes Nothing
     let ref'  = absoluteRef ref view
         value = maybe "" T.pack $ fieldInputFile ref view
-    return $ makeElement "input" [] $ addAttrs attrs
+    return $ makeElement "input" [] $ addAttrs attrs $ setDisabled ref view
         [("type", "file"), ("id", ref'), ("name", ref'), ("value", value)]
 
 
@@ -411,6 +417,11 @@
     return nodes
 
 
+disableOnclick :: Text -> View v -> [(Text, Text)] -> [(Text, Text)]
+disableOnclick ref view =
+    if viewDisabled ref view then const [("disabled","")] else id
+
+
 --------------------------------------------------------------------------------
 -- | This splice allows variable length lists.  It binds several attribute
 -- splices providing functionality for dynamically manipulating the list.  The
@@ -440,11 +451,11 @@
             [ ("id", listRef)
             , ("class", "inputList")
             ]
-        addControl _ = return
+        addControl _ = return $ disableOnclick ref view
             [ ("onclick", T.concat [ "addInputListItem(this, '"
                                    , listRef
                                    , "'); return false;"] ) ]
-        removeControl _ = return
+        removeControl _ = return $ disableOnclick ref view
             [ ("onclick", T.concat [ "removeInputListItem(this, '"
                                    , listRef
                                    , "'); return false;"] ) ]
diff --git a/src/Text/Digestive/Heist/Compiled.hs b/src/Text/Digestive/Heist/Compiled.hs
--- a/src/Text/Digestive/Heist/Compiled.hs
+++ b/src/Text/Digestive/Heist/Compiled.hs
@@ -29,7 +29,6 @@
 module Text.Digestive.Heist.Compiled
     ( -- * Core methods
       formSplice
-    , formSplice'
 
       -- * Main splices
     , dfInput
@@ -57,7 +56,6 @@
 --------------------------------------------------------------------------------
 import           Blaze.ByteString.Builder
 import           Control.Monad         (mplus)
-import           Control.Monad.Trans
 import           Data.Function         (on)
 import           Data.List             (unionBy)
 import           Data.Maybe            (fromMaybe)
@@ -111,26 +109,12 @@
 --
 -- Then you can use the customerForm tag just like you would use the dfForm
 -- tag in interpreted templates anywhere you want to have a customer form.
-formSplice :: Monad m => m (View Text) -> Splice m
-formSplice = formSplice' [] []
-
-
-------------------------------------------------------------------------------
--- | A compiled splice for a specific form.  You pass in a runtime action that
--- gets the form's view and this function returns a splice that creates a form
--- tag.  In your HeistConfig you might have a compiled splice like this:
---
--- `("customerForm", formSplice (liftM fst $ runForm "customer" custForm))`
---
--- Then you can use the customerForm tag just like you would use the dfForm
--- tag in interpreted templates anywhere you want to have a customer form.
---formSplice' :: Monad m => m (View Text) -> Splice m
-formSplice' :: Monad m
-            => [(Text, Splice m)]
-            -> [(Text, AttrSplice m)]
-            -> m (View Text)
-            -> Splice m
-formSplice' ss as getView = do
+formSplice :: Monad m
+           => [(Text, Splice m)]
+           -> [(Text, AttrSplice m)]
+           -> RuntimeSplice m (View Text)
+           -> Splice m
+formSplice ss as getView = do
     node <- getParamNode
     let (_, attrs) = getRefAttributes node Nothing
         tree = X.Element "form"
@@ -141,7 +125,7 @@
                  (X.childNodes node)
         action = runNode tree
     defer (\vp -> withLocalSplices (digestiveSplices vp ++ ss) as action)
-          (lift getView)
+          getView
 
 
 --------------------------------------------------------------------------------
