diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,11 @@
+Change Log
+==========
+
+Version 1.0.2.0 (2016-12-13)
+----------------------------
+
+#### New features
+
+* Add `compileTextFileWith` and `compileHtmlFileWith` to inject extra variables
+* Add `ScopeM` type for specifying extra template variables
+* Add `setDefault` and `overwrite` for constructing `ScopeM`
diff --git a/heterocephalus.cabal b/heterocephalus.cabal
--- a/heterocephalus.cabal
+++ b/heterocephalus.cabal
@@ -1,5 +1,5 @@
 name:                heterocephalus
-version:             1.0.1.2
+version:             1.0.2.0
 synopsis:            A type-safe template engine for working with popular front end development tools
 description:
     Recent front end development tools and languages are growing fast and have
@@ -23,6 +23,7 @@
 build-type:          Simple
 extra-source-files:  templates/*.txt
                      README.md
+                     CHANGELOG.md
 cabal-version:       >=1.10
 
 library
@@ -34,6 +35,7 @@
                      , blaze-html >= 0.8 && < 0.9
                      , blaze-markup >= 0.7 && < 0.8
                      , containers >= 0.5 && < 0.6
+                     , dlist >= 0.7.1.1
                      , parsec >= 3.1 && < 3.2
                      , shakespeare >= 2.0 && < 2.1
                      , template-haskell >= 2.7 && < 3
diff --git a/src/Text/Heterocephalus.hs b/src/Text/Heterocephalus.hs
--- a/src/Text/Heterocephalus.hs
+++ b/src/Text/Heterocephalus.hs
@@ -19,20 +19,29 @@
   (
   -- * Core functions
     compileTextFile
+  , compileTextFileWith
   , compileTextFileWithDefault
   , compileHtmlFile
+  , compileHtmlFileWith
   , compileHtmlFileWithDefault
 
   -- * QuasiQuoters
   , compileText
   , compileHtml
 
+  -- * ScopeM
+  , ScopeM
+  , setDefault
+  , overwrite
+
   -- * low-level
   , HeterocephalusSetting(escapeExp)
   , DefaultScope
   , compile
+  , compileWith
   , compileWithDefault
   , compileFile
+  , compileFileWith
   , compileFileWithDefault
   , compileFromString
   , compileFromStringWithDefault
@@ -40,16 +49,19 @@
 
 #if MIN_VERSION_base(4,9,0)
 #else
-import Control.Applicative ((<$>))
+import Control.Applicative ((<$>), (<*>), Applicative(..))
+import Data.Monoid (mempty)
 #endif
 import Control.Monad (forM)
 import Data.Char (isDigit)
+import Data.DList (DList)
+import qualified Data.DList as DList
 import qualified Data.Foldable as F
 import Data.List (intercalate)
 import Data.String (IsString(..))
 import Data.Text (Text, pack)
 import qualified Data.Text.Lazy as TL
-import Language.Haskell.TH.Lib (varE)
+import Language.Haskell.TH.Lib (ExpQ, varE)
 import Language.Haskell.TH.Quote
 #if MIN_VERSION_template_haskell(2,9,0)
 import Language.Haskell.TH.Syntax hiding (Module)
@@ -82,6 +94,52 @@
 compileTextFile :: FilePath -> Q Exp
 compileTextFile = compileFile textSetting
 
+{-| Same as 'compileText' but allows the user to specify extra values for template parameters.
+  Values declared by 'overwrite' overwrites same name variables.
+  Values declared by 'setDefault' are overwritten by same name variables.
+
+  >>> :set -XOverloadedStrings
+  >>> :{
+  >>> putStr $ renderMarkup (
+  >>>   let as = ["<a>", "b"]
+  >>>   in $(compileTextFileWith "templates/sample.txt" $ do
+  >>>     setDefault "as" [| ["foo", "bar"] |]
+  >>>   )
+  >>> )
+  >>> :}
+  sample
+  key: <a>,
+  key: b,
+
+  >>> :{
+  >>> putStr $ renderMarkup (
+  >>>   let as = ["<a>", "b"]
+  >>>   in $(compileTextFileWith "templates/sample.txt" $ do
+  >>>     overwrite "as" [| ["foo", "bar"] |]
+  >>>   )
+  >>> )
+  >>> :}
+  sample
+  key: foo,
+  key: bar,
+
+  >>> :{
+  >>> putStr $ renderMarkup (
+  >>>   let as = ["<a>", "b"]
+  >>>   in $(compileTextFileWith "templates/sample.txt" $ do
+  >>>     overwrite "as" [| ["bazbaz", "barbar"] |]
+  >>>     setDefault "as" [| ["foo", "bar"] |]
+  >>>     overwrite "as" [| ["baz", "foobar"] |]
+  >>>   )
+  >>> )
+  >>> :}
+  sample
+  key: baz,
+  key: foobar,
+ -}
+compileTextFileWith :: FilePath -> ScopeM () -> Q Exp
+compileTextFileWith fp scopeM = compileFileWith scopeM textSetting fp
+
 {-| Same as 'compileText' but allows the user to specify default values for template parameters.
 
   >>> :set -XOverloadedStrings
@@ -121,6 +179,52 @@
 compileHtmlFile :: FilePath -> Q Exp
 compileHtmlFile fp = compileHtmlFileWithDefault fp []
 
+{-| Same as 'compileHtmlFile' but allows the user to specify extra values for template parameters.
+  Values declared by 'overwrite' overwrites same name variables.
+  Values declared by 'setDefault' are overwritten by same name variables.
+
+  >>> :set -XOverloadedStrings
+  >>> :{
+  >>> putStr $ renderMarkup (
+  >>>   let as = ["<a>", "b"]
+  >>>   in $(compileHtmlFileWith "templates/sample.txt" $ do
+  >>>     setDefault "as" [| ["foo", "bar"] |]
+  >>>   )
+  >>> )
+  >>> :}
+  sample
+  key: &lt;a&gt;,
+  key: b,
+
+  >>> :{
+  >>> putStr $ renderMarkup (
+  >>>   let as = ["<a>", "b"]
+  >>>   in $(compileHtmlFileWith "templates/sample.txt" $ do
+  >>>     overwrite "as" [| ["foo", "bar"] |]
+  >>>   )
+  >>> )
+  >>> :}
+  sample
+  key: foo,
+  key: bar,
+
+  >>> :{
+  >>> putStr $ renderMarkup (
+  >>>   let as = ["<a>", "b"]
+  >>>   in $(compileHtmlFileWith "templates/sample.txt" $ do
+  >>>     overwrite "as" [| ["bazbaz", "barbar"] |]
+  >>>     setDefault "as" [| ["foo", "bar"] |]
+  >>>     overwrite "as" [| ["baz", "foobar"] |]
+  >>>   )
+  >>> )
+  >>> :}
+  sample
+  key: baz,
+  key: foobar,
+ -}
+compileHtmlFileWith :: FilePath -> ScopeM () -> Q Exp
+compileHtmlFileWith fp scopeM = compileFileWith scopeM htmlSetting fp
+
 {-| Same as 'compileHtmlFile' but allows the user to specify default values for template parameters.
 
   >>> :set -XOverloadedStrings
@@ -175,6 +279,19 @@
 compile :: HeterocephalusSetting -> QuasiQuoter
 compile = compileWithDefault []
 
+{-| QuasiQuoter.
+ -}
+compileWith :: ScopeM () -> HeterocephalusSetting -> QuasiQuoter
+compileWith scopeM set =
+  QuasiQuoter
+  { quoteExp = compileFromStringWith scopeM set
+  , quotePat = error "not used"
+  , quoteType = error "not used"
+  , quoteDec = error "not used"
+  }
+
+{-| QuasiQuoter.
+ -}
 compileWithDefault :: DefaultScope -> HeterocephalusSetting -> QuasiQuoter
 compileWithDefault scope set =
   QuasiQuoter
@@ -191,6 +308,14 @@
 
 {-| Same as 'compileFile' but we can specify default scope.
 -}
+compileFileWith :: ScopeM () -> HeterocephalusSetting -> FilePath -> Q Exp
+compileFileWith scopeM set fp = do
+  qAddDependentFile fp
+  contents <- fmap TL.unpack $ qRunIO $ readUtf8File fp
+  compileFromStringWith scopeM set contents
+
+{-| Same as 'compileFile' but we can specify default scope.
+-}
 compileFileWithDefault :: DefaultScope -> HeterocephalusSetting -> FilePath -> Q Exp
 compileFileWithDefault scope' set fp = do
   qAddDependentFile fp
@@ -200,6 +325,18 @@
 compileFromString :: HeterocephalusSetting -> String -> Q Exp
 compileFromString = compileFromStringWithDefault []
 
+compileFromStringWith :: ScopeM () -> HeterocephalusSetting -> String -> Q Exp
+compileFromStringWith scopeM set s = do
+  defScope' <-
+    forM defScope $ \(ident, qexp) -> (ident, ) <$> overwriteScope ident qexp
+  owScope' <-
+    forM owScope $ \(ident, qexp) -> (ident, ) <$> qexp
+  docsToExp set (owScope' ++ defScope') $ docFromString s
+ where
+  (defDList, owDList) = runScopeM scopeM
+  defScope = DList.toList defDList
+  owScope = DList.toList owDList
+
 compileFromStringWithDefault :: DefaultScope -> HeterocephalusSetting -> String -> Q Exp
 compileFromStringWithDefault scope' set s = do
   scope <-
@@ -238,6 +375,69 @@
   }
 
 type DefaultScope = [(Ident, Q Exp)]
+
+type DefaultDList = DList (Ident, Q Exp)
+type OverwriteDList = DList (Ident, Q Exp)
+
+{- | A type to handle extra scopes.
+ - This is opaque type, so use 'setDefault' and 'overwrite'
+ - to construct new 'ScopeM'.
+ -}
+data ScopeM a
+  = SetDefault Ident ExpQ (ScopeM a)
+  | Overwrite Ident ExpQ (ScopeM a)
+  | PureScopeM a
+
+{- | Get default values and values to overwrite from 'ScopeM'.
+ -}
+runScopeM :: ScopeM a -> (DefaultDList, OverwriteDList)
+runScopeM (SetDefault ident qexp next) =
+  let (defaults, overwrites) = runScopeM next
+  in (DList.snoc defaults (ident, qexp), overwrites)
+runScopeM (Overwrite ident qexp next) =
+  let (defaults, overwrites) = runScopeM next
+  in (defaults, DList.snoc overwrites (ident, qexp))
+runScopeM (PureScopeM _) =
+  (mempty, mempty)
+
+instance Functor ScopeM where
+  fmap f (SetDefault ident qexp next) =
+    SetDefault ident qexp $ fmap f next
+  fmap f (Overwrite ident qexp next) =
+    Overwrite ident qexp $ fmap f next
+  fmap f (PureScopeM x) =
+    PureScopeM $ f x
+
+instance Applicative ScopeM where
+  pure = PureScopeM
+  SetDefault ident qexp next <*> f =
+    SetDefault ident qexp $ next <*> f
+  Overwrite ident qexp next <*> f =
+    Overwrite ident qexp $ next <*> f
+  PureScopeM g <*> f = f >>= (PureScopeM . g)
+
+instance Monad ScopeM where
+#if MIN_VERSION_base(4,9,0)
+#else
+  return = PureScopeM
+#endif
+  SetDefault ident qexp next >>= f = SetDefault ident qexp $ next >>= f
+  Overwrite ident qexp next >>= f = Overwrite ident qexp $ next >>= f
+  PureScopeM a >>= f = f a
+
+{-| Constructor for 'ScopeM'.
+ - Values declared by this function are overwritten
+ - by same name variables exits in scope of render function.
+ -}
+setDefault :: Ident -> Q Exp -> ScopeM ()
+setDefault ident qexp = SetDefault ident qexp $ pure ()
+
+{-| Constructor for 'ScopeM'.
+ - Values declared by this function overwrites
+ - same name variables exits in scope of render function.
+ -}
+overwrite :: Ident -> Q Exp -> ScopeM ()
+overwrite ident qexp = Overwrite ident qexp $ pure ()
 
 instance IsString Ident where
   fromString = Ident
