diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,13 @@
+## 0.8.0.4 (2018-01-26)
+
+- Require hlint 2.0.x.
+
+- Fix new hlint issues.
+
+- Bump QuickCheck bounds.
+
+- New and improved Nix packaging.
+
 ## 0.8.0.3 (2018-01-11)
 
 - Use hpack.
diff --git a/mellon-web.cabal b/mellon-web.cabal
--- a/mellon-web.cabal
+++ b/mellon-web.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 6f888996b5b3eb2e33aad7453edcf072a41751dc7e2fa46cfed52530a1a930d1
+-- hash: a9487a8a210c186753d613c0da759adc43eff2eef6a18ea865efb5add7474532
 
 name:                   mellon-web
-version:                0.8.0.3
+version:                0.8.0.4
 synopsis:               A REST web service for Mellon controllers
 description:            The @mellon-web@ package wraps a @mellon-core@ controller in a REST
                         web service, making it possible to control physical access devices
@@ -47,6 +47,7 @@
 
 extra-source-files:
     changelog.md
+    package.yaml
     README.md
     swagger.json
 
@@ -241,7 +242,7 @@
   else
     build-depends:
         base
-      , hlint >=1.9 && <2.1
+      , hlint ==2.0.*
   default-language: Haskell2010
 
 test-suite spec
@@ -252,7 +253,7 @@
   other-extensions: OverloadedStrings ScopedTypeVariables
   ghc-options: -w -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      QuickCheck >=2.8 && <2.11
+      QuickCheck >=2.8 && <2.12
     , aeson
     , aeson-pretty
     , base
diff --git a/package.yaml b/package.yaml
new file mode 100644
--- /dev/null
+++ b/package.yaml
@@ -0,0 +1,316 @@
+name:       mellon-web
+version:    0.8.0.4
+synopsis:   A REST web service for Mellon controllers
+category:   Web
+stability:  experimental
+author:     Drew Hess <dhess-src@quixoftic.com>
+maintainer: Drew Hess <dhess-src@quixoftic.com>
+copyright:  Copyright (c) 2017, Quixoftic, LLC
+license:    BSD3
+github:     quixoftic/mellon
+
+description: ! 'The @mellon-web@ package wraps a @mellon-core@ controller in a REST
+
+  web service, making it possible to control physical access devices
+
+  from an HTTP client. The package includes both a WAI application
+
+  server, and native Haskell client bindings for the service.
+
+
+  Like the @mellon-core@ controller interface, the @mellon-web@ REST API
+
+  is quite simple. There are only 3 methods:
+
+
+  * @GET /time@ returns the system time on the server. This is made
+
+  available for diagnostic purposes, primarily to ensure the server
+
+  has an accurate clock.
+
+
+  * @GET /state@ returns the controller''s current state (either @Locked@
+
+  or @Unlocked date@ where @date@ is the UTC time at which the
+
+  controller will automatically lock again).
+
+
+  * @PUT /state@ sets the controller''s current state. Use this method to
+
+  lock and unlock the controller.
+
+
+  See the included <API.md API.md> document for detailed documentation
+
+  on the REST service.
+
+
+  Note that the @mellon-web@ server does not provide an authentication
+
+  mechanism! You should proxy it behind a secure, authenticating HTTPS
+
+  server such as Nginx.'
+
+tested-with: GHC==7.10.3 GHC==8.0.1 GHC==8.0.2 GHC==8.2.1 GHC==8.2.2
+
+flags:
+  test-hlint:
+    description: Build hlint test
+    manual: true
+    default: true
+  test-doctests:
+    description: Build doctests
+    manual: true
+    default: true
+  gpio-example:
+    description: Build the GPIO server example
+    manual: true
+    default: true
+  mock-example:
+    description: Build the mock server example
+    manual: true
+    default: true
+  client-unlock-example:
+    description: Build the unlock client example
+    manual: true
+    default: true
+
+when:
+  - condition: impl(ghc >= 8.0)
+    then:
+      ghc-options:
+        - -Wall
+        - -Wincomplete-uni-patterns
+        - -Wincomplete-record-updates
+    else:
+      ghc-options:
+        - -Wall
+        - -fwarn-incomplete-uni-patterns
+        - -fwarn-incomplete-record-updates
+
+library:
+  when:
+    - condition: impl(ghc >= 8.0)
+      then:
+        ghc-options:
+          - -Wcompat
+          - -Wnoncanonical-monad-instances
+          - -Wnoncanonical-monadfail-instances
+      else:
+        # provide/emulate `Control.Monad.Fail` and `Data.Semigroups` API for pre-GHC8
+        dependencies:
+          - fail       == 4.9.*
+          - semigroups == 0.18.*
+  source-dirs: src
+  other-extensions:
+    - DataKinds
+    - DeriveDataTypeable
+    - DeriveGeneric
+    - MultiParamTypeClasses
+    - OverloadedStrings
+    - OverloadedLists
+    - ScopedTypeVariables
+    - TypeOperators
+  dependencies:
+    - base               >=4.8    && <5
+    - aeson              >=0.11   && <1.3
+    - aeson-pretty       ==0.8.*
+    - bytestring         ==0.10.*
+    - http-client        >=0.4    && <0.6
+    - http-types         ==0.9.*
+    - lens               >=4      && <5
+    - lucid              ==2.9.*
+    - mellon-core        ==0.8.*
+    - servant            ==0.11.*
+    - servant-client     ==0.11.*
+    - servant-docs       >=0.10   && <0.12
+    - servant-lucid      ==0.7.*
+    - servant-server     ==0.11.*
+    - servant-swagger    ==1.1.*
+    - servant-swagger-ui ==0.2.*
+    - swagger2           >=2.1    && <2.3
+    - text               ==1.2.*
+    - time               >=1.5    && <2
+    - transformers       >=0.4.2  && <0.6
+    - wai                ==3.2.*
+    - warp               ==3.2.*
+
+tests:
+  hlint:
+    main: hlint.hs
+    source-dirs: test
+    other-modules: []
+    ghc-options:
+      - -w
+      - -threaded
+      - -rtsopts
+      - -with-rtsopts=-N
+    when:
+      - condition: "!(flag(test-hlint))"
+        then:
+          buildable: false
+        else:
+          dependencies:
+            - base
+            - hlint ==2.0.*
+  doctest:
+    main: doctest.hs
+    source-dirs: test
+    other-modules: []
+    ghc-options:
+      - -threaded
+    when:
+      - condition: "!(flag(test-doctests))"
+        then:
+          buildable: false
+        else:
+          dependencies:
+            - base
+            - doctest >=0.11 && <0.14
+  spec:
+    main: Main.hs
+    source-dirs:
+      - test
+    other-extensions:
+      - OverloadedStrings
+      - ScopedTypeVariables
+    ghc-options:
+      - -w
+      - -threaded
+      - -rtsopts
+      - -with-rtsopts=-N
+    dependencies:
+      - base
+      - QuickCheck           >=2.8 && <2.12
+      - quickcheck-instances ==0.3.*
+      - aeson
+      - aeson-pretty
+      - bytestring
+      - hspec                >=2.2 && <2.5
+      - hspec-wai            >=0.6.6 && <0.10
+      - http-client
+      - http-types
+      - lens
+      - lucid
+      - mellon-core
+      - mellon-web
+      - network
+      - servant
+      - servant-client
+      - servant-docs
+      - servant-lucid
+      - servant-server
+      - servant-swagger
+      - servant-swagger-ui
+      - swagger2
+      - text
+      - time
+      - transformers
+      - wai
+      - wai-extra            ==3.0.*
+      - warp
+
+executables:
+  gpio-mellon-server:
+    main: GpioServer.hs
+    source-dirs: examples
+    other-modules: []
+    other-extensions:
+      - OverloadedStrings
+    ghc-options:
+      - -threaded
+      - -fwarn-incomplete-uni-patterns
+      - -fwarn-incomplete-record-updates
+    when:
+      - condition: impl(ghc >= 8.0)
+        ghc-options:
+          - -Wcompat
+          - -Wnoncanonical-monad-instances
+          - -Wnoncanonical-monadfail-instances
+          - -fno-warn-redundant-constraints
+      - condition: "!(flag(gpio-example))"
+        then:
+          buildable: false
+        else:
+          dependencies:
+            - base
+            - exceptions           >=0.8.0 && <1
+            - hpio                 >=0.8 && <1
+            - mellon-core
+            - mellon-gpio          ==0.8.*
+            - mellon-web
+            - mtl
+            - network              ==2.6.*
+            - optparse-applicative >=0.11.0 && <0.15
+            - time
+            - transformers
+            - warp
+  mellon-schedule-unlock:
+    main: ScheduleUnlock.hs
+    source-dirs: examples
+    other-modules: []
+    other-extensions:
+      - LambdaCase
+      - OverloadedStrings
+    ghc-options:
+      - -threaded
+      - -fwarn-incomplete-uni-patterns
+      - -fwarn-incomplete-record-updates
+    when:
+      - condition: impl(ghc >= 8.0)
+        ghc-options:
+          - -Wcompat
+          - -Wnoncanonical-monad-instances
+          - -Wnoncanonical-monadfail-instances
+          - -fno-warn-redundant-constraints
+      - condition: "!(flag(client-unlock-example))"
+        then:
+          buildable: false
+        else:
+          dependencies:
+            - base
+            - bytestring
+            - exceptions
+            - http-client
+            - http-client-tls
+            - http-types
+            - mellon-core
+            - mellon-web
+            - mtl
+            - network
+            - optparse-applicative
+            - servant-client
+            - time
+            - transformers
+  mock-mellon-server:
+    main: MockServer.hs
+    source-dirs: examples
+    other-modules: []
+    ghc-options:
+      - -threaded
+      - -fwarn-incomplete-uni-patterns
+      - -fwarn-incomplete-record-updates
+    when:
+      - condition: impl(ghc >= 8.0)
+        ghc-options:
+          - -Wcompat
+          - -Wnoncanonical-monad-instances
+          - -Wnoncanonical-monadfail-instances
+          - -fno-warn-redundant-constraints
+      - condition: "!(flag(mock-example))"
+        then:
+          buildable: false
+        else:
+          dependencies:
+            - base
+            - mellon-core
+            - mellon-web
+            - warp
+
+extra-source-files:
+- changelog.md
+- README.md
+- swagger.json
+- package.yaml
diff --git a/src/Mellon/Web/Server/API.hs b/src/Mellon/Web/Server/API.hs
--- a/src/Mellon/Web/Server/API.hs
+++ b/src/Mellon/Web/Server/API.hs
@@ -256,9 +256,7 @@
   putState
   where
     getTime :: AppM d Time
-    getTime =
-      do now <- liftIO getCurrentTime
-         return $ Time now
+    getTime = Time <$> liftIO getCurrentTime
 
     getState :: AppM d State
     getState =
