diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,11 @@
+## [*Unreleased*](https://github.com/freckle/bcp47/compare/bcp47-orphans-v0.1.0.1...master)
+
+None
+
+## [v0.1.0.1](https://github.com/freckle/bcp47/compare/bcp47-orphans-v0.1.0.0...bcp47-orphans-v0.1.0.1)
+
+- Instances for `HttpApiData` [#10](https://github.com/freckle/bcp47/pull/10)
+
+## [v0.1.0.0](https://github.com/freckle/bcp47/tree/v0.1.0.0)
+
+First tagged release.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2018 Freckle
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# bcp47-orphans
+
+Orphan instances for the `BCP47` type
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/bcp47-orphans.cabal b/bcp47-orphans.cabal
new file mode 100644
--- /dev/null
+++ b/bcp47-orphans.cabal
@@ -0,0 +1,67 @@
+cabal-version:      1.12
+name:               bcp47-orphans
+version:            0.1.0.1
+license:            MIT
+license-file:       LICENSE
+copyright:          2019 Freckle Education
+maintainer:         engineering@freckle.com
+author:             Evan Rutledge Borden
+homepage:           https://github.com/freckle/bcp47#readme
+bug-reports:        https://github.com/freckle/bcp47/issues
+synopsis:           BCP47 orphan instances
+description:        Orphan instances for the BCP47 type
+category:           Orphan Instances
+build-type:         Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+
+source-repository head
+    type:     git
+    location: https://github.com/freckle/bcp47
+
+library
+    exposed-modules:
+        Data.BCP47.Csv
+        Data.BCP47.Esqueleto
+        Data.BCP47.Hashable
+        Data.BCP47.HttpApiData
+        Data.BCP47.PathPieces
+        Data.BCP47.Persist
+
+    hs-source-dirs:   library
+    other-modules:    Paths_bcp47_orphans
+    default-language: Haskell2010
+    build-depends:
+        base >=4.7 && <5,
+        bcp47 >=0.2.0.0 && <0.3,
+        cassava >=0.5.2.0 && <0.6,
+        errors >=2.3.0 && <2.4,
+        esqueleto >=3.3.4.1 && <3.4,
+        hashable >=1.3.0.0 && <1.4,
+        http-api-data >=0.4.1.1 && <0.5,
+        path-pieces >=0.2.1 && <0.3,
+        persistent >=2.10.5.3 && <2.11,
+        text >=1.2.4.0 && <1.3
+
+test-suite spec
+    type:             exitcode-stdio-1.0
+    main-is:          Main.hs
+    hs-source-dirs:   tests
+    other-modules:
+        Data.BCP47.CsvSpec
+        Data.BCP47.PathPiecesSpec
+        Data.BCP47.PersistSpec
+        Data.BCP47.Roundtrip
+        Paths_bcp47_orphans
+
+    default-language: Haskell2010
+    build-depends:
+        QuickCheck >=2.13.2 && <2.14,
+        base >=4.7 && <5,
+        bcp47 >=0.2.0.0 && <0.3,
+        bcp47-orphans -any,
+        cassava >=0.5.2.0 && <0.6,
+        hspec >=2.7.4 && <2.8,
+        path-pieces >=0.2.1 && <0.3,
+        persistent >=2.10.5.3 && <2.11
diff --git a/library/Data/BCP47/Csv.hs b/library/Data/BCP47/Csv.hs
new file mode 100644
--- /dev/null
+++ b/library/Data/BCP47/Csv.hs
@@ -0,0 +1,15 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Data.BCP47.Csv () where
+
+import Data.BCP47 (BCP47, fromText, toText)
+import Data.Csv (FromField(..), ToField(..))
+import Data.Text (unpack)
+
+instance ToField BCP47 where
+  toField = toField . toText
+
+instance FromField BCP47 where
+  parseField bytes = do
+    text <- parseField bytes
+    either (fail . unpack) pure $ fromText text
diff --git a/library/Data/BCP47/Esqueleto.hs b/library/Data/BCP47/Esqueleto.hs
new file mode 100644
--- /dev/null
+++ b/library/Data/BCP47/Esqueleto.hs
@@ -0,0 +1,9 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Data.BCP47.Esqueleto () where
+
+import Data.BCP47
+import Data.BCP47.Persist ()
+import Database.Esqueleto (SqlString)
+
+instance SqlString BCP47
diff --git a/library/Data/BCP47/Hashable.hs b/library/Data/BCP47/Hashable.hs
new file mode 100644
--- /dev/null
+++ b/library/Data/BCP47/Hashable.hs
@@ -0,0 +1,9 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Data.BCP47.Hashable () where
+
+import Data.BCP47 (BCP47, toText)
+import Data.Hashable (Hashable(..))
+
+instance Hashable BCP47 where
+  hashWithSalt i = hashWithSalt i . toText
diff --git a/library/Data/BCP47/HttpApiData.hs b/library/Data/BCP47/HttpApiData.hs
new file mode 100644
--- /dev/null
+++ b/library/Data/BCP47/HttpApiData.hs
@@ -0,0 +1,14 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Data.BCP47.HttpApiData
+  ()
+where
+
+import Data.BCP47 (BCP47, fromText, toText)
+import Web.HttpApiData (FromHttpApiData(..), ToHttpApiData(..))
+
+instance ToHttpApiData BCP47 where
+  toUrlPiece = toText
+
+instance FromHttpApiData BCP47 where
+  parseUrlPiece = fromText
diff --git a/library/Data/BCP47/PathPieces.hs b/library/Data/BCP47/PathPieces.hs
new file mode 100644
--- /dev/null
+++ b/library/Data/BCP47/PathPieces.hs
@@ -0,0 +1,11 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Data.BCP47.PathPieces () where
+
+import Control.Error.Util (hush)
+import Data.BCP47 (BCP47, fromText, toText)
+import Web.PathPieces (PathPiece(..))
+
+instance PathPiece BCP47 where
+  fromPathPiece = hush . fromText
+  toPathPiece = toText
diff --git a/library/Data/BCP47/Persist.hs b/library/Data/BCP47/Persist.hs
new file mode 100644
--- /dev/null
+++ b/library/Data/BCP47/Persist.hs
@@ -0,0 +1,20 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# LANGUAGE TypeApplications #-}
+
+module Data.BCP47.Persist () where
+
+import Control.Monad ((<=<))
+import Data.BCP47 (BCP47, fromText, toText)
+import Data.Proxy (Proxy(..))
+import Data.Text (Text)
+import Database.Persist.Class (PersistField(..))
+import Database.Persist.Sql (PersistFieldSql(..))
+
+instance PersistField BCP47 where
+  toPersistValue = toPersistValue . toText
+  fromPersistValue = fromText <=< fromPersistValue
+
+instance PersistFieldSql BCP47 where
+  -- sqlType for Text should be SqlString, but we don't hardcode in the
+  -- unlikely case that changes
+  sqlType _ = sqlType @Text Proxy
diff --git a/tests/Data/BCP47/CsvSpec.hs b/tests/Data/BCP47/CsvSpec.hs
new file mode 100644
--- /dev/null
+++ b/tests/Data/BCP47/CsvSpec.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE TypeApplications #-}
+
+module Data.BCP47.CsvSpec
+  ( spec
+  ) where
+
+import Data.BCP47 (BCP47)
+import Data.BCP47.Csv ()
+import Data.BCP47.Roundtrip (roundtrips)
+import Data.Csv (parseField, runParser, toField)
+import Test.Hspec
+import Test.QuickCheck (property)
+
+spec :: Spec
+spec =
+  describe "ToField/FromField"
+    . it "roundtrips"
+    . property
+    . roundtrips @BCP47 toField
+    $ runParser
+    . parseField
diff --git a/tests/Data/BCP47/PathPiecesSpec.hs b/tests/Data/BCP47/PathPiecesSpec.hs
new file mode 100644
--- /dev/null
+++ b/tests/Data/BCP47/PathPiecesSpec.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE TypeApplications #-}
+
+module Data.BCP47.PathPiecesSpec
+  ( spec
+  ) where
+
+import Data.BCP47 (BCP47)
+import Data.BCP47.PathPieces ()
+import Data.BCP47.Roundtrip (roundtrips)
+import Test.Hspec
+import Test.QuickCheck (property)
+import Web.PathPieces (fromPathPiece, toPathPiece)
+
+spec :: Spec
+spec = describe "PathPiece" . it "roundtrips" . property $ roundtrips @BCP47
+  toPathPiece
+  fromPathPiece
diff --git a/tests/Data/BCP47/PersistSpec.hs b/tests/Data/BCP47/PersistSpec.hs
new file mode 100644
--- /dev/null
+++ b/tests/Data/BCP47/PersistSpec.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE TypeApplications #-}
+
+module Data.BCP47.PersistSpec
+  ( spec
+  ) where
+
+import Data.BCP47 (BCP47)
+import Data.BCP47.Persist ()
+import Data.BCP47.Roundtrip (roundtrips)
+import Database.Persist.Class (fromPersistValue, toPersistValue)
+import Test.Hspec
+import Test.QuickCheck (property)
+
+spec :: Spec
+spec = describe "PersistField" . it "roundtrips" . property $ roundtrips @BCP47
+  toPersistValue
+  fromPersistValue
diff --git a/tests/Data/BCP47/Roundtrip.hs b/tests/Data/BCP47/Roundtrip.hs
new file mode 100644
--- /dev/null
+++ b/tests/Data/BCP47/Roundtrip.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Data.BCP47.Roundtrip
+  ( roundtrips
+  ) where
+
+roundtrips
+  :: forall a b f
+   . (Eq (f a), Applicative f)
+  => (a -> b)
+  -- ^ Encode
+  -> (b -> f a)
+  -- ^ Decode
+  -> a
+  -> Bool
+roundtrips encode decode x = decode (encode x) == pure x
diff --git a/tests/Main.hs b/tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/tests/Main.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
