diff --git a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
index d5b139e2b66937b3714def9ee3499d1606c6dd60..8ebf6fc8b690103d816c18a993fd6bd088a702b3 100644
--- a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
+++ b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
@@ -137,6 +137,14 @@
     - cloud-provider
     - facts
 
+- name: Ensure minimum calico version
+  assert:
+    that: calico_version is version('v3.0.0', '>=')
+    msg: "calico_version is too low. Minimum version v3.0.0"
+  run_once: yes
+  when:
+    - kube_network_plugin == 'calico'
+
 - name: "Get current version of calico cluster version"
   shell: "{{ bin_dir }}/calicoctl.sh version  | grep 'Cluster Version:' | awk '{ print $3}'"
   register: calico_version_on_server
diff --git a/roles/network_plugin/calico/rr/tasks/main.yml b/roles/network_plugin/calico/rr/tasks/main.yml
index 2d9ba6ba077b56a8c9c69a1fdfab0b788566386b..2b023a2aa8eb08d5bebc20b6faa4c2bcab03232a 100644
--- a/roles/network_plugin/calico/rr/tasks/main.yml
+++ b/roles/network_plugin/calico/rr/tasks/main.yml
@@ -72,26 +72,6 @@
   retries: 4
   delay: "{{ retry_stagger | random + 3 }}"
   delegate_to: "{{ groups['etcd'][0] }}"
-  when:
-    - calico_version is version("v3.0.0", ">=")
-
-- name: Calico-rr | Configure route reflector (legacy)
-  command: |-
-    {{ bin_dir }}/etcdctl \
-    --peers={{ etcd_access_addresses }} \
-    set /calico/bgp/v1/rr_v4/{{ rr_ip }} \
-    '{
-       "ip": "{{ rr_ip }}",
-       "cluster_id": "{{ cluster_id }}"
-     }'
-  environment:
-    ETCDCTL_CERT_FILE: "{{ etcd_cert_dir }}/admin-{{ groups['etcd'][0] }}.pem"
-    ETCDCTL_KEY_FILE: "{{ etcd_cert_dir }}/admin-{{ groups['etcd'][0] }}-key.pem"
-  retries: 4
-  delay: "{{ retry_stagger | random + 3 }}"
-  delegate_to: "{{ groups['etcd'][0] }}"
-  when:
-    - calico_version is version("v3.0.0", "<")
 
 - meta: flush_handlers
 
diff --git a/roles/network_plugin/calico/tasks/install.yml b/roles/network_plugin/calico/tasks/install.yml
index 543fa5e37a48fccbff78fdcf3da6a07a4528ad17..7ee560095fbc62f416a21d44d577e3aa469d620a 100644
--- a/roles/network_plugin/calico/tasks/install.yml
+++ b/roles/network_plugin/calico/tasks/install.yml
@@ -102,7 +102,7 @@
   loop_control:
     label: "{{ item.item.file }}"
 
-- name: Calico | Configure calico network pool (v3.0.0 <= version < v3.3.0)
+- name: Calico | Configure calico network pool (version < v3.3.0)
   shell: >
     echo "
       { "kind": "IPPool",
@@ -117,7 +117,6 @@
   when:
     - inventory_hostname == groups['kube-master'][0]
     - 'calico_conf.stdout == "0"'
-    - calico_version is version("v3.0.0", ">=")
     - calico_version is version("v3.3.0", "<")
 
 - name: Calico | Configure calico network pool (version >= v3.3.0)
@@ -138,22 +137,6 @@
     - 'calico_conf.stdout == "0"'
     - calico_version is version("v3.3.0", ">=")
 
-- name: Calico | Configure calico network pool (legacy)
-  shell: >
-    echo '
-      { "kind": "ipPool",
-        "spec": {"disabled": false, "ipip": {"enabled": {{ ipip }}, "mode": "{{ ipip_mode|lower }}"},
-                 "nat-outgoing": {{ nat_outgoing|default(false) and not peer_with_router|default(false) }}},
-        "apiVersion": "v1",
-        "metadata": {"cidr": "{{ calico_pool_cidr | default(kube_pods_subnet) }}"}
-      }' | {{ bin_dir }}/calicoctl.sh apply -f -
-  environment:
-    NO_DEFAULT_POOLS: true
-  when:
-    - inventory_hostname == groups['kube-master'][0]
-    - 'calico_conf.stdout == "0"'
-    - calico_version is version("v3.0.0", "<")
-
 - name: "Determine nodeToNodeMesh needed state"
   set_fact:
     nodeToNodeMeshEnabled: "false"
@@ -177,20 +160,6 @@
   changed_when: false
   when:
     - inventory_hostname == groups['kube-master'][0]
-    - calico_version is version('v3.0.0', '>=')
-
-- name: Calico | Set global as_num (legacy)
-  command: "{{ bin_dir }}/calicoctl.sh config set asNumber {{ global_as_num }}"
-  when:
-    - inventory_hostname == groups['kube-master'][0]
-    - calico_version is version('v3.0.0', '<')
-
-- name: Calico | Disable node mesh (legacy)
-  command: "{{ bin_dir }}/calicoctl.sh config set nodeToNodeMesh off"
-  when:
-    - inventory_hostname == groups['kube-master'][0]
-    - calico_version is version('v3.0.0', '<')
-    - nodeToMeshEnabled|default(True)
 
 - name: Calico | Configure peering with router(s) at global scope
   shell: >
@@ -210,24 +179,6 @@
     - "{{ peers|selectattr('scope','defined')|selectattr('scope','equalto', 'global')|list|default([]) }}"
   when:
     - inventory_hostname == groups['kube-master'][0]
-    - calico_version | version_compare('v3.0.0', '>=')
-    - peer_with_router|default(false)
-
-- name: Calico | Configure peering with router(s) at global scope (legacy)
-  shell: >
-   echo '{
-   "kind": "bgpPeer",
-   "spec": {"asNumber": "{{ item.as }}"},
-   "apiVersion": "v1",
-   "metadata": {"scope": "global", "peerIP": "{{ item.router_id }}"}
-   }'
-   | {{ bin_dir }}/calicoctl.sh create --skip-exists -f -
-  retries: 4
-  delay: "{{ retry_stagger | random + 3 }}"
-  with_items: "{{ peers|selectattr('scope','defined')|selectattr('scope','equalto', 'global')|default([]) }}"
-  when:
-    - inventory_hostname == groups['kube-master'][0]
-    - calico_version is version('v3.0.0', '<')
     - peer_with_router|default(false)
 
 - name: Calico | Create calico manifests
@@ -298,30 +249,6 @@
   retries: 4
   delay: "{{ retry_stagger | random + 3 }}"
   when:
-    - calico_version is version('v3.0.0', '>=')
-    - peer_with_router|default(false)
-    - inventory_hostname in groups['k8s-cluster']
-    - local_as is defined
-    - groups['calico-rr'] | default([]) | length == 0
-
-- name: Calico | Configure node asNumber for per node peering (legacy)
-  shell: >
-   echo '{
-   "apiVersion": "v1",
-   "kind": "node",
-   "metadata": {
-      "name": "{{ inventory_hostname }}"
-   },
-   "spec": {
-      "bgp": {
-        "asNumber": "{{ local_as }}"
-      },
-      "orchRefs":[{"nodeName":"{{ inventory_hostname }}","orchestrator":"k8s"}]
-   }}' | {{ bin_dir }}/calicoctl.sh create --skip-exists -f -
-  retries: 4
-  delay: "{{ retry_stagger | random + 3 }}"
-  when:
-    - calico_version is version('v3.0.0', '<')
     - peer_with_router|default(false)
     - inventory_hostname in groups['k8s-cluster']
     - local_as is defined
@@ -345,28 +272,9 @@
   with_items:
     - "{{ peers|selectattr('scope','undefined')|list|default([]) | union(peers|selectattr('scope','defined')|selectattr('scope','equalto', 'node')|list|default([])) }}"
   when:
-    - calico_version is version('v3.0.0', '>=')
-    - peer_with_router|default(false)
-    - inventory_hostname in groups['k8s-cluster']
-
-- name: Calico | Configure peering with router(s) at node scope (legacy)
-  shell: >
-   echo '{
-   "kind": "bgpPeer",
-   "spec": {"asNumber": "{{ item.as }}"},
-   "apiVersion": "v1",
-   "metadata": {"node": "{{ inventory_hostname }}", "scope": "node", "peerIP": "{{ item.router_id }}"}
-   }'
-   | {{ bin_dir }}/calicoctl.sh create --skip-exists -f -
-  retries: 4
-  delay: "{{ retry_stagger | random + 3 }}"
-  with_items: "{{ peers|selectattr('scope','undefined')|list|default([]) | union(peers|selectattr('scope','defined')|selectattr('scope','equalto', 'node')|list|default([])) }}"
-  when:
-    - calico_version | version_compare('v3.0.0', '<')
     - peer_with_router|default(false)
     - inventory_hostname in groups['k8s-cluster']
 
-
 - name: Calico | Configure peering with route reflectors
   shell: >
    echo '{
@@ -385,27 +293,6 @@
   with_items:
     - "{{ groups['calico-rr'] | default([]) }}"
   when:
-    - calico_version is version('v3.0.0', '>=')
     - peer_with_calico_rr|default(false)
     - inventory_hostname in groups['k8s-cluster']
     - hostvars[item]['cluster_id'] == cluster_id
-
-- name: Calico | Configure peering with route reflectors (legacy)
-  shell: >
-   echo '{
-   "kind": "bgpPeer",
-   "spec": {"asNumber": "{{ local_as | default(global_as_num) }}"},
-   "apiVersion": "v1",
-   "metadata": {"node": "{{ inventory_hostname }}",
-     "scope": "node",
-     "peerIP": "{{ hostvars[item]["calico_rr_ip"]|default(hostvars[item]["ip"])|default(fallback_ips[item]) }}"}
-   }'
-   | {{ bin_dir }}/calicoctl.sh create --skip-exists -f -
-  retries: 4
-  delay: "{{ retry_stagger | random + 3 }}"
-  with_items: "{{ groups['calico-rr'] | default([]) }}"
-  when:
-    - calico_version is version('v3.0.0', '<')
-    - not calico_upgrade_enabled
-    - peer_with_calico_rr|default(false)
-    - hostvars[item]['cluster_id'] == cluster_id
diff --git a/roles/network_plugin/calico/tasks/pre.yml b/roles/network_plugin/calico/tasks/pre.yml
index b843a92ad4dc21e4448e31f0665c087611aac6c6..e798142f315fc3f17452bb2748c4d22539cd6efe 100644
--- a/roles/network_plugin/calico/tasks/pre.yml
+++ b/roles/network_plugin/calico/tasks/pre.yml
@@ -1,11 +1,4 @@
 ---
-- name: Calico | Disable calico-node service if it exists
-  service:
-    name: calico-node
-    state: stopped
-    enabled: no
-  failed_when: false
-
 - name: Calico | Get kubelet hostname
   shell: >-
     {{ bin_dir }}/kubectl get node -o custom-columns='NAME:.metadata.name,INTERNAL-IP:.status.addresses[?(@.type=="InternalIP")].address'
diff --git a/roles/network_plugin/calico/templates/calico-node.yml.j2 b/roles/network_plugin/calico/templates/calico-node.yml.j2
index f201bfec0da1477c2df607ea16d87a065fa2cd0e..75c5bbe73a4e3353a78310025596f7b1259e7522 100644
--- a/roles/network_plugin/calico/templates/calico-node.yml.j2
+++ b/roles/network_plugin/calico/templates/calico-node.yml.j2
@@ -25,9 +25,7 @@ spec:
         prometheus.io/port: "{{ calico_felix_prometheusmetricsport }}"
 {% endif %}
     spec:
-{% if kube_version is version('v1.11.1', '>=') %}
       priorityClassName: system-node-critical
-{% endif %}
       hostNetwork: true
       dnsPolicy: ClusterFirstWithHostNet
       serviceAccountName: calico-node
diff --git a/roles/network_plugin/canal/templates/canal-node.yaml.j2 b/roles/network_plugin/canal/templates/canal-node.yaml.j2
index e6bb4d36413b26262a3f0188e9ac3427d2691460..354cd0b94c4110d27a104fe4c63c28f898dffaf7 100644
--- a/roles/network_plugin/canal/templates/canal-node.yaml.j2
+++ b/roles/network_plugin/canal/templates/canal-node.yaml.j2
@@ -15,9 +15,7 @@ spec:
       labels:
         k8s-app: canal-node
     spec:
-{% if kube_version is version('v1.11.1', '>=') %}
       priorityClassName: system-node-critical
-{% endif %}
       hostNetwork: true
       dnsPolicy: ClusterFirstWithHostNet
       serviceAccountName: canal