Fix #2566
diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x
index a5ee5a6..bff23bc 100644
--- a/release-notes/CREDITS-2.x
+++ b/release-notes/CREDITS-2.x
@@ -1012,3 +1012,8 @@
 Stefan Wendt (stewe@github)
   * Reported #2560: Check `WRAP_EXCEPTIONS` in `CollectionDeserializer.handleNonArray()`
   (2.10.2)
+
+Greg Arakelian (arakelian@github)
+  * Reported #2566: `MissingNode.toString()` returns `null` (4 character token) instead
+    of empty string
+  (2.10.2)
diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x
index 832ab09..01146d4 100644
--- a/release-notes/VERSION-2.x
+++ b/release-notes/VERSION-2.x
@@ -15,7 +15,9 @@
 #2560: Check `WRAP_EXCEPTIONS` in `CollectionDeserializer.handleNonArray()`
  (reported by Stefan W)
 #2564: Fix `IllegalArgumentException` on empty input collection for `ArrayBlockingQueue`
- (repoted, fix suggested by yamert89@github)
+ (reported, fix suggested by yamert89@github)
+#2566: `MissingNode.toString()` returns `null` (4 character token) instead of empty string
+ (reported by Greg A)
 #2567: Incorrect target type for arrays when providing nulls and nulls are disabled
  (reported by João G)
 
diff --git a/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java b/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java
index 82da773..ea090f0 100644
--- a/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java
+++ b/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java
@@ -127,7 +127,7 @@
 
    /*
    /**********************************************************
-   /* Std method overrides
+   /* Standard method overrides
    /**********************************************************
     */
 
diff --git a/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java b/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java
index 7827ee1..120b36c 100644
--- a/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java
+++ b/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java
@@ -70,9 +70,15 @@
     public double asDouble(double defaultValue);
     public boolean asBoolean(boolean defaultValue);
     */
+
+    /*
+    /**********************************************************
+    /* Serialization: bit tricky as we don't really have a value
+    /**********************************************************
+     */
     
     @Override
-    public final void serialize(JsonGenerator jg, SerializerProvider provider)
+    public final void serialize(JsonGenerator g, SerializerProvider provider)
         throws IOException, JsonProcessingException
     {
         /* Nothing to output... should we signal an error tho?
@@ -81,7 +87,7 @@
          * cannot just omit a value as JSON Object field name may have
          * been written out.
          */
-        jg.writeNull();
+        g.writeNull();
     }
 
     @Override
@@ -91,21 +97,13 @@
     {
         g.writeNull();
     }
-    
-    @Override
-    public boolean equals(Object o)
-    {
-        /* Hmmh. Since there's just a singleton instance, this
-         * fails in all cases but with identity comparison.
-         * However: if this placeholder value was to be considered
-         * similar to SQL NULL, it shouldn't even equal itself?
-         * That might cause problems when dealing with collections
-         * like Sets... so for now, let's let identity comparison
-         * return true.
-         */
-        return (o == this);
-    }
 
+    /*
+    /**********************************************************
+    /* Jackson 2.10 improvements for validation
+    /**********************************************************
+     */
+    
     @SuppressWarnings("unchecked")
     @Override
     public JsonNode require() {
@@ -122,4 +120,34 @@
     public int hashCode() {
         return JsonNodeType.MISSING.ordinal();
     }
+
+    /*
+    /**********************************************************
+    /* Standard method overrides
+    /**********************************************************
+     */
+
+    // 10-Dec-2019, tatu: Bit tricky case, see [databind#2566], but seems
+    //    best NOT to produce legit JSON.
+    @Override
+    public String toString() {
+        return "";
+    }
+
+    @Override
+    public String toPrettyString() {
+        return "";
+    }
+    
+    @Override
+    public boolean equals(Object o)
+    {
+        /* Hmmh. Since there's just a singleton instance, this fails in all cases but with
+         * identity comparison. However: if this placeholder value was to be considered
+         * similar to SQL NULL, it shouldn't even equal itself?
+         * That might cause problems when dealing with collections like Sets...
+         * so for now, let's let identity comparison return true.
+         */
+        return (o == this);
+    }
 }
diff --git a/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java b/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java
index 01448ef..91c1f60 100644
--- a/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java
+++ b/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java
@@ -16,7 +16,9 @@
         assertEquals("", n.asText());
         assertStandardEquals(n);
         // 10-Dec-2018, tatu: With 2.10, should serialize same as via ObjectMapper/ObjectWriter
-        assertEquals("null", n.toString());
+        // 10-Dec-2019, tatu: Surprise! No, this is not how it worked in 2.9, nor does it make
+        //    sense... see [databind#2566] for details
+        assertEquals("", n.toString());
 
         assertNodeNumbersForNonNumeric(n);