diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,6 +8,8 @@
 Morpheus is still in an early stage of development, so any feedback is more than welcome, and we appreciate any contribution!
 Just open an issue here on GitHub, or join [our Slack channel](https://morpheus-graphql-slack-invite.herokuapp.com/) to get in touch.
 
+Please note that this readme file provides only a brief introduction to the library. If you are interested in more advanced topics, visit [Docs](https://morpheusgraphql.com/).
+
 ## Getting Started
 
 ### Setup
@@ -30,6 +32,8 @@
 
 extra-deps:
   - morpheus-graphql-0.17.0
+  - morpheus-graphql-app-0.17.0
+  - morpheus-graphql-core-0.17.0
 ```
 
 As Morpheus is quite new, make sure stack can find morpheus-graphql by running `stack upgrade` and `stack update`
@@ -109,7 +113,7 @@
 ### with Native Haskell Types
 
 To define a GraphQL API with Morpheus we start by defining the API Schema as a native Haskell data type,
-which derives the `Generic` typeClass. Lazily resolvable fields on this `Query` type are defined via `a -> ResolverQ () IO b`, representing resolving a set of arguments `a` to a concrete value `b`.
+which derives the `Generic` type class. Using the `DeriveAnyClass` language extension we then also derive instances for the `GQLType` type class. Lazily resolvable fields on this `Query` type are defined via `a -> ResolverQ () IO b`, representing resolving a set of arguments `a` to a concrete value `b`.
 
 ```haskell
 data Query m = Query
@@ -119,12 +123,12 @@
 data Deity = Deity
   { fullName :: Text         -- Non-Nullable Field
   , power    :: Maybe Text   -- Nullable Field
-  } deriving (Generic,GQLType)
+  } deriving (Generic, GQLType)
 
 data DeityArgs = DeityArgs
   { name      :: Text        -- Required Argument
   , mythology :: Maybe Text  -- Optional Argument
-  } deriving (Generic)
+  } deriving (Generic, GQLType)
 ```
 
 For each field in the `Query` type defined via `a -> m b` (like `deity`) we will define a resolver implementation that provides the values during runtime by referring to
@@ -137,13 +141,13 @@
   { name      :: Text        -- Required Argument
   , mythology :: Maybe Text  -- Optional Argument
   , type'     :: Text
-  } deriving (Generic)
+  } deriving (Generic, GQLType)
 ```
 
 The field name in the final request will be `type` instead of `type'`. The Morpheus request parser converts each of the reserved identities in Haskell 2010 to their corresponding names internally. This also applies to selections.
 
 ```haskell
-resolveDeity :: DeityArgs -> ResolverQ e () Deity
+resolveDeity :: DeityArgs -> ResolverQ () IO Deity
 resolveDeity DeityArgs { name, mythology } = liftEither $ dbDeity name mythology
 
 askDB :: Text -> Maybe Text -> IO (Either String Deity)
@@ -206,418 +210,6 @@
 Mythology API is deployed on : [_api.morpheusgraphql.com_](https://api.morpheusgraphql.com) where you can test it with `GraphiQL`
 
 ![Mythology Api](https://morpheusgraphql.com/assets/img/mythology-api.png "mythology-api")
-
-## Advanced topics
-
-### Enums
-
-You can use Union Types as Enums, but they're not allowed to have any parameters.
-
-```haskell
-data City
-  = Athens
-  | Sparta
-  | Corinth
-  | Delphi
-  | Argos
-  deriving (Generic)
-
-instance GQLType City where
-  type KIND City = ENUM
-```
-
-### Union types
-
-To use union type, all you have to do is derive the `GQLType` class. Using GraphQL [_fragments_](https://graphql.org/learn/queries/#fragments), the arguments of each data constructor can be accessed from the GraphQL client.
-
-```haskell
-data Character
-  = CharacterDeity Deity -- will be unwrapped, since Character + Deity = CharacterDeity
-  | SomeDeity Deity -- will be wrapped since Character + Deity != SomeDeity
-  | Creature { creatureName :: Text, creatureAge :: Int }
-  | Demigod Text Text
-  | Zeus
-  deriving (Generic, GQLType)
-```
-
-where `Deity` is an object.
-
-As we see, there are different kinds of unions. `Morpheus` handles them all.
-
-This type will be represented as
-
-```gql
-union Character = Deity | SomeDeity | Creature | SomeMulti | Zeus
-
-type SomeDeity {
-  _0: Deity!
-}
-
-type Creature {
-  creatureName: String!
-  creatureAge: Int!
-}
-
-type Demigod {
-  _0: Int!
-  _1: String!
-}
-
-type Zeus {
-  _: Unit!
-}
-```
-
-By default, union members will be generated with wrapper objects.
-There is one exception to this: if a constructor of a type is the type name concatenated with the name of the contained type, it will be referenced directly.
-That is, given:
-
-```haskell
-data Song = { songName :: Text, songDuration :: Float } deriving (Generic, GQLType)
-
-data Skit = { skitName :: Text, skitDuration :: Float } deriving (Generic, GQLType)
-
-data WrappedNode
-  = WrappedSong Song
-  | WrappedSkit Skit
-  deriving (Generic, GQLType)
-
-data NonWrapped
-  = NonWrappedSong Song
-  | NonWrappedSkit Skit
-  deriving (Generic, GQLType)
-
-```
-
-You will get the following schema:
-
-```gql
-# has wrapper types
-union WrappedNode = WrappedSong | WrappedSkit
-
-# is a direct union
-union NonWrapped = Song | Skit
-
-type WrappedSong {
-  _0: Song!
-}
-
-type WrappedSKit {
-  _0: Skit!
-}
-
-type Song {
-  songDuration: Float!
-  songName: String!
-}
-
-type Skit {
-  skitDuration: Float!
-  skitName: String!
-}
-```
-
-- for all other unions will be generated new object type. for types without record syntax, fields will be automatically indexed.
-
-- all empty constructors in union will be summed in type `<tyConName>Enum` (e.g `CharacterEnum`), this enum will be wrapped in `CharacterEnumObject` and added to union members.
-
-### Scalar types
-
-To use custom scalar types, you need to provide implementations for `parseValue` and `serialize` respectively.
-
-```haskell
-data Odd = Odd Int  deriving (Generic)
-
-instance DecodeScalar Euro where
-  decodeScalar (Int x) = pure $ Odd (... )
-  decodeScalar _ = Left "invalid Value!"
-
-instance EncodeScalar Euro where
-  encodeScalar (Odd value) = Int value
-
-instance GQLType Odd where
-  type KIND Odd = SCALAR
-```
-
-### Applicative and Monad instance
-
-The `Resolver` type has `Applicative` and `Monad` instances that can be used to compose resolvers.
-
-### Introspection
-
-Morpheus converts your schema to a GraphQL introspection automatically. You can use tools like `Insomnia` to take a
-look at the introspection and validate your schema.
-If you need a description for your GQLType inside of the introspection you can define the GQLType instance manually
-and provide an implementation for the `description` function:
-
-```haskell
-data Deity = Deity
-{ ...
-} deriving (Generic)
-
-instance GQLType Deity where
-  description = const "A supernatural being considered divine and sacred"
-```
-
-screenshots from `Insomnia`
-
-![alt text](https://morpheusgraphql.com/assets/img/introspection/spelling.png "spelling")
-![alt text](https://morpheusgraphql.com/assets/img/introspection/autocomplete.png "autocomplete")
-![alt text](https://morpheusgraphql.com/assets/img/introspection/type.png "type")
-
-## Handling Errors
-
-for errors you can use use either `liftEither` or `MonadFail`:
-at the and they have same result.
-
-with `liftEither`
-
-```haskell
-resolveDeity :: DeityArgs -> ResolverQ e IO Deity
-resolveDeity DeityArgs {} = liftEither $ dbDeity
-
-dbDeity ::  IO Either Deity
-dbDeity = pure $ Left "db error"
-```
-
-with `MonadFail`
-
-```haskell
-resolveDeity :: DeityArgs -> ResolverQ e IO Deity
-resolveDeity DeityArgs { } = fail "db error"
-```
-
-### Mutations
-
-In addition to queries, Morpheus also supports mutations. They behave just like regular queries and are defined similarly:
-
-```haskell
-newtype Mutation m = Mutation
-  { createDeity :: MutArgs -> m Deity
-  } deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO  () Query Mutation Undefined
-rootResolver =
-  RootResolver
-    { queryResolver = Query {...}
-    , mutationResolver = Mutation { createDeity }
-    , subscriptionResolver = Undefined
-    }
-    where
-      -- Mutation Without Event Triggering
-      createDeity :: MutArgs -> ResolverM () IO Deity
-      createDeity_args = lift setDBAddress
-
-gqlApi :: ByteString -> IO ByteString
-gqlApi = interpreter rootResolver
-```
-
-### Subscriptions
-
-In morpheus subscription and mutation communicate with Events,
-`Event` consists with user defined `Channel` and `Content`.
-
-Every subscription has its own Channel by which it will be triggered
-
-```haskell
-data Channel
-  = ChannelA
-  | ChannelB
-
-data Content
-  = ContentA Int
-  | ContentB Text
-
-type MyEvent = Event Channel Content
-
-newtype Query m = Query
-  { deity :: m Deity
-  } deriving (Generic)
-
-newtype Mutation m = Mutation
-  { createDeity :: m Deity
-  } deriving (Generic)
-
-newtype Subscription (m ::  * -> * ) = Subscription
-  { newDeity :: m  Deity
-  } deriving (Generic)
-
-newtype Subscription (m :: * -> *) = Subscription
-{ newDeity :: SubscriptionField (m Deity),
-}
-deriving (Generic)
-
-
-type APIEvent = Event Channel Content
-
-rootResolver :: RootResolver IO APIEvent Query Mutation Subscription
-rootResolver = RootResolver
-  { queryResolver        = Query { deity = fetchDeity }
-  , mutationResolver     = Mutation { createDeity }
-  , subscriptionResolver = Subscription { newDeity }
-  }
- where
-  -- Mutation Without Event Triggering
-  createDeity :: ResolverM EVENT IO Address
-  createDeity = do
-      requireAuthorized
-      publish [Event { channels = [ChannelA], content = ContentA 1 }]
-      lift dbCreateDeity
-  newDeity :: SubscriptionField (ResolverS EVENT IO Deity)
-  newDeity = subscribe ChannelA $ do
-    -- executed only once
-    -- immediate response on failures
-    requireAuthorized
-    pure $ \(Event _ content) -> do
-        -- executes on every event
-        lift (getDBAddress content)
-```
-
-### Interface
-
-1. defining interface with Haskell Types (runtime validation):
-
-   ```haskell
-     -- interface is just regular type derived as interface
-   newtype Person m = Person {name ::  m Text}
-     deriving (Generic)
-
-   instance GQLType (Person m) where
-     type KIND (Person m) = INTERFACE
-
-   -- with GQLType user can links interfaces to implementing object
-   instance GQLType Deity where
-     implements _ = [interface (Proxy @Person)]
-   ```
-
-2. defining with `importGQLDocument` and `DSL` (compile time validation):
-
-   ```graphql
-   interface Account {
-     name: String!
-   }
-
-   type User implements Account {
-     name: String!
-   }
-   ```
-
-## Morpheus `GraphQL Client` with Template haskell QuasiQuotes
-
-```hs
-defineByDocumentFile
-    "./schema.gql"
-  [gql|
-    query GetHero ($character: Character)
-      {
-        deity (fatherOf:$character) {
-          name
-          power
-          worships {
-            deity2Name: name
-          }
-        }
-      }
-  |]
-```
-
-with schema:
-
-```gql
-input Character {
-  name: String!
-}
-
-type Deity {
-  name: String!
-  worships: Deity
-  power: Power!
-}
-
-enum Power {
-  Lightning
-  Teleportation
-  Omniscience
-}
-```
-
-will validate query and Generate:
-
-- namespaced response and variable types
-- instance for `Fetch` typeClass
-
-```hs
-data GetHero = GetHero {
-  deity: DeityDeity
-}
-
--- from: {user
-data DeityDeity = DeityDeity {
-  name: Text,
-  worships: Maybe DeityWorshipsDeity
-  power: Power
-}
-
--- from: {deity{worships
-data DeityWorshipsDeity = DeityWorshipsDeity {
-  name: Text,
-}
-
-data Power =
-    PowerLightning
-  | PowerTeleportation
-  | PowerOmniscience
-
-data GetHeroArgs = GetHeroArgs {
-  character: Character
-}
-
-data Character = Character {
-  name: Person
-}
-```
-
-as you see, response type field name collision can be handled with GraphQL `alias`.
-
-with `fetch` you can fetch well typed response `GetHero`.
-
-```haskell
-  fetchHero :: Args GetHero -> m (Either String GetHero)
-  fetchHero = fetch jsonRes args
-      where
-        args = GetHeroArgs {character = Person {name = "Zeus"}}
-        jsonRes :: ByteString -> m ByteString
-        jsonRes = <GraphQL APi>
-```
-
-in this case, `jsonRes` resolves a request into a response in some monad `m`.
-
-A `fetch` resolver implementation against [a real API](https://swapi.graph.cool) may look like the following:
-
-```haskell
-{-# LANGUAGE OverloadedStrings #-}
-
-import Data.ByteString.Lazy (ByteString)
-import qualified Data.ByteString.Char8 as C8
-import Network.HTTP.Req
-
-resolver :: String -> ByteString -> IO ByteString
-resolver tok b = runReq defaultHttpConfig $ do
-    let headers = header "Content-Type" "application/json"
-    responseBody <$> req POST (https "swapi.graph.cool") (ReqBodyLbs b) lbsResponse headers
-```
-
-this is demonstrated in examples/src/Client/StarWarsClient.hs
-
-types can be generated from `introspection` too:
-
-```haskell
-defineByIntrospectionFile "./introspection.json"
-```
-
-## Morpheus CLI for Code Generating
-
-you should use [morpheus-graphql-cli](https://github.com/morpheusgraphql/morpheus-graphql-cli)
 
 ## Showcase
 
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,8 +1,59 @@
 # Changelog
 
+## 0.18.0 - 08.11.2021
+
+### new Features
+
+- `NamedResoplvers` (experimental featuure): typed Haskell approach of providing appollo
+  like named resolvers, apps with NamedResolvers theoretically can be safelly merged.
+
+- `TypeGuards`: as an alternative for interfaces
+
+- `TaggedArguments`: support of type level tagged argument definition. for example:
+
+  Haskell field definition
+
+  ```hs
+  myField :: Arg "a" Int -> Arg "b" (Maybe Text) -> m Text
+  ```
+
+  will generate GraphQL field
+
+  ```gql
+  myField(a:Int!, b:String): String!
+  ```
+
+- deriving will merge function arguments. for example:
+
+  for following data type definitions:
+
+  ```hs
+  data A = A { a1 :: Text, a2 :: Int} deriving (Show, Generic, GQLType)
+  data B = B {b :: Text} deriving (Show, Generic, GQLType)
+  ```
+
+  Haskell field definition
+
+  ```hs
+  myField :: A -> B -> m Text
+  ```
+
+  will generate GraphQL field
+
+  ```gql
+  myField(a1:String!, a2:Int!, b:String!): String!
+  ```
+
+### Breaking Changes
+
+- non object variants constructors will be also unpacked
+- removed `implements`field from `GQLType`
+- removed `interface` from `Morpheus.Types`
+- deprecated kind `INTERFACE`
+
 ## 0.17.0 - 25.02.2021
 
-## new features
+### new features
 
 - (issue [#543](https://github.com/morpheusgraphql/morpheus-graphql/issues/543) & [#558](https://github.com/morpheusgraphql/morpheus-graphql/issues/558)): `GQLTypeOptions` supports new option `typeNameModifier`.
   Before the schema failed if you wanted to use the same type for input and output, and the user had no control over the eventual GraphQL type name of the generated schema. Now with this option you can
@@ -948,6 +999,7 @@
   [morpheus-graphql-cli](https://github.com/morpheusgraphql/morpheus-graphql-cli/)
 
 - example `API` executable is removed from Production build
+- deprecated `Data.Morpheus.Document.toGraphQLDocument`
 
 ### Added
 
diff --git a/morpheus-graphql.cabal b/morpheus-graphql.cabal
--- a/morpheus-graphql.cabal
+++ b/morpheus-graphql.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.33.0.
+-- This file has been generated from package.yaml by hpack version 0.34.4.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: d368fd8eff3a4df2fceeb6a1ce9443206bae51f0198ffac9b2bcfbc651591e6e
+-- hash: 8115cd76f9c3ca8b90fafdd1b4dc9eb4409be0bef2501609bfe4675acba5d466
 
 name:           morpheus-graphql
-version:        0.17.0
+version:        0.18.0
 synopsis:       Morpheus GraphQL
 description:    Build GraphQL APIs with your favourite functional language!
 category:       web, graphql
@@ -23,378 +23,410 @@
     changelog.md
     README.md
 data-files:
-    test/Feature/Holistic/arguments/nameConflict/query.gql
-    test/Feature/Holistic/arguments/undefinedArgument/query.gql
-    test/Feature/Holistic/arguments/unknownArguments/query.gql
-    test/Feature/Holistic/failure/resolveFailure/query.gql
-    test/Feature/Holistic/fragment/cannotBeSpreadOnType/query.gql
-    test/Feature/Holistic/fragment/conditionTypeViolation/query.gql
-    test/Feature/Holistic/fragment/inlineFragment/query.gql
-    test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/query.gql
-    test/Feature/Holistic/fragment/loopingFragment/query.gql
-    test/Feature/Holistic/fragment/nameCollision/query.gql
-    test/Feature/Holistic/fragment/unknownConditionType/query.gql
-    test/Feature/Holistic/fragment/unknownTargetType/query.gql
-    test/Feature/Holistic/fragment/unusedFragment/query.gql
-    test/Feature/Holistic/introspection/defaultTypes/Boolean/query.gql
-    test/Feature/Holistic/introspection/defaultTypes/Float/query.gql
-    test/Feature/Holistic/introspection/defaultTypes/ID/query.gql
-    test/Feature/Holistic/introspection/defaultTypes/Int/query.gql
-    test/Feature/Holistic/introspection/defaultTypes/String/query.gql
-    test/Feature/Holistic/introspection/deprecated/enumValue/query.gql
-    test/Feature/Holistic/introspection/deprecated/field/query.gql
-    test/Feature/Holistic/introspection/description/enum/query.gql
-    test/Feature/Holistic/introspection/description/inputObject/query.gql
-    test/Feature/Holistic/introspection/description/object/query.gql
-    test/Feature/Holistic/introspection/description/union/query.gql
-    test/Feature/Holistic/introspection/directives/default/query.gql
-    test/Feature/Holistic/introspection/interface/query.gql
-    test/Feature/Holistic/introspection/kinds/ENUM/query.gql
-    test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/query.gql
-    test/Feature/Holistic/introspection/kinds/OBJECT/query.gql
-    test/Feature/Holistic/introspection/kinds/SCALAR/query.gql
-    test/Feature/Holistic/introspection/kinds/UNION/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__Directive/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__EnumValue/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__Field/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__InputValue/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__Schema/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__Type/query.gql
-    test/Feature/Holistic/introspection/schemaTypes/__TypeKind/query.gql
-    test/Feature/Holistic/namespace/enum-fail-on-fullname/query.gql
-    test/Feature/Holistic/namespace/enum/query.gql
-    test/Feature/Holistic/parsing/AnonymousOperation/mutation/query.gql
-    test/Feature/Holistic/parsing/AnonymousOperation/query/query.gql
-    test/Feature/Holistic/parsing/AnonymousOperation/subscription/query.gql
-    test/Feature/Holistic/parsing/complex/query.gql
-    test/Feature/Holistic/parsing/directive/notOnArgument/query.gql
-    test/Feature/Holistic/parsing/directive/notOnVariable/query.gql
-    test/Feature/Holistic/parsing/directive/operation/query.gql
-    test/Feature/Holistic/parsing/directive/selection/query.gql
-    test/Feature/Holistic/parsing/duplicatedFields/query.gql
-    test/Feature/Holistic/parsing/extraCommas/query.gql
-    test/Feature/Holistic/parsing/generousSpaces/query.gql
-    test/Feature/Holistic/parsing/inputListValues/query.gql
-    test/Feature/Holistic/parsing/invalidFields/query.gql
-    test/Feature/Holistic/parsing/invalidNotNullOperator/query.gql
-    test/Feature/Holistic/parsing/missingCloseBrace/query.gql
-    test/Feature/Holistic/parsing/notNullSpacing/query.gql
-    test/Feature/Holistic/parsing/numbers/query.gql
-    test/Feature/Holistic/parsing/singleLineComments/query.gql
-    test/Feature/Holistic/reservedNames/query.gql
+    test/Feature/Collision/category-collision-fail/query.gql
+    test/Feature/Collision/category-collision-success/query.gql
+    test/Feature/Collision/name-collision/query.gql
+    test/Feature/Holistic/holistic/arguments/nameConflict/query.gql
+    test/Feature/Holistic/holistic/arguments/undefinedArgument/query.gql
+    test/Feature/Holistic/holistic/arguments/unknownArguments/query.gql
+    test/Feature/Holistic/holistic/failure/resolveFailure/query.gql
+    test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/query.gql
+    test/Feature/Holistic/holistic/fragment/conditionTypeViolation/query.gql
+    test/Feature/Holistic/holistic/fragment/inlineFragment/query.gql
+    test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/query.gql
+    test/Feature/Holistic/holistic/fragment/loopingFragment/query.gql
+    test/Feature/Holistic/holistic/fragment/nameCollision/query.gql
+    test/Feature/Holistic/holistic/fragment/unknownConditionType/query.gql
+    test/Feature/Holistic/holistic/fragment/unknownTargetType/query.gql
+    test/Feature/Holistic/holistic/fragment/unusedFragment/query.gql
+    test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/query.gql
+    test/Feature/Holistic/holistic/introspection/defaultTypes/Float/query.gql
+    test/Feature/Holistic/holistic/introspection/defaultTypes/ID/query.gql
+    test/Feature/Holistic/holistic/introspection/defaultTypes/Int/query.gql
+    test/Feature/Holistic/holistic/introspection/defaultTypes/String/query.gql
+    test/Feature/Holistic/holistic/introspection/deprecated/enumValue/query.gql
+    test/Feature/Holistic/holistic/introspection/deprecated/field/query.gql
+    test/Feature/Holistic/holistic/introspection/description/enum/query.gql
+    test/Feature/Holistic/holistic/introspection/description/inputObject/query.gql
+    test/Feature/Holistic/holistic/introspection/description/object/query.gql
+    test/Feature/Holistic/holistic/introspection/description/union/query.gql
+    test/Feature/Holistic/holistic/introspection/directives/default/query.gql
+    test/Feature/Holistic/holistic/introspection/interface/query.gql
+    test/Feature/Holistic/holistic/introspection/kinds/ENUM/query.gql
+    test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/query.gql
+    test/Feature/Holistic/holistic/introspection/kinds/OBJECT/query.gql
+    test/Feature/Holistic/holistic/introspection/kinds/SCALAR/query.gql
+    test/Feature/Holistic/holistic/introspection/kinds/UNION/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/query.gql
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/query.gql
+    test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/query.gql
+    test/Feature/Holistic/holistic/namespace/enum/query.gql
+    test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/query.gql
+    test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/query.gql
+    test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/query.gql
+    test/Feature/Holistic/holistic/parsing/complex/query.gql
+    test/Feature/Holistic/holistic/parsing/directive/notOnArgument/query.gql
+    test/Feature/Holistic/holistic/parsing/directive/notOnVariable/query.gql
+    test/Feature/Holistic/holistic/parsing/directive/operation/query.gql
+    test/Feature/Holistic/holistic/parsing/directive/selection/query.gql
+    test/Feature/Holistic/holistic/parsing/duplicatedFields/query.gql
+    test/Feature/Holistic/holistic/parsing/extraCommas/query.gql
+    test/Feature/Holistic/holistic/parsing/generousSpaces/query.gql
+    test/Feature/Holistic/holistic/parsing/inputListValues/query.gql
+    test/Feature/Holistic/holistic/parsing/invalidFields/query.gql
+    test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/query.gql
+    test/Feature/Holistic/holistic/parsing/missingCloseBrace/query.gql
+    test/Feature/Holistic/holistic/parsing/notNullSpacing/query.gql
+    test/Feature/Holistic/holistic/parsing/numbers/query.gql
+    test/Feature/Holistic/holistic/parsing/singleLineComments/query.gql
+    test/Feature/Holistic/holistic/reservedNames/query.gql
+    test/Feature/Holistic/holistic/selection/__typename/query.gql
+    test/Feature/Holistic/holistic/selection/AliasResolve/query.gql
+    test/Feature/Holistic/holistic/selection/AliasUnknownField/query.gql
+    test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/query.gql
+    test/Feature/Holistic/holistic/selection/directives/default/resolve/query.gql
+    test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/query.gql
+    test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/query.gql
+    test/Feature/Holistic/holistic/selection/directives/default/withMerge/query.gql
+    test/Feature/Holistic/holistic/selection/directives/default/withVariable/query.gql
+    test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/query.gql
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/query.gql
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/query.gql
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/query.gql
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/query.gql
+    test/Feature/Holistic/holistic/selection/hasNoSubFields/query.gql
+    test/Feature/Holistic/holistic/selection/mergeConflict/alias/query.gql
+    test/Feature/Holistic/holistic/selection/mergeConflict/arguments/query.gql
+    test/Feature/Holistic/holistic/selection/mergeConflict/union/query.gql
+    test/Feature/Holistic/holistic/selection/mergeSelection/query.gql
+    test/Feature/Holistic/holistic/selection/mergeUnionSelection/query.gql
+    test/Feature/Holistic/holistic/selection/mustHaveSubFields/query.gql
+    test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/query.gql
+    test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql
+    test/Feature/Holistic/holistic/selection/unknownField/query.gql
     test/Feature/Holistic/schema-ext.gql
     test/Feature/Holistic/schema.gql
-    test/Feature/Holistic/selection/__typename/query.gql
-    test/Feature/Holistic/selection/AliasResolve/query.gql
-    test/Feature/Holistic/selection/AliasUnknownField/query.gql
-    test/Feature/Holistic/selection/directives/default/requiredArgument/query.gql
-    test/Feature/Holistic/selection/directives/default/resolve/query.gql
-    test/Feature/Holistic/selection/directives/default/resolve_and_merge/query.gql
-    test/Feature/Holistic/selection/directives/default/variablesOnFragment/query.gql
-    test/Feature/Holistic/selection/directives/default/withMerge/query.gql
-    test/Feature/Holistic/selection/directives/default/withVariable/query.gql
-    test/Feature/Holistic/selection/directives/default/wrongArgumentType/query.gql
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/field/query.gql
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/query.gql
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/query/query.gql
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/query.gql
-    test/Feature/Holistic/selection/hasNoSubFields/query.gql
-    test/Feature/Holistic/selection/mergeConflict/alias/query.gql
-    test/Feature/Holistic/selection/mergeConflict/arguments/query.gql
-    test/Feature/Holistic/selection/mergeConflict/union/query.gql
-    test/Feature/Holistic/selection/mergeSelection/query.gql
-    test/Feature/Holistic/selection/mergeUnionSelection/query.gql
-    test/Feature/Holistic/selection/mustHaveSubFields/query.gql
-    test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/query.gql
-    test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql
-    test/Feature/Holistic/selection/unknownField/query.gql
-    test/Feature/Input/DefaultValue/intorspection/arguments/query.gql
-    test/Feature/Input/DefaultValue/intorspection/input-compound/query.gql
-    test/Feature/Input/DefaultValue/intorspection/input-simple/query.gql
-    test/Feature/Input/DefaultValue/resolving/compound/query.gql
-    test/Feature/Input/DefaultValue/resolving/simple/query.gql
-    test/Feature/Input/DefaultValue/schema.gql
-    test/Feature/Input/Enum/decode2Con/query.gql
-    test/Feature/Input/Enum/decode3Con/query.gql
-    test/Feature/Input/Enum/decodeInvalidValue/query.gql
-    test/Feature/Input/Enum/decodeMany/con0/query.gql
-    test/Feature/Input/Enum/decodeMany/con1/query.gql
-    test/Feature/Input/Enum/decodeMany/con2/query.gql
-    test/Feature/Input/Enum/decodeMany/con3/query.gql
-    test/Feature/Input/Enum/decodeMany/con4/query.gql
-    test/Feature/Input/Enum/decodeMany/con5/query.gql
-    test/Feature/Input/Enum/decodeMany/con6/query.gql
-    test/Feature/Input/Enum/invalidEnumFromJSONVariable/query.gql
-    test/Feature/Input/Enum/invalidStringDefaultValue/query.gql
-    test/Feature/Input/Enum/invalidStringInput/query.gql
-    test/Feature/Input/Enum/validEnumFromJSONVariable/query.gql
-    test/Feature/Input/Object/nullableUndefinedField/query.gql
-    test/Feature/Input/Object/resolveObject/query.gql
-    test/Feature/Input/Object/resolveVariable/query.gql
-    test/Feature/Input/Object/undefinedField/query.gql
-    test/Feature/Input/Object/unexpectedValue/query.gql
-    test/Feature/Input/Object/unexpectedVariable/query.gql
-    test/Feature/Input/Object/unknownField/query.gql
-    test/Feature/Input/Scalar/numbers/decodeFloat/query.gql
-    test/Feature/Input/Scalar/numbers/decodeInt/query.gql
-    test/Feature/Input/Scalar/strings/block/query.gql
-    test/Feature/Input/Scalar/strings/escaped/query.gql
-    test/Feature/Input/Scalar/strings/regular/query.gql
-    test/Feature/Input/Scalar/strings/wrong-escaped/query.gql
-    test/Feature/Input/Scalar/strings/wrong-newline/query.gql
-    test/Feature/InputType/variables/incompatibleType/equalType/query.gql
-    test/Feature/InputType/variables/incompatibleType/stricterType/query.gql
-    test/Feature/InputType/variables/incompatibleType/weakerType1/query.gql
-    test/Feature/InputType/variables/incompatibleType/weakerType2/query.gql
-    test/Feature/InputType/variables/incompatibleType/weakerType3/query.gql
-    test/Feature/InputType/variables/invalidValue/invalidDefaultValue/query.gql
-    test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql
-    test/Feature/InputType/variables/invalidValue/invalidListVariable/query.gql
-    test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql
-    test/Feature/InputType/variables/nameCollision/query.gql
-    test/Feature/InputType/variables/nestedListNullableListReceivedNull/query.gql
-    test/Feature/InputType/variables/nonInputTypeViolation/query.gql
-    test/Feature/InputType/variables/undefinedVariable/query.gql
-    test/Feature/InputType/variables/unknownType/query.gql
-    test/Feature/InputType/variables/unusedVariable/unusedVariables/query.gql
-    test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/query.gql
-    test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/query.gql
-    test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/query.gql
-    test/Feature/InputType/variables/validListVariable/query.gql
-    test/Feature/InputType/variables/valueNotProvided/nonNullVariable/query.gql
-    test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql
-    test/Feature/InputType/variables/valueNotProvided/nullableVariable/query.gql
-    test/Feature/Schema/nameCollision/query.gql
-    test/Feature/TypeCategoryCollision/Fail/failOnColision/query.gql
-    test/Feature/TypeCategoryCollision/Success/prefixed/query.gql
-    test/Feature/TypeInference/introspection/enum/query.gql
-    test/Feature/TypeInference/introspection/input-union/empty/query.gql
-    test/Feature/TypeInference/introspection/input-union/input-union/query.gql
-    test/Feature/TypeInference/introspection/inputObject/query.gql
-    test/Feature/TypeInference/introspection/object/query.gql
-    test/Feature/TypeInference/introspection/union/named-products/query.gql
-    test/Feature/TypeInference/introspection/union/nullary-constructors/query.gql
-    test/Feature/TypeInference/introspection/union/positional-products/query.gql
-    test/Feature/TypeInference/introspection/union/scalars/query.gql
-    test/Feature/TypeInference/introspection/union/union/query.gql
-    test/Feature/TypeInference/resolving/complexUnion/query.gql
-    test/Feature/TypeInference/resolving/input/fail/query.gql
-    test/Feature/TypeInference/resolving/input/success/query.gql
-    test/Feature/TypeInference/resolving/object/query.gql
-    test/Feature/UnionType/cannotBeSpreadOnType/query.gql
-    test/Feature/UnionType/fragmentOnAAndB/query.gql
-    test/Feature/UnionType/fragmentOnlyOnA/query.gql
-    test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/query.gql
-    test/Feature/UnionType/inlineFragment/fragmentOnAAndB/query.gql
-    test/Feature/UnionType/selectionWithoutFragmentNotAllowed/query.gql
-    test/Feature/WrappedTypeName/ignoreMutationResolver/query.gql
-    test/Feature/WrappedTypeName/ignoreQueryResolver/query.gql
-    test/Feature/WrappedTypeName/ignoreSubscriptionResolver/query.gql
-    test/Feature/WrappedTypeName/validWrappedTypes/query.gql
+    test/Feature/Inference/tagged-arguments-fail/introspection/query.gql
+    test/Feature/Inference/tagged-arguments-fail/resolving/query.gql
+    test/Feature/Inference/tagged-arguments/introspection/query.gql
+    test/Feature/Inference/tagged-arguments/resolving/query.gql
+    test/Feature/Inference/type-guards/introspection/interface/query.gql
+    test/Feature/Inference/type-guards/introspection/objects/query.gql
+    test/Feature/Inference/type-guards/resolving/fail/query.gql
+    test/Feature/Inference/type-guards/resolving/success/interface-fields/query.gql
+    test/Feature/Inference/type-guards/resolving/success/type-casting/query.gql
+    test/Feature/Inference/type-inference/introspection/enum/query.gql
+    test/Feature/Inference/type-inference/introspection/input-union/empty/query.gql
+    test/Feature/Inference/type-inference/introspection/input-union/input-union/query.gql
+    test/Feature/Inference/type-inference/introspection/inputObject/query.gql
+    test/Feature/Inference/type-inference/introspection/object/query.gql
+    test/Feature/Inference/type-inference/introspection/union/named-products/query.gql
+    test/Feature/Inference/type-inference/introspection/union/nullary-constructors/query.gql
+    test/Feature/Inference/type-inference/introspection/union/positional-products/query.gql
+    test/Feature/Inference/type-inference/introspection/union/scalars/query.gql
+    test/Feature/Inference/type-inference/introspection/union/union/query.gql
+    test/Feature/Inference/type-inference/resolving/complexUnion/query.gql
+    test/Feature/Inference/type-inference/resolving/input/fail/query.gql
+    test/Feature/Inference/type-inference/resolving/input/success/query.gql
+    test/Feature/Inference/type-inference/resolving/object/query.gql
+    test/Feature/Inference/union-type/cannotBeSpreadOnType/query.gql
+    test/Feature/Inference/union-type/fragmentOnAAndB/query.gql
+    test/Feature/Inference/union-type/fragmentOnlyOnA/query.gql
+    test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/query.gql
+    test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/query.gql
+    test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/query.gql
+    test/Feature/Inference/wrapped-type/ignoreMutationResolver/query.gql
+    test/Feature/Inference/wrapped-type/ignoreQueryResolver/query.gql
+    test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/query.gql
+    test/Feature/Inference/wrapped-type/validWrappedTypes/query.gql
+    test/Feature/Input/default-values-schema.gql
+    test/Feature/Input/default-values/intorspection/arguments/query.gql
+    test/Feature/Input/default-values/intorspection/input-compound/query.gql
+    test/Feature/Input/default-values/intorspection/input-simple/query.gql
+    test/Feature/Input/default-values/resolving/compound/query.gql
+    test/Feature/Input/default-values/resolving/simple/query.gql
+    test/Feature/Input/enums/decode2Con/query.gql
+    test/Feature/Input/enums/decode3Con/query.gql
+    test/Feature/Input/enums/decodeInvalidValue/query.gql
+    test/Feature/Input/enums/decodeMany/con0/query.gql
+    test/Feature/Input/enums/decodeMany/con1/query.gql
+    test/Feature/Input/enums/decodeMany/con2/query.gql
+    test/Feature/Input/enums/decodeMany/con3/query.gql
+    test/Feature/Input/enums/decodeMany/con4/query.gql
+    test/Feature/Input/enums/decodeMany/con5/query.gql
+    test/Feature/Input/enums/decodeMany/con6/query.gql
+    test/Feature/Input/enums/invalidEnumFromJSONVariable/query.gql
+    test/Feature/Input/enums/invalidStringDefaultValue/query.gql
+    test/Feature/Input/enums/invalidStringInput/query.gql
+    test/Feature/Input/enums/validEnumFromJSONVariable/query.gql
+    test/Feature/Input/objects/nullableUndefinedField/query.gql
+    test/Feature/Input/objects/resolveObject/query.gql
+    test/Feature/Input/objects/resolveVariable/query.gql
+    test/Feature/Input/objects/undefinedField/query.gql
+    test/Feature/Input/objects/unexpectedValue/query.gql
+    test/Feature/Input/objects/unexpectedVariable/query.gql
+    test/Feature/Input/objects/unknownField/query.gql
+    test/Feature/Input/scalars/numbers/decodeFloat/query.gql
+    test/Feature/Input/scalars/numbers/decodeInt/query.gql
+    test/Feature/Input/scalars/strings/block/query.gql
+    test/Feature/Input/scalars/strings/escaped/query.gql
+    test/Feature/Input/scalars/strings/regular/query.gql
+    test/Feature/Input/scalars/strings/wrong-escaped/query.gql
+    test/Feature/Input/scalars/strings/wrong-newline/query.gql
+    test/Feature/Input/variables/incompatibleType/equalType/query.gql
+    test/Feature/Input/variables/incompatibleType/stricterType/query.gql
+    test/Feature/Input/variables/incompatibleType/weakerType1/query.gql
+    test/Feature/Input/variables/incompatibleType/weakerType2/query.gql
+    test/Feature/Input/variables/incompatibleType/weakerType3/query.gql
+    test/Feature/Input/variables/invalidValue/invalidDefaultValue/query.gql
+    test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql
+    test/Feature/Input/variables/invalidValue/invalidListVariable/query.gql
+    test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql
+    test/Feature/Input/variables/nameCollision/query.gql
+    test/Feature/Input/variables/nestedListNullableListReceivedNull/query.gql
+    test/Feature/Input/variables/nonInputTypeViolation/query.gql
+    test/Feature/Input/variables/undefinedVariable/query.gql
+    test/Feature/Input/variables/unknownType/query.gql
+    test/Feature/Input/variables/unusedVariable/unusedVariables/query.gql
+    test/Feature/Input/variables/unusedVariable/variableUsedInAlias/query.gql
+    test/Feature/Input/variables/unusedVariable/variableUsedInFragment/query.gql
+    test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/query.gql
+    test/Feature/Input/variables/validListVariable/query.gql
+    test/Feature/Input/variables/valueNotProvided/nonNullVariable/query.gql
+    test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql
+    test/Feature/Input/variables/valueNotProvided/nullableVariable/query.gql
+    test/Feature/NamedResolvers/deities.gql
+    test/Feature/NamedResolvers/realms.gql
+    test/Feature/NamedResolvers/tests/deities-ext/query.gql
+    test/Feature/NamedResolvers/tests/deities/query.gql
+    test/Feature/NamedResolvers/tests/deity-by-id/query.gql
+    test/Feature/NamedResolvers/tests/deity-ext-by-id/query.gql
+    test/Feature/NamedResolvers/tests/deity-simple/query.gql
+    test/Feature/NamedResolvers/tests/entities/query.gql
+    test/Feature/NamedResolvers/tests/entity-by-id/query.gql
+    test/Feature/NamedResolvers/tests/entity-ext-by-id/query.gql
+    test/Feature/NamedResolvers/tests/realm-by-id/query.gql
+    test/Feature/NamedResolvers/tests/realm-ext-by-id/query.gql
+    test/Feature/NamedResolvers/tests/realm-simple/query.gql
+    test/Feature/NamedResolvers/tests/realms/query.gql
     test/Rendering/schema.gql
     test/Subscription/schema.gql
-    test/Feature/Holistic/arguments/nameConflict/response.json
-    test/Feature/Holistic/arguments/undefinedArgument/response.json
-    test/Feature/Holistic/arguments/unknownArguments/response.json
-    test/Feature/Holistic/cases.json
-    test/Feature/Holistic/failure/resolveFailure/response.json
-    test/Feature/Holistic/fragment/cannotBeSpreadOnType/response.json
-    test/Feature/Holistic/fragment/conditionTypeViolation/response.json
-    test/Feature/Holistic/fragment/inlineFragment/response.json
-    test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/response.json
-    test/Feature/Holistic/fragment/loopingFragment/response.json
-    test/Feature/Holistic/fragment/nameCollision/response.json
-    test/Feature/Holistic/fragment/unknownConditionType/response.json
-    test/Feature/Holistic/fragment/unknownTargetType/response.json
-    test/Feature/Holistic/fragment/unusedFragment/response.json
-    test/Feature/Holistic/introspection/defaultTypes/Boolean/response.json
-    test/Feature/Holistic/introspection/defaultTypes/Float/response.json
-    test/Feature/Holistic/introspection/defaultTypes/ID/response.json
-    test/Feature/Holistic/introspection/defaultTypes/Int/response.json
-    test/Feature/Holistic/introspection/defaultTypes/String/response.json
-    test/Feature/Holistic/introspection/deprecated/enumValue/response.json
-    test/Feature/Holistic/introspection/deprecated/field/response.json
-    test/Feature/Holistic/introspection/description/enum/response.json
-    test/Feature/Holistic/introspection/description/inputObject/response.json
-    test/Feature/Holistic/introspection/description/object/response.json
-    test/Feature/Holistic/introspection/description/union/response.json
-    test/Feature/Holistic/introspection/directives/default/response.json
-    test/Feature/Holistic/introspection/interface/response.json
-    test/Feature/Holistic/introspection/kinds/ENUM/response.json
-    test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/response.json
-    test/Feature/Holistic/introspection/kinds/OBJECT/response.json
-    test/Feature/Holistic/introspection/kinds/SCALAR/response.json
-    test/Feature/Holistic/introspection/kinds/UNION/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__Directive/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__EnumValue/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__Field/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__InputValue/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__Schema/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__Type/response.json
-    test/Feature/Holistic/introspection/schemaTypes/__TypeKind/response.json
-    test/Feature/Holistic/namespace/enum-fail-on-fullname/response.json
-    test/Feature/Holistic/namespace/enum/response.json
-    test/Feature/Holistic/parsing/AnonymousOperation/mutation/response.json
-    test/Feature/Holistic/parsing/AnonymousOperation/query/response.json
-    test/Feature/Holistic/parsing/AnonymousOperation/subscription/response.json
-    test/Feature/Holistic/parsing/complex/response.json
-    test/Feature/Holistic/parsing/directive/notOnArgument/response.json
-    test/Feature/Holistic/parsing/directive/notOnVariable/response.json
-    test/Feature/Holistic/parsing/directive/operation/response.json
-    test/Feature/Holistic/parsing/directive/selection/response.json
-    test/Feature/Holistic/parsing/duplicatedFields/response.json
-    test/Feature/Holistic/parsing/extraCommas/response.json
-    test/Feature/Holistic/parsing/generousSpaces/response.json
-    test/Feature/Holistic/parsing/inputListValues/response.json
-    test/Feature/Holistic/parsing/inputListValues/variables.json
-    test/Feature/Holistic/parsing/invalidFields/response.json
-    test/Feature/Holistic/parsing/invalidNotNullOperator/response.json
-    test/Feature/Holistic/parsing/missingCloseBrace/response.json
-    test/Feature/Holistic/parsing/notNullSpacing/response.json
-    test/Feature/Holistic/parsing/notNullSpacing/variables.json
-    test/Feature/Holistic/parsing/numbers/response.json
-    test/Feature/Holistic/parsing/singleLineComments/response.json
-    test/Feature/Holistic/reservedNames/response.json
-    test/Feature/Holistic/selection/__typename/response.json
-    test/Feature/Holistic/selection/AliasResolve/response.json
-    test/Feature/Holistic/selection/AliasUnknownField/response.json
-    test/Feature/Holistic/selection/directives/default/requiredArgument/response.json
-    test/Feature/Holistic/selection/directives/default/resolve/response.json
-    test/Feature/Holistic/selection/directives/default/resolve_and_merge/response.json
-    test/Feature/Holistic/selection/directives/default/variablesOnFragment/response.json
-    test/Feature/Holistic/selection/directives/default/withMerge/response.json
-    test/Feature/Holistic/selection/directives/default/withVariable/response.json
-    test/Feature/Holistic/selection/directives/default/wrongArgumentType/response.json
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/field/response.json
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/response.json
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/query/response.json
-    test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/response.json
-    test/Feature/Holistic/selection/hasNoSubFields/response.json
-    test/Feature/Holistic/selection/mergeConflict/alias/response.json
-    test/Feature/Holistic/selection/mergeConflict/arguments/response.json
-    test/Feature/Holistic/selection/mergeConflict/union/response.json
-    test/Feature/Holistic/selection/mergeSelection/response.json
-    test/Feature/Holistic/selection/mergeUnionSelection/response.json
-    test/Feature/Holistic/selection/mustHaveSubFields/response.json
-    test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/response.json
-    test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json
-    test/Feature/Holistic/selection/unknownField/response.json
-    test/Feature/Input/DefaultValue/cases.json
-    test/Feature/Input/DefaultValue/intorspection/arguments/response.json
-    test/Feature/Input/DefaultValue/intorspection/input-compound/response.json
-    test/Feature/Input/DefaultValue/intorspection/input-simple/response.json
-    test/Feature/Input/DefaultValue/resolving/compound/response.json
-    test/Feature/Input/DefaultValue/resolving/simple/response.json
-    test/Feature/Input/Enum/cases.json
-    test/Feature/Input/Enum/decode2Con/response.json
-    test/Feature/Input/Enum/decode3Con/response.json
-    test/Feature/Input/Enum/decodeInvalidValue/response.json
-    test/Feature/Input/Enum/decodeMany/con0/response.json
-    test/Feature/Input/Enum/decodeMany/con1/response.json
-    test/Feature/Input/Enum/decodeMany/con2/response.json
-    test/Feature/Input/Enum/decodeMany/con3/response.json
-    test/Feature/Input/Enum/decodeMany/con4/response.json
-    test/Feature/Input/Enum/decodeMany/con5/response.json
-    test/Feature/Input/Enum/decodeMany/con6/response.json
-    test/Feature/Input/Enum/invalidEnumFromJSONVariable/response.json
-    test/Feature/Input/Enum/invalidEnumFromJSONVariable/variables.json
-    test/Feature/Input/Enum/invalidStringDefaultValue/response.json
-    test/Feature/Input/Enum/invalidStringInput/response.json
-    test/Feature/Input/Enum/validEnumFromJSONVariable/response.json
-    test/Feature/Input/Enum/validEnumFromJSONVariable/variables.json
-    test/Feature/Input/Object/cases.json
-    test/Feature/Input/Object/nullableUndefinedField/response.json
-    test/Feature/Input/Object/resolveObject/response.json
-    test/Feature/Input/Object/resolveVariable/response.json
-    test/Feature/Input/Object/resolveVariable/variables.json
-    test/Feature/Input/Object/undefinedField/response.json
-    test/Feature/Input/Object/unexpectedValue/response.json
-    test/Feature/Input/Object/unexpectedVariable/response.json
-    test/Feature/Input/Object/unknownField/response.json
-    test/Feature/Input/Scalar/cases.json
-    test/Feature/Input/Scalar/numbers/decodeFloat/response.json
-    test/Feature/Input/Scalar/numbers/decodeInt/response.json
-    test/Feature/Input/Scalar/strings/block/response.json
-    test/Feature/Input/Scalar/strings/escaped/response.json
-    test/Feature/Input/Scalar/strings/regular/response.json
-    test/Feature/Input/Scalar/strings/wrong-escaped/response.json
-    test/Feature/Input/Scalar/strings/wrong-newline/response.json
-    test/Feature/InputType/cases.json
-    test/Feature/InputType/variables/incompatibleType/equalType/response.json
-    test/Feature/InputType/variables/incompatibleType/equalType/variables.json
-    test/Feature/InputType/variables/incompatibleType/stricterType/response.json
-    test/Feature/InputType/variables/incompatibleType/stricterType/variables.json
-    test/Feature/InputType/variables/incompatibleType/weakerType1/response.json
-    test/Feature/InputType/variables/incompatibleType/weakerType1/variables.json
-    test/Feature/InputType/variables/incompatibleType/weakerType2/response.json
-    test/Feature/InputType/variables/incompatibleType/weakerType2/variables.json
-    test/Feature/InputType/variables/incompatibleType/weakerType3/response.json
-    test/Feature/InputType/variables/incompatibleType/weakerType3/variables.json
-    test/Feature/InputType/variables/invalidValue/invalidDefaultValue/response.json
-    test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
-    test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json
-    test/Feature/InputType/variables/invalidValue/invalidListVariable/response.json
-    test/Feature/InputType/variables/invalidValue/invalidListVariable/variables.json
-    test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/response.json
-    test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json
-    test/Feature/InputType/variables/nameCollision/response.json
-    test/Feature/InputType/variables/nameCollision/variables.json
-    test/Feature/InputType/variables/nestedListNullableListReceivedNull/response.json
-    test/Feature/InputType/variables/nestedListNullableListReceivedNull/variables.json
-    test/Feature/InputType/variables/nonInputTypeViolation/response.json
-    test/Feature/InputType/variables/undefinedVariable/response.json
-    test/Feature/InputType/variables/unknownType/response.json
-    test/Feature/InputType/variables/unusedVariable/unusedVariables/response.json
-    test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/response.json
-    test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/variables.json
-    test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/response.json
-    test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/variables.json
-    test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/response.json
-    test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/variables.json
-    test/Feature/InputType/variables/validListVariable/response.json
-    test/Feature/InputType/variables/validListVariable/variables.json
-    test/Feature/InputType/variables/valueNotProvided/nonNullVariable/response.json
-    test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json
-    test/Feature/InputType/variables/valueNotProvided/nullableVariable/response.json
-    test/Feature/Schema/cases.json
-    test/Feature/Schema/nameCollision/response.json
-    test/Feature/TypeCategoryCollision/Fail/cases.json
-    test/Feature/TypeCategoryCollision/Fail/failOnColision/response.json
-    test/Feature/TypeCategoryCollision/Success/cases.json
-    test/Feature/TypeCategoryCollision/Success/prefixed/response.json
-    test/Feature/TypeInference/cases.json
-    test/Feature/TypeInference/introspection/enum/response.json
-    test/Feature/TypeInference/introspection/input-union/empty/response.json
-    test/Feature/TypeInference/introspection/input-union/input-union/response.json
-    test/Feature/TypeInference/introspection/inputObject/response.json
-    test/Feature/TypeInference/introspection/object/response.json
-    test/Feature/TypeInference/introspection/union/named-products/response.json
-    test/Feature/TypeInference/introspection/union/nullary-constructors/response.json
-    test/Feature/TypeInference/introspection/union/positional-products/response.json
-    test/Feature/TypeInference/introspection/union/scalars/response.json
-    test/Feature/TypeInference/introspection/union/union/response.json
-    test/Feature/TypeInference/resolving/complexUnion/response.json
-    test/Feature/TypeInference/resolving/input/fail/response.json
-    test/Feature/TypeInference/resolving/input/success/response.json
-    test/Feature/TypeInference/resolving/object/response.json
-    test/Feature/UnionType/cannotBeSpreadOnType/response.json
-    test/Feature/UnionType/cases.json
-    test/Feature/UnionType/fragmentOnAAndB/response.json
-    test/Feature/UnionType/fragmentOnlyOnA/response.json
-    test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/response.json
-    test/Feature/UnionType/inlineFragment/fragmentOnAAndB/response.json
-    test/Feature/UnionType/selectionWithoutFragmentNotAllowed/response.json
-    test/Feature/WrappedTypeName/cases.json
-    test/Feature/WrappedTypeName/ignoreMutationResolver/response.json
-    test/Feature/WrappedTypeName/ignoreQueryResolver/response.json
-    test/Feature/WrappedTypeName/ignoreSubscriptionResolver/response.json
-    test/Feature/WrappedTypeName/validWrappedTypes/response.json
+    test/Feature/Collision/category-collision-fail/response.json
+    test/Feature/Collision/category-collision-success/response.json
+    test/Feature/Collision/name-collision/response.json
+    test/Feature/Holistic/holistic/arguments/nameConflict/response.json
+    test/Feature/Holistic/holistic/arguments/undefinedArgument/response.json
+    test/Feature/Holistic/holistic/arguments/unknownArguments/response.json
+    test/Feature/Holistic/holistic/failure/resolveFailure/response.json
+    test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/response.json
+    test/Feature/Holistic/holistic/fragment/conditionTypeViolation/response.json
+    test/Feature/Holistic/holistic/fragment/inlineFragment/response.json
+    test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/response.json
+    test/Feature/Holistic/holistic/fragment/loopingFragment/response.json
+    test/Feature/Holistic/holistic/fragment/nameCollision/response.json
+    test/Feature/Holistic/holistic/fragment/unknownConditionType/response.json
+    test/Feature/Holistic/holistic/fragment/unknownTargetType/response.json
+    test/Feature/Holistic/holistic/fragment/unusedFragment/response.json
+    test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/response.json
+    test/Feature/Holistic/holistic/introspection/defaultTypes/Float/response.json
+    test/Feature/Holistic/holistic/introspection/defaultTypes/ID/response.json
+    test/Feature/Holistic/holistic/introspection/defaultTypes/Int/response.json
+    test/Feature/Holistic/holistic/introspection/defaultTypes/String/response.json
+    test/Feature/Holistic/holistic/introspection/deprecated/enumValue/response.json
+    test/Feature/Holistic/holistic/introspection/deprecated/field/response.json
+    test/Feature/Holistic/holistic/introspection/description/enum/response.json
+    test/Feature/Holistic/holistic/introspection/description/inputObject/response.json
+    test/Feature/Holistic/holistic/introspection/description/object/response.json
+    test/Feature/Holistic/holistic/introspection/description/union/response.json
+    test/Feature/Holistic/holistic/introspection/directives/default/response.json
+    test/Feature/Holistic/holistic/introspection/interface/response.json
+    test/Feature/Holistic/holistic/introspection/kinds/ENUM/response.json
+    test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/response.json
+    test/Feature/Holistic/holistic/introspection/kinds/OBJECT/response.json
+    test/Feature/Holistic/holistic/introspection/kinds/SCALAR/response.json
+    test/Feature/Holistic/holistic/introspection/kinds/UNION/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/response.json
+    test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/response.json
+    test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/response.json
+    test/Feature/Holistic/holistic/namespace/enum/response.json
+    test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/response.json
+    test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/response.json
+    test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/response.json
+    test/Feature/Holistic/holistic/parsing/complex/response.json
+    test/Feature/Holistic/holistic/parsing/directive/notOnArgument/response.json
+    test/Feature/Holistic/holistic/parsing/directive/notOnVariable/response.json
+    test/Feature/Holistic/holistic/parsing/directive/operation/response.json
+    test/Feature/Holistic/holistic/parsing/directive/selection/response.json
+    test/Feature/Holistic/holistic/parsing/duplicatedFields/response.json
+    test/Feature/Holistic/holistic/parsing/extraCommas/response.json
+    test/Feature/Holistic/holistic/parsing/generousSpaces/response.json
+    test/Feature/Holistic/holistic/parsing/inputListValues/response.json
+    test/Feature/Holistic/holistic/parsing/inputListValues/variables.json
+    test/Feature/Holistic/holistic/parsing/invalidFields/response.json
+    test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/response.json
+    test/Feature/Holistic/holistic/parsing/missingCloseBrace/response.json
+    test/Feature/Holistic/holistic/parsing/notNullSpacing/response.json
+    test/Feature/Holistic/holistic/parsing/notNullSpacing/variables.json
+    test/Feature/Holistic/holistic/parsing/numbers/response.json
+    test/Feature/Holistic/holistic/parsing/singleLineComments/response.json
+    test/Feature/Holistic/holistic/reservedNames/response.json
+    test/Feature/Holistic/holistic/selection/__typename/response.json
+    test/Feature/Holistic/holistic/selection/AliasResolve/response.json
+    test/Feature/Holistic/holistic/selection/AliasUnknownField/response.json
+    test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/response.json
+    test/Feature/Holistic/holistic/selection/directives/default/resolve/response.json
+    test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/response.json
+    test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/response.json
+    test/Feature/Holistic/holistic/selection/directives/default/withMerge/response.json
+    test/Feature/Holistic/holistic/selection/directives/default/withVariable/response.json
+    test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/response.json
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/response.json
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/response.json
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/response.json
+    test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/response.json
+    test/Feature/Holistic/holistic/selection/hasNoSubFields/response.json
+    test/Feature/Holistic/holistic/selection/mergeConflict/alias/response.json
+    test/Feature/Holistic/holistic/selection/mergeConflict/arguments/response.json
+    test/Feature/Holistic/holistic/selection/mergeConflict/union/response.json
+    test/Feature/Holistic/holistic/selection/mergeSelection/response.json
+    test/Feature/Holistic/holistic/selection/mergeUnionSelection/response.json
+    test/Feature/Holistic/holistic/selection/mustHaveSubFields/response.json
+    test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/response.json
+    test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json
+    test/Feature/Holistic/holistic/selection/unknownField/response.json
+    test/Feature/Inference/tagged-arguments-fail/introspection/response.json
+    test/Feature/Inference/tagged-arguments-fail/resolving/response.json
+    test/Feature/Inference/tagged-arguments/introspection/response.json
+    test/Feature/Inference/tagged-arguments/resolving/response.json
+    test/Feature/Inference/type-guards/introspection/interface/response.json
+    test/Feature/Inference/type-guards/introspection/objects/response.json
+    test/Feature/Inference/type-guards/resolving/fail/response.json
+    test/Feature/Inference/type-guards/resolving/success/interface-fields/response.json
+    test/Feature/Inference/type-guards/resolving/success/type-casting/response.json
+    test/Feature/Inference/type-inference/introspection/enum/response.json
+    test/Feature/Inference/type-inference/introspection/input-union/empty/response.json
+    test/Feature/Inference/type-inference/introspection/input-union/input-union/response.json
+    test/Feature/Inference/type-inference/introspection/inputObject/response.json
+    test/Feature/Inference/type-inference/introspection/object/response.json
+    test/Feature/Inference/type-inference/introspection/union/named-products/response.json
+    test/Feature/Inference/type-inference/introspection/union/nullary-constructors/response.json
+    test/Feature/Inference/type-inference/introspection/union/positional-products/response.json
+    test/Feature/Inference/type-inference/introspection/union/scalars/response.json
+    test/Feature/Inference/type-inference/introspection/union/union/response.json
+    test/Feature/Inference/type-inference/resolving/complexUnion/response.json
+    test/Feature/Inference/type-inference/resolving/input/fail/response.json
+    test/Feature/Inference/type-inference/resolving/input/success/response.json
+    test/Feature/Inference/type-inference/resolving/object/response.json
+    test/Feature/Inference/union-type/cannotBeSpreadOnType/response.json
+    test/Feature/Inference/union-type/fragmentOnAAndB/response.json
+    test/Feature/Inference/union-type/fragmentOnlyOnA/response.json
+    test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/response.json
+    test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/response.json
+    test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/response.json
+    test/Feature/Inference/wrapped-type/ignoreMutationResolver/response.json
+    test/Feature/Inference/wrapped-type/ignoreQueryResolver/response.json
+    test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/response.json
+    test/Feature/Inference/wrapped-type/validWrappedTypes/response.json
+    test/Feature/Input/default-values/intorspection/arguments/response.json
+    test/Feature/Input/default-values/intorspection/input-compound/response.json
+    test/Feature/Input/default-values/intorspection/input-simple/response.json
+    test/Feature/Input/default-values/resolving/compound/response.json
+    test/Feature/Input/default-values/resolving/simple/response.json
+    test/Feature/Input/enums/decode2Con/response.json
+    test/Feature/Input/enums/decode3Con/response.json
+    test/Feature/Input/enums/decodeInvalidValue/response.json
+    test/Feature/Input/enums/decodeMany/con0/response.json
+    test/Feature/Input/enums/decodeMany/con1/response.json
+    test/Feature/Input/enums/decodeMany/con2/response.json
+    test/Feature/Input/enums/decodeMany/con3/response.json
+    test/Feature/Input/enums/decodeMany/con4/response.json
+    test/Feature/Input/enums/decodeMany/con5/response.json
+    test/Feature/Input/enums/decodeMany/con6/response.json
+    test/Feature/Input/enums/invalidEnumFromJSONVariable/response.json
+    test/Feature/Input/enums/invalidEnumFromJSONVariable/variables.json
+    test/Feature/Input/enums/invalidStringDefaultValue/response.json
+    test/Feature/Input/enums/invalidStringInput/response.json
+    test/Feature/Input/enums/validEnumFromJSONVariable/response.json
+    test/Feature/Input/enums/validEnumFromJSONVariable/variables.json
+    test/Feature/Input/objects/nullableUndefinedField/response.json
+    test/Feature/Input/objects/resolveObject/response.json
+    test/Feature/Input/objects/resolveVariable/response.json
+    test/Feature/Input/objects/resolveVariable/variables.json
+    test/Feature/Input/objects/undefinedField/response.json
+    test/Feature/Input/objects/unexpectedValue/response.json
+    test/Feature/Input/objects/unexpectedVariable/response.json
+    test/Feature/Input/objects/unknownField/response.json
+    test/Feature/Input/scalars/numbers/decodeFloat/response.json
+    test/Feature/Input/scalars/numbers/decodeInt/response.json
+    test/Feature/Input/scalars/strings/block/response.json
+    test/Feature/Input/scalars/strings/escaped/response.json
+    test/Feature/Input/scalars/strings/regular/response.json
+    test/Feature/Input/scalars/strings/wrong-escaped/response.json
+    test/Feature/Input/scalars/strings/wrong-newline/response.json
+    test/Feature/Input/variables/incompatibleType/equalType/response.json
+    test/Feature/Input/variables/incompatibleType/equalType/variables.json
+    test/Feature/Input/variables/incompatibleType/stricterType/response.json
+    test/Feature/Input/variables/incompatibleType/stricterType/variables.json
+    test/Feature/Input/variables/incompatibleType/weakerType1/response.json
+    test/Feature/Input/variables/incompatibleType/weakerType1/variables.json
+    test/Feature/Input/variables/incompatibleType/weakerType2/response.json
+    test/Feature/Input/variables/incompatibleType/weakerType2/variables.json
+    test/Feature/Input/variables/incompatibleType/weakerType3/response.json
+    test/Feature/Input/variables/incompatibleType/weakerType3/variables.json
+    test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json
+    test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
+    test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json
+    test/Feature/Input/variables/invalidValue/invalidListVariable/response.json
+    test/Feature/Input/variables/invalidValue/invalidListVariable/variables.json
+    test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/response.json
+    test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json
+    test/Feature/Input/variables/nameCollision/response.json
+    test/Feature/Input/variables/nameCollision/variables.json
+    test/Feature/Input/variables/nestedListNullableListReceivedNull/response.json
+    test/Feature/Input/variables/nestedListNullableListReceivedNull/variables.json
+    test/Feature/Input/variables/nonInputTypeViolation/response.json
+    test/Feature/Input/variables/undefinedVariable/response.json
+    test/Feature/Input/variables/unknownType/response.json
+    test/Feature/Input/variables/unusedVariable/unusedVariables/response.json
+    test/Feature/Input/variables/unusedVariable/variableUsedInAlias/response.json
+    test/Feature/Input/variables/unusedVariable/variableUsedInAlias/variables.json
+    test/Feature/Input/variables/unusedVariable/variableUsedInFragment/response.json
+    test/Feature/Input/variables/unusedVariable/variableUsedInFragment/variables.json
+    test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/response.json
+    test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/variables.json
+    test/Feature/Input/variables/validListVariable/response.json
+    test/Feature/Input/variables/validListVariable/variables.json
+    test/Feature/Input/variables/valueNotProvided/nonNullVariable/response.json
+    test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json
+    test/Feature/Input/variables/valueNotProvided/nullableVariable/response.json
+    test/Feature/NamedResolvers/tests/deities-ext/response.json
+    test/Feature/NamedResolvers/tests/deities/response.json
+    test/Feature/NamedResolvers/tests/deity-by-id/response.json
+    test/Feature/NamedResolvers/tests/deity-ext-by-id/response.json
+    test/Feature/NamedResolvers/tests/deity-simple/response.json
+    test/Feature/NamedResolvers/tests/entities/response.json
+    test/Feature/NamedResolvers/tests/entity-by-id/response.json
+    test/Feature/NamedResolvers/tests/entity-ext-by-id/response.json
+    test/Feature/NamedResolvers/tests/realm-by-id/response.json
+    test/Feature/NamedResolvers/tests/realm-ext-by-id/response.json
+    test/Feature/NamedResolvers/tests/realm-simple/response.json
+    test/Feature/NamedResolvers/tests/realms/response.json
 
 source-repository head
   type: git
@@ -405,6 +437,7 @@
       Data.Morpheus
       Data.Morpheus.Kind
       Data.Morpheus.Types
+      Data.Morpheus.NamedResolvers
       Data.Morpheus.Server
       Data.Morpheus.Document
   other-modules:
@@ -412,22 +445,28 @@
       Data.Morpheus.Server.Deriving.Channels
       Data.Morpheus.Server.Deriving.Decode
       Data.Morpheus.Server.Deriving.Encode
+      Data.Morpheus.Server.Deriving.Named.Encode
+      Data.Morpheus.Server.Deriving.Named.EncodeType
+      Data.Morpheus.Server.Deriving.Named.EncodeValue
       Data.Morpheus.Server.Deriving.Schema
+      Data.Morpheus.Server.Deriving.Schema.Enum
       Data.Morpheus.Server.Deriving.Schema.Internal
+      Data.Morpheus.Server.Deriving.Schema.Object
+      Data.Morpheus.Server.Deriving.Schema.TypeContent
+      Data.Morpheus.Server.Deriving.Schema.Union
       Data.Morpheus.Server.Deriving.Utils
-      Data.Morpheus.Server.Internal.TH.Decode
-      Data.Morpheus.Server.Internal.TH.Types
-      Data.Morpheus.Server.Internal.TH.Utils
+      Data.Morpheus.Server.Deriving.Utils.Decode
+      Data.Morpheus.Server.Deriving.Utils.GTraversable
+      Data.Morpheus.Server.Deriving.Utils.Kinded
       Data.Morpheus.Server.Playground
       Data.Morpheus.Server.TH.Compile
       Data.Morpheus.Server.TH.Declare
       Data.Morpheus.Server.TH.Declare.GQLType
       Data.Morpheus.Server.TH.Declare.Type
-      Data.Morpheus.Server.TH.Transform
+      Data.Morpheus.Server.TH.Utils
       Data.Morpheus.Server.Types.GQLType
       Data.Morpheus.Server.Types.SchemaT
       Data.Morpheus.Server.Types.Types
-      Data.Morpheus.Utils.Kinded
       Paths_morpheus_graphql
   hs-source-dirs:
       src
@@ -437,8 +476,9 @@
     , base >=4.7 && <5
     , bytestring >=0.10.4 && <0.11
     , containers >=0.4.2.1 && <0.7
-    , morpheus-graphql-app >=0.17.0 && <0.18.0
-    , morpheus-graphql-core >=0.17.0 && <0.18.0
+    , morpheus-graphql-app >=0.18.0 && <0.19.0
+    , morpheus-graphql-code-gen >=0.18.0 && <0.19.0
+    , morpheus-graphql-core >=0.18.0 && <0.19.0
     , mtl >=2.0 && <=3.0
     , relude >=0.3.0
     , template-haskell >=2.0 && <=3.0
@@ -448,24 +488,30 @@
     , vector >=0.12.0.1 && <0.13
   default-language: Haskell2010
 
-test-suite morpheus-test
+test-suite morpheus-graphql-test
   type: exitcode-stdio-1.0
   main-is: Spec.hs
   other-modules:
+      Feature.Collision.CategoryCollisionFail
+      Feature.Collision.CategoryCollisionSuccess
+      Feature.Collision.NameCollision
+      Feature.Collision.NameCollisionHelper
       Feature.Holistic.API
-      Feature.Input.DefaultValue.API
-      Feature.Input.Enum.API
-      Feature.Input.Object.API
-      Feature.Input.Scalar.API
-      Feature.InputType.API
-      Feature.Schema.A2
-      Feature.Schema.API
-      Feature.TypeCategoryCollision.Fail.API
-      Feature.TypeCategoryCollision.Success.API
-      Feature.TypeInference.API
-      Feature.UnionType.API
-      Feature.WrappedTypeName.API
-      Lib
+      Feature.Inference.TaggedArguments
+      Feature.Inference.TaggedArgumentsFail
+      Feature.Inference.TypeGuards
+      Feature.Inference.TypeInference
+      Feature.Inference.UnionType
+      Feature.Inference.WrappedType
+      Feature.Input.DefaultValues
+      Feature.Input.Enums
+      Feature.Input.Objects
+      Feature.Input.Scalars
+      Feature.Input.Variables
+      Feature.NamedResolvers.API
+      Feature.NamedResolvers.Deities
+      Feature.NamedResolvers.Entities
+      Feature.NamedResolvers.Realms
       Rendering.Schema
       Rendering.TestSchemaRendering
       Subscription.API
@@ -473,8 +519,6 @@
       Subscription.Case.Publishing
       Subscription.Test
       Subscription.Utils
-      TestFeature
-      Types
       Paths_morpheus_graphql
   hs-source-dirs:
       test
@@ -485,9 +529,11 @@
     , bytestring >=0.10.4 && <0.11
     , containers >=0.4.2.1 && <0.7
     , morpheus-graphql
-    , morpheus-graphql-app >=0.17.0 && <0.18.0
-    , morpheus-graphql-core >=0.17.0 && <0.18.0
-    , morpheus-graphql-subscriptions >=0.17.0 && <0.18.0
+    , morpheus-graphql-app >=0.18.0 && <0.19.0
+    , morpheus-graphql-code-gen >=0.18.0 && <0.19.0
+    , morpheus-graphql-core >=0.18.0 && <0.19.0
+    , morpheus-graphql-subscriptions >=0.18.0 && <0.19.0
+    , morpheus-graphql-tests >=0.18.0 && <0.19.0
     , mtl >=2.0 && <=3.0
     , relude >=0.3.0
     , tasty
diff --git a/src/Data/Morpheus/Document.hs b/src/Data/Morpheus/Document.hs
--- a/src/Data/Morpheus/Document.hs
+++ b/src/Data/Morpheus/Document.hs
@@ -12,20 +12,14 @@
 
 import Data.ByteString.Lazy.Char8
   ( ByteString,
-    pack,
-  )
-import Data.Morpheus.App.Internal.Resolving
-  ( resultOr,
+    readFile,
   )
-import Data.Morpheus.Core
-  ( render,
+import Data.Morpheus.CodeGen.Internal.AST
+  ( CodeGenConfig (..),
   )
-import Data.Morpheus.Server.Deriving.App
+import Data.Morpheus.Server
   ( RootResolverConstraint,
-    deriveSchema,
-  )
-import Data.Morpheus.Server.Internal.TH.Types
-  ( ServerDecContext (..),
+    printSchema,
   )
 import Data.Morpheus.Server.TH.Compile
   ( compileDocument,
@@ -36,31 +30,25 @@
 import Language.Haskell.TH.Syntax
   ( qAddDependentFile,
   )
-import Relude hiding (ByteString)
+import Relude hiding (ByteString, readFile)
 
-importGQLDocument :: FilePath -> Q [Dec]
-importGQLDocument src = do
+importDeclarations :: CodeGenConfig -> FilePath -> Q [Dec]
+importDeclarations ctx src = do
   qAddDependentFile src
   runIO (readFile src)
-    >>= compileDocument
-      ServerDecContext
-        { namespace = False
-        }
+    >>= compileDocument ctx
 
+importGQLDocument :: FilePath -> Q [Dec]
+importGQLDocument =
+  importDeclarations CodeGenConfig {namespace = False}
+
 importGQLDocumentWithNamespace :: FilePath -> Q [Dec]
-importGQLDocumentWithNamespace src = do
-  qAddDependentFile src
-  runIO (readFile src)
-    >>= compileDocument
-      ServerDecContext
-        { namespace = True
-        }
+importGQLDocumentWithNamespace =
+  importDeclarations CodeGenConfig {namespace = True}
 
--- | Generates schema.gql file from 'RootResolver'
+{-# DEPRECATED toGraphQLDocument "use Data.Morpheus.Server.printSchema" #-}
 toGraphQLDocument ::
   RootResolverConstraint m event query mut sub =>
   proxy (RootResolver m event query mut sub) ->
   ByteString
-toGraphQLDocument =
-  resultOr (pack . show) render
-    . deriveSchema
+toGraphQLDocument = printSchema
diff --git a/src/Data/Morpheus/Kind.hs b/src/Data/Morpheus/Kind.hs
--- a/src/Data/Morpheus/Kind.hs
+++ b/src/Data/Morpheus/Kind.hs
@@ -11,13 +11,11 @@
     WRAPPER,
     UNION,
     INPUT_OBJECT,
-    DerivingKind,
+    DerivingKind (..),
     GQL_KIND,
     OUTPUT,
     INPUT,
     INTERFACE,
-    ToValue (..),
-    isObject,
     TYPE,
     CUSTOM,
   )
@@ -33,31 +31,8 @@
   = SCALAR
   | TYPE
   | WRAPPER
-  | INTERFACE
   | CUSTOM
-
-class ToValue (a :: DerivingKind) where
-  toValue :: f a -> DerivingKind
-
-instance ToValue 'SCALAR where
-  toValue _ = SCALAR
-
-instance ToValue 'WRAPPER where
-  toValue _ = WRAPPER
-
-instance ToValue 'TYPE where
-  toValue _ = TYPE
-
-instance ToValue 'INTERFACE where
-  toValue _ = INTERFACE
-
-instance ToValue 'CUSTOM where
-  toValue _ = CUSTOM
-
-isObject :: DerivingKind -> Bool
-isObject TYPE = True
-isObject INTERFACE = True
-isObject _ = False
+  deriving (Show)
 
 -- | GraphQL input, type, union , enum
 type TYPE = 'TYPE
@@ -65,15 +40,16 @@
 -- | GraphQL Scalar: Int, Float, String, Boolean or any user defined custom Scalar type
 type SCALAR = 'SCALAR
 
--- | GraphQL interface
-type INTERFACE = 'INTERFACE
-
 -- | GraphQL Arrays , Resolvers and NonNull fields
 type WRAPPER = 'WRAPPER
 
 type CUSTOM = 'CUSTOM
 
 -- deprecated types
+
+{-# DEPRECATED INTERFACE "use: deriving(GQLType), will be automatically inferred" #-}
+
+type INTERFACE = 'TYPE
 
 {-# DEPRECATED ENUM "use: deriving(GQLType), will be automatically inferred" #-}
 
diff --git a/src/Data/Morpheus/NamedResolvers.hs b/src/Data/Morpheus/NamedResolvers.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/NamedResolvers.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.NamedResolvers
+  ( ResolveNamed (..),
+    NamedResolverT (..),
+    resolve,
+  )
+where
+
+import Data.Aeson (ToJSON)
+import Data.Morpheus.Types.ID (ID)
+import Relude
+
+instance Monad m => ResolveNamed m ID where
+  type Dep ID = ID
+  resolveNamed = pure
+
+instance Monad m => ResolveNamed m Text where
+  type Dep Text = Text
+  resolveNamed = pure
+
+class (ToJSON (Dep a)) => ResolveNamed (m :: * -> *) a where
+  type Dep a :: *
+  resolveNamed :: Monad m => Dep a -> m a
+
+instance (ResolveNamed m a) => ResolveNamed (m :: * -> *) (Maybe a) where
+  type Dep (Maybe a) = Maybe (Dep a)
+  resolveNamed (Just x) = Just <$> resolveNamed x
+  resolveNamed Nothing = pure Nothing
+
+instance (ResolveNamed m a) => ResolveNamed (m :: * -> *) [a] where
+  type Dep [a] = [Dep a]
+  resolveNamed = traverse resolveNamed
+
+data NamedResolverT (m :: * -> *) a where
+  Ref :: ResolveNamed m a => m (Dep a) -> NamedResolverT m a
+  Refs :: ResolveNamed m a => m [Dep a] -> NamedResolverT m [a]
+  Value :: m a -> NamedResolverT m a
+
+-- RESOLVER TYPES
+data RES = VALUE | LIST | REF
+
+type family RES_TYPE a b :: RES where
+  RES_TYPE a a = 'VALUE
+  RES_TYPE [a] [b] = 'LIST
+  RES_TYPE a b = 'REF
+
+resolve :: forall m a b. (ResolveByType (RES_TYPE a b) m a b) => Monad m => m a -> NamedResolverT m b
+resolve = resolveByType (Proxy :: Proxy (RES_TYPE a b))
+
+class Dep b ~ a => ResolveByType (k :: RES) m a b where
+  resolveByType :: Monad m => f k -> m a -> NamedResolverT m b
+
+instance (ResolveNamed m a, Dep a ~ a) => ResolveByType 'VALUE m a a where
+  resolveByType _ = Value
+
+instance (ResolveNamed m b, Dep b ~ a) => ResolveByType 'LIST m [a] [b] where
+  resolveByType _ = Refs
+
+instance (ResolveNamed m b, Dep b ~ a) => ResolveByType 'REF m a b where
+  resolveByType _ = Ref
diff --git a/src/Data/Morpheus/Server.hs b/src/Data/Morpheus/Server.hs
--- a/src/Data/Morpheus/Server.hs
+++ b/src/Data/Morpheus/Server.hs
@@ -13,12 +13,39 @@
 module Data.Morpheus.Server
   ( httpPlayground,
     compileTimeSchemaValidation,
+    printSchema,
+    RootResolverConstraint,
   )
 where
 
+import Data.ByteString.Lazy.Char8
+  ( ByteString,
+    pack,
+  )
+import Data.Morpheus.App.Internal.Resolving
+  ( resultOr,
+  )
+import Data.Morpheus.Core
+  ( render,
+  )
+import Data.Morpheus.Server.Deriving.App
+  ( RootResolverConstraint,
+    deriveSchema,
+  )
 import Data.Morpheus.Server.Deriving.Schema
   ( compileTimeSchemaValidation,
   )
 import Data.Morpheus.Server.Playground
   ( httpPlayground,
   )
+import Data.Morpheus.Types (RootResolver)
+import Relude hiding (ByteString)
+
+-- | Generates schema.gql file from 'RootResolver'
+printSchema ::
+  RootResolverConstraint m event query mut sub =>
+  proxy (RootResolver m event query mut sub) ->
+  ByteString
+printSchema =
+  resultOr (pack . show) render
+    . deriveSchema
diff --git a/src/Data/Morpheus/Server/Deriving/App.hs b/src/Data/Morpheus/Server/Deriving/App.hs
--- a/src/Data/Morpheus/Server/Deriving/App.hs
+++ b/src/Data/Morpheus/Server/Deriving/App.hs
@@ -1,5 +1,10 @@
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 
 module Data.Morpheus.Server.Deriving.App
@@ -9,10 +14,6 @@
   )
 where
 
--- MORPHEUS
-
-import Control.Monad (Monad)
-import Data.Functor.Identity (Identity (..))
 import Data.Morpheus.App
   ( App (..),
     mkApp,
@@ -24,13 +25,19 @@
   ( EncodeConstraints,
     deriveModel,
   )
+import Data.Morpheus.Server.Deriving.Named.Encode
+  ( EncodeNamedConstraints,
+    deriveNamedModel,
+  )
 import Data.Morpheus.Server.Deriving.Schema
   ( SchemaConstraints,
     deriveSchema,
   )
 import Data.Morpheus.Types
-  ( RootResolver (..),
+  ( NamedResolvers,
+    RootResolver (..),
   )
+import Relude
 
 type RootResolverConstraint m e query mutation subscription =
   ( EncodeConstraints e m query mutation subscription,
@@ -38,12 +45,21 @@
     Monad m
   )
 
-deriveApp ::
-  RootResolverConstraint m event query mut sub =>
-  RootResolver m event query mut sub ->
-  App event m
-deriveApp root =
-  resultOr
-    FailApp
-    (`mkApp` deriveModel root)
-    (deriveSchema (Identity root))
+type NamedResolversConstraint m e query mutation subscription =
+  ( EncodeNamedConstraints e m query mutation subscription,
+    SchemaConstraints e m query mutation subscription,
+    Monad m
+  )
+
+class DeriveApp f m (event :: *) (query :: (* -> *) -> *) (mut :: (* -> *) -> *) (sub :: (* -> *) -> *) where
+  deriveApp :: f m event query mut sub -> App event m
+
+instance RootResolverConstraint m e query mut sub => DeriveApp RootResolver m e query mut sub where
+  deriveApp root =
+    resultOr FailApp (uncurry mkApp) $
+      (,) <$> deriveSchema (Identity root) <*> deriveModel root
+
+instance NamedResolversConstraint m e query mut sub => DeriveApp NamedResolvers m e query mut sub where
+  deriveApp root =
+    resultOr FailApp (uncurry mkApp) $
+      (,deriveNamedModel root) <$> deriveSchema (Identity root)
diff --git a/src/Data/Morpheus/Server/Deriving/Channels.hs b/src/Data/Morpheus/Server/Deriving/Channels.hs
--- a/src/Data/Morpheus/Server/Deriving/Channels.hs
+++ b/src/Data/Morpheus/Server/Deriving/Channels.hs
@@ -16,6 +16,8 @@
   )
 where
 
+import Control.Monad.Except (throwError)
+import qualified Data.HashMap.Lazy as HM
 import Data.Morpheus.App.Internal.Resolving
   ( Channel,
     Resolver,
@@ -23,9 +25,7 @@
     SubscriptionField (..),
   )
 import Data.Morpheus.Internal.Utils
-  ( Failure (..),
-    elems,
-    selectBy,
+  ( selectBy,
   )
 import Data.Morpheus.Server.Deriving.Decode
   ( DecodeConstraint,
@@ -41,13 +41,13 @@
   )
 import Data.Morpheus.Server.Types.GQLType (GQLType)
 import Data.Morpheus.Types.Internal.AST
-  ( FieldName (..),
-    InternalError,
+  ( FieldName,
     OUT,
     SUBSCRIPTION,
     Selection (..),
     SelectionContent (..),
     VALID,
+    internal,
   )
 import GHC.Generics
 import Relude
@@ -75,37 +75,34 @@
     channelSelector = selectBySelection (exploreChannels value)
 
 selectBySelection ::
-  [(FieldName, ChannelRes e)] ->
+  HashMap FieldName (ChannelRes e) ->
   Selection VALID ->
   ResolverState (DerivedChannel e)
 selectBySelection channels = withSubscriptionSelection >=> selectSubscription channels
 
 selectSubscription ::
-  [(FieldName, ChannelRes e)] ->
+  HashMap FieldName (ChannelRes e) ->
   Selection VALID ->
   ResolverState (DerivedChannel e)
 selectSubscription channels sel@Selection {selectionName} =
   selectBy
-    onFail
+    (internal "invalid subscription: no channel is selected.")
     selectionName
     channels
-    >>= onSucc
-  where
-    onFail = "invalid subscription: no channel is selected." :: InternalError
-    onSucc (_, f) = f sel
+    >>= (sel &)
 
 withSubscriptionSelection :: Selection VALID -> ResolverState (Selection VALID)
 withSubscriptionSelection Selection {selectionContent = SelectionSet selSet} =
-  case elems selSet of
+  case toList selSet of
     [sel] -> pure sel
-    _ -> failure ("invalid subscription: there can be only one top level selection" :: InternalError)
-withSubscriptionSelection _ = failure ("invalid subscription: expected selectionSet" :: InternalError)
+    _ -> throwError (internal "invalid subscription: there can be only one top level selection")
+withSubscriptionSelection _ = throwError (internal "invalid subscription: expected selectionSet")
 
 class GetChannel e a | a -> e where
   getChannel :: a -> ChannelRes e
 
 instance GetChannel e (SubscriptionField (Resolver SUBSCRIPTION e m a)) where
-  getChannel = const . pure . DerivedChannel . channel
+  getChannel x = const $ pure $ DerivedChannel $ channel x
 
 instance
   DecodeConstraint arg =>
@@ -123,9 +120,10 @@
     TypeRep (GetChannel e) (ChannelRes e) (Rep a)
   )
 
-exploreChannels :: forall e a. ExploreConstraint e a => a -> [(FieldName, ChannelRes e)]
+exploreChannels :: forall e a. ExploreConstraint e a => a -> HashMap FieldName (ChannelRes e)
 exploreChannels =
-  convertNode
+  HM.fromList
+    . convertNode
     . toValue
       ( TypeConstraint (getChannel . runIdentity) :: TypeConstraint (GetChannel e) (ChannelRes e) Identity
       )
diff --git a/src/Data/Morpheus/Server/Deriving/Decode.hs b/src/Data/Morpheus/Server/Deriving/Decode.hs
--- a/src/Data/Morpheus/Server/Deriving/Decode.hs
+++ b/src/Data/Morpheus/Server/Deriving/Decode.hs
@@ -20,12 +20,13 @@
   )
 where
 
+import Control.Monad.Except (MonadError (throwError))
 import Data.Morpheus.App.Internal.Resolving
-  ( Failure (..),
-    ResolverState,
+  ( ResolverState,
   )
 import Data.Morpheus.Kind
-  ( DerivingKind,
+  ( CUSTOM,
+    DerivingKind,
     SCALAR,
     TYPE,
     WRAPPER,
@@ -34,14 +35,18 @@
   ( conNameProxy,
     datatypeNameProxy,
     selNameProxy,
+    symbolName,
   )
-import Data.Morpheus.Server.Internal.TH.Decode
+import Data.Morpheus.Server.Deriving.Utils.Decode
   ( decodeFieldWith,
     handleEither,
     withInputObject,
     withInputUnion,
     withScalar,
   )
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( KindedProxy (..),
+  )
 import Data.Morpheus.Server.Types.GQLType
   ( GQLType
       ( KIND,
@@ -52,6 +57,7 @@
     __typeData,
     defaultTypeOptions,
   )
+import Data.Morpheus.Server.Types.Types (Arg (Arg))
 import Data.Morpheus.Types.GQLScalar
   ( DecodeScalar (..),
   )
@@ -62,34 +68,28 @@
 import Data.Morpheus.Types.Internal.AST
   ( Argument (..),
     Arguments,
+    GQLError,
     IN,
-    InternalError,
     LEAF,
-    Message,
     Object,
     ObjectEntry (..),
-    TypeName (..),
+    TypeName,
     VALID,
     ValidObject,
     ValidValue,
     Value (..),
+    internal,
     msg,
   )
-import Data.Morpheus.Utils.Kinded
-  ( KindedProxy (..),
-  )
 import GHC.Generics
+import GHC.TypeLits (KnownSymbol)
 import Relude
 
-type DecodeConstraint a =
-  ( Generic a,
-    GQLType a,
-    DecodeRep (Rep a)
-  )
+type DecodeConstraint a = (DecodeKind (KIND a) a)
 
 -- GENERIC
-decodeArguments :: DecodeConstraint a => Arguments VALID -> ResolverState a
-decodeArguments = decodeType . Object . fmap toEntry
+decodeArguments :: forall a. DecodeConstraint a => Arguments VALID -> ResolverState a
+decodeArguments = decodeKind (Proxy @(KIND a)) . Object . fmap toEntry
   where
     toEntry Argument {..} = ObjectEntry argumentName argumentValue
 
@@ -109,23 +109,32 @@
   decodeKind _ = withScalar (gqlTypeName $ __typeData (KindedProxy :: KindedProxy LEAF a)) decodeScalar
 
 -- INPUT_OBJECT and  INPUT_UNION
-instance DecodeConstraint a => DecodeKind TYPE a where
-  decodeKind _ = decodeType
+instance
+  ( Generic a,
+    GQLType a,
+    DecodeRep (Rep a)
+  ) =>
+  DecodeKind TYPE a
+  where
+  decodeKind _ = fmap to . (`runReaderT` context) . decodeRep
+    where
+      context =
+        Context
+          { options = typeOptions (Proxy @a) defaultTypeOptions,
+            contKind = D_CONS,
+            typeName = ""
+          }
 
 instance (Decode a, DecodeWrapperConstraint f a, DecodeWrapper f) => DecodeKind WRAPPER (f a) where
   decodeKind _ value =
     runExceptT (decodeWrapper decode value)
       >>= handleEither
 
-decodeType :: forall a. DecodeConstraint a => ValidValue -> ResolverState a
-decodeType = fmap to . (`runReaderT` context) . decodeRep
-  where
-    context =
-      Context
-        { options = typeOptions (Proxy @a) defaultTypeOptions,
-          contKind = D_CONS,
-          typeName = ""
-        }
+instance (Decode a, KnownSymbol name) => DecodeKind CUSTOM (Arg name a) where
+  decodeKind _ value = Arg <$> withInputObject fieldDecoder value
+    where
+      fieldDecoder = decodeFieldWith decode fieldName
+      fieldName = symbolName (Proxy @name)
 
 -- data Input  =
 --    InputHuman Human  -- direct link: { __typename: Human, Human: {field: ""} }
@@ -136,7 +145,7 @@
 
 decideUnion ::
   ( Functor m,
-    Failure Message m
+    MonadError GQLError m
   ) =>
   ([TypeName], value -> m (f1 a)) ->
   ([TypeName], value -> m (f2 a)) ->
@@ -149,8 +158,9 @@
   | name `elem` right =
     R1 <$> f2 value
   | otherwise =
-    failure $
-      "Constructor \""
+    throwError
+      $ internal
+      $ "Constructor \""
         <> msg name
         <> "\" could not find in Union"
 
@@ -216,10 +226,10 @@
 
 instance (Datatype d, DecodeRep f) => DecodeRep (M1 D d f) where
   tags _ = tags (Proxy @f)
-  decodeRep value =
-    withTypeName
-      (datatypeNameProxy (Proxy @d))
-      (M1 <$> decodeRep value)
+  decodeRep value = do
+    gqlOptions <- asks options
+    let typeName = datatypeNameProxy gqlOptions (Proxy @d)
+    withTypeName typeName (M1 <$> decodeRep value)
 
 instance (DecodeRep a, DecodeRep b) => DecodeRep (a :+: b) where
   tags _ = tags (Proxy @a) <> tags (Proxy @b)
@@ -237,7 +247,7 @@
       (tagName right, decodeRep)
       name
       (Enum name)
-  decodeRep _ = failure ("lists and scalars are not allowed in Union" :: InternalError)
+  decodeRep _ = throwError (internal "lists and scalars are not allowed in Union")
 
 instance (Constructor c, DecodeFields a) => DecodeRep (M1 C c a) where
   decodeRep = fmap M1 . decodeFields
diff --git a/src/Data/Morpheus/Server/Deriving/Encode.hs b/src/Data/Morpheus/Server/Deriving/Encode.hs
--- a/src/Data/Morpheus/Server/Deriving/Encode.hs
+++ b/src/Data/Morpheus/Server/Deriving/Encode.hs
@@ -5,9 +5,9 @@
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE PolyKinds #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE UndecidableInstances #-}
@@ -16,27 +16,31 @@
 module Data.Morpheus.Server.Deriving.Encode
   ( deriveModel,
     EncodeConstraints,
+    ContextValue (..),
   )
 where
 
+import Control.Monad.Except (MonadError)
 import qualified Data.Map as M
 import Data.Morpheus.App.Internal.Resolving
   ( LiftOperation,
+    ObjectTypeResolver,
     Resolver,
-    ResolverEntry,
     ResolverState,
+    ResolverValue,
     ResolverValue (..),
     RootResolverValue (..),
-    failure,
     getArguments,
     liftResolverState,
+    mkEnum,
     mkObject,
     mkUnion,
+    requireObject,
   )
+import Data.Morpheus.Internal.Ext (GQLResult)
 import Data.Morpheus.Kind
   ( CUSTOM,
     DerivingKind,
-    INTERFACE,
     SCALAR,
     TYPE,
     WRAPPER,
@@ -56,11 +60,17 @@
     TypeConstraint (..),
     TypeRep (..),
     isUnionRef,
+    toFieldRes,
     toValue,
   )
-import Data.Morpheus.Server.Types.GQLType (GQLType (..))
+import Data.Morpheus.Server.Types.GQLType
+  ( GQLType,
+    KIND,
+    __isEmptyType,
+  )
 import Data.Morpheus.Server.Types.Types
   ( Pair (..),
+    TypeGuard (..),
   )
 import Data.Morpheus.Types
   ( RootResolver (..),
@@ -70,8 +80,8 @@
   )
 import Data.Morpheus.Types.GQLWrapper (EncodeWrapper (..))
 import Data.Morpheus.Types.Internal.AST
-  ( IN,
-    InternalError,
+  ( GQLError,
+    IN,
     MUTATION,
     OperationType,
     QUERY,
@@ -116,20 +126,12 @@
 
 instance
   ( EncodeConstraint m a,
-    Monad m
+    MonadError GQLError m
   ) =>
   EncodeKind TYPE m a
   where
   encodeKind = pure . exploreResolvers . unContextValue
 
-instance
-  ( EncodeConstraint m a,
-    Monad m
-  ) =>
-  EncodeKind INTERFACE m a
-  where
-  encodeKind = pure . exploreResolvers . unContextValue
-
 --  Tuple  (a,b)
 instance
   Encode m (Pair k v) =>
@@ -141,6 +143,11 @@
 instance (Monad m, Encode m [Pair k v]) => EncodeKind CUSTOM m (Map k v) where
   encodeKind = encode . fmap (uncurry Pair) . M.toList . unContextValue
 
+--  INTERFACE Types
+instance (MonadError GQLError m, EncodeConstraint m guard, EncodeConstraint m union) => EncodeKind CUSTOM m (TypeGuard guard union) where
+  encodeKind (ContextValue (ResolveType value)) = pure (exploreResolvers value)
+  encodeKind (ContextValue (ResolveInterface value)) = pure (exploreResolvers value)
+
 --  GQL a -> Resolver b, MUTATION, SUBSCRIPTION, QUERY
 instance
   ( DecodeConstraint a,
@@ -164,7 +171,8 @@
   encodeKind (ContextValue value) = value >>= encode
 
 convertNode ::
-  Monad m =>
+  forall m.
+  MonadError GQLError m =>
   DataType (m (ResolverValue m)) ->
   ResolverValue m
 convertNode
@@ -174,21 +182,24 @@
       tyCons = cons@ConsRep {consFields, consName}
     }
     | tyIsUnion = encodeUnion consFields
-    | otherwise = mkObject tyName (fmap toFieldRes consFields)
+    | otherwise = mkObject tyName (toFieldRes <$> consFields)
     where
       -- ENUM
-      encodeUnion [] = ResEnum consName
+      encodeUnion ::
+        [FieldRep (m (ResolverValue m))] ->
+        ResolverValue m
+      encodeUnion [] = mkEnum consName
       -- Type References --------------------------------------------------------------
       encodeUnion [FieldRep {fieldTypeRef = TypeRef {typeConName}, fieldValue}]
-        | isUnionRef tyName cons = ResUnion typeConName fieldValue
+        | isUnionRef tyName cons = ResLazy (ResObject (Just typeConName) <$> (fieldValue >>= requireObject))
       -- Inline Union Types ----------------------------------------------------------------------------
-      encodeUnion fields = mkUnion consName (fmap toFieldRes fields)
+      encodeUnion fields = mkUnion consName (toFieldRes <$> fields)
 
 -- Types & Constrains -------------------------------------------------------
 exploreResolvers ::
   forall m a.
   ( EncodeConstraint m a,
-    Monad m
+    MonadError GQLError m
   ) =>
   a ->
   ResolverValue m
@@ -203,16 +214,11 @@
 ----- HELPERS ----------------------------
 objectResolvers ::
   ( EncodeConstraint m a,
-    Monad m
+    MonadError GQLError m
   ) =>
   a ->
-  ResolverState (ResolverValue m)
-objectResolvers value = constraintObject (exploreResolvers value)
-  where
-    constraintObject obj@ResObject {} =
-      pure obj
-    constraintObject _ =
-      failure ("resolver must be an object" :: InternalError)
+  ResolverState (ObjectTypeResolver m)
+objectResolvers value = requireObject (exploreResolvers value)
 
 type EncodeConstraint (m :: * -> *) a =
   ( GQLType a,
@@ -230,27 +236,20 @@
     EncodeObjectConstraint SUBSCRIPTION e m sub
   )
 
-toFieldRes :: FieldRep (m (ResolverValue m)) -> ResolverEntry m
-toFieldRes FieldRep {fieldSelector, fieldValue} = (fieldSelector, fieldValue)
-
 deriveModel ::
   forall e m query mut sub.
   (Monad m, EncodeConstraints e m query mut sub) =>
   RootResolver m e query mut sub ->
-  RootResolverValue e m
-deriveModel
-  RootResolver
-    { queryResolver,
-      mutationResolver,
-      subscriptionResolver
-    } =
+  GQLResult (RootResolverValue e m)
+deriveModel RootResolver {..} =
+  pure
     RootResolverValue
-      { query = objectResolvers queryResolver,
-        mutation = objectResolvers mutationResolver,
-        subscription = objectResolvers subscriptionResolver,
+      { queryResolver = objectResolvers queryResolver,
+        mutationResolver = objectResolvers mutationResolver,
+        subscriptionResolver = objectResolvers subscriptionResolver,
         channelMap
       }
-    where
-      channelMap
-        | __isEmptyType (Proxy :: Proxy (sub (Resolver SUBSCRIPTION e m))) = Nothing
-        | otherwise = Just (channelResolver subscriptionResolver)
+  where
+    channelMap
+      | __isEmptyType (Proxy :: Proxy (sub (Resolver SUBSCRIPTION e m))) = Nothing
+      | otherwise = Just (channelResolver subscriptionResolver)
diff --git a/src/Data/Morpheus/Server/Deriving/Named/Encode.hs b/src/Data/Morpheus/Server/Deriving/Named/Encode.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Named/Encode.hs
@@ -0,0 +1,56 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.Server.Deriving.Named.Encode
+  ( deriveNamedModel,
+    EncodeNamedConstraints,
+  )
+where
+
+import Data.Morpheus.App.Internal.Resolving
+  ( NamedResolver (..),
+    Resolver,
+    RootResolverValue (..),
+  )
+import Data.Morpheus.NamedResolvers (NamedResolverT (..))
+import Data.Morpheus.Server.Deriving.Named.EncodeType
+  ( EncodeTypeConstraint,
+    deriveResolver,
+  )
+import Data.Morpheus.Server.Deriving.Utils.GTraversable
+  ( traverseTypes,
+  )
+import Data.Morpheus.Types
+  ( NamedResolvers (..),
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( QUERY,
+  )
+import qualified GHC.Exts as HM
+import Relude
+
+type EncodeNamedConstraints e m query mut sub =
+  (EncodeTypeConstraint (Resolver QUERY e m) query)
+
+deriveNamedModel ::
+  forall e m query mut sub.
+  (Monad m, EncodeNamedConstraints e m query mut sub) =>
+  NamedResolvers m e query mut sub ->
+  RootResolverValue e m
+deriveNamedModel NamedResolvers =
+  NamedResolversValue
+    $ HM.fromList
+    $ map (\x -> (resolverName x, x))
+    $ join
+    $ toList
+    $ traverseTypes deriveResolver (Proxy @(query (NamedResolverT (Resolver QUERY e m))))
diff --git a/src/Data/Morpheus/Server/Deriving/Named/EncodeType.hs b/src/Data/Morpheus/Server/Deriving/Named/EncodeType.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Named/EncodeType.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.Server.Deriving.Named.EncodeType
+  ( deriveResolver,
+    EncodeTypeConstraint,
+    DeriveNamedResolver (..),
+  )
+where
+
+import Data.Morpheus.App.Internal.Resolving
+  ( LiftOperation,
+    NamedResolver (..),
+    Resolver,
+    ResolverState,
+    ResolverValue,
+    liftResolverState,
+  )
+import Data.Morpheus.Kind
+  ( CUSTOM,
+    DerivingKind,
+    SCALAR,
+    TYPE,
+    WRAPPER,
+  )
+import Data.Morpheus.NamedResolvers (NamedResolverT (..), ResolveNamed (Dep, resolveNamed))
+import Data.Morpheus.Server.Deriving.Decode
+  ( Decode (decode),
+  )
+import Data.Morpheus.Server.Deriving.Named.EncodeValue
+  ( Encode,
+    EncodeFieldKind,
+    encodeResolverValue,
+    getTypeName,
+  )
+import Data.Morpheus.Server.Deriving.Utils
+  ( TypeRep (..),
+  )
+import Data.Morpheus.Server.Deriving.Utils.GTraversable
+import Data.Morpheus.Server.Deriving.Utils.Kinded (KindedProxy (KindedProxy))
+import Data.Morpheus.Server.Types.GQLType
+  ( GQLType,
+    KIND,
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( ValidValue,
+  )
+import GHC.Generics
+  ( Generic (..),
+  )
+import Relude
+
+deriveResolver :: Mappable (DeriveNamedResolver m) [NamedResolver m] KindedProxy
+deriveResolver = Mappable deriveNamedResolver
+
+type EncodeTypeConstraint m a =
+  ( GFmap
+      (ScanConstraint (DeriveNamedResolver m))
+      (KIND (a (NamedResolverT m)))
+      (a (NamedResolverT m)),
+    DeriveNamedResolver
+      m
+      (KIND (a (NamedResolverT m)))
+      (a (NamedResolverT m)),
+    GQLType (a (NamedResolverT m))
+  )
+
+class DeriveNamedResolver (m :: * -> *) (k :: DerivingKind) a where
+  deriveNamedResolver :: f k a -> [NamedResolver m]
+
+instance DeriveNamedResolver m SCALAR a where
+  deriveNamedResolver _ = []
+
+instance
+  ( Monad m,
+    LiftOperation o,
+    Generic a,
+    GQLType a,
+    EncodeFieldKind (KIND a) (Resolver o e m) a,
+    Decode (Dep a),
+    ResolveNamed (Resolver o e m) a,
+    TypeRep (Encode (Resolver o e m)) (Resolver o e m (ResolverValue (Resolver o e m))) (Rep a)
+  ) =>
+  DeriveNamedResolver (Resolver o e m) TYPE (a :: *)
+  where
+  deriveNamedResolver _ =
+    [ NamedResolver
+        { resolverName = getTypeName (Proxy @a),
+          resolver = resolve >=> encodeResolverValue
+        }
+    ]
+    where
+      resolve :: ValidValue -> Resolver o e m a
+      resolve x = liftResolverState (decode x :: ResolverState (Dep a)) >>= resolveNamed
+
+instance DeriveNamedResolver m (KIND a) a => DeriveNamedResolver m CUSTOM (NamedResolverT m a) where
+  deriveNamedResolver _ = deriveNamedResolver (KindedProxy :: KindedProxy (KIND a) a)
+
+instance DeriveNamedResolver m (KIND a) a => DeriveNamedResolver m CUSTOM (input -> a) where
+  deriveNamedResolver _ = deriveNamedResolver (KindedProxy :: KindedProxy (KIND a) a)
+
+instance DeriveNamedResolver m (KIND a) a => DeriveNamedResolver m WRAPPER (f a) where
+  deriveNamedResolver _ = deriveNamedResolver (KindedProxy :: KindedProxy (KIND a) a)
diff --git a/src/Data/Morpheus/Server/Deriving/Named/EncodeValue.hs b/src/Data/Morpheus/Server/Deriving/Named/EncodeValue.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Named/EncodeValue.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.Server.Deriving.Named.EncodeValue
+  ( EncodeFieldKind,
+    Encode,
+    getTypeName,
+    encodeResolverValue,
+  )
+where
+
+import Control.Monad.Except (MonadError (..))
+import Data.Aeson (ToJSON (..))
+import Data.Morpheus.App.Internal.Resolving
+  ( LiftOperation,
+    NamedResolverRef (..),
+    NamedResolverResult (..),
+    ObjectTypeResolver (..),
+    Resolver,
+    ResolverValue (..),
+    getArguments,
+    liftResolverState,
+    mkList,
+    mkNull,
+  )
+import Data.Morpheus.Kind
+  ( CUSTOM,
+    DerivingKind,
+    SCALAR,
+    TYPE,
+    WRAPPER,
+  )
+import Data.Morpheus.NamedResolvers
+  ( NamedResolverT (..),
+    ResolveNamed (..),
+  )
+import Data.Morpheus.Server.Deriving.Decode
+  ( DecodeConstraint,
+    decodeArguments,
+  )
+import Data.Morpheus.Server.Deriving.Encode
+  ( ContextValue (..),
+  )
+import Data.Morpheus.Server.Deriving.Utils
+  ( ConsRep (..),
+    DataType (..),
+    FieldRep (..),
+    TypeConstraint (..),
+    TypeRep (..),
+    toFieldRes,
+    toValue,
+  )
+import Data.Morpheus.Server.Types.GQLType
+  ( GQLType (__type),
+    KIND,
+    TypeData (gqlTypeName),
+  )
+import Data.Morpheus.Types.GQLScalar
+  ( EncodeScalar (..),
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( GQLError,
+    OUT,
+    TypeCategory (OUT),
+    TypeName,
+    internal,
+    replaceValue,
+  )
+import qualified GHC.Exts as HM
+import GHC.Generics
+  ( Generic (..),
+  )
+import Relude
+
+encodeResolverValue :: (MonadError GQLError m, FieldConstraint m a) => a -> m (NamedResolverResult m)
+encodeResolverValue = convertNamedNode . getFieldValues
+
+type FieldConstraint m a =
+  ( GQLType a,
+    Generic a,
+    TypeRep (Encode m) (m (ResolverValue m)) (Rep a)
+  )
+
+class Encode (m :: * -> *) res where
+  encodeField :: res -> m (ResolverValue m)
+
+instance (EncodeFieldKind (KIND a) m a) => Encode m a where
+  encodeField resolver = encodeFieldKind (ContextValue resolver :: ContextValue (KIND a) a)
+
+class EncodeFieldKind (k :: DerivingKind) (m :: * -> *) (a :: *) where
+  encodeFieldKind :: ContextValue k a -> m (ResolverValue m)
+
+instance (EncodeScalar a, Monad m) => EncodeFieldKind SCALAR m a where
+  encodeFieldKind = pure . ResScalar . encodeScalar . unContextValue
+
+instance (FieldConstraint m a, MonadError GQLError m) => EncodeFieldKind TYPE m a where
+  encodeFieldKind (ContextValue _) = throwError (internal "types are resolved by Refs")
+
+instance (GQLType a, Applicative m, EncodeFieldKind (KIND a) m a) => EncodeFieldKind WRAPPER m [a] where
+  encodeFieldKind = fmap ResList . traverse encodeField . unContextValue
+
+instance (GQLType a, EncodeFieldKind (KIND a) m a, Applicative m) => EncodeFieldKind WRAPPER m (Maybe a) where
+  encodeFieldKind (ContextValue (Just x)) = encodeField x
+  encodeFieldKind (ContextValue Nothing) = pure mkNull
+
+instance
+  ( Monad m,
+    GQLType a,
+    EncodeFieldKind (KIND a) m a,
+    ToJSON (Dep a)
+  ) =>
+  EncodeFieldKind CUSTOM m (NamedResolverT m a)
+  where
+  encodeFieldKind = encodeRef . unContextValue
+    where
+      name :: TypeName
+      name = getTypeName (Proxy @a)
+      encodeRef :: Monad m => NamedResolverT m a -> m (ResolverValue m)
+      encodeRef (Ref x) = pure $ ResRef (NamedResolverRef name . replaceValue . toJSON <$> x)
+      encodeRef (Value value) = value >>= encodeField
+      encodeRef (Refs refs) = mkList . map (ResRef . pure . NamedResolverRef name . replaceValue . toJSON) <$> refs
+
+instance
+  ( DecodeConstraint a,
+    Generic a,
+    Monad m,
+    Encode (Resolver o e m) b,
+    LiftOperation o
+  ) =>
+  EncodeFieldKind CUSTOM (Resolver o e m) (a -> b)
+  where
+  encodeFieldKind (ContextValue f) =
+    getArguments
+      >>= liftResolverState . decodeArguments
+      >>= encodeField . f
+
+getFieldValues :: FieldConstraint m a => a -> DataType (m (ResolverValue m))
+getFieldValues =
+  toValue
+    ( TypeConstraint (encodeField . runIdentity) ::
+        TypeConstraint (Encode m) (m (ResolverValue m)) Identity
+    )
+    (Proxy @OUT)
+
+convertNamedNode ::
+  MonadError GQLError m =>
+  DataType (m (ResolverValue m)) ->
+  m (NamedResolverResult m)
+convertNamedNode
+  DataType
+    { tyIsUnion,
+      tyCons = ConsRep {consFields, consName}
+    }
+    | null consFields = pure $ NamedEnumResolver consName
+    | tyIsUnion = deriveUnion consFields
+    | otherwise =
+      pure $
+        NamedObjectResolver
+          ObjectTypeResolver
+            { objectFields = HM.fromList (toFieldRes <$> consFields)
+            }
+
+deriveUnion :: (MonadError GQLError m) => [FieldRep (m (ResolverValue m))] -> m (NamedResolverResult m)
+deriveUnion [FieldRep {..}] =
+  NamedUnionResolver <$> (fieldValue >>= getRef)
+deriveUnion _ = throwError "only union references are supported!"
+
+getRef :: MonadError GQLError m => ResolverValue m -> m NamedResolverRef
+getRef (ResRef x) = x
+getRef _ = throwError "only resolver references are supported!"
+
+getTypeName :: GQLType a => f a -> TypeName
+getTypeName proxy = gqlTypeName $ __type proxy OUT
diff --git a/src/Data/Morpheus/Server/Deriving/Schema.hs b/src/Data/Morpheus/Server/Deriving/Schema.hs
--- a/src/Data/Morpheus/Server/Deriving/Schema.hs
+++ b/src/Data/Morpheus/Server/Deriving/Schema.hs
@@ -4,6 +4,8 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE PolyKinds #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -15,7 +17,6 @@
 module Data.Morpheus.Server.Deriving.Schema
   ( compileTimeSchemaValidation,
     DeriveType,
-    deriveImplementsInterface,
     deriveSchema,
     SchemaConstraints,
     SchemaT,
@@ -24,23 +25,16 @@
 
 -- MORPHEUS
 
-import Control.Applicative (Applicative (..))
-import Control.Monad ((>=>), (>>=))
-import Data.Functor (($>), (<$>), Functor (..))
-import Data.Map (Map)
-import Data.Maybe (Maybe (..))
+import Control.Monad.Except (throwError)
 import Data.Morpheus.App.Internal.Resolving
   ( Resolver,
-    resultOr,
   )
 import Data.Morpheus.Core (defaultConfig, validateSchema)
-import Data.Morpheus.Internal.Utils
-  ( Failure (..),
-  )
+import Data.Morpheus.Internal.Ext
+import Data.Morpheus.Internal.Utils (singleton)
 import Data.Morpheus.Kind
   ( CUSTOM,
     DerivingKind,
-    INTERFACE,
     SCALAR,
     TYPE,
     WRAPPER,
@@ -48,19 +42,30 @@
 import Data.Morpheus.Server.Deriving.Schema.Internal
   ( KindedType (..),
     TyContentM,
-    UpdateDef (..),
-    asObjectType,
-    builder,
     fromSchema,
-    unpackMs,
     updateByContent,
+  )
+import Data.Morpheus.Server.Deriving.Schema.Object
+  ( asObjectType,
     withObject,
   )
+import Data.Morpheus.Server.Deriving.Schema.TypeContent
 import Data.Morpheus.Server.Deriving.Utils
   ( TypeConstraint (..),
     TypeRep (..),
+    deriveTypeRef,
+    symbolName,
     toRep,
+    unpackMonad,
+    withKind,
   )
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( CategoryValue (..),
+    KindedProxy (..),
+    inputType,
+    outputType,
+    setKind,
+  )
 import Data.Morpheus.Server.Types.GQLType
   ( GQLType (..),
     TypeData (..),
@@ -68,11 +73,14 @@
   )
 import Data.Morpheus.Server.Types.SchemaT
   ( SchemaT,
+    extendImplements,
     toSchema,
     withInput,
   )
 import Data.Morpheus.Server.Types.Types
-  ( Pair,
+  ( Arg (..),
+    Pair,
+    TypeGuard,
   )
 import Data.Morpheus.Types.GQLScalar
   ( DecodeScalar (..),
@@ -83,8 +91,8 @@
     CONST,
     CONST,
     FieldContent (..),
+    FieldContent (..),
     FieldsDefinition,
-    GQLErrors,
     IN,
     LEAF,
     MUTATION,
@@ -98,24 +106,14 @@
     TypeContent (..),
     TypeDefinition (..),
     TypeName,
+    UnionMember (memberName),
     fieldsToArguments,
-  )
-import Data.Morpheus.Utils.Kinded
-  ( CategoryValue (..),
-    KindedProxy (..),
-    inputType,
-    kinded,
-    outputType,
-    setKind,
+    mkField,
   )
-import Data.Proxy (Proxy (..))
-import GHC.Generics (Generic, Rep)
+import GHC.Generics (Rep)
+import GHC.TypeLits
 import Language.Haskell.TH (Exp, Q)
-import Prelude
-  ( ($),
-    (.),
-    Bool (..),
-  )
+import Relude
 
 type SchemaConstraints event (m :: * -> *) query mutation subscription =
   ( DeriveTypeConstraintOpt OUT (query (Resolver QUERY event m)),
@@ -137,8 +135,7 @@
   proxy (root m event qu mu su) ->
   Q Exp
 compileTimeSchemaValidation =
-  fromSchema
-    . (deriveSchema >=> validateSchema True defaultConfig)
+  fromSchema . (deriveSchema >=> validateSchema True defaultConfig)
 
 deriveSchema ::
   forall
@@ -148,16 +145,13 @@
     e
     query
     mut
-    subs
-    f.
-  ( SchemaConstraints e m query mut subs,
-    Failure GQLErrors f
+    subs.
+  ( SchemaConstraints e m query mut subs
   ) =>
   proxy (root m e query mut subs) ->
-  f (Schema CONST)
-deriveSchema _ = resultOr failure pure schema
+  GQLResult (Schema CONST)
+deriveSchema _ = toSchema schemaT
   where
-    schema = toSchema schemaT
     schemaT ::
       SchemaT
         OUT
@@ -174,7 +168,7 @@
 -- |  Generates internal GraphQL Schema for query validation and introspection rendering
 class DeriveType (kind :: TypeCategory) (a :: *) where
   deriveType :: f a -> SchemaT kind ()
-  deriveContent :: f a -> SchemaT kind (Maybe (FieldContent TRUE kind CONST))
+  deriveContent :: f a -> TyContentM kind
 
 instance (GQLType a, DeriveKindedType cat (KIND a) a) => DeriveType cat a where
   deriveType _ = deriveKindedType (KindedProxy :: KindedProxy (KIND a) a)
@@ -183,7 +177,7 @@
 -- | DeriveType With specific Kind: 'kind': object, scalar, enum ...
 class DeriveKindedType (cat :: TypeCategory) (kind :: DerivingKind) a where
   deriveKindedType :: kinded kind a -> SchemaT cat ()
-  deriveKindedContent :: kinded kind a -> SchemaT cat (Maybe (FieldContent TRUE cat CONST))
+  deriveKindedContent :: kinded kind a -> TyContentM cat
   deriveKindedContent _ = pure Nothing
 
 type DeriveTypeConstraint kind a =
@@ -198,9 +192,6 @@
 instance (GQLType a, DecodeScalar a) => DeriveKindedType cat SCALAR a where
   deriveKindedType = updateByContent deriveScalarContent . setKind (Proxy @LEAF)
 
-instance DeriveTypeConstraint OUT a => DeriveKindedType OUT INTERFACE a where
-  deriveKindedType = updateByContent deriveInterfaceContent . setKind (Proxy @OUT)
-
 instance DeriveTypeConstraint OUT a => DeriveKindedType OUT TYPE a where
   deriveKindedType = deriveOutputType
 
@@ -219,13 +210,41 @@
   deriveKindedType _ = deriveType (Proxy @[Pair k v])
 
 instance
+  ( DeriveTypeConstraint OUT interface,
+    DeriveTypeConstraint OUT union
+  ) =>
+  DeriveKindedType OUT CUSTOM (TypeGuard interface union)
+  where
+  deriveKindedType _ = do
+    updateByContent deriveInterfaceContent interfaceProxy
+    content <- deriveTypeContent (OutputType :: KindedType OUT union)
+    unionNames <- getUnionNames content
+    extendImplements interfaceName unionNames
+    where
+      interfaceName :: TypeName
+      interfaceName = gqlTypeName (__typeData interfaceProxy)
+      interfaceProxy :: KindedProxy OUT interface
+      interfaceProxy = KindedProxy
+      unionProxy :: KindedProxy OUT union
+      unionProxy = KindedProxy
+      getUnionNames :: TypeContent TRUE OUT CONST -> SchemaT OUT [TypeName]
+      getUnionNames DataUnion {unionMembers} = pure $ toList $ memberName <$> unionMembers
+      getUnionNames DataObject {} = pure [gqlTypeName (__typeData unionProxy)]
+      getUnionNames _ = throwError "guarded type must be an union or object"
+
+instance
   ( GQLType b,
-    DeriveType OUT b,
-    DeriveTypeConstraint IN a
+    DeriveKindedType OUT (KIND b) b,
+    DeriveArguments (KIND a) a
   ) =>
-  DeriveKindedType OUT CUSTOM (a -> m b)
+  DeriveKindedType OUT CUSTOM (a -> b)
   where
-  deriveKindedContent _ = Just . FieldArgs <$> deriveArgumentDefinition (Proxy @a)
+  deriveKindedContent _ = do
+    a <- deriveArgumentsDefinition (withKind (Proxy @a))
+    b <- deriveKindedContent (KindedProxy :: KindedProxy (KIND b) b)
+    case b of
+      Just (FieldArgs x) -> Just . FieldArgs <$> (a <:> x)
+      Nothing -> pure $ Just (FieldArgs a)
   deriveKindedType _ = deriveType (outputType $ Proxy @b)
 
 deriveScalarContent :: (DecodeScalar a) => f k a -> SchemaT cat (TypeContent TRUE LEAF CONST)
@@ -234,9 +253,22 @@
 deriveInterfaceContent :: DeriveTypeConstraint OUT a => f a -> SchemaT OUT (TypeContent TRUE OUT CONST)
 deriveInterfaceContent = fmap DataInterface . deriveFields . outputType
 
-deriveArgumentDefinition :: DeriveTypeConstraint IN a => f a -> SchemaT OUT (ArgumentsDefinition CONST)
-deriveArgumentDefinition = withInput . fmap fieldsToArguments . deriveFields . inputType
+class DeriveArguments (k :: DerivingKind) a where
+  deriveArgumentsDefinition :: f k a -> SchemaT OUT (ArgumentsDefinition CONST)
 
+instance DeriveTypeConstraint IN a => DeriveArguments TYPE a where
+  deriveArgumentsDefinition = withInput . fmap fieldsToArguments . deriveFields . inputType
+
+instance (KnownSymbol name, DeriveType IN a, GQLType a) => DeriveArguments CUSTOM (Arg name a) where
+  deriveArgumentsDefinition _ = do
+    withInput (deriveType proxy)
+    pure $ fieldsToArguments $ singleton $ mkField Nothing argName argTypeRef
+    where
+      proxy :: KindedProxy IN a
+      proxy = KindedProxy
+      argName = symbolName (Proxy @name)
+      argTypeRef = deriveTypeRef proxy
+
 deriveFields :: DeriveTypeConstraint kind a => KindedType kind a -> SchemaT kind (FieldsDefinition kind CONST)
 deriveFields kindedType = deriveTypeContent kindedType >>= withObject kindedType
 
@@ -249,9 +281,6 @@
 deriveObjectType :: DeriveTypeConstraint OUT a => f a -> SchemaT OUT (TypeDefinition OBJECT CONST)
 deriveObjectType = asObjectType (deriveFields . outputType)
 
-deriveImplementsInterface :: (GQLType a, DeriveType OUT a) => f a -> SchemaT OUT TypeName
-deriveImplementsInterface x = deriveType (outputType x) $> gqlTypeName (__typeData (kinded (Proxy @OUT) x))
-
 fieldContentConstraint :: f kind a -> TypeConstraint (DeriveType kind) (TyContentM kind) Proxy
 fieldContentConstraint _ = TypeConstraint deriveFieldContent
 
@@ -267,5 +296,6 @@
   KindedType kind a ->
   SchemaT kind (TypeContent TRUE kind CONST)
 deriveTypeContent kindedProxy =
-  unpackMs (toRep (fieldContentConstraint kindedProxy) kindedProxy)
-    >>= fmap (updateDef kindedProxy) . builder kindedProxy
+  unpackMonad
+    (toRep (fieldContentConstraint kindedProxy) kindedProxy)
+    >>= buildTypeContent kindedProxy
diff --git a/src/Data/Morpheus/Server/Deriving/Schema/Enum.hs b/src/Data/Morpheus/Server/Deriving/Schema/Enum.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Schema/Enum.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE NamedFieldPuns #-}
+
+module Data.Morpheus.Server.Deriving.Schema.Enum
+  ( buildEnumTypeContent,
+    defineEnumUnit,
+  )
+where
+
+import Data.Morpheus.Server.Deriving.Schema.Internal
+  ( lookupDescription,
+    lookupDirectives,
+  )
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( KindedType (..),
+  )
+import Data.Morpheus.Server.Types.GQLType
+  ( GQLType,
+  )
+import Data.Morpheus.Server.Types.SchemaT
+  ( SchemaT,
+    insertType,
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( CONST,
+    DataEnumValue (..),
+    LEAF,
+    TRUE,
+    TypeContent (..),
+    TypeDefinition,
+    TypeName,
+    mkEnumContent,
+    mkType,
+    unitTypeName,
+    unpackName,
+  )
+
+buildEnumTypeContent :: GQLType a => KindedType kind a -> [TypeName] -> SchemaT c (TypeContent TRUE kind CONST)
+buildEnumTypeContent p@InputType enumCons = pure $ DataEnum $ map (mkEnumValue p) enumCons
+buildEnumTypeContent p@OutputType enumCons = pure $ DataEnum $ map (mkEnumValue p) enumCons
+
+mkEnumValue :: GQLType a => f a -> TypeName -> DataEnumValue CONST
+mkEnumValue proxy enumName =
+  DataEnumValue
+    { enumName,
+      enumDescription = lookupDescription proxy (unpackName enumName),
+      enumDirectives = lookupDirectives proxy (unpackName enumName)
+    }
+
+defineEnumUnit :: SchemaT cat ()
+defineEnumUnit =
+  insertType
+    ( mkType unitTypeName (mkEnumContent [unitTypeName]) ::
+        TypeDefinition LEAF CONST
+    )
diff --git a/src/Data/Morpheus/Server/Deriving/Schema/Internal.hs b/src/Data/Morpheus/Server/Deriving/Schema/Internal.hs
--- a/src/Data/Morpheus/Server/Deriving/Schema/Internal.hs
+++ b/src/Data/Morpheus/Server/Deriving/Schema/Internal.hs
@@ -20,36 +20,26 @@
 
 module Data.Morpheus.Server.Deriving.Schema.Internal
   ( KindedType (..),
-    builder,
-    unpackMs,
-    UpdateDef (..),
-    withObject,
     TyContentM,
-    asObjectType,
+    TyContent,
     fromSchema,
     updateByContent,
+    lookupDescription,
+    lookupDirectives,
+    lookupFieldContent,
   )
 where
 
 -- MORPHEUS
-import Data.List (partition)
 import qualified Data.Map as M
 import Data.Morpheus.App.Internal.Resolving
-  ( Eventless,
-    Result (..),
-  )
-import Data.Morpheus.Error (globalErrorMessage)
-import Data.Morpheus.Internal.Utils
-  ( Failure (..),
-    singleton,
+  ( Result (..),
   )
-import Data.Morpheus.Server.Deriving.Utils
-  ( ConsRep (..),
-    FieldRep (..),
-    ResRep (..),
-    fieldTypeName,
-    isEmptyConstraint,
-    isUnionRef,
+import Data.Morpheus.Internal.Ext (GQLResult)
+import Data.Morpheus.Internal.Utils (empty)
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( CategoryValue (..),
+    KindedType (..),
   )
 import Data.Morpheus.Server.Types.GQLType
   ( GQLType (..),
@@ -58,156 +48,43 @@
   )
 import Data.Morpheus.Server.Types.SchemaT
   ( SchemaT,
-    insertType,
     updateSchema,
-    withInterface,
   )
 import Data.Morpheus.Types.Internal.AST
   ( CONST,
-    DataEnumValue (..),
     Description,
     Directives,
     FieldContent (..),
-    FieldDefinition (..),
-    FieldName,
-    FieldName (..),
-    FieldsDefinition,
-    IN,
-    LEAF,
-    OBJECT,
-    OUT,
     Schema (..),
     TRUE,
-    Token,
-    TypeCategory (..),
     TypeContent (..),
     TypeDefinition (..),
-    TypeName (..),
-    UnionMember (..),
     VALID,
-    mkEnumContent,
-    mkField,
-    mkNullaryMember,
-    mkType,
-    mkTypeRef,
-    mkUnionMember,
-    msg,
-    unitFieldName,
-    unitTypeName,
-    unsafeFromFields,
   )
-import Data.Morpheus.Utils.Kinded
-  ( CategoryValue (..),
-    KindedType (..),
-    outputType,
-  )
 import Language.Haskell.TH (Exp, Q)
-import Relude
-
-fromSchema :: Eventless (Schema VALID) -> Q Exp
-fromSchema Success {} = [|()|]
-fromSchema Failure {errors} = fail (show errors)
-
-withObject :: (GQLType a, CategoryValue c) => KindedType c a -> TypeContent TRUE any s -> SchemaT c (FieldsDefinition c s)
-withObject InputType DataInputObject {inputObjectFields} = pure inputObjectFields
-withObject OutputType DataObject {objectFields} = pure objectFields
-withObject x _ = failureOnlyObject x
-
-asObjectType ::
-  (GQLType a) =>
-  (f2 a -> SchemaT c (FieldsDefinition OUT CONST)) ->
-  f2 a ->
-  SchemaT c (TypeDefinition OBJECT CONST)
-asObjectType f proxy = (`mkObjectType` gqlTypeName (__typeData (outputType proxy))) <$> f proxy
-
-mkObjectType :: FieldsDefinition OUT CONST -> TypeName -> TypeDefinition OBJECT CONST
-mkObjectType fields typeName = mkType typeName (DataObject [] fields)
-
-failureOnlyObject :: forall (c :: TypeCategory) a b. (GQLType a, CategoryValue c) => KindedType c a -> SchemaT c b
-failureOnlyObject proxy =
-  failure
-    $ globalErrorMessage
-    $ msg (gqlTypeName $ __typeData proxy) <> " should have only one nonempty constructor"
-
-type TyContentM kind = (SchemaT kind (Maybe (FieldContent TRUE kind CONST)))
-
-type TyContent kind = Maybe (FieldContent TRUE kind CONST)
-
-unpackM :: FieldRep (TyContentM k) -> SchemaT k (FieldRep (TyContent k))
-unpackM FieldRep {..} =
-  FieldRep fieldSelector fieldTypeRef fieldIsObject
-    <$> fieldValue
+import Relude hiding (empty)
 
-unpackCons :: ConsRep (TyContentM k) -> SchemaT k (ConsRep (TyContent k))
-unpackCons ConsRep {..} = ConsRep consName <$> traverse unpackM consFields
+lookupDescription :: GQLType a => f a -> Text -> Maybe Description
+lookupDescription proxy name = name `M.lookup` getDescriptions proxy
 
-unpackMs :: [ConsRep (TyContentM k)] -> SchemaT k [ConsRep (TyContent k)]
-unpackMs = traverse unpackCons
+lookupDirectives :: GQLType a => f a -> Text -> Directives CONST
+lookupDirectives proxy name = fromMaybe empty $ name `M.lookup` getDirectives proxy
 
-builder ::
-  (GQLType a, CategoryValue kind) =>
+lookupFieldContent ::
+  GQLType a =>
   KindedType kind a ->
-  [ConsRep (TyContent kind)] ->
-  SchemaT cat (TypeContent TRUE kind CONST)
-builder scope [ConsRep {consFields}] = buildObj <$> withInterface (sequence (implements scope))
-  where
-    buildObj interfaces = wrapFields interfaces scope (mkFieldsDefinition consFields)
-builder scope cons = genericUnion cons
-  where
-    typeData = __typeData scope
-    genericUnion = mkUnionType scope . analyseRep (gqlTypeName typeData)
-
-class UpdateDef value where
-  updateDef :: GQLType a => f a -> value -> value
-
-instance UpdateDef (TypeContent TRUE c CONST) where
-  updateDef proxy DataObject {objectFields = fields, ..} =
-    DataObject {objectFields = fmap (updateDef proxy) fields, ..}
-  updateDef proxy DataInputObject {inputObjectFields = fields} =
-    DataInputObject {inputObjectFields = fmap (updateDef proxy) fields, ..}
-  updateDef proxy DataInterface {interfaceFields = fields} =
-    DataInterface {interfaceFields = fmap (updateDef proxy) fields, ..}
-  updateDef proxy (DataEnum enums) = DataEnum $ fmap (updateDef proxy) enums
-  updateDef _ x = x
-
-instance GetFieldContent cat => UpdateDef (FieldDefinition cat CONST) where
-  updateDef proxy FieldDefinition {fieldName, fieldType, fieldContent} =
-    FieldDefinition
-      { fieldName,
-        fieldDescription = lookupDescription (readName fieldName) proxy,
-        fieldDirectives = lookupDirectives (readName fieldName) proxy,
-        fieldContent = getFieldContent fieldName fieldContent proxy,
-        ..
-      }
-
-instance UpdateDef (DataEnumValue CONST) where
-  updateDef proxy DataEnumValue {enumName} =
-    DataEnumValue
-      { enumName,
-        enumDescription = lookupDescription (readTypeName enumName) proxy,
-        enumDirectives = lookupDirectives (readTypeName enumName) proxy
-      }
-
-lookupDescription :: GQLType a => Token -> f a -> Maybe Description
-lookupDescription name = (name `M.lookup`) . getDescriptions
-
-lookupDirectives :: GQLType a => Token -> f a -> Directives CONST
-lookupDirectives name = fromMaybe [] . (name `M.lookup`) . getDirectives
+  Text ->
+  Maybe (FieldContent TRUE kind CONST)
+lookupFieldContent proxy@InputType key = DefaultInputValue <$> key `M.lookup` defaultValues proxy
+lookupFieldContent OutputType _ = Nothing
 
-class GetFieldContent c where
-  getFieldContent :: GQLType a => FieldName -> Maybe (FieldContent TRUE c CONST) -> f a -> Maybe (FieldContent TRUE c CONST)
+fromSchema :: GQLResult (Schema VALID) -> Q Exp
+fromSchema Success {} = [|()|]
+fromSchema Failure {errors} = fail (show errors)
 
-instance GetFieldContent IN where
-  getFieldContent name val proxy =
-    case name `M.lookup` getFieldContents proxy of
-      Just (Just x, _) -> Just (DefaultInputValue x)
-      _ -> val
+type TyContentM kind = SchemaT kind (TyContent kind)
 
-instance GetFieldContent OUT where
-  getFieldContent name args proxy =
-    case name `M.lookup` getFieldContents proxy of
-      Just (_, Just x) -> Just (FieldArgs x)
-      _ -> args
+type TyContent kind = Maybe (FieldContent TRUE kind CONST)
 
 updateByContent ::
   (GQLType a, CategoryValue kind) =>
@@ -225,91 +102,6 @@
         ( TypeDefinition
             (description proxy)
             (gqlTypeName (__typeData proxy))
-            []
+            empty
         )
         . f
-
-analyseRep :: TypeName -> [ConsRep (Maybe (FieldContent TRUE kind CONST))] -> ResRep (Maybe (FieldContent TRUE kind CONST))
-analyseRep baseName cons
-  | all isEmptyConstraint cons = EnumRep {enumCons = consName <$> cons}
-  | otherwise =
-    ResRep
-      { unionRef = fieldTypeName <$> concatMap consFields unionRefRep,
-        unionCons
-      }
-  where
-    (unionRefRep, unionCons) = partition (isUnionRef baseName) cons
-
-mkUnionType ::
-  forall kind c a.
-  KindedType kind a ->
-  ResRep (Maybe (FieldContent TRUE kind CONST)) ->
-  SchemaT c (TypeContent TRUE kind CONST)
-mkUnionType InputType EnumRep {enumCons} = pure $ mkEnumContent enumCons
-mkUnionType OutputType EnumRep {enumCons} = pure $ mkEnumContent enumCons
-mkUnionType InputType ResRep {unionRef, unionCons} = DataInputUnion <$> typeMembers
-  where
-    (nullaries, cons) = partition isEmptyConstraint unionCons
-    nullaryMembers :: [UnionMember IN CONST]
-    nullaryMembers = mkNullaryMember . consName <$> nullaries
-    defineEnumEmpty
-      | null nullaries = pure ()
-      | otherwise = defineEnumNull
-    typeMembers :: SchemaT c [UnionMember IN CONST]
-    typeMembers =
-      (<> nullaryMembers) . withRefs
-        <$> ( defineEnumEmpty *> buildUnions cons
-            )
-      where
-        withRefs = fmap mkUnionMember . (unionRef <>)
-mkUnionType OutputType ResRep {unionRef, unionCons} =
-  DataUnion . map mkUnionMember . (unionRef <>) <$> buildUnions unionCons
-
-wrapFields :: [TypeName] -> KindedType kind a -> FieldsDefinition kind CONST -> TypeContent TRUE kind CONST
-wrapFields _ InputType = DataInputObject
-wrapFields interfaces OutputType = DataObject interfaces
-
-mkFieldsDefinition :: [FieldRep (Maybe (FieldContent TRUE kind CONST))] -> FieldsDefinition kind CONST
-mkFieldsDefinition = unsafeFromFields . fmap fieldByRep
-
-fieldByRep :: FieldRep (Maybe (FieldContent TRUE kind CONST)) -> FieldDefinition kind CONST
-fieldByRep FieldRep {fieldSelector, fieldTypeRef, fieldValue} =
-  mkField fieldValue fieldSelector fieldTypeRef
-
-buildUnions ::
-  PackObject kind =>
-  [ConsRep (Maybe (FieldContent TRUE kind CONST))] ->
-  SchemaT c [TypeName]
-buildUnions cons =
-  traverse_ buildURecType cons $> fmap consName cons
-  where
-    buildURecType = buildUnionRecord >=> insertType
-
-buildUnionRecord ::
-  PackObject kind =>
-  ConsRep (Maybe (FieldContent TRUE kind CONST)) ->
-  SchemaT cat (TypeDefinition kind CONST)
-buildUnionRecord ConsRep {consName, consFields} = mkType consName . packObject <$> fields
-  where
-    fields
-      | null consFields = defineEnumNull $> singleton mkNullField
-      | otherwise = pure $ mkFieldsDefinition consFields
-
-defineEnumNull :: SchemaT cat ()
-defineEnumNull =
-  insertType
-    ( mkType unitTypeName (mkEnumContent [unitTypeName]) ::
-        TypeDefinition LEAF CONST
-    )
-
-mkNullField :: FieldDefinition cat s
-mkNullField = mkField Nothing unitFieldName (mkTypeRef unitTypeName)
-
-class PackObject kind where
-  packObject :: FieldsDefinition kind CONST -> TypeContent TRUE kind CONST
-
-instance PackObject OUT where
-  packObject = DataObject []
-
-instance PackObject IN where
-  packObject = DataInputObject
diff --git a/src/Data/Morpheus/Server/Deriving/Schema/Object.hs b/src/Data/Morpheus/Server/Deriving/Schema/Object.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Schema/Object.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RecordWildCards #-}
+
+module Data.Morpheus.Server.Deriving.Schema.Object
+  ( asObjectType,
+    withObject,
+    buildObjectTypeContent,
+    defineObjectType,
+  )
+where
+
+import Control.Monad.Except (throwError)
+import Data.Morpheus.Internal.Utils
+  ( empty,
+    singleton,
+  )
+import Data.Morpheus.Server.Deriving.Schema.Enum (defineEnumUnit)
+import Data.Morpheus.Server.Deriving.Schema.Internal
+  ( lookupDescription,
+    lookupDirectives,
+    lookupFieldContent,
+  )
+import Data.Morpheus.Server.Deriving.Utils
+  ( ConsRep (..),
+    FieldRep (..),
+  )
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( CategoryValue (..),
+    KindedType (..),
+    outputType,
+  )
+import Data.Morpheus.Server.Types.GQLType
+  ( GQLType (..),
+    TypeData (..),
+    __typeData,
+  )
+import Data.Morpheus.Server.Types.SchemaT
+  ( SchemaT,
+    insertType,
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( CONST,
+    FieldContent (..),
+    FieldDefinition (..),
+    FieldsDefinition,
+    OBJECT,
+    OUT,
+    TRUE,
+    TypeCategory,
+    TypeContent (..),
+    TypeDefinition,
+    mkField,
+    mkType,
+    mkTypeRef,
+    msg,
+    unitFieldName,
+    unitTypeName,
+    unpackName,
+    unsafeFromFields,
+  )
+import Relude hiding (empty)
+
+defineObjectType ::
+  KindedType kind a ->
+  ConsRep (Maybe (FieldContent TRUE kind CONST)) ->
+  SchemaT cat ()
+defineObjectType proxy ConsRep {consName, consFields} = insertType . mkType consName . mkObjectTypeContent proxy =<< fields
+  where
+    fields
+      | null consFields = defineEnumUnit $> singleton mkFieldUnit
+      | otherwise = pure $ unsafeFromFields $ map repToFieldDefinition consFields
+
+mkFieldUnit :: FieldDefinition cat s
+mkFieldUnit = mkField Nothing unitFieldName (mkTypeRef unitTypeName)
+
+buildObjectTypeContent ::
+  (Applicative f, GQLType a) =>
+  KindedType cat a ->
+  [FieldRep (Maybe (FieldContent TRUE cat CONST))] ->
+  f (TypeContent TRUE cat CONST)
+buildObjectTypeContent scope consFields =
+  pure
+    $ mkObjectTypeContent scope
+    $ unsafeFromFields
+    $ map (setGQLTypeProps scope . repToFieldDefinition) consFields
+
+repToFieldDefinition ::
+  FieldRep (Maybe (FieldContent TRUE kind CONST)) ->
+  FieldDefinition kind CONST
+repToFieldDefinition
+  FieldRep
+    { fieldSelector = fieldName,
+      fieldTypeRef = fieldType,
+      fieldValue
+    } =
+    FieldDefinition
+      { fieldDescription = mempty,
+        fieldDirectives = empty,
+        fieldContent = fieldValue,
+        ..
+      }
+
+asObjectType ::
+  (GQLType a) =>
+  (f a -> SchemaT kind (FieldsDefinition OUT CONST)) ->
+  f a ->
+  SchemaT kind (TypeDefinition OBJECT CONST)
+asObjectType f proxy =
+  mkType
+    (gqlTypeName (__typeData (outputType proxy)))
+    . DataObject []
+    <$> f proxy
+
+withObject :: (GQLType a, CategoryValue c) => KindedType c a -> TypeContent TRUE any s -> SchemaT c (FieldsDefinition c s)
+withObject InputType DataInputObject {inputObjectFields} = pure inputObjectFields
+withObject OutputType DataObject {objectFields} = pure objectFields
+withObject x _ = failureOnlyObject x
+
+failureOnlyObject :: forall (c :: TypeCategory) a b. (GQLType a, CategoryValue c) => KindedType c a -> SchemaT c b
+failureOnlyObject proxy =
+  throwError $
+    msg (gqlTypeName $ __typeData proxy) <> " should have only one nonempty constructor"
+
+mkObjectTypeContent :: KindedType kind a -> FieldsDefinition kind CONST -> TypeContent TRUE kind CONST
+mkObjectTypeContent InputType = DataInputObject
+mkObjectTypeContent OutputType = DataObject []
+
+setGQLTypeProps :: GQLType a => KindedType kind a -> FieldDefinition kind CONST -> FieldDefinition kind CONST
+setGQLTypeProps proxy FieldDefinition {..} =
+  FieldDefinition
+    { fieldName,
+      fieldDescription = lookupDescription proxy key,
+      fieldDirectives = lookupDirectives proxy key,
+      fieldContent = lookupFieldContent proxy key <|> fieldContent,
+      ..
+    }
+  where
+    key = unpackName fieldName
diff --git a/src/Data/Morpheus/Server/Deriving/Schema/TypeContent.hs b/src/Data/Morpheus/Server/Deriving/Schema/TypeContent.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Schema/TypeContent.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE RankNTypes #-}
+
+module Data.Morpheus.Server.Deriving.Schema.TypeContent
+  ( buildTypeContent,
+  )
+where
+
+import Data.Morpheus.Server.Deriving.Schema.Enum
+  ( buildEnumTypeContent,
+  )
+import Data.Morpheus.Server.Deriving.Schema.Internal
+  ( KindedType (..),
+    TyContent,
+  )
+import Data.Morpheus.Server.Deriving.Schema.Object
+  ( buildObjectTypeContent,
+  )
+import Data.Morpheus.Server.Deriving.Schema.Union (buildUnionTypeContent)
+import Data.Morpheus.Server.Deriving.Utils
+  ( ConsRep (..),
+    isEmptyConstraint,
+  )
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( CategoryValue (..),
+  )
+import Data.Morpheus.Server.Types.GQLType (GQLType)
+import Data.Morpheus.Server.Types.SchemaT (SchemaT)
+import Data.Morpheus.Types.Internal.AST
+
+buildTypeContent ::
+  (GQLType a, CategoryValue kind) =>
+  KindedType kind a ->
+  [ConsRep (TyContent kind)] ->
+  SchemaT kind (TypeContent TRUE kind CONST)
+buildTypeContent scope [ConsRep {consFields}] = buildObjectTypeContent scope consFields
+buildTypeContent scope cons | all isEmptyConstraint cons = buildEnumTypeContent scope (consName <$> cons)
+buildTypeContent scope cons = buildUnionTypeContent scope cons
diff --git a/src/Data/Morpheus/Server/Deriving/Schema/Union.hs b/src/Data/Morpheus/Server/Deriving/Schema/Union.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Schema/Union.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE GADTs #-}
+
+module Data.Morpheus.Server.Deriving.Schema.Union
+  ( buildUnionTypeContent,
+  )
+where
+
+import Data.List (partition)
+import Data.Morpheus.Internal.Utils (fromElems)
+import Data.Morpheus.Server.Deriving.Schema.Enum
+  ( defineEnumUnit,
+  )
+import Data.Morpheus.Server.Deriving.Schema.Object
+  ( defineObjectType,
+  )
+import Data.Morpheus.Server.Deriving.Utils
+  ( ConsRep (..),
+    fieldTypeName,
+    isEmptyConstraint,
+    isUnionRef,
+  )
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( CategoryValue,
+    KindedType (..),
+  )
+import Data.Morpheus.Server.Types.GQLType
+  ( GQLType,
+    TypeData (gqlTypeName),
+    __typeData,
+  )
+import Data.Morpheus.Server.Types.SchemaT
+  ( SchemaT,
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( CONST,
+    FieldContent (..),
+    IN,
+    TRUE,
+    TypeContent (..),
+    TypeName,
+    UnionMember (..),
+    mkNullaryMember,
+    mkUnionMember,
+  )
+import Relude
+
+buildUnionTypeContent ::
+  ( GQLType a,
+    CategoryValue kind
+  ) =>
+  KindedType kind a ->
+  [ConsRep (Maybe (FieldContent TRUE kind CONST))] ->
+  SchemaT c (TypeContent TRUE kind CONST)
+buildUnionTypeContent scope cons = mkUnionType scope unionRef unionCons
+  where
+    unionRef = fieldTypeName <$> concatMap consFields unionRefRep
+    (unionRefRep, unionCons) = partition (isUnionRef (gqlTypeName (__typeData scope))) cons
+
+mkUnionType ::
+  GQLType a =>
+  KindedType kind a ->
+  [TypeName] ->
+  [ConsRep (Maybe (FieldContent TRUE kind CONST))] ->
+  SchemaT c (TypeContent TRUE kind CONST)
+mkUnionType p@InputType unionRef unionCons = DataInputUnion <$> (typeMembers >>= fromElems)
+  where
+    (nullaryCons, cons) = partition isEmptyConstraint unionCons
+    nullaryMembers :: [UnionMember IN CONST]
+    nullaryMembers = mkNullaryMember . consName <$> nullaryCons
+    defineEnumEmpty
+      | null nullaryCons = pure ()
+      | otherwise = defineEnumUnit
+    typeMembers =
+      (<> nullaryMembers) . withRefs
+        <$> ( defineEnumEmpty *> buildUnions p cons
+            )
+      where
+        withRefs = fmap mkUnionMember . (unionRef <>)
+mkUnionType p@OutputType unionRef unionCons =
+  DataUnion <$> (buildUnions p unionCons >>= fromElems . map mkUnionMember . (unionRef <>))
+
+buildUnions ::
+  KindedType kind a ->
+  [ConsRep (Maybe (FieldContent TRUE kind CONST))] ->
+  SchemaT c [TypeName]
+buildUnions proxy cons =
+  traverse_ (defineObjectType proxy) cons $> fmap consName cons
diff --git a/src/Data/Morpheus/Server/Deriving/Utils.hs b/src/Data/Morpheus/Server/Deriving/Utils.hs
--- a/src/Data/Morpheus/Server/Deriving/Utils.hs
+++ b/src/Data/Morpheus/Server/Deriving/Utils.hs
@@ -8,6 +8,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE PolyKinds #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE TypeOperators #-}
@@ -18,7 +19,6 @@
     conNameProxy,
     isRecordProxy,
     selNameProxy,
-    ResRep (..),
     TypeRep (..),
     ConsRep (..),
     TypeConstraint (..),
@@ -30,36 +30,37 @@
     toValue,
     isUnionRef,
     fieldTypeName,
+    unpackMonad,
+    deriveTypeRef,
+    symbolName,
+    withKind,
+    toFieldRes,
   )
 where
 
-import Data.Functor (Functor (..))
-import Data.Functor.Identity (Identity (..))
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( CategoryValue (..),
+    KindedProxy (KindedProxy),
+    kinded,
+  )
 import Data.Morpheus.Server.Types.GQLType
   ( GQLType (..),
     GQLTypeOptions (..),
     TypeData (..),
-    __isObjectKind,
     __typeData,
     defaultTypeOptions,
   )
 import Data.Morpheus.Types.Internal.AST
-  ( FieldName (..),
+  ( FieldName,
     TypeCategory,
-    TypeName (..),
+    TypeName,
     TypeRef (..),
-    convertToJSONName,
-  )
-import Data.Morpheus.Utils.Kinded
-  ( CategoryValue (..),
-    kinded,
+    packName,
   )
-import Data.Proxy (Proxy (..))
-import Data.Semigroup (Semigroup (..))
 import Data.Text
   ( pack,
   )
-import GHC.Exts (Constraint)
+import qualified Data.Text as T
 import GHC.Generics
   ( (:*:) (..),
     (:+:) (..),
@@ -80,29 +81,31 @@
     datatypeName,
     selName,
   )
-import Relude
-  ( ($),
-    (.),
-    Bool (..),
-    Eq (..),
-    Int,
-    otherwise,
-    show,
-    undefined,
-    zipWith,
-  )
+import GHC.TypeLits
+import Relude hiding (undefined)
+import Prelude (undefined)
 
-datatypeNameProxy :: forall f (d :: Meta). Datatype d => f d -> TypeName
-datatypeNameProxy _ = TypeName $ pack $ datatypeName (undefined :: (M1 D d f a))
+datatypeNameProxy :: forall f (d :: Meta). Datatype d => GQLTypeOptions -> f d -> TypeName
+datatypeNameProxy options _ = packName $ pack $ typeNameModifier options False $ datatypeName (undefined :: (M1 D d f a))
 
 conNameProxy :: forall f (c :: Meta). Constructor c => GQLTypeOptions -> f c -> TypeName
 conNameProxy options _ =
-  TypeName $ pack $ constructorTagModifier options $ conName (undefined :: M1 C c U1 a)
+  packName $ pack $ constructorTagModifier options $ conName (undefined :: M1 C c U1 a)
 
 selNameProxy :: forall f (s :: Meta). Selector s => GQLTypeOptions -> f s -> FieldName
 selNameProxy options _ =
-  convertToJSONName $ FieldName $ pack $ fieldLabelModifier options $ selName (undefined :: M1 S s f a)
+  fromHaskellName
+    $ fieldLabelModifier options
+    $ selName (undefined :: M1 S s f a)
 
+fromHaskellName :: String -> FieldName
+fromHaskellName hsName
+  | not (null hsName) && (T.last name == '\'') = packName (T.init name)
+  | otherwise = packName name
+  where
+    name = T.pack hsName
+{-# INLINE fromHaskellName #-}
+
 isRecordProxy :: forall f (c :: Meta). Constructor c => f c -> Bool
 isRecordProxy _ = conIsRecord (undefined :: (M1 C c f a))
 
@@ -134,7 +137,7 @@
 
 instance (Datatype d, TypeRep c v f) => TypeRep c v (M1 D d f) where
   typeRep fun _ = typeRep fun (Proxy @f)
-  toTypeRep fun (M1 src) = (toTypeRep fun src) {tyName = datatypeNameProxy (Proxy @d)}
+  toTypeRep fun@(opt, _, _) (M1 src) = (toTypeRep fun src) {tyName = datatypeNameProxy opt (Proxy @d)}
 
 -- | recursion for Object types, both of them : 'INPUT_OBJECT' and 'OBJECT'
 instance (TypeRep c v a, TypeRep c v b) => TypeRep c v (a :+: b) where
@@ -200,14 +203,16 @@
 deriveFieldRep opt pSel kindedProxy v =
   FieldRep
     { fieldSelector = selNameProxy opt pSel,
-      fieldTypeRef =
-        TypeRef
-          { typeConName = gqlTypeName,
-            typeWrappers = gqlWrappers
-          },
-      fieldIsObject = __isObjectKind kindedProxy,
+      fieldTypeRef = deriveTypeRef kindedProxy,
       fieldValue = v
     }
+
+deriveTypeRef :: (GQLType a, CategoryValue kind) => kinded kind a -> TypeRef
+deriveTypeRef kindedProxy =
+  TypeRef
+    { typeConName = gqlTypeName,
+      typeWrappers = gqlWrappers
+    }
   where
     TypeData {gqlTypeName, gqlWrappers} = __typeData kindedProxy
 
@@ -229,18 +234,24 @@
 data FieldRep (a :: *) = FieldRep
   { fieldSelector :: FieldName,
     fieldTypeRef :: TypeRef,
-    fieldIsObject :: Bool,
     fieldValue :: a
   }
   deriving (Functor)
 
-data ResRep (a :: *)
-  = ResRep
-      { unionRef :: [TypeName],
-        unionCons :: [ConsRep a]
-      }
-  | EnumRep {enumCons :: [TypeName]}
+toFieldRes :: FieldRep (m a) -> (FieldName, m a)
+toFieldRes FieldRep {fieldSelector, fieldValue} = (fieldSelector, fieldValue)
 
+unpackMonadFromField :: Monad m => FieldRep (m a) -> m (FieldRep a)
+unpackMonadFromField FieldRep {..} = do
+  cont <- fieldValue
+  pure (FieldRep {fieldValue = cont, ..})
+
+unpackMonadFromCons :: Monad m => ConsRep (m a) -> m (ConsRep a)
+unpackMonadFromCons ConsRep {..} = ConsRep consName <$> traverse unpackMonadFromField consFields
+
+unpackMonad :: Monad m => [ConsRep (m a)] -> m [ConsRep a]
+unpackMonad = traverse unpackMonadFromCons
+
 isEmptyConstraint :: ConsRep a -> Bool
 isEmptyConstraint ConsRep {consFields = []} = True
 isEmptyConstraint _ = False
@@ -249,12 +260,18 @@
 enumerate :: [FieldRep a] -> [FieldRep a]
 enumerate = zipWith setFieldName ([0 ..] :: [Int])
   where
-    setFieldName i field = field {fieldSelector = FieldName $ "_" <> pack (show i)}
+    setFieldName i field = field {fieldSelector = packName $ "_" <> pack (show i)}
 
 fieldTypeName :: FieldRep k -> TypeName
 fieldTypeName = typeConName . fieldTypeRef
 
 isUnionRef :: TypeName -> ConsRep k -> Bool
-isUnionRef baseName ConsRep {consName, consFields = [fieldRep@FieldRep {fieldIsObject = True}]} =
+isUnionRef baseName ConsRep {consName, consFields = [fieldRep]} =
   consName == baseName <> fieldTypeName fieldRep
 isUnionRef _ _ = False
+
+symbolName :: KnownSymbol a => f a -> FieldName
+symbolName = fromString . symbolVal
+
+withKind :: Proxy a -> KindedProxy (KIND a) a
+withKind _ = KindedProxy
diff --git a/src/Data/Morpheus/Server/Deriving/Utils/Decode.hs b/src/Data/Morpheus/Server/Deriving/Utils/Decode.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Utils/Decode.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.Server.Deriving.Utils.Decode
+  ( withInputObject,
+    withEnum,
+    withInputUnion,
+    decodeFieldWith,
+    withScalar,
+    handleEither,
+  )
+where
+
+import Control.Monad.Except (MonadError (throwError))
+import Data.Morpheus.Internal.Utils
+  ( selectOr,
+  )
+import Data.Morpheus.Types.GQLScalar
+  ( toScalar,
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( FieldName,
+    GQLError,
+    Msg (msg),
+    ObjectEntry (..),
+    ScalarValue,
+    Token,
+    TypeName,
+    VALID,
+    ValidObject,
+    ValidValue,
+    Value (..),
+    getInputUnionValue,
+    internal,
+  )
+import Relude
+
+withInputObject ::
+  MonadError GQLError m =>
+  (ValidObject -> m a) ->
+  ValidValue ->
+  m a
+withInputObject f (Object object) = f object
+withInputObject _ isType = throwError (typeMismatch "InputObject" isType)
+
+-- | Useful for more restrictive instances of lists (non empty, size indexed etc)
+withEnum :: MonadError GQLError m => (TypeName -> m a) -> Value VALID -> m a
+withEnum decode (Enum value) = decode value
+withEnum _ isType = throwError (typeMismatch "Enum" isType)
+
+withInputUnion ::
+  (MonadError GQLError m, Monad m) =>
+  (TypeName -> ValidObject -> ValidObject -> m a) ->
+  ValidObject ->
+  m a
+withInputUnion decoder unions =
+  either onFail onSucc (getInputUnionValue unions)
+  where
+    onSucc (name, value) = withInputObject (decoder name unions) value
+    onFail = throwError . internal . msg
+
+withScalar ::
+  (Applicative m, MonadError GQLError m) =>
+  TypeName ->
+  (ScalarValue -> Either Token a) ->
+  Value VALID ->
+  m a
+withScalar typename decodeScalar value = case toScalar value >>= decodeScalar of
+  Right scalar -> pure scalar
+  Left message ->
+    throwError
+      ( typeMismatch
+          ("SCALAR(" <> msg typename <> ")" <> msg message)
+          value
+      )
+
+decodeFieldWith :: (Value VALID -> m a) -> FieldName -> ValidObject -> m a
+decodeFieldWith decoder = selectOr (decoder Null) (decoder . entryValue)
+
+handleEither :: MonadError GQLError m => Either GQLError a -> m a
+handleEither = either throwError pure
+
+-- if value is already validated but value has different type
+typeMismatch :: GQLError -> Value s -> GQLError
+typeMismatch text jsType =
+  internal $
+    "Type mismatch! expected:" <> text <> ", got: "
+      <> msg jsType
diff --git a/src/Data/Morpheus/Server/Deriving/Utils/GTraversable.hs b/src/Data/Morpheus/Server/Deriving/Utils/GTraversable.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Utils/GTraversable.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.Server.Deriving.Utils.GTraversable where
+
+import qualified Data.Map as M
+import Data.Morpheus.Kind
+import Data.Morpheus.NamedResolvers (NamedResolverT)
+import Data.Morpheus.Server.Deriving.Utils.Kinded
+import Data.Morpheus.Server.Types.GQLType (GQLType (KIND, __type), TypeData (gqlFingerprint))
+import Data.Morpheus.Server.Types.SchemaT (TypeFingerprint)
+import Data.Morpheus.Types.Internal.AST
+import GHC.Generics
+import Relude hiding (Undefined)
+
+traverseTypes ::
+  (GFmap (ScanConstraint c) (KIND a) a, c (KIND a) a, GQLType a) =>
+  Mappable c v KindedProxy ->
+  Proxy a ->
+  Map TypeFingerprint v
+traverseTypes f = runMappable (scanner f mempty) . withDerivable
+
+class
+  (GFmap (ScanConstraint c) (KIND a) a, c (KIND a) a) =>
+  ScanConstraint
+    (c :: DerivingKind -> * -> Constraint)
+    (k :: DerivingKind)
+    (a :: *)
+
+instance (GFmap (ScanConstraint c) (KIND a) a, c (KIND a) a) => ScanConstraint c k a
+
+scanner ::
+  Mappable c v KindedProxy ->
+  Map TypeFingerprint v ->
+  Mappable (ScanConstraint c) (Map TypeFingerprint v) KindedProxy
+scanner c@(Mappable f) lib =
+  Mappable
+    ( \proxy -> do
+        let typeInfo = __type proxy OUT
+        let fingerprint = gqlFingerprint typeInfo
+        if M.member fingerprint lib
+          then lib
+          else do
+            let newLib = M.insert fingerprint (f proxy) lib
+            gfmap (scanner c newLib) proxy
+    )
+
+withDerivable :: proxy a -> KindedProxy (KIND a) a
+withDerivable _ = KindedProxy
+
+newtype Mappable (c :: DerivingKind -> * -> Constraint) (v :: *) (f :: DerivingKind -> * -> *) = Mappable
+  { runMappable :: forall a. (GQLType a, c (KIND a) a) => KindedProxy (KIND a) a -> v
+  }
+
+-- Map
+class GFmap (c :: DerivingKind -> * -> Constraint) (t :: DerivingKind) a where
+  gfmap :: (Monoid v, Semigroup v) => Mappable c v KindedProxy -> kinded t a -> v
+
+instance (GQLType a, c (KIND a) a) => GFmap c SCALAR a where
+  gfmap (Mappable f) _ = f (KindedProxy :: KindedProxy (KIND a) a)
+
+instance (GQLType a, c (KIND a) a, GFunctor c (Rep a)) => GFmap c TYPE a where
+  gfmap f@(Mappable fx) _ = fx (KindedProxy :: KindedProxy (KIND a) a) <> genericMap f (Proxy @(Rep a))
+
+instance GFmap c (KIND a) a => GFmap c WRAPPER (f a) where
+  gfmap f _ = gfmap f (KindedProxy :: KindedProxy (KIND a) a)
+
+instance GFmap c (KIND a) a => GFmap c CUSTOM (input -> a) where
+  gfmap f _ = gfmap f (KindedProxy :: KindedProxy (KIND a) a)
+
+instance GFmap c (KIND a) a => GFmap c CUSTOM (NamedResolverT m a) where
+  gfmap f _ = gfmap f (KindedProxy :: KindedProxy (KIND a) a)
+
+--
+--
+-- GFunctor
+--
+--
+class GFunctor (c :: DerivingKind -> * -> Constraint) a where
+  genericMap :: (Monoid v, Semigroup v) => Mappable c v p -> proxy a -> v
+
+instance (Datatype d, GFunctor c a) => GFunctor c (M1 D d a) where
+  genericMap fun _ = genericMap fun (Proxy @a)
+
+instance (GFunctor con a) => GFunctor con (M1 C c a) where
+  genericMap f _ = genericMap f (Proxy @a)
+
+instance (GFunctor c a, GFunctor c b) => GFunctor c (a :+: b) where
+  genericMap fun _ = genericMap fun (Proxy @a) <> genericMap fun (Proxy @b)
+
+instance (GFunctor c a, GFunctor c b) => GFunctor c (a :*: b) where
+  genericMap fun _ = genericMap fun (Proxy @a) <> genericMap fun (Proxy @b)
+
+instance (GQLType a, c (KIND a) a) => GFunctor c (M1 S s (K1 x a)) where
+  genericMap (Mappable f) _ = f (KindedProxy :: KindedProxy (KIND a) a)
+
+instance GFunctor c U1 where
+  genericMap _ _ = mempty
diff --git a/src/Data/Morpheus/Server/Deriving/Utils/Kinded.hs b/src/Data/Morpheus/Server/Deriving/Utils/Kinded.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/Deriving/Utils/Kinded.hs
@@ -0,0 +1,69 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.Server.Deriving.Utils.Kinded
+  ( KindedProxy (..),
+    setType,
+    setKind,
+    kinded,
+    KindedType (..),
+    inputType,
+    outputType,
+    CategoryValue (..),
+  )
+where
+
+import Data.Morpheus.Types.Internal.AST
+  ( IN,
+    LEAF,
+    OUT,
+    TypeCategory (..),
+  )
+import Prelude (Show)
+
+class CategoryValue (c :: TypeCategory) where
+  categoryValue :: f c -> TypeCategory
+
+instance CategoryValue OUT where
+  categoryValue _ = OUT
+
+instance CategoryValue IN where
+  categoryValue _ = IN
+
+instance CategoryValue LEAF where
+  categoryValue _ = LEAF
+
+-- | context , like Proxy with multiple parameters
+-- * 'kind': object, scalar, enum ...
+-- * 'a': actual gql type
+data KindedProxy k a
+  = KindedProxy
+
+setType :: f a -> kinded (k :: t) a' -> KindedProxy k a
+setType _ _ = KindedProxy
+
+setKind :: f k -> kinded (k' :: t) a -> KindedProxy k a
+setKind _ _ = KindedProxy
+
+kinded :: f k -> f' a -> KindedProxy k a
+kinded _ _ = KindedProxy
+
+data KindedType (cat :: TypeCategory) a where
+  InputType :: KindedType IN a
+  OutputType :: KindedType OUT a
+
+deriving instance Show (KindedType cat a)
+
+-- converts:
+--   f a -> KindedType IN a
+-- or
+--  f k a -> KindedType IN a
+inputType :: f a -> KindedType IN a
+inputType _ = InputType
+
+outputType :: f a -> KindedType OUT a
+outputType _ = OutputType
diff --git a/src/Data/Morpheus/Server/Internal/TH/Decode.hs b/src/Data/Morpheus/Server/Internal/TH/Decode.hs
deleted file mode 100644
--- a/src/Data/Morpheus/Server/Internal/TH/Decode.hs
+++ /dev/null
@@ -1,93 +0,0 @@
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Data.Morpheus.Server.Internal.TH.Decode
-  ( withInputObject,
-    withEnum,
-    withInputUnion,
-    decodeFieldWith,
-    withScalar,
-    handleEither,
-  )
-where
-
-import Data.Morpheus.App.Internal.Resolving
-  ( Failure (..),
-  )
-import Data.Morpheus.Internal.Utils
-  ( selectOr,
-  )
-import Data.Morpheus.Types.GQLScalar
-  ( toScalar,
-  )
-import Data.Morpheus.Types.Internal.AST
-  ( FieldName,
-    InternalError,
-    Message,
-    ObjectEntry (..),
-    ScalarValue,
-    Token,
-    TypeName (..),
-    VALID,
-    ValidObject,
-    ValidValue,
-    Value (..),
-    getInputUnionValue,
-    msg,
-    msgInternal,
-  )
-import Relude hiding (empty)
-
-withInputObject ::
-  Failure InternalError m =>
-  (ValidObject -> m a) ->
-  ValidValue ->
-  m a
-withInputObject f (Object object) = f object
-withInputObject _ isType = failure (typeMismatch "InputObject" isType)
-
--- | Useful for more restrictive instances of lists (non empty, size indexed etc)
-withEnum :: Failure InternalError m => (TypeName -> m a) -> Value VALID -> m a
-withEnum decode (Enum value) = decode value
-withEnum _ isType = failure (typeMismatch "Enum" isType)
-
-withInputUnion ::
-  (Failure InternalError m, Monad m) =>
-  (TypeName -> ValidObject -> ValidObject -> m a) ->
-  ValidObject ->
-  m a
-withInputUnion decoder unions =
-  either onFail onSucc (getInputUnionValue unions)
-  where
-    onSucc (name, value) = withInputObject (decoder name unions) value
-    onFail = failure . msgInternal
-
-withScalar ::
-  (Applicative m, Failure InternalError m) =>
-  TypeName ->
-  (ScalarValue -> Either Token a) ->
-  Value VALID ->
-  m a
-withScalar typename decodeScalar value = case toScalar value >>= decodeScalar of
-  Right scalar -> pure scalar
-  Left message ->
-    failure
-      ( typeMismatch
-          ("SCALAR(" <> msg typename <> ")" <> msg message)
-          value
-      )
-
-decodeFieldWith :: (Value VALID -> m a) -> FieldName -> ValidObject -> m a
-decodeFieldWith decoder = selectOr (decoder Null) (decoder . entryValue)
-
-handleEither :: Failure InternalError m => Either Message a -> m a
-handleEither = either (failure . msgInternal) pure
-
--- if value is already validated but value has different type
-typeMismatch :: Message -> Value s -> InternalError
-typeMismatch text jsType =
-  "Type mismatch! expected:" <> msgInternal text <> ", got: "
-    <> msgInternal jsType
diff --git a/src/Data/Morpheus/Server/Internal/TH/Types.hs b/src/Data/Morpheus/Server/Internal/TH/Types.hs
deleted file mode 100644
--- a/src/Data/Morpheus/Server/Internal/TH/Types.hs
+++ /dev/null
@@ -1,50 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Data.Morpheus.Server.Internal.TH.Types
-  ( ServerTypeDefinition (..),
-    ServerDec,
-    ServerDecContext (..),
-    ServerConsD,
-    ServerFieldDefinition (..),
-    toServerField,
-  )
-where
-
-import Data.Morpheus.Types.Internal.AST
-  ( ANY,
-    ConsD (..),
-    FieldDefinition,
-    IN,
-    TypeDefinition,
-    TypeKind,
-    TypeName,
-  )
-import Relude
-
-data ServerFieldDefinition cat s = ServerFieldDefinition
-  { isParametrized :: Bool,
-    argumentsTypeName :: Maybe TypeName,
-    originalField :: FieldDefinition cat s
-  }
-  deriving (Show)
-
-toServerField :: FieldDefinition c s -> ServerFieldDefinition c s
-toServerField = ServerFieldDefinition False Nothing
-
-type ServerConsD cat s = ConsD (ServerFieldDefinition cat s)
-
---- Core
-data ServerTypeDefinition cat s = ServerTypeDefinition
-  { tName :: TypeName,
-    typeArgD :: [ServerTypeDefinition IN s],
-    tCons :: [ServerConsD cat s],
-    tKind :: TypeKind,
-    typeOriginal :: Maybe (TypeDefinition ANY s)
-  }
-  deriving (Show)
-
-type ServerDec = Reader ServerDecContext
-
-newtype ServerDecContext = ServerDecContext
-  { namespace :: Bool
-  }
diff --git a/src/Data/Morpheus/Server/Internal/TH/Utils.hs b/src/Data/Morpheus/Server/Internal/TH/Utils.hs
deleted file mode 100644
--- a/src/Data/Morpheus/Server/Internal/TH/Utils.hs
+++ /dev/null
@@ -1,120 +0,0 @@
-{-# LANGUAGE GADTs #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Data.Morpheus.Server.Internal.TH.Utils
-  ( kindName,
-    constraintTypeable,
-    typeNameStringE,
-    withPure,
-    mkTypeableConstraints,
-    m',
-    m_,
-    tyConArgs,
-    funDProxy,
-    isParametrizedResolverType,
-    isSubscription,
-  )
-where
-
-import Data.Morpheus.Internal.TH
-  ( _',
-    apply,
-    funDSimple,
-    toName,
-    vars,
-  )
-import Data.Morpheus.Kind
-  ( INTERFACE,
-    SCALAR,
-    TYPE,
-    WRAPPER,
-  )
-import Data.Morpheus.Types.Internal.AST
-  ( ANY,
-    OperationType (..),
-    TypeDefinition (..),
-    TypeKind (..),
-    TypeName (..),
-    isResolverType,
-    lookupWith,
-  )
-import Data.Text (unpack)
-import Language.Haskell.TH
-  ( CxtQ,
-    Dec (..),
-    DecQ,
-    Exp (..),
-    ExpQ,
-    Info (..),
-    Lit (..),
-    Name,
-    Q,
-    TyVarBndr,
-    Type (..),
-    cxt,
-    mkName,
-    reify,
-  )
-import Relude hiding (Type)
-
-m_ :: String
-m_ = "m"
-
-m' :: Type
-m' = VarT (mkName m_)
-
-isParametrizedResolverType :: TypeName -> [TypeDefinition ANY s] -> Q Bool
-isParametrizedResolverType "__TypeKind" _ = pure False
-isParametrizedResolverType "Boolean" _ = pure False
-isParametrizedResolverType "String" _ = pure False
-isParametrizedResolverType "Int" _ = pure False
-isParametrizedResolverType "Float" _ = pure False
-isParametrizedResolverType key lib = case lookupWith typeName key lib of
-  Just x -> pure (isResolverType x)
-  Nothing -> isParametrizedType <$> reify (toName key)
-
-isParametrizedType :: Info -> Bool
-isParametrizedType (TyConI x) = not $ null $ getTypeVariables x
-isParametrizedType _ = False
-
-getTypeVariables :: Dec -> [TyVarBndr]
-getTypeVariables (DataD _ _ args _ _ _) = args
-getTypeVariables (NewtypeD _ _ args _ _ _) = args
-getTypeVariables (TySynD _ args _) = args
-getTypeVariables _ = []
-
-funDProxy :: [(Name, ExpQ)] -> [DecQ]
-funDProxy = map fun
-  where
-    fun (name, body) = funDSimple name [_'] body
-
-tyConArgs :: TypeKind -> [String]
-tyConArgs kind
-  | isResolverType kind = [m_]
-  | otherwise = []
-
-withPure :: Exp -> Exp
-withPure = AppE (VarE 'pure)
-
-typeNameStringE :: TypeName -> Exp
-typeNameStringE = LitE . StringL . (unpack . readTypeName)
-
-constraintTypeable :: Type -> Type
-constraintTypeable name = apply ''Typeable [name]
-
-mkTypeableConstraints :: [String] -> CxtQ
-mkTypeableConstraints args = cxt $ map (pure . constraintTypeable) (vars args)
-
-kindName :: TypeKind -> Name
-kindName KindScalar = ''SCALAR
-kindName KindList = ''WRAPPER
-kindName KindNonNull = ''WRAPPER
-kindName KindInterface = ''INTERFACE
-kindName _ = ''TYPE
-
-isSubscription :: TypeKind -> Bool
-isSubscription (KindObject (Just Subscription)) = True
-isSubscription _ = False
diff --git a/src/Data/Morpheus/Server/TH/Compile.hs b/src/Data/Morpheus/Server/TH/Compile.hs
--- a/src/Data/Morpheus/Server/TH/Compile.hs
+++ b/src/Data/Morpheus/Server/TH/Compile.hs
@@ -1,11 +1,9 @@
-{-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 
 module Data.Morpheus.Server.TH.Compile
   ( compileDocument,
     gqlDocument,
-    gqlDocumentNamespace,
   )
 where
 
@@ -13,58 +11,34 @@
 --  Morpheus
 
 import qualified Data.ByteString.Lazy.Char8 as LB
-  ( pack,
-  )
-import Data.Morpheus.App.Internal.Resolving
-  ( Result (..),
-  )
-import Data.Morpheus.Core
-  ( parseTypeDefinitions,
-  )
-import Data.Morpheus.Error
-  ( gqlWarnings,
-    renderGQLErrors,
+import Data.ByteString.Lazy.Char8 (ByteString)
+import Data.Morpheus.CodeGen
+  ( parseServerTypeDefinitions,
   )
-import Data.Morpheus.Server.Internal.TH.Types
-  ( ServerDecContext (..),
+import Data.Morpheus.CodeGen.Internal.AST
+  ( CodeGenConfig (..),
   )
 import Data.Morpheus.Server.TH.Declare
-  ( declare,
-  )
-import Data.Morpheus.Server.TH.Transform
-  ( toTHDefinitions,
+  ( runDeclare,
   )
-import Language.Haskell.TH (Dec, Q)
+import Language.Haskell.TH
 import Language.Haskell.TH.Quote (QuasiQuoter (..))
-import Relude
-
-gqlDocumentNamespace :: QuasiQuoter
-gqlDocumentNamespace =
-  QuasiQuoter
-    { quoteExp = notHandled "Expressions",
-      quotePat = notHandled "Patterns",
-      quoteType = notHandled "Types",
-      quoteDec = compileDocument ServerDecContext {namespace = True}
-    }
-  where
-    notHandled things =
-      error $ things <> " are not supported by the GraphQL QuasiQuoter"
+import Relude hiding (ByteString)
 
 gqlDocument :: QuasiQuoter
-gqlDocument =
+gqlDocument = mkQuasiQuoter CodeGenConfig {namespace = False}
+
+mkQuasiQuoter :: CodeGenConfig -> QuasiQuoter
+mkQuasiQuoter ctx =
   QuasiQuoter
     { quoteExp = notHandled "Expressions",
       quotePat = notHandled "Patterns",
       quoteType = notHandled "Types",
-      quoteDec = compileDocument ServerDecContext {namespace = False}
+      quoteDec = compileDocument ctx . LB.pack
     }
   where
     notHandled things =
       error $ things <> " are not supported by the GraphQL QuasiQuoter"
 
-compileDocument :: ServerDecContext -> String -> Q [Dec]
-compileDocument ctx documentTXT =
-  case parseTypeDefinitions (LB.pack documentTXT) of
-    Failure errors -> fail (renderGQLErrors errors)
-    Success {result = schema, warnings} ->
-      gqlWarnings warnings >> toTHDefinitions (namespace ctx) schema >>= declare ctx
+compileDocument :: CodeGenConfig -> ByteString -> Q [Dec]
+compileDocument ctx = parseServerTypeDefinitions ctx >=> runDeclare ctx
diff --git a/src/Data/Morpheus/Server/TH/Declare.hs b/src/Data/Morpheus/Server/TH/Declare.hs
--- a/src/Data/Morpheus/Server/TH/Declare.hs
+++ b/src/Data/Morpheus/Server/TH/Declare.hs
@@ -1,22 +1,16 @@
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 
 module Data.Morpheus.Server.TH.Declare
-  ( declare,
+  ( runDeclare,
   )
 where
 
--- MORPHEUS
-import Control.Applicative (pure)
-import Control.Monad.Reader (runReader)
-import Data.Foldable (concat)
-import Data.Functor (fmap)
-import Data.Morpheus.Server.Internal.TH.Types
-  ( ServerDecContext (..),
-    ServerTypeDefinition (..),
+import Data.Morpheus.CodeGen.Internal.AST
+  ( CodeGenConfig (..),
+    ServerTypeDefinition,
   )
 import Data.Morpheus.Server.TH.Declare.GQLType
   ( deriveGQLType,
@@ -24,34 +18,18 @@
 import Data.Morpheus.Server.TH.Declare.Type
   ( declareType,
   )
-import Data.Morpheus.Server.TH.Transform
-import Data.Semigroup ((<>))
-import Data.Traversable (traverse)
+import Data.Morpheus.Server.TH.Utils (ServerDec)
 import Language.Haskell.TH
-import Prelude
-  ( ($),
-    (.),
-  )
+import Relude
 
+runDeclare :: Declare a => CodeGenConfig -> a -> Q [Dec]
+runDeclare ctx a = runReaderT (declare a) ctx
+
 class Declare a where
-  declare :: ServerDecContext -> a -> Q [Dec]
+  declare :: a -> ServerDec [Dec]
 
 instance Declare a => Declare [a] where
-  declare namespace = fmap concat . traverse (declare namespace)
-
-instance Declare (TypeDec s) where
-  declare namespace (InputType typeD) = declare namespace typeD
-  declare namespace (OutputType typeD) = declare namespace typeD
-
-instance Declare (ServerTypeDefinition cat s) where
-  declare ctx typeD@ServerTypeDefinition {typeArgD} =
-    do
-      typeDef <- declareServerType ctx typeD
-      argTypes <- traverse (declareServerType ctx) typeArgD
-      pure $ typeDef <> concat argTypes
+  declare = fmap concat . traverse declare
 
-declareServerType :: ServerDecContext -> ServerTypeDefinition cat s -> Q [Dec]
-declareServerType ctx argType = do
-  typeClasses <- deriveGQLType ctx argType
-  let defs = runReader (declareType argType) ctx
-  pure (defs <> typeClasses)
+instance Declare ServerTypeDefinition where
+  declare typeDef = (declareType typeDef <>) <$> deriveGQLType typeDef
diff --git a/src/Data/Morpheus/Server/TH/Declare/GQLType.hs b/src/Data/Morpheus/Server/TH/Declare/GQLType.hs
--- a/src/Data/Morpheus/Server/TH/Declare/GQLType.hs
+++ b/src/Data/Morpheus/Server/TH/Declare/GQLType.hs
@@ -15,217 +15,122 @@
   )
 where
 
---
--- MORPHEUS
-import Control.Applicative (Applicative (..))
-import Control.Monad (Monad ((>>=)))
-import Data.Functor ((<$>), fmap)
-import Data.Map (Map, empty, fromList)
-import Data.Maybe (Maybe (..), maybe)
-import Data.Morpheus.Internal.TH
+import Data.Char (toLower)
+import Data.Morpheus.CodeGen.Internal.AST
+  ( CodeGenConfig (..),
+    GQLTypeDefinition (..),
+    Kind (..),
+    ServerTypeDefinition (..),
+  )
+import Data.Morpheus.CodeGen.Internal.TH
   ( apply,
     applyVars,
-    toName,
     typeInstanceDec,
   )
-import Data.Morpheus.Internal.Utils
-  ( elems,
-    stripConstructorNamespace,
-    stripFieldNamespace,
-  )
-import Data.Morpheus.Server.Internal.TH.Types
-  ( ServerDecContext (..),
-    ServerTypeDefinition (..),
+import Data.Morpheus.Kind
+  ( SCALAR,
+    TYPE,
   )
-import Data.Morpheus.Server.Internal.TH.Utils
-  ( funDProxy,
-    kindName,
+import Data.Morpheus.Server.TH.Utils
+  ( ServerDec,
+    funDProxy,
     mkTypeableConstraints,
-    tyConArgs,
+    renderTypeVars,
   )
-import Data.Morpheus.Server.Types.GQLType
+import Data.Morpheus.Types
   ( GQLType (..),
     GQLTypeOptions (..),
   )
-import Data.Morpheus.Types (Resolver, interface)
 import Data.Morpheus.Types.Internal.AST
-  ( ANY,
-    ArgumentsDefinition,
-    DataEnumValue (..),
-    Description,
-    Directives,
-    FieldContent (..),
-    FieldDefinition (..),
-    FieldName (..),
-    FieldsDefinition,
-    IN,
-    OUT,
-    QUERY,
-    TRUE,
-    Token,
-    TypeContent (..),
-    TypeDefinition (..),
-    TypeKind (..),
-    TypeName (..),
-    Value,
+  ( TypeKind (..),
   )
-import Data.Proxy (Proxy (..))
+import qualified Data.Text as T
 import Language.Haskell.TH
-import Prelude
-  ( ($),
-    (.),
-    concatMap,
-    id,
-    null,
-    otherwise,
+  ( Dec,
+    DecQ,
+    Name,
+    Q,
+    Type (ConT),
+    instanceD,
   )
+import Relude
 
-interfaceF :: Name -> ExpQ
-interfaceF name = [|interface (Proxy :: (Proxy ($(conT name) (Resolver QUERY () Maybe))))|]
+dropPrefix :: Text -> String -> String
+dropPrefix name = drop (T.length name)
 
-introspectInterface :: TypeName -> ExpQ
-introspectInterface = interfaceF . toName
+stripConstructorNamespace :: Text -> String -> String
+stripConstructorNamespace = dropPrefix
 
-dropNamespaceOptions :: TypeKind -> TypeName -> GQLTypeOptions -> GQLTypeOptions
+stripFieldNamespace :: Text -> String -> String
+stripFieldNamespace prefix = __uncapitalize . dropPrefix prefix
+  where
+    __uncapitalize [] = []
+    __uncapitalize (x : xs) = toLower x : xs
+
+dropNamespaceOptions :: TypeKind -> Text -> GQLTypeOptions -> GQLTypeOptions
+dropNamespaceOptions KindInterface tName opt =
+  opt
+    { typeNameModifier = const (stripConstructorNamespace "Interface"),
+      fieldLabelModifier = stripFieldNamespace tName
+    }
 dropNamespaceOptions KindEnum tName opt = opt {constructorTagModifier = stripConstructorNamespace tName}
 dropNamespaceOptions _ tName opt = opt {fieldLabelModifier = stripFieldNamespace tName}
 
-deriveGQLType :: ServerDecContext -> ServerTypeDefinition cat s -> Q [Dec]
+deriveGQLType :: ServerTypeDefinition -> ServerDec [Dec]
+deriveGQLType ServerInterfaceDefinition {} = pure []
 deriveGQLType
-  ServerDecContext {namespace}
-  ServerTypeDefinition {tName, tKind, typeOriginal} =
-    pure <$> instanceD constrains iHead (typeFamilies : functions)
+  ServerTypeDefinition
+    { tName,
+      tKind,
+      typeParameters,
+      gql
+    } = do
+    let typeVars = renderTypeVars typeParameters
+    let constrains = mkTypeableConstraints typeVars
+    let typeSignature = apply ''GQLType [applyVars tName typeVars]
+    methods <- defineMethods tName tKind typeVars gql
+    gqlTypeDeclaration <- lift (instanceD constrains typeSignature methods)
+    pure [gqlTypeDeclaration]
+
+defineTypeOptions :: Text -> TypeKind -> ServerDec [DecQ]
+defineTypeOptions tName kind = do
+  CodeGenConfig {namespace} <- ask
+  pure $ funDProxy [('typeOptions, [|dropNamespaceOptions kind tName|]) | namespace]
+
+defineMethods ::
+  Text ->
+  TypeKind ->
+  [Name] ->
+  Maybe GQLTypeDefinition ->
+  ServerDec [Q Dec]
+defineMethods tName kind _ Nothing = defineTypeOptions tName kind
+defineMethods
+  tName
+  kind
+  typeParameters
+  ( Just
+      GQLTypeDefinition
+        { gqlTypeDescription,
+          gqlTypeDescriptions,
+          gqlTypeDirectives,
+          gqlTypeDefaultValues,
+          gqlKind
+        }
+    ) = do
+    options <- defineTypeOptions tName kind
+    pure (typeFamilies : functions <> options)
     where
       functions =
         funDProxy
-          [ ('description, [|tDescription|]),
-            ('implements, implementsFunc),
-            ('typeOptions, typeOptionsFunc),
-            ('getDescriptions, fieldDescriptionsFunc),
-            ('getDirectives, fieldDirectivesFunc),
-            ('getFieldContents, getFieldContentsFunc)
+          [ ('description, [|gqlTypeDescription|]),
+            ('getDescriptions, [|gqlTypeDescriptions|]),
+            ('getDirectives, [|gqlTypeDirectives|]),
+            ('defaultValues, [|gqlTypeDefaultValues|])
           ]
-        where
-          tDescription = typeOriginal >>= typeDescription
-          implementsFunc = listE $ fmap introspectInterface (interfacesFrom typeOriginal)
-          typeOptionsFunc
-            | namespace = [|dropNamespaceOptions tKind tName|]
-            | otherwise = varE 'id
-          fieldDescriptionsFunc = [|value|]
-            where
-              value = getDesc typeOriginal
-          fieldDirectivesFunc = [|value|]
-            where
-              value = getDirs typeOriginal
-          getFieldContentsFunc = [|value|]
-            where
-              value =
-                fmapFieldValues
-                  (fmap getDefaultValue . fieldContent)
-                  (fmap getDefaultValue . fieldContent)
-                  typeOriginal
-      --------------------------------
-      typeArgs = tyConArgs tKind
-      --------------------------------
-      iHead = apply ''GQLType [applyVars tName typeArgs]
-      headSig = applyVars tName typeArgs
-      ---------------------------------------------------
-      constrains = mkTypeableConstraints typeArgs
-      -------------------------------------------------
-      typeFamilies = deriveInstance ''KIND (kindName tKind)
-        where
-          deriveInstance :: Name -> Name -> Q Dec
-          deriveInstance insName tyName = do
-            typeN <- headSig
-            pure $ typeInstanceDec insName typeN (ConT tyName)
-
-interfacesFrom :: Maybe (TypeDefinition ANY s) -> [TypeName]
-interfacesFrom (Just TypeDefinition {typeContent = DataObject {objectImplements}}) = objectImplements
-interfacesFrom _ = []
-
-fmapFieldValues :: (FieldDefinition IN s -> Maybe a) -> (FieldDefinition OUT s -> Maybe a) -> Maybe (TypeDefinition c s) -> Map FieldName a
-fmapFieldValues f g = maybe empty (collectFieldValues f g)
-
-getDesc :: Maybe (TypeDefinition c s) -> Map Token Description
-getDesc = fromList . get
-
-getDirs :: Maybe (TypeDefinition c s) -> Map Token (Directives s)
-getDirs = fromList . get
-
-class Meta a v where
-  get :: a -> [(Token, v)]
-
-instance (Meta a v) => Meta (Maybe a) v where
-  get (Just x) = get x
-  get _ = []
-
-instance
-  ( Meta (FieldsDefinition IN s) v,
-    Meta (FieldsDefinition OUT s) v,
-    Meta (DataEnumValue s) v
-  ) =>
-  Meta (TypeDefinition c s) v
-  where
-  get TypeDefinition {typeContent} = get typeContent
-
-instance
-  ( Meta (FieldsDefinition IN s) v,
-    Meta (FieldsDefinition OUT s) v,
-    Meta (DataEnumValue s) v
-  ) =>
-  Meta (TypeContent a c s) v
-  where
-  get DataObject {objectFields} = get objectFields
-  get DataInputObject {inputObjectFields} = get inputObjectFields
-  get DataInterface {interfaceFields} = get interfaceFields
-  get DataEnum {enumMembers} = concatMap get enumMembers
-  get _ = []
-
-instance Meta (DataEnumValue s) Description where
-  get DataEnumValue {enumName, enumDescription = Just x} = [(readTypeName enumName, x)]
-  get _ = []
-
-instance Meta (DataEnumValue s) (Directives s) where
-  get DataEnumValue {enumName, enumDirectives}
-    | null enumDirectives = []
-    | otherwise = [(readTypeName enumName, enumDirectives)]
-
-instance
-  Meta (FieldDefinition c s) v =>
-  Meta (FieldsDefinition c s) v
-  where
-  get = concatMap get . elems
-
-instance Meta (FieldDefinition c s) Description where
-  get FieldDefinition {fieldName, fieldDescription = Just x} = [(readName fieldName, x)]
-  get _ = []
-
-instance Meta (FieldDefinition c s) (Directives s) where
-  get FieldDefinition {fieldName, fieldDirectives}
-    | null fieldDirectives = []
-    | otherwise = [(readName fieldName, fieldDirectives)]
-
-collectFieldValues ::
-  (FieldDefinition IN s -> Maybe a) ->
-  (FieldDefinition OUT s -> Maybe a) ->
-  TypeDefinition c s ->
-  Map FieldName a
-collectFieldValues _ g TypeDefinition {typeContent = DataObject {objectFields}} = getFieldValues g objectFields
-collectFieldValues f _ TypeDefinition {typeContent = DataInputObject {inputObjectFields}} = getFieldValues f inputObjectFields
-collectFieldValues _ g TypeDefinition {typeContent = DataInterface {interfaceFields}} = getFieldValues g interfaceFields
-collectFieldValues _ _ _ = empty
-
-getFieldValues :: (FieldDefinition c s -> Maybe a) -> FieldsDefinition c s -> Map FieldName a
-getFieldValues f = fromList . notNulls . fmap (getFieldValue f) . elems
-
-notNulls :: [(k, Maybe a)] -> [(k, a)]
-notNulls [] = []
-notNulls ((_, Nothing) : xs) = notNulls xs
-notNulls ((name, Just x) : xs) = (name, x) : notNulls xs
-
-getFieldValue :: (FieldDefinition c s -> Maybe a) -> FieldDefinition c s -> (FieldName, Maybe a)
-getFieldValue f field = (fieldName field, f field)
+      typeFamilies = do
+        currentType <- applyVars tName typeParameters
+        pure $ typeInstanceDec ''KIND currentType (ConT (kindName gqlKind))
 
-getDefaultValue :: FieldContent TRUE c s -> (Maybe (Value s), Maybe (ArgumentsDefinition s))
-getDefaultValue DefaultInputValue {defaultInputValue} = (Just defaultInputValue, Nothing)
-getDefaultValue (FieldArgs args) = (Nothing, Just args)
+kindName :: Kind -> Name
+kindName Scalar = ''SCALAR
+kindName Type = ''TYPE
diff --git a/src/Data/Morpheus/Server/TH/Declare/Type.hs b/src/Data/Morpheus/Server/TH/Declare/Type.hs
--- a/src/Data/Morpheus/Server/TH/Declare/Type.hs
+++ b/src/Data/Morpheus/Server/TH/Declare/Type.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -9,158 +10,103 @@
   )
 where
 
-import Data.Morpheus.App.Internal.Resolving
-  ( SubscriptionField,
+import Data.Morpheus.CodeGen.Internal.AST
+  ( DerivingClass (..),
+    FIELD_TYPE_WRAPPER (..),
+    ServerConstructorDefinition (..),
+    ServerFieldDefinition (..),
+    ServerTypeDefinition (..),
+    unpackName,
   )
-import Data.Morpheus.Internal.TH
+import Data.Morpheus.CodeGen.Internal.TH
   ( apply,
     declareTypeRef,
-    nameSpaceField,
-    nameSpaceType,
     toCon,
     toName,
+    wrappedType,
   )
-import Data.Morpheus.Server.Internal.TH.Types
-  ( ServerConsD,
-    ServerDec,
-    ServerDecContext (..),
-    ServerFieldDefinition (..),
-    ServerTypeDefinition (..),
+import Data.Morpheus.Server.TH.Utils
+  ( m',
+    m_,
+    renderTypeVars,
   )
-import Data.Morpheus.Server.Internal.TH.Utils
-  ( isSubscription,
-    m',
-    tyConArgs,
+import Data.Morpheus.Types
+  ( Arg,
+    SubscriptionField,
+    TypeGuard,
   )
 import Data.Morpheus.Types.Internal.AST
-  ( ConsD (..),
-    FieldDefinition (..),
-    FieldName (..),
-    TypeKind (..),
-    TypeName (..),
-    isResolverType,
+  ( TypeKind (..),
   )
+import qualified Data.Text as T
 import Language.Haskell.TH
 import Relude hiding (Type)
 
-declareType :: ServerTypeDefinition cat s -> ServerDec [Dec]
-declareType ServerTypeDefinition {tKind = KindScalar} = pure []
+declareType :: ServerTypeDefinition -> [Dec]
+declareType (ServerInterfaceDefinition name interfaceName unionName) =
+  [ TySynD
+      (toName name)
+#if MIN_VERSION_template_haskell(2,17,0)
+      [PlainTV m_ ()]
+#else
+      [PlainTV m_]
+#endif
+      (apply ''TypeGuard [apply interfaceName [m'], apply unionName [m']])
+  ]
+declareType ServerTypeDefinition {tKind = KindScalar} = []
 declareType
   ServerTypeDefinition
     { tName,
       tCons,
-      tKind
-    } =
-    do
-      cons <- declareCons tKind tName tCons
-      let vars = map (PlainTV . toName) (tyConArgs tKind)
-      pure
-        [ DataD
-            []
-            (toName tName)
-            vars
-            Nothing
-            cons
-            (derive tKind)
-        ]
-
-derive :: TypeKind -> [DerivClause]
-derive tKind = [deriveClasses (''Generic : derivingList)]
-  where
-    derivingList
-      | isResolverType tKind = []
-      | otherwise = [''Show]
-
-deriveClasses :: [Name] -> DerivClause
-deriveClasses classNames = DerivClause Nothing (map ConT classNames)
+      derives,
+      typeParameters
+    } = [DataD [] (toName tName) vars Nothing cons [derivings]]
+    where
+      derivings = DerivClause Nothing (map (ConT . genName) derives)
+      cons = map declareCons tCons
 
-declareCons ::
-  TypeKind ->
-  TypeName ->
-  [ServerConsD cat s] ->
-  ServerDec [Con]
-declareCons tKind tName = traverse consR
-  where
-    consR ConsD {cName, cFields} =
-      RecC
-        <$> consName tKind tName cName
-        <*> traverse (declareField tKind tName) cFields
+#if MIN_VERSION_template_haskell(2,17,0)
+      vars = map (flip PlainTV ()) (renderTypeVars typeParameters)
+#else
+      vars = map PlainTV (renderTypeVars typeParameters)
+#endif
 
-consName :: TypeKind -> TypeName -> TypeName -> ServerDec Name
-consName KindEnum (TypeName name) conName = do
-  namespace' <- asks namespace
-  if namespace'
-    then pure $ toName $ nameSpaceType [FieldName name] conName
-    else pure (toName conName)
-consName _ _ conName = pure (toName conName)
+genName :: DerivingClass -> Name
+genName GENERIC = ''Generic
+genName SHOW = ''Show
 
-declareField ::
-  TypeKind ->
-  TypeName ->
-  ServerFieldDefinition cat s ->
-  ServerDec (Name, Bang, Type)
-declareField tKind tName field = do
-  namespace' <- asks namespace
-  pure
-    ( fieldTypeName namespace' tName (fieldName $ originalField field),
-      Bang NoSourceUnpackedness NoSourceStrictness,
-      renderFieldType tKind field
-    )
+declareCons :: ServerConstructorDefinition -> Con
+declareCons ServerConstructorDefinition {constructorName, constructorFields} =
+  RecC
+    (toName constructorName)
+    (map declareField constructorFields)
 
-renderFieldType ::
-  TypeKind ->
-  ServerFieldDefinition cat s ->
-  Type
-renderFieldType
-  tKind
+declareField :: ServerFieldDefinition -> (Name, Bang, Type)
+declareField
   ServerFieldDefinition
-    { isParametrized,
-      originalField = FieldDefinition {fieldType},
-      argumentsTypeName
+    { fieldName,
+      fieldType,
+      wrappers
     } =
-    withFieldWrappers tKind argumentsTypeName (declareTypeRef renderTypeName fieldType)
-    where
-      renderTypeName :: TypeName -> Type
-      renderTypeName
-        | isParametrized = (`apply` [m'])
-        | otherwise = toCon
-
-fieldTypeName :: Bool -> TypeName -> FieldName -> Name
-fieldTypeName namespace tName fieldName
-  | namespace = toName (nameSpaceField tName fieldName)
-  | otherwise = toName fieldName
-
--- withSubscriptionField: t => SubscriptionField t
-withSubscriptionField :: TypeKind -> Type -> Type
-withSubscriptionField kind x
-  | isSubscription kind = AppT (ConT ''SubscriptionField) x
-  | otherwise = x
+    ( toName fieldName,
+      Bang NoSourceUnpackedness NoSourceStrictness,
+      foldr applyWrapper (toCon fieldType) wrappers
+    )
 
--- withArgs: t => a -> t
-withArgs :: TypeName -> Type -> Type
-withArgs argsTypename = AppT (AppT arrowType argType)
+applyWrapper :: FIELD_TYPE_WRAPPER -> Type -> Type
+applyWrapper PARAMETRIZED = (`AppT` m')
+applyWrapper MONAD = AppT m'
+applyWrapper SUBSCRIPTION = AppT (ConT ''SubscriptionField)
+applyWrapper (ARG typeName) = InfixT (ConT (toName typeName)) ''Function
+applyWrapper (GQL_WRAPPER wrappers) = wrappedType wrappers
+applyWrapper (TAGGED_ARG fieldName typeRef) = InfixT arg ''Function
   where
-    argType = ConT $ toName argsTypename
-    arrowType = ConT ''Arrow
-
--- withMonad: t => m t
-withMonad :: Type -> Type
-withMonad = AppT m'
-
-type Arrow = (->)
+    arg =
+      AppT
+        ( AppT
+            (ConT ''Arg)
+            (LitT $ StrTyLit $ T.unpack $ unpackName fieldName)
+        )
+        (declareTypeRef toCon typeRef)
 
-------------------------------------------------
-withFieldWrappers ::
-  TypeKind ->
-  Maybe TypeName ->
-  Type ->
-  Type
-withFieldWrappers kind (Just argsTypename) =
-  withArgs argsTypename
-    . withSubscriptionField kind
-    . withMonad
-withFieldWrappers kind _
-  | isResolverType kind && (KindUnion /= kind) =
-    withSubscriptionField kind
-      . withMonad
-  | otherwise = id
+type Function = (->)
diff --git a/src/Data/Morpheus/Server/TH/Transform.hs b/src/Data/Morpheus/Server/TH/Transform.hs
deleted file mode 100644
--- a/src/Data/Morpheus/Server/TH/Transform.hs
+++ /dev/null
@@ -1,213 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE GADTs #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RecordWildCards #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Data.Morpheus.Server.TH.Transform
-  ( toTHDefinitions,
-    TypeDec (..),
-  )
-where
-
-import Data.Morpheus.Internal.Utils
-  ( capitalTypeName,
-    elems,
-    empty,
-    singleton,
-  )
-import Data.Morpheus.Server.Internal.TH.Types
-  ( ServerConsD,
-    ServerFieldDefinition (..),
-    ServerTypeDefinition (..),
-    toServerField,
-  )
-import Data.Morpheus.Server.Internal.TH.Utils (isParametrizedResolverType)
-import Data.Morpheus.Types.Internal.AST
-  ( ANY,
-    ArgumentDefinition (..),
-    ConsD (..),
-    FieldContent (..),
-    FieldDefinition (..),
-    FieldName,
-    FieldsDefinition,
-    IN,
-    OUT,
-    TRUE,
-    TypeContent (..),
-    TypeDefinition (..),
-    TypeKind (..),
-    TypeName,
-    TypeRef (..),
-    UnionMember (..),
-    hsTypeName,
-    kindOf,
-    mkConsEnum,
-    toFieldName,
-  )
-import Language.Haskell.TH
-import Relude hiding (empty)
-
-data TypeDec s = InputType (ServerTypeDefinition IN s) | OutputType (ServerTypeDefinition OUT s)
-
-toTHDefinitions ::
-  forall s.
-  Bool ->
-  [TypeDefinition ANY s] ->
-  Q [TypeDec s]
-toTHDefinitions namespace schema = traverse generateType schema
-  where
-    --------------------------------------------
-    generateType :: TypeDefinition ANY s -> Q (TypeDec s)
-    generateType
-      typeDef@TypeDefinition
-        { typeName,
-          typeContent
-        } =
-        withType <$> genTypeContent schema toArgsTypeName typeName typeContent
-        where
-          toArgsTypeName :: FieldName -> TypeName
-          toArgsTypeName = mkArgsTypeName namespace typeName
-          tKind = kindOf typeDef
-          typeOriginal = Just typeDef
-          -------------------------
-          withType (ConsIN tCons) =
-            InputType
-              ServerTypeDefinition
-                { tName = hsTypeName typeName,
-                  tCons,
-                  typeArgD = empty,
-                  ..
-                }
-          withType (ConsOUT typeArgD tCons) =
-            OutputType
-              ServerTypeDefinition
-                { tName = hsTypeName typeName,
-                  tCons,
-                  ..
-                }
-
-toHSTypeRef :: TypeRef -> TypeRef
-toHSTypeRef tyRef@TypeRef {typeConName} = tyRef {typeConName = hsTypeName typeConName}
-
-toHSFieldDefinition :: FieldDefinition cat s -> FieldDefinition cat s
-toHSFieldDefinition field = field {fieldType = toHSTypeRef (fieldType field)}
-
-toHSServerFieldDefinition :: ServerFieldDefinition cat s -> ServerFieldDefinition cat s
-toHSServerFieldDefinition field = field {originalField = toHSFieldDefinition (originalField field)}
-
-mkCons :: TypeName -> [ServerFieldDefinition cat s] -> ServerConsD cat s
-mkCons typename fields =
-  ConsD
-    { cName = hsTypeName typename,
-      cFields = fmap toHSServerFieldDefinition fields
-    }
-
-mkObjectCons :: TypeName -> [ServerFieldDefinition cat s] -> [ServerConsD cat s]
-mkObjectCons typeName fields = [mkCons typeName fields]
-
-mkArgsTypeName :: Bool -> TypeName -> FieldName -> TypeName
-mkArgsTypeName namespace typeName fieldName
-  | namespace = hsTypeName typeName <> argTName
-  | otherwise = argTName
-  where
-    argTName = capitalTypeName (fieldName <> "Args")
-
-mkObjectField ::
-  [TypeDefinition ANY s] ->
-  (FieldName -> TypeName) ->
-  FieldDefinition OUT s ->
-  Q (ServerFieldDefinition OUT s)
-mkObjectField
-  schema
-  genArgsTypeName
-  originalField@FieldDefinition
-    { fieldName,
-      fieldContent,
-      fieldType = TypeRef {typeConName}
-    } = do
-    isParametrized <- isParametrizedResolverType typeConName schema
-    pure
-      ServerFieldDefinition
-        { argumentsTypeName = fieldContent >>= fieldCont,
-          ..
-        }
-    where
-      fieldCont :: FieldContent TRUE OUT s -> Maybe TypeName
-      fieldCont (FieldArgs arguments)
-        | not (null arguments) = Just $ genArgsTypeName fieldName
-      fieldCont _ = Nothing
-
-data BuildPlan s
-  = ConsIN [ServerConsD IN s]
-  | ConsOUT [ServerTypeDefinition IN s] [ServerConsD OUT s]
-
-genTypeContent ::
-  [TypeDefinition ANY s] ->
-  (FieldName -> TypeName) ->
-  TypeName ->
-  TypeContent TRUE ANY s ->
-  Q (BuildPlan s)
-genTypeContent _ _ _ DataScalar {} = pure (ConsIN [])
-genTypeContent _ _ _ (DataEnum tags) = pure $ ConsIN (fmap mkConsEnum tags)
-genTypeContent _ _ typeName (DataInputObject fields) =
-  pure $ ConsIN (mkObjectCons typeName $ map toServerField $ elems fields)
-genTypeContent _ _ _ DataInputUnion {} = fail "Input Unions not Supported"
-genTypeContent schema toArgsTyName typeName DataInterface {interfaceFields} = do
-  typeArgD <- genArgumentTypes toArgsTyName interfaceFields
-  objCons <- mkObjectCons typeName <$> traverse (mkObjectField schema toArgsTyName) (elems interfaceFields)
-  pure $ ConsOUT typeArgD objCons
-genTypeContent schema toArgsTyName typeName DataObject {objectFields} = do
-  typeArgD <- genArgumentTypes toArgsTyName objectFields
-  objCons <-
-    mkObjectCons typeName
-      <$> traverse (mkObjectField schema toArgsTyName) (elems objectFields)
-  pure $ ConsOUT typeArgD objCons
-genTypeContent _ _ typeName (DataUnion members) =
-  pure $ ConsOUT [] (fmap unionCon members)
-  where
-    unionCon UnionMember {memberName} =
-      mkCons
-        cName
-        $ singleton
-          ServerFieldDefinition
-            { isParametrized = True,
-              argumentsTypeName = Nothing,
-              originalField =
-                FieldDefinition
-                  { fieldName = "un" <> toFieldName cName,
-                    fieldType =
-                      TypeRef
-                        { typeConName = utName,
-                          typeWrappers = []
-                        },
-                    fieldDescription = Nothing,
-                    fieldDirectives = empty,
-                    fieldContent = Nothing
-                  }
-            }
-      where
-        cName = hsTypeName typeName <> utName
-        utName = hsTypeName memberName
-
-genArgumentTypes :: (FieldName -> TypeName) -> FieldsDefinition OUT s -> Q [ServerTypeDefinition IN s]
-genArgumentTypes genArgsTypeName fields =
-  concat <$> traverse (genArgumentType genArgsTypeName) (elems fields)
-
-genArgumentType :: (FieldName -> TypeName) -> FieldDefinition OUT s -> Q [ServerTypeDefinition IN s]
-genArgumentType namespaceWith FieldDefinition {fieldName, fieldContent = Just (FieldArgs arguments)}
-  | not (null arguments) =
-    pure
-      [ ServerTypeDefinition
-          { tName,
-            tCons = [mkCons tName $ map (toServerField . argument) $ elems arguments],
-            tKind = KindInputObject,
-            typeArgD = [],
-            typeOriginal = Nothing
-          }
-      ]
-  where
-    tName = hsTypeName (namespaceWith fieldName)
-genArgumentType _ _ = pure []
diff --git a/src/Data/Morpheus/Server/TH/Utils.hs b/src/Data/Morpheus/Server/TH/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Morpheus/Server/TH/Utils.hs
@@ -0,0 +1,75 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Data.Morpheus.Server.TH.Utils
+  ( constraintTypeable,
+    typeNameStringE,
+    withPure,
+    mkTypeableConstraints,
+    m',
+    m_,
+    funDProxy,
+    ServerDec,
+    renderTypeVars,
+  )
+where
+
+import Data.Morpheus.CodeGen.Internal.AST
+  ( CodeGenConfig,
+  )
+import Data.Morpheus.CodeGen.Internal.TH
+  ( _',
+    apply,
+    funDSimple,
+    vars,
+  )
+import Data.Morpheus.Types.Internal.AST
+  ( TypeName,
+    unpackName,
+  )
+import Data.Text (unpack)
+import qualified Data.Text as T
+import Language.Haskell.TH
+  ( CxtQ,
+    DecQ,
+    Exp (..),
+    ExpQ,
+    Lit (..),
+    Name,
+    Q,
+    Type (..),
+    cxt,
+    mkName,
+  )
+import Relude hiding (Type)
+
+type ServerDec = ReaderT CodeGenConfig Q
+
+m_ :: Name
+m_ = mkName "m"
+
+m' :: Type
+m' = VarT m_
+
+renderTypeVars :: [Text] -> [Name]
+renderTypeVars = map (mkName . T.unpack)
+
+funDProxy :: [(Name, ExpQ)] -> [DecQ]
+funDProxy = map fun
+  where
+    fun (name, body) = funDSimple name [_'] body
+
+withPure :: Exp -> Exp
+withPure = AppE (VarE 'pure)
+
+typeNameStringE :: TypeName -> Exp
+typeNameStringE = LitE . StringL . (unpack . unpackName)
+
+constraintTypeable :: Type -> Q Type
+constraintTypeable name = pure $ apply ''Typeable [name]
+
+mkTypeableConstraints :: [Name] -> CxtQ
+mkTypeableConstraints = cxt . map constraintTypeable . vars
diff --git a/src/Data/Morpheus/Server/Types/GQLType.hs b/src/Data/Morpheus/Server/Types/GQLType.hs
--- a/src/Data/Morpheus/Server/Types/GQLType.hs
+++ b/src/Data/Morpheus/Server/Types/GQLType.hs
@@ -14,21 +14,16 @@
 module Data.Morpheus.Server.Types.GQLType
   ( GQLType
       ( KIND,
-        implements,
         description,
         getDescriptions,
         typeOptions,
         getDirectives,
-        getFieldContents
-      ),
-    GQLTypeOptions
-      ( fieldLabelModifier,
-        constructorTagModifier,
-        typeNameModifier
+        defaultValues,
+        __type
       ),
+    GQLTypeOptions (..),
     defaultTypeOptions,
     TypeData (..),
-    __isObjectKind,
     __isEmptyType,
     __typeData,
   )
@@ -45,35 +40,33 @@
     DerivingKind,
     SCALAR,
     TYPE,
-    ToValue,
     WRAPPER,
-    isObject,
-    toValue,
   )
+import Data.Morpheus.NamedResolvers (NamedResolverT (..))
+import Data.Morpheus.Server.Deriving.Utils.Kinded (CategoryValue (..))
 import Data.Morpheus.Server.Types.SchemaT
-  ( SchemaT,
-    TypeFingerprint (..),
+  ( TypeFingerprint (..),
   )
 import Data.Morpheus.Server.Types.Types
-  ( Pair,
+  ( Arg,
+    Pair,
+    TypeGuard,
     Undefined (..),
   )
 import Data.Morpheus.Types.ID (ID)
 import Data.Morpheus.Types.Internal.AST
-  ( ArgumentsDefinition,
-    CONST,
+  ( CONST,
     Description,
     Directives,
-    FieldName,
-    OUT,
-    QUERY,
     TypeCategory (..),
-    TypeName (..),
+    TypeName,
     TypeWrapper (..),
     Value,
+    mkBaseType,
+    packName,
     toNullable,
+    unpackName,
   )
-import Data.Morpheus.Utils.Kinded (CategoryValue (..))
 import Data.Text
   ( intercalate,
     pack,
@@ -92,18 +85,36 @@
 
 data TypeData = TypeData
   { gqlTypeName :: TypeName,
-    gqlWrappers :: [TypeWrapper],
+    gqlWrappers :: TypeWrapper,
     gqlFingerprint :: TypeFingerprint
   }
+  deriving (Show)
 
+-- | Options that specify how to map GraphQL field, type, and constructor names
+-- to and from their Haskell equivalent.
+--
+-- Options can be set using record syntax on 'defaultOptions' with the fields
+-- below.
 data GQLTypeOptions = GQLTypeOptions
-  { fieldLabelModifier :: String -> String,
+  { -- | Function applied to field labels.
+    -- Handy for removing common record prefixes for example.
+    fieldLabelModifier :: String -> String,
+    -- | Function applied to constructor tags.
     constructorTagModifier :: String -> String,
-    -- Construct a new type name depending on whether it is an input,
-    -- and being given the original type name
+    -- | Construct a new type name depending on whether it is an input,
+    -- and being given the original type name.
     typeNameModifier :: Bool -> String -> String
   }
 
+-- | Default encoding 'GQLTypeOptions':
+--
+-- @
+-- 'GQLTypeOptions'
+--   { 'fieldLabelModifier'      = id
+--   , 'constructorTagModifier'  = id
+--   , 'typeNameModifier'        = const id
+--   }
+-- @
 defaultTypeOptions :: GQLTypeOptions
 defaultTypeOptions =
   GQLTypeOptions
@@ -121,7 +132,7 @@
 __typeData proxy = __type proxy (categoryValue (Proxy @kind))
 
 getTypename :: Typeable a => f a -> TypeName
-getTypename = TypeName . intercalate "" . getTypeConstructorNames
+getTypename = packName . intercalate "" . getTypeConstructorNames
 
 getTypeConstructorNames :: Typeable a => f a -> [Text]
 getTypeConstructorNames = fmap (pack . tyConName . replacePairCon) . getTypeConstructors
@@ -132,12 +143,12 @@
 deriveTypeData :: Typeable a => f a -> (Bool -> String -> String) -> TypeCategory -> TypeData
 deriveTypeData proxy typeNameModifier cat =
   TypeData
-    { gqlTypeName = TypeName . pack $ typeNameModifier (cat == IN) originalTypeName,
-      gqlWrappers = [],
+    { gqlTypeName = packName . pack $ typeNameModifier (cat == IN) originalTypeName,
+      gqlWrappers = mkBaseType,
       gqlFingerprint = getFingerprint cat proxy
     }
   where
-    originalTypeName = unpack . readTypeName $ getTypename proxy
+    originalTypeName = unpack . unpackName $ getTypename proxy
 
 getFingerprint :: Typeable a => TypeCategory -> f a -> TypeFingerprint
 getFingerprint category = TypeableFingerprint category . fmap tyConFingerprint . getTypeConstructors
@@ -147,18 +158,15 @@
   TypeData
     { gqlTypeName = name,
       gqlFingerprint = InternalFingerprint name,
-      gqlWrappers = []
+      gqlWrappers = mkBaseType
     }
 
-list :: [TypeWrapper] -> [TypeWrapper]
-list = (TypeList :)
+list :: TypeWrapper -> TypeWrapper
+list = flip TypeList True
 
-wrapper :: ([TypeWrapper] -> [TypeWrapper]) -> TypeData -> TypeData
+wrapper :: (TypeWrapper -> TypeWrapper) -> TypeData -> TypeData
 wrapper f TypeData {..} = TypeData {gqlWrappers = f gqlWrappers, ..}
 
-resolverCon :: TyCon
-resolverCon = typeRepTyCon $ typeRep $ Proxy @(Resolver QUERY () Maybe)
-
 -- | replaces typeName (A,B) with Pair_A_B
 replacePairCon :: TyCon -> TyCon
 replacePairCon x | hsPair == x = gqlPair
@@ -169,13 +177,11 @@
 
 -- Ignores Resolver name  from typeName
 ignoreResolver :: (TyCon, [TypeRep]) -> [TyCon]
-ignoreResolver (con, _) | con == resolverCon = []
+ignoreResolver (con, _) | con == typeRepTyCon (typeRep $ Proxy @Resolver) = []
+ignoreResolver (con, _) | con == typeRepTyCon (typeRep $ Proxy @NamedResolverT) = []
 ignoreResolver (con, args) =
   con : concatMap (ignoreResolver . splitTyConApp) args
 
-__isObjectKind :: forall f a. GQLType a => f a -> Bool
-__isObjectKind _ = isObject $ toValue (Proxy @(KIND a))
-
 -- | GraphQL type, every graphQL type should have an instance of 'GHC.Generics.Generic' and 'GQLType'.
 --
 --  @
@@ -190,16 +196,19 @@
 --     instance GQLType ... where
 --       description = const "your description ..."
 --  @
-class ToValue (KIND a) => GQLType a where
+class GQLType a where
   type KIND a :: DerivingKind
   type KIND a = TYPE
 
-  implements :: f a -> [SchemaT OUT TypeName]
-  implements _ = []
-
+  -- | A description of the type.
+  --
+  -- Used for documentation in the GraphQL schema.
   description :: f a -> Maybe Text
   description _ = Nothing
 
+  -- | A dictionary of descriptions for fields, keyed on field name.
+  --
+  -- Used for documentation in the GraphQL schema.
   getDescriptions :: f a -> Map Text Description
   getDescriptions _ = mempty
 
@@ -209,14 +218,8 @@
   getDirectives :: f a -> Map Text (Directives CONST)
   getDirectives _ = mempty
 
-  getFieldContents ::
-    f a ->
-    Map
-      FieldName
-      ( Maybe (Value CONST),
-        Maybe (ArgumentsDefinition CONST)
-      )
-  getFieldContents _ = mempty
+  defaultValues :: f a -> Map Text (Value CONST)
+  defaultValues _ = mempty
 
   __isEmptyType :: f a -> Bool
   __isEmptyType _ = False
@@ -254,10 +257,6 @@
 -- WRAPPERS
 instance GQLType ()
 
-instance Typeable m => GQLType (Undefined m) where
-  type KIND (Undefined m) = WRAPPER
-  __isEmptyType _ = True
-
 instance GQLType a => GQLType (Maybe a) where
   type KIND (Maybe a) = WRAPPER
   __type _ = wrapper toNullable . __type (Proxy @a)
@@ -277,6 +276,11 @@
 instance (Typeable a, Typeable b, GQLType a, GQLType b) => GQLType (Pair a b)
 
 -- Manual
+
+instance Typeable m => GQLType (Undefined m) where
+  type KIND (Undefined m) = CUSTOM
+  __isEmptyType _ = True
+
 instance GQLType b => GQLType (a -> b) where
   type KIND (a -> b) = CUSTOM
   __type _ = __type $ Proxy @b
@@ -292,3 +296,19 @@
 instance (Typeable a, Typeable b, GQLType a, GQLType b) => GQLType (a, b) where
   type KIND (a, b) = CUSTOM
   __type _ = __type $ Proxy @(Pair a b)
+
+instance (GQLType value) => GQLType (Arg name value) where
+  type KIND (Arg name value) = CUSTOM
+  __type _ = __type (Proxy @value)
+
+instance (GQLType interface) => GQLType (TypeGuard interface possibleTypes) where
+  type KIND (TypeGuard interface possibleTypes) = CUSTOM
+  __type _ = __type (Proxy @interface)
+
+instance (GQLType a) => GQLType (Proxy a) where
+  type KIND (Proxy a) = KIND a
+  __type _ = __type (Proxy @a)
+
+instance (GQLType a) => GQLType (NamedResolverT m a) where
+  type KIND (NamedResolverT m a) = CUSTOM
+  __type _ = __type (Proxy :: Proxy a)
diff --git a/src/Data/Morpheus/Server/Types/SchemaT.hs b/src/Data/Morpheus/Server/Types/SchemaT.hs
--- a/src/Data/Morpheus/Server/Types/SchemaT.hs
+++ b/src/Data/Morpheus/Server/Types/SchemaT.hs
@@ -8,6 +8,7 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TupleSections #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE NoImplicitPrelude #-}
@@ -19,21 +20,17 @@
     TypeFingerprint (..),
     toSchema,
     withInput,
-    withInterface,
+    extendImplements,
   )
 where
 
+import Control.Monad.Except (MonadError (..))
 import qualified Data.Map as Map
-import Data.Morpheus.App.Internal.Resolving
-  ( Eventless,
-  )
-import Data.Morpheus.Error (globalErrorMessage)
-import Data.Morpheus.Internal.Utils
-  ( Failure (..),
-  )
+import Data.Morpheus.Internal.Ext (GQLResult)
 import Data.Morpheus.Types.Internal.AST
   ( ANY,
     CONST,
+    GQLError,
     IN,
     OBJECT,
     OUT,
@@ -41,7 +38,7 @@
     TypeCategory (..),
     TypeContent (..),
     TypeDefinition (..),
-    TypeName (..),
+    TypeName,
     defineSchemaWith,
     msg,
     toAny,
@@ -60,23 +57,21 @@
       Ord
     )
 
-type MyMap = Map TypeFingerprint (TypeDefinition ANY CONST)
+type MyMap = (Map TypeFingerprint (TypeDefinition ANY CONST), Map TypeName [TypeName])
 
 -- Helper Functions
 newtype SchemaT (cat :: TypeCategory) a = SchemaT
   { runSchemaT ::
-      Eventless
+      GQLResult
         ( a,
-          [MyMap -> Eventless MyMap]
+          [MyMap -> GQLResult MyMap]
         )
   }
   deriving (Functor)
 
-instance
-  Failure err Eventless =>
-  Failure err (SchemaT c)
-  where
-  failure = SchemaT . failure
+instance MonadError GQLError (SchemaT c) where
+  throwError = SchemaT . throwError
+  catchError (SchemaT mx) f = SchemaT (catchError mx (runSchemaT . f))
 
 instance Applicative (SchemaT c) where
   pure = SchemaT . pure . (,[])
@@ -100,24 +95,35 @@
       TypeDefinition OBJECT CONST,
       TypeDefinition OBJECT CONST
     ) ->
-  Eventless (Schema CONST)
+  GQLResult (Schema CONST)
 toSchema (SchemaT v) = do
   ((q, m, s), typeDefs) <- v
-  types <-
-    execUpdates Map.empty typeDefs
-      >>= checkTypeCollisions . Map.toList
+  (typeDefinitions, implements) <- execUpdates (Map.empty, Map.empty) typeDefs
+  types <- map (insertImplements implements) <$> checkTypeCollisions (Map.toList typeDefinitions)
   defineSchemaWith types (optionalType q, optionalType m, optionalType s)
 
+insertImplements :: Map TypeName [TypeName] -> TypeDefinition c CONST -> TypeDefinition c CONST
+insertImplements x TypeDefinition {typeContent = DataObject {..}, ..} =
+  TypeDefinition
+    { typeContent =
+        DataObject
+          { objectImplements = objectImplements <> implements,
+            ..
+          },
+      ..
+    }
+  where
+    implements :: [TypeName]
+    implements = Map.findWithDefault [] typeName x
+insertImplements _ t = t
+
 withInput :: SchemaT IN a -> SchemaT OUT a
 withInput (SchemaT x) = SchemaT x
 
-withInterface :: SchemaT OUT a -> SchemaT ct a
-withInterface (SchemaT x) = SchemaT x
-
-checkTypeCollisions :: [(TypeFingerprint, TypeDefinition k a)] -> Eventless [TypeDefinition k a]
+checkTypeCollisions :: [(TypeFingerprint, TypeDefinition k a)] -> GQLResult [TypeDefinition k a]
 checkTypeCollisions = fmap Map.elems . foldlM collectTypes Map.empty
   where
-    collectTypes :: Map (TypeName, TypeFingerprint) (TypeDefinition k a) -> (TypeFingerprint, TypeDefinition k a) -> Eventless (Map (TypeName, TypeFingerprint) (TypeDefinition k a))
+    collectTypes :: Map (TypeName, TypeFingerprint) (TypeDefinition k a) -> (TypeFingerprint, TypeDefinition k a) -> GQLResult (Map (TypeName, TypeFingerprint) (TypeDefinition k a))
     collectTypes accum (fp, typ) = maybe addType (handleCollision typ) (key `Map.lookup` accum)
       where
         addType = pure $ Map.insert key typ accum
@@ -126,11 +132,10 @@
         handleCollision TypeDefinition {typeContent = DataScalar {}} TypeDefinition {typeContent = DataScalar {}} = pure accum
         handleCollision TypeDefinition {typeName = name1} _ = failureRequirePrefix name1
 
-failureRequirePrefix :: TypeName -> Eventless b
+failureRequirePrefix :: TypeName -> GQLResult b
 failureRequirePrefix typename =
-  failure
-    $ globalErrorMessage
-    $ "It appears that the Haskell type "
+  throwError $
+    "It appears that the Haskell type "
       <> msg typename
       <> " was used as both input and output type, which is not allowed by GraphQL specifications."
       <> "\n\n "
@@ -163,9 +168,20 @@
 updateSchema fingerprint f x =
   SchemaT $ pure ((), [upLib])
   where
-    upLib :: MyMap -> Eventless MyMap
-    upLib lib
-      | Map.member fingerprint lib = pure lib
+    upLib :: MyMap -> GQLResult MyMap
+    upLib (lib, conn)
+      | Map.member fingerprint lib = pure (lib, conn)
       | otherwise = do
         (type', updates) <- runSchemaT (f x)
-        execUpdates lib ((pure . Map.insert fingerprint (toAny type')) : updates)
+        execUpdates (lib, conn) (update type' : updates)
+      where
+        update t (ts, c) = pure (Map.insert fingerprint (toAny t) ts, c)
+
+extendImplements :: TypeName -> [TypeName] -> SchemaT cat' ()
+extendImplements interface types = SchemaT $ pure ((), [upLib])
+  where
+    -- TODO: what happens if interface name collides?
+    upLib :: MyMap -> GQLResult MyMap
+    upLib (lib, con) = pure (lib, foldr insertInterface con types)
+    insertInterface :: TypeName -> Map TypeName [TypeName] -> Map TypeName [TypeName]
+    insertInterface = Map.alter (Just . (interface :) . fromMaybe [])
diff --git a/src/Data/Morpheus/Server/Types/Types.hs b/src/Data/Morpheus/Server/Types/Types.hs
--- a/src/Data/Morpheus/Server/Types/Types.hs
+++ b/src/Data/Morpheus/Server/Types/Types.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE NoImplicitPrelude #-}
@@ -5,14 +6,15 @@
 module Data.Morpheus.Server.Types.Types
   ( Undefined (..),
     Pair (..),
-    -- MapKind (..),
-    -- mapKindFromList,
+    TypeGuard (..),
+    Arg (..),
   )
 where
 
 import GHC.Generics
   ( Generic,
   )
+import GHC.TypeLits (Symbol)
 import Prelude
   ( Show,
   )
@@ -24,3 +26,13 @@
     value :: v
   }
   deriving (Generic)
+
+data TypeGuard interface union
+  = ResolveInterface interface
+  | ResolveType union
+
+newtype Arg (name :: Symbol) a = Arg {argValue :: a}
+  deriving
+    ( Show,
+      Generic
+    )
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
@@ -2,6 +2,7 @@
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE PolyKinds #-}
 {-# LANGUAGE RankNTypes #-}
@@ -10,7 +11,7 @@
 
 -- | GQL Types
 module Data.Morpheus.Types
-  ( GQLType (KIND, description, implements, getDescriptions, typeOptions, getDirectives),
+  ( GQLType (KIND, description, getDescriptions, typeOptions, getDirectives, defaultValues),
     EncodeScalar (..),
     EncodeWrapper (..),
     DecodeScalar (..),
@@ -35,13 +36,11 @@
     subscribe,
     unsafeInternalContext,
     ResolverContext (..),
-    -- Resolvers
     ResolverO,
     ComposedResolver,
     ResolverQ,
     ResolverM,
     ResolverS,
-    -- Resolvers Deprecated
     ResolveQ,
     ResolveM,
     ResolveS,
@@ -51,34 +50,33 @@
     IORes,
     IOMutRes,
     IOSubRes,
-    interface,
     SubscriptionField,
     App,
     RenderGQL,
     render,
-    GQLTypeOptions (..),
+    TypeGuard (..),
+    Arg (..),
+    NamedResolvers (..),
+
+    -- * GQLType naming configuration
+    GQLTypeOptions,
+    defaultTypeOptions,
+    fieldLabelModifier,
+    constructorTagModifier,
+    typeNameModifier,
   )
 where
 
-import Control.Applicative (pure)
-import Control.Monad (Monad ((>>=)))
-import Control.Monad.Fail (fail)
-import Control.Monad.Trans.Class (MonadTrans (..))
-import Data.Either
-  ( Either (..),
-    either,
-  )
+import Control.Monad.Except (MonadError (..))
 import Data.Morpheus.App
   ( App,
   )
 import Data.Morpheus.App.Internal.Resolving
-  ( Failure,
-    PushEvents (..),
+  ( PushEvents (..),
     Resolver,
     ResolverContext (..),
     SubscriptionField,
     WithOperation,
-    failure,
     pushEvents,
     subscribe,
     unsafeInternalContext,
@@ -87,16 +85,20 @@
   ( RenderGQL,
     render,
   )
-import Data.Morpheus.Server.Deriving.Schema
-  ( DeriveType,
-    SchemaT,
-    deriveImplementsInterface,
+import Data.Morpheus.NamedResolvers
+  ( NamedResolverT (..),
+    ResolveNamed (..),
   )
 import Data.Morpheus.Server.Types.GQLType
   ( GQLType (..),
     GQLTypeOptions (..),
+    defaultTypeOptions,
   )
-import Data.Morpheus.Server.Types.Types (Undefined (..))
+import Data.Morpheus.Server.Types.Types
+  ( Arg (..),
+    TypeGuard (..),
+    Undefined (..),
+  )
 import Data.Morpheus.Types.GQLScalar
   ( DecodeScalar (..),
     EncodeScalar (..),
@@ -111,25 +113,13 @@
     GQLResponse (..),
   )
 import Data.Morpheus.Types.Internal.AST
-  ( MUTATION,
-    Message,
-    OUT,
+  ( GQLError,
+    MUTATION,
     QUERY,
     SUBSCRIPTION,
     ScalarValue (..),
-    TypeName,
-    msg,
   )
-import Data.Proxy
-  ( Proxy (..),
-  )
-import Prelude
-  ( ($),
-    (.),
-    IO,
-    String,
-    const,
-  )
+import Relude hiding (Undefined)
 
 class FlexibleResolver (f :: * -> *) (a :: k) where
   type Flexible (m :: * -> *) a :: *
@@ -143,7 +133,6 @@
   type Flexible m a = m (a m)
   type Composed m f a = m (f (a m))
 
--- Recursive Resolvers
 type ResolverO o e m a =
   (WithOperation o) =>
   Flexible (Resolver o e m) a
@@ -197,14 +186,13 @@
 publish :: Monad m => [e] -> Resolver MUTATION e m ()
 publish = pushEvents
 
--- resolves constant value on any argument
 constRes :: (WithOperation o, Monad m) => b -> a -> Resolver o e m b
 constRes = const . pure
 
 constMutRes :: Monad m => [e] -> a -> args -> ResolverM e m a
-constMutRes events value = const $ do
+constMutRes events v = const $ do
   publish events
-  pure value
+  pure v
 
 {-# DEPRECATED failRes "use \"fail\" from \"MonadFail\"" #-}
 failRes ::
@@ -215,17 +203,33 @@
   Resolver o e m a
 failRes = fail
 
-liftEither :: (MonadTrans t, Monad (t m), Failure Message (t m)) => Monad m => m (Either String a) -> t m a
-liftEither x = lift x >>= either (failure . msg) pure
+liftEither :: (MonadTrans t, Monad (t m), MonadError GQLError (t m)) => Monad m => m (Either String a) -> t m a
+liftEither x = lift x >>= either (throwError . fromString) pure
 
 -- | GraphQL Root resolver, also the interpreter generates a GQL schema from it.
 --  'queryResolver' is required, 'mutationResolver' and 'subscriptionResolver' are optional,
 --  if your schema does not supports __mutation__ or __subscription__ , you can use __()__ for it.
-data RootResolver (m :: * -> *) event (query :: (* -> *) -> *) (mut :: (* -> *) -> *) (sub :: (* -> *) -> *) = RootResolver
+data
+  RootResolver
+    (m :: * -> *)
+    event
+    (query :: (* -> *) -> *)
+    (mutation :: (* -> *) -> *)
+    (subscription :: (* -> *) -> *) = RootResolver
   { queryResolver :: query (Resolver QUERY event m),
-    mutationResolver :: mut (Resolver MUTATION event m),
-    subscriptionResolver :: sub (Resolver SUBSCRIPTION event m)
+    mutationResolver :: mutation (Resolver MUTATION event m),
+    subscriptionResolver :: subscription (Resolver SUBSCRIPTION event m)
   }
 
-interface :: (GQLType a, DeriveType OUT a) => Proxy a -> SchemaT OUT TypeName
-interface = deriveImplementsInterface
+data
+  NamedResolvers
+    (m :: * -> *)
+    event
+    (qu :: (* -> *) -> *)
+    (mu :: (* -> *) -> *)
+    (su :: (* -> *) -> *)
+  = ( ResolveNamed
+        (Resolver QUERY event m)
+        (qu (NamedResolverT (Resolver QUERY event m)))
+    ) =>
+    NamedResolvers
diff --git a/src/Data/Morpheus/Utils/Kinded.hs b/src/Data/Morpheus/Utils/Kinded.hs
deleted file mode 100644
--- a/src/Data/Morpheus/Utils/Kinded.hs
+++ /dev/null
@@ -1,69 +0,0 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE GADTs #-}
-{-# LANGUAGE PolyKinds #-}
-{-# LANGUAGE StandaloneDeriving #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Data.Morpheus.Utils.Kinded
-  ( KindedProxy (..),
-    setType,
-    setKind,
-    kinded,
-    KindedType (..),
-    inputType,
-    outputType,
-    CategoryValue (..),
-  )
-where
-
-import Data.Morpheus.Types.Internal.AST
-  ( IN,
-    LEAF,
-    OUT,
-    TypeCategory (..),
-  )
-import Prelude (Show)
-
-class CategoryValue (c :: TypeCategory) where
-  categoryValue :: f c -> TypeCategory
-
-instance CategoryValue OUT where
-  categoryValue _ = OUT
-
-instance CategoryValue IN where
-  categoryValue _ = IN
-
-instance CategoryValue LEAF where
-  categoryValue _ = LEAF
-
--- | context , like Proxy with multiple parameters
--- * 'kind': object, scalar, enum ...
--- * 'a': actual gql type
-data KindedProxy k a
-  = KindedProxy
-
-setType :: f a -> kinded (k :: t) a' -> KindedProxy k a
-setType _ _ = KindedProxy
-
-setKind :: f k -> kinded (k' :: t) a -> KindedProxy k a
-setKind _ _ = KindedProxy
-
-kinded :: f k -> f' a -> KindedProxy k a
-kinded _ _ = KindedProxy
-
-data KindedType (cat :: TypeCategory) a where
-  InputType :: KindedType IN a
-  OutputType :: KindedType OUT a
-
-deriving instance Show (KindedType cat a)
-
--- converts:
---   f a -> KindedType IN a
--- or
---  f k a -> KindedType IN a
-inputType :: f a -> KindedType IN a
-inputType _ = InputType
-
-outputType :: f a -> KindedType OUT a
-outputType _ = OutputType
diff --git a/test/Feature/Collision/CategoryCollisionFail.hs b/test/Feature/Collision/CategoryCollisionFail.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/CategoryCollisionFail.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+-- fail if type was used as input and output type without prefixes
+module Feature.Collision.CategoryCollisionFail
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text
+  ( Text,
+  )
+import GHC.Generics (Generic)
+
+data Deity = Deity
+  { name :: Text,
+    age :: Int
+  }
+  deriving (Show, Generic, GQLType)
+
+newtype DeityArgs = DeityArgs
+  { input :: Deity
+  }
+  deriving (Show, Generic, GQLType)
+
+newtype Query (m :: * -> *) = Query
+  { deity :: DeityArgs -> m Deity
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { deity =
+              const $
+                pure
+                  Deity
+                    { name =
+                        "Morpheus",
+                      age = 1000
+                    }
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Collision/CategoryCollisionSuccess.hs b/test/Feature/Collision/CategoryCollisionSuccess.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/CategoryCollisionSuccess.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Collision.CategoryCollisionSuccess
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    GQLTypeOptions (..),
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text
+  ( Text,
+  )
+import GHC.Generics (Generic)
+
+data Deity = Deity
+  { name :: Text,
+    age :: Int
+  }
+  deriving (Show, Generic)
+
+nonClashingTypeNameModifier :: Bool -> String -> String
+nonClashingTypeNameModifier True original = "Input" ++ original
+nonClashingTypeNameModifier False original = original
+
+instance GQLType Deity where
+  typeOptions _ opt = opt {typeNameModifier = nonClashingTypeNameModifier}
+
+newtype DeityArgs = DeityArgs
+  { input :: Deity
+  }
+  deriving (Show, Generic, GQLType)
+
+newtype Query (m :: * -> *) = Query
+  { deity :: DeityArgs -> m Deity
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { deity =
+              const $
+                pure
+                  Deity
+                    { name =
+                        "Morpheus",
+                      age = 1000
+                    }
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Collision/NameCollision.hs b/test/Feature/Collision/NameCollision.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/NameCollision.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Collision.NameCollision
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types (GQLRequest, GQLResponse, GQLType (..), RootResolver (..), Undefined (..))
+import Data.Text (Text)
+import qualified Feature.Collision.NameCollisionHelper as A2 (A (..))
+import GHC.Generics (Generic)
+
+data A = A
+  { aText :: Text,
+    aInt :: Int
+  }
+  deriving (Generic, GQLType)
+
+data Query (m :: * -> *) = Query
+  { a1 :: A,
+    a2 :: A2.A
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver = Query {a1 = A "" 0, a2 = A2.A 0},
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Collision/NameCollisionHelper.hs b/test/Feature/Collision/NameCollisionHelper.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/NameCollisionHelper.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Collision.NameCollisionHelper
+  ( A (..),
+  )
+where
+
+import Data.Morpheus.Types (GQLType)
+import GHC.Generics (Generic)
+
+newtype A = A
+  { bla :: Int
+  }
+  deriving (Generic, GQLType)
diff --git a/test/Feature/Collision/category-collision-fail/query.gql b/test/Feature/Collision/category-collision-fail/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/category-collision-fail/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Deity") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Collision/category-collision-fail/response.json b/test/Feature/Collision/category-collision-fail/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/category-collision-fail/response.json
@@ -0,0 +1,7 @@
+{
+  "errors": [
+    {
+      "message": "It appears that the Haskell type \"Deity\" was used as both input and output type, which is not allowed by GraphQL specifications.\n\n If you supply \"typeNameModifier\" in \"GQLType.typeOptions\", you can override the default type names for \"Deity\" to solve this problem."
+    }
+  ]
+}
diff --git a/test/Feature/Collision/category-collision-success/query.gql b/test/Feature/Collision/category-collision-success/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/category-collision-success/query.gql
@@ -0,0 +1,82 @@
+query Get__Type {
+  type: __type(name: "Deity") {
+    ...FullType
+  }
+  input: __type(name: "InputDeity") {
+    ...FullType
+  }
+  query: __type(name: "Query") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Collision/category-collision-success/response.json b/test/Feature/Collision/category-collision-success/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/category-collision-success/response.json
@@ -0,0 +1,119 @@
+{
+  "data": {
+    "type": {
+      "kind": "OBJECT",
+      "name": "Deity",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "age",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    },
+    "input": {
+      "kind": "INPUT_OBJECT",
+      "name": "InputDeity",
+      "fields": null,
+      "inputFields": [
+        {
+          "name": "name",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "defaultValue": null
+        },
+        {
+          "name": "age",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            }
+          },
+          "defaultValue": null
+        }
+      ],
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    },
+    "query": {
+      "kind": "OBJECT",
+      "name": "Query",
+      "fields": [
+        {
+          "name": "deity",
+          "args": [
+            {
+              "name": "input",
+              "type": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "InputDeity",
+                  "ofType": null
+                }
+              },
+              "defaultValue": null
+            }
+          ],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "OBJECT",
+              "name": "Deity",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Collision/name-collision/query.gql b/test/Feature/Collision/name-collision/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/name-collision/query.gql
@@ -0,0 +1,3 @@
+{
+  name
+}
diff --git a/test/Feature/Collision/name-collision/response.json b/test/Feature/Collision/name-collision/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Collision/name-collision/response.json
@@ -0,0 +1,10 @@
+{
+  "errors": [
+    {
+      "message": "There can Be only One TypeDefinition Named \"A\"."
+    },
+    {
+      "message": "There can Be only One TypeDefinition Named \"A\"."
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/API.hs b/test/Feature/Holistic/API.hs
--- a/test/Feature/Holistic/API.hs
+++ b/test/Feature/Holistic/API.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DerivingStrategies #-}
 {-# LANGUAGE DuplicateRecordFields #-}
@@ -25,7 +26,8 @@
 import Data.Morpheus.Kind (SCALAR)
 import Data.Morpheus.Subscriptions (Event)
 import Data.Morpheus.Types
-  ( DecodeScalar (..),
+  ( Arg (..),
+    DecodeScalar (..),
     EncodeScalar (..),
     GQLRequest,
     GQLResponse,
@@ -33,6 +35,7 @@
     ID (..),
     RootResolver (..),
     ScalarValue (..),
+    TypeGuard (..),
     Undefined (..),
     liftEither,
     subscribe,
@@ -94,17 +97,20 @@
             queryTestUnion = Just . TestUnionUser <$> queryUser,
             queryPerson =
               pure
-                Person
-                  { personName = pure (Just "test Person Name")
-                  },
-            queryTestEnum =
-              \QueryTestEnumArgs
-                 { queryTestEnumArgsEnum
-                 } ->
-                  pure
-                    [ queryTestEnumArgsEnum,
-                      CollidingEnumEnumA
-                    ]
+                ( ResolveType
+                    User
+                      { userName = pure "test Person Name",
+                        userEmail = pure "",
+                        userAddress = resolveAddress,
+                        userOffice = resolveAddress,
+                        userFriend = pure Nothing
+                      }
+                ),
+            queryTestEnum = \(Arg enum) ->
+              pure
+                [ enum,
+                  CollidingEnumEnumA
+                ]
           },
       mutationResolver =
         Mutation
@@ -144,7 +150,7 @@
         ExtQuery
           { fail1 = liftEither alwaysFail,
             fail2 = fail "fail with MonadFail",
-            type' = \TypeArgs {in' = TypeInput {data'}} -> pure data'
+            type' = \(Arg TypeInput {data'}) -> pure data'
           },
       mutationResolver = Undefined,
       subscriptionResolver = Undefined
diff --git a/test/Feature/Holistic/arguments/nameConflict/query.gql b/test/Feature/Holistic/arguments/nameConflict/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/arguments/nameConflict/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  user {
-    address(comment: "", comment: "") {
-      city
-    }
-  }
-}
diff --git a/test/Feature/Holistic/arguments/nameConflict/response.json b/test/Feature/Holistic/arguments/nameConflict/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/arguments/nameConflict/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "There can Be only One Argument Named \"comment\"",
-      "locations": [
-        {
-          "line": 3,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "There can Be only One Argument Named \"comment\"",
-      "locations": [
-        {
-          "line": 3,
-          "column": 26
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/arguments/undefinedArgument/query.gql b/test/Feature/Holistic/arguments/undefinedArgument/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/arguments/undefinedArgument/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  user {
-    address {
-      city
-    }
-  }
-}
diff --git a/test/Feature/Holistic/arguments/undefinedArgument/response.json b/test/Feature/Holistic/arguments/undefinedArgument/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/arguments/undefinedArgument/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Field \"address\" argument \"coordinates\" is required but not provided.",
-      "locations": [
-        {
-          "line": 3,
-          "column": 5
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/arguments/unknownArguments/query.gql b/test/Feature/Holistic/arguments/unknownArguments/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/arguments/unknownArguments/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  user (name:bal , parent:sa ) {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/arguments/unknownArguments/response.json b/test/Feature/Holistic/arguments/unknownArguments/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/arguments/unknownArguments/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Unknown Argument \"name\" on Field \"user\".",
-      "locations": [
-        {
-          "line": 2,
-          "column": 9
-        }
-      ]
-    },
-    {
-      "message": "Unknown Argument \"parent\" on Field \"user\".",
-      "locations": [
-        {
-          "line": 2,
-          "column": 20
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/cases.json b/test/Feature/Holistic/cases.json
deleted file mode 100644
--- a/test/Feature/Holistic/cases.json
+++ /dev/null
@@ -1,338 +0,0 @@
-[
-  {
-    "path": "fragment/loopingFragment",
-    "description": "fail when: fragment directly or indirectly references itself"
-  },
-  {
-    "path": "arguments/unknownArguments",
-    "description": "fail when: argument on field is not recognized by the schema"
-  },
-  {
-    "path": "arguments/nameConflict",
-    "description": "fail when: argument names on field are not unique"
-  },
-  {
-    "path": "arguments/undefinedArgument",
-    "description": "fail when: required argument is not defined in selection "
-  },
-  {
-    "path": "selection/unknownField",
-    "description": "fail when: selected field does not exist on type"
-  },
-  {
-    "path": "selection/hasNoSubFields",
-    "description": "fail when: selected subFields on non object type"
-  },
-  {
-    "path": "selection/mustHaveSubFields",
-    "description": "fail when: is not selected subFields on object type"
-  },
-  {
-    "path": "selection/mergeConflict/arguments",
-    "description": "fail when: selections with on same fields have different arguments"
-  },
-  {
-    "path": "selection/mergeConflict/union",
-    "description": "fail when: conflicting union"
-  },
-  {
-    "path": "selection/mergeUnionSelection",
-    "description": "merge union selections"
-  },
-  {
-    "path": "selection/mergeConflict/alias",
-    "description": "fail when: selections on different fields have same alias"
-  },
-  {
-    "path": "selection/AliasResolve",
-    "description": "resolves same field with different name"
-  },
-  {
-    "path": "selection/AliasUnknownField",
-    "description": "fail when: selected field in alias does not exist on type"
-  },
-  {
-    "path": "fragment/inlineFragment",
-    "description": "returns field selected by inline Fragment"
-  },
-  {
-    "path": "fragment/inlineFragmentTypeMismatch",
-    "description": "fail when: inline fragment type is incompatible with object type"
-  },
-  {
-    "path": "fragment/cannotBeSpreadOnType",
-    "description": "fail when: fragment type is incompatible with object type"
-  },
-  {
-    "path": "fragment/unusedFragment",
-    "description": "fail when: defined fragment is not used query"
-  },
-  {
-    "path": "fragment/nameCollision",
-    "description": "fail when: fragments are defined with same name"
-  },
-  {
-    "path": "fragment/conditionTypeViolation",
-    "description": "fail when: condition type is not an Object"
-  },
-  {
-    "path": "fragment/unknownConditionType",
-    "description": "fail when: condition type is not defined by schema"
-  },
-  {
-    "path": "parsing/duplicatedFields",
-    "description": "fail when: user supplies duplicated fields"
-  },
-  {
-    "path": "parsing/invalidFields",
-    "description": "fail when: user supplies invalid fields"
-  },
-  {
-    "path": "parsing/invalidNotNullOperator",
-    "description": "fail when: user supplies '@' instead of '!'"
-  },
-  {
-    "path": "parsing/missingCloseBrace",
-    "description": "fail when: user misses out a closing '}'"
-  },
-  {
-    "path": "parsing/generousSpaces",
-    "description": "returns query even when spacing is extremely liberal"
-  },
-  {
-    "path": "parsing/complex",
-    "description": "returns on a complex query that exercises all features"
-  },
-  {
-    "path": "parsing/extraCommas",
-    "description": "fails on a query with too many commas"
-  },
-  {
-    "path": "parsing/inputListValues",
-    "description": "returns query when input list values are separated by newlines or commas"
-  },
-  {
-    "path": "parsing/notNullSpacing",
-    "description": "returns on a query that pads all '!' chars with whitespace"
-  },
-  {
-    "path": "introspection/interface",
-    "description": "interface must be visible in introspection"
-  },
-  {
-    "path": "introspection/schemaTypes/__Type",
-    "description": "benchmark  __Type"
-  },
-  {
-    "path": "introspection/schemaTypes/__InputValue",
-    "description": "benchmark  __InputValue"
-  },
-  {
-    "path": "introspection/schemaTypes/__Field",
-    "description": "benchmark  __Field"
-  },
-  {
-    "path": "introspection/schemaTypes/__EnumValue",
-    "description": "benchmark  __EnumValue"
-  },
-  {
-    "path": "introspection/schemaTypes/__TypeKind",
-    "description": "benchmark  __TypeKind"
-  },
-  {
-    "path": "introspection/schemaTypes/__Directive",
-    "description": "benchmark  __Directive"
-  },
-  {
-    "path": "introspection/schemaTypes/__DirectiveLocation",
-    "description": "benchmark  __DirectiveLocation"
-  },
-  {
-    "path": "introspection/schemaTypes/__Schema",
-    "description": "benchmark  __Schema"
-  },
-  {
-    "path": "introspection/defaultTypes/String",
-    "description": "benchmark  String"
-  },
-  {
-    "path": "introspection/defaultTypes/Boolean",
-    "description": "benchmark  Boolean"
-  },
-  {
-    "path": "introspection/defaultTypes/Int",
-    "description": "benchmark  Int"
-  },
-  {
-    "path": "introspection/defaultTypes/Float",
-    "description": "benchmark Float"
-  },
-  {
-    "path": "introspection/defaultTypes/ID",
-    "description": "benchmark ID"
-  },
-  {
-    "path": "introspection/kinds/OBJECT",
-    "description": "test introspection of OBJECT kind with args, NonNull and List wrappers"
-  },
-  {
-    "path": "introspection/kinds/INPUT_OBJECT",
-    "description": "test introspection of INPUT_OBJECT kind"
-  },
-  {
-    "path": "introspection/kinds/SCALAR",
-    "description": "test introspection of SCALAR kind"
-  },
-  {
-    "path": "introspection/kinds/ENUM",
-    "description": "test introspection of ENUM kind"
-  },
-  {
-    "path": "introspection/kinds/UNION",
-    "description": "test introspection of UNION kind"
-  },
-  {
-    "path": "parsing/singleLineComments",
-    "description": "parses single line comments"
-  },
-  {
-    "path": "parsing/AnonymousOperation/query",
-    "description": "parse anonymous query"
-  },
-  {
-    "path": "parsing/AnonymousOperation/mutation",
-    "description": "parse anonymous mutation"
-  },
-  {
-    "path": "parsing/AnonymousOperation/subscription",
-    "description": "parse anonymous subscription"
-  },
-  {
-    "path": "parsing/directive/operation",
-    "description": "parse operation directives"
-  },
-  {
-    "path": "parsing/directive/selection",
-    "description": "parse directives on selection fields"
-  },
-  {
-    "path": "parsing/directive/notOnArgument",
-    "description": "fail when:  directives are used in arguments"
-  },
-  {
-    "path": "parsing/directive/notOnVariable",
-    "description": "fail when: directive is used in Variable Definition"
-  },
-  {
-    "path": "parsing/numbers",
-    "description": "parse signed numbers and numbers with exponential"
-  },
-  {
-    "path": "introspection/description/object",
-    "description": "check object descriptions, type, field, args"
-  },
-  {
-    "path": "introspection/description/inputObject",
-    "description": "check inputObject descriptions, type, field"
-  },
-  {
-    "path": "introspection/description/union",
-    "description": "check union descriptions, type"
-  },
-  {
-    "path": "introspection/description/enum",
-    "description": "check enum descriptions, type, enumValue"
-  },
-  {
-    "path": "introspection/deprecated/enumValue",
-    "description": "check if deprecated works with enumValue"
-  },
-  {
-    "path": "introspection/directives/default",
-    "description": "default directives must be defined"
-  },
-  {
-    "path": "introspection/deprecated/field",
-    "description": "check if deprecated works with object fields"
-  },
-  {
-    "path": "failure/resolveFailure",
-    "description": "test failed resolvers"
-  },
-  {
-    "path": "selection/__typename",
-    "description": "test __typename on object types"
-  },
-  {
-    "path": "selection/mergeSelection",
-    "description": "merge selection on same fields"
-  },
-  {
-    "path": "selection/subscription/singleTopLevelField/fail",
-    "description": "fail if subscription selects more then one top level field."
-  },
-  {
-    "path": "selection/subscription/singleTopLevelField/failAnonymous",
-    "description": "fail if subscription selects more then one top level field. (for anonymous subscription)"
-  },
-  {
-    "path": "selection/directives/default/resolve",
-    "description": "test skip include resolving"
-  },
-  {
-    "path": "selection/directives/default/requiredArgument",
-    "description": "fail: if skip include does not have argument \"if\""
-  },
-  {
-    "path": "selection/directives/default/wrongArgumentType",
-    "description": "fail: if skip include has argument \"if\", but with wrong value"
-  },
-  {
-    "path": "selection/directives/default/withVariable",
-    "description": "api allows use of variable inside directives"
-  },
-  {
-    "path": "selection/directives/default/withMerge",
-    "description": "@skip and @include are evaluated before selection is merged"
-  },
-  {
-    "path": "selection/directives/default/variablesOnFragment",
-    "description": "@skip and @include are evaluated before selection is merged"
-  },
-  {
-    "path": "selection/directives/validation/invalidPlace/query",
-    "description": "directive on invalid place must be rejected"
-  },
-  {
-    "path": "selection/directives/validation/invalidPlace/mutation",
-    "description": "directive on invalid place must be rejected"
-  },
-  {
-    "path": "selection/directives/validation/invalidPlace/subscription",
-    "description": "directive on invalid place must be rejected"
-  },
-  {
-    "path": "selection/directives/validation/invalidPlace/field",
-    "description": "directive on invalid place must be rejected"
-  },
-  {
-    "path": "selection/directives/validation/invalidPlace/fragmentSpread",
-    "description": "directive on invalid place must be rejected"
-  },
-  {
-    "path": "selection/directives/validation/invalidPlace/inlineFragment",
-    "description": "directive on invalid place must be rejected"
-  },
-  {
-    "path": "reservedNames",
-    "description": "morpheus should handle reserved names"
-  },
-  {
-    "path": "namespace/enum",
-    "description": "check if deriving stripes enum namespaces"
-  },
-  {
-    "path": "namespace/enum-fail-on-fullname",
-    "description": "must accept only striped enums"
-  }
-]
diff --git a/test/Feature/Holistic/failure/resolveFailure/query.gql b/test/Feature/Holistic/failure/resolveFailure/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/failure/resolveFailure/query.gql
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  fail1
-  fail2
-}
diff --git a/test/Feature/Holistic/failure/resolveFailure/response.json b/test/Feature/Holistic/failure/resolveFailure/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/failure/resolveFailure/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Failure on Resolving Field \"fail1\": fail with Either",
-      "locations": [{ "line": 2, "column": 3 }]
-    },
-    {
-      "message": "Failure on Resolving Field \"fail2\": fail with MonadFail",
-      "locations": [{ "line": 3, "column": 3 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/cannotBeSpreadOnType/query.gql b/test/Feature/Holistic/fragment/cannotBeSpreadOnType/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/cannotBeSpreadOnType/query.gql
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  user {
-    ...UserFragment
-  }
-}
-fragment UserFragment on Address {
-  houseNumber
-}
diff --git a/test/Feature/Holistic/fragment/cannotBeSpreadOnType/response.json b/test/Feature/Holistic/fragment/cannotBeSpreadOnType/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/cannotBeSpreadOnType/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fragment \"UserFragment\" cannot be spread here as objects of type \"User\", \"Person\" can never be of type \"Address\".",
-      "locations": [{ "line": 3, "column": 5 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/conditionTypeViolation/query.gql b/test/Feature/Holistic/fragment/conditionTypeViolation/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/conditionTypeViolation/query.gql
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  user {
-    ...MyFragment
-  }
-}
-fragment MyFragment on Coordinates {
-  latitude
-}
diff --git a/test/Feature/Holistic/fragment/conditionTypeViolation/response.json b/test/Feature/Holistic/fragment/conditionTypeViolation/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/conditionTypeViolation/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fragment \"MyFragment\" cannot condition on non composite type \"Coordinates\".",
-      "locations": [
-        {
-          "line": 6,
-          "column": 10
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/inlineFragment/query.gql b/test/Feature/Holistic/fragment/inlineFragment/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/inlineFragment/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  user {
-    ... on User {
-      name
-    }
-  }
-}
diff --git a/test/Feature/Holistic/fragment/inlineFragment/response.json b/test/Feature/Holistic/fragment/inlineFragment/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/inlineFragment/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "user": {
-      "name": "testName"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/query.gql b/test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  user {
-    ... on Address {
-      name
-    }
-  }
-}
diff --git a/test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/response.json b/test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/inlineFragmentTypeMismatch/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fragment cannot be spread here as objects of type \"User\", \"Person\" can never be of type \"Address\".",
-      "locations": [{ "line": 3, "column": 5 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/loopingFragment/query.gql b/test/Feature/Holistic/fragment/loopingFragment/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/loopingFragment/query.gql
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  user {
-    email
-  }
-}
-
-fragment A on User {
-  ...D
-  ...C
-}
-
-fragment B on User {
-  ...C
-}
-
-fragment C on User {
-  ...A
-}
-
-fragment D on User {
-	name
-}
diff --git a/test/Feature/Holistic/fragment/loopingFragment/response.json b/test/Feature/Holistic/fragment/loopingFragment/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/loopingFragment/response.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fragment \"A\" is never used.",
-      "locations": [{ "line": 7, "column": 10 }]
-    },
-    {
-      "message": "Cannot spread fragment \"C\" within itself via \"C\", \"B\", \"C\", \"A\".",
-      "locations": [
-        { "line": 9, "column": 3 },
-        { "line": 12, "column": 10 },
-        { "line": 13, "column": 3 },
-        { "line": 17, "column": 3 }
-      ]
-    },
-    {
-      "message": "Cannot spread fragment \"C\" within itself via \"C\", \"C\", \"A\".",
-      "locations": [
-        { "line": 9, "column": 3 },
-        { "line": 16, "column": 10 },
-        { "line": 17, "column": 3 }
-      ]
-    },
-    {
-      "message": "Fragment \"B\" is never used.",
-      "locations": [{ "line": 12, "column": 10 }]
-    },
-    {
-      "message": "Fragment \"C\" is never used.",
-      "locations": [{ "line": 16, "column": 10 }]
-    },
-    {
-      "message": "Cannot spread fragment \"A\" within itself via \"A\", \"A\", \"C\".",
-      "locations": [
-        { "line": 17, "column": 3 },
-        { "line": 7, "column": 10 },
-        { "line": 9, "column": 3 }
-      ]
-    },
-    {
-      "message": "Fragment \"D\" is never used.",
-      "locations": [{ "line": 20, "column": 10 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/nameCollision/query.gql b/test/Feature/Holistic/fragment/nameCollision/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/nameCollision/query.gql
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  user {
-    email
-    ...F
-  }
-}
-
-fragment F on User {
-  name
-}
-
-fragment F on User {
-  name
-}
diff --git a/test/Feature/Holistic/fragment/nameCollision/response.json b/test/Feature/Holistic/fragment/nameCollision/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/nameCollision/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "There can be only one fragment named \"F\".",
-      "locations": [
-        {
-          "line": 8,
-          "column": 10
-        }
-      ]
-    },
-    {
-      "message": "There can be only one fragment named \"F\".",
-      "locations": [
-        {
-          "line": 12,
-          "column": 10
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/unknownConditionType/query.gql b/test/Feature/Holistic/fragment/unknownConditionType/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/unknownConditionType/query.gql
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  user {
-    ...MyFragment
-  }
-}
-fragment MyFragment on BjsK {
-  name
-}
diff --git a/test/Feature/Holistic/fragment/unknownConditionType/response.json b/test/Feature/Holistic/fragment/unknownConditionType/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/unknownConditionType/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Unknown type \"BjsK\".",
-      "locations": [
-        {
-          "line": 6,
-          "column": 10
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/unknownTargetType/query.gql b/test/Feature/Holistic/fragment/unknownTargetType/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/unknownTargetType/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  user {
-    name
-  }
-}
-
-fragment Bo on XYZ {
-  name
-}
diff --git a/test/Feature/Holistic/fragment/unknownTargetType/response.json b/test/Feature/Holistic/fragment/unknownTargetType/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/unknownTargetType/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Unknown type \"XYZ\".",
-      "locations": [
-        {
-          "line": 7,
-          "column": 0
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/fragment/unusedFragment/query.gql b/test/Feature/Holistic/fragment/unusedFragment/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/unusedFragment/query.gql
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  user {
-    email
-    ...A
-  }
-}
-
-fragment A on User {
-  ...B
-}
-
-fragment B on User {
-  name
-}
-
-fragment C on User {
-  ...D
-}
-
-fragment D on User {
-  email
-}
diff --git a/test/Feature/Holistic/fragment/unusedFragment/response.json b/test/Feature/Holistic/fragment/unusedFragment/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/fragment/unusedFragment/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fragment \"C\" is never used.",
-      "locations": [
-        {
-          "line": 16,
-          "column": 10
-        }
-      ]
-    },
-    {
-      "message": "Fragment \"D\" is never used.",
-      "locations": [
-        {
-          "line": 20,
-          "column": 10
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/holistic/arguments/nameConflict/query.gql b/test/Feature/Holistic/holistic/arguments/nameConflict/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/arguments/nameConflict/query.gql
@@ -0,0 +1,7 @@
+{
+  user {
+    address(comment: "", comment: "") {
+      city
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/arguments/nameConflict/response.json b/test/Feature/Holistic/holistic/arguments/nameConflict/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/arguments/nameConflict/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "There can Be only One Argument Named \"comment\"",
+      "locations": [
+        {
+          "line": 3,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "There can Be only One Argument Named \"comment\"",
+      "locations": [
+        {
+          "line": 3,
+          "column": 26
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/arguments/undefinedArgument/query.gql b/test/Feature/Holistic/holistic/arguments/undefinedArgument/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/arguments/undefinedArgument/query.gql
@@ -0,0 +1,7 @@
+{
+  user {
+    address {
+      city
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/arguments/undefinedArgument/response.json b/test/Feature/Holistic/holistic/arguments/undefinedArgument/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/arguments/undefinedArgument/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Field \"address\" argument \"coordinates\" is required but not provided.",
+      "locations": [
+        {
+          "line": 3,
+          "column": 5
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/arguments/unknownArguments/query.gql b/test/Feature/Holistic/holistic/arguments/unknownArguments/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/arguments/unknownArguments/query.gql
@@ -0,0 +1,5 @@
+{
+  user (name:bal , parent:sa ) {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/arguments/unknownArguments/response.json b/test/Feature/Holistic/holistic/arguments/unknownArguments/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/arguments/unknownArguments/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "Unknown Argument \"name\" on Field \"user\".",
+      "locations": [
+        {
+          "line": 2,
+          "column": 9
+        }
+      ]
+    },
+    {
+      "message": "Unknown Argument \"parent\" on Field \"user\".",
+      "locations": [
+        {
+          "line": 2,
+          "column": 20
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/failure/resolveFailure/query.gql b/test/Feature/Holistic/holistic/failure/resolveFailure/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/failure/resolveFailure/query.gql
@@ -0,0 +1,4 @@
+{
+  fail1
+  fail2
+}
diff --git a/test/Feature/Holistic/holistic/failure/resolveFailure/response.json b/test/Feature/Holistic/holistic/failure/resolveFailure/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/failure/resolveFailure/response.json
@@ -0,0 +1,12 @@
+{
+  "errors": [
+    {
+      "message": "Failure on Resolving Field \"fail1\": fail with Either",
+      "locations": [{ "line": 2, "column": 3 }]
+    },
+    {
+      "message": "Failure on Resolving Field \"fail2\": fail with MonadFail",
+      "locations": [{ "line": 3, "column": 3 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/query.gql b/test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/query.gql
@@ -0,0 +1,8 @@
+{
+  user {
+    ...UserFragment
+  }
+}
+fragment UserFragment on Address {
+  houseNumber
+}
diff --git a/test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/response.json b/test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/cannotBeSpreadOnType/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Fragment \"UserFragment\" cannot be spread here as objects of type \"User\", \"Person\" can never be of type \"Address\".",
+      "locations": [{ "line": 3, "column": 5 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/conditionTypeViolation/query.gql b/test/Feature/Holistic/holistic/fragment/conditionTypeViolation/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/conditionTypeViolation/query.gql
@@ -0,0 +1,8 @@
+{
+  user {
+    ...MyFragment
+  }
+}
+fragment MyFragment on Coordinates {
+  latitude
+}
diff --git a/test/Feature/Holistic/holistic/fragment/conditionTypeViolation/response.json b/test/Feature/Holistic/holistic/fragment/conditionTypeViolation/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/conditionTypeViolation/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Fragment \"MyFragment\" cannot condition on non composite type \"Coordinates\".",
+      "locations": [
+        {
+          "line": 6,
+          "column": 10
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/inlineFragment/query.gql b/test/Feature/Holistic/holistic/fragment/inlineFragment/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/inlineFragment/query.gql
@@ -0,0 +1,7 @@
+{
+  user {
+    ... on User {
+      name
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/fragment/inlineFragment/response.json b/test/Feature/Holistic/holistic/fragment/inlineFragment/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/inlineFragment/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "user": {
+      "name": "testName"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/query.gql b/test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/query.gql
@@ -0,0 +1,7 @@
+{
+  user {
+    ... on Address {
+      name
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/response.json b/test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/inlineFragmentTypeMismatch/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Fragment cannot be spread here as objects of type \"User\", \"Person\" can never be of type \"Address\".",
+      "locations": [{ "line": 3, "column": 5 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/loopingFragment/query.gql b/test/Feature/Holistic/holistic/fragment/loopingFragment/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/loopingFragment/query.gql
@@ -0,0 +1,22 @@
+{
+  user {
+    email
+  }
+}
+
+fragment A on User {
+  ...D
+  ...C
+}
+
+fragment B on User {
+  ...C
+}
+
+fragment C on User {
+  ...A
+}
+
+fragment D on User {
+	name
+}
diff --git a/test/Feature/Holistic/holistic/fragment/loopingFragment/response.json b/test/Feature/Holistic/holistic/fragment/loopingFragment/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/loopingFragment/response.json
@@ -0,0 +1,45 @@
+{
+  "errors": [
+    {
+      "message": "Fragment \"A\" is never used.",
+      "locations": [{ "line": 7, "column": 10 }]
+    },
+    {
+      "message": "Cannot spread fragment \"C\" within itself via \"C\", \"B\", \"C\", \"A\".",
+      "locations": [
+        { "line": 9, "column": 3 },
+        { "line": 12, "column": 10 },
+        { "line": 13, "column": 3 },
+        { "line": 17, "column": 3 }
+      ]
+    },
+    {
+      "message": "Cannot spread fragment \"C\" within itself via \"C\", \"C\", \"A\".",
+      "locations": [
+        { "line": 9, "column": 3 },
+        { "line": 16, "column": 10 },
+        { "line": 17, "column": 3 }
+      ]
+    },
+    {
+      "message": "Fragment \"B\" is never used.",
+      "locations": [{ "line": 12, "column": 10 }]
+    },
+    {
+      "message": "Fragment \"C\" is never used.",
+      "locations": [{ "line": 16, "column": 10 }]
+    },
+    {
+      "message": "Cannot spread fragment \"A\" within itself via \"A\", \"A\", \"C\".",
+      "locations": [
+        { "line": 17, "column": 3 },
+        { "line": 7, "column": 10 },
+        { "line": 9, "column": 3 }
+      ]
+    },
+    {
+      "message": "Fragment \"D\" is never used.",
+      "locations": [{ "line": 20, "column": 10 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/nameCollision/query.gql b/test/Feature/Holistic/holistic/fragment/nameCollision/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/nameCollision/query.gql
@@ -0,0 +1,14 @@
+{
+  user {
+    email
+    ...F
+  }
+}
+
+fragment F on User {
+  name
+}
+
+fragment F on User {
+  name
+}
diff --git a/test/Feature/Holistic/holistic/fragment/nameCollision/response.json b/test/Feature/Holistic/holistic/fragment/nameCollision/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/nameCollision/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "There can be only one fragment named \"F\".",
+      "locations": [
+        {
+          "line": 8,
+          "column": 10
+        }
+      ]
+    },
+    {
+      "message": "There can be only one fragment named \"F\".",
+      "locations": [
+        {
+          "line": 12,
+          "column": 10
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/unknownConditionType/query.gql b/test/Feature/Holistic/holistic/fragment/unknownConditionType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/unknownConditionType/query.gql
@@ -0,0 +1,8 @@
+{
+  user {
+    ...MyFragment
+  }
+}
+fragment MyFragment on BjsK {
+  name
+}
diff --git a/test/Feature/Holistic/holistic/fragment/unknownConditionType/response.json b/test/Feature/Holistic/holistic/fragment/unknownConditionType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/unknownConditionType/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Unknown type \"BjsK\".",
+      "locations": [
+        {
+          "line": 6,
+          "column": 10
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/unknownTargetType/query.gql b/test/Feature/Holistic/holistic/fragment/unknownTargetType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/unknownTargetType/query.gql
@@ -0,0 +1,10 @@
+{
+  user {
+    name
+    ...Bo
+  }
+}
+
+fragment Bo on XYZ {
+  name
+}
diff --git a/test/Feature/Holistic/holistic/fragment/unknownTargetType/response.json b/test/Feature/Holistic/holistic/fragment/unknownTargetType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/unknownTargetType/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Unknown type \"XYZ\".",
+      "locations": [
+        {
+          "line": 8,
+          "column": 10
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/fragment/unusedFragment/query.gql b/test/Feature/Holistic/holistic/fragment/unusedFragment/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/unusedFragment/query.gql
@@ -0,0 +1,22 @@
+{
+  user {
+    email
+    ...A
+  }
+}
+
+fragment A on User {
+  ...B
+}
+
+fragment B on User {
+  name
+}
+
+fragment C on User {
+  ...D
+}
+
+fragment D on User {
+  email
+}
diff --git a/test/Feature/Holistic/holistic/fragment/unusedFragment/response.json b/test/Feature/Holistic/holistic/fragment/unusedFragment/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/fragment/unusedFragment/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "Fragment \"C\" is never used.",
+      "locations": [
+        {
+          "line": 16,
+          "column": 10
+        }
+      ]
+    },
+    {
+      "message": "Fragment \"D\" is never used.",
+      "locations": [
+        {
+          "line": 20,
+          "column": 10
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/query.gql b/test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Boolean") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/response.json b/test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/Boolean/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "__type": {
+      "kind": "SCALAR",
+      "name": "Boolean",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/Float/query.gql b/test/Feature/Holistic/holistic/introspection/defaultTypes/Float/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/Float/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Float") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/Float/response.json b/test/Feature/Holistic/holistic/introspection/defaultTypes/Float/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/Float/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "__type": {
+      "kind": "SCALAR",
+      "name": "Float",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/ID/query.gql b/test/Feature/Holistic/holistic/introspection/defaultTypes/ID/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/ID/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "ID") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/ID/response.json b/test/Feature/Holistic/holistic/introspection/defaultTypes/ID/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/ID/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "__type": {
+      "kind": "SCALAR",
+      "name": "ID",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/Int/query.gql b/test/Feature/Holistic/holistic/introspection/defaultTypes/Int/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/Int/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Int") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/Int/response.json b/test/Feature/Holistic/holistic/introspection/defaultTypes/Int/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/Int/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "__type": {
+      "kind": "SCALAR",
+      "name": "Int",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/String/query.gql b/test/Feature/Holistic/holistic/introspection/defaultTypes/String/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/String/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "String") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/defaultTypes/String/response.json b/test/Feature/Holistic/holistic/introspection/defaultTypes/String/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/defaultTypes/String/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "__type": {
+      "kind": "SCALAR",
+      "name": "String",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/deprecated/enumValue/query.gql b/test/Feature/Holistic/holistic/introspection/deprecated/enumValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/deprecated/enumValue/query.gql
@@ -0,0 +1,9 @@
+{
+  __type(name: "TestEnum") {
+    enumValues {
+      name
+      isDeprecated
+      deprecationReason
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/deprecated/enumValue/response.json b/test/Feature/Holistic/holistic/introspection/deprecated/enumValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/deprecated/enumValue/response.json
@@ -0,0 +1,15 @@
+{
+  "data": {
+    "__type": {
+      "enumValues": [
+        { "name": "EnumA", "isDeprecated": false, "deprecationReason": null },
+        {
+          "name": "EnumB",
+          "isDeprecated": true,
+          "deprecationReason": "test deprecation enumValue"
+        },
+        { "name": "EnumC", "isDeprecated": true, "deprecationReason": null }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/deprecated/field/query.gql b/test/Feature/Holistic/holistic/introspection/deprecated/field/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/deprecated/field/query.gql
@@ -0,0 +1,9 @@
+{
+  __type(name: "Address") {
+    fields {
+      name
+      isDeprecated
+      deprecationReason
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/deprecated/field/response.json b/test/Feature/Holistic/holistic/introspection/deprecated/field/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/deprecated/field/response.json
@@ -0,0 +1,19 @@
+{
+  "data": {
+    "__type": {
+      "fields": [
+        {
+          "name": "city",
+          "isDeprecated": true,
+          "deprecationReason": "test deprecation field with reason"
+        },
+        { "name": "street", "isDeprecated": true, "deprecationReason": null },
+        {
+          "name": "houseNumber",
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/enum/query.gql b/test/Feature/Holistic/holistic/introspection/description/enum/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/enum/query.gql
@@ -0,0 +1,9 @@
+{
+  __type(name: "TestEnum") {
+    description
+    enumValues {
+      name
+      description
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/enum/response.json b/test/Feature/Holistic/holistic/introspection/description/enum/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/enum/response.json
@@ -0,0 +1,18 @@
+{
+  "data": {
+    "__type": {
+      "description": "\ntype Description: TestEnum\n\nsome random enums for test\n",
+      "enumValues": [
+        {
+          "name": "EnumA",
+          "description": "\n  enumValue Description: EnumA\n  "
+        },
+        { "name": "EnumB", "description": null },
+        {
+          "name": "EnumC",
+          "description": "\n  enumValue Description: EnumC\n  "
+        }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/inputObject/query.gql b/test/Feature/Holistic/holistic/introspection/description/inputObject/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/inputObject/query.gql
@@ -0,0 +1,9 @@
+{
+  __type(name: "Coordinates") {
+    description
+    inputFields {
+      name
+      description
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/inputObject/response.json b/test/Feature/Holistic/holistic/introspection/description/inputObject/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/inputObject/response.json
@@ -0,0 +1,17 @@
+{
+  "data": {
+    "__type": {
+      "description": "\ntype Description: Coordinates\n\nsome random text\n",
+      "inputFields": [
+        {
+          "name": "latitude",
+          "description": "\n  inputValue Description: latitude\n  "
+        },
+        {
+          "name": "longitude",
+          "description": "\n  inputValue Description: longitude\n  some random inputValue details\n  "
+        }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/object/query.gql b/test/Feature/Holistic/holistic/introspection/description/object/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/object/query.gql
@@ -0,0 +1,13 @@
+{
+  __type(name: "Address") {
+    description
+    fields {
+      name
+      description
+      args {
+        name
+        description
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/object/response.json b/test/Feature/Holistic/holistic/introspection/description/object/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/object/response.json
@@ -0,0 +1,26 @@
+{
+  "data": {
+    "__type": {
+      "description": "\ntype Description:\n\n  Address\n",
+      "fields": [
+        {
+          "name": "city",
+          "description": "\n  field Description: city\n  ",
+          "args": []
+        },
+        {
+          "name": "street",
+          "description": null,
+          "args": [
+            {
+              "name": "argInputObject",
+              "description": "\n    argument Description: inputObject\n    "
+            },
+            { "name": "argMaybeString", "description": null }
+          ]
+        },
+        { "name": "houseNumber", "description": null, "args": [] }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/union/query.gql b/test/Feature/Holistic/holistic/introspection/description/union/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/union/query.gql
@@ -0,0 +1,5 @@
+{
+  __type(name: "TestUnion") {
+    description
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/description/union/response.json b/test/Feature/Holistic/holistic/introspection/description/union/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/description/union/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "__type": {
+      "description": "\ntype Description: TestUnion\n\nsome random text for union type\n"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/directives/default/query.gql b/test/Feature/Holistic/holistic/introspection/directives/default/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/directives/default/query.gql
@@ -0,0 +1,54 @@
+# introspect directives
+query Get__Type {
+  __schema {
+    directives {
+      name
+      description
+      locations
+      args {
+        ...InputValue
+      }
+    }
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/directives/default/response.json b/test/Feature/Holistic/holistic/introspection/directives/default/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/directives/default/response.json
@@ -0,0 +1,60 @@
+{
+  "data": {
+    "__schema": {
+      "directives": [
+        {
+          "name": "skip",
+          "description": "\nDirects the executor to skip this field or fragment when the `if` argument is true.\n",
+          "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
+          "args": [
+            {
+              "name": "if",
+              "type": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                }
+              },
+              "defaultValue": null
+            }
+          ]
+        },
+        {
+          "name": "include",
+          "description": "\nDirects the executor to include this field or fragment only when the `if` argument is true.\n",
+          "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
+          "args": [
+            {
+              "name": "if",
+              "type": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                }
+              },
+              "defaultValue": null
+            }
+          ]
+        },
+        {
+          "name": "deprecated",
+          "description": "\nMarks an element of a GraphQL schema as no longer supported.\n",
+          "locations": ["FIELD_DEFINITION", "ENUM_VALUE"],
+          "args": [
+            {
+              "name": "reason",
+              "type": { "kind": "SCALAR", "name": "String", "ofType": null },
+              "defaultValue": null
+            }
+          ]
+        }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/interface/query.gql b/test/Feature/Holistic/holistic/introspection/interface/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/interface/query.gql
@@ -0,0 +1,82 @@
+query Get__Type {
+  person {
+    name
+  }
+  interface: __type(name: "Person") {
+    ...FullType
+  }
+  user: __type(name: "User") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/interface/response.json b/test/Feature/Holistic/holistic/introspection/interface/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/interface/response.json
@@ -0,0 +1,128 @@
+{
+  "data": {
+    "person": {
+      "name": "test Person Name",
+      "__typename": "User"
+    },
+    "interface": {
+      "kind": "INTERFACE",
+      "name": "Person",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": { "kind": "SCALAR", "name": "String", "ofType": null },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": [{ "kind": "OBJECT", "name": "User", "ofType": null }]
+    },
+    "user": {
+      "kind": "OBJECT",
+      "name": "User",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "email",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "address",
+          "args": [
+            {
+              "name": "coordinates",
+              "type": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "Coordinates",
+                  "ofType": null
+                }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "comment",
+              "type": { "kind": "SCALAR", "name": "String", "ofType": null },
+              "defaultValue": null
+            }
+          ],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "OBJECT", "name": "Address", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "office",
+          "args": [
+            {
+              "name": "zipCode",
+              "type": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
+                }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "cityID",
+              "type": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": { "kind": "ENUM", "name": "TestEnum", "ofType": null }
+              },
+              "defaultValue": null
+            }
+          ],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "OBJECT", "name": "Address", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "friend",
+          "args": [],
+          "type": { "kind": "OBJECT", "name": "User", "ofType": null },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [{ "kind": "INTERFACE", "name": "Person", "ofType": null }],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/ENUM/query.gql b/test/Feature/Holistic/holistic/introspection/kinds/ENUM/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/ENUM/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "TestEnum") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/ENUM/response.json b/test/Feature/Holistic/holistic/introspection/kinds/ENUM/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/ENUM/response.json
@@ -0,0 +1,21 @@
+{
+  "data": {
+    "__type": {
+      "kind": "ENUM",
+      "name": "TestEnum",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": [
+        { "name": "EnumA", "isDeprecated": false, "deprecationReason": null },
+        {
+          "name": "EnumB",
+          "isDeprecated": true,
+          "deprecationReason": "test deprecation enumValue"
+        },
+        { "name": "EnumC", "isDeprecated": true, "deprecationReason": null }
+      ],
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/query.gql b/test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "TestInputObject") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/response.json b/test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/INPUT_OBJECT/response.json
@@ -0,0 +1,44 @@
+{
+  "data": {
+    "__type": {
+      "kind": "INPUT_OBJECT",
+      "name": "TestInputObject",
+      "fields": null,
+      "inputFields": [
+        {
+          "name": "fieldTestScalar",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "TestScalar",
+              "ofType": null
+            }
+          },
+          "defaultValue": null
+        },
+        {
+          "name": "fieldNestedInputObject",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "NestedInputObject",
+                "ofType": null
+              }
+            }
+          },
+          "defaultValue": null
+        }
+      ],
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/OBJECT/query.gql b/test/Feature/Holistic/holistic/introspection/kinds/OBJECT/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/OBJECT/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Address") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/OBJECT/response.json b/test/Feature/Holistic/holistic/introspection/kinds/OBJECT/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/OBJECT/response.json
@@ -0,0 +1,90 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "Address",
+      "fields": [
+        {
+          "name": "city",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "isDeprecated": true,
+          "deprecationReason": "test deprecation field with reason"
+        },
+        {
+          "name": "street",
+          "args": [
+            {
+              "name": "argInputObject",
+              "type": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "TestInputObject",
+                  "ofType": null
+                }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "argMaybeString",
+              "type": { "kind": "SCALAR", "name": "String", "ofType": null },
+              "defaultValue": null
+            }
+          ],
+          "type": {
+            "kind": "LIST",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "LIST",
+                  "name": null,
+                  "ofType": {
+                    "kind": "NON_NULL",
+                    "name": null,
+                    "ofType": {
+                      "kind": "LIST",
+                      "name": null,
+                      "ofType": {
+                        "kind": "NON_NULL",
+                        "name": null,
+                        "ofType": { "kind": "SCALAR", "name": "String" }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "isDeprecated": true,
+          "deprecationReason": null
+        },
+        {
+          "name": "houseNumber",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/SCALAR/query.gql b/test/Feature/Holistic/holistic/introspection/kinds/SCALAR/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/SCALAR/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "TestScalar") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/SCALAR/response.json b/test/Feature/Holistic/holistic/introspection/kinds/SCALAR/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/SCALAR/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "__type": {
+      "kind": "SCALAR",
+      "name": "TestScalar",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/UNION/query.gql b/test/Feature/Holistic/holistic/introspection/kinds/UNION/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/UNION/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "TestUnion") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/kinds/UNION/response.json b/test/Feature/Holistic/holistic/introspection/kinds/UNION/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/kinds/UNION/response.json
@@ -0,0 +1,24 @@
+{
+  "data": {
+    "__type": {
+      "kind": "UNION",
+      "name": "TestUnion",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": [
+        {
+          "kind": "OBJECT",
+          "name": "User",
+          "ofType": null
+        },
+        {
+          "kind": "OBJECT",
+          "name": "Address",
+          "ofType": null
+        }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__Directive") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Directive/response.json
@@ -0,0 +1,86 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "__Directive",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "description",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "locations",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "ENUM",
+                  "name": "__DirectiveLocation",
+                  "ofType": null
+                }
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "args",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__InputValue",
+                  "ofType": null
+                }
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__DirectiveLocation") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__DirectiveLocation/response.json
@@ -0,0 +1,104 @@
+{
+  "data": {
+    "__type": {
+      "kind": "ENUM",
+      "name": "__DirectiveLocation",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": [
+        {
+          "name": "QUERY",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "MUTATION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "SUBSCRIPTION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "FIELD",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "FRAGMENT_DEFINITION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "FRAGMENT_SPREAD",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "INLINE_FRAGMENT",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "SCHEMA",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "SCALAR",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "OBJECT",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "FIELD_DEFINITION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "ARGUMENT_DEFINITION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "INTERFACE",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "UNION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "ENUM",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "ENUM_VALUE",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "INPUT_OBJECT",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "INPUT_FIELD_DEFINITION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__EnumValue") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__EnumValue/response.json
@@ -0,0 +1,66 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "__EnumValue",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "description",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "isDeprecated",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "deprecationReason",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__Field") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Field/response.json
@@ -0,0 +1,104 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "__Field",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "description",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "args",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__InputValue",
+                  "ofType": null
+                }
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "type",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "isDeprecated",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "deprecationReason",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__InputValue") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__InputValue/response.json
@@ -0,0 +1,66 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "__InputValue",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "description",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "type",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "defaultValue",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__Schema") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Schema/response.json
@@ -0,0 +1,97 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "__Schema",
+      "fields": [
+        {
+          "name": "types",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Type",
+                  "ofType": null
+                }
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "queryType",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "mutationType",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "__Type",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "subscriptionType",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "__Type",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "directives",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Directive",
+                  "ofType": null
+                }
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__Type") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__Type/response.json
@@ -0,0 +1,177 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "__Type",
+      "fields": [
+        {
+          "name": "kind",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "ENUM",
+              "name": "__TypeKind",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "description",
+          "args": [],
+          "type": {
+            "kind": "SCALAR",
+            "name": "String",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "fields",
+          "args": [
+            {
+              "name": "includeDeprecated",
+              "type": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              },
+              "defaultValue": "false"
+            }
+          ],
+          "type": {
+            "kind": "LIST",
+            "name": null,
+            "ofType": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Field",
+                "ofType": null
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "interfaces",
+          "args": [],
+          "type": {
+            "kind": "LIST",
+            "name": null,
+            "ofType": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "possibleTypes",
+          "args": [],
+          "type": {
+            "kind": "LIST",
+            "name": null,
+            "ofType": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "enumValues",
+          "args": [
+            {
+              "name": "includeDeprecated",
+              "type": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              },
+              "defaultValue": "false"
+            }
+          ],
+          "type": {
+            "kind": "LIST",
+            "name": null,
+            "ofType": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__EnumValue",
+                "ofType": null
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "inputFields",
+          "args": [],
+          "type": {
+            "kind": "LIST",
+            "name": null,
+            "ofType": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__InputValue",
+                "ofType": null
+              }
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "ofType",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "__Type",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/query.gql b/test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "__TypeKind") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/response.json b/test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/introspection/schemaTypes/__TypeKind/response.json
@@ -0,0 +1,54 @@
+{
+  "data": {
+    "__type": {
+      "kind": "ENUM",
+      "name": "__TypeKind",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": [
+        {
+          "name": "SCALAR",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "OBJECT",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "INTERFACE",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "UNION",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "ENUM",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "INPUT_OBJECT",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "LIST",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "NON_NULL",
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/query.gql b/test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/query.gql
@@ -0,0 +1,3 @@
+query {
+  testEnum(enum: CollidingEnumEnumB)
+}
diff --git a/test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/response.json b/test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/namespace/enum-fail-on-fullname/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"enum\" got invalid value. Expected type \"CollidingEnum!\" found CollidingEnumEnumB.",
+      "locations": [
+        {
+          "line": 2,
+          "column": 12
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/namespace/enum/query.gql b/test/Feature/Holistic/holistic/namespace/enum/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/namespace/enum/query.gql
@@ -0,0 +1,77 @@
+query {
+  testEnum(enum: EnumB)
+  __type(name: "CollidingEnum") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/namespace/enum/response.json b/test/Feature/Holistic/holistic/namespace/enum/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/namespace/enum/response.json
@@ -0,0 +1,22 @@
+{
+  "data": {
+    "testEnum": ["EnumB", "EnumA"],
+    "__type": {
+      "kind": "ENUM",
+      "name": "CollidingEnum",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": [
+        { "name": "EnumA", "isDeprecated": false, "deprecationReason": null },
+        {
+          "name": "EnumB",
+          "isDeprecated": true,
+          "deprecationReason": "test deprecation enumValue"
+        },
+        { "name": "EnumC", "isDeprecated": true, "deprecationReason": null }
+      ],
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/query.gql b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/query.gql
@@ -0,0 +1,5 @@
+mutation {
+  createUser (userID:"")  {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/response.json b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/mutation/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "createUser": {
+      "name": "testName"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/query.gql b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/query.gql
@@ -0,0 +1,5 @@
+query {
+  user {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/response.json b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/query/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "user": {
+      "name": "testName"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/query.gql b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/query.gql
@@ -0,0 +1,5 @@
+subscription {
+  newUser {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/response.json b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/AnonymousOperation/subscription/response.json
@@ -0,0 +1,3 @@
+{
+  "data": null
+}
diff --git a/test/Feature/Holistic/holistic/parsing/complex/query.gql b/test/Feature/Holistic/holistic/parsing/complex/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/complex/query.gql
@@ -0,0 +1,55 @@
+query GetUsers($v: [[[ID!]]!]) {
+  bla: user {
+    name
+  }
+  user {
+    email2: email
+    name
+    address1: address(coordinates: {longitude: [null,[[], [{uid: "1"}]]] , latitude: "" }) {
+      street
+    }
+    address2: address(coordinates: {longitude: [], latitude: ""}) {
+      street: street
+      street2: street
+    }
+    office(zipCode: $v, cityID: HH) {
+      city
+      houseNumber
+      ... on Address {
+        street
+      }
+      owner {
+        name
+      }
+    }
+    home
+    un1: myUnion {
+      __typename
+      ...UInfo
+      ...AInfo
+      ...City
+    }
+    un2: myUnion {
+      __typename
+      ...UInfo
+      ...AInfo
+      ...City
+    }
+  }
+}
+
+fragment UInfo on User {
+  name
+  myUnion {
+    ...City
+    __typename
+  }
+}
+
+fragment City on Address {
+  city
+}
+
+fragment AInfo on Address {
+  street
+}
diff --git a/test/Feature/Holistic/holistic/parsing/complex/response.json b/test/Feature/Holistic/holistic/parsing/complex/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/complex/response.json
@@ -0,0 +1,12 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"myUnion\" on type \"User\".",
+      "locations": [{ "line": 43, "column": 3 }]
+    },
+    {
+      "message": "Field \"street\" argument \"argInputObject\" is required but not provided.",
+      "locations": [{ "line": 54, "column": 3 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/notOnArgument/query.gql b/test/Feature/Holistic/holistic/parsing/directive/notOnArgument/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/notOnArgument/query.gql
@@ -0,0 +1,3 @@
+query Foo {
+    someField( someArgs: { value: "" } @goo @name(name: {id:1})  )
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/notOnArgument/response.json b/test/Feature/Holistic/holistic/parsing/directive/notOnArgument/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/notOnArgument/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "offset=51:\nunexpected '@'\nexpecting '#', ')', Argument, or IgnoredTokens\n",
+      "locations": [
+        {
+          "line": 2,
+          "column": 40
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/notOnVariable/query.gql b/test/Feature/Holistic/holistic/parsing/directive/notOnVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/notOnVariable/query.gql
@@ -0,0 +1,5 @@
+query Foo ($name: Int @someDir ) {
+    user {
+      name
+    }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/notOnVariable/response.json b/test/Feature/Holistic/holistic/parsing/directive/notOnVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/notOnVariable/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "offset=22:\nunexpected '@'\nexpecting '!', '#', ')', '=', IgnoredTokens, or VariableDefinition\n",
+      "locations": [{ "line": 1, "column": 23 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/operation/query.gql b/test/Feature/Holistic/holistic/parsing/directive/operation/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/operation/query.gql
@@ -0,0 +1,5 @@
+query Foo @someDirective(name: "testName") @test2 {
+  user {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/operation/response.json b/test/Feature/Holistic/holistic/parsing/directive/operation/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/operation/response.json
@@ -0,0 +1,12 @@
+{
+  "errors": [
+    {
+      "message": "Unknown Directive \"someDirective\".",
+      "locations": [{ "line": 1, "column": 11 }]
+    },
+    {
+      "message": "Unknown Directive \"test2\".",
+      "locations": [{ "line": 1, "column": 44 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/selection/query.gql b/test/Feature/Holistic/holistic/parsing/directive/selection/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/selection/query.gql
@@ -0,0 +1,6 @@
+query Foo {
+  user {
+    name @skip(if: false) @deprecated @do(id: 1)
+    email @someDir
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/directive/selection/response.json b/test/Feature/Holistic/holistic/parsing/directive/selection/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/directive/selection/response.json
@@ -0,0 +1,16 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"deprecated\" may not to be used on FIELD",
+      "locations": [{ "line": 3, "column": 27 }]
+    },
+    {
+      "message": "Unknown Directive \"do\".",
+      "locations": [{ "line": 3, "column": 39 }]
+    },
+    {
+      "message": "Unknown Directive \"someDir\".",
+      "locations": [{ "line": 4, "column": 11 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/duplicatedFields/query.gql b/test/Feature/Holistic/holistic/parsing/duplicatedFields/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/duplicatedFields/query.gql
@@ -0,0 +1,2 @@
+{ user { email, email } }
+
diff --git a/test/Feature/Holistic/holistic/parsing/duplicatedFields/response.json b/test/Feature/Holistic/holistic/parsing/duplicatedFields/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/duplicatedFields/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "user": {
+      "email": ""
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/extraCommas/query.gql b/test/Feature/Holistic/holistic/parsing/extraCommas/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/extraCommas/query.gql
@@ -0,0 +1,24 @@
+{
+    user {name,,,email}
+
+    user {name, ,email}
+
+    user {name , email , }
+
+    user {
+        name,
+        email
+    }
+
+    user {
+        name,email
+    }
+
+    user {
+        name, email
+    }
+
+    user {
+        name ,email
+    }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/extraCommas/response.json b/test/Feature/Holistic/holistic/parsing/extraCommas/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/extraCommas/response.json
@@ -0,0 +1,8 @@
+{
+  "data": {
+    "user": {
+      "name": "testName",
+      "email": ""
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/generousSpaces/query.gql b/test/Feature/Holistic/holistic/parsing/generousSpaces/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/generousSpaces/query.gql
@@ -0,0 +1,7 @@
+
+ query e1 ( $v1 : [ [ Int ! ] ] ) {
+
+ q1 {
+    a2 ( a : $v1 , b : 2 )
+ }
+     }
diff --git a/test/Feature/Holistic/holistic/parsing/generousSpaces/response.json b/test/Feature/Holistic/holistic/parsing/generousSpaces/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/generousSpaces/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"q1\" on type \"Query\".",
+      "locations": [
+        {
+          "line": 4,
+          "column": 2
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/inputListValues/query.gql b/test/Feature/Holistic/holistic/parsing/inputListValues/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/inputListValues/query.gql
@@ -0,0 +1,19 @@
+query GetUsers($v1: Int!, $v2: Int!, $v3: Int!) {
+  newlines: user {
+    office(
+      zipCode: [
+        $v1 # Comment to prevent formatting
+        $v2 # Comment to prevent formatting
+        $v3 # Comment to prevent formatting
+      ]
+      cityID: EnumA
+    ) {
+      houseNumber
+    }
+  }
+  commas: user {
+    office(zipCode: [$v1, $v2, $v3], cityID: EnumA) {
+      houseNumber
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/inputListValues/response.json b/test/Feature/Holistic/holistic/parsing/inputListValues/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/inputListValues/response.json
@@ -0,0 +1,14 @@
+{
+  "data": {
+    "newlines": {
+      "office": {
+        "houseNumber": 0
+      }
+    },
+    "commas": {
+      "office": {
+        "houseNumber": 0
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/inputListValues/variables.json b/test/Feature/Holistic/holistic/parsing/inputListValues/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/inputListValues/variables.json
@@ -0,0 +1,5 @@
+{
+  "v1": 1,
+  "v2": 2,
+  "v3": 3
+}
diff --git a/test/Feature/Holistic/holistic/parsing/invalidFields/query.gql b/test/Feature/Holistic/holistic/parsing/invalidFields/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/invalidFields/query.gql
@@ -0,0 +1,1 @@
+{  user { address { street< }}}
diff --git a/test/Feature/Holistic/holistic/parsing/invalidFields/response.json b/test/Feature/Holistic/holistic/parsing/invalidFields/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/invalidFields/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "offset=26:\nunexpected '<'\nexpecting '}', Arguments, Directives, IgnoredTokens, Selection, or SelectionContent\n",
+      "locations": [{ "line": 1, "column": 27 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/query.gql b/test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/query.gql
@@ -0,0 +1,5 @@
+query q1($v1: [[[Int@]@]]@) {
+  q1 {
+    a2(argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/response.json b/test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/invalidNotNullOperator/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "offset=20:\nunexpected '@'\nexpecting '!', ']', or IgnoredTokens\n",
+      "locations": [{ "line": 1, "column": 21 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/missingCloseBrace/query.gql b/test/Feature/Holistic/holistic/parsing/missingCloseBrace/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/missingCloseBrace/query.gql
@@ -0,0 +1,4 @@
+query q1($v1: [[[Int!]!]]!) {
+  q1 {
+    a2(argNestedList: $v1)
+}
diff --git a/test/Feature/Holistic/holistic/parsing/missingCloseBrace/response.json b/test/Feature/Holistic/holistic/parsing/missingCloseBrace/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/missingCloseBrace/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "offset=66:\nunexpected end of input\nexpecting '#', '}', IgnoredTokens, or Selection\n",
+      "locations": [
+        {
+          "line": 5,
+          "column": 1
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/notNullSpacing/query.gql b/test/Feature/Holistic/holistic/parsing/notNullSpacing/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/notNullSpacing/query.gql
@@ -0,0 +1,5 @@
+query q1($v1: [[[Int ! ] ! ]] ! ) {
+  q1 {
+    a2(argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Holistic/holistic/parsing/notNullSpacing/response.json b/test/Feature/Holistic/holistic/parsing/notNullSpacing/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/notNullSpacing/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"q1\" on type \"Query\".",
+      "locations": [
+        {
+          "line": 2,
+          "column": 3
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/notNullSpacing/variables.json b/test/Feature/Holistic/holistic/parsing/notNullSpacing/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/notNullSpacing/variables.json
@@ -0,0 +1,5 @@
+{
+  "v1": [
+    null
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/numbers/query.gql b/test/Feature/Holistic/holistic/parsing/numbers/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/numbers/query.gql
@@ -0,0 +1,7 @@
+{
+  negative1(num: -1)
+  negative2(num: -20232)
+  negative3(num: -5.0)
+  exp1(num: 1.01e4)
+  exp2(num: 6.0221413e23)
+}
diff --git a/test/Feature/Holistic/holistic/parsing/numbers/response.json b/test/Feature/Holistic/holistic/parsing/numbers/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/numbers/response.json
@@ -0,0 +1,24 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"negative1\" on type \"Query\".",
+      "locations": [{ "line": 2, "column": 3 }]
+    },
+    {
+      "message": "Cannot query field \"negative2\" on type \"Query\".",
+      "locations": [{ "line": 3, "column": 3 }]
+    },
+    {
+      "message": "Cannot query field \"negative3\" on type \"Query\".",
+      "locations": [{ "line": 4, "column": 3 }]
+    },
+    {
+      "message": "Cannot query field \"exp1\" on type \"Query\".",
+      "locations": [{ "line": 5, "column": 3 }]
+    },
+    {
+      "message": "Cannot query field \"exp2\" on type \"Query\".",
+      "locations": [{ "line": 6, "column": 3 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/parsing/singleLineComments/query.gql b/test/Feature/Holistic/holistic/parsing/singleLineComments/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/singleLineComments/query.gql
@@ -0,0 +1,57 @@
+# starting Comment''
+# starting Comment''
+query # starting Comment''
+# starting Comment''
+GetUsers( # starting Comment'' # starting Comment''
+  $v: [# starting Comment'' # starting Comment''
+  Int!] # starting Comment'' # starting Comment''
+) {
+  user {
+    # starting Comment''
+    # %&%(//
+    # %&%(//
+    email2: email # starting Comment'' # %&%(// # starting Comment''
+    name # starting Comment''
+    # starting Comment''
+    # starting Comment''
+    # starting Comment''
+
+    address( # starting Comment'' # %&%(//
+      coordinates: {
+        # %&%(//
+        longitude: 0 # starting Comment''
+        latitude: "" # starting Comment'' # starting Comment'' # starting Comment''
+      }
+    ) {
+      # starting Comment''
+      ...City
+    }
+    office(
+      zipCode: $v # starting Comment''
+      cityID: EnumA # starting Comment'' # starting Comment''
+    ) {
+      houseNumber # starting Comment''
+      # starting Comment''
+
+      ... on Address {
+        # starting Comment''
+
+        city # starting Comment''
+        # starting Comment''
+        # starting Comment''
+      }
+    }
+    # starting Comment''
+  }
+  # starting Comment''
+}
+# starting Comment''
+# starting Comment''
+
+fragment City on Address {
+  # starting Comment''
+  # starting Comment''
+  city # starting Comment''
+}
+# starting Comment''
+# starting Comment''
diff --git a/test/Feature/Holistic/holistic/parsing/singleLineComments/response.json b/test/Feature/Holistic/holistic/parsing/singleLineComments/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/parsing/singleLineComments/response.json
@@ -0,0 +1,15 @@
+{
+  "data": {
+    "user": {
+      "email2": "",
+      "name": "testName",
+      "address": {
+        "city": ""
+      },
+      "office": {
+        "houseNumber": 0,
+        "city": ""
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/reservedNames/query.gql b/test/Feature/Holistic/holistic/reservedNames/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/reservedNames/query.gql
@@ -0,0 +1,18 @@
+{
+  type(in: { data: "some data" })
+
+  query: __type(name: "Query") {
+    fields {
+      name
+      args {
+        name
+      }
+    }
+  }
+
+  input: __type(name: "TypeInput") {
+    inputFields {
+      name
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/reservedNames/response.json b/test/Feature/Holistic/holistic/reservedNames/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/reservedNames/response.json
@@ -0,0 +1,17 @@
+{
+  "data": {
+    "type": "some data",
+    "query": {
+      "fields": [
+        { "name": "user", "args": [] },
+        { "name": "testUnion", "args": [] },
+        { "name": "person", "args": [] },
+        { "name": "testEnum", "args": [{ "name": "enum" }] },
+        { "name": "fail1", "args": [] },
+        { "name": "fail2", "args": [] },
+        { "name": "type", "args": [{ "name": "in" }] }
+      ]
+    },
+    "input": { "inputFields": [{ "name": "data" }] }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/AliasResolve/query.gql b/test/Feature/Holistic/holistic/selection/AliasResolve/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/AliasResolve/query.gql
@@ -0,0 +1,6 @@
+{
+  user {
+    name1: name
+    name2 : name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/AliasResolve/response.json b/test/Feature/Holistic/holistic/selection/AliasResolve/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/AliasResolve/response.json
@@ -0,0 +1,8 @@
+{
+  "data": {
+    "user": {
+      "name1": "testName",
+      "name2": "testName"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/AliasUnknownField/query.gql b/test/Feature/Holistic/holistic/selection/AliasUnknownField/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/AliasUnknownField/query.gql
@@ -0,0 +1,5 @@
+{
+  user {
+    myAlias: bla
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/AliasUnknownField/response.json b/test/Feature/Holistic/holistic/selection/AliasUnknownField/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/AliasUnknownField/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"bla\" on type \"User\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 5
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/__typename/query.gql b/test/Feature/Holistic/holistic/selection/__typename/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/__typename/query.gql
@@ -0,0 +1,5 @@
+{
+  user {
+    __typename
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/__typename/response.json b/test/Feature/Holistic/holistic/selection/__typename/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/__typename/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "user": {
+      "__typename": "User"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/query.gql b/test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/query.gql
@@ -0,0 +1,6 @@
+{
+  user {
+    name @include
+    name2: name @skip
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/response.json b/test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/requiredArgument/response.json
@@ -0,0 +1,12 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"include\" argument \"if\" is required but not provided.",
+      "locations": [{ "line": 3, "column": 10 }]
+    },
+    {
+      "message": "Directive \"skip\" argument \"if\" is required but not provided.",
+      "locations": [{ "line": 4, "column": 17 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/resolve/query.gql b/test/Feature/Holistic/holistic/selection/directives/default/resolve/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/resolve/query.gql
@@ -0,0 +1,17 @@
+{
+  user {
+    no_directives: name
+
+    include_false: name @include(if: false)
+    include_true: name @include(if: true)
+
+    skip_false: name @skip(if: false)
+    skip_true: name @skip(if: true)
+
+    skip_true_include_true: name @skip(if: true) @include(if: true)
+    skip_true_include_false: name @skip(if: true) @include(if: false)
+
+    skip_false_include_true: name @skip(if: false) @include(if: true)
+    skip_false_include_false: name @skip(if: false) @include(if: false)
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/resolve/response.json b/test/Feature/Holistic/holistic/selection/directives/default/resolve/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/resolve/response.json
@@ -0,0 +1,10 @@
+{
+  "data": {
+    "user": {
+      "no_directives": "testName",
+      "include_true": "testName",
+      "skip_false": "testName",
+      "skip_false_include_true": "testName"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/query.gql b/test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/query.gql
@@ -0,0 +1,17 @@
+{
+  user {
+    no_directives: name
+
+    include_false: name @include(if: false)
+    include_true: name @include(if: true)
+
+    skip_false: name @skip(if: false)
+    skip_true: name @skip(if: true)
+
+    skip_true_include_true: name @skip(if: true) @include(if: true)
+    skip_true_include_false: name @skip(if: true) @include(if: false)
+
+    skip_false_include_true: name @skip(if: false) @include(if: true)
+    skip_false_include_false: name @skip(if: false) @include(if: false)
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/response.json b/test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/resolve_and_merge/response.json
@@ -0,0 +1,10 @@
+{
+  "data": {
+    "user": {
+      "no_directives": "testName",
+      "include_true": "testName",
+      "skip_false": "testName",
+      "skip_false_include_true": "testName"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/query.gql b/test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/query.gql
@@ -0,0 +1,13 @@
+query TestFragments($x: Boolean! = false, $y: Boolean! = false) {
+  user {
+    name
+    ...UserName @skip(if: $x)
+    ... on User @include(if: $y) {
+      name2: name
+    }
+  }
+}
+
+fragment UserName on User {
+  name1: name
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/response.json b/test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/variablesOnFragment/response.json
@@ -0,0 +1,1 @@
+{ "data": { "user": { "name": "testName", "name1": "testName" } } }
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/withMerge/query.gql b/test/Feature/Holistic/holistic/selection/directives/default/withMerge/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/withMerge/query.gql
@@ -0,0 +1,15 @@
+query bla($x: Boolean! = false, $y: Boolean! = true) {
+  user @skip(if: $x) {
+    case1: name
+  }
+  user @include(if: $x) {
+    case2: name
+  }
+
+  user2: user @skip(if: $y) {
+    case1: name
+  }
+  user2: user @include(if: $y) {
+    case2: name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/withMerge/response.json b/test/Feature/Holistic/holistic/selection/directives/default/withMerge/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/withMerge/response.json
@@ -0,0 +1,10 @@
+{
+  "data": {
+    "user": {
+      "case1": "testName"
+    },
+    "user2": {
+      "case2": "testName"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/withVariable/query.gql b/test/Feature/Holistic/holistic/selection/directives/default/withVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/withVariable/query.gql
@@ -0,0 +1,15 @@
+query bla($x: Boolean! = true, $y: Boolean! = false, $z: Boolean! = true) {
+  user1: user {
+    case1: name @skip(if: $x)
+    case2: name @include(if: $x)
+  }
+
+  user2: user {
+    case1: name @skip(if: $y)
+    case2: name @include(if: $y)
+  }
+
+  user3: user @skip(if: $z) {
+    case1: name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/withVariable/response.json b/test/Feature/Holistic/holistic/selection/directives/default/withVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/withVariable/response.json
@@ -0,0 +1,3 @@
+{
+  "data": { "user1": { "case2": "testName" }, "user2": { "case1": "testName" } }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/query.gql b/test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/query.gql
@@ -0,0 +1,12 @@
+{
+  user {
+    testNull: name @include(if: null)
+    testNoolean: name @include(if: true)
+    testInt: name @include(if: 232)
+    tetsFloat: name @include(if: 232.1324)
+    testString: name @include(if: "some string")
+    testEnum: name @include(if: SomeEnum)
+    testObject: name @include(if: {})
+    testList: name @include(if: [])
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/response.json b/test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/default/wrongArgumentType/response.json
@@ -0,0 +1,32 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found null.",
+      "locations": [{ "line": 3, "column": 29 }]
+    },
+    {
+      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found 232.",
+      "locations": [{ "line": 5, "column": 28 }]
+    },
+    {
+      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found 232.1324.",
+      "locations": [{ "line": 6, "column": 30 }]
+    },
+    {
+      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found \"some string\".",
+      "locations": [{ "line": 7, "column": 31 }]
+    },
+    {
+      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found SomeEnum.",
+      "locations": [{ "line": 8, "column": 29 }]
+    },
+    {
+      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found {}.",
+      "locations": [{ "line": 9, "column": 31 }]
+    },
+    {
+      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found [].",
+      "locations": [{ "line": 10, "column": 29 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/query.gql b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/query.gql
@@ -0,0 +1,15 @@
+query bla($x: Boolean! = false, $y: Boolean! = true) {
+  user @skip(if: $x) {
+    case1: name
+  }
+  user @include(if: $x) @deprecated {
+    case2: name
+  }
+
+  user2: user @skip(if: $y) @deprecated {
+    case1: name
+  }
+  user2: user @include(if: $y) {
+    case2: name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/response.json b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/field/response.json
@@ -0,0 +1,12 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"deprecated\" may not to be used on FIELD",
+      "locations": [{ "line": 5, "column": 25 }]
+    },
+    {
+      "message": "Directive \"deprecated\" may not to be used on FIELD",
+      "locations": [{ "line": 9, "column": 29 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql
@@ -0,0 +1,9 @@
+query {
+  user {
+    ...UserName @deprecated @include(if: false) @skip(if: true)
+  }
+}
+
+fragment UserName on User {
+  name
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"deprecated\" may not to be used on FRAGMENT_SPREAD",
+      "locations": [{ "line": 3, "column": 17 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql
@@ -0,0 +1,7 @@
+query {
+  user {
+    ... on User @deprecated @include(if: false) @skip(if: true) {
+      name
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"deprecated\" may not to be used on INLINE_FRAGMENT",
+      "locations": [{ "line": 3, "column": 17 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/query.gql b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/query.gql
@@ -0,0 +1,5 @@
+mutation SomeMutation @deprecated @skip(if: true) @include(if: true) {
+  createUser(userID: "test_id") {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/response.json b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/mutation/response.json
@@ -0,0 +1,16 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"deprecated\" may not to be used on MUTATION",
+      "locations": [{ "line": 1, "column": 23 }]
+    },
+    {
+      "message": "Directive \"skip\" may not to be used on MUTATION",
+      "locations": [{ "line": 1, "column": 35 }]
+    },
+    {
+      "message": "Directive \"include\" may not to be used on MUTATION",
+      "locations": [{ "line": 1, "column": 51 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/query.gql b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/query.gql
@@ -0,0 +1,5 @@
+query SomeQUery @deprecated @skip(if: true) @include(if: true) {
+  user {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/response.json b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/query/response.json
@@ -0,0 +1,16 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"deprecated\" may not to be used on QUERY",
+      "locations": [{ "line": 1, "column": 17 }]
+    },
+    {
+      "message": "Directive \"skip\" may not to be used on QUERY",
+      "locations": [{ "line": 1, "column": 29 }]
+    },
+    {
+      "message": "Directive \"include\" may not to be used on QUERY",
+      "locations": [{ "line": 1, "column": 45 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/query.gql b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/query.gql
@@ -0,0 +1,5 @@
+subscription SomeSubscription @deprecated @skip(if: true) @include(if: true) {
+  newUser {
+    name
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/response.json b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/directives/validation/invalidPlace/subscription/response.json
@@ -0,0 +1,16 @@
+{
+  "errors": [
+    {
+      "message": "Directive \"deprecated\" may not to be used on SUBSCRIPTION",
+      "locations": [{ "line": 1, "column": 31 }]
+    },
+    {
+      "message": "Directive \"skip\" may not to be used on SUBSCRIPTION",
+      "locations": [{ "line": 1, "column": 43 }]
+    },
+    {
+      "message": "Directive \"include\" may not to be used on SUBSCRIPTION",
+      "locations": [{ "line": 1, "column": 59 }]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/hasNoSubFields/query.gql b/test/Feature/Holistic/holistic/selection/hasNoSubFields/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/hasNoSubFields/query.gql
@@ -0,0 +1,7 @@
+{
+  user {
+    name {
+      id
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/hasNoSubFields/response.json b/test/Feature/Holistic/holistic/selection/hasNoSubFields/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/hasNoSubFields/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Field \"name\" must not have a selection since type \"String\" has no subfields.",
+      "locations": [
+        {
+          "line": 3,
+          "column": 5
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeConflict/alias/query.gql b/test/Feature/Holistic/holistic/selection/mergeConflict/alias/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeConflict/alias/query.gql
@@ -0,0 +1,17 @@
+{
+  user {
+    bla: email
+    email
+    bla: email
+    address(coordinates: { latitude: "", longitude: 1 }) {
+      city
+      bla: city
+    }
+  }
+  user {
+    address(coordinates: { latitude: "", longitude: 1 }) {
+      bla: houseNumber
+    }
+    bla: email
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeConflict/alias/response.json b/test/Feature/Holistic/holistic/selection/mergeConflict/alias/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeConflict/alias/response.json
@@ -0,0 +1,25 @@
+{
+  "errors": [
+    {
+      "message": "Fields \"user\" conflict because subfields \"address\" conflict because \"city\" and \"houseNumber\" are different fields. Use different aliases on the fields to fetch both if this was intentional.",
+      "locations": [
+        {
+          "line": 2,
+          "column": 3
+        },
+        {
+          "line": 6,
+          "column": 5
+        },
+        {
+          "line": 8,
+          "column": 7
+        },
+        {
+          "line": 13,
+          "column": 7
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeConflict/arguments/query.gql b/test/Feature/Holistic/holistic/selection/mergeConflict/arguments/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeConflict/arguments/query.gql
@@ -0,0 +1,19 @@
+{
+  user {
+    bla: email
+    email
+    bla: email
+    address(coordinates: {latitude:"", longitude: 3}) {
+      city
+			houseNumber
+    }
+  }
+  user {
+    address(coordinates: {latitude:"", longitude: 2}) {
+      city
+      bla: houseNumber
+    }
+    name
+    bla: email
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeConflict/arguments/response.json b/test/Feature/Holistic/holistic/selection/mergeConflict/arguments/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeConflict/arguments/response.json
@@ -0,0 +1,25 @@
+{
+  "errors": [
+    {
+      "message": "Fields \"user\" conflict because subfields \"address\" conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.",
+      "locations": [
+        {
+          "line": 2,
+          "column": 3
+        },
+        {
+          "line": 6,
+          "column": 5
+        },
+        {
+          "line": 6,
+          "column": 5
+        },
+        {
+          "line": 12,
+          "column": 5
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeConflict/union/query.gql b/test/Feature/Holistic/holistic/selection/mergeConflict/union/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeConflict/union/query.gql
@@ -0,0 +1,20 @@
+{
+  testUnion {
+    ... on User {
+      name
+      email
+      address(coordinates: { latitude: "", longitude: 1 }) {
+        city: houseNumber
+      }
+    }
+  }
+  
+  testUnion {
+    ... on User {
+      name: email
+      address(coordinates: { latitude: "", longitude: 1 }) {
+        city
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeConflict/union/response.json b/test/Feature/Holistic/holistic/selection/mergeConflict/union/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeConflict/union/response.json
@@ -0,0 +1,21 @@
+{
+  "errors": [
+    {
+      "message": "Fields \"testUnion\" conflict because \"name\" and \"email\" are different fields. Use different aliases on the fields to fetch both if this was intentional.",
+      "locations": [
+        { "line": 2, "column": 3 },
+        { "line": 4, "column": 7 },
+        { "line": 14, "column": 7 }
+      ]
+    },
+    {
+      "message": "Fields \"testUnion\" conflict because subfields \"address\" conflict because \"houseNumber\" and \"city\" are different fields. Use different aliases on the fields to fetch both if this was intentional.",
+      "locations": [
+        { "line": 2, "column": 3 },
+        { "line": 6, "column": 7 },
+        { "line": 7, "column": 9 },
+        { "line": 16, "column": 9 }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeSelection/query.gql b/test/Feature/Holistic/holistic/selection/mergeSelection/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeSelection/query.gql
@@ -0,0 +1,32 @@
+{
+  user {
+    name
+    name
+    name
+    name2 : name
+    name2 : name
+    name2 : name
+    name: name
+  }
+  user { 
+    name
+    name2 : name
+  }
+  user {
+    bla: email
+    email
+    bla: email
+    address(coordinates: {latitude:"", longitude: 2}) {
+      city
+			houseNumber
+    }
+  }
+  user {
+    address(coordinates: {latitude:"", longitude: 2}) {
+      city
+      bla: houseNumber
+    }
+    name
+    bla: email
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeSelection/response.json b/test/Feature/Holistic/holistic/selection/mergeSelection/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeSelection/response.json
@@ -0,0 +1,15 @@
+{
+  "data": {
+    "user": {
+      "name": "testName",
+      "name2": "testName",
+      "bla": "",
+      "email": "",
+      "address": {
+        "city": "",
+        "houseNumber": 0,
+        "bla": 0
+      }
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/mergeUnionSelection/query.gql b/test/Feature/Holistic/holistic/selection/mergeUnionSelection/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeUnionSelection/query.gql
@@ -0,0 +1,19 @@
+{
+  testUnion {
+    ... on User {
+      name
+      email
+    }
+  }
+  
+  testUnion {
+    ... on User {
+      name
+      email2: email
+      address(coordinates: { latitude: "", longitude: 1 }) {
+        city
+      }
+    }
+  }
+}
+
diff --git a/test/Feature/Holistic/holistic/selection/mergeUnionSelection/response.json b/test/Feature/Holistic/holistic/selection/mergeUnionSelection/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mergeUnionSelection/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "testUnion": {
+      "name": "testName",
+      "email": "",
+      "email2": "",
+      "address": {
+        "city": ""
+      },
+      "__typename": "User"
+    }
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/mustHaveSubFields/query.gql b/test/Feature/Holistic/holistic/selection/mustHaveSubFields/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mustHaveSubFields/query.gql
@@ -0,0 +1,3 @@
+{
+  user
+}
diff --git a/test/Feature/Holistic/holistic/selection/mustHaveSubFields/response.json b/test/Feature/Holistic/holistic/selection/mustHaveSubFields/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/mustHaveSubFields/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Field \"user\" of type \"User\" must have a selection of subfields",
+      "locations": [
+        {
+          "line": 2,
+          "column": 3
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/query.gql b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/query.gql
@@ -0,0 +1,8 @@
+subscription SomeTestSubscription {
+  newUser {
+    name
+  }
+  newAddress {
+    houseNumber
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/response.json b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/fail/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Subscription \"SomeTestSubscription\" must select only one top level field.",
+      "locations": [
+        {
+          "line": 5,
+          "column": 3
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql
@@ -0,0 +1,11 @@
+subscription {
+  newUser {
+    name
+  }
+  newAddress {
+    houseNumber
+  }
+  address2: newAddress {
+    houseNumber
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "Anonymous Subscription must select only one top level field.",
+      "locations": [
+        {
+          "line": 5,
+          "column": 3
+        }
+      ]
+    },
+    {
+      "message": "Anonymous Subscription must select only one top level field.",
+      "locations": [
+        {
+          "line": 8,
+          "column": 3
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/holistic/selection/unknownField/query.gql b/test/Feature/Holistic/holistic/selection/unknownField/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/unknownField/query.gql
@@ -0,0 +1,5 @@
+{
+  user {
+    bla
+  }
+}
diff --git a/test/Feature/Holistic/holistic/selection/unknownField/response.json b/test/Feature/Holistic/holistic/selection/unknownField/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Holistic/holistic/selection/unknownField/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"bla\" on type \"User\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 5
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/Boolean/query.gql b/test/Feature/Holistic/introspection/defaultTypes/Boolean/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/Boolean/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Boolean") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/Boolean/response.json b/test/Feature/Holistic/introspection/defaultTypes/Boolean/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/Boolean/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "SCALAR",
-      "name": "Boolean",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/Float/query.gql b/test/Feature/Holistic/introspection/defaultTypes/Float/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/Float/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Float") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/Float/response.json b/test/Feature/Holistic/introspection/defaultTypes/Float/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/Float/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "SCALAR",
-      "name": "Float",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/ID/query.gql b/test/Feature/Holistic/introspection/defaultTypes/ID/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/ID/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "ID") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/ID/response.json b/test/Feature/Holistic/introspection/defaultTypes/ID/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/ID/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "SCALAR",
-      "name": "ID",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/Int/query.gql b/test/Feature/Holistic/introspection/defaultTypes/Int/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/Int/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Int") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/Int/response.json b/test/Feature/Holistic/introspection/defaultTypes/Int/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/Int/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "SCALAR",
-      "name": "Int",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/String/query.gql b/test/Feature/Holistic/introspection/defaultTypes/String/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/String/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "String") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/defaultTypes/String/response.json b/test/Feature/Holistic/introspection/defaultTypes/String/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/defaultTypes/String/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "SCALAR",
-      "name": "String",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/deprecated/enumValue/query.gql b/test/Feature/Holistic/introspection/deprecated/enumValue/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/deprecated/enumValue/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  __type(name: "TestEnum") {
-    enumValues {
-      name
-      isDeprecated
-      deprecationReason
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/deprecated/enumValue/response.json b/test/Feature/Holistic/introspection/deprecated/enumValue/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/deprecated/enumValue/response.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "enumValues": [
-        { "name": "EnumA", "isDeprecated": false, "deprecationReason": null },
-        {
-          "name": "EnumB",
-          "isDeprecated": true,
-          "deprecationReason": "test deprecation enumValue"
-        },
-        { "name": "EnumC", "isDeprecated": true, "deprecationReason": null }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/deprecated/field/query.gql b/test/Feature/Holistic/introspection/deprecated/field/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/deprecated/field/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  __type(name: "Address") {
-    fields {
-      name
-      isDeprecated
-      deprecationReason
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/deprecated/field/response.json b/test/Feature/Holistic/introspection/deprecated/field/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/deprecated/field/response.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "fields": [
-        {
-          "name": "city",
-          "isDeprecated": true,
-          "deprecationReason": "test deprecation field with reason"
-        },
-        { "name": "street", "isDeprecated": true, "deprecationReason": null },
-        {
-          "name": "houseNumber",
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/enum/query.gql b/test/Feature/Holistic/introspection/description/enum/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/enum/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  __type(name: "TestEnum") {
-    description
-    enumValues {
-      name
-      description
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/enum/response.json b/test/Feature/Holistic/introspection/description/enum/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/enum/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "description": "type Description: TestEnum\n\nsome random enums for test",
-      "enumValues": [
-        { "name": "EnumA", "description": "enumValue Description: EnumA" },
-        { "name": "EnumB", "description": null },
-        { "name": "EnumC", "description": "enumValue Description: EnumC" }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/inputObject/query.gql b/test/Feature/Holistic/introspection/description/inputObject/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/inputObject/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  __type(name: "Coordinates") {
-    description
-    inputFields {
-      name
-      description
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/inputObject/response.json b/test/Feature/Holistic/introspection/description/inputObject/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/inputObject/response.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "description": "type Description: Coordinates\n\nsome random text",
-      "inputFields": [
-        {
-          "name": "latitude",
-          "description": "inputValue Description: latitude"
-        },
-        {
-          "name": "longitude",
-          "description": "inputValue Description: longitude\n  some random inputValue details"
-        }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/object/query.gql b/test/Feature/Holistic/introspection/description/object/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/object/query.gql
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  __type(name: "Address") {
-    description
-    fields {
-      name
-      description
-      args {
-        name
-        description
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/object/response.json b/test/Feature/Holistic/introspection/description/object/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/object/response.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "description": "type Description:\n\n  Address",
-      "fields": [
-        {
-          "name": "city",
-          "description": "field Description: city",
-          "args": []
-        },
-        {
-          "name": "street",
-          "description": null,
-          "args": [
-            {
-              "name": "argInputObject",
-              "description": "argument Description: inputObject"
-            },
-            { "name": "argMaybeString", "description": null }
-          ]
-        },
-        { "name": "houseNumber", "description": null, "args": [] }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/union/query.gql b/test/Feature/Holistic/introspection/description/union/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/union/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  __type(name: "TestUnion") {
-    description
-  }
-}
diff --git a/test/Feature/Holistic/introspection/description/union/response.json b/test/Feature/Holistic/introspection/description/union/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/description/union/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "description": "type Description: TestUnion\n\nsome random text for union type"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/directives/default/query.gql b/test/Feature/Holistic/introspection/directives/default/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/directives/default/query.gql
+++ /dev/null
@@ -1,54 +0,0 @@
-# introspect directives
-query Get__Type {
-  __schema {
-    directives {
-      name
-      description
-      locations
-      args {
-        ...InputValue
-      }
-    }
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/directives/default/response.json b/test/Feature/Holistic/introspection/directives/default/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/directives/default/response.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "data": {
-    "__schema": {
-      "directives": [
-        {
-          "name": "skip",
-          "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
-          "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
-          "args": [
-            {
-              "name": "if",
-              "type": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "SCALAR",
-                  "name": "Boolean",
-                  "ofType": null
-                }
-              },
-              "defaultValue": null
-            }
-          ]
-        },
-        {
-          "name": "include",
-          "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
-          "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
-          "args": [
-            {
-              "name": "if",
-              "type": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "SCALAR",
-                  "name": "Boolean",
-                  "ofType": null
-                }
-              },
-              "defaultValue": null
-            }
-          ]
-        },
-        {
-          "name": "deprecated",
-          "description": "Marks an element of a GraphQL schema as no longer supported.",
-          "locations": ["FIELD_DEFINITION", "ENUM_VALUE"],
-          "args": [
-            {
-              "name": "reason",
-              "type": { "kind": "SCALAR", "name": "String", "ofType": null },
-              "defaultValue": null
-            }
-          ]
-        }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/interface/query.gql b/test/Feature/Holistic/introspection/interface/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/interface/query.gql
+++ /dev/null
@@ -1,82 +0,0 @@
-query Get__Type {
-  person {
-    name
-  }
-  interface: __type(name: "Person") {
-    ...FullType
-  }
-  user: __type(name: "User") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/interface/response.json b/test/Feature/Holistic/introspection/interface/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/interface/response.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
-  "data": {
-    "person": { "name": "test Person Name" },
-    "interface": {
-      "kind": "INTERFACE",
-      "name": "Person",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": { "kind": "SCALAR", "name": "String", "ofType": null },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": [{ "kind": "OBJECT", "name": "User", "ofType": null }]
-    },
-    "user": {
-      "kind": "OBJECT",
-      "name": "User",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "email",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "address",
-          "args": [
-            {
-              "name": "coordinates",
-              "type": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "INPUT_OBJECT",
-                  "name": "Coordinates",
-                  "ofType": null
-                }
-              },
-              "defaultValue": null
-            },
-            {
-              "name": "comment",
-              "type": { "kind": "SCALAR", "name": "String", "ofType": null },
-              "defaultValue": null
-            }
-          ],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "OBJECT", "name": "Address", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "office",
-          "args": [
-            {
-              "name": "zipCode",
-              "type": {
-                "kind": "LIST",
-                "name": null,
-                "ofType": {
-                  "kind": "NON_NULL",
-                  "name": null,
-                  "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
-                }
-              },
-              "defaultValue": null
-            },
-            {
-              "name": "cityID",
-              "type": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": { "kind": "ENUM", "name": "TestEnum", "ofType": null }
-              },
-              "defaultValue": null
-            }
-          ],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "OBJECT", "name": "Address", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "friend",
-          "args": [],
-          "type": { "kind": "OBJECT", "name": "User", "ofType": null },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [{ "kind": "INTERFACE", "name": "Person", "ofType": null }],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/ENUM/query.gql b/test/Feature/Holistic/introspection/kinds/ENUM/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/ENUM/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "TestEnum") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/ENUM/response.json b/test/Feature/Holistic/introspection/kinds/ENUM/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/ENUM/response.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "ENUM",
-      "name": "TestEnum",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": [
-        { "name": "EnumA", "isDeprecated": false, "deprecationReason": null },
-        {
-          "name": "EnumB",
-          "isDeprecated": true,
-          "deprecationReason": "test deprecation enumValue"
-        },
-        { "name": "EnumC", "isDeprecated": true, "deprecationReason": null }
-      ],
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/query.gql b/test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "TestInputObject") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/response.json b/test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/INPUT_OBJECT/response.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "INPUT_OBJECT",
-      "name": "TestInputObject",
-      "fields": null,
-      "inputFields": [
-        {
-          "name": "fieldTestScalar",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "TestScalar",
-              "ofType": null
-            }
-          },
-          "defaultValue": null
-        },
-        {
-          "name": "fieldNestedInputObject",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "INPUT_OBJECT",
-                "name": "NestedInputObject",
-                "ofType": null
-              }
-            }
-          },
-          "defaultValue": null
-        }
-      ],
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/OBJECT/query.gql b/test/Feature/Holistic/introspection/kinds/OBJECT/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/OBJECT/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Address") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/OBJECT/response.json b/test/Feature/Holistic/introspection/kinds/OBJECT/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/OBJECT/response.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "Address",
-      "fields": [
-        {
-          "name": "city",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "isDeprecated": true,
-          "deprecationReason": "test deprecation field with reason"
-        },
-        {
-          "name": "street",
-          "args": [
-            {
-              "name": "argInputObject",
-              "type": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "INPUT_OBJECT",
-                  "name": "TestInputObject",
-                  "ofType": null
-                }
-              },
-              "defaultValue": null
-            },
-            {
-              "name": "argMaybeString",
-              "type": { "kind": "SCALAR", "name": "String", "ofType": null },
-              "defaultValue": null
-            }
-          ],
-          "type": {
-            "kind": "LIST",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "LIST",
-                  "name": null,
-                  "ofType": {
-                    "kind": "NON_NULL",
-                    "name": null,
-                    "ofType": {
-                      "kind": "LIST",
-                      "name": null,
-                      "ofType": {
-                        "kind": "NON_NULL",
-                        "name": null,
-                        "ofType": { "kind": "SCALAR", "name": "String" }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          },
-          "isDeprecated": true,
-          "deprecationReason": null
-        },
-        {
-          "name": "houseNumber",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/SCALAR/query.gql b/test/Feature/Holistic/introspection/kinds/SCALAR/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/SCALAR/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "TestScalar") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/SCALAR/response.json b/test/Feature/Holistic/introspection/kinds/SCALAR/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/SCALAR/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "SCALAR",
-      "name": "TestScalar",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/UNION/query.gql b/test/Feature/Holistic/introspection/kinds/UNION/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/UNION/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "TestUnion") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/kinds/UNION/response.json b/test/Feature/Holistic/introspection/kinds/UNION/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/kinds/UNION/response.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "UNION",
-      "name": "TestUnion",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": [
-        {
-          "kind": "OBJECT",
-          "name": "User",
-          "ofType": null
-        },
-        {
-          "kind": "OBJECT",
-          "name": "Address",
-          "ofType": null
-        }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Directive/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__Directive/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Directive/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__Directive") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Directive/response.json b/test/Feature/Holistic/introspection/schemaTypes/__Directive/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Directive/response.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "__Directive",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "description",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "locations",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "ENUM",
-                  "name": "__DirectiveLocation",
-                  "ofType": null
-                }
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "args",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "OBJECT",
-                  "name": "__InputValue",
-                  "ofType": null
-                }
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__DirectiveLocation") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/response.json b/test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__DirectiveLocation/response.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "ENUM",
-      "name": "__DirectiveLocation",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": [
-        {
-          "name": "QUERY",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "MUTATION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "SUBSCRIPTION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "FIELD",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "FRAGMENT_DEFINITION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "FRAGMENT_SPREAD",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "INLINE_FRAGMENT",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "SCHEMA",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "SCALAR",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "OBJECT",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "FIELD_DEFINITION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "ARGUMENT_DEFINITION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "INTERFACE",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "UNION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "ENUM",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "ENUM_VALUE",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "INPUT_OBJECT",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "INPUT_FIELD_DEFINITION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__EnumValue/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__EnumValue/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__EnumValue/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__EnumValue") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__EnumValue/response.json b/test/Feature/Holistic/introspection/schemaTypes/__EnumValue/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__EnumValue/response.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "__EnumValue",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "description",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "isDeprecated",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "Boolean",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "deprecationReason",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Field/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__Field/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Field/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__Field") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Field/response.json b/test/Feature/Holistic/introspection/schemaTypes/__Field/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Field/response.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "__Field",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "description",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "args",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "OBJECT",
-                  "name": "__InputValue",
-                  "ofType": null
-                }
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "type",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "OBJECT",
-              "name": "__Type",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "isDeprecated",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "Boolean",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "deprecationReason",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__InputValue/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__InputValue/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__InputValue/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__InputValue") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__InputValue/response.json b/test/Feature/Holistic/introspection/schemaTypes/__InputValue/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__InputValue/response.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "__InputValue",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "description",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "type",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "OBJECT",
-              "name": "__Type",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "defaultValue",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Schema/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__Schema/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Schema/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__Schema") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Schema/response.json b/test/Feature/Holistic/introspection/schemaTypes/__Schema/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Schema/response.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "__Schema",
-      "fields": [
-        {
-          "name": "types",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "OBJECT",
-                  "name": "__Type",
-                  "ofType": null
-                }
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "queryType",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "OBJECT",
-              "name": "__Type",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "mutationType",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "__Type",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "subscriptionType",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "__Type",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "directives",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "OBJECT",
-                  "name": "__Directive",
-                  "ofType": null
-                }
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Type/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__Type/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Type/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__Type") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__Type/response.json b/test/Feature/Holistic/introspection/schemaTypes/__Type/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__Type/response.json
+++ /dev/null
@@ -1,177 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "__Type",
-      "fields": [
-        {
-          "name": "kind",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "ENUM",
-              "name": "__TypeKind",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "description",
-          "args": [],
-          "type": {
-            "kind": "SCALAR",
-            "name": "String",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "fields",
-          "args": [
-            {
-              "name": "includeDeprecated",
-              "type": {
-                "kind": "SCALAR",
-                "name": "Boolean",
-                "ofType": null
-              },
-              "defaultValue": "false"
-            }
-          ],
-          "type": {
-            "kind": "LIST",
-            "name": null,
-            "ofType": {
-              "kind": "NON_NULL",
-              "name": null,
-              "ofType": {
-                "kind": "OBJECT",
-                "name": "__Field",
-                "ofType": null
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "interfaces",
-          "args": [],
-          "type": {
-            "kind": "LIST",
-            "name": null,
-            "ofType": {
-              "kind": "NON_NULL",
-              "name": null,
-              "ofType": {
-                "kind": "OBJECT",
-                "name": "__Type",
-                "ofType": null
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "possibleTypes",
-          "args": [],
-          "type": {
-            "kind": "LIST",
-            "name": null,
-            "ofType": {
-              "kind": "NON_NULL",
-              "name": null,
-              "ofType": {
-                "kind": "OBJECT",
-                "name": "__Type",
-                "ofType": null
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "enumValues",
-          "args": [
-            {
-              "name": "includeDeprecated",
-              "type": {
-                "kind": "SCALAR",
-                "name": "Boolean",
-                "ofType": null
-              },
-              "defaultValue": "false"
-            }
-          ],
-          "type": {
-            "kind": "LIST",
-            "name": null,
-            "ofType": {
-              "kind": "NON_NULL",
-              "name": null,
-              "ofType": {
-                "kind": "OBJECT",
-                "name": "__EnumValue",
-                "ofType": null
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "inputFields",
-          "args": [],
-          "type": {
-            "kind": "LIST",
-            "name": null,
-            "ofType": {
-              "kind": "NON_NULL",
-              "name": null,
-              "ofType": {
-                "kind": "OBJECT",
-                "name": "__InputValue",
-                "ofType": null
-              }
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "ofType",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "__Type",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__TypeKind/query.gql b/test/Feature/Holistic/introspection/schemaTypes/__TypeKind/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__TypeKind/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "__TypeKind") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/introspection/schemaTypes/__TypeKind/response.json b/test/Feature/Holistic/introspection/schemaTypes/__TypeKind/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/introspection/schemaTypes/__TypeKind/response.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "ENUM",
-      "name": "__TypeKind",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": [
-        {
-          "name": "SCALAR",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "OBJECT",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "INTERFACE",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "UNION",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "ENUM",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "INPUT_OBJECT",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "LIST",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "NON_NULL",
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/namespace/enum-fail-on-fullname/query.gql b/test/Feature/Holistic/namespace/enum-fail-on-fullname/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/namespace/enum-fail-on-fullname/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query {
-  testEnum(enum: CollidingEnumEnumB)
-}
diff --git a/test/Feature/Holistic/namespace/enum-fail-on-fullname/response.json b/test/Feature/Holistic/namespace/enum-fail-on-fullname/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/namespace/enum-fail-on-fullname/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"enum\" got invalid value. Expected type \"CollidingEnum!\" found CollidingEnumEnumB.",
-      "locations": [
-        {
-          "line": 2,
-          "column": 12
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/namespace/enum/query.gql b/test/Feature/Holistic/namespace/enum/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/namespace/enum/query.gql
+++ /dev/null
@@ -1,77 +0,0 @@
-query {
-  testEnum(enum: EnumB)
-  __type(name: "CollidingEnum") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/namespace/enum/response.json b/test/Feature/Holistic/namespace/enum/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/namespace/enum/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "data": {
-    "testEnum": ["EnumB", "EnumA"],
-    "__type": {
-      "kind": "ENUM",
-      "name": "CollidingEnum",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": [
-        { "name": "EnumA", "isDeprecated": false, "deprecationReason": null },
-        {
-          "name": "EnumB",
-          "isDeprecated": true,
-          "deprecationReason": "test deprecation enumValue"
-        },
-        { "name": "EnumC", "isDeprecated": true, "deprecationReason": null }
-      ],
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Holistic/parsing/AnonymousOperation/mutation/query.gql b/test/Feature/Holistic/parsing/AnonymousOperation/mutation/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/AnonymousOperation/mutation/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-mutation {
-  createUser (userID:"")  {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/parsing/AnonymousOperation/mutation/response.json b/test/Feature/Holistic/parsing/AnonymousOperation/mutation/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/AnonymousOperation/mutation/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "createUser": {
-      "name": "testName"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/parsing/AnonymousOperation/query/query.gql b/test/Feature/Holistic/parsing/AnonymousOperation/query/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/AnonymousOperation/query/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query {
-  user {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/parsing/AnonymousOperation/query/response.json b/test/Feature/Holistic/parsing/AnonymousOperation/query/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/AnonymousOperation/query/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "user": {
-      "name": "testName"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/parsing/AnonymousOperation/subscription/query.gql b/test/Feature/Holistic/parsing/AnonymousOperation/subscription/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/AnonymousOperation/subscription/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-subscription {
-  newUser {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/parsing/AnonymousOperation/subscription/response.json b/test/Feature/Holistic/parsing/AnonymousOperation/subscription/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/AnonymousOperation/subscription/response.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "data": null
-}
diff --git a/test/Feature/Holistic/parsing/complex/query.gql b/test/Feature/Holistic/parsing/complex/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/complex/query.gql
+++ /dev/null
@@ -1,55 +0,0 @@
-query GetUsers($v: [[[ID!]]!]) {
-  bla: user {
-    name
-  }
-  user {
-    email2: email
-    name
-    address1: address(coordinates: {longitude: [null,[[], [{uid: "1"}]]] , latitude: "" }) {
-      street
-    }
-    address2: address(coordinates: {longitude: [], latitude: ""}) {
-      street: street
-      street2: street
-    }
-    office(zipCode: $v, cityID: HH) {
-      city
-      houseNumber
-      ... on Address {
-        street
-      }
-      owner {
-        name
-      }
-    }
-    home
-    un1: myUnion {
-      __typename
-      ...UInfo
-      ...AInfo
-      ...City
-    }
-    un2: myUnion {
-      __typename
-      ...UInfo
-      ...AInfo
-      ...City
-    }
-  }
-}
-
-fragment UInfo on User {
-  name
-  myUnion {
-    ...City
-    __typename
-  }
-}
-
-fragment City on Address {
-  city
-}
-
-fragment AInfo on Address {
-  street
-}
diff --git a/test/Feature/Holistic/parsing/complex/response.json b/test/Feature/Holistic/parsing/complex/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/complex/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Cannot query field \"myUnion\" on type \"User\".",
-      "locations": [{ "line": 43, "column": 3 }]
-    },
-    {
-      "message": "Field \"street\" argument \"argInputObject\" is required but not provided.",
-      "locations": [{ "line": 54, "column": 3 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/directive/notOnArgument/query.gql b/test/Feature/Holistic/parsing/directive/notOnArgument/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/notOnArgument/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query Foo {
-    someField( someArgs: { value: "" } @goo @name(name: {id:1})  )
-}
diff --git a/test/Feature/Holistic/parsing/directive/notOnArgument/response.json b/test/Feature/Holistic/parsing/directive/notOnArgument/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/notOnArgument/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "offset=51:\nunexpected '@'\nexpecting ')', Argument, Ignored, IgnoredTokens, or white space\n",
-      "locations": [
-        {
-          "line": 2,
-          "column": 40
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/directive/notOnVariable/query.gql b/test/Feature/Holistic/parsing/directive/notOnVariable/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/notOnVariable/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query Foo ($name: Int @someDir ) {
-    user {
-      name
-    }
-}
diff --git a/test/Feature/Holistic/parsing/directive/notOnVariable/response.json b/test/Feature/Holistic/parsing/directive/notOnVariable/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/notOnVariable/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "offset=22:\nunexpected '@'\nexpecting !, ')', =, Ignored, IgnoredTokens, VariableDefinition, or white space\n",
-      "locations": [{ "line": 1, "column": 23 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/directive/operation/query.gql b/test/Feature/Holistic/parsing/directive/operation/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/operation/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query Foo @someDirective(name: "testName") @test2 {
-  user {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/parsing/directive/operation/response.json b/test/Feature/Holistic/parsing/directive/operation/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/operation/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Unknown Directive \"someDirective\".",
-      "locations": [{ "line": 1, "column": 11 }]
-    },
-    {
-      "message": "Unknown Directive \"test2\".",
-      "locations": [{ "line": 1, "column": 44 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/directive/selection/query.gql b/test/Feature/Holistic/parsing/directive/selection/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/selection/query.gql
+++ /dev/null
@@ -1,6 +0,0 @@
-query Foo {
-  user {
-    name @skip(if: false) @deprecated @do(id: 1)
-    email @someDir
-  }
-}
diff --git a/test/Feature/Holistic/parsing/directive/selection/response.json b/test/Feature/Holistic/parsing/directive/selection/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/directive/selection/response.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"deprecated\" may not to be used on FIELD",
-      "locations": [{ "line": 3, "column": 27 }]
-    },
-    {
-      "message": "Unknown Directive \"do\".",
-      "locations": [{ "line": 3, "column": 39 }]
-    },
-    {
-      "message": "Unknown Directive \"someDir\".",
-      "locations": [{ "line": 4, "column": 11 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/duplicatedFields/query.gql b/test/Feature/Holistic/parsing/duplicatedFields/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/duplicatedFields/query.gql
+++ /dev/null
@@ -1,2 +0,0 @@
-{ user { email, email } }
-
diff --git a/test/Feature/Holistic/parsing/duplicatedFields/response.json b/test/Feature/Holistic/parsing/duplicatedFields/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/duplicatedFields/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "user": {
-      "email": ""
-    }
-  }
-}
diff --git a/test/Feature/Holistic/parsing/extraCommas/query.gql b/test/Feature/Holistic/parsing/extraCommas/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/extraCommas/query.gql
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    user {name,,,email}
-
-    user {name, ,email}
-
-    user {name , email , }
-
-    user {
-        name,
-        email
-    }
-
-    user {
-        name,email
-    }
-
-    user {
-        name, email
-    }
-
-    user {
-        name ,email
-    }
-}
diff --git a/test/Feature/Holistic/parsing/extraCommas/response.json b/test/Feature/Holistic/parsing/extraCommas/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/extraCommas/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "data": {
-    "user": {
-      "name": "testName",
-      "email": ""
-    }
-  }
-}
diff --git a/test/Feature/Holistic/parsing/generousSpaces/query.gql b/test/Feature/Holistic/parsing/generousSpaces/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/generousSpaces/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-
- query e1 ( $v1 : [ [ Int ! ] ] ) {
-
- q1 {
-    a2 ( a : $v1 , b : 2 )
- }
-     }
diff --git a/test/Feature/Holistic/parsing/generousSpaces/response.json b/test/Feature/Holistic/parsing/generousSpaces/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/generousSpaces/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Cannot query field \"q1\" on type \"Query\".",
-      "locations": [
-        {
-          "line": 4,
-          "column": 2
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/inputListValues/query.gql b/test/Feature/Holistic/parsing/inputListValues/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/inputListValues/query.gql
+++ /dev/null
@@ -1,19 +0,0 @@
-query GetUsers($v1: Int!, $v2: Int!, $v3: Int!) {
-  newlines: user {
-    office(
-      zipCode: [
-        $v1 # Comment to prevent formatting
-        $v2 # Comment to prevent formatting
-        $v3 # Comment to prevent formatting
-      ]
-      cityID: EnumA
-    ) {
-      houseNumber
-    }
-  }
-  commas: user {
-    office(zipCode: [$v1, $v2, $v3], cityID: EnumA) {
-      houseNumber
-    }
-  }
-}
diff --git a/test/Feature/Holistic/parsing/inputListValues/response.json b/test/Feature/Holistic/parsing/inputListValues/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/inputListValues/response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "data": {
-    "newlines": {
-      "office": {
-        "houseNumber": 0
-      }
-    },
-    "commas": {
-      "office": {
-        "houseNumber": 0
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/parsing/inputListValues/variables.json b/test/Feature/Holistic/parsing/inputListValues/variables.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/inputListValues/variables.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "v1": 1,
-  "v2": 2,
-  "v3": 3
-}
diff --git a/test/Feature/Holistic/parsing/invalidFields/query.gql b/test/Feature/Holistic/parsing/invalidFields/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/invalidFields/query.gql
+++ /dev/null
@@ -1,1 +0,0 @@
-{  user { address { street< }}}
diff --git a/test/Feature/Holistic/parsing/invalidFields/response.json b/test/Feature/Holistic/parsing/invalidFields/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/invalidFields/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "offset=26:\nunexpected '<'\nexpecting '_', '}', Arguments, Directives, Ignored, IgnoredTokens, Selection, SelectionContent, digit, letter, or white space\n",
-      "locations": [{ "line": 1, "column": 27 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/invalidNotNullOperator/query.gql b/test/Feature/Holistic/parsing/invalidNotNullOperator/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/invalidNotNullOperator/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query q1($v1: [[[Int@]@]]@) {
-  q1 {
-    a2(argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/Holistic/parsing/invalidNotNullOperator/response.json b/test/Feature/Holistic/parsing/invalidNotNullOperator/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/invalidNotNullOperator/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "offset=20:\nunexpected '@'\nexpecting !, ']', '_', Ignored, IgnoredTokens, digit, letter, or white space\n",
-      "locations": [{ "line": 1, "column": 21 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/missingCloseBrace/query.gql b/test/Feature/Holistic/parsing/missingCloseBrace/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/missingCloseBrace/query.gql
+++ /dev/null
@@ -1,4 +0,0 @@
-query q1($v1: [[[Int!]!]]!) {
-  q1 {
-    a2(argNestedList: $v1)
-}
diff --git a/test/Feature/Holistic/parsing/missingCloseBrace/response.json b/test/Feature/Holistic/parsing/missingCloseBrace/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/missingCloseBrace/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "offset=66:\nunexpected end of input\nexpecting '}', Ignored, IgnoredTokens, Selection, or white space\n",
-      "locations": [
-        {
-          "line": 5,
-          "column": 1
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/notNullSpacing/query.gql b/test/Feature/Holistic/parsing/notNullSpacing/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/notNullSpacing/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query q1($v1: [[[Int ! ] ! ]] ! ) {
-  q1 {
-    a2(argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/Holistic/parsing/notNullSpacing/response.json b/test/Feature/Holistic/parsing/notNullSpacing/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/notNullSpacing/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Cannot query field \"q1\" on type \"Query\".",
-      "locations": [
-        {
-          "line": 2,
-          "column": 3
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/notNullSpacing/variables.json b/test/Feature/Holistic/parsing/notNullSpacing/variables.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/notNullSpacing/variables.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "v1": [
-    null
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/numbers/query.gql b/test/Feature/Holistic/parsing/numbers/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/numbers/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  negative1(num: -1)
-  negative2(num: -20232)
-  negative3(num: -5.0)
-  exp1(num: 1.01e4)
-  exp2(num: 6.0221413e23)
-}
diff --git a/test/Feature/Holistic/parsing/numbers/response.json b/test/Feature/Holistic/parsing/numbers/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/numbers/response.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Cannot query field \"negative1\" on type \"Query\".",
-      "locations": [{ "line": 2, "column": 3 }]
-    },
-    {
-      "message": "Cannot query field \"negative2\" on type \"Query\".",
-      "locations": [{ "line": 3, "column": 3 }]
-    },
-    {
-      "message": "Cannot query field \"negative3\" on type \"Query\".",
-      "locations": [{ "line": 4, "column": 3 }]
-    },
-    {
-      "message": "Cannot query field \"exp1\" on type \"Query\".",
-      "locations": [{ "line": 5, "column": 3 }]
-    },
-    {
-      "message": "Cannot query field \"exp2\" on type \"Query\".",
-      "locations": [{ "line": 6, "column": 3 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/parsing/singleLineComments/query.gql b/test/Feature/Holistic/parsing/singleLineComments/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/singleLineComments/query.gql
+++ /dev/null
@@ -1,57 +0,0 @@
-# starting Comment''
-# starting Comment''
-query # starting Comment''
-# starting Comment''
-GetUsers( # starting Comment'' # starting Comment''
-  $v: [# starting Comment'' # starting Comment''
-  Int!] # starting Comment'' # starting Comment''
-) {
-  user {
-    # starting Comment''
-    # %&%(//
-    # %&%(//
-    email2: email # starting Comment'' # %&%(// # starting Comment''
-    name # starting Comment''
-    # starting Comment''
-    # starting Comment''
-    # starting Comment''
-
-    address( # starting Comment'' # %&%(//
-      coordinates: {
-        # %&%(//
-        longitude: 0 # starting Comment''
-        latitude: "" # starting Comment'' # starting Comment'' # starting Comment''
-      }
-    ) {
-      # starting Comment''
-      ...City
-    }
-    office(
-      zipCode: $v # starting Comment''
-      cityID: EnumA # starting Comment'' # starting Comment''
-    ) {
-      houseNumber # starting Comment''
-      # starting Comment''
-
-      ... on Address {
-        # starting Comment''
-
-        city # starting Comment''
-        # starting Comment''
-        # starting Comment''
-      }
-    }
-    # starting Comment''
-  }
-  # starting Comment''
-}
-# starting Comment''
-# starting Comment''
-
-fragment City on Address {
-  # starting Comment''
-  # starting Comment''
-  city # starting Comment''
-}
-# starting Comment''
-# starting Comment''
diff --git a/test/Feature/Holistic/parsing/singleLineComments/response.json b/test/Feature/Holistic/parsing/singleLineComments/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/parsing/singleLineComments/response.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "data": {
-    "user": {
-      "email2": "",
-      "name": "testName",
-      "address": {
-        "city": ""
-      },
-      "office": {
-        "houseNumber": 0,
-        "city": ""
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/reservedNames/query.gql b/test/Feature/Holistic/reservedNames/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/reservedNames/query.gql
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  type(in: { data: "some data" })
-
-  query: __type(name: "Query") {
-    fields {
-      name
-      args {
-        name
-      }
-    }
-  }
-
-  input: __type(name: "TypeInput") {
-    inputFields {
-      name
-    }
-  }
-}
diff --git a/test/Feature/Holistic/reservedNames/response.json b/test/Feature/Holistic/reservedNames/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/reservedNames/response.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "data": {
-    "type": "some data",
-    "query": {
-      "fields": [
-        { "name": "user", "args": [] },
-        { "name": "testUnion", "args": [] },
-        { "name": "person", "args": [] },
-        { "name": "testEnum", "args": [{ "name": "enum" }] },
-        { "name": "fail1", "args": [] },
-        { "name": "fail2", "args": [] },
-        { "name": "type", "args": [{ "name": "in" }] }
-      ]
-    },
-    "input": { "inputFields": [{ "name": "data" }] }
-  }
-}
diff --git a/test/Feature/Holistic/selection/AliasResolve/query.gql b/test/Feature/Holistic/selection/AliasResolve/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/AliasResolve/query.gql
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  user {
-    name1: name
-    name2 : name
-  }
-}
diff --git a/test/Feature/Holistic/selection/AliasResolve/response.json b/test/Feature/Holistic/selection/AliasResolve/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/AliasResolve/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "data": {
-    "user": {
-      "name1": "testName",
-      "name2": "testName"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/AliasUnknownField/query.gql b/test/Feature/Holistic/selection/AliasUnknownField/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/AliasUnknownField/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  user {
-    myAlias: bla
-  }
-}
diff --git a/test/Feature/Holistic/selection/AliasUnknownField/response.json b/test/Feature/Holistic/selection/AliasUnknownField/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/AliasUnknownField/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Cannot query field \"bla\" on type \"User\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 5
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/__typename/query.gql b/test/Feature/Holistic/selection/__typename/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/__typename/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  user {
-    __typename
-  }
-}
diff --git a/test/Feature/Holistic/selection/__typename/response.json b/test/Feature/Holistic/selection/__typename/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/__typename/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "user": {
-      "__typename": "User"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/requiredArgument/query.gql b/test/Feature/Holistic/selection/directives/default/requiredArgument/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/requiredArgument/query.gql
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  user {
-    name @include
-    name2: name @skip
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/requiredArgument/response.json b/test/Feature/Holistic/selection/directives/default/requiredArgument/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/requiredArgument/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"@include\" argument \"if\" is required but not provided.",
-      "locations": [{ "line": 3, "column": 10 }]
-    },
-    {
-      "message": "Directive \"@skip\" argument \"if\" is required but not provided.",
-      "locations": [{ "line": 4, "column": 17 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/directives/default/resolve/query.gql b/test/Feature/Holistic/selection/directives/default/resolve/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/resolve/query.gql
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  user {
-    no_directives: name
-
-    include_false: name @include(if: false)
-    include_true: name @include(if: true)
-
-    skip_false: name @skip(if: false)
-    skip_true: name @skip(if: true)
-
-    skip_true_include_true: name @skip(if: true) @include(if: true)
-    skip_true_include_false: name @skip(if: true) @include(if: false)
-
-    skip_false_include_true: name @skip(if: false) @include(if: true)
-    skip_false_include_false: name @skip(if: false) @include(if: false)
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/resolve/response.json b/test/Feature/Holistic/selection/directives/default/resolve/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/resolve/response.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "data": {
-    "user": {
-      "no_directives": "testName",
-      "include_true": "testName",
-      "skip_false": "testName",
-      "skip_false_include_true": "testName"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/resolve_and_merge/query.gql b/test/Feature/Holistic/selection/directives/default/resolve_and_merge/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/resolve_and_merge/query.gql
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  user {
-    no_directives: name
-
-    include_false: name @include(if: false)
-    include_true: name @include(if: true)
-
-    skip_false: name @skip(if: false)
-    skip_true: name @skip(if: true)
-
-    skip_true_include_true: name @skip(if: true) @include(if: true)
-    skip_true_include_false: name @skip(if: true) @include(if: false)
-
-    skip_false_include_true: name @skip(if: false) @include(if: true)
-    skip_false_include_false: name @skip(if: false) @include(if: false)
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/resolve_and_merge/response.json b/test/Feature/Holistic/selection/directives/default/resolve_and_merge/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/resolve_and_merge/response.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "data": {
-    "user": {
-      "no_directives": "testName",
-      "include_true": "testName",
-      "skip_false": "testName",
-      "skip_false_include_true": "testName"
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/variablesOnFragment/query.gql b/test/Feature/Holistic/selection/directives/default/variablesOnFragment/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/variablesOnFragment/query.gql
+++ /dev/null
@@ -1,13 +0,0 @@
-query TestFragments($x: Boolean! = false, $y: Boolean! = false) {
-  user {
-    name
-    ...UserName @skip(if: $x)
-    ... on User @include(if: $y) {
-      name2: name
-    }
-  }
-}
-
-fragment UserName on User {
-  name1: name
-}
diff --git a/test/Feature/Holistic/selection/directives/default/variablesOnFragment/response.json b/test/Feature/Holistic/selection/directives/default/variablesOnFragment/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/variablesOnFragment/response.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{ "data": { "user": { "name": "testName", "name1": "testName" } } }
diff --git a/test/Feature/Holistic/selection/directives/default/withMerge/query.gql b/test/Feature/Holistic/selection/directives/default/withMerge/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/withMerge/query.gql
+++ /dev/null
@@ -1,15 +0,0 @@
-query bla($x: Boolean! = false, $y: Boolean! = true) {
-  user @skip(if: $x) {
-    case1: name
-  }
-  user @include(if: $x) {
-    case2: name
-  }
-
-  user2: user @skip(if: $y) {
-    case1: name
-  }
-  user2: user @include(if: $y) {
-    case2: name
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/withMerge/response.json b/test/Feature/Holistic/selection/directives/default/withMerge/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/withMerge/response.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "data": { "user": { "case1": "testName" }, "user2": { "case2": "testName" } }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/withVariable/query.gql b/test/Feature/Holistic/selection/directives/default/withVariable/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/withVariable/query.gql
+++ /dev/null
@@ -1,15 +0,0 @@
-query bla($x: Boolean! = true, $y: Boolean! = false, $z: Boolean! = true) {
-  user1: user {
-    case1: name @skip(if: $x)
-    case2: name @include(if: $x)
-  }
-
-  user2: user {
-    case1: name @skip(if: $y)
-    case2: name @include(if: $y)
-  }
-
-  user3: user @skip(if: $z) {
-    case1: name
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/withVariable/response.json b/test/Feature/Holistic/selection/directives/default/withVariable/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/withVariable/response.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "data": { "user1": { "case2": "testName" }, "user2": { "case1": "testName" } }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/wrongArgumentType/query.gql b/test/Feature/Holistic/selection/directives/default/wrongArgumentType/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/wrongArgumentType/query.gql
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  user {
-    testNull: name @include(if: null)
-    testNoolean: name @include(if: true)
-    testInt: name @include(if: 232)
-    tetsFloat: name @include(if: 232.1324)
-    testString: name @include(if: "some string")
-    testEnum: name @include(if: SomeEnum)
-    testObject: name @include(if: {})
-    testList: name @include(if: [])
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/default/wrongArgumentType/response.json b/test/Feature/Holistic/selection/directives/default/wrongArgumentType/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/default/wrongArgumentType/response.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found null.",
-      "locations": [{ "line": 3, "column": 29 }]
-    },
-    {
-      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found 232.",
-      "locations": [{ "line": 5, "column": 28 }]
-    },
-    {
-      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found 232.1324.",
-      "locations": [{ "line": 6, "column": 30 }]
-    },
-    {
-      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found \"some string\".",
-      "locations": [{ "line": 7, "column": 31 }]
-    },
-    {
-      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found SomeEnum.",
-      "locations": [{ "line": 8, "column": 29 }]
-    },
-    {
-      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found {}.",
-      "locations": [{ "line": 9, "column": 31 }]
-    },
-    {
-      "message": "Argument \"if\" got invalid value. Expected type \"Boolean!\" found [].",
-      "locations": [{ "line": 10, "column": 29 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/field/query.gql b/test/Feature/Holistic/selection/directives/validation/invalidPlace/field/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/field/query.gql
+++ /dev/null
@@ -1,15 +0,0 @@
-query bla($x: Boolean! = false, $y: Boolean! = true) {
-  user @skip(if: $x) @deprecated {
-    case1: name
-  }
-  user @include(if: $x) @deprecated {
-    case2: name
-  }
-
-  user2: user @skip(if: $y) @deprecated {
-    case1: name
-  }
-  user2: user @include(if: $y) @deprecated {
-    case2: name
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/field/response.json b/test/Feature/Holistic/selection/directives/validation/invalidPlace/field/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/field/response.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"deprecated\" may not to be used on FIELD",
-      "locations": [{ "line": 2, "column": 22 }]
-    },
-    {
-      "message": "Directive \"deprecated\" may not to be used on FIELD",
-      "locations": [{ "line": 5, "column": 25 }]
-    },
-    {
-      "message": "Directive \"deprecated\" may not to be used on FIELD",
-      "locations": [{ "line": 9, "column": 29 }]
-    },
-    {
-      "message": "Directive \"deprecated\" may not to be used on FIELD",
-      "locations": [{ "line": 12, "column": 32 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql b/test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-query {
-  user {
-    ...UserName @deprecated @include(if: false) @skip(if: true)
-  }
-}
-
-fragment UserName on User {
-  name
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json b/test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/fragmentSpread/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"deprecated\" may not to be used on FRAGMENT_SPREAD",
-      "locations": [{ "line": 3, "column": 17 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql b/test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-query {
-  user {
-    ... on User @deprecated @include(if: false) @skip(if: true) {
-      name
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json b/test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/inlineFragment/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"deprecated\" may not to be used on INLINE_FRAGMENT",
-      "locations": [{ "line": 3, "column": 17 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/query.gql b/test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-mutation SomeMutation @deprecated @skip(if: true) @include(if: true) {
-  createUser(userID: "test_id") {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/response.json b/test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/mutation/response.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"deprecated\" may not to be used on MUTATION",
-      "locations": [{ "line": 1, "column": 23 }]
-    },
-    {
-      "message": "Directive \"skip\" may not to be used on MUTATION",
-      "locations": [{ "line": 1, "column": 35 }]
-    },
-    {
-      "message": "Directive \"include\" may not to be used on MUTATION",
-      "locations": [{ "line": 1, "column": 51 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/query/query.gql b/test/Feature/Holistic/selection/directives/validation/invalidPlace/query/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/query/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query SomeQUery @deprecated @skip(if: true) @include(if: true) {
-  user {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/query/response.json b/test/Feature/Holistic/selection/directives/validation/invalidPlace/query/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/query/response.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"deprecated\" may not to be used on QUERY",
-      "locations": [{ "line": 1, "column": 17 }]
-    },
-    {
-      "message": "Directive \"skip\" may not to be used on QUERY",
-      "locations": [{ "line": 1, "column": 29 }]
-    },
-    {
-      "message": "Directive \"include\" may not to be used on QUERY",
-      "locations": [{ "line": 1, "column": 45 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/query.gql b/test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-subscription SomeSubscription @deprecated @skip(if: true) @include(if: true) {
-  newUser {
-    name
-  }
-}
diff --git a/test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/response.json b/test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/directives/validation/invalidPlace/subscription/response.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Directive \"deprecated\" may not to be used on SUBSCRIPTION",
-      "locations": [{ "line": 1, "column": 31 }]
-    },
-    {
-      "message": "Directive \"skip\" may not to be used on SUBSCRIPTION",
-      "locations": [{ "line": 1, "column": 43 }]
-    },
-    {
-      "message": "Directive \"include\" may not to be used on SUBSCRIPTION",
-      "locations": [{ "line": 1, "column": 59 }]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/hasNoSubFields/query.gql b/test/Feature/Holistic/selection/hasNoSubFields/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/hasNoSubFields/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  user {
-    name {
-      id
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/hasNoSubFields/response.json b/test/Feature/Holistic/selection/hasNoSubFields/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/hasNoSubFields/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Field \"name\" must not have a selection since type \"String\" has no subfields.",
-      "locations": [
-        {
-          "line": 3,
-          "column": 5
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/mergeConflict/alias/query.gql b/test/Feature/Holistic/selection/mergeConflict/alias/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeConflict/alias/query.gql
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  user {
-    bla: email
-    email
-    bla: email
-    address(coordinates: { latitude: "", longitude: 1 }) {
-      city
-      bla: city
-    }
-  }
-  user {
-    address(coordinates: { latitude: "", longitude: 1 }) {
-      bla: houseNumber
-    }
-    bla: email
-  }
-}
diff --git a/test/Feature/Holistic/selection/mergeConflict/alias/response.json b/test/Feature/Holistic/selection/mergeConflict/alias/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeConflict/alias/response.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fields \"user\" conflict because subfields \"address\" conflict because \"city\" and \"houseNumber\" are different fields. Use different aliases on the fields to fetch both if this was intentional.",
-      "locations": [
-        {
-          "line": 2,
-          "column": 3
-        },
-        {
-          "line": 6,
-          "column": 5
-        },
-        {
-          "line": 8,
-          "column": 7
-        },
-        {
-          "line": 13,
-          "column": 7
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/mergeConflict/arguments/query.gql b/test/Feature/Holistic/selection/mergeConflict/arguments/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeConflict/arguments/query.gql
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  user {
-    bla: email
-    email
-    bla: email
-    address(coordinates: {latitude:"", longitude: 3}) {
-      city
-			houseNumber
-    }
-  }
-  user {
-    address(coordinates: {latitude:"", longitude: 2}) {
-      city
-      bla: houseNumber
-    }
-    name
-    bla: email
-  }
-}
diff --git a/test/Feature/Holistic/selection/mergeConflict/arguments/response.json b/test/Feature/Holistic/selection/mergeConflict/arguments/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeConflict/arguments/response.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fields \"user\" conflict because subfields \"address\" conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.",
-      "locations": [
-        {
-          "line": 2,
-          "column": 3
-        },
-        {
-          "line": 6,
-          "column": 5
-        },
-        {
-          "line": 6,
-          "column": 5
-        },
-        {
-          "line": 12,
-          "column": 5
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/mergeConflict/union/query.gql b/test/Feature/Holistic/selection/mergeConflict/union/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeConflict/union/query.gql
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  testUnion {
-    ... on User {
-      name
-      email
-      address(coordinates: { latitude: "", longitude: 1 }) {
-        city: houseNumber
-      }
-    }
-  }
-  
-  testUnion {
-    ... on User {
-      name: email
-      address(coordinates: { latitude: "", longitude: 1 }) {
-        city
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/mergeConflict/union/response.json b/test/Feature/Holistic/selection/mergeConflict/union/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeConflict/union/response.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fields \"testUnion\" conflict because \"name\" and \"email\" are different fields. Use different aliases on the fields to fetch both if this was intentional.",
-      "locations": [
-        { "line": 2, "column": 3 },
-        { "line": 4, "column": 7 },
-        { "line": 14, "column": 7 }
-      ]
-    },
-    {
-      "message": "Fields \"testUnion\" conflict because subfields \"address\" conflict because \"houseNumber\" and \"city\" are different fields. Use different aliases on the fields to fetch both if this was intentional.",
-      "locations": [
-        { "line": 2, "column": 3 },
-        { "line": 6, "column": 7 },
-        { "line": 7, "column": 9 },
-        { "line": 16, "column": 9 }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/mergeSelection/query.gql b/test/Feature/Holistic/selection/mergeSelection/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeSelection/query.gql
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  user {
-    name
-    name
-    name
-    name2 : name
-    name2 : name
-    name2 : name
-    name: name
-  }
-  user { 
-    name
-    name2 : name
-  }
-  user {
-    bla: email
-    email
-    bla: email
-    address(coordinates: {latitude:"", longitude: 2}) {
-      city
-			houseNumber
-    }
-  }
-  user {
-    address(coordinates: {latitude:"", longitude: 2}) {
-      city
-      bla: houseNumber
-    }
-    name
-    bla: email
-  }
-}
diff --git a/test/Feature/Holistic/selection/mergeSelection/response.json b/test/Feature/Holistic/selection/mergeSelection/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeSelection/response.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "data": {
-    "user": {
-      "name": "testName",
-      "name2": "testName",
-      "bla": "",
-      "email": "",
-      "address": {
-        "city": "",
-        "houseNumber": 0,
-        "bla": 0
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/mergeUnionSelection/query.gql b/test/Feature/Holistic/selection/mergeUnionSelection/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeUnionSelection/query.gql
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  testUnion {
-    ... on User {
-      name
-      email
-    }
-  }
-  
-  testUnion {
-    ... on User {
-      name
-      email2: email
-      address(coordinates: { latitude: "", longitude: 1 }) {
-        city
-      }
-    }
-  }
-}
-
diff --git a/test/Feature/Holistic/selection/mergeUnionSelection/response.json b/test/Feature/Holistic/selection/mergeUnionSelection/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mergeUnionSelection/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "data": {
-    "testUnion": {
-      "name": "testName",
-      "email": "",
-      "email2": "",
-      "address": {
-        "city": ""
-      }
-    }
-  }
-}
diff --git a/test/Feature/Holistic/selection/mustHaveSubFields/query.gql b/test/Feature/Holistic/selection/mustHaveSubFields/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mustHaveSubFields/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  user
-}
diff --git a/test/Feature/Holistic/selection/mustHaveSubFields/response.json b/test/Feature/Holistic/selection/mustHaveSubFields/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/mustHaveSubFields/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Field \"user\" of type \"User\" must have a selection of subfields",
-      "locations": [
-        {
-          "line": 2,
-          "column": 3
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/query.gql b/test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/query.gql
+++ /dev/null
@@ -1,8 +0,0 @@
-subscription SomeTestSubscription {
-  newUser {
-    name
-  }
-  newAddress {
-    houseNumber
-  }
-}
diff --git a/test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/response.json b/test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/subscription/singleTopLevelField/fail/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Subscription \"SomeTestSubscription\" must select only one top level field.",
-      "locations": [
-        {
-          "line": 5,
-          "column": 3
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql b/test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/query.gql
+++ /dev/null
@@ -1,11 +0,0 @@
-subscription {
-  newUser {
-    name
-  }
-  newAddress {
-    houseNumber
-  }
-  address2: newAddress {
-    houseNumber
-  }
-}
diff --git a/test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json b/test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/subscription/singleTopLevelField/failAnonymous/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Anonymous Subscription must select only one top level field.",
-      "locations": [
-        {
-          "line": 5,
-          "column": 3
-        }
-      ]
-    },
-    {
-      "message": "Anonymous Subscription must select only one top level field.",
-      "locations": [
-        {
-          "line": 8,
-          "column": 3
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Holistic/selection/unknownField/query.gql b/test/Feature/Holistic/selection/unknownField/query.gql
deleted file mode 100644
--- a/test/Feature/Holistic/selection/unknownField/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  user {
-    bla
-  }
-}
diff --git a/test/Feature/Holistic/selection/unknownField/response.json b/test/Feature/Holistic/selection/unknownField/response.json
deleted file mode 100644
--- a/test/Feature/Holistic/selection/unknownField/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Cannot query field \"bla\" on type \"User\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 5
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Inference/TaggedArguments.hs b/test/Feature/Inference/TaggedArguments.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/TaggedArguments.hs
@@ -0,0 +1,60 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Inference.TaggedArguments
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( Arg (..),
+    GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text
+  ( Text,
+    pack,
+  )
+import GHC.Generics (Generic)
+
+data A = A
+  { a1 :: Text,
+    a2 :: Int
+  }
+  deriving (Show, Generic, GQLType)
+
+newtype B = B
+  {b1 :: Text}
+  deriving (Show, Generic, GQLType)
+
+newtype C = C
+  {c1 :: Int}
+  deriving (Show, Generic, GQLType)
+
+data Query (m :: * -> *) = Query
+  { field1 :: A -> B -> C -> m Text,
+    field2 :: A -> Arg "b1" Text -> Arg "c1" Int -> m Text
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { field1 = \a b c -> pure $ pack $ show (a, b, c),
+            field2 = \a b c -> pure $ pack $ show (a, b, c)
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Inference/TaggedArgumentsFail.hs b/test/Feature/Inference/TaggedArgumentsFail.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/TaggedArgumentsFail.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Inference.TaggedArgumentsFail
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text
+  ( Text,
+    pack,
+  )
+import GHC.Generics (Generic)
+
+data A = A
+  { a1 :: Text,
+    a2 :: Int
+  }
+  deriving (Show, Generic, GQLType)
+
+newtype B = B
+  {a2 :: Text}
+  deriving (Show, Generic, GQLType)
+
+newtype Query (m :: * -> *) = Query
+  { field1 :: A -> B -> m Text
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { field1 = \a b -> pure $ pack $ show (a, b)
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Inference/TypeGuards.hs b/test/Feature/Inference/TypeGuards.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/TypeGuards.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Inference.TypeGuards
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    RootResolver (..),
+    TypeGuard (..),
+    Undefined (..),
+  )
+import Data.Text
+  ( Text,
+  )
+import GHC.Generics (Generic)
+
+data Character = Hydra
+  { name :: Text,
+    age :: Int
+  }
+  deriving (Show, Generic, GQLType)
+
+data Deity (m :: * -> *) = Deity
+  { name :: Text,
+    age :: Int,
+    power :: Text
+  }
+  deriving (Generic, GQLType)
+
+data Implements (m :: * -> *)
+  = ImplementsDeity (Deity m)
+  | Creature {name :: Text, age :: Int}
+  deriving (Generic, GQLType)
+
+type Characters m = TypeGuard Character (Implements m)
+
+newtype Query (m :: * -> *) = Query
+  { characters :: [Characters m]
+  }
+  deriving (Generic, GQLType)
+
+resolveCharacters :: [Characters m]
+resolveCharacters =
+  ResolveType
+    <$> [ ImplementsDeity
+            ( Deity
+                { name = "Morpheus",
+                  age = 2000,
+                  power = "Shapeshift"
+                }
+            ),
+          Creature
+            { name = "Lamia",
+              age = 205
+            }
+        ]
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { characters = resolveCharacters
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Inference/TypeInference.hs b/test/Feature/Inference/TypeInference.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/TypeInference.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Inference.TypeInference
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text
+  ( Text,
+    pack,
+  )
+import GHC.Generics (Generic)
+
+data Power
+  = Thunderbolts
+  | Shapeshift
+  | Hurricanes
+  deriving (Generic, GQLType)
+
+data Deity (m :: * -> *) = Deity
+  { name :: Text,
+    power :: Power
+  }
+  deriving (Generic, GQLType)
+
+deityRes :: Deity m
+deityRes = Deity {name = "Morpheus", power = Shapeshift}
+
+data Hydra = Hydra
+  { name :: Text,
+    age :: Int
+  }
+  deriving (Show, Generic, GQLType)
+
+data Monster
+  = MonsterHydra Hydra
+  | Cerberus {name :: Text}
+  | UnidentifiedMonster
+  deriving (Show, Generic, GQLType)
+
+data Character (m :: * -> *)
+  = CharacterDeity (Deity m) -- Only <tycon name><type ref name> should generate direct link
+  | Creature {creatureName :: Text, creatureAge :: Int}
+  | BoxedDeity {boxedDeity :: Deity m}
+  | ScalarRecord {scalarText :: Text}
+  | CharacterAge Int
+  | SomeDeity (Deity m)
+  | SomeMutli Int Text
+  | Zeus
+  | Cronus
+  deriving (Generic, GQLType)
+
+resolveCharacter :: [Character m]
+resolveCharacter =
+  [ CharacterDeity deityRes,
+    Creature {creatureName = "Lamia", creatureAge = 205},
+    BoxedDeity {boxedDeity = deityRes},
+    ScalarRecord {scalarText = "Some Text"},
+    SomeDeity deityRes,
+    CharacterAge 12,
+    SomeMutli 21 "some text",
+    Zeus,
+    Cronus
+  ]
+
+newtype MonsterArgs = MonsterArgs
+  { monster :: Monster
+  }
+  deriving (Show, Generic, GQLType)
+
+data Query (m :: * -> *) = Query
+  { deity :: Deity m,
+    character :: [Character m],
+    showMonster :: MonsterArgs -> m Text
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { deity = deityRes,
+            character = resolveCharacter,
+            showMonster
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+  where
+    showMonster MonsterArgs {monster} = pure (pack $ show monster)
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Inference/UnionType.hs b/test/Feature/Inference/UnionType.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/UnionType.hs
@@ -0,0 +1,69 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Inference.UnionType
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    ResolverQ,
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text (Text)
+import GHC.Generics (Generic)
+
+data A = A
+  { aText :: Text,
+    aInt :: Int
+  }
+  deriving (Generic, GQLType)
+
+data B = B
+  { bText :: Text,
+    bInt :: Int
+  }
+  deriving (Generic, GQLType)
+
+data C = C
+  { cText :: Text,
+    cInt :: Int
+  }
+  deriving (Generic, GQLType)
+
+data Sum
+  = SumA A
+  | SumB B
+  deriving (Generic, GQLType)
+
+data Query m = Query
+  { union :: () -> m [Sum],
+    fc :: C
+  }
+  deriving (Generic, GQLType)
+
+resolveUnion :: () -> ResolverQ () IO [Sum]
+resolveUnion _ =
+  return [SumA A {aText = "at", aInt = 1}, SumB B {bText = "bt", bInt = 2}]
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { union = resolveUnion,
+            fc = C {cText = "", cInt = 3}
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Inference/WrappedType.hs b/test/Feature/Inference/WrappedType.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/WrappedType.hs
@@ -0,0 +1,82 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Feature.Inference.WrappedType
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Subscriptions (Event)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    RootResolver (..),
+    SubscriptionField,
+    constRes,
+    subscribe,
+  )
+import Relude
+
+data Wrapped a b = Wrapped
+  { fieldA :: a,
+    fieldB :: b
+  }
+  deriving (Generic, GQLType)
+
+data WA m = WA
+  { aText :: () -> m Text,
+    aInt :: Int
+  }
+  deriving (Generic, GQLType)
+
+type Wrapped1 = Wrapped Int Int
+
+type Wrapped2 = Wrapped (Wrapped Text Int) Text
+
+data Query m = Query
+  { a1 :: WA m,
+    a2 :: Maybe Wrapped1,
+    a3 :: Maybe Wrapped2
+  }
+  deriving (Generic, GQLType)
+
+data Mutation m = Mutation
+  { mut1 :: Maybe (WA m),
+    mut2 :: Maybe Wrapped1,
+    mut3 :: Maybe Wrapped2
+  }
+  deriving (Generic, GQLType)
+
+data Channel
+  = Channel
+  deriving (Show, Eq)
+
+type EVENT = Event Channel ()
+
+data Subscription (m :: * -> *) = Subscription
+  { sub1 :: SubscriptionField (m (Maybe (WA m))),
+    sub2 :: SubscriptionField (m (Maybe Wrapped1)),
+    sub3 :: SubscriptionField (m (Maybe Wrapped2))
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO EVENT Query Mutation Subscription
+rootResolver =
+  RootResolver
+    { queryResolver = Query {a1 = WA {aText = const $ pure "test1", aInt = 0}, a2 = Nothing, a3 = Nothing},
+      mutationResolver = Mutation {mut1 = Nothing, mut2 = Nothing, mut3 = Nothing},
+      subscriptionResolver =
+        Subscription
+          { sub1 = subscribe Channel (pure $ constRes Nothing),
+            sub2 = subscribe Channel (pure $ constRes Nothing),
+            sub3 = subscribe Channel (pure $ constRes Nothing)
+          }
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Inference/tagged-arguments-fail/introspection/query.gql b/test/Feature/Inference/tagged-arguments-fail/introspection/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments-fail/introspection/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Query") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/tagged-arguments-fail/introspection/response.json b/test/Feature/Inference/tagged-arguments-fail/introspection/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments-fail/introspection/response.json
@@ -0,0 +1,7 @@
+{
+  "errors": [
+    {
+      "message": "There can Be only One argument Named \"a2\""
+    }
+  ]
+}
diff --git a/test/Feature/Inference/tagged-arguments-fail/resolving/query.gql b/test/Feature/Inference/tagged-arguments-fail/resolving/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments-fail/resolving/query.gql
@@ -0,0 +1,4 @@
+query Get__Type {
+  field1(a1: "f1", a2: 2, b1: "f3", c1: 4)
+  field2(a1: "f1", a2: 2, b1: "f3", c1: 4)
+}
diff --git a/test/Feature/Inference/tagged-arguments-fail/resolving/response.json b/test/Feature/Inference/tagged-arguments-fail/resolving/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments-fail/resolving/response.json
@@ -0,0 +1,7 @@
+{
+  "errors": [
+    {
+      "message": "There can Be only One argument Named \"a2\""
+    }
+  ]
+}
diff --git a/test/Feature/Inference/tagged-arguments/introspection/query.gql b/test/Feature/Inference/tagged-arguments/introspection/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments/introspection/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Query") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/tagged-arguments/introspection/response.json b/test/Feature/Inference/tagged-arguments/introspection/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments/introspection/response.json
@@ -0,0 +1,110 @@
+{
+  "data": {
+    "__type": {
+      "inputFields": null,
+      "name": "Query",
+      "possibleTypes": null,
+      "interfaces": [],
+      "kind": "OBJECT",
+      "enumValues": null,
+      "fields": [
+        {
+          "name": "field1",
+          "type": {
+            "name": null,
+            "kind": "NON_NULL",
+            "ofType": { "name": "String", "kind": "SCALAR", "ofType": null }
+          },
+          "deprecationReason": null,
+          "args": [
+            {
+              "name": "a1",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "String", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "a2",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "Int", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "b1",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "String", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "c1",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "Int", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            }
+          ],
+          "isDeprecated": false
+        },
+        {
+          "name": "field2",
+          "type": {
+            "name": null,
+            "kind": "NON_NULL",
+            "ofType": { "name": "String", "kind": "SCALAR", "ofType": null }
+          },
+          "deprecationReason": null,
+          "args": [
+            {
+              "name": "a1",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "String", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "a2",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "Int", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "b1",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "String", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "c1",
+              "type": {
+                "name": null,
+                "kind": "NON_NULL",
+                "ofType": { "name": "Int", "kind": "SCALAR", "ofType": null }
+              },
+              "defaultValue": null
+            }
+          ],
+          "isDeprecated": false
+        }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Inference/tagged-arguments/resolving/query.gql b/test/Feature/Inference/tagged-arguments/resolving/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments/resolving/query.gql
@@ -0,0 +1,4 @@
+query Get__Type {
+  field1(a1: "f1", a2: 2, b1: "f3", c1: 4)
+  field2(a1: "f1", a2: 2, b1: "f3", c1: 4)
+}
diff --git a/test/Feature/Inference/tagged-arguments/resolving/response.json b/test/Feature/Inference/tagged-arguments/resolving/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/tagged-arguments/resolving/response.json
@@ -0,0 +1,6 @@
+{
+  "data": {
+    "field1": "(A {a1 = \"f1\", a2 = 2},B {b1 = \"f3\"},C {c1 = 4})",
+    "field2": "(A {a1 = \"f1\", a2 = 2},Arg {argValue = \"f3\"},Arg {argValue = 4})"
+  }
+}
diff --git a/test/Feature/Inference/type-guards/introspection/interface/query.gql b/test/Feature/Inference/type-guards/introspection/interface/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/introspection/interface/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Character") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-guards/introspection/interface/response.json b/test/Feature/Inference/type-guards/introspection/interface/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/introspection/interface/response.json
@@ -0,0 +1,39 @@
+{
+  "data": {
+    "__type": {
+      "kind": "INTERFACE",
+      "possibleTypes": [
+        { "kind": "OBJECT", "ofType": null, "name": "Deity" },
+        { "kind": "OBJECT", "ofType": null, "name": "Creature" }
+      ],
+      "enumValues": null,
+      "interfaces": null,
+      "inputFields": null,
+      "fields": [
+        {
+          "name": "name",
+          "deprecationReason": null,
+          "isDeprecated": false,
+          "type": {
+            "kind": "NON_NULL",
+            "ofType": { "kind": "SCALAR", "ofType": null, "name": "String" },
+            "name": null
+          },
+          "args": []
+        },
+        {
+          "name": "age",
+          "deprecationReason": null,
+          "isDeprecated": false,
+          "type": {
+            "kind": "NON_NULL",
+            "ofType": { "kind": "SCALAR", "ofType": null, "name": "Int" },
+            "name": null
+          },
+          "args": []
+        }
+      ],
+      "name": "Character"
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-guards/introspection/objects/query.gql b/test/Feature/Inference/type-guards/introspection/objects/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/introspection/objects/query.gql
@@ -0,0 +1,79 @@
+query Get__Type {
+  deity: __type(name: "Deity") {
+    ...FullType
+  }
+  creature: __type(name: "Creature") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-guards/introspection/objects/response.json b/test/Feature/Inference/type-guards/introspection/objects/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/introspection/objects/response.json
@@ -0,0 +1,83 @@
+{
+  "data": {
+    "deity": {
+      "kind": "OBJECT",
+      "possibleTypes": null,
+      "enumValues": null,
+      "interfaces": [
+        { "kind": "INTERFACE", "ofType": null, "name": "Character" }
+      ],
+      "inputFields": null,
+      "fields": [
+        {
+          "name": "name",
+          "deprecationReason": null,
+          "isDeprecated": false,
+          "type": {
+            "kind": "NON_NULL",
+            "ofType": { "kind": "SCALAR", "ofType": null, "name": "String" },
+            "name": null
+          },
+          "args": []
+        },
+        {
+          "name": "age",
+          "deprecationReason": null,
+          "isDeprecated": false,
+          "type": {
+            "kind": "NON_NULL",
+            "ofType": { "kind": "SCALAR", "ofType": null, "name": "Int" },
+            "name": null
+          },
+          "args": []
+        },
+        {
+          "name": "power",
+          "deprecationReason": null,
+          "isDeprecated": false,
+          "type": {
+            "kind": "NON_NULL",
+            "ofType": { "kind": "SCALAR", "ofType": null, "name": "String" },
+            "name": null
+          },
+          "args": []
+        }
+      ],
+      "name": "Deity"
+    },
+    "creature": {
+      "kind": "OBJECT",
+      "possibleTypes": null,
+      "enumValues": null,
+      "interfaces": [
+        { "kind": "INTERFACE", "ofType": null, "name": "Character" }
+      ],
+      "inputFields": null,
+      "fields": [
+        {
+          "name": "name",
+          "deprecationReason": null,
+          "isDeprecated": false,
+          "type": {
+            "kind": "NON_NULL",
+            "ofType": { "kind": "SCALAR", "ofType": null, "name": "String" },
+            "name": null
+          },
+          "args": []
+        },
+        {
+          "name": "age",
+          "deprecationReason": null,
+          "isDeprecated": false,
+          "type": {
+            "kind": "NON_NULL",
+            "ofType": { "kind": "SCALAR", "ofType": null, "name": "Int" },
+            "name": null
+          },
+          "args": []
+        }
+      ],
+      "name": "Creature"
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-guards/resolving/fail/query.gql b/test/Feature/Inference/type-guards/resolving/fail/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/resolving/fail/query.gql
@@ -0,0 +1,6 @@
+{
+  characters {
+    name
+    power
+  }
+}
diff --git a/test/Feature/Inference/type-guards/resolving/fail/response.json b/test/Feature/Inference/type-guards/resolving/fail/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/resolving/fail/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"power\" on type \"Character\".",
+      "locations": [{ "line": 4, "column": 5 }]
+    }
+  ]
+}
diff --git a/test/Feature/Inference/type-guards/resolving/success/interface-fields/query.gql b/test/Feature/Inference/type-guards/resolving/success/interface-fields/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/resolving/success/interface-fields/query.gql
@@ -0,0 +1,6 @@
+{
+  characters {
+    name
+    age
+  }
+}
diff --git a/test/Feature/Inference/type-guards/resolving/success/interface-fields/response.json b/test/Feature/Inference/type-guards/resolving/success/interface-fields/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/resolving/success/interface-fields/response.json
@@ -0,0 +1,8 @@
+{
+  "data": {
+    "characters": [
+      { "age": 2000, "name": "Morpheus", "__typename": "Deity" },
+      { "age": 205, "name": "Lamia", "__typename": "Creature" }
+    ]
+  }
+}
diff --git a/test/Feature/Inference/type-guards/resolving/success/type-casting/query.gql b/test/Feature/Inference/type-guards/resolving/success/type-casting/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/resolving/success/type-casting/query.gql
@@ -0,0 +1,9 @@
+{
+  characters {
+    name
+    age
+    ... on Deity {
+      power
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-guards/resolving/success/type-casting/response.json b/test/Feature/Inference/type-guards/resolving/success/type-casting/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-guards/resolving/success/type-casting/response.json
@@ -0,0 +1,17 @@
+{
+  "data": {
+    "characters": [
+      {
+        "__typename": "Deity",
+        "name": "Morpheus",
+        "power": "Shapeshift",
+        "age": 2000
+      },
+      {
+        "__typename": "Creature",
+        "name": "Lamia",
+        "age": 205
+      }
+    ]
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/enum/query.gql b/test/Feature/Inference/type-inference/introspection/enum/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/enum/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Power") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/enum/response.json b/test/Feature/Inference/type-inference/introspection/enum/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/enum/response.json
@@ -0,0 +1,29 @@
+{
+  "data": {
+    "__type": {
+      "kind": "ENUM",
+      "name": "Power",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": [
+        {
+          "name": "Thunderbolts",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "Shapeshift",
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "Hurricanes",
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/input-union/empty/query.gql b/test/Feature/Inference/type-inference/introspection/input-union/empty/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/input-union/empty/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Unit") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/input-union/empty/response.json b/test/Feature/Inference/type-inference/introspection/input-union/empty/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/input-union/empty/response.json
@@ -0,0 +1,19 @@
+{
+  "data": {
+    "__type": {
+      "kind": "ENUM",
+      "name": "Unit",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": [
+        {
+          "name": "Unit",
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/input-union/input-union/query.gql b/test/Feature/Inference/type-inference/introspection/input-union/input-union/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/input-union/input-union/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Monster") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/input-union/input-union/response.json b/test/Feature/Inference/type-inference/introspection/input-union/input-union/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/input-union/input-union/response.json
@@ -0,0 +1,41 @@
+{
+  "data": {
+    "__type": {
+      "kind": "INPUT_OBJECT",
+      "name": "Monster",
+      "fields": null,
+      "inputFields": [
+        {
+          "name": "Hydra",
+          "type": {
+            "kind": "INPUT_OBJECT",
+            "name": "Hydra",
+            "ofType": null
+          },
+          "defaultValue": null
+        },
+        {
+          "name": "Cerberus",
+          "type": {
+            "kind": "INPUT_OBJECT",
+            "name": "Cerberus",
+            "ofType": null
+          },
+          "defaultValue": null
+        },
+        {
+          "name": "UnidentifiedMonster",
+          "type": {
+            "kind": "ENUM",
+            "name": "Unit",
+            "ofType": null
+          },
+          "defaultValue": null
+        }
+      ],
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/inputObject/query.gql b/test/Feature/Inference/type-inference/introspection/inputObject/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/inputObject/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Hydra") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/inputObject/response.json b/test/Feature/Inference/type-inference/introspection/inputObject/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/inputObject/response.json
@@ -0,0 +1,32 @@
+{
+  "data": {
+    "__type": {
+      "kind": "INPUT_OBJECT",
+      "name": "Hydra",
+      "fields": null,
+      "inputFields": [
+        {
+          "name": "name",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "defaultValue": null
+        },
+        {
+          "name": "age",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
+          },
+          "defaultValue": null
+        }
+      ],
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/object/query.gql b/test/Feature/Inference/type-inference/introspection/object/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/object/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Deity") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/object/response.json b/test/Feature/Inference/type-inference/introspection/object/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/object/response.json
@@ -0,0 +1,36 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "Deity",
+      "fields": [
+        {
+          "name": "name",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "power",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "ENUM", "name": "Power", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/named-products/query.gql b/test/Feature/Inference/type-inference/introspection/union/named-products/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/named-products/query.gql
@@ -0,0 +1,82 @@
+query Get__Type {
+  creature: __type(name: "Creature") {
+    ...FullType
+  }
+  boxedDeity: __type(name: "BoxedDeity") {
+    ...FullType
+  }
+  scalarRecord: __type(name: "ScalarRecord") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/named-products/response.json b/test/Feature/Inference/type-inference/introspection/union/named-products/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/named-products/response.json
@@ -0,0 +1,78 @@
+{
+  "data": {
+    "creature": {
+      "kind": "OBJECT",
+      "name": "Creature",
+      "fields": [
+        {
+          "name": "creatureName",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "creatureAge",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    },
+    "boxedDeity": {
+      "kind": "OBJECT",
+      "name": "BoxedDeity",
+      "fields": [
+        {
+          "name": "boxedDeity",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "OBJECT", "name": "Deity", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    },
+    "scalarRecord": {
+      "kind": "OBJECT",
+      "name": "ScalarRecord",
+      "fields": [
+        {
+          "name": "scalarText",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/nullary-constructors/query.gql b/test/Feature/Inference/type-inference/introspection/union/nullary-constructors/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/nullary-constructors/query.gql
@@ -0,0 +1,82 @@
+query Get__Type {
+  zeus: __type(name: "Zeus") {
+    ...FullType
+  }
+  cronus: __type(name: "Cronus") {
+    ...FullType
+  }
+  empty: __type(name: "Unit") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/nullary-constructors/response.json b/test/Feature/Inference/type-inference/introspection/union/nullary-constructors/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/nullary-constructors/response.json
@@ -0,0 +1,69 @@
+{
+  "data": {
+    "zeus": {
+      "kind": "OBJECT",
+      "name": "Zeus",
+      "fields": [
+        {
+          "name": "_",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "ENUM",
+              "name": "Unit",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    },
+    "cronus": {
+      "kind": "OBJECT",
+      "name": "Cronus",
+      "fields": [
+        {
+          "name": "_",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "ENUM",
+              "name": "Unit",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    },
+    "empty": {
+      "kind": "ENUM",
+      "name": "Unit",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": [
+        {
+          "name": "Unit",
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/positional-products/query.gql b/test/Feature/Inference/type-inference/introspection/union/positional-products/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/positional-products/query.gql
@@ -0,0 +1,79 @@
+query Get__Type {
+  someDeity: __type(name: "SomeDeity") {
+    ...FullType
+  }
+  someMutli: __type(name: "SomeMutli") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/positional-products/response.json b/test/Feature/Inference/type-inference/introspection/union/positional-products/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/positional-products/response.json
@@ -0,0 +1,57 @@
+{
+  "data": {
+    "someDeity": {
+      "kind": "OBJECT",
+      "name": "SomeDeity",
+      "fields": [
+        {
+          "name": "_0",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "OBJECT", "name": "Deity", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    },
+    "someMutli": {
+      "kind": "OBJECT",
+      "name": "SomeMutli",
+      "fields": [
+        {
+          "name": "_0",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "_1",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/scalars/query.gql b/test/Feature/Inference/type-inference/introspection/union/scalars/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/scalars/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "CharacterAge") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/scalars/response.json b/test/Feature/Inference/type-inference/introspection/union/scalars/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/scalars/response.json
@@ -0,0 +1,25 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "CharacterAge",
+      "fields": [
+        {
+          "name": "_0",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/union/query.gql b/test/Feature/Inference/type-inference/introspection/union/union/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/union/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Character") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/introspection/union/union/response.json b/test/Feature/Inference/type-inference/introspection/union/union/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/introspection/union/union/response.json
@@ -0,0 +1,23 @@
+{
+  "data": {
+    "__type": {
+      "kind": "UNION",
+      "name": "Character",
+      "fields": null,
+      "inputFields": null,
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": [
+        { "kind": "OBJECT", "name": "Deity", "ofType": null },
+        { "kind": "OBJECT", "name": "Creature", "ofType": null },
+        { "kind": "OBJECT", "name": "BoxedDeity", "ofType": null },
+        { "kind": "OBJECT", "name": "ScalarRecord", "ofType": null },
+        { "kind": "OBJECT", "name": "CharacterAge", "ofType": null },
+        { "kind": "OBJECT", "name": "SomeDeity", "ofType": null },
+        { "kind": "OBJECT", "name": "SomeMutli", "ofType": null },
+        { "kind": "OBJECT", "name": "Zeus", "ofType": null },
+        { "kind": "OBJECT", "name": "Cronus", "ofType": null }
+      ]
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/resolving/complexUnion/query.gql b/test/Feature/Inference/type-inference/resolving/complexUnion/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/complexUnion/query.gql
@@ -0,0 +1,44 @@
+{
+  character {
+    ## regular union
+    __typename
+    ... on Deity {
+      name
+    }
+
+    ... on Creature {
+      creatureName
+      creatureAge
+    }
+
+    ... on BoxedDeity {
+      boxedDeity {
+        power
+      }
+    }
+
+    ... on ScalarRecord {
+      scalarText
+    }
+
+    ... on CharacterAge {
+      _0
+    }
+
+    ... on SomeDeity {
+      _0 {
+        name
+        power
+      }
+    }
+
+    ... on SomeMutli {
+      _0
+      _1
+    }
+
+    ... on Zeus {
+      _
+    }
+  }
+}
diff --git a/test/Feature/Inference/type-inference/resolving/complexUnion/response.json b/test/Feature/Inference/type-inference/resolving/complexUnion/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/complexUnion/response.json
@@ -0,0 +1,43 @@
+{
+  "data": {
+    "character": [
+      {
+        "__typename": "Deity",
+        "name": "Morpheus"
+      },
+      {
+        "__typename": "Creature",
+        "creatureName": "Lamia",
+        "creatureAge": 205
+      },
+      {
+        "__typename": "BoxedDeity",
+        "boxedDeity": { "power": "Shapeshift" }
+      },
+      {
+        "__typename": "ScalarRecord",
+        "scalarText": "Some Text"
+      },
+      {
+        "__typename": "SomeDeity",
+        "_0": { "name": "Morpheus", "power": "Shapeshift" }
+      },
+      {
+        "__typename": "CharacterAge",
+        "_0": 12
+      },
+      {
+        "__typename": "SomeMutli",
+        "_0": 21,
+        "_1": "some text"
+      },
+      {
+        "__typename": "Zeus",
+        "_": "Unit"
+      },
+      {
+        "__typename": "Cronus"
+      }
+    ]
+  }
+}
diff --git a/test/Feature/Inference/type-inference/resolving/input/fail/query.gql b/test/Feature/Inference/type-inference/resolving/input/fail/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/input/fail/query.gql
@@ -0,0 +1,6 @@
+{
+  empty: showMonster(monster: {})
+  multiple: showMonster(
+    monster: { Hydra: { name: "someName", age: 12 }, UnidentifiedMonster: Unit }
+  )
+}
diff --git a/test/Feature/Inference/type-inference/resolving/input/fail/response.json b/test/Feature/Inference/type-inference/resolving/input/fail/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/input/fail/response.json
@@ -0,0 +1,12 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"monster\" got invalid value. Expected type \"Monster!\" found {}. Exclusive input objects must provide a value for at least one field.",
+      "locations": [{ "line": 2, "column": 22 }]
+    },
+    {
+      "message": "Argument \"monster\" got invalid value. Expected type \"Monster!\" found { Hydra: { name: \"someName\", age: 12 }, UnidentifiedMonster: Unit }. Exclusive input objects are not allowed to provide values for multiple fields.",
+      "locations": [{ "line": 4, "column": 5 }]
+    }
+  ]
+}
diff --git a/test/Feature/Inference/type-inference/resolving/input/success/query.gql b/test/Feature/Inference/type-inference/resolving/input/success/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/input/success/query.gql
@@ -0,0 +1,5 @@
+{
+  object: showMonster(monster: { Hydra: { name: "someName", age: 12 } })
+  record: showMonster(monster: { Cerberus: { name: "someName" } })
+  enum: showMonster(monster: { UnidentifiedMonster: Unit })
+}
diff --git a/test/Feature/Inference/type-inference/resolving/input/success/response.json b/test/Feature/Inference/type-inference/resolving/input/success/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/input/success/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "object": "MonsterHydra (Hydra {name = \"someName\", age = 12})",
+    "record": "Cerberus {name = \"someName\"}",
+    "enum": "UnidentifiedMonster"
+  }
+}
diff --git a/test/Feature/Inference/type-inference/resolving/object/query.gql b/test/Feature/Inference/type-inference/resolving/object/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/object/query.gql
@@ -0,0 +1,6 @@
+{
+  deity {
+    name
+    power
+  }
+}
diff --git a/test/Feature/Inference/type-inference/resolving/object/response.json b/test/Feature/Inference/type-inference/resolving/object/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/type-inference/resolving/object/response.json
@@ -0,0 +1,1 @@
+{ "data": { "deity": { "name": "Morpheus", "power": "Shapeshift" } } }
diff --git a/test/Feature/Inference/union-type/cannotBeSpreadOnType/query.gql b/test/Feature/Inference/union-type/cannotBeSpreadOnType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/cannotBeSpreadOnType/query.gql
@@ -0,0 +1,9 @@
+{
+  union {
+    ...FC
+  }
+}
+
+fragment FC on C {
+  cText
+}
diff --git a/test/Feature/Inference/union-type/cannotBeSpreadOnType/response.json b/test/Feature/Inference/union-type/cannotBeSpreadOnType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/cannotBeSpreadOnType/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Fragment \"FC\" cannot be spread here as objects of type \"A\", \"B\" can never be of type \"C\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 5
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Inference/union-type/fragmentOnAAndB/query.gql b/test/Feature/Inference/union-type/fragmentOnAAndB/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/fragmentOnAAndB/query.gql
@@ -0,0 +1,15 @@
+{
+  union {
+    __typename
+    ...FA
+    ...FB
+  }
+}
+
+fragment FA on A {
+  aText
+}
+
+fragment FB on B {
+  bText
+}
diff --git a/test/Feature/Inference/union-type/fragmentOnAAndB/response.json b/test/Feature/Inference/union-type/fragmentOnAAndB/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/fragmentOnAAndB/response.json
@@ -0,0 +1,14 @@
+{
+  "data": {
+    "union": [
+      {
+        "__typename": "A",
+        "aText": "at"
+      },
+      {
+        "__typename": "B",
+        "bText": "bt"
+      }
+    ]
+  }
+}
diff --git a/test/Feature/Inference/union-type/fragmentOnlyOnA/query.gql b/test/Feature/Inference/union-type/fragmentOnlyOnA/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/fragmentOnlyOnA/query.gql
@@ -0,0 +1,9 @@
+{
+  union {
+    ...FA
+  }
+}
+
+fragment FA on A {
+  aText
+}
diff --git a/test/Feature/Inference/union-type/fragmentOnlyOnA/response.json b/test/Feature/Inference/union-type/fragmentOnlyOnA/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/fragmentOnlyOnA/response.json
@@ -0,0 +1,13 @@
+{
+  "data": {
+    "union": [
+      {
+        "aText": "at",
+        "__typename": "A"
+      },
+      {
+        "__typename": "B"
+      }
+    ]
+  }
+}
diff --git a/test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/query.gql b/test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/query.gql
@@ -0,0 +1,7 @@
+{
+  union {
+    ... on C {
+      aText
+    }
+  }
+}
diff --git a/test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/response.json b/test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/inlineFragment/cannotBeSpreadOnType/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Fragment cannot be spread here as objects of type \"A\", \"B\" can never be of type \"C\".",
+      "locations": [{ "line": 3, "column": 5 }]
+    }
+  ]
+}
diff --git a/test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/query.gql b/test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/query.gql
@@ -0,0 +1,11 @@
+{
+  union {
+    __typename
+    ... on A {
+      aText
+    }
+    ... on B {
+      bText
+    }
+  }
+}
diff --git a/test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/response.json b/test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/inlineFragment/fragmentOnAAndB/response.json
@@ -0,0 +1,14 @@
+{
+  "data": {
+    "union": [
+      {
+        "__typename": "A",
+        "aText": "at"
+      },
+      {
+        "__typename": "B",
+        "bText": "bt"
+      }
+    ]
+  }
+}
diff --git a/test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/query.gql b/test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/query.gql
@@ -0,0 +1,10 @@
+{
+  union {
+    ...FA
+    aText
+  }
+}
+
+fragment FA on A {
+  aText
+}
diff --git a/test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/response.json b/test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/union-type/selectionWithoutFragmentNotAllowed/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Cannot query field \"aText\" on type \"Sum\".",
+      "locations": [
+        {
+          "line": 4,
+          "column": 5
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Inference/wrapped-type/ignoreMutationResolver/query.gql b/test/Feature/Inference/wrapped-type/ignoreMutationResolver/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/ignoreMutationResolver/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Mutation") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/wrapped-type/ignoreMutationResolver/response.json b/test/Feature/Inference/wrapped-type/ignoreMutationResolver/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/ignoreMutationResolver/response.json
@@ -0,0 +1,47 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "Mutation",
+      "fields": [
+        {
+          "name": "mut1",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WA",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "mut2",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WrappedIntInt",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "mut3",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WrappedWrappedTextIntText",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/wrapped-type/ignoreQueryResolver/query.gql b/test/Feature/Inference/wrapped-type/ignoreQueryResolver/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/ignoreQueryResolver/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Query") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/wrapped-type/ignoreQueryResolver/response.json b/test/Feature/Inference/wrapped-type/ignoreQueryResolver/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/ignoreQueryResolver/response.json
@@ -0,0 +1,51 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "Query",
+      "fields": [
+        {
+          "name": "a1",
+          "args": [],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "OBJECT",
+              "name": "WA",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "a2",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WrappedIntInt",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "a3",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WrappedWrappedTextIntText",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/query.gql b/test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  __type(name: "Subscription") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/response.json b/test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/ignoreSubscriptionResolver/response.json
@@ -0,0 +1,47 @@
+{
+  "data": {
+    "__type": {
+      "kind": "OBJECT",
+      "name": "Subscription",
+      "fields": [
+        {
+          "name": "sub1",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WA",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "sub2",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WrappedIntInt",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        },
+        {
+          "name": "sub3",
+          "args": [],
+          "type": {
+            "kind": "OBJECT",
+            "name": "WrappedWrappedTextIntText",
+            "ofType": null
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Inference/wrapped-type/validWrappedTypes/query.gql b/test/Feature/Inference/wrapped-type/validWrappedTypes/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/validWrappedTypes/query.gql
@@ -0,0 +1,5 @@
+{
+  a1 {
+    aText
+  }
+}
diff --git a/test/Feature/Inference/wrapped-type/validWrappedTypes/response.json b/test/Feature/Inference/wrapped-type/validWrappedTypes/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Inference/wrapped-type/validWrappedTypes/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "a1": {
+      "aText": "test1"
+    }
+  }
+}
diff --git a/test/Feature/Input/DefaultValue/API.hs b/test/Feature/Input/DefaultValue/API.hs
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/API.hs
+++ /dev/null
@@ -1,51 +0,0 @@
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DerivingStrategies #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.Input.DefaultValue.API
-  ( api,
-    rootResolver,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Document (importGQLDocument)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    ID (..),
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text (Text, pack)
-
-importGQLDocument "test/Feature/Input/DefaultValue/schema.gql"
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver = Query {user, testSimple},
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-  where
-    user :: Applicative m => m (Maybe (User m))
-    user =
-      pure
-        $ Just
-        $ User
-          { inputs = pure . pack . show
-          }
-    testSimple = pure . pack . show
-
------------------------------------
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/Input/DefaultValue/cases.json b/test/Feature/Input/DefaultValue/cases.json
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/cases.json
+++ /dev/null
@@ -1,22 +0,0 @@
-[
-  {
-    "path": "intorspection/input-simple",
-    "description": "test introspection of input Object"
-  },
-  {
-    "path": "intorspection/input-compound",
-    "description": "test introspection of input Object with inputObject as field"
-  },
-  {
-    "path": "intorspection/arguments",
-    "description": "test introspection of argument default values"
-  },
-  {
-    "path": "resolving/simple",
-    "description": "missing fields must be filled with default values"
-  },
-  {
-    "path": "resolving/compound",
-    "description": "missing fields must be filled with default values"
-  }
-]
diff --git a/test/Feature/Input/DefaultValue/intorspection/arguments/query.gql b/test/Feature/Input/DefaultValue/intorspection/arguments/query.gql
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/intorspection/arguments/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  type2: __type(name: "User") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/intorspection/arguments/response.json b/test/Feature/Input/DefaultValue/intorspection/arguments/response.json
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/intorspection/arguments/response.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "data": {
-    "type2": {
-      "kind": "OBJECT",
-      "name": "User",
-      "fields": [
-        {
-          "name": "inputs",
-          "args": [
-            {
-              "name": "inputCompound",
-              "type": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "INPUT_OBJECT",
-                  "name": "InputCompound",
-                  "ofType": null
-                }
-              },
-              "defaultValue": "{ inputField2: \"value from argument inputCompound\", inputField3: [{ fieldWithDefault: \"value2 from inputField3\", simpleField: EnumA }, { fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumA }], inputField4: [{ fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumB }] }"
-            },
-            {
-              "name": "input",
-              "type": {
-                "kind": "INPUT_OBJECT",
-                "name": "InputSimple",
-                "ofType": null
-              },
-              "defaultValue": null
-            },
-            {
-              "name": "comment",
-              "type": {
-                "kind": "SCALAR",
-                "name": "String",
-                "ofType": null
-              },
-              "defaultValue": "\"test string\""
-            }
-          ],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/intorspection/input-compound/query.gql b/test/Feature/Input/DefaultValue/intorspection/input-compound/query.gql
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/intorspection/input-compound/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  type2: __type(name: "InputCompound") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/intorspection/input-compound/response.json b/test/Feature/Input/DefaultValue/intorspection/input-compound/response.json
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/intorspection/input-compound/response.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "data": {
-    "type2": {
-      "kind": "INPUT_OBJECT",
-      "name": "InputCompound",
-      "fields": null,
-      "inputFields": [
-        {
-          "name": "inputField2",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "defaultValue": "\"value from inputField2\""
-        },
-        {
-          "name": "inputField3",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "INPUT_OBJECT",
-                "name": "InputSimple",
-                "ofType": null
-              }
-            }
-          },
-          "defaultValue": "[{ fieldWithDefault: \"value2 from inputField3\", simpleField: EnumA }, { fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumA }]"
-        },
-        {
-          "name": "inputField4",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "LIST",
-              "name": null,
-              "ofType": {
-                "kind": "INPUT_OBJECT",
-                "name": "InputSimple",
-                "ofType": null
-              }
-            }
-          },
-          "defaultValue": "[{ fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumB }]"
-        }
-      ],
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/intorspection/input-simple/query.gql b/test/Feature/Input/DefaultValue/intorspection/input-simple/query.gql
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/intorspection/input-simple/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  type2: __type(name: "InputSimple") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/intorspection/input-simple/response.json b/test/Feature/Input/DefaultValue/intorspection/input-simple/response.json
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/intorspection/input-simple/response.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "data": {
-    "type2": {
-      "kind": "INPUT_OBJECT",
-      "name": "InputSimple",
-      "fields": null,
-      "inputFields": [
-        {
-          "name": "fieldWithDefault",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "ID",
-              "ofType": null
-            }
-          },
-          "defaultValue": "\"value from fieldWithDefault\""
-        },
-        {
-          "name": "simpleField",
-          "type": {
-            "kind": "ENUM",
-            "name": "TestEnum",
-            "ofType": null
-          },
-          "defaultValue": null
-        }
-      ],
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/resolving/compound/query.gql b/test/Feature/Input/DefaultValue/resolving/compound/query.gql
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/resolving/compound/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query Compound {
-  user {
-    inputs(input: { simpleField: EnumA })
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/resolving/compound/response.json b/test/Feature/Input/DefaultValue/resolving/compound/response.json
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/resolving/compound/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "user": {
-      "inputs": "InputsArgs {inputCompound = InputCompound {inputField2 = \"value from argument inputCompound\", inputField3 = [Just (InputSimple {fieldWithDefault = ID {unpackID = \"value2 from inputField3\"}, simpleField = Just EnumA}),Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumA})], inputField4 = [Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumB})]}, input = Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumA}), comment = Just \"test string\"}"
-    }
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/resolving/simple/query.gql b/test/Feature/Input/DefaultValue/resolving/simple/query.gql
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/resolving/simple/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query Simple {
-  testSimple(i1: { simpleField: EnumA })
-}
diff --git a/test/Feature/Input/DefaultValue/resolving/simple/response.json b/test/Feature/Input/DefaultValue/resolving/simple/response.json
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/resolving/simple/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "testSimple": "TestSimpleArgs {i1 = Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumA}), i2 = Just \"test string\"}"
-  }
-}
diff --git a/test/Feature/Input/DefaultValue/schema.gql b/test/Feature/Input/DefaultValue/schema.gql
deleted file mode 100644
--- a/test/Feature/Input/DefaultValue/schema.gql
+++ /dev/null
@@ -1,34 +0,0 @@
-enum TestEnum {
-  EnumA
-  EnumB
-  EnumC
-}
-
-input InputSimple {
-  fieldWithDefault: ID! = "value from fieldWithDefault"
-  simpleField: TestEnum
-}
-
-input InputCompound {
-  inputField2: String! = "value from inputField2"
-  inputField3: [InputSimple]! = [
-    { fieldWithDefault: "value2 from inputField3", simpleField: EnumA }
-    { simpleField: EnumA }
-  ]
-  inputField4: [InputSimple]! = [{ simpleField: EnumB }]
-}
-
-type User {
-  inputs(
-    inputCompound: InputCompound! = {
-      inputField2: "value from argument inputCompound"
-    }
-    input: InputSimple
-    comment: String = "test string"
-  ): String!
-}
-
-type Query {
-  user: User
-  testSimple(i1: InputSimple, i2: String = "test string"): String!
-}
diff --git a/test/Feature/Input/DefaultValues.hs b/test/Feature/Input/DefaultValues.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/DefaultValues.hs
@@ -0,0 +1,51 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Input.DefaultValues
+  ( api,
+    rootResolver,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Document (importGQLDocument)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    ID (..),
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text (Text, pack)
+
+importGQLDocument "test/Feature/Input/default-values-schema.gql"
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver = Query {user, testSimple},
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+  where
+    user :: Applicative m => m (Maybe (User m))
+    user =
+      pure
+        $ Just
+        $ User
+          { inputs = pure . pack . show
+          }
+    testSimple = pure . pack . show
+
+-----------------------------------
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Input/Enum/API.hs b/test/Feature/Input/Enum/API.hs
deleted file mode 100644
--- a/test/Feature/Input/Enum/API.hs
+++ /dev/null
@@ -1,63 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.Input.Enum.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types (GQLRequest, GQLResponse, GQLType (..), RootResolver (..), Undefined (..))
-import GHC.Generics (Generic)
-
-data TwoCon
-  = LA
-  | LB
-  deriving (Show, Generic, GQLType)
-
-data ThreeCon
-  = T1
-  | T2
-  | T3
-  deriving (Show, Generic, GQLType)
-
-data Level
-  = L0
-  | L1
-  | L2
-  | L3
-  | L4
-  | L5
-  | L6
-  deriving (Show, Generic, GQLType)
-
--- types & args
-newtype TestArgs a = TestArgs
-  { level :: a
-  }
-  deriving (Generic, Show, GQLType)
-
--- query
-testRes :: Applicative m => TestArgs a -> m a
-testRes TestArgs {level} = pure level
-
--- resolver
-data Query m = Query
-  { test :: TestArgs Level -> m Level,
-    test2 :: TestArgs TwoCon -> m TwoCon,
-    test3 :: TestArgs ThreeCon -> m ThreeCon
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver = Query {test = testRes, test2 = testRes, test3 = testRes},
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/Input/Enum/cases.json b/test/Feature/Input/Enum/cases.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/cases.json
+++ /dev/null
@@ -1,58 +0,0 @@
-[
-  {
-    "path": "decode2Con",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decode3Con",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeMany/con0",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeMany/con1",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeMany/con2",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeMany/con3",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeMany/con4",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeMany/con5",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeMany/con6",
-    "description": "decode string to correct Haskell Enum Representation"
-  },
-  {
-    "path": "decodeInvalidValue",
-    "description": "fail on invalid enum value"
-  },
-  {
-    "path": "invalidStringInput",
-    "description": "fail on String inputs for Enum Values"
-  },
-  {
-    "path": "invalidStringDefaultValue",
-    "description": "fail on String inputs for Enum Values"
-  },
-  {
-    "path": "validEnumFromJSONVariable",
-    "description": "accept strings as enum if it is received from json variable"
-  },
-  {
-    "path": "invalidEnumFromJSONVariable",
-    "description": "reject invalid strings as enum from json variable"
-  }
-]
diff --git a/test/Feature/Input/Enum/decode2Con/query.gql b/test/Feature/Input/Enum/decode2Con/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decode2Con/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test2 (level:LA)
-}
diff --git a/test/Feature/Input/Enum/decode2Con/response.json b/test/Feature/Input/Enum/decode2Con/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decode2Con/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test2": "LA"
-  }
-}
diff --git a/test/Feature/Input/Enum/decode3Con/query.gql b/test/Feature/Input/Enum/decode3Con/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decode3Con/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test3 (level:T1)
-}
diff --git a/test/Feature/Input/Enum/decode3Con/response.json b/test/Feature/Input/Enum/decode3Con/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decode3Con/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test3": "T1"
-  }
-}
diff --git a/test/Feature/Input/Enum/decodeInvalidValue/query.gql b/test/Feature/Input/Enum/decodeInvalidValue/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeInvalidValue/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test2 ( level: LK )
-}
diff --git a/test/Feature/Input/Enum/decodeInvalidValue/response.json b/test/Feature/Input/Enum/decodeInvalidValue/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeInvalidValue/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"level\" got invalid value. Expected type \"TwoCon!\" found LK.",
-      "locations": [
-        {
-          "line": 2,
-          "column": 11
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con0/query.gql b/test/Feature/Input/Enum/decodeMany/con0/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con0/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test (level:L0)
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con0/response.json b/test/Feature/Input/Enum/decodeMany/con0/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con0/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test":  "L0"
-  }
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con1/query.gql b/test/Feature/Input/Enum/decodeMany/con1/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con1/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test (level:L1)
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con1/response.json b/test/Feature/Input/Enum/decodeMany/con1/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con1/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test": "L1"
-  }
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con2/query.gql b/test/Feature/Input/Enum/decodeMany/con2/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con2/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test (level:L2)
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con2/response.json b/test/Feature/Input/Enum/decodeMany/con2/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con2/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test": "L2"
-  }
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con3/query.gql b/test/Feature/Input/Enum/decodeMany/con3/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con3/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test (level:L3)
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con3/response.json b/test/Feature/Input/Enum/decodeMany/con3/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con3/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test": "L3"
-  }
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con4/query.gql b/test/Feature/Input/Enum/decodeMany/con4/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con4/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test (level:L4)
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con4/response.json b/test/Feature/Input/Enum/decodeMany/con4/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con4/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test": "L4"
-  }
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con5/query.gql b/test/Feature/Input/Enum/decodeMany/con5/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con5/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test (level:L5)
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con5/response.json b/test/Feature/Input/Enum/decodeMany/con5/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con5/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test": "L5"
-  }
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con6/query.gql b/test/Feature/Input/Enum/decodeMany/con6/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con6/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test (level:L6)
-}
diff --git a/test/Feature/Input/Enum/decodeMany/con6/response.json b/test/Feature/Input/Enum/decodeMany/con6/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/decodeMany/con6/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test": "L6"
-  }
-}
diff --git a/test/Feature/Input/Enum/invalidEnumFromJSONVariable/query.gql b/test/Feature/Input/Enum/invalidEnumFromJSONVariable/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/invalidEnumFromJSONVariable/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding($x: TwoCon!) {
-  test2(level: $x)
-}
diff --git a/test/Feature/Input/Enum/invalidEnumFromJSONVariable/response.json b/test/Feature/Input/Enum/invalidEnumFromJSONVariable/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/invalidEnumFromJSONVariable/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$x\" got invalid value. Expected type \"TwoCon!\" found \"BLA\".",
-      "locations": [{ "line": 1, "column": 21 }]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Enum/invalidEnumFromJSONVariable/variables.json b/test/Feature/Input/Enum/invalidEnumFromJSONVariable/variables.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/invalidEnumFromJSONVariable/variables.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{ "x": "BLA" }
diff --git a/test/Feature/Input/Enum/invalidStringDefaultValue/query.gql b/test/Feature/Input/Enum/invalidStringDefaultValue/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/invalidStringDefaultValue/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding($x: TwoCon! = "LA") {
-  test2(level: $x)
-}
diff --git a/test/Feature/Input/Enum/invalidStringDefaultValue/response.json b/test/Feature/Input/Enum/invalidStringDefaultValue/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/invalidStringDefaultValue/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$x\" got invalid value. Expected type \"TwoCon!\" found \"LA\".",
-      "locations": [{ "line": 1, "column": 21 }]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Enum/invalidStringInput/query.gql b/test/Feature/Input/Enum/invalidStringInput/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/invalidStringInput/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  test2(level: "LA")
-}
diff --git a/test/Feature/Input/Enum/invalidStringInput/response.json b/test/Feature/Input/Enum/invalidStringInput/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/invalidStringInput/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"level\" got invalid value. Expected type \"TwoCon!\" found \"LA\".",
-      "locations": [{ "line": 2, "column": 9 }]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Enum/validEnumFromJSONVariable/query.gql b/test/Feature/Input/Enum/validEnumFromJSONVariable/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Enum/validEnumFromJSONVariable/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding($x: TwoCon!) {
-  test2(level: $x)
-}
diff --git a/test/Feature/Input/Enum/validEnumFromJSONVariable/response.json b/test/Feature/Input/Enum/validEnumFromJSONVariable/response.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/validEnumFromJSONVariable/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "test2": "LA"
-  }
-}
diff --git a/test/Feature/Input/Enum/validEnumFromJSONVariable/variables.json b/test/Feature/Input/Enum/validEnumFromJSONVariable/variables.json
deleted file mode 100644
--- a/test/Feature/Input/Enum/validEnumFromJSONVariable/variables.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{ "x": "LA" }
diff --git a/test/Feature/Input/Enums.hs b/test/Feature/Input/Enums.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/Enums.hs
@@ -0,0 +1,63 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Input.Enums
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types (GQLRequest, GQLResponse, GQLType (..), RootResolver (..), Undefined (..))
+import GHC.Generics (Generic)
+
+data TwoCon
+  = LA
+  | LB
+  deriving (Show, Generic, GQLType)
+
+data ThreeCon
+  = T1
+  | T2
+  | T3
+  deriving (Show, Generic, GQLType)
+
+data Level
+  = L0
+  | L1
+  | L2
+  | L3
+  | L4
+  | L5
+  | L6
+  deriving (Show, Generic, GQLType)
+
+-- types & args
+newtype TestArgs a = TestArgs
+  { level :: a
+  }
+  deriving (Generic, Show, GQLType)
+
+-- query
+testRes :: Applicative m => TestArgs a -> m a
+testRes TestArgs {level} = pure level
+
+-- resolver
+data Query m = Query
+  { test :: TestArgs Level -> m Level,
+    test2 :: TestArgs TwoCon -> m TwoCon,
+    test3 :: TestArgs ThreeCon -> m ThreeCon
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver = Query {test = testRes, test2 = testRes, test3 = testRes},
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Input/Object/API.hs b/test/Feature/Input/Object/API.hs
deleted file mode 100644
--- a/test/Feature/Input/Object/API.hs
+++ /dev/null
@@ -1,57 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.Input.Object.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType (..),
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text
-  ( Text,
-    pack,
-  )
-import GHC.Generics (Generic)
-
-data InputObject = InputObject
-  { field :: Text,
-    nullableField :: Maybe Int,
-    recursive :: Maybe InputObject
-  }
-  deriving (Generic, Show, GQLType)
-
--- types & args
-newtype Arg a = Arg
-  { value :: a
-  }
-  deriving (Generic, Show, GQLType)
-
--- query
-testRes :: Show a => Applicative m => Arg a -> m Text
-testRes Arg {value} = pure $ pack $ show value
-
--- resolver
-newtype Query m = Query
-  { input :: Arg InputObject -> m Text
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver = Query {input = testRes},
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/Input/Object/cases.json b/test/Feature/Input/Object/cases.json
deleted file mode 100644
--- a/test/Feature/Input/Object/cases.json
+++ /dev/null
@@ -1,30 +0,0 @@
-[
-  {
-    "path": "undefinedField",
-    "description": "fail when field was not provided"
-  },
-  {
-    "path": "nullableUndefinedField",
-    "description": "dont fail when nullable field was not provided"
-  },
-  {
-    "path": "unknownField",
-    "description": "fail on unknown field"
-  },
-  {
-    "path": "unexpectedValue",
-    "description": "fail on value with unexpected type"
-  },
-  {
-    "path": "unexpectedVariable",
-    "description": "fail on use of variable with unexpected type"
-  },
-  {
-    "path": "resolveVariable",
-    "description": "resolve by variable"
-  },
-  {
-    "path": "resolveObject",
-    "description": "resolve object"
-  }
-]
diff --git a/test/Feature/Input/Object/nullableUndefinedField/query.gql b/test/Feature/Input/Object/nullableUndefinedField/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Object/nullableUndefinedField/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query NullableUndefinedField {
-  input(value: { field: "value" })
-}
diff --git a/test/Feature/Input/Object/nullableUndefinedField/response.json b/test/Feature/Input/Object/nullableUndefinedField/response.json
deleted file mode 100644
--- a/test/Feature/Input/Object/nullableUndefinedField/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "input": "InputObject {field = \"value\", nullableField = Nothing, recursive = Nothing}"
-  }
-}
diff --git a/test/Feature/Input/Object/resolveObject/query.gql b/test/Feature/Input/Object/resolveObject/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Object/resolveObject/query.gql
+++ /dev/null
@@ -1,4 +0,0 @@
-query ResolveObject {
-  i1: input(value: { field: "v1", nullableField: 123 })
-  i2: input(value: { field: "v2" , recursive: { field: "v3" } })
-}
diff --git a/test/Feature/Input/Object/resolveObject/response.json b/test/Feature/Input/Object/resolveObject/response.json
deleted file mode 100644
--- a/test/Feature/Input/Object/resolveObject/response.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "data": {
-    "i1": "InputObject {field = \"v1\", nullableField = Just 123, recursive = Nothing}",
-    "i2": "InputObject {field = \"v2\", nullableField = Nothing, recursive = Just (InputObject {field = \"v3\", nullableField = Nothing, recursive = Nothing})}"
-  }
-}
diff --git a/test/Feature/Input/Object/resolveVariable/query.gql b/test/Feature/Input/Object/resolveVariable/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Object/resolveVariable/query.gql
+++ /dev/null
@@ -1,4 +0,0 @@
-query ResolveVariable($v1: String!, $v2: Int!, $v3: Int) {
-  i1: input(value: { field: $v1, nullableField: $v2 })
-  i2: input(value: { field: "", nullableField: $v3 })
-}
diff --git a/test/Feature/Input/Object/resolveVariable/response.json b/test/Feature/Input/Object/resolveVariable/response.json
deleted file mode 100644
--- a/test/Feature/Input/Object/resolveVariable/response.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "data": {
-    "i1": "InputObject {field = \"string from variable\", nullableField = Just 123011, recursive = Nothing}",
-    "i2": "InputObject {field = \"\", nullableField = Nothing, recursive = Nothing}"
-  }
-}
diff --git a/test/Feature/Input/Object/resolveVariable/variables.json b/test/Feature/Input/Object/resolveVariable/variables.json
deleted file mode 100644
--- a/test/Feature/Input/Object/resolveVariable/variables.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "v1": "string from variable",
-  "v2": 123011
-}
diff --git a/test/Feature/Input/Object/undefinedField/query.gql b/test/Feature/Input/Object/undefinedField/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Object/undefinedField/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query UndefinedField {
-  i1: input(value: { nullableField: 1 })
-  i2: input(value: { })
-  i3: input(value: { field: "v2" , recursive: { field: "v3" , recursive: {}  } })
-}
diff --git a/test/Feature/Input/Object/undefinedField/response.json b/test/Feature/Input/Object/undefinedField/response.json
deleted file mode 100644
--- a/test/Feature/Input/Object/undefinedField/response.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"value\" got invalid value. Undefined Field \"field\".",
-      "locations": [
-        {
-          "line": 2,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. Undefined Field \"field\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. in field \"recursive.recursive\": Undefined Field \"field\".",
-      "locations": [
-        {
-          "line": 4,
-          "column": 13
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Object/unexpectedValue/query.gql b/test/Feature/Input/Object/unexpectedValue/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Object/unexpectedValue/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-query UnexpectedValue {
-  i1: input(value: "some text")
-  i2: input(value: 1)
-  i3: input(value: { field: {} })
-  i4: input(value: { field: 3 })
-  i5: input(value: { field: null } )
-  # deep recursive
-  i6: input(value: { field: "v2" , recursive: { field: "v3" , recursive: { field: 5 }  } })
-}
diff --git a/test/Feature/Input/Object/unexpectedValue/response.json b/test/Feature/Input/Object/unexpectedValue/response.json
deleted file mode 100644
--- a/test/Feature/Input/Object/unexpectedValue/response.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"value\" got invalid value. Expected type \"InputObject!\" found \"some text\".",
-      "locations": [
-        {
-          "line": 2,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. Expected type \"InputObject!\" found 1.",
-      "locations": [
-        {
-          "line": 3,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. in field \"field\": Expected type \"String!\" found {}.",
-      "locations": [
-        {
-          "line": 4,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. in field \"field\": Expected type \"String!\" found 3.",
-      "locations": [
-        {
-          "line": 5,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. in field \"field\": Expected type \"String!\" found null.",
-      "locations": [
-        {
-          "line": 6,
-          "column": 13
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. in field \"recursive.recursive.field\": Expected type \"String!\" found 5.",
-      "locations": [
-        {
-          "line": 8,
-          "column": 13
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Object/unexpectedVariable/query.gql b/test/Feature/Input/Object/unexpectedVariable/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Object/unexpectedVariable/query.gql
+++ /dev/null
@@ -1,4 +0,0 @@
-query Unexpectedvariable($v1: String, $v2: String) {
-  i1: input(value: { field: $v1, nullableField: 1 })
-  i2: input(value: { field: "", nullableField: $v2 })
-}
diff --git a/test/Feature/Input/Object/unexpectedVariable/response.json b/test/Feature/Input/Object/unexpectedVariable/response.json
deleted file mode 100644
--- a/test/Feature/Input/Object/unexpectedVariable/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" of type \"String\" used in position expecting type \"String!\".",
-      "locations": [{ "line": 2, "column": 29 }]
-    },
-    {
-      "message": "Variable \"$v2\" of type \"String\" used in position expecting type \"Int\".",
-      "locations": [{ "line": 3, "column": 48 }]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Object/unknownField/query.gql b/test/Feature/Input/Object/unknownField/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Object/unknownField/query.gql
+++ /dev/null
@@ -1,4 +0,0 @@
-query UnknownField {
-  i1: input( value: { moo: 1, field: "some field" })
-  i2: input(value: { field: "v2" , recursive: { field: "v3" , recursive: { field: "bal" , unkField : "test Unkown" }  } })
-}
diff --git a/test/Feature/Input/Object/unknownField/response.json b/test/Feature/Input/Object/unknownField/response.json
deleted file mode 100644
--- a/test/Feature/Input/Object/unknownField/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"value\" got invalid value. Unknown Field \"moo\".",
-      "locations": [
-        {
-          "line": 2,
-          "column": 14
-        }
-      ]
-    },
-    {
-      "message": "Argument \"value\" got invalid value. in field \"recursive.recursive\": Unknown Field \"unkField\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 13
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Objects.hs b/test/Feature/Input/Objects.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/Objects.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Input.Objects
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text
+  ( Text,
+    pack,
+  )
+import GHC.Generics (Generic)
+
+data InputObject = InputObject
+  { field :: Text,
+    nullableField :: Maybe Int,
+    recursive :: Maybe InputObject
+  }
+  deriving (Generic, Show, GQLType)
+
+-- types & args
+newtype Arg a = Arg
+  { value :: a
+  }
+  deriving (Generic, Show, GQLType)
+
+-- query
+testRes :: Show a => Applicative m => Arg a -> m Text
+testRes Arg {value} = pure $ pack $ show value
+
+-- resolver
+newtype Query m = Query
+  { input :: Arg InputObject -> m Text
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver = Query {input = testRes},
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Input/Scalar/API.hs b/test/Feature/Input/Scalar/API.hs
deleted file mode 100644
--- a/test/Feature/Input/Scalar/API.hs
+++ /dev/null
@@ -1,54 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.Input.Scalar.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType,
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text (Text)
-import GHC.Generics (Generic)
-
--- types & args
-newtype Arg a = Arg
-  { value :: a
-  }
-  deriving (Generic, Show, GQLType)
-
--- query
-testRes :: Applicative m => Arg a -> m a
-testRes Arg {value} = pure value
-
--- resolver
-data Query m = Query
-  { testFloat :: Arg Double -> m Double,
-    testInt :: Arg Int -> m Int,
-    testString :: Arg Text -> m Text
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver =
-        Query
-          { testFloat = testRes,
-            testInt = testRes,
-            testString = testRes
-          },
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/Input/Scalar/cases.json b/test/Feature/Input/Scalar/cases.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/cases.json
+++ /dev/null
@@ -1,30 +0,0 @@
-[
-  {
-    "path": "numbers/decodeFloat",
-    "description": "test signed float and float with expotential"
-  },
-  {
-    "path": "numbers/decodeInt",
-    "description": "test signed int and int with expotential"
-  },
-  {
-    "path": "strings/block",
-    "description": "parse block string"
-  },
-  {
-    "path": "strings/escaped",
-    "description": "parse escaped string string"
-  },
-  {
-    "path": "strings/regular",
-    "description": "parse regular string string"
-  },
-  {
-    "path": "strings/wrong-newline",
-    "description": "fail on newline on sinle line string"
-  },
-  {
-    "path": "strings/wrong-escaped",
-    "description": "fail on unsupported escaped char on sinle line string"
-  }
-]
diff --git a/test/Feature/Input/Scalar/numbers/decodeFloat/query.gql b/test/Feature/Input/Scalar/numbers/decodeFloat/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Scalar/numbers/decodeFloat/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-query ValidDecoding {
-  one: testFloat(value: 1.00)
-  negOne: testFloat(value: -1)
-  negNummber: testFloat(value: -1.235)
-  expNumber: testFloat(value: 0.3e5)
-  negExpNumber: testFloat(value: - 0.12e-35)
-}
diff --git a/test/Feature/Input/Scalar/numbers/decodeFloat/response.json b/test/Feature/Input/Scalar/numbers/decodeFloat/response.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/numbers/decodeFloat/response.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "data": {
-    "one": 1,
-    "negOne": -1,
-    "negNummber": -1.235,
-    "expNumber": 30000,
-    "negExpNumber": -1.2e-36
-  }
-}
diff --git a/test/Feature/Input/Scalar/numbers/decodeInt/query.gql b/test/Feature/Input/Scalar/numbers/decodeInt/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Scalar/numbers/decodeInt/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-query ValidDecoding {
-  one: testInt(value: 1)
-  negOne: testInt(value: -1)
-  negNummber: testInt(value: -1235)
-  expNumber: testInt(value: 123e5)
-  negExpNumber: testInt(value: - 123e5)
-}
diff --git a/test/Feature/Input/Scalar/numbers/decodeInt/response.json b/test/Feature/Input/Scalar/numbers/decodeInt/response.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/numbers/decodeInt/response.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "data": {
-    "one": 1,
-    "negOne": -1,
-    "negNummber": -1235,
-    "expNumber": 12300000,
-    "negExpNumber": -12300000
-  }
-}
diff --git a/test/Feature/Input/Scalar/strings/block/query.gql b/test/Feature/Input/Scalar/strings/block/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/block/query.gql
+++ /dev/null
@@ -1,20 +0,0 @@
-query ValidDecoding {
-  simple: testString(
-    value: """
-    bla bla \n
-    """
-  )
-  sophisticated: testString(
-    value: """
-    ewrwe
-        sdfd
-        werte
-      erqewr+
-
-      this is some text
-
-      bla
-          bla
-    """
-  )
-}
diff --git a/test/Feature/Input/Scalar/strings/block/response.json b/test/Feature/Input/Scalar/strings/block/response.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/block/response.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "data": {
-    "simple": "\n    bla bla \\n\n    ",
-    "sophisticated": "\n    ewrwe\n        sdfd\n        werte\n      erqewr+\n\n      this is some text\n\n      bla\n          bla\n    "
-  }
-}
diff --git a/test/Feature/Input/Scalar/strings/escaped/query.gql b/test/Feature/Input/Scalar/strings/escaped/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/escaped/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  testString(value: " a b  \n \\ / bla  ")
-}
diff --git a/test/Feature/Input/Scalar/strings/escaped/response.json b/test/Feature/Input/Scalar/strings/escaped/response.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/escaped/response.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{ "data": { "testString": " a b  \n \\ / bla  " } }
diff --git a/test/Feature/Input/Scalar/strings/regular/query.gql b/test/Feature/Input/Scalar/strings/regular/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/regular/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  testString(value: "some string bla b jasd qweq ")
-}
diff --git a/test/Feature/Input/Scalar/strings/regular/response.json b/test/Feature/Input/Scalar/strings/regular/response.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/regular/response.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "data": {
-    "testString": "some string bla b jasd qweq "
-  }
-}
diff --git a/test/Feature/Input/Scalar/strings/wrong-escaped/query.gql b/test/Feature/Input/Scalar/strings/wrong-escaped/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/wrong-escaped/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-query ValidDecoding {
-  testString(value: " a b  \k  / bla  ")
-}
diff --git a/test/Feature/Input/Scalar/strings/wrong-escaped/response.json b/test/Feature/Input/Scalar/strings/wrong-escaped/response.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/wrong-escaped/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "offset=50:\nunexpected 'k'\nexpecting '\"', '/', '\\', 'b', 'f', 'n', 'r', or 't'\n",
-      "locations": [{ "line": 2, "column": 29 }]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Scalar/strings/wrong-newline/query.gql b/test/Feature/Input/Scalar/strings/wrong-newline/query.gql
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/wrong-newline/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-query ValidDecoding {
-  testString
-    (value: 
-      "some string bla b 
-      jasd qweq "
-    )
-}
diff --git a/test/Feature/Input/Scalar/strings/wrong-newline/response.json b/test/Feature/Input/Scalar/strings/wrong-newline/response.json
deleted file mode 100644
--- a/test/Feature/Input/Scalar/strings/wrong-newline/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "offset=73:\nunexpected newline\nexpecting '\"' or EscapedChar\n",
-      "locations": [{ "line": 4, "column": 26 }]
-    }
-  ]
-}
diff --git a/test/Feature/Input/Scalars.hs b/test/Feature/Input/Scalars.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/Scalars.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Input.Scalars
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType,
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text (Text)
+import GHC.Generics (Generic)
+
+-- types & args
+newtype Arg a = Arg
+  { value :: a
+  }
+  deriving (Generic, Show, GQLType)
+
+-- query
+testRes :: Applicative m => Arg a -> m a
+testRes Arg {value} = pure value
+
+-- resolver
+data Query m = Query
+  { testFloat :: Arg Double -> m Double,
+    testInt :: Arg Int -> m Int,
+    testString :: Arg Text -> m Text
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { testFloat = testRes,
+            testInt = testRes,
+            testString = testRes
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Input/Variables.hs b/test/Feature/Input/Variables.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/Variables.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.Input.Variables
+  ( api,
+  )
+where
+
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Types
+  ( GQLRequest,
+    GQLResponse,
+    GQLType (..),
+    ResolverQ,
+    RootResolver (..),
+    Undefined (..),
+  )
+import Data.Text (Text)
+import GHC.Generics (Generic)
+
+data F1Args = F1Args
+  { arg1 :: Text,
+    arg2 :: Maybe Int
+  }
+  deriving (Generic, GQLType)
+
+data F2Args = F2Args
+  { argList :: [Text],
+    argNestedList :: [Maybe [[Int]]]
+  }
+  deriving (Generic, GQLType)
+
+data A = A
+  { a1 :: F1Args -> ResolverQ () IO Text,
+    a2 :: F2Args -> ResolverQ () IO Int
+  }
+  deriving (Generic, GQLType)
+
+newtype Query (m :: * -> *) = Query
+  { q1 :: A
+  }
+  deriving (Generic, GQLType)
+
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+  RootResolver
+    { queryResolver =
+        Query
+          { q1 =
+              A
+                { a1 = const $ return "a1Test",
+                  a2 = const $ return 1
+                }
+          },
+      mutationResolver = Undefined,
+      subscriptionResolver = Undefined
+    }
+
+api :: GQLRequest -> IO GQLResponse
+api = interpreter rootResolver
diff --git a/test/Feature/Input/default-values-schema.gql b/test/Feature/Input/default-values-schema.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values-schema.gql
@@ -0,0 +1,34 @@
+enum TestEnum {
+  EnumA
+  EnumB
+  EnumC
+}
+
+input InputSimple {
+  fieldWithDefault: ID! = "value from fieldWithDefault"
+  simpleField: TestEnum
+}
+
+input InputCompound {
+  inputField2: String! = "value from inputField2"
+  inputField3: [InputSimple]! = [
+    { fieldWithDefault: "value2 from inputField3", simpleField: EnumA }
+    { simpleField: EnumA }
+  ]
+  inputField4: [InputSimple]! = [{ simpleField: EnumB }]
+}
+
+type User {
+  inputs(
+    inputCompound: InputCompound! = {
+      inputField2: "value from argument inputCompound"
+    }
+    input: InputSimple
+    comment: String = "test string"
+  ): String!
+}
+
+type Query {
+  user: User
+  testSimple(i1: InputSimple, i2: String = "test string"): String!
+}
diff --git a/test/Feature/Input/default-values/intorspection/arguments/query.gql b/test/Feature/Input/default-values/intorspection/arguments/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/intorspection/arguments/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  type2: __type(name: "User") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Input/default-values/intorspection/arguments/response.json b/test/Feature/Input/default-values/intorspection/arguments/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/intorspection/arguments/response.json
@@ -0,0 +1,61 @@
+{
+  "data": {
+    "type2": {
+      "kind": "OBJECT",
+      "name": "User",
+      "fields": [
+        {
+          "name": "inputs",
+          "args": [
+            {
+              "name": "inputCompound",
+              "type": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "InputCompound",
+                  "ofType": null
+                }
+              },
+              "defaultValue": "{ inputField2: \"value from argument inputCompound\", inputField3: [{ fieldWithDefault: \"value2 from inputField3\", simpleField: EnumA }, { fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumA }], inputField4: [{ fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumB }] }"
+            },
+            {
+              "name": "input",
+              "type": {
+                "kind": "INPUT_OBJECT",
+                "name": "InputSimple",
+                "ofType": null
+              },
+              "defaultValue": null
+            },
+            {
+              "name": "comment",
+              "type": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              },
+              "defaultValue": "\"test string\""
+            }
+          ],
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "isDeprecated": false,
+          "deprecationReason": null
+        }
+      ],
+      "inputFields": null,
+      "interfaces": [],
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Input/default-values/intorspection/input-compound/query.gql b/test/Feature/Input/default-values/intorspection/input-compound/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/intorspection/input-compound/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  type2: __type(name: "InputCompound") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Input/default-values/intorspection/input-compound/response.json b/test/Feature/Input/default-values/intorspection/input-compound/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/intorspection/input-compound/response.json
@@ -0,0 +1,61 @@
+{
+  "data": {
+    "type2": {
+      "kind": "INPUT_OBJECT",
+      "name": "InputCompound",
+      "fields": null,
+      "inputFields": [
+        {
+          "name": "inputField2",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            }
+          },
+          "defaultValue": "\"value from inputField2\""
+        },
+        {
+          "name": "inputField3",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "InputSimple",
+                "ofType": null
+              }
+            }
+          },
+          "defaultValue": "[{ fieldWithDefault: \"value2 from inputField3\", simpleField: EnumA }, { fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumA }]"
+        },
+        {
+          "name": "inputField4",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "InputSimple",
+                "ofType": null
+              }
+            }
+          },
+          "defaultValue": "[{ fieldWithDefault: \"value from fieldWithDefault\", simpleField: EnumB }]"
+        }
+      ],
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Input/default-values/intorspection/input-simple/query.gql b/test/Feature/Input/default-values/intorspection/input-simple/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/intorspection/input-simple/query.gql
@@ -0,0 +1,76 @@
+query Get__Type {
+  type2: __type(name: "InputSimple") {
+    ...FullType
+  }
+}
+
+fragment FullType on __Type {
+  kind
+  name
+  fields(includeDeprecated: true) {
+    name
+    args {
+      ...InputValue
+    }
+    type {
+      ...TypeRef
+    }
+    isDeprecated
+    deprecationReason
+  }
+  inputFields {
+    ...InputValue
+  }
+  interfaces {
+    ...TypeRef
+  }
+  enumValues(includeDeprecated: true) {
+    name
+    isDeprecated
+    deprecationReason
+  }
+  possibleTypes {
+    ...TypeRef
+  }
+}
+
+fragment InputValue on __InputValue {
+  name
+  type {
+    ...TypeRef
+  }
+  defaultValue
+}
+
+fragment TypeRef on __Type {
+  kind
+  name
+  ofType {
+    kind
+    name
+    ofType {
+      kind
+      name
+      ofType {
+        kind
+        name
+        ofType {
+          kind
+          name
+          ofType {
+            kind
+            name
+            ofType {
+              kind
+              name
+              ofType {
+                kind
+                name
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/Input/default-values/intorspection/input-simple/response.json b/test/Feature/Input/default-values/intorspection/input-simple/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/intorspection/input-simple/response.json
@@ -0,0 +1,36 @@
+{
+  "data": {
+    "type2": {
+      "kind": "INPUT_OBJECT",
+      "name": "InputSimple",
+      "fields": null,
+      "inputFields": [
+        {
+          "name": "fieldWithDefault",
+          "type": {
+            "kind": "NON_NULL",
+            "name": null,
+            "ofType": {
+              "kind": "SCALAR",
+              "name": "ID",
+              "ofType": null
+            }
+          },
+          "defaultValue": "\"value from fieldWithDefault\""
+        },
+        {
+          "name": "simpleField",
+          "type": {
+            "kind": "ENUM",
+            "name": "TestEnum",
+            "ofType": null
+          },
+          "defaultValue": null
+        }
+      ],
+      "interfaces": null,
+      "enumValues": null,
+      "possibleTypes": null
+    }
+  }
+}
diff --git a/test/Feature/Input/default-values/resolving/compound/query.gql b/test/Feature/Input/default-values/resolving/compound/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/resolving/compound/query.gql
@@ -0,0 +1,5 @@
+query Compound {
+  user {
+    inputs(input: { simpleField: EnumA })
+  }
+}
diff --git a/test/Feature/Input/default-values/resolving/compound/response.json b/test/Feature/Input/default-values/resolving/compound/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/resolving/compound/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "user": {
+      "inputs": "InputsArgs {inputCompound = InputCompound {inputField2 = \"value from argument inputCompound\", inputField3 = [Just (InputSimple {fieldWithDefault = ID {unpackID = \"value2 from inputField3\"}, simpleField = Just EnumA}),Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumA})], inputField4 = [Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumB})]}, input = Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumA}), comment = Just \"test string\"}"
+    }
+  }
+}
diff --git a/test/Feature/Input/default-values/resolving/simple/query.gql b/test/Feature/Input/default-values/resolving/simple/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/resolving/simple/query.gql
@@ -0,0 +1,3 @@
+query Simple {
+  testSimple(i1: { simpleField: EnumA })
+}
diff --git a/test/Feature/Input/default-values/resolving/simple/response.json b/test/Feature/Input/default-values/resolving/simple/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/default-values/resolving/simple/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "testSimple": "TestSimpleArgs {i1 = Just (InputSimple {fieldWithDefault = ID {unpackID = \"value from fieldWithDefault\"}, simpleField = Just EnumA}), i2 = Just \"test string\"}"
+  }
+}
diff --git a/test/Feature/Input/enums/decode2Con/query.gql b/test/Feature/Input/enums/decode2Con/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decode2Con/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test2 (level:LA)
+}
diff --git a/test/Feature/Input/enums/decode2Con/response.json b/test/Feature/Input/enums/decode2Con/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decode2Con/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test2": "LA"
+  }
+}
diff --git a/test/Feature/Input/enums/decode3Con/query.gql b/test/Feature/Input/enums/decode3Con/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decode3Con/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test3 (level:T1)
+}
diff --git a/test/Feature/Input/enums/decode3Con/response.json b/test/Feature/Input/enums/decode3Con/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decode3Con/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test3": "T1"
+  }
+}
diff --git a/test/Feature/Input/enums/decodeInvalidValue/query.gql b/test/Feature/Input/enums/decodeInvalidValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeInvalidValue/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test2 ( level: LK )
+}
diff --git a/test/Feature/Input/enums/decodeInvalidValue/response.json b/test/Feature/Input/enums/decodeInvalidValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeInvalidValue/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"level\" got invalid value. Expected type \"TwoCon!\" found LK.",
+      "locations": [
+        {
+          "line": 2,
+          "column": 11
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/enums/decodeMany/con0/query.gql b/test/Feature/Input/enums/decodeMany/con0/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con0/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test (level:L0)
+}
diff --git a/test/Feature/Input/enums/decodeMany/con0/response.json b/test/Feature/Input/enums/decodeMany/con0/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con0/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test":  "L0"
+  }
+}
diff --git a/test/Feature/Input/enums/decodeMany/con1/query.gql b/test/Feature/Input/enums/decodeMany/con1/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con1/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test (level:L1)
+}
diff --git a/test/Feature/Input/enums/decodeMany/con1/response.json b/test/Feature/Input/enums/decodeMany/con1/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con1/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test": "L1"
+  }
+}
diff --git a/test/Feature/Input/enums/decodeMany/con2/query.gql b/test/Feature/Input/enums/decodeMany/con2/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con2/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test (level:L2)
+}
diff --git a/test/Feature/Input/enums/decodeMany/con2/response.json b/test/Feature/Input/enums/decodeMany/con2/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con2/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test": "L2"
+  }
+}
diff --git a/test/Feature/Input/enums/decodeMany/con3/query.gql b/test/Feature/Input/enums/decodeMany/con3/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con3/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test (level:L3)
+}
diff --git a/test/Feature/Input/enums/decodeMany/con3/response.json b/test/Feature/Input/enums/decodeMany/con3/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con3/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test": "L3"
+  }
+}
diff --git a/test/Feature/Input/enums/decodeMany/con4/query.gql b/test/Feature/Input/enums/decodeMany/con4/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con4/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test (level:L4)
+}
diff --git a/test/Feature/Input/enums/decodeMany/con4/response.json b/test/Feature/Input/enums/decodeMany/con4/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con4/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test": "L4"
+  }
+}
diff --git a/test/Feature/Input/enums/decodeMany/con5/query.gql b/test/Feature/Input/enums/decodeMany/con5/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con5/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test (level:L5)
+}
diff --git a/test/Feature/Input/enums/decodeMany/con5/response.json b/test/Feature/Input/enums/decodeMany/con5/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con5/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test": "L5"
+  }
+}
diff --git a/test/Feature/Input/enums/decodeMany/con6/query.gql b/test/Feature/Input/enums/decodeMany/con6/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con6/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test (level:L6)
+}
diff --git a/test/Feature/Input/enums/decodeMany/con6/response.json b/test/Feature/Input/enums/decodeMany/con6/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/decodeMany/con6/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test": "L6"
+  }
+}
diff --git a/test/Feature/Input/enums/invalidEnumFromJSONVariable/query.gql b/test/Feature/Input/enums/invalidEnumFromJSONVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/invalidEnumFromJSONVariable/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding($x: TwoCon!) {
+  test2(level: $x)
+}
diff --git a/test/Feature/Input/enums/invalidEnumFromJSONVariable/response.json b/test/Feature/Input/enums/invalidEnumFromJSONVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/invalidEnumFromJSONVariable/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$x\" got invalid value. Expected type \"TwoCon!\" found \"BLA\".",
+      "locations": [{ "line": 1, "column": 21 }]
+    }
+  ]
+}
diff --git a/test/Feature/Input/enums/invalidEnumFromJSONVariable/variables.json b/test/Feature/Input/enums/invalidEnumFromJSONVariable/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/invalidEnumFromJSONVariable/variables.json
@@ -0,0 +1,1 @@
+{ "x": "BLA" }
diff --git a/test/Feature/Input/enums/invalidStringDefaultValue/query.gql b/test/Feature/Input/enums/invalidStringDefaultValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/invalidStringDefaultValue/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding($x: TwoCon! = "LA") {
+  test2(level: $x)
+}
diff --git a/test/Feature/Input/enums/invalidStringDefaultValue/response.json b/test/Feature/Input/enums/invalidStringDefaultValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/invalidStringDefaultValue/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$x\" got invalid value. Expected type \"TwoCon!\" found \"LA\".",
+      "locations": [{ "line": 1, "column": 21 }]
+    }
+  ]
+}
diff --git a/test/Feature/Input/enums/invalidStringInput/query.gql b/test/Feature/Input/enums/invalidStringInput/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/invalidStringInput/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  test2(level: "LA")
+}
diff --git a/test/Feature/Input/enums/invalidStringInput/response.json b/test/Feature/Input/enums/invalidStringInput/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/invalidStringInput/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"level\" got invalid value. Expected type \"TwoCon!\" found \"LA\".",
+      "locations": [{ "line": 2, "column": 9 }]
+    }
+  ]
+}
diff --git a/test/Feature/Input/enums/validEnumFromJSONVariable/query.gql b/test/Feature/Input/enums/validEnumFromJSONVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/validEnumFromJSONVariable/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding($x: TwoCon!) {
+  test2(level: $x)
+}
diff --git a/test/Feature/Input/enums/validEnumFromJSONVariable/response.json b/test/Feature/Input/enums/validEnumFromJSONVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/validEnumFromJSONVariable/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "test2": "LA"
+  }
+}
diff --git a/test/Feature/Input/enums/validEnumFromJSONVariable/variables.json b/test/Feature/Input/enums/validEnumFromJSONVariable/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/enums/validEnumFromJSONVariable/variables.json
@@ -0,0 +1,1 @@
+{ "x": "LA" }
diff --git a/test/Feature/Input/objects/nullableUndefinedField/query.gql b/test/Feature/Input/objects/nullableUndefinedField/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/nullableUndefinedField/query.gql
@@ -0,0 +1,3 @@
+query NullableUndefinedField {
+  input(value: { field: "value" })
+}
diff --git a/test/Feature/Input/objects/nullableUndefinedField/response.json b/test/Feature/Input/objects/nullableUndefinedField/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/nullableUndefinedField/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "input": "InputObject {field = \"value\", nullableField = Nothing, recursive = Nothing}"
+  }
+}
diff --git a/test/Feature/Input/objects/resolveObject/query.gql b/test/Feature/Input/objects/resolveObject/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/resolveObject/query.gql
@@ -0,0 +1,4 @@
+query ResolveObject {
+  i1: input(value: { field: "v1", nullableField: 123 })
+  i2: input(value: { field: "v2" , recursive: { field: "v3" } })
+}
diff --git a/test/Feature/Input/objects/resolveObject/response.json b/test/Feature/Input/objects/resolveObject/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/resolveObject/response.json
@@ -0,0 +1,6 @@
+{
+  "data": {
+    "i1": "InputObject {field = \"v1\", nullableField = Just 123, recursive = Nothing}",
+    "i2": "InputObject {field = \"v2\", nullableField = Nothing, recursive = Just (InputObject {field = \"v3\", nullableField = Nothing, recursive = Nothing})}"
+  }
+}
diff --git a/test/Feature/Input/objects/resolveVariable/query.gql b/test/Feature/Input/objects/resolveVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/resolveVariable/query.gql
@@ -0,0 +1,4 @@
+query ResolveVariable($v1: String!, $v2: Int!, $v3: Int) {
+  i1: input(value: { field: $v1, nullableField: $v2 })
+  i2: input(value: { field: "", nullableField: $v3 })
+}
diff --git a/test/Feature/Input/objects/resolveVariable/response.json b/test/Feature/Input/objects/resolveVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/resolveVariable/response.json
@@ -0,0 +1,6 @@
+{
+  "data": {
+    "i1": "InputObject {field = \"string from variable\", nullableField = Just 123011, recursive = Nothing}",
+    "i2": "InputObject {field = \"\", nullableField = Nothing, recursive = Nothing}"
+  }
+}
diff --git a/test/Feature/Input/objects/resolveVariable/variables.json b/test/Feature/Input/objects/resolveVariable/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/resolveVariable/variables.json
@@ -0,0 +1,4 @@
+{
+  "v1": "string from variable",
+  "v2": 123011
+}
diff --git a/test/Feature/Input/objects/undefinedField/query.gql b/test/Feature/Input/objects/undefinedField/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/undefinedField/query.gql
@@ -0,0 +1,5 @@
+query UndefinedField {
+  i1: input(value: { nullableField: 1 })
+  i2: input(value: { })
+  i3: input(value: { field: "v2" , recursive: { field: "v3" , recursive: {}  } })
+}
diff --git a/test/Feature/Input/objects/undefinedField/response.json b/test/Feature/Input/objects/undefinedField/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/undefinedField/response.json
@@ -0,0 +1,31 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"value\" got invalid value. Undefined Field \"field\".",
+      "locations": [
+        {
+          "line": 2,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. Undefined Field \"field\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. in field \"recursive.recursive\": Undefined Field \"field\".",
+      "locations": [
+        {
+          "line": 4,
+          "column": 13
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/objects/unexpectedValue/query.gql b/test/Feature/Input/objects/unexpectedValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/unexpectedValue/query.gql
@@ -0,0 +1,9 @@
+query UnexpectedValue {
+  i1: input(value: "some text")
+  i2: input(value: 1)
+  i3: input(value: { field: {} })
+  i4: input(value: { field: 3 })
+  i5: input(value: { field: null } )
+  # deep recursive
+  i6: input(value: { field: "v2" , recursive: { field: "v3" , recursive: { field: 5 }  } })
+}
diff --git a/test/Feature/Input/objects/unexpectedValue/response.json b/test/Feature/Input/objects/unexpectedValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/unexpectedValue/response.json
@@ -0,0 +1,58 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"value\" got invalid value. Expected type \"InputObject!\" found \"some text\".",
+      "locations": [
+        {
+          "line": 2,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. Expected type \"InputObject!\" found 1.",
+      "locations": [
+        {
+          "line": 3,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. in field \"field\": Expected type \"String!\" found {}.",
+      "locations": [
+        {
+          "line": 4,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. in field \"field\": Expected type \"String!\" found 3.",
+      "locations": [
+        {
+          "line": 5,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. in field \"field\": Expected type \"String!\" found null.",
+      "locations": [
+        {
+          "line": 6,
+          "column": 13
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. in field \"recursive.recursive.field\": Expected type \"String!\" found 5.",
+      "locations": [
+        {
+          "line": 8,
+          "column": 13
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/objects/unexpectedVariable/query.gql b/test/Feature/Input/objects/unexpectedVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/unexpectedVariable/query.gql
@@ -0,0 +1,4 @@
+query Unexpectedvariable($v1: String, $v2: String) {
+  i1: input(value: { field: $v1, nullableField: 1 })
+  i2: input(value: { field: "", nullableField: $v2 })
+}
diff --git a/test/Feature/Input/objects/unexpectedVariable/response.json b/test/Feature/Input/objects/unexpectedVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/unexpectedVariable/response.json
@@ -0,0 +1,12 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" of type \"String\" used in position expecting type \"String!\".",
+      "locations": [{ "line": 2, "column": 29 }]
+    },
+    {
+      "message": "Variable \"$v2\" of type \"String\" used in position expecting type \"Int\".",
+      "locations": [{ "line": 3, "column": 48 }]
+    }
+  ]
+}
diff --git a/test/Feature/Input/objects/unknownField/query.gql b/test/Feature/Input/objects/unknownField/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/unknownField/query.gql
@@ -0,0 +1,4 @@
+query UnknownField {
+  i1: input( value: { moo: 1, field: "some field" })
+  i2: input(value: { field: "v2" , recursive: { field: "v3" , recursive: { field: "bal" , unkField : "test Unkown" }  } })
+}
diff --git a/test/Feature/Input/objects/unknownField/response.json b/test/Feature/Input/objects/unknownField/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/objects/unknownField/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "Argument \"value\" got invalid value. Unknown Field \"moo\".",
+      "locations": [
+        {
+          "line": 2,
+          "column": 14
+        }
+      ]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. in field \"recursive.recursive\": Unknown Field \"unkField\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 13
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/scalars/numbers/decodeFloat/query.gql b/test/Feature/Input/scalars/numbers/decodeFloat/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/numbers/decodeFloat/query.gql
@@ -0,0 +1,7 @@
+query ValidDecoding {
+  one: testFloat(value: 1.00)
+  negOne: testFloat(value: -1)
+  negNummber: testFloat(value: -1.235)
+  expNumber: testFloat(value: 0.3e5)
+  negExpNumber: testFloat(value: - 0.12e-35)
+}
diff --git a/test/Feature/Input/scalars/numbers/decodeFloat/response.json b/test/Feature/Input/scalars/numbers/decodeFloat/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/numbers/decodeFloat/response.json
@@ -0,0 +1,9 @@
+{
+  "data": {
+    "one": 1,
+    "negOne": -1,
+    "negNummber": -1.235,
+    "expNumber": 30000,
+    "negExpNumber": -1.2e-36
+  }
+}
diff --git a/test/Feature/Input/scalars/numbers/decodeInt/query.gql b/test/Feature/Input/scalars/numbers/decodeInt/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/numbers/decodeInt/query.gql
@@ -0,0 +1,7 @@
+query ValidDecoding {
+  one: testInt(value: 1)
+  negOne: testInt(value: -1)
+  negNummber: testInt(value: -1235)
+  expNumber: testInt(value: 123e5)
+  negExpNumber: testInt(value: - 123e5)
+}
diff --git a/test/Feature/Input/scalars/numbers/decodeInt/response.json b/test/Feature/Input/scalars/numbers/decodeInt/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/numbers/decodeInt/response.json
@@ -0,0 +1,9 @@
+{
+  "data": {
+    "one": 1,
+    "negOne": -1,
+    "negNummber": -1235,
+    "expNumber": 12300000,
+    "negExpNumber": -12300000
+  }
+}
diff --git a/test/Feature/Input/scalars/strings/block/query.gql b/test/Feature/Input/scalars/strings/block/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/block/query.gql
@@ -0,0 +1,20 @@
+query ValidDecoding {
+  simple: testString(
+    value: """
+    bla bla \n
+    """
+  )
+  sophisticated: testString(
+    value: """
+    ewrwe
+        sdfd
+        werte
+      erqewr+
+
+      this is some text
+
+      bla
+          bla
+    """
+  )
+}
diff --git a/test/Feature/Input/scalars/strings/block/response.json b/test/Feature/Input/scalars/strings/block/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/block/response.json
@@ -0,0 +1,6 @@
+{
+  "data": {
+    "simple": "\n    bla bla \\n\n    ",
+    "sophisticated": "\n    ewrwe\n        sdfd\n        werte\n      erqewr+\n\n      this is some text\n\n      bla\n          bla\n    "
+  }
+}
diff --git a/test/Feature/Input/scalars/strings/escaped/query.gql b/test/Feature/Input/scalars/strings/escaped/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/escaped/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  testString(value: " a b  \n \\ / bla  ")
+}
diff --git a/test/Feature/Input/scalars/strings/escaped/response.json b/test/Feature/Input/scalars/strings/escaped/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/escaped/response.json
@@ -0,0 +1,1 @@
+{ "data": { "testString": " a b  \n \\ / bla  " } }
diff --git a/test/Feature/Input/scalars/strings/regular/query.gql b/test/Feature/Input/scalars/strings/regular/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/regular/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  testString(value: "some string bla b jasd qweq ")
+}
diff --git a/test/Feature/Input/scalars/strings/regular/response.json b/test/Feature/Input/scalars/strings/regular/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/regular/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "testString": "some string bla b jasd qweq "
+  }
+}
diff --git a/test/Feature/Input/scalars/strings/wrong-escaped/query.gql b/test/Feature/Input/scalars/strings/wrong-escaped/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/wrong-escaped/query.gql
@@ -0,0 +1,3 @@
+query ValidDecoding {
+  testString(value: " a b  \k  / bla  ")
+}
diff --git a/test/Feature/Input/scalars/strings/wrong-escaped/response.json b/test/Feature/Input/scalars/strings/wrong-escaped/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/wrong-escaped/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "offset=50:\nunexpected 'k'\nexpecting '\"', '/', '\\', 'b', 'f', 'n', 'r', or 't'\n",
+      "locations": [{ "line": 2, "column": 29 }]
+    }
+  ]
+}
diff --git a/test/Feature/Input/scalars/strings/wrong-newline/query.gql b/test/Feature/Input/scalars/strings/wrong-newline/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/wrong-newline/query.gql
@@ -0,0 +1,7 @@
+query ValidDecoding {
+  testString
+    (value: 
+      "some string bla b 
+      jasd qweq "
+    )
+}
diff --git a/test/Feature/Input/scalars/strings/wrong-newline/response.json b/test/Feature/Input/scalars/strings/wrong-newline/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/scalars/strings/wrong-newline/response.json
@@ -0,0 +1,8 @@
+{
+  "errors": [
+    {
+      "message": "offset=74:\nunexpected newline\n",
+      "locations": [{ "line": 5, "column": 1 }]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/equalType/query.gql b/test/Feature/Input/variables/incompatibleType/equalType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/equalType/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [[[Int!]!]]! ) {
+  q1 {
+    a2(argList: [],argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/incompatibleType/equalType/response.json b/test/Feature/Input/variables/incompatibleType/equalType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/equalType/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a2": 1
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/incompatibleType/equalType/variables.json b/test/Feature/Input/variables/incompatibleType/equalType/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/equalType/variables.json
@@ -0,0 +1,4 @@
+{
+  "v1": [
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/stricterType/query.gql b/test/Feature/Input/variables/incompatibleType/stricterType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/stricterType/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [[[Int!]!]!]! ) {
+  q1 {
+    a2(argList: [],argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/incompatibleType/stricterType/response.json b/test/Feature/Input/variables/incompatibleType/stricterType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/stricterType/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a2": 1
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/incompatibleType/stricterType/variables.json b/test/Feature/Input/variables/incompatibleType/stricterType/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/stricterType/variables.json
@@ -0,0 +1,4 @@
+{
+  "v1": [
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType1/query.gql b/test/Feature/Input/variables/incompatibleType/weakerType1/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType1/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [[[Int]!]!]! ) {
+  q1 {
+    a2(argList: [],argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType1/response.json b/test/Feature/Input/variables/incompatibleType/weakerType1/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType1/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" of type \"[[[Int]!]!]!\" used in position expecting type \"[[[Int!]!]]!\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 35
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType1/variables.json b/test/Feature/Input/variables/incompatibleType/weakerType1/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType1/variables.json
@@ -0,0 +1,4 @@
+{
+  "v1": [
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType2/query.gql b/test/Feature/Input/variables/incompatibleType/weakerType2/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType2/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [[[Int!]!]!] ) {
+  q1 {
+    a2(argList: [],argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType2/response.json b/test/Feature/Input/variables/incompatibleType/weakerType2/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType2/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" of type \"[[[Int!]!]!]\" used in position expecting type \"[[[Int!]!]]!\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 35
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType2/variables.json b/test/Feature/Input/variables/incompatibleType/weakerType2/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType2/variables.json
@@ -0,0 +1,4 @@
+{
+  "v1": [
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType3/query.gql b/test/Feature/Input/variables/incompatibleType/weakerType3/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType3/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [[[Int!]]!]! ) {
+  q1 {
+    a2(argList: [],argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType3/response.json b/test/Feature/Input/variables/incompatibleType/weakerType3/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType3/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" of type \"[[[Int!]]!]!\" used in position expecting type \"[[[Int!]!]]!\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 35
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/incompatibleType/weakerType3/variables.json b/test/Feature/Input/variables/incompatibleType/weakerType3/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/incompatibleType/weakerType3/variables.json
@@ -0,0 +1,4 @@
+{
+  "v1": [
+  ]
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidDefaultValue/query.gql b/test/Feature/Input/variables/invalidValue/invalidDefaultValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidDefaultValue/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [[[Int!]!]]! = { id: "12" }) {
+  q1 {
+    a2(argList: [], argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json b/test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" got invalid value. Expected type \"[[[Int!]!]]!\" found { id: \"12\" }.",
+      "locations": [
+        {
+          "line": 1,
+          "column": 27
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [[[Int!]!]]! = [["boo"]]) {
+  q1 {
+    a2(argList: [], argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" got invalid value. Expected type \"[Int!]!\" found \"boo\".",
+      "locations": [
+        {
+          "line": 1,
+          "column": 27
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json
@@ -0,0 +1,3 @@
+{
+  "v1": []
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidListVariable/query.gql b/test/Feature/Input/variables/invalidValue/invalidListVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidListVariable/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [String!] ) {
+  q1 {
+    a2(argList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidListVariable/response.json b/test/Feature/Input/variables/invalidValue/invalidListVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidListVariable/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" got invalid value. Expected type \"String!\" found null.",
+      "locations": [
+        {
+          "line": 1,
+          "column": 27
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/invalidValue/invalidListVariable/variables.json b/test/Feature/Input/variables/invalidValue/invalidListVariable/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/invalidListVariable/variables.json
@@ -0,0 +1,5 @@
+{
+  "v1": [
+    null
+  ]
+}
diff --git a/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql b/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql
@@ -0,0 +1,5 @@
+query NonNullListReceivedNull($v1: [[[Int!]!]]!) {
+  q1 {
+    a2(argNestedList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/response.json b/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v1\" got invalid value. Expected type \"[Int!]!\" found null.",
+      "locations": [
+        {
+          "line": 1,
+          "column": 31
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json b/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json
@@ -0,0 +1,11 @@
+{
+  "v1": [
+    [
+      [
+        1
+      ],
+      null
+    ],
+    null
+  ]
+}
diff --git a/test/Feature/Input/variables/nameCollision/query.gql b/test/Feature/Input/variables/nameCollision/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nameCollision/query.gql
@@ -0,0 +1,5 @@
+query variableNameCollision($v1: String!, $v1: String! ) {
+  q1 {
+    a2(argList: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/nameCollision/response.json b/test/Feature/Input/variables/nameCollision/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nameCollision/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "There can Be only One Variable Named \"v1\"",
+      "locations": [
+        {
+          "line": 1,
+          "column": 29
+        }
+      ]
+    },
+    {
+      "message": "There can Be only One Variable Named \"v1\"",
+      "locations": [
+        {
+          "line": 1,
+          "column": 43
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/nameCollision/variables.json b/test/Feature/Input/variables/nameCollision/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nameCollision/variables.json
@@ -0,0 +1,5 @@
+{
+  "v1": [
+    "a"
+  ]
+}
diff --git a/test/Feature/Input/variables/nestedListNullableListReceivedNull/query.gql b/test/Feature/Input/variables/nestedListNullableListReceivedNull/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nestedListNullableListReceivedNull/query.gql
@@ -0,0 +1,5 @@
+query NullableListReceivedNull($v1: [[[Int!]!]]!) {
+  q1 {
+    a2(argNestedList: $v1, argList:[])
+  }
+}
diff --git a/test/Feature/Input/variables/nestedListNullableListReceivedNull/response.json b/test/Feature/Input/variables/nestedListNullableListReceivedNull/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nestedListNullableListReceivedNull/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a2": 1
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/nestedListNullableListReceivedNull/variables.json b/test/Feature/Input/variables/nestedListNullableListReceivedNull/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nestedListNullableListReceivedNull/variables.json
@@ -0,0 +1,10 @@
+{
+  "v1": [
+    [
+      [
+        1
+      ]
+    ],
+    null
+  ]
+}
diff --git a/test/Feature/Input/variables/nonInputTypeViolation/query.gql b/test/Feature/Input/variables/nonInputTypeViolation/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nonInputTypeViolation/query.gql
@@ -0,0 +1,5 @@
+query testUnknownType ($bo: A ){
+  q1 {
+      a1(arg1:$bo)
+  }
+}
diff --git a/test/Feature/Input/variables/nonInputTypeViolation/response.json b/test/Feature/Input/variables/nonInputTypeViolation/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/nonInputTypeViolation/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$bo\" cannot be non-input type \"A\".",
+      "locations": [
+        {
+          "line": 1,
+          "column": 24
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/undefinedVariable/query.gql b/test/Feature/Input/variables/undefinedVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/undefinedVariable/query.gql
@@ -0,0 +1,5 @@
+query testUnknownType {
+  q1 {
+      a1(arg1:$bo)
+  }
+}
diff --git a/test/Feature/Input/variables/undefinedVariable/response.json b/test/Feature/Input/variables/undefinedVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/undefinedVariable/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"bo\" is not defined by operation \"testUnknownType\".",
+      "locations": [
+        {
+          "line": 3,
+          "column": 15
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/unknownType/query.gql b/test/Feature/Input/variables/unknownType/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unknownType/query.gql
@@ -0,0 +1,5 @@
+query testUnknownType ($bo: BA ){
+  q1 {
+      a1(arg1:$bo)
+  }
+}
diff --git a/test/Feature/Input/variables/unknownType/response.json b/test/Feature/Input/variables/unknownType/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unknownType/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Unknown type \"BA\".",
+      "locations": [
+        {
+          "line": 1,
+          "column": 24
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/unusedVariable/unusedVariables/query.gql b/test/Feature/Input/variables/unusedVariable/unusedVariables/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/unusedVariables/query.gql
@@ -0,0 +1,5 @@
+query TestUnusedVariables ($v1: String, $v2: String, $v3: Int) {
+  q1 {
+    a1(arg1: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/unusedVariable/unusedVariables/response.json b/test/Feature/Input/variables/unusedVariable/unusedVariables/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/unusedVariables/response.json
@@ -0,0 +1,22 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$v2\" is never used in operation \"TestUnusedVariables\".",
+      "locations": [
+        {
+          "line": 1,
+          "column": 41
+        }
+      ]
+    },
+    {
+      "message": "Variable \"$v3\" is never used in operation \"TestUnusedVariables\".",
+      "locations": [
+        {
+          "line": 1,
+          "column": 54
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/query.gql b/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/query.gql
@@ -0,0 +1,5 @@
+query TestUsedVariable ($v1: String!) {
+  q1 {
+    x1:  a1(arg1: $v1)
+  }
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/response.json b/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "x1": "a1Test"
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/variables.json b/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInAlias/variables.json
@@ -0,0 +1,3 @@
+{
+  "v1": ""
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/query.gql b/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/query.gql
@@ -0,0 +1,9 @@
+query TestUsedVariable ($v1: String!) {
+  q1 {
+    ...F1
+  }
+}
+
+fragment F1 on A {
+  a1(arg1: $v1)
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/response.json b/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a1": "a1Test"
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/variables.json b/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInFragment/variables.json
@@ -0,0 +1,3 @@
+{
+  "v1": ""
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/query.gql b/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/query.gql
@@ -0,0 +1,7 @@
+query TestUsedVariable ($v1: String!) {
+  q1 {
+    ...on A {
+         a1(arg1: $v1)
+     }
+  }
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/response.json b/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a1": "a1Test"
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/variables.json b/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/unusedVariable/variableUsedInInlineFragment/variables.json
@@ -0,0 +1,3 @@
+{
+  "v1": ""
+}
diff --git a/test/Feature/Input/variables/validListVariable/query.gql b/test/Feature/Input/variables/validListVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/validListVariable/query.gql
@@ -0,0 +1,5 @@
+query invalidListVariable($v1: [String!]!) {
+  q1 {
+    a2(argList: $v1, argNestedList: [])
+  }
+}
diff --git a/test/Feature/Input/variables/validListVariable/response.json b/test/Feature/Input/variables/validListVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/validListVariable/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a2": 1
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/validListVariable/variables.json b/test/Feature/Input/variables/validListVariable/variables.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/validListVariable/variables.json
@@ -0,0 +1,5 @@
+{
+  "v1": [
+    "a"
+  ]
+}
diff --git a/test/Feature/Input/variables/valueNotProvided/nonNullVariable/query.gql b/test/Feature/Input/variables/valueNotProvided/nonNullVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/valueNotProvided/nonNullVariable/query.gql
@@ -0,0 +1,5 @@
+query TestNonNullVariable($i1: String!) {
+  q1 {
+    a1(arg1: $i1)
+  }
+}
diff --git a/test/Feature/Input/variables/valueNotProvided/nonNullVariable/response.json b/test/Feature/Input/variables/valueNotProvided/nonNullVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/valueNotProvided/nonNullVariable/response.json
@@ -0,0 +1,13 @@
+{
+  "errors": [
+    {
+      "message": "Variable \"$i1\" of required type \"String!\" was not provided.",
+      "locations": [
+        {
+          "line": 1,
+          "column": 27
+        }
+      ]
+    }
+  ]
+}
diff --git a/test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql b/test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql
@@ -0,0 +1,5 @@
+query TestNonNullVariable($i1: String! = "hello world") {
+  q1 {
+    a1(arg1: $i1)
+  }
+}
diff --git a/test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json b/test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a1": "a1Test"
+    }
+  }
+}
diff --git a/test/Feature/Input/variables/valueNotProvided/nullableVariable/query.gql b/test/Feature/Input/variables/valueNotProvided/nullableVariable/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/valueNotProvided/nullableVariable/query.gql
@@ -0,0 +1,5 @@
+query TestNullableVariable($i1: Int) {
+  q1 {
+    a1(arg1:"",arg2: $i1)
+  }
+}
diff --git a/test/Feature/Input/variables/valueNotProvided/nullableVariable/response.json b/test/Feature/Input/variables/valueNotProvided/nullableVariable/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/Input/variables/valueNotProvided/nullableVariable/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "q1": {
+      "a1": "a1Test"
+    }
+  }
+}
diff --git a/test/Feature/InputType/API.hs b/test/Feature/InputType/API.hs
deleted file mode 100644
--- a/test/Feature/InputType/API.hs
+++ /dev/null
@@ -1,62 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.InputType.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType (..),
-    ResolverQ,
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text (Text)
-import GHC.Generics (Generic)
-
-data F1Args = F1Args
-  { arg1 :: Text,
-    arg2 :: Maybe Int
-  }
-  deriving (Generic, GQLType)
-
-data F2Args = F2Args
-  { argList :: [Text],
-    argNestedList :: [Maybe [[Int]]]
-  }
-  deriving (Generic, GQLType)
-
-data A = A
-  { a1 :: F1Args -> ResolverQ () IO Text,
-    a2 :: F2Args -> ResolverQ () IO Int
-  }
-  deriving (Generic, GQLType)
-
-newtype Query (m :: * -> *) = Query
-  { q1 :: A
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver =
-        Query
-          { q1 =
-              A
-                { a1 = const $ return "a1Test",
-                  a2 = const $ return 1
-                }
-          },
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/InputType/cases.json b/test/Feature/InputType/cases.json
deleted file mode 100644
--- a/test/Feature/InputType/cases.json
+++ /dev/null
@@ -1,86 +0,0 @@
-[
-  {
-    "path": "variables/unusedVariable/unusedVariables",
-    "description": "fail when: variable is defined by the operation but did not used in selection"
-  },
-  {
-    "path": "variables/unusedVariable/variableUsedInFragment",
-    "description": "don't fail when: variable is defined by the operation and used in Fragment"
-  },
-  {
-    "path": "variables/unusedVariable/variableUsedInInlineFragment",
-    "description": "don't fail when: variable is defined by the operation and used in inline Fragment"
-  },
-  {
-    "path": "variables/unusedVariable/variableUsedInAlias",
-    "description": "don't fail when: variable is defined by the operation and used in Alias"
-  },
-  {
-    "path": "variables/valueNotProvided/nonNullVariable",
-    "description": "fail when: variable is defined by the operation but can't found on request body"
-  },
-  {
-    "path": "variables/valueNotProvided/nullableVariable",
-    "description": "don't fail when: variable is defined by the operation but can't found on request body"
-  },
-  {
-    "path": "variables/valueNotProvided/nonNullVariableWithDefaultValue",
-    "description": "don't fail when: not nullable variable was not provided but has default value"
-  },
-  {
-    "path": "variables/invalidValue/invalidListVariable",
-    "description": "fail when: variable receives invalid List value"
-  },
-  {
-    "path": "variables/invalidValue/nestedListNonNullListReceivedNull",
-    "description": "fail: if list of nonNull elements receives null"
-  },
-  {
-    "path": "variables/invalidValue/invalidDefaultValue",
-    "description": "fail: if default value is incompatible"
-  },
-  {
-    "path": "variables/invalidValue/invalidDefaultValueButVariableProvided",
-    "description": "fail: if default value is incompatible eve if correct variable value was provided"
-  },
-  {
-    "path": "variables/nestedListNullableListReceivedNull",
-    "description": "resolve: if list of nullable elements receives null"
-  },
-  {
-    "path": "variables/unknownType",
-    "description": "fail when: variable type does not exists"
-  },
-  {
-    "path": "variables/undefinedVariable",
-    "description": "fail when: referenced variable is not defined"
-  },
-  {
-    "path": "variables/incompatibleType/equalType",
-    "description": "equal types are valid"
-  },
-  {
-    "path": "variables/incompatibleType/stricterType",
-    "description": "stricter types are valid"
-  },
-  {
-    "path": "variables/incompatibleType/weakerType1",
-    "description": "weaker types are invalid"
-  },
-  {
-    "path": "variables/incompatibleType/weakerType2",
-    "description": "weaker types are invalid"
-  },
-  {
-    "path": "variables/incompatibleType/weakerType3",
-    "description": "weaker types are invalid"
-  },
-  {
-    "path": "variables/nameCollision",
-    "description": "fail on: variable name collision"
-  },
-  {
-    "path": "variables/nonInputTypeViolation",
-    "description": "fail on: non-input type in variable definition"
-  }
-]
diff --git a/test/Feature/InputType/variables/incompatibleType/equalType/query.gql b/test/Feature/InputType/variables/incompatibleType/equalType/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/equalType/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [[[Int!]!]]! ) {
-  q1 {
-    a2(argList: [],argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/equalType/response.json b/test/Feature/InputType/variables/incompatibleType/equalType/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/equalType/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a2": 1
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/equalType/variables.json b/test/Feature/InputType/variables/incompatibleType/equalType/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/equalType/variables.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "v1": [
-  ]
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/stricterType/query.gql b/test/Feature/InputType/variables/incompatibleType/stricterType/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/stricterType/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [[[Int!]!]!]! ) {
-  q1 {
-    a2(argList: [],argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/stricterType/response.json b/test/Feature/InputType/variables/incompatibleType/stricterType/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/stricterType/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a2": 1
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/stricterType/variables.json b/test/Feature/InputType/variables/incompatibleType/stricterType/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/stricterType/variables.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "v1": [
-  ]
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType1/query.gql b/test/Feature/InputType/variables/incompatibleType/weakerType1/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType1/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [[[Int]!]!]! ) {
-  q1 {
-    a2(argList: [],argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType1/response.json b/test/Feature/InputType/variables/incompatibleType/weakerType1/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType1/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" of type \"[[[Int]!]!]!\" used in position expecting type \"[[[Int!]!]]!\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 35
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType1/variables.json b/test/Feature/InputType/variables/incompatibleType/weakerType1/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType1/variables.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "v1": [
-  ]
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType2/query.gql b/test/Feature/InputType/variables/incompatibleType/weakerType2/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType2/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [[[Int!]!]!] ) {
-  q1 {
-    a2(argList: [],argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType2/response.json b/test/Feature/InputType/variables/incompatibleType/weakerType2/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType2/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" of type \"[[[Int!]!]!]\" used in position expecting type \"[[[Int!]!]]!\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 35
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType2/variables.json b/test/Feature/InputType/variables/incompatibleType/weakerType2/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType2/variables.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "v1": [
-  ]
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType3/query.gql b/test/Feature/InputType/variables/incompatibleType/weakerType3/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType3/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [[[Int!]]!]! ) {
-  q1 {
-    a2(argList: [],argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType3/response.json b/test/Feature/InputType/variables/incompatibleType/weakerType3/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType3/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" of type \"[[[Int!]]!]!\" used in position expecting type \"[[[Int!]!]]!\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 35
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/incompatibleType/weakerType3/variables.json b/test/Feature/InputType/variables/incompatibleType/weakerType3/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/incompatibleType/weakerType3/variables.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "v1": [
-  ]
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidDefaultValue/query.gql b/test/Feature/InputType/variables/invalidValue/invalidDefaultValue/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidDefaultValue/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [[[Int!]!]]! = { id: "12" }) {
-  q1 {
-    a2(argList: [], argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidDefaultValue/response.json b/test/Feature/InputType/variables/invalidValue/invalidDefaultValue/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidDefaultValue/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" got invalid value. Expected type \"[[[Int!]!]]!\" found { id: \"12\" }.",
-      "locations": [
-        {
-          "line": 1,
-          "column": 27
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql b/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [[[Int!]!]]! = [["boo"]]) {
-  q1 {
-    a2(argList: [], argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json b/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" got invalid value. Expected type \"[Int!]!\" found \"boo\".",
-      "locations": [
-        {
-          "line": 1,
-          "column": 27
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json b/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidDefaultValueButVariableProvided/variables.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "v1": []
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidListVariable/query.gql b/test/Feature/InputType/variables/invalidValue/invalidListVariable/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidListVariable/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [String!] ) {
-  q1 {
-    a2(argList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidListVariable/response.json b/test/Feature/InputType/variables/invalidValue/invalidListVariable/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidListVariable/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" got invalid value. Expected type \"String!\" found null.",
-      "locations": [
-        {
-          "line": 1,
-          "column": 27
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/invalidValue/invalidListVariable/variables.json b/test/Feature/InputType/variables/invalidValue/invalidListVariable/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/invalidListVariable/variables.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "v1": [
-    null
-  ]
-}
diff --git a/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql b/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query NonNullListReceivedNull($v1: [[[Int!]!]]!) {
-  q1 {
-    a2(argNestedList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/response.json b/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v1\" got invalid value. Expected type \"[Int!]!\" found null.",
-      "locations": [
-        {
-          "line": 1,
-          "column": 31
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json b/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/invalidValue/nestedListNonNullListReceivedNull/variables.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "v1": [
-    [
-      [
-        1
-      ],
-      null
-    ],
-    null
-  ]
-}
diff --git a/test/Feature/InputType/variables/nameCollision/query.gql b/test/Feature/InputType/variables/nameCollision/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/nameCollision/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query variableNameCollision($v1: String!, $v1: String! ) {
-  q1 {
-    a2(argList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/nameCollision/response.json b/test/Feature/InputType/variables/nameCollision/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/nameCollision/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "There can Be only One Variable Named \"v1\"",
-      "locations": [
-        {
-          "line": 1,
-          "column": 29
-        }
-      ]
-    },
-    {
-      "message": "There can Be only One Variable Named \"v1\"",
-      "locations": [
-        {
-          "line": 1,
-          "column": 43
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/nameCollision/variables.json b/test/Feature/InputType/variables/nameCollision/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/nameCollision/variables.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "v1": [
-    "a"
-  ]
-}
diff --git a/test/Feature/InputType/variables/nestedListNullableListReceivedNull/query.gql b/test/Feature/InputType/variables/nestedListNullableListReceivedNull/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/nestedListNullableListReceivedNull/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query NullableListReceivedNull($v1: [[[Int!]!]]!) {
-  q1 {
-    a2(argNestedList: $v1, argList:[])
-  }
-}
diff --git a/test/Feature/InputType/variables/nestedListNullableListReceivedNull/response.json b/test/Feature/InputType/variables/nestedListNullableListReceivedNull/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/nestedListNullableListReceivedNull/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a2": 1
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/nestedListNullableListReceivedNull/variables.json b/test/Feature/InputType/variables/nestedListNullableListReceivedNull/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/nestedListNullableListReceivedNull/variables.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "v1": [
-    [
-      [
-        1
-      ]
-    ],
-    null
-  ]
-}
diff --git a/test/Feature/InputType/variables/nonInputTypeViolation/query.gql b/test/Feature/InputType/variables/nonInputTypeViolation/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/nonInputTypeViolation/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query testUnknownType ($bo: A ){
-  q1 {
-      a1(arg1:$bo)
-  }
-}
diff --git a/test/Feature/InputType/variables/nonInputTypeViolation/response.json b/test/Feature/InputType/variables/nonInputTypeViolation/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/nonInputTypeViolation/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$bo\" cannot be non-input type \"A\".",
-      "locations": [
-        {
-          "line": 1,
-          "column": 24
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/undefinedVariable/query.gql b/test/Feature/InputType/variables/undefinedVariable/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/undefinedVariable/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query testUnknownType {
-  q1 {
-      a1(arg1:$bo)
-  }
-}
diff --git a/test/Feature/InputType/variables/undefinedVariable/response.json b/test/Feature/InputType/variables/undefinedVariable/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/undefinedVariable/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"bo\" is not defined by operation \"testUnknownType\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 15
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/unknownType/query.gql b/test/Feature/InputType/variables/unknownType/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/unknownType/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query testUnknownType ($bo: BA ){
-  q1 {
-      a1(arg1:$bo)
-  }
-}
diff --git a/test/Feature/InputType/variables/unknownType/response.json b/test/Feature/InputType/variables/unknownType/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unknownType/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Unknown type \"BA\".",
-      "locations": [
-        {
-          "line": 1,
-          "column": 24
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/unusedVariables/query.gql b/test/Feature/InputType/variables/unusedVariable/unusedVariables/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/unusedVariables/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query TestUnusedVariables ($v1: String, $v2: String, $v3: Int) {
-  q1 {
-    a1(arg1: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/unusedVariables/response.json b/test/Feature/InputType/variables/unusedVariable/unusedVariables/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/unusedVariables/response.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$v2\" is never used in operation \"TestUnusedVariables\".",
-      "locations": [
-        {
-          "line": 1,
-          "column": 41
-        }
-      ]
-    },
-    {
-      "message": "Variable \"$v3\" is never used in operation \"TestUnusedVariables\".",
-      "locations": [
-        {
-          "line": 1,
-          "column": 54
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/query.gql b/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query TestUsedVariable ($v1: String!) {
-  q1 {
-    x1:  a1(arg1: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/response.json b/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "x1": "a1Test"
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/variables.json b/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInAlias/variables.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "v1": ""
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/query.gql b/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-query TestUsedVariable ($v1: String!) {
-  q1 {
-    ...F1
-  }
-}
-
-fragment F1 on A {
-  a1(arg1: $v1)
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/response.json b/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a1": "a1Test"
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/variables.json b/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInFragment/variables.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "v1": ""
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/query.gql b/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-query TestUsedVariable ($v1: String!) {
-  q1 {
-    ...on A {
-         a1(arg1: $v1)
-     }
-  }
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/response.json b/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a1": "a1Test"
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/variables.json b/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/unusedVariable/variableUsedInInlineFragment/variables.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "v1": ""
-}
diff --git a/test/Feature/InputType/variables/validListVariable/query.gql b/test/Feature/InputType/variables/validListVariable/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/validListVariable/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query invalidListVariable($v1: [String!]! ) {
-  q1 {
-    a2(argList: $v1)
-  }
-}
diff --git a/test/Feature/InputType/variables/validListVariable/response.json b/test/Feature/InputType/variables/validListVariable/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/validListVariable/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a2": 1
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/validListVariable/variables.json b/test/Feature/InputType/variables/validListVariable/variables.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/validListVariable/variables.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "v1": [
-    "a"
-  ]
-}
diff --git a/test/Feature/InputType/variables/valueNotProvided/nonNullVariable/query.gql b/test/Feature/InputType/variables/valueNotProvided/nonNullVariable/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/valueNotProvided/nonNullVariable/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query TestNonNullVariable($i1: String!) {
-  q1 {
-    a1(arg1: $i1)
-  }
-}
diff --git a/test/Feature/InputType/variables/valueNotProvided/nonNullVariable/response.json b/test/Feature/InputType/variables/valueNotProvided/nonNullVariable/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/valueNotProvided/nonNullVariable/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Variable \"$i1\" of required type \"String!\" was not provided.",
-      "locations": [
-        {
-          "line": 1,
-          "column": 27
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql b/test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query TestNonNullVariable($i1: String! = "hello world") {
-  q1 {
-    a1(arg1: $i1)
-  }
-}
diff --git a/test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json b/test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/valueNotProvided/nonNullVariableWithDefaultValue/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a1": "a1Test"
-    }
-  }
-}
diff --git a/test/Feature/InputType/variables/valueNotProvided/nullableVariable/query.gql b/test/Feature/InputType/variables/valueNotProvided/nullableVariable/query.gql
deleted file mode 100644
--- a/test/Feature/InputType/variables/valueNotProvided/nullableVariable/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-query TestNullableVariable($i1: Int) {
-  q1 {
-    a1(arg1:"",arg2: $i1)
-  }
-}
diff --git a/test/Feature/InputType/variables/valueNotProvided/nullableVariable/response.json b/test/Feature/InputType/variables/valueNotProvided/nullableVariable/response.json
deleted file mode 100644
--- a/test/Feature/InputType/variables/valueNotProvided/nullableVariable/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "q1": {
-      "a1": "a1Test"
-    }
-  }
-}
diff --git a/test/Feature/NamedResolvers/API.hs b/test/Feature/NamedResolvers/API.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/API.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Feature.NamedResolvers.API
+  ( app,
+  )
+where
+
+import Data.Morpheus (App)
+import Feature.NamedResolvers.Deities (deitiesApp)
+import Feature.NamedResolvers.Entities (entitiesApp)
+import Feature.NamedResolvers.Realms (realmsApp)
+import Relude
+
+app :: App () IO
+app = deitiesApp <> realmsApp <> entitiesApp
diff --git a/test/Feature/NamedResolvers/Deities.hs b/test/Feature/NamedResolvers/Deities.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/Deities.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Feature.NamedResolvers.Deities
+  ( deitiesApp,
+  )
+where
+
+import Data.Morpheus (deriveApp)
+import Data.Morpheus.Document
+  ( importGQLDocument,
+  )
+import Data.Morpheus.NamedResolvers
+  ( NamedResolverT,
+    ResolveNamed (..),
+    resolve,
+  )
+import Data.Morpheus.Types
+  ( App,
+    Arg (..),
+    ID,
+    NamedResolvers (..),
+    Undefined,
+  )
+import Relude hiding (Undefined)
+
+importGQLDocument "test/Feature/NamedResolvers/deities.gql"
+
+instance Monad m => ResolveNamed m Power where
+  type Dep Power = ID
+  resolveNamed "sp" = pure Shapeshifting
+  resolveNamed _ = pure Thunderbolt
+
+instance Monad m => ResolveNamed m (Deity (NamedResolverT m)) where
+  type Dep (Deity (NamedResolverT m)) = ID
+  resolveNamed "zeus" =
+    pure
+      Deity
+        { name = resolve (pure "Zeus"),
+          power = resolve (pure ["tb"])
+        }
+  resolveNamed "morpheus" =
+    pure
+      Deity
+        { name = resolve (pure "Morpheus"),
+          power = resolve (pure ["sp"])
+        }
+  resolveNamed _ =
+    pure
+      Deity
+        { name = resolve (pure "Unknown"),
+          power = resolve (pure [])
+        }
+
+instance Monad m => ResolveNamed m (Query (NamedResolverT m)) where
+  type Dep (Query (NamedResolverT m)) = ()
+  resolveNamed () =
+    pure
+      Query
+        { deity = \(Arg uid) -> resolve (pure (Just uid)),
+          deities = resolve (pure ["zeus", "morpheus"])
+        }
+
+deitiesApp :: App () IO
+deitiesApp =
+  deriveApp
+    ( NamedResolvers ::
+        NamedResolvers IO () Query Undefined Undefined
+    )
diff --git a/test/Feature/NamedResolvers/Entities.hs b/test/Feature/NamedResolvers/Entities.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/Entities.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.NamedResolvers.Entities
+  ( entitiesApp,
+  )
+where
+
+import Data.Morpheus (deriveApp)
+import Data.Morpheus.NamedResolvers
+  ( NamedResolverT,
+    ResolveNamed (..),
+    resolve,
+  )
+import Data.Morpheus.Types
+  ( App,
+    Arg (..),
+    GQLType (..),
+    ID,
+    NamedResolvers (..),
+    Undefined,
+  )
+import Feature.NamedResolvers.Realms (Deity, Realm)
+import GHC.Generics (Generic)
+
+-- Entity
+data Entity m
+  = EntityDeity (m (Deity m))
+  | EntityRealm (m (Realm m))
+  deriving
+    ( Generic,
+      GQLType
+    )
+
+instance Monad m => ResolveNamed m (Entity (NamedResolverT m)) where
+  type Dep (Entity (NamedResolverT m)) = ID
+  resolveNamed "zeus" = pure $ EntityDeity (resolve $ pure "zeus")
+  resolveNamed "morpheus" = pure $ EntityDeity (resolve $ pure "morpheus")
+  resolveNamed x = pure $ EntityRealm (resolve $ pure x)
+
+-- QUERY
+data Query m = Query
+  { entities :: m [Entity m],
+    entity :: Arg "id" ID -> m (Maybe (Entity m))
+  }
+  deriving
+    ( Generic,
+      GQLType
+    )
+
+instance Monad m => ResolveNamed m (Query (NamedResolverT m)) where
+  type Dep (Query (NamedResolverT m)) = ()
+  resolveNamed () =
+    pure
+      Query
+        { entities =
+            resolve
+              ( pure
+                  [ "zeus",
+                    "morpheus",
+                    "olympus",
+                    "dreams"
+                  ]
+              ),
+          entity = \(Arg uid) -> resolve (pure (Just uid))
+        }
+
+entitiesApp :: App () IO
+entitiesApp =
+  deriveApp
+    ( NamedResolvers ::
+        NamedResolvers IO () Query Undefined Undefined
+    )
diff --git a/test/Feature/NamedResolvers/Realms.hs b/test/Feature/NamedResolvers/Realms.hs
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/Realms.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Feature.NamedResolvers.Realms
+  ( realmsApp,
+    Deity,
+    Realm,
+  )
+where
+
+import Data.Morpheus
+  ( deriveApp,
+  )
+import Data.Morpheus.Document
+  ( importGQLDocument,
+  )
+import Data.Morpheus.NamedResolvers
+  ( NamedResolverT,
+    ResolveNamed (..),
+    resolve,
+  )
+import Data.Morpheus.Types
+  ( App,
+    Arg (..),
+    ID,
+    NamedResolvers (..),
+    Undefined,
+  )
+import Data.Text (Text)
+
+importGQLDocument "test/Feature/NamedResolvers/realms.gql"
+
+instance Monad m => ResolveNamed m (Realm (NamedResolverT m)) where
+  type Dep (Realm (NamedResolverT m)) = ID
+  resolveNamed "olympus" =
+    pure
+      Realm
+        { name = resolve (pure "Mount Olympus"),
+          owner = resolve (pure "zeus")
+        }
+  resolveNamed "dreams" =
+    pure
+      Realm
+        { name = resolve (pure "Fictional world of dreams"),
+          owner = resolve (pure "morpheus")
+        }
+  resolveNamed _ =
+    pure
+      Realm
+        { name = resolve (pure "Unknown"),
+          owner = resolve (pure "none")
+        }
+
+instance Monad m => ResolveNamed m (Deity (NamedResolverT m)) where
+  type Dep (Deity (NamedResolverT m)) = ID
+  resolveNamed "zeus" =
+    pure
+      Deity
+        { realm = resolve (pure "olympus")
+        }
+  resolveNamed "morpheus" =
+    pure
+      Deity
+        { realm = resolve (pure "dreams")
+        }
+  resolveNamed x =
+    pure
+      Deity
+        { realm = resolve (pure x)
+        }
+
+instance Monad m => ResolveNamed m (Query (NamedResolverT m)) where
+  type Dep (Query (NamedResolverT m)) = ()
+  resolveNamed () =
+    pure
+      Query
+        { realm = \(Arg arg) -> resolve (pure (Just arg)),
+          realms = resolve (pure ["olympus", "dreams"])
+        }
+
+realmsApp :: App () IO
+realmsApp =
+  deriveApp
+    (NamedResolvers :: NamedResolvers IO () Query Undefined Undefined)
diff --git a/test/Feature/NamedResolvers/deities.gql b/test/Feature/NamedResolvers/deities.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/deities.gql
@@ -0,0 +1,14 @@
+enum Power {
+  Shapeshifting
+  Thunderbolt
+}
+
+type Deity {
+  name: String!
+  power: [Power!]!
+}
+
+type Query {
+  deities: [Deity!]!
+  deity(id: ID!): Deity
+}
diff --git a/test/Feature/NamedResolvers/realms.gql b/test/Feature/NamedResolvers/realms.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/realms.gql
@@ -0,0 +1,13 @@
+type Realm {
+  name: String!
+  owner: Deity!
+}
+
+type Deity {
+  realm: Realm!
+}
+
+type Query {
+  realms: [Realm!]!
+  realm(id: ID!): Realm
+}
diff --git a/test/Feature/NamedResolvers/tests/deities-ext/query.gql b/test/Feature/NamedResolvers/tests/deities-ext/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deities-ext/query.gql
@@ -0,0 +1,9 @@
+query {
+  deities {
+    name
+    power
+    realm {
+      name
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deities-ext/response.json b/test/Feature/NamedResolvers/tests/deities-ext/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deities-ext/response.json
@@ -0,0 +1,20 @@
+{
+  "data": {
+    "deities": [
+      {
+        "name": "Zeus",
+        "realm": {
+          "name": "Mount Olympus"
+        },
+        "power": ["Thunderbolt"]
+      },
+      {
+        "name": "Morpheus",
+        "realm": {
+          "name": "Fictional world of dreams"
+        },
+        "power": ["Shapeshifting"]
+      }
+    ]
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deities/query.gql b/test/Feature/NamedResolvers/tests/deities/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deities/query.gql
@@ -0,0 +1,6 @@
+query {
+  deities {
+    name
+    power
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deities/response.json b/test/Feature/NamedResolvers/tests/deities/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deities/response.json
@@ -0,0 +1,14 @@
+{
+  "data": {
+    "deities": [
+      {
+        "name": "Zeus",
+        "power": ["Thunderbolt"]
+      },
+      {
+        "name": "Morpheus",
+        "power": ["Shapeshifting"]
+      }
+    ]
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deity-by-id/query.gql b/test/Feature/NamedResolvers/tests/deity-by-id/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deity-by-id/query.gql
@@ -0,0 +1,6 @@
+query {
+  deity(id: "zeus") {
+    name
+    power
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deity-by-id/response.json b/test/Feature/NamedResolvers/tests/deity-by-id/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deity-by-id/response.json
@@ -0,0 +1,8 @@
+{
+  "data": {
+    "deity": {
+      "name": "Zeus",
+      "power": ["Thunderbolt"]
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deity-ext-by-id/query.gql b/test/Feature/NamedResolvers/tests/deity-ext-by-id/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deity-ext-by-id/query.gql
@@ -0,0 +1,9 @@
+query {
+  deity(id: "zeus") {
+    name
+    power
+    realm {
+      name
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deity-ext-by-id/response.json b/test/Feature/NamedResolvers/tests/deity-ext-by-id/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deity-ext-by-id/response.json
@@ -0,0 +1,9 @@
+{
+  "data": {
+    "deity": {
+      "name": "Zeus",
+      "realm": { "name": "Mount Olympus" },
+      "power": ["Thunderbolt"]
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deity-simple/query.gql b/test/Feature/NamedResolvers/tests/deity-simple/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deity-simple/query.gql
@@ -0,0 +1,6 @@
+query {
+  deity(id: "") {
+    name
+    power
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/deity-simple/response.json b/test/Feature/NamedResolvers/tests/deity-simple/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/deity-simple/response.json
@@ -0,0 +1,8 @@
+{
+  "data": {
+    "deity": {
+      "name": "Unknown",
+      "power": []
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/entities/query.gql b/test/Feature/NamedResolvers/tests/entities/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/entities/query.gql
@@ -0,0 +1,21 @@
+query {
+  entities {
+    ... on Realm {
+      name
+      owner {
+        name
+        power
+        realm {
+          name
+          owner {
+            name
+          }
+        }
+      }
+    }
+    ... on Deity {
+      name
+      power
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/entities/response.json b/test/Feature/NamedResolvers/tests/entities/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/entities/response.json
@@ -0,0 +1,37 @@
+{
+  "data": {
+    "entities": [
+      {
+        "name": "Zeus",
+        "__typename": "Deity",
+        "power": ["Thunderbolt"]
+      },
+      {
+        "name": "Morpheus",
+        "__typename": "Deity",
+        "power": ["Shapeshifting"]
+      },
+      {
+        "owner": {
+          "name": "Zeus",
+          "realm": { "owner": { "name": "Zeus" }, "name": "Mount Olympus" },
+          "power": ["Thunderbolt"]
+        },
+        "name": "Mount Olympus",
+        "__typename": "Realm"
+      },
+      {
+        "owner": {
+          "name": "Morpheus",
+          "realm": {
+            "owner": { "name": "Morpheus" },
+            "name": "Fictional world of dreams"
+          },
+          "power": ["Shapeshifting"]
+        },
+        "name": "Fictional world of dreams",
+        "__typename": "Realm"
+      }
+    ]
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/entity-by-id/query.gql b/test/Feature/NamedResolvers/tests/entity-by-id/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/entity-by-id/query.gql
@@ -0,0 +1,16 @@
+query {
+  zeus: entity(id: "zeus") {
+    ... on Deity {
+      name
+      power
+    }
+  }
+  olympus: entity(id: "olympus") {
+    ... on Realm {
+      name
+      owner {
+        name
+      }
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/entity-by-id/response.json b/test/Feature/NamedResolvers/tests/entity-by-id/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/entity-by-id/response.json
@@ -0,0 +1,16 @@
+{
+  "data": {
+    "zeus": {
+      "__typename": "Deity",
+      "name": "Zeus",
+      "power": ["Thunderbolt"]
+    },
+    "olympus": {
+      "__typename": "Realm",
+      "name": "Mount Olympus",
+      "owner": {
+        "name": "Zeus"
+      }
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/entity-ext-by-id/query.gql b/test/Feature/NamedResolvers/tests/entity-ext-by-id/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/entity-ext-by-id/query.gql
@@ -0,0 +1,23 @@
+query {
+  zeus: entity(id: "zeus") {
+    ... on Deity {
+      name
+      power
+    }
+  }
+  olympus: entity(id: "olympus") {
+    ... on Realm {
+      name
+      owner {
+        name
+        power
+        realm {
+          name
+          owner {
+            name
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/entity-ext-by-id/response.json b/test/Feature/NamedResolvers/tests/entity-ext-by-id/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/entity-ext-by-id/response.json
@@ -0,0 +1,21 @@
+{
+  "data": {
+    "zeus": {
+      "__typename": "Deity",
+      "name": "Zeus",
+      "power": ["Thunderbolt"]
+    },
+    "olympus": {
+      "__typename": "Realm",
+      "name": "Mount Olympus",
+      "owner": {
+        "name": "Zeus",
+        "realm": {
+          "name": "Mount Olympus",
+          "owner": { "name": "Zeus" }
+        },
+        "power": ["Thunderbolt"]
+      }
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realm-by-id/query.gql b/test/Feature/NamedResolvers/tests/realm-by-id/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realm-by-id/query.gql
@@ -0,0 +1,5 @@
+query {
+  realm(id: "olympus") {
+    name
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realm-by-id/response.json b/test/Feature/NamedResolvers/tests/realm-by-id/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realm-by-id/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "realm": {
+      "name": "Mount Olympus"
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realm-ext-by-id/query.gql b/test/Feature/NamedResolvers/tests/realm-ext-by-id/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realm-ext-by-id/query.gql
@@ -0,0 +1,15 @@
+query {
+  realm(id: "olympus") {
+    name
+    owner {
+      name
+      power
+      realm {
+        name
+        owner {
+          name
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realm-ext-by-id/response.json b/test/Feature/NamedResolvers/tests/realm-ext-by-id/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realm-ext-by-id/response.json
@@ -0,0 +1,15 @@
+{
+  "data": {
+    "realm": {
+      "owner": {
+        "name": "Zeus",
+        "realm": {
+          "owner": { "name": "Zeus" },
+          "name": "Mount Olympus"
+        },
+        "power": ["Thunderbolt"]
+      },
+      "name": "Mount Olympus"
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realm-simple/query.gql b/test/Feature/NamedResolvers/tests/realm-simple/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realm-simple/query.gql
@@ -0,0 +1,5 @@
+query {
+  realm(id: "") {
+    name
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realm-simple/response.json b/test/Feature/NamedResolvers/tests/realm-simple/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realm-simple/response.json
@@ -0,0 +1,7 @@
+{
+  "data": {
+    "realm": {
+      "name": "Unknown"
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realms/query.gql b/test/Feature/NamedResolvers/tests/realms/query.gql
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realms/query.gql
@@ -0,0 +1,15 @@
+query {
+  realms {
+    name
+    owner {
+      name
+      power
+      realm {
+        name
+        owner {
+          name
+        }
+      }
+    }
+  }
+}
diff --git a/test/Feature/NamedResolvers/tests/realms/response.json b/test/Feature/NamedResolvers/tests/realms/response.json
new file mode 100644
--- /dev/null
+++ b/test/Feature/NamedResolvers/tests/realms/response.json
@@ -0,0 +1,28 @@
+{
+  "data": {
+    "realms": [
+      {
+        "owner": {
+          "name": "Zeus",
+          "realm": {
+            "owner": { "name": "Zeus" },
+            "name": "Mount Olympus"
+          },
+          "power": ["Thunderbolt"]
+        },
+        "name": "Mount Olympus"
+      },
+      {
+        "owner": {
+          "name": "Morpheus",
+          "realm": {
+            "owner": { "name": "Morpheus" },
+            "name": "Fictional world of dreams"
+          },
+          "power": ["Shapeshifting"]
+        },
+        "name": "Fictional world of dreams"
+      }
+    ]
+  }
+}
diff --git a/test/Feature/Schema/A2.hs b/test/Feature/Schema/A2.hs
deleted file mode 100644
--- a/test/Feature/Schema/A2.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.Schema.A2
-  ( A (..),
-  )
-where
-
-import Data.Morpheus.Types (GQLType)
-import GHC.Generics (Generic)
-
-newtype A = A
-  { bla :: Int
-  }
-  deriving (Generic, GQLType)
diff --git a/test/Feature/Schema/API.hs b/test/Feature/Schema/API.hs
deleted file mode 100644
--- a/test/Feature/Schema/API.hs
+++ /dev/null
@@ -1,38 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.Schema.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types (GQLRequest, GQLResponse, GQLType (..), RootResolver (..), Undefined (..))
-import Data.Text (Text)
-import qualified Feature.Schema.A2 as A2 (A (..))
-import GHC.Generics (Generic)
-
-data A = A
-  { aText :: Text,
-    aInt :: Int
-  }
-  deriving (Generic, GQLType)
-
-data Query (m :: * -> *) = Query
-  { a1 :: A,
-    a2 :: A2.A
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver = Query {a1 = A "" 0, a2 = A2.A 0},
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/Schema/cases.json b/test/Feature/Schema/cases.json
deleted file mode 100644
--- a/test/Feature/Schema/cases.json
+++ /dev/null
@@ -1,6 +0,0 @@
-[
-  {
-    "path": "nameCollision",
-    "description": "fail: if types are defined with same name"
-  }
-]
diff --git a/test/Feature/Schema/nameCollision/query.gql b/test/Feature/Schema/nameCollision/query.gql
deleted file mode 100644
--- a/test/Feature/Schema/nameCollision/query.gql
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  name
-}
diff --git a/test/Feature/Schema/nameCollision/response.json b/test/Feature/Schema/nameCollision/response.json
deleted file mode 100644
--- a/test/Feature/Schema/nameCollision/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "There can Be only One TypeDefinition Named \"A\".",
-      "locations": []
-    },
-    {
-      "message": "There can Be only One TypeDefinition Named \"A\".",
-      "locations": []
-    }
-  ]
-}
diff --git a/test/Feature/TypeCategoryCollision/Fail/API.hs b/test/Feature/TypeCategoryCollision/Fail/API.hs
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Fail/API.hs
+++ /dev/null
@@ -1,60 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.TypeCategoryCollision.Fail.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType (..),
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text
-  ( Text,
-  )
-import GHC.Generics (Generic)
-
-data Deity = Deity
-  { name :: Text,
-    age :: Int
-  }
-  deriving (Show, Generic, GQLType)
-
-newtype DeityArgs = DeityArgs
-  { input :: Deity
-  }
-  deriving (Show, Generic, GQLType)
-
-newtype Query (m :: * -> *) = Query
-  { deity :: DeityArgs -> m Deity
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver =
-        Query
-          { deity =
-              const $
-                pure
-                  Deity
-                    { name =
-                        "Morpheus",
-                      age = 1000
-                    }
-          },
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/TypeCategoryCollision/Fail/cases.json b/test/Feature/TypeCategoryCollision/Fail/cases.json
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Fail/cases.json
+++ /dev/null
@@ -1,6 +0,0 @@
-[
-  {
-    "path": "failOnColision",
-    "description": "fail if type was used as input and output type without prefixes"
-  }
-]
diff --git a/test/Feature/TypeCategoryCollision/Fail/failOnColision/query.gql b/test/Feature/TypeCategoryCollision/Fail/failOnColision/query.gql
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Fail/failOnColision/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Deity") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeCategoryCollision/Fail/failOnColision/response.json b/test/Feature/TypeCategoryCollision/Fail/failOnColision/response.json
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Fail/failOnColision/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "It appears that the Haskell type \"Deity\" was used as both input and output type, which is not allowed by GraphQL specifications.\n\n If you supply \"typeNameModifier\" in \"GQLType.typeOptions\", you can override the default type names for \"Deity\" to solve this problem.",
-      "locations": []
-    }
-  ]
-}
diff --git a/test/Feature/TypeCategoryCollision/Success/API.hs b/test/Feature/TypeCategoryCollision/Success/API.hs
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Success/API.hs
+++ /dev/null
@@ -1,68 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.TypeCategoryCollision.Success.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType (..),
-    GQLTypeOptions (..),
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text
-  ( Text,
-  )
-import GHC.Generics (Generic)
-
-data Deity = Deity
-  { name :: Text,
-    age :: Int
-  }
-  deriving (Show, Generic)
-
-nonClashingTypeNameModifier :: Bool -> String -> String
-nonClashingTypeNameModifier True original = "Input" ++ original
-nonClashingTypeNameModifier False original = original
-
-instance GQLType Deity where
-  typeOptions _ opt = opt {typeNameModifier = nonClashingTypeNameModifier}
-
-newtype DeityArgs = DeityArgs
-  { input :: Deity
-  }
-  deriving (Show, Generic, GQLType)
-
-newtype Query (m :: * -> *) = Query
-  { deity :: DeityArgs -> m Deity
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver =
-        Query
-          { deity =
-              const $
-                pure
-                  Deity
-                    { name =
-                        "Morpheus",
-                      age = 1000
-                    }
-          },
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/TypeCategoryCollision/Success/cases.json b/test/Feature/TypeCategoryCollision/Success/cases.json
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Success/cases.json
+++ /dev/null
@@ -1,6 +0,0 @@
-[
-  {
-    "path": "prefixed",
-    "description": "prefixed type used as input and output does not fails"
-  }
-]
diff --git a/test/Feature/TypeCategoryCollision/Success/prefixed/query.gql b/test/Feature/TypeCategoryCollision/Success/prefixed/query.gql
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Success/prefixed/query.gql
+++ /dev/null
@@ -1,82 +0,0 @@
-query Get__Type {
-  type: __type(name: "Deity") {
-    ...FullType
-  }
-  input: __type(name: "InputDeity") {
-    ...FullType
-  }
-  query: __type(name: "Query") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeCategoryCollision/Success/prefixed/response.json b/test/Feature/TypeCategoryCollision/Success/prefixed/response.json
deleted file mode 100644
--- a/test/Feature/TypeCategoryCollision/Success/prefixed/response.json
+++ /dev/null
@@ -1,119 +0,0 @@
-{
-  "data": {
-    "type": {
-      "kind": "OBJECT",
-      "name": "Deity",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "age",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "Int",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    },
-    "input": {
-      "kind": "INPUT_OBJECT",
-      "name": "InputDeity",
-      "fields": null,
-      "inputFields": [
-        {
-          "name": "name",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "String",
-              "ofType": null
-            }
-          },
-          "defaultValue": null
-        },
-        {
-          "name": "age",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "SCALAR",
-              "name": "Int",
-              "ofType": null
-            }
-          },
-          "defaultValue": null
-        }
-      ],
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    },
-    "query": {
-      "kind": "OBJECT",
-      "name": "Query",
-      "fields": [
-        {
-          "name": "deity",
-          "args": [
-            {
-              "name": "input",
-              "type": {
-                "kind": "NON_NULL",
-                "name": null,
-                "ofType": {
-                  "kind": "INPUT_OBJECT",
-                  "name": "InputDeity",
-                  "ofType": null
-                }
-              },
-              "defaultValue": null
-            }
-          ],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "OBJECT",
-              "name": "Deity",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/API.hs b/test/Feature/TypeInference/API.hs
deleted file mode 100644
--- a/test/Feature/TypeInference/API.hs
+++ /dev/null
@@ -1,107 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.TypeInference.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType (..),
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text
-  ( Text,
-    pack,
-  )
-import GHC.Generics (Generic)
-
-data Power
-  = Thunderbolts
-  | Shapeshift
-  | Hurricanes
-  deriving (Generic, GQLType)
-
-data Deity (m :: * -> *) = Deity
-  { name :: Text,
-    power :: Power
-  }
-  deriving (Generic, GQLType)
-
-deityRes :: Deity m
-deityRes = Deity {name = "Morpheus", power = Shapeshift}
-
-data Hydra = Hydra
-  { name :: Text,
-    age :: Int
-  }
-  deriving (Show, Generic, GQLType)
-
-data Monster
-  = MonsterHydra Hydra
-  | Cerberus {name :: Text}
-  | UnidentifiedMonster
-  deriving (Show, Generic, GQLType)
-
-data Character (m :: * -> *)
-  = CharacterDeity (Deity m) -- Only <tycon name><type ref name> should generate direct link
-  | Creature {creatureName :: Text, creatureAge :: Int}
-  | BoxedDeity {boxedDeity :: Deity m}
-  | ScalarRecord {scalarText :: Text}
-  | CharacterInt Int
-  | SomeDeity (Deity m)
-  | SomeMutli Int Text
-  | Zeus
-  | Cronus
-  deriving (Generic, GQLType)
-
-resolveCharacter :: [Character m]
-resolveCharacter =
-  [ CharacterDeity deityRes,
-    Creature {creatureName = "Lamia", creatureAge = 205},
-    BoxedDeity {boxedDeity = deityRes},
-    ScalarRecord {scalarText = "Some Text"},
-    SomeDeity deityRes,
-    CharacterInt 12,
-    SomeMutli 21 "some text",
-    Zeus,
-    Cronus
-  ]
-
-newtype MonsterArgs = MonsterArgs
-  { monster :: Monster
-  }
-  deriving (Show, Generic, GQLType)
-
-data Query (m :: * -> *) = Query
-  { deity :: Deity m,
-    character :: [Character m],
-    showMonster :: MonsterArgs -> m Text
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver =
-        Query
-          { deity = deityRes,
-            character = resolveCharacter,
-            showMonster
-          },
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-  where
-    showMonster MonsterArgs {monster} = pure (pack $ show monster)
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/TypeInference/cases.json b/test/Feature/TypeInference/cases.json
deleted file mode 100644
--- a/test/Feature/TypeInference/cases.json
+++ /dev/null
@@ -1,58 +0,0 @@
-[
-  {
-    "path": "introspection/object",
-    "description": "derives simple gql object type"
-  },
-  {
-    "path": "introspection/enum",
-    "description": "derive as gql enum, if type has only empty constructors"
-  },
-  {
-    "path": "introspection/union/union",
-    "description": "derive complex union"
-  },
-  {
-    "path": "introspection/union/nullary-constructors",
-    "description": "empty constructors receive single field with empty type"
-  },
-  {
-    "path": "introspection/union/named-products",
-    "description": "creates object type for every union records"
-  },
-  {
-    "path": "introspection/union/scalars",
-    "description": "all scalar unions must be boxed"
-  },
-  {
-    "path": "introspection/union/positional-products",
-    "description": "all types without record syntax(indexed types), will be converted to gql object with fields _0,_1...."
-  },
-  {
-    "path": "introspection/inputObject",
-    "description": "introspect input object"
-  },
-  {
-    "path": "introspection/input-union/input-union",
-    "description": "introspect complex input"
-  },
-  {
-    "path": "introspection/input-union/empty",
-    "description": "schema provides type empty on imput union"
-  },
-  {
-    "path": "resolving/object",
-    "description": "resolve regular object"
-  },
-  {
-    "path": "resolving/complexUnion",
-    "description": "resolve regular object"
-  },
-  {
-    "path": "resolving/input/success",
-    "description": "resolve input values"
-  },
-  {
-    "path": "resolving/input/fail",
-    "description": "reject invalid input values"
-  }
-]
diff --git a/test/Feature/TypeInference/introspection/enum/query.gql b/test/Feature/TypeInference/introspection/enum/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/enum/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Power") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/enum/response.json b/test/Feature/TypeInference/introspection/enum/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/enum/response.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "ENUM",
-      "name": "Power",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": [
-        {
-          "name": "Thunderbolts",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "Shapeshift",
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "Hurricanes",
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/input-union/empty/query.gql b/test/Feature/TypeInference/introspection/input-union/empty/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/input-union/empty/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Unit") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/input-union/empty/response.json b/test/Feature/TypeInference/introspection/input-union/empty/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/input-union/empty/response.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "ENUM",
-      "name": "Unit",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": [
-        {
-          "name": "Unit",
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/input-union/input-union/query.gql b/test/Feature/TypeInference/introspection/input-union/input-union/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/input-union/input-union/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Monster") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/input-union/input-union/response.json b/test/Feature/TypeInference/introspection/input-union/input-union/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/input-union/input-union/response.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "INPUT_OBJECT",
-      "name": "Monster",
-      "fields": null,
-      "inputFields": [
-        {
-          "name": "Hydra",
-          "type": {
-            "kind": "INPUT_OBJECT",
-            "name": "Hydra",
-            "ofType": null
-          },
-          "defaultValue": null
-        },
-        {
-          "name": "Cerberus",
-          "type": {
-            "kind": "INPUT_OBJECT",
-            "name": "Cerberus",
-            "ofType": null
-          },
-          "defaultValue": null
-        },
-        {
-          "name": "UnidentifiedMonster",
-          "type": {
-            "kind": "ENUM",
-            "name": "Unit",
-            "ofType": null
-          },
-          "defaultValue": null
-        }
-      ],
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/inputObject/query.gql b/test/Feature/TypeInference/introspection/inputObject/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/inputObject/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Hydra") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/inputObject/response.json b/test/Feature/TypeInference/introspection/inputObject/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/inputObject/response.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "INPUT_OBJECT",
-      "name": "Hydra",
-      "fields": null,
-      "inputFields": [
-        {
-          "name": "name",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "defaultValue": null
-        },
-        {
-          "name": "age",
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
-          },
-          "defaultValue": null
-        }
-      ],
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/object/query.gql b/test/Feature/TypeInference/introspection/object/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/object/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Deity") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/object/response.json b/test/Feature/TypeInference/introspection/object/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/object/response.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "Deity",
-      "fields": [
-        {
-          "name": "name",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "power",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "ENUM", "name": "Power", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/named-products/query.gql b/test/Feature/TypeInference/introspection/union/named-products/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/named-products/query.gql
+++ /dev/null
@@ -1,82 +0,0 @@
-query Get__Type {
-  creature: __type(name: "Creature") {
-    ...FullType
-  }
-  boxedDeity: __type(name: "BoxedDeity") {
-    ...FullType
-  }
-  scalarRecord: __type(name: "ScalarRecord") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/named-products/response.json b/test/Feature/TypeInference/introspection/union/named-products/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/named-products/response.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "data": {
-    "creature": {
-      "kind": "OBJECT",
-      "name": "Creature",
-      "fields": [
-        {
-          "name": "creatureName",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "creatureAge",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    },
-    "boxedDeity": {
-      "kind": "OBJECT",
-      "name": "BoxedDeity",
-      "fields": [
-        {
-          "name": "boxedDeity",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "OBJECT", "name": "Deity", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    },
-    "scalarRecord": {
-      "kind": "OBJECT",
-      "name": "ScalarRecord",
-      "fields": [
-        {
-          "name": "scalarText",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/nullary-constructors/query.gql b/test/Feature/TypeInference/introspection/union/nullary-constructors/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/nullary-constructors/query.gql
+++ /dev/null
@@ -1,82 +0,0 @@
-query Get__Type {
-  zeus: __type(name: "Zeus") {
-    ...FullType
-  }
-  cronus: __type(name: "Cronus") {
-    ...FullType
-  }
-  empty: __type(name: "Unit") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/nullary-constructors/response.json b/test/Feature/TypeInference/introspection/union/nullary-constructors/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/nullary-constructors/response.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "data": {
-    "zeus": {
-      "kind": "OBJECT",
-      "name": "Zeus",
-      "fields": [
-        {
-          "name": "_",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "ENUM",
-              "name": "Unit",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    },
-    "cronus": {
-      "kind": "OBJECT",
-      "name": "Cronus",
-      "fields": [
-        {
-          "name": "_",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "ENUM",
-              "name": "Unit",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    },
-    "empty": {
-      "kind": "ENUM",
-      "name": "Unit",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": [
-        {
-          "name": "Unit",
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/positional-products/query.gql b/test/Feature/TypeInference/introspection/union/positional-products/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/positional-products/query.gql
+++ /dev/null
@@ -1,79 +0,0 @@
-query Get__Type {
-  someDeity: __type(name: "SomeDeity") {
-    ...FullType
-  }
-  someMutli: __type(name: "SomeMutli") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/positional-products/response.json b/test/Feature/TypeInference/introspection/union/positional-products/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/positional-products/response.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "data": {
-    "someDeity": {
-      "kind": "OBJECT",
-      "name": "SomeDeity",
-      "fields": [
-        {
-          "name": "_0",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "OBJECT", "name": "Deity", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    },
-    "someMutli": {
-      "kind": "OBJECT",
-      "name": "SomeMutli",
-      "fields": [
-        {
-          "name": "_0",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "_1",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "String", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/scalars/query.gql b/test/Feature/TypeInference/introspection/union/scalars/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/scalars/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "CharacterInt") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/scalars/response.json b/test/Feature/TypeInference/introspection/union/scalars/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/scalars/response.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "CharacterInt",
-      "fields": [
-        {
-          "name": "_0",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/union/query.gql b/test/Feature/TypeInference/introspection/union/union/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/union/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Character") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/introspection/union/union/response.json b/test/Feature/TypeInference/introspection/union/union/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/introspection/union/union/response.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "UNION",
-      "name": "Character",
-      "fields": null,
-      "inputFields": null,
-      "interfaces": null,
-      "enumValues": null,
-      "possibleTypes": [
-        { "kind": "OBJECT", "name": "Deity", "ofType": null },
-        { "kind": "OBJECT", "name": "Creature", "ofType": null },
-        { "kind": "OBJECT", "name": "BoxedDeity", "ofType": null },
-        { "kind": "OBJECT", "name": "ScalarRecord", "ofType": null },
-        { "kind": "OBJECT", "name": "CharacterInt", "ofType": null },
-        { "kind": "OBJECT", "name": "SomeDeity", "ofType": null },
-        { "kind": "OBJECT", "name": "SomeMutli", "ofType": null },
-        { "kind": "OBJECT", "name": "Zeus", "ofType": null },
-        { "kind": "OBJECT", "name": "Cronus", "ofType": null }
-      ]
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/resolving/complexUnion/query.gql b/test/Feature/TypeInference/resolving/complexUnion/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/complexUnion/query.gql
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  character {
-    ## regular union
-    __typename
-    ... on Deity {
-      name
-    }
-
-    ... on Creature {
-      creatureName
-      creatureAge
-    }
-
-    ... on BoxedDeity {
-      boxedDeity {
-        power
-      }
-    }
-
-    ... on ScalarRecord {
-      scalarText
-    }
-
-    ... on CharacterInt {
-      _0
-    }
-
-    ... on SomeDeity {
-      _0 {
-        name
-        power
-      }
-    }
-
-    ... on SomeMutli {
-      _0
-      _1
-    }
-
-    ... on Zeus {
-      _
-    }
-  }
-}
diff --git a/test/Feature/TypeInference/resolving/complexUnion/response.json b/test/Feature/TypeInference/resolving/complexUnion/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/complexUnion/response.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-  "data": {
-    "character": [
-      {
-        "__typename": "Deity",
-        "name": "Morpheus"
-      },
-      {
-        "__typename": "Creature",
-        "creatureName": "Lamia",
-        "creatureAge": 205
-      },
-      {
-        "__typename": "BoxedDeity",
-        "boxedDeity": { "power": "Shapeshift" }
-      },
-      {
-        "__typename": "ScalarRecord",
-        "scalarText": "Some Text"
-      },
-      {
-        "__typename": "SomeDeity",
-        "_0": { "name": "Morpheus", "power": "Shapeshift" }
-      },
-      {
-        "__typename": "CharacterInt",
-        "_0": 12
-      },
-      {
-        "__typename": "SomeMutli",
-        "_0": 21,
-        "_1": "some text"
-      },
-      {
-        "__typename": "Zeus",
-        "_": "Unit"
-      },
-      {
-        "__typename": "Cronus"
-      }
-    ]
-  }
-}
diff --git a/test/Feature/TypeInference/resolving/input/fail/query.gql b/test/Feature/TypeInference/resolving/input/fail/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/input/fail/query.gql
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  empty: showMonster(monster: {})
-  multiple: showMonster(
-    monster: { Hydra: { name: "someName", age: 12 }, UnidentifiedMonster: Unit }
-  )
-}
diff --git a/test/Feature/TypeInference/resolving/input/fail/response.json b/test/Feature/TypeInference/resolving/input/fail/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/input/fail/response.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Argument \"monster\" got invalid value. Expected type \"Monster!\" found {}. Exclusive input objects must provide a value for at least one field.",
-      "locations": [{ "line": 2, "column": 22 }]
-    },
-    {
-      "message": "Argument \"monster\" got invalid value. Expected type \"Monster!\" found { Hydra: { name: \"someName\", age: 12 }, UnidentifiedMonster: Unit }. Exclusive input objects are not allowed to provide values for multiple fields.",
-      "locations": [{ "line": 4, "column": 5 }]
-    }
-  ]
-}
diff --git a/test/Feature/TypeInference/resolving/input/success/query.gql b/test/Feature/TypeInference/resolving/input/success/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/input/success/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  object: showMonster(monster: { Hydra: { name: "someName", age: 12 } })
-  record: showMonster(monster: { Cerberus: { name: "someName" } })
-  enum: showMonster(monster: { UnidentifiedMonster: Unit })
-}
diff --git a/test/Feature/TypeInference/resolving/input/success/response.json b/test/Feature/TypeInference/resolving/input/success/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/input/success/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "object": "MonsterHydra (Hydra {name = \"someName\", age = 12})",
-    "record": "Cerberus {name = \"someName\"}",
-    "enum": "UnidentifiedMonster"
-  }
-}
diff --git a/test/Feature/TypeInference/resolving/object/query.gql b/test/Feature/TypeInference/resolving/object/query.gql
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/object/query.gql
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  deity {
-    name
-    power
-  }
-}
diff --git a/test/Feature/TypeInference/resolving/object/response.json b/test/Feature/TypeInference/resolving/object/response.json
deleted file mode 100644
--- a/test/Feature/TypeInference/resolving/object/response.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{ "data": { "deity": { "name": "Morpheus", "power": "Shapeshift" } } }
diff --git a/test/Feature/UnionType/API.hs b/test/Feature/UnionType/API.hs
deleted file mode 100644
--- a/test/Feature/UnionType/API.hs
+++ /dev/null
@@ -1,69 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module Feature.UnionType.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType (..),
-    ResolverQ,
-    RootResolver (..),
-    Undefined (..),
-  )
-import Data.Text (Text)
-import GHC.Generics (Generic)
-
-data A = A
-  { aText :: Text,
-    aInt :: Int
-  }
-  deriving (Generic, GQLType)
-
-data B = B
-  { bText :: Text,
-    bInt :: Int
-  }
-  deriving (Generic, GQLType)
-
-data C = C
-  { cText :: Text,
-    cInt :: Int
-  }
-  deriving (Generic, GQLType)
-
-data Sum
-  = SumA A
-  | SumB B
-  deriving (Generic, GQLType)
-
-data Query m = Query
-  { union :: () -> m [Sum],
-    fc :: C
-  }
-  deriving (Generic, GQLType)
-
-resolveUnion :: () -> ResolverQ () IO [Sum]
-resolveUnion _ =
-  return [SumA A {aText = "at", aInt = 1}, SumB B {bText = "bt", bInt = 2}]
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
-  RootResolver
-    { queryResolver =
-        Query
-          { union = resolveUnion,
-            fc = C {cText = "", cInt = 3}
-          },
-      mutationResolver = Undefined,
-      subscriptionResolver = Undefined
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/UnionType/cannotBeSpreadOnType/query.gql b/test/Feature/UnionType/cannotBeSpreadOnType/query.gql
deleted file mode 100644
--- a/test/Feature/UnionType/cannotBeSpreadOnType/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  union {
-    ...FC
-  }
-}
-
-fragment FC on C {
-  cText
-}
diff --git a/test/Feature/UnionType/cannotBeSpreadOnType/response.json b/test/Feature/UnionType/cannotBeSpreadOnType/response.json
deleted file mode 100644
--- a/test/Feature/UnionType/cannotBeSpreadOnType/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fragment \"FC\" cannot be spread here as objects of type \"A\", \"B\" can never be of type \"C\".",
-      "locations": [
-        {
-          "line": 3,
-          "column": 5
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/UnionType/cases.json b/test/Feature/UnionType/cases.json
deleted file mode 100644
--- a/test/Feature/UnionType/cases.json
+++ /dev/null
@@ -1,26 +0,0 @@
-[
-  {
-    "path": "fragmentOnAAndB",
-    "description": "returns field __typename and fields by Fragment Type "
-  },
-  {
-    "path": "fragmentOnlyOnA",
-    "description": "returns empty object {}, when there is no any fragment for Type this Type"
-  },
-  {
-    "path": "cannotBeSpreadOnType",
-    "description": "Fail when: there is fragment with incompatible type"
-  },
-  {
-    "path": "selectionWithoutFragmentNotAllowed",
-    "description": "Fail when: user tries to directly select field without any Fragment"
-  },
-  {
-    "path": "inlineFragment/fragmentOnAAndB",
-    "description": "returns field __typename and fields by InlineFragment Type "
-  },
-  {
-    "path": "inlineFragment/cannotBeSpreadOnType",
-    "description": "Fail when: there is inlineFragment with incompatible type"
-  }
-]
diff --git a/test/Feature/UnionType/fragmentOnAAndB/query.gql b/test/Feature/UnionType/fragmentOnAAndB/query.gql
deleted file mode 100644
--- a/test/Feature/UnionType/fragmentOnAAndB/query.gql
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  union {
-    __typename
-    ...FA
-    ...FB
-  }
-}
-
-fragment FA on A {
-  aText
-}
-
-fragment FB on B {
-  bText
-}
diff --git a/test/Feature/UnionType/fragmentOnAAndB/response.json b/test/Feature/UnionType/fragmentOnAAndB/response.json
deleted file mode 100644
--- a/test/Feature/UnionType/fragmentOnAAndB/response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "data": {
-    "union": [
-      {
-        "__typename": "A",
-        "aText": "at"
-      },
-      {
-        "__typename": "B",
-        "bText": "bt"
-      }
-    ]
-  }
-}
diff --git a/test/Feature/UnionType/fragmentOnlyOnA/query.gql b/test/Feature/UnionType/fragmentOnlyOnA/query.gql
deleted file mode 100644
--- a/test/Feature/UnionType/fragmentOnlyOnA/query.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  union {
-    ...FA
-  }
-}
-
-fragment FA on A {
-  aText
-}
diff --git a/test/Feature/UnionType/fragmentOnlyOnA/response.json b/test/Feature/UnionType/fragmentOnlyOnA/response.json
deleted file mode 100644
--- a/test/Feature/UnionType/fragmentOnlyOnA/response.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "data": {
-    "union": [
-      {
-        "aText": "at"
-      },
-      {
-      }
-    ]
-  }
-}
diff --git a/test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/query.gql b/test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/query.gql
deleted file mode 100644
--- a/test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/query.gql
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  union {
-    ... on C {
-      aText
-    }
-  }
-}
diff --git a/test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/response.json b/test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/response.json
deleted file mode 100644
--- a/test/Feature/UnionType/inlineFragment/cannotBeSpreadOnType/response.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Fragment cannot be spread here as objects of type \"A\", \"B\" can never be of type \"C\".",
-      "locations": [{ "line": 3, "column": 5 }]
-    }
-  ]
-}
diff --git a/test/Feature/UnionType/inlineFragment/fragmentOnAAndB/query.gql b/test/Feature/UnionType/inlineFragment/fragmentOnAAndB/query.gql
deleted file mode 100644
--- a/test/Feature/UnionType/inlineFragment/fragmentOnAAndB/query.gql
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  union {
-    __typename
-    ... on A {
-      aText
-    }
-    ... on B {
-      bText
-    }
-  }
-}
diff --git a/test/Feature/UnionType/inlineFragment/fragmentOnAAndB/response.json b/test/Feature/UnionType/inlineFragment/fragmentOnAAndB/response.json
deleted file mode 100644
--- a/test/Feature/UnionType/inlineFragment/fragmentOnAAndB/response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "data": {
-    "union": [
-      {
-        "__typename": "A",
-        "aText": "at"
-      },
-      {
-        "__typename": "B",
-        "bText": "bt"
-      }
-    ]
-  }
-}
diff --git a/test/Feature/UnionType/selectionWithoutFragmentNotAllowed/query.gql b/test/Feature/UnionType/selectionWithoutFragmentNotAllowed/query.gql
deleted file mode 100644
--- a/test/Feature/UnionType/selectionWithoutFragmentNotAllowed/query.gql
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  union {
-    ...FA
-    aText
-  }
-}
-
-fragment FA on A {
-  aText
-}
diff --git a/test/Feature/UnionType/selectionWithoutFragmentNotAllowed/response.json b/test/Feature/UnionType/selectionWithoutFragmentNotAllowed/response.json
deleted file mode 100644
--- a/test/Feature/UnionType/selectionWithoutFragmentNotAllowed/response.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "errors": [
-    {
-      "message": "Cannot query field \"aText\" on type \"Sum\".",
-      "locations": [
-        {
-          "line": 4,
-          "column": 5
-        }
-      ]
-    }
-  ]
-}
diff --git a/test/Feature/WrappedTypeName/API.hs b/test/Feature/WrappedTypeName/API.hs
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/API.hs
+++ /dev/null
@@ -1,82 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Feature.WrappedTypeName.API
-  ( api,
-  )
-where
-
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Subscriptions (Event)
-import Data.Morpheus.Types
-  ( GQLRequest,
-    GQLResponse,
-    GQLType (..),
-    RootResolver (..),
-    SubscriptionField,
-    constRes,
-    subscribe,
-  )
-import Relude
-
-data Wrapped a b = Wrapped
-  { fieldA :: a,
-    fieldB :: b
-  }
-  deriving (Generic, GQLType)
-
-data WA m = WA
-  { aText :: () -> m Text,
-    aInt :: Int
-  }
-  deriving (Generic, GQLType)
-
-type Wrapped1 = Wrapped Int Int
-
-type Wrapped2 = Wrapped (Wrapped Text Int) Text
-
-data Query m = Query
-  { a1 :: WA m,
-    a2 :: Maybe Wrapped1,
-    a3 :: Maybe Wrapped2
-  }
-  deriving (Generic, GQLType)
-
-data Mutation m = Mutation
-  { mut1 :: Maybe (WA m),
-    mut2 :: Maybe Wrapped1,
-    mut3 :: Maybe Wrapped2
-  }
-  deriving (Generic, GQLType)
-
-data Channel
-  = Channel
-  deriving (Show, Eq)
-
-type EVENT = Event Channel ()
-
-data Subscription (m :: * -> *) = Subscription
-  { sub1 :: SubscriptionField (m (Maybe (WA m))),
-    sub2 :: SubscriptionField (m (Maybe Wrapped1)),
-    sub3 :: SubscriptionField (m (Maybe Wrapped2))
-  }
-  deriving (Generic, GQLType)
-
-rootResolver :: RootResolver IO EVENT Query Mutation Subscription
-rootResolver =
-  RootResolver
-    { queryResolver = Query {a1 = WA {aText = const $ pure "test1", aInt = 0}, a2 = Nothing, a3 = Nothing},
-      mutationResolver = Mutation {mut1 = Nothing, mut2 = Nothing, mut3 = Nothing},
-      subscriptionResolver =
-        Subscription
-          { sub1 = subscribe Channel (pure $ constRes Nothing),
-            sub2 = subscribe Channel (pure $ constRes Nothing),
-            sub3 = subscribe Channel (pure $ constRes Nothing)
-          }
-    }
-
-api :: GQLRequest -> IO GQLResponse
-api = interpreter rootResolver
diff --git a/test/Feature/WrappedTypeName/cases.json b/test/Feature/WrappedTypeName/cases.json
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/cases.json
+++ /dev/null
@@ -1,18 +0,0 @@
-[
-  {
-    "path": "validWrappedTypes",
-    "description": "don't fail: if Mutation, Query, or Subscription Resolver is packed inside GQLType"
-  },
-  {
-    "path": "ignoreQueryResolver",
-    "description": "ignore Query Resolver monad from typeName, but concatenates other wrapped types with _"
-  },
-  {
-    "path": "ignoreMutationResolver",
-    "description": "ignore Mutation Resolver monad from typeName, but concatenates other wrapped types with _"
-  },
-  {
-    "path": "ignoreSubscriptionResolver",
-    "description": "ignore Subscription Resolver monad from typeName, but concatenates other wrapped types with _"
-  }
-]
diff --git a/test/Feature/WrappedTypeName/ignoreMutationResolver/query.gql b/test/Feature/WrappedTypeName/ignoreMutationResolver/query.gql
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/ignoreMutationResolver/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Mutation") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/WrappedTypeName/ignoreMutationResolver/response.json b/test/Feature/WrappedTypeName/ignoreMutationResolver/response.json
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/ignoreMutationResolver/response.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "Mutation",
-      "fields": [
-        {
-          "name": "mut1",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WA",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "mut2",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WrappedIntInt",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "mut3",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WrappedWrappedTextIntText",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/WrappedTypeName/ignoreQueryResolver/query.gql b/test/Feature/WrappedTypeName/ignoreQueryResolver/query.gql
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/ignoreQueryResolver/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Query") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/WrappedTypeName/ignoreQueryResolver/response.json b/test/Feature/WrappedTypeName/ignoreQueryResolver/response.json
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/ignoreQueryResolver/response.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "Query",
-      "fields": [
-        {
-          "name": "a1",
-          "args": [],
-          "type": {
-            "kind": "NON_NULL",
-            "name": null,
-            "ofType": {
-              "kind": "OBJECT",
-              "name": "WA",
-              "ofType": null
-            }
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "a2",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WrappedIntInt",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "a3",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WrappedWrappedTextIntText",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/WrappedTypeName/ignoreSubscriptionResolver/query.gql b/test/Feature/WrappedTypeName/ignoreSubscriptionResolver/query.gql
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/ignoreSubscriptionResolver/query.gql
+++ /dev/null
@@ -1,76 +0,0 @@
-query Get__Type {
-  __type(name: "Subscription") {
-    ...FullType
-  }
-}
-
-fragment FullType on __Type {
-  kind
-  name
-  fields(includeDeprecated: true) {
-    name
-    args {
-      ...InputValue
-    }
-    type {
-      ...TypeRef
-    }
-    isDeprecated
-    deprecationReason
-  }
-  inputFields {
-    ...InputValue
-  }
-  interfaces {
-    ...TypeRef
-  }
-  enumValues(includeDeprecated: true) {
-    name
-    isDeprecated
-    deprecationReason
-  }
-  possibleTypes {
-    ...TypeRef
-  }
-}
-
-fragment InputValue on __InputValue {
-  name
-  type {
-    ...TypeRef
-  }
-  defaultValue
-}
-
-fragment TypeRef on __Type {
-  kind
-  name
-  ofType {
-    kind
-    name
-    ofType {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/test/Feature/WrappedTypeName/ignoreSubscriptionResolver/response.json b/test/Feature/WrappedTypeName/ignoreSubscriptionResolver/response.json
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/ignoreSubscriptionResolver/response.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "data": {
-    "__type": {
-      "kind": "OBJECT",
-      "name": "Subscription",
-      "fields": [
-        {
-          "name": "sub1",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WA",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "sub2",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WrappedIntInt",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        },
-        {
-          "name": "sub3",
-          "args": [],
-          "type": {
-            "kind": "OBJECT",
-            "name": "WrappedWrappedTextIntText",
-            "ofType": null
-          },
-          "isDeprecated": false,
-          "deprecationReason": null
-        }
-      ],
-      "inputFields": null,
-      "interfaces": [],
-      "enumValues": null,
-      "possibleTypes": null
-    }
-  }
-}
diff --git a/test/Feature/WrappedTypeName/validWrappedTypes/query.gql b/test/Feature/WrappedTypeName/validWrappedTypes/query.gql
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/validWrappedTypes/query.gql
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  a1 {
-    aText
-  }
-}
diff --git a/test/Feature/WrappedTypeName/validWrappedTypes/response.json b/test/Feature/WrappedTypeName/validWrappedTypes/response.json
deleted file mode 100644
--- a/test/Feature/WrappedTypeName/validWrappedTypes/response.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "data": {
-    "a1": {
-      "aText": "test1"
-    }
-  }
-}
diff --git a/test/Lib.hs b/test/Lib.hs
deleted file mode 100644
--- a/test/Lib.hs
+++ /dev/null
@@ -1,37 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Lib
-  ( getGQLBody,
-    getResponseBody,
-    getCases,
-    maybeVariables,
-  )
-where
-
-import Data.Aeson (FromJSON, Value (..), decode)
-import qualified Data.ByteString.Lazy as L (readFile)
-import Data.ByteString.Lazy.Char8 (ByteString)
-import Data.Text (unpack)
-import Relude hiding (ByteString)
-
-path :: Text -> String
-path name = "test/" ++ unpack name
-
-gqlLib :: Text -> String
-gqlLib x = path x ++ "/query.gql"
-
-resLib :: Text -> String
-resLib x = path x ++ "/response.json"
-
-maybeVariables :: Text -> IO (Maybe Value)
-maybeVariables x = decode <$> (L.readFile (path x ++ "/variables.json") <|> return "{}")
-
-getGQLBody :: Text -> IO ByteString
-getGQLBody p = L.readFile (gqlLib p)
-
-getCases :: FromJSON a => String -> IO [a]
-getCases dir = fromMaybe [] . decode <$> L.readFile ("test/" ++ dir ++ "/cases.json")
-
-getResponseBody :: Text -> IO Value
-getResponseBody p = fromMaybe Null . decode <$> L.readFile (resLib p)
diff --git a/test/Rendering/Schema.hs b/test/Rendering/Schema.hs
--- a/test/Rendering/Schema.hs
+++ b/test/Rendering/Schema.hs
@@ -12,32 +12,30 @@
 
 module Rendering.Schema
   ( proxy,
-    path,
   )
 where
 
-import Data.Morpheus.Document (importGQLDocumentWithNamespace)
+import Data.Morpheus.Document
+  ( importGQLDocumentWithNamespace,
+  )
 import Data.Morpheus.Types
   ( DecodeScalar (..),
-    ID (..),
-    RootResolver (..),
-    Undefined (..),
+    ID,
+    RootResolver,
+    Undefined,
   )
-import Data.Proxy (Proxy (..))
-import Data.Text (Text)
-import GHC.Generics (Generic)
+import Relude hiding (Undefined)
 
-data TestScalar
-  = TestScalar
-  deriving (Show, Generic)
+data TestScalar = TestScalar
+  deriving (Show)
 
 instance DecodeScalar TestScalar where
   decodeScalar _ = pure TestScalar
 
 importGQLDocumentWithNamespace "test/Rendering/schema.gql"
 
-path :: String
-path = "test/Rendering/schema.gql"
+type APIResolver e (m :: * -> *) =
+  RootResolver m e MyQuery MyMutation Undefined
 
-proxy :: Proxy (RootResolver IO () MyQuery MyMutation Undefined)
-proxy = Proxy @(RootResolver IO () MyQuery MyMutation Undefined)
+proxy :: Proxy (APIResolver () IO)
+proxy = Proxy
diff --git a/test/Rendering/TestSchemaRendering.hs b/test/Rendering/TestSchemaRendering.hs
--- a/test/Rendering/TestSchemaRendering.hs
+++ b/test/Rendering/TestSchemaRendering.hs
@@ -6,15 +6,15 @@
   )
 where
 
-import Data.ByteString.Lazy.Char8 (readFile)
-import Data.Morpheus.Document (toGraphQLDocument)
-import Rendering.Schema (path, proxy)
+import qualified Data.ByteString.Lazy.Char8 as T
+import Data.Morpheus.Server (printSchema)
+import Relude hiding (ByteString, readFile)
+import Rendering.Schema (proxy)
+import Test.Morpheus (file, mkUrl, renderingAssertion)
 import Test.Tasty (TestTree)
-import Test.Tasty.HUnit (assertEqual, testCase)
-import Prelude (($))
 
+xyz :: b -> IO (Either String T.ByteString)
+xyz _ = pure $ Right $ printSchema proxy
+
 testSchemaRendering :: TestTree
-testSchemaRendering = testCase "Test Rendering" $ do
-  let schema = toGraphQLDocument proxy
-  expected <- readFile path
-  assertEqual "test schema Rendering" expected schema
+testSchemaRendering = renderingAssertion xyz (file (mkUrl "Rendering") "schema")
diff --git a/test/Rendering/schema.gql b/test/Rendering/schema.gql
--- a/test/Rendering/schema.gql
+++ b/test/Rendering/schema.gql
@@ -1,18 +1,21 @@
+scalar TestScalar
+
 enum TestEnum {
   EnumA
   EnumB
   EnumC
 }
 
-type Address {
-  street: [[[[String!]!]!]]
-}
-
 input Coordinates {
   latitude: TestScalar!
   longitude: Int!
 }
 
+type Address {
+  street: [[[[String!]!]!]]
+  score: Float!
+}
+
 type User {
   type: String!
   address(coordinates: Coordinates!, type: String): Int!
@@ -20,8 +23,6 @@
 }
 
 union TestUnion = User | Address
-
-scalar TestScalar
 
 type MyQuery {
   user: User!
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,81 +1,92 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoImplicitPrelude #-}
 
 module Main
   ( main,
   )
 where
 
+import Data.Morpheus (runApp)
+import Data.Morpheus.Types (GQLRequest (..), GQLResponse (..))
+import qualified Feature.Collision.CategoryCollisionFail as TypeCategoryCollisionFail
+import qualified Feature.Collision.CategoryCollisionSuccess as TypeCategoryCollisionSuccess
+import qualified Feature.Collision.NameCollision as NameCollision
 import qualified Feature.Holistic.API as Holistic
-  ( api,
-  )
-import qualified Feature.Input.DefaultValue.API as DefaultValue
-  ( api,
-  )
-import qualified Feature.Input.Enum.API as InputEnum
-  ( api,
-  )
-import qualified Feature.Input.Object.API as InputObject
-  ( api,
-  )
-import qualified Feature.Input.Scalar.API as InputScalar
-  ( api,
-  )
-import qualified Feature.InputType.API as InputType
-  ( api,
-  )
-import qualified Feature.Schema.API as Schema
-  ( api,
-  )
-import qualified Feature.TypeCategoryCollision.Fail.API as TypeCategoryCollisionFail
-import qualified Feature.TypeCategoryCollision.Success.API as TypeCategoryCollisionSuccess
-import qualified Feature.TypeInference.API as Inference
-  ( api,
-  )
-import qualified Feature.UnionType.API as UnionType
-  ( api,
-  )
-import qualified Feature.WrappedTypeName.API as TypeName
-  ( api,
-  )
+import qualified Feature.Inference.TaggedArguments as TaggedArguments
+import qualified Feature.Inference.TaggedArgumentsFail as TaggedArgumentsFail
+import qualified Feature.Inference.TypeGuards as TypeGuards
+import qualified Feature.Inference.TypeInference as TypeInference
+import qualified Feature.Inference.UnionType as UnionType
+import qualified Feature.Inference.WrappedType as WrappedType
+import qualified Feature.Input.DefaultValues as DefaultValues
+import qualified Feature.Input.Enums as Enums
+import qualified Feature.Input.Objects as Objects
+import qualified Feature.Input.Scalars as Scalars
+import qualified Feature.Input.Variables as Variables
+import qualified Feature.NamedResolvers.API as NamedResolvers
+import Relude
 import Rendering.TestSchemaRendering (testSchemaRendering)
-import Subscription.Test (testSubsriptions)
+import Subscription.Test (testSubscriptions)
+import Test.Morpheus
+  ( FileUrl,
+    cd,
+    mainTest,
+    mkUrl,
+    scan,
+    testApi,
+  )
 import Test.Tasty
-  ( defaultMain,
+  ( TestTree,
     testGroup,
   )
-import TestFeature (testFeature)
 
+mkFeatureUrl :: FilePath -> FilePath -> FileUrl
+mkFeatureUrl groupName = cd (cd (mkUrl "Feature") groupName)
+
+testFeature :: FilePath -> (GQLRequest -> IO GQLResponse, FilePath) -> IO TestTree
+testFeature groupName (api, name) = scan (testApi api) (mkFeatureUrl groupName name)
+
+testFeatures :: FilePath -> [(GQLRequest -> IO GQLResponse, FilePath)] -> IO TestTree
+testFeatures name cases =
+  testGroup name
+    <$> traverse
+      (testFeature name)
+      cases
+
 main :: IO ()
-main = do
-  ioTests <- testFeature Holistic.api "Feature/Holistic"
-  unionTest <- testFeature UnionType.api "Feature/UnionType"
-  inputTest <- testFeature InputType.api "Feature/InputType"
-  schemaTest <- testFeature Schema.api "Feature/Schema"
-  typeName <- testFeature TypeName.api "Feature/WrappedTypeName"
-  inputEnum <- testFeature InputEnum.api "Feature/Input/Enum"
-  inputScalar <- testFeature InputScalar.api "Feature/Input/Scalar"
-  inputObject <- testFeature InputObject.api "Feature/Input/Object"
-  defaultValue <- testFeature DefaultValue.api "Feature/Input/DefaultValue"
-  inference <- testFeature Inference.api "Feature/TypeInference"
-  subscription <- testSubsriptions
-  typecatColisionFail <- testFeature TypeCategoryCollisionFail.api "Feature/TypeCategoryCollision/Fail"
-  typecatColisionSuccess <- testFeature TypeCategoryCollisionSuccess.api "Feature/TypeCategoryCollision/Success"
-  defaultMain
-    ( testGroup
-        "Morpheus Graphql Tests"
-        [ ioTests,
-          unionTest,
-          inputTest,
-          schemaTest,
-          typeName,
-          inputEnum,
-          inputScalar,
-          inputObject,
-          testSchemaRendering,
-          inference,
-          subscription,
-          defaultValue,
-          typecatColisionFail,
-          typecatColisionSuccess
-        ]
-    )
+main =
+  mainTest
+    "Morpheus Graphql Tests"
+    [ testFeatures
+        "Input"
+        [ (Variables.api, "variables"),
+          (Enums.api, "enums"),
+          (Scalars.api, "scalars"),
+          (Objects.api, "objects"),
+          (DefaultValues.api, "default-values")
+        ],
+      testFeatures
+        "Collision"
+        [ (TypeCategoryCollisionSuccess.api, "category-collision-success"),
+          (TypeCategoryCollisionFail.api, "category-collision-fail"),
+          (NameCollision.api, "name-collision")
+        ],
+      testFeatures
+        "Inference"
+        [ (WrappedType.api, "wrapped-type"),
+          (TypeGuards.api, "type-guards"),
+          (UnionType.api, "union-type"),
+          (TypeInference.api, "type-inference"),
+          (TaggedArguments.api, "tagged-arguments"),
+          (TaggedArgumentsFail.api, "tagged-arguments-fail")
+        ],
+      testFeatures
+        "Holistic"
+        [ (Holistic.api, "holistic")
+        ],
+      testFeatures
+        "NamedResolvers"
+        [(runApp NamedResolvers.app, "tests")],
+      testSubscriptions,
+      pure testSchemaRendering
+    ]
diff --git a/test/Subscription/API.hs b/test/Subscription/API.hs
--- a/test/Subscription/API.hs
+++ b/test/Subscription/API.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DerivingStrategies #-}
diff --git a/test/Subscription/Test.hs b/test/Subscription/Test.hs
--- a/test/Subscription/Test.hs
+++ b/test/Subscription/Test.hs
@@ -1,14 +1,14 @@
 {-# LANGUAGE OverloadedStrings #-}
 
-module Subscription.Test (testSubsriptions) where
+module Subscription.Test (testSubscriptions) where
 
 import qualified Subscription.API as TS
 import Subscription.Case.ApolloRequest (testApolloRequest)
 import Subscription.Case.Publishing (testPublishing)
 import Test.Tasty (TestTree, testGroup)
 
-testSubsriptions :: IO TestTree
-testSubsriptions = do
+testSubscriptions :: IO TestTree
+testSubscriptions = do
   subscription <- testApolloRequest TS.app
   publishing <- testPublishing
   return $ testGroup "Subscription" [subscription, publishing]
diff --git a/test/TestFeature.hs b/test/TestFeature.hs
deleted file mode 100644
--- a/test/TestFeature.hs
+++ /dev/null
@@ -1,59 +0,0 @@
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module TestFeature
-  ( testFeature,
-  )
-where
-
-import Data.Aeson (Value, decode, encode)
-import Data.ByteString.Lazy.Char8 (ByteString)
-import qualified Data.ByteString.Lazy.Char8 as LB (unpack)
-import Data.Morpheus.Types (GQLRequest (..), GQLResponse (..))
-import Data.Semigroup ((<>))
-import Data.Text (unpack)
-import qualified Data.Text.Lazy as LT (toStrict)
-import Data.Text.Lazy.Encoding (decodeUtf8)
-import Lib (getGQLBody, getResponseBody, maybeVariables)
-import Test.Tasty (TestTree)
-import Test.Tasty.HUnit (assertFailure, testCase)
-import Types
-  ( Case (..),
-    Name,
-    testWith,
-  )
-import Prelude
-  ( ($),
-    (<$>),
-    Eq (..),
-    IO,
-    Maybe (..),
-    otherwise,
-    pure,
-  )
-
-packGQLRequest :: ByteString -> Maybe Value -> GQLRequest
-packGQLRequest queryBS variables =
-  GQLRequest
-    { operationName = Nothing,
-      query = LT.toStrict $ decodeUtf8 queryBS,
-      variables
-    }
-
-testFeature :: (GQLRequest -> IO GQLResponse) -> Name -> IO TestTree
-testFeature api = testWith (testByFiles api)
-
-testByFiles :: (GQLRequest -> IO GQLResponse) -> Case -> IO TestTree
-testByFiles testApi Case {path, description} = do
-  testCaseQuery <- getGQLBody path
-  testCaseVariables <- maybeVariables path
-  expectedResponse <- getResponseBody path
-  actualResponse <- encode <$> testApi (packGQLRequest testCaseQuery testCaseVariables)
-  case decode actualResponse of
-    Nothing -> assertFailure "Bad Response"
-    Just response -> pure $ testCase (unpack path <> " | " <> description) $ customTest expectedResponse response
-      where
-        customTest expected value
-          | expected == value = pure ()
-          | otherwise = assertFailure $ LB.unpack $ "expected: \n " <> encode expected <> " \n but got: \n " <> actualResponse
diff --git a/test/Types.hs b/test/Types.hs
deleted file mode 100644
--- a/test/Types.hs
+++ /dev/null
@@ -1,33 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Types
-  ( Case (..),
-    Name,
-    testWith,
-  )
-where
-
-import Data.Aeson (FromJSON)
-import Data.Text (unpack)
-import qualified Data.Text as T (concat)
-import GHC.Generics
-import Lib (getCases)
-import Relude
-import Test.Tasty (TestTree, testGroup)
-
-type Name = Text
-
-data Case = Case
-  { path :: Text,
-    description :: String
-  }
-  deriving (Generic, FromJSON)
-
-testWith :: (Case -> IO TestTree) -> Name -> IO TestTree
-testWith f dir = do
-  cases <- getCases (unpack dir)
-  test <- sequence $ f <$> map (\x -> x {path = T.concat [dir, "/", path x]}) cases
-  return $ testGroup (unpack dir) test
