diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+## 0.1.6
+
+Still unstable version for testing
+
+## 0.1.5
+
+Unstable version for testing
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Ilya Murzinov (c) 2017
+Copyright (c) 2017 Ilya Murzinov
 
 All rights reserved.
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
-# postgres-embedded
+# postgres-embedded [![Hackage version](https://img.shields.io/hackage/v/postgres-embedded.svg?label=Hackage)](https://hackage.haskell.org/package/postgres-embedded) [![Linux Build Status](https://img.shields.io/travis/ilya-murzinov/postgres-embedded.svg?label=Linux%20build)](https://travis-ci.org/ilya-murzinov/postgres-embedded) 
+[![Windows Build Status](https://img.shields.io/appveyor/ci/ilya-murzinov/postgres-embedded.svg?label=Windows%20build)](https://ci.appveyor.com/project/ilya-murzinov/postgres-embedded)
 
 Haskell API for starting/stopping embedded PostgreSQL instance.
diff --git a/postgres-embedded.cabal b/postgres-embedded.cabal
--- a/postgres-embedded.cabal
+++ b/postgres-embedded.cabal
@@ -1,17 +1,25 @@
 name:                postgres-embedded
-version:             0.1.5
+version:             0.1.6
 description:         Library for easily running embedded PostgreSQL server for tests
+synopsis:            Library for easily running embedded PostgreSQL server for tests
 homepage:            https://github.com/ilya-murzinov/postgres-embedded
+bug-reports:         https://github.com/ilya-murzinov/postgres-embedded/issues
 license:             MIT
 license-file:        LICENSE
 author:              Ilya Murzinov
-maintainer:          murz42@gmail.com
+maintainer:          Ilya Murzinov <murz42@gmail.com>
 copyright:           2017 Ilya Murzinov
 category:            Lib
 build-type:          Simple
-extra-source-files:  README.md
-cabal-version:       >=1.10
+extra-doc-files:     README.md
+                     CHANGELOG.md
+cabal-version:       >=1.18
+tested-with:         GHC==8.2.1, GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
 
+source-repository head
+  type:     git
+  location: https://github.com/ilya-murzinov/postgres-embedded.git
+
 library
   hs-source-dirs:      src
   exposed-modules:     Database.PostgreSQL.Embedded
@@ -31,11 +39,10 @@
   hs-source-dirs:      test
   main-is:             Spec.hs
   build-depends:       base
-                     , postgres-embedded
+                     , bytestring
                      , filepath
+                     , postgres-embedded
+                     , postgresql-simple
+                     , shell-conduit
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   default-language:    Haskell2010
-
-source-repository head
-  type:     git
-  location: git://github.com/ilya-murzinov/postgres-embedded.git
diff --git a/src/Database/PostgreSQL/Embedded.hs b/src/Database/PostgreSQL/Embedded.hs
--- a/src/Database/PostgreSQL/Embedded.hs
+++ b/src/Database/PostgreSQL/Embedded.hs
@@ -1,3 +1,5 @@
+-- | Library for easily running embedded PostgreSQL server for tests
+
 module Database.PostgreSQL.Embedded
     ( startPostgres
     , stopPostgres
diff --git a/src/Database/PostgreSQL/Embedded/Postgres.hs b/src/Database/PostgreSQL/Embedded/Postgres.hs
--- a/src/Database/PostgreSQL/Embedded/Postgres.hs
+++ b/src/Database/PostgreSQL/Embedded/Postgres.hs
@@ -4,52 +4,68 @@
     , checkPostgresStarted
     ) where
 
-import           Control.Concurrent                    (threadDelay)
 import           Control.Exception                     (SomeException, try)
 import           Data.Conduit.Shell                    (rm, run, shell)
 import           Data.List                             (isInfixOf)
 import           Data.Monoid                           ((<>))
+import           System.Directory                      (doesPathExist)
+import           System.Exit                           (exitFailure)
 import           System.FilePath.Posix                 ((</>))
 import           System.Info                           (os)
 
 import           Database.PostgreSQL.Embedded.Download
 import           Database.PostgreSQL.Embedded.Types
 
+{-|
+Starts PostgreSQL instance with given config.
+
+Returns @RuntimeConfig@ that is required for @stopPostgres@.
+-}
 startPostgres :: StartupConfig -> DBConfig -> IO RuntimeConfig
-startPostgres (StartupConfig version_ t) dConfig@(DBConfig p u) = do
+startPostgres (StartupConfig сlean version_) dConfig@(DBConfig p u) = do
     e <- downloadPostgres getOS version_
     let d = e </> "data"
+    exists <- doesPathExist d
+    if exists && not сlean then do
+        putStrLn $ "Directory " <> d <> " must not exist"
+        exitFailure
+    else run $ rm "-rf" d
+
     run $ do
         shell $ e </> "bin" </> "initdb" <> " -A trust -U " <> u <> " -D " <> d <> " -E UTF-8"
         shell $ e </> "bin" </> "pg_ctl" <> " -D " <> d <> " -o \"-F -p " <>
-            (show p) <> "\"" <> " -l " <> (e </> "log") <> " start"
+            show p <> "\"" <> " -l " <> (e </> "log") <> " start"
+
     let r = RuntimeConfig e d
-    checkPostgresStarted r dConfig t
-    return $ r
+    checkPostgresStarted r dConfig
+    return r
+
     where
         getOS | "darwin" `isInfixOf` os = OSX
               | "linux" `isInfixOf` os = Linux
               | "win" `isInfixOf` os = Win
               | otherwise = error $ "Unsupported platform" <> os
 
+{-|
+Stops PostgreSQL instance.
+
+Doesn't remove data directory.
+-}
 stopPostgres :: RuntimeConfig -> IO ()
-stopPostgres (RuntimeConfig e d) = run $ do
-        shell $ e </> "bin" </> "pg_ctl" <> " -D " <> d <> " stop"
-        rm "-rf" d
+stopPostgres (RuntimeConfig e d) = run $
+        shell $ e </> "bin" </> "pg_ctl" <> " -D " <> d <> " stop" <>
+                " -m fast -t 5 -w"
 
-checkPostgresStarted :: RuntimeConfig -> DBConfig -> Int -> IO ()
-checkPostgresStarted (RuntimeConfig e _) (DBConfig p _) secs = checkPostgresStarted_ secs >>= \_ -> return ()
+checkPostgresStarted :: RuntimeConfig -> DBConfig -> IO ()
+checkPostgresStarted (RuntimeConfig e _) (DBConfig p _) = checkPostgresStarted_ 10 >>= \_ -> return ()
     where
         checkPostgresStarted_ :: Int -> IO Bool
         checkPostgresStarted_ n = do
-            let oneSec = 1000000
-            let check = run $ shell (e </> "bin" </> "pg_isready" <> " -p " <> (show p) <> " -h localhost") >>= \_ -> return True
+            let check = run $ shell (e </> "bin" </> "pg_isready" <> " -p " <> show p <> " -h localhost") >>= \_ -> return True
 
             res <- try check :: IO (Either SomeException Bool)
-            let retry = if n > 0 then threadDelay oneSec >>=
-                            \_ -> checkPostgresStarted_ (n - 1)
-                        else
-                            return False
+            let retry = if n > 0 then checkPostgresStarted_ (n - 1)
+                        else return False
             case res of
-                Left err   -> print err >>= \_ -> retry
-                Right res1 -> if (not res1) then retry else return True
+                Left err   -> print err >>= const retry
+                Right res1 -> if not res1 then retry else return True
diff --git a/src/Database/PostgreSQL/Embedded/Types.hs b/src/Database/PostgreSQL/Embedded/Types.hs
--- a/src/Database/PostgreSQL/Embedded/Types.hs
+++ b/src/Database/PostgreSQL/Embedded/Types.hs
@@ -6,21 +6,35 @@
     , DBConfig(..)
     ) where
 
+-- | Type of operation system
+-- Doesn't really work for Windows now
 data Os = Win | OSX | Linux deriving (Eq)
 
+-- | Version of PostgreSQL distribution
+-- See https://www.enterprisedb.com/downloads/postgres-postgresql-downloads for supported versions
 newtype Version = Version { value :: String }
 
-data StartupConfig = StartupConfig {
-    version        :: Version,
-    startupTimeout :: Int
-}
+-- | Config for stating up instance
+-- Note that startup requeres clean or non-existing directory
+data StartupConfig = StartupConfig
+    { -- | Should data directory be cleaned up?
+      cleanDir :: Bool
+      -- | See @Version@
+    , version  :: Version
+    }
 
-data RuntimeConfig = RuntimeConfig {
-    execDir :: FilePath,
-    dataDir :: FilePath
-}
+-- | Config of running instance
+data RuntimeConfig = RuntimeConfig
+    { -- | Path of extracter PostgreSQL distribution
+      execDir :: FilePath
+      -- | Data directory
+    , dataDir :: FilePath
+    }
 
-data DBConfig = DBConfig {
-    port     :: Integer,
-    username :: String
-}
+-- | Database config
+data DBConfig = DBConfig
+    { -- | Port
+      port     :: Integer
+      -- | Username
+    , username :: String
+    }
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,14 +1,32 @@
+import           Data.ByteString.Char8        (pack)
+import           Data.Conduit.Shell           (rm, run)
+import           Data.Monoid                  ((<>))
+import           Data.String                  (fromString)
+import           Database.PostgreSQL.Simple   (Only (..), connectPostgreSQL,
+                                               query_)
+import           System.FilePath.Posix        ((</>))
+
 import           Database.PostgreSQL.Embedded
 
 main :: IO ()
 main = do
-    let sConfig = StartupConfig (Version "9.6.5-1") 10
+    let sConfig = StartupConfig True (Version "9.6.5-1")
     let dConfig = DBConfig 46782 "postgres"
 
+    run $ rm "-rf" $ "~/.postgres-embedded/" </> "9.6.5-1"
+
     -- Start Postgres downloading distribution
     rc <- startPostgres sConfig dConfig
+    runQuery dConfig
     stopPostgres rc
 
     -- Start Postgres with cached distribution
     rc1 <- startPostgres sConfig dConfig
+    runQuery dConfig
     stopPostgres rc1
+
+runQuery :: DBConfig -> IO ()
+runQuery (DBConfig p u) = do
+    conn <- connectPostgreSQL $ pack $ "host=127.0.0.1 port=" <> show p <> " user=" <> u
+    _ <- (query_ conn $ fromString "select 1") :: IO [Only Int]
+    return ()
