diff --git a/morpheus-graphql.cabal b/morpheus-graphql.cabal
--- a/morpheus-graphql.cabal
+++ b/morpheus-graphql.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.35.0.
+-- This file has been generated from package.yaml by hpack version 0.36.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           morpheus-graphql
-version:        0.27.3
+version:        0.28.0
 synopsis:       Morpheus GraphQL
 description:    Build GraphQL APIs with your favourite functional language!
 category:       web, graphql
@@ -229,13 +229,14 @@
   ghc-options: -Wall
   build-depends:
       aeson >=1.4.4 && <3.0.0
+    , attoparsec-aeson >=2.1.0.0 && <3.0.0
     , base >=4.7.0 && <5.0.0
-    , bytestring >=0.10.4 && <0.12.0
-    , containers >=0.4.2.1 && <0.7.0
-    , morpheus-graphql-app >=0.27.0 && <0.28.0
-    , morpheus-graphql-code-gen >=0.27.0 && <0.28.0
-    , morpheus-graphql-core >=0.27.0 && <0.28.0
-    , morpheus-graphql-server >=0.27.0 && <0.28.0
+    , bytestring >=0.10.4 && <0.15.0
+    , containers >=0.4.2.1 && <=0.7
+    , morpheus-graphql-app >=0.28.0 && <0.29.0
+    , morpheus-graphql-code-gen >=0.28.0 && <0.29.0
+    , morpheus-graphql-core >=0.28.0 && <0.29.0
+    , morpheus-graphql-server >=0.28.0 && <0.29.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
     , template-haskell >=2.0.0 && <3.0.0
@@ -264,19 +265,20 @@
   ghc-options: -Wall
   build-depends:
       aeson >=1.4.4 && <3.0.0
+    , attoparsec-aeson >=2.1.0.0 && <3.0.0
     , base >=4.7.0 && <5.0.0
-    , bytestring >=0.10.4 && <0.12.0
-    , containers >=0.4.2.1 && <0.7.0
-    , morpheus-graphql
-    , morpheus-graphql-app >=0.27.0 && <0.28.0
-    , morpheus-graphql-code-gen >=0.27.0 && <0.28.0
-    , morpheus-graphql-core >=0.27.0 && <0.28.0
-    , morpheus-graphql-server >=0.27.0 && <0.28.0
-    , morpheus-graphql-subscriptions >=0.27.0 && <0.28.0
-    , morpheus-graphql-tests >=0.27.0 && <0.28.0
+    , bytestring >=0.10.4 && <0.15.0
+    , containers >=0.4.2.1 && <=0.7
+    , morpheus-graphql >=0.28.0 && <0.29.0
+    , morpheus-graphql-app >=0.28.0 && <0.29.0
+    , morpheus-graphql-code-gen >=0.28.0 && <0.29.0
+    , morpheus-graphql-core >=0.28.0 && <0.29.0
+    , morpheus-graphql-server >=0.28.0 && <0.29.0
+    , morpheus-graphql-subscriptions >=0.28.0 && <0.29.0
+    , morpheus-graphql-tests >=0.28.0 && <0.29.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
-    , tasty >=0.1.0 && <1.5.0
+    , tasty >=0.1.0 && <=1.5
     , tasty-hunit >=0.1.0 && <1.0.0
     , template-haskell >=2.0.0 && <3.0.0
     , text >=1.2.3 && <3.0.0
diff --git a/src/Data/Morpheus/Types.hs b/src/Data/Morpheus/Types.hs
--- a/src/Data/Morpheus/Types.hs
+++ b/src/Data/Morpheus/Types.hs
@@ -41,6 +41,7 @@
 
     -- * GQL directives API
     Prefixes (..),
+    Suffixes (..),
     VisitType (..),
     VisitField (..),
     Describe (..),
@@ -96,6 +97,7 @@
     SUBSCRIPTION,
     ScalarValue (..),
     SubscriptionField,
+    Suffixes (..),
     TypeGuard (..),
     Undefined,
     VisitEnum (..),
diff --git a/test/Subscription/Case/ApolloRequest.hs b/test/Subscription/Case/ApolloRequest.hs
--- a/test/Subscription/Case/ApolloRequest.hs
+++ b/test/Subscription/Case/ApolloRequest.hs
@@ -18,7 +18,10 @@
 import Subscription.Utils
   ( SimulationState (..),
     SubM,
+    apolloConnectionAck,
     apolloInit,
+    apolloPing,
+    apolloPong,
     apolloStart,
     apolloStop,
     inputsAreConsumed,
@@ -50,7 +53,7 @@
         "unknown request type"
         [ inputsAreConsumed inputs,
           testResponse
-            ["Unknown Request type \"bla\"."]
+            ["Error in $.type: Invalid type encountered."]
             outputs,
           storeIsEmpty store
         ]
@@ -66,12 +69,27 @@
         "connection init"
         [ inputsAreConsumed inputs,
           testResponse
-            []
+            [apolloConnectionAck]
             outputs,
           stored input store,
           storedSingle store
         ]
 
+testPingPong ::
+  (Eq ch, Show ch, Hashable ch) =>
+  App (Event ch a) (SubM (Event ch a)) ->
+  IO TestTree
+testPingPong = testSimulation test [apolloInit, apolloPing]
+  where
+    test _ SimulationState {inputs, outputs} =
+      testGroup
+        "ping pong"
+        [ inputsAreConsumed inputs,
+          testResponse
+            [apolloConnectionAck, apolloPong]
+            outputs
+        ]
+
 startSub :: ByteString -> ByteString
 startSub = apolloStart "subscription MySubscription { newDeity { name }}"
 
@@ -92,7 +110,7 @@
         "subscription start"
         [ inputsAreConsumed inputs,
           testResponse
-            []
+            [apolloConnectionAck]
             outputs,
           storeSubscriptions
             input
@@ -118,7 +136,7 @@
         "stop subscription"
         [ inputsAreConsumed inputs,
           testResponse
-            []
+            [apolloConnectionAck]
             outputs,
           storeSubscriptions
             input
@@ -137,5 +155,6 @@
       [ testUnknownType,
         testConnectionInit,
         testSubscriptionStart,
-        testSubscriptionStop
+        testSubscriptionStop,
+        testPingPong
       ]
diff --git a/test/Subscription/Case/Publishing.hs b/test/Subscription/Case/Publishing.hs
--- a/test/Subscription/Case/Publishing.hs
+++ b/test/Subscription/Case/Publishing.hs
@@ -28,6 +28,7 @@
   )
 import Subscription.Utils
   ( SimulationState (..),
+    apolloConnectionAck,
     apolloInit,
     apolloRes,
     apolloStart,
@@ -83,7 +84,8 @@
       [ inputsAreConsumed inputs,
         testResponse
           -- triggers subscriptions by channels
-          [ apolloRes
+          [ apolloConnectionAck,
+            apolloRes
               "2"
               "{\"newDeity\":{\"name\":\"Zeus\",\"age\":1200}}",
             apolloRes
diff --git a/test/Subscription/Utils.hs b/test/Subscription/Utils.hs
--- a/test/Subscription/Utils.hs
+++ b/test/Subscription/Utils.hs
@@ -19,6 +19,10 @@
     apolloStop,
     apolloRes,
     apolloInit,
+    apolloConnectionAck,
+    apolloConnectionErr,
+    apolloPing,
+    apolloPong,
     testSimulation,
   )
 where
@@ -159,7 +163,7 @@
   | otherwise =
       testCase "stored single connection" $
         assertFailure $
-          "connectionStore must store single connection"
+          "connectionStore must store single connection, but stored: "
             <> show
               cStore
 
@@ -209,13 +213,26 @@
                 cStore
 
 apolloStart :: ByteString -> ByteString -> ByteString
-apolloStart query sid = "{\"id\":\"" <> sid <> "\",\"type\":\"start\",\"payload\":{\"variables\":{},\"operationName\":\"MySubscription\",\"query\":\"" <> query <> "\"}}"
+apolloStart query sid =
+  "{\"id\":\"" <> sid <> "\",\"type\":\"subscribe\",\"payload\":{\"variables\":{},\"operationName\":\"MySubscription\",\"query\":\"" <> query <> "\"}}"
 
 apolloStop :: ByteString -> ByteString
-apolloStop x = "{\"id\":\"" <> x <> "\",\"type\":\"stop\"}"
+apolloStop x = "{\"id\":\"" <> x <> "\",\"type\":\"complete\"}"
 
 apolloRes :: ByteString -> ByteString -> ByteString
-apolloRes sid value = "{\"id\":\"" <> sid <> "\",\"type\":\"data\",\"payload\":{\"data\":" <> value <> "}}"
+apolloRes sid value = "{\"id\":\"" <> sid <> "\",\"type\":\"next\",\"payload\":{\"data\":" <> value <> "}}"
 
 apolloInit :: ByteString
-apolloInit = "{ \"type\":\"connection_init\" }"
+apolloInit = "{\"type\":\"connection_init\"}"
+
+apolloConnectionAck :: ByteString
+apolloConnectionAck = "{\"type\":\"connection_ack\"}"
+
+apolloConnectionErr :: ByteString
+apolloConnectionErr = "{\"type\":\"connection_error\"}"
+
+apolloPing :: ByteString
+apolloPing = "{\"type\":\"ping\"}"
+
+apolloPong :: ByteString
+apolloPong = "{\"type\":\"pong\"}"
