diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2010-2012, Amy de Buitléir
+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 the author 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 
+HOLDER 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/gray-extended.cabal b/gray-extended.cabal
new file mode 100644
--- /dev/null
+++ b/gray-extended.cabal
@@ -0,0 +1,37 @@
+name:           gray-extended
+version:        1.2
+synopsis:       Gray encoding schemes
+description:    Gray codes satisfy the property that two successive values 
+                differ in only one digit. Usually the term \"Gray code\"
+                refers to the Binary Reflected Gray code (BRGC),  but 
+                non-binary Gray codes have also been discovered.
+category:       Math
+Homepage:       https://github.com/mhwombat/gray-extended
+cabal-version:  >=1.8
+build-type:     Simple
+author:         Amy de Buitléir
+copyright:      (c) Amy de Buitléir 2010-2012
+license:        BSD3
+stability:      experimental
+maintainer:     amy@nualeargais.ie
+license-file:   LICENSE
+
+library
+  hs-source-dirs:  src
+  build-depends:   base ==4.*,
+                   base-unicode-symbols ==0.2.*
+  ghc-options:     -Wall
+  exposed-modules: Codec.Gray
+
+test-suite gray-extended-tests
+  type:            exitcode-stdio-1.0
+  build-depends:   base ==4.*,
+                   test-framework-quickcheck2 == 0.2.*,
+                   QuickCheck == 2.4.*,
+                   test-framework == 0.*,
+                   base-unicode-symbols ==0.2.*,
+                   gray-extended
+  hs-source-dirs:  test
+  ghc-options:     -Wall -Werror -rtsopts
+  main-is:         Main.hs
+
diff --git a/src/Codec/Gray.hs b/src/Codec/Gray.hs
new file mode 100644
--- /dev/null
+++ b/src/Codec/Gray.hs
@@ -0,0 +1,51 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Codec.Gray
+-- Copyright   :  (c) Amy de Buitléir 2011-2012
+-- License     :  BSD-style
+-- Maintainer  :  amy@nualeargais.ie
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- Gray encoding schemes. A Gray code is a list of values such that two
+-- successive values differ in only one digit. Usually the term /Gray code/
+-- refers to the Binary Reflected Gray code (BRGC), but non-binary Gray codes
+-- have also been discovered. Some Gray codes are also /cyclic/: the last and
+-- first values differ in only one digit.
+--
+-----------------------------------------------------------------------------
+{-# LANGUAGE UnicodeSyntax #-}
+
+module Codec.Gray 
+  (
+    grayCodes,
+    naryGrayCodes
+  ) where
+
+import Data.List (foldl')
+
+-- | @'grayCodes' k@ generates the list of Binary Reflected Gray Code (BRGC)
+--   numbers of length k. This code is cyclic.
+grayCodes ∷ Int → [[Bool]]
+grayCodes 0 = [[]]
+grayCodes k = 
+  let xs = grayCodes (k-1) in map (False:) xs ++ map (True:) (reverse xs)
+
+-- | @'naryGrayCodes' xs k@ generates a non-Boolean (or n-ary) Gray code of
+--   length @k@ using the elements of @x@ as "digits". This code is cyclic.
+--
+--   Ex: @'naryGrayCodes' "012" 4@ generates a ternary Gray code that is 
+--   four digits long.
+naryGrayCodes ∷ [a] → Int → [[a]]
+naryGrayCodes xs 1 = map (\x → [x]) xs
+naryGrayCodes xs k = snd $ foldl' prefixAndShift (ys,[]) xs'
+  where ys = naryGrayCodes xs 1
+        xs' = naryGrayCodes xs (k-1)
+
+-- | Shift elements right.
+shift ∷ [a] → [a]
+shift as = last as : init as
+
+prefixAndShift ∷ ([[a]],[[a]]) → [a] → ([[a]],[[a]])
+prefixAndShift (ys,zs) xs = (shift ys, zs ++ (map (xs++) ys))
+
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE UnicodeSyntax #-}
+module Main where
+
+import Codec.GrayQC ( test )
+
+import Test.Framework as TF ( defaultMain, Test )
+
+tests ∷ [TF.Test]
+tests = 
+  [ 
+    Codec.GrayQC.test
+  ]
+
+main ∷ IO ()
+main = defaultMain tests
