diff --git a/Vagrantfile b/Vagrantfile
index 8ecaf246df750009612df27df24c2afa3b5af380..8920891943231042c69c403401eb9e806880a04c 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -23,7 +23,7 @@ SUPPORTED_OS = {
   "centos"              => {box: "centos/7",           user: "vagrant"},
   "centos-bento"        => {box: "bento/centos-7.5",   user: "vagrant"},
   "fedora"              => {box: "fedora/28-cloud-base",                user: "vagrant"},
-  "opensuse"            => {box: "opensuse/openSUSE-42.3-x86_64",       user: "vagrant"},
+  "opensuse"            => {box: "opensuse/openSUSE-15.0-x86_64",       user: "vagrant"},
   "opensuse-tumbleweed" => {box: "opensuse/openSUSE-Tumbleweed-x86_64", user: "vagrant"},
 }
 
diff --git a/docs/opensuse.md b/docs/opensuse.md
index 88fac3790e36a3a0865344e34ab5dfcf29875081..6c76fd3006f0584b5086f44837a648d58afab252 100644
--- a/docs/opensuse.md
+++ b/docs/opensuse.md
@@ -1,4 +1,4 @@
-openSUSE Leap 42.3 and Tumbleweed
+openSUSE Leap 15.0 and Tumbleweed
 ===============
 
 openSUSE Leap installation Notes:
diff --git a/inventory/sample/group_vars/all/docker.yml b/inventory/sample/group_vars/all/docker.yml
index f81e6b08dca93892bff9ea920f78bd7da3b63347..4e2a5594f38809317f856c3beb35425c964db2bc 100644
--- a/inventory/sample/group_vars/all/docker.yml
+++ b/inventory/sample/group_vars/all/docker.yml
@@ -59,9 +59,9 @@ docker_options: >-
   {{ docker_registry_mirrors | map('regex_replace', '^(.*)$', '--registry-mirror=\1' ) | list | join(' ') }}
   {%- endif %}
   {%- if docker_version != "latest" and docker_version is version('17.05', '<') %}
-  --graph={{ docker_daemon_graph }} {{ docker_log_opts }}
+  --graph={{ docker_daemon_graph }} {% if ansible_os_family not in ["openSUSE Leap", "openSUSE Tumbleweed", "Suse"] %}{{ docker_log_opts }}{% endif %}
   {%- else %}
-  --data-root={{ docker_daemon_graph }} {{ docker_log_opts }}
+  --data-root={{ docker_daemon_graph }} {% if ansible_os_family not in ["openSUSE Leap", "openSUSE Tumbleweed", "Suse"] %}{{ docker_log_opts }}{% endif %}
   {%- endif %}
   {%- if ansible_architecture == "aarch64" and ansible_os_family == "RedHat" %}
   --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current
diff --git a/roles/bootstrap-os/tasks/bootstrap-opensuse.yml b/roles/bootstrap-os/tasks/bootstrap-opensuse.yml
index b081710a1e25a93a2dede0b44358a7d2887aa27f..4eeae9fa964f2d91ba423215d9976a48cdcc0a9e 100644
--- a/roles/bootstrap-os/tasks/bootstrap-opensuse.yml
+++ b/roles/bootstrap-os/tasks/bootstrap-opensuse.yml
@@ -1,4 +1,9 @@
 ---
+- name: Ensure zypper cache is updated (SUSE)
+  zypper_repository:
+    repo: "*"
+    runrefresh: yes
+
 - name: Install required packages (SUSE)
   package:
     name: "{{ item }}"
diff --git a/roles/bootstrap-os/tasks/main.yml b/roles/bootstrap-os/tasks/main.yml
index a1a3bb9465258af285ac5bf021fe54127d4340a3..5733c7db460071e92febf682e80dac7feb33c7fc 100644
--- a/roles/bootstrap-os/tasks/main.yml
+++ b/roles/bootstrap-os/tasks/main.yml
@@ -23,7 +23,7 @@
   when: '"CentOS" in os_release.stdout or "Red Hat Enterprise Linux" in os_release.stdout'
 
 - include_tasks: bootstrap-opensuse.yml
-  when: '"OpenSUSE" in os_release.stdout'
+  when: '"openSUSE" in os_release.stdout'
 
 - include_tasks: bootstrap-clearlinux.yml
   when: '"Clear Linux OS" in os_release.stdout'
diff --git a/roles/container-engine/docker/tasks/main.yml b/roles/container-engine/docker/tasks/main.yml
index 516f4b39bc490f9f66d5ed54aef35eaf0e74766e..c9f677567831ba8ca77dd3f853393fddea843e78 100644
--- a/roles/container-engine/docker/tasks/main.yml
+++ b/roles/container-engine/docker/tasks/main.yml
@@ -151,7 +151,7 @@
     pkg: "{{item.name}}"
     force: "{{item.force|default(omit)}}"
     conf_file: "{{item.yum_conf|default(omit)}}"
-    state: present
+    state: "{{item.state | default('present')}}"
     update_cache: "{{ omit if ansible_distribution == 'Fedora' else True }}"
   register: docker_task_result
   until: docker_task_result is succeeded
@@ -166,7 +166,7 @@
   action: "{{ docker_package_info.pkg_mgr }}"
   args:
     name: "{{ item.name }}"
-    state: present
+    state: "{{item.state | default('present')}}"
   with_items: "{{ docker_package_info.pkgs }}"
   register: docker_task_result
   until: docker_task_result is succeeded
diff --git a/roles/container-engine/docker/vars/suse.yml b/roles/container-engine/docker/vars/suse.yml
index d89a50a7f4bdfc98c7223a7b843fa6b61ef23cda..0353286caeabaf33f50d83daa20d681540391415 100644
--- a/roles/container-engine/docker/vars/suse.yml
+++ b/roles/container-engine/docker/vars/suse.yml
@@ -5,6 +5,8 @@ docker_package_info:
   pkg_mgr: zypper
   pkgs:
     - name: docker
+    - name: containerd
+      state: latest
 
 docker_repo_key_info:
   pkg_key: ''
diff --git a/roles/kubespray-defaults/defaults/main.yaml b/roles/kubespray-defaults/defaults/main.yaml
index 5322202885ec67e7491ea368395941fbcab35f80..c6407cb329fcb5670be9ae87841ba9446cf4e2f7 100644
--- a/roles/kubespray-defaults/defaults/main.yaml
+++ b/roles/kubespray-defaults/defaults/main.yaml
@@ -236,9 +236,9 @@ docker_options: >-
   {{ docker_registry_mirrors | map('regex_replace', '^(.*)$', '--registry-mirror=\1' ) | list | join(' ') }}
   {%- endif %}
   {%- if docker_version != "latest" and docker_version is version('17.05', '<') %}
-  --graph={{ docker_daemon_graph }} {{ docker_log_opts }}
+  --graph={{ docker_daemon_graph }} {% if ansible_os_family not in ["openSUSE Leap", "openSUSE Tumbleweed", "Suse"] %}{{ docker_log_opts }}{% endif %}
   {%- else %}
-  --data-root={{ docker_daemon_graph }} {{ docker_log_opts }}
+  --data-root={{ docker_daemon_graph }} {% if ansible_os_family not in ["openSUSE Leap", "openSUSE Tumbleweed", "Suse"] %}{{ docker_log_opts }}{% endif %}
   {%- endif %}
   {%- if ansible_architecture == "aarch64" and ansible_os_family == "RedHat" %}
   --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current