diff --git a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
index f6507e1cb5..5b49dcc75b 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
@@ -48,7 +48,7 @@ limitations under the License.
       
         Save
+            disabled="[[_saveDisabled]]">Save
         Cancel
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js
index 3eb7405db8..77e227271a 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js
+++ b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js
@@ -31,19 +31,24 @@
 
     properties: {
       content: {
-        type: String,
         notify: true,
+        type: String,
       },
       disabled: {
-        type: Boolean,
         reflectToAttribute: true,
-      },
-      editing: {
         type: Boolean,
         value: false,
-        observer: '_editingChanged',
       },
-
+      editing: {
+        observer: '_editingChanged',
+        type: Boolean,
+        value: false,
+      },
+      _saveDisabled: {
+        computed: '_computeSaveDisabled(disabled, content, _newContent)',
+        type: Boolean,
+        value: true,
+      },
       _newContent: String,
     },
 
@@ -56,6 +61,10 @@
       this._newContent = this.content;
     },
 
+    _computeSaveDisabled: function(disabled, content, newContent) {
+      return disabled || (content === newContent);
+    },
+
     _handleSave: function(e) {
       e.preventDefault();
       this.fire('editable-content-save', {content: this._newContent});
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html
index bfeb4be8e4..999f171d7f 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html
@@ -54,11 +54,35 @@ limitations under the License.
       MockInteractions.tap(element.$$('gr-button:not([primary])'));
     });
 
-    test('editing content updates', function() {
+    test('enabling editing updates edit field contents', function() {
       element.content = 'current content';
       element._newContent = 'stale content';
       element.editing = true;
       assert.equal(element._newContent, 'current content');
     });
+
+    test('disabling editing does not update edit field contents', function() {
+      element.content = 'current content';
+      element.editing = true;
+      element._newContent = 'stale content';
+      element.editing = false;
+      assert.equal(element._newContent, 'stale content');
+    });
+
+    suite('editing', function() {
+      setup(function() {
+        element.content = 'current content';
+        element.editing = true;
+      });
+
+      test('save button is disabled initially', function() {
+        assert.isTrue(element.$$('gr-button[primary]').disabled);
+      });
+
+      test('save button is enabled when content changes', function() {
+        element._newContent = 'new content';
+        assert.isFalse(element.$$('gr-button[primary]').disabled);
+      });
+    });
   });