diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,9 @@
 Changelog for HLint (* = breaking change)
 
+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
+    #513, add section links in the HTML report
 2.1.9, released 2018-08-08
     Add QuickCheck fixities
     Warn on redundant EmptyCase extension
diff --git a/data/report_template.html b/data/report_template.html
--- a/data/report_template.html
+++ b/data/report_template.html
@@ -29,19 +29,31 @@
 
 // SHOW/HIDE LOGIC //
 
-var last = "";
-
-function show(id)
+/**
+ * @param {bool} [initialise=false] - Used to signal we are loading the page, so
+ the current location doesn't match our presumed state.
+ */
+function show(id, initialise=false)
 {
-    if (id == last) return;
-    if (id == "")
+    var last;
+    if (initialise)
     {
+        last = "";
+    }
+    else
+    {
+        last = document.location.hash.slice(1);
+    }
+
+    if (id === last) return;
+    if (id.length === 0)
+    {
         deleteRules(3);
         insertRule(".all {font-weight: bold;}");
     }
     else
     {
-        if (last == "")
+        if (last.length === 0)
         {
             deleteRules(1);
             insertRule("#content div {display:none;}");
@@ -54,7 +66,10 @@
         insertRule("#" + id + "{font-weight:bold;}");
     }
 
-    last = id;
+    if (window.history)
+        history.replaceState("", document.title, window.location.pathname + window.location.search + (id === "" ? "" : "#" + id));
+    else
+        document.location.hash = '#'.concat(id);
 }
 
 </script>
@@ -164,5 +179,8 @@
 
 $CONTENT
 </div>
+<script type='text/javascript'>
+show(window.location.hash.slice(1), true);
+</script>
 </body>
 </html>
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.9
+version:            2.1.10
 license:            BSD3
 license-file:       LICENSE
 category:           Development
diff --git a/src/CmdLine.hs b/src/CmdLine.hs
--- a/src/CmdLine.hs
+++ b/src/CmdLine.hs
@@ -224,10 +224,9 @@
         curdir <- getCurrentDirectory
         -- Ignores home directory when it isn't present.
         home <- catchIOError ((:[]) <$> getHomeDirectory) (const $ return [])
-        b <- doesFileExist ".hlint.yaml"
         implicit <- findM doesFileExist $
-            "HLint.hs" : -- the default in HLint 1.*
             map (</> ".hlint.yaml") (ancestors curdir ++ home) -- to match Stylish Haskell
+            ++ ["HLint.hs"] -- the default in HLint 1.*
         return $ explicit1 ++ maybeToList implicit ++ explicit2
     where
         ancestors = init . map joinPath . reverse . inits . splitPath
diff --git a/src/Test/All.hs b/src/Test/All.hs
--- a/src/Test/All.hs
+++ b/src/Test/All.hs
@@ -39,8 +39,8 @@
 
     putStrLn "Testing"
     checkCommentedYaml $ dataDir </> "default.yaml"
-    config <- readFilesConfig [(".hlint.yaml",Nothing)]
-    when useSrc $ wrap "Source annotations" $
+    when useSrc $ wrap "Source annotations" $ do
+        config <- readFilesConfig [(".hlint.yaml",Nothing)]
         forM_ builtinHints $ \(name,_) -> do
             progress
             testAnnotations (Builtin name : if name == "Restrict" then config else []) $ "src/Hint" </> name <.> "hs"
