Index: rtemsspec/applconfig.py
===================================================================
--- rtemsspec/applconfig.py	(revision 7b864b7c9d9e7b35c79e78d50e836014b2a953c3)
+++ rtemsspec/applconfig.py	(revision e165b7d684ec73f1010be3c53d73dbf990f9ac4e)
@@ -322,8 +322,4 @@
 
 
-def _get_value_none(_ctx: ItemGetValueContext) -> Any:
-    return None
-
-
 def _sphinx_ref(ref: str) -> str:
     return f":ref:`{ref}`"
@@ -355,15 +351,12 @@
 
 
-def _get_value_sphinx_reference(ctx: ItemGetValueContext) -> Any:
-    return _SPHINX_DOC_REFS[ctx.key]
+def _get_value_sphinx_reference(_ctx: ItemGetValueContext) -> Any:
+    return _SPHINX_DOC_REFS
 
 
 def _add_sphinx_get_values(mapper: ItemMapper) -> None:
-    for key in _SPHINX_DOC_REFS:
-        for opt in ["feature-enable", "feature", "initializer", "integer"]:
-            doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
-            mapper.add_get_value(doc_ref, _get_value_none)
-            mapper.add_get_value(f"{doc_ref}/{key}",
-                                 _get_value_sphinx_reference)
+    for opt in ["feature-enable", "feature", "initializer", "integer"]:
+        doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
+        mapper.add_get_value(doc_ref, _get_value_sphinx_reference)
 
 
@@ -428,6 +421,6 @@
 
 
-def _get_value_doxygen_reference(ctx: ItemGetValueContext) -> Any:
-    return _DOXYGEN_DOC_REFS[ctx.key]
+def _get_value_doxygen_reference(_ctx: ItemGetValueContext) -> Any:
+    return _DOXYGEN_DOC_REFS
 
 
@@ -449,12 +442,9 @@
 
 def _add_doxygen_get_values(mapper: ItemMapper) -> None:
-    for key in _DOXYGEN_DOC_REFS:
-        for opt in ["feature-enable", "feature", "initializer", "integer"]:
-            doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
-            mapper.add_get_value(doc_ref, _get_value_none)
-            mapper.add_get_value(f"{doc_ref}/{key}",
-                                 _get_value_doxygen_reference)
-            name = f"interface/appl-config-option/{opt}:/name"
-            mapper.add_get_value(name, get_value_hash)
+    for opt in ["feature-enable", "feature", "initializer", "integer"]:
+        doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
+        mapper.add_get_value(doc_ref, _get_value_doxygen_reference)
+        name = f"interface/appl-config-option/{opt}:/name"
+        mapper.add_get_value(name, get_value_hash)
     mapper.add_get_value("interface/define:/name", get_value_hash)
     mapper.add_get_value("interface/function:/name",
Index: rtemsspec/interface.py
===================================================================
--- rtemsspec/interface.py	(revision 7b864b7c9d9e7b35c79e78d50e836014b2a953c3)
+++ rtemsspec/interface.py	(revision e165b7d684ec73f1010be3c53d73dbf990f9ac4e)
@@ -32,5 +32,6 @@
     ExpressionMapper, get_value_double_colon, get_value_doxygen_function, \
     get_value_hash
-from rtemsspec.items import Item, ItemCache, ItemGetValueContext, ItemMapper
+from rtemsspec.items import Item, ItemCache, ItemGetValueContext, \
+    ItemGetValueMap, ItemMapper
 
 ItemMap = Dict[str, Item]
@@ -64,23 +65,23 @@
         self._node = node
         self._code_or_doc = "doc"
-        self.add_get_value("interface/forward-declaration:code:/name",
+        self.add_get_value("interface/forward-declaration/code:/name",
                            _get_value_forward_declaration)
-        self.add_get_value("interface/forward-declaration:doc:/name",
+        self.add_get_value("interface/forward-declaration/doc:/name",
                            _get_value_forward_declaration)
-        self.add_get_value("interface/function:doc:/name",
+        self.add_get_value("interface/function/doc:/name",
                            get_value_doxygen_function)
-        self.add_get_value("interface/enumerator:doc:/name",
+        self.add_get_value("interface/enumerator/doc:/name",
                            get_value_double_colon)
-        self.add_get_value("interface/typedef:doc:/name",
+        self.add_get_value("interface/typedef/doc:/name",
                            get_value_double_colon)
-        self.add_get_value("interface/define:doc:/name", get_value_hash)
-        self.add_get_value("interface/enum:doc:/name", get_value_hash)
-        self.add_get_value("interface/macro:doc:/name",
+        self.add_get_value("interface/define/doc:/name", get_value_hash)
+        self.add_get_value("interface/enum/doc:/name", get_value_hash)
+        self.add_get_value("interface/macro/doc:/name",
                            get_value_doxygen_function)
-        self.add_get_value("interface/variable:doc:/name", get_value_hash)
+        self.add_get_value("interface/variable/doc:/name", get_value_hash)
         for opt in ["feature-enable", "feature", "initializer", "integer"]:
-            name = f"interface/appl-config-option/{opt}:doc:/name"
+            name = f"interface/appl-config-option/{opt}/doc:/name"
             self.add_get_value(name, get_value_hash)
-        self.add_get_value("interface/unspecified-function:doc:/name",
+        self.add_get_value("interface/unspecified-function/doc:/name",
                            get_value_doxygen_function)
 
@@ -93,17 +94,15 @@
         self._code_or_doc = code_or_doc
 
-    def get_value(self, ctx: ItemGetValueContext) -> Any:
-        if self._code_or_doc == "code" and ctx.item["type"] == "interface":
+    def get_value_map(self, item: Item) -> ItemGetValueMap:
+        if self._code_or_doc == "code" and item["type"] == "interface":
             node = self._node
             header_file = node.header_file
-            if ctx.item["interface-type"] == "enumerator":
-                for child in ctx.item.children("interface-enumerator"):
+            if item["interface-type"] == "enumerator":
+                for child in item.children("interface-enumerator"):
                     header_file.add_includes(child)
             else:
-                header_file.add_includes(ctx.item)
-            header_file.add_dependency(node, ctx.item)
-        return super().get_value(
-            ItemGetValueContext(ctx.item, f"{self._code_or_doc}:{ctx.path}",
-                                ctx.value, ctx.key, ctx.index))
+                header_file.add_includes(item)
+            header_file.add_dependency(node, item)
+        return self._get_value_map.get(f"{item.type}/{self._code_or_doc}", {})
 
     def enabled_by_to_defined(self, enabled_by: str) -> str:
Index: rtemsspec/items.py
===================================================================
--- rtemsspec/items.py	(revision 7b864b7c9d9e7b35c79e78d50e836014b2a953c3)
+++ rtemsspec/items.py	(revision e165b7d684ec73f1010be3c53d73dbf990f9ac4e)
@@ -43,12 +43,8 @@
     index: Any  # should be int, but this triggers a mypy error
 
-    @property
-    def type_path_key(self) -> str:
-        """ Returns the item type followed the path to the key. """
-        return f"{self.item.type}:{os.path.join(self.path, self.key)}"
-
 
 ItemMap = Dict[str, "Item"]
 ItemGetValue = Callable[[ItemGetValueContext], Any]
+ItemGetValueMap = Dict[str, Tuple[ItemGetValue, Any]]
 
 
@@ -186,8 +182,6 @@
         return self._data.get(key, default)
 
-    def get_by_normalized_key_path(
-            self,
-            normalized_key_path: str,
-            get_value: ItemGetValue = _get_value) -> Any:
+    def get_by_normalized_key_path(self, normalized_key_path: str,
+                                   get_value_map: ItemGetValueMap) -> Any:
         """
         Gets the attribute value corresponding to the normalized key path.
@@ -202,18 +196,14 @@
                 index = -1
             ctx = ItemGetValueContext(self, path, value, parts[0], index)
-            try:
-                value = get_value(ctx)
-            except KeyError:
-                value = _get_value(ctx)
+            get_value, get_value_map = get_value_map.get(
+                parts[0], (_get_value, {}))
+            value = get_value(ctx)
             path = os.path.join(path, key)
         return value
 
-    def get_by_key_path(self,
-                        key_path: str,
-                        prefix: str = "",
-                        get_value: ItemGetValue = _get_value) -> Any:
+    def get_by_key_path(self, key_path: str, prefix: str = "") -> Any:
         """ Gets the attribute value corresponding to the key path. """
         return self.get_by_normalized_key_path(
-            normalize_key_path(key_path, prefix), get_value)
+            normalize_key_path(key_path, prefix), {})
 
     @property
@@ -379,5 +369,5 @@
         self._recursive = recursive
         self._prefix = [""]
-        self._get_value = {}  # type: Dict[str, ItemGetValue]
+        self._get_value_map = {}  # type: Dict[str, ItemGetValueMap]
 
     @property
@@ -396,5 +386,10 @@
         Adds a get value for the specified type and key path.
         """
-        self._get_value[type_path_key] = get_value
+        type_name, path_key = type_path_key.split(":")
+        keys = path_key.strip("/").split("/")
+        get_value_map = self._get_value_map.setdefault(type_name, {})
+        for key in keys[:-1]:
+            _, get_value_map = get_value_map.setdefault(key, (_get_value, {}))
+        get_value_map[keys[-1]] = (get_value, {})
 
     def push_prefix(self, prefix: str) -> None:
@@ -412,4 +407,8 @@
         yield
         self.pop_prefix()
+
+    def get_value_map(self, item: Item) -> ItemGetValueMap:
+        """ Returns the get value map for the item. """
+        return self._get_value_map.get(item.type, {})
 
     def map(self, identifier: str) -> Tuple[Item, str, Any]:
@@ -430,5 +429,6 @@
             prefix = ""
         key_path = normalize_key_path(key_path, prefix)
-        value = item.get_by_normalized_key_path(key_path, self.get_value)
+        value = item.get_by_normalized_key_path(key_path,
+                                                self.get_value_map(item))
         for func in pipes:
             value = getattr(self, func)(value)
@@ -472,8 +472,4 @@
         with self.prefix(prefix):
             return ItemTemplate(text).substitute(self)
-
-    def get_value(self, ctx: ItemGetValueContext) -> Any:
-        """ Gets a value by key and optional index. """
-        return self._get_value[ctx.type_path_key](ctx)
 
 
Index: rtemsspec/tests/test_items_itemcache.py
===================================================================
--- rtemsspec/tests/test_items_itemcache.py	(revision 7b864b7c9d9e7b35c79e78d50e836014b2a953c3)
+++ rtemsspec/tests/test_items_itemcache.py	(revision e165b7d684ec73f1010be3c53d73dbf990f9ac4e)
@@ -97,4 +97,9 @@
 
 
+def get_x_to_b_value(ctx):
+    assert ctx.key == "x-to-b"
+    return ctx.value["b"]
+
+
 class Mapper(ItemMapper):
     def __init__(self, item):
@@ -109,9 +114,4 @@
     def dup(self, value):
         return value + value
-
-    def get_value(self, ctx):
-        if ctx.key == "x-to-b":
-            return ctx.value["b"]
-        raise KeyError
 
 
@@ -142,4 +142,5 @@
     assert mapper["d/c:a/b"] == "e"
     assert mapper["d/c:a/b|u"] == "ue"
+    mapper.add_get_value(":/a/x-to-b", get_x_to_b_value)
     assert mapper["d/c:a/x-to-b|u|v"] == "vue"
     assert mapper["d/c:a/f[1]"] == 2
