diff --git a/scripts/changelog_generator.py b/scripts/changelog_generator.py
index 2e85e5fa94743a6a4100870070f2d2d072f71905..0260121090788654dda6938110e90232a425bf3b 100755
--- a/scripts/changelog_generator.py
+++ b/scripts/changelog_generator.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-""" 
+"""
 
 Simple changelog generator for Garz&Fricke gitlab projects.
 
@@ -22,6 +22,7 @@ import sys
 import gitlab as gl
 
 import common
+from get_integration_sources import get_integration_sources
 
 __author__ = "Jonas Höppner"
 __email__ = "jonas.hoeppner@garz-fricke.com"
@@ -58,7 +59,7 @@ class Tag:
         self.message = tag.message
         self.commit = tag.commit
         """
-        The tags timestamp is a little more complicated it normally points 
+        The tags timestamp is a little more complicated it normally points
         to the tagged commit's timestamps. But the merge happens later.
         To handle this, the relelated mergerequest is found by comparing the
         sha's and also take the merged_at timestamp.
@@ -182,7 +183,6 @@ class MergeRequest:
 
 
 def main(args):
-
     parser = argparse.ArgumentParser(description=__doc__, usage="%(prog)s [OPTIONS]")
 
     parser.add_argument(
@@ -213,6 +213,15 @@ def main(args):
         required=True,
     )
 
+    parser.add_argument(
+        "-a",
+        "--all-projects",
+        help="""Parse all projects integrated into the listed ones""",
+        action="store_true",
+        default=False,
+        required=False,
+    )
+
     parser.add_argument(
         "-v",
         "--verbose",
@@ -229,10 +238,41 @@ def main(args):
     logging.debug(options)
     gitlab = gl.Gitlab(options.gitlab_url, private_token=options.token)
 
-    projects = [Project(gitlab.projects.get(project)) for project in options.project]
+    project_list = {}
+    manifest_project = options.project[0]
+    if not options.all_projects:
+        # Old behaviour: Just a list of all projects from the commandline,
+        # only one branch name
+        for project in options.project:
+            project_list[project] = {"branch": options.branch}
+    else:
+        # New behaviour: Go through the project list from the parameters
+        # and check for all integrated projects
+        groupname = options.project[0].split("/")[0]
+        group = gitlab.groups.get(groupname, retry_transient_errors=True)
+        for project in options.project:
+            project_list[project] = {"branch": options.branch}
+
+            integration_sources = get_integration_sources(
+                project, options.branch, group
+            )
+            for source in integration_sources:
+                project_list[source["project"]] = {"branch": source["branch"]}
+
+    if options.verbose:
+        print("Projects included in the report:")
+        for p, b in project_list.items():
+            print(f"  {p}  - {b['branch']}")
+
+    for p in project_list.keys():
+        gl_project = Project(gitlab.projects.get(p))
+        project_list[p]["gitlab"] = gl_project
+
     releases = [
         Release(Tag(t))
-        for t in projects[0].project.tags.list(search=options.branch, as_list=False)
+        for t in project_list[manifest_project]["gitlab"].project.tags.list(
+            search=project_list[manifest_project]["branch"], as_list=False
+        )
     ]
     # Add dummy release with date today for new unstaged commits
     releases.append(
@@ -247,11 +287,11 @@ def main(args):
     # Sort by date, oldest first
     releases = sorted(releases, key=lambda d: d.tag.timestamp, reverse=False)
 
-    for p in projects:
-        for mr in p.project.mergerequests.list(
-            scope="all", state="merged", target_branch=options.branch, as_list=False
+    for p in project_list.values():
+        for mr in p["gitlab"].project.mergerequests.list(
+            scope="all", state="merged", target_branch=p["branch"], as_list=False
         ):
-            m = MergeRequest(mr, p)
+            m = MergeRequest(mr, p["gitlab"])
             for r in releases:
                 if r.add_mergerequest(m):
                     break