diff --git a/glabrous.cabal b/glabrous.cabal
--- a/glabrous.cabal
+++ b/glabrous.cabal
@@ -1,5 +1,5 @@
 name:                glabrous
-version:             0.1.3.0
+version:             0.2.0
 synopsis:            A template DSL library
 description:         A minimalistic, Mustache-like syntax, truly logic-less,
                      pure Text template DSL library
@@ -23,16 +23,17 @@
   exposed-modules:     Text.Glabrous
                      , Text.Glabrous.Types
   other-modules:       Text.Glabrous.Internal
-  build-depends:       aeson >= 0.11
-                     , aeson-pretty >= 0.7
-                     , attoparsec >= 0.13
+  build-depends:       aeson >= 0.11.2 && < 0.12
+                     , aeson-pretty >= 0.7.2 && < 0.8
+                     , attoparsec >= 0.13.0 && < 0.14
                      , base >= 4.7 && < 5
-                     , bytestring >= 0.10.6
-                     , cereal >= 0.5.2
-                     , cereal-text
-                     , either >= 4.4
-                     , text >= 1.2
-                     , unordered-containers >= 0.2
+                     , bytestring >= 0.10.6 && < 0.11
+                     , cereal >= 0.5.2 && < 0.6
+                     , cereal-text >= 0.1.0 && < 0.2
+                     , either >= 4.4.1 && < 4.5
+                     , text >= 1.2.2 && < 1.3
+                     , unordered-containers >= 0.2.7 && < 0.3
+
   default-language:    Haskell2010
   GHC-options:       -Wall
 
diff --git a/src/Text/Glabrous.hs b/src/Text/Glabrous.hs
--- a/src/Text/Glabrous.hs
+++ b/src/Text/Glabrous.hs
@@ -33,6 +33,7 @@
 
   -- ** Get a 'Context'
   , initContext
+  , fromTagsList
   , fromList
   , fromTemplate
 
@@ -129,12 +130,18 @@
 fromList :: [(T.Text, T.Text)] -> Context
 fromList ts = Context { variables = H.fromList ts }
 
--- | Build an adhoc 'Context' for the given
--- 'Template' with all its variables empty.
+-- | Build an unset 'Context' from a list of 'Tag's.
+--
+-- >λ>fromTagsList ["something","etc."]
+-- >Context {variables = fromList [("etc.",""),("something","")]}
+fromTagsList :: [T.Text] -> Context
+fromTagsList ts = fromList $ (\t -> (t,T.empty)) <$> ts
+
+-- | Build an unset ad hoc 'Context' from the given 'Template'.
 fromTemplate :: Template -> Context
 fromTemplate t = setVariables ((\e -> (e,T.empty)) <$> tagsOf t) initContext
 
--- | Get a 'Context' from a file.
+-- | Get a 'Context' from a JSON file.
 readContextFile :: FilePath -> IO (Maybe Context)
 readContextFile f = decode <$> L.readFile f
 
@@ -150,7 +157,7 @@
 writeContextFile :: FilePath -> Context -> IO ()
 writeContextFile f c = L.writeFile f $ encodePretty c
 
--- | Based on the given 'Context', write a
+-- | Based on the given 'Context', write a JSON
 -- 'Context' file with all its variables empty.
 --
 -- @
@@ -182,7 +189,7 @@
 isSet Context{..} =
   H.foldr (\v b -> b && v /= T.empty) True variables
 
--- | Get the list of the given 'Context' variables
+-- | Get the list of the given 'Context' variables.
 variablesOf :: Context -> [T.Text]
 variablesOf Context{..} = H.keys variables
 
@@ -228,7 +235,7 @@
 isFinal Template{..} = all isLiteral content
 
 -- | Process, discard 'Tag's which are not in the 'Context'
--- and leave them without replacement text in the final 'T.Text'.
+-- and replace them with nothing in the final 'T.Text'.
 process :: Template -> Context -> T.Text
 process = processWithDefault T.empty
 
@@ -257,20 +264,20 @@
         trans t = t
 
 -- | Process a (sub)'Context' present in the given template, and
--- get either a 'Final' 'T.Text' or a new 'Template' with the list
--- of its 'Tag's.
+-- get either a 'Final' 'T.Text' or a new 'Template' with its unset
+-- ad hoc 'Context'.
 --
 -- >λ>partialProcess' template context
--- >Partial {template = Template {content = [Literal "Some ",Tag "tags",Literal " are unused in this ",Tag "text",Literal "."]}, tags = ["tags","text"]}
+-- >Partial {template = Template {content = [Literal "Some ",Tag "tags",Literal " are unused in this ",Tag "text",Literal "."]}, context = Context {variables = fromList [("text",""),("tags","")]}}
 partialProcess' :: Template -> Context -> G.Result
 partialProcess' t c@Context{..} =
   case foldl trans ([],[]) (content t) of
     (f,[]) -> Final $ toTextWithContext (const T.empty) c f
-    (p,p') -> G.Partial Template { content = p } p'
+    (p,p') -> G.Partial Template { content = p } (fromTagsList p')
   where
     trans (!c',!ts) t' =
       case t' of
-        Tag k     ->
+        Tag k ->
           case H.lookup k variables of
             Just v  -> (c' ++ [Literal v],ts)
             Nothing -> (c' ++ [t'],ts ++ [k])
diff --git a/src/Text/Glabrous/Types.hs b/src/Text/Glabrous/Types.hs
--- a/src/Text/Glabrous/Types.hs
+++ b/src/Text/Glabrous/Types.hs
@@ -8,6 +8,7 @@
 import qualified Data.Text           as T
 import           Data.Serialize
 import           Data.Serialize.Text ()
+import           Control.Arrow       (second)
 import           GHC.Generics
 
 data Token
@@ -31,7 +32,7 @@
 
 instance ToJSON Context where
   toJSON (Context h) =
-    object $ (\(k,v) -> (k,String v)) <$> H.toList h
+    object (second String <$> H.toList h)
 
 instance FromJSON Context where
   parseJSON (Object o) = return
@@ -42,6 +43,6 @@
 
 data Result
   = Final !T.Text
-  | Partial { template :: !Template , tags :: ![Tag] }
+  | Partial { template :: !Template , context :: !Context }
   deriving (Eq, Show)
 
diff --git a/tests/hspec.hs b/tests/hspec.hs
--- a/tests/hspec.hs
+++ b/tests/hspec.hs
@@ -7,7 +7,7 @@
 import           Data.Text
 import           System.Directory        (removeFile)
 import           Test.Hspec
-import           Text.Glabrous
+import           Text.Glabrous           as G
 import           Text.Glabrous.Types
 
 templateText :: Text
@@ -90,7 +90,7 @@
 
     describe "partialProcess'" $
         it "apply to a template with a subcontext outputs a template with its tags" $
-            (return $ partialProcess' template' pcontext) `shouldReturn` Partial {template = Template {content = [Literal "Affirmanti incumbit probatio. Lorem ",Literal " Dolor! ",Literal " sit amet, ",Tag "consectetur",Literal " adipiscing elit. Proin bibendum mauris ",Literal " Vitae! ",Literal " dui venenatis pretium. Maecenas vestibulum justo at accumsan ",Tag "mattis",Literal ". Nulla id finibus sem. Cras dolor nunc, consectetur in tincidunt id, facilisis in lorem. Nullam sed eros venenatis, tempor felis in, ultrices enim. Donec sit amet ligula ac orci cursus finibus ut eget lectus. Praesent feugiat massa non mi venenatis ",Literal " Faucibus! ",Literal ". Fabricando fit faber."]}, tags = ["consectetur","mattis"]}
+            (return $ partialProcess' template' pcontext) `shouldReturn` Partial {template = Template {content = [Literal "Affirmanti incumbit probatio. Lorem ",Literal " Dolor! ",Literal " sit amet, ",Tag "consectetur",Literal " adipiscing elit. Proin bibendum mauris ",Literal " Vitae! ",Literal " dui venenatis pretium. Maecenas vestibulum justo at accumsan ",Tag "mattis",Literal ". Nulla id finibus sem. Cras dolor nunc, consectetur in tincidunt id, facilisis in lorem. Nullam sed eros venenatis, tempor felis in, ultrices enim. Donec sit amet ligula ac orci cursus finibus ut eget lectus. Praesent feugiat massa non mi venenatis ",Literal " Faucibus! ",Literal ". Fabricando fit faber."]}, G.context =  Context {variables = H.fromList [("consectetur",""),("mattis","")]}}
 
     describe "compress" $
         it "optimize a template after partialProcess(')" $
