diff --git a/morpheus-graphql-app.cabal b/morpheus-graphql-app.cabal
--- a/morpheus-graphql-app.cabal
+++ b/morpheus-graphql-app.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           morpheus-graphql-app
-version:        0.23.0
+version:        0.24.0
 synopsis:       Morpheus GraphQL App
 description:    Build GraphQL APIs with your favourite functional language!
 category:       web, graphql
@@ -140,7 +140,7 @@
     , containers >=0.4.2.1 && <0.7.0
     , hashable >=1.0.0 && <2.0.0
     , megaparsec >=7.0.0 && <10.0.0
-    , morpheus-graphql-core >=0.23.0 && <0.24.0
+    , morpheus-graphql-core >=0.24.0 && <0.25.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
     , scientific >=0.3.6.2 && <0.4.0
@@ -171,8 +171,8 @@
     , hashable >=1.0.0 && <2.0.0
     , megaparsec >=7.0.0 && <10.0.0
     , morpheus-graphql-app
-    , morpheus-graphql-core >=0.23.0 && <0.24.0
-    , morpheus-graphql-tests >=0.23.0 && <0.24.0
+    , morpheus-graphql-core >=0.24.0 && <0.25.0
+    , morpheus-graphql-tests >=0.24.0 && <0.25.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
     , scientific >=0.3.6.2 && <0.4.0
diff --git a/src/Data/Morpheus/App.hs b/src/Data/Morpheus/App.hs
--- a/src/Data/Morpheus/App.hs
+++ b/src/Data/Morpheus/App.hs
@@ -165,7 +165,8 @@
                     selectionPosition = operationPosition operation,
                     selectionAlias = Nothing,
                     selectionContent = SelectionSet (operationSelection operation),
-                    selectionDirectives = empty
+                    selectionDirectives = empty,
+                    selectionOrigin = Nothing
                   }
             }
         )
diff --git a/src/Data/Morpheus/App/Internal/Resolving/ResolveValue.hs b/src/Data/Morpheus/App/Internal/Resolving/ResolveValue.hs
--- a/src/Data/Morpheus/App/Internal/Resolving/ResolveValue.hs
+++ b/src/Data/Morpheus/App/Internal/Resolving/ResolveValue.hs
@@ -28,7 +28,13 @@
     mkUnion,
   )
 import Data.Morpheus.Error (subfieldsNotSelected)
-import Data.Morpheus.Internal.Utils (KeyOf (keyOf), selectOr, traverseCollection, (<:>))
+import Data.Morpheus.Internal.Utils
+  ( KeyOf (keyOf),
+    empty,
+    selectOr,
+    traverseCollection,
+    (<:>),
+  )
 import Data.Morpheus.Types.Internal.AST
   ( GQLError,
     Msg (msg),
@@ -48,7 +54,7 @@
     unitTypeName,
     unpackName,
   )
-import Relude
+import Relude hiding (empty)
 
 resolveSelection ::
   ( Monad m,
@@ -78,25 +84,30 @@
 resolveSelection rmap (ResRef ref) sel = ref >>= flip (resolveRef rmap) sel
 
 withObject ::
-  ( Monad m,
-    MonadError GQLError m,
+  ( MonadError GQLError m,
     MonadReader ResolverContext m
   ) =>
   Maybe TypeName ->
-  (SelectionSet VALID -> m value) ->
+  (Maybe (SelectionSet VALID) -> m value) ->
   SelectionContent VALID ->
   m value
 withObject __typename f = updateCurrentType __typename . checkContent
   where
-    checkContent (SelectionSet selection) = f selection
+    checkContent (SelectionSet selection) = f (Just selection)
     checkContent (UnionSelection interface unionSel) = do
       typename <- asks (typeName . currentType)
-      selection <- selectOr (pure interface) ((interface <:>) . unionTagSelection) typename unionSel
+      selection <- selectOr (pure interface) (fx interface) typename unionSel
       f selection
-    checkContent _ = do
-      sel <- asks currentSelection
-      throwError $ subfieldsNotSelected (selectionName sel) "" (selectionPosition sel)
+      where
+        fx (Just x) y = Just <$> (x <:> unionTagSelection y)
+        fx Nothing y = pure $ Just $ unionTagSelection y
+    checkContent _ = noEmptySelection
 
+noEmptySelection :: (MonadError GQLError m, MonadReader ResolverContext m) => m value
+noEmptySelection = do
+  sel <- asks currentSelection
+  throwError $ subfieldsNotSelected (selectionName sel) "" (selectionPosition sel)
+
 resolveRef ::
   ( MonadError GQLError m,
     MonadReader ResolverContext m
@@ -127,10 +138,9 @@
   ) =>
   ResolverMap m ->
   ObjectTypeResolver m ->
-  SelectionSet VALID ->
+  Maybe (SelectionSet VALID) ->
   m ValidValue
-resolveObject rmap drv =
-  fmap Object . traverseCollection resolver
+resolveObject rmap drv = fmap Object . maybe (pure empty) (traverseCollection resolver)
   where
     resolver currentSelection = do
       t <- askFieldTypeName (selectionName currentSelection)
diff --git a/src/Data/Morpheus/App/Internal/Resolving/RootResolverValue.hs b/src/Data/Morpheus/App/Internal/Resolving/RootResolverValue.hs
--- a/src/Data/Morpheus/App/Internal/Resolving/RootResolverValue.hs
+++ b/src/Data/Morpheus/App/Internal/Resolving/RootResolverValue.hs
@@ -89,7 +89,7 @@
   selection =
     do
       root <- runResolverStateT (toResolverStateT res) ctx
-      runResolver channels (resolveObject mempty root selection) ctx
+      runResolver channels (resolveObject mempty root (Just selection)) ctx
 
 runRootResolverValue :: Monad m => RootResolverValue e m -> ResolverContext -> ResponseStream e m (Value VALID)
 runRootResolverValue
@@ -136,7 +136,7 @@
     mergeRoot y x
 
 introspection :: Monad m => SelectionSet VALID -> ResolverContext -> ResponseStream event m ValidValue
-introspection selection ctx@ResolverContext {schema} = runResolver Nothing (resolveObject mempty (schemaAPI schema) selection) ctx
+introspection selection ctx@ResolverContext {schema} = runResolver Nothing (resolveObject mempty (schemaAPI schema) (Just selection)) ctx
 
 mergeRoot :: MonadError GQLError m => ValidValue -> ValidValue -> m ValidValue
 mergeRoot (Object x) (Object y) = Object <$> merge x y
diff --git a/test/api/validation/fragment/on-interface-inline/query.gql b/test/api/validation/fragment/on-interface-inline/query.gql
--- a/test/api/validation/fragment/on-interface-inline/query.gql
+++ b/test/api/validation/fragment/on-interface-inline/query.gql
@@ -5,6 +5,7 @@
     }
   }
   character {
+    __typename
     ... on Character {
       name
     }
diff --git a/test/api/validation/fragment/on-interface-type-casting-inline/query.gql b/test/api/validation/fragment/on-interface-type-casting-inline/query.gql
--- a/test/api/validation/fragment/on-interface-type-casting-inline/query.gql
+++ b/test/api/validation/fragment/on-interface-type-casting-inline/query.gql
@@ -1,5 +1,6 @@
 {
   character {
+    __typename
     ... on Character {
       name
     }
diff --git a/test/api/validation/fragment/on-interface-type-casting/query.gql b/test/api/validation/fragment/on-interface-type-casting/query.gql
--- a/test/api/validation/fragment/on-interface-type-casting/query.gql
+++ b/test/api/validation/fragment/on-interface-type-casting/query.gql
@@ -1,5 +1,6 @@
 {
   character {
+    __typename
     ...OnCharacter
     ...onDeity
     ...onHero
diff --git a/test/api/validation/fragment/on-interface/query.gql b/test/api/validation/fragment/on-interface/query.gql
--- a/test/api/validation/fragment/on-interface/query.gql
+++ b/test/api/validation/fragment/on-interface/query.gql
@@ -3,6 +3,7 @@
     ...OnSupernatural
   }
   character {
+    __typename
     ...OnCharacter
   }
 }
diff --git a/test/named-resolvers/entities/query.gql b/test/named-resolvers/entities/query.gql
--- a/test/named-resolvers/entities/query.gql
+++ b/test/named-resolvers/entities/query.gql
@@ -1,6 +1,7 @@
 query {
   entities {
     ... on Realm {
+      __typename
       name
       owner {
         name
@@ -14,6 +15,7 @@
       }
     }
     ... on Deity {
+      __typename
       name
       power
     }
diff --git a/test/named-resolvers/entity-by-id/query.gql b/test/named-resolvers/entity-by-id/query.gql
--- a/test/named-resolvers/entity-by-id/query.gql
+++ b/test/named-resolvers/entity-by-id/query.gql
@@ -1,12 +1,14 @@
 query {
   zeus: entity(id: "zeus") {
     ... on Deity {
+      __typename
       name
       power
     }
   }
   olympus: entity(id: "olympus") {
     ... on Realm {
+      __typename
       name
       owner {
         name
diff --git a/test/named-resolvers/entity-ext-by-id/query.gql b/test/named-resolvers/entity-ext-by-id/query.gql
--- a/test/named-resolvers/entity-ext-by-id/query.gql
+++ b/test/named-resolvers/entity-ext-by-id/query.gql
@@ -1,12 +1,14 @@
 query {
   zeus: entity(id: "zeus") {
     ... on Deity {
+      __typename
       name
       power
     }
   }
   olympus: entity(id: "olympus") {
     ... on Realm {
+      __typename
       name
       owner {
         name
