diff --git a/prep-code-review-and-response.py b/prep-code-review-and-response.py
index fe3e0cf4044bd194197582b8da9a2be9303bcce7..d5b04a9d9a656ed007ef5f486917196558b8f0eb 100644
--- a/prep-code-review-and-response.py
+++ b/prep-code-review-and-response.py
@@ -4,28 +4,72 @@ from common_functions import select_from_list
 
 # TODO: look for opportunity to reduce DRY, relative to main function in prep_assignment
 def create_partners():
-    print('Creating pairs from students')
-    the_groupset: str = input('Please provide the name of the student groupset: ')
-    the_student_set: Set[CompositeUser] = get_students()
+    group_set: str = input('Please provide the name of the student groupset: ')
+    students: Set[CompositeUser] = get_students()
+    print('Creating student pairs')
     # TODO: check for changes to course roster
     # TODO: check for changes to gitlab usernames
-    the_partners: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]] = \
-        create_pairs(the_student_set, the_groupset)
+    pairings: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]] = \
+        create_pairs(students, group_set)
     print()
-    save_student_roster(the_student_set)
-    create_contact_list(the_groupset, the_partners)
+    save_student_roster(students)
+    create_contact_list(group_set, pairings)
     print()
-    create_groups(the_groupset, the_partners)
+    create_groups(group_set, pairings)
+    print('TODO: Manually edit the new student roster and the contact list as needed.')
 
 
-def clone_forks():
-    print('Cloning the forks (... not yet)')
+# TODO: look for opportunity to reduce DRY, relative to prep_assignment.create_repositories
+# TODO: extract code for reuse in validate_forks
+def create_clone_script():
+    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()
+    filename = f'{new_groupset}-clone.sh'
+    print(f'Creating file for clone script: {filename}.')
+    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()
+    with open(filename, mode='w') as clone_file:
+        clone_file.write('#!/bin/bash\n\n')
+        clone_file.write('# Auto-generated clone script.\n\n\n')
+        for new_group in new_groups:
+            new_group_name: str = new_group.get_name().strip().replace(" ", "")
+            clone_file.write(f'# {new_group_name}\n')
+            group_students: List[CanvasUser] = new_group.get_students()
+            for student in group_students:
+                old_group_name: str = list(filter(lambda g: student in g.get_students(),
+                                                  old_groups))[0].get_name().strip().replace(" ", "")
+                print(f'\t{student.get_name()} was in {old_group_name} and is now in {new_group_name}.')
+                composite_student: CompositeUser = list(filter(lambda s: s.get_canvas_user() == student, students))[0]
+                gitlab_username: str = composite_student.get_gitlab_user().get_username()
+                # # THIS WOULD BE USED IF WE KNEW THE FORKS WERE PRESENT; IF THEY'RE NOT PRESENT THEN LEN(PROJECTS)==0
+                # projects: List[GitlabProject] = GitlabProject.get_projects_by_keyword(old_group_name)
+                # project: GitlabProject = \
+                #     list(filter(lambda p: p.get_creator().get_username() == gitlab_username, projects))[0]
+                # repo_url: str = project.get_cloning_url()
+                # # THIS IS HOW WE'LL FAKE IT
+                repo_url: str = f'git@git.unl.edu:{gitlab_username}/{old_group_name}.git'
+                clone_file.write(f'git clone {repo_url} {new_group_name}-{student.get_name().replace(" ","_")}\n')
+            clone_file.write('\n')
+    subprocess.call(['chmod', '+x', filename])
+
+
+def validate_forks():
+    print('Examining the forks (... not yet)')
 
 
 if __name__ == '__main__':
-    print('There are two steps, creating partners (before the completion of the assignment to be reviewed),')
-    print('and cloning/verifying successful forks (after deadline to fork & add Maintainers)')
+    print('There are four steps, creating partners (before the completion of the assignment')
+    print('to be reviewed), manually adjusting the pairings as needed (e.g., due to')
+    print('excusals from previous assignment, creating the cloning script after adjustments')
+    print('have been made, and validating successful forks (after deadline to fork & add')
+    print('Maintainers).')
     print()
-    tasks = {'Create partners': create_partners, 'Clone forks': clone_forks}
+    tasks = {'Create partners': create_partners,
+             'Create clone script': create_clone_script,
+             'Validate forks': validate_forks}
     task = select_from_list(list(tasks), 'task')
     tasks[task]()