diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,17 @@
 Changelog for HLint (* = breaking change)
 
+2.1.11, released 2018-12-02
+    #553, define __HLINT__=1 for the C preprocessor
+    #546, suggest `x $> y` for `const x <$> y`, `pure x <$> y`, and `return x <$> y`
+    #546, suggest `x <$ y` for `x <&> const y`, `x <&> pure y`, and `x <&> return y`
+    #556, disable a few incorrect lens hints
+    #545, don't suggest turning type applications into sections
+    #466, avoid false positives for Esqueleto
+    #535, more lens hints
+    Allow {-# HLINT #-} and {- HLINT -} pragmas
+    #532, generate requested report files even if there are no hints
+    #524, don't suggest newtype for existentials
+    #521, add a hint for f x@_ = ... ==> f x = ...
 2.1.10, released 2018-08-16
     #516, don't require a .hlint.yaml when running tests
     Prefer .hlint.yaml to HLint.hs for settings
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -71,7 +71,7 @@
 **Travis:** Execute the following command:
 
 ```sh
-curl -sL https://raw.github.com/ndmitchell/hlint/master/misc/travis.sh | sh -s .
+curl -sSL https://raw.github.com/ndmitchell/hlint/master/misc/travis.sh | sh -s .
 ```
 
 The arguments after `-s` are passed to `hlint`, so modify the final `.` if you want other arguments.
@@ -90,6 +90,7 @@
 
 * Lots of editors have HLint plugins (quite a few have more than one HLint plugin).
 * HLint is part of the multiple editor plugins [ghc-mod](https://hackage.haskell.org/package/ghc-mod) and [Intero](https://github.com/commercialhaskell/intero).
+* [HLint Source Plugin](https://github.com/ocharles/hlint-source-plugin) makes HLint available as a GHC plugin.
 * [Code Climate](https://docs.codeclimate.com/v1.0/docs/hlint) is a CI for analysis which integrates HLint.
 * [Danger](http://allocinit.io/haskell/danger-and-hlint/) can be used to automatically comment on pull requests with HLint suggestions.
 
@@ -237,17 +238,24 @@
 
 You can see the output of `--default` [here](https://github.com/ndmitchell/hlint/blob/master/data/default.yaml).
 
+If you wish to use the [Dhall configuration language](https://github.com/dhall-lang/dhall-lang) to customize HLint, there [is an example](https://kowainik.github.io/posts/2018-09-09-dhall-to-hlint.html) and [type definition](https://github.com/kowainik/relude/blob/master/hlint/Rule.dhall).
+
 ### Ignoring hints
 
 Some of the hints are subjective, and some users believe they should be ignored. Some hints are applicable usually, but occasionally don't always make sense. The ignoring mechanism provides features for suppressing certain hints. Ignore directives can either be written as pragmas in the file being analysed, or in the hint files. Examples of pragmas are:
 
-* `{-# ANN module "HLint: ignore Eta reduce" #-}` - ignore all eta reduction suggestions in this module (use `module` literally, not the name of the module). Put this annotation _after_ the `import` statements.
-* `{-# ANN myFunction "HLint: ignore" #-}` - don't give any hints in the function `myFunction`.
-* `{-# ANN myFunction "HLint: error" #-}` - any hint in the function `myFunction` is an error.
-* `{-# ANN module "HLint: error Use concatMap" #-}` - the hint to use `concatMap` is an error (you may also use `warn` or `suggest` in place of `error` for other severity levels).
+* `{-# ANN module "HLint: ignore" #-}` or `{-# HLINT ignore #-}` or `{- HLINT ignore -}` - ignore all hints in this module (use `module` literally, not the name of the module).
+* `{-# ANN module "HLint: ignore Eta reduce" #-}` or `{-# HLINT ignore "Eta reduce" #-}` or `{- HLINT ignore "Eta reduce" -}` - ignore all eta reduction suggestions in this module.
+* `{-# ANN myFunction "HLint: ignore" #-}` or `{-# HLINT ignore myFunction #-}` or `{- HLINT ignore myFunction -}` - don't give any hints in the function `myFunction`.
+* `{-# ANN myFunction "HLint: error" #-}` or `{-# HLINT error myFunction #-}` or `{- HLINT error myFunction -}` - any hint in the function `myFunction` is an error.
+* `{-# ANN module "HLint: error Use concatMap" #-}` or `{-# HLINT error "Use concatMap" #-}` or `{- HLINT error "Use concatMap" -}` - the hint to use `concatMap` is an error (you may also use `warn` or `suggest` in place of `error` for other severity levels).
 
-If you have the `OverloadedStrings` extension enabled you will need to give an explicit type to the annotation, e.g. `{-# ANN myFunction ("HLint: ignore" :: String) #-}`.
+For `ANN` pragmas it is important to put them _after_ any `import` statements. If you have the `OverloadedStrings` extension enabled you will need to give an explicit type to the annotation, e.g. `{-# ANN myFunction ("HLint: ignore" :: String) #-}`. The `ANN` pragmas can also increase compile times or cause more recompilation than otherwise required, since they are evaluated by `TemplateHaskell`.
 
+For `{-# HLINT #-}` pragmas GHC may give a warning about an unrecognised pragma, which can be supressed with `-Wno-unrecognised-pragmas`.
+
+For `{- HLINT -}` comments they are likely to be treated as comments in syntax highlighting, which can lead to them being overlooked.
+
 Ignore directives can also be written in the hint files:
 
 * `- ignore: {name: Eta reduce}` - suppress all eta reduction suggestions.
@@ -258,6 +266,14 @@
 
 These directives are applied in the order they are given, with later hints overriding earlier ones.
 
+Finally, `hlint` defines the `__HLINT__` preprocessor definition (with value `1`), so problematic definitions (including those that don't parse) can be hidden with:
+
+```haskell
+#ifndef __HLINT__
+foo = ( -- HLint would fail to parse this
+#endif
+```
+
 ### Adding hints
 
 The hint suggesting `concatMap` can be defined as:
@@ -313,7 +329,7 @@
 
 ## Hacking HLint
 
-Contributions to HLint are most welcome, following [my standard contribution guidelines](https://github.com/ndmitchell/neil/blob/master/README.md#contributions). You can run the tests either from within a `ghci` session by typing `:test` or by running the standalone binary's tests via `stack exec hlint test`.
+Contributions to HLint are most welcome, following [my standard contribution guidelines](https://github.com/ndmitchell/neil/blob/master/README.md#contributions). You can run the tests either from within a `ghci` session by typing `:test` or by running the standalone binary's tests via `cabal run hlint test` or `stack init && stack run hlint test`.
 
 New tests for individual hints can be added directly to source and hint files by adding annotations bracketed in `<TEST></TEST>` code comment blocks. As some examples:
 
diff --git a/data/hlint.yaml b/data/hlint.yaml
--- a/data/hlint.yaml
+++ b/data/hlint.yaml
@@ -249,7 +249,7 @@
     - warn: {lhs: (f $), rhs: f, name: Redundant $}
     - warn: {lhs: (Data.Function.& f), rhs: f, name: Redundant Data.Function.&}
     - hint: {lhs: \x -> y, rhs: const y, side: isAtom y && not (isWildcard y)}
-        # isWildcard because some people like to put brackets round them even though they are atomic
+        # If any isWildcard recursively then x may be used but not mentioned explicitly
     - warn: {lhs: flip f x y, rhs: f y x, side: isApp original, name: Redundant flip}
     - warn: {lhs: id x, rhs: x, side: not (isTypeApp x), name: Redundant id}
     - warn: {lhs: id . x, rhs: x, name: Redundant id}
@@ -323,6 +323,12 @@
     - hint: {lhs: x *> return y, rhs: x Data.Functor.$> y}
     - hint: {lhs: pure x <* y, rhs: x Data.Functor.<$ y}
     - hint: {lhs: return x <* y, rhs: x Data.Functor.<$ y}
+    - hint: {lhs: const x <$> y, rhs: x <$ y}
+    - hint: {lhs: pure x <$> y, rhs: x <$ y}
+    - hint: {lhs: return x <$> y, rhs: x <$ y}
+    - hint: {lhs: x <&> const y, rhs: x Data.Functor.$> y}
+    - hint: {lhs: x <&> pure y, rhs: x Data.Functor.$> y}
+    - hint: {lhs: x <&> return y, rhs: x Data.Functor.$> y}
 
     # MONAD
 
@@ -634,7 +640,6 @@
     - package lens
     rules:
     - warn: {lhs: "(a ^. b) ^. c", rhs: "a ^. (b . c)"}
-    - warn: {lhs: "(a ^. b) ^? c", rhs: "a ^? (b . c)"}
     - warn: {lhs: "fromJust (a ^? b)", rhs: "a ^?! b"}
     - warn: {lhs: "a .~ Just b", rhs: "a ?~ b"}
     - warn: {lhs: "a & (mapped %~ b)", rhs: "a <&> b"}
@@ -643,6 +648,14 @@
     - warn: {lhs: "ask <&> (^. a)", rhs: "view a"}
     - warn: {lhs: "view a <&> (^. b)", rhs: "view (a . b)"}
 
+    # `at` pitfalls:
+
+    - warn: {lhs: "Control.Lens.at a . Control.Lens._Just", rhs: "Control.Lens.ix a"}
+    - error: {lhs: "Control.Lens.has (Control.Lens.at a)", rhs: "True"}
+    - error: {lhs: "Control.Lens.has (a . Control.Lens.at b)", rhs: "Control.Lens.has a"}
+    - error: {lhs: "Control.Lens.nullOf (Control.Lens.at a)", rhs: "False"}
+    - error: {lhs: "Control.Lens.nullOf (a . Control.Lens.at b)", rhs: "Control.Lens.nullOf a"}
+
 - group:
     name: generalise
     enabled: false
@@ -699,6 +712,12 @@
 # yes = asciiCI "bye" *> return Bye -- asciiCI "bye" Data.Functor.$> Bye
 # yes = pure x <* y -- x Data.Functor.<$ y
 # yes = return x <* y -- x Data.Functor.<$ y
+# yes = const x <$> y -- x <$ y
+# yes = pure alice <$> [1, 2] -- alice <$ [1, 2]
+# yes = return alice <$> "Bob" -- alice <$ "Bob"
+# yes = Just a <&> const b -- Just a Data.Functor.$> b
+# yes = [a,b] <&> pure c -- [a,b] Data.Functor.$> c
+# yes = Hi <&> return bye -- Hi Data.Functor.$> bye
 # yes = (x !! 0) + (x !! 2) -- head x
 # yes = if b < 42 then [a] else [] -- [a | b < 42]
 # no  = take n (foo xs) == "hello"
@@ -775,6 +794,7 @@
 # main = map $ \ d -> ([| $d |], [| $d |])
 # pairs (x:xs) = map (\y -> (x,y)) xs ++ pairs xs
 # {-# ANN foo "HLint: ignore" #-};foo = map f (map g x) -- @Ignore ???
+# {-# HLINT ignore foo #-};foo = map f (map g x) -- @Ignore ???
 # yes = fmap lines $ abc 123 -- lines Control.Applicative.<$> abc 123
 # no = fmap lines $ abc $ def 123
 # test = foo . not . not -- id
@@ -848,4 +868,5 @@
 # foo = liftIO $ window `on` deleteEvent $ do a; b
 # no = sort <$> f input `shouldBe` sort <$> x
 # sortBy (comparing snd) -- sortOn snd
+# myJoin = on $ child ^. ChildParentId ==. parent ^. ParentId
 # </TEST>
diff --git a/hlint.cabal b/hlint.cabal
--- a/hlint.cabal
+++ b/hlint.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.18
 build-type:         Simple
 name:               hlint
-version:            2.1.10
+version:            2.1.11
 license:            BSD3
 license-file:       LICENSE
 category:           Development
@@ -27,7 +27,7 @@
 extra-doc-files:
     README.md
     CHANGES.txt
-tested-with:        GHC==8.4.3, GHC==8.2.2, GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+tested-with:        GHC==8.6.1, GHC==8.4.4, GHC==8.2.2, 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
diff --git a/src/Apply.hs b/src/Apply.hs
--- a/src/Apply.hs
+++ b/src/Apply.hs
@@ -45,7 +45,7 @@
 
 applyHintsReal :: [Setting] -> Hint -> [(Module_, [Comment])] -> [Idea]
 applyHintsReal settings hints_ ms = concat $
-    [ map (classify (cls ++ mapMaybe readPragma (universeBi m)) . removeRequiresExtensionNotes m) $
+    [ map (classify (cls ++ mapMaybe readPragma (universeBi m) ++ concatMap readComment cs) . removeRequiresExtensionNotes m) $
         order [] (hintModule hints settings nm m) `merge`
         concat [order [fromNamed d] $ decHints d | d <- moduleDecls m] `merge`
         concat [order [] $ hintComment hints settings c | c <- cs]
diff --git a/src/CmdLine.hs b/src/CmdLine.hs
--- a/src/CmdLine.hs
+++ b/src/CmdLine.hs
@@ -242,7 +242,7 @@
         {boolopts=defaultBoolOptions{hashline=False, stripC89=True, ansi=cmdCppAnsi cmd}
         ,includes = cmdCppInclude cmd
         ,preInclude = cmdCppFile cmd
-        ,defines = [(a,drop 1 b) | x <- cmdCppDefine cmd, let (a,b) = break (== '=') x]
+        ,defines = ("__HLINT__","1") : [(a,drop 1 b) | x <- cmdCppDefine cmd, let (a,b) = break (== '=') x]
         }
     | otherwise = NoCpp
 
diff --git a/src/Config/Haskell.hs b/src/Config/Haskell.hs
--- a/src/Config/Haskell.hs
+++ b/src/Config/Haskell.hs
@@ -1,7 +1,8 @@
-{-# LANGUAGE PatternGuards, ViewPatterns #-}
+{-# LANGUAGE PatternGuards, ViewPatterns, ScopedTypeVariables, TupleSections #-}
 
 module Config.Haskell(
     readPragma,
+    readComment,
     readSetting,
     readFileConfigHaskell
     ) where
@@ -9,6 +10,9 @@
 import HSE.All
 import Data.Char
 import Data.List.Extra
+import Text.Read.Extra(readMaybe)
+import Data.Tuple.Extra
+import Data.Maybe
 import Config.Type
 import Util
 import Prelude
@@ -27,7 +31,7 @@
     case res of
         Left (ParseError sl msg err) ->
             error $ "Config parse failure at " ++ showSrcLoc sl ++ ": " ++ msg ++ "\n" ++ err
-        Right (m, _) -> return $ readSettings m
+        Right (m, cs) -> return $ readSettings m ++ map SettingClassify (concatMap readComment cs)
 
 
 -- | Given a module containing HLint settings information return the 'Classify' rules and the 'HintRule' expressions.
@@ -74,6 +78,32 @@
         f _ _ = Nothing
 
 
+readComment :: Comment -> [Classify]
+readComment o@(Comment True _ x)
+    | (hash, x) <- maybe (False, x) (True,) $ stripPrefix "#" x
+    , x <- trim x
+    , (hlint, x) <- word1 x
+    , lower hlint `elem` ["lint","hlint"]
+    = f hash x
+    where
+        f hash x
+            | Just x <- if hash then stripSuffix "#" x else Just x
+            , (sev, x) <- word1 x
+            , Just sev <- getSeverity sev
+            , (things, x) <- g x
+            , Just (hint :: String) <- if x == "" then Just "" else readMaybe x
+            = map (Classify sev hint "") $ ["" | null things] ++ things
+        f hash _ = errorOnComment o $ "bad HLINT pragma, expected:\n    {-" ++ h ++ " HLINT <severity> <identifier> \"Hint name\" " ++ h ++ "-}"
+            where h = ['#' | hash]
+
+        g x | (s, x) <- word1 x
+            , s /= ""
+            , not $ "\"" `isPrefixOf` s
+            = first ((if s == "module" then "" else s):) $ g x
+        g x = ([], x)
+readComment _ = []
+
+
 readSide :: [Decl_] -> (Maybe Exp_, [Note])
 readSide = foldl f (Nothing,[])
     where f (Nothing,notes) (PatBind _ PWildCard{} (UnGuardedRhs _ side) Nothing) = (Just side, notes)
@@ -124,3 +154,9 @@
     showSrcLoc (getPointLoc $ ann val) ++
     ": Error while reading hint file, " ++ msg ++ "\n" ++
     prettyPrint val
+
+errorOnComment :: Comment -> String -> b
+errorOnComment (Comment b ann x) msg = exitMessageImpure $
+    showSrcLoc (getPointLoc ann) ++
+    ": Error while reading hint file, " ++ msg ++ "\n" ++
+    (if b then "{-" else "--") ++ x ++ (if b then "-}" else "")
diff --git a/src/HLint.hs b/src/HLint.hs
--- a/src/HLint.hs
+++ b/src/HLint.hs
@@ -221,12 +221,9 @@
 handleReporting :: [Idea] -> Cmd -> IO ()
 handleReporting showideas cmd@CmdMain{..} = do
     let outStrLn = whenNormal . putStrLn
-    if null showideas then
-        when (cmdReports /= []) $ outStrLn "Skipping writing reports"
-     else
-        forM_ cmdReports $ \x -> do
-            outStrLn $ "Writing report to " ++ x ++ " ..."
-            writeReport cmdDataDir x showideas
+    forM_ cmdReports $ \x -> do
+        outStrLn $ "Writing report to " ++ x ++ " ..."
+        writeReport cmdDataDir x showideas
     unless cmdNoSummary $ do
         let n = length showideas
         outStrLn $ if n == 0 then "No hints" else show n ++ " hint" ++ ['s' | n/=1]
diff --git a/src/HSE/All.hs b/src/HSE/All.hs
--- a/src/HSE/All.hs
+++ b/src/HSE/All.hs
@@ -76,15 +76,17 @@
     ,infix_ 4 [".|.=",".&.=","<.|.=","<.&.="]
     ]
 
-hspecFixities :: [Fixity]
-hspecFixities =
-    infix_ 1 ["`shouldBe`","`shouldSatisfy`","`shouldStartWith`","`shouldEndWith`","`shouldContain`","`shouldMatchList`"
-             ,"`shouldReturn`","`shouldNotBe`","`shouldNotSatisfy`","`shouldNotContain`","`shouldNotReturn`","`shouldThrow`"]
-
-quickCheckFixities :: [Fixity]
-quickCheckFixities =
-    infixr_ 0 ["==>"] ++
-    infix_ 4 ["==="]
+otherFixities :: [Fixity]
+otherFixities = concat
+    -- hspec
+    [infix_ 1 ["`shouldBe`","`shouldSatisfy`","`shouldStartWith`","`shouldEndWith`","`shouldContain`","`shouldMatchList`"
+              ,"`shouldReturn`","`shouldNotBe`","`shouldNotSatisfy`","`shouldNotContain`","`shouldNotReturn`","`shouldThrow`"]
+    -- quickcheck
+    ,infixr_ 0 ["==>"]
+    ,infix_ 4 ["==="]
+    -- esqueleto
+    ,infix_ 4 ["==."]
+    ]
 
 -- Fixites from the `base` package which are currently
 -- missing from `haskell-src-exts`'s baseFixities.
@@ -107,7 +109,7 @@
 -- | Default value for 'ParseFlags'.
 defaultParseFlags :: ParseFlags
 defaultParseFlags = ParseFlags NoCpp defaultParseMode
-    {fixities = Just $ customFixities ++ baseFixities ++ baseNotYetInHSE ++ lensFixities ++ hspecFixities ++ quickCheckFixities
+    {fixities = Just $ customFixities ++ baseFixities ++ baseNotYetInHSE ++ lensFixities ++ otherFixities
     ,ignoreLinePragmas = False
     ,ignoreFunctionArity = True
     ,extensions = defaultExtensions}
diff --git a/src/Hint/Duplicate.hs b/src/Hint/Duplicate.hs
--- a/src/Hint/Duplicate.hs
+++ b/src/Hint/Duplicate.hs
@@ -13,6 +13,8 @@
 main = do a; a; a; b; a; a
 foo = a where {a = 1; b = 2; c = 3}; bar = a where {a = 1; b = 2; c = 3} -- ???
 {-# ANN main "HLint: ignore Reduce duplication" #-}; main = do a; a; a; a; a; a -- @Ignore ???
+{-# HLINT ignore main "Reduce duplication" #-}; main = do a; a; a; a; a; a -- @Ignore ???
+{- HLINT ignore main "Reduce duplication" -}; main = do a; a; a; a; a; a -- @Ignore ???
 </TEST>
 -}
 
diff --git a/src/Hint/Lambda.hs b/src/Hint/Lambda.hs
--- a/src/Hint/Lambda.hs
+++ b/src/Hint/Lambda.hs
@@ -75,6 +75,7 @@
 yes = blah (\ x -> (y, x, z+q)) -- (y, , z+q)
 yes = blah (\ x -> (y, x, z+x))
 tmp = map (\ x -> runST $ action x)
+{-# LANGUAGE TypeApplications #-}; noBug545 = coerce ((<>) @[a])
 {-# LANGUAGE QuasiQuotes #-}; authOAuth2 name = authOAuth2Widget [whamlet|Login via #{name}|] name
 {-# LANGUAGE QuasiQuotes #-}; authOAuth2 = foo (\name -> authOAuth2Widget [whamlet|Login via #{name}|] name)
 </TEST>
@@ -136,7 +137,7 @@
 
 --Section refactoring is not currently implemented.
 lambdaExp :: Maybe Exp_ -> Exp_ -> [Idea]
-lambdaExp p o@(Paren _ (App _ v@(Var l (UnQual _ (Symbol _ x))) y)) | isAtom y, allowLeftSection x =
+lambdaExp p o@(Paren _ (App _ v@(Var l (UnQual _ (Symbol _ x))) y)) | isAtom y, not $ isTypeApp y, allowLeftSection x =
     [suggestN "Use section" o (exp y x)] -- [Replace Expr (toSS o) subts template]]
     where
       exp op rhs = LeftSection an op (toNamed rhs)
diff --git a/src/Hint/NewType.hs b/src/Hint/NewType.hs
--- a/src/Hint/NewType.hs
+++ b/src/Hint/NewType.hs
@@ -13,6 +13,7 @@
 data Color a = Red a | Green a | Blue a
 data Pair a b = Pair a b
 data Foo = Bar
+data Foo a = Eq a => MkFoo a
 data X = Y {-# UNPACK #-} !Int -- newtype X = Y Int
 data A = A {b :: !C} -- newtype A = A {b :: C}
 data A = A Int#
@@ -36,8 +37,8 @@
 
 
 singleSimpleField :: Decl_ -> Maybe (DataOrNew S, Type_, DataOrNew S -> Type_ -> Decl_)
-singleSimpleField (DataDecl x1 dt x2 x3 [QualConDecl y1 Nothing y2 ctor] x4)
-    | Just (t, ft) <- f ctor = Just (dt, t, \dt t -> DataDecl x1 dt x2 x3 [QualConDecl y1 Nothing y2 $ ft t] x4)
+singleSimpleField (DataDecl x1 dt x2 x3 [QualConDecl y1 Nothing Nothing ctor] x4)
+    | Just (t, ft) <- f ctor = Just (dt, t, \dt t -> DataDecl x1 dt x2 x3 [QualConDecl y1 Nothing Nothing $ ft t] x4)
     where
         f (ConDecl x1 x2 [t]) | not $ isKindHash t = Just (t, \t -> ConDecl x1 x2 [t])
         f (RecDecl x1 x2 [FieldDecl y1 [y2] t]) = Just (t, \t -> RecDecl x1 x2 [FieldDecl y1 [y2] t])
diff --git a/src/Hint/Pattern.hs b/src/Hint/Pattern.hs
--- a/src/Hint/Pattern.hs
+++ b/src/Hint/Pattern.hs
@@ -47,6 +47,8 @@
 foo ![x] = x -- [x]
 foo !Bar { bar = x } = x -- Bar { bar = x }
 l !(() :: ()) = x -- (() :: ())
+foo x@_ = x -- x
+foo x@Foo = x
 </TEST>
 -}
 
@@ -179,6 +181,7 @@
           f PVar{} = True
           f _ = False
           r = Replace R.Pattern (toSS o) [("x", toSS x)] "x"
+patHint lang strict o@(PAsPat u v PWildCard{}) = [warn "Redundant as-pattern" o v []]
 patHint _ _ _ = []
 
 
diff --git a/src/Report.hs b/src/Report.hs
--- a/src/Report.hs
+++ b/src/Report.hs
@@ -33,8 +33,13 @@
         hints = generateIds $ map hintName $ sortOn (negate . fromEnum . ideaSeverity &&& hintName) ideas
         hintName x = show (ideaSeverity x) ++ ": " ++ ideaHint x
 
-        inner = [("VERSION",['v' : showVersion version]),("CONTENT",content),
-                 ("HINTS",list "hint" hints),("FILES",list "file" files)]
+        inner = if null ideas then emptyInner else nonEmptyInner
+
+        emptyInner = [("VERSION",['v' : showVersion version]),("CONTENT", ["No hints"]),
+                      ("HINTS", ["<li>No hints</li>"]),("FILES", ["<li>No files</li>"])]
+
+        nonEmptyInner = [("VERSION",['v' : showVersion version]),("CONTENT",content),
+                         ("HINTS",list "hint" hints),("FILES",list "file" files)]
 
         content = concatMap (\i -> writeIdea (getClass i) i) ideas
         getClass i = "hint" ++ f hints (hintName i) ++ " file" ++ f files (srcSpanFilename $ ideaSpan i)
