diff --git a/roles/kubernetes/preinstall/handlers/main.yml b/roles/kubernetes/preinstall/handlers/main.yml
index bdaaff3e3c7ec3ec8476ce70df610dc66401a87b..ec78c50b6d0c074f69f0de6bb710a9f707a8045a 100644
--- a/roles/kubernetes/preinstall/handlers/main.yml
+++ b/roles/kubernetes/preinstall/handlers/main.yml
@@ -33,7 +33,6 @@
   service:
     name: NetworkManager.service
     state: restarted
-  when: is_fedora_coreos
 
 - name: Preinstall | reload kubelet
   service:
diff --git a/roles/kubernetes/preinstall/tasks/0062-networkmanager-unmanaged-devices.yml b/roles/kubernetes/preinstall/tasks/0062-networkmanager-unmanaged-devices.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b8b673bd232052fa7fbd25a310867a84e5a66b85
--- /dev/null
+++ b/roles/kubernetes/preinstall/tasks/0062-networkmanager-unmanaged-devices.yml
@@ -0,0 +1,36 @@
+---
+- name: NetworkManager | Check if host has NetworkManager
+  # noqa 303 Should we use service_facts for this?
+  command: systemctl is-active --quiet NetworkManager.service
+  register: nm_check
+  failed_when: false
+  changed_when: false
+
+- name: NetworkManager | Ensure NetworkManager conf.d dir
+  file:
+    path: "/etc/NetworkManager/conf.d"
+    state: directory
+    recurse: yes
+  when: nm_check.rc == 0
+
+- name: NetworkManager | Prevent NetworkManager from managing Calico interfaces (cali*/tunl*/vxlan.calico)
+  copy:
+    content: |
+      [keyfile]
+      unmanaged-devices+=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico
+    dest: /etc/NetworkManager/conf.d/calico.conf
+  when:
+    - nm_check.rc == 0
+    - kube_network_plugin == "calico"
+  notify: Preinstall | reload NetworkManager
+
+# TODO: add other network_plugin interfaces
+
+- name: NetworkManager | Prevent NetworkManager from managing K8S interfaces (kube-ipvs0/nodelocaldns)
+  copy:
+    content: |
+      [keyfile]
+      unmanaged-devices+=interface-name:kube-ipvs0;interface-name:nodelocaldns
+    dest: /etc/NetworkManager/conf.d/k8s.conf
+  when: nm_check.rc == 0
+  notify: Preinstall | reload NetworkManager
diff --git a/roles/kubernetes/preinstall/tasks/0062-networkmanager.yml b/roles/kubernetes/preinstall/tasks/0063-networkmanager-dns.yml
similarity index 100%
rename from roles/kubernetes/preinstall/tasks/0062-networkmanager.yml
rename to roles/kubernetes/preinstall/tasks/0063-networkmanager-dns.yml
diff --git a/roles/kubernetes/preinstall/tasks/main.yml b/roles/kubernetes/preinstall/tasks/main.yml
index b5c571342404ed05579c377d5f2211d6d472bff1..2a3418b0ea199700778d89cfcce055af94679da0 100644
--- a/roles/kubernetes/preinstall/tasks/main.yml
+++ b/roles/kubernetes/preinstall/tasks/main.yml
@@ -39,7 +39,11 @@
     - bootstrap-os
     - resolvconf
 
-- import_tasks: 0062-networkmanager.yml
+- import_tasks: 0062-networkmanager-unmanaged-devices.yml
+  tags:
+    - bootstrap-os
+
+- import_tasks: 0063-networkmanager-dns.yml
   when:
     - dns_mode != 'none'
     - resolvconf_mode == 'host_resolvconf'
diff --git a/roles/network_plugin/calico/handlers/main.yml b/roles/network_plugin/calico/handlers/main.yml
index 97f57ce69d2ca68f50f87ca7148772a93602a72c..b4b7af860f81ab86889f64f5657c38d87bfc1d00 100644
--- a/roles/network_plugin/calico/handlers/main.yml
+++ b/roles/network_plugin/calico/handlers/main.yml
@@ -25,9 +25,3 @@
   until: crictl_calico_node_remove is succeeded
   retries: 5
   when: container_manager in ["crio", "containerd"]
-
-- name: Calico | Reload NetworkManager
-  service:
-    name: NetworkManager
-    state: reloaded
-  when: '"running" in nm_check.stdout'
diff --git a/roles/network_plugin/calico/tasks/install.yml b/roles/network_plugin/calico/tasks/install.yml
index e28115edd3c7efa7c9dc343be3417e9d1227597a..9029ae94ad98f25f676e1452ea27bb0223c3b7e4 100644
--- a/roles/network_plugin/calico/tasks/install.yml
+++ b/roles/network_plugin/calico/tasks/install.yml
@@ -6,29 +6,6 @@
     mode: 0755
     remote_src: yes
 
-- name: Calico | Check if host has NetworkManager
-  # noqa 303 Should we use service_facts for this?
-  command: systemctl is-active --quiet NetworkManager.service
-  register: nm_check
-  failed_when: false
-  changed_when: false
-
-- name: Calico | Ensure NetworkManager conf.d dir
-  file:
-    path: "/etc/NetworkManager/conf.d"
-    state: directory
-    recurse: yes
-  when: nm_check.rc == 0
-
-- name: Calico | Prevent NetworkManager from managing Calico interfaces
-  copy:
-    content: |
-      [keyfile]
-      unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico
-    dest: /etc/NetworkManager/conf.d/calico.conf
-  when: nm_check.rc == 0
-  notify: Calico | Reload NetworkManager
-
 - name: Calico | Write Calico cni config
   template:
     src: "cni-calico.conflist.j2"
diff --git a/roles/reset/tasks/main.yml b/roles/reset/tasks/main.yml
index c0749191bd2e22039e7f5c6f331d3f40cb31fb72..1a78788f7b29b981965fcbbf6d2ece56089d7922 100644
--- a/roles/reset/tasks/main.yml
+++ b/roles/reset/tasks/main.yml
@@ -257,6 +257,8 @@
     - /etc/dnsmasq.d-available
     - /etc/etcd.env
     - /etc/calico
+    - /etc/NetworkManager/conf.d/calico.conf
+    - /etc/NetworkManager/conf.d/k8s.conf
     - /etc/weave.env
     - /opt/cni
     - /etc/dhcp/dhclient.d/zdnsupdate.sh