diff --git a/roles/etcd/tasks/configure.yml b/roles/etcd/tasks/configure.yml
index c4cf496bf67aea60c2cfde0054862d474910947a..4b802d919f665f0aadd13a830ecf1eaf340954a7 100644
--- a/roles/etcd/tasks/configure.yml
+++ b/roles/etcd/tasks/configure.yml
@@ -5,8 +5,7 @@
     dest: /lib/systemd/system/etcd.service
     backup: yes
   when: init_system == "systemd"
-  notify:
-    - restart systemd-etcd
+  notify: restart systemd-etcd
 
 - name: Configure |  Write calico-node initd script
   template:
@@ -24,4 +23,7 @@
   notify: restart etcd
 
 - name: Configure |  Ensure etcd is running
-  service: name=etcd state=started enabled=yes
+  service:
+    name: etcd
+    state: started
+    enabled: yes
diff --git a/roles/etcd/tasks/install.yml b/roles/etcd/tasks/install.yml
index 679b98077b3f6964abf472de619bb723795da07f..56af3b0984b2aa3ce11cd347fb8841847473e5d0 100644
--- a/roles/etcd/tasks/install.yml
+++ b/roles/etcd/tasks/install.yml
@@ -1,8 +1,9 @@
 ---
-- name: INSTALL | Copy  etcd binaries
-  command: cp -pf "{{ etcd_bin_dir }}/{{ item }}" "{{ bin_dir }}"
-  with_items:
-    - etcdctl
-    - etcd
+- name: Install | Copy etcd binary
+  command: rsync -piu "{{ etcd_bin_dir }}/etcd" "{{ bin_dir }}/etcd"
+  register: etcd_copy
+  changed_when: false
+
+- name: Install | Copy etcdctl binary
+  command: rsync -piu "{{ etcd_bin_dir }}/etcdctl" "{{ bin_dir }}/etcdctl"
   changed_when: false
-  notify: restart etcd
diff --git a/roles/etcd/tasks/main.yml b/roles/etcd/tasks/main.yml
index fdb17cf514b71c8b2a38426d53289b2728793413..c5e8b8cb257873d27e4cb1a8011c6c6e63cfd892 100644
--- a/roles/etcd/tasks/main.yml
+++ b/roles/etcd/tasks/main.yml
@@ -1,3 +1,8 @@
 ---
 - include: install.yml
 - include: configure.yml
+
+- name: Restart etcd if binary changed
+  command: /bin/true
+  notify: restart etcd
+  when: etcd_copy.stdout_lines
diff --git a/roles/kubernetes/master/tasks/main.yml b/roles/kubernetes/master/tasks/main.yml
index d5f2d8ca8e370737376e575c7ca8a834b94676a8..aec37836f3fe3c686a60c87c17a0d616f81fda89 100644
--- a/roles/kubernetes/master/tasks/main.yml
+++ b/roles/kubernetes/master/tasks/main.yml
@@ -7,12 +7,14 @@
     src: kubectl_bash_completion.sh
     dest: /etc/bash_completion.d/kubectl.sh
 
-- name: Install kubernetes binaries
-  command: cp -pf "{{ local_release_dir }}/kubernetes/bin/{{ item }}" "{{ bin_dir }}/{{ item }}"
+- name: Copy kube-apiserver binary
+  command: rsync -piu "{{ local_release_dir }}/kubernetes/bin/kube-apiserver" "{{ bin_dir }}/kube-apiserver"
+  register: kube_apiserver_copy
+  changed_when: false
+
+- name: Copy kubectl binary
+  command: rsync -piu "{{ local_release_dir }}/kubernetes/bin/kubectl" "{{ bin_dir }}/kubectl"
   changed_when: false
-  with_items:
-    - kubectl
-    - kube-apiserver
 
 - name: populate users for basic auth in API
   lineinfile:
@@ -55,7 +57,11 @@
     mode: 755
     backup: yes
   when: init_system == "sysvinit" and ansible_os_family == "Debian"
+
+- name: Restart apiserver
+  command: /bin/true
   notify: restart kube-apiserver
+  changed_when: is_gentoken_calico|default(false) or kube_apiserver_copy.stdout_lines
 
 - name: Allow apiserver to bind on both secure and insecure ports
   shell: setcap cap_net_bind_service+ep {{ bin_dir }}/kube-apiserver
diff --git a/roles/kubernetes/node/tasks/install.yml b/roles/kubernetes/node/tasks/install.yml
index b31ad6c6aa0ac493686b0ddd466e996ca81d7346..3d90fd033f18c327b803fdfebb12729fd6e0af8f 100644
--- a/roles/kubernetes/node/tasks/install.yml
+++ b/roles/kubernetes/node/tasks/install.yml
@@ -15,16 +15,15 @@
   notify: restart kubelet
 
 - name: install | Install kubelet binary
-  command: cp -pf "{{ local_release_dir }}/kubernetes/bin/kubelet" "{{ bin_dir }}/kubelet"
+  command: rsync -piu "{{ local_release_dir }}/kubernetes/bin/kubelet" "{{ bin_dir }}/kubelet"
+  register: kubelet_copy
   changed_when: false
-  notify: restart kubelet
 
 - name: install | Calico-plugin | Directory
   file: path=/usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/ state=directory
   when: kube_network_plugin == "calico"
 
 - name: install | Calico-plugin | Binary
-  command: cp -pf "{{ local_release_dir }}/calico/bin/calico" "/usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico"
+  command: rsync -piu "{{ local_release_dir }}/calico/bin/calico" "/usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico"
   when: kube_network_plugin == "calico"
   changed_when: false
-  notify: restart kubelet
diff --git a/roles/kubernetes/node/tasks/main.yml b/roles/kubernetes/node/tasks/main.yml
index e41193585422dfbcf86f1c37d7ef25cb506c9864..6ec2f0857a96d342315bee880a04eb7b668dfc02 100644
--- a/roles/kubernetes/node/tasks/main.yml
+++ b/roles/kubernetes/node/tasks/main.yml
@@ -45,6 +45,11 @@
     src: manifests/kube-proxy.manifest.j2
     dest: "{{ kube_manifest_dir }}/kube-proxy.manifest"
 
+- name: Restart kubelet if binary changed
+  command: /bin/true
+  notify: restart kubelet
+  when: kubelet_copy.stdout_lines
+
 - name: Enable kubelet
   service:
     name: kubelet
diff --git a/roles/kubernetes/preinstall/tasks/main.yml b/roles/kubernetes/preinstall/tasks/main.yml
index a498e6445854f7c3284f1e40728e5e689b232e55..91c7eb33f2b74bf85f3117d857fee29ac48ffc9a 100644
--- a/roles/kubernetes/preinstall/tasks/main.yml
+++ b/roles/kubernetes/preinstall/tasks/main.yml
@@ -26,9 +26,12 @@
   always_run: True
   register: init_system_output
   changed_when: False
+  tags: always
 
 - set_fact:
     init_system: "{{ init_system_output.stdout }}"
+  always_run: True
+  tags: always
 
 - name: Install python-apt for Debian distribs
   shell: apt-get install -y python-apt
diff --git a/roles/network_plugin/tasks/calico.yml b/roles/network_plugin/tasks/calico.yml
index b1dd11a37d756b83563e267b640131d218366917..c8eb3628260e03f96d342b4dc46d1fd4a05d634b 100644
--- a/roles/network_plugin/tasks/calico.yml
+++ b/roles/network_plugin/tasks/calico.yml
@@ -1,8 +1,8 @@
 ---
 - name: Calico | Install calicoctl bin
-  command: cp -pf "{{ local_release_dir }}/calico/bin/calicoctl" "{{ bin_dir }}/calicoctl"
+  command: rsync -piu "{{ local_release_dir }}/calico/bin/calicoctl" "{{ bin_dir }}/calicoctl"
+  register: calico_copy
   changed_when: false
-  notify: restart calico-node
 
 - name: Calico | install calicoctl
   file: path={{ bin_dir }}/calicoctl mode=0755 state=file
@@ -71,6 +71,12 @@
 - name: Calico | Enable calico-node
   service: name=calico-node enabled=yes state=started
 
+- name: Calico | Restart calico if binary changed
+  service:
+    name: calico-node
+    state: restarted
+  when: calico_copy.stdout_lines
+
 - name: Calico | Disable node mesh
   shell: calicoctl bgp node-mesh off
   environment: