diff --git a/Justfile b/Justfile
new file mode 100644
--- /dev/null
+++ b/Justfile
@@ -0,0 +1,4 @@
+upload:
+    rm -rf dist/
+    cabal sdist
+    cabal upload --publish $(fd '\.tar\.gz$')
diff --git a/cabal.project.local b/cabal.project.local
new file mode 100644
--- /dev/null
+++ b/cabal.project.local
@@ -0,0 +1,5 @@
+with-compiler: ghc-8.2.1
+optimization: 2
+documentation: True
+haddock-hoogle: True
+haddock-internal: True
diff --git a/docs/manual.pdf b/docs/manual.pdf
deleted file mode 100644
Binary files a/docs/manual.pdf and /dev/null differ
diff --git a/hgis.cabal b/hgis.cabal
--- a/hgis.cabal
+++ b/hgis.cabal
@@ -1,100 +1,88 @@
-name: hgis
-version: 0.1.3.5
-cabal-version: >=1.10
-build-type: Simple
-license: BSD3
-license-file: LICENSE
-copyright: Copyright: (c) 2016 Vanessa McHale
-maintainer: tmchale@wisc.edu
-homepage: https://github.com/vmchale/hgis#readme
-synopsis: Package and command-line for GIS with Haskell
-description:
-    Package containting functions to make graphs, read
-    shapefiles, and compute areas/perimeters of
-    geographic features.
-category: Web
-author: Vanessa McHale
-extra-source-files:
-    README.md
-    stack.yaml
-    docs/manual.tex
-    docs/manual.pdf
-    src/depends/readshp/LICENSE
-    LICENSE-readshp
-
-source-repository head
-    type: git
-    location: https://github.com/vmchale/hgis
+name:                hgis
+version:             0.1.3.6
+synopsis:            Package and command-line for GIS with Haskell
+description:         Package containting functions to make graphs, read 
+                     shapefiles, and compute areas/perimeters of
+                     geographic features. 
+homepage:            https://github.com/vmchale/hgis#readme
+license:             BSD3
+license-file:        LICENSE
+author:              Vanessa McHale
+maintainer:          tmchale@wisc.edu
+copyright:           Copyright: (c) 2016 Vanessa McHale
+category:            Web
+build-type:          Simple
+extra-source-files:  README.md, cabal.project.local, docs/manual.tex, src/depends/readshp/LICENSE, LICENSE-readshp, Justfile
+cabal-version:       >=1.10
 
-flag llvm-fast
-    description:
-        Enable build with llvm backend
-    default: False
+Flag llvm-fast {
+  Description: Enable build with llvm backend
+  Default: False
+}
 
 library
-    exposed-modules:
-        GIS.Exe.Opt
-        GIS.Exe.OptCairo
-        GIS.Math.Spherical
-        GIS.Graphics.PlotPNG
-        GIS.Graphics.PlotSVG
-        GIS.Hylo
-        GIS.Math.Projections
-    build-depends:
-        base >=4.7 && <5,
-        optparse-applicative >=0.13.2.0 && <0.14,
-        Chart >=1.8.2 && <1.9,
-        Chart-cairo >=1.8.2 && <1.9,
-        Chart-diagrams >=1.8.2 && <1.9,
-        lens >=4.15.1 && <4.16,
-        composition >=1.0.2.1 && <1.1,
-        ansi-wl-pprint >=0.6.7.3 && <0.7,
-        transformers >=0.5.2.0 && <0.6,
-        directory >=1.3.0.0 && <1.4,
-        colour >=2.3.3 && <2.4,
-        data-default >=0.7.1.1 && <0.8,
-        binary >=0.8.3.0 && <0.9,
-        bytestring >=0.10.8.1 && <0.11,
-        data-binary-ieee754 >=0.4.4 && <0.5,
-        filepath >=1.4.1.1 && <1.5,
-        monad-loops >=0.4.3 && <0.5
-    default-language: Haskell2010
-    default-extensions: DeriveGeneric OverloadedStrings
-    hs-source-dirs: src src/depends/readshp
-    other-modules:
-        GIS.Math.Utils
-        GIS.Utils
-        GIS.Graphics.Plot
-        GIS.Graphics.Types
-        GIS.Types
-        GIS.Exe.Parser
-        Geometry.Shapefile
-        Geometry.Shapefile.MergeShpDbf
-        Geometry.Shapefile.ReadDbf
-        Geometry.Shapefile.ReadShp
-        Geometry.Shapefile.Types
-        Geometry.Shapefile.Internal
+  hs-source-dirs:      src, src/depends/readshp
+  exposed-modules:     GIS.Exe.Opt
+                     , GIS.Exe.OptCairo
+                     , GIS.Math.Spherical
+                     , GIS.Graphics.PlotPNG
+                     , GIS.Graphics.PlotSVG
+                     , GIS.Hylo
+                     , GIS.Math.Projections
+  other-modules:       GIS.Math.Utils
+                     , GIS.Utils
+                     , GIS.Graphics.Plot
+                     , GIS.Graphics.Types
+                     , GIS.Types
+                     , GIS.Exe.Parser
+                     , Geometry.Shapefile
+                     , Geometry.Shapefile.MergeShpDbf
+                     , Geometry.Shapefile.ReadDbf
+                     , Geometry.Shapefile.ReadShp
+                     , Geometry.Shapefile.Types
+                     , Geometry.Shapefile.Internal
+  build-depends:       base >= 4.7 && < 5
+                     , optparse-applicative
+                     , Chart
+                     , Chart-cairo
+                     , Chart-diagrams
+                     , lens
+                     , composition
+                     , ansi-wl-pprint
+                     , transformers
+                     , directory
+                     , colour
+                     , data-default
+                     , binary
+                     , bytestring
+                     , data-binary-ieee754
+                     , filepath
+                     , monad-loops
+  default-language:    Haskell2010
+  default-extensions:  DeriveGeneric
+                     , OverloadedStrings
 
 executable hgis
-    
-    if flag(llvm-fast)
-        ghc-options: -threaded -rtsopts -with-rtsopts=-N -fllvm -optlo-O3 -O3
-    else
-        ghc-options: -threaded -rtsopts -with-rtsopts=-N
-    main-is: MainPng.hs
-    build-depends:
-        base >=4.9.1.0 && <4.10,
-        hgis >=0.1.3.5 && <0.2
-    default-language: Haskell2010
-    hs-source-dirs: app
+  hs-source-dirs:      app
+  main-is:           MainPng.hs
+  if flag(llvm-fast)
+    ghc-options:       -threaded -rtsopts -with-rtsopts=-N -fllvm -optlo-O3 -O3
+  else
+    ghc-options:       -threaded -rtsopts -with-rtsopts=-N
+  build-depends:       base
+                     , hgis
+  default-language:    Haskell2010
 
 test-suite hgis-test
-    type: exitcode-stdio-1.0
-    main-is: Spec.hs
-    build-depends:
-        base >=4.9.1.0 && <4.10,
-        hgis >=0.1.3.5 && <0.2,
-        hspec >=2.4.3 && <2.5
-    default-language: Haskell2010
-    hs-source-dirs: test
-    ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  type:                exitcode-stdio-1.0
+  hs-source-dirs:      test
+  main-is:             Spec.hs
+  build-depends:       base
+                     , hgis
+                     , hspec
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/vmchale/hgis
diff --git a/src/GIS/Hylo.hs b/src/GIS/Hylo.hs
--- a/src/GIS/Hylo.hs
+++ b/src/GIS/Hylo.hs
@@ -2,24 +2,24 @@
 -- | Module to transform shapefiles.
 module GIS.Hylo where
 
-import Geometry.Shapefile.MergeShpDbf
-import Geometry.Shapefile.ReadShp
-import Geometry.Shapefile.Types
-import Data.List
-import Data.Char
-import Data.Maybe
-import Data.Monoid
-import GIS.Math.Projections
-import GIS.Math.Spherical
-import GIS.Utils
-import Control.Lens.Tuple
-import Control.Lens
-import Control.Monad
-import GIS.Types
-import GIS.Graphics.Types
-import Data.Default
-import System.Directory
-import Data.Composition
+import           Control.Lens
+import           Control.Lens.Tuple
+import           Control.Monad
+import           Data.Char
+import           Data.Composition
+import           Data.Default
+import           Data.List
+import           Data.Maybe
+import           Data.Monoid
+import           Geometry.Shapefile.MergeShpDbf
+import           Geometry.Shapefile.ReadShp
+import           Geometry.Shapefile.Types
+import           GIS.Graphics.Types
+import           GIS.Math.Projections
+import           GIS.Math.Spherical
+import           GIS.Types
+import           GIS.Utils
+import           System.Directory
 
 -- | Get the areas of various objects and return a string suitable for printing
 districtArea :: [District] -> String
@@ -47,11 +47,11 @@
 -- | Given a list of districts, draw a map, with labels determined by a lens.
 districtToMapLens :: (Show a) => Lens' District a -> [District] -> Map
 districtToMapLens lens districts = labelledDistricts .~ dist $ def
-    where dist = zip (fmap (_shape) districts) (map (show . view lens) districts)
+    where dist = zip (fmap _shape districts) (fmap (show . view lens) districts)
 
 -- | Given a list of districts, draw a map.
 districtToMap :: [District] -> Map
-districtToMap = districtToMapLens districtLabel 
+districtToMap = districtToMapLens districtLabel
 
 -- | Given a projection and list of districts, return a list of maps.
 districtToMapFilesP :: Projection -> [District] -> [Map]
@@ -59,22 +59,22 @@
 
 -- | Given a list of districts, return a list of maps.
 districtToMapFiles :: [District] -> [Map]
-districtToMapFiles = map (\(District polygons label _ area _) -> title .~ label ++ "-" ++ (show . sum $ area) $ labelledDistricts .~ (pure (polygons,"")) $ def)
+districtToMapFiles = fmap (\(District polygons label _ area _) -> title .~ label ++ "-" ++ (show . sum $ area) $ labelledDistricts .~ pure (polygons,"") $ def)
 
 -- | Given the path to a shapefile, return a list of districts
 getDistricts :: FilePath -> IO [District]
 getDistricts filepath = do
         dbfExists <- doesFileExist (stripExt filepath <> ".dbf")
         file <- if dbfExists then readShpWithDbf filepath else readShpFile filepath
-        let districtLabels = fromJust $ (fmap labels) $ mapM (shpRecLabel) . shpRecs $ file -- labels + field descriptions?
-        let shapes = (map (getPolygon . fromJust . shpRecContents)) . shpRecs $ file
-        let perimeters = map (totalPerimeter . getPolygon . fromJust . shpRecContents) . shpRecs $ file
-        let areas = map (fmap areaPolygon . getPolygon . fromJust . shpRecContents) . shpRecs $ file
-        let compacticity = map (relativeCompactness . concat . getPolygon . fromJust . shpRecContents) . shpRecs $ file
-        pure $ zipWith5 (\a b c d e -> District a b c d e) shapes districtLabels perimeters areas compacticity
+        let districtLabels = fromJust $ fmap labels $ mapM shpRecLabel . shpRecs $ file -- labels + field descriptions?
+        let shapes = fmap (getPolygon . fromJust . shpRecContents) . shpRecs $ file
+        let perimeters = fmap (totalPerimeter . getPolygon . fromJust . shpRecContents) . shpRecs $ file
+        let areas = fmap (fmap areaPolygon . getPolygon . fromJust . shpRecContents) . shpRecs $ file
+        let compacticity = fmap (relativeCompactness . concat . getPolygon . fromJust . shpRecContents) . shpRecs $ file
+        pure $ zipWith5 District shapes districtLabels perimeters areas compacticity
 
 -- | Helper function for extracting from shapefiles.
 getPolygon :: RecContents -> [Polygon]
-getPolygon (RecPolygon { recPolPoints = pt }) = pt
-getPolygon (RecPolygonM { recPolMPoints = pt }) = pt
-getPolygon (RecPolygonZ { recPolZPoints = pt }) = pt
+getPolygon RecPolygon{ recPolPoints = pt }   = pt
+getPolygon RecPolygonM{ recPolMPoints = pt } = pt
+getPolygon RecPolygonZ{ recPolZPoints = pt } = pt
diff --git a/stack.yaml b/stack.yaml
deleted file mode 100644
--- a/stack.yaml
+++ /dev/null
@@ -1,67 +0,0 @@
-# This file was automatically generated by 'stack init'
-#
-# Some commonly used options have been documented as comments in this file.
-# For advanced use and comprehensive documentation of the format, please see:
-# http://docs.haskellstack.org/en/stable/yaml_configuration/
-
-# Resolver to choose a 'specific' stackage snapshot or a compiler version.
-# A snapshot resolver dictates the compiler version and the set of packages
-# to be used for project dependencies. For example:
-#
-# resolver: lts-3.5
-# resolver: nightly-2015-09-21
-# resolver: ghc-7.10.2
-# resolver: ghcjs-0.1.0_ghc-7.10.2
-# resolver:
-#  name: custom-snapshot
-#  location: "./custom-snapshot.yaml"
-#resolver: lts-8.5
-resolver: lts-8.18
-
-# User packages to be built.
-# Various formats can be used as shown in the example below.
-#
-# packages:
-# - some-directory
-# - https://example.com/foo/bar/baz-0.0.2.tar.gz
-# - location:
-#    git: https://github.com/commercialhaskell/stack.git
-#    commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
-# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a
-#   extra-dep: true
-#  subdirs:
-#  - auto-update
-#  - wai
-#
-# A package marked 'extra-dep: true' will only be built if demanded by a
-# non-dependency (i.e. a user package), and its test suites and benchmarks
-# will not be run. This is useful for tweaking upstream packages.
-packages:
-- '.'
-# Dependency packages to be pulled from upstream that are not in the resolver
-# (e.g., acme-missiles-0.3)
-extra-deps: []
-
-# Override default flag values for local packages and extra-deps
-flags: {}
-
-# Extra package databases containing global packages
-extra-package-dbs: []
-
-# Control whether we use the GHC we find on the path
-# system-ghc: true
-#
-# Require a specific version of stack, using version ranges
-# require-stack-version: -any # Default
-# require-stack-version: ">=1.4"
-#
-# Override the architecture used by stack, especially useful on Windows
-# arch: i386
-# arch: x86_64
-#
-# Extra directories used by stack for building
-# extra-include-dirs: [/path/to/dir]
-# extra-lib-dirs: [/path/to/dir]
-#
-# Allow a newer minor version of GHC than the snapshot specifies
-# compiler-check: newer-minor
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,18 +1,18 @@
-import Test.Hspec
-import GIS.Math.Spherical
-import GIS.Hylo
-import GIS.Graphics.PlotSVG
-import GIS.Graphics.PlotPNG
-import GIS.Math.Projections
+import           GIS.Graphics.PlotPNG
+import           GIS.Graphics.PlotSVG
+import           GIS.Hylo
+import           GIS.Math.Projections
+import           GIS.Math.Spherical
+import           Test.Hspec
 
 main :: IO ()
 main = hspec $ do
     describe "distance" $ do
-        parallel $ it "computes distances along geodesics" $ do
+        it "computes distances along geodesics" $ do
             distance ((-74.0059), 40.7128) ((-118.2347), 34.0522) `shouldBe` 3934.997673163554
     describe "mercatorFullPng" $ do
-        parallel $ it "Reads a map and writes a .png with the mercator projection" $ do
+        it "Reads a map and writes a .png with the mercator projection" $ do
             (mkMapPng "test/testmap.png" =<< districtToMapP bonne <$> getDistricts "test/data/worldmap/TM_WORLD_BORDERS-0.3.shp") >>= (`shouldBe` ())
-    --describe "mercatorFullSVG" $ do
-    --    parallel $ it "Reads a map and writes a .svg with the mercator projection" $ do
-    --        (mkMapSVG "test/testmap.svg" =<< districtToMapP bonne <$> getDistricts "test/data/worldmap/TM_WORLD_BORDERS-0.3.shp") >>= (`shouldBe` ())
+    describe "mercatorFullSVG" $ do
+        it "Reads a map and writes a .svg with the mercator projection" $ do
+            (mkMapSVG "test/testmap.svg" =<< districtToMapP bonne <$> getDistricts "test/data/worldmap/TM_WORLD_BORDERS-0.3.shp") >>= (`shouldBe` ())
