diff --git a/heat/templates/bin/_heat-purge-deleted-active.sh.tpl b/heat/templates/bin/_heat-purge-deleted-active.sh.tpl
new file mode 100644
index 0000000000..9e3ec1f85e
--- /dev/null
+++ b/heat/templates/bin/_heat-purge-deleted-active.sh.tpl
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+{{/*
+Copyright 2019 The Openstack-Helm Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/}}
+
+set -ex
+
+heat-manage purge_deleted -g minutes $1
diff --git a/heat/templates/configmap-bin.yaml b/heat/templates/configmap-bin.yaml
index b432097b97..1463be528e 100644
--- a/heat/templates/configmap-bin.yaml
+++ b/heat/templates/configmap-bin.yaml
@@ -59,6 +59,8 @@ data:
 {{ tuple "bin/_heat-engine.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
   heat-engine-cleaner.sh: |
 {{ tuple "bin/_heat-engine-cleaner.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
+  heat-purge-deleted-active.sh: |
+{{ tuple "bin/_heat-purge-deleted-active.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
   rabbit-init.sh: |
 {{- include "helm-toolkit.scripts.rabbit_init" . | indent 4 }}
 {{- end }}
diff --git a/heat/templates/cron-job-purge-deleted.yaml b/heat/templates/cron-job-purge-deleted.yaml
new file mode 100644
index 0000000000..7539f1e9b4
--- /dev/null
+++ b/heat/templates/cron-job-purge-deleted.yaml
@@ -0,0 +1,88 @@
+{{/*
+Copyright 2019 The Openstack-Helm Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/}}
+
+{{- if .Values.manifests.cron_job_purge_deleted }}
+{{- $envAll := . }}
+
+{{- $mounts_heat_purge_deleted := .Values.pod.mounts.heat_purge_deleted.heat_purge_deleted }}
+{{- $mounts_heat_purge_deleted_init := .Values.pod.mounts.heat_purge_deleted.init_container }}
+
+{{- $serviceAccountName := "heat-purge-deleted" }}
+{{ tuple $envAll "purge_deleted" $serviceAccountName | include "helm-toolkit.snippets.kubernetes_pod_rbac_serviceaccount" }}
+---
+apiVersion: batch/v1beta1
+kind: CronJob
+metadata:
+  name: heat-purge-deleted
+  annotations:
+    {{ tuple $envAll | include "helm-toolkit.snippets.release_uuid" }}
+spec:
+  schedule: {{ .Values.jobs.purge_deleted.cron | quote }}
+  successfulJobsHistoryLimit: {{ .Values.jobs.purge_deleted.history.success }}
+  failedJobsHistoryLimit: {{ .Values.jobs.purge_deleted.history.failed }}
+  concurrencyPolicy: Forbid
+  jobTemplate:
+    metadata:
+      labels:
+{{ tuple $envAll "heat" "purge-deleted" | include "helm-toolkit.snippets.kubernetes_metadata_labels" | indent 8 }}
+    spec:
+      template:
+        metadata:
+          labels:
+{{ tuple $envAll "heat" "purge-deleted" | include "helm-toolkit.snippets.kubernetes_metadata_labels" | indent 12 }}
+        spec:
+          serviceAccountName: {{ $serviceAccountName }}
+          restartPolicy: OnFailure
+          nodeSelector:
+            {{ .Values.labels.job.node_selector_key }}: {{ .Values.labels.job.node_selector_value }}
+          initContainers:
+{{ tuple $envAll "purge_deleted" $mounts_heat_purge_deleted_init | include "helm-toolkit.snippets.kubernetes_entrypoint_init_container" | indent 12 }}
+          containers:
+            - name: heat-purge-deleted
+{{ tuple $envAll "heat_purge_deleted" | include "helm-toolkit.snippets.image" | indent 14 }}
+{{ tuple $envAll $envAll.Values.pod.resources.jobs.purge_deleted | include "helm-toolkit.snippets.kubernetes_resources" | indent 14 }}
+              command:
+                - /tmp/heat-purge-deleted-active.sh
+                - {{ quote .Values.jobs.purge_deleted.purge_age }}
+              volumeMounts:
+              - name: heat-bin
+                mountPath: /tmp/heat-purge-deleted-active.sh
+                subPath: heat-purge-deleted-active.sh
+                readOnly: true
+              - name: etcheat
+                mountPath: /etc/heat
+              - name: heat-etc
+                mountPath: /etc/heat/heat.conf
+                subPath: heat.conf
+                readOnly: true
+              - name: heat-etc
+                mountPath: {{ .Values.conf.heat.DEFAULT.log_config_append }}
+                subPath: {{ base .Values.conf.heat.DEFAULT.log_config_append }}
+                readOnly: true
+{{ if $mounts_heat_purge_deleted.volumeMounts }}{{ toYaml $mounts_heat_purge_deleted.volumeMounts | indent 14 }}{{ end }}
+          volumes:
+          - name: etcheat
+            emptyDir: {}
+          - name: heat-etc
+            secret:
+              secretName: heat-etc
+              defaultMode: 0444
+          - name: heat-bin
+            configMap:
+              name: heat-bin
+              defaultMode: 0555
+{{ if $mounts_heat_purge_deleted.volumes }}{{ toYaml $mounts_heat_purge_deleted.volumes | indent 10 }}{{ end }}
+{{- end }}
diff --git a/heat/values.yaml b/heat/values.yaml
index 021aa46651..f005f63d7d 100644
--- a/heat/values.yaml
+++ b/heat/values.yaml
@@ -55,6 +55,7 @@ images:
     heat_cloudwatch: docker.io/openstackhelm/heat:ocata
     heat_engine: docker.io/openstackhelm/heat:ocata
     heat_engine_cleaner: docker.io/openstackhelm/heat:ocata
+    heat_purge_deleted: docker.io/openstackhelm/heat:ocata
     dep_check: quay.io/stackanetes/kubernetes-entrypoint:v0.3.1
     image_repo_sync: docker.io/docker:17.07.0
   pull_policy: "IfNotPresent"
@@ -72,6 +73,13 @@ jobs:
       success: 3
       failed: 1
 
+  purge_deleted:
+    cron: "20 */24 * * *"
+    purge_age: 60
+    history:
+      success: 3
+      failed: 1
+
 conf:
   rally_tests:
     run_tempest: false
@@ -681,6 +689,20 @@ dependencies:
           service: oslo_messaging
         - endpoint: internal
           service: identity
+    purge_deleted:
+      jobs:
+        - heat-db-sync
+        - heat-ks-user
+        - heat-trustee-ks-user
+        - heat-domain-ks-user
+        - heat-ks-endpoints
+      services:
+        - endpoint: internal
+          service: oslo_db
+        - endpoint: internal
+          service: oslo_messaging
+        - endpoint: internal
+          service: identity
     ks_endpoints:
       jobs:
         - heat-ks-service
@@ -1013,6 +1035,11 @@ pod:
       heat_engine_cleaner:
         volumeMounts:
         volumes:
+    heat_purge_deleted:
+      init_container: null
+      heat_purge_deleted:
+        volumeMounts:
+        volumes:
     heat_tests:
       init_container: null
       heat_tests:
@@ -1155,6 +1182,13 @@ pod:
         limits:
           memory: "1024Mi"
           cpu: "2000m"
+      purge_deleted:
+        requests:
+          memory: "124Mi"
+          cpu: "100m"
+        limits:
+          memory: "1024Mi"
+          cpu: "2000m"
       image_repo_sync:
         requests:
           memory: "128Mi"
@@ -1204,6 +1238,7 @@ manifests:
   configmap_bin: true
   configmap_etc: true
   cron_job_engine_cleaner: true
+  cron_job_purge_deleted: true
   deployment_api: true
   deployment_cfn: true
   deployment_cloudwatch: false