diff --git a/go.mod b/go.mod
index 131aeafb..aa0e421 100644
--- a/go.mod
+++ b/go.mod
@@ -2,7 +2,7 @@
 
 require (
 	github.com/golang/protobuf v1.2.0
-	github.com/google/go-cmp v0.2.0
+	github.com/google/go-cmp v0.2.1-0.20181101181452-745b8ec83783
 	golang.org/x/net v0.0.0-20180821023952-922f4815f713 // indirect
 	golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect
 	golang.org/x/tools v0.0.0-20180904205237-0aa4b8830f48
diff --git a/go.sum b/go.sum
index 51e6c99..d9fd37c 100644
--- a/go.sum
+++ b/go.sum
@@ -1,7 +1,7 @@
 github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.2.1-0.20181101181452-745b8ec83783 h1:wVZ6laEGf86tNDTpR5mxFyFIclJJiXCxuJhcQKnsOHk=
+github.com/google/go-cmp v0.2.1-0.20181101181452-745b8ec83783/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 golang.org/x/net v0.0.0-20180821023952-922f4815f713 h1:rMJUcaDGbG+X967I4zGKCq5laYqcGKJmpB+3jhpOhPw=
 golang.org/x/net v0.0.0-20180821023952-922f4815f713/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
diff --git a/internal/encoding/text/encode.go b/internal/encoding/text/encode.go
index 1eae1f3..f7d185a 100644
--- a/internal/encoding/text/encode.go
+++ b/internal/encoding/text/encode.go
@@ -6,6 +6,7 @@
 
 import (
 	"bytes"
+	"math/rand"
 	"strings"
 
 	"github.com/golang/protobuf/v2/internal/errors"
@@ -104,6 +105,7 @@
 			p.out = append(p.out, p.newline...)
 		}
 	}
+	spaceAdded := false
 	for i, item := range items {
 		p.out = append(p.out, p.indents...)
 		if err := p.marshalKey(item[0]); !p.nerr.Merge(err) {
@@ -113,12 +115,25 @@
 		if len(p.indent) > 0 {
 			p.out = append(p.out, ' ')
 		}
+		// For multi-line output, add a random extra space after key: per message to
+		// make output unstable.
+		if !spaceAdded && len(p.indent) > 0 && rand.Intn(2) == 1 {
+			p.out = append(p.out, ' ')
+			spaceAdded = true
+		}
+
 		if err := p.marshalValue(item[1]); !p.nerr.Merge(err) {
 			return err
 		}
 		if i < len(items)-1 && len(p.indent) == 0 {
 			p.out = append(p.out, ' ')
 		}
+		// For single-line output, add a random extra space after a field per message to
+		// make output unstable.
+		if !spaceAdded && len(p.indent) == 0 && i != len(items)-1 && rand.Intn(2) == 1 {
+			p.out = append(p.out, ' ')
+			spaceAdded = true
+		}
 		p.out = append(p.out, p.newline...)
 	}
 	if emitDelims {
diff --git a/internal/encoding/text/text_test.go b/internal/encoding/text/text_test.go
index b5ca63c..221d6ab 100644
--- a/internal/encoding/text/text_test.go
+++ b/internal/encoding/text/text_test.go
@@ -7,6 +7,7 @@
 import (
 	"fmt"
 	"math"
+	"regexp"
 	"strings"
 	"testing"
 	"unicode/utf8"
@@ -17,13 +18,15 @@
 	"github.com/google/go-cmp/cmp/cmpopts"
 )
 
+var S = fmt.Sprintf
+var V = ValueOf
+var ID = func(n protoreflect.Name) Value { return V(n) }
+
+type Lst = []Value
+type Msg = [][2]Value
+
 func Test(t *testing.T) {
 	const space = " \n\r\t"
-	var S = fmt.Sprintf
-	var V = ValueOf
-	var ID = func(n protoreflect.Name) Value { return V(n) }
-	type Lst = []Value
-	type Msg = [][2]Value
 
 	tests := []struct {
 		in             string
@@ -824,7 +827,7 @@
 				if err != nil {
 					t.Errorf("Marshal(): got %v, want nil error", err)
 				}
-				if string(gotOut) != tt.wantOut {
+				if removeRandomSpace(gotOut, false) != tt.wantOut {
 					t.Errorf("Marshal():\ngot:  %s\nwant: %s", gotOut, tt.wantOut)
 				}
 			}
@@ -833,7 +836,7 @@
 				if err != nil {
 					t.Errorf("Marshal(Bracket): got %v, want nil error", err)
 				}
-				if string(gotOut) != tt.wantOutBracket {
+				if removeRandomSpace(gotOut, false) != tt.wantOutBracket {
 					t.Errorf("Marshal(Bracket):\ngot:  %s\nwant: %s", gotOut, tt.wantOutBracket)
 				}
 			}
@@ -842,7 +845,7 @@
 				if err != nil {
 					t.Errorf("Marshal(ASCII): got %v, want nil error", err)
 				}
-				if string(gotOut) != tt.wantOutASCII {
+				if removeRandomSpace(gotOut, false) != tt.wantOutASCII {
 					t.Errorf("Marshal(ASCII):\ngot:  %s\nwant: %s", gotOut, tt.wantOutASCII)
 				}
 			}
@@ -851,10 +854,24 @@
 				if err != nil {
 					t.Errorf("Marshal(Indent): got %v, want nil error", err)
 				}
-				if string(gotOut) != tt.wantOutIndent {
+				if removeRandomSpace(gotOut, true) != tt.wantOutIndent {
 					t.Errorf("Marshal(Indent):\ngot:  %s\nwant: %s", gotOut, tt.wantOutIndent)
 				}
 			}
 		})
 	}
 }
+
+var expandedRE = regexp.MustCompile(":  +")
+
+// This works only for the test cases above.
+func removeRandomSpace(b []byte, useIndent bool) string {
+	s := string(b)
+	if useIndent {
+		return expandedRE.ReplaceAllString(s, ": ")
+	}
+	s = strings.Replace(s, "  ", " ", -1)
+	s = strings.Replace(s, " }", "}", -1)
+	s = strings.Replace(s, " >", ">", -1)
+	return strings.TrimRight(s, " ")
+}
