diff --git a/roles/kubernetes-apps/network_plugin/weave/tasks/main.yml b/roles/kubernetes-apps/network_plugin/weave/tasks/main.yml
index f900e8b09d0730567a0a1a2bde5a825709dee79a..1c216fd925bb5264df81e2a2ea9c9b224fdaa527 100644
--- a/roles/kubernetes-apps/network_plugin/weave/tasks/main.yml
+++ b/roles/kubernetes-apps/network_plugin/weave/tasks/main.yml
@@ -30,8 +30,8 @@
     return_content: yes
   run_once: true
   register: weave_status
-  retries: 10
-  delay: "{{ retry_stagger | random + 3 }}"
+  retries: 12
+  delay: 10
   until: "{{ weave_status.status == 200 and
     'Status: ready' in weave_status.content }}"
   delegate_to: "{{groups['kube-master'][0]}}"
diff --git a/roles/network_plugin/weave/tasks/main.yml b/roles/network_plugin/weave/tasks/main.yml
index 5edb837bbf371b384ed017b564d1dbeef6751b12..a956b9481dea6b0ad986bf5b1a693b55dbfb6419 100644
--- a/roles/network_plugin/weave/tasks/main.yml
+++ b/roles/network_plugin/weave/tasks/main.yml
@@ -1,4 +1,6 @@
 ---
+- include: pre-upgrade.yml
+
 - name: Weave | Copy cni plugins from hyperkube
   command: "{{ docker_bin_dir }}/docker run --rm -v /opt/cni/bin:/cnibindir {{ hyperkube_image_repo }}:{{ hyperkube_image_tag }} /bin/cp -r /opt/cni/bin/. /cnibindir/"
   register: cni_task_result
diff --git a/roles/network_plugin/weave/tasks/pre-upgrade.yml b/roles/network_plugin/weave/tasks/pre-upgrade.yml
new file mode 100644
index 0000000000000000000000000000000000000000..42a031f45fce933a3a96c590a8047b1aea6a4c91
--- /dev/null
+++ b/roles/network_plugin/weave/tasks/pre-upgrade.yml
@@ -0,0 +1,39 @@
+- name: Weave pre-upgrade | Stop legacy weave
+  command: weave stop
+  failed_when: false
+
+- name: Weave pre-upgrade | Stop legacy systemd weave services
+  service:
+    name: "{{ item }}"
+    enabled: no
+    state: stopped
+  with_items:
+    - weaveexpose
+    - weaveproxy
+    - weave
+  failed_when: false
+
+- name: Weave pre-upgrade | Purge legacy systemd weave systemd unit files
+  file:
+    path: "{{ item }}"
+    state: absent
+  register: purged_weave_systemd_units
+  with_items:
+    - "/etc/systemd/system/weaveexpose.service"
+    - "/etc/systemd/system/weaveproxy.service"
+    - "/etc/systemd/system/weave.service"
+
+- name: Weave pre-upgrade | Reload systemd
+  command: systemctl daemon-reload
+  when: ansible_service_mgr == "systemd" and purged_weave_systemd_units.changed
+
+- name: Weave pre-upgrade | Purge legacy weave configs and binary
+  file:
+    path: "{{ item }}"
+    state: absent
+  with_items:
+    - "{{ bin_dir }}/weave"
+    - "/etc/weave.env"
+
+- name: Weave pre-upgrade | Purge legacy weave docker containers
+  shell: "docker ps -af 'name=^/weave.*' -q | xargs --no-run-if-empty docker rm -f"
diff --git a/roles/network_plugin/weave/templates/weave-net.yml.j2 b/roles/network_plugin/weave/templates/weave-net.yml.j2
index 38f23c359fd9eaac62b3ad6f8e517a363d9879a7..93b95346d273c0a016f90a3267c92cff3d174ab4 100644
--- a/roles/network_plugin/weave/templates/weave-net.yml.j2
+++ b/roles/network_plugin/weave/templates/weave-net.yml.j2
@@ -54,7 +54,7 @@ spec:
               value: {{ weave_expose_ip }}
 {% endif %}
           livenessProbe:
-            initialDelaySeconds: 30
+            initialDelaySeconds: 60
             httpGet:
               host: 127.0.0.1
               path: /status