diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015, Ivan Perez
+Copyright (c) 2015-2020, Keera Studios Ltd
 
 All rights reserved.
 
@@ -13,9 +13,9 @@
       disclaimer in the documentation and/or other materials provided
       with the distribution.
 
-    * Neither the name of Ivan Perez nor the names of other
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
+    * Neither the name of Keera Studios, 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
diff --git a/keera-hails-reactive-polling.cabal b/keera-hails-reactive-polling.cabal
--- a/keera-hails-reactive-polling.cabal
+++ b/keera-hails-reactive-polling.cabal
@@ -1,56 +1,118 @@
--- hails.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:                keera-hails-reactive-polling
+-- Copyright   : (C) Keera Studios Ltd, 2013
+-- License     : All Rights Reserved
+-- Maintainer  : support@keera.co.uk
+--
+cabal-version: >= 1.10
+build-type:    Simple
 
--- The package version. See the Haskell package versioning policy
--- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
--- standards guiding when and how versions should be incremented.
-Version:             0.0.3.3
+name:          keera-hails-reactive-polling
+version:       0.8.0
+author:        Ivan Perez
+maintainer:    support@keera.co.uk
+homepage:      http://www.keera.co.uk/blog/community/
+license:       BSD3
+license-file:  LICENSE
+copyright:     (C) 2013 Keera Studios Ltd
+category:      Development
+synopsis:      Haskell on Rails - Polling based Readable RVs
+description:
+  Keera Hails is a rapid application development system.
+  .
+  The idea behind Hails is that you should be able to build cross platform
+  applications with minimal effort, very quickly, and the result should be easy
+  to maintain.
+  .
+  Large Hails applications are structured following an optimized MVC
+  architecture. Values are updated either from the view to the model, or from
+  the model to the view. Internally, rules use a notion of direction in the
+  update to determine how different components must be updated.
+  .
+  This library provides a construct to create RVs based on an operation
+  to be polled a regular intervals.
 
--- A short (one-line) description of the package.
-Synopsis:            Haskell on Rails - Polling based Readable RVs
+source-repository head
+  type: git
+  location: git://github.com/keera-studios/keera-hails
+  subdir: keera-hails-reactive-polling
 
--- URL for the project homepage or repository.
-Homepage:            http://www.keera.es/blog/community/
 
--- The license under which the package is released.
-License:             BSD3
+-- You can disable the hlint test suite with -f-test-hlint
+flag test-hlint
+  default: False
+  manual:  True
 
--- The file containing the license text.
-License-file:        LICENSE
+-- You can disable the haddock coverage test suite with -f-test-doc-coverage
+flag test-doc-coverage
+  default: False
+  manual:  True
 
--- The package author(s).
-Author:              Ivan Perez
 
--- An email address to which users can send suggestions, bug reports,
--- and patches.
-Maintainer:          ivan.perez@keera.co.uk
+library
 
--- A copyright notice.
--- Copyright:           
+  exposed-modules:
+    Hails.Polling
 
-Category:            Development
+  build-depends:
+      base >= 4 && < 5
 
-Build-type:          Simple
+    , keera-hails-reactivevalues
+    , keera-callbacks
 
--- Extra files to be distributed with the package, such as examples or
--- a README.
--- Extra-source-files:  
+  default-language:
+    Haskell2010
 
--- Constraint on the version of Cabal needed to build this package.
-Cabal-version:       >=1.2
+  hs-source-dirs:
+    src/
 
-Library
-  hs-source-dirs: src/
-  
-  ghc-options: -Wall -fno-warn-unused-do-bind -O2
+  ghc-options:
+    -Wall -fno-warn-unused-do-bind -O2
 
-  -- Modules exported by the library.
-  Exposed-modules: Hails.Polling
-  
-  -- Packages needed in order to build this package.
-  Build-depends: base >= 4 && < 5
-               , keera-hails-reactivevalues
-               , keera-callbacks
+
+test-suite hlint
+
+  type:
+    exitcode-stdio-1.0
+
+  main-is:
+    HLintMain.hs
+
+  default-language:
+    Haskell2010
+
+  hs-source-dirs:
+    tests
+
+  if !flag(test-hlint)
+    buildable: False
+  else
+    build-depends:
+        base  >= 4   && < 5
+      , hlint >= 1.7
+
+-- Verify that the code is thoroughly documented
+test-suite haddock-coverage
+
+  type:
+    exitcode-stdio-1.0
+
+  main-is:
+    HaddockCoverage.hs
+
+  default-language:
+    Haskell2010
+
+  hs-source-dirs:
+    tests
+
+  ghc-options:
+    -Wall
+
+  if !flag(test-doc-coverage)
+    buildable: False
+  else
+    build-depends:
+        base        >= 4 && < 5
+      , directory
+      , filepath
+      , process
+      , regex-posix
diff --git a/src/Hails/Polling.hs b/src/Hails/Polling.hs
--- a/src/Hails/Polling.hs
+++ b/src/Hails/Polling.hs
@@ -1,3 +1,8 @@
+-- |
+--
+-- Copyright   : (C) Keera Studios Ltd, 2015
+-- License     : BSD3
+-- Maintainer  : support@keera.co.uk
 module Hails.Polling where
 
 import Control.Concurrent (forkIO, threadDelay)
@@ -5,7 +10,7 @@
 import Data.CBMVar
 import Data.ReactiveValue
 
-pollingReactive :: IO a 
+pollingReactive :: IO a
                 -> Maybe Int
                 -> IO (ReactiveFieldRead IO a)
 pollingReactive sensor delay = do
@@ -15,7 +20,7 @@
   forkIO $ forever $ do v <- sensor
                         writeCBMVar mvar v
                         maybe (return ()) (void . threadDelay) delay
-              
+
   -- RV fields
   let getter   = readCBMVar mvar
       notifier = installCallbackCBMVar mvar
diff --git a/tests/HLintMain.hs b/tests/HLintMain.hs
new file mode 100644
--- /dev/null
+++ b/tests/HLintMain.hs
@@ -0,0 +1,23 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Main (hlint)
+-- Copyright   :  (C) 2013 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- This module runs HLint on the lens source tree.
+-----------------------------------------------------------------------------
+module Main where
+
+import Control.Monad
+import Language.Haskell.HLint
+import System.Environment
+import System.Exit
+
+main :: IO ()
+main = do
+    args <- getArgs
+    hints <- hlint $ ["src", "--cross", "--hint=tests/HLint.hs" ] ++ args
+    unless (null hints) exitFailure
diff --git a/tests/HaddockCoverage.hs b/tests/HaddockCoverage.hs
new file mode 100644
--- /dev/null
+++ b/tests/HaddockCoverage.hs
@@ -0,0 +1,91 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Main (HaddockCoverage)
+-- Copyright   :  (C) 2015 Ivan Perez
+-- License     :  BSD-style (see the file LICENSE)
+-- Maintainer  :  Ivan Perez <ivan.perez@keera.co.uk>
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- Copyright notice: This file borrows code
+-- https://hackage.haskell.org/package/lens-4.7/src/tests/doctests.hsc
+-- which is itself licensed BSD-style as well.
+--
+-- Run haddock on a source tree and report if anything in any
+-- module is not documented.
+-----------------------------------------------------------------------------
+module Main where
+
+import Control.Applicative
+import Control.Monad
+import Data.List
+import System.Directory
+import System.Exit
+import System.FilePath
+import System.IO
+import System.Process
+import Text.Regex.Posix
+
+main :: IO ()
+main = do
+  -- Find haskell modules
+  -- TODO: Ideally cabal should do this (provide us with the
+  -- list of modules). An alternative would be to use cabal haddock
+  -- but that would need a --no-html argument or something like that.
+  -- Alternatively, we could use cabal haddock with additional arguments.
+  --
+  -- See:
+  -- https://github.com/keera-studios/haddock/commit/d5d752943c4e5c6c9ffcdde4dc136fcee967c495
+  -- https://github.com/haskell/haddock/issues/309#issuecomment-150811929
+  files <- getSources
+
+  let haddockArgs = [ "--no-warnings", "--ignore-all-exports" ] ++ files
+  let cabalArgs   = [ "exec", "--", "haddock" ] ++ haddockArgs
+  (code, out, _err) <- readProcessWithExitCode "cabal" cabalArgs ""
+
+  -- Filter out coverage lines, and find those that denote undocumented
+  -- modules.
+  --
+  -- TODO: is there a way to annotate a function as self-documenting,
+  -- in the same way we do with ANN for hlint?
+  let isIncompleteModule :: String -> Bool
+      isIncompleteModule line = isCoverageLine line && not (line =~ "^ *100%")
+        where isCoverageLine :: String -> Bool
+              isCoverageLine line = line =~ "^ *[0-9]+%"
+
+  let incompleteModules :: [String]
+      incompleteModules = filter isIncompleteModule $ lines out
+
+  -- Based on the result of haddock, report errors and exit.
+  -- Note that, unline haddock, this script does not
+  -- output anything to stdout. It uses stderr instead
+  -- (as it should).
+  case (code, incompleteModules) of
+    (ExitSuccess  , []) -> return ()
+    -- (ExitFailure _, _)  -> exitFailure
+    (_            , _)  -> do
+      hPutStrLn stderr "The following modules are not fully documented:"
+      mapM_ (hPutStrLn stderr) incompleteModules
+      exitFailure
+
+getSources :: IO [FilePath]
+getSources = filter isHaskellFile <$> go "src"
+  where
+    go dir = do
+      (dirs, files) <- getFilesAndDirectories dir
+      (files ++) . concat <$> mapM go dirs
+
+    isHaskellFile fp = (isSuffixOf ".hs" fp || isSuffixOf ".lhs" fp)
+                     && not (any (`isSuffixOf` fp) excludedFiles)
+
+    excludedFiles = [ ]
+
+getFilesAndDirectories :: FilePath -> IO ([FilePath], [FilePath])
+getFilesAndDirectories dir = do
+  c <- map (dir </>) . filter (`notElem` ["..", "."]) <$> getDirectoryContents dir
+  (,) <$> filterM doesDirectoryExist c <*> filterM doesFileExist c
+
+-- find-based implementation (not portable)
+--
+-- getSources :: IO [FilePath]
+-- getSources = fmap lines $ readProcess "find" ["src/", "-iname", "*hs"] ""
