diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Revision history for cl3
 
+## 1.0.0.3  -- 2018-08-16
+
+* Factored out the view pattern (reduce -> cliffor) on several functions so it wasn't repeated in every pattern match
+* Added -fno-worker-wrapper to work around the compile time and space issues in ghc > 8.0
+
 ## 1.0.0.2  -- 2018-06-19
 
 * Tested with GHC 7.8.4 and 8.4.2
diff --git a/benchmarks/NbodyGameCl3.hs b/benchmarks/NbodyGameCl3.hs
--- a/benchmarks/NbodyGameCl3.hs
+++ b/benchmarks/NbodyGameCl3.hs
@@ -167,6 +167,31 @@
 --                      1.000 R²   (1.000 R² .. 1.000 R²)
 -- mean                 155.1 s    (154.8 s .. 155.7 s)
 -- std dev              560.8 ms   (88.83 ms .. 714.2 ms)
+-- variance introduced by outliers: 19% (moderately inflatemarking nbodyBaseline/50000000
+-- 
+-- 20180816: cl3-1.0.0.3
+-- 
+-- Modified code to use ghc-8.4.2, ghc greater than 8.0 require -fno-worker-wrapper 
+-- to compile within reasonable time and space constraints.
+-- 
+-- time                 9.271 s    (9.231 s .. 9.344 s)
+--                      1.000 R²   (1.000 R² .. 1.000 R²)
+-- mean                 9.495 s    (9.407 s .. 9.636 s)
+-- std dev              133.9 ms   (53.72 ms .. 174.3 ms)
+-- variance introduced by outliers: 19% (moderately inflated)
+-- 
+-- benchmarking nbodyCl3/50000000
+-- time                 10.10 s    (9.797 s .. 10.30 s)
+--                      1.000 R²   (NaN R² .. 1.000 R²)
+-- mean                 10.10 s    (10.05 s .. 10.16 s)
+-- std dev              58.98 ms   (28.18 ms .. 72.96 ms)
+-- variance introduced by outliers: 19% (moderately inflated)
+-- 
+-- benchmarking nbodyAPS/50000000
+-- time                 178.6 s    (NaN s .. 181.1 s)
+--                      1.000 R²   (1.000 R² .. 1.000 R²)
+-- mean                 177.2 s    (175.5 s .. 178.2 s)
+-- std dev              1.670 s    (618.8 ms .. 2.283 s)
 -- variance introduced by outliers: 19% (moderately inflated)
 -- 
 -------------------------------------------------------------------
diff --git a/cl3.cabal b/cl3.cabal
--- a/cl3.cabal
+++ b/cl3.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             1.0.0.2
+version:             1.0.0.3
 
 -- A short (one-line) description of the package.
 synopsis:            Clifford Algebra of three dimensional space.
@@ -69,7 +69,7 @@
     Algebra.Geometric.Cl3.JonesCalculus
   
   -- Compiler options
-  ghc-options: -Wall -O2
+  ghc-options: -Wall -O2 -fno-worker-wrapper
   
   -- LANGUAGE extensions used by modules in this package.
   other-extensions:
diff --git a/src/Algebra/Geometric/Cl3.hs b/src/Algebra/Geometric/Cl3.hs
--- a/src/Algebra/Geometric/Cl3.hs
+++ b/src/Algebra/Geometric/Cl3.hs
@@ -1172,28 +1172,29 @@
 -- 
 -- 
 spectraldcmp :: (Cl3 -> Cl3) -> (Cl3 -> Cl3) -> Cl3 -> Cl3
-spectraldcmp fun _ (reduce -> r@R{}) = fun r
-spectraldcmp fun _ (reduce -> v@V3{}) = spectraldcmpSpecial toR fun v -- spectprojR fun v
-spectraldcmp fun _ (reduce -> bv@BV{}) = spectraldcmpSpecial toI fun bv -- spectprojI fun bv
-spectraldcmp fun _ (reduce -> i@I{}) = fun i
-spectraldcmp fun _ (reduce -> pv@PV{}) = spectraldcmpSpecial toR fun pv -- spectprojR fun pv
-spectraldcmp fun _ (reduce -> h@H{}) = spectraldcmpSpecial toC fun h -- spectprojC fun h
-spectraldcmp fun _ (reduce -> c@C{}) = fun c
-spectraldcmp fun fun' (reduce -> bpv@BPV{})
-  | hasNilpotent bpv = jordan fun fun' bpv  -- jordan normal form Cl3 style
-  | isColinear bpv = spectraldcmpSpecial toC fun bpv -- spectprojC fun bpv
-  | otherwise =                          -- transform it so it will be colinear
-      let (v,d,v_bar) = boost2colinear bpv
-      in v * spectraldcmpSpecial toC fun d * v_bar -- v * spectprojC fun d * v_bar
-spectraldcmp fun _ (reduce -> od@ODD{}) = spectraldcmpSpecial toC fun od -- spectprojC fun od
-spectraldcmp fun _ (reduce -> tpv@TPV{}) = spectraldcmpSpecial toI fun tpv -- spectprojI fun tpv
-spectraldcmp fun fun' (reduce -> aps@APS{})
-  | hasNilpotent aps = jordan fun fun' aps  -- jordan normal form Cl3 style
-  | isColinear aps = spectraldcmpSpecial toC fun aps -- spectprojC fun aps
-  | otherwise =                          -- transform it so it will be colinear
-      let (v,d,v_bar) = boost2colinear aps
-      in v * spectraldcmpSpecial toC fun d * v_bar -- v * spectprojC fun d * v_bar
-spectraldcmp _ _ _ = error "Major problems with 'spectraldcmp' or 'reduce'"
+spectraldcmp fun fun' (reduce -> cliffor) = dcmp cliffor
+  where
+    dcmp (r@R{}) = fun r
+    dcmp (v@V3{}) = spectraldcmpSpecial toR fun v -- spectprojR fun v
+    dcmp (bv@BV{}) = spectraldcmpSpecial toI fun bv -- spectprojI fun bv
+    dcmp (i@I{}) = fun i
+    dcmp (pv@PV{}) = spectraldcmpSpecial toR fun pv -- spectprojR fun pv
+    dcmp (h@H{}) = spectraldcmpSpecial toC fun h -- spectprojC fun h
+    dcmp (c@C{}) = fun c
+    dcmp (bpv@BPV{})
+      | hasNilpotent bpv = jordan fun fun' bpv  -- jordan normal form Cl3 style
+      | isColinear bpv = spectraldcmpSpecial toC fun bpv -- spectprojC fun bpv
+      | otherwise =                          -- transform it so it will be colinear
+          let (v,d,v_bar) = boost2colinear bpv
+          in v * spectraldcmpSpecial toC fun d * v_bar -- v * spectprojC fun d * v_bar
+    dcmp (od@ODD{}) = spectraldcmpSpecial toC fun od -- spectprojC fun od
+    dcmp (tpv@TPV{}) = spectraldcmpSpecial toI fun tpv -- spectprojI fun tpv
+    dcmp (aps@APS{})
+      | hasNilpotent aps = jordan fun fun' aps  -- jordan normal form Cl3 style
+      | isColinear aps = spectraldcmpSpecial toC fun aps -- spectprojC fun aps
+      | otherwise =                          -- transform it so it will be colinear
+          let (v,d,v_bar) = boost2colinear aps
+          in v * spectraldcmpSpecial toC fun d * v_bar -- v * spectprojC fun d * v_bar
 --
 
 -- | 'jordan' does a Cl(3,0) version of the decomposition into Jordan Normal Form and Matrix Function Calculation
@@ -1218,28 +1219,29 @@
 -- This is useful for determining if a cliffor is the pole
 -- of a function.
 eigvals :: Cl3 -> (Cl3,Cl3)
-eigvals (reduce -> r@R{}) = (r,r)
-eigvals (reduce -> v@V3{}) = eigvalsSpecial toR v -- eigvalsR v
-eigvals (reduce -> bv@BV{}) = eigvalsSpecial toI bv -- eigvalsI bv
-eigvals (reduce -> i@I{}) = (i,i)
-eigvals (reduce -> pv@PV{}) = eigvalsSpecial toR pv -- eigvalsR pv
-eigvals (reduce -> h@H{}) = eigvalsSpecial toC h -- eigvalsC h
-eigvals (reduce -> c@C{}) = (c,c)
-eigvals (reduce -> bpv@BPV{})
-  | hasNilpotent bpv = (0,0)  -- this case is actually nilpotent
-  | isColinear bpv = eigvalsSpecial toC bpv -- eigvalsC bpv
-  | otherwise =                          -- transform it so it will be colinear
-      let (_,d,_) = boost2colinear bpv
-      in eigvalsSpecial toC d -- eigvalsC d
-eigvals (reduce -> od@ODD{}) = eigvalsSpecial toC od -- eigvalsC od
-eigvals (reduce -> tpv@TPV{}) = eigvalsSpecial toI tpv -- eigvalsI tpv
-eigvals (reduce -> aps@APS{})
-  | hasNilpotent aps = (toC aps,toC aps)  -- a scalar plus nilpotent
-  | isColinear aps = eigvalsSpecial toC aps -- eigvalsC aps
-  | otherwise =                          -- transform it so it will be colinear
-      let (_,d,_) = boost2colinear aps
-      in eigvalsSpecial toC d -- eigvalsC d
-eigvals _ = error "Major issues with 'eigvals' or 'reduce'"
+eigvals (reduce -> cliffor) = eigv cliffor
+  where
+    eigv (r@R{}) = (r,r)
+    eigv (v@V3{}) = eigvalsSpecial toR v -- eigvalsR v
+    eigv (bv@BV{}) = eigvalsSpecial toI bv -- eigvalsI bv
+    eigv (i@I{}) = (i,i)
+    eigv (pv@PV{}) = eigvalsSpecial toR pv -- eigvalsR pv
+    eigv (h@H{}) = eigvalsSpecial toC h -- eigvalsC h
+    eigv (c@C{}) = (c,c)
+    eigv (bpv@BPV{})
+      | hasNilpotent bpv = (0,0)  -- this case is actually nilpotent
+      | isColinear bpv = eigvalsSpecial toC bpv -- eigvalsC bpv
+      | otherwise =                          -- transform it so it will be colinear
+          let (_,d,_) = boost2colinear bpv
+          in eigvalsSpecial toC d -- eigvalsC d
+    eigv (od@ODD{}) = eigvalsSpecial toC od -- eigvalsC od
+    eigv (tpv@TPV{}) = eigvalsSpecial toI tpv -- eigvalsI tpv
+    eigv (aps@APS{})
+      | hasNilpotent aps = (toC aps,toC aps)  -- a scalar plus nilpotent
+      | isColinear aps = eigvalsSpecial toC aps -- eigvalsC aps
+      | otherwise =                          -- transform it so it will be colinear
+          let (_,d,_) = boost2colinear aps
+          in eigvalsSpecial toC d -- eigvalsC d
 --
 
 -- | 'eigvalsSpecial' helper function to calculate Eigenvalues
@@ -1252,20 +1254,22 @@
 -- | 'project' makes a projector based off of the vector content of the Cliffor.
 -- We have safty problem with unreduced values, so it calls reduce first, as a view pattern.
 project :: Cl3 -> Cl3
-project (reduce -> R{}) = PV 0.5 0 0 0.5   -- default to e3 direction
-project (reduce -> v@V3{}) = 0.5 * (1 + signum v)
-project (reduce -> bv@BV{}) = 0.5 * (1 + signum (toV3 $ mI * toBV bv))
-project (reduce -> I{}) = PV 0.5 0 0 0.5   -- default to e3 direction
-project (reduce -> pv@PV{}) = 0.5 * (1 + signum (toV3 pv))
-project (reduce -> h@H{}) = 0.5 * (1 + signum (toV3 $ mI * toBV h))
-project (reduce -> C{}) = PV 0.5 0 0 0.5   -- default to e3 direction
-project (reduce -> bpv@BPV{})
-  | abs (toV3 bpv + toV3 (mI * toBV bpv)) <= tol = 0.5 * (1 + signum (toV3 bpv))  -- gaurd for equal and opposite
-  | otherwise = 0.5 * (1 + signum (toV3 bpv + toV3 (mI * toBV bpv)))
-project (reduce -> od@ODD{}) = 0.5 * (1 + signum (toV3 od))
-project (reduce -> tpv@TPV{}) = 0.5 * (1 + signum (toV3 $ mI * toBV tpv))
-project (reduce -> aps@APS{}) = project.toBPV $ aps
-project (reduce -> _) = error "Error: Got some serious issues with 'project' and/or 'reduce'.  Please Fix."
+project (reduce -> cliffor) = proj cliffor
+  where
+    proj (R{}) = PV 0.5 0 0 0.5   -- default to e3 direction
+    proj (v@V3{}) = 0.5 * (1 + signum v)
+    proj (bv@BV{}) = 0.5 * (1 + signum (toV3 $ mI * toBV bv))
+    proj (I{}) = PV 0.5 0 0 0.5   -- default to e3 direction
+    proj (pv@PV{}) = 0.5 * (1 + signum (toV3 pv))
+    proj (h@H{}) = 0.5 * (1 + signum (toV3 $ mI * toBV h))
+    proj (C{}) = PV 0.5 0 0 0.5   -- default to e3 direction
+    proj (bpv@BPV{})
+      | abs (toV3 bpv + toV3 (mI * toBV bpv)) <= tol = 0.5 * (1 + signum (toV3 bpv))  -- gaurd for equal and opposite
+      | otherwise = 0.5 * (1 + signum (toV3 bpv + toV3 (mI * toBV bpv)))
+    proj (od@ODD{}) = 0.5 * (1 + signum (toV3 od))
+    proj (tpv@TPV{}) = 0.5 * (1 + signum (toV3 $ mI * toBV tpv))
+    proj (aps@APS{}) = project.toBPV $ aps
+
 
 -- | 'boost2colinear' calculates a boost that is perpendicular to both the vector and bivector
 -- components, that will mix the vector and bivector parts such that the vector and bivector
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,3 +1,3 @@
 packages:
 - .
-resolver: lts-9.21
+resolver: lts-12.6
