diff --git a/roles/etcd/tasks/install_docker.yml b/roles/etcd/tasks/install_docker.yml
index 793946fab2a49affa25ea4596faa4777e19520da..025a0ba17736767bfb09675cfb1c18b3fb59e946 100644
--- a/roles/etcd/tasks/install_docker.yml
+++ b/roles/etcd/tasks/install_docker.yml
@@ -2,6 +2,30 @@
 - import_tasks: install_etcdctl_docker.yml
   when: etcd_cluster_setup
 
+- name: Get currently-deployed etcd version
+  shell: "{{ docker_bin_dir }}/docker ps --filter='name={{ etcd_member_name }}' --format='{{ '{{ .Image }}' }}'"
+  register: etcd_current_docker_image
+  when: etcd_cluster_setup
+
+- name: Get currently-deployed etcd-events version
+  shell: "{{ docker_bin_dir }}/docker ps --filter='name={{ etcd_member_name }}-events' --format='{{ '{{ .Image }}' }}'"
+  register: etcd_events_current_docker_image
+  when: etcd_events_cluster_setup
+
+- name: Restart etcd if necessary
+  command: /bin/true
+  notify: restart etcd
+  when:
+    - etcd_cluster_setup
+    - etcd_image_tag not in etcd_current_docker_image.stdout|default('')
+
+- name: Restart etcd-events if necessary
+  command: /bin/true
+  notify: restart etcd-events
+  when:
+    - etcd_events_cluster_setup
+    - etcd_image_tag not in etcd_events_current_docker_image.stdout|default('')
+
 - name: Install etcd launch script
   template:
     src: etcd.j2
diff --git a/roles/etcd/tasks/install_host.yml b/roles/etcd/tasks/install_host.yml
index 3196df5c617d5afdb4569346c2ba1a2d337e6126..14a75b48b857e1e93c429f72de5abfa9be56ee41 100644
--- a/roles/etcd/tasks/install_host.yml
+++ b/roles/etcd/tasks/install_host.yml
@@ -1,4 +1,25 @@
 ---
+- name: Get currently-deployed etcd version
+  command: "{{ bin_dir }}/etcd --version"
+  register: etcd_current_host_version
+  # There's a chance this play could run before etcd is installed at all
+  ignore_errors: true
+  when: etcd_cluster_setup
+
+- name: Restart etcd if necessary
+  command: /bin/true
+  notify: restart etcd
+  when:
+    - etcd_cluster_setup
+    - etcd_version.lstrip('v') not in etcd_current_host_version.stdout|default('')
+
+- name: Restart etcd-events if necessary
+  command: /bin/true
+  notify: restart etcd-events
+  when:
+    - etcd_events_cluster_setup
+    - etcd_version.lstrip('v') not in etcd_current_host_version.stdout|default('')
+
 - name: install | Download etcd and etcdctl
   include_tasks: "../../download/tasks/download_file.yml"
   vars:
diff --git a/roles/etcd/tasks/main.yml b/roles/etcd/tasks/main.yml
index 7256927e195c2784c827bfaf4c4a555889d29072..465be73fa8d3e27b4b354d853a6c579b5fe0626c 100644
--- a/roles/etcd/tasks/main.yml
+++ b/roles/etcd/tasks/main.yml
@@ -47,17 +47,13 @@
   when: is_etcd_master
 
 - name: Restart etcd if certs changed
-  service:
-    name: etcd
-    state: restarted
-    enabled: yes
+  command: /bin/true
+  notify: restart etcd
   when: is_etcd_master and etcd_cluster_setup and etcd_secret_changed|default(false)
 
 - name: Restart etcd-events if certs changed
-  service:
-    name: etcd-events
-    state: restarted
-    enabled: yes
+  command: /bin/true
+  notify: restart etcd
   when: is_etcd_master and etcd_events_cluster_setup and etcd_secret_changed|default(false)
 
 # After etcd cluster is assembled, make sure that