diff --git a/cmd/operator/main.go b/cmd/operator/main.go
index d3a232c11..14806b6d3 100644
--- a/cmd/operator/main.go
+++ b/cmd/operator/main.go
@@ -59,6 +59,7 @@ func init() {
 	flagset.StringVar(&cfg.Namespace, "namespace", kapi.NamespaceAll, "Namespace to scope the interaction of the Prometheus Operator and the apiserver.")
 	flagset.Var(&cfg.Labels, "labels", "Labels to be add to all resources created by the operator")
 	flagset.StringVar(&cfg.CrdGroup, "crd-apigroup", monitoringv1.Group, "prometheus CRD  API group name")
+	flagset.Var(&cfg.CrdKinds, "crd-kinds", " - EXPERIMENTAL (could be removed in future releases) - customize CRD kind names")
 	flagset.Parse(os.Args[1:])
 
 }
diff --git a/pkg/alertmanager/operator.go b/pkg/alertmanager/operator.go
index cab318e03..eb22bd214 100644
--- a/pkg/alertmanager/operator.go
+++ b/pkg/alertmanager/operator.go
@@ -69,6 +69,7 @@ type Config struct {
 	AlertmanagerDefaultBaseImage string
 	Namespace                    string
 	Labels                       prometheusoperator.Labels
+	CrdKinds                     monitoringv1.CrdKinds
 	CrdGroup                     string
 }
 
@@ -84,7 +85,7 @@ func New(c prometheusoperator.Config, logger log.Logger) (*Operator, error) {
 		return nil, errors.Wrap(err, "instantiating kubernetes client failed")
 	}
 
-	mclient, err := monitoring.NewForConfig(c.CrdGroup, cfg)
+	mclient, err := monitoring.NewForConfig(&c.CrdKinds, c.CrdGroup, cfg)
 	if err != nil {
 		return nil, errors.Wrap(err, "instantiating monitoring client failed")
 	}
@@ -106,6 +107,7 @@ func New(c prometheusoperator.Config, logger log.Logger) (*Operator, error) {
 			AlertmanagerDefaultBaseImage: c.AlertmanagerDefaultBaseImage,
 			Namespace:                    c.Namespace,
 			CrdGroup:                     c.CrdGroup,
+			CrdKinds:                     c.CrdKinds,
 			Labels:                       c.Labels,
 		},
 	}
@@ -524,7 +526,7 @@ func (c *Operator) createCRDs() error {
 	}
 
 	crds := []*extensionsobj.CustomResourceDefinition{
-		k8sutil.NewAlertmanagerCustomResourceDefinition(c.config.CrdGroup, c.config.Labels.LabelsMap),
+		k8sutil.NewAlertmanagerCustomResourceDefinition(c.config.CrdKinds.Alertmanager, c.config.CrdGroup, c.config.Labels.LabelsMap),
 	}
 
 	crdClient := c.crdclient.ApiextensionsV1beta1().CustomResourceDefinitions()
diff --git a/pkg/api/api.go b/pkg/api/api.go
index 14c10ae02..9ce674213 100644
--- a/pkg/api/api.go
+++ b/pkg/api/api.go
@@ -45,7 +45,7 @@ func New(conf prometheus.Config, l log.Logger) (*API, error) {
 		return nil, err
 	}
 
-	mclient, err := v1.NewForConfig(conf.CrdGroup, cfg)
+	mclient, err := v1.NewForConfig(&conf.CrdKinds, conf.CrdGroup, cfg)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/client/monitoring/clientset.go b/pkg/client/monitoring/clientset.go
index 091aa2821..98bf773d7 100644
--- a/pkg/client/monitoring/clientset.go
+++ b/pkg/client/monitoring/clientset.go
@@ -48,7 +48,7 @@ func (c *Clientset) MonitoringV1() v1.MonitoringV1Interface {
 	return c.MonitoringV1Client
 }
 
-func NewForConfig(apiGroup string, c *rest.Config) (*Clientset, error) {
+func NewForConfig(crdKinds *v1.CrdKinds, apiGroup string, c *rest.Config) (*Clientset, error) {
 	configShallowCopy := *c
 	if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
 		configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
@@ -61,7 +61,7 @@ func NewForConfig(apiGroup string, c *rest.Config) (*Clientset, error) {
 		return nil, err
 	}
 
-	cs.MonitoringV1Client, err = v1.NewForConfig(apiGroup, &configShallowCopy)
+	cs.MonitoringV1Client, err = v1.NewForConfig(crdKinds, apiGroup, &configShallowCopy)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/client/monitoring/v1/alertmanager.go b/pkg/client/monitoring/v1/alertmanager.go
index 08deb003d..16d4ae1e6 100644
--- a/pkg/client/monitoring/v1/alertmanager.go
+++ b/pkg/client/monitoring/v1/alertmanager.go
@@ -54,13 +54,13 @@ type alertmanagers struct {
 	ns         string
 }
 
-func newAlertmanagers(r rest.Interface, c *dynamic.Client, namespace string) *alertmanagers {
+func newAlertmanagers(r rest.Interface, c *dynamic.Client, crdKind CrdKind, namespace string) *alertmanagers {
 	return &alertmanagers{
 		r,
 		c.Resource(
 			&metav1.APIResource{
-				Kind:       AlertmanagersKind,
-				Name:       AlertmanagerName,
+				Kind:       crdKind.Kind,
+				Name:       crdKind.Plural,
 				Namespaced: true,
 			},
 			namespace,
diff --git a/pkg/client/monitoring/v1/client.go b/pkg/client/monitoring/v1/client.go
index 914efa1ba..8b48abc23 100644
--- a/pkg/client/monitoring/v1/client.go
+++ b/pkg/client/monitoring/v1/client.go
@@ -15,17 +15,75 @@
 package v1
 
 import (
+	"fmt"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/runtime/serializer"
 	"k8s.io/client-go/dynamic"
 	"k8s.io/client-go/pkg/api"
 	"k8s.io/client-go/rest"
+	"strings"
 )
 
 const (
-	Group = "monitoring.coreos.com"
+	Group                 = "monitoring.coreos.com"
+	PrometheusKindKey     = "prometheus"
+	AlertManagerKindKey   = "alermanager"
+	ServiceMonitorKindKey = "servicemonitor"
 )
 
+type CrdKind struct {
+	Kind   string
+	Plural string
+}
+
+type CrdKinds struct {
+	KindsString    string
+	Prometheus     CrdKind
+	Alertmanager   CrdKind
+	ServiceMonitor CrdKind
+}
+
+// Implement the flag.Value interface
+func (crdkinds *CrdKinds) String() string {
+	return crdkinds.KindsString
+}
+
+// Set Implement the flag.Set interface
+func (crdkinds *CrdKinds) Set(value string) error {
+	if value == "" {
+		value = fmt.Sprintf("%s=%s:%s,%s=%s:%s,%s=%s:%s",
+			PrometheusKindKey, PrometheusesKind, PrometheusName,
+			AlertManagerKindKey, AlertmanagersKind, AlertmanagerName,
+			ServiceMonitorKindKey, ServiceMonitorsKind, ServiceMonitorName)
+	}
+	splited := strings.Split(value, ",")
+	for _, pair := range splited {
+		sp := strings.Split(pair, "=")
+		kind := strings.Split(sp[1], ":")
+		crdKind := CrdKind{Plural: kind[1], Kind: kind[0]}
+		switch kindKey := sp[0]; kindKey {
+		case PrometheusKindKey:
+			(*crdkinds).Prometheus = crdKind
+		case ServiceMonitorKindKey:
+			(*crdkinds).ServiceMonitor = crdKind
+		case AlertManagerKindKey:
+			(*crdkinds).Alertmanager = crdKind
+		default:
+			fmt.Printf("Warning: unknown kind: %s... ignoring", kindKey)
+		}
+
+	}
+	(*crdkinds).KindsString = value
+	return nil
+}
+
+var DefaultCrdKinds CrdKinds = CrdKinds{
+	KindsString:    "",
+	Prometheus:     CrdKind{Plural: PrometheusName, Kind: PrometheusesKind},
+	ServiceMonitor: CrdKind{Plural: ServiceMonitorName, Kind: ServiceMonitorsKind},
+	Alertmanager:   CrdKind{Plural: AlertmanagerName, Kind: AlertmanagersKind},
+}
+
 var Version = "v1"
 
 type MonitoringV1Interface interface {
@@ -38,25 +96,26 @@ type MonitoringV1Interface interface {
 type MonitoringV1Client struct {
 	restClient    rest.Interface
 	dynamicClient *dynamic.Client
+	crdKinds      *CrdKinds
 }
 
 func (c *MonitoringV1Client) Prometheuses(namespace string) PrometheusInterface {
-	return newPrometheuses(c.restClient, c.dynamicClient, namespace)
+	return newPrometheuses(c.restClient, c.dynamicClient, c.crdKinds.Prometheus, namespace)
 }
 
 func (c *MonitoringV1Client) Alertmanagers(namespace string) AlertmanagerInterface {
-	return newAlertmanagers(c.restClient, c.dynamicClient, namespace)
+	return newAlertmanagers(c.restClient, c.dynamicClient, c.crdKinds.Alertmanager, namespace)
 }
 
 func (c *MonitoringV1Client) ServiceMonitors(namespace string) ServiceMonitorInterface {
-	return newServiceMonitors(c.restClient, c.dynamicClient, namespace)
+	return newServiceMonitors(c.restClient, c.dynamicClient, c.crdKinds.ServiceMonitor, namespace)
 }
 
 func (c *MonitoringV1Client) RESTClient() rest.Interface {
 	return c.restClient
 }
 
-func NewForConfig(apiGroup string, c *rest.Config) (*MonitoringV1Client, error) {
+func NewForConfig(crdKinds *CrdKinds, apiGroup string, c *rest.Config) (*MonitoringV1Client, error) {
 	config := *c
 	SetConfigDefaults(apiGroup, &config)
 	client, err := rest.RESTClientFor(&config)
@@ -69,7 +128,7 @@ func NewForConfig(apiGroup string, c *rest.Config) (*MonitoringV1Client, error)
 		return nil, err
 	}
 
-	return &MonitoringV1Client{client, dynamicClient}, nil
+	return &MonitoringV1Client{client, dynamicClient, crdKinds}, nil
 }
 
 func SetConfigDefaults(apiGroup string, config *rest.Config) {
diff --git a/pkg/client/monitoring/v1/prometheus.go b/pkg/client/monitoring/v1/prometheus.go
index bf0ff14c9..88b089eaf 100644
--- a/pkg/client/monitoring/v1/prometheus.go
+++ b/pkg/client/monitoring/v1/prometheus.go
@@ -54,13 +54,13 @@ type prometheuses struct {
 	ns         string
 }
 
-func newPrometheuses(r rest.Interface, c *dynamic.Client, namespace string) *prometheuses {
+func newPrometheuses(r rest.Interface, c *dynamic.Client, crdKind CrdKind, namespace string) *prometheuses {
 	return &prometheuses{
 		r,
 		c.Resource(
 			&metav1.APIResource{
-				Kind:       PrometheusesKind,
-				Name:       PrometheusName,
+				Kind:       crdKind.Kind,
+				Name:       crdKind.Plural,
 				Namespaced: true,
 			},
 			namespace,
diff --git a/pkg/client/monitoring/v1/servicemonitor.go b/pkg/client/monitoring/v1/servicemonitor.go
index 622aa668a..916c1b91c 100644
--- a/pkg/client/monitoring/v1/servicemonitor.go
+++ b/pkg/client/monitoring/v1/servicemonitor.go
@@ -54,13 +54,13 @@ type servicemonitors struct {
 	ns         string
 }
 
-func newServiceMonitors(r rest.Interface, c *dynamic.Client, namespace string) *servicemonitors {
+func newServiceMonitors(r rest.Interface, c *dynamic.Client, crdKind CrdKind, namespace string) *servicemonitors {
 	return &servicemonitors{
 		r,
 		c.Resource(
 			&metav1.APIResource{
-				Kind:       ServiceMonitorsKind,
-				Name:       ServiceMonitorName,
+				Kind:       crdKind.Kind,
+				Name:       crdKind.Plural,
 				Namespaced: true,
 			},
 			namespace,
diff --git a/pkg/k8sutil/k8sutil.go b/pkg/k8sutil/k8sutil.go
index 4db3f75b7..8f97fc7f1 100644
--- a/pkg/k8sutil/k8sutil.go
+++ b/pkg/k8sutil/k8sutil.go
@@ -205,10 +205,10 @@ func NewAlertmanagerTPRDefinition() *extensionsobjold.ThirdPartyResource {
 	}
 }
 
-func NewPrometheusCustomResourceDefinition(group string, labels map[string]string) *extensionsobj.CustomResourceDefinition {
+func NewPrometheusCustomResourceDefinition(crdkind monitoringv1.CrdKind, group string, labels map[string]string) *extensionsobj.CustomResourceDefinition {
 	return &extensionsobj.CustomResourceDefinition{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:   monitoringv1.PrometheusName + "." + group,
+			Name:   crdkind.Plural + "." + group,
 			Labels: labels,
 		},
 		Spec: extensionsobj.CustomResourceDefinitionSpec{
@@ -216,35 +216,36 @@ func NewPrometheusCustomResourceDefinition(group string, labels map[string]strin
 			Version: monitoringv1.Version,
 			Scope:   extensionsobj.NamespaceScoped,
 			Names: extensionsobj.CustomResourceDefinitionNames{
-				Plural: monitoringv1.PrometheusName,
-				Kind:   monitoringv1.PrometheusesKind,
+				Plural: crdkind.Plural,
+				Kind:   crdkind.Kind,
 			},
 		},
 	}
 }
 
-func NewServiceMonitorCustomResourceDefinition(group string, labels map[string]string) *extensionsobj.CustomResourceDefinition {
+func NewServiceMonitorCustomResourceDefinition(crdkind monitoringv1.CrdKind, group string, labels map[string]string) *extensionsobj.CustomResourceDefinition {
 	return &extensionsobj.CustomResourceDefinition{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:   monitoringv1.ServiceMonitorName + "." + group,
+			Name:   crdkind.Plural + "." + group,
 			Labels: labels,
 		},
+
 		Spec: extensionsobj.CustomResourceDefinitionSpec{
 			Group:   group,
 			Version: monitoringv1.Version,
 			Scope:   extensionsobj.NamespaceScoped,
 			Names: extensionsobj.CustomResourceDefinitionNames{
-				Plural: monitoringv1.ServiceMonitorName,
-				Kind:   monitoringv1.ServiceMonitorsKind,
+				Plural: crdkind.Plural,
+				Kind:   crdkind.Kind,
 			},
 		},
 	}
 }
 
-func NewAlertmanagerCustomResourceDefinition(group string, labels map[string]string) *extensionsobj.CustomResourceDefinition {
+func NewAlertmanagerCustomResourceDefinition(crdkind monitoringv1.CrdKind, group string, labels map[string]string) *extensionsobj.CustomResourceDefinition {
 	return &extensionsobj.CustomResourceDefinition{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:   monitoringv1.AlertmanagerName + "." + group,
+			Name:   crdkind.Plural + "." + group,
 			Labels: labels,
 		},
 		Spec: extensionsobj.CustomResourceDefinitionSpec{
@@ -252,8 +253,8 @@ func NewAlertmanagerCustomResourceDefinition(group string, labels map[string]str
 			Version: monitoringv1.Version,
 			Scope:   extensionsobj.NamespaceScoped,
 			Names: extensionsobj.CustomResourceDefinitionNames{
-				Plural: monitoringv1.AlertmanagerName,
-				Kind:   monitoringv1.AlertmanagersKind,
+				Plural: crdkind.Plural,
+				Kind:   crdkind.Kind,
 			},
 		},
 	}
diff --git a/pkg/migrator/migrator.go b/pkg/migrator/migrator.go
index f4c44bdea..8ed5bfec8 100644
--- a/pkg/migrator/migrator.go
+++ b/pkg/migrator/migrator.go
@@ -118,7 +118,7 @@ func NewMigrator(cfg *rest.Config, logger log.Logger) (*Migrator, error) {
 		return nil, errors.Wrap(err, "creating kubernetes client")
 	}
 
-	mclient, err := monitoring.NewForConfig(monitoringv1.Group, cfg)
+	mclient, err := monitoring.NewForConfig(&monitoringv1.DefaultCrdKinds, monitoringv1.Group, cfg)
 	if err != nil {
 		return nil, errors.Wrap(err, "creating monitoring client")
 	}
@@ -179,9 +179,15 @@ func (m *Migrator) migrateTPR2CRD() error {
 
 	m.logger.Log("msg", "Creating CRDs.")
 	err = m.createCRDs(
-		k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.Group, map[string]string{}),
-		k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.Group, map[string]string{}),
-		k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.Group, map[string]string{}),
+		k8sutil.NewPrometheusCustomResourceDefinition(
+			monitoringv1.DefaultCrdKinds.Prometheus,
+			monitoringv1.Group, map[string]string{}),
+		k8sutil.NewServiceMonitorCustomResourceDefinition(
+			monitoringv1.DefaultCrdKinds.ServiceMonitor,
+			monitoringv1.Group, map[string]string{}),
+		k8sutil.NewAlertmanagerCustomResourceDefinition(
+			monitoringv1.DefaultCrdKinds.Alertmanager,
+			monitoringv1.Group, map[string]string{}),
 	)
 	if err != nil {
 		return errors.Wrap(err, "creating CRDs failed")
@@ -507,9 +513,9 @@ func (m *Migrator) rollback() error {
 	if ms.crdCreated {
 		m.logger.Log("msg", "Deleting CRDs.")
 		err := m.deleteCRDs(
-			k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.Group, map[string]string{}),
-			k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.Group, map[string]string{}),
-			k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.Group, map[string]string{}),
+			k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Prometheus, monitoringv1.Group, map[string]string{}),
+			k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.DefaultCrdKinds.ServiceMonitor, monitoringv1.Group, map[string]string{}),
+			k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Alertmanager, monitoringv1.Group, map[string]string{}),
 		)
 		if err != nil {
 			return errors.Wrapf(err, "deleting the CRDs failed")
diff --git a/pkg/prometheus/operator.go b/pkg/prometheus/operator.go
index a4df872fc..e5e75820e 100644
--- a/pkg/prometheus/operator.go
+++ b/pkg/prometheus/operator.go
@@ -125,6 +125,7 @@ type Config struct {
 	Namespace                    string
 	Labels                       Labels
 	CrdGroup                     string
+	CrdKinds                     monitoringv1.CrdKinds
 }
 
 type BasicAuthCredentials struct {
@@ -143,7 +144,7 @@ func New(conf Config, logger log.Logger) (*Operator, error) {
 		return nil, err
 	}
 
-	mclient, err := monitoring.NewForConfig(conf.CrdGroup, cfg)
+	mclient, err := monitoring.NewForConfig(&conf.CrdKinds, conf.CrdGroup, cfg)
 	if err != nil {
 		return nil, err
 	}
@@ -1021,8 +1022,8 @@ func (c *Operator) createCRDs() error {
 	}
 
 	crds := []*extensionsobj.CustomResourceDefinition{
-		k8sutil.NewPrometheusCustomResourceDefinition(c.config.CrdGroup, c.config.Labels.LabelsMap),
-		k8sutil.NewServiceMonitorCustomResourceDefinition(c.config.CrdGroup, c.config.Labels.LabelsMap),
+		k8sutil.NewPrometheusCustomResourceDefinition(c.config.CrdKinds.Prometheus, c.config.CrdGroup, c.config.Labels.LabelsMap),
+		k8sutil.NewServiceMonitorCustomResourceDefinition(c.config.CrdKinds.ServiceMonitor, c.config.CrdGroup, c.config.Labels.LabelsMap),
 	}
 
 	crdClient := c.crdclient.ApiextensionsV1beta1().CustomResourceDefinitions()
diff --git a/test/framework/framework.go b/test/framework/framework.go
index 928d37aca..a864ad9ec 100644
--- a/test/framework/framework.go
+++ b/test/framework/framework.go
@@ -59,7 +59,7 @@ func New(ns, kubeconfig, opImage string) (*Framework, error) {
 		return nil, errors.Wrap(err, "creating http-client failed")
 	}
 
-	mclient, err := monitoringv1.NewForConfig(monitoringv1.Group, config)
+	mclient, err := monitoringv1.NewForConfig(&monitoringv1.DefaultCrdKinds, monitoringv1.Group, config)
 	if err != nil {
 		return nil, errors.Wrap(err, "creating monitoring client failed")
 	}
diff --git a/test/migration/migration_test.go b/test/migration/migration_test.go
index 58989ee6a..1aa4cac3f 100644
--- a/test/migration/migration_test.go
+++ b/test/migration/migration_test.go
@@ -238,7 +238,7 @@ func checkMigrationDone(ns2 string, framework *operatorFramework.Framework, tprC
 	}
 
 	// Check if CRDs are created.
-	_, err = crdClient.Get(k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{})
+	_, err = crdClient.Get(k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Prometheus, monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{})
 	if err != nil && apierrors.IsNotFound(err) {
 		fmt.Println("Expected Prometheus CRD definition to be created, but it does not exists.")
 		return false, nil
@@ -247,7 +247,7 @@ func checkMigrationDone(ns2 string, framework *operatorFramework.Framework, tprC
 		return false, err
 	}
 
-	_, err = crdClient.Get(k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{})
+	_, err = crdClient.Get(k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Alertmanager, monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{})
 	if err != nil && apierrors.IsNotFound(err) {
 		fmt.Println("Expected Alertmanager CRD definition to be created, but it does not exists.")
 		return false, nil
@@ -256,7 +256,7 @@ func checkMigrationDone(ns2 string, framework *operatorFramework.Framework, tprC
 		return false, err
 	}
 
-	_, err = crdClient.Get(k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{})
+	_, err = crdClient.Get(k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.DefaultCrdKinds.ServiceMonitor, monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{})
 	if err != nil && apierrors.IsNotFound(err) {
 		fmt.Println("Expected ServiceMonitor CRD definition to be created, but it does not exists.")
 		return false, nil