diff --git a/api/gitlab_classes.py b/api/gitlab_classes.py
index 90ab56b513dc2c5b7b6bca88551dc78b6a7127ff..118de3e41c42314e18337e7f915d67030ab9f062 100644
--- a/api/gitlab_classes.py
+++ b/api/gitlab_classes.py
@@ -53,6 +53,13 @@ class GitlabUser:
     def get_site(self) -> str:
         return self.git_user.web_url
 
+    def get_projects(self) -> List["GitlabProject"]:
+        gitlab_projects = self.git_user.projects.list(all=True)
+        projects: List[GitlabProject] = []
+        for project in gitlab_projects:
+            projects.append(GitlabProject(project))
+        return projects
+
     def __repr__(self) -> str:
         username = self.get_username()
         return f'@{username}'
diff --git a/prep-code-review-and-response.py b/prep-code-review-and-response.py
index d5b04a9d9a656ed007ef5f486917196558b8f0eb..4973e534ddd9b71f254544bba583b55ca330f8d4 100644
--- a/prep-code-review-and-response.py
+++ b/prep-code-review-and-response.py
@@ -58,7 +58,45 @@ def create_clone_script():
 
 
 def validate_forks():
-    print('Examining the forks (... not yet)')
+    old_groupset: str = input('Please provide the name of the student groupset for the previous assignment: ')
+    new_groupset: str = input('Please provide the name of the student groupset for the next assignment: ')
+    students: Set[CompositeUser] = get_students()
+    print('Validating the forks.')
+    print('This script will report anything unexpected;')
+    print('use judgement when grading fork requirement.')
+    print()
+    # noinspection PyPep8Naming
+    TAs: List[str] = (input('Enter the TAs\' gitlab usernames as a space-delimited sequence: ')).split()
+    course = CanvasCourse(Course.canvas_course_id)
+    old_groups: List[CanvasUserGroup] = list(filter(lambda g: g.get_name() == old_groupset,
+                                                    course.get_user_groupsets()))[0].get_groups()
+    new_groups: List[CanvasUserGroup] = list(filter(lambda g: g.get_name() == new_groupset,
+                                                    course.get_user_groupsets()))[0].get_groups()
+    for student in students:
+        print(f'Validating {student.get_canvas_user().get_name()}')
+        old_group_name: str = list(filter(lambda g: student.get_canvas_user() in g.get_students(),
+                                          old_groups))[0].get_name().strip().replace(" ", "")
+        new_group = list(filter(lambda g: student.get_canvas_user() in g.get_students(), new_groups))[0]
+        projects: List[GitlabProject] = student.get_gitlab_user().get_projects()
+        project_names: List[str] = list(map(lambda p: p.get_name(), projects))
+        if old_group_name in project_names:
+            project: GitlabProject = list(filter(lambda p: p.get_name() == old_group_name, projects))[0]
+            users: List[GitlabUser] = project.get_all_users()
+            usernames: List[str] = list(map(lambda u: u.get_username(), users))
+            for TA in TAs:
+                if TA not in usernames:
+                    print(f'\t{student.get_canvas_user().get_name()} did not add @{TA} to repo.')
+            for partner in new_group.get_students():
+                composite_student: CompositeUser = list(filter(lambda s: s.get_canvas_user() == partner, students))[0]
+                if composite_student.get_gitlab_user().get_username() not in usernames:
+                    print(f'\t{student.get_canvas_user().get_name()} did not add {partner.get_name()} to repo.')
+        else:
+            print(f'\t{student.get_canvas_user().get_name()}: Could not locate {old_group_name}.git')
+            print('\t\tThis may be because the student hasn\'t forked their repository, or')
+            print('\t\tbecause they haven\'t given you access, or because they renamed it.')
+            print(f'\t\t\t{student.get_canvas_user().get_name()}\'s repositories:')
+            for project in project_names:
+                print(f'\t\t\t{project}')
 
 
 if __name__ == '__main__':