diff --git a/RimJobWorld.Main.csproj b/RimJobWorld.Main.csproj
index 4b6d21785d22ee6768757d0f9c0ad7738dc4af66..84342f8ce45411773e691ac761b94bccc192ff1c 100644
--- a/RimJobWorld.Main.csproj
+++ b/RimJobWorld.Main.csproj
@@ -43,9 +43,11 @@
     <RootNamespace>rjw</RootNamespace>
   </PropertyGroup>
   <ItemGroup>
-    <Compile Include="Source\Common\bondage_gear.cs" />
+    <Compile Include="Source\Harmony\patch_races.cs" />
+    <Compile Include="Source\Modules\Bondage\bondage_gear.cs" />
     <Compile Include="Source\Common\Breeder_Helper.cs" />
-    <Compile Include="Source\Common\BukkakeContent.cs" />
+    <Compile Include="Source\Modules\Multiplayer\Multiplayer.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\BukkakeContent.cs" />
     <Compile Include="Source\Common\config.cs" />
     <Compile Include="Source\Common\CORE_EXPOSED\CORE_EXPOSED.cs" />
     <Compile Include="Source\Common\DataStore.cs" />
@@ -56,72 +58,72 @@
     <Compile Include="Source\Common\PartsData.cs" />
     <Compile Include="Source\Common\PawnData.cs" />
     <Compile Include="Source\Common\CORE_EXPOSED\PawnGenerator.cs" />
-    <Compile Include="Source\Common\Pregnancy_Helper.cs" />
-    <Compile Include="Source\Common\SemenHelper.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Pregnancy_Helper.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\SemenHelper.cs" />
     <Compile Include="Source\Common\SexUtility.cs" />
-    <Compile Include="Source\Common\std.cs" />
+    <Compile Include="Source\Modules\STD\std.cs" />
     <Compile Include="Source\Common\StringListDef.cs" />
     <Compile Include="Source\Common\Unprivater.cs" />
-    <Compile Include="Source\Common\Whoring_Helper.cs" />
+    <Compile Include="Source\Modules\Whoring\Whoring_Helper.cs" />
     <Compile Include="Source\Common\xxx.cs" />
     <Compile Include="Source\Comps\CompAdder.cs" />
-    <Compile Include="Source\Comps\CompBondageGear.cs" />
-    <Compile Include="Source\Comps\CompGetBondageGear.cs" />
-    <Compile Include="Source\Comps\CompHoloCryptoStamped.cs" />
+    <Compile Include="Source\Modules\Bondage\Comps\CompBondageGear.cs" />
+    <Compile Include="Source\Modules\Bondage\Comps\CompGetBondageGear.cs" />
+    <Compile Include="Source\Modules\Bondage\Comps\CompHoloCryptoStamped.cs" />
     <Compile Include="Source\Comps\CompProperties_RJW.cs" />
     <Compile Include="Source\Comps\CompRJW.cs" />
-    <Compile Include="Source\Comps\CompStampedApparelKey.cs" />
-    <Compile Include="Source\Comps\CompUnlockBondageGear.cs" />
-    <Compile Include="Source\DefOf\RJW_HediffDefOf.cs" />
-    <Compile Include="Source\DefOf\RJW_JobDefOf.cs" />
+    <Compile Include="Source\Modules\Bondage\Comps\CompStampedApparelKey.cs" />
+    <Compile Include="Source\Modules\Bondage\Comps\CompUnlockBondageGear.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\DefOf\RJW_HediffDefOf.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\DefOf\RJW_JobDefOf.cs" />
     <Compile Include="Source\Designators\RJWdesignations.cs" />
     <Compile Include="Source\Harmony\CnPcompatibility.cs" />
     <Compile Include="Source\Harmony\First.cs" />
-    <Compile Include="Source\Harmony\patches_ABF.cs" />
-    <Compile Include="Source\Harmony\patches_backstory_generator.cs" />
-    <Compile Include="Source\Harmony\patches_bondage_gear.cs" />
-    <Compile Include="Source\Harmony\patches_DubsBadHygiene.cs" />
-    <Compile Include="Source\Harmony\patches_lovin.cs" />
-    <Compile Include="Source\Harmony\patches_pregnancy.cs" />
+    <Compile Include="Source\Harmony\patch_ABF.cs" />
+    <Compile Include="Source\Harmony\patch_backstory_generator.cs" />
+    <Compile Include="Source\Harmony\patch_bondage_gear.cs" />
+    <Compile Include="Source\Harmony\patch_DubsBadHygiene.cs" />
+    <Compile Include="Source\Harmony\patch_lovin.cs" />
+    <Compile Include="Source\Harmony\patch_pregnancy.cs" />
     <Compile Include="Source\Harmony\patch_semenOverlay.cs" />
     <Compile Include="Source\Harmony\Rjw_buttons.cs" />
     <Compile Include="Source\Harmony\SexualityCard.cs" />
     <Compile Include="Source\Harmony\SexualityCardInternal.cs" />
     <Compile Include="Source\Harmony\submit_button.cs" />
     <Compile Include="Source\Hediffs\HediffComp_SeverityPerDayIfRest.cs" />
-    <Compile Include="Source\Hediffs\Hediff_Bukkake.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\Hediffs\Hediff_Bukkake.cs" />
     <Compile Include="Source\Hediffs\Hediff_Cocoon.cs" />
-    <Compile Include="Source\Hediffs\Hediff_Semen.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\HediffDef_EnemyImplants.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\Hediffs\Hediff_Semen.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\HediffDef_EnemyImplants.cs" />
     <Compile Include="Source\Hediffs\Hediff_ID.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_InsectEggPregnancy.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_InsectEggPregnancy.cs" />
     <Compile Include="Source\Hediffs\Hediff_InvisibleImplant.cs" />
-    <Compile Include="Source\Hediffs\Hediff_MCEvents.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_MechanoidPregnancy.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_MechImplants.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\HeDiff_MicroComputer.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_ParasitePregnancy.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_MCEvents.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_MechanoidPregnancy.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_MechImplants.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\HeDiff_MicroComputer.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_ParasitePregnancy.cs" />
     <Compile Include="Source\Hediffs\Hediff_Submitting.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_BasePregnancy.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_BestialPregnancy.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_HumanlikePregnancy.cs" />
-    <Compile Include="Source\Hediffs\Pregnancy\Hediff_SimpleBaby.cs" />
-    <Compile Include="Source\Incidents\IncidentWorker_NymphJoins.cs" />
-    <Compile Include="Source\Incidents\IncidentWorker_NymphVisitorGroup.cs" />
-    <Compile Include="Source\Incidents\IncidentWorker_TestInc.cs" />
-    <Compile Include="Source\Incidents\IncidentWorker_TestInc2.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_BasePregnancy.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_BestialPregnancy.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_HumanlikePregnancy.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Hediffs\Hediff_SimpleBaby.cs" />
+    <Compile Include="Source\Modules\Nymphs\Incidents\IncidentWorker_NymphJoins.cs" />
+    <Compile Include="Source\Modules\Nymphs\Incidents\IncidentWorker_NymphVisitorGroup.cs" />
+    <Compile Include="Source\Modules\Nymphs\Incidents\IncidentWorker_TestInc.cs" />
+    <Compile Include="Source\Modules\Nymphs\Incidents\IncidentWorker_TestInc2.cs" />
     <Compile Include="Source\Interactions\InteractionWorker_SexAttempt.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_BestialityForMale.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_BestialityForFemale.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_Breeding.cs" />
-    <Compile Include="Source\JobDrivers\JobDriver_CleanSelf.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\JobDrivers\JobDriver_CleanSelf.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_Fappin.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_GettinLoved.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_GettinRaped.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_JoinInBed.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_QuickFap.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_RapeEnemyByHumanlike.cs" />
-    <Compile Include="Source\JobDrivers\JobDriver_WhoreInvitingVisitors.cs" />
+    <Compile Include="Source\Modules\Whoring\JobDrivers\JobDriver_WhoreInvitingVisitors.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_PrisonerComfortRapin.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_RandomRape.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_Rape.cs" />
@@ -130,10 +132,10 @@
     <Compile Include="Source\JobDrivers\JobDriver_RapeEnemyByInsect.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_RapeEnemyByMech.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_RapeEnemyToParasite.cs" />
-    <Compile Include="Source\JobDrivers\JobDriver_StruggleInBondageGear.cs" />
-    <Compile Include="Source\JobDrivers\JobDriver_UseItemOn.cs" />
+    <Compile Include="Source\Modules\Bondage\JobDrivers\JobDriver_StruggleInBondageGear.cs" />
+    <Compile Include="Source\Modules\Bondage\JobDrivers\JobDriver_UseItemOn.cs" />
     <Compile Include="Source\JobDrivers\JobDriver_ViolateCorpse.cs" />
-    <Compile Include="Source\JobDrivers\JobDriver_WhoreIsServingVisitors.cs" />
+    <Compile Include="Source\Modules\Whoring\JobDrivers\JobDriver_WhoreIsServingVisitors.cs" />
     <Compile Include="Source\JobGivers\JobGiver_AIRapePrisoner.cs" />
     <Compile Include="Source\JobGivers\JobGiver_Bestiality.cs" />
     <Compile Include="Source\JobGivers\JobGiver_Breed.cs" />
@@ -143,40 +145,36 @@
     <Compile Include="Source\JobGivers\JobGiver_RandomRape.cs" />
     <Compile Include="Source\JobGivers\JobGiver_RapeEnemy.cs" />
     <Compile Include="Source\JobGivers\JobGiver_ViolateCorpse.cs" />
-    <Compile Include="Source\JobGivers\JobGiver_WhoreInvitingVisitors.cs" />
+    <Compile Include="Source\Modules\Whoring\JobGivers\JobGiver_WhoreInvitingVisitors.cs" />
     <Compile Include="Source\MentalStates\MentalState_RandomRape.cs" />
     <Compile Include="Source\MentalStates\SexualMentalState.cs" />
     <Compile Include="Source\Needs\Need_Sex.cs" />
     <Compile Include="Source\PawnCapacities\BodyPartTagDefOf.cs" />
     <Compile Include="Source\PawnCapacities\PawnCapacityWorker_Fertility.cs" />
-    <Compile Include="Source\Pawns\Nymph_Backstories.cs" />
-    <Compile Include="Source\Pawns\Nymph_Generator.cs" />
-    <Compile Include="Source\Recipes\Install_Part\Recipe_InstallAnus.cs" />
-    <Compile Include="Source\Recipes\Install_Part\Recipe_InstallBreasts.cs" />
-    <Compile Include="Source\Recipes\Install_Part\Recipe_InstallGenitals.cs" />
+    <Compile Include="Source\Modules\Nymphs\Pawns\Nymph_Backstories.cs" />
+    <Compile Include="Source\Modules\Nymphs\Pawns\Nymph_Generator.cs" />
     <Compile Include="Source\Recipes\Install_Part\Recipe_InstallPart.cs" />
-    <Compile Include="Source\Recipes\Recipe_Abortion.cs" />
-    <Compile Include="Source\Recipes\Recipe_ChastityBelt.cs" />
-    <Compile Include="Source\Recipes\Recipe_ClaimChild.cs" />
-    <Compile Include="Source\Recipes\Recipe_DeterminePregnancy.cs" />
-    <Compile Include="Source\Recipes\Recipe_ForceOffGear.cs" />
-    <Compile Include="Source\Recipes\Recipe_InstallIUD.cs" />
-    <Compile Include="Source\Recipes\Recipe_PregnancyHackMech.cs" />
-    <Compile Include="Source\Recipes\Recipe_Sterilize.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Recipes\Recipe_Abortion.cs" />
+    <Compile Include="Source\Modules\Bondage\Recipes\Recipe_ChastityBelt.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Recipes\Recipe_ClaimChild.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Recipes\Recipe_DeterminePregnancy.cs" />
+    <Compile Include="Source\Modules\Bondage\Recipes\Recipe_ForceOffGear.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Recipes\Recipe_InstallIUD.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Recipes\Recipe_PregnancyHackMech.cs" />
+    <Compile Include="Source\Modules\Pregnancy\Recipes\Recipe_Sterilize.cs" />
+    <Compile Include="Source\Recipes\Recipe_Restraints.cs" />
     <Compile Include="Source\Recipes\Remove_Part\Recipe_RemoveAnus.cs" />
     <Compile Include="Source\Recipes\Remove_Part\Recipe_RemoveBreasts.cs" />
     <Compile Include="Source\Recipes\Remove_Part\Recipe_RemoveGenitals.cs" />
     <Compile Include="Source\Recipes\Remove_Part\Recipe_RemovePart.cs" />
-    <Compile Include="Source\Recipes\Remove_Part\Recipe_RemovePenis.cs" />
-    <Compile Include="Source\Recipes\Remove_Part\Recipe_RemoveVagina.cs" />
     <Compile Include="Source\Recipes\Transgender\Recipe_MakeFuta.cs" />
     <Compile Include="Source\Recipes\Transgender\Recipe_MakeFutaF.cs" />
     <Compile Include="Source\Recipes\Transgender\Recipe_MakeFutaM.cs" />
     <Compile Include="Source\Settings\RJWDebugSettings.cs" />
     <Compile Include="Source\Settings\RJWPregnancySettings.cs" />
-    <Compile Include="Source\Settings\RJWPreferenceSettings.cs" />
     <Compile Include="Source\Settings\RJWSettings.cs" />
     <Compile Include="Source\Settings\RJWSettingsController.cs" />
+    <Compile Include="Source\Settings\RJWSexSettings.cs" />
     <Compile Include="Source\ThinkTreeNodes\ThinkNode_ChancePerHour_Bestiality.cs" />
     <Compile Include="Source\ThinkTreeNodes\ThinkNode_ChancePerHour_Breed.cs" />
     <Compile Include="Source\ThinkTreeNodes\ThinkNode_ChancePerHour_Fappin.cs" />
@@ -191,20 +189,19 @@
     <Compile Include="Source\ThinkTreeNodes\ThinkNode_ConditionalNympho.cs" />
     <Compile Include="Source\ThinkTreeNodes\ThinkNode_ConditionalRapist.cs" />
     <Compile Include="Source\ThinkTreeNodes\ThinkNode_ConditionalSexChecks.cs" />
-    <Compile Include="Source\ThinkTreeNodes\ThinkNode_ConditionalTrait.cs" />
-    <Compile Include="Source\ThinkTreeNodes\ThinkNode_ConditionalWhore.cs" />
-    <Compile Include="Source\Thoughts\ThoughtWorker_Bound.cs" />
+    <Compile Include="Source\Modules\Whoring\ThinkTreeNodes\ThinkNode_ConditionalWhore.cs" />
+    <Compile Include="Source\Modules\Bondage\Thoughts\ThoughtWorker_Bound.cs" />
     <Compile Include="Source\Thoughts\ThoughtWorker_FeelingBroken.cs" />
-    <Compile Include="Source\Thoughts\ThoughtWorker_ItchyCrotch.cs" />
+    <Compile Include="Source\Modules\STD\Thoughts\ThoughtWorker_ItchyCrotch.cs" />
     <Compile Include="Source\Thoughts\ThoughtWorker_NeedSex.cs" />
     <Compile Include="Source\Thoughts\ThoughtWorker_SexChange.cs" />
-    <Compile Include="Source\Thoughts\ThoughtWorker_SyphiliticThoughts.cs" />
-    <Compile Include="Source\Thoughts\ThoughtWorker_WastingAway.cs" />
-    <Compile Include="Source\Thoughts\ThoughtWorker_Whore.cs" />
+    <Compile Include="Source\Modules\STD\Thoughts\ThoughtWorker_SyphiliticThoughts.cs" />
+    <Compile Include="Source\Modules\STD\Thoughts\ThoughtWorker_WastingAway.cs" />
+    <Compile Include="Source\Modules\Whoring\Thoughts\ThoughtWorker_Whore.cs" />
     <Compile Include="Source\Triggers\Trigger_SexSatisfy.cs" />
     <Compile Include="Source\WorkGivers\WorkGiver_BestialityForFemale.cs" />
     <Compile Include="Source\WorkGivers\WorkGiver_BestialityForMale.cs" />
-    <Compile Include="Source\WorkGivers\WorkGiver_CleanSelf.cs" />
+    <Compile Include="Source\Modules\SemenOverlay\WorkGivers\WorkGiver_CleanSelf.cs" />
     <Compile Include="Source\WorkGivers\WorkGiver_Fap.cs" />
     <Compile Include="Source\WorkGivers\WorkGiver_Fap_Bed.cs" />
     <Compile Include="Source\WorkGivers\WorkGiver_Rape.cs" />
@@ -222,7 +219,7 @@
     <Content Include="Assemblies\%24HugsLibChecker.dll" />
     <Content Include="Assemblies\0Harmony.dll" />
     <Content Include="Assemblies\RJW.dll" />
-    <Compile Include="Source\Settings.cs" />
+    <Compile Include="Source\Settings\Settings.cs" />
     <Content Include="Defs\BodyPartDefs\BodyParts_Humanlike.xml">
       <SubType>Designer</SubType>
     </Content>
@@ -561,6 +558,9 @@
       <HintPath>packages\UnlimitedHugs.Rimworld.HugsLib.6.1.1\lib\net35\0Harmony.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="0MultiplayerAPI">
+      <HintPath>packages\Multiplayer\Assemblies\0MultiplayerAPI.dll</HintPath>
+    </Reference>
     <Reference Include="Assembly-CSharp">
       <HintPath>..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
       <Private>False</Private>
@@ -599,9 +599,7 @@
       <Private>False</Private>
     </Reference>
   </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Source\Recipes\Replace_Part\" />
-  </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSHARP.Targets" />
   <ProjectExtensions>
     <VisualStudio AllowExistingFolder="true" />
diff --git a/Source/Common/CORE_EXPOSED/PawnGenerator.cs b/Source/Common/CORE_EXPOSED/PawnGenerator.cs
index 13ca70cd740a3e833b7ec56882e21b29a560656c..bd43aab20ba034b2e58dbb874e0481ffde83bdfb 100644
--- a/Source/Common/CORE_EXPOSED/PawnGenerator.cs
+++ b/Source/Common/CORE_EXPOSED/PawnGenerator.cs
@@ -1,3 +1,12 @@
+/*
+ *
+ *
+ * ALL THE CODE IN THIS FILE HAS JUST BEEN COPIED FROM THE DECOMPILED CORE ASSEMBLY.
+ * used for nymphs generation, since CORE for some reason ignores gender preference
+ *
+ *
+ */
+
 using RimWorld;
 using RimWorld.Planet;
 using System;
diff --git a/Source/DefOf/RJW_RecipeDefOf.cs b/Source/DefOf/RJW_RecipeDefOf.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3ae2eefffe981ebbc2a42123bbdff30189b412ec
--- /dev/null
+++ b/Source/DefOf/RJW_RecipeDefOf.cs
@@ -0,0 +1,13 @@
+using RimWorld;
+using Verse;
+
+namespace rjw
+{
+	[DefOf]
+	public static class RJW_RecipeDefOf
+	{
+		public static RecipeDef AttachPenis;
+		public static RecipeDef InstallPenis;
+		public static RecipeDef RemovePenis;
+	}
+}
diff --git a/Source/Harmony/patches_ABF.cs b/Source/Harmony/patch_ABF.cs
similarity index 100%
rename from Source/Harmony/patches_ABF.cs
rename to Source/Harmony/patch_ABF.cs
diff --git a/Source/Harmony/patches_DubsBadHygiene.cs b/Source/Harmony/patch_DubsBadHygiene.cs
similarity index 82%
rename from Source/Harmony/patches_DubsBadHygiene.cs
rename to Source/Harmony/patch_DubsBadHygiene.cs
index a0bfc938d3a331131fad7f0a8c8fc19ac69cfa55..8c28198e2eec77fb6accd68818625b0aabf596c1 100644
--- a/Source/Harmony/patches_DubsBadHygiene.cs
+++ b/Source/Harmony/patch_DubsBadHygiene.cs
@@ -34,9 +34,9 @@ namespace rjw
 					if (__instance.GetType() == JobDriver_useWashBucket)
 					{
 						//clear one instance of semen
-						Hediff hediff = pawn.health.hediffSet.hediffs.Find(x => (  x.def == RJW_HediffDefOf.Hediff_Semen
-																				|| x.def == RJW_HediffDefOf.Hediff_InsectSpunk
-																				|| x.def == RJW_HediffDefOf.Hediff_MechaFluids
+						Hediff hediff = pawn.health.hediffSet.hediffs.Find(x => (  x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Semen
+																				|| x.def == RJW_SemenoOverlayHediffDefOf.Hediff_InsectSpunk
+																				|| x.def == RJW_SemenoOverlayHediffDefOf.Hediff_MechaFluids
 																				));
 						if (hediff != null)
 						{
@@ -53,9 +53,9 @@ namespace rjw
 							//clear all instance of semen
 							foreach (Hediff hediff in pawn.health.hediffSet.hediffs)
 								{
-									if (hediff.def == RJW_HediffDefOf.Hediff_Semen ||
-										hediff.def == RJW_HediffDefOf.Hediff_InsectSpunk ||
-										hediff.def == RJW_HediffDefOf.Hediff_MechaFluids
+									if (hediff.def == RJW_SemenoOverlayHediffDefOf.Hediff_Semen ||
+										hediff.def == RJW_SemenoOverlayHediffDefOf.Hediff_InsectSpunk ||
+										hediff.def == RJW_SemenoOverlayHediffDefOf.Hediff_MechaFluids
 										)
 									{
 										//Log.Message("[RJW]patches_DubsBadHygiene::" + __instance.GetType() + " clear => " + hediff.Label);
diff --git a/Source/Harmony/patches_backstory_generator.cs b/Source/Harmony/patch_backstory_generator.cs
similarity index 100%
rename from Source/Harmony/patches_backstory_generator.cs
rename to Source/Harmony/patch_backstory_generator.cs
diff --git a/Source/Harmony/patches_bondage_gear.cs b/Source/Harmony/patch_bondage_gear.cs
similarity index 100%
rename from Source/Harmony/patches_bondage_gear.cs
rename to Source/Harmony/patch_bondage_gear.cs
diff --git a/Source/Harmony/patches_lovin.cs b/Source/Harmony/patch_lovin.cs
similarity index 100%
rename from Source/Harmony/patches_lovin.cs
rename to Source/Harmony/patch_lovin.cs
diff --git a/Source/Harmony/patches_need.cs b/Source/Harmony/patch_need.cs
similarity index 100%
rename from Source/Harmony/patches_need.cs
rename to Source/Harmony/patch_need.cs
diff --git a/Source/Harmony/patches_pregnancy.cs b/Source/Harmony/patch_pregnancy.cs
similarity index 100%
rename from Source/Harmony/patches_pregnancy.cs
rename to Source/Harmony/patch_pregnancy.cs
diff --git a/Source/Harmony/patch_semenOverlay.cs b/Source/Harmony/patch_semenOverlay.cs
index a4d00b2481dcce7efe255de0ac1b9e1aad32b579..f750227309dc4ed9059a5273d6c5399f72fa7067 100644
--- a/Source/Harmony/patch_semenOverlay.cs
+++ b/Source/Harmony/patch_semenOverlay.cs
@@ -17,13 +17,14 @@ namespace rjw
 		{
 			Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue<Pawn>();//get local variable
 
-			if (pawn.RaceProps.Humanlike && RJWSettings.cum_overlays)//for now, only draw humans
+			if (false) //causes memory leak-> h.DrawSemen->Draw->GenDraw.DrawMeshNowOrLater
+				if (pawn.RaceProps.Humanlike && RJWSettings.cum_overlays)//for now, only draw humans
 			{
 				//find bukkake hediff. if it exists, use its draw function
 				List<Hediff> hediffs = pawn.health.hediffSet.hediffs;
-				if (hediffs.Exists(x => x.def == RJW_HediffDefOf.Hediff_Bukkake))
+				if (hediffs.Exists(x => x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake))
 				{
-					Hediff_Bukkake h = hediffs.Find(x => x.def == RJW_HediffDefOf.Hediff_Bukkake) as Hediff_Bukkake;
+					Hediff_Bukkake h = hediffs.Find(x => x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake) as Hediff_Bukkake;
 
 					quat.ToAngleAxis(out float angle, out Vector3 axis);//angle changes when pawn is e.g. downed
 
@@ -39,7 +40,6 @@ namespace rjw
 						drawLoc.y = vector2.y;
 					}
 
-
 					h.DrawSemen(drawLoc, quat, forPortrait, angle);
 				}
 			}
diff --git a/Source/JobGivers/JobGiver_NymphJoinInBed.cs.bak b/Source/JobGivers/JobGiver_NymphJoinInBed.cs.bak
new file mode 100644
index 0000000000000000000000000000000000000000..01c107150169e7d6ac46e78307d6cd8e01bda3df
--- /dev/null
+++ b/Source/JobGivers/JobGiver_NymphJoinInBed.cs.bak
@@ -0,0 +1,150 @@
+using System.Collections.Generic;
+using System.Linq;
+using RimWorld;
+using Verse;
+using Verse.AI;
+
+namespace rjw
+{
+	public class JobGiver_NymphJoinInBed : ThinkNode_JobGiver
+	{
+		private static bool roll_to_skip(Pawn nymph, Pawn target)
+		{
+			float fuckability = xxx.would_fuck(nymph, target); // 0.0 to 1.0
+			if (fuckability < 0.1f)
+				return false;
+			float chance_to_skip = 0.9f - 0.7f * fuckability;
+			return Rand.Value < chance_to_skip;
+		}
+
+		private static bool is_healthy(Pawn target)
+		{
+			return xxx.is_healthy(target) &&
+			       (xxx.can_fuck(target) || xxx.can_be_fucked(target));
+		}
+
+		public static Pawn find_pawn_to_fuck(Pawn nymph, Map map)
+		{
+			Pawn best_fuckee = null;
+			float best_distance = 1.0e6f;
+			List<Pawn> valid_targets = new List<Pawn>();
+
+			// find lover/partner on same map
+			IEnumerable<Pawn> targets = map.mapPawns.AllPawnsSpawned.Where(x => x != nymph && x.InBed() && !x.Position.IsForbidden(nymph) && !x.Suspended && !x.Downed && is_healthy(x));
+
+			foreach (DirectPawnRelation relation in nymph.relations.DirectRelations)
+			{
+				if (relation.def != PawnRelationDefOf.Lover
+					&& relation.def != PawnRelationDefOf.Spouse
+					&& relation.def != PawnRelationDefOf.Fiance)
+					//|| (relation.def != PawnRelationDefOf.Bond && (!xxx.is_animal(relation.otherPawn) || (xxx.is_zoophile(nymph) && RJWSettings.bestiality_enabled))))
+						continue;
+				{
+					//Log.Message("[RJW] find_pawn_to_fuck( " + xxx.get_pawnname(best_fuckee) + " ) Lover/Spouse/Fiance found");
+					if (nymph.Position.DistanceToSquared(relation.otherPawn.Position) < 60 &&
+						nymph.CanReserveAndReach(relation.otherPawn, PathEndMode.OnCell, Danger.Some, 1, 0) &&
+						relation.otherPawn.CanReserve(nymph, 1, 0))
+
+						if (targets.Contains(relation.otherPawn))
+							valid_targets.Add(relation.otherPawn);
+					//Log.Message("[RJW] find_pawn_to_fuck( " + xxx.get_pawnname(best_fuckee) + " ) Lover/Spouse/Fiance cant be fucked right now");
+				}
+			}
+
+			if (valid_targets != null && valid_targets.Any())
+			{
+				foreach (Pawn q in valid_targets)
+				{
+					if (xxx.is_laying_down_alone(q) &&
+						nymph.CanReserveAndReach(q, PathEndMode.OnCell, Danger.Some, 1, 0) &&
+						q.CanReserve(nymph, 1, 0) &&
+						roll_to_skip(nymph, q))
+					{
+						int dis = nymph.Position.DistanceToSquared(q.Position);
+						if (dis < best_distance)
+						{
+							best_fuckee = q;
+							best_distance = dis;
+						}
+					}
+				}
+				if (best_fuckee != null)
+					return best_fuckee;
+			}
+
+			targets = targets.Where(x => xxx.is_human(x));
+			foreach (Pawn q in targets)
+			{
+				if (xxx.is_laying_down_alone(q) &&
+					nymph.CanReserveAndReach(q, PathEndMode.OnCell, Danger.Some, 1, 0) &&
+				    q.CanReserve(nymph, 1, 0) &&
+				    roll_to_skip(nymph, q))
+				{
+					int dis = nymph.Position.DistanceToSquared(q.Position);
+					if (dis < best_distance)
+					{
+						best_fuckee = q;
+						best_distance = dis;
+					}
+				}
+			}
+			return best_fuckee;
+		}
+
+		protected override Job TryGiveJob(Pawn nymph)
+		{
+			//--Log.Message("[RJW] JobGiver_NymphJoinInBed( " + xxx.get_pawnname(nymph) + " ) called");
+
+			if ((nymph.CurJob == null || nymph.CurJob.def == JobDefOf.LayDown))
+			{
+				//--Log.Message("   checking nympho and abilities");
+				if ((xxx.can_fuck(nymph) || xxx.can_be_fucked(nymph)))
+				{
+					//--Log.Message("   finding partner");
+					Pawn partner = find_pawn_to_fuck(nymph, nymph.Map);
+
+					//--Log.Message("   checking partner");
+					if (partner == null) return null;
+
+					Building_Bed bed;
+
+					if (xxx.is_human(partner))
+					{
+						// Can never be null, since find checks for bed.
+						bed = partner.CurrentBed();
+
+						// Interrupt current job.
+						if (nymph.CurJob != null)
+							nymph.jobs.curDriver.EndJobWith(JobCondition.InterruptForced);
+
+						//--Log.Message("   returning job");
+						return new Job(DefDatabase<JobDef>.GetNamed("NymphJoinInBed"), partner, bed);
+					}
+					/*
+					else if (xxx.is_animal(partner) && xxx.is_zoophile(nymph) && RJWSettings.bestiality_enabled)
+					{
+						if (xxx.can_rape(nymph) && Rand.Value < 0.5f)
+						{
+							if (nymph.CurJob != null)
+								nymph.jobs.curDriver.EndJobWith(JobCondition.InterruptForced);
+
+								return new Job(xxx.bestiality, partner);
+						}
+						
+						//not sure if animal can "wakeup" and go to nymph
+						bed = nymph.ownership.OwnedBed;
+						if (!xxx.can_be_fucked(nymph) || bed == null || !partner.CanReach(bed, PathEndMode.OnCell, Danger.Some)) return null;
+
+						if (nymph.CurJob != null)
+							nymph.jobs.curDriver.EndJobWith(JobCondition.InterruptForced);
+
+						return new Job(xxx.bestialityForFemale, partner, bed, bed.SleepPosOfAssignedPawn(nymph));
+					}
+					*/
+				}
+			}
+
+			return null;
+		}
+	}
+}
diff --git a/Source/Comps/CompBondageGear.cs b/Source/Modules/Bondage/Comps/CompBondageGear.cs
similarity index 100%
rename from Source/Comps/CompBondageGear.cs
rename to Source/Modules/Bondage/Comps/CompBondageGear.cs
diff --git a/Source/Comps/CompGetBondageGear.cs b/Source/Modules/Bondage/Comps/CompGetBondageGear.cs
similarity index 100%
rename from Source/Comps/CompGetBondageGear.cs
rename to Source/Modules/Bondage/Comps/CompGetBondageGear.cs
diff --git a/Source/Comps/CompHoloCryptoStamped.cs b/Source/Modules/Bondage/Comps/CompHoloCryptoStamped.cs
similarity index 100%
rename from Source/Comps/CompHoloCryptoStamped.cs
rename to Source/Modules/Bondage/Comps/CompHoloCryptoStamped.cs
diff --git a/Source/Comps/CompStampedApparelKey.cs b/Source/Modules/Bondage/Comps/CompStampedApparelKey.cs
similarity index 100%
rename from Source/Comps/CompStampedApparelKey.cs
rename to Source/Modules/Bondage/Comps/CompStampedApparelKey.cs
diff --git a/Source/Comps/CompUnlockBondageGear.cs b/Source/Modules/Bondage/Comps/CompUnlockBondageGear.cs
similarity index 100%
rename from Source/Comps/CompUnlockBondageGear.cs
rename to Source/Modules/Bondage/Comps/CompUnlockBondageGear.cs
diff --git a/Source/JobDrivers/JobDriver_StruggleInBondageGear.cs b/Source/Modules/Bondage/JobDrivers/JobDriver_StruggleInBondageGear.cs
similarity index 100%
rename from Source/JobDrivers/JobDriver_StruggleInBondageGear.cs
rename to Source/Modules/Bondage/JobDrivers/JobDriver_StruggleInBondageGear.cs
diff --git a/Source/JobDrivers/JobDriver_UseItemOn.cs b/Source/Modules/Bondage/JobDrivers/JobDriver_UseItemOn.cs
similarity index 100%
rename from Source/JobDrivers/JobDriver_UseItemOn.cs
rename to Source/Modules/Bondage/JobDrivers/JobDriver_UseItemOn.cs
diff --git a/Source/Recipes/Recipe_ChastityBelt.cs b/Source/Modules/Bondage/Recipes/Recipe_ChastityBelt.cs
similarity index 100%
rename from Source/Recipes/Recipe_ChastityBelt.cs
rename to Source/Modules/Bondage/Recipes/Recipe_ChastityBelt.cs
diff --git a/Source/Recipes/Recipe_ForceOffGear.cs b/Source/Modules/Bondage/Recipes/Recipe_ForceOffGear.cs
similarity index 100%
rename from Source/Recipes/Recipe_ForceOffGear.cs
rename to Source/Modules/Bondage/Recipes/Recipe_ForceOffGear.cs
diff --git a/Source/Thoughts/ThoughtWorker_Bound.cs b/Source/Modules/Bondage/Thoughts/ThoughtWorker_Bound.cs
similarity index 100%
rename from Source/Thoughts/ThoughtWorker_Bound.cs
rename to Source/Modules/Bondage/Thoughts/ThoughtWorker_Bound.cs
diff --git a/Source/Common/bondage_gear.cs b/Source/Modules/Bondage/bondage_gear.cs
similarity index 100%
rename from Source/Common/bondage_gear.cs
rename to Source/Modules/Bondage/bondage_gear.cs
diff --git a/Source/Comps/CompMilkableHuman.cs b/Source/Modules/Milking/Comps/CompMilkableHuman.cs
similarity index 100%
rename from Source/Comps/CompMilkableHuman.cs
rename to Source/Modules/Milking/Comps/CompMilkableHuman.cs
diff --git a/Source/Comps/CompProperties_MilkableHuman.cs b/Source/Modules/Milking/Comps/CompProperties_MilkableHuman.cs
similarity index 100%
rename from Source/Comps/CompProperties_MilkableHuman.cs
rename to Source/Modules/Milking/Comps/CompProperties_MilkableHuman.cs
diff --git a/Source/JobDrivers/JobDefOfZ.cs b/Source/Modules/Milking/JobDrivers/JobDefOfZ.cs
similarity index 100%
rename from Source/JobDrivers/JobDefOfZ.cs
rename to Source/Modules/Milking/JobDrivers/JobDefOfZ.cs
diff --git a/Source/JobDrivers/JobDriver_GatherHumanBodyResources.cs b/Source/Modules/Milking/JobDrivers/JobDriver_GatherHumanBodyResources.cs
similarity index 100%
rename from Source/JobDrivers/JobDriver_GatherHumanBodyResources.cs
rename to Source/Modules/Milking/JobDrivers/JobDriver_GatherHumanBodyResources.cs
diff --git a/Source/JobDrivers/JobDriver_MilkHuman.cs b/Source/Modules/Milking/JobDrivers/JobDriver_MilkHuman.cs
similarity index 100%
rename from Source/JobDrivers/JobDriver_MilkHuman.cs
rename to Source/Modules/Milking/JobDrivers/JobDriver_MilkHuman.cs
diff --git a/Source/WorkGivers/WorkGiver_GatherHumanBodyResources.cs b/Source/Modules/Milking/WorkGivers/WorkGiver_GatherHumanBodyResources.cs
similarity index 100%
rename from Source/WorkGivers/WorkGiver_GatherHumanBodyResources.cs
rename to Source/Modules/Milking/WorkGivers/WorkGiver_GatherHumanBodyResources.cs
diff --git a/Source/WorkGivers/WorkGiver_MilkHuman.cs b/Source/Modules/Milking/WorkGivers/WorkGiver_MilkHuman.cs
similarity index 100%
rename from Source/WorkGivers/WorkGiver_MilkHuman.cs
rename to Source/Modules/Milking/WorkGivers/WorkGiver_MilkHuman.cs
diff --git a/Source/Incidents/IncidentWorker_NymphJoins.cs b/Source/Modules/Nymphs/Incidents/IncidentWorker_NymphJoins.cs
similarity index 100%
rename from Source/Incidents/IncidentWorker_NymphJoins.cs
rename to Source/Modules/Nymphs/Incidents/IncidentWorker_NymphJoins.cs
diff --git a/Source/Incidents/IncidentWorker_NymphVisitorGroup.cs b/Source/Modules/Nymphs/Incidents/IncidentWorker_NymphVisitorGroup.cs
similarity index 100%
rename from Source/Incidents/IncidentWorker_NymphVisitorGroup.cs
rename to Source/Modules/Nymphs/Incidents/IncidentWorker_NymphVisitorGroup.cs
diff --git a/Source/Incidents/IncidentWorker_TestInc.cs b/Source/Modules/Nymphs/Incidents/IncidentWorker_TestInc.cs
similarity index 100%
rename from Source/Incidents/IncidentWorker_TestInc.cs
rename to Source/Modules/Nymphs/Incidents/IncidentWorker_TestInc.cs
diff --git a/Source/Incidents/IncidentWorker_TestInc2.cs b/Source/Modules/Nymphs/Incidents/IncidentWorker_TestInc2.cs
similarity index 100%
rename from Source/Incidents/IncidentWorker_TestInc2.cs
rename to Source/Modules/Nymphs/Incidents/IncidentWorker_TestInc2.cs
diff --git a/Source/Pawns/Nymph_Backstories.cs b/Source/Modules/Nymphs/Pawns/Nymph_Backstories.cs
similarity index 100%
rename from Source/Pawns/Nymph_Backstories.cs
rename to Source/Modules/Nymphs/Pawns/Nymph_Backstories.cs
diff --git a/Source/Pawns/Nymph_Generator.cs b/Source/Modules/Nymphs/Pawns/Nymph_Generator.cs
similarity index 100%
rename from Source/Pawns/Nymph_Generator.cs
rename to Source/Modules/Nymphs/Pawns/Nymph_Generator.cs
diff --git a/Source/Hediffs/Pregnancy/HeDiff_MicroComputer.cs b/Source/Modules/Pregnancy/Hediffs/HeDiff_MicroComputer.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/HeDiff_MicroComputer.cs
rename to Source/Modules/Pregnancy/Hediffs/HeDiff_MicroComputer.cs
diff --git a/Source/Hediffs/Pregnancy/HediffDef_EnemyImplants.cs b/Source/Modules/Pregnancy/Hediffs/HediffDef_EnemyImplants.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/HediffDef_EnemyImplants.cs
rename to Source/Modules/Pregnancy/Hediffs/HediffDef_EnemyImplants.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_BasePregnancy.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_BasePregnancy.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_BasePregnancy.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_BasePregnancy.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_BestialPregnancy.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_BestialPregnancy.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_BestialPregnancy.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_BestialPregnancy.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_HumanlikePregnancy.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_HumanlikePregnancy.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_HumanlikePregnancy.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_HumanlikePregnancy.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_InsectEggPregnancy.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_InsectEggPregnancy.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_InsectEggPregnancy.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_InsectEggPregnancy.cs
diff --git a/Source/Hediffs/Hediff_MCEvents.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_MCEvents.cs
similarity index 100%
rename from Source/Hediffs/Hediff_MCEvents.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_MCEvents.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_MechImplants.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_MechImplants.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_MechImplants.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_MechImplants.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_MechanoidPregnancy.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_MechanoidPregnancy.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_MechanoidPregnancy.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_MechanoidPregnancy.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_ParasitePregnancy.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_ParasitePregnancy.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_ParasitePregnancy.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_ParasitePregnancy.cs
diff --git a/Source/Hediffs/Pregnancy/Hediff_SimpleBaby.cs b/Source/Modules/Pregnancy/Hediffs/Hediff_SimpleBaby.cs
similarity index 100%
rename from Source/Hediffs/Pregnancy/Hediff_SimpleBaby.cs
rename to Source/Modules/Pregnancy/Hediffs/Hediff_SimpleBaby.cs
diff --git a/Source/Common/Pregnancy_Helper.cs b/Source/Modules/Pregnancy/Pregnancy_Helper.cs
similarity index 100%
rename from Source/Common/Pregnancy_Helper.cs
rename to Source/Modules/Pregnancy/Pregnancy_Helper.cs
diff --git a/Source/Recipes/Recipe_Abortion.cs b/Source/Modules/Pregnancy/Recipes/Recipe_Abortion.cs
similarity index 100%
rename from Source/Recipes/Recipe_Abortion.cs
rename to Source/Modules/Pregnancy/Recipes/Recipe_Abortion.cs
diff --git a/Source/Recipes/Recipe_ClaimChild.cs b/Source/Modules/Pregnancy/Recipes/Recipe_ClaimChild.cs
similarity index 100%
rename from Source/Recipes/Recipe_ClaimChild.cs
rename to Source/Modules/Pregnancy/Recipes/Recipe_ClaimChild.cs
diff --git a/Source/Recipes/Recipe_DeterminePregnancy.cs b/Source/Modules/Pregnancy/Recipes/Recipe_DeterminePregnancy.cs
similarity index 92%
rename from Source/Recipes/Recipe_DeterminePregnancy.cs
rename to Source/Modules/Pregnancy/Recipes/Recipe_DeterminePregnancy.cs
index 2a0688de54d17507d6c306ccda5b42880d3f451d..7ae54bec2832dec35f40bb91b70fa158a3f60068 100644
--- a/Source/Recipes/Recipe_DeterminePregnancy.cs
+++ b/Source/Modules/Pregnancy/Recipes/Recipe_DeterminePregnancy.cs
@@ -9,7 +9,13 @@ namespace rjw
     {
         public override IEnumerable<BodyPartRecord> GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
         {
-            BodyPartRecord part = pawn.RaceProps.body.corePart;
+			/* Males can be impregnated by mechanoids, probably
+			if (!xxx.is_female(pawn))
+			{
+				yield break;
+			}
+			*/
+			BodyPartRecord part = pawn.RaceProps.body.corePart;
             if (recipe.appliedOnFixedBodyParts[0] != null)
                 part = pawn.RaceProps.body.AllParts.Find(x => x.def == recipe.appliedOnFixedBodyParts[0]);
 			if (part != null && (pawn.ageTracker.CurLifeStage.reproductive)
diff --git a/Source/Recipes/Recipe_InstallIUD.cs b/Source/Modules/Pregnancy/Recipes/Recipe_InstallIUD.cs
similarity index 100%
rename from Source/Recipes/Recipe_InstallIUD.cs
rename to Source/Modules/Pregnancy/Recipes/Recipe_InstallIUD.cs
diff --git a/Source/Recipes/Recipe_PregnancyHackMech.cs b/Source/Modules/Pregnancy/Recipes/Recipe_PregnancyHackMech.cs
similarity index 100%
rename from Source/Recipes/Recipe_PregnancyHackMech.cs
rename to Source/Modules/Pregnancy/Recipes/Recipe_PregnancyHackMech.cs
diff --git a/Source/Modules/Pregnancy/Recipes/Recipe_Sterilize.cs b/Source/Modules/Pregnancy/Recipes/Recipe_Sterilize.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f48daed1daea5471e286e9e8e2e7a6fca83ccbfc
--- /dev/null
+++ b/Source/Modules/Pregnancy/Recipes/Recipe_Sterilize.cs
@@ -0,0 +1,27 @@
+using RimWorld;
+using System.Collections.Generic;
+using System.Linq;
+using Verse;
+
+namespace rjw
+{
+	/// <summary>
+	/// Sterilization
+	/// </summary>
+	public class Recipe_InstallImplantToExistParts : Recipe_InstallImplant
+	{
+		public override IEnumerable<BodyPartRecord> GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
+		{
+			bool blocked = Genital_Helper.genitals_blocked(pawn) || xxx.is_slime(pawn);
+
+			if (!blocked)
+				foreach (BodyPartRecord record in pawn.RaceProps.body.AllParts.Where(x => recipe.appliedOnFixedBodyParts.Contains(x.def)))
+				{
+					if (!pawn.health.hediffSet.hediffs.Any((Hediff x) => x.def == recipe.addsHediff))
+					{
+						yield return record;
+					}
+				}
+		}
+	}
+}
diff --git a/Source/Thoughts/ThoughtWorker_ItchyCrotch.cs b/Source/Modules/STD/Thoughts/ThoughtWorker_ItchyCrotch.cs
similarity index 100%
rename from Source/Thoughts/ThoughtWorker_ItchyCrotch.cs
rename to Source/Modules/STD/Thoughts/ThoughtWorker_ItchyCrotch.cs
diff --git a/Source/Thoughts/ThoughtWorker_SyphiliticThoughts.cs b/Source/Modules/STD/Thoughts/ThoughtWorker_SyphiliticThoughts.cs
similarity index 100%
rename from Source/Thoughts/ThoughtWorker_SyphiliticThoughts.cs
rename to Source/Modules/STD/Thoughts/ThoughtWorker_SyphiliticThoughts.cs
diff --git a/Source/Thoughts/ThoughtWorker_WastingAway.cs b/Source/Modules/STD/Thoughts/ThoughtWorker_WastingAway.cs
similarity index 100%
rename from Source/Thoughts/ThoughtWorker_WastingAway.cs
rename to Source/Modules/STD/Thoughts/ThoughtWorker_WastingAway.cs
diff --git a/Source/Common/std.cs b/Source/Modules/STD/std.cs
similarity index 100%
rename from Source/Common/std.cs
rename to Source/Modules/STD/std.cs
diff --git a/Source/Common/BukkakeContent.cs b/Source/Modules/SemenOverlay/BukkakeContent.cs
similarity index 100%
rename from Source/Common/BukkakeContent.cs
rename to Source/Modules/SemenOverlay/BukkakeContent.cs
diff --git a/Source/DefOf/RJW_HediffDefOf.cs b/Source/Modules/SemenOverlay/DefOf/RJW_HediffDefOf.cs
similarity index 89%
rename from Source/DefOf/RJW_HediffDefOf.cs
rename to Source/Modules/SemenOverlay/DefOf/RJW_HediffDefOf.cs
index 7d6cf94c7421d342fa3c44e87951745cf613d516..74c9ec103f97fb2363cf0ef573c93883b11eabe1 100644
--- a/Source/DefOf/RJW_HediffDefOf.cs
+++ b/Source/Modules/SemenOverlay/DefOf/RJW_HediffDefOf.cs
@@ -5,7 +5,7 @@ namespace rjw
 {
 	//I took the liberty of adding the new DefOf files since I find that easier than managing all the defs via xxx.cs
 	[DefOf]
-	public static class RJW_HediffDefOf
+	public static class RJW_SemenoOverlayHediffDefOf
 	{
 		public static HediffDef Hediff_Semen;//for humans & animals; also parent for insect and mech spunk
 		public static HediffDef Hediff_InsectSpunk;
diff --git a/Source/DefOf/RJW_JobDefOf.cs b/Source/Modules/SemenOverlay/DefOf/RJW_JobDefOf.cs
similarity index 71%
rename from Source/DefOf/RJW_JobDefOf.cs
rename to Source/Modules/SemenOverlay/DefOf/RJW_JobDefOf.cs
index 72e4f789b004e6df02be819e4f052c129c2b7253..1ca90e4f7ac81c128f77265bbba5d75574565b9d 100644
--- a/Source/DefOf/RJW_JobDefOf.cs
+++ b/Source/Modules/SemenOverlay/DefOf/RJW_JobDefOf.cs
@@ -4,7 +4,7 @@ using Verse;
 namespace rjw
 {
 	[DefOf]
-	static class RJW_JobDefOf
+	static class RJW_SemenOverlayJobDefOf
 	{
 		public static JobDef CleanSelf;
 	}
diff --git a/Source/Hediffs/Hediff_Bukkake.cs b/Source/Modules/SemenOverlay/Hediffs/Hediff_Bukkake.cs
similarity index 97%
rename from Source/Hediffs/Hediff_Bukkake.cs
rename to Source/Modules/SemenOverlay/Hediffs/Hediff_Bukkake.cs
index a85ebfdcdb7bb8951e6875477090ecf1ce4d1d8c..4b6e53fb9074938c9ed42317a1b0eca6436cf0e8 100644
--- a/Source/Hediffs/Hediff_Bukkake.cs
+++ b/Source/Modules/SemenOverlay/Hediffs/Hediff_Bukkake.cs
@@ -36,7 +36,7 @@ namespace rjw
 		{
 			if (pawn.RaceProps.Humanlike)//for now, only humans are supported 
 			{
-				hediffs_semen = this.pawn.health.hediffSet.hediffs.FindAll(x => (x.def == RJW_HediffDefOf.Hediff_Semen || x.def == RJW_HediffDefOf.Hediff_InsectSpunk || x.def == RJW_HediffDefOf.Hediff_MechaFluids));
+				hediffs_semen = this.pawn.health.hediffSet.hediffs.FindAll(x => (x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Semen || x.def == RJW_SemenoOverlayHediffDefOf.Hediff_InsectSpunk || x.def == RJW_SemenoOverlayHediffDefOf.Hediff_MechaFluids));
 				float bukkakeLevel = CalculateBukkakeLevel();//sum of severity of all the semen hediffs x semenWeight
 				this.Severity = bukkakeLevel;
 				bool updatePortrait = false;
@@ -240,6 +240,7 @@ namespace rjw
 				//drawPos.y += yAdjust[facingDir];// 0.00: over body; 0.01: over body but under face, 0.02: over face, but under hair, -99 = "never" visible
 				drawPos.y += yAdjust[facingDir];
 
+				// this causes crash, pawn tick -> draw-> full ram-> crash
 				GenDraw.DrawMeshNowOrLater(mesh, drawPos, quat, semenMaterial, forPortrait);
 			}
 
diff --git a/Source/Hediffs/Hediff_Semen.cs b/Source/Modules/SemenOverlay/Hediffs/Hediff_Semen.cs
similarity index 100%
rename from Source/Hediffs/Hediff_Semen.cs
rename to Source/Modules/SemenOverlay/Hediffs/Hediff_Semen.cs
diff --git a/Source/JobDrivers/JobDriver_CleanSelf.cs b/Source/Modules/SemenOverlay/JobDrivers/JobDriver_CleanSelf.cs
similarity index 76%
rename from Source/JobDrivers/JobDriver_CleanSelf.cs
rename to Source/Modules/SemenOverlay/JobDrivers/JobDriver_CleanSelf.cs
index 060724891154630cf2d57885d8e52a7b048e99e9..fa92ec885543f4b8ce67392f7bd797dd92487200 100644
--- a/Source/JobDrivers/JobDriver_CleanSelf.cs
+++ b/Source/Modules/SemenOverlay/JobDrivers/JobDriver_CleanSelf.cs
@@ -19,7 +19,7 @@ namespace rjw
 			this.FailOn(delegate
 			{
 				List<Hediff> hediffs = pawn.health.hediffSet.hediffs;
-				return !hediffs.Exists(x => x.def == RJW_HediffDefOf.Hediff_Bukkake);//fail if bukkake disappears - means that also all the semen is gone
+				return !hediffs.Exists(x => x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake);//fail if bukkake disappears - means that also all the semen is gone
 			});
 			Toil cleaning = Toils_General.Wait(cleaningTime, TargetIndex.None);//duration of 
 			cleaning.WithProgressBarToilDelay(TargetIndex.A);
@@ -30,7 +30,7 @@ namespace rjw
 				initAction = delegate ()
 				{
 					//get one of the semen hediffs, reduce its severity
-					Hediff hediff = pawn.health.hediffSet.hediffs.Find(x => (x.def == RJW_HediffDefOf.Hediff_Semen || x.def == RJW_HediffDefOf.Hediff_InsectSpunk || x.def == RJW_HediffDefOf.Hediff_MechaFluids));
+					Hediff hediff = pawn.health.hediffSet.hediffs.Find(x => (x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Semen || x.def == RJW_SemenoOverlayHediffDefOf.Hediff_InsectSpunk || x.def == RJW_SemenoOverlayHediffDefOf.Hediff_MechaFluids));
 					if (hediff != null)
 					{
 						hediff.Severity -= cleanAmount;
diff --git a/Source/Common/SemenHelper.cs b/Source/Modules/SemenOverlay/SemenHelper.cs
similarity index 96%
rename from Source/Common/SemenHelper.cs
rename to Source/Modules/SemenOverlay/SemenHelper.cs
index 1b85d0d5ad8bb5a942e356bd260b498af9a17449..7b40741af4a3b50de66236dbaa10956affe0e970 100644
--- a/Source/Common/SemenHelper.cs
+++ b/Source/Modules/SemenOverlay/SemenHelper.cs
@@ -232,15 +232,15 @@ namespace rjw
 			Hediff_Semen hediff;
 			if (semenType == CUM_NORMAL)
 			{
-				hediff = (Hediff_Semen)HediffMaker.MakeHediff(RJW_HediffDefOf.Hediff_Semen, receiver, null);
+				hediff = (Hediff_Semen)HediffMaker.MakeHediff(RJW_SemenoOverlayHediffDefOf.Hediff_Semen, receiver, null);
 			}
 			else if (semenType == CUM_INSECT)
 			{
-				hediff = (Hediff_Semen)HediffMaker.MakeHediff(RJW_HediffDefOf.Hediff_InsectSpunk, receiver, null);
+				hediff = (Hediff_Semen)HediffMaker.MakeHediff(RJW_SemenoOverlayHediffDefOf.Hediff_InsectSpunk, receiver, null);
 			}
 			else
 			{
-				hediff = (Hediff_Semen)HediffMaker.MakeHediff(RJW_HediffDefOf.Hediff_MechaFluids, receiver, null);
+				hediff = (Hediff_Semen)HediffMaker.MakeHediff(RJW_SemenoOverlayHediffDefOf.Hediff_MechaFluids, receiver, null);
 			}
 
 			hediff.Severity = amount;//if this body part is already maximally full -> spill over to other parts
@@ -250,16 +250,18 @@ namespace rjw
 
 			receiver.health.AddHediff(hediff, bodyPart, null, null);
 
-			if (amount > 1f)//spillover in case of very large amounts: just apply hediff a second time
-			{
-				Hediff_Semen hediff2 = (Hediff_Semen)HediffMaker.MakeHediff(hediff.def, receiver, null);
-				hediff2.semenType = semenType;
-				hediff2.Severity = amount - 1f;
-				receiver.health.AddHediff(hediff2, bodyPart, null, null);
-			}
+			//Log.Message(xxx.get_pawnname(receiver) + " cum ammount" + amount);
+			//causes significant memory leak, fixx someday
+			//if (amount > 1f)//spillover in case of very large amounts: just apply hediff a second time
+			//{
+			//	Hediff_Semen hediff2 = (Hediff_Semen)HediffMaker.MakeHediff(hediff.def, receiver, null);
+			//	hediff2.semenType = semenType;
+			//	hediff2.Severity = amount - 1f;
+			//	receiver.health.AddHediff(hediff2, bodyPart, null, null);
+			//}
 
 			//always also add bukkake hediff as manager
-			receiver.health.AddHediff(RJW_HediffDefOf.Hediff_Bukkake);
+			receiver.health.AddHediff(RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake);
 		}
 
 		//if spunk on one body part reaches a certain level, it can spill over to others, this function returns from where to where
diff --git a/Source/WorkGivers/WorkGiver_CleanSelf.cs b/Source/Modules/SemenOverlay/WorkGivers/WorkGiver_CleanSelf.cs
similarity index 90%
rename from Source/WorkGivers/WorkGiver_CleanSelf.cs
rename to Source/Modules/SemenOverlay/WorkGivers/WorkGiver_CleanSelf.cs
index 37e9aac7cd1d4ce0d82f6616de09925fe6369b43..0f1d69fad7419969b92bc64f13a4d48133ad86a9 100644
--- a/Source/WorkGivers/WorkGiver_CleanSelf.cs
+++ b/Source/Modules/SemenOverlay/WorkGivers/WorkGiver_CleanSelf.cs
@@ -30,7 +30,7 @@ namespace rjw
 		//conditions for self-cleaning job to be available
 		public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
 		{
-			Hediff hediff = pawn.health.hediffSet.hediffs.Find(x => (x.def == RJW_HediffDefOf.Hediff_Bukkake));
+			Hediff hediff = pawn.health.hediffSet.hediffs.Find(x => (x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake));
 			int minAge = 3 * 2500;//3 hours in-game must have passed
 			if (pawn == t && hediff != null && hediff.ageTicks > minAge && pawn.CanReserve(t, 1, -1, null, forced) && !xxx.DubsBadHygieneIsActive)
 			{
@@ -41,7 +41,7 @@ namespace rjw
 
 		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
 		{
-			return new Job(RJW_JobDefOf.CleanSelf);
+			return new Job(RJW_SemenOverlayJobDefOf.CleanSelf);
 		}
 	}
 }
diff --git a/Source/JobDrivers/JobDriver_WhoreInvitingVisitors.cs b/Source/Modules/Whoring/JobDrivers/JobDriver_WhoreInvitingVisitors.cs
similarity index 100%
rename from Source/JobDrivers/JobDriver_WhoreInvitingVisitors.cs
rename to Source/Modules/Whoring/JobDrivers/JobDriver_WhoreInvitingVisitors.cs
diff --git a/Source/JobDrivers/JobDriver_WhoreIsServingVisitors.cs b/Source/Modules/Whoring/JobDrivers/JobDriver_WhoreIsServingVisitors.cs
similarity index 100%
rename from Source/JobDrivers/JobDriver_WhoreIsServingVisitors.cs
rename to Source/Modules/Whoring/JobDrivers/JobDriver_WhoreIsServingVisitors.cs
diff --git a/Source/JobGivers/JobGiver_WhoreInvitingVisitors.cs b/Source/Modules/Whoring/JobGivers/JobGiver_WhoreInvitingVisitors.cs
similarity index 100%
rename from Source/JobGivers/JobGiver_WhoreInvitingVisitors.cs
rename to Source/Modules/Whoring/JobGivers/JobGiver_WhoreInvitingVisitors.cs
diff --git a/Source/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs b/Source/Modules/Whoring/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs
similarity index 100%
rename from Source/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs
rename to Source/Modules/Whoring/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs
diff --git a/Source/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs b/Source/Modules/Whoring/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs
similarity index 100%
rename from Source/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs
rename to Source/Modules/Whoring/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs
diff --git a/Source/Thoughts/ThoughtWorker_Whore.cs b/Source/Modules/Whoring/Thoughts/ThoughtWorker_Whore.cs
similarity index 100%
rename from Source/Thoughts/ThoughtWorker_Whore.cs
rename to Source/Modules/Whoring/Thoughts/ThoughtWorker_Whore.cs
diff --git a/Source/Common/Whoring_Helper.cs b/Source/Modules/Whoring/Whoring_Helper.cs
similarity index 100%
rename from Source/Common/Whoring_Helper.cs
rename to Source/Modules/Whoring/Whoring_Helper.cs
diff --git a/Source/Recipes/Recipe_Sterilize.cs b/Source/Recipes/Recipe_Sterilize.cs
deleted file mode 100644
index 0ada385b255035b342e611d10e9f2cef45ba9f2f..0000000000000000000000000000000000000000
--- a/Source/Recipes/Recipe_Sterilize.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using RimWorld;
-using System.Collections.Generic;
-using System.Linq;
-using Verse;
-
-namespace rjw
-{
-	/// <summary>
-	/// Sterilization
-	/// </summary>
-	public class Recipe_InstallImplantToExistParts : Recipe_InstallImplant
-	{
-		public override IEnumerable<BodyPartRecord> GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
-		{
-			for (int i = 0; i < recipe.appliedOnFixedBodyParts.Count; i++)
-			{
-				BodyPartDef part = recipe.appliedOnFixedBodyParts[i];
-				List<BodyPartRecord> bpList = pawn.RaceProps.body.AllParts;
-				bool blocked = Genital_Helper.genitals_blocked(pawn) || xxx.is_slime(pawn);
-				for (int j = 0; j < bpList.Count; j++)
-				{
-					BodyPartRecord record = bpList[j];
-					if (record.def == part && !blocked)
-					{
-						if (pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined).Contains(record))
-						{
-							if (!pawn.health.hediffSet.hediffs.Any((Hediff x) => x.Part == record && x.def == recipe.addsHediff))
-							{
-								yield return record;
-							}
-						}
-					}
-				}
-			}
-			yield break;
-		}
-	}
-}
diff --git a/Source/Settings/RJWPreferenceSettings.cs b/Source/Settings/RJWSexSettings.cs
similarity index 100%
rename from Source/Settings/RJWPreferenceSettings.cs
rename to Source/Settings/RJWSexSettings.cs
diff --git a/Source/Settings.cs b/Source/Settings/Settings.cs
similarity index 100%
rename from Source/Settings.cs
rename to Source/Settings/Settings.cs