diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Revision history for reflex-ghci
 
+## 0.1.4.2
+
+* Tests: Ensure proper shutdown.
+* Tests: Fix tests for GHC 8.8.4
+
 ## 0.1.4.1
 
 * Library: Require at least version 0.7.1 of `reflex`.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,20 +1,20 @@
-reflex-ghci
-==============
+# reflex-ghci
 
-[![hackage](https://img.shields.io/hackage/v/reflex-ghci.svg)](https://hackage.haskell.org/package/reflex-ghci) [![hackage-ci](https://matrix.hackage.haskell.org/api/v2/packages/reflex-ghci/badge)](https://matrix.hackage.haskell.org/#/package/reflex-ghci) [![travis-ci](https://api.travis-ci.org/reflex-frp/reflex-ghci.svg?branch=develop)](https://travis-ci.org/reflex-frp/reflex-ghci)
+[![Haskell](https://img.shields.io/badge/language-Haskell-orange.svg)](https://haskell.org) [![Hackage](https://img.shields.io/hackage/v/reflex-ghci.svg)](https://hackage.haskell.org/package/reflex-ghci) [![Hackage CI](https://matrix.hackage.haskell.org/api/v2/packages/reflex-ghci/badge)](https://matrix.hackage.haskell.org/#/package/reflex-ghci) [![Travis CI](https://api.travis-ci.org/reflex-frp/reflex-ghci.svg?branch=develop)](https://travis-ci.org/reflex-frp/reflex-ghci) [![BSD3 License](https://img.shields.io/badge/license-BSD3-blue.svg)](https://github.com/reflex-frp/reflex-ghci/blob/master/LICENSE)
 
-![screenshot](screenshot.png)
+Run GHCi from within a [Reflex FRP](https://reflex-frp.org) application and interact with it using a functional reactive interface.
 
-Library
--------
+![Screenshot](https://i.imgur.com/5y61Qx7.png)
+
+## Library
+
 A functional-reactive wrapper around GHCi that uses filesystem notifications to automatically reload haskell source files.
 
 `Reflex.Process.GHCi` provides the core GHCi process-running infrastructure. If you want to run your own GHCi, directly control when it reloads, or build your own custom interface, look there.
 
 `Reflex.Vty.GHCi` provides a few widgets that are useful when building a console GHCi interface. Use these components to assemble your own vty GHCi runner.
 
-Executable
-----------
+## Executable
 
 This package includes a [reflex-vty](https://github.com/reflex-frp/reflex-vty)-based executable, shown above. Module information (errors, warnings, etc) is shown in a scrollable pane on the top half of the screen and the output of any expression you (optionally) choose to evaluate is shown in a scrollable pane on the bottom half. The panes are resizable using the mouse.
 
@@ -34,6 +34,5 @@
 
 ```
 
-Acknowledgements
-----------------
+## Acknowledgements
 Inspired by the fantastic [ghcid](https://github.com/ndmitchell/ghcid) project.
diff --git a/reflex-ghci.cabal b/reflex-ghci.cabal
--- a/reflex-ghci.cabal
+++ b/reflex-ghci.cabal
@@ -1,12 +1,11 @@
 cabal-version: 2.4
 name: reflex-ghci
-version: 0.1.4.1
+version: 0.1.4.2
 synopsis: A GHCi widget library for use in reflex applications
 description:
-  Run GHCi from within a reflex application and interact with it using a functional-reactive interface.
+  Run GHCi from within a Reflex FRP (<https://reflex-frp.org>) application and interact with it using a functional reactive interface.
   .
   <<https://i.imgur.com/5y61Qx7.png>>
-  .
 bug-reports: https://github.com/reflex-frp/reflex-ghci/issues
 license: BSD-3-Clause
 license-file: LICENSE
@@ -17,17 +16,16 @@
 build-type: Simple
 extra-source-files: ChangeLog.md
                     README.md
-                    screenshot.png
                     tests/**/*.hs
                     tests/**/*.cabal
-tested-with: GHC ==8.6.5
+tested-with: GHC ==8.6.5 || ==8.8.4
 
 library
   exposed-modules:
     Reflex.Process.GHCi
     Reflex.Vty.GHCi
   build-depends:
-      base >= 4.12 && < 4.13
+      base >= 4.12 && < 4.14
     , bytestring >= 0.10 && < 0.11
     , directory >= 1.3 && < 1.4
     , filepath >= 1.4 && < 1.5
@@ -69,20 +67,13 @@
   hs-source-dirs: tests
   build-depends:
       base
-    , bytestring
-    , dependent-sum >= 0.6 && < 0.7
     , directory
-    , mtl >= 2.2 && < 2.3
-    , primitive >= 0.6.4 && < 0.8
     , process
-    , ref-tf >= 0.4 && < 0.5
     , reflex
     , reflex-ghci
     , reflex-process
-    , reflex-vty
     , temporary >= 1.3 && < 1.4
-    , text
-  ghc-options: -threaded -rtsopts
+  ghc-options: -threaded -rtsopts -Wall
   default-language: Haskell2010
 
 source-repository head
diff --git a/screenshot.png b/screenshot.png
deleted file mode 100644
Binary files a/screenshot.png and /dev/null differ
diff --git a/src/Reflex/Process/GHCi.hs b/src/Reflex/Process/GHCi.hs
--- a/src/Reflex/Process/GHCi.hs
+++ b/src/Reflex/Process/GHCi.hs
@@ -104,7 +104,7 @@
           -- We need to know when ghci is initialized enough that it won't die when
           -- it receives an interrupt. We wait to see the version line in the output as
           -- a proxy for GHCi's readiness to be interrupted
-          ghciVersionMessage = "GHCi, version.*: http://www.haskell.org/ghc/" :: ByteString
+          ghciVersionMessage = "GHCi, version.*: https?://www.haskell.org/ghc/" :: ByteString
 
 
       -- Inspect the output and determine what state GHCi is in
diff --git a/tests/lib-pkg/dist-newstyle/build/x86_64-linux/ghc-8.8.3/test-pkg2-0.1.0.0/build/autogen/Paths_test_pkg2.hs b/tests/lib-pkg/dist-newstyle/build/x86_64-linux/ghc-8.8.3/test-pkg2-0.1.0.0/build/autogen/Paths_test_pkg2.hs
deleted file mode 100644
--- a/tests/lib-pkg/dist-newstyle/build/x86_64-linux/ghc-8.8.3/test-pkg2-0.1.0.0/build/autogen/Paths_test_pkg2.hs
+++ /dev/null
@@ -1,50 +0,0 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE NoRebindableSyntax #-}
-{-# OPTIONS_GHC -fno-warn-missing-import-lists #-}
-module Paths_test_pkg2 (
-    version,
-    getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,
-    getDataFileName, getSysconfDir
-  ) where
-
-import qualified Control.Exception as Exception
-import Data.Version (Version(..))
-import System.Environment (getEnv)
-import Prelude
-
-#if defined(VERSION_base)
-
-#if MIN_VERSION_base(4,0,0)
-catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
-#else
-catchIO :: IO a -> (Exception.Exception -> IO a) -> IO a
-#endif
-
-#else
-catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
-#endif
-catchIO = Exception.catch
-
-version :: Version
-version = Version [0,1,0,0] []
-bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath
-
-bindir     = "/home/elliot/.cabal/bin"
-libdir     = "/home/elliot/.cabal/lib/x86_64-linux-ghc-8.8.3/test-pkg2-0.1.0.0-inplace"
-dynlibdir  = "/home/elliot/.cabal/lib/x86_64-linux-ghc-8.8.3"
-datadir    = "/home/elliot/.cabal/share/x86_64-linux-ghc-8.8.3/test-pkg2-0.1.0.0"
-libexecdir = "/home/elliot/.cabal/libexec/x86_64-linux-ghc-8.8.3/test-pkg2-0.1.0.0"
-sysconfdir = "/home/elliot/.cabal/etc"
-
-getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath
-getBinDir = catchIO (getEnv "test_pkg2_bindir") (\_ -> return bindir)
-getLibDir = catchIO (getEnv "test_pkg2_libdir") (\_ -> return libdir)
-getDynLibDir = catchIO (getEnv "test_pkg2_dynlibdir") (\_ -> return dynlibdir)
-getDataDir = catchIO (getEnv "test_pkg2_datadir") (\_ -> return datadir)
-getLibexecDir = catchIO (getEnv "test_pkg2_libexecdir") (\_ -> return libexecdir)
-getSysconfDir = catchIO (getEnv "test_pkg2_sysconfdir") (\_ -> return sysconfdir)
-
-getDataFileName :: FilePath -> IO FilePath
-getDataFileName name = do
-  dir <- getDataDir
-  return (dir ++ "/" ++ name)
diff --git a/tests/test.hs b/tests/test.hs
--- a/tests/test.hs
+++ b/tests/test.hs
@@ -3,22 +3,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
-import Reflex
-import Reflex.Host.Headless
-import Reflex.Process.GHCi
-import Reflex.Vty
-import Reflex.Vty.GHCi
-import Reflex.Workflow
 
-import Control.Monad (void)
 import Control.Monad.Fix (MonadFix)
-import Control.Monad.IO.Class (liftIO, MonadIO)
-import Data.ByteString (ByteString)
+import Control.Monad.IO.Class (MonadIO, liftIO)
+import Reflex
+import Reflex.Host.Headless (runHeadlessApp)
+import Reflex.Workflow (Workflow (..), workflow)
+import System.Directory (copyFile, getCurrentDirectory, withCurrentDirectory)
+import System.IO.Temp (withSystemTempDirectory)
 import qualified System.Process as P
-import System.Directory
-import System.Environment
-import System.IO.Temp
 
+import Reflex.Process.GHCi
+import Reflex.Vty.GHCi
+
 ghciExe :: FilePath
 ghciExe = "ghci"
 
@@ -36,7 +33,7 @@
 -- | testExprFinished     | Status_LoadSucceeded  | Status_ExecutionSucceeded |
 
 main :: IO ()
-main = withSystemTempDirectory "reflex-ghci-test" $ \tmpdir -> do
+main = do
   src <- getCurrentDirectory
   let cmd path load = P.proc ghciExe ["-i" <> src <> path, load]
   putStrLn "Testing lib-pkg"
@@ -98,9 +95,9 @@
         Status_LoadSucceeded -> Just True
         Status_LoadFailed -> Just False
         _ -> Nothing
-  void $ shutdown $ g <$ loaded
-  return ( Failed . show <$> ffilter not loaded
-         , testExprErr cmd <$ ffilter id loaded
+  done <- afterShutdown g loaded
+  return ( Failed . show <$> ffilter not done
+         , testExprErr cmd <$ ffilter id done
          )
 
 testExprErr
@@ -121,9 +118,9 @@
         Status_ExecutionFailed -> Just True
         Status_ExecutionSucceeded -> Just False
         _ -> Nothing
-  void $ shutdown $ g <$ exception
-  return ( Failed . show <$> ffilter not exception
-         , testExprNotFound cmd <$ ffilter id exception
+  done <- afterShutdown g exception
+  return ( Failed . show <$> ffilter not done
+         , testExprNotFound cmd <$ ffilter id done
          )
 
 testExprNotFound
@@ -141,12 +138,12 @@
   liftIO $ putStrLn "testExprNotFound"
   g <- ghciWatch cmd $ Just "notTheFunctionYoureLookingFor"
   let exception = fforMaybe (updated $ _ghci_status g) $ \case
-          Status_ExecutionFailed -> Just True
-          Status_ExecutionSucceeded -> Just False
-          _ -> Nothing
-  void $ shutdown $ g <$ exception
-  return ( Failed . show <$> ffilter not exception
-         , testExprFinished cmd <$ ffilter id exception
+        Status_ExecutionFailed -> Just True
+        Status_ExecutionSucceeded -> Just False
+        _ -> Nothing
+  done <- afterShutdown g exception
+  return ( Failed . show <$> ffilter not done
+         , testExprFinished cmd <$ ffilter id done
          )
 
 testExprFinished
@@ -163,11 +160,11 @@
 testExprFinished cmd = Workflow $ do
   liftIO $ putStrLn "testExprFinished"
   g <- ghciWatch cmd $ Just "done"
-  let done = fforMaybe (updated $ _ghci_status g) $ \case
-          Status_ExecutionFailed -> Just False
-          Status_ExecutionSucceeded -> Just True
-          _ -> Nothing
-  void $ shutdown $ g <$ done
+  let finished = fforMaybe (updated $ _ghci_status g) $ \case
+        Status_ExecutionFailed -> Just False
+        Status_ExecutionSucceeded -> Just True
+        _ -> Nothing
+  done <- afterShutdown g finished
   return ( outcome done
          , never
          )
@@ -203,8 +200,9 @@
       if x > 1
         then Just $ error "Too many failures."
         else Nothing
-    return $ gate ((>= 1) <$> current numFailures) loadSucceeded
 
+    afterShutdown g $ gate ((>= 1) <$> current numFailures) loadSucceeded
+
 testModuleLoadFailed
   :: ( MonadIO m
      , TriggerEvent t m
@@ -223,8 +221,15 @@
         Status_LoadSucceeded -> Just False
         Status_LoadFailed -> Just True
         _ -> Nothing
-  void $ shutdown $ g <$ loaded
-  return $ ffor loaded $ \x ->
+  done <- afterShutdown g loaded
+  return $ ffor done $ \x ->
     if x
       then Succeeded
       else Failed "testModuleFailed: lib-pkg-err shouldn't have loaded"
+
+-- | Utility to help use an 'Event' for stopping the network, but not until the shutdown is complete.
+afterShutdown :: (PerformEvent t m, MonadIO (Performable m), MonadHold t m) => Ghci t -> Event t b -> m (Event t b)
+afterShutdown g e = do
+  eValue <- hold Nothing $ Just <$> e
+  after <- shutdown $ g <$ e
+  pure $ fmapMaybe id $ tag eValue after
