diff --git a/devops/gc/deploy/README.md b/devops/gc/deploy/README.md
index b1e7858b01a408a39457a4c4d28cf1b0e4c8e1b4..41a44ae5bca36ee11a9246996d51600088333f6f 100644
--- a/devops/gc/deploy/README.md
+++ b/devops/gc/deploy/README.md
@@ -34,6 +34,8 @@ First you need to set variables in **values.yaml** file using any code editor. S
 **global.onPremEnabled** | whether on-prem is enabled | boolean | `false` | yes
 **global.limitsEnabled** | whether CPU and memory limits are enabled | boolean | `true` | yes
 **global.logLevel** | severity of logging level | string | `ERROR` | yes
+**global.tier** | Only PROD must be used to enable autoscaling | string | "" | no
+**global.autoscaling** | enables horizontal pod autoscaling, when tier=PROD | boolean | true | yes
 
 ### Configmap variables
 
@@ -70,6 +72,29 @@ First you need to set variables in **values.yaml** file using any code editor. S
 **istio.proxyMemory** | memory request for Envoy sidecars | string | `100Mi` | yes
 **istio.proxyMemoryLimit** | memory limit for Envoy sidecars | string | `512Mi` | yes
 
+### Horizontal Pod Autoscaling (HPA) variables (works only if tier=PROD and autoscaling=true)
+
+| Name | Description | Type | Default |Required |
+|------|-------------|------|---------|---------|
+**hpa.minReplicas** | minimum number of replicas | integer | 6 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.maxReplicas** | maximum number of replicas | integer | 15 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.targetType** | type of measurements: AverageValue or Value | string | "AverageValue" | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.targetValue** | threshold value to trigger the scaling up | integer | 80 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.behaviorScaleUpStabilizationWindowSeconds** | time to start implementing the scale up when it is triggered | integer | 10 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.behaviorScaleUpPoliciesValue** | the maximum number of new replicas to create (in percents from current state)| integer | 50 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.behaviorScaleUpPoliciesPeriodSeconds** | pause for every new scale up decision | integer | 15 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.behaviorScaleDownStabilizationWindowSeconds** | time to start implementing the scale down when it is triggered | integer | 60 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.behaviorScaleDownPoliciesValue** | the maximum number of replicas to destroy (in percents from current state) | integer | 25 | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.behaviorScaleDownPoliciesPeriodSeconds** | pause for every new scale down decision | integer | 60 | only if `global.autoscaling` is true and `global.tier` is PROD
+
+### Limits variables
+
+| Name | Description | Type | Default |Required |
+|------|-------------|------|---------|---------|
+**limits.maxTokens** | maximum number of requests per fillInterval | integer | 50 | only if `global.autoscaling` is true and `global.tier` is PROD
+**limits.tokensPerFill** | number of new tokens allowed every fillInterval | integer | 50 | only if `global.autoscaling` is true and `global.tier` is PROD
+**limits.fillInterval** | time interval | string | "1s" | only if `global.autoscaling` is true and `global.tier` is PROD
+
 ### Install the helm chart
 
 Run this command from within this directory:
diff --git a/devops/gc/deploy/templates/unit-hpa.yaml b/devops/gc/deploy/templates/unit-hpa.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3cda953f2f4691aa6e7210df91773d3d3bced2f3
--- /dev/null
+++ b/devops/gc/deploy/templates/unit-hpa.yaml
@@ -0,0 +1,42 @@
+{{- if and (eq .Values.global.tier "PROD") (eq .Values.global.autoscaling true) }}
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: {{ printf "%s-hpa" .Values.conf.appName | quote }}
+  namespace: {{ .Release.Namespace | quote }}
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: {{ .Values.conf.appName | quote }}
+  minReplicas: {{ .Values.hpa.minReplicas }}
+  maxReplicas: {{ .Values.hpa.maxReplicas }}
+  metrics:
+    - type: External
+      external:
+        metric:
+          name: istio.io|service|server|request_count
+          selector:
+            matchLabels:
+              metric.labels.destination_workload_name: {{ .Values.conf.appName | quote }}
+        target:
+          type: {{ .Values.hpa.targetType | quote }}
+          {{- if eq .Values.hpa.targetType "AverageValue" }}
+          averageValue: {{ .Values.hpa.targetValue }}
+          {{- else if eq .Values.hpa.targetType "Value" }}
+          value: {{ .Values.hpa.targetValue }}
+          {{- end }}
+  behavior:
+    scaleUp:
+      stabilizationWindowSeconds: {{ .Values.hpa.behaviorScaleUpStabilizationWindowSeconds }}
+      policies:
+        - type: Percent
+          value: {{ .Values.hpa.behaviorScaleUpPoliciesValue }}
+          periodSeconds: {{ .Values.hpa.behaviorScaleUpPoliciesPeriodSeconds }}
+    scaleDown:
+      stabilizationWindowSeconds: {{ .Values.hpa.behaviorScaleDownStabilizationWindowSeconds }}
+      policies:
+        - type: Percent
+          value: {{ .Values.hpa.behaviorScaleDownPoliciesValue }}
+          periodSeconds: {{ .Values.hpa.behaviorScaleDownPoliciesPeriodSeconds }}
+{{- end }}
diff --git a/devops/gc/deploy/templates/unit-rate-limits.yaml b/devops/gc/deploy/templates/unit-rate-limits.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ddc911c8bc1c66f08dc28d8f0626668d98586ed8
--- /dev/null
+++ b/devops/gc/deploy/templates/unit-rate-limits.yaml
@@ -0,0 +1,43 @@
+{{- if and (eq .Values.global.tier "PROD") (eq .Values.global.autoscaling true) }}
+apiVersion: networking.istio.io/v1alpha3
+kind: EnvoyFilter
+metadata:
+  name: {{ printf "%s-ratelimit" .Values.conf.appName | quote }}
+  namespace: {{ .Release.Namespace | quote }}
+spec:
+  workloadSelector:
+    labels:
+      app: {{ .Values.conf.appName | quote }}
+  configPatches:
+    - applyTo: "HTTP_FILTER"
+      match:
+        context: "SIDECAR_INBOUND"
+        listener:
+          filterChain:
+            filter:
+              name: "envoy.filters.network.http_connection_manager"
+      patch:
+        operation: INSERT_BEFORE
+        value:
+          name: "envoy.filters.http.local_ratelimit"
+          typed_config:
+            '@type': "type.googleapis.com/udpa.type.v1.TypedStruct"
+            type_url: "type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit"
+            value:
+              stat_prefix: "http_local_rate_limiter"
+              enable_x_ratelimit_headers: "DRAFT_VERSION_03"
+              token_bucket:
+                max_tokens: {{ .Values.limits.maxTokens }}
+                tokens_per_fill: {{ .Values.limits.tokensPerFill }}
+                fill_interval: {{ .Values.limits.fillInterval  | quote}}
+              filter_enabled:
+                runtime_key: "local_rate_limit_enabled"
+                default_value:
+                  numerator: 100
+                  denominator: "HUNDRED"
+              filter_enforced:
+                runtime_key: "local_rate_limit_enforced"
+                default_value:
+                  numerator: 100
+                  denominator: "HUNDRED"
+{{- end }}
diff --git a/devops/gc/deploy/values.yaml b/devops/gc/deploy/values.yaml
index caa2c2e41eb4339dc0e318e15623892bda54432b..6e3d4a3727a309fe2cc3bf6b756fcfd9d691e072 100644
--- a/devops/gc/deploy/values.yaml
+++ b/devops/gc/deploy/values.yaml
@@ -7,6 +7,8 @@ global:
   onPremEnabled: false
   limitsEnabled: true
   logLevel: "ERROR"
+  tier: ""
+  autoscaling: true
 
 data:
   logLevel: ""
@@ -29,3 +31,20 @@ istio:
   proxyCPULimit: "500m"
   proxyMemory: "50Mi"
   proxyMemoryLimit: "512Mi"
+
+hpa:
+  minReplicas: 6
+  maxReplicas: 15
+  targetType: "AverageValue" #Could be AverageValue or Value
+  targetValue: 120 #60 rps
+  behaviorScaleUpStabilizationWindowSeconds: 10
+  behaviorScaleUpPoliciesValue: 50
+  behaviorScaleUpPoliciesPeriodSeconds: 15
+  behaviorScaleDownStabilizationWindowSeconds: 60
+  behaviorScaleDownPoliciesValue: 25
+  behaviorScaleDownPoliciesPeriodSeconds: 60
+
+limits:
+  maxTokens: 70
+  tokensPerFill: 70
+  fillInterval: "1s"