diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c)2011, Sergey Mironov
+
+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 Sergey Mironov 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/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,38 @@
+INFO
+====
+
+haskdogs is a small shellscript-like tool which creates tag file for entire
+haskell project directory. It takes into account first-level dependencies by
+recursively scanning imports and adding matching packages to the final
+tag list.
+
+As a result, programmer can use his/her text editor supporting tags (vim, for
+example) to jump directly to definition of any standard or foreign function
+he/she uses.
+
+Note, that haskdogs calls some Unix shell commands like 'test' or 'mkdir'
+so this tool will run, but probably fail to work on pure Windows platforms.
+
+INSTALL
+=======
+
+0. cabal install hasktags
+1. git clone https://github.com/ierton/haskdogs
+2. cd haskdogs
+3. cabal install
+4. export PATH="$HOME/.cabal/bin:$PATH"
+
+RUNNING
+=======
+
+1. Make sure yoy have installed hasktags and put it in PATH. Hasktags is being
+called by haskdogs by name.  
+2. Make shure that $HOME/.cabal/var/haskdogs does exist.
+3. cd to your Haskell project dir
+4. run haskdogs
+
+--
+Sergey 
+<ierton@gmail.com>
+
+
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/haskdogs.cabal b/haskdogs.cabal
new file mode 100644
--- /dev/null
+++ b/haskdogs.cabal
@@ -0,0 +1,40 @@
+-- haskdogs.cabal auto-generated by cabal init. For additional
+-- options, see
+-- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr.
+-- The name of the package.
+Name:                haskdogs
+Version:             0.1
+Synopsis:            Generate ctags file for haskell project directory and it's deps
+Homepage:            http://github.com/ierton/haskdogs
+License:             BSD3
+License-file:        LICENSE
+Author:              Sergey Mironov
+Maintainer:          ierton@gmail.com
+Category:            Development
+Build-type:          Simple
+Cabal-version:       >=1.6
+extra-source-files:  README
+Description:
+    haskdogs is a small shellscript-like tool which creates tag file for entire
+    haskell project directory. It takes into account first-level dependencies by
+    recursively scanning imports and adding matching packages to the final
+    tag list.
+
+    As a result, programmer can use his/her text editor supporting tags (vim, for
+    example) to jump directly to definition of any standard or foreign function
+    he/she uses.
+
+    Note, that haskdogs calls some Unix shell commands like 'test' or 'mkdir'
+    so this tool will likely fail to work on pure Windows platforms.
+
+Executable haskdogs
+  Hs-source-dirs:       src
+  Main-is:              haskdogs.hs
+  Build-depends:        base >= 3 && < 5, Cabal >= 1.6, HSH >= 2.0.3, filepath >= 1.1.0.3
+  Ghc-options:          -fwarn-tabs -Wall
+  Build-tools:          hasktags
+  
+Source-repository head
+  Type:     git
+  Location: http://github.com/ierton/haskdogs
+
diff --git a/src/haskdogs.hs b/src/haskdogs.hs
new file mode 100644
--- /dev/null
+++ b/src/haskdogs.hs
@@ -0,0 +1,62 @@
+-- #!/usr/bin/runhaskell
+
+import HSH
+import Data.List
+import Control.Monad
+import System.Exit
+import System.FilePath
+
+p :: String -> (String, [String])
+p s = let ws = words s in (head ws, tail ws)
+
+find_in_dirs dirs p = ("find", dirs ++ ["-name", p])
+
+ghc_pkg_find m = ("ghc-pkg", ["find-module", m])
+
+cabal_unpack p = ("cabal", ["unpack", p])
+
+findSources :: [String] -> IO [String]
+findSources d = run $ find_in_dirs d "*hs"
+
+findImports :: [String] -> IO [String]
+findImports s = run $ catFrom s -|- extractImports
+
+extractImports = nub . sort . filter (/=[]) . map (grepImports . words)
+
+grepImports ("import":"qualified":x:_) = x
+grepImports ("import":x:_) = x
+grepImports _ = []
+
+iname2module :: String -> IO String
+iname2module m = run $ ghc_pkg_find m -|- egrep "^ +[a-zA-Z]" -|- map (head . words) -|- highver
+    where highver [] = []
+          highver s = last (lines s)
+
+inames2modules :: [String] -> IO [String]
+inames2modules is = forM is (iname2module) >>= return . nub . sort . filter (/=[])
+
+unpackModule p = do
+    srcdir <- glob "~" >>= return . (</> ".cabal/var/haskdogs/") . head
+    let fullpath = srcdir </> p
+    ret <- run ("test",["-d", fullpath])
+    case ret of
+        ExitSuccess -> do
+            putStrLn $ "Already unpacked " ++ p
+            return fullpath
+        _ -> do
+            cd srcdir
+            ec <- tryEC (runIO (cabal_unpack p))
+            case ec of
+                Left _ -> return []
+                Right _ -> return fullpath
+
+unpackModules ms = mapM unpackModule ms >>= return . filter (/=[])
+
+main = do
+    cwd <- run "pwd" >>= return . head
+    ss_local <- findSources ["."]
+    ss_l1deps <- findImports ss_local >>= inames2modules >>= unpackModules >>= findSources
+    cd cwd
+    runIO $ ("hasktags", ["-c"] ++ ss_local ++ ss_l1deps)
+
+
