diff --git a/src/endWeek/economics/arcmgmt.js b/src/endWeek/economics/arcmgmt.js
index 18d65bc6f54450832cf745091d75fcc2a01bf88b..fef8be08a884c1d9d7c7d8dba98ab4d6b22c5314 100644
--- a/src/endWeek/economics/arcmgmt.js
+++ b/src/endWeek/economics/arcmgmt.js
@@ -1122,21 +1122,13 @@ App.EndWeek.arcManagement = function() {
 			lowerClassP *= 1.01;
 			middleClass += 40;
 			middleClassP *= 1.005;
-			upperClass += -13.5;
-			upperClassP *= 0.995;
-			topClass += -5;
-			topClassP *= 0.99;
-			r.push(`The rent promotion for new immigrants brings new citizens to the arcology.`);
+			r.push(`The rent promotion for new immigrants brings new citizens to the arcology, especially lower-income ones.`);
 		}
 		if (V.policies.immigrationRep === 1) {
-			lowerClass += 200;
-			lowerClassP *= 1.01;
-			middleClass += 40;
-			middleClassP *= 1.005;
-			upperClass += -13.5;
-			upperClassP *= 0.995;
-			topClass += -5;
-			topClassP *= 0.99;
+			upperClass += 15;
+			upperClassP *= 1.01;
+			topClass += 5;
+			topClassP *= 1.01;
 			r.push(`Your welcome program for new citizens helps encourage wealthy people from the old world to immigrate, but <span class="red">annoys some longstanding citizens.</span>`);
 			repX(forceNeg(100), "policies");
 		}
@@ -1145,10 +1137,10 @@ App.EndWeek.arcManagement = function() {
 			lowerClassP *= 0.99;
 			middleClass += -40;
 			middleClassP *= 0.995;
-			upperClass += 13.5;
-			upperClassP *= 1.005;
-			topClass += 5;
-			topClassP *= 1.01;
+			upperClass += -13.5;
+			upperClassP *= 0.995;
+			topClass += -5;
+			topClassP *= 0.99;
 			const informationCash = random(500, 1500);
 			cashX(informationCash, "policies");
 			r.push(`You covertly <span class="yellowgreen">sell</span> the private information of potential arcology immigrants on the old world black market, making you ${cashFormat(informationCash)}.`);
@@ -1158,10 +1150,10 @@ App.EndWeek.arcManagement = function() {
 			lowerClassP *= 0.99;
 			middleClass += -40;
 			middleClassP *= 0.995;
-			upperClass += 13.5;
-			upperClassP *= 1.005;
-			topClass += 5;
-			topClassP *= 1.01;
+			upperClass += -13.5;
+			upperClassP *= 0.995;
+			topClass += -5;
+			topClassP *= 0.99;
 			r.push(`You allow citizens input on potential immigrants, a <span class="green">popular</span> program.`);
 			repX(100, "policies");
 		}
diff --git a/src/endWeek/reports/personalAttention.js b/src/endWeek/reports/personalAttention.js
index 8059cc8bfb0b369406c145bd2c23bae44157b106..0f4856c67014b49bf1525db68e50cf7aa812dee8 100644
--- a/src/endWeek/reports/personalAttention.js
+++ b/src/endWeek/reports/personalAttention.js
@@ -3944,7 +3944,7 @@ App.PersonalAttention.slaveReport = function(slave) {
 			} else {
 				r.push(`${He} becomes`);
 				r.push(App.UI.DOM.makeElement("span", `sexually self hating,`, ["yellow"]));
-				r.push(`and tearfully begs to you do worse to ${him}, no matter how bad it gets.`);
+				r.push(`and tearfully begs you to do worse to ${him}, no matter how bad it gets.`);
 				slave.sexualFlaw = SexualFlaw.SELFHATING;
 				r.push(basicTrainingDefaulter(slave));
 			}
diff --git a/src/endWeek/saSocialEffects.js b/src/endWeek/saSocialEffects.js
index 5f033680e06962a9c8c6e1f091504240a857402d..388169d29ccfd338363c78d9436e816ae3b175d1 100644
--- a/src/endWeek/saSocialEffects.js
+++ b/src/endWeek/saSocialEffects.js
@@ -286,14 +286,6 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 				t.push(new SocialEffect("Repopulationist", 1, "Birth tattoos",
 					`Society <span class="green">is pleased</span> by the tally of successful births adorning ${his} skin.`));
 			}
-		} else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1) {
-			if (slave.preg > 30) {
-				t.push(new SocialEffect("", 1, "Advanced pregnancy (Repopulation Policy)",
-					`Society <span class="green">loves</span> ${slave.slaveName}'s advanced pregnancy. It's very trendy.`));
-			} else if (slave.bellyPreg >= 1500) {
-				t.push(new SocialEffect("", 0.5, "Big pregnant belly (Repopulation Policy)",
-					`Society <span class="green">enjoys</span> ${slave.slaveName}'s pregnancy. Being heavy with child is in right now.`));
-			}
 		} else if (FutureSocieties.isActive('FSRestart')) {
 			if (slave.chastityVagina) {
 				t.push(new SocialEffect("Eugenics", 1, "Vaginal chastity",
@@ -369,6 +361,14 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 				t.push(new SocialEffect("Eugenics", 2, "Castrated",
 					`Society <span class="green">approves</span> of ${his} lack of testicles.`));
 			}
+		} else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1) {
+			if (slave.preg > 30) {
+				t.push(new SocialEffect("", 1, "Advanced pregnancy (Repopulation Policy)",
+					`Society <span class="green">loves</span> ${slave.slaveName}'s advanced pregnancy. It's very trendy.`));
+			} else if (slave.bellyPreg >= 1500) {
+				t.push(new SocialEffect("", 0.5, "Big pregnant belly (Repopulation Policy)",
+					`Society <span class="green">enjoys</span> ${slave.slaveName}'s pregnancy. Being heavy with child is in right now.`));
+			}
 		}
 		if (V.arcologies[0].FSRepopulationFocusMilfPolicy === 1 && slave.counter.birthsTotal > 0) {
 			t.push(new SocialEffect("", 1, "MILF Policy",
diff --git a/src/futureSocieties/fsPassage.js b/src/futureSocieties/fsPassage.js
index 785b4dfd1343da09b8116125164225e7422feac0..cc293ece6739b74fe7a08ed51df11738c2bba505 100644
--- a/src/futureSocieties/fsPassage.js
+++ b/src/futureSocieties/fsPassage.js
@@ -388,6 +388,31 @@ App.UI.fsPassage = function() {
 		}
 		avg /= V.slaves.length;
 
+		const grid2 = document.createElement("div");
+		grid2.classList.add("grid-2columns-auto");
+		let someoneHasOpinion = false;
+		for (const neighbor of V.arcologies) {
+			const opinion = FutureSocieties.adoptionOpinion(proposedFS, neighbor);
+			if (opinion) {
+				App.UI.DOM.appendNewElement("div", grid2, neighbor.name);
+				switch (opinion) {
+					case -2:
+						App.UI.DOM.appendNewElement("div", grid2, "Anathema", ["red"]);
+						break;
+					case -1:
+						App.UI.DOM.appendNewElement("div", grid2, "Opposes", ["orange"]);
+						break;
+					case 1:
+						App.UI.DOM.appendNewElement("div", grid2, "Favors", ["yellowgreen"]);
+						break;
+					case 2:
+						App.UI.DOM.appendNewElement("div", grid2, "Supports", ["green"]);
+						break;
+				}
+				someoneHasOpinion = true;
+			}
+		}
+
 		const tip = document.createElement('div');
 		tip.classList.add("tip-details");
 		if (avg > 1.5) {
@@ -400,6 +425,10 @@ App.UI.fsPassage = function() {
 			tip.appendChild(document.createTextNode(`Attempting to adopt ${FutureSocieties.displayName(proposedFS)} with your arcology in its current state will likely result in failure. You should strongly consider aligning your slaves with ${FutureSocieties.displayAdj(proposedFS)} goals before endorsing it.`));
 		}
 		tip.append(grid);
+		if (someoneHasOpinion) {
+			tip.appendChild(document.createTextNode(`Some of your neighbors may try to help or hinder adoption of ${FutureSocieties.displayName(proposedFS)}. Here's what they think right now:`));
+			tip.append(grid2);
+		}
 
 		const span = document.createElement("span");
 		span.classList.add("fs-recommend");
diff --git a/src/futureSocieties/futureSociety.js b/src/futureSocieties/futureSociety.js
index a37fd894f2d5696f54da99a498573d47585fabe0..875f112eb2266b7a358eeb51dca2b32c6d53b2be 100644
--- a/src/futureSocieties/futureSociety.js
+++ b/src/futureSocieties/futureSociety.js
@@ -32,6 +32,7 @@ globalThis.FutureSocieties = (function() {
 		policyActive,
 		advance,
 		humanVector,
+		adoptionOpinion,
 	};
 
 	/** get the list of FSes active for a particular arcology
@@ -140,6 +141,35 @@ globalThis.FutureSocieties = (function() {
 		return societies;
 	}
 
+	/**
+	 * Determine a given neighbor's opinion of whether the player should adopt an FS.
+	 * @param {FC.FutureSociety} fs
+	 * @param {FC.ArcologyState} arc
+	 * @returns {number} -2: actively opposes, -1: opposes, 0: no opinion, 1: supports, 2: actively supports
+	 */
+	function adoptionOpinion(fs, arc) {
+		if (fs === "FSSupremacist" || fs === "FSSubjugationist") {
+			return 0; // we can't tell whether an arcology would support or oppose racial FSes without knowing the race the player will choose
+		}
+		const neighborFSes = activeFSes(arc);
+		if (neighborFSes.includes(fs)) {
+			if (fs !== "FSNull" && arc[fs] > 60) {
+				return 2; // will actively support the FS
+			} else {
+				return 1; // working toward the same FS but won't actively support it for now
+			}
+		}
+		const conflictingFS = neighborFSes.find(nfs => conflictingFSes(fs, nfs));
+		if (conflictingFS) {
+			if (arc[conflictingFS] > 60) {
+				return -2; // will actively oppose the FS
+			} else {
+				return -1; // working towards an opposing FS but won't actively resist it for now
+			}
+		}
+		return 0;
+	}
+
 	/**
 	 * Returns the set of shared FSes between two arcologies, and the set of conflicts between pairs of FSes between the arcologies.
 	 * Relatively expensive, try not to call frequently.