diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Changelog for fakedata
 
+## 1.0.2
+
+* Make it compatible with aeson 1 and 2.
+
+### Breaking changes
+
 ## 1.0.1
 
 * Improve README with use cases
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-![fakedata](https://user-images.githubusercontent.com/737477/53658993-54575200-3c80-11e9-9125-nfbcf9e54660f.png)
+![fakedata](https://user-images.githubusercontent.com/737477/53658993-54575200-3c80-11e9-9125-fbcf9e54660f.png)
 [![Hackage](https://img.shields.io/hackage/v/fakedata.svg)](https://hackage.haskell.org/package/fakedata)
 [![Stackage
 Nightly](http://stackage.org/package/fakedata/badge/nightly)](http://stackage.org/nightly/package/fakedata)
diff --git a/fakedata.cabal b/fakedata.cabal
--- a/fakedata.cabal
+++ b/fakedata.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.34.4.
+-- This file has been generated from package.yaml by hpack version 0.34.5.
 --
 -- see: https://github.com/sol/hpack
 
 name:           fakedata
-version:        1.0.1
+version:        1.0.2
 synopsis:       Library for producing fake data
 description:    Please see the README on GitHub at <https://github.com/psibi/fakedata#readme>
 category:       Random, Fake, FakeData
@@ -677,7 +677,8 @@
   hs-source-dirs:
       src
   build-depends:
-      attoparsec
+      aeson
+    , attoparsec
     , base >=4.7 && <5
     , bytestring
     , containers
@@ -793,6 +794,7 @@
       hspec-discover:hspec-discover
   build-depends:
       QuickCheck
+    , aeson
     , attoparsec
     , base >=4.7 && <5
     , bytestring
@@ -825,7 +827,8 @@
       bench
   ghc-options: -O2
   build-depends:
-      attoparsec
+      aeson
+    , attoparsec
     , base >=4.7 && <5
     , bytestring
     , containers
diff --git a/src/Faker.hs b/src/Faker.hs
--- a/src/Faker.hs
+++ b/src/Faker.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE InstanceSigs #-}
@@ -45,8 +46,11 @@
 import Data.Vector (Vector)
 import Data.Word (Word64)
 import Data.Yaml (Value)
-import Faker.Internal.Types (CacheFieldKey, CacheFileKey)
+import Faker.Internal.Types (CacheFieldKey, CacheFileKey, AesonKey)
 import System.Random (StdGen, mkStdGen, newStdGen, split)
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.Key as K
+#endif
 
 data FakerSettings = FakerSettings
   { fslocale :: !Text -- ^ Locale settings for your fake data source.
@@ -71,9 +75,9 @@
                          -- find the fake data source for your
                          -- localization.
   | InvalidField String
-                 Text -- ^ The 'String' represents the field it is
-                             -- trying to resolve and the 'Text' field
-                             -- is something you passed on.
+                 AesonKey -- ^ The 'String' represents the field it is
+                       -- trying to resolve and the 'Key' field
+                       -- is something you passed on.
   | NoDataFound FakerSettings -- ^ This is thrown when you have no
                               -- data. This may likely happen for
                               -- locales other than `en`.
@@ -199,7 +203,7 @@
          pure b)
 
 instance Monad m => Applicative (FakeT m) where
-  {-# INLINE pure #-}    
+  {-# INLINE pure #-}
   pure x = FakeT (\_ -> pure x)
   {-# INLINE (<*>) #-}
   (<*>) = ap
diff --git a/src/Faker/Internal.hs b/src/Faker/Internal.hs
--- a/src/Faker/Internal.hs
+++ b/src/Faker/Internal.hs
@@ -2,12 +2,14 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE DeriveFunctor #-}
 {-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE CPP #-}
 
 -- | Internal module
 module Faker.Internal
   ( Unresolved(..)
   , Regex(..)
   , RegexFakeValue(..)
+  , AesonKey(..)
   , rvec
   , insertToCache
   , presentInCache
@@ -23,6 +25,7 @@
   , resolveFields
   , genericResolver
   , genericResolver'
+  , getLocaleKey
   ) where
 
 import Config
@@ -37,12 +40,17 @@
 import Data.Vector (Vector, (!))
 import Data.Word (Word64)
 import Faker
-import Faker.Internal.Types (CacheFieldKey(..))
+import Faker.Internal.Types (CacheFieldKey(..), AesonKey(..)
+                            , aesonKeyFromText
+                            , aesonKeyToText)
 import System.Random (StdGen, mkStdGen, randomR, split)
 import Text.StringRandom (stringRandom)
 import Fakedata.Parser
 import Data.Attoparsec.Text as P
 import Control.Monad (when)
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.Key as K
+#endif
 
 newtype Unresolved a = Unresolved
   { unresolvedField :: a
@@ -60,6 +68,14 @@
   return = pure
   (Unresolved f) >>= f1 = f1 f
 
+-- | Get the Locale settings for your fake data source as a YAML  key.
+getLocaleKey :: FakerSettings -> AesonKey
+#if MIN_VERSION_aeson(2,0,0)
+getLocaleKey settings = K.fromText (getLocale settings)
+#else
+getLocaleKey settings = getLocale settings
+#endif
+
 -- These are the functions which needs to be remodified
 -- rvec, randomVec, randomUnresolvedvec, randomUnresolvedVecwithoutvector, unresolvedResolver, unresolfvedResolverWithoutVector
 rvec :: (MonadThrow m, MonadIO m) => FakerSettings -> Vector a -> m a
@@ -73,7 +89,7 @@
 cachedRandomVec ::
      (MonadThrow m, MonadIO m)
   => Text
-  -> Text
+  -> AesonKey
   -> (FakerSettings -> m (Vector Text))
   -> FakerSettings
   -> m Text
@@ -103,9 +119,9 @@
 cachedRandomUnresolvedVec ::
      (MonadThrow m, MonadIO m)
   => Text
-  -> Text
+  -> AesonKey
   -> (FakerSettings -> m (Unresolved (Vector Text)))
-  -> (FakerSettings -> Text -> m Text)
+  -> (FakerSettings -> AesonKey -> m Text)
   -> FakerSettings
   -> m Text
 cachedRandomUnresolvedVec sdata field provider resolverFn settings = do
@@ -123,7 +139,7 @@
      (MonadThrow m, MonadIO m)
   => FakerSettings
   -> (FakerSettings -> m (Unresolved (Vector Text)))
-  -> (FakerSettings -> Text -> m Text)
+  -> (FakerSettings -> AesonKey -> m Text)
   -> m Text
 randomUnresolvedVec settings provider resolverFn = do
   items <- provider settings
@@ -132,9 +148,9 @@
 cachedRandomUnresolvedVecWithoutVector ::
      (MonadThrow m, MonadIO m)
   => Text
-  -> Text
+  -> AesonKey
   -> (FakerSettings -> m (Unresolved Text))
-  -> (FakerSettings -> Text -> m Text)
+  -> (FakerSettings -> AesonKey -> m Text)
   -> FakerSettings
   -> m Text
 cachedRandomUnresolvedVecWithoutVector sdata field provider resolverFn settings = do
@@ -152,7 +168,7 @@
      (MonadThrow m, MonadIO m)
   => FakerSettings
   -> (FakerSettings -> m (Unresolved Text))
-  -> (FakerSettings -> Text -> m Text)
+  -> (FakerSettings -> AesonKey -> m Text)
   -> m Text
 randomUnresolvedVecWithoutVector settings provider resolverFn = do
   items <- provider settings
@@ -162,7 +178,7 @@
      (MonadThrow m, MonadIO m)
   => FakerSettings
   -> Unresolved (Vector Text)
-  -> (FakerSettings -> Text -> m Text)
+  -> (FakerSettings -> AesonKey -> m Text)
   -> m Text
 resolveUnresolved settings (Unresolved unres) resolverFn = do
   let unresLen = V.length unres
@@ -174,13 +190,13 @@
        Left err -> throwM $ ParseError err
        Right vals -> combineFakeIRValue settings resolverFn vals
 
-resolveFakeIRValue :: (MonadIO m) => FakerSettings -> (FakerSettings -> Text -> m Text) -> (FakeIRValue,StdGen) -> m Text
+resolveFakeIRValue :: (MonadIO m) => FakerSettings -> (FakerSettings -> AesonKey -> m Text) -> (FakeIRValue,StdGen) -> m Text
 resolveFakeIRValue _ _ (Literal txt,_) = pure txt
 resolveFakeIRValue settings _ (Hash num,_) = pure $ resolveHash settings num
 resolveFakeIRValue settings _ (Ques num,_) = pure $ resolveQues settings num
-resolveFakeIRValue settings resolverFn (Resolve text,gen) = resolverFn (setRandomGen gen settings) text
+resolveFakeIRValue settings resolverFn (Resolve text,gen) = resolverFn (setRandomGen gen settings) (aesonKeyFromText text)
 
-combineFakeIRValue :: (MonadIO m) => FakerSettings -> (FakerSettings -> Text -> m Text) -> [FakeIRValue] -> m Text
+combineFakeIRValue :: (MonadIO m) => FakerSettings -> (FakerSettings -> AesonKey -> m Text) -> [FakeIRValue] -> m Text
 combineFakeIRValue settings resolverFn xs = do
   vals <- mapM (resolveFakeIRValue settings resolverFn) (zip xs (stdgens (getRandomGen settings)))
   pure $ T.concat vals
@@ -190,14 +206,14 @@
                        Left err -> throwM $ ParseError err
                        Right vals -> pure vals
 
-genericResolver :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> (FakerSettings -> Text -> m Text) -> m Text
-genericResolver settings txt resolverFn = combineFakeIRValue settings resolverFn [Resolve txt]
+genericResolver :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> (FakerSettings -> AesonKey -> m Text) -> m Text
+genericResolver settings txt resolverFn = combineFakeIRValue settings resolverFn [Resolve (aesonKeyToText txt)]
 
-genericResolver' :: (MonadIO m, MonadThrow m) => (FakerSettings -> Text -> m Text) -> FakerSettings -> Text -> m Text
+genericResolver' :: (MonadIO m, MonadThrow m) => (FakerSettings -> AesonKey -> m Text) -> FakerSettings -> AesonKey -> m Text
 genericResolver' resolverFn settings txt = genericResolver settings txt resolverFn
 
 -- resolveHash settings 3
--- "234"                                             
+-- "234"
 resolveHash :: FakerSettings -> Int -> Text
 resolveHash settings num = T.pack $ helper settings num mempty
     where
@@ -237,7 +253,7 @@
 unresolvedResolver ::
      (MonadThrow m, MonadIO m)
   => (FakerSettings -> m (Unresolved (Vector Text)))
-  -> (FakerSettings -> Text -> m Text)
+  -> (FakerSettings -> AesonKey -> m Text)
   -> (FakerSettings -> m Text)
 unresolvedResolver provider resolverFn =
   \settings -> randomUnresolvedVec settings provider resolverFn
@@ -245,7 +261,7 @@
 unresolvedResolverWithoutVector ::
      (MonadThrow m, MonadIO m)
   => (FakerSettings -> m (Unresolved Text))
-  -> (FakerSettings -> Text -> m Text)
+  -> (FakerSettings -> AesonKey -> m Text)
   -> (FakerSettings -> m Text)
 unresolvedResolverWithoutVector provider resolverFn =
   \settings -> randomUnresolvedVecWithoutVector settings provider resolverFn
@@ -270,7 +286,7 @@
 refinedText :: Text -> Text
 refinedText = T.pack . refinedString . T.unpack
 
-presentInCache :: Text -> Text -> FakerSettings -> IO (Maybe (Vector Text))
+presentInCache :: Text -> AesonKey -> FakerSettings -> IO (Maybe (Vector Text))
 presentInCache sdata field settings = do
   let key =
         CacheFieldKey
@@ -278,7 +294,7 @@
   hmap <- getCacheField settings
   pure $ HM.lookup key hmap
 
-insertToCache :: Text -> Text -> FakerSettings -> (Vector Text) -> IO ()
+insertToCache :: Text -> AesonKey -> FakerSettings -> (Vector Text) -> IO ()
 insertToCache sdata field settings vec = do
   let key =
         CacheFieldKey
@@ -308,7 +324,7 @@
 cachedRegex ::
      (MonadThrow m, MonadIO m)
   => Text
-  -> Text
+  -> AesonKey
   -> (FakerSettings -> m Regex)
   -> FakerSettings
   -> m RegexFakeValue
@@ -337,4 +353,3 @@
 generateRegexData settings provider = do
   items <- provider settings
   pure $ generateRegex settings items
-
diff --git a/src/Faker/Internal/Types.hs b/src/Faker/Internal/Types.hs
--- a/src/Faker/Internal/Types.hs
+++ b/src/Faker/Internal/Types.hs
@@ -1,13 +1,37 @@
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE CPP #-}
 
 module Faker.Internal.Types where
 
 import Data.Hashable
 import Data.Text (Text)
 import GHC.Generics
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.Key as K
+#endif
 
+#if MIN_VERSION_aeson(2,0,0)
+type AesonKey = K.Key
+#else
+type AesonKey = Text
+#endif
+
+aesonKeyToText :: AesonKey -> Text
+#if MIN_VERSION_aeson(2,0,0)
+aesonKeyToText key = K.toText key
+#else
+aesonKeyToText key = key
+#endif
+
+aesonKeyFromText :: Text -> AesonKey
+#if MIN_VERSION_aeson(2,0,0)
+aesonKeyFromText key = K.fromText key
+#else
+aesonKeyFromText key = key
+#endif
+
 data SourceData
   = Address
   | Name
@@ -199,7 +223,7 @@
 data CacheFieldKey =
   CacheFieldKey
     { ckSource :: !Text
-    , ckField :: !Text
+    , ckField :: !AesonKey
     , ckLocale :: !Text
     }
   deriving (Show, Eq, Ord, Generic, Hashable)
diff --git a/src/Faker/Provider/Address.hs b/src/Faker/Provider/Address.hs
--- a/src/Faker/Provider/Address.hs
+++ b/src/Faker/Provider/Address.hs
@@ -18,16 +18,17 @@
 import Faker.Provider.TH
 import Faker.Provider.Name (nameNameProvider, resolveNameField)
 
+
 parseAddress :: FromJSON a => FakerSettings -> Value -> Parser a
 parseAddress settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   address <- faker .: "address"
   pure address
 parseAddress settings val = fail $ "expected Object, but got " <> (show val)
 
 parseAddressField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseAddressField settings txt val = do
   address <- parseAddress settings val
   field <- address .:? txt .!= mempty
@@ -36,7 +37,7 @@
 parseUnresolvedAddressField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedAddressField settings txt val = do
@@ -315,11 +316,11 @@
 
 -- > resolveCommunityText "#{community_prefix} #{community_suffix}"
 resolveAddressText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveAddressText = genericResolver' resolveAddressField
 
 resolveAddressField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveAddressField settings field@"community_suffix" =
   cachedRandomVec "address" field communitySuffixProvider settings
 resolveAddressField settings field@"community_prefix" =
diff --git a/src/Faker/Provider/Adjective.hs b/src/Faker/Provider/Adjective.hs
--- a/src/Faker/Provider/Adjective.hs
+++ b/src/Faker/Provider/Adjective.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseAdjective :: FromJSON a => FakerSettings -> Value -> Parser a
 parseAdjective settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   adjective <- faker .: "adjective"
   pure adjective
 parseAdjective settings val = fail $ "expected Object, but got " <> (show val)
 
 parseAdjectiveField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseAdjectiveField settings txt val = do
   adjective <- parseAdjective settings val
   field <- adjective .:? txt .!= mempty
   pure field
 
 parseAdjectiveFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseAdjectiveFields settings txts val = do
   adjective <- parseAdjective settings val
   helper adjective txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedAdjectiveFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedAdjectiveFields settings txts val = do
   adjective <- parseAdjective settings val
   helper adjective txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -74,11 +75,3 @@
 $(genParser "adjective" "negative")
 
 $(genProvider "adjective" "negative")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Ancient.hs b/src/Faker/Provider/Ancient.hs
--- a/src/Faker/Provider/Ancient.hs
+++ b/src/Faker/Provider/Ancient.hs
@@ -14,16 +14,17 @@
 import Faker
 import Faker.Internal
 
+
 parseAncient :: FromJSON a => FakerSettings -> Value -> Parser a
 parseAncient settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   ancient <- faker .: "ancient"
   pure ancient
 parseAncient settings val = fail $ "expected Object, but got " <> (show val)
 
 parseAncientField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseAncientField settings txt val = do
   ancient <- parseAncient settings val
   field <- ancient .:? txt .!= mempty
diff --git a/src/Faker/Provider/Animal.hs b/src/Faker/Provider/Animal.hs
--- a/src/Faker/Provider/Animal.hs
+++ b/src/Faker/Provider/Animal.hs
@@ -14,9 +14,10 @@
 import Faker
 import Faker.Internal
 
+
 parseAnimal :: FromJSON a => FakerSettings -> Value -> Parser a
 parseAnimal settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   creature <- faker .: "creature"
   animal <- creature .: "animal"
@@ -24,7 +25,7 @@
 parseAnimal settings val = fail $ "expected Object, but got " <> (show val)
 
 parseAnimalField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseAnimalField settings txt val = do
   animal <- parseAnimal settings val
   field <- animal .:? txt .!= mempty
diff --git a/src/Faker/Provider/App.hs b/src/Faker/Provider/App.hs
--- a/src/Faker/Provider/App.hs
+++ b/src/Faker/Provider/App.hs
@@ -18,16 +18,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseApp :: FromJSON a => FakerSettings -> Value -> Parser a
 parseApp settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   app <- faker .: "app"
   pure app
 parseApp settings val = fail $ "expected Object, but got " <> (show val)
 
 parseAppField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseAppField settings txt val = do
   app <- parseApp settings val
   field <- app .:? txt .!= mempty
@@ -36,7 +37,7 @@
 parseUnresolvedAppField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedAppField settings txt val = do
@@ -56,10 +57,10 @@
 
 $(genAppProviderUnresolved "author")
 
-resolveAppText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveAppText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveAppText = genericResolver' resolveAppField
 
-resolveAppField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveAppField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveAppField settings "Name.name" =
   cachedRandomUnresolvedVec
     "name"
diff --git a/src/Faker/Provider/Appliance.hs b/src/Faker/Provider/Appliance.hs
--- a/src/Faker/Provider/Appliance.hs
+++ b/src/Faker/Provider/Appliance.hs
@@ -13,16 +13,17 @@
 import Faker
 import Faker.Internal
 
+
 parseAppliance :: FromJSON a => FakerSettings -> Value -> Parser a
 parseAppliance settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   appliance <- faker .: "appliance"
   pure appliance
 parseAppliance settings val = fail $ "expected Object, but got " <> (show val)
 
 parseApplianceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseApplianceField settings txt val = do
   appliance <- parseAppliance settings val
   field <- appliance .:? txt .!= mempty
diff --git a/src/Faker/Provider/AquaTeenHungerForce.hs b/src/Faker/Provider/AquaTeenHungerForce.hs
--- a/src/Faker/Provider/AquaTeenHungerForce.hs
+++ b/src/Faker/Provider/AquaTeenHungerForce.hs
@@ -13,16 +13,17 @@
 import Faker
 import Faker.Internal
 
+
 parseAthf :: FromJSON a => FakerSettings -> Value -> Parser a
 parseAthf settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   athf <- faker .: "aqua_teen_hunger_force"
   pure athf
 parseAthf settings val = fail $ "expected Object, but got " <> (show val)
 
 parseAthfField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseAthfField settings txt val = do
   athf <- parseAthf settings val
   field <- athf .:? txt .!= mempty
diff --git a/src/Faker/Provider/Artist.hs b/src/Faker/Provider/Artist.hs
--- a/src/Faker/Provider/Artist.hs
+++ b/src/Faker/Provider/Artist.hs
@@ -13,16 +13,17 @@
 import Faker
 import Faker.Internal
 
+
 parseArtist :: FromJSON a => FakerSettings -> Value -> Parser a
 parseArtist settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   artist <- faker .: "artist"
   pure artist
 parseArtist settings val = fail $ "expected Object, but got " <> (show val)
 
 parseArtistField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseArtistField settings txt val = do
   artist <- parseArtist settings val
   field <- artist .:? txt .!= mempty
diff --git a/src/Faker/Provider/BackToTheFuture.hs b/src/Faker/Provider/BackToTheFuture.hs
--- a/src/Faker/Provider/BackToTheFuture.hs
+++ b/src/Faker/Provider/BackToTheFuture.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBackToTheFuture :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBackToTheFuture settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   backToTheFuture <- faker .: "back_to_the_future"
   pure backToTheFuture
@@ -24,19 +25,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseBackToTheFutureField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBackToTheFutureField settings txt val = do
   backToTheFuture <- parseBackToTheFuture settings val
   field <- backToTheFuture .:? txt .!= mempty
   pure field
 
 parseBackToTheFutureFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseBackToTheFutureFields settings txts val = do
   backToTheFuture <- parseBackToTheFuture settings val
   helper backToTheFuture txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Bank.hs b/src/Faker/Provider/Bank.hs
--- a/src/Faker/Provider/Bank.hs
+++ b/src/Faker/Provider/Bank.hs
@@ -13,16 +13,17 @@
 import Faker
 import Faker.Internal
 
+
 parseBank :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBank settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   bank <- faker .: "bank"
   pure bank
 parseBank settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBankField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBankField settings txt val = do
   bank <- parseBank settings val
   field <- bank .:? txt .!= mempty
diff --git a/src/Faker/Provider/Barcode.hs b/src/Faker/Provider/Barcode.hs
--- a/src/Faker/Provider/Barcode.hs
+++ b/src/Faker/Provider/Barcode.hs
@@ -15,28 +15,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBarcode :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBarcode settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   barcode <- faker .: "barcode"
   pure barcode
 parseBarcode settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBarcodeField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBarcodeField settings txt val = do
   barcode <- parseBarcode settings val
   field <- barcode .:? txt .!= mempty
   pure field
 
 parseBarcodeFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseBarcodeFields settings txts val = do
   barcode <- parseBarcode settings val
   helper barcode txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -46,7 +47,7 @@
 parseUnresolvedBarcodeField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedBarcodeField settings txt val = do
@@ -87,8 +88,8 @@
 
 $(genProvidersSingleUnresolved "barcode" ["issn"])
 
-resolveBarcodeText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveBarcodeText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveBarcodeText = genericResolver' resolveBarcodeField
 
-resolveBarcodeField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveBarcodeField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveBarcodeField settings str = throwM $ InvalidField "barcode" str
diff --git a/src/Faker/Provider/Basketball.hs b/src/Faker/Provider/Basketball.hs
--- a/src/Faker/Provider/Basketball.hs
+++ b/src/Faker/Provider/Basketball.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBasketball :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBasketball settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   basketball <- faker .: "basketball"
   pure basketball
 parseBasketball settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBasketballField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBasketballField settings txt val = do
   basketball <- parseBasketball settings val
   field <- basketball .:? txt .!= mempty
   pure field
 
 parseBasketballFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseBasketballFields settings txts val = do
   basketball <- parseBasketball settings val
   helper basketball txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Beer.hs b/src/Faker/Provider/Beer.hs
--- a/src/Faker/Provider/Beer.hs
+++ b/src/Faker/Provider/Beer.hs
@@ -15,16 +15,17 @@
 import Faker.Internal
 import Faker.Provider.TH
 
+
 parseBeer :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBeer settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   beer <- faker .: "beer"
   pure beer
 parseBeer settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBeerField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBeerField settings txt val = do
   beer <- parseBeer settings val
   field <- beer .:? txt .!= mempty
diff --git a/src/Faker/Provider/BigBangTheory.hs b/src/Faker/Provider/BigBangTheory.hs
--- a/src/Faker/Provider/BigBangTheory.hs
+++ b/src/Faker/Provider/BigBangTheory.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBigBangTheory :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBigBangTheory settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   bigBangTheory <- faker .: "big_bang_theory"
   pure bigBangTheory
 parseBigBangTheory settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBigBangTheoryField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBigBangTheoryField settings txt val = do
   bigBangTheory <- parseBigBangTheory settings val
   field <- bigBangTheory .:? txt .!= mempty
   pure field
 
 parseBigBangTheoryFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseBigBangTheoryFields settings txts val = do
   bigBangTheory <- parseBigBangTheory settings val
   helper bigBangTheory txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -53,14 +54,3 @@
 $(genParser "bigBangTheory" "quotes")
 
 $(genProvider "bigBangTheory" "quotes")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Bird.hs b/src/Faker/Provider/Bird.hs
--- a/src/Faker/Provider/Bird.hs
+++ b/src/Faker/Provider/Bird.hs
@@ -16,9 +16,10 @@
 import Language.Haskell.TH
 import Faker.Provider.Name (resolveNameField)
 
+
 parseBird :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBird settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   creature <- faker .: "creature"
   bird <- creature .: "bird"
@@ -26,19 +27,19 @@
 parseBird settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBirdField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBirdField settings txt val = do
   bird <- parseBird settings val
   field <- bird .:? txt .!= mempty
   pure field
 
 parseBirdFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseBirdFields settings txts val = do
   bird <- parseBird settings val
   helper bird txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -49,7 +50,7 @@
 parseUnresolvedBirdField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedBirdField settings txt val = do
@@ -62,14 +63,14 @@
 parseUnresolvedBirdFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedBirdFields settings txts val = do
   bird <- parseBird settings val
   helper bird txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -121,10 +122,10 @@
 $(genProviderUnresolved "bird" "implausible_common_names")
 
 
-resolveBirdText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveBirdText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveBirdText = genericResolver' resolveBirdField
 
-resolveBirdField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveBirdField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveBirdField settings field@"geo" =
   cachedRandomVec "bird" field birdGeoProvider settings
 resolveBirdField settings field@"adjective" =
diff --git a/src/Faker/Provider/Blood.hs b/src/Faker/Provider/Blood.hs
--- a/src/Faker/Provider/Blood.hs
+++ b/src/Faker/Provider/Blood.hs
@@ -15,28 +15,29 @@
 import Language.Haskell.TH
 import Control.Monad.IO.Class
 
+
 parseBlood :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBlood settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   blood <- faker .: "blood"
   pure blood
 parseBlood settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBloodField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBloodField settings txt val = do
   blood <- parseBlood settings val
   field <- blood .:? txt .!= mempty
   pure field
 
 parseBloodFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseBloodFields settings txts val = do
   blood <- parseBlood settings val
   helper blood txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -46,7 +47,7 @@
 parseUnresolvedBloodField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedBloodField settings txt val = do
@@ -66,11 +67,11 @@
 
 $(genProviderUnresolved "blood" "group")
 
-resolveBloodText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveBloodText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveBloodText = genericResolver' resolveBloodField
 
 resolveBloodField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveBloodField settings field@"type" =
   cachedRandomVec "blood" field bloodTypeProvider settings
 resolveBloodField settings field@"rh_factor" =
diff --git a/src/Faker/Provider/BoJackHorseman.hs b/src/Faker/Provider/BoJackHorseman.hs
--- a/src/Faker/Provider/BoJackHorseman.hs
+++ b/src/Faker/Provider/BoJackHorseman.hs
@@ -13,9 +13,10 @@
 import Faker
 import Faker.Internal
 
+
 parseBoJackHorseman :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBoJackHorseman settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   boJackHorseman <- faker .: "bojack_horseman"
   pure boJackHorseman
@@ -23,7 +24,7 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseBoJackHorsemanField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBoJackHorsemanField settings txt val = do
   boJackHorseman <- parseBoJackHorseman settings val
   field <- boJackHorseman .:? txt .!= mempty
diff --git a/src/Faker/Provider/Book.hs b/src/Faker/Provider/Book.hs
--- a/src/Faker/Provider/Book.hs
+++ b/src/Faker/Provider/Book.hs
@@ -17,16 +17,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBook :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBook settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   book <- faker .: "book"
   pure book
 parseBook settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBookField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBookField settings txt val = do
   book <- parseBook settings val
   field <- book .:? txt .!= mempty
@@ -35,7 +36,7 @@
 parseUnresolvedBookField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedBookField settings txt val = do
@@ -82,10 +83,10 @@
          resolveBookText
          settings)
 
-resolveBookText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveBookText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveBookText = genericResolver' resolveBookField
 
-resolveBookField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveBookField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveBookField settings "Name.name" =
   cachedRandomUnresolvedVec
     "name"
diff --git a/src/Faker/Provider/BossaNova.hs b/src/Faker/Provider/BossaNova.hs
--- a/src/Faker/Provider/BossaNova.hs
+++ b/src/Faker/Provider/BossaNova.hs
@@ -16,16 +16,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBossaNova :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBossaNova settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   bossaNova <- faker .: "bossa_nova"
   pure bossaNova
 parseBossaNova settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBossaNovaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBossaNovaField settings txt val = do
   bossaNova <- parseBossaNova settings val
   field <- bossaNova .:? txt .!= mempty
diff --git a/src/Faker/Provider/BreakingBad.hs b/src/Faker/Provider/BreakingBad.hs
--- a/src/Faker/Provider/BreakingBad.hs
+++ b/src/Faker/Provider/BreakingBad.hs
@@ -16,16 +16,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBreakingBad :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBreakingBad settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   breakingBad <- faker .: "breaking_bad"
   pure breakingBad
 parseBreakingBad settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBreakingBadField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBreakingBadField settings txt val = do
   breakingBad <- parseBreakingBad settings val
   field <- breakingBad .:? txt .!= mempty
diff --git a/src/Faker/Provider/Buffy.hs b/src/Faker/Provider/Buffy.hs
--- a/src/Faker/Provider/Buffy.hs
+++ b/src/Faker/Provider/Buffy.hs
@@ -16,16 +16,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBuffy :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBuffy settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   buffy <- faker .: "buffy"
   pure buffy
 parseBuffy settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBuffyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBuffyField settings txt val = do
   buffy <- parseBuffy settings val
   field <- buffy .:? txt .!= mempty
@@ -34,7 +35,7 @@
 parseUnresolvedBuffyField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedBuffyField settings txt val = do
diff --git a/src/Faker/Provider/Business.hs b/src/Faker/Provider/Business.hs
--- a/src/Faker/Provider/Business.hs
+++ b/src/Faker/Provider/Business.hs
@@ -16,16 +16,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseBusiness :: FromJSON a => FakerSettings -> Value -> Parser a
 parseBusiness settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   business <- faker .: "business"
   pure business
 parseBusiness settings val = fail $ "expected Object, but got " <> (show val)
 
 parseBusinessField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseBusinessField settings txt val = do
   business <- parseBusiness settings val
   field <- business .:? txt .!= mempty
diff --git a/src/Faker/Provider/Camera.hs b/src/Faker/Provider/Camera.hs
--- a/src/Faker/Provider/Camera.hs
+++ b/src/Faker/Provider/Camera.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCamera :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCamera settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   camera <- faker .: "camera"
   pure camera
 parseCamera settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCameraField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCameraField settings txt val = do
   camera <- parseCamera settings val
   field <- camera .:? txt .!= mempty
   pure field
 
 parseCameraFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseCameraFields settings txts val = do
   camera <- parseCamera settings val
   helper camera txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedCameraFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedCameraFields settings txts val = do
   camera <- parseCamera settings val
   helper camera txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -78,11 +79,3 @@
 $(genParser "camera" "brand_with_model")
 
 $(genProvider "camera" "brand_with_model")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Cannabis.hs b/src/Faker/Provider/Cannabis.hs
--- a/src/Faker/Provider/Cannabis.hs
+++ b/src/Faker/Provider/Cannabis.hs
@@ -16,16 +16,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCannabis :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCannabis settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   cannabis <- faker .: "cannabis"
   pure cannabis
 parseCannabis settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCannabisField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCannabisField settings txt val = do
   cannabis <- parseCannabis settings val
   field <- cannabis .:? txt .!= mempty
diff --git a/src/Faker/Provider/Cat.hs b/src/Faker/Provider/Cat.hs
--- a/src/Faker/Provider/Cat.hs
+++ b/src/Faker/Provider/Cat.hs
@@ -15,9 +15,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCat :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCat settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   creature <- faker .: "creature"
   cat <- creature .: "cat"
@@ -25,7 +26,7 @@
 parseCat settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCatField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCatField settings txt val = do
   cat <- parseCat settings val
   field <- cat .:? txt .!= mempty
diff --git a/src/Faker/Provider/Chiquito.hs b/src/Faker/Provider/Chiquito.hs
--- a/src/Faker/Provider/Chiquito.hs
+++ b/src/Faker/Provider/Chiquito.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseChiquito :: FromJSON a => FakerSettings -> Value -> Parser a
 parseChiquito settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   chiquito <- faker .: "chiquito"
   pure chiquito
 parseChiquito settings val = fail $ "expected Object, but got " <> (show val)
 
 parseChiquitoField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseChiquitoField settings txt val = do
   chiquito <- parseChiquito settings val
   field <- chiquito .:? txt .!= mempty
   pure field
 
 parseChiquitoFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseChiquitoFields settings txts val = do
   chiquito <- parseChiquito settings val
   helper chiquito txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -63,14 +64,3 @@
 $(genParser "chiquito" "jokes")
 
 $(genProvider "chiquito" "jokes")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/ChuckNorris.hs b/src/Faker/Provider/ChuckNorris.hs
--- a/src/Faker/Provider/ChuckNorris.hs
+++ b/src/Faker/Provider/ChuckNorris.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseChuckNorris :: FromJSON a => FakerSettings -> Value -> Parser a
 parseChuckNorris settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   chuckNorris <- faker .: "chuck_norris"
   pure chuckNorris
 parseChuckNorris settings val = fail $ "expected Object, but got " <> (show val)
 
 parseChuckNorrisField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseChuckNorrisField settings txt val = do
   chuckNorris <- parseChuckNorris settings val
   field <- chuckNorris .:? txt .!= mempty
diff --git a/src/Faker/Provider/ClashOfClans.hs b/src/Faker/Provider/ClashOfClans.hs
--- a/src/Faker/Provider/ClashOfClans.hs
+++ b/src/Faker/Provider/ClashOfClans.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseClashOfClans :: FromJSON a => FakerSettings -> Value -> Parser a
 parseClashOfClans settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   clashOfClans <- games .: "clash_of_clans"
@@ -24,19 +25,19 @@
 parseClashOfClans settings val = fail $ "expected Object, but got " <> (show val)
 
 parseClashOfClansField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseClashOfClansField settings txt val = do
   clashOfClans <- parseClashOfClans settings val
   field <- clashOfClans .:? txt .!= mempty
   pure field
 
 parseClashOfClansFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseClashOfClansFields settings txts val = do
   clashOfClans <- parseClashOfClans settings val
   helper clashOfClans txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -49,14 +50,14 @@
 parseUnresolvedClashOfClansFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedClashOfClansFields settings txts val = do
   clashOfClans <- parseClashOfClans settings val
   helper clashOfClans txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
diff --git a/src/Faker/Provider/Code.hs b/src/Faker/Provider/Code.hs
--- a/src/Faker/Provider/Code.hs
+++ b/src/Faker/Provider/Code.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCode :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCode settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   code <- faker .: "code"
   pure code
 parseCode settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCodeField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCodeField settings txt val = do
   code <- parseCode settings val
   field <- code .:? txt .!= mempty
diff --git a/src/Faker/Provider/Coffee.hs b/src/Faker/Provider/Coffee.hs
--- a/src/Faker/Provider/Coffee.hs
+++ b/src/Faker/Provider/Coffee.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCoffee :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCoffee settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   coffee <- faker .: "coffee"
   pure coffee
 parseCoffee settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCoffeeField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCoffeeField settings txt val = do
   coffee <- parseCoffee settings val
   field <- coffee .:? txt .!= mempty
   pure field
 
 parseCoffeeFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseCoffeeFields settings txts val = do
   coffee <- parseCoffee settings val
   helper coffee txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedCoffeeField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedCoffeeField settings txt val = do
@@ -177,11 +178,11 @@
 $(genProviders "coffee" ["regions", "india"])
 
 resolveCoffeeText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveCoffeeText = genericResolver' resolveCoffeeField
 
 resolveCoffeeField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveCoffeeField settings field@"name_1" =
   cachedRandomVec "coffee" field coffeeName1Provider settings
 resolveCoffeeField settings field@"name_2" =
diff --git a/src/Faker/Provider/Coin.hs b/src/Faker/Provider/Coin.hs
--- a/src/Faker/Provider/Coin.hs
+++ b/src/Faker/Provider/Coin.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCoin :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCoin settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   coin <- faker .: "coin"
   pure coin
 parseCoin settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCoinField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCoinField settings txt val = do
   coin <- parseCoin settings val
   field <- coin .:? txt .!= mempty
diff --git a/src/Faker/Provider/Color.hs b/src/Faker/Provider/Color.hs
--- a/src/Faker/Provider/Color.hs
+++ b/src/Faker/Provider/Color.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseColor :: FromJSON a => FakerSettings -> Value -> Parser a
 parseColor settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   color <- faker .: "color"
   pure color
 parseColor settings val = fail $ "expected Object, but got " <> (show val)
 
 parseColorField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseColorField settings txt val = do
   color <- parseColor settings val
   field <- color .:? txt .!= mempty
diff --git a/src/Faker/Provider/Commerce.hs b/src/Faker/Provider/Commerce.hs
--- a/src/Faker/Provider/Commerce.hs
+++ b/src/Faker/Provider/Commerce.hs
@@ -15,28 +15,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCommerce :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCommerce settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   commerce <- faker .: "commerce"
   pure commerce
 parseCommerce settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCommerceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCommerceField settings txt val = do
   commerce <- parseCommerce settings val
   field <- commerce .:? txt .!= mempty
   pure field
 
 parseCommerceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseCommerceFields settings txts val = do
   commerce <- parseCommerce settings val
   helper commerce txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Community.hs b/src/Faker/Provider/Community.hs
--- a/src/Faker/Provider/Community.hs
+++ b/src/Faker/Provider/Community.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCommunity :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCommunity settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   community <- faker .: "community"
   pure community
 parseCommunity settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCommunityField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCommunityField settings txt val = do
   community <- parseCommunity settings val
   field <- community .:? txt .!= mempty
diff --git a/src/Faker/Provider/Company.hs b/src/Faker/Provider/Company.hs
--- a/src/Faker/Provider/Company.hs
+++ b/src/Faker/Provider/Company.hs
@@ -18,16 +18,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCompany :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCompany settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   company <- faker .: "company"
   pure company
 parseCompany settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCompanyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCompanyField settings txt val = do
   company <- parseCompany settings val
   field <- company .:? txt .!= mempty
@@ -36,7 +37,7 @@
 parseUnresolvedCompanyField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedCompanyField settings txt val = do
@@ -98,11 +99,11 @@
 $(genProvider "company" "category")
 
 resolveCompanyText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveCompanyText = genericResolver' resolveCompanyField
 
 resolveCompanyField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveCompanyField settings "Name.last_name" =
   cachedRandomVec "name" "last_name" nameLastNameProvider settings
 resolveCompanyField settings "Name.first_name" =
diff --git a/src/Faker/Provider/Compass.hs b/src/Faker/Provider/Compass.hs
--- a/src/Faker/Provider/Compass.hs
+++ b/src/Faker/Provider/Compass.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCompass :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCompass settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   compass <- faker .: "compass"
   pure compass
 parseCompass settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCompassField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCompassField settings txt val = do
   compass <- parseCompass settings val
   field <- compass .:? txt .!= mempty
   pure field
 
 parseCompassFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseCompassFields settings txts val = do
   compass <- parseCompass settings val
   helper compass txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedCompassField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedCompassField settings txt val = do
@@ -116,7 +117,7 @@
 $(genProviders "compass" ["quarter-wind", "azimuth"])
 
 resolveCompassText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveCompassText = genericResolver' resolveCompassField
 
 cardinalProvider ::
@@ -160,7 +161,7 @@
   pure $ cw <> ca <> caz <> qw
 
 resolveCompassField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveCompassField settings field@"cardinal" =
   cachedRandomVec "compass" field cardinalProvider settings
 resolveCompassField settings field@"ordinal" =
diff --git a/src/Faker/Provider/Computer.hs b/src/Faker/Provider/Computer.hs
--- a/src/Faker/Provider/Computer.hs
+++ b/src/Faker/Provider/Computer.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseComputer :: FromJSON a => FakerSettings -> Value -> Parser a
 parseComputer settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   computer <- faker .: "computer"
   pure computer
 parseComputer settings val = fail $ "expected Object, but got " <> (show val)
 
 parseComputerField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseComputerField settings txt val = do
   computer <- parseComputer settings val
   field <- computer .:? txt .!= mempty
   pure field
 
 parseComputerFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseComputerFields settings txts val = do
   computer <- parseComputer settings val
   helper computer txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Conan.hs b/src/Faker/Provider/Conan.hs
--- a/src/Faker/Provider/Conan.hs
+++ b/src/Faker/Provider/Conan.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseConan :: FromJSON a => FakerSettings -> Value -> Parser a
 parseConan settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   conan <- faker .: "conan"
   pure conan
 parseConan settings val = fail $ "expected Object, but got " <> (show val)
 
 parseConanField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseConanField settings txt val = do
   conan <- parseConan settings val
   field <- conan .:? txt .!= mempty
   pure field
 
 parseConanFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseConanFields settings txts val = do
   conan <- parseConan settings val
   helper conan txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedConanFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedConanFields settings txts val = do
   conan <- parseConan settings val
   helper conan txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -78,11 +79,3 @@
 $(genParser "conan" "vehicles")
 
 $(genProvider "conan" "vehicles")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Construction.hs b/src/Faker/Provider/Construction.hs
--- a/src/Faker/Provider/Construction.hs
+++ b/src/Faker/Provider/Construction.hs
@@ -15,9 +15,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseConstruction :: FromJSON a => FakerSettings -> Value -> Parser a
 parseConstruction settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   construction <- faker .: "construction"
   pure construction
@@ -25,7 +26,7 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseConstructionField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseConstructionField settings txt val = do
   construction <- parseConstruction settings val
   field <- construction .:? txt .!= mempty
diff --git a/src/Faker/Provider/Control.hs b/src/Faker/Provider/Control.hs
--- a/src/Faker/Provider/Control.hs
+++ b/src/Faker/Provider/Control.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseControl :: FromJSON a => FakerSettings -> Value -> Parser a
 parseControl settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   control <- games .: "control"
@@ -24,19 +25,19 @@
 parseControl settings val = fail $ "expected Object, but got " <> (show val)
 
 parseControlField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseControlField settings txt val = do
   control <- parseControl settings val
   field <- control .:? txt .!= mempty
   pure field
 
 parseControlFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseControlFields settings txts val = do
   control <- parseControl settings val
   helper control txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Cosmere.hs b/src/Faker/Provider/Cosmere.hs
--- a/src/Faker/Provider/Cosmere.hs
+++ b/src/Faker/Provider/Cosmere.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCosmere :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCosmere settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   cosmere <- faker .: "cosmere"
   pure cosmere
 parseCosmere settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCosmereField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCosmereField settings txt val = do
   cosmere <- parseCosmere settings val
   field <- cosmere .:? txt .!= mempty
diff --git a/src/Faker/Provider/CryptoCoin.hs b/src/Faker/Provider/CryptoCoin.hs
--- a/src/Faker/Provider/CryptoCoin.hs
+++ b/src/Faker/Provider/CryptoCoin.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCryptoCoin :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCryptoCoin settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   cryptoCoin <- faker .: "crypto_coin"
   pure cryptoCoin
 parseCryptoCoin settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCryptoCoinField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCryptoCoinField settings txt val = do
   cryptoCoin <- parseCryptoCoin settings val
   field <- cryptoCoin .:? txt .!= mempty
diff --git a/src/Faker/Provider/CultureSeries.hs b/src/Faker/Provider/CultureSeries.hs
--- a/src/Faker/Provider/CultureSeries.hs
+++ b/src/Faker/Provider/CultureSeries.hs
@@ -15,9 +15,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCultureSeries :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCultureSeries settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   cultureSeries <- faker .: "culture_series"
   pure cultureSeries
@@ -25,7 +26,7 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseCultureSeriesField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCultureSeriesField settings txt val = do
   cultureSeries <- parseCultureSeries settings val
   field <- cultureSeries .:? txt .!= mempty
diff --git a/src/Faker/Provider/Currency.hs b/src/Faker/Provider/Currency.hs
--- a/src/Faker/Provider/Currency.hs
+++ b/src/Faker/Provider/Currency.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseCurrency :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCurrency settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   currency <- faker .: "currency"
   pure currency
 parseCurrency settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCurrencyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCurrencyField settings txt val = do
   currency <- parseCurrency settings val
   field <- currency .:? txt .!= mempty
diff --git a/src/Faker/Provider/DcComics.hs b/src/Faker/Provider/DcComics.hs
--- a/src/Faker/Provider/DcComics.hs
+++ b/src/Faker/Provider/DcComics.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDcComics :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDcComics settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   dcComics <- faker .: "dc_comics"
   pure dcComics
 parseDcComics settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDcComicsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDcComicsField settings txt val = do
   dcComics <- parseDcComics settings val
   field <- dcComics .:? txt .!= mempty
diff --git a/src/Faker/Provider/Demographic.hs b/src/Faker/Provider/Demographic.hs
--- a/src/Faker/Provider/Demographic.hs
+++ b/src/Faker/Provider/Demographic.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDemographic :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDemographic settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   demographic <- faker .: "demographic"
   pure demographic
 parseDemographic settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDemographicField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDemographicField settings txt val = do
   demographic <- parseDemographic settings val
   field <- demographic .:? txt .!= mempty
diff --git a/src/Faker/Provider/Departed.hs b/src/Faker/Provider/Departed.hs
--- a/src/Faker/Provider/Departed.hs
+++ b/src/Faker/Provider/Departed.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDeparted :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDeparted settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   departed <- faker .: "departed"
   pure departed
 parseDeparted settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDepartedField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDepartedField settings txt val = do
   departed <- parseDeparted settings val
   field <- departed .:? txt .!= mempty
   pure field
 
 parseDepartedFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseDepartedFields settings txts val = do
   departed <- parseDeparted settings val
   helper departed txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -58,14 +59,3 @@
 $(genParser "departed" "quotes")
 
 $(genProvider "departed" "quotes")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Dessert.hs b/src/Faker/Provider/Dessert.hs
--- a/src/Faker/Provider/Dessert.hs
+++ b/src/Faker/Provider/Dessert.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDessert :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDessert settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   dessert <- faker .: "dessert"
   pure dessert
 parseDessert settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDessertField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDessertField settings txt val = do
   dessert <- parseDessert settings val
   field <- dessert .:? txt .!= mempty
diff --git a/src/Faker/Provider/Device.hs b/src/Faker/Provider/Device.hs
--- a/src/Faker/Provider/Device.hs
+++ b/src/Faker/Provider/Device.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDevice :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDevice settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   device <- faker .: "device"
   pure device
 parseDevice settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDeviceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDeviceField settings txt val = do
   device <- parseDevice settings val
   field <- device .:? txt .!= mempty
diff --git a/src/Faker/Provider/Dnd.hs b/src/Faker/Provider/Dnd.hs
--- a/src/Faker/Provider/Dnd.hs
+++ b/src/Faker/Provider/Dnd.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDnd :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDnd settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   dnd <- faker .: "dnd"
   pure dnd
 parseDnd settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDndField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDndField settings txt val = do
   dnd <- parseDnd settings val
   field <- dnd .:? txt .!= mempty
   pure field
 
 parseDndFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseDndFields settings txts val = do
   dnd <- parseDnd settings val
   helper dnd txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -83,14 +84,3 @@
 $(genParser "dnd" "ranged_weapons")
 
 $(genProvider "dnd" "ranged_weapons")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Dog.hs b/src/Faker/Provider/Dog.hs
--- a/src/Faker/Provider/Dog.hs
+++ b/src/Faker/Provider/Dog.hs
@@ -15,9 +15,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDog :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDog settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   creature <- faker .: "creature"
   dog <- creature .: "dog"
@@ -25,7 +26,7 @@
 parseDog settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDogField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDogField settings txt val = do
   dog <- parseDog settings val
   field <- dog .:? txt .!= mempty
diff --git a/src/Faker/Provider/Doraemon.hs b/src/Faker/Provider/Doraemon.hs
--- a/src/Faker/Provider/Doraemon.hs
+++ b/src/Faker/Provider/Doraemon.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDoraemon :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDoraemon settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   doraemon <- faker .: "doraemon"
   pure doraemon
 parseDoraemon settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDoraemonField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDoraemonField settings txt val = do
   doraemon <- parseDoraemon settings val
   field <- doraemon .:? txt .!= mempty
   pure field
 
 parseDoraemonFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseDoraemonFields settings txts val = do
   doraemon <- parseDoraemon settings val
   helper doraemon txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedDoraemonFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedDoraemonFields settings txts val = do
   doraemon <- parseDoraemon settings val
   helper doraemon txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -78,11 +79,3 @@
 $(genParser "doraemon" "locations")
 
 $(genProvider "doraemon" "locations")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Dota.hs b/src/Faker/Provider/Dota.hs
--- a/src/Faker/Provider/Dota.hs
+++ b/src/Faker/Provider/Dota.hs
@@ -15,9 +15,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDota :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDota settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   dota <- games .: "dota"
@@ -25,19 +26,19 @@
 parseDota settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDotaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDotaField settings txt val = do
   dota <- parseDota settings val
   field <- dota .:? txt .!= mempty
   pure field
 
 parseDotaFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseDotaFields settings txts val = do
   dota <- parseDota settings val
   helper dota txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/DrWho.hs b/src/Faker/Provider/DrWho.hs
--- a/src/Faker/Provider/DrWho.hs
+++ b/src/Faker/Provider/DrWho.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDrWho :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDrWho settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   drWho <- faker .: "dr_who"
   pure drWho
 parseDrWho settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDrWhoField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDrWhoField settings txt val = do
   drWho <- parseDrWho settings val
   field <- drWho .:? txt .!= mempty
diff --git a/src/Faker/Provider/DragonBall.hs b/src/Faker/Provider/DragonBall.hs
--- a/src/Faker/Provider/DragonBall.hs
+++ b/src/Faker/Provider/DragonBall.hs
@@ -15,16 +15,17 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDragonBall :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDragonBall settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   dragonBall <- faker .: "dragon_ball"
   pure dragonBall
 parseDragonBall settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDragonBallField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDragonBallField settings txt val = do
   dragonBall <- parseDragonBall settings val
   field <- dragonBall .:? txt .!= mempty
diff --git a/src/Faker/Provider/DrivingLicense.hs b/src/Faker/Provider/DrivingLicense.hs
--- a/src/Faker/Provider/DrivingLicense.hs
+++ b/src/Faker/Provider/DrivingLicense.hs
@@ -15,28 +15,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDrivingLicense :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDrivingLicense settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   drivingLicense <- faker .: "driving_licence"
   pure drivingLicense
 parseDrivingLicense settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDrivingLicenseField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDrivingLicenseField settings txt val = do
   drivingLicense <- parseDrivingLicense settings val
   field <- drivingLicense .:? txt .!= mempty
   pure field
 
 parseDrivingLicenseFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseDrivingLicenseFields settings txts val = do
   drivingLicense <- parseDrivingLicense settings val
   helper drivingLicense txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedDrivingLicenseField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedDrivingLicenseField settings txt val = do
@@ -60,14 +61,14 @@
 parseUnresolvedDrivingLicenseFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedDrivingLicenseFields settings txts val = do
   drivingLicense <- parseDrivingLicense settings val
   helper drivingLicense txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -230,9 +231,9 @@
 $(genParserUnresolveds "drivingLicense" ["usa","north_dakota"])
 $(genProviderUnresolveds "drivingLicense" ["usa","north_dakota"])
 
-resolveDrivingLicenseText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveDrivingLicenseText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveDrivingLicenseText = genericResolver' resolveDrivingLicenseField
 
-resolveDrivingLicenseField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveDrivingLicenseField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 
 resolveDrivingLicenseField settings str = throwM $ InvalidField "drivingLicense" str
diff --git a/src/Faker/Provider/Drone.hs b/src/Faker/Provider/Drone.hs
--- a/src/Faker/Provider/Drone.hs
+++ b/src/Faker/Provider/Drone.hs
@@ -15,28 +15,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDrone :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDrone settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   drone <- faker .: "drone"
   pure drone
 parseDrone settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDroneField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDroneField settings txt val = do
   drone <- parseDrone settings val
   field <- drone .:? txt .!= mempty
   pure field
 
 parseDroneFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseDroneFields settings txts val = do
   drone <- parseDrone settings val
   helper drone txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedDroneField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedDroneField settings txt val = do
@@ -60,14 +61,14 @@
 parseUnresolvedDroneFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedDroneFields settings txts val = do
   drone <- parseDrone settings val
   helper drone txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -158,14 +159,8 @@
 
 
 
-resolveDroneText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveDroneText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveDroneText = genericResolver' resolveDroneField
 
-resolveDroneField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveDroneField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveDroneField settings str = throwM $ InvalidField "drone" str
-
-
-
-
-
-
diff --git a/src/Faker/Provider/DumbAndDumber.hs b/src/Faker/Provider/DumbAndDumber.hs
--- a/src/Faker/Provider/DumbAndDumber.hs
+++ b/src/Faker/Provider/DumbAndDumber.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDumbAndDumber :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDumbAndDumber settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   dumbAndDumber <- faker .: "dumb_and_dumber"
   pure dumbAndDumber
@@ -26,7 +27,7 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseDumbAndDumberField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDumbAndDumberField settings txt val = do
   dumbAndDumber <- parseDumbAndDumber settings val
   field <- dumbAndDumber .:? txt .!= mempty
diff --git a/src/Faker/Provider/Dune.hs b/src/Faker/Provider/Dune.hs
--- a/src/Faker/Provider/Dune.hs
+++ b/src/Faker/Provider/Dune.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseDune :: FromJSON a => FakerSettings -> Value -> Parser a
 parseDune settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   dune <- faker .: "dune"
   pure dune
 parseDune settings val = fail $ "expected Object, but got " <> (show val)
 
 parseDuneField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseDuneField settings txt val = do
   dune <- parseDune settings val
   field <- dune .:? txt .!= mempty
   pure field
 
 parseDuneFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseDuneFields settings txts val = do
   dune <- parseDune settings val
   helper dune txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Educator.hs b/src/Faker/Provider/Educator.hs
--- a/src/Faker/Provider/Educator.hs
+++ b/src/Faker/Provider/Educator.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseEducator :: FromJSON a => FakerSettings -> Value -> Parser a
 parseEducator settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   educator <- faker .: "educator"
   pure educator
 parseEducator settings val = fail $ "expected Object, but got " <> (show val)
 
 parseEducatorField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseEducatorField settings txt val = do
   educator <- parseEducator settings val
   field <- educator .:? txt .!= mempty
   pure field
 
 parseEducatorFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseEducatorFields settings txts val = do
   educator <- parseEducator settings val
   helper educator txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedEducatorField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedEducatorField settings txt val = do
@@ -58,14 +59,14 @@
 parseUnresolvedEducatorFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedEducatorFields settings txts val = do
   educator <- parseEducator settings val
   helper educator txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -137,11 +138,11 @@
 $(genProviderUnresolveds "educator" ["tertiary", "degree", "course_number"])
 
 resolveEducatorText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveEducatorText = genericResolver' resolveEducatorField
 
 resolveEducatorField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveEducatorField settings field@"course_number" =
   cachedRandomUnresolvedVec
     "educator"
diff --git a/src/Faker/Provider/ElderScrolls.hs b/src/Faker/Provider/ElderScrolls.hs
--- a/src/Faker/Provider/ElderScrolls.hs
+++ b/src/Faker/Provider/ElderScrolls.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseElderScrolls :: FromJSON a => FakerSettings -> Value -> Parser a
 parseElderScrolls settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   elderScrolls <- games .: "elder_scrolls"
@@ -27,19 +28,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseElderScrollsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseElderScrollsField settings txt val = do
   elderScrolls <- parseElderScrolls settings val
   field <- elderScrolls .:? txt .!= mempty
   pure field
 
 parseElderScrollsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseElderScrollsFields settings txts val = do
   elderScrolls <- parseElderScrolls settings val
   helper elderScrolls txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/ElectricalComponents.hs b/src/Faker/Provider/ElectricalComponents.hs
--- a/src/Faker/Provider/ElectricalComponents.hs
+++ b/src/Faker/Provider/ElectricalComponents.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseElectricalComponents :: FromJSON a => FakerSettings -> Value -> Parser a
 parseElectricalComponents settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   electricalComponents <- faker .: "electrical_components"
   pure electricalComponents
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseElectricalComponentsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseElectricalComponentsField settings txt val = do
   electricalComponents <- parseElectricalComponents settings val
   field <- electricalComponents .:? txt .!= mempty
   pure field
 
 parseElectricalComponentsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseElectricalComponentsFields settings txts val = do
   electricalComponents <- parseElectricalComponents settings val
   helper electricalComponents txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Esport.hs b/src/Faker/Provider/Esport.hs
--- a/src/Faker/Provider/Esport.hs
+++ b/src/Faker/Provider/Esport.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseEsport :: FromJSON a => FakerSettings -> Value -> Parser a
 parseEsport settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   esport <- faker .: "esport"
   pure esport
 parseEsport settings val = fail $ "expected Object, but got " <> (show val)
 
 parseEsportField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseEsportField settings txt val = do
   esport <- parseEsport settings val
   field <- esport .:? txt .!= mempty
   pure field
 
 parseEsportFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseEsportFields settings txts val = do
   esport <- parseEsport settings val
   helper esport txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Fallout.hs b/src/Faker/Provider/Fallout.hs
--- a/src/Faker/Provider/Fallout.hs
+++ b/src/Faker/Provider/Fallout.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFallout :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFallout settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   fallout <- games .: "fallout"
@@ -26,19 +27,19 @@
 parseFallout settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFalloutField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFalloutField settings txt val = do
   fallout <- parseFallout settings val
   field <- fallout .:? txt .!= mempty
   pure field
 
 parseFalloutFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFalloutFields settings txts val = do
   fallout <- parseFallout settings val
   helper fallout txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/FamilyGuy.hs b/src/Faker/Provider/FamilyGuy.hs
--- a/src/Faker/Provider/FamilyGuy.hs
+++ b/src/Faker/Provider/FamilyGuy.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFamilyGuy :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFamilyGuy settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   familyGuy <- faker .: "family_guy"
   pure familyGuy
 parseFamilyGuy settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFamilyGuyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFamilyGuyField settings txt val = do
   familyGuy <- parseFamilyGuy settings val
   field <- familyGuy .:? txt .!= mempty
   pure field
 
 parseFamilyGuyFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFamilyGuyFields settings txts val = do
   familyGuy <- parseFamilyGuy settings val
   helper familyGuy txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/File.hs b/src/Faker/Provider/File.hs
--- a/src/Faker/Provider/File.hs
+++ b/src/Faker/Provider/File.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFile :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFile settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   file <- faker .: "file"
   pure file
 parseFile settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFileField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFileField settings txt val = do
   file <- parseFile settings val
   field <- file .:? txt .!= mempty
   pure field
 
 parseFileFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFileFields settings txts val = do
   file <- parseFile settings val
   helper file txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/FinalSpace.hs b/src/Faker/Provider/FinalSpace.hs
--- a/src/Faker/Provider/FinalSpace.hs
+++ b/src/Faker/Provider/FinalSpace.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFinalSpace :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFinalSpace settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   finalSpace <- faker .: "final_space"
   pure finalSpace
 parseFinalSpace settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFinalSpaceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFinalSpaceField settings txt val = do
   finalSpace <- parseFinalSpace settings val
   field <- finalSpace .:? txt .!= mempty
   pure field
 
 parseFinalSpaceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFinalSpaceFields settings txts val = do
   finalSpace <- parseFinalSpace settings val
   helper finalSpace txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedFinalSpaceFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedFinalSpaceFields settings txts val = do
   finalSpace <- parseFinalSpace settings val
   helper finalSpace txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -78,11 +79,3 @@
 $(genParser "finalSpace" "quotes")
 
 $(genProvider "finalSpace" "quotes")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Finance.hs b/src/Faker/Provider/Finance.hs
--- a/src/Faker/Provider/Finance.hs
+++ b/src/Faker/Provider/Finance.hs
@@ -15,9 +15,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFinance :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFinance settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   finance <- faker .: "finance"
   creditCard <- finance .: "credit_card"
@@ -25,19 +26,19 @@
 parseFinance settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFinanceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFinanceField settings txt val = do
   finance <- parseFinance settings val
   field <- finance .:? txt .!= mempty
   pure field
 
 parseFinanceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFinanceFields settings txts val = do
   finance <- parseFinance settings val
   helper finance txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedFinanceField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedFinanceField settings txt val = do
@@ -112,11 +113,11 @@
 $(genProviders "finance" ["ticker", "nyse"])
 
 resolveFinanceText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveFinanceText = genericResolver' resolveFinanceField
 
 resolveFinanceField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveFinanceField settings field@"visa" =
   cachedRandomUnresolvedVec
     "finance"
diff --git a/src/Faker/Provider/Food.hs b/src/Faker/Provider/Food.hs
--- a/src/Faker/Provider/Food.hs
+++ b/src/Faker/Provider/Food.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFood :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFood settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   food <- faker .: "food"
   pure food
 parseFood settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFoodField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFoodField settings txt val = do
   food <- parseFood settings val
   field <- food .:? txt .!= mempty
   pure field
 
 parseFoodFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFoodFields settings txts val = do
   food <- parseFood settings val
   helper food txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Football.hs b/src/Faker/Provider/Football.hs
--- a/src/Faker/Provider/Football.hs
+++ b/src/Faker/Provider/Football.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFootball :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFootball settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   football <- faker .: "football"
   pure football
 parseFootball settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFootballField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFootballField settings txt val = do
   football <- parseFootball settings val
   field <- football .:? txt .!= mempty
   pure field
 
 parseFootballFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFootballFields settings txts val = do
   football <- parseFootball settings val
   helper football txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/FreshPrinceOfBelAir.hs b/src/Faker/Provider/FreshPrinceOfBelAir.hs
--- a/src/Faker/Provider/FreshPrinceOfBelAir.hs
+++ b/src/Faker/Provider/FreshPrinceOfBelAir.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFreshPrinceOfBelAir :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFreshPrinceOfBelAir settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   freshPrinceOfBelAir <- faker .: "the_fresh_prince_of_bel_air"
   pure freshPrinceOfBelAir
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseFreshPrinceOfBelAirField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFreshPrinceOfBelAirField settings txt val = do
   freshPrinceOfBelAir <- parseFreshPrinceOfBelAir settings val
   field <- freshPrinceOfBelAir .:? txt .!= mempty
   pure field
 
 parseFreshPrinceOfBelAirFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFreshPrinceOfBelAirFields settings txts val = do
   freshPrinceOfBelAir <- parseFreshPrinceOfBelAir settings val
   helper freshPrinceOfBelAir txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Friends.hs b/src/Faker/Provider/Friends.hs
--- a/src/Faker/Provider/Friends.hs
+++ b/src/Faker/Provider/Friends.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFriends :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFriends settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   friends <- faker .: "friends"
   pure friends
 parseFriends settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFriendsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFriendsField settings txt val = do
   friends <- parseFriends settings val
   field <- friends .:? txt .!= mempty
   pure field
 
 parseFriendsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFriendsFields settings txts val = do
   friends <- parseFriends settings val
   helper friends txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/FunnyName.hs b/src/Faker/Provider/FunnyName.hs
--- a/src/Faker/Provider/FunnyName.hs
+++ b/src/Faker/Provider/FunnyName.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFunnyName :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFunnyName settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   funnyName <- faker .: "funny_name"
   pure funnyName
 parseFunnyName settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFunnyNameField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFunnyNameField settings txt val = do
   funnyName <- parseFunnyName settings val
   field <- funnyName .:? txt .!= mempty
   pure field
 
 parseFunnyNameFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFunnyNameFields settings txts val = do
   funnyName <- parseFunnyName settings val
   helper funnyName txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Futurama.hs b/src/Faker/Provider/Futurama.hs
--- a/src/Faker/Provider/Futurama.hs
+++ b/src/Faker/Provider/Futurama.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseFuturama :: FromJSON a => FakerSettings -> Value -> Parser a
 parseFuturama settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   futurama <- faker .: "futurama"
   pure futurama
 parseFuturama settings val = fail $ "expected Object, but got " <> (show val)
 
 parseFuturamaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseFuturamaField settings txt val = do
   futurama <- parseFuturama settings val
   field <- futurama .:? txt .!= mempty
   pure field
 
 parseFuturamaFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseFuturamaFields settings txts val = do
   futurama <- parseFuturama settings val
   helper futurama txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedFuturamaFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedFuturamaFields settings txts val = do
   futurama <- parseFuturama settings val
   helper futurama txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -86,14 +87,3 @@
 $(genParser "futurama" "hermes_catchphrases")
 
 $(genProvider "futurama" "hermes_catchphrases")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/GameOfThrones.hs b/src/Faker/Provider/GameOfThrones.hs
--- a/src/Faker/Provider/GameOfThrones.hs
+++ b/src/Faker/Provider/GameOfThrones.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseGameOfThrones :: FromJSON a => FakerSettings -> Value -> Parser a
 parseGameOfThrones settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   gameOfThrones <- faker .: "game_of_thrones"
   pure gameOfThrones
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseGameOfThronesField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseGameOfThronesField settings txt val = do
   gameOfThrones <- parseGameOfThrones settings val
   field <- gameOfThrones .:? txt .!= mempty
   pure field
 
 parseGameOfThronesFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseGameOfThronesFields settings txts val = do
   gameOfThrones <- parseGameOfThrones settings val
   helper gameOfThrones txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Gender.hs b/src/Faker/Provider/Gender.hs
--- a/src/Faker/Provider/Gender.hs
+++ b/src/Faker/Provider/Gender.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseGender :: FromJSON a => FakerSettings -> Value -> Parser a
 parseGender settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   gender <- faker .: "gender"
   pure gender
 parseGender settings val = fail $ "expected Object, but got " <> (show val)
 
 parseGenderField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseGenderField settings txt val = do
   gender <- parseGender settings val
   field <- gender .:? txt .!= mempty
   pure field
 
 parseGenderFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseGenderFields settings txts val = do
   gender <- parseGender settings val
   helper gender txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -55,4 +56,3 @@
 $(genParser "gender" "short_binary_types")
 
 $(genProvider "gender" "short_binary_types")
-
diff --git a/src/Faker/Provider/Ghostbusters.hs b/src/Faker/Provider/Ghostbusters.hs
--- a/src/Faker/Provider/Ghostbusters.hs
+++ b/src/Faker/Provider/Ghostbusters.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseGhostbusters :: FromJSON a => FakerSettings -> Value -> Parser a
 parseGhostbusters settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   ghostbusters <- faker .: "ghostbusters"
   pure ghostbusters
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseGhostbustersField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseGhostbustersField settings txt val = do
   ghostbusters <- parseGhostbusters settings val
   field <- ghostbusters .:? txt .!= mempty
   pure field
 
 parseGhostbustersFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseGhostbustersFields settings txts val = do
   ghostbusters <- parseGhostbusters settings val
   helper ghostbusters txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/GratefulDead.hs b/src/Faker/Provider/GratefulDead.hs
--- a/src/Faker/Provider/GratefulDead.hs
+++ b/src/Faker/Provider/GratefulDead.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseGratefulDead :: FromJSON a => FakerSettings -> Value -> Parser a
 parseGratefulDead settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   gratefulDead <- faker .: "grateful_dead"
   pure gratefulDead
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseGratefulDeadField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseGratefulDeadField settings txt val = do
   gratefulDead <- parseGratefulDead settings val
   field <- gratefulDead .:? txt .!= mempty
   pure field
 
 parseGratefulDeadFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseGratefulDeadFields settings txts val = do
   gratefulDead <- parseGratefulDead settings val
   helper gratefulDead txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/GreekPhilosophers.hs b/src/Faker/Provider/GreekPhilosophers.hs
--- a/src/Faker/Provider/GreekPhilosophers.hs
+++ b/src/Faker/Provider/GreekPhilosophers.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseGreekPhilosophers :: FromJSON a => FakerSettings -> Value -> Parser a
 parseGreekPhilosophers settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   greekPhilosophers <- faker .: "greek_philosophers"
   pure greekPhilosophers
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseGreekPhilosophersField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseGreekPhilosophersField settings txt val = do
   greekPhilosophers <- parseGreekPhilosophers settings val
   field <- greekPhilosophers .:? txt .!= mempty
   pure field
 
 parseGreekPhilosophersFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseGreekPhilosophersFields settings txts val = do
   greekPhilosophers <- parseGreekPhilosophers settings val
   helper greekPhilosophers txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Hacker.hs b/src/Faker/Provider/Hacker.hs
--- a/src/Faker/Provider/Hacker.hs
+++ b/src/Faker/Provider/Hacker.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHacker :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHacker settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   hacker <- faker .: "hacker"
   pure hacker
 parseHacker settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHackerField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHackerField settings txt val = do
   hacker <- parseHacker settings val
   field <- hacker .:? txt .!= mempty
   pure field
 
 parseHackerFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHackerFields settings txts val = do
   hacker <- parseHacker settings val
   helper hacker txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/HalfLife.hs b/src/Faker/Provider/HalfLife.hs
--- a/src/Faker/Provider/HalfLife.hs
+++ b/src/Faker/Provider/HalfLife.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHalfLife :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHalfLife settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   halfLife <- games .: "half_life"
@@ -26,19 +27,19 @@
 parseHalfLife settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHalfLifeField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHalfLifeField settings txt val = do
   halfLife <- parseHalfLife settings val
   field <- halfLife .:? txt .!= mempty
   pure field
 
 parseHalfLifeFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHalfLifeFields settings txts val = do
   halfLife <- parseHalfLife settings val
   helper halfLife txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/HarryPotter.hs b/src/Faker/Provider/HarryPotter.hs
--- a/src/Faker/Provider/HarryPotter.hs
+++ b/src/Faker/Provider/HarryPotter.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHarryPotter :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHarryPotter settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   harryPotter <- faker .: "harry_potter"
   pure harryPotter
 parseHarryPotter settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHarryPotterField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHarryPotterField settings txt val = do
   harryPotter <- parseHarryPotter settings val
   field <- harryPotter .:? txt .!= mempty
   pure field
 
 parseHarryPotterFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHarryPotterFields settings txts val = do
   harryPotter <- parseHarryPotter settings val
   helper harryPotter txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Heroes.hs b/src/Faker/Provider/Heroes.hs
--- a/src/Faker/Provider/Heroes.hs
+++ b/src/Faker/Provider/Heroes.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHeroes :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHeroes settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   heroes <- faker .: "heroes"
   pure heroes
 parseHeroes settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHeroesField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHeroesField settings txt val = do
   heroes <- parseHeroes settings val
   field <- heroes .:? txt .!= mempty
   pure field
 
 parseHeroesFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHeroesFields settings txts val = do
   heroes <- parseHeroes settings val
   helper heroes txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/HeroesOfTheStorm.hs b/src/Faker/Provider/HeroesOfTheStorm.hs
--- a/src/Faker/Provider/HeroesOfTheStorm.hs
+++ b/src/Faker/Provider/HeroesOfTheStorm.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHeroesOfTheStorm :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHeroesOfTheStorm settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   heroesOfTheStorm <- faker .: "heroes_of_the_storm"
   pure heroesOfTheStorm
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseHeroesOfTheStormField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHeroesOfTheStormField settings txt val = do
   heroesOfTheStorm <- parseHeroesOfTheStorm settings val
   field <- heroesOfTheStorm .:? txt .!= mempty
   pure field
 
 parseHeroesOfTheStormFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHeroesOfTheStormFields settings txts val = do
   heroesOfTheStorm <- parseHeroesOfTheStorm settings val
   helper heroesOfTheStorm txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/HeyArnold.hs b/src/Faker/Provider/HeyArnold.hs
--- a/src/Faker/Provider/HeyArnold.hs
+++ b/src/Faker/Provider/HeyArnold.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHeyArnold :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHeyArnold settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   heyArnold <- faker .: "hey_arnold"
   pure heyArnold
 parseHeyArnold settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHeyArnoldField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHeyArnoldField settings txt val = do
   heyArnold <- parseHeyArnold settings val
   field <- heyArnold .:? txt .!= mempty
   pure field
 
 parseHeyArnoldFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHeyArnoldFields settings txts val = do
   heyArnold <- parseHeyArnold settings val
   helper heyArnold txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Hipster.hs b/src/Faker/Provider/Hipster.hs
--- a/src/Faker/Provider/Hipster.hs
+++ b/src/Faker/Provider/Hipster.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHipster :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHipster settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   hipster <- faker .: "hipster"
   pure hipster
 parseHipster settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHipsterField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHipsterField settings txt val = do
   hipster <- parseHipster settings val
   field <- hipster .:? txt .!= mempty
   pure field
 
 parseHipsterFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHipsterFields settings txts val = do
   hipster <- parseHipster settings val
   helper hipster txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/HitchhikersGuideToTheGalaxy.hs b/src/Faker/Provider/HitchhikersGuideToTheGalaxy.hs
--- a/src/Faker/Provider/HitchhikersGuideToTheGalaxy.hs
+++ b/src/Faker/Provider/HitchhikersGuideToTheGalaxy.hs
@@ -16,10 +16,11 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHitchhikersGuideToTheGalaxy ::
      FromJSON a => FakerSettings -> Value -> Parser a
 parseHitchhikersGuideToTheGalaxy settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   hitchhikersGuideToTheGalaxy <- faker .: "hitchhikers_guide_to_the_galaxy"
   pure hitchhikersGuideToTheGalaxy
@@ -27,19 +28,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseHitchhikersGuideToTheGalaxyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHitchhikersGuideToTheGalaxyField settings txt val = do
   hitchhikersGuideToTheGalaxy <- parseHitchhikersGuideToTheGalaxy settings val
   field <- hitchhikersGuideToTheGalaxy .:? txt .!= mempty
   pure field
 
 parseHitchhikersGuideToTheGalaxyFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHitchhikersGuideToTheGalaxyFields settings txts val = do
   hitchhikersGuideToTheGalaxy <- parseHitchhikersGuideToTheGalaxy settings val
   helper hitchhikersGuideToTheGalaxy txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Horse.hs b/src/Faker/Provider/Horse.hs
--- a/src/Faker/Provider/Horse.hs
+++ b/src/Faker/Provider/Horse.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHorse :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHorse settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   creature <- faker .: "creature"
   horse <- creature .: "horse"
@@ -24,19 +25,19 @@
 parseHorse settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHorseField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHorseField settings txt val = do
   horse <- parseHorse settings val
   field <- horse .:? txt .!= mempty
   pure field
 
 parseHorseFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHorseFields settings txts val = do
   horse <- parseHorse settings val
   helper horse txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/House.hs b/src/Faker/Provider/House.hs
--- a/src/Faker/Provider/House.hs
+++ b/src/Faker/Provider/House.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHouse :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHouse settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   house <- faker .: "house"
   pure house
 parseHouse settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHouseField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHouseField settings txt val = do
   house <- parseHouse settings val
   field <- house .:? txt .!= mempty
   pure field
 
 parseHouseFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHouseFields settings txts val = do
   house <- parseHouse settings val
   helper house txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/HowIMetYourMother.hs b/src/Faker/Provider/HowIMetYourMother.hs
--- a/src/Faker/Provider/HowIMetYourMother.hs
+++ b/src/Faker/Provider/HowIMetYourMother.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHowIMetYourMother :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHowIMetYourMother settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   howIMetYourMother <- faker .: "how_i_met_your_mother"
   pure howIMetYourMother
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseHowIMetYourMotherField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHowIMetYourMotherField settings txt val = do
   howIMetYourMother <- parseHowIMetYourMother settings val
   field <- howIMetYourMother .:? txt .!= mempty
   pure field
 
 parseHowIMetYourMotherFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHowIMetYourMotherFields settings txts val = do
   howIMetYourMother <- parseHowIMetYourMother settings val
   helper howIMetYourMother txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/HowToTrainYourDragon.hs b/src/Faker/Provider/HowToTrainYourDragon.hs
--- a/src/Faker/Provider/HowToTrainYourDragon.hs
+++ b/src/Faker/Provider/HowToTrainYourDragon.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseHowToTrainYourDragon :: FromJSON a => FakerSettings -> Value -> Parser a
 parseHowToTrainYourDragon settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   howToTrainYourDragon <- faker .: "how_to_train_your_dragon"
   pure howToTrainYourDragon
 parseHowToTrainYourDragon settings val = fail $ "expected Object, but got " <> (show val)
 
 parseHowToTrainYourDragonField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseHowToTrainYourDragonField settings txt val = do
   howToTrainYourDragon <- parseHowToTrainYourDragon settings val
   field <- howToTrainYourDragon .:? txt .!= mempty
   pure field
 
 parseHowToTrainYourDragonFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseHowToTrainYourDragonFields settings txts val = do
   howToTrainYourDragon <- parseHowToTrainYourDragon settings val
   helper howToTrainYourDragon txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedHowToTrainYourDragonFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedHowToTrainYourDragonFields settings txts val = do
   howToTrainYourDragon <- parseHowToTrainYourDragon settings val
   helper howToTrainYourDragon txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -78,11 +79,3 @@
 $(genParser "howToTrainYourDragon" "locations")
 
 $(genProvider "howToTrainYourDragon" "locations")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/IndustrySegments.hs b/src/Faker/Provider/IndustrySegments.hs
--- a/src/Faker/Provider/IndustrySegments.hs
+++ b/src/Faker/Provider/IndustrySegments.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseIndustrySegments :: FromJSON a => FakerSettings -> Value -> Parser a
 parseIndustrySegments settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   industrySegments <- faker .: "industry_segments"
   pure industrySegments
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseIndustrySegmentsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseIndustrySegmentsField settings txt val = do
   industrySegments <- parseIndustrySegments settings val
   field <- industrySegments .:? txt .!= mempty
   pure field
 
 parseIndustrySegmentsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseIndustrySegmentsFields settings txts val = do
   industrySegments <- parseIndustrySegments settings val
   helper industrySegments txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Internet.hs b/src/Faker/Provider/Internet.hs
--- a/src/Faker/Provider/Internet.hs
+++ b/src/Faker/Provider/Internet.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseInternet :: FromJSON a => FakerSettings -> Value -> Parser a
 parseInternet settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   internet <- faker .: "internet"
   pure internet
 parseInternet settings val = fail $ "expected Object, but got " <> (show val)
 
 parseInternetField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseInternetField settings txt val = do
   internet <- parseInternet settings val
   field <- internet .:? txt .!= mempty
   pure field
 
 parseInternetFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseInternetFields settings txts val = do
   internet <- parseInternet settings val
   helper internet txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/JackHandey.hs b/src/Faker/Provider/JackHandey.hs
--- a/src/Faker/Provider/JackHandey.hs
+++ b/src/Faker/Provider/JackHandey.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseJackHandey :: FromJSON a => FakerSettings -> Value -> Parser a
 parseJackHandey settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   jackHandey <- faker .: "quote"
   pure jackHandey
 parseJackHandey settings val = fail $ "expected Object, but got " <> (show val)
 
 parseJackHandeyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseJackHandeyField settings txt val = do
   jackHandey <- parseJackHandey settings val
   field <- jackHandey .:? txt .!= mempty
   pure field
 
 parseJackHandeyFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseJackHandeyFields settings txts val = do
   jackHandey <- parseJackHandey settings val
   helper jackHandey txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedJackHandeyFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedJackHandeyFields settings txts val = do
   jackHandey <- parseJackHandey settings val
   helper jackHandey txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -70,11 +71,3 @@
 $(genParser "jackHandey" "jack_handey")
 
 $(genProvider "jackHandey" "jack_handey")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Job.hs b/src/Faker/Provider/Job.hs
--- a/src/Faker/Provider/Job.hs
+++ b/src/Faker/Provider/Job.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseJob :: FromJSON a => FakerSettings -> Value -> Parser a
 parseJob settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   job <- faker .: "job"
   pure job
 parseJob settings val = fail $ "expected Object, but got " <> (show val)
 
 parseJobField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseJobField settings txt val = do
   job <- parseJob settings val
   field <- job .:? txt .!= mempty
   pure field
 
 parseJobFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseJobFields settings txts val = do
   job <- parseJob settings val
   helper job txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedJobField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedJobField settings txt val = do
@@ -90,10 +91,10 @@
 
 $(genProviderUnresolved "job" "title")
 
-resolveJobText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveJobText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveJobText = genericResolver' resolveJobField
 
-resolveJobField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveJobField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveJobField settings field@"seniority" =
   cachedRandomVec "job" field jobSeniorityProvider settings
 resolveJobField settings field@"field" =
diff --git a/src/Faker/Provider/Kpop.hs b/src/Faker/Provider/Kpop.hs
--- a/src/Faker/Provider/Kpop.hs
+++ b/src/Faker/Provider/Kpop.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseKpop :: FromJSON a => FakerSettings -> Value -> Parser a
 parseKpop settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   kpop <- faker .: "kpop"
   pure kpop
 parseKpop settings val = fail $ "expected Object, but got " <> (show val)
 
 parseKpopField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseKpopField settings txt val = do
   kpop <- parseKpop settings val
   field <- kpop .:? txt .!= mempty
   pure field
 
 parseKpopFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseKpopFields settings txts val = do
   kpop <- parseKpop settings val
   helper kpop txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/LeagueOfLegends.hs b/src/Faker/Provider/LeagueOfLegends.hs
--- a/src/Faker/Provider/LeagueOfLegends.hs
+++ b/src/Faker/Provider/LeagueOfLegends.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseLeagueOfLegends :: FromJSON a => FakerSettings -> Value -> Parser a
 parseLeagueOfLegends settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   leagueOfLegends <- games .: "league_of_legends"
@@ -27,19 +28,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseLeagueOfLegendsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseLeagueOfLegendsField settings txt val = do
   leagueOfLegends <- parseLeagueOfLegends settings val
   field <- leagueOfLegends .:? txt .!= mempty
   pure field
 
 parseLeagueOfLegendsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseLeagueOfLegendsFields settings txts val = do
   leagueOfLegends <- parseLeagueOfLegends settings val
   helper leagueOfLegends txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Lebowski.hs b/src/Faker/Provider/Lebowski.hs
--- a/src/Faker/Provider/Lebowski.hs
+++ b/src/Faker/Provider/Lebowski.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseLebowski :: FromJSON a => FakerSettings -> Value -> Parser a
 parseLebowski settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   lebowski <- faker .: "lebowski"
   pure lebowski
 parseLebowski settings val = fail $ "expected Object, but got " <> (show val)
 
 parseLebowskiField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseLebowskiField settings txt val = do
   lebowski <- parseLebowski settings val
   field <- lebowski .:? txt .!= mempty
   pure field
 
 parseLebowskiFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseLebowskiFields settings txts val = do
   lebowski <- parseLebowski settings val
   helper lebowski txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Lorem.hs b/src/Faker/Provider/Lorem.hs
--- a/src/Faker/Provider/Lorem.hs
+++ b/src/Faker/Provider/Lorem.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseLorem :: FromJSON a => FakerSettings -> Value -> Parser a
 parseLorem settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   lorem <- faker .: "lorem"
   pure lorem
 parseLorem settings val = fail $ "expected Object, but got " <> (show val)
 
 parseLoremField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseLoremField settings txt val = do
   lorem <- parseLorem settings val
   field <- lorem .:? txt .!= mempty
   pure field
 
 parseLoremFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseLoremFields settings txts val = do
   lorem <- parseLorem settings val
   helper lorem txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Lovecraft.hs b/src/Faker/Provider/Lovecraft.hs
--- a/src/Faker/Provider/Lovecraft.hs
+++ b/src/Faker/Provider/Lovecraft.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseLovecraft :: FromJSON a => FakerSettings -> Value -> Parser a
 parseLovecraft settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   lovecraft <- faker .: "lovecraft"
   pure lovecraft
 parseLovecraft settings val = fail $ "expected Object, but got " <> (show val)
 
 parseLovecraftField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseLovecraftField settings txt val = do
   lovecraft <- parseLovecraft settings val
   field <- lovecraft .:? txt .!= mempty
   pure field
 
 parseLovecraftFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseLovecraftFields settings txts val = do
   lovecraft <- parseLovecraft settings val
   helper lovecraft txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Markdown.hs b/src/Faker/Provider/Markdown.hs
--- a/src/Faker/Provider/Markdown.hs
+++ b/src/Faker/Provider/Markdown.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMarkdown :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMarkdown settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   markdown <- faker .: "markdown"
   pure markdown
 parseMarkdown settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMarkdownField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMarkdownField settings txt val = do
   markdown <- parseMarkdown settings val
   field <- markdown .:? txt .!= mempty
   pure field
 
 parseMarkdownFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMarkdownFields settings txts val = do
   markdown <- parseMarkdown settings val
   helper markdown txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Marketing.hs b/src/Faker/Provider/Marketing.hs
--- a/src/Faker/Provider/Marketing.hs
+++ b/src/Faker/Provider/Marketing.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMarketing :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMarketing settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   marketing <- faker .: "marketing"
   pure marketing
 parseMarketing settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMarketingField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMarketingField settings txt val = do
   marketing <- parseMarketing settings val
   field <- marketing .:? txt .!= mempty
   pure field
 
 parseMarketingFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMarketingFields settings txts val = do
   marketing <- parseMarketing settings val
   helper marketing txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Measurement.hs b/src/Faker/Provider/Measurement.hs
--- a/src/Faker/Provider/Measurement.hs
+++ b/src/Faker/Provider/Measurement.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMeasurement :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMeasurement settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   measurement <- faker .: "measurement"
   pure measurement
 parseMeasurement settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMeasurementField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMeasurementField settings txt val = do
   measurement <- parseMeasurement settings val
   field <- measurement .:? txt .!= mempty
   pure field
 
 parseMeasurementFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMeasurementFields settings txts val = do
   measurement <- parseMeasurement settings val
   helper measurement txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/MichaelScott.hs b/src/Faker/Provider/MichaelScott.hs
--- a/src/Faker/Provider/MichaelScott.hs
+++ b/src/Faker/Provider/MichaelScott.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMichaelScott :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMichaelScott settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   michaelScott <- faker .: "michael_scott"
   pure michaelScott
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseMichaelScottField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMichaelScottField settings txt val = do
   michaelScott <- parseMichaelScott settings val
   field <- michaelScott .:? txt .!= mempty
   pure field
 
 parseMichaelScottFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMichaelScottFields settings txts val = do
   michaelScott <- parseMichaelScott settings val
   helper michaelScott txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Military.hs b/src/Faker/Provider/Military.hs
--- a/src/Faker/Provider/Military.hs
+++ b/src/Faker/Provider/Military.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMilitary :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMilitary settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   military <- faker .: "military"
   pure military
 parseMilitary settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMilitaryField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMilitaryField settings txt val = do
   military <- parseMilitary settings val
   field <- military .:? txt .!= mempty
   pure field
 
 parseMilitaryFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMilitaryFields settings txts val = do
   military <- parseMilitary settings val
   helper military txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Minecraft.hs b/src/Faker/Provider/Minecraft.hs
--- a/src/Faker/Provider/Minecraft.hs
+++ b/src/Faker/Provider/Minecraft.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMinecraft :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMinecraft settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   minecraft <- games .: "minecraft"
@@ -24,19 +25,19 @@
 parseMinecraft settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMinecraftField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMinecraftField settings txt val = do
   minecraft <- parseMinecraft settings val
   field <- minecraft .:? txt .!= mempty
   pure field
 
 parseMinecraftFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMinecraftFields settings txts val = do
   minecraft <- parseMinecraft settings val
   helper minecraft txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -49,14 +50,14 @@
 parseUnresolvedMinecraftFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedMinecraftFields settings txts val = do
   minecraft <- parseMinecraft settings val
   helper minecraft txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
diff --git a/src/Faker/Provider/Mountain.hs b/src/Faker/Provider/Mountain.hs
--- a/src/Faker/Provider/Mountain.hs
+++ b/src/Faker/Provider/Mountain.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMountain :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMountain settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   mountain <- faker .: "mountain"
   pure mountain
 parseMountain settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMountainField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMountainField settings txt val = do
   mountain <- parseMountain settings val
   field <- mountain .:? txt .!= mempty
   pure field
 
 parseMountainFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMountainFields settings txts val = do
   mountain <- parseMountain settings val
   helper mountain txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedMountainFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedMountainFields settings txts val = do
   mountain <- parseMountain settings val
   helper mountain txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -74,11 +75,3 @@
 $(genParser "mountain" "range")
 
 $(genProvider "mountain" "range")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Movie.hs b/src/Faker/Provider/Movie.hs
--- a/src/Faker/Provider/Movie.hs
+++ b/src/Faker/Provider/Movie.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMovie :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMovie settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   movie <- faker .: "movie"
   pure movie
 parseMovie settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMovieField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMovieField settings txt val = do
   movie <- parseMovie settings val
   field <- movie .:? txt .!= mempty
   pure field
 
 parseMovieFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMovieFields settings txts val = do
   movie <- parseMovie settings val
   helper movie txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Music.hs b/src/Faker/Provider/Music.hs
--- a/src/Faker/Provider/Music.hs
+++ b/src/Faker/Provider/Music.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMusic :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMusic settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   music <- faker .: "music"
   pure music
 parseMusic settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMusicField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMusicField settings txt val = do
   music <- parseMusic settings val
   field <- music .:? txt .!= mempty
   pure field
 
 parseMusicFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMusicFields settings txts val = do
   music <- parseMusic settings val
   helper music txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedMusicFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedMusicFields settings txts val = do
   music <- parseMusic settings val
   helper music txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -101,5 +102,3 @@
 
 $(genParsers "music" ["hiphop","artist"])
 $(genProviders "music" ["hiphop","artist"])
-
-
diff --git a/src/Faker/Provider/Myst.hs b/src/Faker/Provider/Myst.hs
--- a/src/Faker/Provider/Myst.hs
+++ b/src/Faker/Provider/Myst.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseMyst :: FromJSON a => FakerSettings -> Value -> Parser a
 parseMyst settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   myst <- games .: "myst"
@@ -26,19 +27,19 @@
 parseMyst settings val = fail $ "expected Object, but got " <> (show val)
 
 parseMystField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseMystField settings txt val = do
   myst <- parseMyst settings val
   field <- myst .:? txt .!= mempty
   pure field
 
 parseMystFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseMystFields settings txts val = do
   myst <- parseMyst settings val
   helper myst txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Name.hs b/src/Faker/Provider/Name.hs
--- a/src/Faker/Provider/Name.hs
+++ b/src/Faker/Provider/Name.hs
@@ -15,28 +15,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseName :: FromJSON a => FakerSettings -> Value -> Parser a
 parseName settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   name <- faker .: "name"
   pure name
 parseName settings val = fail $ "expected Object, but got " <> (show val)
 
 parseNameField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseNameField settings txt val = do
   name <- parseName settings val
   field <- name .:? txt .!= mempty
   pure field
 
 parseNameFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseNameFields settings txts val = do
   name <- parseName settings val
   helper name txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -46,7 +47,7 @@
 parseUnresolvedNameField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedNameField settings txt val = do
@@ -96,10 +97,10 @@
 
 $(genProvider "name" "surname")
 
-resolveNameText :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveNameText :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveNameText = genericResolver' resolveNameField
 
-resolveNameField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveNameField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveNameField settings field@"female_first_name" =
   cachedRandomVec "name" field nameFemaleFirstNameProvider settings
 resolveNameField settings field@"male_first_name" =
diff --git a/src/Faker/Provider/Naruto.hs b/src/Faker/Provider/Naruto.hs
--- a/src/Faker/Provider/Naruto.hs
+++ b/src/Faker/Provider/Naruto.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseNaruto :: FromJSON a => FakerSettings -> Value -> Parser a
 parseNaruto settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   naruto <- faker .: "naruto"
   pure naruto
 parseNaruto settings val = fail $ "expected Object, but got " <> (show val)
 
 parseNarutoField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseNarutoField settings txt val = do
   naruto <- parseNaruto settings val
   field <- naruto .:? txt .!= mempty
   pure field
 
 parseNarutoFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseNarutoFields settings txts val = do
   naruto <- parseNaruto settings val
   helper naruto txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedNarutoFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedNarutoFields settings txts val = do
   naruto <- parseNaruto settings val
   helper naruto txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -82,11 +83,3 @@
 $(genParser "naruto" "demons")
 
 $(genProvider "naruto" "demons")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Nation.hs b/src/Faker/Provider/Nation.hs
--- a/src/Faker/Provider/Nation.hs
+++ b/src/Faker/Provider/Nation.hs
@@ -17,28 +17,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseNation :: FromJSON a => FakerSettings -> Value -> Parser a
 parseNation settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   nation <- faker .: "nation"
   pure nation
 parseNation settings val = fail $ "expected Object, but got " <> (show val)
 
 parseNationField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseNationField settings txt val = do
   nation <- parseNation settings val
   field <- nation .:? txt .!= mempty
   pure field
 
 parseNationFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseNationFields settings txts val = do
   nation <- parseNation settings val
   helper nation txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/NatoPhoneticAlphabet.hs b/src/Faker/Provider/NatoPhoneticAlphabet.hs
--- a/src/Faker/Provider/NatoPhoneticAlphabet.hs
+++ b/src/Faker/Provider/NatoPhoneticAlphabet.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseNatoPhoneticAlphabet :: FromJSON a => FakerSettings -> Value -> Parser a
 parseNatoPhoneticAlphabet settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   natoPhoneticAlphabet <- faker .: "nato_phonetic_alphabet"
   pure natoPhoneticAlphabet
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseNatoPhoneticAlphabetField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseNatoPhoneticAlphabetField settings txt val = do
   natoPhoneticAlphabet <- parseNatoPhoneticAlphabet settings val
   field <- natoPhoneticAlphabet .:? txt .!= mempty
   pure field
 
 parseNatoPhoneticAlphabetFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseNatoPhoneticAlphabetFields settings txts val = do
   natoPhoneticAlphabet <- parseNatoPhoneticAlphabet settings val
   helper natoPhoneticAlphabet txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/NewGirl.hs b/src/Faker/Provider/NewGirl.hs
--- a/src/Faker/Provider/NewGirl.hs
+++ b/src/Faker/Provider/NewGirl.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseNewGirl :: FromJSON a => FakerSettings -> Value -> Parser a
 parseNewGirl settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   newGirl <- faker .: "new_girl"
   pure newGirl
 parseNewGirl settings val = fail $ "expected Object, but got " <> (show val)
 
 parseNewGirlField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseNewGirlField settings txt val = do
   newGirl <- parseNewGirl settings val
   field <- newGirl .:? txt .!= mempty
   pure field
 
 parseNewGirlFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseNewGirlFields settings txts val = do
   newGirl <- parseNewGirl settings val
   helper newGirl txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/OnePiece.hs b/src/Faker/Provider/OnePiece.hs
--- a/src/Faker/Provider/OnePiece.hs
+++ b/src/Faker/Provider/OnePiece.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseOnePiece :: FromJSON a => FakerSettings -> Value -> Parser a
 parseOnePiece settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   onePiece <- faker .: "one_piece"
   pure onePiece
 parseOnePiece settings val = fail $ "expected Object, but got " <> (show val)
 
 parseOnePieceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseOnePieceField settings txt val = do
   onePiece <- parseOnePiece settings val
   field <- onePiece .:? txt .!= mempty
   pure field
 
 parseOnePieceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseOnePieceFields settings txts val = do
   onePiece <- parseOnePiece settings val
   helper onePiece txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Opera.hs b/src/Faker/Provider/Opera.hs
--- a/src/Faker/Provider/Opera.hs
+++ b/src/Faker/Provider/Opera.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseOpera :: FromJSON a => FakerSettings -> Value -> Parser a
 parseOpera settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   opera <- faker .: "opera"
   pure opera
 parseOpera settings val = fail $ "expected Object, but got " <> (show val)
 
 parseOperaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseOperaField settings txt val = do
   opera <- parseOpera settings val
   field <- opera .:? txt .!= mempty
   pure field
 
 parseOperaFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseOperaFields settings txts val = do
   opera <- parseOpera settings val
   helper opera txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Overwatch.hs b/src/Faker/Provider/Overwatch.hs
--- a/src/Faker/Provider/Overwatch.hs
+++ b/src/Faker/Provider/Overwatch.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseOverwatch :: FromJSON a => FakerSettings -> Value -> Parser a
 parseOverwatch settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   overwatch <- games .: "overwatch"
@@ -26,19 +27,19 @@
 parseOverwatch settings val = fail $ "expected Object, but got " <> (show val)
 
 parseOverwatchField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseOverwatchField settings txt val = do
   overwatch <- parseOverwatch settings val
   field <- overwatch .:? txt .!= mempty
   pure field
 
 parseOverwatchFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseOverwatchFields settings txts val = do
   overwatch <- parseOverwatch settings val
   helper overwatch txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/ParksAndRec.hs b/src/Faker/Provider/ParksAndRec.hs
--- a/src/Faker/Provider/ParksAndRec.hs
+++ b/src/Faker/Provider/ParksAndRec.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseParksAndRec :: FromJSON a => FakerSettings -> Value -> Parser a
 parseParksAndRec settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   parksAndRec <- faker .: "parks_and_rec"
   pure parksAndRec
 parseParksAndRec settings val = fail $ "expected Object, but got " <> (show val)
 
 parseParksAndRecField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseParksAndRecField settings txt val = do
   parksAndRec <- parseParksAndRec settings val
   field <- parksAndRec .:? txt .!= mempty
   pure field
 
 parseParksAndRecFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseParksAndRecFields settings txts val = do
   parksAndRec <- parseParksAndRec settings val
   helper parksAndRec txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/PearlJam.hs b/src/Faker/Provider/PearlJam.hs
--- a/src/Faker/Provider/PearlJam.hs
+++ b/src/Faker/Provider/PearlJam.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parsePearlJam :: FromJSON a => FakerSettings -> Value -> Parser a
 parsePearlJam settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   pearlJam <- faker .: "pearl_jam"
   pure pearlJam
 parsePearlJam settings val = fail $ "expected Object, but got " <> (show val)
 
 parsePearlJamField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parsePearlJamField settings txt val = do
   pearlJam <- parsePearlJam settings val
   field <- pearlJam .:? txt .!= mempty
   pure field
 
 parsePearlJamFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parsePearlJamFields settings txts val = do
   pearlJam <- parsePearlJam settings val
   helper pearlJam txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Phish.hs b/src/Faker/Provider/Phish.hs
--- a/src/Faker/Provider/Phish.hs
+++ b/src/Faker/Provider/Phish.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parsePhish :: FromJSON a => FakerSettings -> Value -> Parser a
 parsePhish settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   phish <- faker .: "phish"
   pure phish
 parsePhish settings val = fail $ "expected Object, but got " <> (show val)
 
 parsePhishField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parsePhishField settings txt val = do
   phish <- parsePhish settings val
   field <- phish .:? txt .!= mempty
   pure field
 
 parsePhishFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parsePhishFields settings txts val = do
   phish <- parsePhish settings val
   helper phish txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/PhoneNumber.hs b/src/Faker/Provider/PhoneNumber.hs
--- a/src/Faker/Provider/PhoneNumber.hs
+++ b/src/Faker/Provider/PhoneNumber.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parsePhoneNumber :: FromJSON a => FakerSettings -> Value -> Parser a
 parsePhoneNumber settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   phoneNumber <- faker .: "phone_number"
   pure phoneNumber
 parsePhoneNumber settings val = fail $ "expected Object, but got " <> (show val)
 
 parsePhoneNumberField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parsePhoneNumberField settings txt val = do
   phoneNumber <- parsePhoneNumber settings val
   field <- phoneNumber .:? txt .!= mempty
   pure field
 
 parsePhoneNumberFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parsePhoneNumberFields settings txts val = do
   phoneNumber <- parsePhoneNumber settings val
   helper phoneNumber txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -46,14 +47,14 @@
 
 parseCellPhone :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCellPhone settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   phoneNumber <- faker .: "cell_phone"
   pure phoneNumber
 parseCellPhone settings val = fail $ "expected Object, but got " <> (show val)
 
 parseCellPhoneField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseCellPhoneField settings txt val = do
   phoneNumber <- parsePhoneNumber settings val
   field <- phoneNumber .:? txt .!= mempty
@@ -62,7 +63,7 @@
 parseUnresolvedCellPhoneField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedCellPhoneField settings txt val = do
@@ -73,7 +74,7 @@
 parseUnresolvedPhoneNumberField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedPhoneNumberField settings txt val = do
@@ -97,7 +98,7 @@
 -- $(genProvider "cellPhone" "formats")
 parseCountryCode :: FromJSON a => FakerSettings -> Value -> Parser a
 parseCountryCode settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   countryCode <- faker .: "country_code"
   pure countryCode
@@ -108,11 +109,11 @@
 countryCodeProvider settings = fetchData settings PhoneNumber parseCountryCode
 
 resolvePhoneNumberText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolvePhoneNumberText = genericResolver' resolvePhoneNumberField
 
 resolvePhoneNumberField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolvePhoneNumberField settings field@"PhoneNumber.area_code" = let
     parser ::
      (FromJSON a, Monoid a) => FakerSettings -> Value -> Parser a
diff --git a/src/Faker/Provider/Pokemon.hs b/src/Faker/Provider/Pokemon.hs
--- a/src/Faker/Provider/Pokemon.hs
+++ b/src/Faker/Provider/Pokemon.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parsePokemon :: FromJSON a => FakerSettings -> Value -> Parser a
 parsePokemon settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   pokemon <- games .: "pokemon"
@@ -26,19 +27,19 @@
 parsePokemon settings val = fail $ "expected Object, but got " <> (show val)
 
 parsePokemonField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parsePokemonField settings txt val = do
   pokemon <- parsePokemon settings val
   field <- pokemon .:? txt .!= mempty
   pure field
 
 parsePokemonFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parsePokemonFields settings txts val = do
   pokemon <- parsePokemon settings val
   helper pokemon txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Prince.hs b/src/Faker/Provider/Prince.hs
--- a/src/Faker/Provider/Prince.hs
+++ b/src/Faker/Provider/Prince.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parsePrince :: FromJSON a => FakerSettings -> Value -> Parser a
 parsePrince settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   prince <- faker .: "prince"
   pure prince
 parsePrince settings val = fail $ "expected Object, but got " <> (show val)
 
 parsePrinceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parsePrinceField settings txt val = do
   prince <- parsePrince settings val
   field <- prince .:? txt .!= mempty
   pure field
 
 parsePrinceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parsePrinceFields settings txts val = do
   prince <- parsePrince settings val
   helper prince txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedPrinceFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedPrinceFields settings txts val = do
   prince <- parsePrince settings val
   helper prince txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -86,14 +87,3 @@
 $(genParser "prince" "band")
 
 $(genProvider "prince" "band")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/PrincessBride.hs b/src/Faker/Provider/PrincessBride.hs
--- a/src/Faker/Provider/PrincessBride.hs
+++ b/src/Faker/Provider/PrincessBride.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parsePrincessBride :: FromJSON a => FakerSettings -> Value -> Parser a
 parsePrincessBride settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   princessBride <- faker .: "princess_bride"
   pure princessBride
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parsePrincessBrideField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parsePrincessBrideField settings txt val = do
   princessBride <- parsePrincessBride settings val
   field <- princessBride .:? txt .!= mempty
   pure field
 
 parsePrincessBrideFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parsePrincessBrideFields settings txts val = do
   princessBride <- parsePrincessBride settings val
   helper princessBride txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/ProgrammingLanguage.hs b/src/Faker/Provider/ProgrammingLanguage.hs
--- a/src/Faker/Provider/ProgrammingLanguage.hs
+++ b/src/Faker/Provider/ProgrammingLanguage.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseProgrammingLauguage :: FromJSON a => FakerSettings -> Value -> Parser a
 parseProgrammingLauguage settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   programmingLauguage <- faker .: "programming_language"
   pure programmingLauguage
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseProgrammingLauguageField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseProgrammingLauguageField settings txt val = do
   programmingLauguage <- parseProgrammingLauguage settings val
   field <- programmingLauguage .:? txt .!= mempty
   pure field
 
 parseProgrammingLauguageFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseProgrammingLauguageFields settings txts val = do
   programmingLauguage <- parseProgrammingLauguage settings val
   helper programmingLauguage txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Quote.hs b/src/Faker/Provider/Quote.hs
--- a/src/Faker/Provider/Quote.hs
+++ b/src/Faker/Provider/Quote.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseQuote :: FromJSON a => FakerSettings -> Value -> Parser a
 parseQuote settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   quote <- faker .: "quote"
   pure quote
 parseQuote settings val = fail $ "expected Object, but got " <> (show val)
 
 parseQuoteField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseQuoteField settings txt val = do
   quote <- parseQuote settings val
   field <- quote .:? txt .!= mempty
   pure field
 
 parseQuoteFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseQuoteFields settings txts val = do
   quote <- parseQuote settings val
   helper quote txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Rajnikanth.hs b/src/Faker/Provider/Rajnikanth.hs
--- a/src/Faker/Provider/Rajnikanth.hs
+++ b/src/Faker/Provider/Rajnikanth.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseRajnikanth :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRajnikanth settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   rajnikanth <- faker .: "rajnikanth"
   pure rajnikanth
 parseRajnikanth settings val = fail $ "expected Object, but got " <> (show val)
 
 parseRajnikanthField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRajnikanthField settings txt val = do
   rajnikanth <- parseRajnikanth settings val
   field <- rajnikanth .:? txt .!= mempty
   pure field
 
 parseRajnikanthFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRajnikanthFields settings txts val = do
   rajnikanth <- parseRajnikanth settings val
   helper rajnikanth txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Relationship.hs b/src/Faker/Provider/Relationship.hs
--- a/src/Faker/Provider/Relationship.hs
+++ b/src/Faker/Provider/Relationship.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseRelationship :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRelationship settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   relationship <- faker .: "relationship"
   pure relationship
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseRelationshipField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRelationshipField settings txt val = do
   relationship <- parseRelationship settings val
   field <- relationship .:? txt .!= mempty
   pure field
 
 parseRelationshipFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRelationshipFields settings txts val = do
   relationship <- parseRelationship settings val
   helper relationship txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Restaurant.hs b/src/Faker/Provider/Restaurant.hs
--- a/src/Faker/Provider/Restaurant.hs
+++ b/src/Faker/Provider/Restaurant.hs
@@ -17,28 +17,29 @@
 import Faker.Provider.Name (resolveNameField)
 import Language.Haskell.TH
 
+
 parseRestaurant :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRestaurant settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   restaurant <- faker .: "restaurant"
   pure restaurant
 parseRestaurant settings val = fail $ "expected Object, but got " <> (show val)
 
 parseRestaurantField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRestaurantField settings txt val = do
   restaurant <- parseRestaurant settings val
   field <- restaurant .:? txt .!= mempty
   pure field
 
 parseRestaurantFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRestaurantFields settings txts val = do
   restaurant <- parseRestaurant settings val
   helper restaurant txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,7 +49,7 @@
 parseUnresolvedRestaurantField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedRestaurantField settings txt val = do
@@ -81,11 +82,11 @@
 $(genProviderUnresolved "restaurant" "name")
 
 resolveRestaurantText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveRestaurantText = genericResolver' resolveRestaurantField
 
 resolveRestaurantField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveRestaurantField settings field@"name_prefix" =
   cachedRandomUnresolvedVec
     "restaurant"
diff --git a/src/Faker/Provider/RickAndMorty.hs b/src/Faker/Provider/RickAndMorty.hs
--- a/src/Faker/Provider/RickAndMorty.hs
+++ b/src/Faker/Provider/RickAndMorty.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseRickAndMorty :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRickAndMorty settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   rickAndMorty <- faker .: "rick_and_morty"
   pure rickAndMorty
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseRickAndMortyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRickAndMortyField settings txt val = do
   rickAndMorty <- parseRickAndMorty settings val
   field <- rickAndMorty .:? txt .!= mempty
   pure field
 
 parseRickAndMortyFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRickAndMortyFields settings txts val = do
   rickAndMorty <- parseRickAndMorty settings val
   helper rickAndMorty txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/RockBand.hs b/src/Faker/Provider/RockBand.hs
--- a/src/Faker/Provider/RockBand.hs
+++ b/src/Faker/Provider/RockBand.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseRockBand :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRockBand settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   rockBand <- faker .: "rock_band"
   pure rockBand
 parseRockBand settings val = fail $ "expected Object, but got " <> (show val)
 
 parseRockBandField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRockBandField settings txt val = do
   rockBand <- parseRockBand settings val
   field <- rockBand .:? txt .!= mempty
   pure field
 
 parseRockBandFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRockBandFields settings txts val = do
   rockBand <- parseRockBand settings val
   helper rockBand txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Room.hs b/src/Faker/Provider/Room.hs
--- a/src/Faker/Provider/Room.hs
+++ b/src/Faker/Provider/Room.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseRoom :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRoom settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   room <- faker .: "room"
   pure room
 parseRoom settings val = fail $ "expected Object, but got " <> (show val)
 
 parseRoomField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRoomField settings txt val = do
   room <- parseRoom settings val
   field <- room .:? txt .!= mempty
   pure field
 
 parseRoomFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRoomFields settings txts val = do
   room <- parseRoom settings val
   helper room txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedRoomFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedRoomFields settings txts val = do
   room <- parseRoom settings val
   helper room txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -82,11 +83,3 @@
 $(genParser "room" "quotes")
 
 $(genProvider "room" "quotes")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Rupaul.hs b/src/Faker/Provider/Rupaul.hs
--- a/src/Faker/Provider/Rupaul.hs
+++ b/src/Faker/Provider/Rupaul.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseRupaul :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRupaul settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   rupaul <- faker .: "rupaul"
   pure rupaul
 parseRupaul settings val = fail $ "expected Object, but got " <> (show val)
 
 parseRupaulField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRupaulField settings txt val = do
   rupaul <- parseRupaul settings val
   field <- rupaul .:? txt .!= mempty
   pure field
 
 parseRupaulFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRupaulFields settings txts val = do
   rupaul <- parseRupaul settings val
   helper rupaul txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Rush.hs b/src/Faker/Provider/Rush.hs
--- a/src/Faker/Provider/Rush.hs
+++ b/src/Faker/Provider/Rush.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseRush :: FromJSON a => FakerSettings -> Value -> Parser a
 parseRush settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   rush <- faker .: "rush"
   pure rush
 parseRush settings val = fail $ "expected Object, but got " <> (show val)
 
 parseRushField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseRushField settings txt val = do
   rush <- parseRush settings val
   field <- rush .:? txt .!= mempty
   pure field
 
 parseRushFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseRushFields settings txts val = do
   rush <- parseRush settings val
   helper rush txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedRushFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedRushFields settings txts val = do
   rush <- parseRush settings val
   helper rush txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -76,14 +77,3 @@
 $(genParser "rush" "albums")
 
 $(genProvider "rush" "albums")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Science.hs b/src/Faker/Provider/Science.hs
--- a/src/Faker/Provider/Science.hs
+++ b/src/Faker/Provider/Science.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseScience :: FromJSON a => FakerSettings -> Value -> Parser a
 parseScience settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   science <- faker .: "science"
   pure science
 parseScience settings val = fail $ "expected Object, but got " <> (show val)
 
 parseScienceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseScienceField settings txt val = do
   science <- parseScience settings val
   field <- science .:? txt .!= mempty
   pure field
 
 parseScienceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseScienceFields settings txts val = do
   science <- parseScience settings val
   helper science txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Seinfeld.hs b/src/Faker/Provider/Seinfeld.hs
--- a/src/Faker/Provider/Seinfeld.hs
+++ b/src/Faker/Provider/Seinfeld.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSeinfeld :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSeinfeld settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   seinfeld <- faker .: "seinfeld"
   pure seinfeld
 parseSeinfeld settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSeinfeldField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSeinfeldField settings txt val = do
   seinfeld <- parseSeinfeld settings val
   field <- seinfeld .:? txt .!= mempty
   pure field
 
 parseSeinfeldFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSeinfeldFields settings txts val = do
   seinfeld <- parseSeinfeld settings val
   helper seinfeld txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Shakespeare.hs b/src/Faker/Provider/Shakespeare.hs
--- a/src/Faker/Provider/Shakespeare.hs
+++ b/src/Faker/Provider/Shakespeare.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseShakespeare :: FromJSON a => FakerSettings -> Value -> Parser a
 parseShakespeare settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   shakespeare <- faker .: "shakespeare"
   pure shakespeare
 parseShakespeare settings val = fail $ "expected Object, but got " <> (show val)
 
 parseShakespeareField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseShakespeareField settings txt val = do
   shakespeare <- parseShakespeare settings val
   field <- shakespeare .:? txt .!= mempty
   pure field
 
 parseShakespeareFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseShakespeareFields settings txts val = do
   shakespeare <- parseShakespeare settings val
   helper shakespeare txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Show.hs b/src/Faker/Provider/Show.hs
--- a/src/Faker/Provider/Show.hs
+++ b/src/Faker/Provider/Show.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseShow :: FromJSON a => FakerSettings -> Value -> Parser a
 parseShow settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   show <- faker .: "show"
   pure show
 parseShow settings val = fail $ "expected Object, but got " <> (show val)
 
 parseShowField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseShowField settings txt val = do
   show <- parseShow settings val
   field <- show .:? txt .!= mempty
   pure field
 
 parseShowFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseShowFields settings txts val = do
   show <- parseShow settings val
   helper show txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/SiliconValley.hs b/src/Faker/Provider/SiliconValley.hs
--- a/src/Faker/Provider/SiliconValley.hs
+++ b/src/Faker/Provider/SiliconValley.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSiliconValley :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSiliconValley settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   siliconValley <- faker .: "silicon_valley"
   pure siliconValley
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseSiliconValleyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSiliconValleyField settings txt val = do
   siliconValley <- parseSiliconValley settings val
   field <- siliconValley .:? txt .!= mempty
   pure field
 
 parseSiliconValleyFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSiliconValleyFields settings txts val = do
   siliconValley <- parseSiliconValley settings val
   helper siliconValley txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Simpsons.hs b/src/Faker/Provider/Simpsons.hs
--- a/src/Faker/Provider/Simpsons.hs
+++ b/src/Faker/Provider/Simpsons.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSimpsons :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSimpsons settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   simpsons <- faker .: "simpsons"
   pure simpsons
 parseSimpsons settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSimpsonsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSimpsonsField settings txt val = do
   simpsons <- parseSimpsons settings val
   field <- simpsons .:? txt .!= mempty
   pure field
 
 parseSimpsonsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSimpsonsFields settings txts val = do
   simpsons <- parseSimpsons settings val
   helper simpsons txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/SlackEmoji.hs b/src/Faker/Provider/SlackEmoji.hs
--- a/src/Faker/Provider/SlackEmoji.hs
+++ b/src/Faker/Provider/SlackEmoji.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSlackEmoji :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSlackEmoji settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   slackEmoji <- faker .: "slack_emoji"
   pure slackEmoji
 parseSlackEmoji settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSlackEmojiField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSlackEmojiField settings txt val = do
   slackEmoji <- parseSlackEmoji settings val
   field <- slackEmoji .:? txt .!= mempty
   pure field
 
 parseSlackEmojiFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSlackEmojiFields settings txts val = do
   slackEmoji <- parseSlackEmoji settings val
   helper slackEmoji txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedSlackEmojiField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedSlackEmojiField settings txt val = do
@@ -92,11 +93,11 @@
 $(genProviderUnresolved "slackEmoji" "emoji")
 
 resolveSlackEmojiText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveSlackEmojiText = genericResolver' resolveSlackEmojiField
 
 resolveSlackEmojiField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveSlackEmojiField settings field@"people" =
   cachedRandomVec "slackEmoji" field slackEmojiPeopleProvider settings
 resolveSlackEmojiField settings field@"nature" =
diff --git a/src/Faker/Provider/SonicTheHedgehog.hs b/src/Faker/Provider/SonicTheHedgehog.hs
--- a/src/Faker/Provider/SonicTheHedgehog.hs
+++ b/src/Faker/Provider/SonicTheHedgehog.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSonicTheHedgehog :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSonicTheHedgehog settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   sonicTheHedgehog <- games .: "sonic_the_hedgehog"
@@ -27,19 +28,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseSonicTheHedgehogField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSonicTheHedgehogField settings txt val = do
   sonicTheHedgehog <- parseSonicTheHedgehog settings val
   field <- sonicTheHedgehog .:? txt .!= mempty
   pure field
 
 parseSonicTheHedgehogFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSonicTheHedgehogFields settings txts val = do
   sonicTheHedgehog <- parseSonicTheHedgehog settings val
   helper sonicTheHedgehog txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Source.hs b/src/Faker/Provider/Source.hs
--- a/src/Faker/Provider/Source.hs
+++ b/src/Faker/Provider/Source.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSource :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSource settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   source <- faker .: "source"
   pure source
 parseSource settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSourceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSourceField settings txt val = do
   source <- parseSource settings val
   field <- source .:? txt .!= mempty
   pure field
 
 parseSourceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSourceFields settings txts val = do
   source <- parseSource settings val
   helper source txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/SouthPark.hs b/src/Faker/Provider/SouthPark.hs
--- a/src/Faker/Provider/SouthPark.hs
+++ b/src/Faker/Provider/SouthPark.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSouthPark :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSouthPark settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   southPark <- faker .: "south_park"
   pure southPark
 parseSouthPark settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSouthParkField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSouthParkField settings txt val = do
   southPark <- parseSouthPark settings val
   field <- southPark .:? txt .!= mempty
   pure field
 
 parseSouthParkFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSouthParkFields settings txts val = do
   southPark <- parseSouthPark settings val
   helper southPark txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Space.hs b/src/Faker/Provider/Space.hs
--- a/src/Faker/Provider/Space.hs
+++ b/src/Faker/Provider/Space.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSpace :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSpace settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   space <- faker .: "space"
   pure space
 parseSpace settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSpaceField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSpaceField settings txt val = do
   space <- parseSpace settings val
   field <- space .:? txt .!= mempty
   pure field
 
 parseSpaceFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSpaceFields settings txts val = do
   space <- parseSpace settings val
   helper space txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/StarTrek.hs b/src/Faker/Provider/StarTrek.hs
--- a/src/Faker/Provider/StarTrek.hs
+++ b/src/Faker/Provider/StarTrek.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseStarTrek :: FromJSON a => FakerSettings -> Value -> Parser a
 parseStarTrek settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   starTrek <- faker .: "star_trek"
   pure starTrek
 parseStarTrek settings val = fail $ "expected Object, but got " <> (show val)
 
 parseStarTrekField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseStarTrekField settings txt val = do
   starTrek <- parseStarTrek settings val
   field <- starTrek .:? txt .!= mempty
   pure field
 
 parseStarTrekFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseStarTrekFields settings txts val = do
   starTrek <- parseStarTrek settings val
   helper starTrek txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/StarWars.hs b/src/Faker/Provider/StarWars.hs
--- a/src/Faker/Provider/StarWars.hs
+++ b/src/Faker/Provider/StarWars.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseStarWars :: FromJSON a => FakerSettings -> Value -> Parser a
 parseStarWars settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   starWars <- faker .: "star_wars"
   pure starWars
 parseStarWars settings val = fail $ "expected Object, but got " <> (show val)
 
 parseStarWarsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseStarWarsField settings txt val = do
   starWars <- parseStarWars settings val
   field <- starWars .:? txt .!= mempty
   pure field
 
 parseStarWarsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseStarWarsFields settings txts val = do
   starWars <- parseStarWars settings val
   helper starWars txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedStarWarsField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedStarWarsField settings txt val = do
@@ -92,11 +93,11 @@
 $(genProviderUnresolved "starWars" "call_sign")
 
 resolveStarWarsText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveStarWarsText = genericResolver' resolveStarWarsField
 
 resolveStarWarsField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveStarWarsField settings field@"call_number" =
   cachedRandomUnresolvedVec
     "starWars"
diff --git a/src/Faker/Provider/Stargate.hs b/src/Faker/Provider/Stargate.hs
--- a/src/Faker/Provider/Stargate.hs
+++ b/src/Faker/Provider/Stargate.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseStargate :: FromJSON a => FakerSettings -> Value -> Parser a
 parseStargate settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   stargate <- faker .: "stargate"
   pure stargate
 parseStargate settings val = fail $ "expected Object, but got " <> (show val)
 
 parseStargateField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseStargateField settings txt val = do
   stargate <- parseStargate settings val
   field <- stargate .:? txt .!= mempty
   pure field
 
 parseStargateFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseStargateFields settings txts val = do
   stargate <- parseStargate settings val
   helper stargate txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/StrangerThings.hs b/src/Faker/Provider/StrangerThings.hs
--- a/src/Faker/Provider/StrangerThings.hs
+++ b/src/Faker/Provider/StrangerThings.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseStrangerThings :: FromJSON a => FakerSettings -> Value -> Parser a
 parseStrangerThings settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   strangerThings <- faker .: "stranger_things"
   pure strangerThings
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseStrangerThingsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseStrangerThingsField settings txt val = do
   strangerThings <- parseStrangerThings settings val
   field <- strangerThings .:? txt .!= mempty
   pure field
 
 parseStrangerThingsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseStrangerThingsFields settings txts val = do
   strangerThings <- parseStrangerThings settings val
   helper strangerThings txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/StreetFighter.hs b/src/Faker/Provider/StreetFighter.hs
--- a/src/Faker/Provider/StreetFighter.hs
+++ b/src/Faker/Provider/StreetFighter.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseStreetFighter :: FromJSON a => FakerSettings -> Value -> Parser a
 parseStreetFighter settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   streetFighter <- games .: "street_fighter"
@@ -24,19 +25,19 @@
 parseStreetFighter settings val = fail $ "expected Object, but got " <> (show val)
 
 parseStreetFighterField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseStreetFighterField settings txt val = do
   streetFighter <- parseStreetFighter settings val
   field <- streetFighter .:? txt .!= mempty
   pure field
 
 parseStreetFighterFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseStreetFighterFields settings txts val = do
   streetFighter <- parseStreetFighter settings val
   helper streetFighter txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -49,14 +50,14 @@
 parseUnresolvedStreetFighterFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedStreetFighterFields settings txts val = do
   streetFighter <- parseStreetFighter settings val
   helper streetFighter txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -87,14 +88,3 @@
 $(genParser "streetFighter" "moves")
 
 $(genProvider "streetFighter" "moves")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/StudioGhibli.hs b/src/Faker/Provider/StudioGhibli.hs
--- a/src/Faker/Provider/StudioGhibli.hs
+++ b/src/Faker/Provider/StudioGhibli.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseStudioGhibli :: FromJSON a => FakerSettings -> Value -> Parser a
 parseStudioGhibli settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   studioGhibli <- faker .: "studio_ghibli"
   pure studioGhibli
 parseStudioGhibli settings val = fail $ "expected Object, but got " <> (show val)
 
 parseStudioGhibliField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseStudioGhibliField settings txt val = do
   studioGhibli <- parseStudioGhibli settings val
   field <- studioGhibli .:? txt .!= mempty
   pure field
 
 parseStudioGhibliFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseStudioGhibliFields settings txts val = do
   studioGhibli <- parseStudioGhibli settings val
   helper studioGhibli txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedStudioGhibliFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedStudioGhibliFields settings txts val = do
   studioGhibli <- parseStudioGhibli settings val
   helper studioGhibli txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -81,14 +82,3 @@
 $(genParser "studioGhibli" "movies")
 
 $(genProvider "studioGhibli" "movies")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/Subscription.hs b/src/Faker/Provider/Subscription.hs
--- a/src/Faker/Provider/Subscription.hs
+++ b/src/Faker/Provider/Subscription.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSubscription :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSubscription settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   subscription <- faker .: "subscription"
   pure subscription
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseSubscriptionField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSubscriptionField settings txt val = do
   subscription <- parseSubscription settings val
   field <- subscription .:? txt .!= mempty
   pure field
 
 parseSubscriptionFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSubscriptionFields settings txts val = do
   subscription <- parseSubscription settings val
   helper subscription txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Suits.hs b/src/Faker/Provider/Suits.hs
--- a/src/Faker/Provider/Suits.hs
+++ b/src/Faker/Provider/Suits.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSuits :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSuits settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   suits <- faker .: "suits"
   pure suits
 parseSuits settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSuitsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSuitsField settings txt val = do
   suits <- parseSuits settings val
   field <- suits .:? txt .!= mempty
   pure field
 
 parseSuitsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSuitsFields settings txts val = do
   suits <- parseSuits settings val
   helper suits txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -53,14 +54,3 @@
 $(genParser "suits" "quotes")
 
 $(genProvider "suits" "quotes")
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/SuperMario.hs b/src/Faker/Provider/SuperMario.hs
--- a/src/Faker/Provider/SuperMario.hs
+++ b/src/Faker/Provider/SuperMario.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSuperMario :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSuperMario settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   superMario <- games .: "super_mario"
@@ -24,19 +25,19 @@
 parseSuperMario settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSuperMarioField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSuperMarioField settings txt val = do
   superMario <- parseSuperMario settings val
   field <- superMario .:? txt .!= mempty
   pure field
 
 parseSuperMarioFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSuperMarioFields settings txts val = do
   superMario <- parseSuperMario settings val
   helper superMario txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -49,14 +50,14 @@
 parseUnresolvedSuperMarioFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedSuperMarioFields settings txts val = do
   superMario <- parseSuperMario settings val
   helper superMario txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
diff --git a/src/Faker/Provider/SuperSmashBros.hs b/src/Faker/Provider/SuperSmashBros.hs
--- a/src/Faker/Provider/SuperSmashBros.hs
+++ b/src/Faker/Provider/SuperSmashBros.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSuperSmashBros :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSuperSmashBros settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   superSmashBros <- games .: "super_smash_bros"
@@ -27,19 +28,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseSuperSmashBrosField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSuperSmashBrosField settings txt val = do
   superSmashBros <- parseSuperSmashBros settings val
   field <- superSmashBros .:? txt .!= mempty
   pure field
 
 parseSuperSmashBrosFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSuperSmashBrosFields settings txts val = do
   superSmashBros <- parseSuperSmashBros settings val
   helper superSmashBros txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Superhero.hs b/src/Faker/Provider/Superhero.hs
--- a/src/Faker/Provider/Superhero.hs
+++ b/src/Faker/Provider/Superhero.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSuperhero :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSuperhero settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   superhero <- faker .: "superhero"
   pure superhero
 parseSuperhero settings val = fail $ "expected Object, but got " <> (show val)
 
 parseSuperheroField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSuperheroField settings txt val = do
   superhero <- parseSuperhero settings val
   field <- superhero .:? txt .!= mempty
   pure field
 
 parseSuperheroFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSuperheroFields settings txts val = do
   superhero <- parseSuperhero settings val
   helper superhero txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedSuperheroField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedSuperheroField settings txt val = do
@@ -76,11 +77,11 @@
 $(genProviderUnresolved "superhero" "name")
 
 resolveSuperheroText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveSuperheroText settings txt = genericResolver settings txt resolveSuperheroField
 
 resolveSuperheroField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveSuperheroField settings field@"Superhero.prefix" =
   cachedRandomVec "superhero" field superheroPrefixProvider settings
 resolveSuperheroField settings field@"Superhero.suffix" =
diff --git a/src/Faker/Provider/SwordArtOnline.hs b/src/Faker/Provider/SwordArtOnline.hs
--- a/src/Faker/Provider/SwordArtOnline.hs
+++ b/src/Faker/Provider/SwordArtOnline.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseSwordArtOnline :: FromJSON a => FakerSettings -> Value -> Parser a
 parseSwordArtOnline settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   swordArtOnline <- faker .: "sword_art_online"
   pure swordArtOnline
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseSwordArtOnlineField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseSwordArtOnlineField settings txt val = do
   swordArtOnline <- parseSwordArtOnline settings val
   field <- swordArtOnline .:? txt .!= mempty
   pure field
 
 parseSwordArtOnlineFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseSwordArtOnlineFields settings txts val = do
   swordArtOnline <- parseSwordArtOnline settings val
   helper swordArtOnline txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Tea.hs b/src/Faker/Provider/Tea.hs
--- a/src/Faker/Provider/Tea.hs
+++ b/src/Faker/Provider/Tea.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTea :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTea settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   tea <- faker .: "tea"
   pure tea
 parseTea settings val = fail $ "expected Object, but got " <> (show val)
 
 parseTeaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTeaField settings txt val = do
   tea <- parseTea settings val
   field <- tea .:? txt .!= mempty
   pure field
 
 parseTeaFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTeaFields settings txts val = do
   tea <- parseTea settings val
   helper tea txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedTeaFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedTeaFields settings txts val = do
   tea <- parseTea settings val
   helper tea txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
diff --git a/src/Faker/Provider/Team.hs b/src/Faker/Provider/Team.hs
--- a/src/Faker/Provider/Team.hs
+++ b/src/Faker/Provider/Team.hs
@@ -17,28 +17,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTeam :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTeam settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   team <- faker .: "team"
   pure team
 parseTeam settings val = fail $ "expected Object, but got " <> (show val)
 
 parseTeamField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTeamField settings txt val = do
   team <- parseTeam settings val
   field <- team .:? txt .!= mempty
   pure field
 
 parseTeamFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTeamFields settings txts val = do
   team <- parseTeam settings val
   helper team txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,7 +49,7 @@
 parseUnresolvedTeamField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedTeamField settings txt val = do
@@ -97,10 +98,10 @@
 
 $(genProvider "team" "team_prefix")
 
-resolveTeamText :: (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+resolveTeamText :: (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveTeamText = genericResolver' resolveTeamField
 
-resolveTeamField :: (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+resolveTeamField :: (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveTeamField settings field@"creature" =
   cachedRandomVec "team" field teamCreatureProvider settings
 resolveTeamField settings "Address.state" =
diff --git a/src/Faker/Provider/TheExpanse.hs b/src/Faker/Provider/TheExpanse.hs
--- a/src/Faker/Provider/TheExpanse.hs
+++ b/src/Faker/Provider/TheExpanse.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTheExpanse :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTheExpanse settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   theExpanse <- faker .: "the_expanse"
   pure theExpanse
 parseTheExpanse settings val = fail $ "expected Object, but got " <> (show val)
 
 parseTheExpanseField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTheExpanseField settings txt val = do
   theExpanse <- parseTheExpanse settings val
   field <- theExpanse .:? txt .!= mempty
   pure field
 
 parseTheExpanseFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTheExpanseFields settings txts val = do
   theExpanse <- parseTheExpanse settings val
   helper theExpanse txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/TheItCrowd.hs b/src/Faker/Provider/TheItCrowd.hs
--- a/src/Faker/Provider/TheItCrowd.hs
+++ b/src/Faker/Provider/TheItCrowd.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTheItCrowd :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTheItCrowd settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   theItCrowd <- faker .: "the_it_crowd"
   pure theItCrowd
 parseTheItCrowd settings val = fail $ "expected Object, but got " <> (show val)
 
 parseTheItCrowdField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTheItCrowdField settings txt val = do
   theItCrowd <- parseTheItCrowd settings val
   field <- theItCrowd .:? txt .!= mempty
   pure field
 
 parseTheItCrowdFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTheItCrowdFields settings txts val = do
   theItCrowd <- parseTheItCrowd settings val
   helper theItCrowd txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/TheThickOfIt.hs b/src/Faker/Provider/TheThickOfIt.hs
--- a/src/Faker/Provider/TheThickOfIt.hs
+++ b/src/Faker/Provider/TheThickOfIt.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTheThickOfIt :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTheThickOfIt settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   theThickOfIt <- faker .: "the_thick_of_it"
   pure theThickOfIt
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseTheThickOfItField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTheThickOfItField settings txt val = do
   theThickOfIt <- parseTheThickOfIt settings val
   field <- theThickOfIt .:? txt .!= mempty
   pure field
 
 parseTheThickOfItFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTheThickOfItFields settings txts val = do
   theThickOfIt <- parseTheThickOfIt settings val
   helper theThickOfIt txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Tolkien.hs b/src/Faker/Provider/Tolkien.hs
--- a/src/Faker/Provider/Tolkien.hs
+++ b/src/Faker/Provider/Tolkien.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTolkien :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTolkien settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   tolkien <- faker .: "tolkien"
   pure tolkien
 parseTolkien settings val = fail $ "expected Object, but got " <> (show val)
 
 parseTolkienField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTolkienField settings txt val = do
   tolkien <- parseTolkien settings val
   field <- tolkien .:? txt .!= mempty
   pure field
 
 parseTolkienFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTolkienFields settings txts val = do
   tolkien <- parseTolkien settings val
   helper tolkien txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedTolkienFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedTolkienFields settings txts val = do
   tolkien <- parseTolkien settings val
   helper tolkien txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
diff --git a/src/Faker/Provider/Touhou.hs b/src/Faker/Provider/Touhou.hs
--- a/src/Faker/Provider/Touhou.hs
+++ b/src/Faker/Provider/Touhou.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTouhou :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTouhou settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   touhou <- games .: "touhou"
@@ -24,19 +25,19 @@
 parseTouhou settings val = fail $ "expected Object, but got " <> (show val)
 
 parseTouhouField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTouhouField settings txt val = do
   touhou <- parseTouhou settings val
   field <- touhou .:? txt .!= mempty
   pure field
 
 parseTouhouFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTouhouFields settings txts val = do
   touhou <- parseTouhou settings val
   helper touhou txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -49,14 +50,14 @@
 parseUnresolvedTouhouFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedTouhouFields settings txts val = do
   touhou <- parseTouhou settings val
   helper touhou txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
diff --git a/src/Faker/Provider/TwinPeaks.hs b/src/Faker/Provider/TwinPeaks.hs
--- a/src/Faker/Provider/TwinPeaks.hs
+++ b/src/Faker/Provider/TwinPeaks.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseTwinPeaks :: FromJSON a => FakerSettings -> Value -> Parser a
 parseTwinPeaks settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   twinPeaks <- faker .: "twin_peaks"
   pure twinPeaks
 parseTwinPeaks settings val = fail $ "expected Object, but got " <> (show val)
 
 parseTwinPeaksField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseTwinPeaksField settings txt val = do
   twinPeaks <- parseTwinPeaks settings val
   field <- twinPeaks .:? txt .!= mempty
   pure field
 
 parseTwinPeaksFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseTwinPeaksFields settings txts val = do
   twinPeaks <- parseTwinPeaks settings val
   helper twinPeaks txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/UmphreysMcgee.hs b/src/Faker/Provider/UmphreysMcgee.hs
--- a/src/Faker/Provider/UmphreysMcgee.hs
+++ b/src/Faker/Provider/UmphreysMcgee.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseUmphreysMcgee :: FromJSON a => FakerSettings -> Value -> Parser a
 parseUmphreysMcgee settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   umphreysMcgee <- faker .: "umphreys_mcgee"
   pure umphreysMcgee
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseUmphreysMcgeeField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseUmphreysMcgeeField settings txt val = do
   umphreysMcgee <- parseUmphreysMcgee settings val
   field <- umphreysMcgee .:? txt .!= mempty
   pure field
 
 parseUmphreysMcgeeFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseUmphreysMcgeeFields settings txts val = do
   umphreysMcgee <- parseUmphreysMcgee settings val
   helper umphreysMcgee txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/University.hs b/src/Faker/Provider/University.hs
--- a/src/Faker/Provider/University.hs
+++ b/src/Faker/Provider/University.hs
@@ -18,28 +18,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseUniversity :: FromJSON a => FakerSettings -> Value -> Parser a
 parseUniversity settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   university <- faker .: "university"
   pure university
 parseUniversity settings val = fail $ "expected Object, but got " <> (show val)
 
 parseUniversityField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseUniversityField settings txt val = do
   university <- parseUniversity settings val
   field <- university .:? txt .!= mempty
   pure field
 
 parseUniversityFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseUniversityFields settings txts val = do
   university <- parseUniversity settings val
   helper university txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -49,7 +50,7 @@
 parseUnresolvedUniversityField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedUniversityField settings txt val = do
@@ -76,11 +77,11 @@
 
 
 resolveUniversityText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveUniversityText = genericResolver' resolveUniversityField
 
 resolveUniversityField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveUniversityField settings "University.prefix" =
   cachedRandomVec "university" "prefix" universityPrefixProvider settings
 resolveUniversityField settings "University.suffix" =
diff --git a/src/Faker/Provider/VForVendetta.hs b/src/Faker/Provider/VForVendetta.hs
--- a/src/Faker/Provider/VForVendetta.hs
+++ b/src/Faker/Provider/VForVendetta.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseVForVendetta :: FromJSON a => FakerSettings -> Value -> Parser a
 parseVForVendetta settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   vForVendetta <- faker .: "v_for_vendetta"
   pure vForVendetta
@@ -26,19 +27,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseVForVendettaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseVForVendettaField settings txt val = do
   vForVendetta <- parseVForVendetta settings val
   field <- vForVendetta .:? txt .!= mempty
   pure field
 
 parseVForVendettaFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseVForVendettaFields settings txts val = do
   vForVendetta <- parseVForVendetta settings val
   helper vForVendetta txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Vehicle.hs b/src/Faker/Provider/Vehicle.hs
--- a/src/Faker/Provider/Vehicle.hs
+++ b/src/Faker/Provider/Vehicle.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseVehicle :: FromJSON a => FakerSettings -> Value -> Parser a
 parseVehicle settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   vehicle <- faker .: "vehicle"
   pure vehicle
 parseVehicle settings val = fail $ "expected Object, but got " <> (show val)
 
 parseVehicleField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseVehicleField settings txt val = do
   vehicle <- parseVehicle settings val
   field <- vehicle .:? txt .!= mempty
   pure field
 
 parseVehicleFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseVehicleFields settings txts val = do
   vehicle <- parseVehicle settings val
   helper vehicle txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -47,7 +48,7 @@
 parseUnresolvedVehicleField ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> Text
+  -> AesonKey
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedVehicleField settings txt val = do
@@ -116,11 +117,11 @@
 vehicleLicensePlateProvider _ = pure $ pure $ pure "???-###"
 
 resolveVehicleText ::
-     (MonadIO m, MonadThrow m) => FakerSettings -> Text -> m Text
+     (MonadIO m, MonadThrow m) => FakerSettings -> AesonKey -> m Text
 resolveVehicleText settings txt = genericResolver settings txt resolveVehicleField
 
 resolveVehicleField ::
-     (MonadThrow m, MonadIO m) => FakerSettings -> Text -> m Text
+     (MonadThrow m, MonadIO m) => FakerSettings -> AesonKey -> m Text
 resolveVehicleField settings str = throwM $ InvalidField "vehicle" str
 
 $(genParsers "vehicle" ["models_by_make", "BMW"])
diff --git a/src/Faker/Provider/VentureBros.hs b/src/Faker/Provider/VentureBros.hs
--- a/src/Faker/Provider/VentureBros.hs
+++ b/src/Faker/Provider/VentureBros.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseVentureBros :: FromJSON a => FakerSettings -> Value -> Parser a
 parseVentureBros settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   ventureBros <- faker .: "venture_bros"
   pure ventureBros
 parseVentureBros settings val = fail $ "expected Object, but got " <> (show val)
 
 parseVentureBrosField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseVentureBrosField settings txt val = do
   ventureBros <- parseVentureBros settings val
   field <- ventureBros .:? txt .!= mempty
   pure field
 
 parseVentureBrosFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseVentureBrosFields settings txts val = do
   ventureBros <- parseVentureBros settings val
   helper ventureBros txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Verbs.hs b/src/Faker/Provider/Verbs.hs
--- a/src/Faker/Provider/Verbs.hs
+++ b/src/Faker/Provider/Verbs.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseVerbs :: FromJSON a => FakerSettings -> Value -> Parser a
 parseVerbs settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   verbs <- faker .: "verbs"
   pure verbs
 parseVerbs settings val = fail $ "expected Object, but got " <> (show val)
 
 parseVerbsField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseVerbsField settings txt val = do
   verbs <- parseVerbs settings val
   field <- verbs .:? txt .!= mempty
   pure field
 
 parseVerbsFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseVerbsFields settings txts val = do
   verbs <- parseVerbs settings val
   helper verbs txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Volleyball.hs b/src/Faker/Provider/Volleyball.hs
--- a/src/Faker/Provider/Volleyball.hs
+++ b/src/Faker/Provider/Volleyball.hs
@@ -14,28 +14,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseVolleyball :: FromJSON a => FakerSettings -> Value -> Parser a
 parseVolleyball settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   volleyball <- faker .: "volleyball"
   pure volleyball
 parseVolleyball settings val = fail $ "expected Object, but got " <> (show val)
 
 parseVolleyballField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseVolleyballField settings txt val = do
   volleyball <- parseVolleyball settings val
   field <- volleyball .:? txt .!= mempty
   pure field
 
 parseVolleyballFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseVolleyballFields settings txts val = do
   volleyball <- parseVolleyball settings val
   helper volleyball txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
@@ -48,14 +49,14 @@
 parseUnresolvedVolleyballFields ::
      (FromJSON a, Monoid a)
   => FakerSettings
-  -> [Text]
+  -> [AesonKey]
   -> Value
   -> Parser (Unresolved a)
 parseUnresolvedVolleyballFields settings txts val = do
   volleyball <- parseVolleyball settings val
   helper volleyball txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser (Unresolved a)
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser (Unresolved a)
     helper a [] = do
       v <- parseJSON a
       pure $ pure v
@@ -86,11 +87,3 @@
 $(genParser "volleyball" "formation")
 
 $(genProvider "volleyball" "formation")
-
-
-
-
-
-
-
-
diff --git a/src/Faker/Provider/WarhammerFantasy.hs b/src/Faker/Provider/WarhammerFantasy.hs
--- a/src/Faker/Provider/WarhammerFantasy.hs
+++ b/src/Faker/Provider/WarhammerFantasy.hs
@@ -14,9 +14,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseWarhammerFantasy :: FromJSON a => FakerSettings -> Value -> Parser a
 parseWarhammerFantasy settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   warhammerFantasy <- games .: "warhammer_fantasy"
@@ -25,19 +26,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseWarhammerFantasyField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseWarhammerFantasyField settings txt val = do
   warhammerFantasy <- parseWarhammerFantasy settings val
   field <- warhammerFantasy .:? txt .!= mempty
   pure field
 
 parseWarhammerFantasyFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseWarhammerFantasyFields settings txts val = do
   warhammerFantasy <- parseWarhammerFantasy settings val
   helper warhammerFantasy txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Witcher.hs b/src/Faker/Provider/Witcher.hs
--- a/src/Faker/Provider/Witcher.hs
+++ b/src/Faker/Provider/Witcher.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseWitcher :: FromJSON a => FakerSettings -> Value -> Parser a
 parseWitcher settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   witcher <- games .: "witcher"
@@ -26,19 +27,19 @@
 parseWitcher settings val = fail $ "expected Object, but got " <> (show val)
 
 parseWitcherField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseWitcherField settings txt val = do
   witcher <- parseWitcher settings val
   field <- witcher .:? txt .!= mempty
   pure field
 
 parseWitcherFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseWitcherFields settings txts val = do
   witcher <- parseWitcher settings val
   helper witcher txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/WorldCup.hs b/src/Faker/Provider/WorldCup.hs
--- a/src/Faker/Provider/WorldCup.hs
+++ b/src/Faker/Provider/WorldCup.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseWorldCup :: FromJSON a => FakerSettings -> Value -> Parser a
 parseWorldCup settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   worldCup <- faker .: "world_cup"
   pure worldCup
 parseWorldCup settings val = fail $ "expected Object, but got " <> (show val)
 
 parseWorldCupField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseWorldCupField settings txt val = do
   worldCup <- parseWorldCup settings val
   field <- worldCup .:? txt .!= mempty
   pure field
 
 parseWorldCupFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseWorldCupFields settings txts val = do
   worldCup <- parseWorldCup settings val
   helper worldCup txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/WorldOfWarcraft.hs b/src/Faker/Provider/WorldOfWarcraft.hs
--- a/src/Faker/Provider/WorldOfWarcraft.hs
+++ b/src/Faker/Provider/WorldOfWarcraft.hs
@@ -16,9 +16,10 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseWorldOfWarcraft :: FromJSON a => FakerSettings -> Value -> Parser a
 parseWorldOfWarcraft settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   worldOfWarcraft <- games .: "world_of_warcraft"
@@ -27,19 +28,19 @@
   fail $ "expected Object, but got " <> (show val)
 
 parseWorldOfWarcraftField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseWorldOfWarcraftField settings txt val = do
   worldOfWarcraft <- parseWorldOfWarcraft settings val
   field <- worldOfWarcraft .:? txt .!= mempty
   pure field
 
 parseWorldOfWarcraftFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseWorldOfWarcraftFields settings txts val = do
   worldOfWarcraft <- parseWorldOfWarcraft settings val
   helper worldOfWarcraft txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Yoda.hs b/src/Faker/Provider/Yoda.hs
--- a/src/Faker/Provider/Yoda.hs
+++ b/src/Faker/Provider/Yoda.hs
@@ -16,28 +16,29 @@
 import Faker.Provider.TH
 import Language.Haskell.TH
 
+
 parseYoda :: FromJSON a => FakerSettings -> Value -> Parser a
 parseYoda settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   yoda <- faker .: "yoda"
   pure yoda
 parseYoda settings val = fail $ "expected Object, but got " <> (show val)
 
 parseYodaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseYodaField settings txt val = do
   yoda <- parseYoda settings val
   field <- yoda .:? txt .!= mempty
   pure field
 
 parseYodaFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseYodaFields settings txts val = do
   yoda <- parseYoda settings val
   helper yoda txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/src/Faker/Provider/Zelda.hs b/src/Faker/Provider/Zelda.hs
--- a/src/Faker/Provider/Zelda.hs
+++ b/src/Faker/Provider/Zelda.hs
@@ -18,7 +18,7 @@
 
 parseZelda :: FromJSON a => FakerSettings -> Value -> Parser a
 parseZelda settings (Object obj) = do
-  en <- obj .: (getLocale settings)
+  en <- obj .: (getLocaleKey settings)
   faker <- en .: "faker"
   games <- faker .: "games"
   zelda <- games .: "zelda"
@@ -26,19 +26,19 @@
 parseZelda settings val = fail $ "expected Object, but got " <> (show val)
 
 parseZeldaField ::
-     (FromJSON a, Monoid a) => FakerSettings -> Text -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> AesonKey -> Value -> Parser a
 parseZeldaField settings txt val = do
   zelda <- parseZelda settings val
   field <- zelda .:? txt .!= mempty
   pure field
 
 parseZeldaFields ::
-     (FromJSON a, Monoid a) => FakerSettings -> [Text] -> Value -> Parser a
+     (FromJSON a, Monoid a) => FakerSettings -> [AesonKey] -> Value -> Parser a
 parseZeldaFields settings txts val = do
   zelda <- parseZelda settings val
   helper zelda txts
   where
-    helper :: (FromJSON a) => Value -> [Text] -> Parser a
+    helper :: (FromJSON a) => Value -> [AesonKey] -> Parser a
     helper a [] = parseJSON a
     helper (Object a) (x:xs) = do
       field <- a .: x
diff --git a/test/AddressSpec.hs b/test/AddressSpec.hs
--- a/test/AddressSpec.hs
+++ b/test/AddressSpec.hs
@@ -12,6 +12,7 @@
 import Test.Hspec
 import TestImport
 import Faker.Internal
+import Faker.Internal.Types (aesonKeyToText)
 
 fakerException :: Selector FakerException
 fakerException = const True
@@ -24,14 +25,14 @@
         resolveUnresolved
           defaultFakerSettings
           (pure $ pure $ "32-????-####")
-          (\s t -> pure t)
+          (\s t -> pure $ aesonKeyToText t)
       txt `shouldBeOneOf` ["32-SZJX-4351", "32-GODI-8116"]
     it "doesn't get confused with garbage" $ do
       txt <-
         resolveUnresolved
           defaultFakerSettings
           (pure $ pure $ "abjakf-324jak")
-          (\s t -> pure t)
+          (\s t -> pure $ aesonKeyToText t)
       txt `shouldBe` "abjakf-324jak"
     describe "Address functions" $ do
       it "basic check" $ do
