diff --git a/SeniorDesignAssignments.json b/SeniorDesignAssignments.json
index ac8c3f8041f8f27008624b3864aa07a342991b5d..82dabf1a2a572ed0b3295c1c3b012720e8e7e49c 100644
--- a/SeniorDesignAssignments.json
+++ b/SeniorDesignAssignments.json
@@ -1,14 +1,40 @@
 {
-  "canvas course id": 167285,
+  "canvas course id": 179734,
   "end of grading periods": [
-    "2024-02-23",
-    "2024-04-05",
-    "2024-05-10"
+    "2024-10-04",
+    "2024-11-08",
+    "2024-12-13"
   ],
   "first semester": {
     "teams": [
-      "UNL BSE Hebets",
-      "UNMC Nebraska Medicine"
+      "ALLO Fiber",
+      "Aulick Industries",
+      "Blue Cross Blue Shield of Nebraska",
+      "CLAAS",
+      "Compass North",
+      "DMSi",
+      "DPA Auctions",
+      "Farm Credit Services of America",
+      "Hinco",
+      "Kiewit",
+      "McCain Foods",
+      "Mutual of Omaha",
+      "Nebraska Public Media",
+      "Nebraska Trucking Association",
+      "Nebraska Water Center",
+      "Nelnet",
+      "Scoular",
+      "UNL COE Kiewit Hall",
+      "UNL Department of Special Education",
+      "UNL SoC Bohn",
+      "UNL SoC Falkinburg",
+      "UNL SoC Sharif",
+      "UNL SoC Yao",
+      "UNL State Museum",
+      "UNL University Operations",
+      "UNMC College of Nursing",
+      "UNO Department of Biology",
+      "Werner Enterprises"
     ],
     "submission assignments": [
       "Lab Report 1",
@@ -19,38 +45,38 @@
       "Team Performance (Grading Period 1)",
       "Team Performance (Grading Period 2)",
       "Team Performance (Grading Period 3)",
+      "Individual Performance (Grading Period 1)",
+      "Individual Performance (Grading Period 2)",
+      "Individual Performance (Grading Period 3)",
       "Behaviors (Grading Period 1)",
       "Behaviors (Grading Period 2)",
       "Behaviors (Grading Period 3)",
+      "Professionalism and Respect (Grading Period 1)",
+      "Professionalism and Respect (Grading Period 2)",
+      "Professionalism and Respect (Grading Period 3)",
+      "Verbal Communication (Grading Period 1)",
+      "Verbal Communication (Grading Period 2)",
+      "Verbal Communication (Grading Period 3)",
       "Written Communication (Grading Period 1)",
       "Written Communication (Grading Period 2)",
-      "Written Communication (Grading Period 3)"
+      "Written Communication (Grading Period 3)",
+      "Workshop: Project Initiation",
+      "Workshop: Teaming",
+      "Workshop: Processes and Tools",
+      "Workshop: Story Mapping",
+      "Workshop: Risk Management",
+      "Workshop: Process Mapping",
+      "Workshop: Release Management",
+      "Workshop: Effective Feedback",
+      "Workshop: Testing",
+      "Workshop: CI/CD",
+      "Workshop: Transition"
     ]
   },
   "second semester": {
     "teams": [
-      "Aulick Industries",
-      "CLAAS Omaha",
-      "Compass North",
-      "Crete Carrier",
-      "DMSi",
-      "Emerson",
-      "Farm Credit Services of America",
-      "Fast Forward",
-      "Firework Media Studio Xrenegades",
-      "Henderson State Bank",
-      "Mutual of Omaha",
-      "National Indemnity",
-      "Nebraska Water Center",
-      "Nelnet",
-      "Streck",
-      "UNL BSE Brown-Brandl",
-      "UNL SoC Falkinburg-Daniel",
-      "UNL SoC Liu",
-      "UNL SoC Ramamurthy",
-      "UNMC College of Nursing",
-      "USDA-NRCS",
-      "Werner Enterprises"
+      "UNL BSE Hebets",
+      "Nebraska Medicine"
     ],
     "submission assignments": [
       "Lab Report 4",
@@ -61,9 +87,18 @@
       "Team Performance (Grading Period 4)",
       "Team Performance (Grading Period 5)",
       "Team Performance (Grading Period 6)",
+      "Individual Performance (Grading Period 4)",
+      "Individual Performance (Grading Period 5)",
+      "Individual Performance (Grading Period 6)",
       "Behaviors (Grading Period 4)",
       "Behaviors (Grading Period 5)",
       "Behaviors (Grading Period 6)",
+      "Professionalism and Respect (Grading Period 4)",
+      "Professionalism and Respect (Grading Period 5)",
+      "Professionalism and Respect (Grading Period 6)",
+      "Verbal Communication (Grading Period 4)",
+      "Verbal Communication (Grading Period 5)",
+      "Verbal Communication (Grading Period 6)",
       "Written Communication (Grading Period 4)",
       "Written Communication (Grading Period 5)",
       "Written Communication (Grading Period 6)"
@@ -74,15 +109,22 @@
       "teams": "Entrepreneur",
       "submission assignments": [],
       "floating assignments": [
-        "Entrepreneur Behaviors (Grading Period 4)",
-        "Entrepreneur Behaviors (Grading Period 5)",
-        "Entrepreneur Behaviors (Grading Period 6)"
+        "Entrepreneur Behaviors (Grading Period 1)",
+        "Entrepreneur Behaviors (Grading Period 2)",
+        "Entrepreneur Behaviors (Grading Period 3)"
       ]
     },
     {
-      "teams": "PM Protege",
+      "teams": "Project Manager Protege",
       "submission assignments": [],
-      "floating assignments": []
+      "floating assignments": [
+        "PM Protege Performance (Grading Period 1)",
+        "PM Protege Performance (Grading Period 2)",
+        "PM Protege Performance (Grading Period 3)",
+        "PM Protege Behaviors (Grading Period 1)",
+        "PM Protege Behaviors (Grading Period 2)",
+        "PM Protege Behaviors (Grading Period 3)"
+      ]
     },
     {
       "teams": "Research",
@@ -92,51 +134,22 @@
         "Researcher Behaviors (second grading period of the semester)",
         "Researcher Behaviors (third grading period of the semester)"
       ]
-    },
-    {
-      "teams": "Tech Reviewer",
-      "submission assignments": [],
-      "floating assignments": [
-        "Tech Reviewer Behaviors (first grading period of the semester)",
-        "Tech Reviewer Behaviors (second grading period of the semester)",
-        "Tech Reviewer Behaviors (third grading period of the semester)"
-      ]
     }
   ],
   "individual assignments": [
     {
       "description": "Individual Performance",
       "select students": {
-        "students": [
-          "Matthew Lobmeyer"
-        ],
-        "assignments": [
-          "PM Protege Performance (Grading Period 1)",
-          "PM Protege Performance (Grading Period 2)",
-          "PM Protege Performance (Grading Period 3)",
-          "PM Protege Behaviors (Grading Period 1)",
-          "PM Protege Behaviors (Grading Period 2)",
-          "PM Protege Behaviors (Grading Period 3)"
-        ]
+        "students": [],
+        "assignments": []
       },
-      "everybody else": [
-        "Individual Performance (first grading period of the semester)",
-        "Individual Performance (second grading period of the semester)",
-        "Individual Performance (third grading period of the semester)"
-      ]
+      "everybody else": []
     },
     {
       "description": "PM Protege Behaviors",
       "select students": {
-        "students": [
-          "Sarah Oran",
-          "Han Tran"
-        ],
-        "assignments": [
-          "PM Protege Behaviors (Grading Period 4)",
-          "PM Protege Behaviors (Grading Period 5)",
-          "PM Protege Behaviors (Grading Period 6)"
-        ]
+        "students": [],
+        "assignments": []
       },
       "everybody else": []
     },
@@ -144,21 +157,48 @@
       "description": "Verbal Communication",
       "select students": [],
       "everybody else": [
-        "Verbal Communication (first grading period of the semester)",
-        "Verbal Communication (second grading period of the semester)",
-        "Verbal Communication (third grading period of the semester)",
-        "Verbal Communication (across semester)"
+        "Verbal Communication (leads sponsor meeting)"
       ]
     },
     {
       "description": "Professionalism",
       "select students": [],
       "everybody else": [
-        "Professionalism and Respect (first grading period of the semester)",
-        "Professionalism and Respect (second grading period of the semester)",
-        "Professionalism and Respect (third grading period of the semester)",
         "Engagement and Participation (across semester)"
       ]
     }
+  ],
+  "manually add": [
+    {
+      "teams": "Entrepreneur",
+      "submission assignments": [],
+      "floating assignments": [
+      "Individual Performance (Grading Period 1)",
+      "Individual Performance (Grading Period 2)",
+      "Individual Performance (Grading Period 3)"
+      ]
+    }
+  ],
+  "manually excuse": [
+    {
+      "teams": ["Entrepreneur", "Project Manager Protege", "Research"],
+      "submission assignments": [],
+      "floating assignments": [
+        "Verbal Communication (leads sponsor meeting)"
+      ],
+      "note": "probably could have made these students the 'select students' on 'Verbal Communication'"
+    }
+  ],
+  "manually assign": [
+    "assign 486, 486H, 488, 488H to the ethics quizzes"
+  ],
+  "missing": [
+    "performance for researcher",
+    "professionalism and respect for PM protege",
+    "professionalism and respect for researcher",
+    "communication for researcher",
+    "communication for PM protege",
+    "communication for entrepreneurs",
+    "second year helping out"
   ]
 }
\ No newline at end of file
diff --git a/api/composite_user.py b/api/composite_user.py
index 64505ec226ecd54a865d8177d32c5f36a6536285..c5436d23f02e2ec20c146d4302a2f64e76f744a0 100644
--- a/api/composite_user.py
+++ b/api/composite_user.py
@@ -67,7 +67,10 @@ class CompositeUser:
         if self.canvas_user is None:
             # self.canvas_user = CanvasUser(self.NUID)  # n.b., can retrieve own user but not arbitrary user
             all_students: List[CanvasUser] = CanvasCourse(Course.canvas_course_id).get_students()
-            self.canvas_user = list(filter(lambda s: s.get_username() == self.canvas_username, all_students))[0]
+            try:
+                self.canvas_user = list(filter(lambda s: s.get_username() == self.canvas_username, all_students))[0]
+            except IndexError:
+                print(f'*** WARNING *** Could not locate Canvas user for {self.canvas_username} among the {len(all_students)} students that were retrieved.')
             # this still seems to be a teensy bit flaky
         return self.canvas_user
 
diff --git a/api/gitlab_classes.py b/api/gitlab_classes.py
index 999ab1f7d20a4f81030289239eefce6d16485b16..ab492e333618338e333e9e63ab036b90f5eb3d6e 100644
--- a/api/gitlab_classes.py
+++ b/api/gitlab_classes.py
@@ -4,7 +4,8 @@ from deprecated import deprecated
 from functools import reduce
 from typing import ClassVar, Dict, Iterable, List, Optional, Set, Union
 
-from gitlab import Gitlab, MAINTAINER_ACCESS
+from gitlab import Gitlab#, MAINTAINER_ACCESS
+from gitlab.const import MAINTAINER_ACCESS
 from gitlab.v4.objects import Issue, Project, ProjectCommit, ProjectMilestone, User
 
 from config import Config
diff --git a/initialize_student_tracking.py b/initialize_student_tracking.py
index 99fd87935065ead476808c2701430fdb8fee29f4..bd2a082d3d356e7ca147ec6a8af6ad822fc1a4da 100644
--- a/initialize_student_tracking.py
+++ b/initialize_student_tracking.py
@@ -31,7 +31,7 @@ def extract_gitlab_usernames(student_responses: Dict[CanvasUser, str]) -> Dict[C
         response: str = student_responses[student]
         if response is None:
             response = ''
-        candidate_username: List[str] = response.split()
+        candidate_username: List[str] = response.replace(' ', ' ').strip().split()
         if len(candidate_username) == 1:
             username: str = candidate_username[0]
             if username[0] == '@':
@@ -130,7 +130,8 @@ def create_cloning_script(user_repos: Dict[CompositeUser, Optional[GitlabProject
         repo = user_repos[composite_student]
         if repo is not None:
             repo_url = repo.get_cloning_url()
-            student_name = composite_student.get_canvas_user().get_name().replace(' ', '_')
+            # student_name = composite_student.get_canvas_user().get_name().replace(' ', '_')
+            student_name = composite_student.get_name().replace(' ', '_')
             file.write(f'git clone {repo_url} {student_name}')
             if composite_student.gitlab_email is None:  # breaking encapsulation?
                 file.write('  # may have inadequate permissions')
@@ -141,7 +142,8 @@ def create_cloning_script(user_repos: Dict[CompositeUser, Optional[GitlabProject
         file.write('\n# Students without homework repositories '
                    '(check for misspelled repository names or repositories created but not shared):\n')
     for composite_student in no_repo:
-        student_name = composite_student.get_canvas_user().get_name().replace(' ', '_')
+        #student_name = composite_student.get_canvas_user().get_name().replace(' ', '_')
+        student_name = composite_student.get_name().replace(' ', '_')
         file.write(f'# git clone {composite_student.get_gitlab_user().get_username()}/... {student_name}\n')
     if len(no_username) > 0:
         file.write('\n# Students without valid gitlab usernames (check for repositories shared but username not '
@@ -157,7 +159,9 @@ def create_cloning_script(user_repos: Dict[CompositeUser, Optional[GitlabProject
 
 
 if __name__ == '__main__':
-    course = CanvasCourse(Course.canvas_course_id)
+    canvas_course_id: int = int(input('What is the Canvas course ID? '))
+    # course = CanvasCourse(Course.canvas_course_id)
+    course = CanvasCourse(canvas_course_id)
     print(f'Using course: {course}')
     print('First, select the "setup" assignment to extract student information from.\n')
     assignment_groups = course.get_assignment_groups()