diff --git a/Documentation/user-guides/cluster-monitoring.md b/Documentation/user-guides/cluster-monitoring.md
index 956be4fed..fac70ce45 100644
--- a/Documentation/user-guides/cluster-monitoring.md
+++ b/Documentation/user-guides/cluster-monitoring.md
@@ -30,9 +30,9 @@ The manifests used here use the [Prometheus Operator](https://github.com/coreos/
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: prometheus-operator
   labels:
     k8s-app: prometheus-operator
+  name: prometheus-operator
 spec:
   replicas: 1
   template:
@@ -40,23 +40,23 @@ spec:
       labels:
         k8s-app: prometheus-operator
     spec:
-      serviceAccountName: prometheus-operator
       containers:
-      - name: prometheus-operator
+      - args:
+        - --kubelet-service=kube-system/kubelet
+        - --config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1
         image: quay.io/coreos/prometheus-operator:v0.11.0
-        args:
-        - "--kubelet-service=kube-system/kubelet"
-        - "--config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1"
+        name: prometheus-operator
         ports:
-        - name: http
-          containerPort: 8080
+        - containerPort: 8080
+          name: http
         resources:
+          limits:
+            cpu: 200m
+            memory: 100Mi
           requests:
             cpu: 100m
             memory: 50Mi
-          limits:
-            cpu: 200m
-            memory: 300Mi
+      serviceAccountName: prometheus-operator
 ```
 
 > Make sure that the `ServiceAccount` called `prometheus-operator` exists and if using RBAC, is bound to the correct role. Read more on [RBAC when using the Prometheus Operator](../rbac.md).
diff --git a/Documentation/user-guides/getting-started.md b/Documentation/user-guides/getting-started.md
index 51abead86..5bc742ae7 100644
--- a/Documentation/user-guides/getting-started.md
+++ b/Documentation/user-guides/getting-started.md
@@ -72,27 +72,33 @@ metadata:
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: prometheus-operator
   labels:
-    operator: prometheus
+    k8s-app: prometheus-operator
+  name: prometheus-operator
 spec:
   replicas: 1
   template:
     metadata:
       labels:
-        operator: prometheus
+        k8s-app: prometheus-operator
     spec:
-      serviceAccountName: prometheus-operator
       containers:
-      - name: prometheus-operator
+      - args:
+        - --kubelet-service=kube-system/kubelet
+        - --config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1
         image: quay.io/coreos/prometheus-operator:v0.11.0
+        name: prometheus-operator
+        ports:
+        - containerPort: 8080
+          name: http
         resources:
-          requests:
-            cpu: 100m
-            memory: 50Mi
           limits:
             cpu: 200m
             memory: 100Mi
+          requests:
+            cpu: 100m
+            memory: 50Mi
+      serviceAccountName: prometheus-operator
 ```
 
 The Prometheus Operator introduces third party resources in Kubernetes to declare the desired state of a Prometheus and Alertmanager cluster as well as the Prometheus configuration. The resources it introduces are:
diff --git a/Makefile b/Makefile
index 18f0ad4e6..2490a9aa3 100644
--- a/Makefile
+++ b/Makefile
@@ -55,8 +55,18 @@ docs: embedmd apidocgen
 	$(GOPATH)/bin/embedmd -w `find Documentation -name "*.md"`
 	$(GOPATH)/bin/apidocgen pkg/client/monitoring/v1alpha1/types.go > Documentation/api.md
 
-generate:
-	hack/generate.sh
-	@$(MAKE) docs
+generate: jsonnet-docker
+	docker run --rm -v `pwd`:/go/src/github.com/coreos/prometheus-operator po-jsonnet make jsonnet generate-bundle docs
+
+generate-bundle:
+	hack/generate-bundle.sh
+
+jsonnet:
+	jsonnet -J /ksonnet-lib hack/generate/prometheus-operator.jsonnet | json2yaml > example/non-rbac/prometheus-operator.yaml
+	jsonnet -J /ksonnet-lib hack/generate/prometheus-operator-rbac.jsonnet | json2yaml > example/rbac/prometheus-operator/prometheus-operator.yaml
+	jsonnet -J /ksonnet-lib hack/generate/prometheus-operator-rbac.jsonnet | json2yaml > contrib/kube-prometheus/manifests/prometheus-operator/prometheus-operator.yaml
+
+jsonnet-docker:
+	docker build -f scripts/jenkins/jsonnet/Dockerfile -t po-jsonnet .
 
 .PHONY: all build crossbuild test format check-license container e2e-test e2e-status e2e clean-e2e embedmd apidocgen docs
diff --git a/bundle.yaml b/bundle.yaml
index 80d931531..bcc2adbb6 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -62,24 +62,30 @@ metadata:
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: prometheus-operator
   labels:
-    operator: prometheus
+    k8s-app: prometheus-operator
+  name: prometheus-operator
 spec:
   replicas: 1
   template:
     metadata:
       labels:
-        operator: prometheus
+        k8s-app: prometheus-operator
     spec:
-      serviceAccountName: prometheus-operator
       containers:
-      - name: prometheus-operator
+      - args:
+        - --kubelet-service=kube-system/kubelet
+        - --config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1
         image: quay.io/coreos/prometheus-operator:v0.11.0
+        name: prometheus-operator
+        ports:
+        - containerPort: 8080
+          name: http
         resources:
-          requests:
-            cpu: 100m
-            memory: 50Mi
           limits:
             cpu: 200m
             memory: 100Mi
+          requests:
+            cpu: 100m
+            memory: 50Mi
+      serviceAccountName: prometheus-operator
diff --git a/contrib/kube-prometheus/manifests/prometheus-operator/prometheus-operator.yaml b/contrib/kube-prometheus/manifests/prometheus-operator/prometheus-operator.yaml
index 64635192e..b2c37fd1f 100644
--- a/contrib/kube-prometheus/manifests/prometheus-operator/prometheus-operator.yaml
+++ b/contrib/kube-prometheus/manifests/prometheus-operator/prometheus-operator.yaml
@@ -1,9 +1,9 @@
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: prometheus-operator
   labels:
     k8s-app: prometheus-operator
+  name: prometheus-operator
 spec:
   replicas: 1
   template:
@@ -11,20 +11,20 @@ spec:
       labels:
         k8s-app: prometheus-operator
     spec:
-      serviceAccountName: prometheus-operator
       containers:
-      - name: prometheus-operator
+      - args:
+        - --kubelet-service=kube-system/kubelet
+        - --config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1
         image: quay.io/coreos/prometheus-operator:v0.11.0
-        args:
-        - "--kubelet-service=kube-system/kubelet"
-        - "--config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1"
+        name: prometheus-operator
         ports:
-        - name: http
-          containerPort: 8080
+        - containerPort: 8080
+          name: http
         resources:
+          limits:
+            cpu: 200m
+            memory: 100Mi
           requests:
             cpu: 100m
             memory: 50Mi
-          limits:
-            cpu: 200m
-            memory: 300Mi
+      serviceAccountName: prometheus-operator
diff --git a/example/non-rbac/prometheus-operator.yaml b/example/non-rbac/prometheus-operator.yaml
index 388ba24d8..48c938d1b 100644
--- a/example/non-rbac/prometheus-operator.yaml
+++ b/example/non-rbac/prometheus-operator.yaml
@@ -1,23 +1,29 @@
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: prometheus-operator
   labels:
-    operator: prometheus
+    k8s-app: prometheus-operator
+  name: prometheus-operator
 spec:
   replicas: 1
   template:
     metadata:
       labels:
-        operator: prometheus
+        k8s-app: prometheus-operator
     spec:
       containers:
-      - name: prometheus-operator
+      - args:
+        - --kubelet-service=kube-system/kubelet
+        - --config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1
         image: quay.io/coreos/prometheus-operator:v0.11.0
+        name: prometheus-operator
+        ports:
+        - containerPort: 8080
+          name: http
         resources:
-          requests:
-            cpu: 100m
-            memory: 50Mi
           limits:
             cpu: 200m
             memory: 100Mi
+          requests:
+            cpu: 100m
+            memory: 50Mi
diff --git a/example/rbac/prometheus-operator/prometheus-operator.yaml b/example/rbac/prometheus-operator/prometheus-operator.yaml
index e06b3fce0..b2c37fd1f 100644
--- a/example/rbac/prometheus-operator/prometheus-operator.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator.yaml
@@ -1,24 +1,30 @@
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: prometheus-operator
   labels:
-    operator: prometheus
+    k8s-app: prometheus-operator
+  name: prometheus-operator
 spec:
   replicas: 1
   template:
     metadata:
       labels:
-        operator: prometheus
+        k8s-app: prometheus-operator
     spec:
-      serviceAccountName: prometheus-operator
       containers:
-      - name: prometheus-operator
+      - args:
+        - --kubelet-service=kube-system/kubelet
+        - --config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1
         image: quay.io/coreos/prometheus-operator:v0.11.0
+        name: prometheus-operator
+        ports:
+        - containerPort: 8080
+          name: http
         resources:
-          requests:
-            cpu: 100m
-            memory: 50Mi
           limits:
             cpu: 200m
             memory: 100Mi
+          requests:
+            cpu: 100m
+            memory: 50Mi
+      serviceAccountName: prometheus-operator
diff --git a/hack/generate.sh b/hack/generate-bundle.sh
similarity index 100%
rename from hack/generate.sh
rename to hack/generate-bundle.sh
diff --git a/hack/generate/prometheus-operator-rbac.jsonnet b/hack/generate/prometheus-operator-rbac.jsonnet
new file mode 100644
index 000000000..21de840e5
--- /dev/null
+++ b/hack/generate/prometheus-operator-rbac.jsonnet
@@ -0,0 +1,9 @@
+local k = import "ksonnet.beta.2/k.libsonnet";
+local deployment = k.extensions.v1beta1.deployment;
+
+local po = import "./prometheus-operator.jsonnet";
+
+local operatorDeployment = po +
+  deployment.mixin.spec.template.spec.serviceAccountName("prometheus-operator");
+
+operatorDeployment
diff --git a/hack/generate/prometheus-operator.jsonnet b/hack/generate/prometheus-operator.jsonnet
new file mode 100644
index 000000000..7c744711f
--- /dev/null
+++ b/hack/generate/prometheus-operator.jsonnet
@@ -0,0 +1,25 @@
+local k = import "ksonnet.beta.2/k.libsonnet";
+local rawVersion = importstr "../../VERSION";
+
+local removeLineBreaks = function(str) std.join("", std.filter(function(c) c != "\n", std.stringChars(str)));
+local version = removeLineBreaks(rawVersion);
+
+local deployment = k.extensions.v1beta1.deployment;
+local container = k.extensions.v1beta1.deployment.mixin.spec.template.spec.containersType;
+local containerPort = container.portsType;
+
+local targetPort = 8080;
+local podLabels = {"k8s-app": "prometheus-operator"};
+
+local operatorContainer =
+  container.new("prometheus-operator", "quay.io/coreos/prometheus-operator:v" + version) +
+  container.ports(containerPort.newNamed("http", targetPort)) +
+  container.args("--kubelet-service=kube-system/kubelet") +
+  container.args("--config-reloader-image=quay.io/coreos/configmap-reload:v0.0.1") +
+  container.mixin.resources.requests({cpu: "100m", memory: "50Mi"}) +
+  container.mixin.resources.limits({cpu: "200m", memory: "100Mi"});
+
+local operatorDeployment = deployment.new("prometheus-operator", 1, operatorContainer, podLabels) +
+  deployment.mixin.metadata.labels(podLabels);
+
+operatorDeployment
diff --git a/scripts/jenkins/check-make-generate.sh b/scripts/jenkins/check-make-generate.sh
index 3e4ba62c6..b4d2d644a 100755
--- a/scripts/jenkins/check-make-generate.sh
+++ b/scripts/jenkins/check-make-generate.sh
@@ -8,10 +8,6 @@ set -u
 # print each command before executing it
 set -x
 
-docker run \
-       --rm \
-       -v $PWD:/go/src/github.com/coreos/prometheus-operator \
-       -w /go/src/github.com/coreos/prometheus-operator/ \
-       golang make generate
+make generate
 
 git diff --exit-code
diff --git a/scripts/jenkins/jsonnet/Dockerfile b/scripts/jenkins/jsonnet/Dockerfile
new file mode 100644
index 000000000..ab9027388
--- /dev/null
+++ b/scripts/jenkins/jsonnet/Dockerfile
@@ -0,0 +1,11 @@
+FROM golang:1.8-stretch
+
+ADD https://github.com/google/jsonnet/archive/v0.9.4.tar.gz /tmp
+RUN apt-get update -y && apt-get install -y g++ make git python-pip
+RUN cd /tmp && tar xvfz v0.9.4.tar.gz && cd jsonnet-0.9.4 && make && mv jsonnet /usr/local/bin && cd / && rm -rf /tmp/jsonnet-0.9.4 /tmp/jsonnet-0.9.4.tar.gz
+
+RUN git clone https://github.com/ksonnet/ksonnet-lib.git /ksonnet-lib && cd /ksonnet-lib && git checkout bd6b2d618d6963ea6a81fcc5623900d8ba110a32
+
+RUN pip install json2yaml
+RUN mkdir -p /go/src/github.com/coreos/prometheus-operator
+WORKDIR /go/src/github.com/coreos/prometheus-operator