diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go
index bf9542a488ffbf02deb4dfd012bade181b315b2f..1f8fe203f8cb881522f7001d6062fea24ea8b139 100644
--- a/pkg/cluster/cluster.go
+++ b/pkg/cluster/cluster.go
@@ -12,7 +12,7 @@ import (
 	"time"
 
 	"github.com/sirupsen/logrus"
-	"k8s.io/api/apps/v1beta1"
+	appsv1 "k8s.io/api/apps/v1"
 	v1 "k8s.io/api/core/v1"
 	policybeta1 "k8s.io/api/policy/v1beta1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -52,7 +52,7 @@ type kubeResources struct {
 	Services            map[PostgresRole]*v1.Service
 	Endpoints           map[PostgresRole]*v1.Endpoints
 	Secrets             map[types.UID]*v1.Secret
-	Statefulset         *v1beta1.StatefulSet
+	Statefulset         *appsv1.StatefulSet
 	PodDisruptionBudget *policybeta1.PodDisruptionBudget
 	//Pods are treated separately
 	//PVCs are treated separately
@@ -214,7 +214,7 @@ func (c *Cluster) Create() error {
 
 		service *v1.Service
 		ep      *v1.Endpoints
-		ss      *v1beta1.StatefulSet
+		ss      *appsv1.StatefulSet
 	)
 
 	defer func() {
@@ -315,7 +315,7 @@ func (c *Cluster) Create() error {
 	return nil
 }
 
-func (c *Cluster) compareStatefulSetWith(statefulSet *v1beta1.StatefulSet) *compareStatefulsetResult {
+func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet) *compareStatefulsetResult {
 	reasons := make([]string, 0)
 	var match, needsRollUpdate, needsReplace bool
 
diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go
index 4074c61c653ae66035ecbe7e5e129dc4acdf659a..78d1283878544af6e48a764be608c3ad507172bf 100644
--- a/pkg/cluster/k8sres.go
+++ b/pkg/cluster/k8sres.go
@@ -7,7 +7,7 @@ import (
 
 	"github.com/sirupsen/logrus"
 
-	"k8s.io/api/apps/v1beta1"
+	appsv1 "k8s.io/api/apps/v1"
 	v1 "k8s.io/api/core/v1"
 	policybeta1 "k8s.io/api/policy/v1beta1"
 	"k8s.io/apimachinery/pkg/api/resource"
@@ -711,7 +711,7 @@ func makeResources(cpuRequest, memoryRequest, cpuLimit, memoryLimit string) acid
 	}
 }
 
-func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*v1beta1.StatefulSet, error) {
+func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.StatefulSet, error) {
 
 	var (
 		err                 error
@@ -917,25 +917,25 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*v1beta1.State
 	// the operator has domain-specific logic on how to do rolling updates of PG clusters
 	// so we do not use default rolling updates implemented by stateful sets
 	// that leaves the legacy "OnDelete" update strategy as the only option
-	updateStrategy := v1beta1.StatefulSetUpdateStrategy{Type: v1beta1.OnDeleteStatefulSetStrategyType}
+	updateStrategy := appsv1.StatefulSetUpdateStrategy{Type: appsv1.OnDeleteStatefulSetStrategyType}
 
-	var podManagementPolicy v1beta1.PodManagementPolicyType
+	var podManagementPolicy appsv1.PodManagementPolicyType
 	if c.OpConfig.PodManagementPolicy == "ordered_ready" {
-		podManagementPolicy = v1beta1.OrderedReadyPodManagement
+		podManagementPolicy = appsv1.OrderedReadyPodManagement
 	} else if c.OpConfig.PodManagementPolicy == "parallel" {
-		podManagementPolicy = v1beta1.ParallelPodManagement
+		podManagementPolicy = appsv1.ParallelPodManagement
 	} else {
 		return nil, fmt.Errorf("could not set the pod management policy to the unknown value: %v", c.OpConfig.PodManagementPolicy)
 	}
 
-	statefulSet := &v1beta1.StatefulSet{
+	statefulSet := &appsv1.StatefulSet{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:        c.statefulSetName(),
 			Namespace:   c.Namespace,
 			Labels:      c.labelsSet(true),
 			Annotations: map[string]string{rollingUpdateStatefulsetAnnotationKey: "false"},
 		},
-		Spec: v1beta1.StatefulSetSpec{
+		Spec: appsv1.StatefulSetSpec{
 			Replicas:             &numberOfInstances,
 			Selector:             c.labelsSelector(),
 			ServiceName:          c.serviceName(Master),
diff --git a/pkg/cluster/pod.go b/pkg/cluster/pod.go
index 8beb561ec1674d9802cc67d0bb2a018b61438c57..095f859f0c80c1aefab75d1aa19c3bb769e11254 100644
--- a/pkg/cluster/pod.go
+++ b/pkg/cluster/pod.go
@@ -4,12 +4,12 @@ import (
 	"fmt"
 	"math/rand"
 
+	appsv1 "k8s.io/api/apps/v1"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"github.com/zalando/postgres-operator/pkg/spec"
 	"github.com/zalando/postgres-operator/pkg/util"
-	"k8s.io/api/apps/v1beta1"
 )
 
 func (c *Cluster) listPods() ([]v1.Pod, error) {
@@ -205,7 +205,7 @@ func (c *Cluster) MigrateMasterPod(podName spec.NamespacedName) error {
 	}
 	// we must have a statefulset in the cluster for the migration to work
 	if c.Statefulset == nil {
-		var sset *v1beta1.StatefulSet
+		var sset *appsv1.StatefulSet
 		if sset, err = c.KubeClient.StatefulSets(c.Namespace).Get(c.statefulSetName(),
 			metav1.GetOptions{}); err != nil {
 			return fmt.Errorf("could not retrieve cluster statefulset: %v", err)
diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go
index c89edac63417d10d2f422fb39e6d6a0c6fb44d74..5d181ba1f920accf6cee2a818cc2fdc8a94e57be 100644
--- a/pkg/cluster/resources.go
+++ b/pkg/cluster/resources.go
@@ -5,7 +5,7 @@ import (
 	"strconv"
 	"strings"
 
-	"k8s.io/api/apps/v1beta1"
+	appsv1 "k8s.io/api/apps/v1"
 	batchv1beta1 "k8s.io/api/batch/v1beta1"
 	v1 "k8s.io/api/core/v1"
 	policybeta1 "k8s.io/api/policy/v1beta1"
@@ -64,7 +64,7 @@ func (c *Cluster) listResources() error {
 	return nil
 }
 
-func (c *Cluster) createStatefulSet() (*v1beta1.StatefulSet, error) {
+func (c *Cluster) createStatefulSet() (*appsv1.StatefulSet, error) {
 	c.setProcessName("creating statefulset")
 	statefulSetSpec, err := c.generateStatefulSet(&c.Spec)
 	if err != nil {
@@ -95,7 +95,7 @@ func getPodIndex(podName string) (int32, error) {
 	return int32(res), nil
 }
 
-func (c *Cluster) preScaleDown(newStatefulSet *v1beta1.StatefulSet) error {
+func (c *Cluster) preScaleDown(newStatefulSet *appsv1.StatefulSet) error {
 	masterPod, err := c.getRolePods(Master)
 	if err != nil {
 		return fmt.Errorf("could not get master pod: %v", err)
@@ -135,7 +135,7 @@ func (c *Cluster) preScaleDown(newStatefulSet *v1beta1.StatefulSet) error {
 
 // setRollingUpdateFlagForStatefulSet sets the indicator or the rolling update requirement
 // in the StatefulSet annotation.
-func (c *Cluster) setRollingUpdateFlagForStatefulSet(sset *v1beta1.StatefulSet, val bool) {
+func (c *Cluster) setRollingUpdateFlagForStatefulSet(sset *appsv1.StatefulSet, val bool) {
 	anno := sset.GetAnnotations()
 	if anno == nil {
 		anno = make(map[string]string)
@@ -160,7 +160,7 @@ func (c *Cluster) applyRollingUpdateFlagforStatefulSet(val bool) error {
 
 // getRollingUpdateFlagFromStatefulSet returns the value of the rollingUpdate flag from the passed
 // StatefulSet, reverting to the default value in case of errors
-func (c *Cluster) getRollingUpdateFlagFromStatefulSet(sset *v1beta1.StatefulSet, defaultValue bool) (flag bool) {
+func (c *Cluster) getRollingUpdateFlagFromStatefulSet(sset *appsv1.StatefulSet, defaultValue bool) (flag bool) {
 	anno := sset.GetAnnotations()
 	flag = defaultValue
 
@@ -181,7 +181,7 @@ func (c *Cluster) getRollingUpdateFlagFromStatefulSet(sset *v1beta1.StatefulSet,
 // mergeRollingUpdateFlagUsingCache returns the value of the rollingUpdate flag from the passed
 // statefulset, however, the value can be cleared if there is a cached flag in the cluster that
 // is set to false (the discrepancy could be a result of a failed StatefulSet update)
-func (c *Cluster) mergeRollingUpdateFlagUsingCache(runningStatefulSet *v1beta1.StatefulSet) bool {
+func (c *Cluster) mergeRollingUpdateFlagUsingCache(runningStatefulSet *appsv1.StatefulSet) bool {
 	var (
 		cachedStatefulsetExists, clearRollingUpdateFromCache, podsRollingUpdateRequired bool
 	)
@@ -207,7 +207,7 @@ func (c *Cluster) mergeRollingUpdateFlagUsingCache(runningStatefulSet *v1beta1.S
 	return podsRollingUpdateRequired
 }
 
-func (c *Cluster) updateStatefulSetAnnotations(annotations map[string]string) (*v1beta1.StatefulSet, error) {
+func (c *Cluster) updateStatefulSetAnnotations(annotations map[string]string) (*appsv1.StatefulSet, error) {
 	c.logger.Debugf("updating statefulset annotations")
 	patchData, err := metaAnnotationsPatch(annotations)
 	if err != nil {
@@ -223,7 +223,7 @@ func (c *Cluster) updateStatefulSetAnnotations(annotations map[string]string) (*
 	return result, nil
 
 }
-func (c *Cluster) updateStatefulSet(newStatefulSet *v1beta1.StatefulSet) error {
+func (c *Cluster) updateStatefulSet(newStatefulSet *appsv1.StatefulSet) error {
 	c.setProcessName("updating statefulset")
 	if c.Statefulset == nil {
 		return fmt.Errorf("there is no statefulset in the cluster")
@@ -264,7 +264,7 @@ func (c *Cluster) updateStatefulSet(newStatefulSet *v1beta1.StatefulSet) error {
 }
 
 // replaceStatefulSet deletes an old StatefulSet and creates the new using spec in the PostgreSQL CRD.
-func (c *Cluster) replaceStatefulSet(newStatefulSet *v1beta1.StatefulSet) error {
+func (c *Cluster) replaceStatefulSet(newStatefulSet *appsv1.StatefulSet) error {
 	c.setProcessName("replacing statefulset")
 	if c.Statefulset == nil {
 		return fmt.Errorf("there is no statefulset in the cluster")
@@ -676,7 +676,7 @@ func (c *Cluster) GetEndpointReplica() *v1.Endpoints {
 }
 
 // GetStatefulSet returns cluster's kubernetes StatefulSet
-func (c *Cluster) GetStatefulSet() *v1beta1.StatefulSet {
+func (c *Cluster) GetStatefulSet() *appsv1.StatefulSet {
 	return c.Statefulset
 }
 
diff --git a/pkg/cluster/types.go b/pkg/cluster/types.go
index 5fd5029dbb1feca09cc8ce01d254521007442328..afdc7376e95dacb797bbb510fe8f90f3cdc5c3fc 100644
--- a/pkg/cluster/types.go
+++ b/pkg/cluster/types.go
@@ -4,7 +4,7 @@ import (
 	"time"
 
 	acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
-	"k8s.io/api/apps/v1beta1"
+	appsv1 "k8s.io/api/apps/v1"
 	"k8s.io/api/core/v1"
 	policybeta1 "k8s.io/api/policy/v1beta1"
 	"k8s.io/apimachinery/pkg/types"
@@ -60,7 +60,7 @@ type ClusterStatus struct {
 	ReplicaService      *v1.Service
 	MasterEndpoint      *v1.Endpoints
 	ReplicaEndpoint     *v1.Endpoints
-	StatefulSet         *v1beta1.StatefulSet
+	StatefulSet         *appsv1.StatefulSet
 	PodDisruptionBudget *policybeta1.PodDisruptionBudget
 
 	CurrentProcess Process
diff --git a/pkg/cluster/util.go b/pkg/cluster/util.go
index e97cfdd1bba2218009e32b2f2c2e66d06b747b96..8c02fed2eda3000c3ae7954aeaa37338892db44a 100644
--- a/pkg/cluster/util.go
+++ b/pkg/cluster/util.go
@@ -11,7 +11,7 @@ import (
 	"strings"
 	"time"
 
-	"k8s.io/api/apps/v1beta1"
+	appsv1 "k8s.io/api/apps/v1"
 	v1 "k8s.io/api/core/v1"
 	policybeta1 "k8s.io/api/policy/v1beta1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -168,7 +168,7 @@ func (c *Cluster) logPDBChanges(old, new *policybeta1.PodDisruptionBudget, isUpd
 	c.logger.Debugf("diff\n%s\n", util.PrettyDiff(old.Spec, new.Spec))
 }
 
-func (c *Cluster) logStatefulSetChanges(old, new *v1beta1.StatefulSet, isUpdate bool, reasons []string) {
+func (c *Cluster) logStatefulSetChanges(old, new *appsv1.StatefulSet, isUpdate bool, reasons []string) {
 	if isUpdate {
 		c.logger.Infof("statefulset %q has been changed", util.NameFromMeta(old.ObjectMeta))
 	} else {
diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go
index 4f1edcb0f39a759e5f68626d224f4af4fd52db9d..118d1df535a63fb29f4f3f9a1f69d10dd1d4f22e 100644
--- a/pkg/util/k8sutil/k8sutil.go
+++ b/pkg/util/k8sutil/k8sutil.go
@@ -16,8 +16,8 @@ import (
 	apiextbeta1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/client-go/kubernetes"
-	"k8s.io/client-go/kubernetes/typed/apps/v1beta1"
-	v1core "k8s.io/client-go/kubernetes/typed/core/v1"
+	appsv1 "k8s.io/client-go/kubernetes/typed/apps/v1"
+	corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
 	policyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1"
 	rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1"
 	"k8s.io/client-go/rest"
@@ -29,17 +29,17 @@ import (
 
 // KubernetesClient describes getters for Kubernetes objects
 type KubernetesClient struct {
-	v1core.SecretsGetter
-	v1core.ServicesGetter
-	v1core.EndpointsGetter
-	v1core.PodsGetter
-	v1core.PersistentVolumesGetter
-	v1core.PersistentVolumeClaimsGetter
-	v1core.ConfigMapsGetter
-	v1core.NodesGetter
-	v1core.NamespacesGetter
-	v1core.ServiceAccountsGetter
-	v1beta1.StatefulSetsGetter
+	corev1.SecretsGetter
+	corev1.ServicesGetter
+	corev1.EndpointsGetter
+	corev1.PodsGetter
+	corev1.PersistentVolumesGetter
+	corev1.PersistentVolumeClaimsGetter
+	corev1.ConfigMapsGetter
+	corev1.NodesGetter
+	corev1.NamespacesGetter
+	corev1.ServiceAccountsGetter
+	appsv1.StatefulSetsGetter
 	rbacv1beta1.RoleBindingsGetter
 	policyv1beta1.PodDisruptionBudgetsGetter
 	apiextbeta1.CustomResourceDefinitionsGetter
@@ -50,14 +50,14 @@ type KubernetesClient struct {
 }
 
 type mockSecret struct {
-	v1core.SecretInterface
+	corev1.SecretInterface
 }
 
 type MockSecretGetter struct {
 }
 
 type mockConfigMap struct {
-	v1core.ConfigMapInterface
+	corev1.ConfigMapInterface
 }
 
 type MockConfigMapsGetter struct {
@@ -101,7 +101,7 @@ func NewFromConfig(cfg *rest.Config) (KubernetesClient, error) {
 	kubeClient.PersistentVolumesGetter = client.CoreV1()
 	kubeClient.NodesGetter = client.CoreV1()
 	kubeClient.NamespacesGetter = client.CoreV1()
-	kubeClient.StatefulSetsGetter = client.AppsV1beta1()
+	kubeClient.StatefulSetsGetter = client.AppsV1()
 	kubeClient.PodDisruptionBudgetsGetter = client.PolicyV1beta1()
 	kubeClient.RESTClient = client.CoreV1().RESTClient()
 	kubeClient.RoleBindingsGetter = client.RbacV1beta1()
@@ -215,12 +215,12 @@ func (c *mockConfigMap) Get(name string, options metav1.GetOptions) (*v1.ConfigM
 }
 
 // Secrets to be mocked
-func (c *MockSecretGetter) Secrets(namespace string) v1core.SecretInterface {
+func (c *MockSecretGetter) Secrets(namespace string) corev1.SecretInterface {
 	return &mockSecret{}
 }
 
 // ConfigMaps to be mocked
-func (c *MockConfigMapsGetter) ConfigMaps(namespace string) v1core.ConfigMapInterface {
+func (c *MockConfigMapsGetter) ConfigMaps(namespace string) corev1.ConfigMapInterface {
 	return &mockConfigMap{}
 }
 
diff --git a/ui/operator_ui/spiloutils.py b/ui/operator_ui/spiloutils.py
index 5a7ad686833cf35c60cc1a8d79f3813c952aa363..7f080e3c9503a049ec41b0c685cfb16ecbcdce81 100644
--- a/ui/operator_ui/spiloutils.py
+++ b/ui/operator_ui/spiloutils.py
@@ -82,7 +82,7 @@ def request_delete(cluster, path, **kwargs):
 def resource_api_version(resource_type):
     return {
         'postgresqls': 'apis/acid.zalan.do/v1',
-        'statefulsets': 'apis/apps/v1beta1',
+        'statefulsets': 'apis/apps/v1',
     }.get(resource_type, 'api/v1')