diff --git a/js/003-data/constants.js b/js/003-data/constants.js
index 15b8cbfd7aa82bd7c7dee5260ef15a6530bc7e88..ebf4422548495211df5f9594e1c4a487684c99ea 100644
--- a/js/003-data/constants.js
+++ b/js/003-data/constants.js
@@ -1,4 +1,5 @@
 globalThis.LivingRule = Object.freeze({LUXURIOUS: 'luxurious', NORMAL: 'normal', SPARE: 'spare'});
+globalThis.RestRule = Object.freeze({MANDATORY: 'mandatory', MAX: 'permissive', MID: 'restrictive', MIN: 'cruel', NONE: 'none'});
 globalThis.Job = Object.freeze({
 	// Penthouse Assignments
 	REST: 'rest',
diff --git a/src/endWeek/clinicReport.js b/src/endWeek/clinicReport.js
index d238016c83e466694c904af421fe1764ccf0a9ae..8af1f061c142b8e30a459c18906bbcfbba52d85d 100644
--- a/src/endWeek/clinicReport.js
+++ b/src/endWeek/clinicReport.js
@@ -24,6 +24,9 @@ App.EndWeek.clinicReport = function() {
 			if (S.Nurse.rules.living !== "luxurious") {
 				S.Nurse.rules.living = "luxurious";
 			}
+			if (S.Nurse.rules.rest !== "restrictive") {
+				S.Nurse.rules.rest = "restrictive";
+			}
 
 			S.Nurse.devotion += devBonus;
 			if (S.Nurse.fetishStrength <= 95) {
@@ -212,7 +215,7 @@ App.EndWeek.clinicReport = function() {
 				}
 			}
 
-			if (slaves.length < V.clinic) {
+			if (slaves.length < V.clinic && !slaveResting(S.Nurse)) {
 				const _idlePay = jsRandom(1, 10) + ((V.clinic - slaves.length) * (jsRandom(150, 170) + (idleBonus * 10)));
 				cashX(_idlePay, "clinic", S.Nurse);
 				r.push(`<div class="indent">Since ${he} doesn't have enough patients to occupy all of ${his} time, ${V.clinicName} takes in citizens' slaves on a contract basis and ${he} helps them too, earning <span class="cash inc">${cashFormat(_idlePay)}.</span></div>`);
diff --git a/src/endWeek/healthFunctions.js b/src/endWeek/healthFunctions.js
index 5ab76fdff084364b9ad6d2e36daea4bd875eeefe..9409e11db3f0bab886a50ff7ea53afde3a60dd2c 100644
--- a/src/endWeek/healthFunctions.js
+++ b/src/endWeek/healthFunctions.js
@@ -403,7 +403,12 @@ globalThis.tired = function(slave) {
 		} else if ([Job.HEADGIRL].includes(slave.assignment)) {
 			assignment += 22; // Always busy. Could benefit from a helper...
 		} else if (App.Data.misc.facilityHeads.includes(slave.assignment)) { // Heads are very busy, but always have luxurious conditions, so it balances out, save for the exceptions
-			assignment += 14;
+			if (slaveResting(slave)) {
+				assignment -= 10;
+				V.slaveUsedRest = 1;
+			} else {
+				assignment += 15;
+			}
 		} else if ([Job.ATTENDANT, Job.CONCUBINE].includes(slave.assignment)) { // Cushy head positions
 			assignment += 5;
 		} else if ([Job.RECRUITER].includes(slave.assignment)) {
@@ -706,7 +711,7 @@ globalThis.restEffects = function(slave, exhaustion=0) {
 		if (slave.rules.rest === "mandatory") {
 			return 0.86;
 		} else if (slaveResting(slave)) {
-			if (slave.assignment === window.Job.HOUSE || slave.assignment === window.Job.QUARTER || window.Job.SUBORDINATE) {
+			if (slave.assignment === window.Job.HOUSE || slave.assignment === window.Job.QUARTER || window.Job.SUBORDINATE || window.Job.FARMER || window.Job.STEWARD) {
 				return 0.60;
 			} else {
 				return 0.25;
diff --git a/src/endWeek/schoolroomReport.js b/src/endWeek/schoolroomReport.js
index 9aaa2aac21c9b09ba99d3e3cc6abc2ac32354534..0197ef513015cb5511b55f086c4297ea69343835 100644
--- a/src/endWeek/schoolroomReport.js
+++ b/src/endWeek/schoolroomReport.js
@@ -29,6 +29,9 @@ App.EndWeek.schoolroomReport = function() {
 			if (S.Schoolteacher.rules.living !== "luxurious") {
 				S.Schoolteacher.rules.living = "luxurious";
 			}
+			if (S.Schoolteacher.rules.rest !== "restrictive") {
+				S.Schoolteacher.rules.rest = "restrictive";
+			}
 			if (S.Schoolteacher.fetishStrength <= 95) {
 				if (S.Schoolteacher.fetish !== "dom") {
 					if (fetishChangeChance(S.Schoolteacher) > jsRandom(0, 100)) {
@@ -118,7 +121,7 @@ App.EndWeek.schoolroomReport = function() {
 				}
 			}
 
-			if (slaves.length < V.schoolroom) {
+			if (slaves.length < V.schoolroom && !slaveResting(S.Schoolteacher)) {
 				const _idlePay = jsRandom(1, 10) + ((V.schoolroom - slaves.length) * (jsRandom(150, 170) + (idleBonus * 10)));
 				cashX(_idlePay, "school", S.Schoolteacher);
 				r.push(`<div class="indent">Since ${he} doesn't have enough students to occupy all of ${his} time, ${V.schoolroomName} takes in citizens' slaves on a contract basis and ${he} teaches them too, earning <span class="yellowgreen">${cashFormat(_idlePay)}.</span></div>`);
diff --git a/src/endWeek/servantsQuartersReport.js b/src/endWeek/servantsQuartersReport.js
index c5facef9e5595a5436e317fe474ea238e1e7fedb..f35722e3122c78c1ff7b95258522b1b56e009831 100644
--- a/src/endWeek/servantsQuartersReport.js
+++ b/src/endWeek/servantsQuartersReport.js
@@ -45,13 +45,16 @@ App.EndWeek.servantsQuartersReport = function() {
 			if (S.Stewardess.rules.living !== "luxurious") {
 				S.Stewardess.rules.living = "luxurious";
 			}
+			if (S.Stewardess.rules.rest !== "restrictive") {
+				S.Stewardess.rules.rest = "restrictive";
+			}
 
 			const {He, he, His, his, him, wife} = getPronouns(S.Stewardess);
 			r.push(`${SlaveFullName(S.Stewardess)} is serving as your Stewardess.`);
 			if (S.Stewardess.relationship === -3 && S.Stewardess.devotion > 50) {
 				r.push(`${He} does ${his} best to be your perfect lovely house${wife}.`);
 			}
-			if (V.stewardessImpregnates === 1 && canPenetrate(S.Stewardess) && S.Stewardess.pubertyXY === 1) {
+			if (V.stewardessImpregnates === 1 && canPenetrate(S.Stewardess) && S.Stewardess.pubertyXY === 1 && !slaveResting(S.Stewardess)) {
 				for (const slave of slaves) {
 					if (canImpreg(slave, S.Stewardess)) { // FIXME: assumes vaginal pregnancy without check
 						seX(S.Stewardess, "penetrative", slave, "vaginal", 10);
@@ -110,6 +113,7 @@ App.EndWeek.servantsQuartersReport = function() {
 				stewardessBonus += S.Stewardess.intelligence + S.Stewardess.intelligenceImplant;
 				r.push(`${He}'s smart enough that ${he} misses very little.`);
 			}
+			stewardessBonus *= restEffects(S.Stewardess);
 			const bonusToggle = S.Stewardess.energy > 95 || (S.Stewardess.fetishKnown === 1 && S.Stewardess.fetish === "dom");
 			for (const slave of slaves) {
 				const {he2, him2, his2} = getPronouns(slave).appendSuffix('2');
diff --git a/src/facilities/farmyard/reports/farmyardReport.js b/src/facilities/farmyard/reports/farmyardReport.js
index 23eafbcfb12232604185ec455ef4e7a9527673ab..1e90b377303d595882f9956a1cf57c39fbf25b31 100644
--- a/src/facilities/farmyard/reports/farmyardReport.js
+++ b/src/facilities/farmyard/reports/farmyardReport.js
@@ -80,6 +80,8 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 			FarmerCashBonus += 0.05;
 		}
 
+		FarmerCashBonus *= restEffects(Farmer);
+
 		return FarmerCashBonus;
 	}
 
@@ -94,6 +96,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		r.push(farmerSkill(Farmer));
 		r.push(farmerAgeSkill(Farmer));
 		r.push(farmerExperience(Farmer));
+		r.push(farmerTiredness(Farmer));
 		r.push(farmerIntelligence(Farmer));
 		r.push(farmerSmell(Farmer));
 		r.push(farmerRelationshipSlaves(Farmer));
@@ -166,6 +169,14 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		}
 	}
 
+	function farmerTiredness(slave) {
+		const {he, his, him, He} = getPronouns(slave);
+
+		if (slaveResting(slave.career)) {
+			return `To avoid exhaustion, ${he} has to take breaks to maintain ${his} strength, limiting how much ${he} can work.`;
+		}
+	}
+
 	function farmerRelationshipSlaves(Farmer) {
 		const {he, his, He} = getPronouns(Farmer);
 
diff --git a/src/js/assignJS.js b/src/js/assignJS.js
index 6914b5dae7165565286473d39591a22c8f839f72..66543a13f8c97c830b3084bec3f617b10613e31e 100644
--- a/src/js/assignJS.js
+++ b/src/js/assignJS.js
@@ -300,54 +300,63 @@ globalThis.assignJob = function(slave, job) {
 			uniqueJob("Matron");
 			slave.assignment = Job.MATRON;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.DJ.toLowerCase():
 			uniqueJob("dj");
 			slave.assignment = Job.DJ;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.MADAM.toLowerCase():
 			uniqueJob("Madam");
 			slave.assignment = Job.MADAM;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.MILKMAID.toLowerCase():
 			uniqueJob("Milkmaid");
 			slave.assignment = Job.MILKMAID;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.FARMER.toLowerCase():
 			uniqueJob("Farmer");
 			slave.assignment = Job.FARMER;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.NURSE.toLowerCase():
 			uniqueJob("Nurse");
 			slave.assignment = Job.NURSE;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.TEACHER.toLowerCase():
 			uniqueJob("Schoolteacher");
 			slave.assignment = Job.TEACHER;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.STEWARD.toLowerCase():
 			uniqueJob("Stewardess");
 			slave.assignment = Job.STEWARD;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.WARDEN.toLowerCase():
 			uniqueJob("Wardeness");
 			slave.assignment = Job.WARDEN;
 			slave.rules.living = LivingRule.LUXURIOUS;
+			slave.rules.rest = RestRule.MID;
 			break;
 
 		case Job.RECRUITER:
diff --git a/src/uncategorized/brothelReport.tw b/src/uncategorized/brothelReport.tw
index c2a0c23ea064733ebc92963879205cfa72ea36a9..b258bd5a46e1274fe74b2a1d3f26d4eeb75dd88a 100644
--- a/src/uncategorized/brothelReport.tw
+++ b/src/uncategorized/brothelReport.tw
@@ -30,6 +30,9 @@
 	<<if _S.Madam.rules.living != "luxurious">>
 		<<set _S.Madam.rules.living = "luxurious">>
 	<</if>>
+	<<if _S.Madam.rules.rest != "restrictive">>
+		<<set _S.Madam.rules.living = "restrictive">>
+	<</if>>
 	<<if _S.Madam.fetishStrength <= 95>>
 		<<if _S.Madam.fetish != "dom">>
 			<<if fetishChangeChance(_S.Madam) > random(0,100)>>
@@ -151,7 +154,7 @@
 		<</if>>
 	<</for>>
 
-	<<if (_DL+$brothelSlavesGettingHelp < 10) && $MadamNoSex != 1>>
+	<<if (_DL+$brothelSlavesGettingHelp < 10) && $MadamNoSex != 1 && !slaveResting(_S.Madam)>>
 		<<setLocalPronouns _S.Madam>>
 		<<set _oldCash = $cash>>
 		<<if $showEWD != 0>>
diff --git a/src/uncategorized/cellblockReport.tw b/src/uncategorized/cellblockReport.tw
index 199ad14d42b85fd4bb7fb173fd9fbab06260a4e7..57feb429d1df09123af30ed83936ed01c44610eb 100644
--- a/src/uncategorized/cellblockReport.tw
+++ b/src/uncategorized/cellblockReport.tw
@@ -31,6 +31,9 @@
 	<<if (_S.Wardeness.rules.living != "luxurious")>>
 		<<set _S.Wardeness.rules.living = "luxurious">>
 	<</if>>
+	<<if _S.Wardeness.rules.rest != "restrictive">>
+		<<set _S.Wardeness.rules.living = "restrictive">>
+	<</if>>
 	<<if _S.Wardeness.fetishStrength <= 95>>
 		<<if _S.Wardeness.fetish != "sadist">>
 			<<if fetishChangeChance(_S.Wardeness) > random(0,100)>>
@@ -108,7 +111,7 @@
 			<<set _slave.devotion++, _slave.trust-->>
 		<</if>>
 	<</for>>
-	<<if (_DL < $cellblock)>>
+	<<if (_DL < $cellblock && !slaveResting(_S.Wardeness))>>
 		<<set _seed = random(1,10)+(($cellblock-_DL)*(random(150,170)+(_idleBonus*10)))>>
 		<<run cashX(_seed, "cellblock", _S.Wardeness)>>
 		<br>&nbsp;&nbsp;&nbsp;&nbsp;Since $he doesn't have enough prisoners to manage to keep $him busy, $he works on citizens' slaves, earning @@.yellowgreen;<<print cashFormat(_seed)>>.@@
diff --git a/src/uncategorized/clubReport.tw b/src/uncategorized/clubReport.tw
index e63e365eaa5f9bb3f3aabee9e31bfea9a1bd8afa..69eec9d13f0daa5ae35a71d09a86248453187634 100644
--- a/src/uncategorized/clubReport.tw
+++ b/src/uncategorized/clubReport.tw
@@ -40,6 +40,9 @@
 	<<if _S.DJ.rules.living != "luxurious">>
 		<<set _S.DJ.rules.living = "luxurious">>
 	<</if>>
+	<<if _S.DJ.rules.rest != "restrictive">>
+		<<set _S.DJ.rules.living = "restrictive">>
+	<</if>>
 	/% Make sure we have registered living expenses as for any other slave %/
 	<<run getSlaveStatisticData(_S.DJ, $facility.club)>>
 	<<setLocalPronouns _S.DJ>>
@@ -82,7 +85,7 @@
 	<<else>>
 		<<set _S.DJ.skill.DJ += random(1,Math.ceil((_S.DJ.intelligence+_S.DJ.intelligenceImplant)/15) + 8)>>
 	<</if>>
-	<<if (_DL + $clubSlavesGettingHelp < 10) && $DJnoSex != 1>>
+	<<if (_DL + $clubSlavesGettingHelp < 10) && $DJnoSex != 1 && !slaveResting(_S.DJ)>>
 		<<if ($legendaryEntertainerID == 0) && (_S.DJ.prestige == 0) && (_S.DJ.skill.entertainment >= 100) && (_S.DJ.devotion > 50)>>
 			<<set $legendaryEntertainerID = _S.DJ.ID>>
 		<</if>>
diff --git a/src/uncategorized/dairyReport.tw b/src/uncategorized/dairyReport.tw
index 79cd8a60eb7d7d2e9a42d4d634ecc4a8463830d1..6015cec9bd8f42c1bb0d8d3c39971f37fcca2254 100644
--- a/src/uncategorized/dairyReport.tw
+++ b/src/uncategorized/dairyReport.tw
@@ -26,7 +26,7 @@
 			<<if (_slave.bellyPreg >= 500 && $dairyPregSetting > 0)>>
 				<<set _breeders++>>
 			<</if>>
-			<<if ($milkmaidImpregnates == 1) && (canPenetrate(_S.Milkmaid)) && _S.Milkmaid.pubertyXY == 1>>
+			<<if ($milkmaidImpregnates == 1) && (canPenetrate(_S.Milkmaid)) && _S.Milkmaid.pubertyXY == 1 && !slaveResting(_S.Milkmaid)>>
 				<<if (canImpreg(_slave, _S.Milkmaid))>>
 					<<set _slave.preg = 1, _slave.pregSource = $MilkmaidID, _slave.pregKnown = 1, _slave.pregWeek = 1, _milkmaidImpregnated++>>
 					<<if _slave.mpreg == 1>>
@@ -127,6 +127,9 @@
 	<<if _S.Milkmaid.rules.living != "luxurious">>
 		<<set _S.Milkmaid.rules.living = "luxurious">>
 	<</if>>
+	<<if _S.Milkmaid.rules.rest != "restrictive">>
+		<<set _S.Milkmaid.rules.living = "restrictive">>
+	<</if>>
 	<<if _S.Milkmaid.fetishStrength <= 95>>
 		<<if _milkers >= _cummers && _milkers >= _breeders>>
 			<<if _S.Milkmaid.fetish != "boobs">>
diff --git a/src/uncategorized/saRules.tw b/src/uncategorized/saRules.tw
index 0ffdd1c091e88ac316e1e9079cccfc66832dc661..f9976fbeccefea50ee87f716416029d4f85dda36 100644
--- a/src/uncategorized/saRules.tw
+++ b/src/uncategorized/saRules.tw
@@ -115,6 +115,11 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 			It also helps to offset the tiring nature of $his position.
 
+			<<if $slaveUsedRest>>
+				$He is permitted to take short breaks throughout the week to help manage $his building exhaustion, though it does restrict $his non-essential activities.
+				<<unset $slaveUsedRest>>
+			<</if>>
+
 			<<if ($universalRulesConsent == 0)>>
 				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
@@ -730,6 +735,11 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 			It helps offset the tiring nature of $his position and gives $him a place to center $himself at the end of the day.
 
+			<<if $slaveUsedRest>>
+				$He is permitted to take short breaks throughout the week to help manage $his building exhaustion, though it does restrict $his non-essential activities.
+				<<unset $slaveUsedRest>>
+			<</if>>
+
 			<<if ($universalRulesConsent == 0)>>
 				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
@@ -1314,6 +1324,11 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 			Having a place to call $his own each night helps keep the stress of $his duties from catching up with $him.
 
+			<<if $slaveUsedRest>>
+				$He is permitted to take short breaks throughout the week to help manage $his building exhaustion, though it does restrict $his non-essential activities.
+				<<unset $slaveUsedRest>>
+			<</if>>
+
 			<<if ($universalRulesConsent == 0)>>
 				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
@@ -1777,6 +1792,11 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 			It also helps to offset the tiring nature of $his position.
 
+			<<if $slaveUsedRest>>
+				$He is permitted to take short breaks throughout the week to help manage $his building exhaustion, though it does restrict $his non-essential activities.
+				<<unset $slaveUsedRest>>
+			<</if>>
+
 			<<if ($slaves[$i].attrKnown == 0)>>
 				<<if ($week-$slaves[$i].weekAcquired > 4) && $slaves[$i].energy > 20>>
 					<<set $slaves[$i].attrKnown = 1>>
@@ -3210,6 +3230,11 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 			It also helps to offset the tiring nature of $his position.
 
+			<<if $slaveUsedRest>>
+				$He is permitted to take short breaks throughout the week to help manage $his building exhaustion, though it does restrict $his non-essential activities.
+				<<unset $slaveUsedRest>>
+			<</if>>
+
 			<<if ($universalRulesConsent == 0)>>
 				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
@@ -3755,6 +3780,11 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 			It also helps to offset the tiring nature of $his position.
 
+			<<if $slaveUsedRest>>
+				$He is permitted to take short breaks throughout the week to help manage $his building exhaustion, though it does restrict $his non-essential activities.
+				<<unset $slaveUsedRest>>
+			<</if>>
+
 			<<if ($universalRulesConsent == 0)>>
 				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
@@ -4358,6 +4388,11 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 			It also helps to offset the tiring nature of $his position.
 
+			<<if $slaveUsedRest>>
+				$He is permitted to take short breaks throughout the week to help manage $his building exhaustion, though it does restrict $his non-essential activities.
+				<<unset $slaveUsedRest>>
+			<</if>>
+
 			<<if ($universalRulesConsent == 0)>>
 				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>