diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index bb6e0c7c567ac1fd1a881dbe54f46e61795894f6..d7589ae22ed60ca5273d0ad27a3e89418a5b1d39 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -127,6 +127,7 @@ assessment_prefix: /assessment
 # Service URLs
 knowledge_mw_service_url: "http://knowledge-mw-service:5000"
 learning_service_url: "http://learner-service:9000"
+dial_service_url: "http://dial-service:9000"
 vm_learning_service_url: "http://{{learningservice_ip}}:8080/learning-service"
 telemetry_service_url: "http://telemetry-service:9001"
 player_service_url: "http://player:3000"
@@ -2494,7 +2495,7 @@ kong_apis:
 
 - name: publishContent
   uris: "{{ content_prefix }}/v1/publish"
-  upstream_url: "{{ knowledge_mw_service_url }}/v1/content/publish"
+  upstream_url: "{{ content_service_url }}/content/v3/publish"
   strip_uri: true
   plugins:
   - name: jwt
@@ -9836,3 +9837,167 @@ kong_apis:
   - name: opa-checks
     config.required: false
     config.enabled: false
+
+- name: releaseDialcodeContentV2
+  uris: "{{ content_prefix }}/v2/dialcode/release"
+  upstream_url: "{{ content_service_url }}/content/v4/dialcode/release"
+  strip_uri: true
+  plugins:
+  - name: jwt
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: acl
+    config.whitelist:
+    - contentUpdate
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: credential
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
+
+- name: releaseDialcodeCollection
+  uris: "{{ collection_prefix }}/v1/dialcode/release"
+  upstream_url: "{{ content_service_url }}/collection/v4/dialcode/release"
+  strip_uri: true
+  plugins:
+  - name: jwt
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: acl
+    config.whitelist:
+    - contentUpdate
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: credential
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
+
+- name: publishContentV2
+  uris: "{{ content_prefix }}/v2/publish"
+  upstream_url: "{{ content_service_url }}/content/v4/publish"
+  strip_uri: true
+  plugins:
+  - name: jwt
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: acl
+    config.whitelist:
+    - contentAdmin
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: credential
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
+
+- name: unlistedPublishContent
+  uris: "{{ content_prefix }}/v1/unlisted/publish"
+  upstream_url: "{{ content_service_url }}/content/v3/unlisted/publish"
+  strip_uri: true
+  plugins:
+  - name: jwt
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: acl
+    config.whitelist:
+    - contentAdmin
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: credential
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
+
+- name: unlistedPublishContentV2
+  uris: "{{ content_prefix }}/v2/unlisted/publish"
+  upstream_url: "{{ content_service_url }}/content/v4/unlisted/publish"
+  strip_uri: true
+  plugins:
+  - name: jwt
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: acl
+    config.whitelist:
+    - contentAdmin
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: credential
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
+
+- name: publishCollection
+  uris: "{{ collection_prefix }}/v1/publish"
+  upstream_url: "{{ content_service_url }}/collection/v4/publish"
+  strip_uri: true
+  plugins:
+  - name: jwt
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: acl
+    config.whitelist:
+    - contentAdmin
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: credential
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
+
+- name: unlistedPublishCollection
+  uris: "{{ collection_prefix }}/v1/unlisted/publish"
+  upstream_url: "{{ content_service_url }}/collection/v4/unlisted/publish"
+  strip_uri: true
+  plugins:
+  - name: jwt
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: acl
+    config.whitelist:
+    - contentAdmin
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: credential
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
+
+- name: readDIALCodesBatchInfo
+  uris: "{{ dialcode_service_prefix }}/v2/read/batch"
+  upstream_url: "{{ dial_service_url }}/dialcode/v4/batch/read"
+  strip_uri: true
+  plugins:
+  - name: cors
+  - "{{ statsd_pulgin }}"
+  - name: rate-limiting
+    config.policy: local
+    config.hour: "{{ medium_rate_limit_per_hour }}"
+    config.limit_by: ip
+  - name: request-size-limiting
+    config.allowed_payload_size: "{{ small_request_size_limit }}"
+  - name: opa-checks
+    config.required: true
+    config.enabled: true
\ No newline at end of file
diff --git a/ansible/roles/stack-sunbird/defaults/main.yml b/ansible/roles/stack-sunbird/defaults/main.yml
index 8b600f04a1c0edd082e0dd84113c5e5b8ccbe0fd..0c8c86242d1d48297459c6ed508e59131a95333b 100644
--- a/ansible/roles/stack-sunbird/defaults/main.yml
+++ b/ansible/roles/stack-sunbird/defaults/main.yml
@@ -1048,3 +1048,8 @@ kong_desktop_device_consumer_names_for_opa: '["desktop"]'
 # Audience claim check is disabled as of now
 # List of keycloak clients as these can come in audience field of a JWT token
 # keycloak_allowed_aud: '"{{ keycloak_auth_server_url }}/realms/{{ keycloak_realm }}", "account", "realm-management"'
+
+
+cloudstorage_relative_path_prefix_content: "CONTENT_STORAGE_BASE_PATH"
+cloudstorage_relative_path_prefix_dial: "DIAL_STORAGE_BASE_PATH"
+cloudstorage_metadata_list: '["appIcon", "artifactUrl", "posterImage", "previewUrl", "thumbnail", "assetsMap", "certTemplate", "itemSetPreviewUrl", "grayScaleAppIcon", "sourceURL", "variants", "downloadUrl", "streamingUrl", "toc_url", "data", "question", "solutions", "editorState", "media", "pdfUrl"]'
\ No newline at end of file
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index fb5a2e766762743b0dd820804de009f627d43a5e..bb44a718288ff184ff1b583df945645c373252d8 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -382,7 +382,7 @@ content {
   }
   h5p {
     library {
-      path: "{{ h5p_library_path }}"
+      path: "{{ h5p_library_path | default('https://sunbirddev.blob.core.windows.net/sunbird-content-dev/h5p-standalone-1.3.4.zip') }}"
     }
   }
   copy {
@@ -494,6 +494,7 @@ kafka {
   urls : "{{ kafka_urls }}"
   topic.send.enable : true
   topics.instruction : "{{ env_name }}.learning.job.request"
+  publish.request.topic : "{{ env_name }}.publish.job.request"
 }
 
 # DIAL Link Config
@@ -637,3 +638,11 @@ collection {
 }
 
 plugin.media.base.url="{{ plugin_media_base_url }}"
+
+cloudstorage {
+  metadata.replace_absolute_path={{ cloudstorage_replace_absolute_path | default('false') }}
+  relative_path_prefix={{ cloudstorage_relative_path_prefix_content }}
+  metadata.list={{ cloudstorage_metadata_list }}
+  read_base_path="{{ cloudstorage_base_path }}"
+  write_base_path={{ valid_cloudstorage_base_urls }}
+}
diff --git a/ansible/roles/stack-sunbird/templates/dial-service_application.conf b/ansible/roles/stack-sunbird/templates/dial-service_application.conf
index 745a8b9bfe5916e8ee0f044bd535f5ff970bded5..dd7b11dbebf4c59cb12d566208f62d7555d258af 100644
--- a/ansible/roles/stack-sunbird/templates/dial-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/dial-service_application.conf
@@ -150,6 +150,10 @@ system.config.table="system_config"
 publisher.keyspace.name="{{ env_name }}_dialcode_store"
 publisher.keyspace.table="publisher"
 
+#QRCodes Configuration
+qrcodes.keyspace.name="dialcodes"
+qrcodes.keyspace.table="dialcode_batch"
+
 #DIAL Code Generator Configuration
 dialcode.strip.chars="0"
 dialcode.length=6.0 
@@ -191,3 +195,9 @@ jsonld {
     sb_schema = ["http://store.knowlg.sunbird.org/dial/specs/sb/schema.jsonld"]
 }
 
+cloudstorage {
+     metadata.replace_absolute_path="{{ cloudstorage_replace_absolute_path | default('false') }}"
+     relative_path_prefix="{{ cloudstorage_relative_path_prefix_dial | default('DIAL_STORAGE_BASE_PATH') }}"
+     read_base_path="{{ cloudstorage_base_path }}"
+}
+cloud_storage_container="{{ cloud_storage_dial_bucketname | default('dial') }}"
diff --git a/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf b/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf
index e1298a1b923a97d65f23495698ae845142a1663f..332206c50205e0d3c52698fdc3a9e68788996a02 100644
--- a/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf
@@ -398,3 +398,11 @@ objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_s
 
 # Framework master category validation Supported values are Yes/No
 master.category.validation.enabled="{{ master_category_validation_enabled | default('Yes') }}"
+
+cloudstorage {
+  metadata.replace_absolute_path={{ cloudstorage_replace_absolute_path | default('false') }}
+  relative_path_prefix={{ cloudstorage_relative_path_prefix_content }}
+  metadata.list={{ cloudstorage_metadata_list }}
+  read_base_path="{{ cloudstorage_base_path }}"
+  write_base_path={{ valid_cloudstorage_base_urls }}
+}
diff --git a/pipelines/deploy/ContentFramework/Jenkinsfile b/pipelines/deploy/ContentFramework/Jenkinsfile
index c495bce26669de42f1af43fafa06bafd3668d3db..a02c72eb695f302a9b923638f83b1d910e3e582f 100644
--- a/pipelines/deploy/ContentFramework/Jenkinsfile
+++ b/pipelines/deploy/ContentFramework/Jenkinsfile
@@ -44,6 +44,7 @@ node() {
                     sh """                                                   
                       zip -r content-editor-artifact.zip ansible/content-editor
                       cd ansible/content-editor
+                      sudo npm install -g gulp
                       npm install
                       npm install promise
                       gulp minifyJs
diff --git a/pipelines/upload/schema/dial/Jenkinsfile b/pipelines/upload/schema/dial/Jenkinsfile
index dd74b2f23f30a03a7d9f12275ab5b3c39871802c..a91956eaf1fa1273feb6d846497d269c923f8f01 100644
--- a/pipelines/upload/schema/dial/Jenkinsfile
+++ b/pipelines/upload/schema/dial/Jenkinsfile
@@ -29,7 +29,7 @@ node() {
                 git clone https://github.com/project-sunbird/sunbird-dial-service.git -b ${params.dial_branch_or_tag}
                     """
                     ansiblePlaybook = "${currentWs}/ansible/dial_upload-schema.yml"
-                    ansibleExtraArgs = "--extra-vars \" source_name=${currentWs}/sunbird-dial-service/schemas\" --vault-password-file /var/lib/jenkins/secrets/vault-pass"  
+                    ansibleExtraArgs = "--extra-vars \" source_name=${currentWs}/sunbird-dial-service/jsonld-schema \" --vault-password-file /var/lib/jenkins/secrets/vault-pass"
                     values.put('currentWs', currentWs)
                     values.put('env', envDir)
                     values.put('module', module)