diff --git a/src/demorepo/commands/command_run.py b/src/demorepo/commands/command_run.py
index 504024f..2e725b5 100644
--- a/src/demorepo/commands/command_run.py
+++ b/src/demorepo/commands/command_run.py
@@ -171,6 +171,7 @@ def run(args):
     command = args['command']
     targets = args.get('targets', None)
     reverse_targets = args['reverse_targets']
+    inverse_dependencies = args['inverse_dependencies']
     stop_on_error = args['stop_on_error']
     env = args.get('env')
 
@@ -178,5 +179,6 @@ def run(args):
     dependencies = config.get_projects_dependencies()
     paths = config.get_projects_paths()
 
-    targets = get_targets(projects, dependencies, targets, reverse_targets)
+    targets = get_targets(projects, dependencies, targets, reverse_targets, inverse_dependencies)
     _run_targets(projects, paths, targets, env, stop_on_error, command=command)
+
diff --git a/src/demorepo/commands/targets/__init__.py b/src/demorepo/commands/targets/__init__.py
index dc90bd6..77fa852 100644
--- a/src/demorepo/commands/targets/__init__.py
+++ b/src/demorepo/commands/targets/__init__.py
@@ -1,10 +1,12 @@
+from collections import defaultdict
+
 from demorepo import logger
 
 
 __all__ = ['get_targets']
 
 
-def get_targets(targets, dependencies, targets_filter, reverse_targets=False, recursive_deps=False):
+def get_targets(targets, dependencies, targets_filter, reverse_targets=False, inverse_dependencies=False):
 
     if targets_filter is not None:
         # If filter is empty it means that we will return an empty list so nothing gets run
@@ -21,11 +23,15 @@ def get_targets(targets, dependencies, targets_filter, reverse_targets=False, re
                         "Unrecognized project {} in --targets".format(t))
             targets = [t for t in targets if t in targets_filter]
 
+    # Set reverse dependency targets if inverse_dependencies
+    if inverse_dependencies:
+        targets = _add_inverse_dependencies(targets, dependencies)
+
     # Set target order
     targets = _order_targets(targets, dependencies)
 
     # Reverse if specified in args
-    if (reverse_targets):
+    if reverse_targets:
         targets.reverse()
 
     return targets
@@ -49,6 +55,27 @@ def _order_targets(targets, dependencies):
     return list(ordered)
 
 
-def _add_deps(targets, dependencies, projects):
-    # TODO: Implement inverse dependencies with projects
-    pass
+def _add_inverse_dependencies(targets, dependencies):
+    # Process the dict of dependents (projects which are dependent of a project; inverse of dependencies)
+    dependents = defaultdict(set)
+    for project in dependencies:
+        for dependency in dependencies[project]:
+            dependents[dependency].add(project)
+
+    # This recursive function add the dependencies in the set s when e is marked as modified
+    def add_dependencies(e, s):
+        new_elements = [x for x in dependents[e] if x not in s]
+        for n in new_elements:
+            s.add(n)
+            add_dependencies(n, s)
+
+    # Now, for each modified project, get its name (to use the dependents dict) and add its dependencies
+    s = set()
+    for m in targets:
+        s.add(m)
+        # only if project is in dependents list (recursive option implemented for this project type)
+        if m in dependents:
+            add_dependencies(m, s)
+
+    # Return the extended list of target projects
+    return list(s)
diff --git a/src/demorepo/config/__init__.py b/src/demorepo/config/__init__.py
index 953ce67..403ee2f 100644
--- a/src/demorepo/config/__init__.py
+++ b/src/demorepo/config/__init__.py
@@ -82,7 +82,7 @@ def _init_config():
         _config['stages'] = stages
 
     else:
-        logger.error("Error: Unable to find config.yml. Is this a demorepo?")
+        logger.error("Error: Unable to find demorepo.yml. Is this a demorepo?")
         sys.exit(-1)
 
 
diff --git a/src/demorepo/parser/__init__.py b/src/demorepo/parser/__init__.py
index 61104d2..c01888a 100644
--- a/src/demorepo/parser/__init__.py
+++ b/src/demorepo/parser/__init__.py
@@ -43,9 +43,9 @@ parser_stage.add_argument(
 parser_stage.add_argument('-e', '--env', action='append', help='Optional variables passed to the target stage script.'
                           ' The format is VAR_NAME=VAR_VALUE. '
                           'Multiple env vars can be specified.')
-# parser_stage.add_argument('-r', '--recursive-deps', action='store_true',
-#                               help='Find projects recursively which depends on target projects and include them as '
-#                               'target projects too.')
+parser_stage.add_argument('-r', '--inverse-dependencies', action='store_true',
+                          help='Find projects which depends on target projects and include them as '
+                               'target projects too.')
 parser_stage.add_argument('-t', '--targets', help='A list of target project names to run the provided stage, '
                           'separated by blank spaces (use quotes around the string).')
 parser_stage.add_argument('--reverse-targets', action='store_true',
@@ -65,9 +65,9 @@ parser_run.add_argument('-e', '--env', action='append',
                         help='Optional variables passed to the target stage script.'
                         ' The format is VAR_NAME=VAR_VALUE. '
                         'Multiple env vars can be specified.')
-# parser_run.add_argument('-r', '--recursive-deps', action='store_true',
-#                               help='Find projects recursively which depends on target projects and include them as '
-#                                    'target projects too.')
+parser_run.add_argument('-r', '--inverse-dependencies', action='store_true',
+                        help='Find projects which depends on target projects and include them as '
+                             'target projects too.')
 parser_run.add_argument('--reverse-targets', action='store_true',
                         help='Reverse the dependency order for projects')
 parser_run.add_argument('--stop-on-error', action='store_true',

Reimplement recursive-deps
diff --git a/src/tests/test_parser.py b/src/tests/test_parser.py
index ff287f4..585f478 100644
--- a/src/tests/test_parser.py
+++ b/src/tests/test_parser.py
@@ -6,8 +6,8 @@ from demorepo import parser
 
 defaults = dict(silent=False, log_path=None, working_mode=None)
 lgc_defaults = dict(ci_tool='gitlab', ci_url=None)
-run_defaults = dict(targets=None, env=None, reverse_targets=False, stop_on_error=False)
-stage_defaults = dict(targets=None, env=None, reverse_targets=False, stop_on_error=False)
+run_defaults = dict(targets=None, env=None, reverse_targets=False, stop_on_error=False, inverse_dependencies=False)
+stage_defaults = dict(targets=None, env=None, reverse_targets=False, stop_on_error=False, inverse_dependencies=False)
 
 
 @pytest.mark.parametrize("argv,expected,exit", [
@@ -45,7 +45,7 @@ stage_defaults = dict(targets=None, env=None, reverse_targets=False, stop_on_err
     # run required
     (
         ['demorepo', 'run', 'ls'],
-        dict(defaults, working_mode='run', **run_defaults, command='ls'),
+        dict(defaults, working_mode='run', command='ls', **run_defaults),
         None,
     ),
     # run required fail
@@ -56,15 +56,16 @@ stage_defaults = dict(targets=None, env=None, reverse_targets=False, stop_on_err
     ),
     # run opts
     (
-        ['demorepo', 'run', 'ls', '--targets', 'target1', '--reverse-targets', '--stop-on-error', '--env', 'cosa=1234'],
+        ['demorepo', 'run', 'ls', '--targets', 'target1', '--reverse-targets',
+         '--stop-on-error', '--env', 'cosa=1234', '--inverse-dependencies'],
         dict(defaults, working_mode='run', command='ls', targets='target1',
-             reverse_targets=True, stop_on_error=True, env=['cosa=1234']),
+             reverse_targets=True, stop_on_error=True, env=['cosa=1234'], inverse_dependencies=True),
         None,
     ),
     # stage required
     (
         ['demorepo', 'stage', 'deploy'],
-        dict(defaults, working_mode='stage', **stage_defaults, stage='deploy'),
+        dict(defaults, working_mode='stage', stage='deploy', **stage_defaults),
         None,
     ),
     # stage required fail
@@ -75,9 +76,10 @@ stage_defaults = dict(targets=None, env=None, reverse_targets=False, stop_on_err
     ),
     # stage opts
     (
-        ['demorepo', 'stage', 'deploy', '--targets', 'target1', '--reverse-targets', '--stop-on-error', '--env', 'cosa=1234'],
-        dict(defaults, working_mode='stage', stage='deploy',
-             targets='target1', reverse_targets=True, stop_on_error=True, env=['cosa=1234']),
+        ['demorepo', 'stage', 'deploy', '--targets', 'target1', '--reverse-targets',
+         '--stop-on-error', '--env', 'cosa=1234', '--inverse-dependencies'],
+        dict(defaults, working_mode='stage', stage='deploy', targets='target1',
+             reverse_targets=True, stop_on_error=True, env=['cosa=1234'], inverse_dependencies=True),
         None,
     ),
 ])
diff --git a/src/tests/test_targets.py b/src/tests/test_targets.py
index 52a46ac..89e6167 100644
--- a/src/tests/test_targets.py
+++ b/src/tests/test_targets.py
@@ -13,13 +13,14 @@ from . import raises
 """
 
 
-@pytest.mark.parametrize("projects, dependencies, targets, reverse_targets, expected, exception", [
+@pytest.mark.parametrize("projects, dependencies, targets, reverse_targets, inverse_dependencies, expected, exception", [
     # No filter no deps
     (
         ["target_A", "target_B", "target_C"],
         dict(target_A=[], target_B=[], target_C=[]),
         "target_A target_B target_C",
         False,
+        False,
         ["target_A", "target_B", "target_C"],
         None
     ),
@@ -29,6 +30,7 @@ from . import raises
         dict(target_A=[], target_B=[], target_C=[]),
         "target_A target_C",
         False,
+        False,
         ["target_A", "target_C"],
         None
     ),
@@ -38,6 +40,7 @@ from . import raises
         dict(target_A=[], target_B=[], target_C=[]),
         "",
         False,
+        False,
         [],
         None
     ),
@@ -47,6 +50,7 @@ from . import raises
         dict(target_A=[], target_B=[], target_C=[]),
         "target_A target_D",
         False,
+        False,
         None,
         Exception
     ),
@@ -56,6 +60,7 @@ from . import raises
         dict(target_A=["target_B"], target_B=[], target_C=["target_A"]),
         "target_A target_B target_C",
         False,
+        False,
         ["target_B", "target_A", "target_C"],
         None
     ),
@@ -65,6 +70,7 @@ from . import raises
         dict(target_A=["target_B"], target_B=[], target_C=["target_A"]),
         "target_A target_C",
         False,
+        False,
         ["target_A", "target_C"],
         None
     ),
@@ -74,6 +80,7 @@ from . import raises
         dict(target_A=["target_B"], target_B=[], target_C=["target_A"]),
         "target_A target_B target_C",
         True,
+        False,
         ["target_C", "target_A", "target_B"],
         None
     ),
@@ -83,9 +90,30 @@ from . import raises
         dict(target_A=["target_B"], target_B=[], target_C=["target_A"]),
         "target_B target_C",
         True,
+        False,
         ["target_C", "target_B"],
         None
     ),
+    # No reverse order, inverse deps (single iteration A -> B)
+    (
+        ["target_A", "target_B", "target_C"],
+        dict(target_A=["target_B"], target_B=[], target_C=[]),
+        "target_B",
+        False,
+        True,
+        ["target_B", "target_A"],
+        None
+    ),
+    # Reverse order, inverse deps (multiple iterations B -> C -> A)
+    (
+        ["target_A", "target_B", "target_C"],
+        dict(target_A=["target_C"], target_B=[], target_C=["target_B"]),
+        "target_B",
+        True,
+        True,
+        ["target_A", "target_C", "target_B"],
+        None
+    ),
     # Cycle
     (
         ["target_A", "target_B", "target_C"],
@@ -93,11 +121,12 @@ from . import raises
              "target_A"], target_C=["target_A"]),
         "target_A target_B target_C",
         False,
+        False,
         None,
         Exception
     ),
 ])
-def test_get_targets_plain(projects, dependencies, targets, reverse_targets, expected, exception):
+def test_get_targets_plain(projects, dependencies, targets, reverse_targets, inverse_dependencies, expected, exception):
     with raises(exception):
-        result = get_targets(projects, dependencies, targets, reverse_targets)
+        result = get_targets(projects, dependencies, targets, reverse_targets, inverse_dependencies)
         assert result == expected

pip install -e .[dev]
parse_log_pytest
requirements.txt
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi==2025.1.31
chardet==3.0.4
-e git+https://github.com/demosense/demorepo.git@6dcff3ceada6957d9e14e646bde040c32ac8ac0f#egg=demorepo
gitdb==4.0.12
gitdb2==4.0.2
GitPython==2.1.9
idna==2.6
PyYAML==3.12
requests==2.18.4
smmap==5.0.2
urllib3==1.22

name: demorepo
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
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - chardet==3.0.4
      - gitdb==4.0.12
      - gitdb2==4.0.2
      - gitpython==2.1.9
      - idna==2.6
      - pyyaml==3.12
      - requests==2.18.4
      - smmap==5.0.2
      - urllib3==1.22
prefix: /opt/conda/envs/demorepo

src/tests/test_parser.py::test_parser[argv5-expected5-None] src/tests/test_parser.py::test_parser[argv7-expected7-None] src/tests/test_parser.py::test_parser[argv8-expected8-None] src/tests/test_parser.py::test_parser[argv10-expected10-None] src/tests/test_targets.py::test_get_targets_plain[projects8-dependencies8-target_B-False-True-expected8-None] src/tests/test_targets.py::test_get_targets_plain[projects9-dependencies9-target_B-True-True-expected9-None]
src/tests/test_parser.py::test_parser[argv0-expected0-None] src/tests/test_parser.py::test_parser[argv1-expected1-SystemExit] src/tests/test_parser.py::test_parser[argv2-expected2-None] src/tests/test_parser.py::test_parser[argv3-expected3-None] src/tests/test_parser.py::test_parser[argv4-expected4-SystemExit] src/tests/test_parser.py::test_parser[argv6-expected6-SystemExit] src/tests/test_parser.py::test_parser[argv9-expected9-SystemExit] src/tests/test_targets.py::test_get_targets_plain[projects0-dependencies0-target_A src/tests/test_targets.py::test_get_targets_plain[projects1-dependencies1-target_A src/tests/test_targets.py::test_get_targets_plain[projects2-dependencies2--False-False-expected2-None] src/tests/test_targets.py::test_get_targets_plain[projects3-dependencies3-target_A src/tests/test_targets.py::test_get_targets_plain[projects4-dependencies4-target_A src/tests/test_targets.py::test_get_targets_plain[projects5-dependencies5-target_A src/tests/test_targets.py::test_get_targets_plain[projects6-dependencies6-target_A src/tests/test_targets.py::test_get_targets_plain[projects7-dependencies7-target_B src/tests/test_targets.py::test_get_targets_plain[projects10-dependencies10-target_A
src/demorepo/parser/__init__.py src/demorepo/commands/targets/__init__.py src/demorepo/commands/command_run.py src/demorepo/config/__init__.py
src/demorepo/parser/__init__.py src/demorepo/commands/targets/__init__.py src/demorepo/commands/command_run.py src/demorepo/config/__init__.py