diff --git a/morpheus-graphql-server.cabal b/morpheus-graphql-server.cabal
--- a/morpheus-graphql-server.cabal
+++ b/morpheus-graphql-server.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           morpheus-graphql-server
-version:        0.22.1
+version:        0.23.0
 synopsis:       Morpheus GraphQL
 description:    Build GraphQL APIs with your favourite functional language!
 category:       web, graphql
@@ -320,8 +320,8 @@
     , base >=4.7.0 && <5.0.0
     , bytestring >=0.10.4 && <0.12.0
     , containers >=0.4.2.1 && <0.7.0
-    , morpheus-graphql-app >=0.22.0 && <0.23.0
-    , morpheus-graphql-core >=0.22.0 && <0.23.0
+    , morpheus-graphql-app >=0.23.0 && <0.24.0
+    , morpheus-graphql-core >=0.23.0 && <0.24.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
     , template-haskell >=2.0.0 && <3.0.0
@@ -365,11 +365,11 @@
     , bytestring >=0.10.4 && <0.12.0
     , containers >=0.4.2.1 && <0.7.0
     , file-embed >=0.0.10 && <1.0.0
-    , morpheus-graphql-app >=0.22.0 && <0.23.0
-    , morpheus-graphql-core >=0.22.0 && <0.23.0
+    , morpheus-graphql-app >=0.23.0 && <0.24.0
+    , morpheus-graphql-core >=0.23.0 && <0.24.0
     , morpheus-graphql-server
-    , morpheus-graphql-subscriptions >=0.22.0 && <0.23.0
-    , morpheus-graphql-tests >=0.22.0 && <0.23.0
+    , morpheus-graphql-subscriptions >=0.23.0 && <0.24.0
+    , morpheus-graphql-tests >=0.23.0 && <0.24.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
     , tasty >=0.1.0 && <1.5.0
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
@@ -32,10 +32,10 @@
   ( Decode,
     decodeArguments,
   )
+import Data.Morpheus.Server.Deriving.Schema.Directive (toFieldRes)
 import Data.Morpheus.Server.Deriving.Utils
   ( ConsRep (..),
     DataType (..),
-    FieldRep (..),
   )
 import Data.Morpheus.Server.Deriving.Utils.DeriveGType
   ( DeriveValueOptions (..),
@@ -43,8 +43,7 @@
     deriveValue,
   )
 import Data.Morpheus.Server.Deriving.Utils.Kinded (KindedProxy (..), kinded)
-import Data.Morpheus.Server.Types.GQLType (GQLType (typeOptions), deriveTypename, __typeData)
-import Data.Morpheus.Server.Types.Internal (defaultTypeOptions)
+import Data.Morpheus.Server.Types.GQLType (GQLType, deriveTypename, __typeData)
 import Data.Morpheus.Server.Types.Types (Undefined)
 import Data.Morpheus.Types.Internal.AST
   ( FieldName,
@@ -140,12 +139,13 @@
 instance (GQLType a, Generic a, DeriveWith (ChannelConstraint e) (ChannelRes e) (Rep a)) => ExploreChannels 'False e a where
   exploreChannels _ =
     HM.fromList
-      . convertNode
+      . map (toFieldRes (Proxy @a))
+      . consFields
+      . tyCons
       . deriveValue
         ( DeriveValueOptions
             { __valueApply = getChannel,
               __valueTypeName = deriveTypename (KindedProxy :: KindedProxy OUT a),
-              __valueGQLOptions = typeOptions (Proxy @a) defaultTypeOptions,
               __valueGetType = __typeData . kinded (Proxy @OUT)
             } ::
             DeriveValueOptions OUT (ChannelConstraint e) (ChannelRes e)
@@ -153,8 +153,3 @@
 
 instance ExploreChannels 'True e (Undefined m) where
   exploreChannels _ = pure HM.empty
-
-convertNode :: DataType (ChannelRes e) -> [(FieldName, ChannelRes e)]
-convertNode DataType {tyCons = ConsRep {consFields}} = map toChannels consFields
-  where
-    toChannels FieldRep {fieldSelector, fieldValue} = (fieldSelector, fieldValue)
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
@@ -49,14 +49,10 @@
   )
 import Data.Morpheus.Server.Types.GQLType
   ( GQLType
-      ( KIND,
-        typeOptions
+      ( KIND
       ),
     deriveTypename,
   )
-import Data.Morpheus.Server.Types.Internal
-  ( defaultTypeOptions,
-  )
 import Data.Morpheus.Server.Types.Kind
   ( CUSTOM,
     DerivingKind,
@@ -122,8 +118,7 @@
     where
       context =
         Context
-          { options = typeOptions proxy defaultTypeOptions,
-            isVariantRef = False,
+          { isVariantRef = False,
             typeName = deriveTypename (KindedProxy :: KindedProxy IN a),
             enumVisitor = visitEnumName proxy,
             fieldVisitor = visitFieldName proxy
@@ -206,11 +201,11 @@
 instance (Selector s, GQLType a, Decode a) => DecodeFields (M1 S s (K1 i a)) where
   decodeFields index value =
     M1 . K1 <$> do
-      Context {options, isVariantRef, fieldVisitor} <- ask
+      Context {isVariantRef, fieldVisitor} <- ask
       if isVariantRef
         then lift (decode value)
         else
-          let fieldName = fieldVisitor $ getFieldName (selNameProxy options (Proxy @s)) index
+          let fieldName = fieldVisitor $ getFieldName (selNameProxy (Proxy @s)) index
               fieldDecoder = decodeFieldWith (lift . decode) fieldName
            in withInputObject fieldDecoder value
 
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
@@ -62,13 +62,12 @@
   ( RootResolver (..),
   )
 import Data.Morpheus.Server.Types.GQLType
-  ( GQLType (typeOptions),
+  ( GQLType,
     KIND,
     deriveTypename,
     __isEmptyType,
     __typeData,
   )
-import Data.Morpheus.Server.Types.Internal (defaultTypeOptions)
 import Data.Morpheus.Server.Types.Kind
   ( CUSTOM,
     DerivingKind,
@@ -212,7 +211,6 @@
       ( DeriveValueOptions
           { __valueApply = encode,
             __valueTypeName = deriveTypename (KindedProxy :: KindedProxy IN a),
-            __valueGQLOptions = typeOptions (Proxy @a) defaultTypeOptions,
             __valueGetType = __typeData . kinded (Proxy @IN)
           } ::
           DeriveValueOptions IN (ExplorerConstraint m) (m (ResolverValue m))
diff --git a/src/Data/Morpheus/Server/Deriving/Named/EncodeValue.hs b/src/Data/Morpheus/Server/Deriving/Named/EncodeValue.hs
--- a/src/Data/Morpheus/Server/Deriving/Named/EncodeValue.hs
+++ b/src/Data/Morpheus/Server/Deriving/Named/EncodeValue.hs
@@ -60,9 +60,8 @@
   ( NamedResolverT (..),
     ResolveNamed (..),
   )
-import Data.Morpheus.Server.Types (defaultTypeOptions)
 import Data.Morpheus.Server.Types.GQLType
-  ( GQLType (typeOptions, __type),
+  ( GQLType (__type),
     KIND,
     deriveTypename,
     __typeData,
@@ -166,7 +165,6 @@
     ( DeriveValueOptions
         { __valueApply = encodeField,
           __valueTypeName = deriveTypename (KindedProxy :: KindedProxy OUT a),
-          __valueGQLOptions = typeOptions (Proxy @a) defaultTypeOptions,
           __valueGetType = __typeData . kinded (Proxy @OUT)
         } ::
         DeriveValueOptions OUT (GValueMapConstraint m) (m (ResolverValue m))
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
@@ -61,7 +61,7 @@
     __isEmptyType,
     __typeData,
   )
-import Data.Morpheus.Server.Types.Internal (TypeData (..), defaultTypeOptions)
+import Data.Morpheus.Server.Types.Internal (TypeData (..))
 import Data.Morpheus.Server.Types.Kind
   ( CUSTOM,
     DerivingKind,
@@ -289,8 +289,7 @@
 deriveTypeContent =
   deriveTypeContentWith
     ( DeriveTypeDefinitionOptions
-        { __typeGQLOptions = typeOptions (Proxy @a) defaultTypeOptions,
-          __typeGetType = __typeData . kinded (Proxy @kind),
+        { __typeGetType = __typeData . kinded (Proxy @kind),
           __typeApply = deriveFieldContent
         } ::
         DeriveTypeOptions kind (DeriveWithConstraint kind) (TyContentM kind)
diff --git a/src/Data/Morpheus/Server/Deriving/Schema/Directive.hs b/src/Data/Morpheus/Server/Deriving/Schema/Directive.hs
--- a/src/Data/Morpheus/Server/Deriving/Schema/Directive.hs
+++ b/src/Data/Morpheus/Server/Deriving/Schema/Directive.hs
@@ -31,7 +31,7 @@
 import Control.Monad.Except (throwError)
 import qualified Data.HashMap.Lazy as HM
 import Data.Morpheus.Internal.Ext (resultOr, unsafeFromList)
-import Data.Morpheus.Internal.Utils (Empty (..))
+import Data.Morpheus.Internal.Utils (Empty (..), fromElems)
 import Data.Morpheus.Server.Deriving.Utils.Kinded
   ( KindedProxy (..),
   )
@@ -51,17 +51,21 @@
     applyFieldDescription,
     applyFieldName,
     applyTypeDescription,
+    applyTypeEnumNames,
+    applyTypeFieldNames,
     deriveFingerprint,
     deriveTypename,
     encodeArguments,
   )
+import Data.Morpheus.Server.Types.Internal
 import Data.Morpheus.Server.Types.SchemaT
   ( SchemaT,
     insertDirectiveDefinition,
     outToAny,
   )
 import Data.Morpheus.Types.Internal.AST
-  ( CONST,
+  ( Argument (..),
+    CONST,
     Description,
     Directive (..),
     DirectiveDefinition (..),
@@ -101,9 +105,6 @@
   where
     proxy = Proxy @a
 
-deriveTypeDirectives :: forall c f a. GQLType a => f a -> SchemaT c (Directives CONST)
-deriveTypeDirectives proxy = deriveDirectiveUsages (typeDirectives $ directives proxy)
-
 deriveDirectiveUsages :: [DirectiveUsage] -> SchemaT c (Directives CONST)
 deriveDirectiveUsages = fmap unsafeFromList . traverse toDirectiveTuple
 
@@ -114,7 +115,8 @@
 toDirectiveTuple (DirectiveUsage x) = do
   insertDirective (deriveDirectiveDefinition x) x
   let directiveName = deriveDirectiveName (Identity x)
-  directiveArgs <- resultOr (const $ throwError "TODO: fix me") pure (encodeArguments x)
+  args <- toList <$> resultOr (const $ throwError "TODO: fix me") pure (encodeArguments x)
+  directiveArgs <- fromElems (map editArg args)
   pure
     ( directiveName,
       Directive
@@ -123,6 +125,8 @@
           directiveArgs
         }
     )
+  where
+    editArg Argument {..} = Argument {argumentName = applyGQLFieldOptions (Identity x) argumentName, ..}
 
 insertDirective ::
   forall a c.
@@ -137,8 +141,8 @@
 getDirHM :: (Ord k, Hashable k, Empty a) => k -> HashMap k a -> a
 getDirHM name xs = fromMaybe empty $ name `HM.lookup` xs
 
-deriveFieldDirectives :: GQLType a => f a -> FieldName -> SchemaT c (Directives CONST)
-deriveFieldDirectives proxy name = deriveDirectiveUsages $ getFieldDirectiveUsages name proxy
+isIncluded :: DirectiveUsage -> Bool
+isIncluded (DirectiveUsage x) = not $ excludeFromSchema (Identity x)
 
 getEnumDirectiveUsages :: GQLType a => f a -> TypeName -> [DirectiveUsage]
 getEnumDirectiveUsages proxy name = getDirHM name $ enumValueDirectives $ directives proxy
@@ -146,23 +150,43 @@
 getFieldDirectiveUsages :: GQLType a => FieldName -> f a -> [DirectiveUsage]
 getFieldDirectiveUsages name proxy = getDirHM name $ fieldDirectives $ directives proxy
 
+getOptions :: GQLType a => f a -> GQLTypeOptions
+getOptions proxy = typeOptions proxy defaultTypeOptions
+
+-- derive directives
 deriveEnumDirectives :: GQLType a => f a -> TypeName -> SchemaT c (Directives CONST)
-deriveEnumDirectives proxy name = deriveDirectiveUsages $ getEnumDirectiveUsages proxy name
+deriveEnumDirectives proxy name = deriveDirectiveUsages $ filter isIncluded $ getEnumDirectiveUsages proxy name
 
+deriveFieldDirectives :: GQLType a => f a -> FieldName -> SchemaT c (Directives CONST)
+deriveFieldDirectives proxy name = deriveDirectiveUsages $ filter isIncluded $ getFieldDirectiveUsages name proxy
+
+deriveTypeDirectives :: forall c f a. GQLType a => f a -> SchemaT c (Directives CONST)
+deriveTypeDirectives proxy = deriveDirectiveUsages $ filter isIncluded $ typeDirectives $ directives proxy
+
+-- visit
 visitEnumValueDescription :: GQLType a => f a -> TypeName -> Maybe Description -> Maybe Description
 visitEnumValueDescription proxy name desc = foldr applyEnumDescription desc (getEnumDirectiveUsages proxy name)
 
 visitEnumName :: GQLType a => f a -> TypeName -> TypeName
-visitEnumName proxy name = foldr applyEnumName name (getEnumDirectiveUsages proxy name)
+visitEnumName proxy name = foldr applyEnumName (withTypeDirectives $ withOptions name) (getEnumDirectiveUsages proxy name)
+  where
+    withOptions = fromString . constructorTagModifier (getOptions proxy) . toString
+    withTypeDirectives dirName = foldr applyTypeEnumNames dirName (typeDirectives $ directives proxy)
 
 visitFieldDescription :: GQLType a => f a -> FieldName -> Maybe Description -> Maybe Description
 visitFieldDescription proxy name desc = foldr applyFieldDescription desc (getFieldDirectiveUsages name proxy)
 
+applyGQLFieldOptions :: (GQLType a) => f a -> FieldName -> FieldName
+applyGQLFieldOptions proxy = withTypeDirectives . withOptions
+  where
+    withOptions = fromString . fieldLabelModifier (getOptions proxy) . toString
+    withTypeDirectives name = foldr applyTypeFieldNames name (typeDirectives $ directives proxy)
+
 visitFieldName :: GQLType a => f a -> FieldName -> FieldName
-visitFieldName proxy name = foldr applyFieldName name (getFieldDirectiveUsages name proxy)
+visitFieldName proxy name = foldr applyFieldName (applyGQLFieldOptions proxy name) (getFieldDirectiveUsages name proxy)
 
 visitTypeDescription :: GQLType a => f a -> Maybe Description -> Maybe Description
 visitTypeDescription proxy desc = foldr applyTypeDescription desc (typeDirectives $ directives proxy)
 
-toFieldRes :: GQLType a => f a -> FieldRep (m v) -> (FieldName, m v)
+toFieldRes :: GQLType a => f a -> FieldRep v -> (FieldName, v)
 toFieldRes proxy FieldRep {..} = (visitFieldName proxy fieldSelector, fieldValue)
diff --git a/src/Data/Morpheus/Server/Deriving/Utils/Decode.hs b/src/Data/Morpheus/Server/Deriving/Utils/Decode.hs
--- a/src/Data/Morpheus/Server/Deriving/Utils/Decode.hs
+++ b/src/Data/Morpheus/Server/Deriving/Utils/Decode.hs
@@ -37,7 +37,6 @@
   ( GQLType,
     deriveTypename,
   )
-import Data.Morpheus.Server.Types.Internal
 import Data.Morpheus.Types.GQLScalar
   ( toScalar,
   )
@@ -133,7 +132,6 @@
 data Context = Context
   { isVariantRef :: Bool,
     typeName :: TypeName,
-    options :: GQLTypeOptions,
     enumVisitor :: TypeName -> TypeName,
     fieldVisitor :: FieldName -> FieldName
   }
@@ -153,14 +151,14 @@
   tags _ = tags (Proxy @a) <> tags (Proxy @b)
 
 instance (Constructor c, DescribeFields a) => DescribeCons (M1 C c a) where
-  tags _ Context {typeName, options} = getTag (refType (Proxy @a))
+  tags _ Context {typeName} = getTag (refType (Proxy @a))
     where
       getTag (Just memberRef)
         | isUnionRef memberRef = Info {kind = VariantRef, tagName = [memberRef]}
         | otherwise = Info {kind = InlineVariant, tagName = [consName]}
       getTag Nothing = Info {kind = InlineVariant, tagName = [consName]}
       --------
-      consName = conNameProxy options (Proxy @c)
+      consName = conNameProxy (Proxy @c)
       ----------
       isUnionRef x = typeName <> x == consName
 
diff --git a/src/Data/Morpheus/Server/Deriving/Utils/DeriveGType.hs b/src/Data/Morpheus/Server/Deriving/Utils/DeriveGType.hs
--- a/src/Data/Morpheus/Server/Deriving/Utils/DeriveGType.hs
+++ b/src/Data/Morpheus/Server/Deriving/Utils/DeriveGType.hs
@@ -32,8 +32,7 @@
   )
 import Data.Morpheus.Server.Deriving.Utils.Types
 import Data.Morpheus.Server.Types.Internal
-  ( GQLTypeOptions (..),
-    TypeData (..),
+  ( TypeData (..),
   )
 import Data.Morpheus.Types.Internal.AST
   ( TypeName,
@@ -59,14 +58,12 @@
 
 data DeriveValueOptions kind c v = DeriveValueOptions
   { __valueTypeName :: TypeName,
-    __valueGQLOptions :: GQLTypeOptions,
     __valueApply :: forall a. c a => a -> v,
     __valueGetType :: forall f a. c a => f a -> TypeData
   }
 
 data DeriveTypeOptions kind c v = DeriveTypeDefinitionOptions
-  { __typeGQLOptions :: GQLTypeOptions,
-    __typeApply :: forall f a. c a => f a -> v,
+  { __typeApply :: forall f a. c a => f a -> v,
     __typeGetType :: forall f a. c a => f a -> TypeData
   }
 
@@ -105,22 +102,18 @@
     DataType
       { dataTypeName = "",
         tyIsUnion = False,
-        tyCons = deriveConsRep (__valueGQLOptions options) (Proxy @c) (toFieldRep options src)
+        tyCons = deriveConsRep (Proxy @c) (toFieldRep options src)
       }
-  deriveTypeDefinition options _ = [deriveConsRep (__typeGQLOptions options) (Proxy @c) (conRep options (Proxy @f))]
+  deriveTypeDefinition options _ = [deriveConsRep (Proxy @c) (conRep options (Proxy @f))]
 
 deriveConsRep ::
   Constructor (c :: Meta) =>
-  GQLTypeOptions ->
   f c ->
   [FieldRep v] ->
   ConsRep v
-deriveConsRep opt proxy fields =
-  ConsRep
-    { consName = conNameProxy opt proxy,
-      consFields
-    }
+deriveConsRep proxy fields = ConsRep {..}
   where
+    consName = conNameProxy proxy
     consFields
       | isRecordProxy proxy = fields
       | otherwise = enumerate fields
@@ -136,7 +129,7 @@
 instance (Selector s, c a) => DeriveFieldRep c v (M1 S s (Rec0 a)) where
   toFieldRep DeriveValueOptions {..} (M1 (K1 src)) =
     [ FieldRep
-        { fieldSelector = selNameProxy __valueGQLOptions (Proxy @s),
+        { fieldSelector = selNameProxy (Proxy @s),
           fieldTypeRef = TypeRef gqlTypeName gqlWrappers,
           fieldValue = __valueApply src
         }
@@ -145,7 +138,7 @@
       TypeData {gqlTypeName, gqlWrappers} = __valueGetType (Proxy @a)
   conRep DeriveTypeDefinitionOptions {..} _ =
     [ FieldRep
-        { fieldSelector = selNameProxy __typeGQLOptions (Proxy @s),
+        { fieldSelector = selNameProxy (Proxy @s),
           fieldTypeRef = TypeRef gqlTypeName gqlWrappers,
           fieldValue = __typeApply (Proxy @a)
         }
diff --git a/src/Data/Morpheus/Server/Deriving/Utils/Proxy.hs b/src/Data/Morpheus/Server/Deriving/Utils/Proxy.hs
--- a/src/Data/Morpheus/Server/Deriving/Utils/Proxy.hs
+++ b/src/Data/Morpheus/Server/Deriving/Utils/Proxy.hs
@@ -17,18 +17,12 @@
   )
 where
 
-import Data.Morpheus.Server.Types.Internal
-  ( GQLTypeOptions (..),
-  )
 import Data.Morpheus.Server.Types.Kind (DerivingKind)
 import Data.Morpheus.Types.Internal.AST
   ( FieldName,
     TypeName,
     packName,
   )
-import Data.Text
-  ( pack,
-  )
 import qualified Data.Text as T
 import GHC.Generics
   ( C,
@@ -46,15 +40,11 @@
 import Relude hiding (undefined)
 import Prelude (undefined)
 
-conNameProxy :: forall f (c :: Meta). Constructor c => GQLTypeOptions -> f c -> TypeName
-conNameProxy options _ =
-  packName $ pack $ constructorTagModifier options $ conName (undefined :: M1 C c U1 a)
+conNameProxy :: forall f (c :: Meta). Constructor c => f c -> TypeName
+conNameProxy _ = fromString $ conName (undefined :: M1 C c U1 a)
 
-selNameProxy :: forall f (s :: Meta). Selector s => GQLTypeOptions -> f s -> FieldName
-selNameProxy options _ =
-  fromHaskellName $
-    fieldLabelModifier options $
-      selName (undefined :: M1 S s f a)
+selNameProxy :: forall f (s :: Meta). Selector s => f s -> FieldName
+selNameProxy _ = fromHaskellName $ selName (undefined :: M1 S s f a)
 
 fromHaskellName :: String -> FieldName
 fromHaskellName hsName
diff --git a/src/Data/Morpheus/Server/Types.hs b/src/Data/Morpheus/Server/Types.hs
--- a/src/Data/Morpheus/Server/Types.hs
+++ b/src/Data/Morpheus/Server/Types.hs
@@ -76,6 +76,8 @@
     RootResolver (..),
     defaultRootResolver,
     Rename (..),
+    InputTypeNamespace (..),
+    DropNamespace (..),
   )
 where
 
@@ -102,12 +104,14 @@
 import Data.Morpheus.Server.Types.DirectiveDefinitions
   ( Deprecated (..),
     Describe (..),
+    DropNamespace (..),
     Prefixes (..),
     Rename (..),
   )
 import Data.Morpheus.Server.Types.Directives (GQLDirective (..))
 import Data.Morpheus.Server.Types.GQLType
   ( GQLType (..),
+    InputTypeNamespace (..),
     enumDirective,
     enumDirective',
     fieldDirective,
diff --git a/src/Data/Morpheus/Server/Types/DirectiveDefinitions.hs b/src/Data/Morpheus/Server/Types/DirectiveDefinitions.hs
--- a/src/Data/Morpheus/Server/Types/DirectiveDefinitions.hs
+++ b/src/Data/Morpheus/Server/Types/DirectiveDefinitions.hs
@@ -12,12 +12,17 @@
     Deprecated (..),
     Describe (..),
     Rename (..),
+    DropNamespace (..),
   )
 where
 
 import Data.Morpheus.Server.Types.Directives (GQLDirective (..))
 import Data.Morpheus.Server.Types.GQLType (GQLType (__type))
-import Data.Morpheus.Server.Types.Internal (mkTypeData)
+import Data.Morpheus.Server.Types.Internal
+  ( mkTypeData,
+    stripConstructorNamespace,
+    stripFieldNamespace,
+  )
 import Data.Morpheus.Server.Types.Visitors
   ( VisitEnum (..),
     VisitField (..),
@@ -26,8 +31,8 @@
 import Data.Morpheus.Types.Internal.AST
   ( DirectiveLocation (..),
   )
-import qualified Data.Text as T
-import Relude
+import Data.Text (drop, length, pack, unpack)
+import Relude hiding (drop, length)
 
 -- | a custom GraphQL directive for adding or removing
 -- of prefixes
@@ -49,7 +54,7 @@
        ]
 
 instance VisitType Prefixes where
-  visitTypeName Prefixes {addPrefix, removePrefix} name = addPrefix <> T.drop (T.length removePrefix) name
+  visitTypeName Prefixes {addPrefix, removePrefix} _ name = addPrefix <> drop (length removePrefix) name
   visitTypeDescription _ = id
 
 -- native GraphQL directive @deprecated
@@ -107,9 +112,14 @@
 
 -- | a custom GraphQL directive for adding or removing
 -- of prefixes
-newtype Rename = Rename {name :: Text} deriving (Generic, GQLType)
+newtype Rename = Rename {newName :: Text}
+  deriving
+    ( Generic,
+      GQLType
+    )
 
 instance GQLDirective Rename where
+  excludeFromSchema _ = True
   type
     DIRECTIVE_LOCATIONS Rename =
       '[ 'OBJECT,
@@ -124,11 +134,36 @@
        ]
 
 instance VisitType Rename where
-  visitTypeName Rename {name} _ = name
+  visitTypeName Rename {newName} _ _ = newName
   visitTypeDescription _ = id
 
 instance VisitEnum Rename where
-  visitEnumName Rename {name} _ = name
+  visitEnumName Rename {newName} _ = newName
 
 instance VisitField Rename where
-  visitFieldName Rename {name} _ = name
+  visitFieldName Rename {newName} _ = newName
+
+-- DropTypeNamespace
+newtype DropNamespace = DropNamespace
+  { dropNamespace :: Text
+  }
+  deriving
+    ( Generic,
+      GQLType
+    )
+
+instance GQLDirective DropNamespace where
+  type
+    DIRECTIVE_LOCATIONS DropNamespace =
+      '[ 'OBJECT,
+         'ENUM,
+         'INPUT_OBJECT,
+         'UNION,
+         'SCALAR,
+         'INTERFACE
+       ]
+  excludeFromSchema _ = True
+
+instance VisitType DropNamespace where
+  visitFieldNames DropNamespace {dropNamespace} = pack . stripFieldNamespace dropNamespace . unpack
+  visitEnumNames DropNamespace {dropNamespace} = pack . stripConstructorNamespace dropNamespace . unpack
diff --git a/src/Data/Morpheus/Server/Types/Directives.hs b/src/Data/Morpheus/Server/Types/Directives.hs
--- a/src/Data/Morpheus/Server/Types/Directives.hs
+++ b/src/Data/Morpheus/Server/Types/Directives.hs
@@ -17,12 +17,14 @@
     ToLocations (..),
     getLocations,
     -- visitors
-    visitTypeName,
-    visitTypeDescription,
-    visitFieldName,
-    visitFieldDescription,
-    visitEnumName,
-    visitEnumDescription,
+    visitTypeName',
+    visitTypeDescription',
+    visitFieldName',
+    visitFieldDescription',
+    visitEnumName',
+    visitEnumDescription',
+    visitFieldNames',
+    visitEnumNames',
   )
 where
 
@@ -126,34 +128,48 @@
   GQLDirective a
   where
   type DIRECTIVE_LOCATIONS a :: [DirectiveLocation]
+  excludeFromSchema :: f a -> Bool
+  excludeFromSchema _ = False
 
 -- TYPE VISITORS
 
-visitTypeName :: forall a. GQLDirective a => a -> TypeName -> TypeName
-visitTypeName = __visitTypeName (Proxy :: Proxy (ALLOWED a TYPE_VISITOR_KIND))
+visitTypeName' :: forall a. GQLDirective a => a -> Bool -> TypeName -> TypeName
+visitTypeName' = __visitTypeName (Proxy :: Proxy (ALLOWED a TYPE_VISITOR_KIND))
 
-visitTypeDescription :: forall a. GQLDirective a => a -> Maybe Description -> Maybe Description
-visitTypeDescription = __visitTypeDescription (Proxy :: Proxy (ALLOWED a TYPE_VISITOR_KIND))
+visitTypeDescription' :: forall a. GQLDirective a => a -> Maybe Description -> Maybe Description
+visitTypeDescription' = __visitTypeDescription (Proxy :: Proxy (ALLOWED a TYPE_VISITOR_KIND))
 
+visitFieldNames' :: forall a. GQLDirective a => a -> FieldName -> FieldName
+visitFieldNames' = __visitFieldNames (Proxy :: Proxy (ALLOWED a TYPE_VISITOR_KIND))
+
+visitEnumNames' :: forall a. GQLDirective a => a -> TypeName -> TypeName
+visitEnumNames' = __visitEnumNames (Proxy :: Proxy (ALLOWED a TYPE_VISITOR_KIND))
+
 class VISIT_TYPE a (t :: Bool) where
-  __visitTypeName :: f t -> a -> TypeName -> TypeName
+  __visitTypeName :: f t -> a -> Bool -> TypeName -> TypeName
   __visitTypeDescription :: f t -> a -> Maybe Description -> Maybe Description
+  __visitFieldNames :: f t -> a -> FieldName -> FieldName
+  __visitEnumNames :: f t -> a -> TypeName -> TypeName
 
 instance VISIT_TYPE a 'False where
-  __visitTypeName _ _ = id
+  __visitTypeName _ _ _ = id
   __visitTypeDescription _ _ = id
+  __visitFieldNames _ _ = id
+  __visitEnumNames _ _ = id
 
 instance Visitors.VisitType a => VISIT_TYPE a TRUE where
-  __visitTypeName _ x name = packName $ Visitors.visitTypeName x (unpackName name)
+  __visitTypeName _ x isInput name = packName $ Visitors.visitTypeName x isInput (unpackName name)
   __visitTypeDescription _ = Visitors.visitTypeDescription
+  __visitFieldNames _ x = packName . Visitors.visitFieldNames x . unpackName
+  __visitEnumNames _ x = packName . Visitors.visitEnumNames x . unpackName
 
 -- FIELD VISITORS
 
-visitFieldName :: forall a. GQLDirective a => a -> FieldName -> FieldName
-visitFieldName = __visitFieldName (Proxy :: Proxy (ALLOWED a FIELD_VISITOR_KIND))
+visitFieldName' :: forall a. GQLDirective a => a -> FieldName -> FieldName
+visitFieldName' = __visitFieldName (Proxy :: Proxy (ALLOWED a FIELD_VISITOR_KIND))
 
-visitFieldDescription :: forall a. GQLDirective a => a -> Maybe Description -> Maybe Description
-visitFieldDescription = __visitFieldDescription (Proxy :: Proxy (ALLOWED a FIELD_VISITOR_KIND))
+visitFieldDescription' :: forall a. GQLDirective a => a -> Maybe Description -> Maybe Description
+visitFieldDescription' = __visitFieldDescription (Proxy :: Proxy (ALLOWED a FIELD_VISITOR_KIND))
 
 class VISIT_FIELD a (t :: Bool) where
   __visitFieldName :: f t -> a -> FieldName -> FieldName
@@ -169,11 +185,11 @@
 
 -- VISIT_ENUM
 
-visitEnumName :: forall a. GQLDirective a => a -> TypeName -> TypeName
-visitEnumName = __visitEnumName (Proxy :: Proxy (ALLOWED a ENUM_VISITOR_KIND))
+visitEnumName' :: forall a. GQLDirective a => a -> TypeName -> TypeName
+visitEnumName' = __visitEnumName (Proxy :: Proxy (ALLOWED a ENUM_VISITOR_KIND))
 
-visitEnumDescription :: forall a. GQLDirective a => a -> Maybe Description -> Maybe Description
-visitEnumDescription = __visitEnumDescription (Proxy :: Proxy (ALLOWED a ENUM_VISITOR_KIND))
+visitEnumDescription' :: forall a. GQLDirective a => a -> Maybe Description -> Maybe Description
+visitEnumDescription' = __visitEnumDescription (Proxy :: Proxy (ALLOWED a ENUM_VISITOR_KIND))
 
 class VISIT_ENUM a (t :: Bool) where
   __visitEnumName :: f t -> a -> TypeName -> TypeName
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
@@ -1,6 +1,9 @@
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DefaultSignatures #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
@@ -44,7 +47,10 @@
     applyEnumDescription,
     applyFieldName,
     applyFieldDescription,
+    applyTypeFieldNames,
+    applyTypeEnumNames,
     __isEmptyType,
+    InputTypeNamespace (..),
   )
 where
 
@@ -66,23 +72,24 @@
 import Data.Morpheus.Server.Types.Directives
   ( GQLDirective (..),
     ToLocations,
-    visitEnumDescription,
-    visitEnumName,
-    visitFieldDescription,
-    visitFieldName,
-    visitTypeDescription,
-    visitTypeName,
+    visitEnumDescription',
+    visitEnumName',
+    visitEnumNames',
+    visitFieldDescription',
+    visitFieldName',
+    visitFieldNames',
+    visitTypeDescription',
+    visitTypeName',
   )
 import Data.Morpheus.Server.Types.Internal
   ( GQLTypeOptions (..),
     TypeData (..),
     defaultTypeOptions,
     mkTypeData,
-    prefixInputs,
   )
 import Data.Morpheus.Server.Types.Kind
   ( CUSTOM,
-    DerivingKind (..),
+    DerivingKind,
     SCALAR,
     TYPE,
     WRAPPER,
@@ -96,6 +103,7 @@
     Undefined (..),
     __typenameUndefined,
   )
+import Data.Morpheus.Server.Types.Visitors (VisitType (..))
 import Data.Morpheus.Types.GQLScalar (EncodeScalar (..))
 import Data.Morpheus.Types.GQLWrapper (EncodeWrapperValue (..))
 import Data.Morpheus.Types.ID (ID)
@@ -105,6 +113,7 @@
     ArgumentsDefinition,
     CONST,
     Description,
+    DirectiveLocation (..),
     Directives,
     FieldName,
     IN,
@@ -148,15 +157,23 @@
 deriveFingerprint :: (GQLType a, CategoryValue kind) => kinded kind a -> TypeFingerprint
 deriveFingerprint proxy = gqlFingerprint $ __typeData proxy
 
-deriveTypeData :: Typeable a => f a -> (Bool -> String -> String) -> TypeCategory -> TypeData
-deriveTypeData proxy typeNameModifier cat =
+deriveTypeData ::
+  Typeable a =>
+  f a ->
+  DirectiveUsages ->
+  (Bool -> String -> String) ->
+  TypeCategory ->
   TypeData
-    { gqlTypeName = packName . pack $ typeNameModifier (cat == IN) originalTypeName,
+deriveTypeData proxy DirectiveUsages {typeDirectives} typeNameModifier cat =
+  TypeData
+    { gqlTypeName = modifyName . packName . pack $ typeNameModifier isInput originalTypeName,
       gqlWrappers = mkBaseType,
       gqlFingerprint = getFingerprint cat proxy
     }
   where
+    isInput = cat == IN
     originalTypeName = unpack . unpackName $ getTypename proxy
+    modifyName name = typeNameWithDirectives isInput name typeDirectives
 
 list :: TypeWrapper -> TypeWrapper
 list = flip TypeList True
@@ -184,6 +201,8 @@
 
 {-# DEPRECATED getDescriptions "use: directive Describe { text } with fieldDirective" #-}
 
+{-# DEPRECATED typeOptions "use: custom directives with 'VisitType'" #-}
+
 class GQLType a where
   type KIND a :: DerivingKind
   type KIND a = TYPE
@@ -214,9 +233,8 @@
 
   __type :: f a -> TypeCategory -> TypeData
   default __type :: Typeable a => f a -> TypeCategory -> TypeData
-  __type proxy category = editTypeData derivedType (directives proxy)
+  __type proxy = deriveTypeData proxy (directives proxy) typeNameModifier
     where
-      derivedType = deriveTypeData proxy typeNameModifier category
       GQLTypeOptions {typeNameModifier} = typeOptions proxy defaultTypeOptions
 
 instance GQLType Int where
@@ -279,8 +297,8 @@
   type KIND (SubscriptionField a) = WRAPPER
   __type _ = __type $ Proxy @a
 
-instance (Typeable a, Typeable b, GQLType a, GQLType b) => GQLType (Pair a b) where
-  typeOptions _ = prefixInputs
+instance (Typeable a, Typeable b, GQLType a, GQLType b, DeriveArguments TYPE InputTypeNamespace) => GQLType (Pair a b) where
+  directives _ = typeDirective InputTypeNamespace {inputTypeNamespace = "Input"}
 
 -- Manual
 
@@ -288,7 +306,7 @@
   type KIND (a -> b) = CUSTOM
   __type _ = __type $ Proxy @b
 
-instance (GQLType k, GQLType v, Typeable k, Typeable v) => GQLType (Map k v) where
+instance (GQLType k, GQLType v, Typeable k, Typeable v, DeriveArguments TYPE InputTypeNamespace) => GQLType (Map k v) where
   type KIND (Map k v) = CUSTOM
   __type _ = __type $ Proxy @[Pair k v]
 
@@ -296,9 +314,9 @@
   type KIND (Resolver o e m a) = CUSTOM
   __type _ = __type $ Proxy @a
 
-instance (Typeable a, Typeable b, GQLType a, GQLType b) => GQLType (a, b) where
+instance (Typeable a, Typeable b, GQLType a, GQLType b, DeriveArguments TYPE InputTypeNamespace) => GQLType (a, b) where
   __type _ = __type $ Proxy @(Pair a b)
-  typeOptions _ = prefixInputs
+  directives _ = typeDirective InputTypeNamespace {inputTypeNamespace = "Input"}
 
 instance (GQLType value) => GQLType (Arg name value) where
   type KIND (Arg name value) = CUSTOM
@@ -372,7 +390,6 @@
       ( DeriveValueOptions
           { __valueApply = encode,
             __valueTypeName = deriveTypename (KindedProxy :: KindedProxy IN a),
-            __valueGQLOptions = typeOptions (Proxy @a) defaultTypeOptions,
             __valueGetType = __typeData . kinded (Proxy @IN)
           } ::
           DeriveValueOptions IN ExplorerConstraint (GQLResult (Value CONST))
@@ -431,26 +448,52 @@
 data DirectiveUsage where
   DirectiveUsage :: (GQLDirective a, GQLType a, Decode a, DeriveArguments (KIND a) a, ToLocations (DIRECTIVE_LOCATIONS a)) => a -> DirectiveUsage
 
-applyTypeName :: DirectiveUsage -> TypeName -> TypeName
-applyTypeName (DirectiveUsage x) = visitTypeName x
+applyTypeName :: DirectiveUsage -> Bool -> TypeName -> TypeName
+applyTypeName (DirectiveUsage x) = visitTypeName' x
 
-typeNameWithDirectives :: TypeName -> [DirectiveUsage] -> TypeName
-typeNameWithDirectives = foldr applyTypeName
+typeNameWithDirectives :: Bool -> TypeName -> [DirectiveUsage] -> TypeName
+typeNameWithDirectives x = foldr (`applyTypeName` x)
 
+applyTypeFieldNames :: DirectiveUsage -> FieldName -> FieldName
+applyTypeFieldNames (DirectiveUsage x) = visitFieldNames' x
+
+applyTypeEnumNames :: DirectiveUsage -> TypeName -> TypeName
+applyTypeEnumNames (DirectiveUsage x) = visitEnumNames' x
+
 applyEnumDescription :: DirectiveUsage -> Maybe Description -> Maybe Description
-applyEnumDescription (DirectiveUsage x) = visitEnumDescription x
+applyEnumDescription (DirectiveUsage x) = visitEnumDescription' x
 
 applyEnumName :: DirectiveUsage -> TypeName -> TypeName
-applyEnumName (DirectiveUsage x) = visitEnumName x
+applyEnumName (DirectiveUsage x) = visitEnumName' x
 
 applyFieldDescription :: DirectiveUsage -> Maybe Description -> Maybe Description
-applyFieldDescription (DirectiveUsage x) = visitFieldDescription x
+applyFieldDescription (DirectiveUsage x) = visitFieldDescription' x
 
 applyFieldName :: DirectiveUsage -> FieldName -> FieldName
-applyFieldName (DirectiveUsage x) = visitFieldName x
+applyFieldName (DirectiveUsage x) = visitFieldName' x
 
 applyTypeDescription :: DirectiveUsage -> Maybe Description -> Maybe Description
-applyTypeDescription (DirectiveUsage x) = visitTypeDescription x
+applyTypeDescription (DirectiveUsage x) = visitTypeDescription' x
 
-editTypeData :: TypeData -> DirectiveUsages -> TypeData
-editTypeData TypeData {..} DirectiveUsages {typeDirectives} = TypeData {gqlTypeName = typeNameWithDirectives gqlTypeName typeDirectives, ..}
+newtype InputTypeNamespace = InputTypeNamespace {inputTypeNamespace :: Text}
+  deriving
+    ( Generic,
+      GQLType
+    )
+
+instance GQLDirective InputTypeNamespace where
+  excludeFromSchema _ = True
+  type
+    DIRECTIVE_LOCATIONS InputTypeNamespace =
+      '[ 'OBJECT,
+         'ENUM,
+         'INPUT_OBJECT,
+         'UNION,
+         'SCALAR,
+         'INTERFACE
+       ]
+
+instance VisitType InputTypeNamespace where
+  visitTypeName InputTypeNamespace {inputTypeNamespace} isInput name
+    | isInput = inputTypeNamespace <> name
+    | otherwise = name
diff --git a/src/Data/Morpheus/Server/Types/Internal.hs b/src/Data/Morpheus/Server/Types/Internal.hs
--- a/src/Data/Morpheus/Server/Types/Internal.hs
+++ b/src/Data/Morpheus/Server/Types/Internal.hs
@@ -8,6 +8,8 @@
     prefixInputs,
     mkTypeData,
     dropNamespaceOptions,
+    stripConstructorNamespace,
+    stripFieldNamespace,
   )
 where
 
@@ -21,8 +23,8 @@
     TypeWrapper (..),
     mkBaseType,
   )
-import qualified Data.Text as T
-import Relude hiding (Seq, Undefined, intercalate)
+import Data.Text (length)
+import Relude hiding (Seq, Undefined, intercalate, length)
 
 data TypeData = TypeData
   { gqlTypeName :: TypeName,
@@ -31,6 +33,8 @@
   }
   deriving (Show)
 
+{-# DEPRECATED GQLTypeOptions "use: custom directives with 'VisitType'" #-}
+
 -- | Options that specify how to map GraphQL field, type, and constructor names
 -- to and from their Haskell equivalent.
 --
@@ -47,6 +51,8 @@
     typeNameModifier :: Bool -> String -> String
   }
 
+{-# DEPRECATED defaultTypeOptions "use: custom directives with 'VisitType'" #-}
+
 -- | Default encoding 'GQLTypeOptions':
 --
 -- @
@@ -65,6 +71,7 @@
       typeNameModifier = const id
     }
 
+{-# DEPRECATED prefixInputs "use: custom directives" #-}
 prefixInputs :: GQLTypeOptions -> GQLTypeOptions
 prefixInputs options = options {typeNameModifier = \isInput name -> if isInput then "Input" <> name else name}
 
@@ -77,7 +84,7 @@
     }
 
 dropPrefix :: Text -> String -> String
-dropPrefix name = drop (T.length name)
+dropPrefix name = drop (length name)
 
 stripConstructorNamespace :: Text -> String -> String
 stripConstructorNamespace = dropPrefix
@@ -88,6 +95,7 @@
     __uncapitalize [] = []
     __uncapitalize (x : xs) = toLower x : xs
 
+{-# DEPRECATED dropNamespaceOptions "use: custom directives" #-}
 dropNamespaceOptions :: TypeKind -> Text -> GQLTypeOptions -> GQLTypeOptions
 dropNamespaceOptions KindInterface tName opt =
   opt
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
@@ -146,7 +146,7 @@
       <> msg typename
       <> " was used as both input and output type, which is not allowed by GraphQL specifications."
       <> "\n\n "
-      <> "If you supply \"typeNameModifier\" in \"GQLType.typeOptions\", "
+      <> "If you use \"InputTypeNamespace\" directive, "
       <> "you can override the default type names for "
       <> msg typename
       <> " to solve this problem."
diff --git a/src/Data/Morpheus/Server/Types/Visitors.hs b/src/Data/Morpheus/Server/Types/Visitors.hs
--- a/src/Data/Morpheus/Server/Types/Visitors.hs
+++ b/src/Data/Morpheus/Server/Types/Visitors.hs
@@ -19,11 +19,23 @@
 import Relude
 
 class VisitType a where
-  visitTypeName :: a -> Text -> Text
-  visitTypeName _ = id
+  -- | Construct a new type name depending on whether it is an input,
+  -- and being given the original type name.
+  visitTypeName :: a -> Bool -> Text -> Text
+  visitTypeName _ _ = id
 
   visitTypeDescription :: a -> Maybe Text -> Maybe Text
   visitTypeDescription = const id
+
+  -- | Function applied to field labels.
+  -- Handy for removing common record prefixes for example.
+  visitFieldNames :: a -> Text -> Text
+  visitFieldNames _ = id
+
+  -- | Function applied to enum values
+  -- Handy for removing common enum prefixes for example.
+  visitEnumNames :: a -> Text -> Text
+  visitEnumNames _ = id
 
 class VisitField a where
   visitFieldName :: a -> Text -> Text
diff --git a/test/Feature/Collision/CategoryCollisionSuccess.hs b/test/Feature/Collision/CategoryCollisionSuccess.hs
--- a/test/Feature/Collision/CategoryCollisionSuccess.hs
+++ b/test/Feature/Collision/CategoryCollisionSuccess.hs
@@ -15,10 +15,11 @@
   ( GQLRequest,
     GQLResponse,
     GQLType (..),
-    GQLTypeOptions (..),
+    InputTypeNamespace (..),
     RootResolver (..),
     Undefined,
     defaultRootResolver,
+    typeDirective,
   )
 import Data.Text
   ( Text,
@@ -31,22 +32,26 @@
   }
   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}
+  directives _ =
+    typeDirective InputTypeNamespace {inputTypeNamespace = "Input"}
 
 newtype DeityArgs = DeityArgs
   { input :: Deity
   }
-  deriving (Show, Generic, GQLType)
+  deriving
+    ( Show,
+      Generic,
+      GQLType
+    )
 
 newtype Query (m :: Type -> Type) = Query
   { deity :: DeityArgs -> m Deity
   }
-  deriving (Generic, GQLType)
+  deriving
+    ( Generic,
+      GQLType
+    )
 
 rootResolver :: RootResolver IO () Query Undefined Undefined
 rootResolver =
diff --git a/test/Feature/Collision/category-collision-fail/response.json b/test/Feature/Collision/category-collision-fail/response.json
--- a/test/Feature/Collision/category-collision-fail/response.json
+++ b/test/Feature/Collision/category-collision-fail/response.json
@@ -1,7 +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."
+      "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 use \"InputTypeNamespace\" directive, you can override the default type names for \"Deity\" to solve this problem."
     }
   ]
 }
diff --git a/test/Feature/Directive/Definition.hs b/test/Feature/Directive/Definition.hs
--- a/test/Feature/Directive/Definition.hs
+++ b/test/Feature/Directive/Definition.hs
@@ -51,7 +51,7 @@
   type DIRECTIVE_LOCATIONS Power = '[ 'OBJECT]
 
 instance VisitType Power where
-  visitTypeName _ = id
+  visitTypeName _ _ = id
 
 instance GQLType MythologyDeity where
   directives _ =
diff --git a/test/Feature/Directive/EnumVisitor.hs b/test/Feature/Directive/EnumVisitor.hs
--- a/test/Feature/Directive/EnumVisitor.hs
+++ b/test/Feature/Directive/EnumVisitor.hs
@@ -42,11 +42,11 @@
     enumDirective' 'Sparta Describe {text = "city of warriors"}
       <> enumDirective' 'Delphi Describe {text = "city of oracle"}
       <> enumDirective' 'ARgos Describe {text = "city of argonauts"}
-      <> enumDirective' 'Sparta Rename {name = "sparta"}
-      <> enumDirective' 'Delphi Rename {name = "delphi"}
-      <> enumDirective' 'Athens Rename {name = "_athens"}
-      <> enumDirective' 'CORINTH__UGLY_ENUM_NAME Rename {name = "corinth"}
-      <> enumDirective' 'ARgos Rename {name = "argos"}
+      <> enumDirective' 'Sparta Rename {newName = "sparta"}
+      <> enumDirective' 'Delphi Rename {newName = "delphi"}
+      <> enumDirective' 'Athens Rename {newName = "_athens"}
+      <> enumDirective' 'CORINTH__UGLY_ENUM_NAME Rename {newName = "corinth"}
+      <> enumDirective' 'ARgos Rename {newName = "argos"}
 
 data Query (m :: Type -> Type) = Query
   { cities :: [City],
diff --git a/test/Feature/Directive/FieldVisitor.hs b/test/Feature/Directive/FieldVisitor.hs
--- a/test/Feature/Directive/FieldVisitor.hs
+++ b/test/Feature/Directive/FieldVisitor.hs
@@ -19,12 +19,13 @@
     GQLRequest,
     GQLResponse,
     GQLType (..),
-    GQLTypeOptions (..),
+    InputTypeNamespace (..),
     Rename (..),
     RootResolver (..),
     Undefined,
     defaultRootResolver,
     fieldDirective',
+    typeDirective,
   )
 import Data.Text (Text, pack)
 import GHC.Generics (Generic)
@@ -36,13 +37,12 @@
   deriving (Generic, Show)
 
 instance GQLType Deity where
-  typeOptions _ options = options {typeNameModifier = \isInput n -> if isInput then "Input" <> n else n}
-
   directives _ =
-    fieldDirective' '__name Describe {text = "name of the deity"}
+    typeDirective (InputTypeNamespace "Input")
+      <> fieldDirective' '__name Describe {text = "name of the deity"}
       <> fieldDirective' '__power Describe {text = "extraterrestrial ability"}
-      <> fieldDirective' '__name Rename {name = "name"}
-      <> fieldDirective' '__power Rename {name = "power"}
+      <> fieldDirective' '__name Rename {newName = "name"}
+      <> fieldDirective' '__power Rename {newName = "power"}
 
 data Query (m :: Type -> Type) = Query
   { deity :: Deity,
diff --git a/test/Feature/Input/Collections.hs b/test/Feature/Input/Collections.hs
--- a/test/Feature/Input/Collections.hs
+++ b/test/Feature/Input/Collections.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TypeFamilies #-}
 
 module Feature.Input.Collections
@@ -17,10 +18,11 @@
     GQLRequest,
     GQLResponse,
     GQLType (..),
-    GQLTypeOptions (..),
+    InputTypeNamespace (..),
     RootResolver (..),
     Undefined,
     defaultRootResolver,
+    typeDirective,
   )
 import Data.Sequence (Seq)
 import Data.Set (Set)
@@ -38,10 +40,7 @@
   deriving (Generic)
 
 instance GQLType Product where
-  typeOptions _ options =
-    options
-      { typeNameModifier = \isInput name -> if isInput then "Input" <> name else name
-      }
+  directives _ = typeDirective (InputTypeNamespace "Input")
 
 -- resolver
 data Query m = Query
diff --git a/test/Feature/Input/collections/assoc/invalid/response.json b/test/Feature/Input/collections/assoc/invalid/response.json
--- a/test/Feature/Input/collections/assoc/invalid/response.json
+++ b/test/Feature/Input/collections/assoc/invalid/response.json
@@ -1,11 +1,15 @@
 {
   "errors": [
     {
-      "message": "Argument \"value\" got invalid value. Expected type \"[InputPairTextInt!]!\" found {}.",
+      "message": "Argument \"value\" got invalid value. Undefined Field \"_0\".",
       "locations": [{ "line": 2, "column": 17 }]
     },
     {
-      "message": "Argument \"value\" got invalid value. Expected type \"[InputPairTextInt!]!\" found 635.",
+      "message": "Argument \"value\" got invalid value. Undefined Field \"_1\".",
+      "locations": [{ "line": 2, "column": 17 }]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. Expected type \"InputPairTextInt!\" found 635.",
       "locations": [{ "line": 3, "column": 17 }]
     },
     {
diff --git a/test/Feature/Input/collections/map/invalid/response.json b/test/Feature/Input/collections/map/invalid/response.json
--- a/test/Feature/Input/collections/map/invalid/response.json
+++ b/test/Feature/Input/collections/map/invalid/response.json
@@ -1,11 +1,15 @@
 {
   "errors": [
     {
-      "message": "Argument \"value\" got invalid value. Expected type \"[InputPairTextInt!]!\" found {}.",
+      "message": "Argument \"value\" got invalid value. Undefined Field \"_0\".",
       "locations": [{ "line": 2, "column": 15 }]
     },
     {
-      "message": "Argument \"value\" got invalid value. Expected type \"[InputPairTextInt!]!\" found 635.",
+      "message": "Argument \"value\" got invalid value. Undefined Field \"_1\".",
+      "locations": [{ "line": 2, "column": 15 }]
+    },
+    {
+      "message": "Argument \"value\" got invalid value. Expected type \"InputPairTextInt!\" found 635.",
       "locations": [{ "line": 3, "column": 15 }]
     },
     {
diff --git a/test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json b/test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json
--- a/test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json
+++ b/test/Feature/Input/variables/invalidValue/invalidDefaultValue/response.json
@@ -1,7 +1,7 @@
 {
   "errors": [
     {
-      "message": "Variable \"$v1\" got invalid value. Expected type \"[[[Int!]!]]!\" found { id: \"12\" }.",
+      "message": "Variable \"$v1\" got invalid value. Expected type \"Int!\" found { id: \"12\" }.",
       "locations": [
         {
           "line": 1,
diff --git a/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
--- a/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
+++ b/test/Feature/Input/variables/invalidValue/invalidDefaultValueButVariableProvided/response.json
@@ -1,7 +1,7 @@
 {
   "errors": [
     {
-      "message": "Variable \"$v1\" got invalid value. Expected type \"[Int!]!\" found \"boo\".",
+      "message": "Variable \"$v1\" got invalid value. Expected type \"Int!\" found \"boo\".",
       "locations": [
         {
           "line": 1,
