diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+dist
+_darcs
+tests/*.hi
+tests/*.o
diff --git a/README b/README
deleted file mode 100644
--- a/README
+++ /dev/null
@@ -1,122 +0,0 @@
-% hinotify: inotify for Haskell
-% Lennart Kolmodin <kolmodin@gmail.com>
-% December 26, 2007-2011
-
-About
------
-
-hinotify, a library to [inotify] which has been part of the Linux kernel
-since 2.6.13.
-
-inotify provides file system event notification, simply add a watcher to
-a file or directory and get an event when it is accessed or modified.
-
-This module is named `hinotify`.
-
-See example code in the `examples` directory, distributed with the source
-code.
-
-[inotify]: http://www.kernel.org/pub/linux/kernel/people/rml/inotify/
-
-News
-----
-
-**hinotify 0.3.2**
-
-* Make each `WatchDescriptor` contain its `INotify`. Changes to the function types:
-
->      -removeWatch :: INotify -> WatchDescriptor -> IO ()
->      +removeWatch :: WatchDescriptor -> IO ()
-
-* Fix typo in declaration of `Deleted` in `data Event`;
-
->      - { isDirecotry :: Bool
->      + { isDirectory :: Bool
-
-**hinotify 0.3.1**
-
-* Use `inotify.h` from `glibc` rather than from the linux headers, as
-      recommended upstream.
-
-**hinotify 0.3**
-
-* Compiles with GHC 6.12, GHC 6.10.4, GHC 6.8.2 and GHC 6.6.1
-
-**hinotify 0.2**
-
-* Updates to the API
-    - Function names is now in semiCamelCase
-    - Restructure event parameters to make it more consistent
-* Small test suit in `tests/`
-* Compiles with GHC 6.8.2 and GHC 6.6.1
-* Requires Cabal 1.2
-
-**hinotify 0.1**
-:   Initial release
-
-API
----
-
-The API basically consists of:
-
-    initINotify :: IO INotify
-    addWatch :: INotify
-             -> [EventVariety]   -- different events to listen on
-             -> FilePath         -- file/directory to watch
-             -> (Event -> IO ()) -- event handler
-             -> IO WatchDescriptor
-    removeWatch :: WatchDescriptor -> IO ()
-
-A sample program:
-
-    import System.Directory
-    import System.IO
-
-    import System.INotify
-
-    main :: IO ()
-    main = do
-        inotify <- initINotify
-        print inotify
-        home <- getHomeDirectory
-        wd <- addWatch
-                inotify
-                [Open,Close,Access,Modify,Move]
-                home
-                print
-        print wd
-        putStrLn "Listens to your home directory. Hit enter to terminate."
-        getLine
-        removeWatch wd
-
-
-Download
---------
-
-The code is available via the [homepage], and via darcs:
-
-    darcs get --partial http://code.haskell.org/hinotify/
-
-The [API] is available online.
-
-I'm most grateful for feedback on the API, and what else you might have to
-suggest.
-
-Author
-------
-
-Lennart Kolmodin
-
-`kolmodin at gmail.com`
-
-Legal
------
-
-This software is released under a BSD-style license. See LICENSE for
-more details.
-
-Copyright &copy; 2007-2011 Lennart Kolmodin
-
-[homepage]: http://code.haskell.org/hinotify/
-
-[API]: http://hackage.haskell.org/packages/archive/hinotify/latest/doc/html/System-INotify.html
diff --git a/README.html b/README.html
deleted file mode 100644
--- a/README.html
+++ /dev/null
@@ -1,247 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-  <title>hinotify: inotify for Haskell</title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-  <meta name="generator" content="pandoc" />
-  <meta name="author" content="Lennart Kolmodin 
-                               '+''+e+''+'');
-                               // -->
-                               &#x6b;&#x6f;&#108;&#x6d;&#x6f;&#100;&#x69;&#110;&#32;&#x61;&#116;&#32;&#x67;&#x6d;&#x61;&#x69;&#108;&#32;&#100;&#x6f;&#116;&#32;&#x63;&#x6f;&#x6d;" />
-  <meta name="date" content="December 26, 2007–2011" />
-  <link rel="stylesheet" href="hinotify.css" type="text/css" />
-</head>
-<body>
-<h1 class="title">hinotify: inotify for Haskell</h1>
-<div id="TOC"
-><ul
-  ><li
-    ><a href="#about"
-      >About</a
-      ></li
-    ><li
-    ><a href="#news"
-      >News</a
-      ></li
-    ><li
-    ><a href="#api"
-      >API</a
-      ></li
-    ><li
-    ><a href="#download"
-      >Download</a
-      ></li
-    ><li
-    ><a href="#author"
-      >Author</a
-      ></li
-    ><li
-    ><a href="#legal"
-      >Legal</a
-      ></li
-    ></ul
-  ></div
->
-<div id="about"
-><h2
-  ><a href="#TOC"
-    >About</a
-    ></h2
-  ><p
-  >hinotify, a library to <a href="http://www.kernel.org/pub/linux/kernel/people/rml/inotify/"
-    >inotify</a
-    > which has been part of the Linux kernel since 2.6.13.</p
-  ><p
-  >inotify provides file system event notification, simply add a watcher to a file or directory and get an event when it is accessed or modified.</p
-  ><p
-  >This module is named <code
-    >hinotify</code
-    >.</p
-  ><p
-  >See example code in the <code
-    >examples</code
-    > directory, distributed with the source code.</p
-  ></div
-><div id="news"
-><h2
-  ><a href="#TOC"
-    >News</a
-    ></h2
-  ><p
-  ><strong
-    >hinotify 0.3.2</strong
-    ></p
-  ><ul
-  ><li
-    >Make each <code
-      >WatchDescriptor</code
-      > contain its <code
-      >INotify</code
-      >. Changes to the function types:</li
-    ></ul
-  ><blockquote
-  ><pre
-    ><code
-      > -removeWatch :: INotify -&gt; WatchDescriptor -&gt; IO ()
- +removeWatch :: WatchDescriptor -&gt; IO ()
-</code
-      ></pre
-    ></blockquote
-  ><ul
-  ><li
-    >Fix typo in declaration of <code
-      >Deleted</code
-      > in <code
-      >data Event</code
-      >;</li
-    ></ul
-  ><blockquote
-  ><pre
-    ><code
-      > - { isDirecotry :: Bool
- + { isDirectory :: Bool
-</code
-      ></pre
-    ></blockquote
-  ><p
-  ><strong
-    >hinotify 0.3.1</strong
-    ></p
-  ><ul
-  ><li
-    >Use <code
-      >inotify.h</code
-      > from <code
-      >glibc</code
-      > rather than from the linux headers, as recommended upstream.</li
-    ></ul
-  ><p
-  ><strong
-    >hinotify 0.3</strong
-    ></p
-  ><ul
-  ><li
-    >Compiles with GHC 6.12, GHC 6.10.4, GHC 6.8.2 and GHC 6.6.1</li
-    ></ul
-  ><p
-  ><strong
-    >hinotify 0.2</strong
-    ></p
-  ><ul
-  ><li
-    >Updates to the API<ul
-      ><li
-	>Function names is now in semiCamelCase</li
-	><li
-	>Restructure event parameters to make it more consistent</li
-	></ul
-      ></li
-    ><li
-    >Small test suit in <code
-      >tests/</code
-      ></li
-    ><li
-    >Compiles with GHC 6.8.2 and GHC 6.6.1</li
-    ><li
-    >Requires Cabal 1.2</li
-    ></ul
-  ><dl
-  ><dt
-    ><strong
-      >hinotify 0.1</strong
-      ></dt
-    ><dd
-    >Initial release</dd
-    ></dl
-  ></div
-><div id="api"
-><h2
-  ><a href="#TOC"
-    >API</a
-    ></h2
-  ><p
-  >The API basically consists of:</p
-  ><pre
-  ><code
-    >initINotify :: IO INotify
-addWatch :: INotify
-         -&gt; [EventVariety]   -- different events to listen on
-         -&gt; FilePath         -- file/directory to watch
-         -&gt; (Event -&gt; IO ()) -- event handler
-         -&gt; IO WatchDescriptor
-removeWatch :: WatchDescriptor -&gt; IO ()
-</code
-    ></pre
-  ><p
-  >A sample program:</p
-  ><pre
-  ><code
-    >import System.Directory
-import System.IO
-
-import System.INotify
-
-main :: IO ()
-main = do
-    inotify &lt;- initINotify
-    print inotify
-    home &lt;- getHomeDirectory
-    wd &lt;- addWatch
-            inotify
-            [Open,Close,Access,Modify,Move]
-            home
-            print
-    print wd
-    putStrLn &quot;Listens to your home directory. Hit enter to terminate.&quot;
-    getLine
-    removeWatch wd
-</code
-    ></pre
-  ></div
-><div id="download"
-><h2
-  ><a href="#TOC"
-    >Download</a
-    ></h2
-  ><p
-  >The code is available via the <a href="http://code.haskell.org/hinotify/"
-    >homepage</a
-    >, and via darcs:</p
-  ><pre
-  ><code
-    >darcs get --partial http://code.haskell.org/hinotify/
-</code
-    ></pre
-  ><p
-  >The <a href="http://hackage.haskell.org/packages/archive/hinotify/latest/doc/html/System-INotify.html"
-    >API</a
-    > is available online.</p
-  ><p
-  >I’m most grateful for feedback on the API, and what else you might have to suggest.</p
-  ></div
-><div id="author"
-><h2
-  ><a href="#TOC"
-    >Author</a
-    ></h2
-  ><p
-  >Lennart Kolmodin</p
-  ><p
-  ><code
-    >kolmodin at gmail.com</code
-    ></p
-  ></div
-><div id="legal"
-><h2
-  ><a href="#TOC"
-    >Legal</a
-    ></h2
-  ><p
-  >This software is released under a BSD-style license. See LICENSE for more details.</p
-  ><p
-  >Copyright © 2007–2011 Lennart Kolmodin</p
-  ></div
->
-</body>
-</html>
-
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,124 @@
+hinotify: inotify for Haskell
+=============================
+
+About
+-----
+
+hinotify, a library to [inotify] which has been part of the Linux kernel
+since 2.6.13.
+
+inotify provides file system event notification, simply add a watcher to
+a file or directory and get an event when it is accessed or modified.
+
+This module is named `hinotify`.
+
+See example code in the `examples` directory, distributed with the source
+code.
+
+[inotify]: http://www.kernel.org/pub/linux/kernel/people/rml/inotify/
+
+News
+----
+
+**hinotify 0.3.2**
+
+* Make each `WatchDescriptor` contain its `INotify`. Changes to the function types:
+
+>      -removeWatch :: INotify -> WatchDescriptor -> IO ()
+>      +removeWatch :: WatchDescriptor -> IO ()
+
+* Fix typo in declaration of `Deleted` in `data Event`;
+
+>      - { isDirecotry :: Bool
+>      + { isDirectory :: Bool
+
+**hinotify 0.3.1**
+
+* Use `inotify.h` from `glibc` rather than from the linux headers, as
+      recommended upstream.
+
+**hinotify 0.3**
+
+* Compiles with GHC 6.12, GHC 6.10.4, GHC 6.8.2 and GHC 6.6.1
+
+**hinotify 0.2**
+
+* Updates to the API
+    - Function names is now in semiCamelCase
+    - Restructure event parameters to make it more consistent
+* Small test suit in `tests/`
+* Compiles with GHC 6.8.2 and GHC 6.6.1
+* Requires Cabal 1.2
+
+**hinotify 0.1**
+:   Initial release
+
+API
+---
+
+The API basically consists of:
+
+```haskell
+initINotify :: IO INotify
+addWatch :: INotify
+         -> [EventVariety]   -- different events to listen on
+         -> FilePath         -- file/directory to watch
+         -> (Event -> IO ()) -- event handler
+         -> IO WatchDescriptor
+removeWatch :: WatchDescriptor -> IO ()
+```
+
+A sample program:
+
+```haskell
+import System.Directory
+import System.IO
+
+import System.INotify
+
+main :: IO ()
+main = do
+  inotify <- initINotify
+  print inotify
+  home <- getHomeDirectory
+  wd <- addWatch
+          inotify
+          [Open,Close,Access,Modify,Move]
+          home
+          print
+  print wd
+  putStrLn "Listens to your home directory. Hit enter to terminate."
+  getLine
+  removeWatch wd
+```
+
+Download
+--------
+
+The code is available via the [homepage], and via darcs:
+
+    git clone https://github.com/kolmodin/hinotify.git
+
+The [API] is available online.
+
+I'm most grateful for feedback on the API, and what else you might have to
+suggest.
+
+Author
+------
+
+Lennart Kolmodin
+
+`kolmodin at gmail.com`
+
+Legal
+-----
+
+This software is released under a BSD-style license. See LICENSE for
+more details.
+
+Copyright &copy; 2007-2012 Lennart Kolmodin
+
+[homepage]: https://github.com/kolmodin/hinotify.git
+
+[API]: http://hackage.haskell.org/packages/archive/hinotify/latest/doc/html/System-INotify.html
diff --git a/hinotify.cabal b/hinotify.cabal
--- a/hinotify.cabal
+++ b/hinotify.cabal
@@ -1,7 +1,7 @@
 name:               hinotify
-version:            0.3.2
+version:            0.3.3
 build-type:         Simple
-synopsis:           Haskell binding to INotify
+synopsis:           Haskell binding to inotify
 description:
     .
     This library provides a wrapper to the Linux Kernel's inotify feature,
@@ -9,21 +9,25 @@
     accessed or modified.
     .
 category:           System
-homepage:           http://code.haskell.org/hinotify/README.html
+homepage:           https://github.com/kolmodin/hinotify.git
 license:            BSD3
 license-file:       LICENSE
 author:             Lennart Kolmodin
 maintainer:         Lennart Kolmodin <kolmodin@gmail.com>
-extra-source-files: README
-cabal-version:      >= 1.2
+extra-source-files: README.md
+cabal-version:      >= 1.6
 
+source-repository head
+  type: git
+  location: git://github.com/kolmodin/hinotify.git
+
 flag split-base
     description: Choose the new smaller, split-up base package.
 
 library
     build-depends:  unix
     if flag(split-base)
-        build-depends:  base >= 3 && < 5, containers, directory
+        build-depends:  base >= 4.3.0.0 && < 5, containers, directory
     else
         build-depends:  base < 3
     extensions:     ForeignFunctionInterface
@@ -33,6 +37,6 @@
     other-modules:
         System.INotify.Masks
 
-    ghc-options:    -Wall
+    ghc-options: -Wall
 
     hs-source-dirs: src
diff --git a/src/System/INotify.hsc b/src/System/INotify.hsc
--- a/src/System/INotify.hsc
+++ b/src/System/INotify.hsc
@@ -1,9 +1,9 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  System.INotify
--- Copyright   :  (c) Lennart Kolmodin 2006
+-- Copyright   :  (c) Lennart Kolmodin 2006-2012
 -- License     :  BSD3
--- Maintainer  :  kolmodin@dtek.chalmers.se
+-- Maintainer  :  kolmodin@gmail.com
 -- Stability   :  experimental
 -- Portability :  hc portable, linux only
 --
@@ -37,16 +37,14 @@
 import Prelude hiding (init)
 import Control.Monad
 import Control.Concurrent
-import Control.Concurrent.MVar
-import Control.Exception (bracket)
+import Control.Exception as E (bracket, catch, SomeException)
 import Data.Maybe
 import Data.Map (Map)
 import qualified Data.Map as Map
 import Foreign.C
-import Foreign.Marshal
+import Foreign.Marshal hiding (void)
 import Foreign.Ptr
 import Foreign.Storable
-import System.Directory
 import System.IO
 import System.IO.Error
 #if __GLASGOW_HASKELL__ >= 612
@@ -56,6 +54,7 @@
 import GHC.Handle
 import System.Posix.Internals
 #endif
+import System.Posix.Files
 
 import System.INotify.Masks
 
@@ -187,16 +186,13 @@
 
 addWatch :: INotify -> [EventVariety] -> FilePath -> (Event -> IO ()) -> IO WatchDescriptor
 addWatch inotify@(INotify _ fd em _ _) masks fp cb = do
-    is_dir <- doesDirectoryExist fp
-    when (not is_dir) $ do
-        file_exist <- doesFileExist fp
-        when (not file_exist) $ do
-            -- it's not a directory, and not a file...
-            -- it doesn't exist
-            ioError $ mkIOError doesNotExistErrorType
-                                "can't watch what isn't there"
-                                Nothing 
-                                (Just fp)
+    catch_IO (void $
+              (if (NoSymlink `elem` masks) then getSymbolicLinkStatus else getFileStatus)
+              fp) $ \_ ->
+        ioError $ mkIOError doesNotExistErrorType
+             "can't watch what isn't there!"
+             Nothing
+             (Just fp)
     let mask = joinMasks (map eventVarietyToMask masks)
     wd <- withCString fp $ \fp_c ->
             throwErrnoIfMinus1 "addWatch" $
@@ -213,6 +209,9 @@
     modifyMVar_ em $ \em' -> return (Map.insert wd event em')
     return (WatchDescriptor inotify wd)
     where
+    -- catch_IO is same as catchIOError from base >= 4.5.0.0
+    catch_IO :: IO a -> (IOError -> IO a) -> IO a
+    catch_IO = E.catch
     eventVarietyToMask ev =
         case ev of
             Access -> inAccess
@@ -313,13 +312,15 @@
     runHandler (_,  e@QOverflow) = do -- send overflows to all handlers
         handlers <- readMVar em
         flip mapM_ (Map.elems handlers) $ \handler ->
-            catch (handler e) (\_ -> return ()) -- supress errors
+            E.catch (handler e) ignore_failure -- supress errors
     runHandler (wd, event) = do 
         handlers <- readMVar em
         let handlerM = Map.lookup wd handlers
         case handlerM of
           Nothing -> putStrLn "runHandler: couldn't find handler" -- impossible?
-          Just handler -> catch (handler event) (\_ -> return ())
+          Just handler -> E.catch (handler event) ignore_failure
+    ignore_failure :: SomeException -> IO ()
+    ignore_failure _ = return ()
 
 killINotify :: INotify -> IO ()
 killINotify (INotify h _ _ tid1 tid2) =
diff --git a/src/System/INotify/Masks.hsc b/src/System/INotify/Masks.hsc
--- a/src/System/INotify/Masks.hsc
+++ b/src/System/INotify/Masks.hsc
@@ -44,7 +44,7 @@
 maskIsSet :: Mask -> CUInt -> Bool
 maskIsSet mask cuint =
     value mask .&. cuint > 0
-    
+
 value :: Mask -> CUInt
 value (UserSpace i) = i
 value (Extra i) = i
