diff --git a/diagrams-pgf.cabal b/diagrams-pgf.cabal
--- a/diagrams-pgf.cabal
+++ b/diagrams-pgf.cabal
@@ -1,5 +1,5 @@
 name:                diagrams-pgf
-version:             1.4
+version:             1.4.1
 synopsis:            PGF backend for diagrams drawing EDSL.
 license:             BSD3
 license-file:        LICENSE
@@ -10,10 +10,10 @@
 stability:           Experimental
 category:            Graphics
 build-type:          Simple
-cabal-version:       >=1.10
+cabal-version:       >=1.18
 extra-source-files:  README.md, diagrams/*.svg
 extra-doc-files:     diagrams/*.svg
-tested-with:         GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1
+tested-with:         GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.3, GHC == 8.6.1
 description:
   This package provides a modular backend for rendering diagrams created
   with the diagrams EDSL using the TeX library PGF.
@@ -33,22 +33,22 @@
     Graphics.Rendering.PGF
   hs-source-dirs:      src
   build-depends:
-    base                 >= 4.4   && < 4.10,
+    base                 >= 4.4   && < 4.13,
     bytestring           >= 0.9   && < 1.1,
     bytestring-builder               < 1.1,
-    containers           >= 0.3   && < 0.6,
+    containers           >= 0.3   && < 0.7,
     colour,
-    diagrams-core        >= 1.3   && < 1.5,
-    diagrams-lib         >= 1.3   && < 1.5,
+    diagrams-core        >= 1.4   && < 1.5,
+    diagrams-lib         >= 1.4   && < 1.5,
     directory            >= 1.0   && < 1.4,
     filepath             >= 1.2   && < 1.5,
     hashable             >= 1.1   && < 1.3,
     mtl                  >= 2.1   && < 3.0,
-    optparse-applicative >= 0.13  && < 0.14,
-    process              >= 1.0   && < 1.5,
+    optparse-applicative >= 0.13  && < 0.15,
+    process              >= 1.0   && < 1.7,
     split                >= 0.1.2 && < 0.3,
     texrunner            <= 0.0.2,
-    time                 >= 1.2   && < 1.7,
+    time                 >= 1.2   && < 1.10,
     JuicyPixels,
     vector,
     zlib
diff --git a/src/Diagrams/Backend/PGF.hs b/src/Diagrams/Backend/PGF.hs
--- a/src/Diagrams/Backend/PGF.hs
+++ b/src/Diagrams/Backend/PGF.hs
@@ -99,7 +99,6 @@
 import           Data.ByteString.Builder
 import           System.Directory             hiding (readable)
 import           System.FilePath
-import           System.IO
 import           System.Texrunner
 import           System.Texrunner.Online      hiding (hbox)
 
@@ -214,7 +213,11 @@
 writeTexFile :: (TypeableFloat n, Monoid' m)
              => FilePath -> Options PGF V2 n -> QDiagram PGF V2 n m -> IO ()
 writeTexFile outFile opts d = do
-  h <- openFile outFile WriteMode
-  hPutBuilder h $ renderDia PGF opts d
-  hClose h
+  let bs = toLazyByteString $ renderDia PGF opts d
+  LB.writeFile outFile bs
+  -- h <- openFile outFile WriteMode
+  -- hSetBinaryMode h True
+  -- hSetBuffering h (BlockBuffering (Just 80000))
+  -- hPutBuilder h $ renderDia PGF opts d
+  -- hClose h
 
diff --git a/src/Diagrams/Backend/PGF/Hbox.hs b/src/Diagrams/Backend/PGF/Hbox.hs
--- a/src/Diagrams/Backend/PGF/Hbox.hs
+++ b/src/Diagrams/Backend/PGF/Hbox.hs
@@ -27,7 +27,7 @@
    -- ** Non-Online version
    -- | These versions bypass 'OnlineTex' by just running a whole tex
    --   program just to get the size of a single hbox. This is not
-   --   recommended but because it is slow, but can be convientient if
+   --   recommended but because it is slow, but can be convenient if
    --   you only need one or two hbox sizes.
   , hboxSurf
   , hboxSurfIO
@@ -37,7 +37,8 @@
 
   ) where
 
-import           Data.ByteString.Char8        (pack)
+import           Data.ByteString.Lazy         (toStrict)
+import           Data.ByteString.Builder      (stringUtf8, toLazyByteString)
 import           Data.Monoid
 import           Data.Typeable
 import           System.IO.Unsafe
@@ -75,7 +76,7 @@
                 mempty
 
 -- | Hbox with bounding box envelope. Note that each box requires a call to
---   Tex. For multiple boxes consider using 'onlineHbox' to get multiple boxes
+--   Tex. For multiple boxes consider using 'hboxOnline' to get multiple boxes
 --   from a single call. (uses unsafePerformIO)
 hboxSurf :: (TypeableFloat n, Renderable (Hbox n) b)
             => Surface -> String -> QDiagram b V2 n Any
@@ -83,7 +84,7 @@
 {-# NOINLINE hboxSurf #-}
 
 -- | Hbox with bounding box envelope. Note that each box requires a call to
---   Tex. For multiple boxes consider using 'onlineHbox' to get multiple boxes
+--   Tex. For multiple boxes consider using 'hboxOnline' to get multiple boxes
 --   from a single call.
 hboxSurfIO :: (TypeableFloat n, Renderable (Hbox n) b)
        => Surface -> String -> IO (QDiagram b V2 n Any)
@@ -93,7 +94,7 @@
 hboxOnline :: (TypeableFloat n, Renderable (Hbox n) b)
            => String -> OnlineTex (QDiagram b V2 n Any)
 hboxOnline txt = do
-  Box h d w <- Online.hbox (pack txt)
+  Box h d w <- Online.hbox (toStrict . toLazyByteString $ stringUtf8 txt)
 
   let bb = fromCorners (P $ V2 0 (-d))
                        (P $ V2 w h)
diff --git a/src/Diagrams/Backend/PGF/Render.hs b/src/Diagrams/Backend/PGF/Render.hs
--- a/src/Diagrams/Backend/PGF/Render.hs
+++ b/src/Diagrams/Backend/PGF/Render.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE DeriveDataTypeable    #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
@@ -12,9 +13,9 @@
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
--- This is an internal module exposeing internals for rendering a
+-- This is an internal module exposing internals for rendering a
 -- diagram. This is for advanced use only. 'Diagrams.Backend.PGF'
--- has enought for general use.
+-- has enough for general use.
 --
 module Diagrams.Backend.PGF.Render
   ( PGF (..)
@@ -40,18 +41,19 @@
 import           Data.Tree                    (Tree (Node))
 
 import           Diagrams.Core.Types
-import           Diagrams.Prelude hiding ((<~))
+import           Diagrams.Prelude             hiding ((<~))
 
+import           Data.Typeable
 import           Diagrams.Backend.PGF.Hbox    (Hbox (..))
 import           Diagrams.Backend.PGF.Surface (Surface)
 import           Diagrams.TwoD.Adjust         (adjustDia2D)
 import           Diagrams.TwoD.Path
-import           Diagrams.TwoD.Text           (Text (..), TextAlignment (..), getFontSize,
-                                               getFontSlant, getFontWeight)
-import           Data.Typeable
+import           Diagrams.TwoD.Text           (Text (..), TextAlignment (..),
+                                               getFontSize, getFontSlant,
+                                               getFontWeight)
 import qualified Graphics.Rendering.PGF       as P
 
-import Prelude
+import           Prelude
 
 -- | This data declaration is simply used as a token to distinguish
 --   this rendering engine.
@@ -97,9 +99,14 @@
           , _standalone = False
           }
 
+instance Semigroup (Render PGF V2 n) where
+  R ra <> R rb = R $ ra >> rb
+
 instance Monoid (Render PGF V2 n) where
-  mempty              = R $ return ()
-  R ra `mappend` R rb = R $ ra >> rb
+  mempty  = R $ return ()
+#if !MIN_VERSION_base(4,11,0)
+  mappend = (<>)
+#endif
 
 -- | Lens onto the surface used to render.
 surface :: Lens' (Options PGF V2 n) Surface
@@ -148,7 +155,7 @@
     go (p:ps) = P.scope $ P.path p >> P.clip >> go ps
 
 -- | Escapes some common characters in a string. Note that this does not
---   mean the string can't create an error, it mearly escapes common
+--   mean the string can't create an error; it merely escapes common
 --   characters.
 escapeString :: String -> String
 escapeString = concatMap escapeChar
diff --git a/src/Diagrams/Backend/PGF/Surface.hs b/src/Diagrams/Backend/PGF/Surface.hs
--- a/src/Diagrams/Backend/PGF/Surface.hs
+++ b/src/Diagrams/Backend/PGF/Surface.hs
@@ -53,17 +53,17 @@
 import           Diagrams.Prelude
 import           Prelude
 
--- | The 'TexFormat' is used to choose the different PGF commands nessesary for
+-- | The 'TexFormat' is used to choose the different PGF commands necessary for
 --   that format.
 data TexFormat = LaTeX | ConTeXt | PlainTeX
   deriving (Show, Read, Eq, Typeable)
-  -- These names are only captialised so Context doesn't conflict with
+  -- These names are only capitalised so Context doesn't conflict with
   -- lens's Context.
 
 data Surface = Surface
   { _texFormat :: TexFormat -- ^ Format for the PGF commands
   , _command   :: String    -- ^ System command to be called.
-  , _arguments :: [String]  -- ^ Auguments for command.
+  , _arguments :: [String]  -- ^ Arguments for command.
   , _pageSize  :: Maybe (V2 Int -> String)
                             -- ^ Command to change page size from dimensions of image.
                             --   (in bp)
