diff --git a/docs/platforms_and_mappings.rst b/docs/platforms_and_mappings.rst
index 6b45b988844b78ca29cd6e3e72b13632ea91110c..cc2d024db664eea3600ab4c0c1902b35b9918ce9 100644
--- a/docs/platforms_and_mappings.rst
+++ b/docs/platforms_and_mappings.rst
@@ -106,3 +106,4 @@ the libvirt-ci repository, located using the ``--data-dir DIR``
 argument to ``lcitool``, is extended to the following paths::
 
   $DIR/mappings.yml
+  $DIR/targets/$NAME.yml
diff --git a/lcitool/application.py b/lcitool/application.py
index e70b391a993800c9eda306504c5e588200c870c4..e1c55f061a193ba4d22b02e9962ba8b852d9c58a 100644
--- a/lcitool/application.py
+++ b/lcitool/application.py
@@ -72,7 +72,7 @@ class Application:
 
         base = resource_filename(__name__, "ansible")
         config = Config()
-        targets = Targets()
+        targets = Targets(data_dir)
         inventory = Inventory(targets, config)
         packages = Packages(data_dir)
         projects = Projects(data_dir)
@@ -134,7 +134,7 @@ class Application:
         self._entrypoint_debug(args)
 
         config = Config()
-        targets = Targets()
+        targets = Targets(args.data_dir)
         inventory = Inventory(targets, config)
         for host in sorted(inventory.hosts):
             print(host)
@@ -142,7 +142,7 @@ class Application:
     def _action_targets(self, args):
         self._entrypoint_debug(args)
 
-        targets = Targets()
+        targets = Targets(args.data_dir)
         for target in sorted(targets.targets):
             if args.containerized:
                 facts = targets.target_facts[target]
@@ -167,7 +167,7 @@ class Application:
 
         facts = {}
         config = Config()
-        targets = Targets()
+        targets = Targets(args.data_dir)
         inventory = Inventory(targets, config)
         host = args.host
         target = args.target
@@ -224,7 +224,7 @@ class Application:
     def _action_variables(self, args):
         self._entrypoint_debug(args)
 
-        targets = Targets()
+        targets = Targets(args.data_dir)
         packages = Packages(args.data_dir)
         projects = Projects(args.data_dir)
         projects_expanded = projects.expand_names(args.projects)
@@ -253,7 +253,7 @@ class Application:
     def _action_dockerfile(self, args):
         self._entrypoint_debug(args)
 
-        targets = Targets()
+        targets = Targets(args.data_dir)
         packages = Packages(args.data_dir)
         projects = Projects(args.data_dir)
         projects_expanded = projects.expand_names(args.projects)
@@ -278,7 +278,7 @@ class Application:
     def _action_buildenvscript(self, args):
         self._entrypoint_debug(args)
 
-        targets = Targets()
+        targets = Targets(args.data_dir)
         packages = Packages(args.data_dir)
         projects = Projects(args.data_dir)
         projects_expanded = projects.expand_names(args.projects)
@@ -300,7 +300,7 @@ class Application:
         if args.base_dir is not None:
             base_path = Path(args.base_dir)
         ci_path = Path(args.ci_dir)
-        targets = Targets()
+        targets = Targets(args.data_dir)
         packages = Packages(args.data_dir)
         projects = Projects(args.data_dir)
         manifest = Manifest(targets, packages, projects, args.manifest, args.quiet, ci_path, base_path)
diff --git a/lcitool/targets.py b/lcitool/targets.py
index 1bbd2530b170093932c818d2171a823f9dc1a8a0..3d380a6f452a45ed6b3c59b3f61e5905c28533d9 100644
--- a/lcitool/targets.py
+++ b/lcitool/targets.py
@@ -52,18 +52,17 @@ class Targets():
     def _load_target_facts(self):
         facts = {}
         all_targets = {item.stem
-                       for item in self._data_dir.list_files("facts/targets", ".yml",
-                                                             internal=True)}
+                       for item in self._data_dir.list_files("facts/targets", ".yml")}
 
         # first load the shared facts from targets/all.yml
-        shared_facts = self._data_dir.load_yaml("facts/targets", "all")
+        shared_facts = self._data_dir.merge_facts("facts/targets", "all")
 
         # then load the rest of the facts
         for target in all_targets:
             if target == "all":
                 continue
 
-            facts[target] = self._data_dir.load_yaml("facts/targets", target)
+            facts[target] = self._data_dir.merge_facts("facts/targets", target)
             self._validate_target_facts(facts[target], target)
             facts[target]["target"] = target
 
diff --git a/lcitool/util.py b/lcitool/util.py
index 9a899ba73d6321afc0c38f3c07fd3dc2a7fe9396..da7fc8bb79289cc9ee06bb437ff72f6e85be4942 100644
--- a/lcitool/util.py
+++ b/lcitool/util.py
@@ -253,15 +253,6 @@ class DataDir:
                 if file.is_file() and (suffix is None or file.suffix == suffix):
                     yield file
 
-    def load_yaml(self, resource_path, name):
-        file = Path(resource_filename(__name__, resource_path), name + ".yml")
-        if not file.exists():
-            return {}
-
-        log.debug(f"Loading facts from '{file}'")
-        with open(file, "r") as infile:
-            return yaml.safe_load(infile)
-
     def merge_facts(self, resource_path, name):
         result = {}
         for file in self._search(resource_path, name + ".yml"):
diff --git a/tests/data/targets/override/targets/centos-stream-8.yml b/tests/data/targets/override/targets/centos-stream-8.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6b11160fd1dc292b096d29ceca64546a35139754
--- /dev/null
+++ b/tests/data/targets/override/targets/centos-stream-8.yml
@@ -0,0 +1,3 @@
+paths:
+  pip3: /usr/bin/pip3.8
+  python: /usr/bin/python3.8
diff --git a/tests/test_targets.py b/tests/test_targets.py
index 61985f7f18f0c6e99c5485d48fe78acf2df6c338..9a76fc1bdab36d2d20c790322d53fb3c6e0e6e10 100644
--- a/tests/test_targets.py
+++ b/tests/test_targets.py
@@ -4,9 +4,14 @@
 #
 # SPDX-License-Identifier: GPL-2.0-or-later
 
+from pathlib import Path
 import pytest
 
+from lcitool.targets import Targets
+from lcitool.util import DataDir
+
 from conftest import ALL_TARGETS
+import test_utils.utils as test_utils
 
 
 @pytest.mark.parametrize("target", ALL_TARGETS)
@@ -32,3 +37,12 @@ def test_group_vars(targets, target):
     assert facts["target"] == target
     assert facts["os"]["name"] == target_osname_map[target_os]
     assert facts["os"]["version"] == target_version.capitalize()
+
+
+def test_override():
+    datadir = DataDir(Path(test_utils.test_data_dir(__file__), 'override'))
+    targets = Targets(datadir)
+    facts = targets.target_facts['centos-stream-8']
+
+    assert facts["paths"]["pip3"] == "/usr/bin/pip3.8"
+    assert facts["paths"]["python"] == "/usr/bin/python3.8"