diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 76b215d039868c3e5f79d982b7c32668b8dd90d8..2e1759390cf7e323f4218f2c122c585e553ccf14 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -879,7 +879,6 @@ App.Data.resetOnNGPlus = {
 		Farmer: [],
 		Wardeness: []
 	},
-	tutorGraduate: [],
 
 	weddingPlanned: 0,
 	/** @type {string|Array<{ID:number, trainingRegimen:string}>} */
diff --git a/src/endWeek/reports/schoolroomReport.js b/src/endWeek/reports/schoolroomReport.js
index d5b51cc0edfc29e72703e0dfe089d2f8ca2264cf..d00bb83e034aad0d7073bb36fd95dac65f3f2a94 100644
--- a/src/endWeek/reports/schoolroomReport.js
+++ b/src/endWeek/reports/schoolroomReport.js
@@ -191,7 +191,7 @@ App.EndWeek.schoolroomReport = function() {
 					((slave.skill.entertainment > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.entertainment > 10))) &&
 					((slave.skill.anal > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.anal > 10))) &&
 					((slave.skill.vaginal > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.vaginal > 10)) || (slave.vagina < 0)) &&
-					(tutorForSlave(slave) === null || V.tutorGraduate.includes(slave.ID))) {
+					(!needsTutoring(slave))) {
 			const reassignment = App.UI.DOM.appendNewElement("p", frag, '');
 			const {he, his} = getPronouns(slave);
 			let r = [];
diff --git a/src/endWeek/saTakeClasses.js b/src/endWeek/saTakeClasses.js
index aff9ba89a903b2b24c1d94f33a9c17680a20dc45..49518639d4ed455773b85060c4864b8d70af3164 100644
--- a/src/endWeek/saTakeClasses.js
+++ b/src/endWeek/saTakeClasses.js
@@ -37,7 +37,7 @@ App.SlaveAssignment.takeClasses = (function() {
 			if (slave.accent > 1 && slave.voice !== 0) {
 				speechLessons(slave);
 			}
-			if (tutorForSlave(slave) != null) {
+			if (needsTutoring(slave)) {
 				tutorLessons(slave);
 			}
 			graduation(slave);
@@ -661,8 +661,7 @@ App.SlaveAssignment.takeClasses = (function() {
 						if ((slave.skill.entertainment > 30) || (V.schoolroomUpgradeSkills === 0 && slave.skill.entertainment > 10)) {
 							if ((slave.skill.anal > 30) || (V.schoolroomUpgradeSkills === 0 && slave.skill.anal > 10)) {
 								if ((slave.skill.vaginal > 30) || (V.schoolroomUpgradeSkills === 0 && slave.skill.vaginal > 10) || (slave.vagina < 0)) {
-									if (tutorForSlave(slave) === null || V.tutorGraduate.includes(slave.ID)) {
-										V.tutorGraduate.delete(slave.ID);
+									if (!needsTutoring(slave)) {
 										r += ` ${He} can learn little from further classes, <span class="noteworthy">`;
 										if (V.assignmentRecords[slave.ID]) {
 											let oldJob = V.assignmentRecords[slave.ID];
diff --git a/src/facilities/schoolroom/schoolroomFramework.js b/src/facilities/schoolroom/schoolroomFramework.js
index d27511c7e178d12959a38e67b4a6a575eb2bdb00..dbf8428adbe66bd2a01bb4f824323881117648a8 100644
--- a/src/facilities/schoolroom/schoolroomFramework.js
+++ b/src/facilities/schoolroom/schoolroomFramework.js
@@ -45,7 +45,7 @@ App.Entity.Facilities.SchoolroomStudentJob = class extends App.Entity.Facilities
 			(slave.voice === 0 || slave.accent + this.facility.upgrade("Language") <= 2) &&
 			(slave.skill.oral > maxSkill) && (slave.skill.whoring > maxSkill) && (slave.skill.entertainment > maxSkill) &&
 			(slave.skill.anal > maxSkill) && ((slave.vagina < 0) || (slave.skill.vaginal > maxSkill)) &&
-			((tutorForSlave(slave) === null) || (V.tutorGraduate.includes(slave.ID)))) {
+			(!needsTutoring(slave))) {
 			r.push(`${slave.slaveName} has nothing left to learn.`);
 		}
 
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index eceecbd41bfcd32850eaf714614e3c12b9f4b428..e1ea7a1dbcc2d7b2157725374cdbce03502f2d8c 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -172,10 +172,9 @@ App.UI.SlaveList.render = function() {
 		} else {
 			assignment.innerText = slave.assignment;
 			if (slave.assignment === Job.CLASSES) {
-				for (const role of Object.keys(V.slaveTutor)) {
-					if (V.slaveTutor[role].contains(slave.ID)) {
-						assignment.innerText += ` on being a ${role}`; break;
-					}
+				const role = tutorForSlave(slave);
+				if (role) {
+					assignment.innerText += ` on being a ${role}`;
 				}
 			}
 			if (slave.sentence > 0) {
@@ -184,7 +183,6 @@ App.UI.SlaveList.render = function() {
 		}
 		if (slave.assignment === Job.CLINIC) {
 			let list = [];
-			let i;
 			if (slave.health.condition <= 40) {
 				list.push(`poor health`);
 			}
@@ -207,18 +205,10 @@ App.UI.SlaveList.render = function() {
 				}
 			}
 			if (list.length > 0) {
-				assignment.innerText += " for ";
+				assignment.innerText += ` for ${arrayToSentence(list)}`;
 			} else {
 				assignment.innerText += ", preparing to check out";
 			}
-			for (i = 0; i < list.length; i++) {
-				assignment.innerText += list[i];
-				if (i === (list.length - 2)) {
-					assignment.innerText += " and ";
-				} else if (i < (list.length - 2)) {
-					assignment.innerText += ", ";
-				}
-			}
 		} else if (slave.assignment === Job.SPA) {
 			let list = [];
 			let i;
@@ -235,29 +225,17 @@ App.UI.SlaveList.render = function() {
 					list.push(`improving in health`);
 				}
 				if (list.length > 0) {
-					assignment.innerText += ", ";
+					assignment.innerText += `, ${arrayToSentence(list)}`;
 				} else {
 					assignment.innerText += ", preparing to move out";
 				}
-				for (i = 0; i < list.length; i++) {
-					assignment.innerText += list[i];
-					if (i === (list.length - 2)) {
-						assignment.innerText += " and ";
-					} else if (i < (list.length - 2)) {
-						assignment.innerText += ", ";
-					}
-				}
 			}
 		} else if (slave.assignment === Job.SCHOOL) {
-			for (const role of Object.keys(V.slaveTutor)) {
-				if (V.slaveTutor[role].contains(slave.ID)) {
-					assignment.innerText += ` about being a ${role}`; break;
-				}
-			}
 			let lessons = [];
-			let i;
-			if ((V.schoolroomRemodelBimbo === 1 && slave.intelligenceImplant > -15) || (V.schoolroomRemodelBimbo === 0 && slave.intelligenceImplant < 30)) {
-				lessons.push("general");
+			if (V.schoolroomRemodelBimbo === 1 && slave.intelligenceImplant > -15) {
+				lessons.push("being a dumb bimbo");
+			} else if (V.schoolroomRemodelBimbo === 0 && slave.intelligenceImplant < 30) {
+				lessons.push("general education");
 			}
 			if (!((slave.voice === 0) || (slave.accent <= 1) || ((V.schoolroomUpgradeLanguage === 0) && (slave.accent <= 2)))) {
 				lessons.push("speech");
@@ -277,19 +255,15 @@ App.UI.SlaveList.render = function() {
 			if (!((slave.skill.vaginal > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.vaginal > 10)) || (slave.vagina < 0))) {
 				lessons.push("vaginal");
 			}
+			const role = tutorForSlave(slave);
+			if (role && needsTutoring(slave)) {
+				lessons.push(`being a good ${role}`);
+			}
 			if (lessons.length > 0) {
-				assignment.innerText += ", practicing: ";
+				assignment.innerText += `, practicing ${arrayToSentence(lessons)}`;
 			} else {
 				assignment.innerText += ", studying for finals";
 			}
-			for (i = 0; i < lessons.length; i++) {
-				assignment.innerText += lessons[i];
-				if (i === (lessons.length - 2)) {
-					assignment.innerText += " and ";
-				} else if (i < (lessons.length - 2)) {
-					assignment.innerText += ", ";
-				}
-			}
 		} else if (slave.assignment === Job.SUBORDINATE) {
 			if (slave.subTarget === -1) {
 				assignment.innerText += ", serving as your Stud";
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 1a1026588ab1d33a0fe45da25a729fb175d9b2ee..729fc725525a7c1bf52fca5f02bdcc0a20b84842 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -1466,6 +1466,23 @@ globalThis.tutorForSlave = function(slave) {
 	return null;
 };
 
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {boolean}
+ */
+globalThis.needsTutoring = function(slave) {
+	const tutor = tutorForSlave(slave);
+	if (!tutor) {
+		return false;
+	}
+	const skill = slave.skill[uncapFirstChar(tutor)] || 0;
+	if (skill >= 200) { // if her tutoring is done, make sure it's turned off
+		V.slaveTutor[tutor].delete(slave.ID);
+		return false;
+	}
+	return true;
+};
+
 /**
  * @param {string} skill
  * @returns {number}
@@ -3287,13 +3304,8 @@ globalThis.induceLactation = function(slave, induce = 0) {
 globalThis.slaveSkillIncrease = function(targetSkill, slave, skillIncrease = 1) {
 	let r = "", skillDec;
 	const { He, his, him } = getPronouns(slave);
-	const isleadershipRole = function() {
-		if (['headGirl', 'recruiter', 'bodyguard', 'madam', 'DJ', 'nurse', 'teacher', 'attendant', 'matron', 'stewardess', 'milkmaid', 'farmer', 'wardeness'].includes(targetSkill)) {
-			return true;
-		}
-		return false;
-	};
-	if (isleadershipRole()) {
+	const isleadershipRole = ['headGirl', 'recruiter', 'bodyguard', 'madam', 'DJ', 'nurse', 'teacher', 'attendant', 'matron', 'stewardess', 'milkmaid', 'farmer', 'wardeness'].includes(targetSkill);
+	if (isleadershipRole) {
 		if (slave.skill[targetSkill] <= 20) {
 			if (slave.skill[targetSkill] + skillIncrease > 20) {
 				r = `<span class="green">${He} now has basic skills as a ${capFirstChar(targetSkill)}</span>`;
@@ -3309,11 +3321,9 @@ globalThis.slaveSkillIncrease = function(targetSkill, slave, skillIncrease = 1)
 		} else if (slave.skill[targetSkill] < 200) {
 			if (slave.skill[targetSkill] + skillIncrease >= 200) {
 				r = `<span class="green">${He} now has knowledge on par with those with applicable career experience for a ${capFirstChar(targetSkill)}.</span>`;
-				V.tutorGraduate.push(slave.ID);
 				V.slaveTutor[capFirstChar(targetSkill)].delete(slave.ID);
 			}
 		} else { // failsafe
-			V.tutorGraduate.push(slave.ID);
 			V.slaveTutor[capFirstChar(targetSkill)].delete(slave.ID);
 		}
 	} else {
diff --git a/submodules/sugarcube-2 b/submodules/sugarcube-2
index 8464936f0524c87f5e41960359de37aa5c34040f..e8af6b2f60fa88f5111d1812593e0b0e47b2779f 160000
--- a/submodules/sugarcube-2
+++ b/submodules/sugarcube-2
@@ -1 +1 @@
-Subproject commit 8464936f0524c87f5e41960359de37aa5c34040f
+Subproject commit e8af6b2f60fa88f5111d1812593e0b0e47b2779f