diff --git a/Spigot-Server-Patches/Optimize-World-Time-Updates.patch b/Spigot-Server-Patches/Optimize-World-Time-Updates.patch
new file mode 100644
index 0000000000..a1b8cff409
--- /dev/null
+++ b/Spigot-Server-Patches/Optimize-World-Time-Updates.patch
@@ -0,0 +1,43 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <aikar@aikar.co>
+Date: Fri, 2 Nov 2018 23:11:51 -0400
+Subject: [PATCH] Optimize World Time Updates
+
+Splits time updates into incremental updates as well as does
+the updates per world, so that we can re-use the same packet
+object for every player unless they have per-player time enabled.
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index 69b3218756..e47918b3db 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati
+ 
+         MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot
+         // Send time updates to everyone, it will get the right time from the world the player is in.
+-        if (this.ticks % 20 == 0) {
+-            for (int i = 0; i < this.getPlayerList().players.size(); ++i) {
+-                EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i);
+-                entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time
++        // Paper start - optimize time updates
++        for (final WorldServer world : this.getWorlds()) {
++            final boolean doDaylight = world.getGameRules().getBoolean("doDaylightCycle");
++            final long dayTime = world.getDayTime();
++            long worldTime = world.getTime();
++            final PacketPlayOutUpdateTime worldPacket = new PacketPlayOutUpdateTime(worldTime, dayTime, doDaylight);
++            for (EntityHuman entityhuman : world.players) {
++                if (!(entityhuman instanceof EntityPlayer) || (ticks + entityhuman.getId()) % 20 != 0) {
++                    continue;
++                }
++                EntityPlayer entityplayer = (EntityPlayer) entityhuman;
++                long playerTime = entityplayer.getPlayerTime();
++                PacketPlayOutUpdateTime packet = (playerTime == dayTime) ? worldPacket :
++                    new PacketPlayOutUpdateTime(worldTime, playerTime, doDaylight);
++                entityplayer.playerConnection.sendPacket(packet); // Add support for per player time
+             }
+         }
++        // Paper end
+         MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot
+ 
+         // WorldServer worldserver; // CraftBukkit - dropped down
+--
\ No newline at end of file