diff --git a/dhscanner-kbgen.cabal b/dhscanner-kbgen.cabal
--- a/dhscanner-kbgen.cabal
+++ b/dhscanner-kbgen.cabal
@@ -33,7 +33,7 @@
         * explain in plain English your query's purpose
         * et voilà !
 
-version:            2.3.0
+version:            2.4.0
 license:            GPL-3.0-only
 license-file:       LICENSE
 author:             OrenGitHub
@@ -92,6 +92,7 @@
         base,
         dhscanner-kbgen,
         dhscanner-ast,
+        dhscanner-bitcode,
         hspec,
         QuickCheck
 
diff --git a/src/Kbgen.hs b/src/Kbgen.hs
--- a/src/Kbgen.hs
+++ b/src/Kbgen.hs
@@ -110,6 +110,8 @@
     MethodName(..),
     ResolvedType(..),
     CallResolved(..),
+    FieldReadResolved(..),
+    FieldRead(..),
     CalledFrom(..),
     AssignedValue(..),
     ResolvedSuper(..),
@@ -896,6 +898,49 @@
 -- This is how the fact will look inside the Prolog file
 --
 -- @
+-- kb_field_read_resolved( FieldRead, Fqn ).
+-- @
+--
+-- __When should I use this fact__
+--
+-- Reading a field of an imported name ( an enum constant, a static
+-- field ) carries the resolved fqn of what was read :
+--
+-- @
+-- import org.springframework.web.bind.annotation.RequestMethod;
+--
+-- \@RequestMapping( method = RequestMethod.GET )
+-- public void oidc( ... ) { ... }
+-- @
+--
+-- __Writing a predicate with this fact and others__
+--
+-- @
+-- spring_request_mapping_get( Mapping ) :-
+--     kb_keyword_arg_for_call( 'method', FieldRead, Mapping ),
+--     kb_field_read_resolved( FieldRead, 'org.springframework.web.bind.annotation.RequestMethod.GET' ).
+-- @
+--
+-- Other facts combined in this example predicate:
+--
+--     * 'KeywordArgForCall'
+--
+-- The @FieldRead@ slot is the location of the field read expression,
+-- which is also where it shows up as an argument ( 'ArgiForCall',
+-- 'KeywordArgForCall' ) or as a dataflow node ( 'DataflowEdge' ).
+--
+data FieldReadResolved = FieldReadResolved
+    FieldRead -- ^
+    Resolved -- ^
+    deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )
+
+-- |
+--
+-- __Name__
+--
+-- This is how the fact will look inside the Prolog file
+--
+-- @
 -- kb_called_from( Call, Callable ).
 -- @
 --
@@ -1290,6 +1335,7 @@
 
 data Arg = Arg Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )
 data Call = Call Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )
+data FieldRead = FieldRead Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )
 data Param = Param Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )
 data Class = Class Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )
 
@@ -1346,6 +1392,7 @@
    | ConstIntegerCtor ConstInteger
    | DataflowEdgeCtor DataflowEdge
    | CallResolvedCtor CallResolved
+   | FieldReadResolvedCtor FieldReadResolved
    | CalledFromCtor CalledFrom
    | ConstBoolTrueCtor ConstBoolTrue
    | ConstNullCtor ConstNull
@@ -1392,6 +1439,7 @@
 prologify (ConstIntegerCtor content) = prologify_ConstInteger content
 prologify (DataflowEdgeCtor content) = prologify_DataflowEdge content
 prologify (CallResolvedCtor content) = prologify_CallResolved content
+prologify (FieldReadResolvedCtor content) = prologify_FieldReadResolved content
 prologify (CalledFromCtor content) = prologify_CalledFrom content
 prologify (ConstBoolTrueCtor content) = prologify_ConstBoolTrue content
 prologify (ConstNullCtor content) = prologify_ConstNull content
@@ -1486,6 +1534,12 @@
 
 prologify_CallResolved :: CallResolved -> String
 prologify_CallResolved (CallResolved (Call call) (Resolved fqn)) = prologify_CallResolved' call fqn
+
+prologify_FieldReadResolved' :: Location -> Fqn.Fqn -> String
+prologify_FieldReadResolved' r fqn = printf "kb_field_read_resolved( %s, '%s' )." (locationify r) (quoted (prologifyFqn fqn))
+
+prologify_FieldReadResolved :: FieldReadResolved -> String
+prologify_FieldReadResolved (FieldReadResolved (FieldRead r) (Resolved fqn)) = prologify_FieldReadResolved' r fqn
 
 prologify_ConstBoolTrue' :: Location -> String
 prologify_ConstBoolTrue' trueValue = printf "kb_class_name( %s, \'%s\' )." (locationify trueValue)
diff --git a/test/SmokeTests.hs b/test/SmokeTests.hs
--- a/test/SmokeTests.hs
+++ b/test/SmokeTests.hs
@@ -9,9 +9,12 @@
     , ConstNull (..)
     , ElsePart (..)
     , Fact (..)
+    , FieldRead (..)
+    , FieldReadResolved (..)
     , GatedReturn (..)
     , Method (..)
     , MethodHasName (..)
+    , Resolved (..)
     , ReturnedValue (..)
     , ThenPart (..)
     , TopLevelIfThenElseGadget (..)
@@ -19,6 +22,7 @@
     , prologify
     , restoreloc
     )
+import qualified Fqn
 import Location (Location (..))
 import qualified Token
 import Test.Hspec (Spec, hspec, it, shouldBe)
@@ -88,6 +92,15 @@
         expected = "kb_method_has_name( " ++ locationify methodLoc ++ ", 'oidc' )."
     in prologify (MethodHasNameCtor mn) `shouldBe` expected
 
+testPrologifyFieldReadResolved :: IO ()
+testPrologifyFieldReadResolved =
+    let readLoc = sampleLoc 1
+        requestMethod = Fqn.ThirdPartyImport (Fqn.ThirdPartyImportContent "org" ["springframework", "web", "bind", "annotation"] (Just "RequestMethod") Nothing)
+        get = Token.FieldName (Token.Named "GET" (sampleLoc 2))
+        r = FieldReadResolved (FieldRead readLoc) (Resolved (Fqn.FieldedAccess requestMethod get))
+        expected = "kb_field_read_resolved( " ++ locationify readLoc ++ ", 'org.springframework.web.bind.annotation.RequestMethod.GET' )."
+    in prologify (FieldReadResolvedCtor r) `shouldBe` expected
+
 testPrologifyTopLevelIfThenElseGadget :: IO ()
 testPrologifyTopLevelIfThenElseGadget =
     let callableLoc = sampleLoc 1
@@ -122,6 +135,7 @@
     it' testPrologifyConstNull "prologify_ConstNull should render kb_const_null( <loc> )."
     it' testPrologifyGatedReturn "prologify_GatedReturn should render kb_gated_return( <cond>, <ret> )."
     it' testPrologifyMethodHasName "prologify_MethodHasName should render kb_method_has_name( <method>, '<name>' )."
+    it' testPrologifyFieldReadResolved "prologify_FieldReadResolved should render kb_field_read_resolved( <field read>, '<fqn>' )."
     it' testPrologifyTopLevelIfThenElseGadget "prologify_TopLevelIfThenElseGadget should render kb_top_level_if_then_else_gadget( <callable>, <cond>, then_part_<cond>, else_part_<cond> )."
     it' testPrologifyCallGuardedByCondInThenPart "prologify_CallGuardedByCondInThenPart should render kb_call_guarded_by_cond_in_then_part( <call>, <cond>, then_part_<cond> )."
     it' testPrologifyCallGuardedByCondInElsePart "prologify_CallGuardedByCondInElsePart should render kb_call_guarded_by_cond_in_else_part( <call>, <cond>, else_part_<cond> )."
