diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts
index c84b969e99a488e11a19102d6c0a514779b03710..b058b6029c545e2353410dc39b8e24b1f7f418e6 100644
--- a/devTools/types/FC/human.d.ts
+++ b/devTools/types/FC/human.d.ts
@@ -2,7 +2,9 @@ import {DeepPartial} from "ts-essentials";
 declare global {
 	export namespace FC {
 		export type SlaveState = InstanceType<typeof App.Entity.SlaveState>;
+		export type TankSlaveState = InstanceType<typeof App.Entity.TankSlaveState>;
 		export type PlayerState = InstanceType<typeof App.Entity.PlayerState>;
+		export type HumanState = InstanceType<typeof App.Entity.HumanState> | FC.PlayerState | FC.SlaveState | FC.TankSlaveState;
 		export type AnimalState = InstanceType<typeof App.Entity.Animal>;
 
 		export type DeepPartialSlaveState = DeepPartial<SlaveState>;
@@ -759,8 +761,6 @@ declare global {
 			sizeType: number;
 		}
 
-		type HumanState = SlaveState | PlayerState;
-
 		type ImageFormat = "png"|"jpg"|"gif"|"webp"|"webm"|"mp4";
 		export interface CustomImage {
 			filename?: string;
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 8028ff2e30c021f30f02e7d5f8a03567242572f5..c7c09a9c67b3636d94ca46ead05b1ff1a8395d12 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -715,7 +715,7 @@ App.Data.resetOnNGPlus = {
 	incubator: {
 		// Everything in here is overwritten by App.Facilities.Incubator.init()
 		capacity: 0,
-		/** @type {App.Entity.SlaveState[]} */
+		/** @type {FC.TankSlaveState[]} */
 		tanks: [],
 		maleSetting: {
 			imprint: "trust",
diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index df1ed8ce8837755eba0d51b4ab4201c56c6bca33..f092da241d808f5b0f82e813d8be44423bd274a0 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -510,7 +510,7 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 		if (typeof slave.origRace !== "string") {
 			slave.origRace = slave.race;
 		}
-		if (V.releaseID < 1243 && "override_Race" in slave) {
+		if ("override_Race" in slave) {
 			// @ts-expect-error
 			slave.overrideRace = slave.override_Race;
 			delete slave.override_Race;
@@ -524,7 +524,7 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 		if (typeof slave.minorInjury !== "string") {
 			slave.minorInjury = 0;
 		}
-		if (V.releaseID < 1243 && "override_Skin" in slave) {
+		if ("override_Skin" in slave) {
 			// @ts-expect-error
 			slave.overrideSkin = slave.override_Skin;
 			delete slave.override_Skin;
@@ -556,7 +556,7 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 		if (slave.lips !== 0) {
 			slave.lips = Math.clamp(+slave.lips, 0, 100) || 15;
 		}
-		if (V.releaseID < 1243 && "override_Eye_Color" in slave) {
+		if ("override_Eye_Color" in slave) {
 			// @ts-expect-error
 			slave.overrideEyeColor = slave.override_Eye_Color;
 			delete slave.override_Eye_Color;
@@ -602,27 +602,25 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 		if (typeof slave.eyebrowFullness !== "string") {
 			slave.eyebrowFullness = "natural";
 		}
-		if (V.releaseID < 1243) {
-			if ("override_H_Color" in slave) {
-				// @ts-expect-error
-				slave.overrideHColor = slave.override_H_Color;
-				delete slave.override_H_Color;
-			}
-			if ("override_Pubic_H_Color" in slave) {
-				// @ts-expect-error
-				slave.overridePubicHColor = slave.override_Pubic_H_Color;
-				delete slave.override_Pubic_H_Color;
-			}
-			if ("override_Arm_H_Color" in slave) {
-				// @ts-expect-error
-				slave.overrideArmHColor = slave.override_Arm_H_Color;
-				delete slave.override_Arm_H_Color;
-			}
-			if ("override_Brow_H_Color" in slave) {
-				// @ts-expect-error
-				slave.overrideBrowHColor = slave.override_Brow_H_Color;
-				delete slave.override_Brow_H_Color;
-			}
+		if ("override_H_Color" in slave) {
+			// @ts-expect-error
+			slave.overrideHColor = slave.override_H_Color;
+			delete slave.override_H_Color;
+		}
+		if ("override_Pubic_H_Color" in slave) {
+			// @ts-expect-error
+			slave.overridePubicHColor = slave.override_Pubic_H_Color;
+			delete slave.override_Pubic_H_Color;
+		}
+		if ("override_Arm_H_Color" in slave) {
+			// @ts-expect-error
+			slave.overrideArmHColor = slave.override_Arm_H_Color;
+			delete slave.override_Arm_H_Color;
+		}
+		if ("override_Brow_H_Color" in slave) {
+			// @ts-expect-error
+			slave.overrideBrowHColor = slave.override_Brow_H_Color;
+			delete slave.override_Brow_H_Color;
 		}
 	}
 
diff --git a/src/endWeek/reports/incubatorReport.js b/src/endWeek/reports/incubatorReport.js
index 163e363524b74e4df1b1105b9fd2e75a46e83074..5b5caafdb814501d64e3dc29cd465f7730157bc9 100644
--- a/src/endWeek/reports/incubatorReport.js
+++ b/src/endWeek/reports/incubatorReport.js
@@ -28,11 +28,11 @@ App.EndWeek.incubatorReport = function() {
 		if (tank.incubatorSettings.growTime > 0) {
 			tank.incubatorSettings.growTime -= V.incubator.upgrade.speed;
 			r.push(`<span class="pink">${tank.slaveName}'s</span> growth is currently being accelerated. ${He}`);
-			if (Math.round(tank.incubatorSettings.growTime/V.incubator.upgrade.speed) <= 0) {
+			if (Math.ceil(tank.incubatorSettings.growTime/V.incubator.upgrade.speed) <= 0) {
 				r.push(`is <span class="lime">ready for release.</span> ${He} will be ejected from ${his} tank upon your approach.`);
 				V.incubator.readySlaves = 1;
 			} else {
-				r.push(`will be ready for release in about ${Math.round(tank.incubatorSettings.growTime/V.incubator.upgrade.speed)} weeks.`);
+				r.push(`will be ready for release in about ${Math.ceil(tank.incubatorSettings.growTime/V.incubator.upgrade.speed)} weeks.`);
 			}
 		} else {
 			r.push(`<span class="pink">${tank.slaveName}</span> is <span class="lime">ready for release.</span> ${He} will be ejected from ${his} tank upon your approach.`);
diff --git a/src/facilities/incubator/incubatorUtils.js b/src/facilities/incubator/incubatorUtils.js
index ea4cb934abc264e4076bf5f21d1f82993d964bf8..9ad28632d8a277e4de4cb854e029b62f92643e8a 100644
--- a/src/facilities/incubator/incubatorUtils.js
+++ b/src/facilities/incubator/incubatorUtils.js
@@ -1,38 +1,19 @@
 /**
  * Sends a child to the Incubator if it has room
  * @param {App.Entity.SlaveState} child
+ * @param {any} settingsOverride // TODO: documentation and type hinting
  */
 App.Facilities.Incubator.newChild = function(child, settingsOverride = null) {
-	let fullAdapt;
-	const setting = settingsOverride !== null ? settingsOverride : (child.genes === "XX" ? V.incubator.femaleSetting : V.incubator.maleSetting);
-
-	if (setting.pregAdaptationPower === 1) {
-		fullAdapt = 45000 / 2000;	// 22.5
-	} else if (setting.pregAdaptationPower === 2) {
-		fullAdapt = 100000 / 2000;	// 50
-	} else if (setting.pregAdaptationPower === 3) {
-		fullAdapt = 150000 / 2000;	// 75
-	} else {
-		fullAdapt = 15000 / 2000;	// 7.5
-	}
-
-	V.incubator.tanks.push(child);
-	child.incubatorSettings = {
-		imprint: setting.imprint,
-		weight: setting.weight,
-		muscles: setting.muscles,
-		growthStims: setting.growthStims,
-		reproduction: setting.reproduction,
-		growTime: Math.trunc(setting.targetAge * 52),
-		pregAdaptation: setting.pregAdaptation,
-		pregAdaptationPower: setting.pregAdaptationPower,
-		pregAdaptationInWeek: Math.max(((fullAdapt - child.pregAdaptation) / Math.trunc(setting.targetAge * 52)), 0)
-	};
+	V.incubator.tanks.push(App.Entity.TankSlaveState.toTank(child, settingsOverride));
 };
 
+/**
+ * @param {"base"|"install"} state
+ */
 App.Facilities.Incubator.init = function(state) {
 	if (state === 'base') {
-		return V.incubator = {capacity: 0, tanks: []};
+		// @ts-ignore
+		V.incubator = {capacity: 0, tanks: []};
 	}
 
 	V.incubator = {
diff --git a/src/facilities/penthouse/managePenthouse.js b/src/facilities/penthouse/managePenthouse.js
index f5d1c06f5c61d7fd8c3c7e25a639962dfdc3aae2..6dc68236dc72f8c9910f9ed5e45ae7a1a83200a9 100644
--- a/src/facilities/penthouse/managePenthouse.js
+++ b/src/facilities/penthouse/managePenthouse.js
@@ -136,7 +136,7 @@ App.UI.managePenthouse = function() {
 			if (V.arcologyUpgrade.grid === 1) {
 				if (V.incubator.capacity === 0) {
 					App.UI.DOM.appendNewElement("div", el, makeLink("Install an incubation chamber to rapidly age children", () => {
-						App.Facilities.Incubator.init('full');
+						App.Facilities.Incubator.init('install');
 					}));
 				} else {
 					App.UI.DOM.appendNewElement("div", el, `The penthouse has a specialized facility dedicated to rapidly aging children.`);
diff --git a/src/js/states/PlayerState.js b/src/js/states/PlayerState.js
index bfb942d71431bb729321b4a37ae817e008e2715e..d89db0805899cc74bee328a440cb1e4b90450bb5 100644
--- a/src/js/states/PlayerState.js
+++ b/src/js/states/PlayerState.js
@@ -114,7 +114,7 @@ App.Entity.PlayerSkillsState = class PlayerSkillsState extends App.Entity.HumanS
  * Properties shared between the PC and slaves should be defined in `App.Entity.HumanState`.
  * @see App.Entity.HumanState
  */
-App.Entity.PlayerState = class PlayerState extends App.Entity.HumanState {
+App.Entity.PlayerState = class extends App.Entity.HumanState {
 	constructor() {
 		super();
 		// // // // // // properties unique to the player \\ \\ \\ \\ \\ \\
diff --git a/src/js/states/SlaveState.js b/src/js/states/SlaveState.js
index 12fd23a2fe1f60cde4ae74c2db3d738af293b030..3cae4a51e3c0120ae3a018a9c0f379d040974051 100644
--- a/src/js/states/SlaveState.js
+++ b/src/js/states/SlaveState.js
@@ -185,7 +185,7 @@ App.Entity.SlaveSkillsState = class SlaveSkillsState extends App.Entity.HumanSki
  * Properties shared between the PC and slaves should be defined in `App.Entity.HumanState`.
  * @see App.Entity.HumanState
  */
-App.Entity.SlaveState = class SlaveState extends App.Entity.HumanState {
+App.Entity.SlaveState = class extends App.Entity.HumanState {
 	constructor() {
 		super();
 		/** game week slave was acquired.
diff --git a/src/js/states/TankSlaveState.js b/src/js/states/TankSlaveState.js
new file mode 100644
index 0000000000000000000000000000000000000000..188c796b5c5182477d7867fe5d631aca778e5fbf
--- /dev/null
+++ b/src/js/states/TankSlaveState.js
@@ -0,0 +1,59 @@
+App.Entity.incubatorSettings = class {
+	constructor(child, settingsOverride = null) {
+		let fullAdapt;
+		const setting = settingsOverride !== null ? settingsOverride : (child.genes === "XX" ? V.incubator.femaleSetting : V.incubator.maleSetting);
+
+		if (setting.pregAdaptationPower === 1) {
+			fullAdapt = 45000 / 2000;	// 22.5
+		} else if (setting.pregAdaptationPower === 2) {
+			fullAdapt = 100000 / 2000;	// 50
+		} else if (setting.pregAdaptationPower === 3) {
+			fullAdapt = 150000 / 2000;	// 75
+		} else {
+			fullAdapt = 15000 / 2000;	// 7.5
+		}
+		this.imprint = setting.imprint;
+		this.weight = setting.weight;
+		this.muscles = setting.muscles;
+		this.growthStims = setting.growthStims;
+		this.reproduction = setting.reproduction;
+		this.growTime = Math.trunc(setting.targetAge * 52);
+		this.pregAdaptation = setting.pregAdaptation;
+		this.pregAdaptationPower = setting.pregAdaptationPower;
+		this.pregAdaptationInWeek = Math.max(((fullAdapt - child.pregAdaptation) / Math.trunc(setting.targetAge * 52)), 0);
+	}
+};
+
+App.Entity.TankSlaveState = class extends App.Entity.SlaveState {
+	constructor() {
+		/** @type {App.Entity.incubatorSettings} */
+		super();
+		// @ts-ignore
+
+		this.incubatorSettings = new App.Entity.incubatorSettings(this);
+		return this;
+	}
+
+	/**
+	 * Converts the given SlaveState object into a TankSlaveState
+	 * @param {FC.SlaveState} child
+	 * @param {any} settingsOverride // TODO: documentation and type hinting
+	 * @returns {FC.TankSlaveState}
+	 */
+	static toTank(child, settingsOverride = null) {
+		// @ts-ignore
+		child.incubatorSettings = new App.Entity.incubatorSettings(child, settingsOverride);
+		// @ts-ignore
+		return child;
+	}
+
+	/**
+	 * Converts the given TankSlaveState object into a SlaveState, removing `incubatorSettings`
+	 * @param {FC.TankSlaveState} tankSlave
+	 * @returns {FC.SlaveState}
+	 */
+	static fromTank(tankSlave) {
+		delete tankSlave.incubatorSettings;
+		return tankSlave;
+	}
+};
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 743d4fb10cab3b7fc0b6642f58c1e381d0c15849..7da040e5dfab67294b1a4affa4ecf33f3f87d5a9 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -1394,8 +1394,7 @@ globalThis.deflate = function(slave) {
 
 /**
  * colors skin, eyes and hair based on genetic Color.
- * Takes .override_*_Color into account.
- *
+ * Takes .override*Color and .overrideSkin into account.
  * @param {App.Entity.SlaveState} slave
  */
 globalThis.applyGeneticColor = function(slave) {
diff --git a/tsconfig.json b/tsconfig.json
index c8db67afbff589b7165170f058a90763a51140f2..bc9a8746667406d40404b1503c278e94440df865 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -5,7 +5,7 @@
 		"allowJs": true,
 		"checkJs": true,
 		"noEmit": true,
-		"target": "es2021",
+		"target": "es2022",
 		"noImplicitAny": false,
 		"disableSizeLimit": true,
 		"strictBindCallApply": true