Index: binary-improvements2/WebServer/ModInfo.xml
===================================================================
--- binary-improvements2/WebServer/ModInfo.xml	(revision 435)
+++ binary-improvements2/WebServer/ModInfo.xml	(revision 436)
@@ -5,5 +5,5 @@
 	<Description value="Integrated Webserver for the Web Dashboard and server APIs" />
 	<Author value="The Fun Pimps LLC" />
-	<Version value="21.0.289.0" />
+	<Version value="21.0.289.1" />
 	<Website value="" />
 </xml>
Index: binary-improvements2/WebServer/WebServer.csproj
===================================================================
--- binary-improvements2/WebServer/WebServer.csproj	(revision 435)
+++ binary-improvements2/WebServer/WebServer.csproj	(revision 436)
@@ -120,4 +120,5 @@
     <Compile Include="src\WebAPI\AbsRestApi.cs" />
     <Compile Include="src\WebAPI\AbsWebAPI.cs" />
+    <Compile Include="src\WebAPI\APIs\Bloodmoon.cs" />
     <Compile Include="src\WebAPI\APIs\Command.cs" />
     <Compile Include="src\WebAPI\APIs\GameData\Item.cs" />
@@ -135,5 +136,4 @@
     <Compile Include="src\WebAPI\APIs\ServerInfo.cs" />
     <Compile Include="src\WebAPI\APIs\ServerStats.cs" />
-    <Compile Include="src\WebAPI\APIs\WebUiUpdates.cs" />
     <Compile Include="src\WebAPI\APIs\WorldState\Animal.cs" />
     <Compile Include="src\WebAPI\APIs\WorldState\GetLandClaims.cs" />
Index: binary-improvements2/WebServer/src/WebAPI/APIs/Bloodmoon.cs
===================================================================
--- binary-improvements2/WebServer/src/WebAPI/APIs/Bloodmoon.cs	(revision 436)
+++ binary-improvements2/WebServer/src/WebAPI/APIs/Bloodmoon.cs	(revision 436)
@@ -0,0 +1,39 @@
+using JetBrains.Annotations;
+using Utf8Json;
+
+namespace Webserver.WebAPI.APIs {
+	[UsedImplicitly]
+	public class Bloodmoon : AbsRestApi {
+		private static readonly byte[] jsonKeyGameTime = JsonWriter.GetEncodedPropertyNameWithBeginObject ("gameTime");
+		private static readonly byte[] jsonKeyBloodmoonActive = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("bloodmoonActive");
+		private static readonly byte[] jsonKeyNextBloodmoon = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("nextBloodmoon");
+		private static readonly byte[] jsonKeyNextBloodmoonEnd = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("nextBloodmoonEnd");
+
+		protected override void HandleRestGet (RequestContext _context) {
+			ulong currentWorldTime = GameManager.Instance.World.worldTime;
+			(int currentDay, int currentHour, int currentMinut) = GameUtils.WorldTimeToElements (currentWorldTime);
+
+			int nextBloodmoonDay = GameStats.GetInt (EnumUtils.Parse<EnumGameStats> (nameof (EnumGameStats.BloodMoonDay)));
+
+			(int duskHour, int dawnHour) duskDawnHours = GameUtils.CalcDuskDawnHours (GamePrefs.GetInt (EnumUtils.Parse<EnumGamePrefs> (nameof (EnumGamePrefs.DayLightLength))));
+
+			PrepareEnvelopedResult (out JsonWriter writer);
+			
+			writer.WriteRaw (jsonKeyGameTime);
+			JsonCommons.WriteGameTimeObject (ref writer, currentDay, currentHour, currentMinut);
+
+			writer.WriteRaw (jsonKeyBloodmoonActive);
+			writer.WriteBoolean (GameUtils.IsBloodMoonTime (currentWorldTime, duskDawnHours, nextBloodmoonDay));
+			
+			writer.WriteRaw (jsonKeyNextBloodmoon);
+			JsonCommons.WriteGameTimeObject (ref writer, nextBloodmoonDay, duskDawnHours.duskHour, 0);
+			
+			writer.WriteRaw (jsonKeyNextBloodmoonEnd);
+			JsonCommons.WriteGameTimeObject (ref writer, nextBloodmoonDay + 1, duskDawnHours.dawnHour, 0);
+			
+			writer.WriteEndObject ();
+
+			SendEnvelopedResult (_context, ref writer);
+		}
+	}
+}
Index: binary-improvements2/WebServer/src/WebAPI/APIs/ServerStats.cs
===================================================================
--- binary-improvements2/WebServer/src/WebAPI/APIs/ServerStats.cs	(revision 435)
+++ binary-improvements2/WebServer/src/WebAPI/APIs/ServerStats.cs	(revision 436)
@@ -12,7 +12,4 @@
 		private static readonly byte[] jsonKeyAnimals = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("animals");
 		
-		private static readonly byte[] jsonKeyDays = JsonWriter.GetEncodedPropertyNameWithBeginObject ("days");
-		private static readonly byte[] jsonKeyHours = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("hours");
-		private static readonly byte[] jsonKeyMinutes = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("minutes");
 
 		protected override void HandleRestGet (RequestContext _context) {
@@ -20,17 +17,6 @@
 			
 			writer.WriteRaw (jsonKeyGameTime);
-
 			(int days, int hours, int minutes) = GameUtils.WorldTimeToElements (GameManager.Instance.World.worldTime);
-			
-			writer.WriteRaw (jsonKeyDays);
-			writer.WriteInt32 (days);
-			
-			writer.WriteRaw (jsonKeyHours);
-			writer.WriteInt32 (hours);
-			
-			writer.WriteRaw (jsonKeyMinutes);
-			writer.WriteInt32 (minutes);
-			
-			writer.WriteEndObject ();
+			JsonCommons.WriteGameTimeObject (ref writer, days, hours, minutes);
 
 			writer.WriteRaw (jsonKeyPlayers);
Index: binary-improvements2/WebServer/src/WebAPI/APIs/WebUiUpdates.cs
===================================================================
--- binary-improvements2/WebServer/src/WebAPI/APIs/WebUiUpdates.cs	(revision 435)
+++ 	(revision )
@@ -1,62 +1,0 @@
-using JetBrains.Annotations;
-using Utf8Json;
-using Webserver.LiveData;
-using Webserver.Permissions;
-
-namespace Webserver.WebAPI.APIs {
-	[UsedImplicitly]
-	public class WebUiUpdates : AbsRestApi {
-		private static readonly byte[] jsonKeyGameTime = JsonWriter.GetEncodedPropertyNameWithBeginObject ("gameTime");
-		private static readonly byte[] jsonKeyPlayers = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("players");
-		private static readonly byte[] jsonKeyHostiles = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("hostiles");
-		private static readonly byte[] jsonKeyAnimals = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("animals");
-		private static readonly byte[] jsonKeyNewLogs = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("newLogs");
-		
-		private static readonly byte[] jsonKeyDays = JsonWriter.GetEncodedPropertyNameWithBeginObject ("days");
-		private static readonly byte[] jsonKeyHours = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("hours");
-		private static readonly byte[] jsonKeyMinutes = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("minutes");
-
-		
-		protected override void HandleRestGet (RequestContext _context) {
-			if (_context.Request.QueryString ["latestLine"] == null ||
-			    !int.TryParse (_context.Request.QueryString ["latestLine"], out int latestLine)) {
-				latestLine = 0;
-			}
-			
-			PrepareEnvelopedResult (out JsonWriter writer);
-			
-			writer.WriteRaw (jsonKeyGameTime);
-
-			(int days, int hours, int minutes) = GameUtils.WorldTimeToElements (GameManager.Instance.World.worldTime);
-			
-			writer.WriteRaw (jsonKeyDays);
-			writer.WriteInt32 (days);
-			
-			writer.WriteRaw (jsonKeyHours);
-			writer.WriteInt32 (hours);
-			
-			writer.WriteRaw (jsonKeyMinutes);
-			writer.WriteInt32 (minutes);
-			
-			writer.WriteEndObject ();
-
-			writer.WriteRaw (jsonKeyPlayers);
-			writer.WriteInt32 (GameManager.Instance.World.Players.Count);
-			
-			writer.WriteRaw (jsonKeyHostiles);
-			writer.WriteInt32 (Hostiles.Instance.GetCount ());
-			
-			writer.WriteRaw (jsonKeyAnimals);
-			writer.WriteInt32 (Animals.Instance.GetCount ());
-			
-			writer.WriteRaw (jsonKeyNewLogs);
-			writer.WriteInt32 (LogBuffer.Instance.LatestLine - latestLine);
-
-			writer.WriteEndObject ();
-
-			SendEnvelopedResult (_context, ref writer);
-		}
-
-		public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
-	}
-}
Index: binary-improvements2/WebServer/src/WebAPI/JsonCommons.cs
===================================================================
--- binary-improvements2/WebServer/src/WebAPI/JsonCommons.cs	(revision 435)
+++ binary-improvements2/WebServer/src/WebAPI/JsonCommons.cs	(revision 436)
@@ -33,4 +33,21 @@
 			_writer.WriteRaw (jsonKeyPositionZ);
 			_writer.WriteSingle (_position.z);
+			
+			_writer.WriteEndObject ();
+		}
+
+		private static readonly byte[] jsonKeyDays = JsonWriter.GetEncodedPropertyNameWithBeginObject ("days");
+		private static readonly byte[] jsonKeyHours = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("hours");
+		private static readonly byte[] jsonKeyMinutes = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("minutes");
+
+		public static void WriteGameTimeObject (ref JsonWriter _writer, int _days, int _hours, int _minutes) {
+			_writer.WriteRaw (jsonKeyDays);
+			_writer.WriteInt32 (_days);
+			
+			_writer.WriteRaw (jsonKeyHours);
+			_writer.WriteInt32 (_hours);
+			
+			_writer.WriteRaw (jsonKeyMinutes);
+			_writer.WriteInt32 (_minutes);
 			
 			_writer.WriteEndObject ();
Index: binary-improvements2/bin/Mods/TFP_WebServer/ModInfo.xml
===================================================================
--- binary-improvements2/bin/Mods/TFP_WebServer/ModInfo.xml	(revision 435)
+++ binary-improvements2/bin/Mods/TFP_WebServer/ModInfo.xml	(revision 436)
@@ -5,5 +5,5 @@
 	<Description value="Integrated Webserver for the Web Dashboard and server APIs" />
 	<Author value="The Fun Pimps LLC" />
-	<Version value="21.0.289.0" />
+	<Version value="21.0.289.1" />
 	<Website value="" />
 </xml>
