diff --git a/README.md b/README.md
index 19b29ebe06d13adbde64d755ba02d7dcbb614da0..c47da270342b4cc9de6fe8ab13bec652199eeb5f 100644
--- a/README.md
+++ b/README.md
@@ -92,6 +92,7 @@ Supported Linux Distributions
 -   **Debian** Jessie, Stretch, Wheezy
 -   **Ubuntu** 16.04, 18.04
 -   **CentOS/RHEL** 7
+-   **Fedora** 28
 -   **Fedora/CentOS** Atomic
 -   **openSUSE** Leap 42.3/Tumbleweed
 
diff --git a/Vagrantfile b/Vagrantfile
index df650f1e8cd89bde3573965b6dec037092325a49..209d975807973f41f655c27e5ff7253abedd054b 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -18,6 +18,7 @@ SUPPORTED_OS = {
   "coreos-beta"   => {box: "coreos-beta",        bootstrap_os: "coreos", user: "core", box_url: COREOS_URL_TEMPLATE % ["beta"]},
   "ubuntu"        => {box: "bento/ubuntu-16.04", bootstrap_os: "ubuntu", user: "vagrant"},
   "centos"        => {box: "centos/7",           bootstrap_os: "centos", user: "vagrant"},
+  "fedora"        => {box: "fedora/28-cloud-base", bootstrap_os: "fedora", user: "vagrant"},
   "opensuse"      => {box: "opensuse/openSUSE-42.3-x86_64", bootstrap_os: "opensuse", use: "vagrant"},
   "opensuse-tumbleweed" => {box: "opensuse/openSUSE-Tumbleweed-x86_64", bootstrap_os: "opensuse", use: "vagrant"},
 }
@@ -127,6 +128,10 @@ Vagrant.configure("2") do |config|
 
      config.vm.provider :libvirt do |lv|
        lv.memory = $vm_memory
+       # Fix kernel panic on fedora 28
+       if $os == "fedora"
+        lv.cpu_mode = "host-passthrough"
+       end
      end
 
       ip = "#{$subnet}.#{i+100}"
diff --git a/roles/bootstrap-os/tasks/bootstrap-fedora.yml b/roles/bootstrap-os/tasks/bootstrap-fedora.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4a475e73c0d9a4aa7eae41f0c24270f8eb52675a
--- /dev/null
+++ b/roles/bootstrap-os/tasks/bootstrap-fedora.yml
@@ -0,0 +1,20 @@
+---
+
+- name: Bootstrap | Check if bootstrap is needed
+  raw: which "{{ item }}"
+  register: need_bootstrap
+  failed_when: false
+  changed_when: false
+  with_items:
+    - python
+  tags: facts
+
+- name: Install python on fedora
+  raw: "dnf install --assumeyes --quiet {{ item['item'] }}"
+  when: item['rc'] != 0
+  loop: "{{ need_bootstrap['results'] }}"
+
+- name: Install required python packages
+  dnf:
+    name: libselinux-python
+    state: present
diff --git a/roles/bootstrap-os/tasks/main.yml b/roles/bootstrap-os/tasks/main.yml
index c921b643e0e43c259e073bcc337c25ab6ab83b60..f05ab66141eeb2e7fe071c340a24e797063145cf 100644
--- a/roles/bootstrap-os/tasks/main.yml
+++ b/roles/bootstrap-os/tasks/main.yml
@@ -8,6 +8,9 @@
 - import_tasks: bootstrap-coreos.yml
   when: bootstrap_os == "coreos"
 
+- import_tasks: bootstrap-fedora.yml
+  when: bootstrap_os == "fedora"
+
 - import_tasks: bootstrap-centos.yml
   when: bootstrap_os == "centos"
 
diff --git a/roles/cri-o/vars/fedora.yml b/roles/cri-o/vars/fedora.yml
new file mode 100644
index 0000000000000000000000000000000000000000..86be95f670b2a3a20cc18a049aa25ddbcf380a3f
--- /dev/null
+++ b/roles/cri-o/vars/fedora.yml
@@ -0,0 +1,5 @@
+---
+crio_packages:
+  - cri-o
+
+crio_service: cri-o
diff --git a/roles/docker/defaults/main.yml b/roles/docker/defaults/main.yml
index 2d6681b34c82260f3ef93936055b17186f9197cc..ae8eefbd3e59c7e55ad412f05ee45f61a924bd45 100644
--- a/roles/docker/defaults/main.yml
+++ b/roles/docker/defaults/main.yml
@@ -26,6 +26,9 @@ yum_conf: /etc/yum.conf
 yum_repo_dir: /etc/yum.repos.d
 docker_yum_conf: /etc/yum_docker.conf
 
+# Fedora docker-ce repo
+docker_fedora_repo_base_url: 'https://download.docker.com/linux/fedora/$releasever/$basearch/stable'
+docker_fedora_repo_gpgkey: 'https://download.docker.com/linux/fedora/gpg'
 # CentOS/RedHat docker-ce repo
 docker_rh_repo_base_url: 'https://download.docker.com/linux/centos/7/$basearch/stable'
 docker_rh_repo_gpgkey: 'https://download.docker.com/linux/centos/gpg'
diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml
index 5835dff10bb8da1b12173316e0c06db9f79f26d2..0ba076deb84dd24db624ee48220fe3cce7c1a5ff 100644
--- a/roles/docker/tasks/main.yml
+++ b/roles/docker/tasks/main.yml
@@ -89,6 +89,12 @@
     - use_docker_engine is defined and use_docker_engine
     - not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS", "RedHat", "Suse"] or is_atomic) and (dockerproject_repo_info.repos|length > 0)
 
+- name: Configure docker repository on Fedora
+  template:
+    src: "fedora_docker.repo.j2"
+    dest: "{{ yum_repo_dir }}/docker.repo"
+  when: ansible_distribution == "Fedora" and not is_atomic
+
 - name: Configure docker repository on RedHat/CentOS
   template:
     src: "rh_docker.repo.j2"
@@ -118,7 +124,7 @@
     force: "{{item.force|default(omit)}}"
     conf_file: "{{item.yum_conf|default(omit)}}"
     state: present
-    update_cache: yes
+    update_cache: "{{ omit if ansible_distribution == 'Fedora' else True }}"
   register: docker_task_result
   until: docker_task_result|succeeded
   retries: 4
@@ -130,13 +136,17 @@
 
 - name: get available packages on Ubuntu
   command: apt-cache policy docker-ce
-  when: docker_task_result|failed
+  when:
+    - docker_task_result|failed
+    - ansible_distribution == 'Ubuntu'
   register: available_packages
 
 - name: show available packages on ubuntu
   fail:
     msg: "{{available_packages}}"
-  when: docker_task_result|failed
+  when:
+    - docker_task_result|failed
+    - ansible_distribution == 'Ubuntu'
 
 # This is required to ensure any apt upgrade will not break kubernetes
 - name: Set docker pin priority to apt_preferences on Debian family
diff --git a/roles/docker/templates/fedora_docker.repo.j2 b/roles/docker/templates/fedora_docker.repo.j2
new file mode 100644
index 0000000000000000000000000000000000000000..6525f1133bfbd53a9e15dfb0e87a07fc43d3201b
--- /dev/null
+++ b/roles/docker/templates/fedora_docker.repo.j2
@@ -0,0 +1,7 @@
+[docker-ce]
+name=Docker-CE Repository
+baseurl={{ docker_fedora_repo_base_url }}
+enabled=1
+gpgcheck=1
+gpgkey={{ docker_fedora_repo_gpgkey }}
+{% if http_proxy is defined %}proxy={{ http_proxy }}{% endif %}
diff --git a/roles/docker/vars/fedora.yml b/roles/docker/vars/fedora.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2388f1ffc755245e4b44cb8fd9499b0d32cd6ef7
--- /dev/null
+++ b/roles/docker/vars/fedora.yml
@@ -0,0 +1,20 @@
+---
+docker_kernel_min_version: '0'
+
+# https://docs.docker.com/install/linux/docker-ce/fedora/
+
+docker_versioned_pkg:
+  'latest': docker-ce
+  '18.03': docker-ce-18.03.1.ce-3.fc28
+  '18.06': docker-ce-18.06.1.ce-3.fc28
+
+#
+# This is due to the fact that the docker
+# packages available on Fedora are too recent
+#
+docker_version: "latest"
+
+docker_package_info:
+  pkg_mgr: dnf
+  pkgs:
+    - name: "{{ docker_versioned_pkg[docker_version | string] }}"
\ No newline at end of file
diff --git a/roles/rkt/tasks/install.yml b/roles/rkt/tasks/install.yml
index f881a81fe40c03e34a911c5b22e9cf9c5db419fa..91ab4bac6b58da6a2238d6d00030a962f466470e 100644
--- a/roles/rkt/tasks/install.yml
+++ b/roles/rkt/tasks/install.yml
@@ -25,6 +25,12 @@
   delay: "{{ retry_stagger | random + 3 }}"
   when: ansible_os_family == "Debian"
 
+- name: install rkt pkg on fedora
+  dnf:
+    name: rkt
+    state: present
+  when: ansible_distribution == "Fedora"
+
 - name: install rkt pkg on centos
   yum:
     pkg: "{{ rkt_download_url }}/{{ rkt_pkg_name }}"
@@ -33,7 +39,9 @@
   until: rkt_task_result|succeeded
   retries: 4
   delay: "{{ retry_stagger | random + 3 }}"
-  when: ansible_os_family == "RedHat"
+  when:
+    - ansible_os_family == "RedHat"
+    - ansible_distribution != "Fedora"
 
 - name: install rkt pkg on openSUSE
   zypper: