diff --git a/bids/layout/layout.py b/bids/layout/layout.py
index bdf9b99e..0861258c 100644
--- a/bids/layout/layout.py
+++ b/bids/layout/layout.py
@@ -4,11 +4,11 @@ import warnings
 from io import open
 from .validation import BIDSValidator
 from grabbit import Layout, File
-from grabbit.external import six
+from grabbit.external import six, inflect
 from grabbit.utils import listify
 import nibabel as nb
 from collections import defaultdict
-from functools import reduce
+from functools import reduce, partial
 from itertools import chain
 import re
 
@@ -194,6 +194,7 @@ class BIDSLayout(Layout):
                     if check_for_description(sd):
                         deriv_dirs.append(sd)
 
+        local_entities = set(ent.name for ent in self.entities.values())
         for deriv in deriv_dirs:
             dd = os.path.join(deriv, 'dataset_description.json')
             with open(dd, 'r', encoding='utf-8') as ddfd:
@@ -213,6 +214,16 @@ class BIDSLayout(Layout):
             kwargs['sources'] = kwargs.get('sources') or self
             self.derivatives[pipeline_name] = BIDSLayout(deriv, **kwargs)
 
+            # Propagate derivative entities into top-level dynamic getters
+            deriv_entities = set(ent.name
+                                 for ent in self.derivatives[pipeline_name].entities.values())
+            for deriv_ent in deriv_entities - local_entities:
+                local_entities.add(deriv_ent)
+                getter = 'get_' + inflect.engine().plural(deriv_ent)
+                if not hasattr(self, getter):
+                    func = partial(self.get, target=deriv_ent, return_type='id')
+                    setattr(self, getter, func)
+
     def to_df(self, **kwargs):
         """
         Return information for all Files tracked in the Layout as a pandas

Dynamic getters & entities from derivative layouts are not propagated to main Layout
Let's say I load a dataset with an fmriprep derivative in `derivatives/`

```
layout = BIDSLayout('/my/dataset', derivatives=True)
```
`layout.entities` will only list `bids.` entities, not any from `derivatives`

so in turn `layout.get_spaces()` will not work
but: `layout.derivatives['fMRIPrep'].get_spaces()` will.

Is this a problem? Seems a bit un-intuitive, and may have other unforeseen consequences if the top-level API is not aware of sub-Layout's entities.

Related issue: Should probably add a `fmriprep` derivative to the `ds005` test dataset.

diff --git a/bids/layout/tests/test_layout.py b/bids/layout/tests/test_layout.py
index 18fb2d0f..f6ccc122 100644
--- a/bids/layout/tests/test_layout.py
+++ b/bids/layout/tests/test_layout.py
@@ -255,3 +255,12 @@ def test_restricted_words_in_path(tmpdir):
     orig_files = set(f.replace(orig_path, '') for f in orig_layout.files)
     new_files = set(f.replace(new_path, '') for f in new_layout.files)
     assert orig_files == new_files
+
+
+def test_derivative_getters():
+    synth_path = join(get_test_data_path(), 'synthetic')
+    bare_layout = BIDSLayout(synth_path, derivatives=False)
+    full_layout = BIDSLayout(synth_path, derivatives=True)
+    with pytest.raises(AttributeError):
+        bare_layout.get_spaces()
+    assert set(full_layout.get_spaces()) == {'MNI152NLin2009cAsym', 'T1w'}

pip install -e .[analysis]
parse_log_pytest
pytest
pytest pytest-xdist pytest-cov codecov
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
charset-normalizer==2.0.12
codecov==2.1.13
coverage==6.2
docopt==0.6.2
execnet==1.9.0
grabbit==0.2.5
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
nibabel==3.2.2
num2words==0.5.14
numpy==1.19.5
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pandas==1.1.5
patsy==1.0.1
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
-e git+https://github.com/bids-standard/pybids.git@12c8e2bc445296086905cb8c46f64ae05ce08b3c#egg=pybids
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytest-cov==4.0.0
pytest-xdist==3.0.2
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.27.1
scipy==1.5.4
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
tomli==1.2.3
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: pybids
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - charset-normalizer==2.0.12
      - codecov==2.1.13
      - coverage==6.2
      - docopt==0.6.2
      - execnet==1.9.0
      - grabbit==0.2.5
      - idna==3.10
      - nibabel==3.2.2
      - num2words==0.5.14
      - numpy==1.19.5
      - pandas==1.1.5
      - patsy==1.0.1
      - pytest-cov==4.0.0
      - pytest-xdist==3.0.2
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.27.1
      - scipy==1.5.4
      - six==1.17.0
      - tomli==1.2.3
      - urllib3==1.26.20
prefix: /opt/conda/envs/pybids

bids/layout/tests/test_layout.py::test_derivative_getters
bids/layout/tests/test_layout.py::test_layout_init bids/layout/tests/test_layout.py::test_layout_repr bids/layout/tests/test_layout.py::test_load_description bids/layout/tests/test_layout.py::test_get_metadata bids/layout/tests/test_layout.py::test_get_metadata2 bids/layout/tests/test_layout.py::test_get_metadata3 bids/layout/tests/test_layout.py::test_get_metadata4 bids/layout/tests/test_layout.py::test_get_metadata_meg bids/layout/tests/test_layout.py::test_get_metadata5 bids/layout/tests/test_layout.py::test_get_metadata_via_bidsfile bids/layout/tests/test_layout.py::test_get_bvals_bvecs bids/layout/tests/test_layout.py::test_get_subjects bids/layout/tests/test_layout.py::test_get_fieldmap bids/layout/tests/test_layout.py::test_get_fieldmap2 bids/layout/tests/test_layout.py::test_bids_json bids/layout/tests/test_layout.py::test_include bids/layout/tests/test_layout.py::test_layout_with_derivs bids/layout/tests/test_layout.py::test_layout_with_multi_derivs bids/layout/tests/test_layout.py::test_query_derivatives bids/layout/tests/test_layout.py::test_get_bidsfile_image_prop bids/layout/tests/test_layout.py::test_restricted_words_in_path
bids/layout/layout.py
bids/layout/layout.py