diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts
index 19c0f79fbcc87ee64d8e3b3912141584e2d10edc..46779cb572d3dcc6ea6f0322200434680a81b0e5 100644
--- a/devTools/FC.d.ts
+++ b/devTools/FC.d.ts
@@ -42,6 +42,10 @@ declare namespace App {
 	namespace Debug {}
 	namespace Desc {}
 
+	namespace Encyclopedia {
+		namespace Entries {}
+	}
+
 	namespace Entity {
 		class Serializable {}
 
diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js
index 7f6482afd104d9f214bd39cf9002e64c8796d2f4..c3a378971a317816924c8ba2f1e11da0f662b2c0 100644
--- a/js/002-config/fc-js-init.js
+++ b/js/002-config/fc-js-init.js
@@ -10,6 +10,8 @@ App.Arcology = {
 App.Art = {};
 App.Data = {};
 App.Debug = {};
+App.Encyclopedia = {};
+App.Encyclopedia.Entries = {};
 App.Entity = {};
 App.Entity.Utils = {};
 App.MainView = {};
diff --git a/src/gui/Encyclopedia/encyclopedia.css b/src/gui/Encyclopedia/encyclopedia.css
new file mode 100644
index 0000000000000000000000000000000000000000..9cd84398b514dfad886a5eef12650c5f4a6fc474
--- /dev/null
+++ b/src/gui/Encyclopedia/encyclopedia.css
@@ -0,0 +1,3 @@
+.encyclopedia.topic {
+	font-weight: bold;
+}
diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw
index 2761cbe3e19b0ff8ad7a7eca8738653fac8f429d..7c8e84581c9b9af829cd614a74de766c276d7209 100644
--- a/src/gui/Encyclopedia/encyclopedia.tw
+++ b/src/gui/Encyclopedia/encyclopedia.tw
@@ -867,56 +867,56 @@ SLAVE ASSIGNMENTS:
 SLAVE ASSIGNMENTS (COMMON):
 **********/
 <<case "Attending Classes">>
-	<<encyclopediaEntryAttendingClasses>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.attendingClasses(), "encyclasses")>>
 	//Associated facility: [[Schoolroom|Encyclopedia][$encyclopedia = "Schoolroom"]]//
 
 
 <<case "Confinement">>
-	<<encyclopediaEntryConfinement>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.confinement(), "encyconfine")>>
 	//Associated facility: [[Cellblock|Encyclopedia][$encyclopedia = "Cellblock"]]//
 
 
 <<case "Fucktoy">>
-	<<encyclopediaEntryFucktoy>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.fucktoy(), "encyfucktoy")>>
 	//Associated facility: [[Master Suite|Encyclopedia][$encyclopedia = "Master Suite"]]//
 
 
 <<case "Glory Hole">>
-	<<encyclopediaEntryGloryHole>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.gloryHole(), "encyglory")>>
 	//Associated facility: [[Arcade|Encyclopedia][$encyclopedia = "Arcade"]]//
 
 
 <<case "Milking">>
-	<<encyclopediaEntryMilking>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.milking(), "encymilk")>>
 	//Associated facility: [[Dairy|Encyclopedia][$encyclopedia = "Dairy"]]//
 
 
 <<case "Farming">>
-	<<encyclopediaEntryFarming>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.farming(), "encyfarm")>>
 	//Associated facility: [[Farmyard|Encyclopedia][$encyclopedia = "Farmyard"]]//
 
 
 <<case "Public Service">>
-	<<encyclopediaEntryPublicService>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.publicService(), "encypublic")>>
 	//Associated facility: [[Club|Encyclopedia][$encyclopedia = "Club"]]//
 
 
 <<case "Rest">>
-	<<encyclopediaEntryRest>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.rest(), "encyrest")>>
 	//Associated facilities: [[Spa|Encyclopedia][$encyclopedia = "Spa"]], [[Clinic|Encyclopedia][$encyclopedia = "Clinic"]]//
 
 
 <<case "Sexual Servitude">>
-	<<encyclopediaEntrySexualServitude>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.sexualServitude(), "encysexServ")>>
 
 
 <<case "Servitude">>
-	<<encyclopediaEntryServitude>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.servitude(), "encyserve")>>
 	//Associated facility: [[Servants' Quarters|Encyclopedia][$encyclopedia = "Servants' Quarters"]]//
 
 
 <<case "Whoring">>
-	<<encyclopediaEntryWhoring>>
+	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.whoring(), "encywhore")>>
 	//Associated facility: [[Brothel|Encyclopedia][$encyclopedia = "Brothel"]]//
 
 /**********
diff --git a/src/gui/Encyclopedia/encyclopediaEntries.js b/src/gui/Encyclopedia/encyclopediaEntries.js
new file mode 100644
index 0000000000000000000000000000000000000000..89d2bcb9ceee87c6c9476f58bdac644b26534d15
--- /dev/null
+++ b/src/gui/Encyclopedia/encyclopediaEntries.js
@@ -0,0 +1,96 @@
+/* TODO: add entries for Nursery */
+
+App.Encyclopedia.Entries = (function() {
+	/**
+	 * @param {string} topic
+	 * @returns {HTMLElement}
+	 */
+	function topic(topic) {
+		return App.UI.DOM.makeElement("span", topic, ["encyclopedia", "topic"]);
+	}
+
+	/**
+	 * @param {string} linkText
+	 * @param {string} topic
+	 * @returns {HTMLElement}
+	 */
+	function encyLink(linkText, topic) {
+		return App.UI.DOM.passageLink(linkText, "Encyclopedia", () => {
+			V.encyclopedia = topic;
+			if (passage() === "Encyclopedia") {
+				V.nextButton = "Back";
+				V.nextLink = "Main";
+			}
+		});
+	}
+
+	const entries = {};
+
+	entries.attendingClasses = () =>
+		App.UI.DOM.combineNodes(topic("Attending classes"),
+			" is an assignment which educates the slave, raising intelligence if possible. Being educated raises value and is useful for some jobs and leadership positions.");
+
+	entries.confinement = () =>
+		App.UI.DOM.combineNodes(topic("Confinement"),
+			" is an assignment which accelerates breaking for disobedient slaves. If a slave isn't obedient enough to work and isn't ",
+			encyLink("unhealthy", "Health"), " enough to need rest, this will make them useful sooner.");
+
+	entries.fucktoy = () =>
+		App.UI.DOM.combineNodes(topic("Fucktoy service"),
+			" is an assignment which keeps the slave close and under the player's eye. It's mostly just for fun, but fucktoys can improve reputation based on their beauty, and the player character's attention can be targeted to areas of the slave's body with possible fetish effects on happy slaves.");
+
+	entries.gloryHole = () =>
+		App.UI.DOM.combineNodes(topic("Occupying a glory hole"),
+			" is an assignment which makes money off of slaves regardless of their beauty, skills, or feelings; it's not fun or ",
+			encyLink("healthy", "Health"), " but very powerful for extracting ¤ out of otherwise useless slaves.");
+
+	entries.milking = () => {
+		const fragment = document.createDocumentFragment();
+
+		fragment.append(topic("Getting milked"),
+			" is an assignment which makes money from lactation based on a slave's breasts, ", encyLink("health", "Health"),
+			" and hormonal status.");
+		if (V.seeDicks > 0) {
+			fragment.append(" Cows with balls will also give semen.");
+		}
+		fragment.append(` Creates profit quickly from slaves with big tits${V.seeDicks ? " or balls" : ""}.`);
+
+		return fragment;
+	};
+
+	entries.farming = function() {
+		const fragment = document.createDocumentFragment();
+		fragment.append(topic("Farming"), " is an assignment which produces ", encyLink("food", "Food"),
+			" from your slaves' hard work");
+		if (V.seeBestiality === 1) {
+			fragment.append(" and allows you to breed slaves with animals");
+		}
+		fragment.append(". Can also reduce arcology upkeep with upgrades in the ",
+			encyLink("Farmyard", "Farmyard"));
+		return fragment;
+	};
+
+	entries.publicService = () =>
+		App.UI.DOM.combineNodes(topic("Public Service"),
+			" is an assignment which increases reputation based on a slave's beauty, sexual appeal, and skills. Very similar to whoring, but for reputation rather than money.");
+
+	entries.rest = () =>
+		App.UI.DOM.combineNodes(topic("Rest"), " is an assignment mostly used to improve ", encyLink("health", "Health"),
+			". It can be useful to order slaves you wish to intensively modify to rest, since most modifications damage health. It will synergize with curative treatments, providing bonus healing when both are simultaneously applied.");
+
+
+	entries.sexualServitude = () =>
+		App.UI.DOM.combineNodes(topic("Sexual servitude"),
+			" is an assignment which pleases other slaves by forcing the slave to service them sexually. Useful for driving the targeted slave's ",
+			encyLink("devotion", "Devotion"), "up quickly.");
+
+	entries.servitude = () =>
+		App.UI.DOM.combineNodes(topic("Servitude"), " is an assignment which reduces your upkeep based on the slave's ",
+			encyLink("devotion", "Devotion"),
+			" Available at lower obedience than other jobs, is insensitive to the quality of a slave's body, and doesn't require skills; a good transitional assignment. Unusually, low sex drive is advantageous as a servant, since it reduces distraction. Lactating slaves are slightly better at this job, since they can contribute to their fellow slaves' nutrition.");
+
+	entries.whoring = () =>
+		App.UI.DOM.combineNodes(topic("Whoring"), " is an assignment which makes money based on a slave's beauty, sexual appeal, and skills. Good whores take a long time to train and beautify but become very profitable.");
+
+	return entries;
+})();
diff --git a/src/gui/Encyclopedia/encyclopediaWidgets.tw b/src/gui/Encyclopedia/encyclopediaWidgets.tw
deleted file mode 100644
index e8e0bca00256ac1afdb7bf7e4af1038f2784fa89..0000000000000000000000000000000000000000
--- a/src/gui/Encyclopedia/encyclopediaWidgets.tw
+++ /dev/null
@@ -1,94 +0,0 @@
-:: Encyclopedia Widgets [nobr widget]
-
-/* TODO: add entries for Nursery */
-
-<<widget "encyclopediaEntryAttendingClasses">>
-''Attending classes'' is an assignment which educates the slave, raising intelligence if possible. Being educated raises value and is useful for some jobs and leadership positions.
-<</widget>>
-
-<<widget "encyclopediaEntryConfinement">>
-''Confinement'' is an assignment which accelerates breaking for disobedient slaves. If a slave isn't obedient enough to work and isn't
-<<if passage() == "Encyclopedia">>
-	[[unhealthy|Encyclopedia][$encyclopedia = "Health"]]
-<<else>>
-	[[unhealthy|Encyclopedia][$encyclopedia = "Health",$nextButton = "Back",$nextLink = "Main"]]
-<</if>>
-enough to need rest, this will make them useful sooner.
-<</widget>>
-
-<<widget "encyclopediaEntryFucktoy">>
-''Fucktoy service'' is an assignment which keeps the slave close and under the player's eye. It's mostly just for fun, but fucktoys can improve reputation based on their beauty, and the player character's attention can be targeted to areas of the slave's body with possible fetish effects on happy slaves.
-<</widget>>
-
-<<widget "encyclopediaEntryGloryHole">>
-''Occupying a glory hole'' is an assignment which makes money off of slaves regardless of their beauty, skills, or feelings; it's not fun or
-<<if passage() == "Encyclopedia">>
-	[[healthy|Encyclopedia][$encyclopedia = "Health"]],
-<<else>>
-	[[healthy|Encyclopedia][$encyclopedia = "Health",$nextButton = "Back",$nextLink = "Main"]],
-<</if>>
-but very powerful for extracting ¤ out of otherwise useless slaves.
-<</widget>>
-
-<<widget "encyclopediaEntryMilking">>
-''Getting milked'' is an assignment which makes money from lactation based on a slave's breasts,
-<<if passage() == "Encyclopedia">>
-	[[health|Encyclopedia][$encyclopedia = "Health"]],
-<<else>>
-	[[health|Encyclopedia][$encyclopedia = "Health",$nextButton = "Back",$nextLink = "Main"]],
-<</if>>
-and hormonal status.<<if $seeDicks > 0>> Cows with balls will also give semen.<</if>> Creates profit quickly from slaves with big tits<<if $seeDicks > 0>> or balls<</if>>.
-<</widget>>
-
-<<widget "encyclopediaEntryFarming">>
-''Farming'' is an assignment which produces
-<<if passage() == "Encyclopedia">>
-	[[food|Encyclopedia][$encyclopedia = "Food"]]
-<<else>>
-	[[food|Encyclopedia][$encyclopedia = "Food",$nextButton = "Back",$nextLink = "Main"]]
-<</if>>
-from your slaves' hard work<<if $seeBestiality == 1>> and allows you to breed slaves with animals<</if>>. Can also reduce arcology upkeep with upgrades in the
-<<if passage() == "Encyclopedia">>
-	[[Farmyard|Encyclopedia][$encyclopedia = "Farmyard"]].
-<<else>>
-	[[Farmyard|Encyclopedia][$encyclopedia = "Farmyard",$nextButton = "Back",$nextLink = "Main"]].
-<</if>>
-<</widget>>
-
-<<widget "encyclopediaEntryPublicService">>
-''Public Service'' is an assignment which increases reputation based on a slave's beauty, sexual appeal, and skills. Very similar to whoring, but for reputation rather than money.
-<</widget>>
-
-<<widget "encyclopediaEntryRest">>
-''Rest'' is an assignment mostly used to improve
-<<if passage() == "Encyclopedia">>
-	[[health|Encyclopedia][$encyclopedia = "Health"]].
-<<else>>
-	[[health|Encyclopedia][$encyclopedia = "Health",$nextButton = "Back",$nextLink = "Main"]].
-<</if>>
-It can be useful to order slaves you wish to intensively modify to rest, since most modifications damage health. It will synergize with curative treatments, providing bonus healing when both are simultaneously applied.
-<</widget>>
-
-<<widget "encyclopediaEntrySexualServitude">>
-''Sexual servitude'' is an assignment which pleases other slaves by forcing the slave to service them sexually. Useful for driving the targeted slave's
-<<if passage() == "Encyclopedia">>
-	[[devotion|Encyclopedia][$encyclopedia = "Devotion"]]
-<<else>>
-	[[devotion|Encyclopedia][$encyclopedia = "Devotion",$nextButton = "Back",$nextLink = "Main"]]
-<</if>>
-up quickly.
-<</widget>>
-
-<<widget "encyclopediaEntryServitude">>
-''Servitude'' is an assignment which reduces your upkeep based on the slave's
-<<if passage() == "Encyclopedia">>
-	[[devotion|Encyclopedia][$encyclopedia = "Devotion"]].
-<<else>>
-	[[devotion|Encyclopedia][$encyclopedia = "Devotion",$nextButton = "Back",$nextLink = "Main"]].
-<</if>>
-Available at lower obedience than other jobs, is insensitive to the quality of a slave's body, and doesn't require skills; a good transitional assignment. Unusually, low sex drive is advantageous as a servant, since it reduces distraction. Lactating slaves are slightly better at this job, since they can contribute to their fellow slaves' nutrition.
-<</widget>>
-
-<<widget "encyclopediaEntryWhoring">>
-''Whoring'' is an assignment which makes money based on a slave's beauty, sexual appeal, and skills. Good whores take a long time to train and beautify but become very profitable.
-<</widget>>
\ No newline at end of file
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index 9e67529d96a1e51ff738758598ec8010786ced52..218f957b63a1cfffdeb9f9f2515de740263e6d2a 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -945,47 +945,48 @@ App.UI.SlaveList.penthousePage = function() {
 	 * @returns {string}
 	 */
 	function encycTips(jn) {
-		let r =`<span class="note">`;
+		const span = document.createElement("span");
+		span.classList.add("note");
 		if (V.showTipsFromEncy) {
 			switch (jn) {
 				case "rest":
-					r += `<<encyclopediaEntryRest>>`;
+					span.append(App.Encyclopedia.Entries.rest());
 					break;
 				case "chooseOwn":
 					break; /* no entry written for choose own */
 				case "fucktoy":
-					r += `<<encyclopediaEntryFucktoy>>`;
+					span.append(App.Encyclopedia.Entries.fucktoy());
 					break;
 				case "classes":
-					r += `<<encyclopediaEntryAttendingClasses>>`;
+					span.append(App.Encyclopedia.Entries.attendingClasses());
 					break;
 				case "houseServant":
-					r += `<<encyclopediaEntryServitude>>`;
+					span.append(App.Encyclopedia.Entries.servitude());
 					break;
 				case "whore":
-					r += `<<encyclopediaEntryWhoring>>`;
+					span.append(App.Encyclopedia.Entries.whoring());
 					break;
 				case "publicServant":
-					r += `<<encyclopediaEntryPublicService>>`;
+					span.append(App.Encyclopedia.Entries.publicService());
 					break;
 				case "subordinateSlave":
-					r += `<<encyclopediaEntrySexualServitude>>`;
+					span.append(App.Encyclopedia.Entries.sexualServitude());
 					break;
 				case "cow":
-					r += `<<encyclopediaEntryMilking>>`;
+					span.append(App.Encyclopedia.Entries.milking());
 					break;
 				case "gloryhole":
-					r += `<<encyclopediaEntryGloryHole>>`;
+					span.append(App.Encyclopedia.Entries.gloryHole());
 					break;
 				case "confinement":
-					r += `<<encyclopediaEntryConfinement>>`;
+					span.append(App.Encyclopedia.Entries.confinement());
 					break;
 				default:
-					r += `missing tip for this tab`;
+					span.append(App.UI.DOM.makeElement("span", "missing tip for this tab", "error"));
 					break;
 			}
 		}
-		return r += `</span>`;
+		return App.UI.DOM.includeDOM(span, "ency" + jn);
 	}
 
 	let r = '';