diff --git a/devTools/FC.ts b/devTools/FC.ts
index fd4791e0d7b58a8b2ecc51650d17a8b97f477b11..82253b74720e3fe501b5873ffae1b933b0fbc6e1 100644
--- a/devTools/FC.ts
+++ b/devTools/FC.ts
@@ -278,7 +278,7 @@ namespace App {
 		namespace DOM {
 			namespace Widgets { }
 
-			declare function makeElement<K extends keyof HTMLElementTagNameMap>(tag: K, content: string | Node, classNames: string | string[]): HTMLElementTagNameMap[K];
+			declare function makeElement<K extends keyof HTMLElementTagNameMap>(tag: K, content: string | Node, classNames?: string | string[]): HTMLElementTagNameMap[K];
 			declare function appendNewElement<K extends keyof HTMLElementTagNameMap>(tag: K, parent: ParentNode, content?: string | Node, classNames?: string | string[]): HTMLElementTagNameMap[K];
 		}
 		namespace View { }
diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js
index f0f4a2670cc5bd8f4dee378273743a86e4e14c58..550ee01672b9960ed4cbf4b99e439ee30785b1ff 100644
--- a/js/002-config/fc-js-init.js
+++ b/js/002-config/fc-js-init.js
@@ -43,6 +43,7 @@ App.Facilities.ServantsQuarters = {};
 App.Facilities.Spa = {};
 App.Interact = {};
 App.Intro = {};
+App.Neighbor = {};
 App.MainView = {};
 App.Medicine = {};
 App.Medicine.Modification = {};
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index a670d18f1fb4ff2019f9bb3cb9b64c120a4d0436..cafb853643fe2fee121317a6581009da75c0f746 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -93,6 +93,7 @@ App.Data.defaultGameStateVariables = {
 	makeDicks: 0,
 	modRequestsAllowed: 1,
 	neighboringArcologies: 3,
+	neighborDisplay: "list",
 	newDescriptions: 0,
 	newModelUI: 1,
 	nicknamesAllowed: 1,
@@ -1116,7 +1117,6 @@ App.Data.resetOnNGPlus = {
 	Wardeness: 0,
 	/** @type {FC.SlaveStateOrZero} */
 	Concubine: 0,
-	economicUncertainty: 10,
 
 	justiceEvents: ["slave deal", "slave training", "majority deal", "indenture deal", "virginity deal", "breeding deal"], /* not in setupVars because we remove events from this array as they occur */
 	prisonCircuit: ["low tier criminals", "gangs and smugglers", "white collar", "military prison"],
diff --git a/src/cheats/mod_EditNeighborArcologyCheat.tw b/src/cheats/mod_EditNeighborArcologyCheat.tw
index b4903162a27617c78d1962945a63e5439f3ba785..00a2d0cdeaf34adc8c235ab8967c01524e5e2f15 100644
--- a/src/cheats/mod_EditNeighborArcologyCheat.tw
+++ b/src/cheats/mod_EditNeighborArcologyCheat.tw
@@ -34,12 +34,8 @@
 <</link>>
 <</if>>
 
-<br>
-<<set $averageProsperity = 0, _seed = 0>>
-<<for _eca = 0; _eca < $arcologies.length; _eca++>>
-	<<set $averageProsperity += $arcologies[_eca].prosperity, _seed++>>
-<</for>>
-<<set $averageProsperity = $averageProsperity/_seed>>
+<br><br>
+<<set $averageProsperity = _.mean($arcologies.map((a) => a.prosperity))>>
 
 <<for $i = 1; $i < $arcologies.length; $i++>>
 	<<if $arcologies[$i].direction != 0>>
diff --git a/src/js/futureSocietyJS.js b/src/js/futureSocietyJS.js
index d0f12b4330a61b4ab894c712a0fc33057445d4bf..cfba77e9bdf49917629d0406c1d60cd714e0ce15 100644
--- a/src/js/futureSocietyJS.js
+++ b/src/js/futureSocietyJS.js
@@ -89,6 +89,7 @@ globalThis.FutureSocieties = (function() {
 	};
 
 	return {
+		activeFSes: activeFSes,
 		activeCount: activeCount,
 		applyBroadProgress: applyBroadProgress,
 		influenceSources: influenceSources,
diff --git a/src/js/generateMarketSlave.js b/src/js/generateMarketSlave.js
index 8d025903825d3d9d7f6a741d0f5b6a743464d02b..1088be2f554d0a8959f61628fa5d9273b9566c30 100644
--- a/src/js/generateMarketSlave.js
+++ b/src/js/generateMarketSlave.js
@@ -470,7 +470,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			} else {
 				market = 1;
 			}
-			opinion = ArcologyDiplomacy.opinion(0, market);
+			opinion = App.Neighbor.opinion(0, market);
 			opinion = Math.trunc(opinion/20);
 			opinion = Math.clamp(opinion, -10, 10);
 
diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js
index 017e3f57dcf64afd86f9f6efd4f60c07b624e6f6..b9d78538af1a29e290e297228842f5f813d9d36e 100644
--- a/src/js/utilsFC.js
+++ b/src/js/utilsFC.js
@@ -2947,3 +2947,17 @@ App.Utils.countAssignmentWorkers = function(assignments) {
 	assignments = assignments || Object.values(Job);
 	return assignments.reduce((acc, cur) => { acc[cur] = V.JobIDMap[cur].size; return acc; }, {});
 };
+
+/** Calculate and return economic uncertainty multiplier for a given arcology
+ * @param {number} arcologyID
+ * @returns {number}
+ */
+App.Utils.economicUncertainty = function(arcologyID) {
+	let uncertainty = arcologyID === 0 ? 5 : 10;
+	if (assistant.power === 1) {
+		uncertainty -= Math.max(Math.trunc(uncertainty/2), 0);
+	} else if (assistant.power > 1) {
+		uncertainty = 0;
+	}
+	return jsRandom(100 - uncertainty, 100 + uncertainty) / 100;
+};
diff --git a/src/neighbor/arcologyDiplomacy.js b/src/neighbor/arcologyDiplomacy.js
index 9283acf2496456789cd073622f8130437668d837..0f0a1c1962150e599433cef0f5d0514e43a633dd 100644
--- a/src/neighbor/arcologyDiplomacy.js
+++ b/src/neighbor/arcologyDiplomacy.js
@@ -1,78 +1,68 @@
-globalThis.ArcologyDiplomacy = (function() {
-	return {
-		opinion: opinion,
-		selectInfluenceTarget: selectInfluenceTarget
-	};
-
-	/** get one arcology's opinion of another
-	 * @param {number} activeID index
-	 * @param {number} targetID index
-	 * @returns {number} opinion
-	 */
-	function opinion(activeID, targetID) {
-		const activeArcology = V.arcologies[activeID];
-		const targetArcology = V.arcologies[targetID];
-		if (typeof activeArcology.FSNull === "undefined") { activeArcology.FSNull = "unset"; }
-		if (typeof targetArcology.FSNull === "undefined") { targetArcology.FSNull = "unset"; }
-
-		let opinion = 0;
-
-		const {shared, conflicting} = FutureSocieties.diplomaticFSes(activeID, targetID);
-
-		for (const fs of shared) {
-			opinion += activeArcology[fs];
-			opinion += targetArcology[fs];
-		}
+/** get one arcology's opinion of another
+ * @param {number} activeID index
+ * @param {number} targetID index
+ * @returns {number} opinion
+ */
+App.Neighbor.opinion = function(activeID, targetID) {
+	const activeArcology = V.arcologies[activeID];
+	const targetArcology = V.arcologies[targetID];
+	const {shared, conflicting} = FutureSocieties.diplomaticFSes(activeID, targetID);
+
+	let opinion = 0;
+
+	for (const fs of shared) {
+		opinion += activeArcology[fs];
+		opinion += targetArcology[fs];
+	}
 
-		for (const [activeFS, targetFS] of conflicting) {
-			opinion -= activeArcology[activeFS];
-			opinion -= targetArcology[targetFS];
-		}
+	for (const [activeFS, targetFS] of conflicting) {
+		opinion -= activeArcology[activeFS];
+		opinion -= targetArcology[targetFS];
+	}
 
-		// unshared but uncontested multiculturalism gets a relationship bonus
-		if (!shared.includes("FSNull") && !conflicting.some((pair) => pair.includes("FSNull"))) {
-			if (activeArcology.FSNull !== "unset") {
-				opinion += activeArcology.FSNull;
-			} else if (targetArcology.FSNull !== "unset") {
-				opinion += targetArcology.FSNull;
-			}
+	// unshared but uncontested multiculturalism gets a relationship bonus
+	if (!shared.includes("FSNull") && !conflicting.some((pair) => pair.includes("FSNull"))) {
+		if (activeArcology.FSNull !== "unset") {
+			opinion += activeArcology.FSNull;
+		} else if (targetArcology.FSNull !== "unset") {
+			opinion += targetArcology.FSNull;
 		}
-
-		return opinion = Number(opinion) || 0;
 	}
 
-	/** set a new influence target for a given arcology
-	 * @param {number} arcID
-	 */
-	function selectInfluenceTarget(arcID) {
-		const notMulticulturalism = (f) => f !== "FSNull"; // multiculturalism can neither influence nor be influenced
-		const influenceSources = FutureSocieties.influenceSources(arcID);
-		const arcology = V.arcologies[arcID];
-		if (influenceSources.length > 0) {
-			let eligibleTargets = [];
-			const obdedient = (arcology.government === "your trustees" || arcology.government === "your agent");
+	return opinion;
+};
 
-			for (let targetID = 0; targetID < V.arcologies.length; ++targetID) {
-				const target = V.arcologies[targetID];
-				if (arcology.direction !== target.direction) {
-					if (!obdedient || target.direction !== 0) {
-						const {shared, conflicting} = FutureSocieties.diplomaticFSes(arcID, targetID);
-						let count = 0;
-						count += shared.filter(notMulticulturalism).length;
-						count += conflicting.filter((pair) => pair.every(notMulticulturalism)).length;
-						eligibleTargets.push(...Array(count).fill(target.direction));
-					}
+/** set a new influence target for a given arcology
+ * @param {number} arcID
+ */
+App.Neighbor.selectInfluenceTarget = function(arcID) {
+	const notMulticulturalism = (f) => f !== "FSNull"; // multiculturalism can neither influence nor be influenced
+	const influenceSources = FutureSocieties.influenceSources(arcID);
+	const arcology = V.arcologies[arcID];
+	if (influenceSources.length > 0) {
+		let eligibleTargets = [];
+		const obdedient = (arcology.government === "your trustees" || arcology.government === "your agent");
+
+		for (let targetID = 0; targetID < V.arcologies.length; ++targetID) {
+			const target = V.arcologies[targetID];
+			if (arcology.direction !== target.direction) {
+				if (!obdedient || target.direction !== 0) {
+					const {shared, conflicting} = FutureSocieties.diplomaticFSes(arcID, targetID);
+					let count = 0;
+					count += shared.filter(notMulticulturalism).length;
+					count += conflicting.filter((pair) => pair.every(notMulticulturalism)).length;
+					eligibleTargets.push(...Array(count).fill(target.direction));
 				}
 			}
+		}
 
-			if (eligibleTargets.length > 0) {
-				arcology.influenceTarget = eligibleTargets.random();
-			}
+		if (eligibleTargets.length > 0) {
+			arcology.influenceTarget = eligibleTargets.random();
 		}
 	}
-})();
+};
 
-globalThis.ArcologyFSPassiveInfluence = class {
+App.Neighbor.PassiveFSInfluence = class {
 	/** pick up social hints from an arcology's neighbors
 	 * @param {number} arcID
 	 */
@@ -106,7 +96,6 @@ globalThis.ArcologyFSPassiveInfluence = class {
 		let conflicting = new Map();
 		const arcology = V.arcologies[this._arcID];
 
-		debugger;
 		for (const [i, rel] of this._relationships) {
 			if (rel.shared.some((s) => s === fs)) {
 				if (V.arcologies[i][fs] > arcology[fs] + this._thresh) {
diff --git a/src/uncategorized/neighborDescription.tw b/src/neighbor/neighborDescription.tw
similarity index 92%
rename from src/uncategorized/neighborDescription.tw
rename to src/neighbor/neighborDescription.tw
index 91b4e531e3b9a7fec1aa63f171eafbb8d2d99654..2d4dc8f17960c7c97376fc68d021e49ed0dd3073 100644
--- a/src/uncategorized/neighborDescription.tw
+++ b/src/neighbor/neighborDescription.tw
@@ -1,43 +1,37 @@
 :: Neighbor Description [nobr]
 
-<br><br>&nbsp;&nbsp;&nbsp;&nbsp;
-'' $arcologies[$i].name'' is located to the $arcologies[$i].direction of your arcology. It is governed by
-<<switch $arcologies[$i].government>>
-<<case "elected officials">>
-	elected officials, periodically paralyzing its development.
-<<case "a committee">>
-	a committee, hindering its development.
-<<case "an oligarchy">>
-	a small group of leading citizens, making its development very unpredictable.
-<<case "your trustees">>
-	a small group of leading citizens who are serving as @@.mediumseagreen;your trustees.@@
-<<case "an individual">>
-	@@.cyan;an individual,@@ making its development vibrant but unpredictable.
-<<case "your agent">>
-	@@.deeppink;your agent,@@ who is directing the arcology in your stead.
-<<case "a corporation">>
-	a corporation, making its development steady and unspectacular.
-<<default>>
-	direct democracy, making its development dangerously unstable.
-<</switch>>
-<<if $arcologies[$i].direction == 0>>
-	<<set $economicUncertainty = 5>>
+<div class="indent">
+<<if $arcologies[$i].direction != 0>>
+	''$arcologies[$i].name'' is located to the $arcologies[$i].direction of your arcology. It is governed by
+	<<switch $arcologies[$i].government>>
+	<<case "elected officials">>
+		elected officials, periodically paralyzing its development.
+	<<case "a committee">>
+		a committee, hindering its development.
+	<<case "an oligarchy">>
+		a small group of leading citizens, making its development very unpredictable.
+	<<case "your trustees">>
+		a small group of leading citizens who are serving as @@.mediumseagreen;your trustees.@@
+	<<case "an individual">>
+		@@.cyan;an individual,@@ making its development vibrant but unpredictable.
+	<<case "your agent">>
+		@@.deeppink;your agent,@@ who is directing the arcology in your stead.
+	<<case "a corporation">>
+		a corporation, making its development steady and unspectacular.
+	<<default>>
+		direct democracy, making its development dangerously unstable.
+	<</switch>>
 <<else>>
-	<<set $economicUncertainty = 10>>
-<</if>>
-<<if $assistant.power > 1>>
-	<<set $economicUncertainty = 0>>
-<<elseif $assistant.power == 1>>
-	<<set $economicUncertainty = Math.max(Math.trunc($economicUncertainty/2),0)>>
+	''$arcologies[$i].name'' is your arcology.
 <</if>>
-<<if $arcologies[$i].government != "your trustees">>
-	<<if $arcologies[$i].government != "your agent">>
-		Its leadership has control of approximately @@.orange;<<print Math.trunc(($arcologies[$i].ownership*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ of the arcology<<if $arcologies[$i].minority > $arcologies[$i].ownership-10>>, a dangerously narrow margin over competition with a @@.tan;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.
-	<</if>>
+<<set _economicUncertainty = App.Utils.economicUncertainty($i)>>
+<<if $arcologies[$i].direction == 0>>
+	You control @@.lime;$arcologies[$i].ownership%@@ of the arcology, and the largest minority holder controls @@.orange;$arcologies[$i].minority%.@@
+<<elseif ($arcologies[$i].government != "your trustees") && ($arcologies[$i].government != "your agent")>>
+	Its leadership has control of approximately @@.orange;<<print Math.trunc($arcologies[$i].ownership*_economicUncertainty)>>%@@ of the arcology<<if $arcologies[$i].minority > $arcologies[$i].ownership-10>>, a dangerously narrow margin over competition with a @@.tan;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty)>>%@@ share<</if>>.
 <</if>>
-<<if $arcologies[$i].PCminority > 0>>You own @@.lime;$arcologies[$i].PCminority%@@ of this arcology<<if (($arcologies[$i].government == "your trustees") || ($arcologies[$i].government == "your agent")) && $arcologies[$i].minority > $arcologies[$i].PCminority-10>>, a dangerously narrow margin over competition with a @@.red;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.<</if>>
-<<set $economicUncertainty -= Math.min(2*$assistant.power, $economicUncertainty)>>
-The arcology has an estimated GSP of @@.yellowgreen;<<print cashFormat(Math.trunc((0.1*$arcologies[$i].prosperity*random(100-$economicUncertainty,100+$economicUncertainty))/100))>>m,@@
+<<if $arcologies[$i].PCminority > 0>>You own @@.lime;$arcologies[$i].PCminority%@@ of this arcology<<if (($arcologies[$i].government == "your trustees") || ($arcologies[$i].government == "your agent")) && $arcologies[$i].minority > $arcologies[$i].PCminority-10>>, a dangerously narrow margin over competition with a @@.red;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty)>>%@@ share<</if>>.<</if>>
+The arcology has an estimated GSP of @@.yellowgreen;<<print cashFormat(Math.trunc(0.1*$arcologies[$i].prosperity*_economicUncertainty))>>m,@@
 <<if Math.abs($arcologies[$i].prosperity - $averageProsperity) < 5>>
 	average among
 <<elseif $arcologies[$i].prosperity > $averageProsperity>>
@@ -614,3 +608,4 @@ its neighbors.
 		Its culture is diverging from the old world: it is _neighborDescription[0]
 	<</if>>
 <</if>>
+</div>
diff --git a/src/neighbor/neighborDisplay.css b/src/neighbor/neighborDisplay.css
new file mode 100644
index 0000000000000000000000000000000000000000..87c240223bf31ca5a97513c1f717993166fa8d28
--- /dev/null
+++ b/src/neighbor/neighborDisplay.css
@@ -0,0 +1,48 @@
+.neighbor-container {
+  background-color: rgba(17,17,17,1);
+  padding: 5px;
+  max-width: fit-content;
+  margin: 0 auto;
+}
+
+.neighbor-container-grid {
+  display: grid;
+  grid-template-columns: auto auto auto;
+}
+
+.neighbor-container-list {
+  display: flex;
+  flex-flow: row wrap;
+  align-items: flex-start;
+}
+
+.neighbor-item {
+  margin: 3px;
+  border: 5px solid;
+  padding: 10px;
+  text-align: center;
+}
+
+.neighbor-item-selected {
+  background-color: rgba(255, 255, 255, 0.2);
+}
+
+.neighbor-item-empty {
+  border-color: rgba(17,17,17,1);
+}
+
+.neighbor-item-self {
+  border-color: white;
+}
+
+.neighbor-item-owned {
+  border-color: steelblue;
+}
+
+.neighbor-item-unowned {
+  border-color: red;
+}
+
+.neighbor-item-rival {
+  border-color: crimson;
+}
diff --git a/src/neighbor/neighborDisplay.js b/src/neighbor/neighborDisplay.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f035f2e115259b5160c28b1555675ac7fe98c5b
--- /dev/null
+++ b/src/neighbor/neighborDisplay.js
@@ -0,0 +1,208 @@
+App.Neighbor.Display = class {
+	/** Create a neighbor display controller
+	 * @param {function(number):void} onSelection function to be called when selection changes
+	 */
+	constructor(onSelection) {
+		this.containerID = "neighbor-display";
+		this._onSelection = onSelection;
+	}
+
+	/** Render the neighbor display to DOM
+	 * @returns {Element}
+	 */
+	render() {
+		const container = document.createElement("div");
+		container.id = this.containerID;
+
+		function makeSortLink(/** @type {string} */ title, /** @type {string} */ mode) {
+			if (V.neighborDisplay === mode) {
+				return document.createTextNode(title);
+			} else {
+				return App.UI.DOM.link(title, () => { V.neighborDisplay = mode; this.rerender(); } );
+			}
+		}
+
+		container.append("Neighbor display mode:");
+		container.appendChild(App.UI.DOM.generateLinksStrip([
+			makeSortLink.call(this, "List by ID", "list"),
+			makeSortLink.call(this, "List by Name", "list-name"),
+			makeSortLink.call(this, "City Grid", "grid")
+		]));
+
+		// pick a mode
+		if (V.neighborDisplay === "grid") {
+			container.appendChild(this._renderGrid());
+		} else if (V.neighborDisplay === "list-name") {
+			container.appendChild(this._renderListName());
+		} else { // default if $neighborDisplay is unset for some reason; canonically "list"
+			container.appendChild(this._renderListID());
+		}
+		return container;
+	}
+
+	/** Refresh an existing neighbor display list */
+	rerender() {
+		$(`#${this.containerID}`).replaceWith(this.render());
+	}
+
+	/** Render the display as a list, sorted by ID
+	 * @returns {Element}
+	 */
+	_renderListID() {
+		const container = App.UI.DOM.makeElement("div", null, ["neighbor-container", "neighbor-container-list"]);
+
+		for (let i = 0; i < V.arcologies.length; ++i) {
+			this._renderCell(container, i);
+		}
+
+		return container;
+	}
+
+	/** Render the display as a list, sorted by name
+	 * @returns {Element}
+	 */
+	_renderListName() {
+		const container = App.UI.DOM.makeElement("div", null, ["neighbor-container", "neighbor-container-list"]);
+
+		const arcologyNames = V.arcologies.map((a) => a.name).sort((a, b) => a.localeCompare(b));
+		for (const name of arcologyNames) {
+			this._renderCell(container, V.arcologies.findIndex((a) => a.name === name));
+		}
+
+		return container;
+	}
+
+	/** Render the display as a grid
+	 * @returns {Element}
+	 */
+	_renderGrid() {
+		const container = App.UI.DOM.makeElement("div", null, ["neighbor-container", "neighbor-container-grid"]);
+
+		const directionToIndex = (dir) => V.arcologies.findIndex((a) => a.direction === dir);
+		for (const dir of [ "northwest", "north", "northeast", "west", 0, "east", "southwest", "south", "southeast" ]) {
+			this._renderCell(container, directionToIndex(dir));
+		}
+
+		return container;
+	}
+
+	/** Render a single cell to the display
+	 * @param {Element} container
+	 * @param {number} arcID
+	 */
+	_renderCell(container, arcID) {
+		const arcology = V.arcologies[arcID];
+
+		/** render styled text with a tooltip
+		 * @param {string} text
+		 * @param {string} tooltipText
+		 * @param {string} className
+		 * @returns {HTMLSpanElement}
+		 */
+		function withTooltip(text, tooltipText, className) {
+			let tooltip = App.UI.DOM.makeElement("span", tooltipText, "tooltip");
+			let res = App.UI.DOM.makeElement("span", text, ["textWithTooltip", className]);
+			res.appendChild(tooltip);
+			return res;
+		}
+
+		/** @param {function(): void} selectLambda */
+		function nameFrag(selectLambda) {
+			return App.UI.DOM.makeElement("div", App.UI.DOM.link(arcology.name, selectLambda), "name");
+		}
+
+		function govGSPFrag() {
+			let frag = document.createDocumentFragment();
+			let gov;
+			if (arcID === 0) {
+				gov = App.UI.DOM.appendNewElement("div", frag, "Your arcology; ");
+			} else {
+				gov = App.UI.DOM.appendNewElement("div", frag, capFirstChar(arcology.government) + '; ');
+			}
+			const estimatedGSP = Math.trunc(0.1 * arcology.prosperity * App.Utils.economicUncertainty(arcID));
+			App.UI.DOM.appendNewElement("span", gov, cashFormat(estimatedGSP) + "m GSP", "cash");
+			return frag;
+		}
+
+		function fsFrag() {
+			let frag = document.createDocumentFragment();
+			frag.appendChild(document.createTextNode("FS: "));
+			if (arcID === 0) {
+				const fses = FutureSocieties.activeFSes(0);
+				for (const fs of fses) {
+					frag.appendChild(withTooltip("⯁", FutureSocieties.displayName(fs), "steelblue"));
+				}
+			} else {
+				const fses = FutureSocieties.activeFSes(arcID);
+				const diplo = FutureSocieties.diplomaticFSes(arcID, 0);
+				for (const fs of fses) {
+					let style = "white";
+					if (diplo.shared.includes(fs)) {
+						style = "steelblue";
+					} else {
+						const conflict = diplo.conflicting.find((f) => f[0] === fs);
+						if (conflict) {
+							style = "red";
+						}
+					}
+					frag.appendChild(withTooltip("⯁", FutureSocieties.displayName(fs), style));
+				}
+			}
+			return App.UI.DOM.makeElement("div", frag);
+		}
+
+		function ownershipFrag() {
+			let frag = document.createDocumentFragment();
+			const owned = arcID === 0 || arcology.government === "your trustees" || arcology.government === "your agent";
+			const yourPercent = arcID === 0 ? `${arcology.ownership}%` : `${arcology.PCminority}%`;
+			const hostilePercent = owned ? `${arcology.minority}%` : `${arcology.ownership}%`;
+			const challengerPercent = owned ? null : `${arcology.minority}%`;
+			const publicPercent = `${100 - (arcology.ownership + arcology.minority + arcology.PCminority)}%`;
+			App.UI.DOM.appendNewElement("li", frag, withTooltip(yourPercent, "Your ownership", "steelblue"));
+			if (arcID !== 0) {
+				App.UI.DOM.appendNewElement("li", frag, withTooltip(publicPercent, "Public ownership", "yellow"));
+			}
+			if (challengerPercent) {
+				App.UI.DOM.appendNewElement("li", frag, withTooltip(challengerPercent, "Minority challenger ownership", "orange"));
+			}
+			App.UI.DOM.appendNewElement("li", frag, withTooltip(hostilePercent, "Hostile ownership", "red"));
+			return App.UI.DOM.makeElement("ul", frag, "choicesStrip");
+		}
+
+		let frag = document.createDocumentFragment();
+		let classNames = ["neighbor-item"];
+		if (!arcology) {
+			// empty block
+			classNames.push("neighbor-item-empty");
+		} else {
+			frag.appendChild(nameFrag(() => this.select(arcID)));
+			frag.appendChild(govGSPFrag());
+			frag.appendChild(fsFrag());
+			frag.appendChild(ownershipFrag());
+			if (arcID === 0) {
+				classNames.push("neighbor-item-self");
+			} else if (arcology.government === "your trustees" || arcology.government === "your agent") {
+				classNames.push("neighbor-item-owned");
+			} else if (arcology.rival) {
+				classNames.push("neighbor-item-rival");
+			} else {
+				classNames.push("neighbor-item-unowned");
+			}
+		}
+
+		const element = App.UI.DOM.appendNewElement("div", container, frag, classNames);
+		element.id = `neighbor-cell-${arcID}`;
+	}
+
+	/** Set the selection to a particular arcology
+	 * @param {number} arcID
+	 */
+	select(arcID) {
+		const elementID = `#neighbor-cell-${arcID}`;
+
+		$("div[id^='neighbor-cell']").each((i, e) => { $(e).removeClass("neighbor-item-selected"); });
+		$(elementID).addClass("neighbor-item-selected");
+
+		this._onSelection(arcID);
+	}
+};
diff --git a/src/neighbor/neighborInteract.js b/src/neighbor/neighborInteract.js
new file mode 100644
index 0000000000000000000000000000000000000000..e13f02b9c98a87fb34a3ef4b9bb434b23712255a
--- /dev/null
+++ b/src/neighbor/neighborInteract.js
@@ -0,0 +1,322 @@
+App.Neighbor.Interact = (function() {
+	let nd = new App.Neighbor.Display((id) => replaceDetails(id));
+
+	/** Output the arcology list
+	 * @returns {DocumentFragment}
+	 */
+	function list() {
+		V.arcologies.forEach((a) => a.prosperity = Math.clamp(a.prosperity, 1, 300));
+		if (!V.activeArcologyIdx) {
+			V.activeArcologyIdx = 0;
+		}
+
+		let frag = document.createDocumentFragment();
+
+		// set up the neighbor display list itself
+		frag.append(nd.render());
+		$(document).one(':passagedisplay', () => nd.select(V.activeArcologyIdx));
+
+		// empty container for details
+		const detailSpan = App.UI.DOM.appendNewElement("span", frag);
+		detailSpan.id = "neighbor-details";
+
+		return frag;
+	}
+
+	/** Replace the details block with an updated one for the given arcology
+	 * Used both as a refresh and as a selection handler
+	 * @param {number} arcID
+	 */
+	function replaceDetails(arcID) {
+		V.activeArcologyIdx = arcID;
+		const container = $("#neighbor-details").empty();
+		container.append(description(arcID));
+		container.append(details(arcID));
+	}
+
+	/** Re-render most of the page because some important arcology property (FS, government, ownership) may have changed
+	 * @param {number} arcID for reselection
+	 */
+	function arcChanged(arcID) {
+		nd.rerender();
+		nd.select(arcID);
+	}
+
+	/** Create a div containing the neighbor's description
+	 * @param {number} arcID
+	 * @returns {Element}
+	 */
+	function description(arcID) {
+		// still in Twine for now
+		let container = document.createElement("div");
+		V.i = arcID;
+		App.UI.DOM.includePassage(container, "Neighbor Description");
+		return container;
+	}
+
+	/** Create a fragment containing all the details for a given arcology
+	 * @param {number} arcID
+	 * @returns {DocumentFragment}
+	 */
+	function details(arcID) {
+		let frag = document.createDocumentFragment();
+		if (arcID === 0) {
+			const desc = FutureSocieties.activeFSes(0).map((f) => FutureSocieties.displayName(f));
+			if (desc.length === 0) {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture has not developed to the point where it can meaningfully influence other arcologies.`);
+			} else if (desc.length > 2) {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's mature culture is capable of exerting great cultural sway over other arcologies. It can readily project ${desc.reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? ' and ' : ', ') + ch)}.`);
+			} else if (desc.length === 2) {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture is capable of exerting some cultural sway over other arcologies. It can effectively project ${desc[0]} and ${desc[1]}.`);
+			} else {
+				App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture is capable of starting to exert cultural sway over other arcologies. It can project ${desc[0]}.`);
+			}
+		} else {
+			const ownershipCost = 500*Math.trunc(V.arcologies[arcID].prosperity*(1+(V.arcologies[arcID].demandFactor/100)));
+			frag.append(`A 1% interest in this arcology is worth ${cashFormat(ownershipCost)}. `);
+			if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 100) {
+				frag.append(`The transaction fee is ${cashFormat(10000)}.`);
+			}
+
+			if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 100) {
+				let links = [];
+				links.push(App.UI.DOM.link("Buy", (f) => {
+					cashX(forceNeg(ownershipCost), "war");
+					cashX(-10000, "war");
+					V.arcologies[arcID].PCminority += 1;
+					V.arcologies[arcID].demandFactor += 2;
+				}, [], "Neighbor Interact"));
+				if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority <= 90) {
+					if (V.cash > ownershipCost*10) {
+						const link = App.UI.DOM.link("10%", (f) => {
+							cashX(forceNeg(ownershipCost*10), "war");
+							cashX(-10000, "war");
+							V.arcologies[arcID].PCminority += 10;
+							V.arcologies[arcID].demandFactor += 20;
+						}, [], "Neighbor Interact");
+						links.push(link);
+					}
+				}
+				const div = App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(links));
+				if (links.length > 1) {
+					App.UI.DOM.appendNewElement("span", div, "Transaction costs will only be paid once.", "detail");
+				}
+			}
+
+			if (V.arcologies[arcID].PCminority > 0) {
+				let links = [];
+				links.push(App.UI.DOM.link("Sell", (f) => {
+					cashX(ownershipCost, "war");
+					V.arcologies[arcID].PCminority -= 1;
+					V.arcologies[arcID].demandFactor -= 2;
+					if (V.arcologies[arcID].government !== "your agent" && V.arcologies[arcID].government !== "your trustees" && V.arcologies[arcID].rival !== 1) {
+						if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 10) {
+							V.arcologies[arcID].ownership += 10;
+						}
+					}
+					arcChanged(arcID);
+				}, [], "Neighbor Interact"));
+				if (V.arcologies[arcID].PCminority >= 10) {
+					links.push(App.UI.DOM.link("10%", (f) => {
+						cashX((ownershipCost*10), "war");
+						V.arcologies[arcID].PCminority -= 10;
+						V.arcologies[arcID].demandFactor -= 20;
+						if (V.arcologies[arcID].government !== "your agent" && V.arcologies[arcID].government !== "your trustees" && V.arcologies[arcID].rival !== 1) {
+							if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 10) {
+								V.arcologies[arcID].ownership += 10;
+							}
+						}
+					}, [], "Neighbor Interact"));
+				}
+				App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(links));
+			}
+
+			if (V.arcologies[arcID].direction !== V.arcologies[0].embargoTarget) {
+				frag.append(document.createElement("br"));
+				frag.append(App.UI.DOM.passageLink("Target them for economic warfare", "Neighbor Interact", () => V.arcologies[0].embargoTarget = V.arcologies[arcID].direction));
+			}
+
+			if (V.PC.skill.hacking > 0) {
+				if (V.arcologies[arcID].direction !== V.arcologies[0].CyberEconomicTarget) {
+					frag.append(document.createElement("br"));
+					frag.append(App.UI.DOM.passageLink("Target them for cyber economic warfare", "Neighbor Interact", () => V.arcologies[0].CyberEconomicTarget = V.arcologies[arcID].direction));
+				}
+				if (V.arcologies[arcID].direction !== V.arcologies[0].CyberReputationTarget) {
+					frag.append(document.createElement("br"));
+					frag.append(App.UI.DOM.passageLink("Target their leadership for character assassination", "Neighbor Interact", () => V.arcologies[0].CyberReputationTarget = V.arcologies[arcID].direction));
+				}
+			}
+			if (FutureSocieties.influenceSources(0).length > 0) {
+				if (V.arcologies[arcID].direction !== V.arcologies[0].influenceTarget) {
+					frag.append(document.createElement("br"));
+					frag.append(App.UI.DOM.passageLink("Set as influence target", "Neighbor Interact", () => V.arcologies[0].influenceTarget = V.arcologies[arcID].direction));
+				}
+			}
+
+			if (V.arcologies[arcID].government === "your trustees" || V.arcologies[arcID].government === "your agent") {
+				frag.append(controlActions(arcID));
+			}
+
+			frag.append(fsGoods(arcID));
+		}
+		return frag;
+	}
+
+	/** Create a div containing actions specific to arcologies that are under the player's control
+	 * @param {number} arcID
+	 * @returns {Element}
+	 */
+	function controlActions(arcID) {
+		const container = document.createElement("div");
+		const agent = App.currentAgent(arcID);
+		const him = agent ? getPronouns(agent).him : "them";
+		container.append(document.createElement("br"));
+		if (V.arcologies[arcID].government === "your trustees") {
+			container.append(App.UI.DOM.passageLink("Appoint an agent", "Agent Select"));
+		} else {
+			let linkText = `Recall and reenslave ${him}`;
+			const residentList = [agent.ID];
+			const agentPartner = V.slaves.find((s) => s.assignment === Job.AGENTPARTNER && s.relationshipTarget === agent.ID);
+			if (agentPartner) {
+				linkText = `Recall them and reenslave your agent`;
+				residentList.push(agentPartner.ID);
+			}
+			container.append(App.UI.SlaveList.render.listDOM(residentList, [], App.UI.SlaveList.SlaveInteract.stdInteract));
+			container.append(App.UI.DOM.link(linkText, (f) => { removeJob(agent, "be your agent"); arcChanged(arcID); }));
+		}
+		container.append(" | ");
+		const rename = App.UI.DOM.appendNewElement("span", container, '');
+		rename.id = "rename";
+		rename.append(App.UI.DOM.link(`Instruct ${him} to rename the arcology`, () => $("#rename").replaceWith([
+			App.UI.DOM.makeTextBox(V.arcologies[arcID].name, (s) => { V.arcologies[arcID].name = s; }, false),
+			App.UI.DOM.link("Confirm name", arcChanged, [arcID])
+		])));
+
+		if (V.arcologies[arcID].government === "your agent") {
+			const {His, his, he, himself /* him is already set */} = getPronouns(agent);
+			let r = [];
+			r.push(`${His} ${agent.intelligence > 95 ? `brilliance` : `intelligence`} and education are the most important qualities for ${him}.`);
+			if (agent.actualAge > 35) {
+				r.push(`As with the Head Girl position, ${his} age and experience lend ${him} leadership weight.`);
+			}
+			if (agent.career === "an arcology owner") {
+				r.push(`${His} career as an arcology owner ${himself} is, obviously, useful to ${him}.`);
+			} else if (setup.HGCareers.includes(agent.career)) {
+				r.push(`${His} career in leadership helps ${him}.`);
+			}
+			if (agent.fetishStrength > 95) {
+				if ((agent.fetish === "dom") || (agent.fetish === "sadist")) {
+					r.push(`${His} sexually dominant fetish helps ${him} fill a leadership role.`);
+				} else if ((agent.fetish === "submissive") || (agent.fetish === "masochist")) {
+					r.push(`Unfortunately, ${he} has an inappropriate fetish for a leader.`);
+				} else {
+					r.push(`${His} sexual fetishes will influence how ${he} leads the arcology.`);
+				}
+			}
+			if (agent.energy > 95) {
+				r.push(`Finally, ${his} sexual depravity lets ${him} fit into arcology society naturally.`);
+			}
+			App.UI.DOM.appendNewElement("div", container, r.join(' ' ));
+		}
+
+		container.append(document.createElement("br"));
+		const forceAbandonment = (fs) => { V.arcologies[arcID][fs] = "unset"; arcChanged(arcID); };
+		for (const fs of FutureSocieties.activeFSes(arcID)) {
+			App.UI.DOM.appendNewElement("div", container, App.UI.DOM.link(`Force abandonment of ${FutureSocieties.displayName(fs)}`, forceAbandonment, [fs]));
+		}
+
+		return container;
+	}
+
+	/** Create an element containing all the society-dependent stuff you can buy from this arcology.
+	 * @param {number} arcID
+	 * @returns {Element}
+	 */
+	function fsGoods(arcID) {
+		const container = document.createElement("div");
+		let r = [];
+		r.push(`If ${V.arcologies[arcID].name} has developed enough to begin exporting worthwhile goods, it may be of interest to acquire some.`);
+		const opinionDiscount = App.Neighbor.opinion(arcID, 0)*10;
+		const basePrice = Math.trunc((7500-opinionDiscount)*V.upgradeMultiplierTrade);
+		const controlled = (V.arcologies[arcID].government === "your trustees") || (V.arcologies[arcID].government === "your agent");
+		if (controlled) {
+			r.push(`Since it is under your control, it is no problem at all to request the transfer of goods to ${V.arcologies[0].name}.`);
+		} else if (V.PC.skill.hacking >= 50) {
+			r.push(`It is within your skills to redirect an outgoing shipment to ${V.arcologies[0].name} for your retrieval.`);
+		} else if (V.arcologies[arcID].direction === V.arcologies[0].embargoTarget) {
+			r.push(`However, due to your active embargo, trade with ${V.arcologies[arcID].name} is not possible.`);
+		}
+		App.UI.DOM.appendNewElement("p", container, r.join(' '));
+
+		let exports = 0;
+
+		/** Build a link or text block describing how to acquire a specific good from this arcology
+		 * @param {string} fsRequired - the FS that the arcology has to have for this block to appear
+		 * @param {string} itemName - the item name to check to see if the player already has this item
+		 * @param {string} category - the category to check to see if the player already has this item
+		 * @param {string} itemDisplay - a display name for a group of the item; as in, "a shipment of XXX" or "enough XXX"
+		 * @param {string} property - the global property controlling whether this item has been acquired
+		 * @param {number} [itemPrice] - the price the player should pay for the item; by default, basePrice (computed above)
+		 */
+		function addAcquisitionBlock(fsRequired, itemName, category, itemDisplay, property, itemPrice = basePrice) {
+			if (V.arcologies[arcID][fsRequired] > 95) {
+				if (!isItemAccessible.entry(itemName, category)) {
+					if (controlled) {
+						const link = App.UI.DOM.link(`Request a shipment of ${itemDisplay}`, (f) => {
+							V[property] = 1;
+							replaceDetails(arcID);
+						});
+						App.UI.DOM.appendNewElement("div", container, link);
+					} else if (V.PC.skill.hacking >= 50) {
+						const link = App.UI.DOM.link(`Divert an outgoing shipment of ${itemDisplay}`, (f) => {
+							V[property] = 1;
+							replaceDetails(arcID);
+						});
+						App.UI.DOM.appendNewElement("div", container, link);
+					} else if (V.arcologies[arcID].direction !== V.arcologies[0].embargoTarget) {
+						const link = App.UI.DOM.link(`Divert an outgoing shipment of ${itemDisplay}`, (f) => {
+							V[property] = 1;
+							cashX(forceNeg(itemPrice), "capEx");
+							// replaceDetails(arcID); - cash changed, force passage transition for sidebar update
+						}, [], "Neighbor Interact");
+						const div = App.UI.DOM.appendNewElement("div", container, link);
+						App.UI.DOM.appendNewElement("span", div, `Will cost ${cashFormat(itemPrice)}`, "detail");
+					}
+				} else {
+					App.UI.DOM.appendNewElement("div", container, `You already have enough ${itemDisplay}.`);
+				}
+				exports = 1;
+			}
+		}
+
+		addAcquisitionBlock("FSRomanRevivalist", "a toga", "clothing", "togas", "clothesBoughtToga");
+		addAcquisitionBlock("FSEdoRevivalist", "a kimono", "clothing", "kimonos", "clothesBoughtKimono");
+		addAcquisitionBlock("FSArabianRevivalist", "harem gauze", "clothing", "silken harem garb", "clothesBoughtHarem");
+		addAcquisitionBlock("FSAztecRevivalist", "a huipil", "clothing", "huipils", "clothesBoughtHuipil");
+		addAcquisitionBlock("FSChineseRevivalist", "a slutty qipao", "clothing", "skimpy qipaos", "clothesBoughtQipao");
+		addAcquisitionBlock("FSEgyptianRevivalist", "ancient Egyptian", "collar", "Egyptian necklace replicas", "clothesBoughtEgypt");
+		addAcquisitionBlock("FSPaternalist", "conservative clothing", "clothing", "conservative clothing", "clothesBoughtConservative");
+		addAcquisitionBlock("FSDegradationist", "chains", "clothing", "binding chains", "clothesBoughtChains");
+		addAcquisitionBlock("FSGenderFundamentalist", "a bunny outfit", "clothing", "bunny suits", "clothesBoughtBunny");
+		addAcquisitionBlock("FSIntellectualDependency", "a bimbo outfit", "cloting", "bimbo attire", "clothesBoughtBimbo");
+		addAcquisitionBlock("FSSlaveProfessionalism", "a courtesan dress", "clothing", "cortesan dresses", "clothesBoughtCourtesan");
+		// addAcquisitionBlock("FSPetiteAdmiration", "petite dress", "clothing", "petite-sized dresses", "clothesBoughtPetite");
+		addAcquisitionBlock("FSPhysicalIdealist", "body oil", "clothing", "body oil", "clothesBoughtOil");
+		addAcquisitionBlock("FSHedonisticDecadence", "stretch pants and a crop-top", "clothing", "stretch pants and crop-tops", "clothesBoughtLazyClothes");
+		addAcquisitionBlock("FSChattelReligionist", "a chattel habit", "clothing", "chattel religionist habits", "clothesBoughtHabit");
+		addAcquisitionBlock("FSPastoralist", "Western clothing", "clothing", "Western clothing", "clothesBoughtWestern");
+		addAcquisitionBlock("FSRepopulationFocus", "a maternity dress", "clothing", "maternity dresses", "clothesBoughtMaternityDress");
+		addAcquisitionBlock("FSRepopulationFocus", "attractive lingerie for a pregnant woman", "clothing", "maternity lingerie", "clothesBoughtMaternityLingerie");
+		addAcquisitionBlock("FSRepopulationFocus", "a small empathy belly", "bellyAccessory", "empathy bellies", "clothesBoughtBelly");
+		addAcquisitionBlock("FSStatuesqueGlorification", "platform heels", "shoes", "platform shoes", "shoesBoughtHeels");
+
+		if (exports !== 1) {
+			const luck = (V.arcologies[arcID].direction === V.arcologies[0].embargoTarget) ? `Fortunately` : `Unfortunately`;
+			App.UI.DOM.appendNewElement("p", container, `${luck}, they have nothing of value.`);
+		}
+
+		return container;
+	}
+
+	return list;
+})();
diff --git a/src/neighbor/neighborInteract.tw b/src/neighbor/neighborInteract.tw
new file mode 100644
index 0000000000000000000000000000000000000000..746acbf34e6eeadc5f29040ee6ce0bc458ff2aef
--- /dev/null
+++ b/src/neighbor/neighborInteract.tw
@@ -0,0 +1,74 @@
+:: Neighbor Interact [nobr jump-to-safe jump-from-safe]
+
+<<set $averageProsperity = _.mean($arcologies.map((a) => a.prosperity))>>
+
+<<if $cheatMode == 1>>
+	[[Cheat Edit Neighboring Arcologies|MOD_Edit Neighbor Arcology Cheat]]<br><br>
+<</if>>
+
+<<set $nextLink = "Main">>
+<<set $nextButton = "Back">>
+You have <<print $arcologies.length-1>> neighbors. <br><br>
+
+<<if $arcologies[0].embargoTarget == -1>>
+	You are not engaged in economic warfare against a neighboring arcology.
+<<else>>
+	<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].embargoTarget; })>>
+	You have targeted '' $arcologies[_nei].name'' for economic warfare.
+	<br>&nbsp;&nbsp;&nbsp;&nbsp;Its planned impacts will be
+	<<if $arcologies[0].embargo == 3>>
+		''widespread.'' [[Moderate|Neighbor Interact][$arcologies[0].embargo -= 1]]
+	<<elseif $arcologies[0].embargo == 2>>
+		''limited.'' [[Intensify|Neighbor Interact][$arcologies[0].embargo += 1]] | [[Moderate|Neighbor Interact][$arcologies[0].embargo -= 1]]
+	<<else>>
+		''nominal.'' [[Intensify|Neighbor Interact][$arcologies[0].embargo += 1]]
+	<</if>>
+	| [[Cancel|Neighbor Interact][$arcologies[0].embargoTarget = -1]]
+<</if>>
+
+<br>
+<<if $arcologies[0].influenceTarget == -1>>
+	You are not using your arcology's culture to attempt to influence neighboring arcologies' development.
+<<else>>
+	<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].influenceTarget; })>>
+	You have targeted '' $arcologies[_nei].name'' for cultural influence.
+	[[Stop|Neighbor Interact][$arcologies[0].influenceTarget = -1]]
+<</if>>
+
+<<if $PC.skill.hacking > 0>>
+	<br>
+	<<if $arcologies[0].CyberEconomicTarget == -1>>
+		You are not engaged in cyber warfare against a neighboring arcology.
+	<<else>>
+		<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].CyberEconomicTarget; })>>
+		You have targeted ''$arcologies[_nei].name'' for cyber economic warfare.
+		<br>&nbsp;&nbsp;&nbsp;&nbsp;Its planned impacts will be
+		<<if $arcologies[0].CyberEconomic == 3>>
+			''widespread.'' [[Moderate|Neighbor Interact][$arcologies[0].CyberEconomic -= 1]]
+		<<elseif $arcologies[0].CyberEconomic == 2>>
+			''limited.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberEconomic += 1]] | [[Moderate|Neighbor Interact][$arcologies[0].CyberEconomic -= 1]]
+		<<else>>
+			''nominal.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberEconomic += 1]]
+		<</if>>
+		| [[Revert|Neighbor Interact][$arcologies[0].CyberEconomicTarget = -1]]
+	<</if>>
+
+	<br>
+	<<if $arcologies[0].CyberReputationTarget == -1>>
+		You are not engaged in character assassination against a neighboring arcology.
+	<<else>>
+		<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].CyberReputationTarget; })>>
+		You have targeted the leadership of ''$arcologies[_nei].name'' for character assassination.
+		<br>&nbsp;&nbsp;&nbsp;&nbsp;Its planned impacts will be
+		<<if $arcologies[0].CyberReputation == 3>>
+			''widespread.'' [[Moderate|Neighbor Interact][$arcologies[0].CyberReputation -= 1]]
+		<<elseif $arcologies[0].CyberReputation == 2>>
+			''limited.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberReputation += 1]] | [[Moderate|Neighbor Interact][$arcologies[0].CyberReputation -= 1]]
+		<<else>>
+			''nominal.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberReputation += 1]]
+		<</if>>
+		| [[Abort|Neighbor Interact][$arcologies[0].CyberReputationTarget = -1]]
+	<</if>>
+<</if>>
+
+<<includeDOM App.Neighbor.Interact()>>
diff --git a/src/uncategorized/arcmgmt.tw b/src/uncategorized/arcmgmt.tw
index 95d9db643b04013c722a4955dc2aa24065daf650..6210c09c70d1be8ae36286540c86633283df19dd 100644
--- a/src/uncategorized/arcmgmt.tw
+++ b/src/uncategorized/arcmgmt.tw
@@ -1501,7 +1501,7 @@ You own
 	<<set _desc = []>>
 	<<set _descNeg = []>>
 	<<for $i = 1; $i < $arcologies.length; $i++>>
-		<<set _opinion = ArcologyDiplomacy.opinion(0, $i)>>
+		<<set _opinion = App.Neighbor.opinion(0, $i)>>
 		<<if _opinion >= 100>>
 			<<set _desc.push($arcologies[$i].name)>>
 		<<elseif _opinion <= -100>>
diff --git a/src/uncategorized/bulkSlaveGenerate.tw b/src/uncategorized/bulkSlaveGenerate.tw
index c7f3d0b90a52cf310d757cab9f145ddec3263cb2..eb87587f3c2dbd68742c0321995bab72f9c8cacb 100644
--- a/src/uncategorized/bulkSlaveGenerate.tw
+++ b/src/uncategorized/bulkSlaveGenerate.tw
@@ -65,7 +65,7 @@
 	<<if $numArcology >= $arcologies.length>>
 		<<set $numArcology = 1>>
 	<</if>>
-	<<set _opinion = ArcologyDiplomacy.opinion(0, $numArcology)>>
+	<<set _opinion = App.Neighbor.opinion(0, $numArcology)>>
 	<<set _opinion = Math.clamp(Math.trunc(_opinion/20), -10, 10)>>
 	<<set $discount -= (_opinion * 25)>>
 
diff --git a/src/uncategorized/neighborInteract.tw b/src/uncategorized/neighborInteract.tw
deleted file mode 100644
index 97c8bba3c3bfdc2a219b6b7d6a0cc76d4eb46a7f..0000000000000000000000000000000000000000
--- a/src/uncategorized/neighborInteract.tw
+++ /dev/null
@@ -1,846 +0,0 @@
-:: Neighbor Interact [nobr jump-to-safe jump-from-safe]
-
-<<set $averageProsperity = 0>>
-<<set _neighboringArcologyCount = 0>>
-<<for $i = 0; $i < $arcologies.length; $i++>>
-	<<set $averageProsperity += $arcologies[$i].prosperity>>
-	<<set _neighboringArcologyCount += 1>>
-<</for>>
-<<set $averageProsperity = $averageProsperity/_neighboringArcologyCount>>
-
-<<if $cheatMode == 1>>
-	[[Cheat Edit Neighboring Arcologies|MOD_Edit Neighbor Arcology Cheat]]<br><br>
-<</if>>
-
-<<set $nextLink = "Main">>
-<<set $nextButton = "Back">>
-You have <<print $arcologies.length-1>> neighbors. <br><br>
-
-<<if $arcologies[0].embargoTarget == -1>>
-	You are not engaged in economic warfare against a neighboring arcology.
-<<else>>
-	<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].embargoTarget; })>>
-	You have targeted '' $arcologies[_nei].name'' for economic warfare.
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;Its planned impacts will be
-	<<if $arcologies[0].embargo == 3>>
-		''widespread.'' [[Moderate|Neighbor Interact][$arcologies[0].embargo -= 1]]
-	<<elseif $arcologies[0].embargo == 2>>
-		''limited.'' [[Intensify|Neighbor Interact][$arcologies[0].embargo += 1]] | [[Moderate|Neighbor Interact][$arcologies[0].embargo -= 1]]
-	<<else>>
-		''nominal.'' [[Intensify|Neighbor Interact][$arcologies[0].embargo += 1]]
-	<</if>>
-	| [[Cancel|Neighbor Interact][$arcologies[0].embargoTarget = -1]]
-<</if>>
-
-<br>
-<<if $arcologies[0].influenceTarget == -1>>
-	You are not using your arcology's culture to attempt to influence neighboring arcologies' development.
-<<else>>
-	<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].influenceTarget; })>>
-	You have targeted '' $arcologies[_nei].name'' for cultural influence.
-	[[Stop|Neighbor Interact][$arcologies[0].influenceTarget = -1]]
-<</if>>
-
-<<if $PC.skill.hacking > 0>>
-	<br>
-	<<if $arcologies[0].CyberEconomicTarget == -1>>
-		You are not engaged in cyber warfare against a neighboring arcology.
-	<<else>>
-		<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].CyberEconomicTarget; })>>
-		You have targeted ''$arcologies[_nei].name'' for cyber economic warfare.
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;Its planned impacts will be
-		<<if $arcologies[0].CyberEconomic == 3>>
-			''widespread.'' [[Moderate|Neighbor Interact][$arcologies[0].CyberEconomic -= 1]]
-		<<elseif $arcologies[0].CyberEconomic == 2>>
-			''limited.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberEconomic += 1]] | [[Moderate|Neighbor Interact][$arcologies[0].CyberEconomic -= 1]]
-		<<else>>
-			''nominal.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberEconomic += 1]]
-		<</if>>
-		| [[Revert|Neighbor Interact][$arcologies[0].CyberEconomicTarget = -1]]
-	<</if>>
-
-	<br>
-	<<if $arcologies[0].CyberReputationTarget == -1>>
-		You are not engaged in character assassination against a neighboring arcology.
-	<<else>>
-		<<set _nei = $arcologies.findIndex(function(s) { return s.direction == $arcologies[0].CyberReputationTarget; })>>
-		You have targeted the leadership of ''$arcologies[_nei].name'' for character assassination.
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;Its planned impacts will be
-		<<if $arcologies[0].CyberReputation == 3>>
-			''widespread.'' [[Moderate|Neighbor Interact][$arcologies[0].CyberReputation -= 1]]
-		<<elseif $arcologies[0].CyberReputation == 2>>
-			''limited.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberReputation += 1]] | [[Moderate|Neighbor Interact][$arcologies[0].CyberReputation -= 1]]
-		<<else>>
-			''nominal.'' [[Intensify|Neighbor Interact][$arcologies[0].CyberReputation += 1]]
-		<</if>>
-		| [[Abort|Neighbor Interact][$arcologies[0].CyberReputationTarget = -1]]
-	<</if>>
-<</if>>
-
-<<set $desc = []>>
-<<if $arcologies[0].FSSubjugationist > 60>>
-	<<set $desc.push("Racial Subjugation")>>
-<</if>>
-<<if $arcologies[0].FSSupremacist > 60>>
-	<<set $desc.push("Racial Supremacy")>>
-<</if>>
-<<if $arcologies[0].FSRepopulationFocus > 60>>
-	<<set $desc.push("Repopulation Focus")>>
-<</if>>
-<<if $arcologies[0].FSRestart > 60>>
-	<<set $desc.push("Eugenics")>>
-<</if>>
-<<if $arcologies[0].FSGenderRadicalist > 60>>
-	<<set $desc.push("Gender Radicalism")>>
-<</if>>
-<<if $arcologies[0].FSGenderFundamentalist > 60>>
-	<<set $desc.push("Gender Fundamentalism")>>
-<</if>>
-<<if $arcologies[0].FSPaternalist > 60>>
-	<<set $desc.push("Paternalism")>>
-<</if>>
-<<if $arcologies[0].FSDegradationist > 60>>
-	<<set $desc.push("Degradationism")>>
-<</if>>
-<<if $arcologies[0].FSBodyPurist > 60>>
-	<<set $desc.push("Body Purism")>>
-<</if>>
-<<if $arcologies[0].FSTransformationFetishist > 60>>
-	<<set $desc.push("Transformation Fetishism")>>
-<</if>>
-<<if $arcologies[0].FSYouthPreferentialist > 60>>
-	<<set $desc.push("Youth Preferentialism")>>
-<</if>>
-<<if $arcologies[0].FSMaturityPreferentialist > 60>>
-	<<set $desc.push("Maturity Preferentialism")>>
-<</if>>
-<<if $arcologies[0].FSSlimnessEnthusiast > 60>>
-	<<set $desc.push("Slimness Enthusiasm")>>
-<</if>>
-<<if $arcologies[0].FSAssetExpansionist > 60>>
-	<<set $desc.push("Asset Expansionism")>>
-<</if>>
-<<if $arcologies[0].FSPastoralist > 60>>
-	<<set $desc.push("Pastoralism")>>
-<</if>>
-<<if $arcologies[0].FSCummunism > 60>>
-	<<set $desc.push("Cummunism")>>
-<</if>>
-<<if $arcologies[0].FSPhysicalIdealist > 60>>
-	<<set $desc.push("Physical Idealism")>>
-<</if>>
-<<if $arcologies[0].FSHedonisticDecadence > 60>>
-	<<set $desc.push("Hedonistic Decadence")>>
-<</if>>
-<<if $arcologies[0].FSIncestFetishist > 60>>
-	<<set $desc.push("Incest Fetishism")>>
-<</if>>
-<<if $arcologies[0].FSIntellectualDependency > 60>>
-	<<set $desc.push("Intellectual Dependency")>>
-<</if>>
-<<if $arcologies[0].FSSlaveProfessionalism > 60>>
-	<<set $desc.push("Slave Professionalism")>>
-<</if>>
-<<if $arcologies[0].FSPetiteAdmiration > 60>>
-	<<set $desc.push("Petite Admiration")>>
-<</if>>
-<<if $arcologies[0].FSStatuesqueGlorification > 60>>
-	<<set $desc.push("Statuesque Glorification")>>
-<</if>>
-<<if $arcologies[0].FSChattelReligionist > 60>>
-	<<set $desc.push("Chattel Religionism")>>
-<</if>>
-<<if $arcologies[0].FSRomanRevivalist > 60>>
-	<<set $desc.push("Roman Revivalism")>>
-<</if>>
-<<if $arcologies[0].FSAztecRevivalist > 60>>
-	<<set $desc.push("Aztec Revivalism")>>
-<</if>>
-<<if $arcologies[0].FSEgyptianRevivalist > 60>>
-	<<set $desc.push("Egyptian Revivalism")>>
-<</if>>
-<<if $arcologies[0].FSEdoRevivalist > 60>>
-	<<set $desc.push("Edo Revivalism")>>
-<</if>>
-<<if $arcologies[0].FSArabianRevivalist > 60>>
-	<<set $desc.push("Arabian Revivalism")>>
-<</if>>
-<<if $arcologies[0].FSChineseRevivalist > 60>>
-	<<set $desc.push("Chinese Revivalism")>>
-<</if>>
-
-<br> <span id="Security"> <br>
-<<if $desc.length == 0>>
-	Your arcology's culture has not developed to the point where it can meaningfully influence other arcologies.
-<<elseif $desc.length > 2>>
-	Your arcology's mature culture is capable of exerting great cultural sway over other arcologies. It can readily project $desc[0],
-	<<for $i = 1; $i < $desc.length; $i++>>
-		<<if $i < $desc.length-1>>
-			$desc[$i],
-		<<else>>
-			and $desc[$i].
-		<</if>>
-	<</for>>
-<<elseif $desc.length == 2>>
-	Your arcology's culture is capable of exerting some cultural sway over other arcologies. It can effectively project $desc[0] and $desc[1].
-<<else>>
-	Your arcology's culture is capable of starting to exert cultural sway over other arcologies. It can project $desc[0].
-<</if>>
-<br>
-
-<<for _currentNeighbor = 1; _currentNeighbor < $arcologies.length; _currentNeighbor++>>
-<<set _Agent = App.currentAgent(_currentNeighbor)>>
-<<capture _currentNeighbor, _Agent>>
-	<<set $arcologies[_currentNeighbor].prosperity = Math.clamp($arcologies[_currentNeighbor].prosperity, 1, 300)>>
-	<br>You own $arcologies[_currentNeighbor].PCminority% of
-	<<link "$arcologies[_currentNeighbor].name">>
-	<<replace "#Security">> <<set $activeArcologyIdx = _currentNeighbor>>
-	<br>[[Back to the main diplomacy page|Neighbor Interact]]
-	<<set $i = _currentNeighbor>> <<include "Neighbor Description">> <br>
-
-		<<set _ownershipCost = 500*Math.trunc($arcologies[_currentNeighbor].prosperity*(1+($arcologies[_currentNeighbor].demandFactor/100)))>>
-		<br>A 1% interest in this arcology is worth <<print cashFormat(_ownershipCost)>>.
-		<<if ($arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 100)>>
-			The transaction fee is <<print cashFormat(10000)>>.
-		<</if>>
-		<<if ($arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 100)>>
-			<br>&nbsp;
-			<<link "Buy" "Neighbor Interact">>
-				<<run cashX(forceNeg(_ownershipCost), "war")>>
-				<<run cashX(-10000, "war")>>
-				<<set $arcologies[_currentNeighbor].PCminority += 1>>
-				<<set $arcologies[_currentNeighbor].demandFactor += 2>>
-			<</link>>
-			<<if ($arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority <= 90)>>
-				<<if $cash > _ownershipCost*10>>
-					| <<link "10%" "Neighbor Interact">>
-						<<run cashX(forceNeg(_ownershipCost*10), "war")>>
-						<<run cashX(-10000, "war")>>
-						<<set $arcologies[_currentNeighbor].PCminority += 10>>
-						<<set $arcologies[_currentNeighbor].demandFactor += 20>>
-					<</link>>
-					//Transaction costs will only be paid once.//
-				<</if>>
-			<</if>>
-		<</if>>
-
-		<<if $arcologies[_currentNeighbor].PCminority > 0>>
-			<br>&nbsp;
-			<<link "Sell" "Neighbor Interact">>
-				<<run cashX(_ownershipCost, "war")>>
-				<<set $arcologies[_currentNeighbor].PCminority -= 1>>
-				<<set $arcologies[_currentNeighbor].demandFactor -= 2>>
-				<<if $arcologies[_currentNeighbor].government != "your agent" && $arcologies[_currentNeighbor].government != "your trustees" && $arcologies[_currentNeighbor].rival != 1>>
-					<<if $arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 10>>
-						<<set $arcologies[_currentNeighbor].ownership += 10>>
-					<</if>>
-				<</if>>
-			<</link>>
-			<<if $arcologies[_currentNeighbor].PCminority >= 10>>
-				| <<link "10%" "Neighbor Interact">>
-					<<run cashX((_ownershipCost*10), "war")>>
-					<<set $arcologies[_currentNeighbor].PCminority -= 10>>
-					<<set $arcologies[_currentNeighbor].demandFactor -= 20>>
-					<<if $arcologies[_currentNeighbor].government != "your agent" && $arcologies[_currentNeighbor].government != "your trustees" && $arcologies[_currentNeighbor].rival != 1>>
-						<<if $arcologies[_currentNeighbor].ownership + $arcologies[_currentNeighbor].PCminority + $arcologies[_currentNeighbor].minority < 10>>
-							<<set $arcologies[_currentNeighbor].ownership += 10>>
-						<</if>>
-					<</if>>
-			<</link>>
-			<</if>>
-		<</if>>
-		<br>
-
-		<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].embargoTarget>>
-			<br>[[Target them for economic warfare|Neighbor Interact][$arcologies[0].embargoTarget = $arcologies[_currentNeighbor].direction]]
-		<</if>>
-
-		<<if $PC.skill.hacking > 0>>
-			<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].CyberEconomicTarget>>
-				<br>[[Target them for cyber economic warfare|Neighbor Interact][$arcologies[0].CyberEconomicTarget = $arcologies[_currentNeighbor].direction]]
-			<</if>>
-			<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].CyberReputationTarget>>
-				<br>[[Target their leadership for character assassination|Neighbor Interact][$arcologies[0].CyberReputationTarget = $arcologies[_currentNeighbor].direction]]
-			<</if>>
-		<</if>>
-		<<if $desc.length > 0>>
-			<<if $arcologies[_currentNeighbor].direction !== $arcologies[0].influenceTarget>>
-				<br>[[Set as influence target|Neighbor Interact][$arcologies[0].influenceTarget = $arcologies[_currentNeighbor].direction]]
-			<</if>>
-		<</if>>
-
-	<<if $arcologies[_currentNeighbor].government == "your trustees" || $arcologies[_currentNeighbor].government == "your agent">>
-		<br><br>
-		<<if $arcologies[_currentNeighbor].government == "your trustees">>
-			[[Appoint an agent|Agent Select]] <<set $him = "them">>
-		<<else>>
-			<<setLocalPronouns _Agent>>
-			Your agent @@.deeppink;<<= SlaveFullName(_Agent)>>@@ is running this arcology. <<link "Recall and reenslave $him" "Neighbor Interact">><<run removeJob(_Agent, "be your agent")>><</link>>
-		<</if>>
-		<span id="rename"> | <<link "Instruct $him to rename the arcology">><<replace #rename>> | <<textbox "$arcologies[$activeArcologyIdx].name" $arcologies[$activeArcologyIdx].name>> [[Confirm name|Neighbor Interact]]<</replace>><</link>></span>
-		<<if $arcologies[_currentNeighbor].government === "your agent">>
-			<br>$His <<if _Agent.intelligence > 95>>brilliance<<else>>intelligence<</if>> and education are the most important qualities for $him.
-			<<if _Agent.actualAge > 35>>
-				As with the Head Girl position, $his age and experience lend $him leadership weight.
-			<</if>>
-			<<if _Agent.career == "an arcology owner">>
-				$His career as an arcology owner $himself is, obviously, useful to $him.
-			<<elseif setup.HGCareers.includes(_Agent.career)>>
-				$His career in leadership helps $him.
-			<</if>>
-			<<if _Agent.fetishStrength > 95>>
-				<<if (_Agent.fetish == "dom") || (_Agent.fetish == "sadist")>>
-					$His sexually dominant fetish helps $him fill a leadership role.
-				<<elseif (_Agent.fetish == "submissive") || (_Agent.fetish == "masochist")>>
-					Unfortunately, $he has an inappropriate fetish for a leader.
-				<<else>>
-					$His sexual fetishes will influence how $he leads the arcology.
-				<</if>>
-			<</if>>
-			<<if _Agent.energy > 95>>
-				Finally, $his sexual depravity lets $him fit into arcology society naturally.
-			<</if>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSubjugationist != "unset">>
-			<br><<link "Force Abandonment of Racial Subjugation" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSubjugationist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSupremacist != "unset">>
-			<br><<link "Force Abandonment of Racial Supremacy" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSupremacist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSRepopulationFocus != "unset">>
-			<br><<link "Force Abandonment of Repopulationism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSRepopulationFocus = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSRestart != "unset">>
-			<br><<link "Force Abandonment of Eugenics" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSRestart = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSGenderRadicalist != "unset">>
-			<br><<link "Force Abandonment of Gender Radicalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSGenderRadicalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSIntellectualDependency != "unset">>
-			<br><<link "Force Abandonment of Intellectual Dependency" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSIntellectualDependency = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSlaveProfessionalism != "unset">>
-			<br><<link "Force Abandonment of Slave Professionalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSlaveProfessionalism = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSGenderFundamentalist != "unset">>
-			<br><<link "Force Abandonment of Gender Fundamentalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSGenderFundamentalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPaternalist != "unset">>
-			<br><<link "Force Abandonment of Paternalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPaternalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSDegradationist != "unset">>
-			<br><<link "Force Abandonment of Degradationism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSDegradationist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSBodyPurist != "unset">>
-			<br><<link "Force Abandonment of Body Purism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSBodyPurist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSTransformationFetishist != "unset">>
-			<br><<link "Force Abandonment of Transformation Fetishism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSTransformationFetishist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSYouthPreferentialist != "unset">>
-			<br><<link "Force Abandonment of Youth Preferentialism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSYouthPreferentialist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSMaturityPreferentialist != "unset">>
-			<br><<link "Force Abandonment of Maturity Preferentialism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSMaturityPreferentialist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPetiteAdmiration != "unset">>
-			<br><<link "Force Abandonment of Petite Admiration" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPetiteAdmiration = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSStatuesqueGlorification != "unset">>
-			<br><<link "Force Abandonment of Statuesque Glorification" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSStatuesqueGlorification = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSSlimnessEnthusiast != "unset">>
-			<br><<link "Force Abandonment of Slimness Enthusiasm" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSSlimnessEnthusiast = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSAssetExpansionist != "unset">>
-			<br><<link "Force Abandonment of Asset Expansionism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSAssetExpansionist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPastoralist != "unset">>
-			<br><<link "Force Abandonment of Pastoralism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPastoralist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSCummunism != "unset">>
-			<br><<link "Force Abandonment of Cummunism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSCummunism = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSPhysicalIdealist != "unset">>
-			<br><<link "Force Abandonment of Physical Idealism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSPhysicalIdealist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSHedonisticDecadence != "unset">>
-			<br><<link "Force Abandonment of Hedonistic Decadence" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSHedonisticDecadence = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSIncestFetishist != "unset">>
-			<br><<link "Force Abandonment of Incest Fetishism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSIncestFetishist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSChattelReligionist != "unset">>
-			<br><<link "Force Abandonment of Chattel Religionism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSChattelReligionist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSRomanRevivalist != "unset">>
-			<br><<link "Force Abandonment of Roman Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSRomanRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSAztecRevivalist !== "unset">>
-			<br><<link "Force Abandonment of Aztec Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSAztecRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSEgyptianRevivalist != "unset">>
-			<br><<link "Force Abandonment of Egyptian Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSEgyptianRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSEdoRevivalist != "unset">>
-			<br><<link "Force Abandonment of Edo Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSEdoRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSArabianRevivalist != "unset">>
-			<br><<link "Force Abandonment of Arabian Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSArabianRevivalist = "unset">><</link>>
-		<</if>>
-		<<if $arcologies[_currentNeighbor].FSChineseRevivalist != "unset">>
-			<br><<link "Force Abandonment of Chinese Revivalism" "Neighbor Interact">><<set $arcologies[_currentNeighbor].FSChineseRevivalist = "unset">><</link>>
-		<</if>>
-	<</if>>
-
-	<br><br>
-	If $arcologies[_currentNeighbor].name has developed enough to begin exporting worthwhile goods, it may be of interest to acquire some.
-	<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-		Since it is under your control, it is no problem at all to request the transfer of goods to $arcologies[0].name.
-	<<elseif $PC.skill.hacking >= 50>>
-		It is within your skills to redirect an outgoing shipment to $arcologies[0].name for your retrieval.
-	<<elseif $arcologies[_currentNeighbor].direction === $arcologies[0].embargoTarget>>
-		Due to your active embargo, trade with $arcologies[_currentNeighbor].name is not possible.
-	<<else>>
-		<<set _opinion = ArcologyDiplomacy.opinion(_currentNeighbor, 0)>>
-		<<set _prices = _opinion*10>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSRomanRevivalist > 95>>
-		<<if !isItemAccessible.entry("a toga", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of togas" "Neighbor Interact">>
-					<<set $clothesBoughtToga = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of togas" "Neighbor Interact">>
-					<<set $clothesBoughtToga = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of togas" "Neighbor Interact">>
-					<<set $clothesBoughtToga = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough togas.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSEdoRevivalist > 95>>
-		<<if !isItemAccessible.entry("a kimono", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of kimonos" "Neighbor Interact">>
-					<<set $clothesBoughtKimono = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of kimonos" "Neighbor Interact">>
-					<<set $clothesBoughtKimono = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of kimonos" "Neighbor Interact">>
-					<<set $clothesBoughtKimono = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough kimonos.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSArabianRevivalist > 95>>
-		<<if !isItemAccessible.entry("harem gauze", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of silken harem garb" "Neighbor Interact">>
-					<<set $clothesBoughtHarem = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of silken harem garb" "Neighbor Interact">>
-					<<set $clothesBoughtHarem = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of silken harem garb" "Neighbor Interact">>
-					<<set $clothesBoughtHarem = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough silk.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSAztecRevivalist > 95>>
-		<<if !isItemAccessible.entry("a huipil", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of huipils" "Neighbor Interact">>
-					<<set $clothesBoughtHuipil = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of huipils" "Neighbor Interact">>
-					<<set $clothesBoughtHuipil = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of huipils" "Neighbor Interact">>
-					<<set $clothesBoughtHuipil = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough huipils.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSChineseRevivalist > 95>>
-		<<if !isItemAccessible.entry("a slutty qipao", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of qipaos" "Neighbor Interact">>
-					<<set $clothesBoughtQipao = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of qipaos" "Neighbor Interact">>
-					<<set $clothesBoughtQipao = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of qipaos" "Neighbor Interact">>
-					<<set $clothesBoughtQipao = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough skimpy qipaos.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSEgyptianRevivalist > 95>>
-		<<if !isItemAccessible.entry("ancient Egyptian", "collar")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of Egyptian necklace replicas" "Neighbor Interact">>
-					<<set $clothesBoughtEgypt = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of Egyptian necklace replicas" "Neighbor Interact">>
-					<<set $clothesBoughtEgypt = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of Egyptian necklace replicas" "Neighbor Interact">>
-					<<set $clothesBoughtEgypt = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough replicas of Egyptian necklaces.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSPaternalist > 95>>
-		<<if !isItemAccessible.entry("conservative clothing", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of conservative clothing" "Neighbor Interact">>
-					<<set $clothesBoughtConservative = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of conservative clothing" "Neighbor Interact">>
-					<<set $clothesBoughtConservative = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of conservative clothing" "Neighbor Interact">>
-					<<set $clothesBoughtConservative = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough modest clothing.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSDegradationist > 95>>
-		<<if !isItemAccessible.entry("chains", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of binding chains" "Neighbor Interact">>
-					<<set $clothesBoughtChains = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of binding chains" "Neighbor Interact">>
-					<<set $clothesBoughtChains = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of binding chains" "Neighbor Interact">>
-					<<set $clothesBoughtChains = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough chains.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSGenderFundamentalist > 95>>
-		<<if !isItemAccessible.entry("a bunny outfit", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of bunny suits" "Neighbor Interact">>
-					<<set $clothesBoughtBunny = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of bunny suits" "Neighbor Interact">>
-					<<set $clothesBoughtBunny = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of bunny suits" "Neighbor Interact">>
-					<<set $clothesBoughtBunny = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough bunny suits and bowties.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSIntellectualDependency > 95>>
-		<<if !isItemAccessible.entry("a bimbo outfit", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of outfits suitable for bimbos" "Neighbor Interact">>
-					<<set $clothesBoughtBimbo = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of outfits suitable for bimbos" "Neighbor Interact">>
-					<<set $clothesBoughtBimbo = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of outfits suitable for bimbos" "Neighbor Interact">>
-					<<set $clothesBoughtBimbo = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough bimbo attire.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSSlaveProfessionalism > 95>>
-		<<if !isItemAccessible.entry("a courtesan dress", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of courtesan dresses" "Neighbor Interact">>
-					<<set $clothesBoughtCourtesan = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of courtesan dresses" "Neighbor Interact">>
-					<<set $clothesBoughtCourtesan = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of courtesan dresses" "Neighbor Interact">>
-					<<set $clothesBoughtCourtesan = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough courtesan dresses.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	/*
-	<<if $arcologies[_currentNeighbor].FSPetiteAdmiration > 95>>
-		<<if !isItemAccessible.entry("temp", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of petite-sized dresses" "Neighbor Interact">>
-					<<set $clothesBoughtPetite = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of petite-sized dresses" "Neighbor Interact">>
-					<<set $clothesBoughtPetite = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of petite-sized dresses" "Neighbor Interact">>
-					<<set $clothesBoughtPetite = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough temp.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	*/
-	<<if $arcologies[_currentNeighbor].FSPhysicalIdealist > 95>>
-		<<if !isItemAccessible.entry("body oil", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of body oil" "Neighbor Interact">>
-					<<set $clothesBoughtOil = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of body oil" "Neighbor Interact">>
-					<<set $clothesBoughtOil = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of body oil" "Neighbor Interact">>
-					<<set $clothesBoughtOil = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough body oil.
-		<</if>>
-		<<set _exports = 1>>
-	<<elseif $arcologies[_currentNeighbor].FSHedonisticDecadence > 95>>
-		<<if !isItemAccessible.entry("stretch pants and a crop-top", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of stretch pants and crop-tops" "Neighbor Interact">>
-					<<set $clothesBoughtLazyClothes = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of stretch pants and crop-tops" "Neighbor Interact">>
-					<<set $clothesBoughtLazyClothes = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of stretch pants and crop-tops" "Neighbor Interact">>
-					<<set $clothesBoughtLazyClothes = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough elastic waistbands and tight tops.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSChattelReligionist > 95>>
-		<<if !isItemAccessible.entry("a chattel habit", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of chattel religionist habits" "Neighbor Interact">>
-					<<set $clothesBoughtHabit = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of chattel religionist habits" "Neighbor Interact">>
-					<<set $clothesBoughtHabit = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of chattel religionist habits" "Neighbor Interact">>
-					<<set $clothesBoughtHabit = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough chattel religionist habits.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSPastoralist > 95>>
-		<<if !isItemAccessible.entry("Western clothing", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of Western clothing" "Neighbor Interact">>
-					<<set $clothesBoughtWestern = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of Western clothing" "Neighbor Interact">>
-					<<set $clothesBoughtWestern = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of Western clothing" "Neighbor Interact">>
-					<<set $clothesBoughtWestern = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough rancher outfits.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSRepopulationFocus > 95>>
-		<<if !isItemAccessible.entry("a maternity dress", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of maternity clothing" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityDress = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of maternity clothing" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityDress = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of maternity clothing" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityDress = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough maternity dresses.
-		<</if>>
-		<<if !isItemAccessible.entry("attractive lingerie for a pregnant woman", "clothing")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of maternity lingerie" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityLingerie = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of maternity lingerie" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityLingerie = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of maternity lingerie" "Neighbor Interact">>
-					<<set $clothesBoughtMaternityLingerie = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough lingerie suited for pregnant women.
-		<</if>>
-		<<if !isItemAccessible.entry("a small empathy belly", "bellyAccessory")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of empathy bellies" "Neighbor Interact">>
-					<<set $clothesBoughtBelly = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of empathy bellies" "Neighbor Interact">>
-					<<set $clothesBoughtBelly = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of empathy bellies" "Neighbor Interact">>
-					<<set $clothesBoughtBelly = 1>>
-					<<run cashX(forceNeg(Math.trunc((15000-(_prices*2))*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc(15000-(_prices*2)))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough fake baby bumps.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if $arcologies[_currentNeighbor].FSStatuesqueGlorification > 95>>
-		<<if !isItemAccessible.entry("platform heels", "shoes")>>
-			<<if ($arcologies[_currentNeighbor].government == "your trustees") || ($arcologies[_currentNeighbor].government == "your agent")>>
-				<br><<link "Request a shipment of height boosting footwear" "Neighbor Interact">>
-					<<set $shoesBoughtHeels = 1>>
-				<</link>>
-			<<elseif $PC.skill.hacking >= 50>>
-				<br><<link "Divert an outgoing shipment of height boosting footwear" "Neighbor Interact">>
-					<<set $shoesBoughtHeels = 1>>
-				<</link>>
-			<<elseif $arcologies[_currentNeighbor].direction != $arcologies[0].embargoTarget>>
-				<br><<link "Purchase a shipment of height boosting footwear" "Neighbor Interact">>
-					<<set $shoesBoughtHeels = 1>>
-					<<run cashX(forceNeg(Math.trunc((7500-_prices)*$upgradeMultiplierTrade)), "capEx")>>
-				<</link>> //Will cost <<print cashFormat(Math.trunc((7500-_prices)*$upgradeMultiplierTrade))>>//
-			<</if>>
-		<<else>>
-			<br>You already have enough varieties of platform shoe.
-		<</if>>
-		<<set _exports = 1>>
-	<</if>>
-	<<if _exports != 1>>
-		<<if $arcologies[_currentNeighbor].direction == $arcologies[0].embargoTarget>>
-			Fortunately,
-		<<else>>
-			Unfortunately,
-		<</if>>
-		they have nothing of value.
-	<</if>>
-
-	<</replace>>
-	<</link>>
-	which has an estimated GSP of @@.yellowgreen;<<print cashFormat(Math.trunc((0.1*$arcologies[_currentNeighbor].prosperity*random(100-$economicUncertainty,100+$economicUncertainty))/100))>>m@@ and is run by
-	<<if $arcologies[_currentNeighbor].government !== "your agent">>
-		$arcologies[_currentNeighbor].government who own $arcologies[_currentNeighbor].ownership%.
-	<<else>>
-		your agent:
-		<<set _residentList = [_Agent.ID]>>
-		<<set _agentPartner = $slaves.find((s) => s.assignment === Job.AGENTPARTNER && s.relationshipTarget === _Agent.ID)>>
-		<<if _agentPartner>>
-			<<run _residentList.push(_agentPartner.ID)>>
-		<</if>>
-		<<= App.UI.SlaveList.render.listMarkup(
-			_residentList,
-			[],
-			App.UI.SlaveList.SlaveInteract.stdInteract
-		)>>
-	<</if>>
-<</capture>>
-<</for>>
-</span>
diff --git a/src/uncategorized/neighborsDevelopment.tw b/src/uncategorized/neighborsDevelopment.tw
index 266655e7b0318633d9df4b046d44f3e34125f816..2bd868154ebf5a215c6cdb158e79b5afa6c94c40 100644
--- a/src/uncategorized/neighborsDevelopment.tw
+++ b/src/uncategorized/neighborsDevelopment.tw
@@ -239,16 +239,7 @@ has an estimated GSP of @@.yellowgreen;<<print cashFormat(_prosperity)>><<if $sh
 <<if $arcologies[$i].direction != 0>>
 
 /* AI ARCOLOGY SHARE BUYING AND SELLING */
-<<if $arcologies[$i].direction == 0>>
-	<<set $economicUncertainty = 5>>
-<<else>>
-	<<set $economicUncertainty = 10>>
-<</if>>
-<<if $assistant.power > 1>>
-	<<set $economicUncertainty = 0>>
-<<elseif $assistant.power == 1>>
-	<<set $economicUncertainty = Math.max(Math.trunc($economicUncertainty/2),0)>>
-<</if>>
+<<set _economicUncertainty = App.Utils.economicUncertainty($i)>>
 <<if $arcologies[$i].government != "your agent">>
 	<<if $arcologies[$i].government != "your trustees">>
 		<<if $arcologies[$i].minority + $arcologies[$i].ownership + $arcologies[$i].PCminority < 100>>
@@ -257,14 +248,14 @@ has an estimated GSP of @@.yellowgreen;<<print cashFormat(_prosperity)>><<if $sh
 				Its leadership acquires an increased share of its ownership.
 				<<set $arcologies[$i].ownership += 1>>
 				<<set $arcologies[$i].prosperity -= 5>>
-				This places its government in control of approximately @@.orange;<<print Math.trunc(($arcologies[$i].ownership*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition with a @@.tan;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.
+				This places its government in control of approximately @@.orange;<<print Math.trunc($arcologies[$i].ownership*_economicUncertainty)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition with a @@.tan;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty)>>%@@ share<</if>>.
 			<<elseif _prosperityDiff < random(-50,10)>>
 				<<if $arcologies[$i].ownership > 0>>
 					<<if $arcologies[$i].rival != 1 || ($arcologies[$i].rival == 1 && $arcologies[$i].ownership > 51 && random(1,2) == 1)>>
 						Its leadership sells off some of its ownership to stay afloat.
 						<<set $arcologies[$i].ownership -= 1>>
 						<<set $arcologies[$i].prosperity += 5>>
-						This leaves its government in control of approximately @@.orange;<<print Math.trunc(($arcologies[$i].ownership*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition, with a @@.tan;<<print Math.trunc(($arcologies[$i].minority*random(100-$economicUncertainty,100+$economicUncertainty))/100)>>%@@ share<</if>>.
+						This leaves its government in control of approximately @@.orange;<<print Math.trunc($arcologies[$i].ownership*_economicUncertainty)>>%@@ of the arcology<<if $arcologies[$i].minority > 0>>, against its most prominent competition, with a @@.tan;<<print Math.trunc($arcologies[$i].minority*_economicUncertainty>>%@@ share<</if>>.
 					<</if>>
 				<</if>>
 			<</if>>
@@ -426,7 +417,7 @@ has an estimated GSP of @@.yellowgreen;<<print cashFormat(_prosperity)>><<if $sh
 <<if $arcologies[$i].direction != 0>>
 	<<run FutureSocieties.applyBroadProgress($i, _efficiency)>>
 <</if>>
-<<set _passive = new ArcologyFSPassiveInfluence($i)>>
+<<set _passive = new App.Neighbor.PassiveFSInfluence($i)>>
 <<if $arcologies[$i].FSSupremacist != "unset">>
 	<<= _passive.output("FSSupremacist")>>
 	<<if $arcologies[$i].direction != 0>>
@@ -1780,7 +1771,7 @@ has an estimated GSP of @@.yellowgreen;<<print cashFormat(_prosperity)>><<if $sh
 
 <<if $arcologies[$i].direction != 0>>
 	<<if $arcologies[$i].influenceTarget == -1>>
-		<<run ArcologyDiplomacy.selectInfluenceTarget($i)>>
+		<<run App.Neighbor.selectInfluenceTarget($i)>>
 	<</if>>
 <</if>>
 
diff --git a/src/uncategorized/neighborsFSAdoption.tw b/src/uncategorized/neighborsFSAdoption.tw
index b044c7c478eac4cdf90486a6556225abfe662720..69cf45e9b1ea942ca78a741aed904a6aae5c5fea 100644
--- a/src/uncategorized/neighborsFSAdoption.tw
+++ b/src/uncategorized/neighborsFSAdoption.tw
@@ -871,7 +871,7 @@ societal development.
 			<<set _influenceBonus = 20>>
 		<</if>>
 
-		<<set _opinion = ArcologyDiplomacy.opinion($i, $j)>>
+		<<set _opinion = App.Neighbor.opinion($i, $j)>>
 		<<if _opinion >= 50>>
 			$arcologies[$i].name is aligned with $arcologies[$j].name socially, encouraging it to consider adopting all its cultural values.
 			<<set _influenceBonus += _opinion-50>>
diff --git a/src/uncategorized/slaveMarkets.tw b/src/uncategorized/slaveMarkets.tw
index 070a4756e2f9d0c05ab9e7c037e7528d400f61ad..afa58266093315505f82989dc9f89f1a8981c3c5 100644
--- a/src/uncategorized/slaveMarkets.tw
+++ b/src/uncategorized/slaveMarkets.tw
@@ -139,7 +139,7 @@ You visit the slave markets off the arcology plaza. It's always preferable to ex
 
 <<case "neighbor">>
 	You're in the area of the slave market that specializes in slaves from within the Free City, viewing slaves from ''<<print "$arcologies[$numArcology].name">>''. Some were trained there, specifically for sale, while others are simply being sold.
-	<<set _opinion = ArcologyDiplomacy.opinion(0, $numArcology)>>
+	<<set _opinion = App.Neighbor.opinion(0, $numArcology)>>
 	<<if _opinion != 0>>
 		<<set _slaveCost -= Math.trunc(_slaveCost*_opinion*0.05)>>
 		<<if _opinion > 2>>