diff --git a/ansible/roles/stack-sunbird/defaults/main.yml b/ansible/roles/stack-sunbird/defaults/main.yml
index 2ae7d0ee90ad94341aab1d3ef01aa3ee52170375..5ca7264e4d10e663e1e477dde27c7846f57f112d 100644
--- a/ansible/roles/stack-sunbird/defaults/main.yml
+++ b/ansible/roles/stack-sunbird/defaults/main.yml
@@ -275,7 +275,8 @@ service_env:
     - ../../../../ansible/roles/stack-sunbird/templates/outbound_logback.xml
   transformer:
     - ../../../../ansible/roles/stack-sunbird/templates/transformer.env
-    - ../../../../ansible/roles/stack-sunbird/templates/transformer_industry_feedback.xml
+    - ../../../../ansible/roles/stack-sunbird/templates/transformer_industry_feedback.xml   
+  odk: ../../../../ansible/roles/stack-sunbird/templates/odk.env
   orchestrator:
     - ../../../../ansible/roles/stack-sunbird/templates/orchestrator.env
 
@@ -890,6 +891,26 @@ uci_orchestrator_liveness_readiness:
     timeoutSeconds: 5
     failureThreshold: 2
 
+uci_odk_liveness_readiness:
+  healthcheck: true
+  readinessProbe:
+    httpGet:
+      path: /service/health
+      port: 8080
+    initialDelaySeconds: 15
+    periodSeconds: 15
+    timeoutSeconds: 5
+    failureThreshold: 2
+    successThreshold: 1
+  livenessProbe:
+    httpGet:
+      path: /service/health
+      port: 8080
+    initialDelaySeconds: 15
+    periodSeconds: 15
+    timeoutSeconds: 5
+    failureThreshold: 2
+
 adminutil__access_keyprefix: "access"
 adminutil__access_keystart: 0
 adminutil__access_keycount: 0
diff --git a/ansible/roles/stack-sunbird/templates/odk.env b/ansible/roles/stack-sunbird/templates/odk.env
new file mode 100644
index 0000000000000000000000000000000000000000..992e775f9a10c94a9778052a63dcf381d1f898ee
--- /dev/null
+++ b/ansible/roles/stack-sunbird/templates/odk.env
@@ -0,0 +1,7 @@
+DB_URL=jdbc:postgres://{{uci_postgres_host}}:5432/{{uci_odk_postgres_database}}?user={{uci_postgres_user}}&password={{uci_postgres_password}}&sslmode=require
+DB_RESOURCE_NAME=jdbc/{{uci_odk_postgres_database}}
+DB_USERNAME={{uci_postgres_user}}
+DB_PASSWORD={{uci_postgres_password}}
+DB_SCHEMA=aggregate
+DB_NAME={{uci_odk_postgres_database}}
+DB_PORT=5432
\ No newline at end of file
diff --git a/kubernetes/helm_charts/core/odk/Chart.yaml b/kubernetes/helm_charts/core/odk/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..026af85670951a5d7e3e2e58ae17184620e8c4c2
--- /dev/null
+++ b/kubernetes/helm_charts/core/odk/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: odk
+version: 0.1.0
\ No newline at end of file
diff --git a/kubernetes/helm_charts/core/odk/templates/deployment.yaml b/kubernetes/helm_charts/core/odk/templates/deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d4badb8f3f695fc55664c73e5964c6b2b41e2bcc
--- /dev/null
+++ b/kubernetes/helm_charts/core/odk/templates/deployment.yaml
@@ -0,0 +1,62 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Chart.Name }}
+  namespace: {{ .Values.namespace }}
+  annotations:
+    reloader.stakater.com/auto: "true"
+spec:
+  replicas: {{ .Values.replicaCount }}
+  strategy:
+     rollingUpdate:
+        maxSurge: {{ .Values.strategy.maxsurge }}
+        maxUnavailable: {{ .Values.strategy.maxunavailable }}
+  selector:
+    matchLabels:
+      app: {{ .Chart.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ .Chart.Name }}
+    spec:
+{{- if .Values.imagepullsecrets }}
+      imagePullSecrets:
+      - name: {{ .Values.imagepullsecrets }}
+{{- end }}
+      containers:
+      - name: {{ .Chart.Name }}
+        image: "{{ .Values.dockerhub }}/{{ .Values.repository }}:{{ .Values.image_tag }}"
+        imagePullPolicy: Always
+        env:
+        - name: JAVA_OPTIONS
+          value: {{ .Values.env.javaoptions | quote }}
+        envFrom:
+        - configMapRef:
+            name: {{ .Chart.Name }}-config
+        resources:
+{{ toYaml .Values.resources | indent 10 }}
+        ports:
+        - containerPort: {{ .Values.network.port }}
+        {{- if .Values.healthcheck }}
+        livenessProbe:
+{{ toYaml .Values.livenessProbe | indent 10 }}
+        readinessProbe:
+{{ toYaml .Values.readinessProbe | indent 10 }}
+        {{- end }}
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Chart.Name }}-service
+  namespace: {{ .Values.namespace }}
+  labels:
+    app: {{ .Chart.Name }}
+spec:
+  ports:
+  - name: http-{{ .Chart.Name }}
+    protocol: TCP
+    port: {{ .Values.network.targetport }}
+  selector:
+    app: {{ .Chart.Name }}
diff --git a/kubernetes/helm_charts/core/odk/templates/hpa.yaml b/kubernetes/helm_charts/core/odk/templates/hpa.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0fef8ca0e79f3c6161f12b6baec09be4265115f8
--- /dev/null
+++ b/kubernetes/helm_charts/core/odk/templates/hpa.yaml
@@ -0,0 +1,27 @@
+{{- if .Values.autoscaling.enabled }}
+apiVersion: autoscaling/v2beta1
+kind: HorizontalPodAutoscaler
+metadata:
+  name: {{ .Chart.Name }}
+  namespace: {{ .Values.namespace }}
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: {{ .Chart.Name }}
+  minReplicas: {{ .Values.autoscaling.minReplicas }}
+  maxReplicas: {{ .Values.autoscaling.maxReplicas }}
+  metrics:
+    {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
+    - type: Resource
+      resource:
+        name: cpu
+        targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
+    {{- end }}
+    {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
+    - type: Resource
+      resource:
+        name: memory
+        targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
+    {{- end }}
+  {{- end }}
\ No newline at end of file
diff --git a/kubernetes/helm_charts/core/odk/values.j2 b/kubernetes/helm_charts/core/odk/values.j2
new file mode 100644
index 0000000000000000000000000000000000000000..50349ab3148d786e21a1fb037515712009e0541a
--- /dev/null
+++ b/kubernetes/helm_charts/core/odk/values.j2
@@ -0,0 +1,35 @@
+### Default variable file for cert-service ###
+
+namespace: {{ namespace }}
+imagepullsecrets: {{ imagepullsecrets }}
+dockerhub: {{ dockerhub }}
+
+env:
+  javaoptions: {{uci_odk_java_mem_limit|default('-Xmx600m')}}
+
+replicaCount: {{uci_odk_replicacount|default(1)}}
+repository: {{uci_odk_repository|default('odk')}}
+image_tag: {{ image_tag }}
+resources:
+  requests:
+    cpu: {{uci_odk_cpu_req|default('100m')}}
+    memory: {{uci_odk_mem_req|default('100Mi')}}
+  limits:
+    cpu: {{uci_odk_cpu_limit|default('1')}}
+    memory: {{uci_odk_mem_limit|default('1024Mi')}}
+network:
+  port: 8080
+  targetport: 8080
+strategy:
+  type: RollingUpdate
+  maxsurge: {{ uci_odk_maxsurge|default('25%') }}
+  maxunavailable: {{ uci_odk_maxunavailable|default('25%') }}
+
+{{ uci_odk_liveness_readiness | to_nice_yaml }}
+
+autoscaling:
+  enabled: {{ uci_odk_autoscaling_enabled | default('false') }}
+  minReplicas: {{ uci_odk_autoscaling_minReplicas|default(1) }}
+  maxReplicas: {{ uci_odk_autoscaling_maxReplicas|default(2) }}
+  targetCPUUtilizationPercentage: {{ uci_odk_autoscaling_targetCPUUtilizationPercentage|default(60) }}
+  targetMemoryUtilizationPercentage: {{ uci_odk_autoscaling_targetMemoryUtilizationPercentage|default('') }}