diff --git a/buildstream/element.py b/buildstream/element.py
index 54b764eb96df2d1d2fce3aad1764309d0749659c..bc939bc92fed0efc04a97dee1d20c23b636d8abd 100644
--- a/buildstream/element.py
+++ b/buildstream/element.py
@@ -685,6 +685,7 @@ class Element(Plugin):
         files_written = {}
         old_dep_keys = {}
         workspace = self._get_workspace()
+        project = self._get_project()
 
         if self.__can_build_incrementally() and workspace.last_successful:
             old_dep_keys = self.__get_artifact_metadata_dependencies(workspace.last_successful)
@@ -746,9 +747,8 @@ class Element(Plugin):
                 overlapping_elements = elements[1:]
                 for elm in overlapping_elements:
                     element = self.search(scope, elm)
-                    element_project = element._get_project()
                     if not element.__file_is_whitelisted(f):
-                        if element_project.fail_on_overlap:
+                        if project.fail_on_overlap:
                             overlap_error_elements.append(elm)
                             overlap_error = True
                         else:
diff --git a/tests/frontend/overlaps.py b/tests/frontend/overlaps.py
index 36e15acd74b82ac33fd3dffcd8ce615bc24b6166..7c86445f641464266d1e8f0413b5e220b01bed7c 100644
--- a/tests/frontend/overlaps.py
+++ b/tests/frontend/overlaps.py
@@ -1,6 +1,7 @@
 import os
 import pytest
 from tests.testutils.runcli import cli
+from tests.testutils import generate_junction
 from buildstream._exceptions import ErrorDomain
 from buildstream import _yaml
 
@@ -10,15 +11,12 @@ DATA_DIR = os.path.join(
     "overlaps"
 )
 
-project_template = {
-    "name": "test",
-    "element-path": "."
-}
 
-
-def gen_project(project_dir, fail_on_overlap):
-    template = dict(project_template)
-    template["fail-on-overlap"] = fail_on_overlap
+def gen_project(project_dir, fail_on_overlap, project_name="test"):
+    template = {
+        "name": project_name,
+        "fail-on-overlap": fail_on_overlap
+    }
     projectfile = os.path.join(project_dir, "project.conf")
     _yaml.dump(template, projectfile)
 
@@ -82,3 +80,30 @@ def test_overlaps_script(cli, datafiles):
     result = cli.run(project=project_dir, silent=True, args=[
         'build', 'script.bst'])
     result.assert_success()
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("project_policy", [('fail'), ('warn')])
+@pytest.mark.parametrize("subproject_policy", [('fail'), ('warn')])
+def test_overlap_subproject(cli, tmpdir, datafiles, project_policy, subproject_policy):
+    project_dir = str(datafiles)
+    subproject_dir = os.path.join(project_dir, 'sub-project')
+    junction_path = os.path.join(project_dir, 'sub-project.bst')
+
+    gen_project(project_dir, bool(project_policy == 'fail'), project_name='test')
+    gen_project(subproject_dir, bool(subproject_policy == 'fail'), project_name='subtest')
+    generate_junction(tmpdir, subproject_dir, junction_path)
+
+    # Here we have a dependency chain where the project element
+    # always overlaps with the subproject element.
+    #
+    # Test that overlap error vs warning policy for this overlap
+    # is always controlled by the project and not the subproject.
+    #
+    result = cli.run(project=project_dir, silent=True, args=['build', 'sub-collect.bst'])
+    if project_policy == 'fail':
+        result.assert_main_error(ErrorDomain.STREAM, None)
+        result.assert_task_error(ErrorDomain.ELEMENT, "overlap-error")
+    else:
+        result.assert_success()
+        assert "WARNING Non-whitelisted overlaps detected" in result.stderr
diff --git a/tests/frontend/overlaps/sub-collect.bst b/tests/frontend/overlaps/sub-collect.bst
new file mode 100644
index 0000000000000000000000000000000000000000..85d327e1b12bb1da234f2517b60feb1f6a53c989
--- /dev/null
+++ b/tests/frontend/overlaps/sub-collect.bst
@@ -0,0 +1,11 @@
+kind: compose
+
+depends:
+- filename: c.bst
+  type: build
+- filename: a-sub.bst
+  junction: sub-project.bst
+  type: build
+- filename: z-sub.bst
+  junction: sub-project.bst
+  type: build
diff --git a/tests/frontend/overlaps/sub-project/a-sub.bst b/tests/frontend/overlaps/sub-project/a-sub.bst
new file mode 100644
index 0000000000000000000000000000000000000000..40b8f5d9c656233d3c5919b4074e8fc437d2a474
--- /dev/null
+++ b/tests/frontend/overlaps/sub-project/a-sub.bst
@@ -0,0 +1,7 @@
+kind: import
+config:
+  source: /
+  target: /
+sources:
+- kind: local
+  path: "files/a"
diff --git a/tests/frontend/overlaps/sub-project/files/a/file3 b/tests/frontend/overlaps/sub-project/files/a/file3
new file mode 100644
index 0000000000000000000000000000000000000000..e416e0d0d54d6e26ef0812d7d99dbe4b442bd7fb
--- /dev/null
+++ b/tests/frontend/overlaps/sub-project/files/a/file3
@@ -0,0 +1 @@
+barny
diff --git a/tests/frontend/overlaps/sub-project/files/z/file1 b/tests/frontend/overlaps/sub-project/files/z/file1
new file mode 100644
index 0000000000000000000000000000000000000000..257cc5642cb1a054f08cc83f2d943e56fd3ebe99
--- /dev/null
+++ b/tests/frontend/overlaps/sub-project/files/z/file1
@@ -0,0 +1 @@
+foo
diff --git a/tests/frontend/overlaps/sub-project/files/z/file2 b/tests/frontend/overlaps/sub-project/files/z/file2
new file mode 100644
index 0000000000000000000000000000000000000000..5716ca5987cbf97d6bb54920bea6adde242d87e6
--- /dev/null
+++ b/tests/frontend/overlaps/sub-project/files/z/file2
@@ -0,0 +1 @@
+bar
diff --git a/tests/frontend/overlaps/sub-project/z-sub.bst b/tests/frontend/overlaps/sub-project/z-sub.bst
new file mode 100644
index 0000000000000000000000000000000000000000..e9729ae31dda3f49bae1df9b78041bfd2753380f
--- /dev/null
+++ b/tests/frontend/overlaps/sub-project/z-sub.bst
@@ -0,0 +1,7 @@
+kind: import
+config:
+  source: /
+  target: /
+sources:
+- kind: local
+  path: "files/z"