diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,15 @@
+# Changelog for grid
+
+7.8.15 Simplified nix config again.
+
+7.8.14 Simplified nix config.
+
+7.8.13 Updated copyright year.
+
+7.8.12 Revamped to work with Nix + cabal-install.
+
+7.8.11 Revamped to work with Nix + Stack.
+
+7.8.10 Revamped to work with Stack v1.7.1.
+
+## Unreleased changes
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Amy de Buitléir (c) 2016
+Copyright (c) 2019-2021, Amy de Buitléir
 
 All rights reserved.
 
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,21 @@
+[![Hackage](https://img.shields.io/hackage/v/grid.svg)](http://hackage.haskell.org/package/grid)
+[![Hackage-Deps](https://img.shields.io/hackage-deps/v/grid.svg)](http://hackage.haskell.org/package/grid)
+
+# Grid
+
+**Grid** is a Haskell library for working with regular grids/graphs/lattices.
+
+Please read the introductory userguide with pictures [here][wiki].
+
+More detailed Haddock documentation with sample code can be found at [Hackage][hackage].
+
+## Related packages
+
+- [htiled][htiled]: Import maps from the `.tmx` map format generated by [Tiled][Tiled].
+- [IcoGrid][IcoGrid]: Defines functions for dealing with a type of hexagon grid wrapped around a sphere.
+
+[wiki]:https://github.com/mhwombat/grid/wiki
+[hackage]:http://hackage.haskell.org/packages/archive/grid/latest/doc/html/Math-Geometry-Grid.html
+[htiled]:http://hackage.haskell.org/package/htiled
+[Tiled]:http://www.mapeditor.org
+[IcoGrid]:http://hackage.haskell.org/package/IcoGrid
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/grid.cabal b/grid.cabal
--- a/grid.cabal
+++ b/grid.cabal
@@ -1,71 +1,81 @@
-name: grid
-version: 7.8.9
-cabal-version: >=1.10
-build-type: Simple
-license: BSD3
-license-file: LICENSE
-copyright: (c) Amy de Buitléir 2010-2016
-maintainer: amy@nualeargais.ie
-homepage: https://github.com/mhwombat/grid#readme
-bug-reports: https://github.com/mhwombat/grid/issues
-synopsis: Tools for working with regular grids (graphs, lattices).
+cabal-version:      2.4
+name:               grid
+version:            7.8.15
+synopsis:           Tools for working with regular grids (graphs, lattices).
 description:
-    Provides tools for working with regular arrangements
-    of tiles, such as might be used in a board game or some
-    other type of grid map. Currently supports triangular,
-    square, and hexagonal tiles, with various 2D and
-    toroidal layouts.
-    The userguide is available at
-    <https://github.com/mhwombat/grid/wiki>.
-category: Math
-author: Amy de Buitléir
+  Please see the README on GitHub at <https://github.com/mhwombat/grid#readme>
+homepage:           https://github.com/mhwombat/grid
+bug-reports:        https://github.com/mhwombat/grid/issues
+license:            BSD-3-Clause
+license-file:       LICENSE
+author:             Amy de Buitléir
+maintainer:         amy@nualeargais.ie
+copyright:          2010-2021 Amy de Buitléir
+category:           Math
+extra-source-files:
+  CHANGELOG.md
+  README.md
 
 source-repository head
-    type: git
-    location: https://github.com/mhwombat/grid
+  type:     git
+  location: https://github.com/mhwombat/grid
 
+common common-stuff
+  default-language: Haskell2010
+
 library
-    exposed-modules:
-        Math.Geometry.Grid
-        Math.Geometry.Grid.Triangular
-        Math.Geometry.Grid.Square
-        Math.Geometry.Grid.Hexagonal
-        Math.Geometry.Grid.Hexagonal2
-        Math.Geometry.Grid.Octagonal
-        Math.Geometry.GridInternal
-        Math.Geometry.Grid.TriangularInternal
-        Math.Geometry.Grid.SquareInternal
-        Math.Geometry.Grid.HexagonalInternal
-        Math.Geometry.Grid.HexagonalInternal2
-        Math.Geometry.Grid.OctagonalInternal
-        Math.Geometry.GridMap
-        Math.Geometry.GridMap.Lazy
-    build-depends:
-        base >=4.7 && <5,
-        cereal >=0.4 && <0.6,
-        containers ==0.5.*
-    default-language: Haskell2010
-    hs-source-dirs: src
-    ghc-options: -Wall
+  import:           common-stuff
+  hs-source-dirs:   src
+  exposed-modules:
+    Math.Geometry.Grid
+    Math.Geometry.Grid.Hexagonal
+    Math.Geometry.Grid.Hexagonal2
+    Math.Geometry.Grid.HexagonalInternal
+    Math.Geometry.Grid.HexagonalInternal2
+    Math.Geometry.Grid.Octagonal
+    Math.Geometry.Grid.OctagonalInternal
+    Math.Geometry.Grid.Square
+    Math.Geometry.Grid.SquareInternal
+    Math.Geometry.Grid.Triangular
+    Math.Geometry.Grid.TriangularInternal
+    Math.Geometry.GridInternal
+    Math.Geometry.GridMap
+    Math.Geometry.GridMap.Lazy
+  other-modules:    Paths_grid
+  autogen-modules:  Paths_grid
+  ghc-options:      -Wall -Wunused-packages
+  build-depends:
+    , base        >=4.7 && <5
+    , containers  >=0.5 && <0.7
+  other-extensions:
+    CPP
+    ConstrainedClassMethods
+    DeriveGeneric
+    FlexibleContexts
+    FlexibleInstances
+    MultiParamTypeClasses
+    TypeFamilies
+    TypeSynonymInstances
+    UndecidableInstances
 
-test-suite grid-test
-    type: exitcode-stdio-1.0
-    main-is: TestMain.hs
-    build-depends:
-        base >=4.10.0.0 && <4.11,
-        grid,
-        containers >=0.5.10.2 && <0.6,
-        test-framework ==0.8.*,
-        test-framework-quickcheck2 ==0.3.*,
-        QuickCheck >=2.8 && <2.10
-    default-language: Haskell2010
-    hs-source-dirs: test
-    other-modules:
-        Math.Geometry.GridQC
-        Math.Geometry.Grid.Hexagonal2QC
-        Math.Geometry.Grid.HexagonalQC
-        Math.Geometry.Grid.OctagonalQC
-        Math.Geometry.Grid.SquareQC
-        Math.Geometry.Grid.TriangularQC
-        Math.Geometry.GridMap.LazyQC
-    ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+test-suite grid-tests
+  import:         common-stuff
+  type:           exitcode-stdio-1.0
+  hs-source-dirs: test
+  main-is:        Spec.hs
+  other-modules:
+    Math.Geometry.Grid.Hexagonal2QC
+    Math.Geometry.Grid.HexagonalQC
+    Math.Geometry.Grid.OctagonalQC
+    Math.Geometry.Grid.SquareQC
+    Math.Geometry.Grid.TriangularQC
+    Math.Geometry.GridMap.LazyQC
+    Math.Geometry.GridQC
+  ghc-options:
+    -threaded -rtsopts -with-rtsopts=-N -Wall -Wunused-packages
+  build-depends:
+    , base
+    , grid
+    , QuickCheck
+    , test-framework
+    , test-framework-quickcheck2
diff --git a/src/Math/Geometry/Grid.hs b/src/Math/Geometry/Grid.hs
--- a/src/Math/Geometry/Grid.hs
+++ b/src/Math/Geometry/Grid.hs
@@ -1,7 +1,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.Grid
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/Hexagonal.hs b/src/Math/Geometry/Grid/Hexagonal.hs
--- a/src/Math/Geometry/Grid/Hexagonal.hs
+++ b/src/Math/Geometry/Grid/Hexagonal.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.HexGrid
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/Hexagonal2.hs b/src/Math/Geometry/Grid/Hexagonal2.hs
--- a/src/Math/Geometry/Grid/Hexagonal2.hs
+++ b/src/Math/Geometry/Grid/Hexagonal2.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.HexGrid
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/HexagonalInternal.hs b/src/Math/Geometry/Grid/HexagonalInternal.hs
--- a/src/Math/Geometry/Grid/HexagonalInternal.hs
+++ b/src/Math/Geometry/Grid/HexagonalInternal.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.HexGridInternal
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/HexagonalInternal2.hs b/src/Math/Geometry/Grid/HexagonalInternal2.hs
--- a/src/Math/Geometry/Grid/HexagonalInternal2.hs
+++ b/src/Math/Geometry/Grid/HexagonalInternal2.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.HexGridInternal
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/Octagonal.hs b/src/Math/Geometry/Grid/Octagonal.hs
--- a/src/Math/Geometry/Grid/Octagonal.hs
+++ b/src/Math/Geometry/Grid/Octagonal.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.OctGrid
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/OctagonalInternal.hs b/src/Math/Geometry/Grid/OctagonalInternal.hs
--- a/src/Math/Geometry/Grid/OctagonalInternal.hs
+++ b/src/Math/Geometry/Grid/OctagonalInternal.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.OctGridInternal
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/Square.hs b/src/Math/Geometry/Grid/Square.hs
--- a/src/Math/Geometry/Grid/Square.hs
+++ b/src/Math/Geometry/Grid/Square.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.SquareGrid
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/SquareInternal.hs b/src/Math/Geometry/Grid/SquareInternal.hs
--- a/src/Math/Geometry/Grid/SquareInternal.hs
+++ b/src/Math/Geometry/Grid/SquareInternal.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.SquareGridInternal
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/Triangular.hs b/src/Math/Geometry/Grid/Triangular.hs
--- a/src/Math/Geometry/Grid/Triangular.hs
+++ b/src/Math/Geometry/Grid/Triangular.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.TriGrid
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/Grid/TriangularInternal.hs b/src/Math/Geometry/Grid/TriangularInternal.hs
--- a/src/Math/Geometry/Grid/TriangularInternal.hs
+++ b/src/Math/Geometry/Grid/TriangularInternal.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.TriGridInternal
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/GridInternal.hs b/src/Math/Geometry/GridInternal.hs
--- a/src/Math/Geometry/GridInternal.hs
+++ b/src/Math/Geometry/GridInternal.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.GridInternal
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/GridMap.hs b/src/Math/Geometry/GridMap.hs
--- a/src/Math/Geometry/GridMap.hs
+++ b/src/Math/Geometry/GridMap.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.GridMap
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/src/Math/Geometry/GridMap/Lazy.hs b/src/Math/Geometry/GridMap/Lazy.hs
--- a/src/Math/Geometry/GridMap/Lazy.hs
+++ b/src/Math/Geometry/GridMap/Lazy.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.GridMap.Lazy
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Math/Geometry/Grid/Hexagonal2QC.hs b/test/Math/Geometry/Grid/Hexagonal2QC.hs
--- a/test/Math/Geometry/Grid/Hexagonal2QC.hs
+++ b/test/Math/Geometry/Grid/Hexagonal2QC.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.Grid.Hexagonal2QC
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Math/Geometry/Grid/HexagonalQC.hs b/test/Math/Geometry/Grid/HexagonalQC.hs
--- a/test/Math/Geometry/Grid/HexagonalQC.hs
+++ b/test/Math/Geometry/Grid/HexagonalQC.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.Grid.RectangularQC
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Math/Geometry/Grid/OctagonalQC.hs b/test/Math/Geometry/Grid/OctagonalQC.hs
--- a/test/Math/Geometry/Grid/OctagonalQC.hs
+++ b/test/Math/Geometry/Grid/OctagonalQC.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.Grid.OctagonalQC
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Math/Geometry/Grid/SquareQC.hs b/test/Math/Geometry/Grid/SquareQC.hs
--- a/test/Math/Geometry/Grid/SquareQC.hs
+++ b/test/Math/Geometry/Grid/SquareQC.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.Grid.SquareQC
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Math/Geometry/Grid/TriangularQC.hs b/test/Math/Geometry/Grid/TriangularQC.hs
--- a/test/Math/Geometry/Grid/TriangularQC.hs
+++ b/test/Math/Geometry/Grid/TriangularQC.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.Grid.TriangularQC
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Math/Geometry/GridMap/LazyQC.hs b/test/Math/Geometry/GridMap/LazyQC.hs
--- a/test/Math/Geometry/GridMap/LazyQC.hs
+++ b/test/Math/Geometry/GridMap/LazyQC.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.GridMap.LazyQC
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Math/Geometry/GridQC.hs b/test/Math/Geometry/GridQC.hs
--- a/test/Math/Geometry/GridQC.hs
+++ b/test/Math/Geometry/GridQC.hs
@@ -1,7 +1,7 @@
 ------------------------------------------------------------------------
 -- |
 -- Module      :  Math.Geometry.Grid.GridQC
--- Copyright   :  (c) Amy de Buitléir 2012-2016
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
 -- License     :  BSD-style
 -- Maintainer  :  amy@nualeargais.ie
 -- Stability   :  experimental
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,34 @@
+------------------------------------------------------------------------
+-- |
+-- Module      :  Main
+-- Copyright   :  (c) Amy de Buitléir 2012-2019
+-- License     :  BSD-style
+-- Maintainer  :  amy@nualeargais.ie
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- QuickCheck tests.
+--
+------------------------------------------------------------------------
+import Math.Geometry.Grid.TriangularQC ( test )
+import Math.Geometry.Grid.SquareQC ( test )
+import Math.Geometry.Grid.HexagonalQC ( test )
+import Math.Geometry.Grid.Hexagonal2QC ( test )
+import Math.Geometry.Grid.OctagonalQC ( test )
+import Math.Geometry.GridMap.LazyQC (test)
+
+import Test.Framework ( defaultMain, Test )
+
+tests :: [Test]
+tests = 
+  [ 
+    Math.Geometry.Grid.TriangularQC.test,
+    Math.Geometry.Grid.SquareQC.test,
+    Math.Geometry.Grid.HexagonalQC.test,
+    Math.Geometry.Grid.Hexagonal2QC.test,
+    Math.Geometry.Grid.OctagonalQC.test,
+    Math.Geometry.GridMap.LazyQC.test
+  ]
+
+main :: IO ()
+main = defaultMain tests
diff --git a/test/TestMain.hs b/test/TestMain.hs
deleted file mode 100644
--- a/test/TestMain.hs
+++ /dev/null
@@ -1,36 +0,0 @@
-------------------------------------------------------------------------
--- |
--- Module      :  Math.Geometry.Grid.Main
--- Copyright   :  (c) Amy de Buitléir 2012-2016
--- License     :  BSD-style
--- Maintainer  :  amy@nualeargais.ie
--- Stability   :  experimental
--- Portability :  portable
---
--- QuickCheck tests.
---
-------------------------------------------------------------------------
-module Main where
-
-import Math.Geometry.Grid.TriangularQC ( test )
-import Math.Geometry.Grid.SquareQC ( test )
-import Math.Geometry.Grid.HexagonalQC ( test )
-import Math.Geometry.Grid.Hexagonal2QC ( test )
-import Math.Geometry.Grid.OctagonalQC ( test )
-import Math.Geometry.GridMap.LazyQC (test)
-
-import Test.Framework ( defaultMain, Test )
-
-tests :: [Test]
-tests = 
-  [ 
-    Math.Geometry.Grid.TriangularQC.test,
-    Math.Geometry.Grid.SquareQC.test,
-    Math.Geometry.Grid.HexagonalQC.test,
-    Math.Geometry.Grid.Hexagonal2QC.test,
-    Math.Geometry.Grid.OctagonalQC.test,
-    Math.Geometry.GridMap.LazyQC.test
-  ]
-
-main :: IO ()
-main = defaultMain tests
