diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2015, 2016, 2017 Konstantin Zudov
+
+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 Konstantin Zudov 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/Main.hs b/Main.hs
new file mode 100644
--- /dev/null
+++ b/Main.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE LambdaCase      #-}
+{-# LANGUAGE RecordWildCards #-}
+module Main where
+
+import           Control.Monad (forM_, (<=<))
+import           Data.Monoid   ((<>))
+import           Data.Text     (Text)
+import qualified Data.Text     as Text
+import qualified Data.Text.IO  as Text
+
+import System.Environment
+import System.Exit
+import System.IO
+
+import qualified Comark
+
+main :: IO ()
+main = do
+  eOpts <- parseArgs <$> getArgs
+  case eOpts of
+    Left err -> do
+      hPutStrLn stderr err
+      exitFailure
+    Right opts@Options{inputFiles = [] } ->
+      Text.interact (processor opts)
+    Right opts@Options{inputFiles = files } ->
+      forM_ files $
+        Text.putStrLn . processor opts <=< Text.readFile
+
+processor :: Options -> Text -> Text
+processor Options{..} = render . Comark.parse [ Comark.Normalize | normalize ]
+  where
+    render =
+      case outputFormat of
+        Native -> Text.pack . show
+        Html   -> Comark.render
+
+data Options = Options
+  { outputFormat :: Format
+  , normalize    :: Bool
+  , inputFiles   :: [FilePath]
+  }
+  deriving (Show)
+
+initOpts :: Options
+initOpts = Options
+  { outputFormat = Html
+  , normalize    = False
+  , inputFiles   = mempty
+  }
+
+usage :: String
+usage = unlines
+    [ "Usage:    comark-hs [OPTIONS*] [FILE*]"
+    , "Options:"
+    , "  --to, -t FORMAT  Specify output format (html, native)"
+    , "  --normalize      Consolidate adjacent text nodes"
+    , "  --help, -h       Print usage information"
+    ]
+
+parseArgs :: [String] -> Either String Options
+parseArgs = parse initOpts
+  where
+    parse opts = \case
+      []                   -> Right opts
+      ("-t":[])            -> Left "No argument provided for -t"
+      (arg:format:args) | arg == "-t" || arg == "--to"
+          -> readFormat format >>= \f -> parse opts { outputFormat = f } args
+      ("--normalize":args) -> parse opts { normalize = True } args
+      ("--":files)         -> Right opts { inputFiles = files <> inputFiles opts }
+      (('-':_):_)          -> Left usage
+      files                -> Right opts { inputFiles = files <> inputFiles opts }
+
+
+data Format = Native | Html deriving (Show)
+
+readFormat :: String -> Either String Format
+readFormat "html"   = Right Html
+readFormat "native" = Right Native
+readFormat format   = Left $ "Unknown format " <> format
+
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/comark.cabal b/comark.cabal
new file mode 100644
--- /dev/null
+++ b/comark.cabal
@@ -0,0 +1,43 @@
+-- This file has been generated from package.yaml by hpack version 0.17.0.
+--
+-- see: https://github.com/sol/hpack
+
+name:                comark
+version:             0.1.0
+synopsis:            Commonmark processing in pure haskell.
+description:         See <https://github.com/zudov/haskell-comark#readme README>
+license:             BSD3
+license-file:        LICENSE
+author:              Konstantin Zudov
+maintainer:          co@zudov.me
+copyright:           (c) Konstantin Zudov, 2015, 2016, 2017
+category:            Text
+build-type:          Simple
+cabal-version:       >= 1.10
+
+library
+  exposed-modules:
+      Comark
+  other-modules:
+      Paths_comark
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.7 && <5
+    , text
+    , comark-syntax
+    , comark-parser
+    , comark-html
+  default-language: Haskell2010
+  ghc-options: -Wall
+
+executable comark-hs
+  main-is: Main.hs
+  hs-source-dirs:
+      ./.
+  ghc-options: -Wall -threaded
+  build-depends:
+      base >=4.7 && <5
+    , text
+    , comark
+  default-language: Haskell2010
diff --git a/src/Comark.hs b/src/Comark.hs
new file mode 100644
--- /dev/null
+++ b/src/Comark.hs
@@ -0,0 +1,31 @@
+-- | It mostly contains reexports from the following modules:
+--
+--     - "Comark.Syntax"
+--     - "Comark.Parser"
+--     - "Comark.Parser.Options"
+--     - "Comark.Html"
+
+module Comark
+    ( -- * Parser
+      parse
+    , ParserOption(..)
+      -- * HTML Rendererer
+    , render
+      -- * AST types
+      -- ** Document
+    , Doc(..)
+      -- *** Blocks
+    , Blocks
+    , Block(..)
+    , HeadingLevel(..)
+    , ListType(..)
+    , Delimiter(..)
+    , BulletMarker(..)
+      -- * Inlines
+    , Inlines
+    , Inline(..)
+    ) where
+
+import Comark.Html
+import Comark.Parser
+import Comark.Syntax
