diff --git a/Control/Invertible/Monoidal/HList.hs b/Control/Invertible/Monoidal/HList.hs
new file mode 100644
--- /dev/null
+++ b/Control/Invertible/Monoidal/HList.hs
@@ -0,0 +1,35 @@
+-- |
+-- Combine monoidal functors into HLists.
+{-# LANGUAGE TypeOperators, DataKinds, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, TypeFamilies, UndecidableInstances #-}
+module Control.Invertible.Monoidal.HList
+  ( hConsI
+  , (>:*<)
+  , HSequenceI(..)
+  ) where
+
+import Prelude hiding (Functor(..), (<$>), fst, snd, id)
+import qualified Data.HList as HL
+
+import Data.Invertible.HList
+import Control.Invertible.Monoidal
+
+-- |'HL.HCons' two monoidal functors.
+hConsI :: Monoidal f => f a -> f (HL.HList l) -> f (HL.HList (a ': l))
+hConsI = liftI2 hCons
+
+-- |Infix alias for 'hConsI'.
+(>:*<) :: Monoidal f => f a -> f (HL.HList l) -> f (HL.HList (a ': l))
+(>:*<) = hConsI
+
+infixr 4 >:*<
+
+-- |A monoidal version of 'HL.HSequence': a heteogeneous version of 'sequenceMaybesI'.
+class (Monoidal m, HL.SameLength a b) => HSequenceI m a b | a -> b, m b -> a where
+  hSequenceI :: HL.HList a -> m (HL.HList b)
+
+instance Monoidal m => HSequenceI m '[] '[] where
+  hSequenceI _ = pureI HL.HNil
+
+instance (m1 ~ m, Monoidal m, HSequenceI m as bs) => HSequenceI m (m1 a ': as) (a ': bs) where
+  hSequenceI (HL.HCons a b) = a >:*< hSequenceI b
+
diff --git a/Data/Invertible/HList.hs b/Data/Invertible/HList.hs
new file mode 100644
--- /dev/null
+++ b/Data/Invertible/HList.hs
@@ -0,0 +1,36 @@
+-- |
+-- Bidirectional version of "Data.HList.HList".
+{-# LANGUAGE DataKinds, QuasiQuotes, TypeOperators, FlexibleContexts #-}
+module Data.Invertible.HList
+  ( hCons
+  , hReverse
+  , hReverse_
+  , hAppend
+  , hZip
+  ) where
+
+import qualified Data.HList as HL
+import Data.Proxy (Proxy(..))
+
+import Data.Invertible.Bijection
+import Data.Invertible.TH
+
+-- |(De)construct an list from a head and tail.
+hCons :: (a, HL.HList l) <-> HL.HList (a ': l)
+hCons = [biCase|(a, l) <-> HL.HCons a l|]
+
+-- |'HL.hReverse' the order of a list.
+hReverse :: (HL.HReverse a b, HL.HReverse b a) => HL.HList a <-> HL.HList b
+hReverse = HL.hReverse :<->: HL.hReverse
+
+-- |'HL.hReverse_' the order of a list.
+hReverse_ :: (HL.HRevApp a '[] b, HL.HRevApp b '[] a) => HL.HList a <-> HL.HList b
+hReverse_ = HL.hReverse_ :<->: HL.hReverse_
+
+-- |'HL.hAppend' (concatenate) or split two lists.
+hAppend :: (HL.HAppendList a b, HL.HSplitAt n (HL.HAppendListR a b) a b) => (HL.HList a, HL.HList b) <-> HL.HList (HL.HAppendListR a b)
+hAppend = uncurry HL.hAppendList :<->: HL.hSplitAt Proxy
+
+-- |'HL.hZip' two lists together.
+hZip :: HL.HZipList a b l => (HL.HList a, HL.HList b) <-> HL.HList l
+hZip = uncurry HL.hZipList :<->: HL.hUnzipList
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2016-2017, Dylan Simon
+
+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 Dylan Simon 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/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/invertible-hlist.cabal b/invertible-hlist.cabal
new file mode 100644
--- /dev/null
+++ b/invertible-hlist.cabal
@@ -0,0 +1,29 @@
+name:                invertible-hlist
+version:             0.2.0.2
+synopsis:            invertible functions and instances for HList
+description:         Provides invertible functions and instances for HList. This was formerly part of invertible itself and has been split off.
+license:             BSD3
+license-file:        LICENSE
+author:              Dylan Simon
+maintainer:          dylan@dylex.net
+copyright:           2016
+category:            Data, Control, Composition
+build-type:          Simple
+cabal-version:       >=1.10
+tested-with:         GHC == 7.10.3, GHC == 8.0.1
+
+source-repository head
+  type: git
+  location: https://github.com/dylex/invertible
+
+library
+  exposed-modules:
+    Data.Invertible.HList
+    Control.Invertible.Monoidal.HList
+
+  build-depends:
+    base >= 4.8 && <5,
+    invertible > 0.2.0.1,
+    HList == 0.4.*
+  default-language:    Haskell2010
+  ghc-options: -Wall
