diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,11 @@
+Changelog
+=========
+
+Version 0.1.0.0
+---------------
+
+*Feb 10, 2018*
+
+<https://github.com/mstksg/hmatrix-vector-sized/releases/tag/v0.1.0.0>
+
+*   Initial release
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Justin Le (c) 2018
+
+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 Justin Le 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,11 @@
+# hmatrix-vector-sized
+
+[![hmatrix-vector-sized on Hackage](https://img.shields.io/hackage/v/hmatrix-vector-sized.svg?maxAge=2592000)](https://hackage.haskell.org/package/hmatrix-vector-sized)
+[![Build Status](https://travis-ci.org/mstksg/hmatrix-vector-sized.svg?branch=master)](https://travis-ci.org/mstksg/hmatrix-vector-sized)
+
+Conversion between statically sized types in *[hmatrix][]* (in the
+*[Numeric.LinearAlgebra.Static][static]* module) and *[vector-sized][]*.
+
+[hmatrix]: http://hackage.haskell.org/package/hmatrix
+[vector-sized]: http://hackage.haskell.org/package/vector-sized
+[static]: https://hackage.haskell.org/package/hmatrix-0.18.2.0/docs/Numeric-LinearAlgebra-Static.html
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/hmatrix-vector-sized.cabal b/hmatrix-vector-sized.cabal
new file mode 100644
--- /dev/null
+++ b/hmatrix-vector-sized.cabal
@@ -0,0 +1,62 @@
+-- This file has been generated from package.yaml by hpack version 0.20.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 70aa6c0a47ec2f24e7aa0c898db148bf6e298635849cef213bfdd866941396e3
+
+name:           hmatrix-vector-sized
+version:        0.1.0.0
+synopsis:       Conversions between hmatrix and vector-sized types
+description:    Conversions between statically sized types in hmatrix and vector-sized.
+                .
+                See README on Github <https://github.com/mstksg/hmatrix-vector-sized#readme>
+category:       Math
+homepage:       https://github.com/mstksg/hmatrix-vector-sized#readme
+bug-reports:    https://github.com/mstksg/hmatrix-vector-sized/issues
+author:         Justin Le
+maintainer:     justin@jle.im
+copyright:      (c) Justin Le 2018
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
+
+extra-source-files:
+    CHANGELOG.md
+    README.md
+
+source-repository head
+  type: git
+  location: https://github.com/mstksg/hmatrix-vector-sized
+
+library
+  hs-source-dirs:
+      src
+  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wredundant-constraints
+  build-depends:
+      base >=4.7 && <5
+    , hmatrix >=0.18
+    , vector
+    , vector-sized >=0.4.1
+  exposed-modules:
+      Numeric.LinearAlgebra.Static.Vector
+  other-modules:
+      Paths_hmatrix_vector_sized
+  default-language: Haskell2010
+
+test-suite hmatrix-vector-sized-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  hs-source-dirs:
+      test
+  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      base >=4.7 && <5
+    , hedgehog
+    , hmatrix >=0.18
+    , hmatrix-vector-sized
+    , vector
+    , vector-sized >=0.4.1
+  other-modules:
+      Paths_hmatrix_vector_sized
+  default-language: Haskell2010
diff --git a/src/Numeric/LinearAlgebra/Static/Vector.hs b/src/Numeric/LinearAlgebra/Static/Vector.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/LinearAlgebra/Static/Vector.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-- |
+-- Module      : Numeric.LinearAlgebra.Static.Vector
+-- Copyright   : (c) Justin Le 2018
+-- License     : BSD3
+--
+-- Maintainer  : justin@jle.im
+-- Stability   : experimental
+-- Portability : non-portable
+--
+-- Conversions between statically sized types in
+-- "Numeric.LinearAlgebra.Static" from /hmatrix/ and /vector-sized/.
+--
+-- This module is intentionally minimal, exporting only functions that
+-- cannot be written without "unsafe" operations.  With these, however, you
+-- can easily write other useful combinators by using type-safe operations
+-- like 'fmap', 'VS.map', 'liftA2', 'Data.Vector.Generic.Sized.convert',
+-- etc.
+--
+
+module Numeric.LinearAlgebra.Static.Vector (
+  -- * Vector
+  -- ** Real
+    rVec
+  , vecR
+  -- ** Complex
+  , cVec
+  , vecC
+  -- * Matrix
+  -- ** Real
+  , lRows
+  , rowsL
+  , lCols
+  , colsL
+  -- ** Complex
+  , mRows
+  , rowsM
+  , mCols
+  , colsM
+  ) where
+
+import           Data.Foldable
+import           Unsafe.Coerce
+import qualified Data.Vector                  as UV
+import qualified Data.Vector.Sized            as V
+import qualified Data.Vector.Storable.Sized   as VS
+import qualified Numeric.LinearAlgebra        as HU
+import qualified Numeric.LinearAlgebra.Static as H
+
+-- | Convert an /hmatrix/ vector (parameterized by its lenth) to
+-- a /vector-sized/ storable vector of 'Double's.
+rVec :: H.R n -> VS.Vector n H.ℝ
+rVec = unsafeCoerce
+
+-- | Convert a /vector-sized/ storable vector to an /hmatrix/ vector
+-- (parameterized by its lenth).
+vecR :: VS.Vector n H.ℝ -> H.R n
+vecR = unsafeCoerce
+
+-- | Convert an /hmatrix/ complex vector (parameterized by its lenth) to
+-- a /vector-sized/ storable vector of 'Complex Double's, preserving the
+-- length in the type.
+cVec :: H.C n -> VS.Vector n H.ℂ
+cVec = unsafeCoerce
+
+-- | Convert a /vector-sized/ storable vector to an /hmatrix/ complex
+-- vector (parameterized by its lenth), preserving the length in the type.
+vecC :: VS.Vector n H.ℂ -> H.C n
+vecC = unsafeCoerce
+
+-- | Split an /hmatrix/ matrix (parameterized by its dimensions) to
+-- a /vector-sized/ boxed vector of its rows (as /hmatrix/ vectors).
+lRows
+    :: forall m n. ()
+    => H.L m n
+    -> V.Vector m (H.R n)
+lRows = unsafeCoerce
+      . UV.fromList
+      . HU.toRows
+      . (unsafeCoerce :: H.L m n -> HU.Matrix Double)
+
+-- | Join together a /vector-sized/ boxed vector of /hmatrix/ vectors to an
+-- /hmatrix/ matrix as its rows.
+rowsL
+    :: forall m n. ()
+    => V.Vector m (H.R n)
+    -> H.L m n
+rowsL = (unsafeCoerce :: HU.Matrix Double -> H.L m n)
+      . HU.fromRows
+      . map (unsafeCoerce :: H.R n -> HU.Vector Double)
+      . toList
+
+-- | Split an /hmatrix/ matrix (parameterized by its dimensions) to
+-- a /vector-sized/ boxed vector of its columns (as /hmatrix/ vectors).
+lCols
+    :: forall m n. ()
+    => H.L m n
+    -> V.Vector n (H.R m)
+lCols = unsafeCoerce
+      . UV.fromList
+      . HU.toColumns
+      . (unsafeCoerce :: H.L m n -> HU.Matrix Double)
+
+-- | Join together a /vector-sized/ boxed vector of /hmatrix/ vectors to an
+-- /hmatrix/ matrix as its columns.
+colsL
+    :: forall m n. ()
+    => V.Vector n (H.R m)
+    -> H.L m n
+colsL = (unsafeCoerce :: HU.Matrix Double -> H.L m n)
+      . HU.fromColumns
+      . map (unsafeCoerce :: H.R m -> HU.Vector Double)
+      . toList
+
+-- | Split an /hmatrix/ complex matrix (parameterized by its dimensions) to
+-- a /vector-sized/ boxed vector of its rows (as /hmatrix/ complex
+-- vectors).
+mRows
+    :: forall m n. ()
+    => H.M m n
+    -> V.Vector m (H.C n)
+mRows = unsafeCoerce
+      . UV.fromList
+      . HU.toRows
+      . (unsafeCoerce :: H.M m n -> HU.Matrix H.ℂ)
+
+-- | Join together a /vector-sized/ boxed vector of /hmatrix/ complex
+-- vectors to an /hmatrix/ complex matrix as its rows.
+rowsM
+    :: forall m n. ()
+    => V.Vector m (H.C n)
+    -> H.M m n
+rowsM = (unsafeCoerce :: HU.Matrix H.ℂ -> H.M m n)
+      . HU.fromRows
+      . map (unsafeCoerce :: H.C n -> HU.Vector H.ℂ)
+      . toList
+
+-- | Split an /hmatrix/ complex matrix (parameterized by its dimensions) to
+-- a /vector-sized/ boxed vector of its columns (as /hmatrix/ complex
+-- vectors).
+mCols
+    :: forall m n. ()
+    => H.M m n
+    -> V.Vector n (H.C m)
+mCols = unsafeCoerce
+      . UV.fromList
+      . HU.toColumns
+      . (unsafeCoerce :: H.M m n -> HU.Matrix H.ℂ)
+
+-- | Join together a /vector-sized/ boxed vector of /hmatrix/ complex
+-- vectors to an /hmatrix/ complex matrix as its columns.
+colsM
+    :: forall m n. ()
+    => V.Vector n (H.C m)
+    -> H.M m n
+colsM = (unsafeCoerce :: HU.Matrix H.ℂ -> H.M m n)
+      . HU.fromColumns
+      . map (unsafeCoerce :: H.C m -> HU.Vector H.ℂ)
+      . toList
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,164 @@
+{-# LANGUAGE ScopedTypeVariables  #-}
+{-# LANGUAGE TemplateHaskell      #-}
+{-# LANGUAGE TypeApplications     #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+import           Control.Monad
+import           Data.Complex
+import           Data.Function
+import           Data.Functor.Identity
+import           Data.Maybe
+import           Data.Proxy
+import           GHC.TypeLits
+import           Hedgehog
+import           System.Exit
+import           System.IO
+import qualified Data.Vector.Sized                   as V
+import qualified Data.Vector.Storable.Sized          as VS
+import qualified Hedgehog.Gen                        as Gen
+import qualified Hedgehog.Range                      as Range
+import qualified Numeric.LinearAlgebra               as HU
+import qualified Numeric.LinearAlgebra.Static        as H
+import qualified Numeric.LinearAlgebra.Static.Vector as H
+
+instance KnownNat n => Eq (H.R n) where
+    (==) = (==) `on` H.extract
+
+instance KnownNat n => Eq (H.C n) where
+    (==) = (==) `on` H.extract
+
+instance (KnownNat m, KnownNat n) => Eq (H.L m n) where
+    (==) = (==) `on` H.extract
+
+instance (KnownNat m, KnownNat n) => Eq (H.M m n) where
+    (==) = (==) `on` H.extract
+
+genDouble :: Gen H.ℝ
+genDouble = Gen.double (Range.linearFracFrom 0 (-10) 10)
+
+genComplex :: Gen H.ℂ
+genComplex = (:+) <$> genDouble <*> genDouble
+
+prop_rVec :: Property
+prop_rVec = property $ do
+    xs <- forAll $ Gen.list (Range.constant 5 10) genDouble
+    case fromJust $ someNatVal (fromIntegral (length xs)) of
+      SomeNat (Proxy :: Proxy n) ->
+        tripping (H.vector @n xs)
+                 (VS.map (* 2) . H.rVec)
+                 (Identity . (/ 2) . H.vecR)
+
+prop_vecR :: Property
+prop_vecR = property $ do
+    xs <- forAll $ Gen.list (Range.constant 5 10) genDouble
+    VS.withSizedList xs $ \v ->
+      tripping v ((* 2) . H.vecR)
+                 (Identity . VS.map (/ 2) . H.rVec)
+
+prop_cVec :: Property
+prop_cVec = property $ do
+    xs <- forAll $ Gen.list (Range.constant 5 10) genComplex
+    case fromJust $ someNatVal (fromIntegral (length xs)) of
+      SomeNat (Proxy :: Proxy n) ->
+        tripping (fromJust . H.create $ HU.fromList xs)
+                 (VS.map (* 2) . H.cVec @n)
+                 (Identity . (/ 2) . H.vecC)
+
+prop_vecC :: Property
+prop_vecC = property $ do
+    xs <- forAll $ Gen.list (Range.constant 5 10) genComplex
+    VS.withSizedList xs $ \v ->
+      tripping v ((* 2) . H.vecC)
+                 (Identity . VS.map (/ 2) . H.cVec)
+
+genMatList :: Gen a -> Gen (SomeNat, SomeNat, [[a]])
+genMatList g = do
+    m  <- Gen.int (Range.constant 5 10)
+    n  <- Gen.int (Range.constant 5 10)
+    xs <- (replicateM m . replicateM n) g
+    return ( fromJust . someNatVal . fromIntegral $ m
+           , fromJust . someNatVal . fromIntegral $ n
+           , xs
+           )
+
+prop_lRows :: Property
+prop_lRows = property $ do
+    ( SomeNat (Proxy :: Proxy m)
+     , SomeNat (Proxy :: Proxy n)
+     , xs
+     ) <- forAll $ genMatList genDouble
+    tripping (fromJust . H.create $ HU.fromLists xs)
+             (V.map (* 2) . H.lRows @m @n)
+             (Identity . (/ 2) . H.rowsL)
+
+prop_rowsL :: Property
+prop_rowsL = property $ do
+    (_, SomeNat (Proxy :: Proxy n), xs)  <- forAll $ genMatList genDouble
+    V.withSizedList xs $ \(v :: V.Vector m [Double]) ->
+      tripping (V.map (fromJust . H.create . HU.fromList) v)
+               ((* 2) . H.rowsL @m @n)
+               (Identity . V.map (/ 2) . H.lRows)
+
+prop_lCols :: Property
+prop_lCols = property $ do
+    ( SomeNat (Proxy :: Proxy m)
+     , SomeNat (Proxy :: Proxy n)
+     , xs
+     ) <- forAll $ genMatList genDouble
+    tripping (fromJust . H.create $ HU.fromLists xs)
+             (V.map (* 2) . H.lCols @m @n)
+             (Identity . (/ 2) . H.colsL)
+
+prop_colsL :: Property
+prop_colsL = property $ do
+    (_, SomeNat (Proxy :: Proxy m), xs)  <- forAll $ genMatList genDouble
+    V.withSizedList xs $ \(v :: V.Vector n [Double]) ->
+      tripping (V.map (fromJust . H.create . HU.fromList) v)
+               ((* 2) . H.colsL @m @n)
+               (Identity . V.map (/ 2) . H.lCols)
+
+prop_mRows :: Property
+prop_mRows = property $ do
+    ( SomeNat (Proxy :: Proxy m)
+     , SomeNat (Proxy :: Proxy n)
+     , xs
+     ) <- forAll $ genMatList genComplex
+    tripping (fromJust . H.create $ HU.fromLists xs)
+             (V.map (* 2) . H.mRows @m @n)
+             (Identity . (/ 2) . H.rowsM)
+
+prop_rowsM :: Property
+prop_rowsM = property $ do
+    (_, SomeNat (Proxy :: Proxy n), xs)  <- forAll $ genMatList genComplex
+    V.withSizedList xs $ \(v :: V.Vector m [Complex Double]) ->
+      tripping (V.map (fromJust . H.create . HU.fromList) v)
+               ((* 2) . H.rowsM @m @n)
+               (Identity . V.map (/ 2) . H.mRows)
+
+prop_mCols :: Property
+prop_mCols = property $ do
+    ( SomeNat (Proxy :: Proxy m)
+     , SomeNat (Proxy :: Proxy n)
+     , xs
+     ) <- forAll $ genMatList genComplex
+    tripping (fromJust . H.create $ HU.fromLists xs)
+             (V.map (* 2) . H.mCols @m @n)
+             (Identity . (/ 2) . H.colsM)
+
+prop_colsM :: Property
+prop_colsM = property $ do
+    (_, SomeNat (Proxy :: Proxy m), xs)  <- forAll $ genMatList genComplex
+    V.withSizedList xs $ \(v :: V.Vector n [Complex Double]) ->
+      tripping (V.map (fromJust . H.create . HU.fromList) v)
+               ((* 2) . H.colsM @m @n)
+               (Identity . V.map (/ 2) . H.mCols)
+
+main :: IO ()
+main = do
+  hSetBuffering stdout LineBuffering
+  hSetBuffering stderr LineBuffering
+
+  results <- checkParallel $$(discover)
+
+  unless results exitFailure
+
