diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Andrew Martin (c) 2017
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Andrew Martin nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1 @@
+# country
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/country.cabal b/country.cabal
new file mode 100644
--- /dev/null
+++ b/country.cabal
@@ -0,0 +1,63 @@
+name: country
+version: 0.1
+synopsis: Country data type and functions
+description:
+  The `country` library provides a data type for dealing with
+  the set of countries as defined by ISO 3166. The representation
+  is compact and is well-suited to use with vectors and
+  primitive arrays. Additionally, this library exports functions 
+  that provide the following encodings and decodings:
+  .
+  * ISO Alpha-2 (two-letter country code)
+  .
+  * ISO Alpha-3 (three-letter country code)
+  .
+  * ISO Numeric (three-digit country code)
+  .
+  Please open up an issue on github if there is anything
+  you would like to see added.
+homepage: https://github.com/andrewthad/country#readme
+license: BSD3
+license-file: LICENSE
+author: Andrew Martin
+maintainer: andrew.thaddeus@gmail.com
+copyright: 2017 Andrew Martin
+category: Web
+build-type: Simple
+extra-source-files: README.md
+cabal-version: >=1.10
+
+library
+  hs-source-dirs: src
+  exposed-modules:
+    Country
+    Country.Identifier
+    Country.Unsafe
+  other-modules:
+    Country.Unexposed.Encode.English
+    Country.Unexposed.Enumerate
+    Country.Unexposed.ExtraNames
+    Country.Unexposed.Names
+  build-depends:
+      base >= 4.7 && < 4.10
+    , text >= 1.2 && < 1.3
+    , bytestring >= 0.10 && < 0.11
+    , primitive >= 0.6.1 && < 0.7
+    , unordered-containers >= 0.2 && < 0.3
+    , ghc-prim >= 0.5 && < 0.6
+    , hashable >= 1.2 && < 1.3
+  default-language: Haskell2010
+
+test-suite test
+  type: exitcode-stdio-1.0
+  hs-source-dirs: test
+  main-is: Spec.hs
+  build-depends:
+      base
+    , country
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  default-language: Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/andrewthad/country
diff --git a/src/Country.hs b/src/Country.hs
new file mode 100644
--- /dev/null
+++ b/src/Country.hs
@@ -0,0 +1,225 @@
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE MagicHash #-}
+
+module Country
+  ( Country
+    -- * Three digit code
+  , encodeNumeric
+  , decodeNumeric
+    -- * Name
+  , encodeEnglish
+  , decode
+    -- * Alpha-2 and Alpha-3
+  , alphaTwoUpper
+  , alphaThreeUpper
+  , alphaThreeLower
+  , alphaTwoLower
+  , decodeAlphaTwo
+  , decodeAlphaThree
+  ) where
+
+import Country.Unsafe (Country(..))
+import Country.Unexposed.Encode.English (countryNameQuads)
+import Country.Unexposed.ExtraNames (extraNames)
+import Country.Unexposed.Names (englishCountryNamesText,numberOfPossibleCodes)
+import Country.Unexposed.Enumerate (enumeratedCountries)
+import Data.Text (Text)
+import Data.ByteString (ByteString)
+import Data.Word (Word16,Word8)
+import Data.Primitive (indexArray,newArray,unsafeFreezeArray,writeArray,
+  writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray)
+import Data.HashMap.Strict (HashMap)
+import Data.Primitive.Array (Array(..))
+import Data.Primitive.ByteArray (ByteArray(..))
+import GHC.Prim (sizeofByteArray#,sizeofArray#)
+import GHC.Int (Int(..))
+import Control.Monad.ST (runST)
+import Control.Monad
+import Data.Char (ord,chr,toLower)
+import Data.Bits (unsafeShiftL,unsafeShiftR)
+import qualified Data.List as L
+import qualified Data.HashMap.Strict as HM
+import qualified Data.Text as T
+import qualified Data.Text.Array as TA
+import qualified Data.Text.Internal as TI
+
+-- | Convert a country to its numeric code. This is a
+--   three-digit number and will consequently be less than 1000.
+encodeNumeric :: Country -> Word16
+encodeNumeric (Country n) = n
+
+-- | Get a country from a numeric code. Any code greater than
+--   999 will not have a country associated with it. Additionally,
+--   many codes are unassigned.
+decodeNumeric :: Word16 -> Maybe Country
+decodeNumeric n = if n < 1000 && indexByteArray numericValidities (word16ToInt n) == (1 :: Word8)
+  then Just (Country n)
+  else Nothing
+
+-- | The name of a country given in English
+encodeEnglish :: Country -> Text
+encodeEnglish (Country n) = indexArray englishCountryNamesText (word16ToInt n)
+
+-- | The alpha-2 country code, uppercase
+alphaTwoUpper :: Country -> Text
+alphaTwoUpper c = TI.text allAlphaTwoUpper (timesTwo (indexOfCountry c)) 2
+
+-- | The alpha-3 country code, uppercase
+alphaThreeUpper :: Country -> Text
+alphaThreeUpper c = TI.text allAlphaThreeUpper (timesThree (indexOfCountry c)) 3
+
+-- | The alpha-2 country code, lowercase
+alphaTwoLower :: Country -> Text
+alphaTwoLower c = TI.text allAlphaTwoLower (timesTwo (indexOfCountry c)) 2
+
+-- | The alpha-3 country code, lowercase
+alphaThreeLower :: Country -> Text
+alphaThreeLower c = TI.text allAlphaThreeLower (timesThree (indexOfCountry c)) 3
+
+decodeAlphaTwo :: Text -> Maybe Country
+decodeAlphaTwo = flip HM.lookup alphaTwoHashMap
+
+decodeAlphaThree :: Text -> Maybe Country
+decodeAlphaThree = flip HM.lookup alphaTwoHashMap
+
+alphaTwoHashMap :: HashMap Text Country
+alphaTwoHashMap = L.foldl'
+  (\hm (countryNum,_,(c1,c2),_) ->
+      HM.insert (T.pack [c1,c2]) (Country countryNum)
+    $ HM.insert (T.pack [toLower c1, toLower c2]) (Country countryNum)
+    $ hm
+  )
+  HM.empty countryNameQuads
+{-# NOINLINE alphaTwoHashMap #-}
+
+alphaThreeHashMap :: HashMap Text Country
+alphaThreeHashMap = L.foldl'
+  (\hm (countryNum,_,_,(c1,c2,c3)) -> 
+      HM.insert (T.pack [c1,c2,c3]) (Country countryNum)
+    $ HM.insert (T.pack [toLower c1, toLower c2, toLower c3]) (Country countryNum)
+    $ hm
+  )
+  HM.empty countryNameQuads
+{-# NOINLINE alphaThreeHashMap #-}
+
+half :: Int -> Int
+half x = unsafeShiftR x 1
+
+timesTwo :: Int -> Int
+timesTwo x = unsafeShiftL x 1
+
+timesThree :: Int -> Int
+timesThree x = x * 3
+
+
+-- | Parse a country from its name. This function is language-agnostic.
+--   It can handle any source language.
+decode :: Text -> Maybe Country
+decode = flip HM.lookup decodeMap
+
+word16ToInt :: Word16 -> Int
+word16ToInt = fromIntegral
+
+intToWord16 :: Int -> Word16
+intToWord16 = fromIntegral
+
+charToWord16 :: Char -> Word16
+charToWord16 = fromIntegral . ord
+
+word16ToChar :: Word16 -> Char
+word16ToChar = chr . fromIntegral
+
+
+decodeMap :: HashMap Text Country
+decodeMap = 
+  let baseMap = HM.union alphaTwoHashMap alphaThreeHashMap
+      hm1 = L.foldl' (\hm (country,name) -> HM.insert name country hm) baseMap extraNames
+      hm2 = L.foldl' (\hm (countryNum,name,_,_) -> HM.insert name (Country countryNum) hm) hm1 countryNameQuads
+   in hm2
+{-# NOINLINE decodeMap #-}
+
+arrayFoldl' :: (a -> b -> a) -> a -> Array b -> a
+arrayFoldl' f z a = go 0 z
+  where
+  go i !acc | i < sizeofArray a = go (i+1) (f acc $ indexArray a i)
+            | otherwise         = acc
+
+sizeofArray :: Array a -> Int
+sizeofArray (Array a) = I# (sizeofArray# a)
+{-# INLINE sizeofArray #-}
+
+numberOfCountries :: Int
+numberOfCountries = length countryNameQuads
+
+-- | The elements in this array are Word8 (basically boolean)
+numericValidities :: ByteArray
+numericValidities = runST $ do
+  m <- newByteArray numberOfPossibleCodes
+  let clear !ix = if ix < numberOfPossibleCodes
+        then writeByteArray m ix (0 :: Word8)
+        else return ()
+  clear 0
+  forM_ countryNameQuads $ \(n,_,_,_) -> do
+    writeByteArray m (word16ToInt n) (1 :: Word8)
+  unsafeFreezeByteArray m
+{-# NOINLINE numericValidities #-}
+
+-- | The elements in this array are Word16
+positions :: ByteArray
+positions = runST $ do
+  m <- newByteArray (timesTwo numberOfPossibleCodes)
+  forM_ (zip (enumFrom (0 :: Word16)) countryNameQuads) $ \(ix,(n,_,_,_)) -> do
+    writeByteArray m (word16ToInt n) ix
+  unsafeFreezeByteArray m
+{-# NOINLINE positions #-}
+
+-- get the index of the country. this refers not to the
+-- country code but to the position it shows up in the
+-- hard-coded list of all the countries.
+indexOfCountry :: Country -> Int
+indexOfCountry (Country n) =
+  word16ToInt (indexByteArray positions (word16ToInt n))
+
+allAlphaTwoUpper :: TA.Array
+allAlphaTwoUpper = TA.run $ do
+  m <- TA.new (timesTwo numberOfCountries)
+  forM_ countryNameQuads $ \(n,_,(a1,a2),_) -> do
+    let ix = timesTwo (indexOfCountry (Country n))
+    TA.unsafeWrite m ix (charToWord16 a1)
+    TA.unsafeWrite m (ix + 1) (charToWord16 a2)
+  return m
+{-# NOINLINE allAlphaTwoUpper #-}
+
+allAlphaThreeUpper :: TA.Array
+allAlphaThreeUpper = TA.run $ do
+  m <- TA.new (timesThree numberOfCountries)
+  forM_ countryNameQuads $ \(n,_,_,(a1,a2,a3)) -> do
+    let ix = timesThree (indexOfCountry (Country n))
+    TA.unsafeWrite m ix (charToWord16 a1)
+    TA.unsafeWrite m (ix + 1) (charToWord16 a2)
+    TA.unsafeWrite m (ix + 2) (charToWord16 a3)
+  return m
+{-# NOINLINE allAlphaThreeUpper #-}
+
+allAlphaThreeLower :: TA.Array
+allAlphaThreeLower = mapTextArray toLower allAlphaThreeUpper
+{-# NOINLINE allAlphaThreeLower #-}
+
+allAlphaTwoLower :: TA.Array
+allAlphaTwoLower = mapTextArray toLower allAlphaTwoUpper
+{-# NOINLINE allAlphaTwoLower #-}
+
+mapTextArray :: (Char -> Char) -> TA.Array -> TA.Array
+mapTextArray f a@(TA.Array inner) = TA.run $ do
+  let len = half (I# (sizeofByteArray# inner))
+  m <- TA.new len
+  TA.copyI m 0 a 0 len
+  let go !ix = if ix < len
+        then do
+          TA.unsafeWrite m ix (charToWord16 (f (word16ToChar (TA.unsafeIndex a ix))))
+          go (ix + 1)
+        else return ()
+  go 0
+  return m
+
+
diff --git a/src/Country/Identifier.hs b/src/Country/Identifier.hs
new file mode 100644
--- /dev/null
+++ b/src/Country/Identifier.hs
@@ -0,0 +1,753 @@
+module Country.Identifier where
+
+-- This module is autogenerated. Do not edit it by hand.
+
+import Country.Unsafe (Country(..))
+
+afghanistan :: Country
+afghanistan = Country 4
+
+ålandIslands :: Country
+ålandIslands = Country 248
+
+albania :: Country
+albania = Country 8
+
+algeria :: Country
+algeria = Country 12
+
+americanSamoa :: Country
+americanSamoa = Country 16
+
+andorra :: Country
+andorra = Country 20
+
+angola :: Country
+angola = Country 24
+
+anguilla :: Country
+anguilla = Country 660
+
+antarctica :: Country
+antarctica = Country 10
+
+antiguaAndBarbuda :: Country
+antiguaAndBarbuda = Country 28
+
+argentina :: Country
+argentina = Country 32
+
+armenia :: Country
+armenia = Country 51
+
+aruba :: Country
+aruba = Country 533
+
+australia :: Country
+australia = Country 36
+
+austria :: Country
+austria = Country 40
+
+azerbaijan :: Country
+azerbaijan = Country 31
+
+bahamas :: Country
+bahamas = Country 44
+
+bahrain :: Country
+bahrain = Country 48
+
+bangladesh :: Country
+bangladesh = Country 50
+
+barbados :: Country
+barbados = Country 52
+
+belarus :: Country
+belarus = Country 112
+
+belgium :: Country
+belgium = Country 56
+
+belize :: Country
+belize = Country 84
+
+benin :: Country
+benin = Country 204
+
+bermuda :: Country
+bermuda = Country 60
+
+bhutan :: Country
+bhutan = Country 64
+
+boliviaPlurinationalStateOf :: Country
+boliviaPlurinationalStateOf = Country 68
+
+bonaireSintEustatiusAndSaba :: Country
+bonaireSintEustatiusAndSaba = Country 535
+
+bosniaAndHerzegovina :: Country
+bosniaAndHerzegovina = Country 70
+
+botswana :: Country
+botswana = Country 72
+
+bouvetIsland :: Country
+bouvetIsland = Country 74
+
+brazil :: Country
+brazil = Country 76
+
+britishIndianOceanTerritory :: Country
+britishIndianOceanTerritory = Country 86
+
+bruneiDarussalam :: Country
+bruneiDarussalam = Country 96
+
+bulgaria :: Country
+bulgaria = Country 100
+
+burkinaFaso :: Country
+burkinaFaso = Country 854
+
+burundi :: Country
+burundi = Country 108
+
+cambodia :: Country
+cambodia = Country 116
+
+cameroon :: Country
+cameroon = Country 120
+
+canada :: Country
+canada = Country 124
+
+caboVerde :: Country
+caboVerde = Country 132
+
+caymanIslands :: Country
+caymanIslands = Country 136
+
+centralAfricanRepublic :: Country
+centralAfricanRepublic = Country 140
+
+chad :: Country
+chad = Country 148
+
+chile :: Country
+chile = Country 152
+
+china :: Country
+china = Country 156
+
+christmasIsland :: Country
+christmasIsland = Country 162
+
+cocosKeelingIslands :: Country
+cocosKeelingIslands = Country 166
+
+colombia :: Country
+colombia = Country 170
+
+comoros :: Country
+comoros = Country 174
+
+congo :: Country
+congo = Country 178
+
+congoDemocraticRepublicOfThe :: Country
+congoDemocraticRepublicOfThe = Country 180
+
+cookIslands :: Country
+cookIslands = Country 184
+
+costaRica :: Country
+costaRica = Country 188
+
+côteDIvoire :: Country
+côteDIvoire = Country 384
+
+croatia :: Country
+croatia = Country 191
+
+cuba :: Country
+cuba = Country 192
+
+curaçao :: Country
+curaçao = Country 531
+
+cyprus :: Country
+cyprus = Country 196
+
+czechRepublic :: Country
+czechRepublic = Country 203
+
+denmark :: Country
+denmark = Country 208
+
+djibouti :: Country
+djibouti = Country 262
+
+dominica :: Country
+dominica = Country 212
+
+dominicanRepublic :: Country
+dominicanRepublic = Country 214
+
+ecuador :: Country
+ecuador = Country 218
+
+egypt :: Country
+egypt = Country 818
+
+elSalvador :: Country
+elSalvador = Country 222
+
+equatorialGuinea :: Country
+equatorialGuinea = Country 226
+
+eritrea :: Country
+eritrea = Country 232
+
+estonia :: Country
+estonia = Country 233
+
+ethiopia :: Country
+ethiopia = Country 231
+
+falklandIslandsMalvinas :: Country
+falklandIslandsMalvinas = Country 238
+
+faroeIslands :: Country
+faroeIslands = Country 234
+
+fiji :: Country
+fiji = Country 242
+
+finland :: Country
+finland = Country 246
+
+france :: Country
+france = Country 250
+
+frenchGuiana :: Country
+frenchGuiana = Country 254
+
+frenchPolynesia :: Country
+frenchPolynesia = Country 258
+
+frenchSouthernTerritories :: Country
+frenchSouthernTerritories = Country 260
+
+gabon :: Country
+gabon = Country 266
+
+gambia :: Country
+gambia = Country 270
+
+georgia :: Country
+georgia = Country 268
+
+germany :: Country
+germany = Country 276
+
+ghana :: Country
+ghana = Country 288
+
+gibraltar :: Country
+gibraltar = Country 292
+
+greece :: Country
+greece = Country 300
+
+greenland :: Country
+greenland = Country 304
+
+grenada :: Country
+grenada = Country 308
+
+guadeloupe :: Country
+guadeloupe = Country 312
+
+guam :: Country
+guam = Country 316
+
+guatemala :: Country
+guatemala = Country 320
+
+guernsey :: Country
+guernsey = Country 831
+
+guinea :: Country
+guinea = Country 324
+
+guineaBissau :: Country
+guineaBissau = Country 624
+
+guyana :: Country
+guyana = Country 328
+
+haiti :: Country
+haiti = Country 332
+
+heardIslandAndMcdonaldIslands :: Country
+heardIslandAndMcdonaldIslands = Country 334
+
+holySee :: Country
+holySee = Country 336
+
+honduras :: Country
+honduras = Country 340
+
+hongKong :: Country
+hongKong = Country 344
+
+hungary :: Country
+hungary = Country 348
+
+iceland :: Country
+iceland = Country 352
+
+india :: Country
+india = Country 356
+
+indonesia :: Country
+indonesia = Country 360
+
+iranIslamicRepublicOf :: Country
+iranIslamicRepublicOf = Country 364
+
+iraq :: Country
+iraq = Country 368
+
+ireland :: Country
+ireland = Country 372
+
+isleOfMan :: Country
+isleOfMan = Country 833
+
+israel :: Country
+israel = Country 376
+
+italy :: Country
+italy = Country 380
+
+jamaica :: Country
+jamaica = Country 388
+
+japan :: Country
+japan = Country 392
+
+jersey :: Country
+jersey = Country 832
+
+jordan :: Country
+jordan = Country 400
+
+kazakhstan :: Country
+kazakhstan = Country 398
+
+kenya :: Country
+kenya = Country 404
+
+kiribati :: Country
+kiribati = Country 296
+
+koreaDemocraticPeopleSRepublicOf :: Country
+koreaDemocraticPeopleSRepublicOf = Country 408
+
+koreaRepublicOf :: Country
+koreaRepublicOf = Country 410
+
+kuwait :: Country
+kuwait = Country 414
+
+kyrgyzstan :: Country
+kyrgyzstan = Country 417
+
+laoPeopleSDemocraticRepublic :: Country
+laoPeopleSDemocraticRepublic = Country 418
+
+latvia :: Country
+latvia = Country 428
+
+lebanon :: Country
+lebanon = Country 422
+
+lesotho :: Country
+lesotho = Country 426
+
+liberia :: Country
+liberia = Country 430
+
+libya :: Country
+libya = Country 434
+
+liechtenstein :: Country
+liechtenstein = Country 438
+
+lithuania :: Country
+lithuania = Country 440
+
+luxembourg :: Country
+luxembourg = Country 442
+
+macao :: Country
+macao = Country 446
+
+macedoniaTheFormerYugoslavRepublicOf :: Country
+macedoniaTheFormerYugoslavRepublicOf = Country 807
+
+madagascar :: Country
+madagascar = Country 450
+
+malawi :: Country
+malawi = Country 454
+
+malaysia :: Country
+malaysia = Country 458
+
+maldives :: Country
+maldives = Country 462
+
+mali :: Country
+mali = Country 466
+
+malta :: Country
+malta = Country 470
+
+marshallIslands :: Country
+marshallIslands = Country 584
+
+martinique :: Country
+martinique = Country 474
+
+mauritania :: Country
+mauritania = Country 478
+
+mauritius :: Country
+mauritius = Country 480
+
+mayotte :: Country
+mayotte = Country 175
+
+mexico :: Country
+mexico = Country 484
+
+micronesiaFederatedStatesOf :: Country
+micronesiaFederatedStatesOf = Country 583
+
+moldovaRepublicOf :: Country
+moldovaRepublicOf = Country 498
+
+monaco :: Country
+monaco = Country 492
+
+mongolia :: Country
+mongolia = Country 496
+
+montenegro :: Country
+montenegro = Country 499
+
+montserrat :: Country
+montserrat = Country 500
+
+morocco :: Country
+morocco = Country 504
+
+mozambique :: Country
+mozambique = Country 508
+
+myanmar :: Country
+myanmar = Country 104
+
+namibia :: Country
+namibia = Country 516
+
+nauru :: Country
+nauru = Country 520
+
+nepal :: Country
+nepal = Country 524
+
+netherlands :: Country
+netherlands = Country 528
+
+newCaledonia :: Country
+newCaledonia = Country 540
+
+newZealand :: Country
+newZealand = Country 554
+
+nicaragua :: Country
+nicaragua = Country 558
+
+niger :: Country
+niger = Country 562
+
+nigeria :: Country
+nigeria = Country 566
+
+niue :: Country
+niue = Country 570
+
+norfolkIsland :: Country
+norfolkIsland = Country 574
+
+northernMarianaIslands :: Country
+northernMarianaIslands = Country 580
+
+norway :: Country
+norway = Country 578
+
+oman :: Country
+oman = Country 512
+
+pakistan :: Country
+pakistan = Country 586
+
+palau :: Country
+palau = Country 585
+
+palestineStateOf :: Country
+palestineStateOf = Country 275
+
+panama :: Country
+panama = Country 591
+
+papuaNewGuinea :: Country
+papuaNewGuinea = Country 598
+
+paraguay :: Country
+paraguay = Country 600
+
+peru :: Country
+peru = Country 604
+
+philippines :: Country
+philippines = Country 608
+
+pitcairn :: Country
+pitcairn = Country 612
+
+poland :: Country
+poland = Country 616
+
+portugal :: Country
+portugal = Country 620
+
+puertoRico :: Country
+puertoRico = Country 630
+
+qatar :: Country
+qatar = Country 634
+
+réunion :: Country
+réunion = Country 638
+
+romania :: Country
+romania = Country 642
+
+russianFederation :: Country
+russianFederation = Country 643
+
+rwanda :: Country
+rwanda = Country 646
+
+saintBarthélemy :: Country
+saintBarthélemy = Country 652
+
+saintHelenaAscensionAndTristanDaCunha :: Country
+saintHelenaAscensionAndTristanDaCunha = Country 654
+
+saintKittsAndNevis :: Country
+saintKittsAndNevis = Country 659
+
+saintLucia :: Country
+saintLucia = Country 662
+
+saintMartinFrenchPart :: Country
+saintMartinFrenchPart = Country 663
+
+saintPierreAndMiquelon :: Country
+saintPierreAndMiquelon = Country 666
+
+saintVincentAndTheGrenadines :: Country
+saintVincentAndTheGrenadines = Country 670
+
+samoa :: Country
+samoa = Country 882
+
+sanMarino :: Country
+sanMarino = Country 674
+
+saoTomeAndPrincipe :: Country
+saoTomeAndPrincipe = Country 678
+
+saudiArabia :: Country
+saudiArabia = Country 682
+
+senegal :: Country
+senegal = Country 686
+
+serbia :: Country
+serbia = Country 688
+
+seychelles :: Country
+seychelles = Country 690
+
+sierraLeone :: Country
+sierraLeone = Country 694
+
+singapore :: Country
+singapore = Country 702
+
+sintMaartenDutchPart :: Country
+sintMaartenDutchPart = Country 534
+
+slovakia :: Country
+slovakia = Country 703
+
+slovenia :: Country
+slovenia = Country 705
+
+solomonIslands :: Country
+solomonIslands = Country 90
+
+somalia :: Country
+somalia = Country 706
+
+southAfrica :: Country
+southAfrica = Country 710
+
+southGeorgiaAndTheSouthSandwichIslands :: Country
+southGeorgiaAndTheSouthSandwichIslands = Country 239
+
+southSudan :: Country
+southSudan = Country 728
+
+spain :: Country
+spain = Country 724
+
+sriLanka :: Country
+sriLanka = Country 144
+
+sudan :: Country
+sudan = Country 729
+
+suriname :: Country
+suriname = Country 740
+
+svalbardAndJanMayen :: Country
+svalbardAndJanMayen = Country 744
+
+swaziland :: Country
+swaziland = Country 748
+
+sweden :: Country
+sweden = Country 752
+
+switzerland :: Country
+switzerland = Country 756
+
+syrianArabRepublic :: Country
+syrianArabRepublic = Country 760
+
+taiwanProvinceOfChina :: Country
+taiwanProvinceOfChina = Country 158
+
+tajikistan :: Country
+tajikistan = Country 762
+
+tanzaniaUnitedRepublicOf :: Country
+tanzaniaUnitedRepublicOf = Country 834
+
+thailand :: Country
+thailand = Country 764
+
+timorLeste :: Country
+timorLeste = Country 626
+
+togo :: Country
+togo = Country 768
+
+tokelau :: Country
+tokelau = Country 772
+
+tonga :: Country
+tonga = Country 776
+
+trinidadAndTobago :: Country
+trinidadAndTobago = Country 780
+
+tunisia :: Country
+tunisia = Country 788
+
+turkey :: Country
+turkey = Country 792
+
+turkmenistan :: Country
+turkmenistan = Country 795
+
+turksAndCaicosIslands :: Country
+turksAndCaicosIslands = Country 796
+
+tuvalu :: Country
+tuvalu = Country 798
+
+uganda :: Country
+uganda = Country 800
+
+ukraine :: Country
+ukraine = Country 804
+
+unitedArabEmirates :: Country
+unitedArabEmirates = Country 784
+
+unitedKingdomOfGreatBritainAndNorthernIreland :: Country
+unitedKingdomOfGreatBritainAndNorthernIreland = Country 826
+
+unitedStatesOfAmerica :: Country
+unitedStatesOfAmerica = Country 840
+
+unitedStatesMinorOutlyingIslands :: Country
+unitedStatesMinorOutlyingIslands = Country 581
+
+uruguay :: Country
+uruguay = Country 858
+
+uzbekistan :: Country
+uzbekistan = Country 860
+
+vanuatu :: Country
+vanuatu = Country 548
+
+venezuelaBolivarianRepublicOf :: Country
+venezuelaBolivarianRepublicOf = Country 862
+
+vietNam :: Country
+vietNam = Country 704
+
+virginIslandsBritish :: Country
+virginIslandsBritish = Country 92
+
+virginIslandsUS :: Country
+virginIslandsUS = Country 850
+
+wallisAndFutuna :: Country
+wallisAndFutuna = Country 876
+
+westernSahara :: Country
+westernSahara = Country 732
+
+yemen :: Country
+yemen = Country 887
+
+zambia :: Country
+zambia = Country 894
+
+zimbabwe :: Country
+zimbabwe = Country 716
+
diff --git a/src/Country/Unexposed/Encode/English.hs b/src/Country/Unexposed/Encode/English.hs
new file mode 100644
--- /dev/null
+++ b/src/Country/Unexposed/Encode/English.hs
@@ -0,0 +1,264 @@
+-- This module is autogenerated. Do not edit it by hand.
+module Country.Unexposed.Encode.English
+  ( countryNameQuads
+  ) where
+
+import Data.Text (Text)
+import Data.Word (Word16)
+import qualified Data.Text as T
+
+-- first value is country code, second is english name, 
+-- third is two char code, fourth is three char code.
+countryNameQuads :: [(Word16,Text,(Char,Char),(Char,Char,Char))]
+countryNameQuads =
+  [ (4, T.pack "Afghanistan",('A','F'),('A','F','G'))
+  , (248, T.pack "Åland Islands",('A','X'),('A','L','A'))
+  , (8, T.pack "Albania",('A','L'),('A','L','B'))
+  , (12, T.pack "Algeria",('D','Z'),('D','Z','A'))
+  , (16, T.pack "American Samoa",('A','S'),('A','S','M'))
+  , (20, T.pack "Andorra",('A','D'),('A','N','D'))
+  , (24, T.pack "Angola",('A','O'),('A','G','O'))
+  , (660, T.pack "Anguilla",('A','I'),('A','I','A'))
+  , (10, T.pack "Antarctica",('A','Q'),('A','T','A'))
+  , (28, T.pack "Antigua and Barbuda",('A','G'),('A','T','G'))
+  , (32, T.pack "Argentina",('A','R'),('A','R','G'))
+  , (51, T.pack "Armenia",('A','M'),('A','R','M'))
+  , (533, T.pack "Aruba",('A','W'),('A','B','W'))
+  , (36, T.pack "Australia",('A','U'),('A','U','S'))
+  , (40, T.pack "Austria",('A','T'),('A','U','T'))
+  , (31, T.pack "Azerbaijan",('A','Z'),('A','Z','E'))
+  , (44, T.pack "Bahamas",('B','S'),('B','H','S'))
+  , (48, T.pack "Bahrain",('B','H'),('B','H','R'))
+  , (50, T.pack "Bangladesh",('B','D'),('B','G','D'))
+  , (52, T.pack "Barbados",('B','B'),('B','R','B'))
+  , (112, T.pack "Belarus",('B','Y'),('B','L','R'))
+  , (56, T.pack "Belgium",('B','E'),('B','E','L'))
+  , (84, T.pack "Belize",('B','Z'),('B','L','Z'))
+  , (204, T.pack "Benin",('B','J'),('B','E','N'))
+  , (60, T.pack "Bermuda",('B','M'),('B','M','U'))
+  , (64, T.pack "Bhutan",('B','T'),('B','T','N'))
+  , (68, T.pack "Bolivia (Plurinational State of)",('B','O'),('B','O','L'))
+  , (535, T.pack "Bonaire, Sint Eustatius and Saba",('B','Q'),('B','E','S'))
+  , (70, T.pack "Bosnia and Herzegovina",('B','A'),('B','I','H'))
+  , (72, T.pack "Botswana",('B','W'),('B','W','A'))
+  , (74, T.pack "Bouvet Island",('B','V'),('B','V','T'))
+  , (76, T.pack "Brazil",('B','R'),('B','R','A'))
+  , (86, T.pack "British Indian Ocean Territory",('I','O'),('I','O','T'))
+  , (96, T.pack "Brunei Darussalam",('B','N'),('B','R','N'))
+  , (100, T.pack "Bulgaria",('B','G'),('B','G','R'))
+  , (854, T.pack "Burkina Faso",('B','F'),('B','F','A'))
+  , (108, T.pack "Burundi",('B','I'),('B','D','I'))
+  , (116, T.pack "Cambodia",('K','H'),('K','H','M'))
+  , (120, T.pack "Cameroon",('C','M'),('C','M','R'))
+  , (124, T.pack "Canada",('C','A'),('C','A','N'))
+  , (132, T.pack "Cabo Verde",('C','V'),('C','P','V'))
+  , (136, T.pack "Cayman Islands",('K','Y'),('C','Y','M'))
+  , (140, T.pack "Central African Republic",('C','F'),('C','A','F'))
+  , (148, T.pack "Chad",('T','D'),('T','C','D'))
+  , (152, T.pack "Chile",('C','L'),('C','H','L'))
+  , (156, T.pack "China",('C','N'),('C','H','N'))
+  , (162, T.pack "Christmas Island",('C','X'),('C','X','R'))
+  , (166, T.pack "Cocos (Keeling) Islands",('C','C'),('C','C','K'))
+  , (170, T.pack "Colombia",('C','O'),('C','O','L'))
+  , (174, T.pack "Comoros",('K','M'),('C','O','M'))
+  , (178, T.pack "Congo",('C','G'),('C','O','G'))
+  , (180, T.pack "Congo (Democratic Republic of the)",('C','D'),('C','O','D'))
+  , (184, T.pack "Cook Islands",('C','K'),('C','O','K'))
+  , (188, T.pack "Costa Rica",('C','R'),('C','R','I'))
+  , (384, T.pack "Côte d'Ivoire",('C','I'),('C','I','V'))
+  , (191, T.pack "Croatia",('H','R'),('H','R','V'))
+  , (192, T.pack "Cuba",('C','U'),('C','U','B'))
+  , (531, T.pack "Curaçao",('C','W'),('C','U','W'))
+  , (196, T.pack "Cyprus",('C','Y'),('C','Y','P'))
+  , (203, T.pack "Czech Republic",('C','Z'),('C','Z','E'))
+  , (208, T.pack "Denmark",('D','K'),('D','N','K'))
+  , (262, T.pack "Djibouti",('D','J'),('D','J','I'))
+  , (212, T.pack "Dominica",('D','M'),('D','M','A'))
+  , (214, T.pack "Dominican Republic",('D','O'),('D','O','M'))
+  , (218, T.pack "Ecuador",('E','C'),('E','C','U'))
+  , (818, T.pack "Egypt",('E','G'),('E','G','Y'))
+  , (222, T.pack "El Salvador",('S','V'),('S','L','V'))
+  , (226, T.pack "Equatorial Guinea",('G','Q'),('G','N','Q'))
+  , (232, T.pack "Eritrea",('E','R'),('E','R','I'))
+  , (233, T.pack "Estonia",('E','E'),('E','S','T'))
+  , (231, T.pack "Ethiopia",('E','T'),('E','T','H'))
+  , (238, T.pack "Falkland Islands (Malvinas)",('F','K'),('F','L','K'))
+  , (234, T.pack "Faroe Islands",('F','O'),('F','R','O'))
+  , (242, T.pack "Fiji",('F','J'),('F','J','I'))
+  , (246, T.pack "Finland",('F','I'),('F','I','N'))
+  , (250, T.pack "France",('F','R'),('F','R','A'))
+  , (254, T.pack "French Guiana",('G','F'),('G','U','F'))
+  , (258, T.pack "French Polynesia",('P','F'),('P','Y','F'))
+  , (260, T.pack "French Southern Territories",('T','F'),('A','T','F'))
+  , (266, T.pack "Gabon",('G','A'),('G','A','B'))
+  , (270, T.pack "Gambia",('G','M'),('G','M','B'))
+  , (268, T.pack "Georgia",('G','E'),('G','E','O'))
+  , (276, T.pack "Germany",('D','E'),('D','E','U'))
+  , (288, T.pack "Ghana",('G','H'),('G','H','A'))
+  , (292, T.pack "Gibraltar",('G','I'),('G','I','B'))
+  , (300, T.pack "Greece",('G','R'),('G','R','C'))
+  , (304, T.pack "Greenland",('G','L'),('G','R','L'))
+  , (308, T.pack "Grenada",('G','D'),('G','R','D'))
+  , (312, T.pack "Guadeloupe",('G','P'),('G','L','P'))
+  , (316, T.pack "Guam",('G','U'),('G','U','M'))
+  , (320, T.pack "Guatemala",('G','T'),('G','T','M'))
+  , (831, T.pack "Guernsey",('G','G'),('G','G','Y'))
+  , (324, T.pack "Guinea",('G','N'),('G','I','N'))
+  , (624, T.pack "Guinea-Bissau",('G','W'),('G','N','B'))
+  , (328, T.pack "Guyana",('G','Y'),('G','U','Y'))
+  , (332, T.pack "Haiti",('H','T'),('H','T','I'))
+  , (334, T.pack "Heard Island and McDonald Islands",('H','M'),('H','M','D'))
+  , (336, T.pack "Holy See",('V','A'),('V','A','T'))
+  , (340, T.pack "Honduras",('H','N'),('H','N','D'))
+  , (344, T.pack "Hong Kong",('H','K'),('H','K','G'))
+  , (348, T.pack "Hungary",('H','U'),('H','U','N'))
+  , (352, T.pack "Iceland",('I','S'),('I','S','L'))
+  , (356, T.pack "India",('I','N'),('I','N','D'))
+  , (360, T.pack "Indonesia",('I','D'),('I','D','N'))
+  , (364, T.pack "Iran (Islamic Republic of)",('I','R'),('I','R','N'))
+  , (368, T.pack "Iraq",('I','Q'),('I','R','Q'))
+  , (372, T.pack "Ireland",('I','E'),('I','R','L'))
+  , (833, T.pack "Isle of Man",('I','M'),('I','M','N'))
+  , (376, T.pack "Israel",('I','L'),('I','S','R'))
+  , (380, T.pack "Italy",('I','T'),('I','T','A'))
+  , (388, T.pack "Jamaica",('J','M'),('J','A','M'))
+  , (392, T.pack "Japan",('J','P'),('J','P','N'))
+  , (832, T.pack "Jersey",('J','E'),('J','E','Y'))
+  , (400, T.pack "Jordan",('J','O'),('J','O','R'))
+  , (398, T.pack "Kazakhstan",('K','Z'),('K','A','Z'))
+  , (404, T.pack "Kenya",('K','E'),('K','E','N'))
+  , (296, T.pack "Kiribati",('K','I'),('K','I','R'))
+  , (408, T.pack "Korea (Democratic People's Republic of)",('K','P'),('P','R','K'))
+  , (410, T.pack "Korea (Republic of)",('K','R'),('K','O','R'))
+  , (414, T.pack "Kuwait",('K','W'),('K','W','T'))
+  , (417, T.pack "Kyrgyzstan",('K','G'),('K','G','Z'))
+  , (418, T.pack "Lao People's Democratic Republic",('L','A'),('L','A','O'))
+  , (428, T.pack "Latvia",('L','V'),('L','V','A'))
+  , (422, T.pack "Lebanon",('L','B'),('L','B','N'))
+  , (426, T.pack "Lesotho",('L','S'),('L','S','O'))
+  , (430, T.pack "Liberia",('L','R'),('L','B','R'))
+  , (434, T.pack "Libya",('L','Y'),('L','B','Y'))
+  , (438, T.pack "Liechtenstein",('L','I'),('L','I','E'))
+  , (440, T.pack "Lithuania",('L','T'),('L','T','U'))
+  , (442, T.pack "Luxembourg",('L','U'),('L','U','X'))
+  , (446, T.pack "Macao",('M','O'),('M','A','C'))
+  , (807, T.pack "Macedonia (the former Yugoslav Republic of)",('M','K'),('M','K','D'))
+  , (450, T.pack "Madagascar",('M','G'),('M','D','G'))
+  , (454, T.pack "Malawi",('M','W'),('M','W','I'))
+  , (458, T.pack "Malaysia",('M','Y'),('M','Y','S'))
+  , (462, T.pack "Maldives",('M','V'),('M','D','V'))
+  , (466, T.pack "Mali",('M','L'),('M','L','I'))
+  , (470, T.pack "Malta",('M','T'),('M','L','T'))
+  , (584, T.pack "Marshall Islands",('M','H'),('M','H','L'))
+  , (474, T.pack "Martinique",('M','Q'),('M','T','Q'))
+  , (478, T.pack "Mauritania",('M','R'),('M','R','T'))
+  , (480, T.pack "Mauritius",('M','U'),('M','U','S'))
+  , (175, T.pack "Mayotte",('Y','T'),('M','Y','T'))
+  , (484, T.pack "Mexico",('M','X'),('M','E','X'))
+  , (583, T.pack "Micronesia (Federated States of)",('F','M'),('F','S','M'))
+  , (498, T.pack "Moldova (Republic of)",('M','D'),('M','D','A'))
+  , (492, T.pack "Monaco",('M','C'),('M','C','O'))
+  , (496, T.pack "Mongolia",('M','N'),('M','N','G'))
+  , (499, T.pack "Montenegro",('M','E'),('M','N','E'))
+  , (500, T.pack "Montserrat",('M','S'),('M','S','R'))
+  , (504, T.pack "Morocco",('M','A'),('M','A','R'))
+  , (508, T.pack "Mozambique",('M','Z'),('M','O','Z'))
+  , (104, T.pack "Myanmar",('M','M'),('M','M','R'))
+  , (516, T.pack "Namibia",('N','A'),('N','A','M'))
+  , (520, T.pack "Nauru",('N','R'),('N','R','U'))
+  , (524, T.pack "Nepal",('N','P'),('N','P','L'))
+  , (528, T.pack "Netherlands",('N','L'),('N','L','D'))
+  , (540, T.pack "New Caledonia",('N','C'),('N','C','L'))
+  , (554, T.pack "New Zealand",('N','Z'),('N','Z','L'))
+  , (558, T.pack "Nicaragua",('N','I'),('N','I','C'))
+  , (562, T.pack "Niger",('N','E'),('N','E','R'))
+  , (566, T.pack "Nigeria",('N','G'),('N','G','A'))
+  , (570, T.pack "Niue",('N','U'),('N','I','U'))
+  , (574, T.pack "Norfolk Island",('N','F'),('N','F','K'))
+  , (580, T.pack "Northern Mariana Islands",('M','P'),('M','N','P'))
+  , (578, T.pack "Norway",('N','O'),('N','O','R'))
+  , (512, T.pack "Oman",('O','M'),('O','M','N'))
+  , (586, T.pack "Pakistan",('P','K'),('P','A','K'))
+  , (585, T.pack "Palau",('P','W'),('P','L','W'))
+  , (275, T.pack "Palestine, State of",('P','S'),('P','S','E'))
+  , (591, T.pack "Panama",('P','A'),('P','A','N'))
+  , (598, T.pack "Papua New Guinea",('P','G'),('P','N','G'))
+  , (600, T.pack "Paraguay",('P','Y'),('P','R','Y'))
+  , (604, T.pack "Peru",('P','E'),('P','E','R'))
+  , (608, T.pack "Philippines",('P','H'),('P','H','L'))
+  , (612, T.pack "Pitcairn",('P','N'),('P','C','N'))
+  , (616, T.pack "Poland",('P','L'),('P','O','L'))
+  , (620, T.pack "Portugal",('P','T'),('P','R','T'))
+  , (630, T.pack "Puerto Rico",('P','R'),('P','R','I'))
+  , (634, T.pack "Qatar",('Q','A'),('Q','A','T'))
+  , (638, T.pack "Réunion",('R','E'),('R','E','U'))
+  , (642, T.pack "Romania",('R','O'),('R','O','U'))
+  , (643, T.pack "Russian Federation",('R','U'),('R','U','S'))
+  , (646, T.pack "Rwanda",('R','W'),('R','W','A'))
+  , (652, T.pack "Saint Barthélemy",('B','L'),('B','L','M'))
+  , (654, T.pack "Saint Helena, Ascension and Tristan da Cunha",('S','H'),('S','H','N'))
+  , (659, T.pack "Saint Kitts and Nevis",('K','N'),('K','N','A'))
+  , (662, T.pack "Saint Lucia",('L','C'),('L','C','A'))
+  , (663, T.pack "Saint Martin (French part)",('M','F'),('M','A','F'))
+  , (666, T.pack "Saint Pierre and Miquelon",('P','M'),('S','P','M'))
+  , (670, T.pack "Saint Vincent and the Grenadines",('V','C'),('V','C','T'))
+  , (882, T.pack "Samoa",('W','S'),('W','S','M'))
+  , (674, T.pack "San Marino",('S','M'),('S','M','R'))
+  , (678, T.pack "Sao Tome and Principe",('S','T'),('S','T','P'))
+  , (682, T.pack "Saudi Arabia",('S','A'),('S','A','U'))
+  , (686, T.pack "Senegal",('S','N'),('S','E','N'))
+  , (688, T.pack "Serbia",('R','S'),('S','R','B'))
+  , (690, T.pack "Seychelles",('S','C'),('S','Y','C'))
+  , (694, T.pack "Sierra Leone",('S','L'),('S','L','E'))
+  , (702, T.pack "Singapore",('S','G'),('S','G','P'))
+  , (534, T.pack "Sint Maarten (Dutch part)",('S','X'),('S','X','M'))
+  , (703, T.pack "Slovakia",('S','K'),('S','V','K'))
+  , (705, T.pack "Slovenia",('S','I'),('S','V','N'))
+  , (90, T.pack "Solomon Islands",('S','B'),('S','L','B'))
+  , (706, T.pack "Somalia",('S','O'),('S','O','M'))
+  , (710, T.pack "South Africa",('Z','A'),('Z','A','F'))
+  , (239, T.pack "South Georgia and the South Sandwich Islands",('G','S'),('S','G','S'))
+  , (728, T.pack "South Sudan",('S','S'),('S','S','D'))
+  , (724, T.pack "Spain",('E','S'),('E','S','P'))
+  , (144, T.pack "Sri Lanka",('L','K'),('L','K','A'))
+  , (729, T.pack "Sudan",('S','D'),('S','D','N'))
+  , (740, T.pack "Suriname",('S','R'),('S','U','R'))
+  , (744, T.pack "Svalbard and Jan Mayen",('S','J'),('S','J','M'))
+  , (748, T.pack "Swaziland",('S','Z'),('S','W','Z'))
+  , (752, T.pack "Sweden",('S','E'),('S','W','E'))
+  , (756, T.pack "Switzerland",('C','H'),('C','H','E'))
+  , (760, T.pack "Syrian Arab Republic",('S','Y'),('S','Y','R'))
+  , (158, T.pack "Taiwan, Province of China",('T','W'),('T','W','N'))
+  , (762, T.pack "Tajikistan",('T','J'),('T','J','K'))
+  , (834, T.pack "Tanzania, United Republic of",('T','Z'),('T','Z','A'))
+  , (764, T.pack "Thailand",('T','H'),('T','H','A'))
+  , (626, T.pack "Timor-Leste",('T','L'),('T','L','S'))
+  , (768, T.pack "Togo",('T','G'),('T','G','O'))
+  , (772, T.pack "Tokelau",('T','K'),('T','K','L'))
+  , (776, T.pack "Tonga",('T','O'),('T','O','N'))
+  , (780, T.pack "Trinidad and Tobago",('T','T'),('T','T','O'))
+  , (788, T.pack "Tunisia",('T','N'),('T','U','N'))
+  , (792, T.pack "Turkey",('T','R'),('T','U','R'))
+  , (795, T.pack "Turkmenistan",('T','M'),('T','K','M'))
+  , (796, T.pack "Turks and Caicos Islands",('T','C'),('T','C','A'))
+  , (798, T.pack "Tuvalu",('T','V'),('T','U','V'))
+  , (800, T.pack "Uganda",('U','G'),('U','G','A'))
+  , (804, T.pack "Ukraine",('U','A'),('U','K','R'))
+  , (784, T.pack "United Arab Emirates",('A','E'),('A','R','E'))
+  , (826, T.pack "United Kingdom of Great Britain and Northern Ireland",('G','B'),('G','B','R'))
+  , (840, T.pack "United States of America",('U','S'),('U','S','A'))
+  , (581, T.pack "United States Minor Outlying Islands",('U','M'),('U','M','I'))
+  , (858, T.pack "Uruguay",('U','Y'),('U','R','Y'))
+  , (860, T.pack "Uzbekistan",('U','Z'),('U','Z','B'))
+  , (548, T.pack "Vanuatu",('V','U'),('V','U','T'))
+  , (862, T.pack "Venezuela (Bolivarian Republic of)",('V','E'),('V','E','N'))
+  , (704, T.pack "Viet Nam",('V','N'),('V','N','M'))
+  , (92, T.pack "Virgin Islands (British)",('V','G'),('V','G','B'))
+  , (850, T.pack "Virgin Islands (U.S.)",('V','I'),('V','I','R'))
+  , (876, T.pack "Wallis and Futuna",('W','F'),('W','L','F'))
+  , (732, T.pack "Western Sahara",('E','H'),('E','S','H'))
+  , (887, T.pack "Yemen",('Y','E'),('Y','E','M'))
+  , (894, T.pack "Zambia",('Z','M'),('Z','M','B'))
+  , (716, T.pack "Zimbabwe",('Z','W'),('Z','W','E'))
+  ]
+{-# NOINLINE countryNameQuads #-}
diff --git a/src/Country/Unexposed/Enumerate.hs b/src/Country/Unexposed/Enumerate.hs
new file mode 100644
--- /dev/null
+++ b/src/Country/Unexposed/Enumerate.hs
@@ -0,0 +1,258 @@
+module Country.Unexposed.Enumerate where
+
+-- This module is autogenerated. Do not edit it by hand.
+
+import Data.Word (Word16)
+
+enumeratedCountries :: [Word16]
+enumeratedCountries =
+  [ 4
+  , 248
+  , 8
+  , 12
+  , 16
+  , 20
+  , 24
+  , 660
+  , 10
+  , 28
+  , 32
+  , 51
+  , 533
+  , 36
+  , 40
+  , 31
+  , 44
+  , 48
+  , 50
+  , 52
+  , 112
+  , 56
+  , 84
+  , 204
+  , 60
+  , 64
+  , 68
+  , 535
+  , 70
+  , 72
+  , 74
+  , 76
+  , 86
+  , 96
+  , 100
+  , 854
+  , 108
+  , 116
+  , 120
+  , 124
+  , 132
+  , 136
+  , 140
+  , 148
+  , 152
+  , 156
+  , 162
+  , 166
+  , 170
+  , 174
+  , 178
+  , 180
+  , 184
+  , 188
+  , 384
+  , 191
+  , 192
+  , 531
+  , 196
+  , 203
+  , 208
+  , 262
+  , 212
+  , 214
+  , 218
+  , 818
+  , 222
+  , 226
+  , 232
+  , 233
+  , 231
+  , 238
+  , 234
+  , 242
+  , 246
+  , 250
+  , 254
+  , 258
+  , 260
+  , 266
+  , 270
+  , 268
+  , 276
+  , 288
+  , 292
+  , 300
+  , 304
+  , 308
+  , 312
+  , 316
+  , 320
+  , 831
+  , 324
+  , 624
+  , 328
+  , 332
+  , 334
+  , 336
+  , 340
+  , 344
+  , 348
+  , 352
+  , 356
+  , 360
+  , 364
+  , 368
+  , 372
+  , 833
+  , 376
+  , 380
+  , 388
+  , 392
+  , 832
+  , 400
+  , 398
+  , 404
+  , 296
+  , 408
+  , 410
+  , 414
+  , 417
+  , 418
+  , 428
+  , 422
+  , 426
+  , 430
+  , 434
+  , 438
+  , 440
+  , 442
+  , 446
+  , 807
+  , 450
+  , 454
+  , 458
+  , 462
+  , 466
+  , 470
+  , 584
+  , 474
+  , 478
+  , 480
+  , 175
+  , 484
+  , 583
+  , 498
+  , 492
+  , 496
+  , 499
+  , 500
+  , 504
+  , 508
+  , 104
+  , 516
+  , 520
+  , 524
+  , 528
+  , 540
+  , 554
+  , 558
+  , 562
+  , 566
+  , 570
+  , 574
+  , 580
+  , 578
+  , 512
+  , 586
+  , 585
+  , 275
+  , 591
+  , 598
+  , 600
+  , 604
+  , 608
+  , 612
+  , 616
+  , 620
+  , 630
+  , 634
+  , 638
+  , 642
+  , 643
+  , 646
+  , 652
+  , 654
+  , 659
+  , 662
+  , 663
+  , 666
+  , 670
+  , 882
+  , 674
+  , 678
+  , 682
+  , 686
+  , 688
+  , 690
+  , 694
+  , 702
+  , 534
+  , 703
+  , 705
+  , 90
+  , 706
+  , 710
+  , 239
+  , 728
+  , 724
+  , 144
+  , 729
+  , 740
+  , 744
+  , 748
+  , 752
+  , 756
+  , 760
+  , 158
+  , 762
+  , 834
+  , 764
+  , 626
+  , 768
+  , 772
+  , 776
+  , 780
+  , 788
+  , 792
+  , 795
+  , 796
+  , 798
+  , 800
+  , 804
+  , 784
+  , 826
+  , 840
+  , 581
+  , 858
+  , 860
+  , 548
+  , 862
+  , 704
+  , 92
+  , 850
+  , 876
+  , 732
+  , 887
+  , 894
+  , 716
+  ]
diff --git a/src/Country/Unexposed/ExtraNames.hs b/src/Country/Unexposed/ExtraNames.hs
new file mode 100644
--- /dev/null
+++ b/src/Country/Unexposed/ExtraNames.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Country.Unexposed.ExtraNames
+  ( extraNames
+  ) where
+
+import Country.Unsafe (Country)
+import Country.Identifier
+import Data.Text (Text)
+import Data.Primitive (indexArray,newArray,unsafeFreezeArray,writeArray,
+  writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray)
+
+extraNames :: [(Country,Text)]
+extraNames =
+  [ (unitedStatesOfAmerica,"United States")
+  , (unitedStatesOfAmerica,"USA")
+  , (unitedStatesOfAmerica,"U.S.A.")
+  , (mexico,"Estados Unidos Mexicanos")
+  , (mexico,"México")
+  , (mexico,"Méjico")
+  ]
+
diff --git a/src/Country/Unexposed/Names.hs b/src/Country/Unexposed/Names.hs
new file mode 100644
--- /dev/null
+++ b/src/Country/Unexposed/Names.hs
@@ -0,0 +1,45 @@
+module Country.Unexposed.Names
+  ( englishCountryNamesText
+  , englishIdentifierNamesText
+  , numberOfPossibleCodes
+  ) where
+
+import Control.Monad.ST
+import Data.Text (Text)
+import Data.Word
+import Data.Char (toLower,isAlpha)
+import Country.Unexposed.Encode.English (countryNameQuads)
+import Data.Primitive (Array,indexArray,newArray,unsafeFreezeArray,writeArray,
+  writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray)
+import qualified Data.Text as T
+
+englishCountryNamesText :: Array Text
+englishCountryNamesText = runST $ do
+  m <- newArray numberOfPossibleCodes unnamed
+  mapM_ (\(ix,name,_,_) -> writeArray m (word16ToInt ix) name) countryNameQuads
+  unsafeFreezeArray m
+{-# NOINLINE englishCountryNamesText #-}
+
+englishIdentifierNamesText :: Array Text
+englishIdentifierNamesText = runST $ do
+  m <- newArray numberOfPossibleCodes unnamed
+  mapM_ (\(ix,name,_,_) -> writeArray m (word16ToInt ix) (toIdentifier name)) countryNameQuads
+  unsafeFreezeArray m
+{-# NOINLINE englishIdentifierNamesText #-}
+
+toIdentifier :: Text -> Text
+toIdentifier t = case (T.uncons . T.filter isAlpha . T.toTitle) t of
+  Nothing -> T.empty
+  Just (b,bs) -> T.cons (toLower b) bs
+
+
+unnamed :: Text
+unnamed = T.pack "Invalid Country"
+{-# NOINLINE unnamed #-}
+
+numberOfPossibleCodes :: Int
+numberOfPossibleCodes = 1000
+
+word16ToInt :: Word16 -> Int
+word16ToInt = fromIntegral
+
diff --git a/src/Country/Unsafe.hs b/src/Country/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/Country/Unsafe.hs
@@ -0,0 +1,33 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# OPTIONS_HADDOCK not-home #-}
+
+{-| This module provides the data constructor for a 'Country'.
+    While pattern matching on a country is perfectly safe,
+    constructing one is not. There is an invariant the type
+    system does not capture that the country number, as defined
+    by ISO 3166-1, is between the inclusive bounds 0 and 999.
+    Failure to maintain this invariant can cause other functions
+    in this library to segfault.
+-}
+module Country.Unsafe
+  ( Country(..)
+  ) where
+
+import Data.Word (Word16)
+import Data.Hashable (Hashable)
+import Data.Primitive.Types (Prim)
+import Data.Primitive (indexArray)
+import Country.Unexposed.Names (englishIdentifierNamesText)
+import qualified Data.Text as T
+
+-- | A country recognized by ISO 3166.
+newtype Country = Country Word16
+  deriving (Eq,Ord,Prim,Hashable)
+
+instance Show Country where
+  show (Country n) = T.unpack (indexArray englishIdentifierNamesText (word16ToInt n))
+
+word16ToInt :: Word16 -> Int
+word16ToInt = fromIntegral
+
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,2 @@
+main :: IO ()
+main = putStrLn "Test suite not yet implemented"
