diff --git a/Spigot-Server-Patches/0399-Strip-private-area-unicode-characters-from-signs.patch b/Spigot-Server-Patches/0399-Strip-private-area-unicode-characters-from-signs.patch
new file mode 100644
index 0000000000..adb6be2265
--- /dev/null
+++ b/Spigot-Server-Patches/0399-Strip-private-area-unicode-characters-from-signs.patch
@@ -0,0 +1,93 @@
+From 74d15ab6f2245fde253e1718bc7269170716f2b7 Mon Sep 17 00:00:00 2001
+From: Zach Brown <zach@zachbr.io>
+Date: Tue, 23 Oct 2018 20:53:43 -0400
+Subject: [PATCH] Strip private area unicode characters from signs
+
+It is not immediately clear how these characters ended up on signs in
+previous versions. It is clear, however, that they now render as empty
+unicode boxes in 1.13, whereas previously they rendered as invisible
+characters.
+
+When these signs are loaded in versions after this commit, these
+characters from the private use area of the Unicode block will be
+stripped. The sign will then be marked to ensure this conversion only
+runs once.
+
+There is a flag -DPaper.keepInvalidUnicode=true that can be used if you
+do not want us to strip these characters from your signs, though I can
+think of no reason to use it.
+
+Fixes GH-1571
+
+diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java
+index 20dc3f272..3c712fc93 100644
+--- a/src/main/java/net/minecraft/server/TileEntitySign.java
++++ b/src/main/java/net/minecraft/server/TileEntitySign.java
+@@ -11,6 +11,11 @@ public class TileEntitySign extends TileEntity implements ICommandListener {
+     private EntityHuman g;
+     private final String[] h = new String[4];
+ 
++    // Paper start - Strip invalid unicode from signs on load
++    private static final boolean keepInvalidUnicode = Boolean.getBoolean("Paper.keepInvalidUnicode"); // Allow people to keep their bad unicode if they really want it
++    private boolean privateUnicodeRemoved = false;
++    // Paper end
++
+     public TileEntitySign() {
+         super(TileEntityTypes.SIGN);
+     }
+@@ -30,6 +35,12 @@ public class TileEntitySign extends TileEntity implements ICommandListener {
+         }
+         // CraftBukkit end
+ 
++        // Paper start - Only remove private area unicode once
++        if (this.privateUnicodeRemoved) {
++            nbttagcompound.setBoolean("Paper.RemovedPrivateUnicode", true);
++        }
++        // Paper end
++
+         return nbttagcompound;
+     }
+ 
+@@ -37,6 +48,11 @@ public class TileEntitySign extends TileEntity implements ICommandListener {
+         this.isEditable = false;
+         super.load(nbttagcompound);
+ 
++        // Paper start - Keep track, only do it once per sign
++        this.privateUnicodeRemoved = nbttagcompound.getBoolean("Paper.RemovedPrivateUnicode");
++        boolean ranUnicodeRemoval = false;
++        // Paper end
++
+         // CraftBukkit start - Add an option to convert signs correctly
+         // This is done with a flag instead of all the time because
+         // we have no way to tell whether a sign is from 1.7.10 or 1.8
+@@ -49,6 +65,19 @@ public class TileEntitySign extends TileEntity implements ICommandListener {
+                 s = "\"\"";
+             }
+ 
++            // Paper start - Strip private use area unicode from signs
++            if (s != null && !keepInvalidUnicode && !this.privateUnicodeRemoved) {
++                StringBuilder builder = new StringBuilder();
++                for (char character : s.toCharArray()) {
++                    if (Character.UnicodeBlock.of(character) != Character.UnicodeBlock.PRIVATE_USE_AREA) {
++                        builder.append(character);
++                    }
++                }
++                s = builder.toString();
++                ranUnicodeRemoval = true;
++            }
++            // Paper end
++
+             try {
+                 //IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s); // Paper - move down - the old format might throw a json error
+ 
+@@ -75,6 +104,7 @@ public class TileEntitySign extends TileEntity implements ICommandListener {
+             this.h[i] = null;
+         }
+ 
++        if (ranUnicodeRemoval) this.privateUnicodeRemoved = true; // Paper - Flag to write NBT
+     }
+ 
+     public void a(int i, IChatBaseComponent ichatbasecomponent) {
+-- 
+2.19.1
+