diff --git a/lib/ansible/modules/cloud/amazon/ec2_tag.py b/lib/ansible/modules/cloud/amazon/ec2_tag.py
index 0105b7e22c6..c33fc52ba99 100644
--- a/lib/ansible/modules/cloud/amazon/ec2_tag.py
+++ b/lib/ansible/modules/cloud/amazon/ec2_tag.py
@@ -32,7 +32,8 @@ options:
     choices: ['present', 'absent', 'list']
   tags:
     description:
-      - a hash/dictionary of tags to add to the resource; '{"key":"value"}' and '{"key":"value","key":"value"}'
+      - A dictionary of tags to add or remove from the resource.
+      - If the value provided for a tag is null and C(state) is I(absent), the tag will be removed regardless of its current value.
     required: true
   purge_tags:
     description:
@@ -77,6 +78,22 @@ EXAMPLES = '''
     state: list
   register: ec2_tags
 
+- name: Remove the Env tag
+  ec2_tag:
+    region: eu-west-1
+    resource: i-xxxxxxxxxxxxxxxxx
+    tags:
+      Env:
+    state: absent
+
+- name: Remove the Env tag if it's currently 'development'
+  ec2_tag:
+    region: eu-west-1
+    resource: i-xxxxxxxxxxxxxxxxx
+    tags:
+      Env: development
+    state: absent
+
 - name: Remove all tags except for Name from an instance
   ec2_tag:
     region: eu-west-1
@@ -149,8 +166,8 @@ def main():
     remove_tags = {}
     if state == 'absent':
         for key in tags:
-            if key in current_tags and current_tags[key] == tags[key]:
-                remove_tags[key] = tags[key]
+            if key in current_tags and (tags[key] is None or current_tags[key] == tags[key]):
+                remove_tags[key] = current_tags[key]
 
     for key in remove:
         remove_tags[key] = current_tags[key]
diff --git a/test/integration/targets/ec2_tag/tasks/main.yml b/test/integration/targets/ec2_tag/tasks/main.yml
index 0c71cc5d74c..81a12b44a65 100644
--- a/test/integration/targets/ec2_tag/tasks/main.yml
+++ b/test/integration/targets/ec2_tag/tasks/main.yml
@@ -38,17 +38,47 @@
         tags:
           foo: foo
           bar: baz
+          baz: also baz
         <<: *aws_connection_info
       register: result
 
     - assert:
         that:
           - result is changed
-          - result.tags | length == 3
-          - result.added_tags | length == 2
+          - result.tags | length == 4
+          - result.added_tags | length == 3
           - result.tags.Name == '{{ resource_prefix }} ec2_tag volume'
           - result.tags.foo == 'foo'
           - result.tags.bar == 'baz'
+          - result.tags.baz == 'also baz'
+
+    - name: Remove a tag by name
+      ec2_tag:
+        resource: "{{ volume.volume_id }}"
+        state: absent
+        tags:
+          baz:
+        <<: *aws_connection_info
+      register: result
+
+    - assert:
+        that:
+          - result is changed
+          - result.removed_tags | length == 1
+          - "'baz' in result.removed_tags"
+
+    - name: Don't remove a tag
+      ec2_tag:
+        resource: "{{ volume.volume_id }}"
+        state: absent
+        tags:
+          foo: baz
+        <<: *aws_connection_info
+      register: result
+
+    - assert:
+        that:
+          - result is not changed
 
     - name: Remove a tag
       ec2_tag: