diff --git a/.env b/.env
new file mode 100644
index 0000000000000000000000000000000000000000..5f05c20dcb1ef7cfe8b5608c79155037504c520f
--- /dev/null
+++ b/.env
@@ -0,0 +1,3 @@
+ca_cert=LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3akNDQWFxZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFTTVJBd0RnWURWUVFERXdkcmRXSmwKTFdOaE1CNFhEVEU0TURjd05ERXhNRGcxTjFvWERUSTRNRGN3TVRFeE1EZzFOMW93RWpFUU1BNEdBMVVFQXhNSAphM1ZpWlMxallUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtCeHVxRmhGcmgrCmwxZ21sbU5DaVh5c21LYkFReDFMSFU2KzJnV01EQ3hnQmlNV3JFM3ZGYWdENkdxUFQ0SHlnanF5MUZBM0FzYkMKQkRCQnA3dkd1YmdKOUdpcERSdjNsNUxyQjg2YU14VFhGUGNIZlVtMTZGdXJrRXJyNDBsZzB1eVdrNUFPbjJHYgpUaTFPSE9vc1RJZ2dSbno0R0d5cWJXRXRiczJOd3ZQREV4d0dhQzk4UENIdTZjcVNjVnlhRnQvTmhMY1dTd0pMClcwVU52VnpEREdXaDAwT2NPVGhlRVF2aVlqdEU2TCt6Sk9IMGkwRk44RDR4RHpLZXRGdVBZU040Ym9ERFAzZnIKMHBabXVPbHo5VWZTZEtNaFl3aUxNYkYwMjduTDVJSWZFeS92cGhubDJleEtYN2ZtR1BMY1dVRFZoZ3VKcXNudQo2Tmt0ZytSa2xtc0NBd0VBQWFNak1DRXdEZ1lEVlIwUEFRSC9CQVFEQWdLa01BOEdBMVVkRXdFQi93UUZNQU1CCkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQ0lEeDZEZWlRQUwvUmZLdldtTTdIOTEzc1ZTU0NzL3hDem4KKy9iQVphbGJFd0NjUGR4cWJGaHduOVN0THFZdlpyaktldnZRSkkwMkdtdld5WkRKY0tKYU9GQktPRlFkZjVPRwpzNHhCcTQwblJjY0RJaDhweFZWM2JQZlBLL3g2ODRYM2VQaGM5b0YyemNXaVp4ZUttR2lMZ01pbStIUnBZZmc2CitVSVJZZ1p3YS9nTkc1aHdlNjA0Rm5pUVdoZXpRNVRsdFozTkVzcUFHcVpFK3BnVW5tM0NPeEpiNGk2Rk1BRjUKcEE0bU5zdm00alV1L0lObHg4MENicXAyckprV1Q3ZVpqTFFwNUlXaXpVaG85M2V0ZjFUR0krelhHUGxmTzZzVApXa1kvN0prOWdHUVVaNHQ2RFBsT1A1K0J3UWt3NVFUWEJHVGJwRXF6NlM3TXFBVTRiSWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
+token=ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklpSjkuZXlKcGMzTWlPaUpyZFdKbGNtNWxkR1Z6TDNObGNuWnBZMlZoWTJOdmRXNTBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5dVlXMWxjM0JoWTJVaU9pSjBaWE4wSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXpaV055WlhRdWJtRnRaU0k2SW5SbGMzUXRkRzlyWlc0dE5UaG1Obm9pTENKcmRXSmxjbTVsZEdWekxtbHZMM05sY25acFkyVmhZMk52ZFc1MEwzTmxjblpwWTJVdFlXTmpiM1Z1ZEM1dVlXMWxJam9pZEdWemRDSXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNkltVTNNalpsTldRMkxUbGhabVV0TVRGbE9DMDVOalV3TFRBd1l6QmtaREZoWldKa01DSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHAwWlhOME9uUmxjM1FpZlEuc0ktamlpeEZiT2NsY0FMUDZkaEhVX2dqTG94SFRxaGJFclRnSGRRUVpFMnplRmlIdVREdFVTcnFNMUM2VDY3N2JrTjJqU3BiTTc0WkNabjVYMXhrZFhtZzR4OExVTWVIWHJvdGZxZ1lldXRWODhTZ19fMmZ1V0RnWEhfTENpMW9pR0FjR2tGSWtvU0FwYy1mRDF1MXZkenI4YkpnWFhIUGQxakpVMnZ2TFdrZmZHUEs4aDMzcWVWMlN1b1ZldWZqWVh6ZHpza3hlcTVxMlVzeTFGaWlxV0F6SHJyNXV2SHAtWTl4T3VPREs3SXhmSlRLOFQ5aDgzWXMzQXNLX3hFbUFFSHItZkVkTlFPbEl6Zng0NHZfc2xCZ2Z3RWZNTU92UUFVUmoxeTVJTjA3RHZiZWJEcWJjZkg4dS1TdGFLQVNaRG5zY3kzVlhua3AwcW5kWE9FTGFn
+docker_config=foobar
\ No newline at end of file
diff --git a/Changelog.md b/Changelog.md
index dd7c8e72942b290311a3d3350029053dd67e32c2..e4cdee8cb531b18f2afcebcfa73bb12ff8a4bb17 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,4 +1,10 @@
 # Changelog
 
+## [1.1.0] - 2018-08-08
+### Added
+* `undeploy` command
+
 ## 1.0.0 - 2018-08-06
 * initial release
+
+[1.1.0]: https://git.sc.uni-leipzig.de/ubl/bdd_dev/webmasterei/deployer/compare/release%2F1.0.0...release%2F1.1.0
diff --git a/Readme.md b/Readme.md
index 272239557a766518fe49df85a94823afd9d00193..5290a96cdeb938b6d30f8e0f431fa1854623237a 100644
--- a/Readme.md
+++ b/Readme.md
@@ -53,6 +53,21 @@ Depending on existing deployment with the same name either an installation or an
 
 Upgrades always recreate the pods. If the image is pulled depends on `imagePullPolicy` of the container specs.
 
+## deployer undeploy
+
+This command undeploys a deployment from a kubernetes cluster. The credentials are provided by the cluster-admin as well as the namespace and the service-account.
+
+```
+$ deployer undeploy \
+	--namespace example_namespace \
+	--cluster-url https://k8s-cluster.example.com:6443 \
+	--certificate-authority "$base64_encoded_cacert" \
+	--token "$base64_encoded_bearer_token" \
+	--name example-staging \
+	--service-account tiller-service-account
+```
+*undeploys deployment named *example-staging* from  namespace *example_namespace**
+
 # Advanced Configuration
 
 ## docker build
@@ -74,6 +89,16 @@ Upgrades always recreate the pods. If the image is pulled depends on `imagePullP
 * `--token`: sets the bearer token of the service-account as bas64-encoded string. This string is provided by the k8s-admin.
 * `--namespace`: sets the k8s-namespace where the deployment is located. This string is provided by the k8s-admin.
 * `--service-account`: this is the name of the service-account, that is used to perform the deployment. This string is provided by the k8s-admin
+* `--name`: sets the name of the deployment.
 * `--charts`: sets the path where the helm-charts reside.
 * `--set`: overrides the values from `Values.yaml` in the helm-charts. Provide multiple `--set`-options if you want to provide multiple overrides.
 * `--set-string`: overrides the values from `Values.yaml` in the helm-charts as string. Provide multiple `--set-string`-options if you want to provide multiple overrides.
+
+## docker undeploy
+
+* `--cluster-url`: sets the url to the kube-apiserver. This URL is provided by the k8s-admin.
+* `--certificate-authority`: sets the certificate-authority certificate as base64-encoded string. This string is provided by the k8s-admin
+* `--token`: sets the bearer token of the service-account as bas64-encoded string. This string is provided by the k8s-admin.
+* `--namespace`: sets the k8s-namespace where the deployment is located. This string is provided by the k8s-admin.
+* `--service-account`: this is the name of the service-account, that is used to perform the deployment. This string is provided by the k8s-admin
+* `--name`: sets the name of the deployment.
diff --git a/assets/deployer b/assets/deployer
index 3719c16d32a6e18c2e0fe36a05ef3caca860794a..170343f2c3322161561af6bd85c351151d02ce2c 100755
--- a/assets/deployer
+++ b/assets/deployer
@@ -3,7 +3,6 @@
 set -o pipefail -o noclobber -o nounset
 
 ## declare used variables
-cmd=""
 image_name="image"
 cluster_name="cluster"
 context="context"
@@ -29,7 +28,7 @@ if [[ ${PIPESTATUS[0]} -ne 4 ]]; then
     exit 1
 fi
 
-OPTIONS=d:,t:,b:,c:,n:,s:
+OPTIONS=
 LONGOPTS=docker-config:,tag:,build-arg:,set:,set-string:,charts:,name:,token:,certificate-authority:,namespace:,cluster-url:,service-account:,output:,input:
 
 # -use ! and PIPESTATUS to get exit code with errexit set
@@ -218,8 +217,8 @@ prepare_helm() {
 	return 0
 }
 
-prepare_helm_command() {
-	echo -ne "Preparing helm command..."
+helm_deploy() {
+	echo -ne "Deploying ${name}..."
 
 	if [ "${name}" == "" ];then
 		echo "failed"
@@ -233,7 +232,19 @@ prepare_helm_command() {
 		return 1
 	fi
 
-	cmd="helm upgrade --install --wait --tiller-namespace=${namespace} --namespace=${namespace}"
+	local out
+	local cmd
+
+	if [ "$(helm ls --tiller-namespace=${namespace} --namespace=${namespace} --pending --deleted --failed --short | grep ${name})" != "" ];then
+		out=`helm delete --tiller-namespace=${namespace} --purge ${name} 2>&1`
+		if [ "$?" != "0" ];then
+			echo "failed"
+			echo "$out"
+			return 1
+		fi
+	fi
+
+	cmd="helm upgrade --install --wait --timeout=60 --tiller-namespace=${namespace} --namespace=${namespace}"
 
 	for set in ${sets};do
 		cmd="$cmd --set ${set}"
@@ -245,24 +256,6 @@ prepare_helm_command() {
 
 	cmd="$cmd ${name} ${charts}"
 
-	echo "done"
-	return 0
-}
-
-helm_deploy() {
-	echo -ne "Deploying ${name}..."
-	local out=""
-
-	# todo: do we need this when we do a "helm upgrade --install" ?
-	# if [ "$(helm ls --tiller-namespace=${namespace} --namespace=${namespace} --deleted --failed --short | grep ${name})" != "" ];then
-	# 	out=`helm delete --tiller-namespace=${namespace} --purge ${name} 2>&1`
-	# 	if [ "$?" != "0" ];then
-	# 		echo "failed"
-	# 		echo "$out"
-	# 		return 1
-	# 	fi
-	# fi
-
 	out=`$cmd 2>&1`
 	if [ "$?" != "0" ];then
 		echo "failed"
@@ -273,23 +266,26 @@ helm_deploy() {
 	echo "done"
 }
 
-test_helm_deploy() {
-	echo -ne "Waiting for successful deploy..."
+helm_undeploy() {
+	echo -ne "Undeploying ${name}..."
 
-	counter=0
-	while [ "$(helm ls --tiller-namespace=${namespace} --namespace=${namespace} | grep ${name} | awk -F"\t" '{ print $4; }')" != "DEPLOYED" ]; do
-		sleep 1
-		if [ $counter -eq 60 ];then
-			break
-		fi
-		counter=$[$counter+1]
-	done
-	if [ $counter -eq 60 ];then
+	if [ "${name}" == "" ];then
+		echo "failed"
+		echo "no deploy name specified"
+		return 1
+	fi
+
+	local out
+
+	out=`helm delete --tiller-namespace=${namespace} ${name} 2>&1`
+
+	if [ "$?" != "0" ];then
 		echo "failed"
+		echo "$out"
 		return 1
 	fi
+
 	echo "done"
-	return 0
 }
 
 prepare_image_publisher() {
@@ -309,17 +305,6 @@ prepare_image_publisher() {
 	return 0
 }
 
-prepare_image_builder() {
-	cmd="docker build --pull"
-	for arg in $buildargs;do
-		echo "adding $arg to build command"
-		cmd="$cmd --build-arg $arg --build-arg ${arg,,}"
-	done
-
-	cmd="$cmd -t ${image_name} ."
-	return 0
-}
-
 save_image() {
 	local out
 	echo -ne "saving image ..."
@@ -341,8 +326,17 @@ save_image() {
 }
 
 build_image() {
-	local out
 	echo -ne "building image..."
+
+	local out
+	local cmd="docker build --pull"
+
+	for arg in $buildargs;do
+		echo "adding $arg to build command"
+		cmd="$cmd --build-arg $arg --build-arg ${arg,,}"
+	done
+
+	cmd="$cmd -t ${image_name} ."
 	out=`$cmd 2>&1`
 	if [ "$?" != "0" ];then
 		echo "failed"
@@ -424,13 +418,16 @@ fi
 
 case $1 in
 	build)
-		prepare_image_builder && build_image && save_image
+		build_image && save_image
 		;;
 	publish)
 		prepare_image_publisher && import_image && publish_image
 		;;
 	deploy)
-		prepare_kubectl && prepare_helm && prepare_helm_command && helm_deploy && test_helm_deploy
+		prepare_kubectl && prepare_helm && helm_deploy
+		;;
+	undeploy)
+		prepare_kubectl && prepare_helm && helm_undeploy
 		;;
 	help)
 		echo "help"
diff --git a/docker-compose.yml b/docker-compose.yml
index 3a38a1706591196012945ac6735dd0d41c137375..c38fbc1ae9781c2b94f301637e7300278196c593 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,6 +1,6 @@
 version: '2'
 services:
-  deployer:
+  build:
     build: .
     volumes:
       - ./:/app
@@ -9,6 +9,40 @@ services:
       - docker
     environment:
       DOCKER_HOST: tcp://docker:2375
+    command: deployer build --output .tmp/image.tar.gz
+
+  publish:
+    build: .
+    volumes:
+      - ./:/app
+      - ./assets/deployer:/usr/local/bin/deployer
+    depends_on:
+      - docker
+    environment:
+      DOCKER_HOST: tcp://docker:2375
+    command: deployer publish --input .tmp/image.tar.gz --docker-config "${docker_config}" --name exampleimage --tag latest --tag "1.0"
+
+  deploy:
+    build: .
+    volumes:
+      - ./:/app
+      - ./assets/deployer:/usr/local/bin/deployer
+    depends_on:
+      - docker
+    environment:
+      DOCKER_HOST: tcp://docker:2375
+    command: deployer deploy --namespace test --cluster-url https://172.18.85.125:6443 --certificate-authority ${ca_cert} --token ${token} --name testdeploy --charts ./examplechart --service-account test --set image.tag=stable
+
+  undeploy:
+    build: .
+    volumes:
+      - ./:/app
+      - ./assets/deployer:/usr/local/bin/deployer
+    depends_on:
+      - docker
+    environment:
+      DOCKER_HOST: tcp://docker:2375
+    command: deployer undeploy --namespace test --cluster-url https://172.18.85.125:6443 --certificate-authority ${ca_cert} --token ${token} --name testdeploy --service-account test
 
   docker:
     image: docker:dind
diff --git a/docs/workflow.wsd b/docs/workflow.wsd
index 768b4683981edf83e8a05810a84402e0fec1ee31..35206e9ff3880673f727b250f6e7e975ffd2a117 100644
--- a/docs/workflow.wsd
+++ b/docs/workflow.wsd
@@ -1,5 +1,4 @@
-@startuml
-'include
+@startuml "Deploy Alpha"
 "Developer" as dev -> "Gitlab" as gitlab: commit:1-issue
 gitlab -> "CI-Runner" as runner: build image
 runner->runner: docker build
diff --git a/examplechart/.helmignore b/examplechart/.helmignore
new file mode 100644
index 0000000000000000000000000000000000000000..f0c13194444163d1cba5c67d9e79231a62bc8f44
--- /dev/null
+++ b/examplechart/.helmignore
@@ -0,0 +1,21 @@
+# 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
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/examplechart/Chart.yaml b/examplechart/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e8759ca90f428776b894b84b71e4dd3588a990d6
--- /dev/null
+++ b/examplechart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: examplechart
+version: 0.1.0
diff --git a/examplechart/templates/NOTES.txt b/examplechart/templates/NOTES.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5c73645cadefebedd846feba29d4555b0f072bc3
--- /dev/null
+++ b/examplechart/templates/NOTES.txt
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "examplechart.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ template "examplechart.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "examplechart.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "examplechart.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/examplechart/templates/_helpers.tpl b/examplechart/templates/_helpers.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..7f8669a026054394c2711bd6cf3d358020110ea5
--- /dev/null
+++ b/examplechart/templates/_helpers.tpl
@@ -0,0 +1,32 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "examplechart.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 "examplechart.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 "examplechart.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
diff --git a/examplechart/templates/deployment.yaml b/examplechart/templates/deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f38912f6319150ab1d47e7687984a43e373f2a17
--- /dev/null
+++ b/examplechart/templates/deployment.yaml
@@ -0,0 +1,51 @@
+apiVersion: apps/v1beta2
+kind: Deployment
+metadata:
+  name: {{ template "examplechart.fullname" . }}
+  labels:
+    app: {{ template "examplechart.name" . }}
+    chart: {{ template "examplechart.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+      app: {{ template "examplechart.name" . }}
+      release: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ template "examplechart.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          ports:
+            - name: http
+              containerPort: 80
+              protocol: TCP
+          livenessProbe:
+            httpGet:
+              path: /
+              port: http
+          readinessProbe:
+            httpGet:
+              path: /
+              port: http
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+    {{- with .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml . | indent 8 }}
+    {{- end }}
+    {{- with .Values.affinity }}
+      affinity:
+{{ toYaml . | indent 8 }}
+    {{- end }}
+    {{- with .Values.tolerations }}
+      tolerations:
+{{ toYaml . | indent 8 }}
+    {{- end }}
diff --git a/examplechart/templates/ingress.yaml b/examplechart/templates/ingress.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..99fbe934a0ea3b795134c022ceef3f0559890b46
--- /dev/null
+++ b/examplechart/templates/ingress.yaml
@@ -0,0 +1,38 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "examplechart.fullname" . -}}
+{{- $ingressPath := .Values.ingress.path -}}
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+    app: {{ template "examplechart.name" . }}
+    chart: {{ template "examplechart.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+{{- with .Values.ingress.annotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+{{- if .Values.ingress.tls }}
+  tls:
+  {{- range .Values.ingress.tls }}
+    - hosts:
+      {{- range .hosts }}
+        - {{ . }}
+      {{- end }}
+      secretName: {{ .secretName }}
+  {{- end }}
+{{- end }}
+  rules:
+  {{- range .Values.ingress.hosts }}
+    - host: {{ . }}
+      http:
+        paths:
+          - path: {{ $ingressPath }}
+            backend:
+              serviceName: {{ $fullName }}
+              servicePort: http
+  {{- end }}
+{{- end }}
diff --git a/examplechart/templates/service.yaml b/examplechart/templates/service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..dab8fc9e123b191289d597a8211aac2fef04676d
--- /dev/null
+++ b/examplechart/templates/service.yaml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "examplechart.fullname" . }}
+  labels:
+    app: {{ template "examplechart.name" . }}
+    chart: {{ template "examplechart.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: http
+      protocol: TCP
+      name: http
+  selector:
+    app: {{ template "examplechart.name" . }}
+    release: {{ .Release.Name }}
diff --git a/examplechart/values.yaml b/examplechart/values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..79e237f82df2c6450d7a5856736f221c0dfd3298
--- /dev/null
+++ b/examplechart/values.yaml
@@ -0,0 +1,45 @@
+# Default values for examplechart.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+image:
+  repository: nginx
+  tag: stable
+  pullPolicy: IfNotPresent
+
+service:
+  type: ClusterIP
+  port: 80
+
+ingress:
+  enabled: false
+  annotations: {}
+    # kubernetes.io/ingress.class: nginx
+    # kubernetes.io/tls-acme: "true"
+  path: /
+  hosts:
+    - chart-example.local
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  # limits:
+  #  cpu: 100m
+  #  memory: 128Mi
+  # requests:
+  #  cpu: 100m
+  #  memory: 128Mi
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}