Permit omission of a colon before a message-typed map value.
diff --git a/proto/decode.go b/proto/decode.go
index 88622c3..129792e 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -518,9 +518,7 @@
 	if err != nil {
 		return err
 	}
-	sp := new(string)
-	*sp = s
-	*structPointer_String(base, p.field) = sp
+	*structPointer_String(base, p.field) = &s
 	return nil
 }
 
diff --git a/proto/text_parser.go b/proto/text_parser.go
index ddd9579..d1caeff 100644
--- a/proto/text_parser.go
+++ b/proto/text_parser.go
@@ -570,7 +570,7 @@
 				if err := p.consumeToken("value"); err != nil {
 					return err
 				}
-				if err := p.consumeToken(":"); err != nil {
+				if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil {
 					return err
 				}
 				if err := p.readAny(val, props.mvalprop); err != nil {
diff --git a/proto/text_parser_test.go b/proto/text_parser_test.go
index e5ee8b9..1360e8e 100644
--- a/proto/text_parser_test.go
+++ b/proto/text_parser_test.go
@@ -463,6 +463,7 @@
 	m := new(MessageWithMap)
 	const in = `name_mapping:<key:1234 value:"Feist"> name_mapping:<key:1 value:"Beatles">` +
 		`msg_mapping:<key:-4 value:<f: 2.0>>` +
+		`msg_mapping<key:-2 value<f: 4.0>>` + // no colon after "value"
 		`byte_mapping:<key:true value:"so be it">`
 	want := &MessageWithMap{
 		NameMapping: map[int32]string{
@@ -471,6 +472,7 @@
 		},
 		MsgMapping: map[int64]*FloatingPoint{
 			-4: {F: Float64(2.0)},
+			-2: {F: Float64(4.0)},
 		},
 		ByteMapping: map[bool][]byte{
 			true: []byte("so be it"),
diff --git a/protoc-gen-go/generator/generator.go b/protoc-gen-go/generator/generator.go
index 8b02ba5..952ad56 100644
--- a/protoc-gen-go/generator/generator.go
+++ b/protoc-gen-go/generator/generator.go
@@ -102,12 +102,6 @@
 
 func (c *common) proto3() bool { return fileIsProto3(c.file) }
 
-func fileUsesMaps(file *descriptor.FileDescriptorProto) bool {
-	return true
-}
-
-func (c *common) usesMaps() bool { return fileUsesMaps(c.file) }
-
 // Descriptor represents a protocol buffer message.
 type Descriptor struct {
 	common
@@ -1018,7 +1012,7 @@
 	}
 	for _, desc := range g.file.desc {
 		// Don't generate virtual messages for maps.
-		if desc.GetOptions().GetMapEntry() && desc.usesMaps() {
+		if desc.GetOptions().GetMapEntry() {
 			continue
 		}
 		g.generateMessage(desc)
@@ -1530,7 +1524,7 @@
 
 		if *field.Type == descriptor.FieldDescriptorProto_TYPE_MESSAGE {
 			desc := g.ObjectNamed(field.GetTypeName())
-			if d, ok := desc.(*Descriptor); ok && d.GetOptions().GetMapEntry() && d.usesMaps() {
+			if d, ok := desc.(*Descriptor); ok && d.GetOptions().GetMapEntry() {
 				// Figure out the Go types and tags for the key and value types.
 				keyField, valField := d.Field[0], d.Field[1]
 				keyType, keyWire := g.GoType(d, keyField)