diff --git a/devops/gc/deploy/README.md b/devops/gc/deploy/README.md
index 91b1d6f7aca2fae3bcd86aab7678538dcc81ec72..e579739b2dc66b2d4e8779a23eddbeca69eb4f46 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
 
@@ -84,6 +86,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 | `256Mi` | 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 | `10` | only if `global.autoscaling` is true and `global.tier` is PROD
+**hpa.maxReplicas** | maximum number of replicas | integer | `20` | 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 | `40` | 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 | `25` | only if `global.autoscaling` is true and `global.tier` is PROD
+**limits.tokensPerFill** | number of new tokens allowed every fillInterval | integer | `25` | 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/hpa.yaml b/devops/gc/deploy/templates/hpa.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c7dd904696aad3307208817f588c7f883e2f6981
--- /dev/null
+++ b/devops/gc/deploy/templates/hpa.yaml
@@ -0,0 +1,43 @@
+{{- 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:
+          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/rate-limit.yaml b/devops/gc/deploy/templates/rate-limit.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f60af4b183dd67b9ed729c26a911b326c7df65f5
--- /dev/null
+++ b/devops/gc/deploy/templates/rate-limit.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.local_ratelimit.max_tokens }}
+                tokens_per_fill: {{ .Values.local_ratelimit.tokens_per_fill }}
+                fill_interval: {{ .Values.local_ratelimit.fill_interval  | 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 c506d6f8cab8f019ae8540e834c4510d6005fccd..e21084b51a4eb440a54838b94431e5a18d40b87e 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:
   # configmaps
@@ -45,3 +47,20 @@ istio:
   proxyCPULimit: "200m"
   proxyMemory: "50Mi"
   proxyMemoryLimit: "256Mi"
+
+hpa:
+  minReplicas: 10
+  maxReplicas: 20
+  targetType: "AverageValue"
+  targetValue: 40   # rps*0.85*2
+  behaviorScaleUpStabilizationWindowSeconds: 10
+  behaviorScaleUpPoliciesValue: 50
+  behaviorScaleUpPoliciesPeriodSeconds: 15
+  behaviorScaleDownStabilizationWindowSeconds: 60
+  behaviorScaleDownPoliciesValue: 25
+  behaviorScaleDownPoliciesPeriodSeconds: 60
+
+local_ratelimit:
+  max_tokens: 25   # rps
+  tokens_per_fill: 25
+  fill_interval: "1s"