diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -40,6 +40,9 @@
   - env: BUILD=cabal GHCVER=8.2.1 CABALVER=2.0 HAPPYVER=1.19.5 ALEXVER=3.1.7
     compiler: ": #GHC 8.2.1"
     addons: {apt: {packages: [cabal-install-2.0,ghc-8.2.1,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
+  - env: BUILD=cabal GHCVER=8.2.2 CABALVER=2.0 HAPPYVER=1.19.5 ALEXVER=3.1.7
+    compiler: ": #GHC 8.2.2"
+    addons: {apt: {packages: [cabal-install-2.0,ghc-8.2.2,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
 
   # Build with the newest GHC and cabal-install. This is an accepted failure,
   # see below.
@@ -67,6 +70,10 @@
 
   - env: BUILD=stack ARGS="--resolver lts-7" STACK_YAML=stack-lts-7.yaml
     compiler: ": #stack 8.0.1"
+    addons: {apt: {packages: [libgmp-dev]}}
+
+  - env: BUILD=stack ARGS="--resolver lts-9" STACK_YAML=stack-lts-9.yaml
+    compiler: ": #stack 8.0.2"
     addons: {apt: {packages: [libgmp-dev]}}
 
   # Nightly builds are allowed to fail
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,15 @@
+## 0.9.0.3 (2018-01-25)
+
+Changes:
+  - Bump QuickCheck, hlint bounds.
+  - Add GHC 8.2.2 to .travis.yml.
+  - Much improved Nix support, including a default fixed nixpkgs
+    revision and Hydra jobsets.
+  - Stackage LTS 10 support.
+
+Fixes:
+  - Fixed new hlint issues.
+
 ## 0.9.0.2 (2017-10-18)
 
 Changes:
diff --git a/default.nix b/default.nix
new file mode 100644
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,11 @@
+# From GitHub: mozilla/nixpkgs-mozilla/default.nix.
+
+self: super:
+
+with super.lib;
+
+(foldl' (flip extends) (_: super) [
+
+  (import ./nix/overlays/haskell-overrides.nix)
+
+]) self
diff --git a/hpio.cabal b/hpio.cabal
--- a/hpio.cabal
+++ b/hpio.cabal
@@ -1,9 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.19.2.
+-- This file has been generated from package.yaml by hpack version 0.21.2.
 --
 -- see: https://github.com/sol/hpack
+--
+-- hash: 998649f85926e44c675d5e7d0f9074add5f856d11f0f01dc411e7db73e59f8c9
 
 name:                   hpio
-version:                0.9.0.2
+version:                0.9.0.3
 synopsis:               Monads for GPIO in Haskell
 description:            This package provides an embedded DSL for writing cross-platform
                         GPIO programs in Haskell. Currently only Linux is supported (via the
@@ -33,16 +35,24 @@
 extra-source-files:
     .travis.yml
     changelog.md
+    default.nix
     Hlint.hs
-    nix/hpio.nix
+    nix/fetch-nixpkgs.nix
+    nix/jobsets/default.nix
+    nix/jobsets/release.nix
+    nix/jobsets/spec.json
+    nix/lib.nix
+    nix/nixpkgs-src.json
+    nix/overlays/haskell-overrides.nix
+    nix/pkgs/hpio.nix
     package.yaml
     README.md
-    release.nix
     shell.nix
     stack-lts-2.yaml
     stack-lts-3.yaml
     stack-lts-6.yaml
     stack-lts-7.yaml
+    stack-lts-9.yaml
     stack.yaml
 
 source-repository head
@@ -79,7 +89,7 @@
   c-sources:
       src/System/GPIO/Linux/Sysfs/pollSysfs.c
   build-depends:
-      QuickCheck >=2.7.6 && <2.11
+      QuickCheck >=2.7.6 && <2.12
     , base >=4.7.0 && <5
     , bytestring >=0.10.4 && <0.11
     , containers >=0.5.5 && <0.6
@@ -243,7 +253,7 @@
   else
     build-depends:
         base
-      , hlint
+      , hlint >=1.9 && <2.1
       , protolude
   default-language: Haskell2010
 
diff --git a/nix/fetch-nixpkgs.nix b/nix/fetch-nixpkgs.nix
new file mode 100644
--- /dev/null
+++ b/nix/fetch-nixpkgs.nix
@@ -0,0 +1,25 @@
+# From https://github.com/input-output-hk/iohk-ops/blob/a25d2d9320f8b8f3515f1195d5fceba96fd24493/fetch-nixpkgs.nix
+
+let
+  spec = builtins.fromJSON (builtins.readFile ./nixpkgs-src.json);
+  src = import <nix/fetchurl.nix> {
+    url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.rev}.tar.gz";
+    inherit (spec) sha256;
+  };
+  nixcfg = import <nix/config.nix>;
+in builtins.derivation {
+  system = builtins.currentSystem;
+  name = "${src.name}-unpacked";
+  builder = builtins.storePath nixcfg.shell;
+  inherit src;
+  args = [
+    (builtins.toFile "builder" ''
+      $coreutils/mkdir $out
+      cd $out
+      $gzip -d < $src | $tar -x --strip-components=1
+    '')
+  ];
+  coreutils = builtins.storePath nixcfg.coreutils;
+  tar = builtins.storePath nixcfg.tar;
+  gzip = builtins.storePath nixcfg.gzip;
+}
diff --git a/nix/hpio.nix b/nix/hpio.nix
deleted file mode 100644
--- a/nix/hpio.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{ mkDerivation, async, base, bytestring, containers, directory
-, doctest, exceptions, filepath, hlint, hspec, monad-control
-, monad-logger, mtl, optparse-applicative, protolude, QuickCheck
-, stdenv, text, transformers, transformers-base, unix
-, unix-bytestring
-}:
-mkDerivation {
-  pname = "hpio";
-  version = "0.9.0.2";
-  src = ../.;
-  isLibrary = true;
-  isExecutable = true;
-  libraryHaskellDepends = [
-    base bytestring containers directory exceptions filepath
-    monad-control monad-logger mtl protolude QuickCheck text
-    transformers transformers-base unix unix-bytestring
-  ];
-  executableHaskellDepends = [
-    async base exceptions mtl optparse-applicative protolude text
-    transformers
-  ];
-  testHaskellDepends = [
-    base containers directory doctest exceptions filepath hlint hspec
-    protolude QuickCheck
-  ];
-  homepage = "https://github.com/quixoftic/hpio#readme";
-  description = "Monads for GPIO in Haskell";
-  license = stdenv.lib.licenses.bsd3;
-}
diff --git a/nix/jobsets/default.nix b/nix/jobsets/default.nix
new file mode 100644
--- /dev/null
+++ b/nix/jobsets/default.nix
@@ -0,0 +1,63 @@
+# Based on
+# https://github.com/input-output-hk/iohk-ops/blob/df01a228e559e9a504e2d8c0d18766794d34edea/jobsets/default.nix
+
+{ nixpkgs ? <nixpkgs>
+, declInput ? {}
+}:
+
+let
+
+  hpioUri = "https://github.com/quixoftic/hpio.git";
+
+  mkFetchGithub = value: {
+    inherit value;
+    type = "git";
+    emailresponsible = false;
+  };
+
+  nixpkgs-src = builtins.fromJSON (builtins.readFile ../nixpkgs-src.json);
+
+  pkgs = import nixpkgs {};
+
+  defaultSettings = {
+    enabled = 1;
+    hidden = false;
+    keepnr = 10;
+    schedulingshares = 100;
+    checkinterval = 60;
+    enableemail = false;
+    emailoverride = "";
+    nixexprpath = "nix/jobsets/release.nix";
+    nixexprinput = "hpio";
+    description = "hpio";
+    inputs = {
+      hpio = mkFetchGithub "${hpioUri} master";
+    };
+  };
+
+  mkChannelAlt = hpioBranch: nixpkgsRev: {
+    checkinterval = 60;
+    schedulingshares = 100;
+    inputs = {
+      nixpkgs_override = mkFetchGithub "https://github.com/NixOS/nixpkgs-channels.git ${nixpkgsRev}";
+      hpio = mkFetchGithub "${hpioUri} ${hpioBranch}";
+    };
+  };
+
+  mainJobsets = with pkgs.lib; mapAttrs (name: settings: defaultSettings // settings) (rec {
+    master = {};
+    nixpkgs-unstable = mkChannelAlt "master" "nixpkgs-unstable";
+  });
+
+  jobsetsAttrs = mainJobsets;
+
+  jobsetJson = pkgs.writeText "spec.json" (builtins.toJSON jobsetsAttrs);
+
+in {
+  jobsets = with pkgs.lib; pkgs.runCommand "spec.json" {} ''
+    cat <<EOF
+    ${builtins.toJSON declInput}
+    EOF
+    cp ${jobsetJson} $out
+  '';
+}
diff --git a/nix/jobsets/release.nix b/nix/jobsets/release.nix
new file mode 100644
--- /dev/null
+++ b/nix/jobsets/release.nix
@@ -0,0 +1,28 @@
+let
+
+  fixedNixPkgs = (import ../lib.nix).fetchNixPkgs;
+
+in
+
+{ supportedSystems ? [ "x86_64-darwin" "x86_64-linux" ]
+, scrubJobs ? true
+, nixpkgsArgs ? {
+    config = { allowUnfree = true; allowBroken = true; inHydra = true; };
+    overlays = [ (import ../../.) ];
+  }
+}:
+
+with import (fixedNixPkgs + "/pkgs/top-level/release-lib.nix") {
+  inherit supportedSystems scrubJobs nixpkgsArgs;
+};
+
+let
+
+  jobs = (mapTestOn ({
+    haskellPackages = packagePlatforms pkgs.haskellPackages;
+  }));
+
+in
+{
+  inherit (jobs.haskellPackages) hpio;
+}
diff --git a/nix/jobsets/spec.json b/nix/jobsets/spec.json
new file mode 100644
--- /dev/null
+++ b/nix/jobsets/spec.json
@@ -0,0 +1,16 @@
+{
+    "enabled": 1,
+    "hidden": false,
+    "description": "hpio jobsets",
+    "nixexprinput": "src",
+    "nixexprpath": "nix/jobsets/default.nix",
+    "checkinterval": 60,
+    "schedulingshares": 100,
+    "enableemail": false,
+    "emailoverride": "",
+    "keepnr": 5,
+    "inputs": {
+         "src": { "type": "git", "value": "https://github.com/quixoftic/hpio.git master", "emailresponsible": false }
+         ,"nixpkgs": { "type": "git", "value": "https://github.com/NixOS/nixpkgs-channels.git nixpkgs-unstable", "emailresponsible": false }
+     }
+}
diff --git a/nix/lib.nix b/nix/lib.nix
new file mode 100644
--- /dev/null
+++ b/nix/lib.nix
@@ -0,0 +1,23 @@
+let
+
+  # From https://github.com/input-output-hk/iohk-ops/blob/e6f1ae95cdbfdd5c213aa0b9a1ef67150febc503/lib.nix
+  
+  fetchNixPkgs =
+  let
+    try = builtins.tryEval <nixpkgs_override>;
+  in
+    if try.success
+      then builtins.trace "Using <nixpkgs_override>" try.value
+      else import ./fetch-nixpkgs.nix;
+
+  nixpkgs = import fetchNixPkgs;
+
+  pkgs = nixpkgs {};
+
+  lib = pkgs.lib;
+
+in lib // (rec {
+
+  inherit fetchNixPkgs;
+
+})
diff --git a/nix/nixpkgs-src.json b/nix/nixpkgs-src.json
new file mode 100644
--- /dev/null
+++ b/nix/nixpkgs-src.json
@@ -0,0 +1,6 @@
+{
+    "owner":  "NixOS"
+,   "repo":   "nixpkgs-channels"
+,   "rev":    "a8d0b805b19a9f5713d0733ddd3d6610654140a0"
+,   "sha256": "0a28qxilbax2zi2px19mp7nrgh1nsba1dnlw2a4l80xk7n0iywd2"
+}
diff --git a/nix/overlays/haskell-overrides.nix b/nix/overlays/haskell-overrides.nix
new file mode 100644
--- /dev/null
+++ b/nix/overlays/haskell-overrides.nix
@@ -0,0 +1,15 @@
+self: super:
+
+let
+
+  inherit (self) haskell;
+
+in
+{
+  haskellPackages = super.haskellPackages.extend (self: super:
+    with haskell.lib;
+    rec {
+      hpio = self.callPackage ../pkgs/hpio.nix {};
+    }
+  );
+}
diff --git a/nix/pkgs/hpio.nix b/nix/pkgs/hpio.nix
new file mode 100644
--- /dev/null
+++ b/nix/pkgs/hpio.nix
@@ -0,0 +1,29 @@
+{ mkDerivation, async, base, bytestring, containers, directory
+, doctest, exceptions, filepath, hlint, hspec, monad-control
+, monad-logger, mtl, optparse-applicative, protolude, QuickCheck
+, stdenv, text, transformers, transformers-base, unix
+, unix-bytestring
+}:
+mkDerivation {
+  pname = "hpio";
+  version = "0.9.0.3";
+  src = ../../.;
+  isLibrary = true;
+  isExecutable = true;
+  libraryHaskellDepends = [
+    base bytestring containers directory exceptions filepath
+    monad-control monad-logger mtl protolude QuickCheck text
+    transformers transformers-base unix unix-bytestring
+  ];
+  executableHaskellDepends = [
+    async base exceptions mtl optparse-applicative protolude text
+    transformers
+  ];
+  testHaskellDepends = [
+    base containers directory doctest exceptions filepath hlint hspec
+    protolude QuickCheck
+  ];
+  homepage = "https://github.com/quixoftic/hpio#readme";
+  description = "Monads for GPIO in Haskell";
+  license = stdenv.lib.licenses.bsd3;
+}
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name:        hpio
-version:     0.9.0.2
+version:     0.9.0.3
 synopsis:    Monads for GPIO in Haskell
 category:    System
 stability:   experimental
@@ -113,7 +113,7 @@
     - TypeSynonymInstances
     - UndecidableInstances
   dependencies:
-    - QuickCheck          >=2.7.6  && <2.11
+    - QuickCheck          >=2.7.6  && <2.12
     - base                >=4.7.0  && <5
     - bytestring          >=0.10.4 && <0.11
     - containers          >=0.5.5  && <0.6
@@ -194,7 +194,7 @@
       else:
         dependencies:
           - base
-          - hlint
+          - hlint     >= 1.9 && <2.1
           - protolude
   doctest:
     main: doctest.hs
@@ -228,8 +228,6 @@
       - hspec                >=2.1.7
       - protolude
       - QuickCheck
-    ghc-options:
-      - -threaded
     when:
       - condition: flag(linux-bbone-tests)
         cpp-options:
@@ -240,12 +238,14 @@
   - Hlint.hs
   - README.md
   - changelog.md
+  - default.nix
   - nix/*
+  - nix/*/*
   - package.yaml
-  - release.nix
   - shell.nix
   - stack.yaml
   - stack-lts-2.yaml
   - stack-lts-3.yaml
   - stack-lts-6.yaml
   - stack-lts-7.yaml
+  - stack-lts-9.yaml
diff --git a/release.nix b/release.nix
deleted file mode 100644
--- a/release.nix
+++ /dev/null
@@ -1,67 +0,0 @@
-{ compiler ? "ghc821" }:
-
-let
-  # Disable tests for these packages
-  dontCheckPackages = [
-  ];
-
-  # Jailbreak these packages
-  doJailbreakPackages = [
-  ];
-
-  # Disable haddocks for these packages
-  dontHaddockPackages = [
-  ];
-
-  config = {
-    packageOverrides = pkgs: rec {
-      haskellPackages =
-        let
-          generatedOverrides = haskellPackagesNew: haskellPackagesOld:
-            let
-              toPackage = file: _: {
-                name  = builtins.replaceStrings [ ".nix" ] [ "" ] file;
-
-                value = haskellPackagesNew.callPackage (./. + "/nix/${file}") { };
-              };
-
-            in
-              pkgs.lib.mapAttrs' toPackage (builtins.readDir ./nix);
-
-          makeOverrides =
-            function: names: haskellPackagesNew: haskellPackagesOld:
-              let
-                toPackage = name: {
-                  inherit name;
-
-                  value = function haskellPackagesOld.${name};
-                };
-
-            in
-              builtins.listToAttrs (map toPackage names);
-
-          composeExtensionsList =
-            pkgs.lib.fold pkgs.lib.composeExtensions (_: _: {});
-
-          # More exotic overrides go here
-          manualOverrides = haskellPackagesNew: haskellPackagesOld: {
-            protolude = pkgs.haskell.packages.${compiler}.protolude_0_2;
-          };
-        in
-          pkgs.haskell.packages.${compiler}.override {
-            overrides = composeExtensionsList [
-              generatedOverrides
-              (makeOverrides pkgs.haskell.lib.dontCheck   dontCheckPackages  )
-              (makeOverrides pkgs.haskell.lib.doJailbreak doJailbreakPackages)
-              (makeOverrides pkgs.haskell.lib.dontHaddock dontHaddockPackages)
-              manualOverrides
-            ];
-          };
-    };
-  };
-
-  pkgs = import <nixpkgs> { inherit config; };
-
-in
-  { hpio = pkgs.haskellPackages.hpio;
-  }
diff --git a/shell.nix b/shell.nix
--- a/shell.nix
+++ b/shell.nix
@@ -1,3 +1,15 @@
-{ compiler ? "ghc821" }:
+{ compiler ? "ghc822"
+, overlays ? [ (import ./.) ]
+}:
 
-(import ./release.nix { inherit compiler; }).hpio.env
+let
+
+  fixedNixPkgs = (import ./nix/lib.nix).fetchNixPkgs;
+
+  pkgs = (import fixedNixPkgs) { inherit overlays; };
+
+  drv = pkgs.haskellPackages.hpio;
+
+in
+
+  if pkgs.lib.inNixShell then drv.env else drv
diff --git a/src/System/GPIO/Linux/Sysfs/Mock.hs b/src/System/GPIO/Linux/Sysfs/Mock.hs
--- a/src/System/GPIO/Linux/Sysfs/Mock.hs
+++ b/src/System/GPIO/Linux/Sysfs/Mock.hs
@@ -569,8 +569,7 @@
 -- filesystem.
 doesDirectoryExist :: (MockM m) => FilePath -> SysfsMockT m Bool
 doesDirectoryExist path =
-  do cwz <- getZipper
-     return $ either (const False) (const True) (Internal.cd path cwz)
+  either (const False) (const True) . Internal.cd path <$> getZipper
 
 -- | Check whether the specified file exists in the mock filesystem.
 doesFileExist :: (MockM m) => FilePath -> SysfsMockT m Bool
@@ -605,8 +604,7 @@
     Just (Direction pin) ->
       do visible <- _userVisibleDirection <$> pinState pin
          if visible
-            then do direction <- _direction <$> pinState pin
-                    return $ pinDirectionToBS direction
+            then pinDirectionToBS . _direction <$> pinState pin
             else throwM $
                    InternalError $
                      unwords ["Mock pin", show pin, "has no direction but direction attribute is exported"]
@@ -720,8 +718,7 @@
 fileAt path =
   let (dirPath, fileName) = splitFileName path
   in
-    do parent <- _cwd <$> cd dirPath
-       return $ findFile fileName parent
+    findFile fileName . _cwd <$> cd dirPath
 
 -- | For the mock filesystem, this action is equivalent to
 -- 'writeFile'.
diff --git a/src/System/GPIO/Linux/Sysfs/Monad.hs b/src/System/GPIO/Linux/Sysfs/Monad.hs
--- a/src/System/GPIO/Linux/Sysfs/Monad.hs
+++ b/src/System/GPIO/Linux/Sysfs/Monad.hs
@@ -529,9 +529,7 @@
     maybeReadPinEdge =
         pinHasEdge p >>= \case
           False -> return Nothing
-          True ->
-            do edge <- readPinEdge p
-               return $ Just edge
+          True -> Just <$> readPinEdge p
 
 writeDirection :: (CatchSysfsM m) => Pin -> ByteString -> m ()
 writeDirection p bs =
diff --git a/stack-lts-9.yaml b/stack-lts-9.yaml
new file mode 100644
--- /dev/null
+++ b/stack-lts-9.yaml
@@ -0,0 +1,10 @@
+require-stack-version: ">= 1.1.0"
+pvp-bounds: both
+resolver: lts-9.6
+extra-deps:
+- protolude-0.2
+packages:
+- .
+flags:
+  hpio:
+    test-hlint: false
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,10 +1,5 @@
 require-stack-version: ">= 1.1.0"
 pvp-bounds: both
-resolver: lts-9.6
-extra-deps:
-- protolude-0.2
+resolver: lts-10.3
 packages:
 - .
-flags:
-  hpio:
-    test-hlint: false
