diff --git a/CHANGELOG.md b/CHANGELOG.md
index 09ded861e562ac8a7fb1cae42fa6ac8c4cd129d2..94b3ea3a61fa12a94a72f85139a6b3c48c3da322 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 ## Unreleased
 
+* added player mobility
+* added porn studio for better porn control
 * added new slimness enthusiast food policy
+* overhauled the neighbor FS selection process
+* locate slave improvements
+* removed dTree in favor of lodash and d3
 * fixes
 
 ## 0.10.7.1-4.0.0-alpha.19 - 2022-08-27
diff --git a/src/endWeek/healthFunctions.js b/src/endWeek/healthFunctions.js
index 6937be2433f7bcc9b0ddf9fd4f6c137391171104..0340a53f8fbcacb2546a49e128306f105d12b311 100644
--- a/src/endWeek/healthFunctions.js
+++ b/src/endWeek/healthFunctions.js
@@ -429,12 +429,14 @@ globalThis.endWeekHealthDamage = function(slave) {
 
 		// recovering and converting short term damage to long term
 		if (H.shortDamage > 0) {
-			// short term damage reduces at a constant rate
-			// 40+ long term damage begins to harm short term recovery
-			// at 360+, you're ability to heal properly is completely crippled
+			// short term damage begins converting to long term damage at 20+
+			shortToLong += Math.trunc(H.shortDamage * 0.1);
+			H.longDamage += shortToLong;
+			// short term damage reduces by half each week normally
+			// 100+ long term damage begins to harm short term recovery
+			// at 400+, you're ability to heal properly is completely crippled
 			// but, keep in mind, that short and long damage do not directly influence health, sans illness
-			shortRecovery += 10 - Math.trunc(H.longDamage * 0.025);
-			shortRecovery = Math.max(shortRecovery, 1);
+			shortRecovery = Math.max(Math.trunc(H.shortDamage * (0.5 + Math.min(0.4, H.longDamage * 0.001))), 1);
 			if (V.personalAttention.task === PersonalAttention.RELAX) {
 				shortRecovery += 5;
 			}
@@ -442,9 +444,6 @@ globalThis.endWeekHealthDamage = function(slave) {
 				shortRecovery += 5;
 			}
 			H.shortDamage = Math.max(H.shortDamage - shortRecovery, 0);
-			// short term damage begins converting to long term damage at 20+
-			shortToLong += Math.trunc(H.shortDamage * 0.1);
-			H.longDamage += shortToLong;
 		}
 
 		// Reducing longDamage for easier difficulties
diff --git a/src/endWeek/nextWeek/nextWeek.js b/src/endWeek/nextWeek/nextWeek.js
index 0c8cfbe00670fdb56e719a23f299d209088df594..25f4f0054cad5f3c55747ad1db70b234de181e2b 100644
--- a/src/endWeek/nextWeek/nextWeek.js
+++ b/src/endWeek/nextWeek/nextWeek.js
@@ -36,6 +36,9 @@ App.EndWeek.nextWeek = function() {
 			}
 		}
 	}
+	if (V.PC.majorInjury > 0) {
+		V.PC.majorInjury--;
+	}
 	if (V.PC.induceLactation > 0) {
 		V.PC.induceLactation--;
 	}
diff --git a/src/endWeek/player/prLongTermPhysicalEffects.js b/src/endWeek/player/prLongTermPhysicalEffects.js
index 791e419b216c5308fbfbd2a877616116db0b6502..8fd47fcf34a80cd7a79711ad7800ae30066a0708 100644
--- a/src/endWeek/player/prLongTermPhysicalEffects.js
+++ b/src/endWeek/player/prLongTermPhysicalEffects.js
@@ -32,7 +32,7 @@ App.EndWeek.Player.longTermPhysicalEffects = function(PC = V.PC) {
 	lactationEffects();
 	boobsEffects(); // Moved up from middle of the mobility and oversized asset set of text.
 	bellyEffects(); // Moved up from middle of the mobility and oversized asset set of text.
-	// player mobility function goes here.
+	r.push(App.EndWeek.Player.mobility());
 	if (PC.diet !== "medicinal") {
 		healthBlips();
 	}
diff --git a/src/events/intro/acquisition.js b/src/events/intro/acquisition.js
index 663136ce1e188aa902a3c73799d283b83b4fbdaa..dcc4120c8e31f41109441e2bbd35fcd979a2bd4c 100644
--- a/src/events/intro/acquisition.js
+++ b/src/events/intro/acquisition.js
@@ -352,7 +352,6 @@ App.Intro.acquisition = function() {
 				}
 			}
 			if (V.PC.preg > 0) {
-				V.PC.pregWeek = V.PC.preg;
 				if (V.PC.pregType !== 8) {
 					V.PC.pregType = 1;
 				} else {
@@ -367,8 +366,8 @@ App.Intro.acquisition = function() {
 					V.PC.pregSource = -5;
 				}
 				V.PC.pregKnown = 1;
-				V.PC.belly = getPregBellySize(V.PC);
-				WombImpregnate(V.PC, V.PC.pregType, V.PC.pregSource, V.PC.preg);
+				WombForceFatherID(V.PC, V.PC.pregSource);
+				WombUpdatePregVars(V.PC);
 			}
 		} else {
 			V.PC.trueVirgin = 1;
diff --git a/src/player/desc/pLongBoobs.js b/src/player/desc/pLongBoobs.js
index 306acbc88cbf5fec1b1c69ee61673ab2df50730f..43a3b5f361dd149203ec8defa009131f1d025b40 100644
--- a/src/player/desc/pLongBoobs.js
+++ b/src/player/desc/pLongBoobs.js
@@ -196,7 +196,7 @@ App.Desc.Player.boobs = function(PC = V.PC) {
 					break;
 				case "partially inverted":
 				case "inverted":
-					r.push(`Your nipples are stiffly erect and ${areolae()}. They'd be inverted if you weren't so horny right now.`);
+					r.push(`Your nipples are stiffly erect and ${areolae()} They'd be inverted if you weren't so horny right now.`);
 					break;
 				case "huge":
 					if (PC.boobs - PC.boobsImplant > 7500) {
@@ -587,6 +587,11 @@ App.Desc.Player.boobs = function(PC = V.PC) {
 	} else {
 		r.push(`you have nothing in the breast department. You're <span class="orange">completely flat.</span>`);
 	}
+	// temp
+	if (PC.boobs >= 1600) {
+		r.push(boobShape());
+		r.push(boobVolume());
+	}
 	r.push(
 		boobFreckles(),
 		nipples()