diff --git a/Language/Symantic/Lib/If.hs b/Language/Symantic/Lib/If.hs
--- a/Language/Symantic/Lib/If.hs
+++ b/Language/Symantic/Lib/If.hs
@@ -27,7 +27,7 @@
 instance Sym_If View where
 	if_ (View cond) (View ok) (View ko) =
 		View $ \po v ->
-			parenInfix po op $
+			pairIfNeeded pairParen po op $
 			Text.concat
 			 [ "if ", cond (op, SideL) v
 			 , " then ", ok (op, SideL) v
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,11 +1,11 @@
-resolver: lts-12.8
+resolver: lts-13.19
 packages:
 - '.'
 - location: '../symantic'
   extra-dep: true
 - location: '../symantic-grammar'
   extra-dep: true
-- location: '../symantic-document'
+- location: '../../symantic-document'
   extra-dep: true
 extra-deps:
 - monad-classes-0.3.2.2
diff --git a/symantic-lib.cabal b/symantic-lib.cabal
--- a/symantic-lib.cabal
+++ b/symantic-lib.cabal
@@ -2,7 +2,7 @@
 -- PVP:  +-+------- breaking API changes
 --       | | +----- non-breaking API additions
 --       | | | +--- code changes with no API change
-version: 0.0.4.20180831
+version: 0.0.5.20190614
 category: Language
 synopsis: Symantics for common types.
 description: Symantics for common types,
@@ -17,11 +17,11 @@
 -- homepage:
 
 build-type: Simple
-cabal-version: >= 1.24
+cabal-version: 1.24
+tested-with: GHC==8.4.4
 extra-source-files:
   stack.yaml
 extra-tmp-files:
-tested-with: GHC==8.4.3
 
 Source-Repository head
   location: git://git.autogeree.net/symantic
@@ -146,7 +146,7 @@
     , base             >= 4.6 && < 5
     , bytestring       >= 0.10
     , containers       >= 0.5
-    , megaparsec       >= 6.3
+    , megaparsec       >= 7.0
     , monad-classes    >= 0.3.2
     , mono-traversable >= 1.0
     , tasty            >= 0.11
diff --git a/test/Golden.hs b/test/Golden.hs
--- a/test/Golden.hs
+++ b/test/Golden.hs
@@ -6,7 +6,7 @@
 import Data.Semigroup (Semigroup(..))
 import Data.String (String)
 -- import System.FilePath (FilePath)
-import System.IO (IO)
+import System.IO (IO, FilePath)
 import qualified Data.ByteString.Lazy as BSL
 import qualified Data.List as List
 import qualified Data.Text.Lazy          as TL
diff --git a/test/HUnit/Applicative.hs b/test/HUnit/Applicative.hs
--- a/test/HUnit/Applicative.hs
+++ b/test/HUnit/Applicative.hs
@@ -2,7 +2,13 @@
 module HUnit.Applicative where
 
 import Test.Tasty
+import Control.Applicative (Applicative)
+import Data.Bool
+import Data.Either (Either(..))
+import Data.Functor (Functor)
+import Data.Maybe (Maybe(..))
 import Data.Proxy (Proxy(..))
+import Prelude (Integer)
 
 import Language.Symantic.Lib
 import Testing.Compiling
diff --git a/test/HUnit/Foldable.hs b/test/HUnit/Foldable.hs
--- a/test/HUnit/Foldable.hs
+++ b/test/HUnit/Foldable.hs
@@ -2,7 +2,12 @@
 module HUnit.Foldable where
 
 import Test.Tasty
+import Control.Applicative (Applicative)
+import Data.Either (Either(..))
+import Data.Foldable (Foldable)
+import Data.Int (Int)
 import Data.Proxy (Proxy(..))
+import Prelude (Integer)
 
 import Language.Symantic.Lib
 import Testing.Compiling
diff --git a/test/HUnit/Functor.hs b/test/HUnit/Functor.hs
--- a/test/HUnit/Functor.hs
+++ b/test/HUnit/Functor.hs
@@ -2,7 +2,12 @@
 module HUnit.Functor where
 
 import Test.Tasty
+import Data.Bool
+import Data.Either (Either(..))
+import Data.Functor (Functor)
+import Data.Maybe (Maybe(..))
 import Data.Proxy (Proxy(..))
+import Prelude (Integer)
 
 import Language.Symantic ()
 import Language.Symantic.Lib
diff --git a/test/HUnit/Map.hs b/test/HUnit/Map.hs
--- a/test/HUnit/Map.hs
+++ b/test/HUnit/Map.hs
@@ -2,9 +2,14 @@
 module HUnit.Map where
 
 import Test.Tasty
+import Data.Char (Char)
+import Data.Either (Either(..))
+import Data.Int (Int)
+import Data.Monoid (Monoid)
 import Data.Map.Strict (Map)
 import Data.Proxy (Proxy(..))
 import Data.Text as Text
+import Prelude (Integer, Num)
 import qualified Data.Map.Strict as Map
 
 import Language.Symantic.Lib
diff --git a/test/HUnit/MonoFunctor.hs b/test/HUnit/MonoFunctor.hs
--- a/test/HUnit/MonoFunctor.hs
+++ b/test/HUnit/MonoFunctor.hs
@@ -2,7 +2,12 @@
 module HUnit.MonoFunctor where
 
 import Test.Tasty
+import Data.Bool
+import Data.Char (Char)
+import Data.Either (Either(..))
+import Data.Maybe (Maybe(..))
 import Data.Proxy (Proxy(..))
+import Prelude (Integer)
 import qualified Data.MonoTraversable as MT
 
 import Language.Symantic.Lib
diff --git a/test/HUnit/Tuple2.hs b/test/HUnit/Tuple2.hs
--- a/test/HUnit/Tuple2.hs
+++ b/test/HUnit/Tuple2.hs
@@ -2,7 +2,9 @@
 module HUnit.Tuple2 where
 
 import Test.Tasty
+import Data.Either (Either(..))
 import Data.Proxy (Proxy(..))
+import Prelude (Integer)
 
 import Language.Symantic.Lib
 import Testing.Compiling
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,6 +1,8 @@
 module Main where
 
 import Test.Tasty
+import Data.Function (($))
+import System.IO (IO)
 
 import Golden
 import HUnit
diff --git a/test/Testing/Compiling.hs b/test/Testing/Compiling.hs
--- a/test/Testing/Compiling.hs
+++ b/test/Testing/Compiling.hs
@@ -9,16 +9,30 @@
 import Test.Tasty.HUnit
 import Debug.Trace (trace)
 
+import Control.Applicative (Applicative(..))
 import Control.Arrow (left)
+import Control.Monad (Monad(..))
+import Data.Either (Either(..), either)
+import Data.Eq (Eq(..))
+import Data.Function (($), (.), id)
+import Data.Functor ((<$>))
 import Data.Functor.Identity (Identity(..))
+import Data.List ((++))
+import Data.Maybe (Maybe(..))
+import Data.Ord (Ord(..))
+import Data.String (String)
 import Data.Text (Text)
+import Data.Tuple (snd)
 import Data.Type.Equality
 import Data.Void (Void)
+import Prelude (error)
+import Text.Show (Show)
 import qualified Control.Monad.Classes.Run as MC
 import qualified Control.Monad.Trans.State.Strict as S
 import qualified Data.List as List
 import qualified Data.Text as Text
 import qualified Text.Megaparsec as P
+import qualified Text.Show as Show
 
 import Language.Symantic.Grammar
 import Language.Symantic
@@ -38,9 +52,9 @@
  ModulesTyInj ss =>
  ModulesInj src ss =>
  Gram_Term src ss (G src ss) =>
- Text -> Either (P.ParseError Char Void) (AST_Term src ss)
+ Text -> Either (P.ParseErrorBundle Text Void) (AST_Term src ss)
 parseTe inp =
-	let modsTe :: Modules src ss = either (error . show) id modulesInj in
+	let modsTe :: Modules src ss = either (error . Show.show) id modulesInj in
 	let impsTe = [] `importModules` modsTe in
 	let modsTy = modulesTyInj @ss @src in
 	let impsTy = importTypes @ss [] in
@@ -70,7 +84,7 @@
  ) =>
  Text ->
  Either ( Type src '[] t
-        , Either (P.ParseError Char Void)
+        , Either (P.ParseErrorBundle Text Void)
                  (Error_Term src) )
         (Type src '[] t, t, Text) ->
  TestTree
@@ -106,8 +120,8 @@
 maybeRight Left{}    = Nothing
 
 elide :: Text -> String
-elide s | Text.length s > 42 = List.take 42 (Text.unpack s) List.++ ['…']
+elide s | Text.length s > 42 = List.take 42 (Text.unpack s) ++ ['…']
 elide s = Text.unpack s
 
 dbg :: Show a => String -> a -> a
-dbg msg x = trace (msg ++ " = " ++ Prelude.show x) x
+dbg msg x = trace (msg ++ " = " ++ Show.show x) x
diff --git a/test/Testing/Megaparsec.hs b/test/Testing/Megaparsec.hs
--- a/test/Testing/Megaparsec.hs
+++ b/test/Testing/Megaparsec.hs
@@ -10,14 +10,14 @@
 import Data.Either (Either(..))
 import Data.Function (($), (.))
 import Data.Functor (Functor(..), (<$>))
-import Data.List.NonEmpty (NonEmpty(..))
 import Data.Ord (Ord(..))
-import Data.String (IsString(..))
+import Data.String (String, IsString(..))
 import Data.Typeable ()
 import Text.Show (Show(..))
 import qualified Control.Applicative as Alt
 import qualified Control.Monad.Classes as MC
 import qualified Data.Char as Char
+import qualified Data.List as List
 import qualified Data.Text as Text
 import qualified Data.Text.Lazy as TL
 import qualified Text.Megaparsec as P
@@ -37,28 +37,19 @@
 -- Readers
 --
 
--- NonEmpty P.SourcePos
-instance ParsecC e s => Sym.Gram_Reader (NonEmpty P.SourcePos) (P.ParsecT e s m) where
-	askBefore g = do
-		s <- P.statePos <$> P.getParserState
-		($ s) <$> g
-	askAfter g = do
-		f <- g
-		f . P.statePos <$> P.getParserState
-type instance MC.CanDo (P.ParsecT e s m) (MC.EffReader (NonEmpty P.SourcePos)) = 'True
-instance ParsecC e s => MC.MonadReaderN 'MC.Zero (NonEmpty P.SourcePos) (P.ParsecT e s m) where
-	askN _n = P.statePos <$> P.getParserState
+{-
 -- P.SourcePos
 instance ParsecC e s => Sym.Gram_Reader P.SourcePos (P.ParsecT e s m) where
 	askBefore g = do
-		s <- P.getPosition
+		s <- P.getSourcePos
 		($ s) <$> g
 	askAfter g = do
 		f <- g
-		f <$> P.getPosition
+		f <$> P.getSourcePos
 type instance MC.CanDo (P.ParsecT e s m) (MC.EffReader P.SourcePos) = 'True
 instance ParsecC e s => MC.MonadReaderN 'MC.Zero P.SourcePos (P.ParsecT e s m) where
-	askN _n = P.getPosition
+	askN _n = P.getSourcePos
+-}
 -- ()
 instance ParsecC e s => Sym.Gram_Reader () (P.ParsecT e s m) where
 	askBefore = fmap ($ ())
@@ -108,10 +99,10 @@
 instance ParsecC e s => Sym.Gram_Rule (P.ParsecT e s m) where
 	rule = P.label . Text.unpack
 instance ParsecC e s => Sym.Gram_Char (P.ParsecT e s m) where
-	any          = P.anyChar
+	any          = P.anySingle
 	eoi          = P.eof
 	char         = P.char
-	unicat cat   = P.satisfy $ (`elem` cats) . Char.generalCategory
+	unicat cat   = P.satisfy $ (`List.elem` cats) . Char.generalCategory
 		where cats = unicode_categories cat
 	range (l, h) = P.satisfy $ \c -> l <= c && c <= h
 	Terminal f `but` Terminal p = Terminal $ P.notFollowedBy (P.try p) *> f
