add movable String interface Reflection
diff --git a/src/google/protobuf/extension_set.h b/src/google/protobuf/extension_set.h
index 81de4a4..70d416f 100644
--- a/src/google/protobuf/extension_set.h
+++ b/src/google/protobuf/extension_set.h
@@ -269,6 +269,7 @@
   void SetBool(int number, FieldType type, bool value, desc);
   void SetEnum(int number, FieldType type, int value, desc);
   void SetString(int number, FieldType type, const std::string& value, desc);
+  void SetString(int number, FieldType type, std::string&& value, desc);
   std::string* MutableString(int number, FieldType type, desc);
   MessageLite* MutableMessage(int number, FieldType type,
                               const MessageLite& prototype, desc);
@@ -332,6 +333,7 @@
   void SetRepeatedBool(int number, int index, bool value);
   void SetRepeatedEnum(int number, int index, int value);
   void SetRepeatedString(int number, int index, const std::string& value);
+  void SetRepeatedString(int number, int index, std::string&& value);
   std::string* MutableRepeatedString(int number, int index);
   MessageLite* MutableRepeatedMessage(int number, int index);
 
@@ -345,6 +347,7 @@
   void AddBool(int number, FieldType type, bool packed, bool value, desc);
   void AddEnum(int number, FieldType type, bool packed, int value, desc);
   void AddString(int number, FieldType type, const std::string& value, desc);
+  void AddString(int number, FieldType type, std::string&& value, desc);
   std::string* AddString(int number, FieldType type, desc);
   MessageLite* AddMessage(int number, FieldType type,
                           const MessageLite& prototype, desc);
@@ -862,16 +865,29 @@
                                     const FieldDescriptor* descriptor) {
   MutableString(number, type, descriptor)->assign(value);
 }
+inline void ExtensionSet::SetString(int number, FieldType type,
+                                    std::string&& value,
+                                    const FieldDescriptor* descriptor) {
+  *MutableString(number, type, descriptor) = std::move(value);
+}
 inline void ExtensionSet::SetRepeatedString(int number, int index,
                                             const std::string& value) {
   MutableRepeatedString(number, index)->assign(value);
 }
+inline void ExtensionSet::SetRepeatedString(int number, int index,
+                                            std::string&& value) {
+  *MutableRepeatedString(number, index) = std::move(value);
+}
 inline void ExtensionSet::AddString(int number, FieldType type,
                                     const std::string& value,
                                     const FieldDescriptor* descriptor) {
   AddString(number, type, descriptor)->assign(value);
 }
-
+inline void ExtensionSet::AddString(int number, FieldType type,
+                                    std::string&& value,
+                                    const FieldDescriptor* descriptor) {
+  *AddString(number, type, descriptor) = std::move(value);
+}
 // ===================================================================
 // Glue for generated extension accessors
 
diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc
index c421b23..e987d74 100644
--- a/src/google/protobuf/generated_message_reflection.cc
+++ b/src/google/protobuf/generated_message_reflection.cc
@@ -1224,11 +1224,11 @@
 
 
 void Reflection::SetString(Message* message, const FieldDescriptor* field,
-                           const std::string&& value) const {
+                           std::string&& value) const {
   USAGE_CHECK_ALL(SetString, SINGULAR, STRING);
   if (field->is_extension()) {
     return MutableExtensionSet(message)->SetString(field->number(),
-                                                   field->type(), value, field);
+                                                   field->type(), std::move(value), field);
   } else {
     switch (field->options().ctype()) {
       default:  // TODO(kenton):  Support other string reps.
@@ -1247,7 +1247,7 @@
               ->UnsafeSetDefault(default_ptr);
         }
         *(MutableField<ArenaStringPtr>(message, field)
-            ->Mutable(default_ptr, GetArena(message))) = value;
+            ->Mutable(default_ptr, GetArena(message))) = std::move(value);
         break;
       }
     }
@@ -1304,6 +1304,23 @@
 }
 
 
+void Reflection::SetRepeatedString(Message* message,
+                                   const FieldDescriptor* field, int index,
+                                   std::string&& value) const {
+  USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
+  if (field->is_extension()) {
+    MutableExtensionSet(message)->SetRepeatedString(field->number(), index,
+                                                    std::move(value));
+  } else {
+    switch (field->options().ctype()) {
+      default:  // TODO(kenton):  Support other string reps.
+      case FieldOptions::STRING:
+        *MutableRepeatedField<std::string>(message, field, index) = std::move(value);
+        break;
+    }
+  }
+}
+
 void Reflection::AddString(Message* message, const FieldDescriptor* field,
                            const std::string& value) const {
   USAGE_CHECK_ALL(AddString, REPEATED, STRING);
@@ -1321,6 +1338,22 @@
 }
 
 
+void Reflection::AddString(Message* message, const FieldDescriptor* field,
+                           std::string&& value) const {
+  USAGE_CHECK_ALL(AddString, REPEATED, STRING);
+  if (field->is_extension()) {
+    MutableExtensionSet(message)->AddString(field->number(), field->type(),
+                                            std::move(value), field);
+  } else {
+    switch (field->options().ctype()) {
+      default:  // TODO(kenton):  Support other string reps.
+      case FieldOptions::STRING:
+        *AddField<std::string>(message, field) = std::move(value);
+        break;
+    }
+  }
+}
+
 // -------------------------------------------------------------------
 
 const EnumValueDescriptor* Reflection::GetEnum(
diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h
index df61341..4ff91ae 100644
--- a/src/google/protobuf/message.h
+++ b/src/google/protobuf/message.h
@@ -541,7 +541,7 @@
   void SetString(Message* message, const FieldDescriptor* field,
                  const std::string& value) const;
   void SetString(Message* message, const FieldDescriptor* field,
-                 const std::string&& value) const;
+                 std::string&& value) const;
   void SetEnum(Message* message, const FieldDescriptor* field,
                const EnumValueDescriptor* value) const;
   // Set an enum field's value with an integer rather than EnumValueDescriptor.
@@ -642,6 +642,8 @@
                        int index, bool value) const;
   void SetRepeatedString(Message* message, const FieldDescriptor* field,
                          int index, const std::string& value) const;
+  void SetRepeatedString(Message* message, const FieldDescriptor* field,
+                         int index, std::string&& value) const;
   void SetRepeatedEnum(Message* message, const FieldDescriptor* field,
                        int index, const EnumValueDescriptor* value) const;
   // Set an enum field's value with an integer rather than EnumValueDescriptor.
@@ -679,6 +681,8 @@
                bool value) const;
   void AddString(Message* message, const FieldDescriptor* field,
                  const std::string& value) const;
+  void AddString(Message* message, const FieldDescriptor* field,
+                 std::string&& value) const;
   void AddEnum(Message* message, const FieldDescriptor* field,
                const EnumValueDescriptor* value) const;
   // Add an integer value to a repeated enum field rather than