diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2013, Matvey Aksenov
+
+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 Matvey Aksenov 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/src/System/Wordexp.chs b/src/System/Wordexp.chs
new file mode 100644
--- /dev/null
+++ b/src/System/Wordexp.chs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+-- | wordexp (and wordfree) Haskell wrapper
+module System.Wordexp
+ ( -- * Wrapper
+   wordexp
+   -- * Flags
+ , Flags, nosubst, errors, noundef
+   -- * Errors
+ , WordexpError (..)
+ ) where
+
+import Control.Exception (Exception)
+import Control.Monad
+import Data.Data (Data)
+import Data.Monoid (Monoid(..))
+import Data.Typeable (Typeable)
+import Foreign
+import Foreign.C
+import Foreign.C.Types
+
+import Data.Array (Ix)
+
+#include <wordexp.h>
+
+
+-- | Opaque wordexp_t struct image in Haskellland
+data Wordexp
+
+
+-- | wordexp flags enum image in Haskellland
+{# enum define FLAGS
+  { WRDE_APPEND  as WRDE_APPEND
+  , WRDE_DOOFFS  as WRDE_DOOFFS
+  , WRDE_NOCMD   as WRDE_NOCMD
+  , WRDE_REUSE   as WRDE_REUSE
+  , WRDE_SHOWERR as WRDE_SHOWERR
+  , WRDE_UNDEF   as WRDE_UNDEF
+  } deriving (Show, Read, Eq, Ord, Bounded, Ix, Data, Typeable) #}
+
+-- | wordexp flags
+--
+-- Not every flag is supported since some of them do not make much sense in Haskell anyway
+newtype Flags = Flags Int
+#if defined(__GLASGOW_HASKELL__) && (__GLASGOW_HASKELL__ >= 706)
+  deriving (Show, Read, Eq, Ord, Bounded, Bits, Ix, Data, Typeable)
+#else
+  deriving (Show, Read, Eq, Ord, Bounded, Num, Bits, Ix, Data, Typeable)
+#endif
+
+instance Monoid Flags where
+  mempty = Flags 0
+  a `mappend` b = a .|. b
+  {-# INLINE mappend #-}
+
+-- | Disable command substitution in patterns, treat them as errors
+nosubst :: Flags
+nosubst = Flags $ fromEnum WRDE_NOCMD
+{-# INLINE nosubst #-}
+
+-- | Do not hide shell error messages in /dev/null, print them right away
+errors :: Flags
+errors = Flags $ fromEnum WRDE_SHOWERR
+{-# INLINE errors #-}
+
+-- | Do not accept undefined shell variables, treat them as errors
+noundef :: Flags
+noundef = Flags $ fromEnum WRDE_UNDEF
+{-# INLINE noundef #-}
+
+
+-- | Possible wordexp errors
+{# enum define WordexpError
+  { WRDE_NOSPACE as OutOfSpace
+  , WRDE_BADCHAR as IllegalCharacterOccurence
+  , WRDE_BADVAL  as UndefinedShellVariable
+  , WRDE_CMDSUB  as CommandSubstitution
+  , WRDE_SYNTAX  as ShellSyntaxError
+  } deriving (Show, Read, Eq, Ord, Bounded, Ix, Data, Typeable) #}
+
+instance Exception WordexpError
+
+
+-- | wordexp wrapper
+--
+-- Allows to specify desired flags, return expanded strings or encountered error if any
+wordexp :: Flags -> String -> IO (Either WordexpError [String])
+wordexp (Flags f) s =
+  withCString s $ \cs ->
+    allocaBytes size $ \p -> do
+      ret <- c_wordexp cs p (fromIntegral f)
+      case ret of
+        0 -> do
+          c <- fromIntegral `fmap` wordc p
+          v <- wordv p
+          xs <- forM [0 .. c-1] $ peekElemOff v >=> peekCString
+          c_wordfree p
+          return $ Right xs
+        e -> return . Left . toEnum $ fromIntegral e
+ where
+  size = sizeOf (undefined :: CSize) + sizeOf (undefined :: Ptr CString) + sizeOf (undefined :: CSize)
+  {-# INLINE size #-}
+
+  wordc :: Ptr Wordexp -> IO CSize
+  wordc p = peekByteOff p 0
+  {-# INLINE wordc #-}
+
+  wordv :: Ptr Wordexp -> IO (Ptr CString)
+  wordv p = peekByteOff p (sizeOf (undefined :: CSize))
+  {-# INLINE wordv #-}
+
+
+foreign import ccall unsafe "wordexp"
+  c_wordexp :: CString -> Ptr Wordexp -> CInt -> IO CInt
+
+foreign import ccall unsafe "wordfree"
+  c_wordfree :: Ptr Wordexp -> IO ()
diff --git a/src/System/Wordexp/Simple.hs b/src/System/Wordexp/Simple.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Wordexp/Simple.hs
@@ -0,0 +1,20 @@
+-- | Simple wordexp (and wordfree) Haskell wrapper
+module System.Wordexp.Simple
+ ( -- * Simple wrapper
+   wordexp
+ , -- * Exceptions
+   W.WordexpError (..)
+ ) where
+
+import Control.Exception (throw)
+import Data.Monoid (mempty)
+
+import qualified System.Wordexp as W
+
+
+-- | Simple wordexp wrapper
+--
+-- Return expanded strings or throw an exception if any error is encountered
+wordexp :: String -> IO [String]
+wordexp s = either throw id `fmap` W.wordexp mempty s
+{-# INLINE wordexp #-}
diff --git a/wordexp.cabal b/wordexp.cabal
new file mode 100644
--- /dev/null
+++ b/wordexp.cabal
@@ -0,0 +1,23 @@
+name:                wordexp
+version:             0.1.0.0
+synopsis:            wordexp(3) wrappers
+description:         man wordexp
+license:             BSD3
+license-file:        LICENSE
+author:              Matvey Aksenov
+maintainer:          matvey.aksenov@gmail.com
+category:            System
+build-type:          Simple
+cabal-version:       >= 1.8
+
+library
+  build-depends:     base >= 4 && < 5,
+                     array
+  hs-source-dirs:    src
+  exposed-modules:   System.Wordexp
+                     System.Wordexp.Simple
+  build-tools:       c2hs
+
+source-repository head
+  type:     git
+  location: https://github.com/supki/wordexp
