diff --git a/heist-emanote.cabal b/heist-emanote.cabal
--- a/heist-emanote.cabal
+++ b/heist-emanote.cabal
@@ -1,5 +1,5 @@
 name:           heist-emanote
-version:        1.2.0.0
+version:        1.2.1.0
 synopsis:       An Haskell template system supporting both HTML5 and XML.
 description:
     Heist is a powerful template system that supports both HTML5 and XML.
@@ -163,7 +163,7 @@
     Heist.Interpreted.Internal
 
   build-depends:
-    aeson                      >= 0.6     && < 1.6,
+    aeson                      >= 0.6     && < 2.1,
     attoparsec                 >= 0.10    && < 0.14,
     base                       >= 4.5     && < 4.15,
     blaze-builder              >= 0.2     && < 0.5,
@@ -187,7 +187,8 @@
     transformers-base          >= 0.4     && < 0.5,
     unordered-containers       >= 0.1.4   && < 0.3,
     vector                     >= 0.9     && < 0.13,
-    xmlhtml                    >= 0.2.3.5 && < 0.3
+    xmlhtml                    >= 0.2.3.5 && < 0.3,
+    indexed-traversable
 
   if !impl(ghc >= 8.0)
     build-depends: semigroups >= 0.16 && < 0.19
@@ -253,8 +254,10 @@
     transformers-base,
     unordered-containers,
     vector,
-    xmlhtml
+    xmlhtml,
+    indexed-traversable
 
+
   if !impl(ghc >= 8.0)
     build-depends: semigroups >= 0.16 && < 0.19
 
@@ -304,7 +307,9 @@
     transformers-base,
     unordered-containers,
     vector,
-    xmlhtml
+    xmlhtml,
+    indexed-traversable
+
 
   if !impl(ghc >= 8.0)
     build-depends: semigroups >= 0.16 && < 0.19
diff --git a/src/Heist/Common.hs b/src/Heist/Common.hs
--- a/src/Heist/Common.hs
+++ b/src/Heist/Common.hs
@@ -17,7 +17,7 @@
 import           Data.Hashable            (Hashable)
 import           Data.HashMap.Strict      (HashMap)
 import qualified Data.HashMap.Strict      as Map
-import           Data.List                (isSuffixOf)
+import           Data.List                (isSuffixOf, sort)
 import           Data.Map.Syntax
 import           Data.Maybe               (isJust)
 import           Data.Monoid              ((<>))
@@ -95,7 +95,7 @@
     let spliceError = SpliceError
                       { spliceHistory = _splicePath hs
                       , spliceTemplateFile = _curTemplateFile hs
-                      , visibleSplices = Map.keys $ _compiledSpliceMap hs
+                      , visibleSplices = sort $ Map.keys $ _compiledSpliceMap hs
                       , contextNode = node
                       , spliceMsg = msg
                       }
diff --git a/src/Heist/Splices/Json.hs b/src/Heist/Splices/Json.hs
--- a/src/Heist/Splices/Json.hs
+++ b/src/Heist/Splices/Json.hs
@@ -1,6 +1,8 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE BangPatterns        #-}
 {-# LANGUAGE OverloadedStrings   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 module Heist.Splices.Json (
   bindJson
@@ -11,7 +13,13 @@
 import           Data.Aeson
 import qualified Data.ByteString.Char8       as S
 import qualified Data.ByteString.Lazy.Char8  as L
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.KeyMap           as KM
+import qualified Data.Aeson.Key              as K
+import qualified Data.Foldable.WithIndex     as FI
+#else
 import qualified Data.HashMap.Strict         as Map
+#endif
 import           Data.Map.Syntax
 import           Data.Maybe
 import           Data.Text                   (Text)
@@ -89,7 +97,6 @@
 numToText :: ToJSON a => a -> Text
 numToText = T.decodeUtf8 . S.concat . L.toChunks . encode
 
-
 ------------------------------------------------------------------------------
 findExpr :: Text -> Value -> Maybe Value
 findExpr t = go (T.split (=='.') t)
@@ -97,7 +104,11 @@
     go [] !value     = Just value
     go (x:xs) !value = findIn value >>= go xs
       where
+#if MIN_VERSION_aeson(2,0,0)
+        findIn (Object obj) = KM.lookup (K.fromText x) obj
+#else
         findIn (Object obj) = Map.lookup x obj
+#endif
         findIn (Array arr)  = tryReadIndex >>= \i -> arr V.!? i
         findIn _            = Nothing
 
@@ -217,13 +228,23 @@
     --------------------------------------------------------------------------
     goObject obj = do
         start <- genericBindings
+#if MIN_VERSION_aeson(2,0,0)
+        let bindings = FI.ifoldl' (flip bindKvp) start  obj
+#else
         let bindings = Map.foldlWithKey' bindKvp start obj
+#endif
         lift $ runChildrenWith bindings
 
     --------------------------------------------------------------------------
+    
     bindKvp bindings k v =
-        let newBindings = do
-                T.append "with:" k    ## withValue v explodeTag
-                T.append "snippet:" k ## withValue v snippetTag
-                T.append "value:" k   ## withValue v valueTag
-        in  bindings >> newBindings
+#if MIN_VERSION_aeson(2,0,0)
+        let k' = K.toText k
+#else
+        let k' = k
+#endif
+            newBindings = do
+                T.append "with:" k'    ## withValue v explodeTag
+                T.append "snippet:" k' ## withValue v snippetTag
+                T.append "value:" k'   ## withValue v valueTag
+        in  bindings >> newBindings    
diff --git a/test/suite/Heist/Compiled/Tests.hs b/test/suite/Heist/Compiled/Tests.hs
--- a/test/suite/Heist/Compiled/Tests.hs
+++ b/test/suite/Heist/Compiled/Tests.hs
@@ -266,9 +266,9 @@
 
     H.assertEqual "namespace bind error test" (Left [ err1, err2, err3 ])  res
   where
-    err1 = "templates-nsbind/nsbinderror.tpl: No splice bound for h:invalid3\n   ... via templates-nsbind/nsbinderror.tpl: h:main2\nBound splices: h:sub h:recurse h:call h:main2 h:main\nNode: Element {elementTag = \"h:invalid3\", elementAttrs = [], elementChildren = []}"
-    err2 = "templates-nsbind/nsbinderror.tpl: No splice bound for h:invalid2\n   ... via templates-nsbind/nsbinderror.tpl: h:recurse\n   ... via templates-nsbind/nsbinderror.tpl: h:main\nBound splices: h:sub h:recurse h:call h:main2 h:main\nNode: Element {elementTag = \"h:invalid2\", elementAttrs = [], elementChildren = []}"
-    err3 = "templates-nsbind/nsbinderror.tpl: No splice bound for h:invalid1\nBound splices: h:call h:main2 h:main\nNode: Element {elementTag = \"h:invalid1\", elementAttrs = [], elementChildren = []}"
+    err1 = "templates-nsbind/nsbinderror.tpl: No splice bound for h:invalid3\n   ... via templates-nsbind/nsbinderror.tpl: h:main2\nBound splices: h:call h:main h:main2 h:recurse h:sub\nNode: Element {elementTag = \"h:invalid3\", elementAttrs = [], elementChildren = []}"
+    err2 = "templates-nsbind/nsbinderror.tpl: No splice bound for h:invalid2\n   ... via templates-nsbind/nsbinderror.tpl: h:recurse\n   ... via templates-nsbind/nsbinderror.tpl: h:main\nBound splices: h:call h:main h:main2 h:recurse h:sub\nNode: Element {elementTag = \"h:invalid2\", elementAttrs = [], elementChildren = []}"
+    err3 = "templates-nsbind/nsbinderror.tpl: No splice bound for h:invalid1\nBound splices: h:call h:main h:main2\nNode: Element {elementTag = \"h:invalid1\", elementAttrs = [], elementChildren = []}"
 
 
 ------------------------------------------------------------------------------
@@ -284,7 +284,7 @@
                          , Just "templates-nsbind/nsbinderror.tpl"
                          , "h:main2") ]
                (Just "templates-nsbind/nsbinderror.tpl")
-               ["h:sub","h:recurse","h:call","h:main2","h:main"]
+               ["h:call","h:main","h:main2","h:recurse","h:sub"]
                (X.Element "h:invalid3" [] [])
                "No splice bound for h:invalid3"
     err2 = SpliceError [ ( ["nsbinderror"]
@@ -294,12 +294,12 @@
                          , Just "templates-nsbind/nsbinderror.tpl"
                          ,"h:main") ]
                (Just "templates-nsbind/nsbinderror.tpl")
-               ["h:sub","h:recurse","h:call","h:main2","h:main"]
+               ["h:call","h:main","h:main2","h:recurse","h:sub"]
                (X.Element "h:invalid2" [] [])
                "No splice bound for h:invalid2"
     err3 = SpliceError []
                (Just "templates-nsbind/nsbinderror.tpl")
-               ["h:call","h:main2","h:main"]
+               ["h:call","h:main","h:main2"]
                (X.Element "h:invalid1" [] [])
                "No splice bound for h:invalid1"
 
@@ -334,8 +334,8 @@
       (Left $ Set.fromList [ err1, err2 ])
       (first Set.fromList res)
   where
-    err1 = "templates-nscall/_call.tpl: No splice bound for h:sub\nBound splices: h:call h:main2 h:main\nNode: Element {elementTag = \"h:sub\", elementAttrs = [], elementChildren = []}"
-    err2 = "templates-nscall/_invalid.tpl: No splice bound for h:invalid\nBound splices: h:call h:main2 h:main\nNode: Element {elementTag = \"h:invalid\", elementAttrs = [], elementChildren = []}"
+    err1 = "templates-nscall/_call.tpl: No splice bound for h:sub\nBound splices: h:call h:main h:main2\nNode: Element {elementTag = \"h:sub\", elementAttrs = [], elementChildren = []}"
+    err2 = "templates-nscall/_invalid.tpl: No splice bound for h:invalid\nBound splices: h:call h:main h:main2\nNode: Element {elementTag = \"h:invalid\", elementAttrs = [], elementChildren = []}"
 
 
 ------------------------------------------------------------------------------
@@ -357,7 +357,7 @@
     H.assertEqual "exceptions" (Right (msg, err)) $ res
 
   where
-    msg = "templates-loaderror/_error.tpl: Exception in splice compile: Prelude.read: no parse\n   ... via templates-loaderror/_error.tpl: h:adder\n   ... via templates-loaderror/test.tpl: h:call2\nBound splices: h:adder h:call2 h:call1\nNode: Element {elementTag = \"h:adder\", elementAttrs = [(\"value\",\"noparse\")], elementChildren = []}"
+    msg = "templates-loaderror/_error.tpl: Exception in splice compile: Prelude.read: no parse\n   ... via templates-loaderror/_error.tpl: h:adder\n   ... via templates-loaderror/test.tpl: h:call2\nBound splices: h:adder h:call1 h:call2\nNode: Element {elementTag = \"h:adder\", elementAttrs = [(\"value\",\"noparse\")], elementChildren = []}"
     err = SpliceError [ ( ["test"]
                         , Just "templates-loaderror/_error.tpl"
                         , "h:adder"),
@@ -365,7 +365,7 @@
                         , Just "templates-loaderror/test.tpl"
                         ,"h:call2") ]
               (Just "templates-loaderror/_error.tpl")
-              ["h:adder", "h:call2", "h:call1"]
+              ["h:adder", "h:call1", "h:call2"]
               (X.Element "h:adder" [("value", "noparse")] [])
               "Exception in splice compile: Prelude.read: no parse"
     hc = HeistConfig sc "h" True
