diff --git a/roles/etcd/handlers/main.yml b/roles/etcd/handlers/main.yml
index 22661c08784b4979acc3c5b227aa9a124ea085ba..a2044fb086b783fd0a98785dbb971cb4f2214b8c 100644
--- a/roles/etcd/handlers/main.yml
+++ b/roles/etcd/handlers/main.yml
@@ -7,7 +7,7 @@
 
 - name: reload systemd
   command: systemctl daemon-reload
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - name: reload etcd
   service:
diff --git a/roles/etcd/tasks/configure.yml b/roles/etcd/tasks/configure.yml
index 1d3f7887bbdddb7187e11ee71233aa8df5eb37c6..925180de0a13e285a112661505116ba1dded61b4 100644
--- a/roles/etcd/tasks/configure.yml
+++ b/roles/etcd/tasks/configure.yml
@@ -4,7 +4,7 @@
     src: etcd.service.j2
     dest: /lib/systemd/system/etcd.service
     backup: yes
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
   notify: restart etcd
 
 - name: Configure |  Write etcd  initd script
@@ -13,7 +13,7 @@
     dest: /etc/init.d/etcd
     owner: root
     mode: 0755
-  when: init_system == "sysvinit" and ansible_os_family == "Debian"
+  when: ansible_service_mgr in ["sysvinit","upstart"] and ansible_os_family == "Debian"
   notify: restart etcd
 
 - name: Configure |  Create etcd config file
diff --git a/roles/kubernetes/master/tasks/main.yml b/roles/kubernetes/master/tasks/main.yml
index 70dd0232573880317b6f0f70f57a40d69f50ba4b..d3a8dad6873ba0867be9fbc29161e944a3d38c5b 100644
--- a/roles/kubernetes/master/tasks/main.yml
+++ b/roles/kubernetes/master/tasks/main.yml
@@ -18,7 +18,7 @@
     src: "kube-apiserver.service.j2"
     dest: "/etc/systemd/system/kube-apiserver.service"
     backup: yes
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
   notify: restart kube-apiserver
 
 - name: install | Write kube-apiserver initd script
@@ -28,7 +28,7 @@
     owner: root
     mode: 0755
     backup: yes
-  when: init_system == "sysvinit" and ansible_os_family == "Debian"
+  when: ansible_service_mgr in ["sysvinit","upstart"] and ansible_os_family == "Debian"
 
 - name: Write kube-apiserver config file
   template:
@@ -91,9 +91,3 @@
     name: kubelet
     state: restarted
   changed_when: false
-
-- name: restart kube-apiserver
-  service:
-    name: kube-apiserver
-    state: restarted
-  when: secret_changed | default(false)
diff --git a/roles/kubernetes/master/tasks/start.yml b/roles/kubernetes/master/tasks/start.yml
index 7fa4f2764185d9587eee712860094d0910a372f6..9cd247c42404bc8189c3fd3a8c984c4f0393fd45 100644
--- a/roles/kubernetes/master/tasks/start.yml
+++ b/roles/kubernetes/master/tasks/start.yml
@@ -4,18 +4,19 @@
 
 - name: reload systemd
   command: systemctl daemon-reload
-  when: init_system == "systemd" and restart_apimaster is defined and restart_apimaster == True
+  when: ansible_service_mgr == "systemd" and restart_apimaster is defined and restart_apimaster == True
 
 - name: reload kube-apiserver
   service:
     name: kube-apiserver
     state: restarted
     enabled: yes
-  when: restart_apimaster is defined and restart_apimaster == True
+  when: ( restart_apimaster is defined and restart_apimaster == True) or
+        secret_changed | default(false)
 
 - name: Enable apiserver
   service:
     name: kube-apiserver
     enabled: yes
     state: started
-  when: restart_apimaster is not defined or restart_apimaster == False
\ No newline at end of file
+  when: restart_apimaster is not defined or restart_apimaster == False
diff --git a/roles/kubernetes/master/templates/kube-apiserver.j2 b/roles/kubernetes/master/templates/kube-apiserver.j2
index 2f900fdc856544e9b1a88d36ebf5f11d15b274d7..b45fa46f28dea5a6b3698624df9a2f1aee45fbff 100644
--- a/roles/kubernetes/master/templates/kube-apiserver.j2
+++ b/roles/kubernetes/master/templates/kube-apiserver.j2
@@ -3,7 +3,7 @@
 #
 # The following values are used to configure the kube-apiserver
 
-{% if init_system == "sysvinit" %}
+{% if ansible_service_mgr in ["sysvinit","upstart"] %}
 # Logging directory
 KUBE_LOGGING="--log-dir={{ kube_log_dir }} --logtostderr=true"
 {% else %}
@@ -38,7 +38,7 @@ KUBE_TLS_CONFIG="--tls_cert_file={{ kube_cert_dir }}/apiserver.pem --tls_private
 # Add you own!
 KUBE_API_ARGS="--token_auth_file={{ kube_token_dir }}/known_tokens.csv --basic-auth-file={{ kube_users_dir }}/known_users.csv --service_account_key_file={{ kube_cert_dir }}/apiserver-key.pem"
 
-{% if init_system == "sysvinit" %}
+{% if ansible_service_mgr in ["sysvinit","upstart"] %}
 DAEMON_ARGS="$KUBE_LOGGING $KUBE_LOG_LEVEL $KUBE_ALLOW_PRIV $KUBE_API_PORT $KUBE_SERVICE_ADDRESSES \
 $KUBE_ETCD_SERVERS $KUBE_ADMISSION_CONTROL $KUBE_RUNTIME_CONFIG $KUBE_TLS_CONFIG $KUBE_API_ARGS"
 {% endif %}
diff --git a/roles/kubernetes/node/handlers/main.yml b/roles/kubernetes/node/handlers/main.yml
index 7b2c3df71c44d0e204433432a324ba4c2cacb99a..ad9707757883f2470d4d38055c26b7d119b61eab 100644
--- a/roles/kubernetes/node/handlers/main.yml
+++ b/roles/kubernetes/node/handlers/main.yml
@@ -1,7 +1,7 @@
 ---
 - name: reload systemd
   command: systemctl daemon-reload
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - name: restart kubelet
   command: /bin/true
diff --git a/roles/kubernetes/node/tasks/install.yml b/roles/kubernetes/node/tasks/install.yml
index 32c64fae404e7c74ee414014420cde5301db2182..e501dc61d8a349bb869259c085a46d23663b7ec6 100644
--- a/roles/kubernetes/node/tasks/install.yml
+++ b/roles/kubernetes/node/tasks/install.yml
@@ -1,17 +1,17 @@
 ---
 - name: install | Write kubelet systemd init file
   template: src=kubelet.service.j2 dest=/etc/systemd/system/kubelet.service backup=yes
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
   notify: restart kubelet
 
 - name: install | Write kubelet initd script
   template: src=deb-kubelet.initd.j2 dest=/etc/init.d/kubelet owner=root mode=0755 backup=yes
-  when: init_system == "sysvinit" and ansible_os_family == "Debian"
+  when: ansible_service_mgr in ["sysvinit","upstart"] and ansible_os_family == "Debian"
   notify: restart kubelet
 
 - name: install | Write kubelet initd script
   template: src=rh-kubelet.initd.j2 dest=/etc/init.d/kubelet owner=root mode=0755 backup=yes
-  when: init_system == "sysvinit" and ansible_os_family == "RedHat"
+  when: ansible_service_mgr in ["sysvinit","upstart"] and ansible_os_family == "RedHat"
   notify: restart kubelet
 
 - name: install | Install kubelet binary
diff --git a/roles/kubernetes/node/templates/kubelet.j2 b/roles/kubernetes/node/templates/kubelet.j2
index 73e7fe60429fd7959103e8ab7260f197117b48e4..0f9197586852038cd0ccf81e626acf69296e7dc8 100644
--- a/roles/kubernetes/node/templates/kubelet.j2
+++ b/roles/kubernetes/node/templates/kubelet.j2
@@ -1,4 +1,4 @@
-{% if init_system == "sysvinit" %}
+{% if ansible_service_mgr in ["sysvinit","upstart"] %}
 # Logging directory
 KUBE_LOGGING="--log-dir={{ kube_log_dir }} --logtostderr=true"
 {% else %}
@@ -30,7 +30,7 @@ DOCKER_SOCKET="--docker-endpoint=unix:/var/run/weave/weave.sock"
 {% endif %}
 # Should this cluster be allowed to run privileged docker containers
 KUBE_ALLOW_PRIV="--allow_privileged=true"
-{% if init_system == "sysvinit" %}
+{% if ansible_service_mgr in ["sysvinit","upstart"] %}
 DAEMON_ARGS="$KUBE_LOGGING $KUBE_LOG_LEVEL $KUBE_ALLOW_PRIV $KUBELET_API_SERVER $KUBELET_ADDRESS \
 $KUBELET_HOSTNAME $KUBELET_REGISTER_NODE $KUBELET_ARGS $DOCKER_SOCKET $KUBELET_ARGS $KUBELET_NETWORK_PLUGIN"
 {% endif %}
diff --git a/roles/kubernetes/preinstall/tasks/main.yml b/roles/kubernetes/preinstall/tasks/main.yml
index 7ceda9b1fe3fb5e1493aae0d5c4fefdad8b56f95..fc06d12b7eb3d301d006cbd7a67a000ec0eaa575 100644
--- a/roles/kubernetes/preinstall/tasks/main.yml
+++ b/roles/kubernetes/preinstall/tasks/main.yml
@@ -15,24 +15,6 @@
       paths:
       - ../vars
 
-- name: "Identify init system"
-  shell: >
-    $(pgrep systemd > /dev/null && systemctl status network.target > /dev/null);
-    if [ $? -eq 0 ] ; then
-      echo systemd;
-    else
-      echo sysvinit;
-    fi
-  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: Create kubernetes config directory
   file:
     path: "{{ kube_config_dir }}"
@@ -56,7 +38,7 @@
     path: "{{ kube_log_dir }}"
     state: directory
     owner: kube
-  when: init_system == "sysvinit"
+  when: ansible_service_mgr in ["sysvinit","upstart"]
 
 - name: Create cni directories
   file:
@@ -77,23 +59,26 @@
   when: ansible_pkg_mgr == 'yum'
 
 - name: Install python-apt for Debian distribs
-  shell: apt-get install -y python-apt
+  command: apt-get install -y python-apt
   when: ansible_os_family == "Debian"
   changed_when: False
 
 - name: Install python-dnf for latest RedHat versions
-  shell: dnf install -y python-dnf yum
+  command: dnf install -y python-dnf yum
   when: ansible_distribution == "Fedora" and
         ansible_distribution_major_version > 21
   changed_when: False
 
-- name: Install epel-release for RedHat and CentOS distribs
+- name: Install epel-release on RHEL
+  command: rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
+  when: ansible_distribution == "RedHat"
+
+- name: Install epel-release on CentOS
   action:
     module: "{{ ansible_pkg_mgr }}"
     name: "epel-release"
     state: latest
-  when: ansible_distribution == "RedHat" or
-        ansible_distribution == "CentOS"
+  when: ansible_distribution == "CentOS"
 
 - name: Install packages requirements
   action:
diff --git a/roles/network_plugin/calico/handlers/main.yml b/roles/network_plugin/calico/handlers/main.yml
index 59163cc07a67d8c6795dd2764d3139b29903549c..1e8d56dbe61f6d7868d5865d71063066d59c5b3b 100644
--- a/roles/network_plugin/calico/handlers/main.yml
+++ b/roles/network_plugin/calico/handlers/main.yml
@@ -7,7 +7,7 @@
 
 - name : reload systemd
   shell: systemctl daemon-reload
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - name: reload calico-node
   service:
diff --git a/roles/network_plugin/calico/tasks/main.yml b/roles/network_plugin/calico/tasks/main.yml
index d8f51fa1aa9699362b2438d5badeb3823c2a2ac2..d7f9930b6d4806bce3dcb956efaec6d88592a5d5 100644
--- a/roles/network_plugin/calico/tasks/main.yml
+++ b/roles/network_plugin/calico/tasks/main.yml
@@ -14,7 +14,7 @@
     src: systemd-docker.service
     dest: /lib/systemd/system/docker.service
   notify: restart docker
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - meta: flush_handlers
 
@@ -80,21 +80,21 @@
 
 - name: Calico | Write /etc/network-environment
   template: src=network-environment.j2 dest=/etc/network-environment
-  when: init_system == "sysvinit"
+  when: ansible_service_mgr in ["sysvinit","upstart"]
 
 - name: Calico | Write calico-node systemd init file
   template: src=calico-node.service.j2 dest=/etc/systemd/system/calico-node.service
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
   notify: restart calico-node
 
 - name: Calico | Write calico-node initd script
   template: src=deb-calico.initd.j2 dest=/etc/init.d/calico-node owner=root mode=0755
-  when: init_system == "sysvinit" and ansible_os_family == "Debian"
+  when: ansible_service_mgr in ["sysvinit","upstart"] and ansible_os_family == "Debian"
   notify: restart calico-node
 
 - name: Calico | Write calico-node initd script
   template: src=rh-calico.initd.j2 dest=/etc/init.d/calico-node owner=root mode=0755
-  when: init_system == "sysvinit" and ansible_os_family == "RedHat"
+  when: ansible_service_mgr in ["sysvinit","upstart"] and ansible_os_family == "RedHat"
   notify: restart calico-node
 
 - meta: flush_handlers
diff --git a/roles/network_plugin/calico/templates/docker b/roles/network_plugin/calico/templates/docker
index 2f547a6c3ec76fd36af9a0c0429bfc60472328c4..332b7503f50b1db8a76c841a8fb4e4e08d582e73 100644
--- a/roles/network_plugin/calico/templates/docker
+++ b/roles/network_plugin/calico/templates/docker
@@ -1,5 +1,5 @@
 # Deployed by Ansible
-{% if init_system == "sysvinit" and kube_network_plugin == "flannel" and ansible_os_family == "Debian" %}
+{% if ansible_service_mgr in ["sysvinit","upstart"] and kube_network_plugin == "flannel" and ansible_os_family == "Debian" %}
 DOCKER_OPTS="--bip={{ flannel_subnet }} --mtu={{ flannel_mtu }}"
 {% elif kube_network_plugin == "flannel" and ansible_os_family == "RedHat" %}
 DOCKER_NETWORK_OPTIONS="--bip={{ flannel_subnet }} --mtu={{ flannel_mtu }}"
diff --git a/roles/network_plugin/flannel/handlers/main.yml b/roles/network_plugin/flannel/handlers/main.yml
index 1683b8c354172921ab952c10b012f2712d255be7..4273705698c6366e45f0777d838e3f0a16f40007 100644
--- a/roles/network_plugin/flannel/handlers/main.yml
+++ b/roles/network_plugin/flannel/handlers/main.yml
@@ -13,7 +13,7 @@
 
 - name : reload systemd
   shell: systemctl daemon-reload
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - name: reload docker
   service:
diff --git a/roles/network_plugin/flannel/tasks/main.yml b/roles/network_plugin/flannel/tasks/main.yml
index 5cdbf24ac7889f4be7edd617f1af60260023ee6f..6cfa302fbe25675e65ccfe73005bf3b8a0b734aa 100644
--- a/roles/network_plugin/flannel/tasks/main.yml
+++ b/roles/network_plugin/flannel/tasks/main.yml
@@ -47,6 +47,6 @@
     src: systemd-docker.service
     dest: /lib/systemd/system/docker.service
   notify: restart docker
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - meta: flush_handlers
diff --git a/roles/network_plugin/flannel/templates/docker b/roles/network_plugin/flannel/templates/docker
index eefd150e1b1cd7093d82c71cb31f6a5851b0ee5b..028fd07b1bc1a352567fd8d91cbc506c4277b3c5 100644
--- a/roles/network_plugin/flannel/templates/docker
+++ b/roles/network_plugin/flannel/templates/docker
@@ -1,5 +1,5 @@
 # Deployed by Ansible
-{% if init_system == "sysvinit" and kube_network_plugin == "flannel" and ansible_os_family == "Debian" %}
+{% if ansible_service_mgr in ["sysvinit","upstart"] and kube_network_plugin == "flannel" and ansible_os_family == "Debian" %}
 DOCKER_OPTS="--bip={{ flannel_subnet }} --mtu={{ flannel_mtu }}"
 {% elif kube_network_plugin == "flannel" %}
 OPTIONS="--bip={{ flannel_subnet }} --mtu={{ flannel_mtu }}"
diff --git a/roles/network_plugin/weave/handlers/main.yml b/roles/network_plugin/weave/handlers/main.yml
index 959db16c715d3906ec946bec9126394e92ae39fb..3bb21c346ec86454083b0cb69543de323cb66d44 100644
--- a/roles/network_plugin/weave/handlers/main.yml
+++ b/roles/network_plugin/weave/handlers/main.yml
@@ -7,7 +7,7 @@
 
 - name : reload systemd
   shell: systemctl daemon-reload
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - name: restart weave
   command: /bin/true
diff --git a/roles/network_plugin/weave/tasks/main.yml b/roles/network_plugin/weave/tasks/main.yml
index 0fbbbc35d48aaa1d465bebc208ab36b22832a21d..cd415cf427021299727534140a48b2c49515ab36 100644
--- a/roles/network_plugin/weave/tasks/main.yml
+++ b/roles/network_plugin/weave/tasks/main.yml
@@ -14,7 +14,7 @@
     src: systemd-docker.service
     dest: /lib/systemd/system/docker.service
   notify: restart docker
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
 
 - meta: flush_handlers
 
@@ -41,17 +41,17 @@
 
 - name: Weave | Write weave systemd init file
   template: src=weave.service.j2 dest=/etc/systemd/system/weave.service
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
   notify: restart systemd-weave
 
 - name: Weave | Write weaveproxy systemd init file
   template: src=weaveproxy.service.j2 dest=/etc/systemd/system/weaveproxy.service
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
   notify: restart systemd-weaveproxy
 
 - name: Weave | Write weaveexpose systemd init file
   template: src=weaveexpose.service.j2 dest=/etc/systemd/system/weaveexpose.service
-  when: init_system == "systemd"
+  when: ansible_service_mgr == "systemd"
   notify: restart systemd-weaveexpose
 
 - name: Weave | Enable weave