diff --git a/Source/Modules/SemenOverlay/SemenHelper.cs b/Source/Modules/SemenOverlay/SemenHelper.cs
index 7b40741af4a3b50de66236dbaa10956affe0e970..ec6f971d1e4d46c5d3f455c69d859a1c8add14a0 100644
--- a/Source/Modules/SemenOverlay/SemenHelper.cs
+++ b/Source/Modules/SemenOverlay/SemenHelper.cs
@@ -361,12 +361,12 @@ namespace rjw
 			Pawn giver, receiver;
 
 			//dispenser of the seed
-			if (pawn.gender == Gender.Male || pawn.RaceProps.IsMechanoid || xxx.is_insect(pawn))
+			if (Genital_Helper.has_penis(pawn) || xxx.is_mechanoid(pawn) || xxx.is_insect(pawn))
 			{
 				giver = pawn;
 				receiver = partner;
 			}
-			else if (partner != null && (partner.gender == Gender.Male || partner.RaceProps.IsMechanoid || xxx.is_insect(partner)))
+			else if (partner != null && (Genital_Helper.has_penis(partner) || xxx.is_mechanoid(partner) || xxx.is_insect(partner)))
 			{
 				giver = partner;
 				receiver = pawn;
@@ -376,6 +376,9 @@ namespace rjw
 				return;
 			}
 
+			//slimes do not waste fluids?
+			//if (xxx.is_slime(giver)) return;
+
 			//determine entity:
 			int entityType = SemenHelper.CUM_NORMAL;
 			if (xxx.is_mechanoid(giver))
@@ -502,12 +505,37 @@ namespace rjw
 
 				if (cumAmount > 0)
 				{
-					SemenHelper.cumOn(giver, genitals, cumAmount * 0.3f, giver, entityType);//cum on self - smaller amount
-					foreach (BodyPartRecord bpr in targetParts)
+					if (xxx.is_slime(receiver))
+					{
+						//slime absorb cum
+						//this needs balancing, since cumamount ranges 0-10(?) which is fine for cum/hentai but not very realistic for feeding
+						//using TransferNutrition for now
+						//Log.Message("cumAmount " + cumAmount);
+						//float nutrition_amount = cumAmount/10;
+
+						Need_Food need = need = giver.needs.TryGetNeed<Need_Food>();
+						if (need == null)
+						{
+							//Log.Message("xxx::TransferNutrition() " + xxx.get_pawnname(pawn) + " doesn't track nutrition in itself, probably shouldn't feed the others");
+							return;
+						}
+
+						if (receiver?.needs?.TryGetNeed<Need_Food>() != null)
+						{
+							//Log.Message("xxx::TransferNutrition() " +  xxx.get_pawnname(partner) + " can receive");
+							float nutrition_amount = Math.Min(need.MaxLevel / 15f, need.CurLevel); //body size is taken into account implicitly by need.MaxLevel
+							receiver.needs.food.CurLevel += nutrition_amount;
+						}
+					}
+					else
 					{
-						if (bpr != null)
+						SemenHelper.cumOn(giver, genitals, cumAmount * 0.3f, giver, entityType);//cum on self - smaller amount
+						foreach (BodyPartRecord bpr in targetParts)
 						{
-							SemenHelper.cumOn(receiver, bpr, cumAmount, giver, entityType);//cum on partner
+							if (bpr != null)
+							{
+								SemenHelper.cumOn(receiver, bpr, cumAmount, giver, entityType);//cum on partner
+							}
 						}
 					}
 				}