diff --git a/docs/chart_template_guide/values_files.md b/docs/chart_template_guide/values_files.md
index 626aca3dbc008304293bad12ff9ddf639e753d8c..31b34175a0f13e866040cb42962063844497b2c6 100644
--- a/docs/chart_template_guide/values_files.md
+++ b/docs/chart_template_guide/values_files.md
@@ -98,4 +98,35 @@ data:
 
 While structuring data this way is possible, the recommendation is that you keep your values trees shallow, favoring flatness. When we look at assigning values to subcharts, we'll see how values are named using a tree structure.
 
+## Deleting a default key
+
+If you need to delete a key from the default values, you may override the value of the key to be `null`, in which case Helm will remove the key from the overridden values merge.
+
+For example, the stable Drupal chart allows configuring the liveness probe, in case you configure a custom image. Here are the default values:
+```yaml
+livenessProbe:
+  httpGet:
+    path: /user/login
+    port: http
+  initialDelaySeconds: 120
+```
+
+If you try to override the livenessProbe handler to `exec` instead of `httpGet` using `--set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt]`, Helm will coalesce the default and overridden keys together, resulting in the following YAML:
+```yaml
+livenessProbe:
+  httpGet:
+    path: /user/login
+    port: http
+  exec:
+    command:
+    - cat
+    - docroot/CHANGELOG.txt
+  initialDelaySeconds: 120
+```
+
+However, Kubernetes would then fail because you can not declare more than one livenessProbe handler. To overcome this, you may instruct Helm to delete the `livenessProbe.httpGet` by setting it to null:
+```sh
+helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null
+```
+
 At this point, we've seen several built-in objects, and used them to inject information into a template. Now we will take a look at another aspect of the template engine: functions and pipelines.
diff --git a/pkg/chartutil/testdata/moby/values.yaml b/pkg/chartutil/testdata/moby/values.yaml
index 1972c08443e33b1e578529c4d4ffac2ac3ab7ccb..54e1ce46323c41c359cb53cfcd92d7b22bf60c12 100644
--- a/pkg/chartutil/testdata/moby/values.yaml
+++ b/pkg/chartutil/testdata/moby/values.yaml
@@ -2,3 +2,8 @@ scope: moby
 name: moby
 override: bad
 top: nope
+bottom: exists
+right: exists
+left: exists
+front: exists
+back: exists
diff --git a/pkg/chartutil/values.go b/pkg/chartutil/values.go
index cc60860cd3c872de088274b86d60bf7b8f4ef0a1..a2343555e48328711529a3bc77798c47a4406b43 100644
--- a/pkg/chartutil/values.go
+++ b/pkg/chartutil/values.go
@@ -281,6 +281,13 @@ func coalesceValues(c *chart.Chart, v map[string]interface{}) (map[string]interf
 		if _, ok := v[key]; !ok {
 			// If the key is not in v, copy it from nv.
 			v[key] = val
+		} else if ok && v[key] == nil {
+			// When the YAML value is null, we remove the value's key.
+			// This allows Helm's various sources of values (value files or --set) to
+			// remove incompatible keys from any previous chart, file, or set values.
+			// ref: http://www.yaml.org/spec/1.2/spec.html#id2803362
+			delete(v, key)
+			continue
 		} else if dest, ok := v[key].(map[string]interface{}); ok {
 			// if v[key] is a table, merge nv's val table into v[key].
 			src, ok := val.(map[string]interface{})
diff --git a/pkg/chartutil/values_test.go b/pkg/chartutil/values_test.go
index 465eee8a49b269213f4f671039222f7455e0b73a..7d5750bd5c200d334e1f32a5d2e7107f0cca06f7 100644
--- a/pkg/chartutil/values_test.go
+++ b/pkg/chartutil/values_test.go
@@ -277,6 +277,11 @@ func ttpl(tpl string, v map[string]interface{}) (string, error) {
 
 var testCoalesceValuesYaml = `
 top: yup
+bottom: null
+right: Null
+left: NULL
+front: ~
+back: ""
 
 global:
   name: Ishmael
@@ -316,6 +321,7 @@ func TestCoalesceValues(t *testing.T) {
 		expect string
 	}{
 		{"{{.top}}", "yup"},
+		{"{{.back}}", ""},
 		{"{{.name}}", "moby"},
 		{"{{.global.name}}", "Ishmael"},
 		{"{{.global.subject}}", "Queequeg"},
@@ -343,6 +349,13 @@ func TestCoalesceValues(t *testing.T) {
 			t.Errorf("Expected %q to expand to %q, got %q", tt.tpl, tt.expect, o)
 		}
 	}
+
+	nullKeys := []string{"bottom", "right", "left", "front"}
+	for _, nullKey := range nullKeys {
+		if _, ok := v[nullKey]; ok {
+			t.Errorf("Expected key %q to be removed, still present", nullKey)
+		}
+	}
 }
 
 func TestCoalesceTables(t *testing.T) {