diff --git a/providers/docker/scs/README.md b/providers/docker/scs/README.md
new file mode 100644
index 00000000..73e8ae8a
--- /dev/null
+++ b/providers/docker/scs/README.md
@@ -0,0 +1,89 @@
+# Cluster Stacks
+
+## Getting started
+
+```sh
+# Create bootstrap cluster
+echo "
+---
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
+networking:
+  ipFamily: dual
+nodes:
+  - role: control-plane
+    extraMounts:
+      - hostPath: /var/run/docker.sock
+        containerPath: /var/run/docker.sock" | kind create cluster --config -
+
+# Init Cluster API
+export CLUSTER_TOPOLOGY=true
+export EXP_CLUSTER_RESOURCE_SET=true
+export EXP_RUNTIME_SDK=true
+clusterctl init --infrastructure docker
+
+kubectl -n capi-system rollout status deployment
+kubectl -n capd-system rollout status deployment
+
+# Install CSO and CSPO
+helm upgrade -i cso \
+-n cso-system \
+--create-namespace \
+oci://registry.scs.community/cluster-stacks/cso \
+--set clusterStackVariables.ociRepository=registry.scs.community/kaas/cluster-stacks
+
+kubectl create namespace cluster
+```
+
+clusterstack.yaml
+
+```yaml
+apiVersion: clusterstack.x-k8s.io/v1alpha1
+kind: ClusterStack
+metadata:
+  name: docker
+  namespace: cluster
+spec:
+  provider: docker
+  name: scs
+  kubernetesVersion: "1.30"
+  channel: custom
+  autoSubscribe: false
+  noProvider: true
+  versions:
+    - v0-sha.rwvgrna
+```
+
+Check if ClusterClasses exist
+
+```sh
+kubectl get clusterclass -n cluster
+```
+
+cluster.yaml
+
+```yaml
+apiVersion: cluster.x-k8s.io/v1beta1
+kind: Cluster
+metadata:
+  name: docker-testcluster
+  namespace: cluster
+  labels:
+    managed-secret: cloud-config
+spec:
+  topology:
+    class: docker-scs-1-30-v0-sha.rwvgrna
+    controlPlane:
+      replicas: 1
+    version: v1.30.10
+    workers:
+      machineDeployments:
+        - class: default-worker
+          name: md-0
+          replicas: 1
+```
+
+```sh
+clusterctl get kubeconfig -n cluster docker-testcluster > /tmp/kubeconfig
+kubectl get nodes --kubeconfig /tmp/kubeconfig
+```
diff --git a/providers/docker/scs/cluster-addon-values.yaml b/providers/docker/scs/cluster-addon-values.yaml
new file mode 100644
index 00000000..7b1dcd5b
--- /dev/null
+++ b/providers/docker/scs/cluster-addon-values.yaml
@@ -0,0 +1,4 @@
+values: |
+  metrics-server:
+    commonLabels:
+      domain: "{{ .Cluster.spec.controlPlaneEndpoint.host }}"
diff --git a/providers/openstack/scs/cluster-addon/.helmignore b/providers/docker/scs/cluster-addon/.helmignore
similarity index 100%
rename from providers/openstack/scs/cluster-addon/.helmignore
rename to providers/docker/scs/cluster-addon/.helmignore
diff --git a/providers/docker/scs/cluster-addon/cni/Chart.lock b/providers/docker/scs/cluster-addon/cni/Chart.lock
new file mode 100644
index 00000000..776d3129
--- /dev/null
+++ b/providers/docker/scs/cluster-addon/cni/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: cilium
+  repository: https://helm.cilium.io/
+  version: 1.16.6
+digest: sha256:e6a746a27a71acab49c5d54cba2d37eed32e04f8b74af5651e2266ae251c55d8
+generated: "2025-02-13T12:55:17.200292016+01:00"
diff --git a/providers/docker/scs/cluster-addon/cni/Chart.yaml b/providers/docker/scs/cluster-addon/cni/Chart.yaml
new file mode 100644
index 00000000..0d756c93
--- /dev/null
+++ b/providers/docker/scs/cluster-addon/cni/Chart.yaml
@@ -0,0 +1,10 @@
+apiVersion: v2
+type: application
+description: Croquette CNI
+name: CNI
+version: v1
+dependencies:
+  - alias: cilium
+    name: cilium
+    repository: https://helm.cilium.io/
+    version: 1.16.6
diff --git a/providers/docker/scs/cluster-addon/cni/charts/cilium-1.16.6.tgz b/providers/docker/scs/cluster-addon/cni/charts/cilium-1.16.6.tgz
new file mode 100644
index 00000000..3e99630f
Binary files /dev/null and b/providers/docker/scs/cluster-addon/cni/charts/cilium-1.16.6.tgz differ
diff --git a/providers/docker/scs/cluster-addon/cni/values.yaml b/providers/docker/scs/cluster-addon/cni/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/providers/docker/scs/cluster-addon/metrics-server/.helmignore b/providers/docker/scs/cluster-addon/metrics-server/.helmignore
new file mode 100644
index 00000000..0e8a0eb3
--- /dev/null
+++ b/providers/docker/scs/cluster-addon/metrics-server/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/providers/docker/scs/cluster-addon/metrics-server/Chart.lock b/providers/docker/scs/cluster-addon/metrics-server/Chart.lock
new file mode 100644
index 00000000..cb461d5a
--- /dev/null
+++ b/providers/docker/scs/cluster-addon/metrics-server/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: metrics-server
+  repository: https://kubernetes-sigs.github.io/metrics-server/
+  version: 3.12.2
+digest: sha256:b79715342d7c10e97664b5f4d79199044f5da6ef40cca906218cff05ca891122
+generated: "2025-01-13T15:40:51.780206883+01:00"
diff --git a/providers/docker/scs/cluster-addon/metrics-server/Chart.yaml b/providers/docker/scs/cluster-addon/metrics-server/Chart.yaml
new file mode 100644
index 00000000..483ca2be
--- /dev/null
+++ b/providers/docker/scs/cluster-addon/metrics-server/Chart.yaml
@@ -0,0 +1,10 @@
+apiVersion: v2
+type: application
+description: Croquette Metrics Server
+name: yorizonpoc-metrics-server
+version: v1
+dependencies:
+  - name: "metrics-server"
+    version: "3.12.2"
+    repository: "https://kubernetes-sigs.github.io/metrics-server/"
+    alias: "metrics-server"
diff --git a/providers/docker/scs/cluster-addon/metrics-server/charts/metrics-server-3.12.2.tgz b/providers/docker/scs/cluster-addon/metrics-server/charts/metrics-server-3.12.2.tgz
new file mode 100644
index 00000000..4538e8a1
Binary files /dev/null and b/providers/docker/scs/cluster-addon/metrics-server/charts/metrics-server-3.12.2.tgz differ
diff --git a/providers/docker/scs/cluster-addon/metrics-server/values.yaml b/providers/docker/scs/cluster-addon/metrics-server/values.yaml
new file mode 100644
index 00000000..d6d65876
--- /dev/null
+++ b/providers/docker/scs/cluster-addon/metrics-server/values.yaml
@@ -0,0 +1,5 @@
+metrics-server:
+  fullnameOverride: metrics-server
+
+  args:
+    - --kubelet-insecure-tls
diff --git a/providers/docker/scs/cluster-class/.helmignore b/providers/docker/scs/cluster-class/.helmignore
new file mode 100644
index 00000000..0e8a0eb3
--- /dev/null
+++ b/providers/docker/scs/cluster-class/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/providers/docker/scs/cluster-class/Chart.yaml b/providers/docker/scs/cluster-class/Chart.yaml
new file mode 100644
index 00000000..2a11e914
--- /dev/null
+++ b/providers/docker/scs/cluster-class/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+description: Croquette Cluster Class
+name: docker-scs-1-30-cluster-class
+type: application
+version: v1
diff --git a/providers/docker/scs/cluster-class/templates/_helpers.tpl b/providers/docker/scs/cluster-class/templates/_helpers.tpl
new file mode 100644
index 00000000..2339c125
--- /dev/null
+++ b/providers/docker/scs/cluster-class/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "cluster-class.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "cluster-class.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "cluster-class.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "cluster-class.labels" -}}
+helm.sh/chart: {{ include "cluster-class.chart" . }}
+{{ include "cluster-class.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "cluster-class.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "cluster-class.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "cluster-class.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "cluster-class.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/providers/docker/scs/cluster-class/templates/cluster-class.yaml b/providers/docker/scs/cluster-class/templates/cluster-class.yaml
new file mode 100644
index 00000000..16a64cde
--- /dev/null
+++ b/providers/docker/scs/cluster-class/templates/cluster-class.yaml
@@ -0,0 +1,101 @@
+apiVersion: cluster.x-k8s.io/v1beta1
+kind: ClusterClass
+metadata:
+  name: {{ .Release.Name }}-{{ .Chart.Version }}
+  namespace: {{.Release.Namespace}}
+spec:
+  controlPlane:
+    ref:
+      apiVersion: controlplane.cluster.x-k8s.io/v1beta1
+      kind: KubeadmControlPlaneTemplate
+      name: {{ .Release.Name }}-{{ .Chart.Version }}-control-plane
+      namespace: {{ .Release.Namespace }}
+    machineInfrastructure:
+      ref:
+        kind: DockerMachineTemplate
+        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+        name: {{ .Release.Name }}-{{ .Chart.Version }}-machinetemplate-docker
+        namespace: {{ .Release.Namespace }}
+  infrastructure:
+    ref:
+      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+      kind: DockerClusterTemplate
+      name: {{ .Release.Name }}-{{ .Chart.Version }}-cluster
+      namespace: {{ .Release.Namespace }}
+  workers:
+    machineDeployments:
+    - class: default-worker
+      template:
+        bootstrap:
+          ref:
+            apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
+            kind: KubeadmConfigTemplate
+            name: {{ .Release.Name }}-{{ .Chart.Version }}-worker-bootstraptemplate-docker
+            namespace: {{ .Release.Namespace }}
+        infrastructure:
+          ref:
+            apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+            kind: DockerMachineTemplate
+            name: {{ .Release.Name }}-{{ .Chart.Version }}-machinetemplate-docker
+            namespace: {{ .Release.Namespace }}
+  variables:
+  - name: imageRepository
+    required: true
+    schema:
+      openAPIV3Schema:
+        type: string
+        default: ""
+        example: "registry.k8s.io"
+        description: "imageRepository sets the container registry to pull images from. If empty, nothing will be set and the from of kubeadm will be used."
+  patches:
+  - name: imageRepository
+    description: "Sets the imageRepository used for the KubeadmControlPlane."
+    enabledIf: '{{ ne .imageRepository "" }}'
+    definitions:
+    - selector:
+        apiVersion: controlplane.cluster.x-k8s.io/v1beta1
+        kind: KubeadmControlPlaneTemplate
+        matchResources:
+          controlPlane: true
+      jsonPatches:
+      - op: add
+        path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository"
+        valueFrom:
+          variable: imageRepository
+  - name: customImage
+    description: "Sets the container image that is used for running dockerMachines for the controlplane and worker machineDeployments."
+    definitions:
+    - selector:
+        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+        kind: DockerMachineTemplate
+        matchResources:
+          machineDeploymentClass:
+            names:
+            - default-worker
+      jsonPatches:
+      - op: add
+        path: "/spec/template/spec/customImage"
+        value: {{ (index .Values.images.controlPlane 0).name }}
+    - selector:
+        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+        kind: DockerMachineTemplate
+        matchResources:
+          controlPlane: true
+      jsonPatches:
+      - op: add
+        path: "/spec/template/spec/customImage"
+        value: {{ (index .Values.images.controlPlane 0).name }}
+  - name: DockerMachineTemplateWorker
+    description: "Sets the container image that is used for running dockerMachines for the worker machineDeployments."
+    definitions:
+      - selector:
+          apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+          kind: DockerMachineTemplate
+          matchResources:
+            machineDeploymentClass:
+              names:
+                - default-worker
+        jsonPatches:
+          - op: add
+            path: "/spec/template/spec/customImage"
+            value: {{ (index .Values.images.worker 0).name }}
diff --git a/providers/docker/scs/cluster-class/templates/docker-cluster-template.yaml b/providers/docker/scs/cluster-class/templates/docker-cluster-template.yaml
new file mode 100644
index 00000000..0bdf7120
--- /dev/null
+++ b/providers/docker/scs/cluster-class/templates/docker-cluster-template.yaml
@@ -0,0 +1,8 @@
+apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+kind: DockerClusterTemplate
+metadata:
+  name: {{ .Release.Name }}-{{ .Chart.Version }}-cluster
+  namespace: {{ .Release.Namespace }}
+spec:
+  template:
+    spec: {}
diff --git a/providers/docker/scs/cluster-class/templates/docker-machine-template.yaml b/providers/docker/scs/cluster-class/templates/docker-machine-template.yaml
new file mode 100644
index 00000000..bc4c6cc6
--- /dev/null
+++ b/providers/docker/scs/cluster-class/templates/docker-machine-template.yaml
@@ -0,0 +1,11 @@
+apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
+kind: DockerMachineTemplate
+metadata:
+  name: {{ .Release.Name }}-{{ .Chart.Version }}-machinetemplate-docker
+  namespace: {{ .Release.Namespace }}
+spec:
+  template:
+    spec:
+      extraMounts:
+      - containerPath: "/var/run/docker.sock"
+        hostPath: "/var/run/docker.sock"
diff --git a/providers/docker/scs/cluster-class/templates/kubeadm-config-template-worker-docker.yaml b/providers/docker/scs/cluster-class/templates/kubeadm-config-template-worker-docker.yaml
new file mode 100644
index 00000000..861ccec4
--- /dev/null
+++ b/providers/docker/scs/cluster-class/templates/kubeadm-config-template-worker-docker.yaml
@@ -0,0 +1,15 @@
+apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
+kind: KubeadmConfigTemplate
+metadata:
+  name: {{ .Release.Name }}-{{ .Chart.Version }}-worker-bootstraptemplate-docker
+  namespace: {{ .Release.Namespace }}
+spec:
+  template:
+    spec:
+      joinConfiguration:
+        nodeRegistration:
+          # We have to set the criSocket to containerd as kubeadm defaults to docker runtime if both containerd and docker sockets are found
+          criSocket: unix:///var/run/containerd/containerd.sock
+          kubeletExtraArgs:
+            eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%'
+            fail-swap-on: "false"
diff --git a/providers/docker/scs/cluster-class/templates/kubeadm-control-plane-template.yaml b/providers/docker/scs/cluster-class/templates/kubeadm-control-plane-template.yaml
new file mode 100644
index 00000000..c76866e7
--- /dev/null
+++ b/providers/docker/scs/cluster-class/templates/kubeadm-control-plane-template.yaml
@@ -0,0 +1,29 @@
+apiVersion: controlplane.cluster.x-k8s.io/v1beta1
+kind: KubeadmControlPlaneTemplate
+metadata:
+  name: {{ .Release.Name }}-{{ .Chart.Version }}-control-plane
+  namespace: {{ .Release.Namespace }}
+spec:
+  template:
+    spec:
+      kubeadmConfigSpec:
+        clusterConfiguration:
+          controllerManager:
+            extraArgs: { enable-hostpath-provisioner: 'true' }
+          apiServer:
+            # host.docker.internal is required by kubetest when running on MacOS because of the way ports are proxied.
+            certSANs: [localhost, 127.0.0.1, 0.0.0.0, host.docker.internal]
+        initConfiguration:
+          nodeRegistration:
+            # We have to set the criSocket to containerd as kubeadm defaults to docker runtime if both containerd and docker sockets are found
+            criSocket: unix:///var/run/containerd/containerd.sock
+            kubeletExtraArgs:
+              eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%'
+              fail-swap-on: "false"
+        joinConfiguration:
+          nodeRegistration:
+            # We have to set the criSocket to containerd as kubeadm defaults to docker runtime if both containerd and docker sockets are found
+            criSocket: unix:///var/run/containerd/containerd.sock
+            kubeletExtraArgs:
+              eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%'
+              fail-swap-on: "false"
diff --git a/providers/docker/scs/cluster-class/values.yaml b/providers/docker/scs/cluster-class/values.yaml
new file mode 100644
index 00000000..a55ba734
--- /dev/null
+++ b/providers/docker/scs/cluster-class/values.yaml
@@ -0,0 +1,5 @@
+images:
+  controlPlane:
+    - name: registry.scs.community/docker.io/kindest/node:v1.30.10
+  worker:
+    - name: registry.scs.community/docker.io/kindest/node:v1.30.10
diff --git a/providers/docker/scs/clusteraddon.yaml b/providers/docker/scs/clusteraddon.yaml
new file mode 100644
index 00000000..60f4e562
--- /dev/null
+++ b/providers/docker/scs/clusteraddon.yaml
@@ -0,0 +1,13 @@
+apiVersion: clusteraddonconfig.x-k8s.io/v1alpha1
+clusterAddonVersion: clusteraddons.clusterstack.x-k8s.io/v1alpha1
+addonStages:
+  AfterControlPlaneInitialized:
+    - name: cni
+      action: apply
+    - name: metrics-server
+      action: apply
+  BeforeClusterUpgrade:
+    - name: cni
+      action: apply
+    - name: metrics-server
+      action: apply
diff --git a/providers/docker/scs/clusterstack.yaml b/providers/docker/scs/clusterstack.yaml
new file mode 100644
index 00000000..488aa714
--- /dev/null
+++ b/providers/docker/scs/clusterstack.yaml
@@ -0,0 +1,14 @@
+apiVersion: clusterstack.x-k8s.io/v1alpha1
+kind: ClusterStack
+metadata:
+  name: docker-131
+  namespace: cluster
+spec:
+  autoSubscribe: false
+  channel: custom
+  kubernetesVersion: "1.31"
+  name: scs
+  noProvider: true
+  provider: docker
+  versions:
+    - v0-sha.hdl6pjy
diff --git a/providers/docker/scs/csctl.yaml b/providers/docker/scs/csctl.yaml
new file mode 100644
index 00000000..c9d2c1cb
--- /dev/null
+++ b/providers/docker/scs/csctl.yaml
@@ -0,0 +1,7 @@
+apiVersion: csctl.clusterstack.x-k8s.io/v1alpha1
+config:
+  kubernetesVersion: v1.30.10
+  clusterStackName: scs
+  provider:
+    type: docker
+    apiVersion: docker.csctl.clusterstack.x-k8s.io/v1alpha1
diff --git a/providers/openstack/scs/cluster-addon-values.yaml b/providers/openstack/scs/cluster-addon-values.yaml
index 90bde834..d0e64aac 100644
--- a/providers/openstack/scs/cluster-addon-values.yaml
+++ b/providers/openstack/scs/cluster-addon-values.yaml
@@ -1,34 +1,8 @@
 values: |
-  {{- define "yawol_image_id" -}}
-    {{- range .Cluster.spec.topology.variables -}}
-      {{- if eq .name "yawol_image_id" -}}
-        {{ .value }}
-      {{- end -}}
-    {{- end -}}
-  {{- end }}
-  {{- define "yawol_flavor_id" -}}
-    {{- range .Cluster.spec.topology.variables -}}
-      {{- if eq .name "yawol_flavor_id" -}}
-        {{ .value }}
-      {{- end -}}
-    {{- end -}}
-  {{- end }}
   metrics-server:
     commonLabels:
       domain: "{{ .Cluster.spec.controlPlaneEndpoint.host }}"
       clusterAddonVersion: "v2"
-  {{ range .Cluster.spec.topology.variables }}
-  {{- if and (eq .name "workload_loadbalancer") (eq .value "yawol") }}
-  yawol-controller:
-    enabled: true
-    yawolFloatingID: "{{ $.InfraCluster.status.externalNetwork.id }}"
-    yawolNetworkID: "{{ $.InfraCluster.status.network.id }}"
-    yawolAPIHost: "{{ printf "https://%s:%d" $.Cluster.spec.controlPlaneEndpoint.host $.Cluster.spec.controlPlaneEndpoint.port }}"
-    yawolFlavorID: {{ template "yawol_flavor_id" $}}
-    yawolImageID: {{ template "yawol_image_id" $}}
-  {{- end }}
-  {{- end }}
-
   openstack-cloud-controller-manager:
     cluster:
       name: {{ .Cluster.metadata.name }}
@@ -36,7 +10,7 @@ values: |
       loadBalancer:
       {{- range .Cluster.spec.topology.variables }}
       {{- if eq .name "workload_loadbalancer" }}
-      {{- if or (eq .value "none") (eq .value "yawol") }}
+      {{- if eq .value "none" }}
         enabled: false
       {{ else if eq .value "octavia-amphora" }}
         enabled: true
diff --git a/providers/openstack/scs/cluster-addon/Chart.lock b/providers/openstack/scs/cluster-addon/Chart.lock
deleted file mode 100644
index 528521d7..00000000
--- a/providers/openstack/scs/cluster-addon/Chart.lock
+++ /dev/null
@@ -1,18 +0,0 @@
-dependencies:
-- name: metrics-server
-  repository: https://kubernetes-sigs.github.io/metrics-server/
-  version: 3.12.0
-- name: cilium
-  repository: https://helm.cilium.io/
-  version: 1.16.3
-- name: openstack-cloud-controller-manager
-  repository: https://kubernetes.github.io/cloud-provider-openstack
-  version: 2.28.4
-- name: openstack-cinder-csi
-  repository: https://kubernetes.github.io/cloud-provider-openstack
-  version: 2.28.2
-- name: yawol-controller
-  repository: https://stackitcloud.github.io/yawol
-  version: 0.21.3
-digest: sha256:022d98ff75f315c6467c2b71156dcf30c25f2437f14c3452ac14c1cd68523b17
-generated: "2024-10-20T10:37:24.476007912+02:00"
diff --git a/providers/openstack/scs/cluster-addon/Chart.yaml b/providers/openstack/scs/cluster-addon/Chart.yaml
deleted file mode 100644
index 7f8fa63b..00000000
--- a/providers/openstack/scs/cluster-addon/Chart.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-apiVersion: v2
-dependencies:
-  - alias: metrics-server
-    name: metrics-server
-    repository: https://kubernetes-sigs.github.io/metrics-server/
-    version: 3.12.2
-  - alias: cilium
-    name: cilium
-    repository: https://helm.cilium.io/
-    version: 1.16.3
-  - alias: openstack-cloud-controller-manager
-    name: openstack-cloud-controller-manager
-    repository: https://kubernetes.github.io/cloud-provider-openstack
-    version: 2.28.4
-  - alias: openstack-cinder-csi
-    name: openstack-cinder-csi
-    repository: https://kubernetes.github.io/cloud-provider-openstack
-    version: 2.28.2
-  - alias: yawol-controller
-    condition: yawol-controller.enabled
-    name: yawol-controller
-    repository: https://stackitcloud.github.io/yawol
-    version: 0.25.0
-name: openstack-scs-1-29-cluster-addon
-type: application
-version: v1
diff --git a/providers/openstack/scs/cluster-addon/ccm/Chart.lock b/providers/openstack/scs/cluster-addon/ccm/Chart.lock
new file mode 100644
index 00000000..3331b6a8
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/ccm/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: openstack-cloud-controller-manager
+  repository: https://kubernetes.github.io/cloud-provider-openstack
+  version: 2.31.1
+digest: sha256:37581a55204e3d55a12413fec097c8f8ab2fa6e3c43f0c6b2a13ad5f94e366ab
+generated: "2025-01-31T08:56:58.099398117+01:00"
diff --git a/providers/openstack/scs/cluster-addon/ccm/Chart.yaml b/providers/openstack/scs/cluster-addon/ccm/Chart.yaml
new file mode 100644
index 00000000..551ba1f9
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/ccm/Chart.yaml
@@ -0,0 +1,10 @@
+apiVersion: v2
+type: application
+description: CCM
+name: CCM
+version: v1
+dependencies:
+  - alias: openstack-cloud-controller-manager
+    name: openstack-cloud-controller-manager
+    repository: https://kubernetes.github.io/cloud-provider-openstack
+    version: 2.31.1
diff --git a/providers/openstack/scs/cluster-addon/ccm/charts/openstack-cloud-controller-manager-2.31.1.tgz b/providers/openstack/scs/cluster-addon/ccm/charts/openstack-cloud-controller-manager-2.31.1.tgz
new file mode 100644
index 00000000..c34df7a0
Binary files /dev/null and b/providers/openstack/scs/cluster-addon/ccm/charts/openstack-cloud-controller-manager-2.31.1.tgz differ
diff --git a/providers/openstack/scs/cluster-addon/ccm/values.yaml b/providers/openstack/scs/cluster-addon/ccm/values.yaml
new file mode 100644
index 00000000..770706c7
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/ccm/values.yaml
@@ -0,0 +1,13 @@
+openstack-cloud-controller-manager:
+  secret:
+    enabled: true
+    name: cloud-config
+    create: false
+  nodeSelector:
+    node-role.kubernetes.io/control-plane: ""
+  tolerations:
+    - key: node.cloudprovider.kubernetes.io/uninitialized
+      value: "true"
+      effect: NoSchedule
+    - key: node-role.kubernetes.io/control-plane
+      effect: NoSchedule
diff --git a/providers/openstack/scs/cluster-addon/charts/cilium-1.16.3.tgz b/providers/openstack/scs/cluster-addon/charts/cilium-1.16.3.tgz
deleted file mode 100644
index eaca333a..00000000
Binary files a/providers/openstack/scs/cluster-addon/charts/cilium-1.16.3.tgz and /dev/null differ
diff --git a/providers/openstack/scs/cluster-addon/charts/metrics-server-3.12.0.tgz b/providers/openstack/scs/cluster-addon/charts/metrics-server-3.12.0.tgz
deleted file mode 100644
index 22f9f8dc..00000000
Binary files a/providers/openstack/scs/cluster-addon/charts/metrics-server-3.12.0.tgz and /dev/null differ
diff --git a/providers/openstack/scs/cluster-addon/charts/openstack-cinder-csi-2.28.2.tgz b/providers/openstack/scs/cluster-addon/charts/openstack-cinder-csi-2.28.2.tgz
deleted file mode 100644
index 6d9d8a5a..00000000
Binary files a/providers/openstack/scs/cluster-addon/charts/openstack-cinder-csi-2.28.2.tgz and /dev/null differ
diff --git a/providers/openstack/scs/cluster-addon/charts/openstack-cloud-controller-manager-2.28.4.tgz b/providers/openstack/scs/cluster-addon/charts/openstack-cloud-controller-manager-2.28.4.tgz
deleted file mode 100644
index 96f4e388..00000000
Binary files a/providers/openstack/scs/cluster-addon/charts/openstack-cloud-controller-manager-2.28.4.tgz and /dev/null differ
diff --git a/providers/openstack/scs/cluster-addon/charts/yawol-controller-0.21.3.tgz b/providers/openstack/scs/cluster-addon/charts/yawol-controller-0.21.3.tgz
deleted file mode 100644
index 68c0c18a..00000000
Binary files a/providers/openstack/scs/cluster-addon/charts/yawol-controller-0.21.3.tgz and /dev/null differ
diff --git a/providers/openstack/scs/cluster-addon/cni/Chart.lock b/providers/openstack/scs/cluster-addon/cni/Chart.lock
new file mode 100644
index 00000000..f6602079
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/cni/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: cilium
+  repository: https://helm.cilium.io/
+  version: 1.17.1
+digest: sha256:53c34069893b2a60b16c171d128e7cda9fd62ddb96210cde7c0d3c00d6d2f096
+generated: "2025-02-26T12:54:16.166712915+01:00"
diff --git a/providers/openstack/scs/cluster-addon/cni/Chart.yaml b/providers/openstack/scs/cluster-addon/cni/Chart.yaml
new file mode 100644
index 00000000..b25bda26
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/cni/Chart.yaml
@@ -0,0 +1,10 @@
+apiVersion: v2
+type: application
+description: CNI
+name: CNI
+version: v1
+dependencies:
+  - alias: cilium
+    name: cilium
+    repository: https://helm.cilium.io/
+    version: 1.17.1
diff --git a/providers/openstack/scs/cluster-addon/cni/charts/cilium-1.17.1.tgz b/providers/openstack/scs/cluster-addon/cni/charts/cilium-1.17.1.tgz
new file mode 100644
index 00000000..d95b80cb
Binary files /dev/null and b/providers/openstack/scs/cluster-addon/cni/charts/cilium-1.17.1.tgz differ
diff --git a/providers/openstack/scs/cluster-addon/cni/values.yaml b/providers/openstack/scs/cluster-addon/cni/values.yaml
new file mode 100644
index 00000000..195534d0
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/cni/values.yaml
@@ -0,0 +1,9 @@
+cilium:
+  tls:
+    secretsNamespace:
+      name: kube-system
+  sessionAffinity: true
+  sctp:
+    enabled: true
+  ipam:
+    mode: "kubernetes"
diff --git a/providers/openstack/scs/cluster-addon/csi/Chart.lock b/providers/openstack/scs/cluster-addon/csi/Chart.lock
new file mode 100644
index 00000000..121ca914
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/csi/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: openstack-cinder-csi
+  repository: https://kubernetes.github.io/cloud-provider-openstack
+  version: 2.31.2
+digest: sha256:c4dae4f651e1be8b82347d74df884fb5c7503e4b9e5d4db9424fa7fdf2e447d7
+generated: "2025-01-31T08:58:29.735075689+01:00"
diff --git a/providers/openstack/scs/cluster-addon/csi/Chart.yaml b/providers/openstack/scs/cluster-addon/csi/Chart.yaml
new file mode 100644
index 00000000..e56497ed
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/csi/Chart.yaml
@@ -0,0 +1,10 @@
+apiVersion: v2
+type: application
+description: CSI
+name: CSI
+version: v1
+dependencies:
+  - alias: openstack-cinder-csi
+    name: openstack-cinder-csi
+    repository: https://kubernetes.github.io/cloud-provider-openstack
+    version: 2.31.2
diff --git a/providers/openstack/scs/cluster-addon/csi/charts/openstack-cinder-csi-2.31.2.tgz b/providers/openstack/scs/cluster-addon/csi/charts/openstack-cinder-csi-2.31.2.tgz
new file mode 100644
index 00000000..c79ea208
Binary files /dev/null and b/providers/openstack/scs/cluster-addon/csi/charts/openstack-cinder-csi-2.31.2.tgz differ
diff --git a/providers/openstack/scs/cluster-addon/csi/values.yaml b/providers/openstack/scs/cluster-addon/csi/values.yaml
new file mode 100644
index 00000000..83817b87
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/csi/values.yaml
@@ -0,0 +1,16 @@
+openstack-cinder-csi:
+  secret:
+    enabled: true
+    name: cloud-config
+    create: false
+  nodeSelector:
+    node-role.kubernetes.io/control-plane: ""
+  tolerations:
+    - key: node.cloudprovider.kubernetes.io/uninitialized
+      value: "true"
+      effect: NoSchedule
+    - key: node-role.kubernetes.io/control-plane
+      effect: NoSchedule
+  storageClass:
+    delete:
+      isDefault: true
diff --git a/providers/openstack/scs/cluster-addon/metrics-server/.helmignore b/providers/openstack/scs/cluster-addon/metrics-server/.helmignore
new file mode 100644
index 00000000..0e8a0eb3
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/metrics-server/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/providers/openstack/scs/cluster-addon/metrics-server/Chart.lock b/providers/openstack/scs/cluster-addon/metrics-server/Chart.lock
new file mode 100644
index 00000000..fa9531c7
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/metrics-server/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: metrics-server
+  repository: https://kubernetes-sigs.github.io/metrics-server/
+  version: 3.12.2
+digest: sha256:b79715342d7c10e97664b5f4d79199044f5da6ef40cca906218cff05ca891122
+generated: "2025-01-10T10:10:00.37755764+01:00"
diff --git a/providers/openstack/scs/cluster-addon/metrics-server/Chart.yaml b/providers/openstack/scs/cluster-addon/metrics-server/Chart.yaml
new file mode 100644
index 00000000..8b390112
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/metrics-server/Chart.yaml
@@ -0,0 +1,10 @@
+apiVersion: v2
+type: application
+description: Metrics Server
+name: metrics-server
+version: v1
+dependencies:
+  - name: "metrics-server"
+    version: "3.12.2"
+    repository: "https://kubernetes-sigs.github.io/metrics-server/"
+    alias: "metrics-server"
diff --git a/providers/openstack/scs/cluster-addon/metrics-server/charts/metrics-server-3.12.2.tgz b/providers/openstack/scs/cluster-addon/metrics-server/charts/metrics-server-3.12.2.tgz
new file mode 100644
index 00000000..4538e8a1
Binary files /dev/null and b/providers/openstack/scs/cluster-addon/metrics-server/charts/metrics-server-3.12.2.tgz differ
diff --git a/providers/openstack/scs/cluster-addon/metrics-server/values.yaml b/providers/openstack/scs/cluster-addon/metrics-server/values.yaml
new file mode 100644
index 00000000..a89bf027
--- /dev/null
+++ b/providers/openstack/scs/cluster-addon/metrics-server/values.yaml
@@ -0,0 +1,4 @@
+metrics-server:
+  fullnameOverride: metrics-server
+  args:
+    - --kubelet-insecure-tls
diff --git a/providers/openstack/scs/cluster-addon/values.yaml b/providers/openstack/scs/cluster-addon/values.yaml
deleted file mode 100644
index 23e4bf59..00000000
--- a/providers/openstack/scs/cluster-addon/values.yaml
+++ /dev/null
@@ -1,54 +0,0 @@
-metrics-server:
-  fullnameOverride: metrics-server
-  replicas: 1
-  updateStrategy:
-    type: RollingUpdate
-    rollingUpdate:
-      maxSurge: 0
-      maxUnavailable: 1
-
-  service:
-    labels:
-      kubernetes.io/cluster-service: "true"
-      kubernetes.io/name: "Metrics-server"
-
-  defaultArgs:
-    - --cert-dir=/tmp
-    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
-    - --kubelet-use-node-status-port
-    - --metric-resolution=15s
-
-  args:
-    - --kubelet-insecure-tls
-openstack-cloud-controller-manager:
-  secret:
-    enabled: true
-    name: cloud-config
-    create: false
-  nodeSelector:
-    node-role.kubernetes.io/control-plane: ""
-  tolerations:
-  - key: node.cloudprovider.kubernetes.io/uninitialized
-    value: "true"
-    effect: NoSchedule
-  - key: node-role.kubernetes.io/control-plane
-    effect: NoSchedule
-openstack-cinder-csi:
-  secret:
-    enabled: true
-    name: cloud-config
-    create: false
-  nodeSelector:
-    node-role.kubernetes.io/control-plane: ""
-  tolerations:
-  - key: node.cloudprovider.kubernetes.io/uninitialized
-    value: "true"
-    effect: NoSchedule
-  - key: node-role.kubernetes.io/control-plane
-    effect: NoSchedule
-  storageClass:
-    delete:
-      isDefault: true
-yawol-controller:
-  yawolOSSecretName: cloud-config
-  enabled: false
diff --git a/providers/openstack/scs/cluster-class/Chart.yaml b/providers/openstack/scs/cluster-class/Chart.yaml
index bcd2929c..901b5d93 100644
--- a/providers/openstack/scs/cluster-class/Chart.yaml
+++ b/providers/openstack/scs/cluster-class/Chart.yaml
@@ -1,9 +1,9 @@
 apiVersion: v2
-description: "This chart installs and configures:
+description: 'This chart installs and configures:
 
   * Openstack scs Cluster Class
 
-  "
-name: openstack-scs-1-29-cluster-class
+  '
+name: openstack-scs-1-30-cluster-class
 type: application
 version: v1
diff --git a/providers/openstack/scs/cluster-class/templates/cluster-class.yaml b/providers/openstack/scs/cluster-class/templates/cluster-class.yaml
index 342a4c63..223ad58d 100644
--- a/providers/openstack/scs/cluster-class/templates/cluster-class.yaml
+++ b/providers/openstack/scs/cluster-class/templates/cluster-class.yaml
@@ -74,45 +74,6 @@ spec:
           default: 25
           example: 25
           description: "Root disk size in GiB for worker nodes. OpenStack volume will be created and used instead of an ephemeral disk defined in flavor. Should be used for the diskless flavors."
-    - name: yawol_flavor_id
-      required: false
-      schema:
-        openAPIV3Schema:
-          type: string
-          format: "uuid4"
-          example: "0a79590e-10d7-4c2c-8f69-ca0a2c6208d2"
-          description: "ID of the existing flavor used as a default yawol flavor."
-    - name: yawol_image_id
-      required: false
-      schema:
-        openAPIV3Schema:
-          type: string
-          format: "uuid4"
-          example: "f0b2ef46-f0ff-43d2-9c08-f58a5a6e9060"
-          description: "ID of the existing imaged used as a default yawol image."
-    - name: kube_vip_network_id
-      required: false
-      schema:
-        openAPIV3Schema:
-          type: string
-          format: "uuid4"
-          example: "40a51f6c-9e4b-4b24-9187-49851a410c97"
-          description: "ID of the existing network. The network should have one subnet with one port reserved as virtual IP."
-    - name: kube_vip_apiserver_virtual_ip
-      required: false
-      schema:
-        openAPIV3Schema:
-          type: string
-          format: "ipv4"
-          example: "10.0.0.197"
-          description: "Virtual IP address reserved in kube_vip_network_id."
-    - name: kube_vip_apiserver_public_ip
-      required: false
-      schema:
-        openAPIV3Schema:
-          type: string
-          format: "ipv4"
-          description: "Public IP address associated with kube_vip_apiserver_virtual_ip. It is needed only when the management cluster is on a different network as a workload cluster."
     - name: openstack_security_groups
       required: false
       schema:
@@ -169,7 +130,7 @@ spec:
         openAPIV3Schema:
           type: string
           default: "octavia-amphora"
-          example: "none, octavia-amphora, octavia-ovn, kube-vip"
+          example: "none, octavia-amphora, octavia-ovn"
           description: | 
             "In this cluster-stack we have two kind of loadbalancers. Each of them has its own configuration variable. This setting here is to configure the loadbalancer that is placed in front of the apiserver.
             To configure the loadbalancer for the workloads, see variable workload_loadbalancer.
@@ -183,16 +144,6 @@ spec:
             
             octavia-ovn:
               Uses openstack's loadbalancer service (provider:ovn)
-
-            kube-vip:
-              Uses kube-vip as loadbalancer.
-              You have to provide the following additional variables: 
-                kube_vip_network_id
-                kube_vip_apiserver_virtual_ip
-                kube_vip_apiserver_public_ip 
-             
-              Requires Kubernetes version < 1.29
-              Also the settings node_cidr and dns_nameservers will no longer have an effect.
        
     - name: workload_loadbalancer
       required: false
@@ -200,7 +151,7 @@ spec:
         openAPIV3Schema:
           type: string
           default: "octavia-amphora"
-          example: "none, octavia-amphora, octavia-ovn, yawol"
+          example: "none, octavia-amphora, octavia-ovn"
           description: |
             "This setting here is to configure the loadbalancer solution for your services inside your cluster.
             If you want to configure the loadbalancer in front of your apiserver, see variable apiserver_loadbalancer instead.
@@ -215,12 +166,6 @@ spec:
             octavia-ovn:
               Uses openstack's loadbalancer service (provider:ovn)
 
-            yawol:
-              Uses yawol as loadbalancer.
-              You have to provide the following additional variables: 
-                yawol_flavor_id
-                yawol_image_id
-              
               Also note this setting does not work with application credentials (only username/password)"
     - name: dns_nameservers
       required: false
@@ -228,9 +173,9 @@ spec:
         openAPIV3Schema:
           type: array
           description: |
-            "DNSNameservers is the list of nameservers for the OpenStack Subnet being created. Set this value when you need to create a new network/subnet while the access through DNS is required.
-            This setting has no effect when apiserver_loadbalancer is set to kube-vip.
-            However you can set the dns server when creating the subnet for kube-vip."
+            "DNSNameservers is the list of nameservers for the OpenStack Subnet
+            being created. Set this value when you need to create a new network/subnet
+            while the access through DNS is required."
           default: ["5.1.66.255", "185.150.99.255"]
           example: ["5.1.66.255", "185.150.99.255"]
           items:
@@ -244,9 +189,9 @@ spec:
           default: "10.8.0.0/20"
           example: "10.8.0.0/20"
           description: |
-            "NodeCIDR is the OpenStack Subnet to be created. Cluster actuator will create a network, a subnet with NodeCIDR, and a router connected to this subnet. If you leave this empty, no network will be created.
-            This setting has no effect when apiserver_loadbalancer is set to kube-vip.
-            However you can set the node_cidr when creating the subnet for kube-vip."
+            "NodeCIDR is the OpenStack Subnet to be created. Cluster actuator
+            will create a network, a subnet with NodeCIDR, and a router
+            connected to this subnet. If you leave this empty, no network will be created."
     - name: certSANs
       required: false
       schema:
@@ -378,138 +323,6 @@ cre ate group names like oidc:engineering and oidc:infra."
           - op: add
             path: "/spec/template/spec/apiServerLoadBalancer/provider"
             value: "ovn"
-    - name: apiserver_loadbalancer_kube-vip
-      description: "Takes care of the patches that should be applied when variable apiserver_loadbalancer is set to kube-vip."
-      enabledIf: {{ `'{{ eq .apiserver_loadbalancer "kube-vip" }}'` }}
-      definitions:
-        - selector:
-            apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
-            kind: OpenStackClusterTemplate
-            matchResources:
-              infrastructureCluster: true
-          jsonPatches:
-          - op: add
-            path: "/spec/template/spec/network"
-            valueFrom:
-              template: |
-                id: {{"{{"}} .kube_vip_network_id {{"}}"}}
-          - op: add
-            path: "/spec/template/spec/disableAPIServerFloatingIP"
-            value: true
-          - op: add
-            path: "/spec/template/spec/apiServerFixedIP"
-            valueFrom:
-              template: {{ `"{{ if .kube_vip_apiserver_public_ip }}{{.kube_vip_apiserver_public_ip}}{{else}}{{.kube_vip_apiserver_virtual_ip}}{{end}}"` }}
-        - selector:
-            apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
-            kind: OpenStackMachineTemplate
-            matchResources:
-              controlPlane: true
-          jsonPatches:
-          - op: add
-            path: "/spec/template/spec/ports"
-            valueFrom:
-              template: |
-                - network:
-                    id: {{"{{"}} .kube_vip_network_id {{"}}"}}
-                  allowedAddressPairs:
-                  - ipAddress: {{"{{"}} .kube_vip_apiserver_virtual_ip {{"}}"}}
-        - selector:
-            apiVersion: controlplane.cluster.x-k8s.io/v1beta1
-            kind: KubeadmControlPlaneTemplate
-            matchResources:
-              controlPlane: true
-          jsonPatches:
-          - op: add
-            path: "/spec/template/spec/kubeadmConfigSpec/preKubeadmCommands"
-            valueFrom:
-              template: |
-                - modprobe --all ip_vs ip_vs_rr nf_conntrack
-          - op: add
-            path: "/spec/template/spec/kubeadmConfigSpec/files"
-            valueFrom:
-              template: |
-                - content: |
-                    ip_vs
-                    ip_vs_rr
-                    nf_conntrack
-                  owner: "root:root"
-                  path: /etc/modules-load.d/kube-vip.conf
-                  permissions: "0644"
-          - op: add
-            path: "/spec/template/spec/kubeadmConfigSpec/files/-"
-            valueFrom:
-              template: |
-                content: |
-                  # docker run --network host --rm ghcr.io/kube-vip/kube-vip:v0.7.2 manifest pod --address '{{"{{"}} .kube_vip_apiserver_virtual_ip {{"}}"}}' --controlplane --arp --leaderElection --enableLoadBalancer
-                  apiVersion: v1
-                  kind: Pod
-                  metadata:
-                    creationTimestamp: null
-                    name: kube-vip
-                    namespace: kube-system
-                  spec:
-                    containers:
-                    - args:
-                      - manager
-                      env:
-                      - name: vip_arp
-                        value: "true"
-                      - name: port
-                        value: "6443"
-                      - name: vip_cidr
-                        value: "32"
-                      - name: dns_mode
-                        value: first
-                      - name: cp_enable
-                        value: "true"
-                      - name: cp_namespace
-                        value: kube-system
-                      - name: vip_leaderelection
-                        value: "true"
-                      - name: vip_leasename
-                        value: plndr-cp-lock
-                      - name: vip_leaseduration
-                        value: "5"
-                      - name: vip_renewdeadline
-                        value: "3"
-                      - name: vip_retryperiod
-                        value: "1"
-                      - name: lb_enable
-                        value: "true"
-                      - name: lb_port
-                        value: "6443"
-                      - name: lb_fwdmethod
-                        value: local
-                      - name: address
-                        value: '{{"{{"}} .kube_vip_apiserver_virtual_ip {{"}}"}}'
-                      - name: prometheus_server
-                        value: :2112
-                      image: ghcr.io/kube-vip/kube-vip:v0.7.2
-                      imagePullPolicy: IfNotPresent # Always
-                      name: kube-vip
-                      resources: {}
-                      securityContext:
-                        capabilities:
-                          add:
-                          - NET_ADMIN
-                          - NET_RAW
-                      volumeMounts:
-                      - mountPath: /etc/kubernetes/admin.conf
-                        name: kubeconfig
-                    hostAliases:
-                    - hostnames:
-                      - kubernetes
-                      ip: 127.0.0.1
-                    hostNetwork: true
-                    volumes:
-                    - hostPath:
-                        path: /etc/kubernetes/admin.conf
-                      name: kubeconfig
-                  status: {}
-                owner: "root:root"
-                path: /etc/kubernetes/manifests/kube-vip.yaml
-                permissions: "0644"
     - name: controller_flavor
       description: "Sets the openstack instance flavor for the KubeadmControlPlane."
       enabledIf: {{ `'{{ ne .controller_flavor "" }}'` }}
@@ -804,7 +617,7 @@ cre ate group names like oidc:engineering and oidc:infra."
               variable: oidc_config.groups_prefix
     - name: subnet
       description: "Sets the NodeCIDR for the OpenStack Subnet to be created. Cluster actuator will create a network, a subnet with NodeCIDR, and a router connected to this subnet."
-      enabledIf: {{ `"{{ if and .node_cidr (ne .apiserver_loadbalancer \"kube-vip\")}}true{{end}}"` }}
+      enabledIf: {{ `"{{ if .node_cidr }}true{{end}}"` }}
       definitions:
         - selector:
             apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
diff --git a/providers/openstack/scs/cluster-class/values.yaml b/providers/openstack/scs/cluster-class/values.yaml
index 32c4dc6d..779f0fce 100644
--- a/providers/openstack/scs/cluster-class/values.yaml
+++ b/providers/openstack/scs/cluster-class/values.yaml
@@ -2,16 +2,14 @@
 controller_flavor: SCS-2V-4-20s
 worker_flavor: SCS-2V-4-20
 restrict_kubeapi: []
-
 # newly introduced:
 openstack_loadbalancer_apiserver: false
-
 # TBD, currently needed:
 images:
   controlPlane:
-    name: ubuntu-capi-image-v1.29.9
+    name: ubuntu-capi-image-v1.30.9
   worker:
-    name: ubuntu-capi-image-v1.29.9
+    name: ubuntu-capi-image-v1.30.9
 identityRef:
   name: openstack
   cloudName: openstack
diff --git a/providers/openstack/scs/clusteraddon.yaml b/providers/openstack/scs/clusteraddon.yaml
new file mode 100755
index 00000000..bea5fc78
--- /dev/null
+++ b/providers/openstack/scs/clusteraddon.yaml
@@ -0,0 +1,30 @@
+apiVersion: clusteraddonconfig.x-k8s.io/v1alpha1
+clusterAddonVersion: clusteraddons.clusterstack.x-k8s.io/v1alpha1
+addonStages:
+  AfterControlPlaneInitialized:
+    - name: cni
+      action: apply
+    - name: metrics-server
+      action: apply
+    - name: csi
+      action: apply
+    - name: ccm
+      action: apply
+  BeforeClusterUpgrade:
+    - name: cni
+      action: apply
+    - name: metrics-server
+      action: apply
+    - name: csi
+      action: apply
+    - name: ccm
+      action: apply
+  AfterClusterUpgrade:
+    - name: cni
+      action: apply
+    - name: metrics-server
+      action: apply
+    - name: csi
+      action: apply
+    - name: ccm
+      action: apply
diff --git a/providers/openstack/scs/csctl.yaml b/providers/openstack/scs/csctl.yaml
index ac4594ae..0d022ef2 100644
--- a/providers/openstack/scs/csctl.yaml
+++ b/providers/openstack/scs/csctl.yaml
@@ -1,7 +1,7 @@
 apiVersion: csctl.clusterstack.x-k8s.io/v1alpha1
 config:
   clusterStackName: scs
-  kubernetesVersion: v1.29.9
+  kubernetesVersion: v1.30.9
   provider:
     apiVersion: openstack.csctl.clusterstack.x-k8s.io/v1alpha1
     config:
diff --git a/providers/openstack/scs/node-images/config.yaml b/providers/openstack/scs/node-images/config.yaml
index 92dc1fa8..66c63066 100644
--- a/providers/openstack/scs/node-images/config.yaml
+++ b/providers/openstack/scs/node-images/config.yaml
@@ -1,8 +1,8 @@
 apiVersion: openstack.infrastructure.clusterstack.x-k8s.io/v1alpha1
 openStackNodeImages:
-  - createOpts:
-      container_format: bare
-      disk_format: qcow2
-      name: ubuntu-capi-image-v1.29.9
-      visibility: private
-    url: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube-v1.29/ubuntu-2204-kube-v1.29.9.qcow2
+- createOpts:
+    container_format: bare
+    disk_format: qcow2
+    name: ubuntu-capi-image-v1.30.9
+    visibility: private
+  url: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube-v1.30/ubuntu-2204-kube-v1.30.9.qcow2
diff --git a/providers/openstack/scs/versions.yaml b/providers/openstack/scs/versions.yaml
index 34aec57d..8e6b6863 100644
--- a/providers/openstack/scs/versions.yaml
+++ b/providers/openstack/scs/versions.yaml
@@ -1,9 +1,9 @@
-- kubernetes: 1.29.10
-  cinder_csi: 2.29.2
-  occm: 2.29.3
-- kubernetes: 1.30.6
-  cinder_csi: 2.30.0
-  occm: 2.30.3
-- kubernetes: 1.31.2
+- kubernetes: 1.30.9
+  cinder_csi: 2.30.2
+  occm: 2.30.4
+- kubernetes: 1.31.5
   cinder_csi: 2.31.2
   occm: 2.31.1
+- kubernetes: 1.32.1
+  cinder_csi: 2.32.0
+  occm: 2.32.0