diff --git a/cluster.yml b/cluster.yml
index 45d4183b911c451679e75fc0f24384bc437ba581..0518ef28e9052c4f5ae7237a0ce9b923710e4499 100644
--- a/cluster.yml
+++ b/cluster.yml
@@ -1,13 +1,19 @@
 ---
 - hosts: all
-  gather_facts: true
+  gather_facts: false
+  roles:
+    - bootstrap-os
+  tags:
+    - bootstrap-os
 
 - hosts: etcd:!k8s-cluster
+  gather_facts: true
   roles:
     - { role: kubernetes/preinstall, tags: preinstall }
     - { role: etcd, tags: etcd }
 
 - hosts: k8s-cluster
+  gather_facts: true
   roles:
     - { role: kubernetes/preinstall, tags: preinstall }
     - { role: etcd, tags: etcd }
@@ -15,14 +21,17 @@
     - { role: network_plugin, tags: network }
 
 - hosts: kube-master
+  gather_facts: true
   roles:
     - { role: kubernetes/preinstall, tags: preinstall }
     - { role: kubernetes/master, tags: master }
 
 - hosts: k8s-cluster
+  gather_facts: true
   roles:
     - { role: dnsmasq, tags: dnsmasq }
 
 - hosts: kube-master[0]
+  gather_facts: true
   roles:
     - {role: kubernetes-apps, tags: apps}
diff --git a/coreos-bootstrap.yml b/coreos-bootstrap.yml
deleted file mode 100644
index 88fcb888f62a9860807772d26d68801dad7edf37..0000000000000000000000000000000000000000
--- a/coreos-bootstrap.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-- hosts: all
-  gather_facts: False
-  roles:
-    - coreos-bootstrap
diff --git a/inventory/group_vars/all.yml b/inventory/group_vars/all.yml
index 547a9d6129fe9a36d3079397efdc82d2f8c107be..32f34c31017ef6ab484adc9f9188af85dd5dc152 100644
--- a/inventory/group_vars/all.yml
+++ b/inventory/group_vars/all.yml
@@ -1,3 +1,6 @@
+# Valid bootstrap options (required): xenial, coreos, none
+bootstrap_os: none
+
 # Directory where the binaries will be installed
 bin_dir: /usr/local/bin
 
diff --git a/roles/coreos-bootstrap/defaults/main.yml b/roles/bootstrap-os/defaults/main.yml
similarity index 100%
rename from roles/coreos-bootstrap/defaults/main.yml
rename to roles/bootstrap-os/defaults/main.yml
diff --git a/roles/coreos-bootstrap/files/bootstrap.sh b/roles/bootstrap-os/files/bootstrap.sh
similarity index 100%
rename from roles/coreos-bootstrap/files/bootstrap.sh
rename to roles/bootstrap-os/files/bootstrap.sh
diff --git a/roles/coreos-bootstrap/files/get-pip.py b/roles/bootstrap-os/files/get-pip.py
similarity index 100%
rename from roles/coreos-bootstrap/files/get-pip.py
rename to roles/bootstrap-os/files/get-pip.py
diff --git a/roles/coreos-bootstrap/files/runner b/roles/bootstrap-os/files/runner
similarity index 100%
rename from roles/coreos-bootstrap/files/runner
rename to roles/bootstrap-os/files/runner
diff --git a/roles/coreos-bootstrap/tasks/main.yml b/roles/bootstrap-os/tasks/bootstrap-coreos.yml
similarity index 66%
rename from roles/coreos-bootstrap/tasks/main.yml
rename to roles/bootstrap-os/tasks/bootstrap-coreos.yml
index 4d9e11ea628d01e56d0a0370a8c35fd31a6c3f75..ebeced7d61b32b16379726396fd3d300a2d1704a 100644
--- a/roles/coreos-bootstrap/tasks/main.yml
+++ b/roles/bootstrap-os/tasks/bootstrap-coreos.yml
@@ -3,46 +3,50 @@
   raw: stat /opt/bin/.bootstrapped
   register: need_bootstrap
   ignore_errors: True
+  when: bootstrap_os == "coreos"
 
 - name: Bootstrap | Run bootstrap.sh
   script: bootstrap.sh
-  when: need_bootstrap | failed
+  when: (bootstrap_os == "coreos" and need_bootstrap | failed)
 
 - set_fact:
     ansible_python_interpreter: "/opt/bin/python"
+  when: bootstrap_os == "coreos"
 
 - name: Bootstrap | Check if we need to install pip
   shell: "{{ansible_python_interpreter}} -m pip --version"
   register: need_pip
   ignore_errors: True
   changed_when: false
-  when: need_bootstrap | failed
+  when: (bootstrap_os == "coreos" and need_bootstrap | failed)
 
 - name: Bootstrap | Copy get-pip.py
   copy: src=get-pip.py dest=~/get-pip.py
-  when: need_pip | failed
+  when: (bootstrap_os == "coreos" and need_pip | failed)
 
 - name: Bootstrap | Install pip
   shell: "{{ansible_python_interpreter}} ~/get-pip.py"
-  when: need_pip | failed
+  when: (bootstrap_os == "coreos" and need_pip | failed)
 
 - name: Bootstrap | Remove get-pip.py
   file: path=~/get-pip.py state=absent
-  when: need_pip | failed
+  when: (bootstrap_os == "coreos" and need_pip | failed)
 
 - name: Bootstrap | Install pip launcher
   copy: src=runner dest=/opt/bin/pip mode=0755
-  when: need_pip | failed
+  when: (bootstrap_os == "coreos" and need_pip | failed)
 
 - name: Install required python modules
   pip:
     name: "{{ item }}"
   with_items: "{{pip_python_modules}}"
+  when: bootstrap_os == "coreos"
 
 - name: Check configured hostname
   shell: hostname
   register: configured_hostname
+  when: bootstrap_os == "coreos"
 
 - name: Assign inventory name to unconfigured hostnames
   shell: sh -c "echo \"{{inventory_hostname}}\" > /etc/hostname; hostname \"{{inventory_hostname}}\""
-  when: configured_hostname.stdout == 'localhost'
+  when: (bootstrap_os == "coreos" and configured_hostname.stdout == 'localhost')
diff --git a/roles/bootstrap-os/tasks/bootstrap-ubuntu-xenial.yml b/roles/bootstrap-os/tasks/bootstrap-ubuntu-xenial.yml
new file mode 100644
index 0000000000000000000000000000000000000000..70a65a596c390f9ae904a201cb4712aa9b7abf53
--- /dev/null
+++ b/roles/bootstrap-os/tasks/bootstrap-ubuntu-xenial.yml
@@ -0,0 +1,4 @@
+---
+- name: Bootstrap Xenial target hosts for ansible use
+  raw: apt-get install -y python-minimal
+  when: bootstrap_os == "xenial"
diff --git a/roles/bootstrap-os/tasks/main.yml b/roles/bootstrap-os/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6e35e9b38e834652461fa55f148456f4fd22687d
--- /dev/null
+++ b/roles/bootstrap-os/tasks/main.yml
@@ -0,0 +1,3 @@
+---
+- include: bootstrap-ubuntu-xenial.yml
+- include: bootstrap-coreos.yml
diff --git a/roles/coreos-bootstrap/templates/python_shim.j2 b/roles/bootstrap-os/templates/python_shim.j2
similarity index 100%
rename from roles/coreos-bootstrap/templates/python_shim.j2
rename to roles/bootstrap-os/templates/python_shim.j2