diff --git a/Data/Char/WCWidth.hs b/Data/Char/WCWidth.hs
new file mode 100644
--- /dev/null
+++ b/Data/Char/WCWidth.hs
@@ -0,0 +1,74 @@
+
+
+{-# LANGUAGE ForeignFunctionInterface
+  #-}
+
+
+{-| A binding for the native 'wcwidth'. It's important that you 'setLocale'
+    before using it, like this:
+
+ >  #!/usr/bin/env runhaskell
+ >
+ >  import Text.Printf
+ >  
+ >  import System.Locale.SetLocale
+ >  import Data.Char.WCWidth
+ >
+ >  main                     =  do
+ >    setLocale LC_ALL (Just "")
+ >    sequence_ [ display c | c <- chars ]
+ >   where
+ >    chars                  =  [minBound..'A']
+ >    display c = printf "%04x  %2d  %s\n" (fromEnum c) (wcwidth c) (show c)
+
+    The program file @WCWidthTableaux.hs@ contains a more extensive example of
+    using 'wcwidth'.
+
+    Note that this binding to the native implementation gets certain
+    characters wrong in obvious ways as well as ways that are problematic for
+    indentation based languages. The ASCII tab should be assigned a width of
+    8, not -1; and one is likely to find -1 assigned to  numerous obscure
+    characters (for example, symbols from the Book of Changes).
+
+ -}
+
+
+module Data.Char.WCWidth
+  ( wcwidth
+  , widths
+  , ranges
+  ) where
+
+import Foreign.C
+import Data.List
+
+
+
+
+{-| Widths of all characters. 
+ -}
+widths                      ::  [ (Char, Int) ]
+widths                       =  [ (c, wcwidth c) | c <- [minBound..maxBound] ] 
+
+
+{-| Characters broken into contiguous ranges with the same width.
+ -}
+ranges                      ::  [ ((Char, Char), Int) ]
+ranges                       =  reverse (foldl' aggregate start (tail widths))
+ where
+  start                      =  aggregate [] (head widths)
+  aggregate [] (c, w)        =  [((c, c), w)]
+  aggregate (((a, z), i) : t) (c, w)
+    | i == w                 =  ((a, c), i) : t
+    | otherwise              =  ((c, c), w) : ((a, z), i) : t
+
+
+{-| Binding to the native 'wcwidth'. 
+ -}
+wcwidth                     ::  Char -> Int
+wcwidth                      =  fromEnum . native . toEnum . fromEnum
+
+
+foreign import ccall unsafe "wchar.h wcwidth" native :: CWchar -> CInt
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,28 @@
+
+  ©2009 Jason Dusek.
+
+  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.
+
+ .  Names of the contributors to this software may not be used to endorse or
+    promote products derived from this software without specific prior written
+    permission.
+
+  This software is provided by the 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 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,4 @@
+import Distribution.Simple
+
+main                         =  defaultMain
+
diff --git a/WCWidthTableaux.hs b/WCWidthTableaux.hs
new file mode 100644
--- /dev/null
+++ b/WCWidthTableaux.hs
@@ -0,0 +1,101 @@
+#!/usr/bin/env runhaskell
+
+
+{-# LANGUAGE StandaloneDeriving
+  #-}
+
+
+import Data.Char
+import Data.List
+import System.Environment.UTF8
+import System.IO
+import System.Exit
+import Text.Printf
+
+import System.Locale.SetLocale
+import qualified System.IO.UTF8 as UTF8
+
+import Data.Char.WCWidth
+
+import CompileRanges (compile_ranges)
+
+
+
+
+usage name                   =  unlines
+ [ "USAGE:  " ++ name ++ " > table"
+ , "        " ++ name ++ " --table > table"
+ , "        " ++ name ++ " --ranges > ranges"
+ , "        " ++ name ++ " --compile < ranges > Data/Char/Cols/Generated.hs"
+ , "        " ++ name ++ " -h,--help"
+ , ""
+ , "  This program polls your local wcwidth implementation for character width"
+ , "  information and generates tables or a chart of ranges."
+ , ""
+ ]
+
+
+main                         =  do
+  setLocale LC_ALL (Just "")
+  usage'                    <-  fmap usage getProgName
+  programs                  <-  fmap ((Table:) . fmap program) getArgs
+  case (head . sort) programs of
+    Usage                   ->  putStrLn usage' >> exitSuccess
+    Compile                 ->  compile_ranges stdin stdout
+    Ranges                  ->  (rolling_print range_entry) ranges
+    Table                   ->  (rolling_print table_entry) widths
+    Error s                 ->  do
+      hPutStrLn stderr s
+      hPutStrLn stderr usage'
+      exitFailure
+ where
+  rolling_print f            =  sequence_ . fmap (UTF8.putStrLn . f)
+  range_entry ((a,b),w)      =  printf fmt a' b' w count s
+   where
+    count                    =  1 + fromEnum b - fromEnum a
+    fmt                      =  "0x%08x..0x%08x    %2d    %6d    %s"
+    (a', b')                 =  (fromEnum a, fromEnum b)
+    s                        =  represent a ++ " .. " ++ represent b
+  table_entry (c,cols)       =  printf "0x%08x    %2d    %s" c' cols c''
+   where
+    c'                       =  fromEnum c
+    c''                      =  represent c
+  represent c
+    | ' ' == c               =  "\\SP"
+    | '\xA0' == c            =  "&nbsp;"
+    | isControl c            =  display c
+    | isSpace c              =  '\\' : show (fromEnum c)
+    | isPrint c              =  [c]
+    | otherwise              =  display c
+   where
+    display                  =  reverse . drop 1 . reverse . drop 1 . show
+
+
+
+
+program opt                  =  case opt of
+  "-h"                      ->  Usage
+  "--help"                  ->  Usage
+  "--compile"               ->  Compile
+  "--ranges"                ->  Ranges
+  "--table"                 ->  Table
+  s                         ->  Error ("No such option/arg:        " ++ s)
+
+
+
+
+data Program                 =  Usage | Compile | Error String | Ranges | Table
+deriving instance Eq Program
+instance Ord Program where
+  compare a b
+    | a == b                 =  EQ
+    | otherwise              =  case a of
+                                  Usage       ->  LT
+                                  Compile     ->  LT
+                                  Ranges      ->  LT
+                                  Table       ->  GT
+                                  Error s     ->  case b of 
+                                                    Error t ->  compare s t
+                                                    _       ->  LT
+
+
diff --git a/wcwidth.cabal b/wcwidth.cabal
new file mode 100644
--- /dev/null
+++ b/wcwidth.cabal
@@ -0,0 +1,39 @@
+name                          : wcwidth
+version                       : 0.0.0
+category                      : Text
+license                       : BSD3
+license-file                  : LICENSE
+author                        : Jason Dusek
+maintainer                    : wcwidth@solidsnack.be 
+homepage                      : http://github.com/solidsnack/width/
+synopsis                      : Native wcwidth.
+description                   :
+  Bindings for your system's native wcwidth and a command line tool to examine
+  the widths assigned by it. The command line tool can compile a width table
+  to Haskell code that assigns widths to the Char type.
+
+
+cabal-version                 : >= 1.6.0
+build-type                    : Simple
+
+
+library
+  build-depends               : base >= 2 && < 4
+                              , containers
+  exposed-modules             : Data.Char.WCWidth
+  extensions                  : StandaloneDeriving
+                                ForeignFunctionInterface
+
+
+executable                      wcwidth-tools
+  main-is                     : WCWidthTableaux.hs
+  build-depends               : base >= 2 && < 4
+                              , containers
+                              , bytestring
+                              , setlocale >= 0.0.3
+                              , utf8-string >= 0.3
+                              , bytestringparser-temporary >= 0.4.1
+  extensions                  : StandaloneDeriving
+                                ForeignFunctionInterface
+
+
