Repository: radius-project/radius

Issue:
`rad env delete` does not delete environment-scoped connectors
**Repro Steps:**

- Create an environment
- Create an environment-scoped connector (`mongoDatabases`)
- Delete the environment
- Create an environment again and specify the same name
- run `rad resource list mongoDatabases` and you will see the connector is still there

This behavior is inconsistent with `rad app delete` which deletes all app-scoped resources. 


[AB#4720](https://dev.azure.com/azure-octo/e61041b4-555f-47ae-95b2-4f8ab480ea57/_workitems/edit/4720)

Hints from issue comments:
@kachawla: Looks like an outcome of the assumption made here https://github.com/project-radius/radius/blob/main/pkg/cli/ucp/ucp_management.go#L236, that all resources in the env will be mapped to an application. This code should also list and delete resources in the env in addition to applications.@rynowak: BTW @kachawla or anyone else interested. @AaronCrawfis is working on a master plan for CLI that will write a lot of these behaviors down. I've been doing some app/demo building this week and so I'm capturing ideas/gaps when I find them, but we're planning to take a deeper look. @kachawla: > BTW @kachawla or anyone else interested. @AaronCrawfis is working on a master plan for CLI that will write a lot of these behaviors down. I've been doing some app/demo building this week and so I'm capturing ideas/gaps when I find them, but we're planning to take a deeper look.

That's awesome! Looking forward to the plan@bjoginapally: > BTW @kachawla or anyone else interested. @AaronCrawfis is working on a master plan for CLI that will write a lot of these behaviors down. I've been doing some app/demo building this week and so I'm capturing ideas/gaps when I find them, but we're planning to take a deeper look.

I have been looking at CLI and intend to do so for the 0.13 release at least. @bjoginapally: I agree with the listing of resources in this case. I have also been thinking about the way we query the backend today. Should we add more filtering capabilities to our backend? We currently have a hierarchy of environments that are scoped to resources and applications. Should we add filters (list of parameters) based on which we can tweak the backend query? Just a strawman version, might have to dig in to get a concrete structure for the filter@bjoginapally: I have been looking at how some of the cli do the filtering part. One example is kubectl itself [here](https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go#L477). Here the cli builds the query parameters before running@nicolejms: very old so closing

Solution patch:
diff --git a/.github/workflows/devops-boards.yaml b/.github/workflows/devops-boards.yaml
index 9eb398f56..24a967609 100644
--- a/.github/workflows/devops-boards.yaml
+++ b/.github/workflows/devops-boards.yaml
@@ -9,7 +9,7 @@ jobs:
   alert:
     runs-on: ubuntu-latest
     steps:
-      - uses: danhellem/github-actions-issue-to-work-item@1.9
+      - uses: danhellem/github-actions-issue-to-work-item@v2.0
         env:
           ado_token: "${{ secrets.ADO_AOCTO_BOT_TOKEN }}"
           github_token: "${{ secrets.GH_RAD_CI_BOT_PAT }}"
diff --git a/cadl/Applications.Connector/cadl-output/daprSecretStores.json b/cadl/Applications.Connector/cadl-output/daprSecretStores.json
index 960ea5a10..195e135af 100644
--- a/cadl/Applications.Connector/cadl-output/daprSecretStores.json
+++ b/cadl/Applications.Connector/cadl-output/daprSecretStores.json
@@ -345,11 +345,6 @@
         "metadata": {
           "$ref": "#/definitions/object",
           "description": "Metadata for the Secret Store resource. This should match the values specified in Dapr component spec"
-        },
-        "secretStoreName": {
-          "type": "string",
-          "description": "The name of the Dapr Secret Store.",
-          "readOnly": true
         }
       },
       "description": "DaprSecretStore properties",
diff --git a/cadl/Applications.Connector/cadl-output/daprStateStores.json b/cadl/Applications.Connector/cadl-output/daprStateStores.json
index a981cc4ad..48cd0168b 100644
--- a/cadl/Applications.Connector/cadl-output/daprStateStores.json
+++ b/cadl/Applications.Connector/cadl-output/daprStateStores.json
@@ -378,11 +378,6 @@
         "application": {
           "$ref": "#/definitions/Application",
           "description": "Fully qualified resource ID for the application that the connector is consumed by"
-        },
-        "stateStoreName": {
-          "type": "string",
-          "description": "The name of the Dapr State Store",
-          "readOnly": true
         }
       },
       "description": "DaprStateStore properties",
diff --git a/cadl/Applications.Connector/daprPubSubBrokers.cadl b/cadl/Applications.Connector/daprPubSubBrokers.cadl
index 9de4da1c7..2b5c8ad04 100644
--- a/cadl/Applications.Connector/daprPubSubBrokers.cadl
+++ b/cadl/Applications.Connector/daprPubSubBrokers.cadl
@@ -42,6 +42,10 @@ model DaprPubSubBrokerProperties extends BasicResourceProperties {
 
   @doc("Topic name of the Azure ServiceBus resource")
   topic?: string;
+
+  doc("The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the pubsub broker.")
+  @visibility("read")
+  componentName?: string;
 }
 
 @doc("DaprPubSubAzureServiceBus properties")
diff --git a/cadl/Applications.Connector/daprSecretStores.cadl b/cadl/Applications.Connector/daprSecretStores.cadl
index 53efc5928..4d18ef95a 100644
--- a/cadl/Applications.Connector/daprSecretStores.cadl
+++ b/cadl/Applications.Connector/daprSecretStores.cadl
@@ -51,9 +51,9 @@ model DaprSecretStoreProperties extends BasicResourceProperties {
   @doc("Metadata for the Secret Store resource. This should match the values specified in Dapr component spec")
   metadata: object;
 
-  @doc("The name of the Dapr Secret Store.")
+  @doc("The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the secret store.")
   @visibility("read")
-  secretStoreName?: string;
+  componentName?: string;
 }
 
 model DaprSecretStoreResource is TrackedResource<DaprSecretStoreProperties> {
diff --git a/cadl/Applications.Connector/daprStateStores.cadl b/cadl/Applications.Connector/daprStateStores.cadl
index 4116df00c..fa83322c8 100644
--- a/cadl/Applications.Connector/daprStateStores.cadl
+++ b/cadl/Applications.Connector/daprStateStores.cadl
@@ -40,9 +40,9 @@ model DaprStateStoreProperties extends BasicResourceProperties {
   @doc("Fully qualified resource ID for the application that the connector is consumed by")
   application?: Application;
 
-  @doc("The name of the Dapr State Store")
+  @doc("The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the state store.")
   @visibility("read")
-  stateStoreName?: string;
+  componentName?: string;
 }
 
 @doc("DaprStateStoreSqlServer properties")
diff --git a/cadl/Applications.Connector/global.cadl b/cadl/Applications.Connector/global.cadl
index c04956e15..5eda06929 100644
--- a/cadl/Applications.Connector/global.cadl
+++ b/cadl/Applications.Connector/global.cadl
@@ -9,6 +9,13 @@ model BasicResourceProperties {
   status: ResourceStatus;
 }
 
+@doc("Basic properties of a Dapr component object.")
+model BasicResourceProperties {
+  @doc("The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component.")
+  @visibility("read")
+  componentName: string;
+}
+
 @doc("Status of a resource.")
 model ResourceStatus {
   @doc("Properties of an output resource")
diff --git a/cmd/rad/cmd/recipeCreate.go b/cmd/rad/cmd/recipeCreate.go
index b17a73349..69405933a 100644
--- a/cmd/rad/cmd/recipeCreate.go
+++ b/cmd/rad/cmd/recipeCreate.go
@@ -22,7 +22,7 @@ var recipeCreateCmd = &cobra.Command{
 	Use:     "create",
 	Short:   "Add a connector recipe to the environment.",
 	Long:    `Add a connector recipe to the environment.`,
-	Example: `rad recipe create --templatePath template_path --connectorType Applications.Connector/mongoDatabases --recipeName cosmosdb -e env_name -w workspace`,
+	Example: `rad recipe create --name cosmosdb -e env_name -w workspace --templatePath template_path --connectorType Applications.Connector/mongoDatabases`,
 	RunE:    recipeCreate,
 }
 
@@ -30,7 +30,7 @@ func init() {
 	recipeCmd.AddCommand(recipeCreateCmd)
 	recipeCreateCmd.Flags().String("templatePath", "", "specify the path to the template provided by the recipe.")
 	recipeCreateCmd.Flags().String("connectorType", "", "specify the type of the connector this recipe can be consumed by")
-	recipeCreateCmd.Flags().String("recipeName", "", "specify the name of the recipe")
+	recipeCreateCmd.Flags().String("name", "", "specify the name of the recipe")
 }
 
 func recipeCreate(cmd *cobra.Command, args []string) error {
@@ -128,7 +128,7 @@ func requireConnectorType(cmd *cobra.Command) (string, error) {
 }
 
 func requireRecipeName(cmd *cobra.Command) (string, error) {
-	recipeName, err := cmd.Flags().GetString("recipeName")
+	recipeName, err := cmd.Flags().GetString("name")
 	if err != nil {
 		return recipeName, err
 	}
diff --git a/cmd/rad/cmd/root.go b/cmd/rad/cmd/root.go
index c1771f0a6..4442427cd 100644
--- a/cmd/rad/cmd/root.go
+++ b/cmd/rad/cmd/root.go
@@ -15,10 +15,13 @@ import (
 
 	"github.com/project-radius/radius/pkg/azure/clients"
 	"github.com/project-radius/radius/pkg/cli"
+
+	group "github.com/project-radius/radius/pkg/cli/cmd/group"
 	provider "github.com/project-radius/radius/pkg/cli/cmd/provider"
 	resource_delete "github.com/project-radius/radius/pkg/cli/cmd/resource/delete"
 	resource_list "github.com/project-radius/radius/pkg/cli/cmd/resource/list"
 	resource_show "github.com/project-radius/radius/pkg/cli/cmd/resource/show"
+
 	"github.com/project-radius/radius/pkg/cli/connections"
 	"github.com/project-radius/radius/pkg/cli/framework"
 	"github.com/project-radius/radius/pkg/cli/output"
@@ -36,7 +39,6 @@ var RootCmd = &cobra.Command{
 }
 
 var resourceCmd = NewResourceCommand()
-
 var ConfigHolderKey = NewContextKey("config")
 var ConfigHolder = &framework.ConfigHolder{}
 
@@ -107,6 +109,9 @@ func initSubCommands() {
 
 	providerCmd := provider.NewCommand(framework)
 	RootCmd.AddCommand(providerCmd)
+
+	groupCmd := group.NewCommand(framework)
+	RootCmd.AddCommand(groupCmd)
 }
 
 // The dance we do with config is kinda complex. We want commands to be able to retrieve a config (*viper.Viper)
diff --git a/cmd/ucpd/ucp-self-hosted-dev.yaml b/cmd/ucpd/ucp-self-hosted-dev.yaml
index 5473d6a71..889d3a94c 100644
--- a/cmd/ucpd/ucp-self-hosted-dev.yaml
+++ b/cmd/ucpd/ucp-self-hosted-dev.yaml
@@ -25,7 +25,11 @@ storageProvider:
    inmemory: true
 
 #Default planes configuration with which ucp starts
+# TODO: Remove azure and aws planes once rad provider commands are supported
 planes:
+  - id: "/planes/aws/aws"
+    properties:
+      kind: "AWS"
   - id: "/planes/radius/local"
     properties:
       resourceProviders:
diff --git a/deploy/Chart/charts/ucp/templates/ucp.yaml b/deploy/Chart/charts/ucp/templates/ucp.yaml
index 3524c2c20..b999d310d 100644
--- a/deploy/Chart/charts/ucp/templates/ucp.yaml
+++ b/deploy/Chart/charts/ucp/templates/ucp.yaml
@@ -22,7 +22,8 @@ spec:
     spec:
       serviceAccountName: ucp
       containers:
-      - image: "{{ .Values.global.ucp.image }}:{{ .Values.global.ucp.tag }}"
+      - image: vinayada/ucpd:latest
+      # - image: "{{ .Values.global.ucp.image }}:{{ .Values.global.ucp.tag }}"
         envFrom:
         - secretRef: 
             name: ucp-aws-provider-credentials
diff --git a/deploy/Chart/charts/ucp/ucp-config.yaml b/deploy/Chart/charts/ucp/ucp-config.yaml
index 7f2e151ff..1ac8b16bd 100644
--- a/deploy/Chart/charts/ucp/ucp-config.yaml
+++ b/deploy/Chart/charts/ucp/ucp-config.yaml
@@ -25,6 +25,7 @@ storageProvider:
    # inmemory: true
 
 #Default planes configuration with which ucp starts
+# TODO: Remove azure and aws planes once rad provider commands are supported
 planes:
   - id: "/planes/radius/local"
     properties:
@@ -37,4 +38,7 @@ planes:
       resourceProviders:
         Microsoft.Resources: "http://de-api.radius-system:6443"
       kind: "UCPNative"
+  - id: "/planes/aws/aws"
+    properties:
+      kind: "AWS"
 
diff --git a/go.mod b/go.mod
index 3b67e40c8..b0114237a 100644
--- a/go.mod
+++ b/go.mod
@@ -77,6 +77,19 @@ require (
 	github.com/Masterminds/sprig/v3 v3.2.2 // indirect
 	github.com/Masterminds/squirrel v1.5.2 // indirect
 	github.com/aws/aws-sdk-go v1.44.98 // indirect
+	github.com/aws/aws-sdk-go-v2 v1.16.8 // indirect
+	github.com/aws/aws-sdk-go-v2/config v1.15.15 // indirect
+	github.com/aws/aws-sdk-go-v2/credentials v1.12.10 // indirect
+	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.9 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/ini v1.3.16 // indirect
+	github.com/aws/aws-sdk-go-v2/service/cloudcontrol v1.10.5 // indirect
+	github.com/aws/aws-sdk-go-v2/service/cloudformation v1.22.1 // indirect
+	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.9 // indirect
+	github.com/aws/aws-sdk-go-v2/service/sso v1.11.13 // indirect
+	github.com/aws/aws-sdk-go-v2/service/sts v1.16.10 // indirect
+	github.com/aws/smithy-go v1.12.0 // indirect
 	github.com/benbjohnson/clock v1.1.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cespare/xxhash/v2 v2.1.2 // indirect
@@ -161,6 +174,15 @@ require (
 	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
 	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
 	github.com/xeipuuv/gojsonschema v1.2.0 // indirect
+	github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect
+	github.com/tidwall/gjson v1.14.0 // indirect
+	github.com/tidwall/match v1.1.1 // indirect
+	github.com/tidwall/pretty v1.2.0 // indirect
+	github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 // indirect
+	github.com/wI2L/jsondiff v0.2.0 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.0.2 // indirect
+	github.com/xdg-go/stringprep v1.0.2 // indirect
 	github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
 	go.etcd.io/bbolt v1.3.6 // indirect
 	go.etcd.io/etcd/api/v3 v3.5.2 // indirect
diff --git a/go.sum b/go.sum
index f757ca796..9192993fa 100644
--- a/go.sum
+++ b/go.sum
@@ -214,6 +214,32 @@ github.com/aws/aws-sdk-go v1.40.14/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm
 github.com/aws/aws-sdk-go v1.44.98 h1:fX+NxebSdO/9T6DTNOLhpC+Vv6RNkKRfsMg0a7o/yBo=
 github.com/aws/aws-sdk-go v1.44.98/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
 github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
+github.com/aws/aws-sdk-go-v2 v1.16.8 h1:gOe9UPR98XSf7oEJCcojYg+N2/jCRm4DdeIsP85pIyQ=
+github.com/aws/aws-sdk-go-v2 v1.16.8/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw=
+github.com/aws/aws-sdk-go-v2/config v1.15.15 h1:yBV+J7Au5KZwOIrIYhYkTGJbifZPCkAnCFSvGsF3ui8=
+github.com/aws/aws-sdk-go-v2/config v1.15.15/go.mod h1:A1Lzyy/o21I5/s2FbyX5AevQfSVXpvvIDCoVFD0BC4E=
+github.com/aws/aws-sdk-go-v2/credentials v1.12.10 h1:7gGcMQePejwiKoDWjB9cWnpfVdnz/e5JwJFuT6OrroI=
+github.com/aws/aws-sdk-go-v2/credentials v1.12.10/go.mod h1:g5eIM5XRs/OzIIK81QMBl+dAuDyoLN0VYaLP+tBqEOk=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.9 h1:hz8tc+OW17YqxyFFPSkvfSikbqWcyyHRyPVSTzC0+aI=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.9/go.mod h1:KDCCm4ONIdHtUloDcFvK2+vshZvx4Zmj7UMDfusuz5s=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15 h1:bx5F2mr6H6FC7zNIQoDoUr8wEKnvmwRncujT3FYRtic=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15/go.mod h1:pWrr2OoHlT7M/Pd2y4HV3gJyPb3qj5qMmnPkKSNPYK4=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9 h1:5sbyznZC2TeFpa4fvtpvpcGbzeXEEs1l1Jo51ynUNsQ=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9/go.mod h1:08tUpeSGN33QKSO7fwxXczNfiwCpbj+GxK6XKwqWVv0=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.16 h1:f0ySVcmQhwmzn7zQozd8wBM3yuGBfzdpsOaKQ0/Epzw=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.16/go.mod h1:CYmI+7x03jjJih8kBEEFKRQc40UjUokT0k7GbvrhhTc=
+github.com/aws/aws-sdk-go-v2/service/cloudcontrol v1.10.5 h1:oowT4OaCaZ/UnT58mXBQNI9jAlK9rXpS75mt5nKS4Zc=
+github.com/aws/aws-sdk-go-v2/service/cloudcontrol v1.10.5/go.mod h1:PmZPH623WkCp2CBnYR20VyqcBjLDKz0SPgV6oNpWtmU=
+github.com/aws/aws-sdk-go-v2/service/cloudformation v1.22.1 h1:X+voZSfVBi9cxGnQHLcoibxrFoVgTRMuVMsLmZa2BwI=
+github.com/aws/aws-sdk-go-v2/service/cloudformation v1.22.1/go.mod h1:mlxlLLml+RCyZAzVUlSmpwa33vH3EOjU/ptTnkiTwow=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.9 h1:sHfDuhbOuuWSIAEDd3pma6p0JgUcR2iePxtCE8gfCxQ=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.9/go.mod h1:yQowTpvdZkFVuHrLBXmczat4W+WJKg/PafBZnGBLga0=
+github.com/aws/aws-sdk-go-v2/service/sso v1.11.13 h1:DQpf+al+aWozOEmVEdml67qkVZ6vdtGUi71BZZWw40k=
+github.com/aws/aws-sdk-go-v2/service/sso v1.11.13/go.mod h1:d7ptRksDDgvXaUvxyHZ9SYh+iMDymm94JbVcgvSYSzU=
+github.com/aws/aws-sdk-go-v2/service/sts v1.16.10 h1:7tquJrhjYz2EsCBvA9VTl+sBAAh1bv7h/sGASdZOGGo=
+github.com/aws/aws-sdk-go-v2/service/sts v1.16.10/go.mod h1:cftkHYN6tCDNfkSasAmclSfl4l7cySoay8vz7p/ce0E=
+github.com/aws/smithy-go v1.12.0 h1:gXpeZel/jPoWQ7OEmLIgCUnhkFftqNfwWUwAHSlp1v0=
+github.com/aws/smithy-go v1.12.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
 github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -797,6 +823,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
@@ -1478,8 +1506,16 @@ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG
 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
+github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c h1:HelZ2kAFadG0La9d+4htN4HzQ68Bm2iM9qKMSMES6xg=
+github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c/go.mod h1:JlzghshsemAMDGZLytTFY8C1JQxQPhnatWqNwUXjggo=
+github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w=
+github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
@@ -1505,6 +1541,8 @@ github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:tw
 github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
 github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
 github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
+github.com/wI2L/jsondiff v0.2.0 h1:dE00WemBa1uCjrzQUUTE/17I6m5qAaN0EMFOg2Ynr/k=
+github.com/wI2L/jsondiff v0.2.0/go.mod h1:axTcwtBkY4TsKuV+RgoMhHyHKKFRI6nnjRLi8LLYQnA=
 github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
 github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
diff --git a/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.json b/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.json
index e7fc8ae20..6dab1f317 100644
--- a/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.json
+++ b/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.json
@@ -1 +1 @@
-[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Connector/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":22,"Flags":1,"Description":"MongoDatabase connector properties"},"tags":{"Type":35,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":16,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":21,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[12,13,14,15]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[17,18,19,20]}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"secrets":{"Type":23,"Flags":4,"Description":"The secret values for the given MongoDatabase resource"},"provisioningState":{"Type":31,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"resource":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID of a supported resource with Mongo API to use for this connector"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":2,"Description":"Database name of the target Mongo database"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"username":{"Type":4,"Flags":4,"Description":"Username to use when connecting to the target Mongo database"},"password":{"Type":4,"Flags":4,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":4,"Description":"Connection string used to connect to the target Mongo database"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[24,25,26,27,28,29,30]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":34,"Flags":0,"Description":"Array of AnyObject"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Connector/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":37,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":38,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":40,"Flags":1,"Description":"DaprPubSubBroker connector properties"},"tags":{"Type":53,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"7":{"Name":"DaprPubSubBrokerProperties","Discriminator":"kind","BaseProperties":{"provisioningState":{"Type":48,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"environment":{"Type":4,"Flags":1,"Description":"The resource id of the environment linked to the daprPubSubBroker connector"},"topic":{"Type":4,"Flags":0,"Description":"Topic name of the Azure ServiceBus resource"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}},"Elements":{"generic":49,"pubsub.azure.servicebus":51}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[41,42,43,44,45,46,47]}},{"2":{"Name":"DaprPubSubGenericResourceProperties","Properties":{"metadata":{"Type":0,"Flags":1,"Description":"Any object"},"type":{"Type":4,"Flags":1,"Description":"Dapr PubSub type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":1,"Description":"Dapr component version"},"kind":{"Type":50,"Flags":1,"Description":"The DaprPubSubProperties kind"}}}},{"6":{"Value":"generic"}},{"2":{"Name":"DaprPubSubAzureServiceBusResourceProperties","Properties":{"resource":{"Type":4,"Flags":1,"Description":"PubSub resource"},"kind":{"Type":52,"Flags":1,"Description":"The DaprPubSubProperties kind"}}}},{"6":{"Value":"pubsub.azure.servicebus"}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":39}},{"6":{"Value":"Applications.Connector/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":55,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":56,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":58,"Flags":1,"Description":"SQLDatabse connector properties"},"tags":{"Type":67,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"SQLDatabaseProperties","Properties":{"provisioningState":{"Type":66,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"The resource id of the environment linked to the sqlDatabase connector"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"resource":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID of a supported resource with SQL API to use for this connector"},"database":{"Type":4,"Flags":0,"Description":"The name of the SQL database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the SQL database."},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[59,60,61,62,63,64,65]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":57}},{"6":{"Value":"Applications.Connector/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":69,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":70,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":72,"Flags":1,"Description":"RedisCache connector properties"},"tags":{"Type":82,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"secrets":{"Type":73,"Flags":4,"Description":"The secret values for the given RedisCache resource"},"provisioningState":{"Type":81,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"resource":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID of a supported resource with Redis API to use for this connector"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target redis cache"},"username":{"Type":4,"Flags":2,"Description":"The username for redis"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":4,"Description":"The connection string used to connect to the redis cache"},"password":{"Type":4,"Flags":4,"Description":"The password for this Redis instance"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[74,75,76,77,78,79,80]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":71}},{"6":{"Value":"Applications.Connector/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":84,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":85,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":87,"Flags":1,"Description":"RabbitMQMessageQueue connector properties"},"tags":{"Type":97,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"secrets":{"Type":88,"Flags":4,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"provisioningState":{"Type":96,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"queue":{"Type":4,"Flags":1,"Description":"The name of the queue"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":4,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[89,90,91,92,93,94,95]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":86}},{"6":{"Value":"Applications.Connector/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":99,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":100,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":102,"Flags":1,"Description":"DaprSecretStore connector properties"},"tags":{"Type":112,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":110,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"kind":{"Type":111,"Flags":1,"Description":"Radius kind for Dapr Secret Store"},"type":{"Type":4,"Flags":1,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":1,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":1,"Description":"Any object"},"secretStoreName":{"Type":4,"Flags":2,"Description":"The name of the Dapr Secret Store."},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[103,104,105,106,107,108,109]}},{"6":{"Value":"generic"}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":101}},{"6":{"Value":"Applications.Connector/daprInvokeHttpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprInvokeHttpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":114,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":115,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":117,"Flags":1,"Description":"DaprInvokeHttpRoute connector properties"},"tags":{"Type":126,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"DaprInvokeHttpRouteProperties","Properties":{"provisioningState":{"Type":125,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId used for the route"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[118,119,120,121,122,123,124]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprInvokeHttpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":116}},{"6":{"Value":"Applications.Connector/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":128,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":129,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":131,"Flags":1,"Description":"DaprStateStore connector properties"},"tags":{"Type":146,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"7":{"Name":"DaprStateStoreProperties","Discriminator":"kind","BaseProperties":{"provisioningState":{"Type":139,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"stateStoreName":{"Type":4,"Flags":2,"Description":"The name of the Dapr State Store"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}},"Elements":{"generic":140,"state.azure.tablestorage":142,"state.sqlserver":144}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[132,133,134,135,136,137,138]}},{"2":{"Name":"DaprStateStoreGenericResourceProperties","Properties":{"metadata":{"Type":0,"Flags":1,"Description":"Any object"},"type":{"Type":4,"Flags":1,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":1,"Description":"Dapr component version"},"kind":{"Type":141,"Flags":1,"Description":"The Dapr StateStore kind"}}}},{"6":{"Value":"generic"}},{"2":{"Name":"DaprStateStoreAzureTableStorageResourceProperties","Properties":{"resource":{"Type":4,"Flags":1,"Description":"The resource id of the Azure Storage Table the daprStateStore resource is connected to."},"kind":{"Type":143,"Flags":1,"Description":"The Dapr StateStore kind"}}}},{"6":{"Value":"state.azure.tablestorage"}},{"2":{"Name":"DaprStateStoreSqlServerResourceProperties","Properties":{"resource":{"Type":4,"Flags":1,"Description":"The resource id of the Azure SQL Database the daprStateStore resource is connected to."},"kind":{"Type":145,"Flags":1,"Description":"The Dapr StateStore kind"}}}},{"6":{"Value":"state.sqlserver"}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":130}},{"6":{"Value":"Applications.Connector/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":148,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":149,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":151,"Flags":1,"Description":"Extender connector properties"},"tags":{"Type":161,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":152,"Flags":4,"Description":"The secret values for the given Extender resource"},"provisioningState":{"Type":160,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[153,154,155,156,157,158,159]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":150}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":23}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":73}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":88}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/extenders","ApiVersion":"2022-03-15-privatepreview","Output":166}}]
\ No newline at end of file
+[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Connector/mongoDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/mongoDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":22,"Flags":1,"Description":"MongoDatabase connector properties"},"tags":{"Type":35,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":16,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":21,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[12,13,14,15]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[17,18,19,20]}},{"2":{"Name":"MongoDatabaseProperties","Properties":{"secrets":{"Type":23,"Flags":4,"Description":"The secret values for the given MongoDatabase resource"},"provisioningState":{"Type":31,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"resource":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID of a supported resource with Mongo API to use for this connector"},"host":{"Type":4,"Flags":0,"Description":"Host name of the target Mongo database"},"port":{"Type":3,"Flags":0,"Description":"Port value of the target Mongo database"},"database":{"Type":4,"Flags":2,"Description":"Database name of the target Mongo database"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"2":{"Name":"MongoDatabaseSecrets","Properties":{"username":{"Type":4,"Flags":4,"Description":"Username to use when connecting to the target Mongo database"},"password":{"Type":4,"Flags":4,"Description":"Password to use when connecting to the target Mongo database"},"connectionString":{"Type":4,"Flags":4,"Description":"Connection string used to connect to the target Mongo database"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[24,25,26,27,28,29,30]}},{"2":{"Name":"Recipe","Properties":{"name":{"Type":4,"Flags":1,"Description":"The name of the recipe within the environment to use"},"parameters":{"Type":0,"Flags":0,"Description":"Any object"}}}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":34,"Flags":0,"Description":"Array of AnyObject"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/mongoDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Connector/daprPubSubBrokers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprPubSubBrokers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":37,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":38,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":40,"Flags":1,"Description":"DaprPubSubBroker connector properties"},"tags":{"Type":53,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"7":{"Name":"DaprPubSubBrokerProperties","Discriminator":"kind","BaseProperties":{"provisioningState":{"Type":48,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"environment":{"Type":4,"Flags":1,"Description":"The resource id of the environment linked to the daprPubSubBroker connector"},"topic":{"Type":4,"Flags":0,"Description":"Topic name of the Azure ServiceBus resource"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."}},"Elements":{"generic":49,"pubsub.azure.servicebus":51}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[41,42,43,44,45,46,47]}},{"2":{"Name":"DaprPubSubGenericResourceProperties","Properties":{"metadata":{"Type":0,"Flags":1,"Description":"Any object"},"type":{"Type":4,"Flags":1,"Description":"Dapr PubSub type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":1,"Description":"Dapr component version"},"kind":{"Type":50,"Flags":1,"Description":"The DaprPubSubProperties kind"}}}},{"6":{"Value":"generic"}},{"2":{"Name":"DaprPubSubAzureServiceBusResourceProperties","Properties":{"resource":{"Type":4,"Flags":1,"Description":"PubSub resource"},"kind":{"Type":52,"Flags":1,"Description":"The DaprPubSubProperties kind"}}}},{"6":{"Value":"pubsub.azure.servicebus"}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprPubSubBrokers@2022-03-15-privatepreview","ScopeType":0,"Body":39}},{"6":{"Value":"Applications.Connector/sqlDatabases"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/sqlDatabases","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":55,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":56,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":58,"Flags":1,"Description":"SQLDatabse connector properties"},"tags":{"Type":67,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"SQLDatabaseProperties","Properties":{"provisioningState":{"Type":66,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"The resource id of the environment linked to the sqlDatabase connector"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"resource":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID of a supported resource with SQL API to use for this connector"},"database":{"Type":4,"Flags":0,"Description":"The name of the SQL database."},"server":{"Type":4,"Flags":0,"Description":"The fully qualified domain name of the SQL database."},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[59,60,61,62,63,64,65]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/sqlDatabases@2022-03-15-privatepreview","ScopeType":0,"Body":57}},{"6":{"Value":"Applications.Connector/redisCaches"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/redisCaches","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":69,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":70,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":72,"Flags":1,"Description":"RedisCache connector properties"},"tags":{"Type":82,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"RedisCacheProperties","Properties":{"secrets":{"Type":73,"Flags":4,"Description":"The secret values for the given RedisCache resource"},"provisioningState":{"Type":81,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"resource":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID of a supported resource with Redis API to use for this connector"},"host":{"Type":4,"Flags":0,"Description":"The host name of the target redis cache"},"port":{"Type":3,"Flags":0,"Description":"The port value of the target redis cache"},"username":{"Type":4,"Flags":2,"Description":"The username for redis"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"2":{"Name":"RedisCacheSecrets","Properties":{"connectionString":{"Type":4,"Flags":4,"Description":"The connection string used to connect to the redis cache"},"password":{"Type":4,"Flags":4,"Description":"The password for this Redis instance"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[74,75,76,77,78,79,80]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/redisCaches@2022-03-15-privatepreview","ScopeType":0,"Body":71}},{"6":{"Value":"Applications.Connector/rabbitMQMessageQueues"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/rabbitMQMessageQueues","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":84,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":85,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":87,"Flags":1,"Description":"RabbitMQMessageQueue connector properties"},"tags":{"Type":97,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"RabbitMQMessageQueueProperties","Properties":{"secrets":{"Type":88,"Flags":4,"Description":"The secret values for the given RabbitMQMessageQueue resource"},"provisioningState":{"Type":96,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"queue":{"Type":4,"Flags":1,"Description":"The name of the queue"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"2":{"Name":"RabbitMQSecrets","Properties":{"connectionString":{"Type":4,"Flags":4,"Description":"The connection string used to connect to this RabbitMQ instance"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[89,90,91,92,93,94,95]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/rabbitMQMessageQueues@2022-03-15-privatepreview","ScopeType":0,"Body":86}},{"6":{"Value":"Applications.Connector/daprSecretStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprSecretStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":99,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":100,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":102,"Flags":1,"Description":"DaprSecretStore connector properties"},"tags":{"Type":112,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"DaprSecretStoreProperties","Properties":{"provisioningState":{"Type":110,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"kind":{"Type":111,"Flags":1,"Description":"Radius kind for Dapr Secret Store"},"type":{"Type":4,"Flags":1,"Description":"Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/"},"version":{"Type":4,"Flags":1,"Description":"Dapr component version"},"metadata":{"Type":0,"Flags":1,"Description":"Any object"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[103,104,105,106,107,108,109]}},{"6":{"Value":"generic"}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprSecretStores@2022-03-15-privatepreview","ScopeType":0,"Body":101}},{"6":{"Value":"Applications.Connector/daprInvokeHttpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprInvokeHttpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":114,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":115,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":117,"Flags":1,"Description":"DaprInvokeHttpRoute connector properties"},"tags":{"Type":126,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"DaprInvokeHttpRouteProperties","Properties":{"provisioningState":{"Type":125,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId used for the route"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[118,119,120,121,122,123,124]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprInvokeHttpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":116}},{"6":{"Value":"Applications.Connector/daprStateStores"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/daprStateStores","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":128,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":129,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":131,"Flags":1,"Description":"DaprStateStore connector properties"},"tags":{"Type":146,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"7":{"Name":"DaprStateStoreProperties","Discriminator":"kind","BaseProperties":{"provisioningState":{"Type":139,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"recipe":{"Type":32,"Flags":0,"Description":"The recipe used to automatically deploy underlying infrastructure for a connector"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."},"componentName":{"Type":4,"Flags":2,"Description":"The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component."}},"Elements":{"generic":140,"state.azure.tablestorage":142,"state.sqlserver":144}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[132,133,134,135,136,137,138]}},{"2":{"Name":"DaprStateStoreGenericResourceProperties","Properties":{"metadata":{"Type":0,"Flags":1,"Description":"Any object"},"type":{"Type":4,"Flags":1,"Description":"Dapr StateStore type. These strings match the format used by Dapr Kubernetes configuration format."},"version":{"Type":4,"Flags":1,"Description":"Dapr component version"},"kind":{"Type":141,"Flags":1,"Description":"The Dapr StateStore kind"}}}},{"6":{"Value":"generic"}},{"2":{"Name":"DaprStateStoreAzureTableStorageResourceProperties","Properties":{"resource":{"Type":4,"Flags":1,"Description":"The resource id of the Azure Storage Table the daprStateStore resource is connected to."},"kind":{"Type":143,"Flags":1,"Description":"The Dapr StateStore kind"}}}},{"6":{"Value":"state.azure.tablestorage"}},{"2":{"Name":"DaprStateStoreSqlServerResourceProperties","Properties":{"resource":{"Type":4,"Flags":1,"Description":"The resource id of the Azure SQL Database the daprStateStore resource is connected to."},"kind":{"Type":145,"Flags":1,"Description":"The Dapr StateStore kind"}}}},{"6":{"Value":"state.sqlserver"}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/daprStateStores@2022-03-15-privatepreview","ScopeType":0,"Body":130}},{"6":{"Value":"Applications.Connector/extenders"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Connector/extenders","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":148,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":149,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":151,"Flags":1,"Description":"Extender connector properties"},"tags":{"Type":161,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"ExtenderProperties","Properties":{"secrets":{"Type":152,"Flags":4,"Description":"The secret values for the given Extender resource"},"provisioningState":{"Type":160,"Flags":2,"Description":"Provisioning state of the connector at the time the operation was called"},"environment":{"Type":4,"Flags":1,"Description":"Fully qualified resource ID for the environment that the connector is linked to"},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the connector is consumed by"},"status":{"Type":33,"Flags":2,"Description":"Status of a resource."}},"AdditionalProperties":0}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[153,154,155,156,157,158,159]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Connector/extenders@2022-03-15-privatepreview","ScopeType":0,"Body":150}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/mongoDatabases","ApiVersion":"2022-03-15-privatepreview","Output":23}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/redisCaches","ApiVersion":"2022-03-15-privatepreview","Output":73}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/rabbitMQMessageQueues","ApiVersion":"2022-03-15-privatepreview","Output":88}},{"2":{"Name":"ExtenderSecrets","Properties":{},"AdditionalProperties":0}},{"8":{"Name":"listSecrets","ResourceType":"Applications.Connector/extenders","ApiVersion":"2022-03-15-privatepreview","Output":166}}]
\ No newline at end of file
diff --git a/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.md b/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.md
index a09ab4e3f..70d35bd4a 100644
--- a/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.md
+++ b/hack/bicep-types-radius/generated/applications/applications.connector/2022-03-15-privatepreview/types.md
@@ -165,6 +165,7 @@
 
 ### Base Properties
 * **application**: string: Fully qualified resource ID for the application that the connector is consumed by
+* **componentName**: string (ReadOnly): The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component.
 * **environment**: string (Required): The resource id of the environment linked to the daprPubSubBroker connector
 * **provisioningState**: 'Accepted' | 'Canceled' | 'Deleting' | 'Failed' | 'Provisioning' | 'Succeeded' | 'Updating' (ReadOnly): Provisioning state of the connector at the time the operation was called
 * **recipe**: [Recipe](#recipe): The recipe used to automatically deploy underlying infrastructure for a connector
@@ -191,12 +192,12 @@
 ## DaprSecretStoreProperties
 ### Properties
 * **application**: string: Fully qualified resource ID for the application that the connector is consumed by
+* **componentName**: string (ReadOnly): The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component.
 * **environment**: string (Required): Fully qualified resource ID for the environment that the connector is linked to
 * **kind**: 'generic' (Required): Radius kind for Dapr Secret Store
 * **metadata**: any (Required): Any object
 * **provisioningState**: 'Accepted' | 'Canceled' | 'Deleting' | 'Failed' | 'Provisioning' | 'Succeeded' | 'Updating' (ReadOnly): Provisioning state of the connector at the time the operation was called
 * **recipe**: [Recipe](#recipe): The recipe used to automatically deploy underlying infrastructure for a connector
-* **secretStoreName**: string (ReadOnly): The name of the Dapr Secret Store.
 * **status**: [ResourceStatus](#resourcestatus) (ReadOnly): Status of a resource.
 * **type**: string (Required): Dapr Secret Store type. These strings match the types defined in Dapr Component format: https://docs.dapr.io/reference/components-reference/supported-secret-stores/
 * **version**: string (Required): Dapr component version
@@ -211,10 +212,10 @@
 
 ### Base Properties
 * **application**: string: Fully qualified resource ID for the application that the connector is consumed by
+* **componentName**: string (ReadOnly): The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component.
 * **environment**: string (Required): Fully qualified resource ID for the environment that the connector is linked to
 * **provisioningState**: 'Accepted' | 'Canceled' | 'Deleting' | 'Failed' | 'Provisioning' | 'Succeeded' | 'Updating' (ReadOnly): Provisioning state of the connector at the time the operation was called
 * **recipe**: [Recipe](#recipe): The recipe used to automatically deploy underlying infrastructure for a connector
-* **stateStoreName**: string (ReadOnly): The name of the Dapr State Store
 * **status**: [ResourceStatus](#resourcestatus) (ReadOnly): Status of a resource.
 ### DaprStateStoreGenericResourceProperties
 #### Properties
diff --git a/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.json b/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.json
index 5211e5ae2..c875ae124 100644
--- a/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.json
+++ b/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.json
@@ -1 +1 @@
-[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Core/environments"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/environments","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":22,"Flags":1,"Description":"Application environment properties"},"tags":{"Type":36,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":16,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":21,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[12,13,14,15]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[17,18,19,20]}},{"2":{"Name":"EnvironmentProperties","Properties":{"provisioningState":{"Type":30,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"compute":{"Type":31,"Flags":1,"Description":"Compute resource used by application environment resource."},"recipes":{"Type":35,"Flags":0,"Description":"Dictionary of <EnvironmentRecipeProperties>"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[23,24,25,26,27,28,29]}},{"7":{"Name":"EnvironmentCompute","Discriminator":"kind","BaseProperties":{"resourceId":{"Type":4,"Flags":0,"Description":"The resource id of the compute resource for application environment."}},"Elements":{"kubernetes":32}}},{"2":{"Name":"KubernetesCompute","Properties":{"namespace":{"Type":4,"Flags":1,"Description":"The namespace to use for the environment."},"kind":{"Type":33,"Flags":1,"Description":"Type of compute resource."}}}},{"6":{"Value":"kubernetes"}},{"2":{"Name":"EnvironmentRecipeProperties","Properties":{"connectorType":{"Type":4,"Flags":1,"Description":"Type of the connector this recipe can be consumed by. For example: 'Applications.Connector/mongoDatabases'"},"templatePath":{"Type":4,"Flags":1,"Description":"Path to the template provided by the recipe. Currently only link to Azure Container Registry is supported."}}}},{"2":{"Name":"EnvironmentPropertiesRecipes","Properties":{},"AdditionalProperties":34}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/environments@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Core/applications"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/applications","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":38,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":39,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":41,"Flags":1,"Description":"Application properties"},"tags":{"Type":50,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"ApplicationProperties","Properties":{"provisioningState":{"Type":49,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"environment":{"Type":4,"Flags":1,"Description":"The resource id of the environment linked to application."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[42,43,44,45,46,47,48]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/applications@2022-03-15-privatepreview","ScopeType":0,"Body":40}},{"6":{"Value":"Applications.Core/httpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/httpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":52,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":53,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":55,"Flags":1,"Description":"HTTP Route properties"},"tags":{"Type":66,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"HttpRouteProperties","Properties":{"provisioningState":{"Type":63,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"application":{"Type":4,"Flags":1,"Description":"The resource id of the application linked to HTTP Route resource."},"hostname":{"Type":4,"Flags":0,"Description":"The internal hostname accepting traffic for the HTTP Route. Readonly."},"port":{"Type":3,"Flags":0,"Description":"The port number for the HTTP Route. Defaults to 80. Readonly."},"scheme":{"Type":4,"Flags":0,"Description":"The scheme used for traffic. Readonly."},"url":{"Type":4,"Flags":0,"Description":"A stable URL that that can be used to route traffic to a resource. Readonly."},"status":{"Type":64,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[56,57,58,59,60,61,62]}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":65,"Flags":0,"Description":"Array of AnyObject"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/httpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":54}},{"6":{"Value":"Applications.Core/gateways"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/gateways","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":68,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":69,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":71,"Flags":1,"Description":"Gateway properties"},"tags":{"Type":83,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"GatewayProperties","Properties":{"provisioningState":{"Type":79,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"application":{"Type":4,"Flags":1,"Description":"The resource id of the application linked to Gateway resource."},"internal":{"Type":2,"Flags":0,"Description":"Sets Gateway to not be exposed externally (no public IP address associated). Defaults to false (exposed to internet)."},"hostname":{"Type":80,"Flags":0,"Description":"Declare hostname information for the Gateway. Leaving the hostname empty auto-assigns one: mygateway.myapp.PUBLICHOSTNAMEORIP.nip.io."},"routes":{"Type":82,"Flags":1,"Description":"Routes attached to this Gateway"},"url":{"Type":4,"Flags":2,"Description":"URL of the gateway resource. Readonly."},"status":{"Type":64,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[72,73,74,75,76,77,78]}},{"2":{"Name":"GatewayPropertiesHostname","Properties":{"prefix":{"Type":4,"Flags":0,"Description":"Specify a prefix for the hostname: myhostname.myapp.PUBLICHOSTNAMEORIP.nip.io. Mutually exclusive with 'fullyQualifiedHostname' and will be overridden if both are defined."},"fullyQualifiedHostname":{"Type":4,"Flags":0,"Description":"Specify a fully-qualified domain name: myapp.mydomain.com. Mutually exclusive with 'prefix' and will take priority if both are defined."}}}},{"2":{"Name":"GatewayRoute","Properties":{"path":{"Type":4,"Flags":0,"Description":"The path to match the incoming request path on. Ex - /myservice."},"destination":{"Type":4,"Flags":0,"Description":"The HttpRoute to route to. Ex - myserviceroute.id."},"replacePrefix":{"Type":4,"Flags":0,"Description":"Optionally update the prefix when sending the request to the service. Ex - replacePrefix: '/' and path: '/myservice' will transform '/myservice/myroute' to '/myroute'"}}}},{"3":{"ItemType":81}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/gateways@2022-03-15-privatepreview","ScopeType":0,"Body":70}},{"6":{"Value":"Applications.Core/containers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/containers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":85,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":86,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":88,"Flags":1,"Description":"Container properties"},"tags":{"Type":142,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"ContainerProperties","Properties":{"provisioningState":{"Type":96,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"application":{"Type":4,"Flags":1,"Description":"Specifies resource id of the application"},"connections":{"Type":101,"Flags":0,"Description":"Dictionary of <ConnectionProperties>"},"container":{"Type":102,"Flags":1,"Description":"Definition of a container."},"extensions":{"Type":141,"Flags":0,"Description":"Extensions spec of the resource"},"status":{"Type":64,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[89,90,91,92,93,94,95]}},{"2":{"Name":"ConnectionProperties","Properties":{"source":{"Type":4,"Flags":1,"Description":"The source of the connection"},"disableDefaultEnvVars":{"Type":2,"Flags":0},"iam":{"Type":98,"Flags":0}}}},{"2":{"Name":"IamProperties","Properties":{"kind":{"Type":99,"Flags":1,"Description":"The kind of IAM provider to configure"},"roles":{"Type":100,"Flags":0,"Description":"RBAC permissions to be assigned on the source resource"}}}},{"6":{"Value":"azure"}},{"3":{"ItemType":4}},{"2":{"Name":"ContainerPropertiesConnections","Properties":{},"AdditionalProperties":97}},{"2":{"Name":"Container","Properties":{"image":{"Type":4,"Flags":1,"Description":"The registry and image to download and run in your container"},"env":{"Type":103,"Flags":0,"Description":"Dictionary of <string>"},"ports":{"Type":110,"Flags":0,"Description":"Dictionary of <ContainerPort>"},"readinessProbe":{"Type":111,"Flags":0,"Description":"Properties for readiness/liveness probe"},"livenessProbe":{"Type":111,"Flags":0,"Description":"Properties for readiness/liveness probe"},"volumes":{"Type":130,"Flags":0,"Description":"Dictionary of <Volume>"}}}},{"2":{"Name":"ContainerEnv","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"ContainerPort","Properties":{"containerPort":{"Type":3,"Flags":1,"Description":"The listening port number"},"protocol":{"Type":109,"Flags":0,"Description":"Protocol in use by the port"},"provides":{"Type":4,"Flags":0,"Description":"Specifies a route provided by this port"}}}},{"6":{"Value":"TCP"}},{"6":{"Value":"UDP"}},{"6":{"Value":"http"}},{"6":{"Value":"grpc"}},{"5":{"Elements":[105,106,107,108]}},{"2":{"Name":"ContainerPorts","Properties":{},"AdditionalProperties":104}},{"7":{"Name":"HealthProbeProperties","Discriminator":"kind","BaseProperties":{"initialDelaySeconds":{"Type":3,"Flags":0,"Description":"Initial delay in seconds before probing for readiness/liveness"},"failureThreshold":{"Type":3,"Flags":0,"Description":"Threshold number of times the probe fails after which a failure would be reported"},"periodSeconds":{"Type":3,"Flags":0,"Description":"Interval for the readiness/liveness probe in seconds"}},"Elements":{"exec":112,"httpGet":114,"tcp":117}}},{"2":{"Name":"ExecHealthProbeProperties","Properties":{"command":{"Type":4,"Flags":1,"Description":"Command to execute to probe readiness/liveness"},"kind":{"Type":113,"Flags":1,"Description":"The HealthProbeProperties kind"}}}},{"6":{"Value":"exec"}},{"2":{"Name":"HttpGetHealthProbeProperties","Properties":{"containerPort":{"Type":3,"Flags":1,"Description":"The listening port number"},"path":{"Type":4,"Flags":1,"Description":"The route to make the HTTP request on"},"headers":{"Type":115,"Flags":0,"Description":"Custom HTTP headers to add to the get request"},"kind":{"Type":116,"Flags":1,"Description":"The HealthProbeProperties kind"}}}},{"2":{"Name":"HttpGetHealthProbePropertiesHeaders","Properties":{},"AdditionalProperties":4}},{"6":{"Value":"httpGet"}},{"2":{"Name":"TcpHealthProbeProperties","Properties":{"containerPort":{"Type":3,"Flags":1,"Description":"The listening port number"},"kind":{"Type":118,"Flags":1,"Description":"The HealthProbeProperties kind"}}}},{"6":{"Value":"tcp"}},{"7":{"Name":"Volume","Discriminator":"kind","BaseProperties":{"mountPath":{"Type":4,"Flags":0,"Description":"The path where the volume is mounted"}},"Elements":{"ephemeral":120,"persistent":125}}},{"2":{"Name":"EphemeralVolume","Properties":{"managedStore":{"Type":123,"Flags":1,"Description":"Backing store for the ephemeral volume"},"kind":{"Type":124,"Flags":1,"Description":"The Volume kind"}}}},{"6":{"Value":"memory"}},{"6":{"Value":"disk"}},{"5":{"Elements":[121,122]}},{"6":{"Value":"ephemeral"}},{"2":{"Name":"PersistentVolume","Properties":{"rbac":{"Type":128,"Flags":0,"Description":"Container read/write access to the volume"},"source":{"Type":4,"Flags":1,"Description":"The source of the volume"},"kind":{"Type":129,"Flags":1,"Description":"The Volume kind"}}}},{"6":{"Value":"read"}},{"6":{"Value":"write"}},{"5":{"Elements":[126,127]}},{"6":{"Value":"persistent"}},{"2":{"Name":"ContainerVolumes","Properties":{},"AdditionalProperties":119}},{"7":{"Name":"Extension","Discriminator":"kind","BaseProperties":{},"Elements":{"daprSidecar":132,"manualScaling":139}}},{"2":{"Name":"DaprSidecarExtension","Properties":{"appPort":{"Type":3,"Flags":0,"Description":"The Dapr appPort. Specifies the internal listening port for the application to handle requests from the Dapr sidecar."},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId. Specifies the identifier used by Dapr for service invocation."},"config":{"Type":4,"Flags":0,"Description":"Specifies the Dapr configuration to use for the resource."},"protocol":{"Type":137,"Flags":0,"Description":"Protocol in use by the port"},"provides":{"Type":4,"Flags":0,"Description":"Specifies the resource id of a dapr.io.InvokeHttpRoute that can route traffic to this resource."},"kind":{"Type":138,"Flags":1,"Description":"Specifies the extensions of a resource."}}}},{"6":{"Value":"TCP"}},{"6":{"Value":"UDP"}},{"6":{"Value":"http"}},{"6":{"Value":"grpc"}},{"5":{"Elements":[133,134,135,136]}},{"6":{"Value":"daprSidecar"}},{"2":{"Name":"ManualScalingExtension","Properties":{"replicas":{"Type":3,"Flags":0,"Description":"Replica count."},"kind":{"Type":140,"Flags":1,"Description":"Specifies the extensions of a resource."}}}},{"6":{"Value":"manualScaling"}},{"3":{"ItemType":131}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/containers@2022-03-15-privatepreview","ScopeType":0,"Body":87}}]
\ No newline at end of file
+[{"1":{"Kind":1}},{"1":{"Kind":2}},{"1":{"Kind":3}},{"1":{"Kind":4}},{"1":{"Kind":5}},{"1":{"Kind":6}},{"1":{"Kind":7}},{"1":{"Kind":8}},{"6":{"Value":"Applications.Core/environments"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/environments","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":8,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":9,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":22,"Flags":1,"Description":"Application environment properties"},"tags":{"Type":36,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"SystemData","Properties":{"createdBy":{"Type":4,"Flags":0,"Description":"The identity that created the resource."},"createdByType":{"Type":16,"Flags":0,"Description":"The type of identity that created the resource."},"createdAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource creation (UTC)."},"lastModifiedBy":{"Type":4,"Flags":0,"Description":"The identity that last modified the resource."},"lastModifiedByType":{"Type":21,"Flags":0,"Description":"The type of identity that created the resource."},"lastModifiedAt":{"Type":4,"Flags":0,"Description":"The timestamp of resource last modification (UTC)"}}}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[12,13,14,15]}},{"6":{"Value":"User"}},{"6":{"Value":"Application"}},{"6":{"Value":"ManagedIdentity"}},{"6":{"Value":"Key"}},{"5":{"Elements":[17,18,19,20]}},{"2":{"Name":"EnvironmentProperties","Properties":{"provisioningState":{"Type":30,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"compute":{"Type":31,"Flags":1,"Description":"Compute resource used by application environment resource."},"recipes":{"Type":35,"Flags":0,"Description":"Dictionary of <EnvironmentRecipeProperties>"}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[23,24,25,26,27,28,29]}},{"7":{"Name":"EnvironmentCompute","Discriminator":"kind","BaseProperties":{"resourceId":{"Type":4,"Flags":0,"Description":"The resource id of the compute resource for application environment."}},"Elements":{"kubernetes":32}}},{"2":{"Name":"KubernetesCompute","Properties":{"namespace":{"Type":4,"Flags":1,"Description":"The namespace to use for the environment."},"kind":{"Type":33,"Flags":1,"Description":"Type of compute resource."}}}},{"6":{"Value":"kubernetes"}},{"2":{"Name":"EnvironmentRecipeProperties","Properties":{"connectorType":{"Type":4,"Flags":1,"Description":"Type of the connector this recipe can be consumed by. For example: 'Applications.Connector/mongoDatabases'"},"templatePath":{"Type":4,"Flags":1,"Description":"Path to the template provided by the recipe. Currently only link to Azure Container Registry is supported."}}}},{"2":{"Name":"EnvironmentPropertiesRecipes","Properties":{},"AdditionalProperties":34}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/environments@2022-03-15-privatepreview","ScopeType":0,"Body":10}},{"6":{"Value":"Applications.Core/applications"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/applications","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":38,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":39,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":41,"Flags":1,"Description":"Application properties"},"tags":{"Type":50,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"ApplicationProperties","Properties":{"provisioningState":{"Type":49,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"environment":{"Type":4,"Flags":1,"Description":"The resource id of the environment linked to application."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[42,43,44,45,46,47,48]}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/applications@2022-03-15-privatepreview","ScopeType":0,"Body":40}},{"6":{"Value":"Applications.Core/httpRoutes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/httpRoutes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":52,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":53,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":55,"Flags":1,"Description":"HTTP Route properties"},"tags":{"Type":66,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"HttpRouteProperties","Properties":{"provisioningState":{"Type":63,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"application":{"Type":4,"Flags":1,"Description":"The resource id of the application linked to HTTP Route resource."},"hostname":{"Type":4,"Flags":0,"Description":"The internal hostname accepting traffic for the HTTP Route. Readonly."},"port":{"Type":3,"Flags":0,"Description":"The port number for the HTTP Route. Defaults to 80. Readonly."},"scheme":{"Type":4,"Flags":0,"Description":"The scheme used for traffic. Readonly."},"url":{"Type":4,"Flags":0,"Description":"A stable URL that that can be used to route traffic to a resource. Readonly."},"status":{"Type":64,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[56,57,58,59,60,61,62]}},{"2":{"Name":"ResourceStatus","Properties":{"outputResources":{"Type":65,"Flags":0,"Description":"Array of AnyObject"}}}},{"3":{"ItemType":0}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/httpRoutes@2022-03-15-privatepreview","ScopeType":0,"Body":54}},{"6":{"Value":"Applications.Core/gateways"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/gateways","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":68,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":69,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":71,"Flags":1,"Description":"Gateway properties"},"tags":{"Type":83,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"GatewayProperties","Properties":{"provisioningState":{"Type":79,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"application":{"Type":4,"Flags":1,"Description":"The resource id of the application linked to Gateway resource."},"internal":{"Type":2,"Flags":0,"Description":"Sets Gateway to not be exposed externally (no public IP address associated). Defaults to false (exposed to internet)."},"hostname":{"Type":80,"Flags":0,"Description":"Declare hostname information for the Gateway. Leaving the hostname empty auto-assigns one: mygateway.myapp.PUBLICHOSTNAMEORIP.nip.io."},"routes":{"Type":82,"Flags":1,"Description":"Routes attached to this Gateway"},"url":{"Type":4,"Flags":2,"Description":"URL of the gateway resource. Readonly."},"status":{"Type":64,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[72,73,74,75,76,77,78]}},{"2":{"Name":"GatewayPropertiesHostname","Properties":{"prefix":{"Type":4,"Flags":0,"Description":"Specify a prefix for the hostname: myhostname.myapp.PUBLICHOSTNAMEORIP.nip.io. Mutually exclusive with 'fullyQualifiedHostname' and will be overridden if both are defined."},"fullyQualifiedHostname":{"Type":4,"Flags":0,"Description":"Specify a fully-qualified domain name: myapp.mydomain.com. Mutually exclusive with 'prefix' and will take priority if both are defined."}}}},{"2":{"Name":"GatewayRoute","Properties":{"path":{"Type":4,"Flags":0,"Description":"The path to match the incoming request path on. Ex - /myservice."},"destination":{"Type":4,"Flags":0,"Description":"The HttpRoute to route to. Ex - myserviceroute.id."},"replacePrefix":{"Type":4,"Flags":0,"Description":"Optionally update the prefix when sending the request to the service. Ex - replacePrefix: '/' and path: '/myservice' will transform '/myservice/myroute' to '/myroute'"}}}},{"3":{"ItemType":81}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/gateways@2022-03-15-privatepreview","ScopeType":0,"Body":70}},{"6":{"Value":"Applications.Core/containers"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/containers","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":85,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":86,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":88,"Flags":1,"Description":"Container properties"},"tags":{"Type":142,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"2":{"Name":"ContainerProperties","Properties":{"provisioningState":{"Type":96,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"application":{"Type":4,"Flags":1,"Description":"Specifies resource id of the application"},"connections":{"Type":101,"Flags":0,"Description":"Dictionary of <ConnectionProperties>"},"container":{"Type":102,"Flags":1,"Description":"Definition of a container."},"extensions":{"Type":141,"Flags":0,"Description":"Extensions spec of the resource"},"status":{"Type":64,"Flags":2,"Description":"Status of a resource."}}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[89,90,91,92,93,94,95]}},{"2":{"Name":"ConnectionProperties","Properties":{"source":{"Type":4,"Flags":1,"Description":"The source of the connection"},"disableDefaultEnvVars":{"Type":2,"Flags":0},"iam":{"Type":98,"Flags":0}}}},{"2":{"Name":"IamProperties","Properties":{"kind":{"Type":99,"Flags":1,"Description":"The kind of IAM provider to configure"},"roles":{"Type":100,"Flags":0,"Description":"RBAC permissions to be assigned on the source resource"}}}},{"6":{"Value":"azure"}},{"3":{"ItemType":4}},{"2":{"Name":"ContainerPropertiesConnections","Properties":{},"AdditionalProperties":97}},{"2":{"Name":"Container","Properties":{"image":{"Type":4,"Flags":1,"Description":"The registry and image to download and run in your container"},"env":{"Type":103,"Flags":0,"Description":"Dictionary of <string>"},"ports":{"Type":110,"Flags":0,"Description":"Dictionary of <ContainerPort>"},"readinessProbe":{"Type":111,"Flags":0,"Description":"Properties for readiness/liveness probe"},"livenessProbe":{"Type":111,"Flags":0,"Description":"Properties for readiness/liveness probe"},"volumes":{"Type":130,"Flags":0,"Description":"Dictionary of <Volume>"}}}},{"2":{"Name":"ContainerEnv","Properties":{},"AdditionalProperties":4}},{"2":{"Name":"ContainerPort","Properties":{"containerPort":{"Type":3,"Flags":1,"Description":"The listening port number"},"protocol":{"Type":109,"Flags":0,"Description":"Protocol in use by the port"},"provides":{"Type":4,"Flags":0,"Description":"Specifies a route provided by this port"}}}},{"6":{"Value":"TCP"}},{"6":{"Value":"UDP"}},{"6":{"Value":"http"}},{"6":{"Value":"grpc"}},{"5":{"Elements":[105,106,107,108]}},{"2":{"Name":"ContainerPorts","Properties":{},"AdditionalProperties":104}},{"7":{"Name":"HealthProbeProperties","Discriminator":"kind","BaseProperties":{"initialDelaySeconds":{"Type":3,"Flags":0,"Description":"Initial delay in seconds before probing for readiness/liveness"},"failureThreshold":{"Type":3,"Flags":0,"Description":"Threshold number of times the probe fails after which a failure would be reported"},"periodSeconds":{"Type":3,"Flags":0,"Description":"Interval for the readiness/liveness probe in seconds"}},"Elements":{"exec":112,"httpGet":114,"tcp":117}}},{"2":{"Name":"ExecHealthProbeProperties","Properties":{"command":{"Type":4,"Flags":1,"Description":"Command to execute to probe readiness/liveness"},"kind":{"Type":113,"Flags":1,"Description":"The HealthProbeProperties kind"}}}},{"6":{"Value":"exec"}},{"2":{"Name":"HttpGetHealthProbeProperties","Properties":{"containerPort":{"Type":3,"Flags":1,"Description":"The listening port number"},"path":{"Type":4,"Flags":1,"Description":"The route to make the HTTP request on"},"headers":{"Type":115,"Flags":0,"Description":"Custom HTTP headers to add to the get request"},"kind":{"Type":116,"Flags":1,"Description":"The HealthProbeProperties kind"}}}},{"2":{"Name":"HttpGetHealthProbePropertiesHeaders","Properties":{},"AdditionalProperties":4}},{"6":{"Value":"httpGet"}},{"2":{"Name":"TcpHealthProbeProperties","Properties":{"containerPort":{"Type":3,"Flags":1,"Description":"The listening port number"},"kind":{"Type":118,"Flags":1,"Description":"The HealthProbeProperties kind"}}}},{"6":{"Value":"tcp"}},{"7":{"Name":"Volume","Discriminator":"kind","BaseProperties":{"mountPath":{"Type":4,"Flags":0,"Description":"The path where the volume is mounted"}},"Elements":{"ephemeral":120,"persistent":125}}},{"2":{"Name":"EphemeralVolume","Properties":{"managedStore":{"Type":123,"Flags":1,"Description":"Backing store for the ephemeral volume"},"kind":{"Type":124,"Flags":1,"Description":"The Volume kind"}}}},{"6":{"Value":"memory"}},{"6":{"Value":"disk"}},{"5":{"Elements":[121,122]}},{"6":{"Value":"ephemeral"}},{"2":{"Name":"PersistentVolume","Properties":{"rbac":{"Type":128,"Flags":0,"Description":"Container read/write access to the volume"},"source":{"Type":4,"Flags":1,"Description":"The source of the volume"},"kind":{"Type":129,"Flags":1,"Description":"The Volume kind"}}}},{"6":{"Value":"read"}},{"6":{"Value":"write"}},{"5":{"Elements":[126,127]}},{"6":{"Value":"persistent"}},{"2":{"Name":"ContainerVolumes","Properties":{},"AdditionalProperties":119}},{"7":{"Name":"Extension","Discriminator":"kind","BaseProperties":{},"Elements":{"daprSidecar":132,"manualScaling":139}}},{"2":{"Name":"DaprSidecarExtension","Properties":{"appPort":{"Type":3,"Flags":0,"Description":"The Dapr appPort. Specifies the internal listening port for the application to handle requests from the Dapr sidecar."},"appId":{"Type":4,"Flags":1,"Description":"The Dapr appId. Specifies the identifier used by Dapr for service invocation."},"config":{"Type":4,"Flags":0,"Description":"Specifies the Dapr configuration to use for the resource."},"protocol":{"Type":137,"Flags":0,"Description":"Protocol in use by the port"},"provides":{"Type":4,"Flags":0,"Description":"Specifies the resource id of a dapr.io.InvokeHttpRoute that can route traffic to this resource."},"kind":{"Type":138,"Flags":1,"Description":"Specifies the extensions of a resource."}}}},{"6":{"Value":"TCP"}},{"6":{"Value":"UDP"}},{"6":{"Value":"http"}},{"6":{"Value":"grpc"}},{"5":{"Elements":[133,134,135,136]}},{"6":{"Value":"daprSidecar"}},{"2":{"Name":"ManualScalingExtension","Properties":{"replicas":{"Type":3,"Flags":0,"Description":"Replica count."},"kind":{"Type":140,"Flags":1,"Description":"Specifies the extensions of a resource."}}}},{"6":{"Value":"manualScaling"}},{"3":{"ItemType":131}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/containers@2022-03-15-privatepreview","ScopeType":0,"Body":87}},{"6":{"Value":"Applications.Core/volumes"}},{"6":{"Value":"2022-03-15-privatepreview"}},{"2":{"Name":"Applications.Core/volumes","Properties":{"id":{"Type":4,"Flags":10,"Description":"The resource id"},"name":{"Type":4,"Flags":9,"Description":"The resource name"},"type":{"Type":144,"Flags":10,"Description":"The resource type"},"apiVersion":{"Type":145,"Flags":10,"Description":"The resource api version"},"systemData":{"Type":11,"Flags":2,"Description":"Metadata pertaining to creation and last modification of the resource."},"properties":{"Type":147,"Flags":1},"tags":{"Type":179,"Flags":0,"Description":"Resource tags."},"location":{"Type":4,"Flags":1,"Description":"The geo-location where the resource lives"}}}},{"7":{"Name":"VolumeProperties","Discriminator":"kind","BaseProperties":{"provisioningState":{"Type":155,"Flags":2,"Description":"Provisioning state of the resource at the time the operation was called."},"application":{"Type":4,"Flags":0,"Description":"Fully qualified resource ID for the application that the volume is connected to."},"status":{"Type":64,"Flags":2,"Description":"Status of a resource."}},"Elements":{"azure.com.keyvault":156}}},{"6":{"Value":"Succeeded"}},{"6":{"Value":"Failed"}},{"6":{"Value":"Canceled"}},{"6":{"Value":"Accepted"}},{"6":{"Value":"Updating"}},{"6":{"Value":"Deleting"}},{"6":{"Value":"Provisioning"}},{"5":{"Elements":[148,149,150,151,152,153,154]}},{"2":{"Name":"AzureKeyVaultVolumeProperties","Properties":{"certificates":{"Type":169,"Flags":0,"Description":"The KeyVault certificates that this volume exposes"},"keys":{"Type":171,"Flags":0,"Description":"The KeyVault keys that this volume exposes"},"resource":{"Type":4,"Flags":0,"Description":"The ID of the keyvault to use for this volume resource"},"secrets":{"Type":177,"Flags":0,"Description":"The KeyVault secrets that this volume exposes"},"kind":{"Type":178,"Flags":1,"Description":"The volume kind"}}}},{"2":{"Name":"CertificateObjectProperties","Properties":{"alias":{"Type":4,"Flags":0,"Description":"File name when written to disk."},"encoding":{"Type":161,"Flags":0,"Description":"Encoding format. Default utf-8"},"format":{"Type":164,"Flags":0,"Description":"Certificate format. Default pem"},"name":{"Type":4,"Flags":1,"Description":"The name of the certificate"},"certType":{"Type":168,"Flags":0,"Description":"Certificate object type to be downloaded - the certificate itself, private key or public key of the certificate"},"version":{"Type":4,"Flags":0,"Description":"Certificate version"}}}},{"6":{"Value":"utf-8"}},{"6":{"Value":"hex"}},{"6":{"Value":"base64"}},{"5":{"Elements":[158,159,160]}},{"6":{"Value":"pem"}},{"6":{"Value":"pfx"}},{"5":{"Elements":[162,163]}},{"6":{"Value":"certificate"}},{"6":{"Value":"publickey"}},{"6":{"Value":"privatekey"}},{"5":{"Elements":[165,166,167]}},{"2":{"Name":"AzureKeyVaultVolumePropertiesCertificates","Properties":{},"AdditionalProperties":157}},{"2":{"Name":"KeyObjectProperties","Properties":{"alias":{"Type":4,"Flags":0,"Description":"File name when written to disk."},"name":{"Type":4,"Flags":1,"Description":"The name of the key"},"version":{"Type":4,"Flags":0,"Description":"Key version"}}}},{"2":{"Name":"AzureKeyVaultVolumePropertiesKeys","Properties":{},"AdditionalProperties":170}},{"2":{"Name":"SecretObjectProperties","Properties":{"alias":{"Type":4,"Flags":0,"Description":"File name when written to disk."},"encoding":{"Type":176,"Flags":0,"Description":"Encoding format. Default utf-8"},"name":{"Type":4,"Flags":1,"Description":"The name of the secret"},"version":{"Type":4,"Flags":0,"Description":"Secret version"}}}},{"6":{"Value":"utf-8"}},{"6":{"Value":"hex"}},{"6":{"Value":"base64"}},{"5":{"Elements":[173,174,175]}},{"2":{"Name":"AzureKeyVaultVolumePropertiesSecrets","Properties":{},"AdditionalProperties":172}},{"6":{"Value":"azure.com.keyvault"}},{"2":{"Name":"TrackedResourceTags","Properties":{},"AdditionalProperties":4}},{"4":{"Name":"Applications.Core/volumes@2022-03-15-privatepreview","ScopeType":0,"Body":146}}]
\ No newline at end of file
diff --git a/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.md b/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.md
index 4ce99b5c0..21d06ece5 100644
--- a/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.md
+++ b/hack/bicep-types-radius/generated/applications/applications.core/2022-03-15-privatepreview/types.md
@@ -60,6 +60,18 @@
 * **tags**: [TrackedResourceTags](#trackedresourcetags): Resource tags.
 * **type**: 'Applications.Core/httpRoutes' (ReadOnly, DeployTimeConstant): The resource type
 
+## Resource Applications.Core/volumes@2022-03-15-privatepreview
+* **Valid Scope(s)**: Unknown
+### Properties
+* **apiVersion**: '2022-03-15-privatepreview' (ReadOnly, DeployTimeConstant): The resource api version
+* **id**: string (ReadOnly, DeployTimeConstant): The resource id
+* **location**: string (Required): The geo-location where the resource lives
+* **name**: string (Required, DeployTimeConstant): The resource name
+* **properties**: [VolumeProperties](#volumeproperties) (Required)
+* **systemData**: [SystemData](#systemdata) (ReadOnly): Metadata pertaining to creation and last modification of the resource.
+* **tags**: [TrackedResourceTags](#trackedresourcetags): Resource tags.
+* **type**: 'Applications.Core/volumes' (ReadOnly, DeployTimeConstant): The resource type
+
 ## ApplicationProperties
 ### Properties
 * **environment**: string (Required): The resource id of the environment linked to application.
@@ -282,3 +294,61 @@
 ### Additional Properties
 * **Additional Properties Type**: string
 
+## VolumeProperties
+* **Discriminator**: kind
+
+### Base Properties
+* **application**: string: Fully qualified resource ID for the application that the volume is connected to.
+* **provisioningState**: 'Accepted' | 'Canceled' | 'Deleting' | 'Failed' | 'Provisioning' | 'Succeeded' | 'Updating' (ReadOnly): Provisioning state of the resource at the time the operation was called.
+* **status**: [ResourceStatus](#resourcestatus) (ReadOnly): Status of a resource.
+### AzureKeyVaultVolumeProperties
+#### Properties
+* **certificates**: [AzureKeyVaultVolumePropertiesCertificates](#azurekeyvaultvolumepropertiescertificates): The KeyVault certificates that this volume exposes
+* **keys**: [AzureKeyVaultVolumePropertiesKeys](#azurekeyvaultvolumepropertieskeys): The KeyVault keys that this volume exposes
+* **kind**: 'azure.com.keyvault' (Required): The volume kind
+* **resource**: string: The ID of the keyvault to use for this volume resource
+* **secrets**: [AzureKeyVaultVolumePropertiesSecrets](#azurekeyvaultvolumepropertiessecrets): The KeyVault secrets that this volume exposes
+
+
+## AzureKeyVaultVolumePropertiesCertificates
+### Properties
+### Additional Properties
+* **Additional Properties Type**: [CertificateObjectProperties](#certificateobjectproperties)
+
+## CertificateObjectProperties
+### Properties
+* **alias**: string: File name when written to disk.
+* **certType**: 'certificate' | 'privatekey' | 'publickey': Certificate object type to be downloaded - the certificate itself, private key or public key of the certificate
+* **encoding**: 'base64' | 'hex' | 'utf-8': Encoding format. Default utf-8
+* **format**: 'pem' | 'pfx': Certificate format. Default pem
+* **name**: string (Required): The name of the certificate
+* **version**: string: Certificate version
+
+## AzureKeyVaultVolumePropertiesKeys
+### Properties
+### Additional Properties
+* **Additional Properties Type**: [KeyObjectProperties](#keyobjectproperties)
+
+## KeyObjectProperties
+### Properties
+* **alias**: string: File name when written to disk.
+* **name**: string (Required): The name of the key
+* **version**: string: Key version
+
+## AzureKeyVaultVolumePropertiesSecrets
+### Properties
+### Additional Properties
+* **Additional Properties Type**: [SecretObjectProperties](#secretobjectproperties)
+
+## SecretObjectProperties
+### Properties
+* **alias**: string: File name when written to disk.
+* **encoding**: 'base64' | 'hex' | 'utf-8': Encoding format. Default utf-8
+* **name**: string (Required): The name of the secret
+* **version**: string: Secret version
+
+## TrackedResourceTags
+### Properties
+### Additional Properties
+* **Additional Properties Type**: string
+
diff --git a/hack/bicep-types-radius/generated/index.json b/hack/bicep-types-radius/generated/index.json
index e21f8916a..c5c0a9b84 100644
--- a/hack/bicep-types-radius/generated/index.json
+++ b/hack/bicep-types-radius/generated/index.json
@@ -1 +1 @@
-{"Resources":{"Applications.Connector/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":36},"Applications.Connector/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":54},"Applications.Connector/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":68},"Applications.Connector/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":83},"Applications.Connector/rabbitMQMessageQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":98},"Applications.Connector/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":113},"Applications.Connector/daprInvokeHttpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":127},"Applications.Connector/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":147},"Applications.Connector/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":162},"Applications.Core/environments@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":37},"Applications.Core/applications@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":51},"Applications.Core/httpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":67},"Applications.Core/gateways@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":84},"Applications.Core/containers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":143}},"Functions":{"applications.connector/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":163}]},"applications.connector/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":164}]},"applications.connector/rabbitmqmessagequeues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":165}]},"applications.connector/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":167}]}}}
\ No newline at end of file
+{"Resources":{"Applications.Connector/mongoDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":36},"Applications.Connector/daprPubSubBrokers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":54},"Applications.Connector/sqlDatabases@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":68},"Applications.Connector/redisCaches@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":83},"Applications.Connector/rabbitMQMessageQueues@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":98},"Applications.Connector/daprSecretStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":113},"Applications.Connector/daprInvokeHttpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":127},"Applications.Connector/daprStateStores@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":147},"Applications.Connector/extenders@2022-03-15-privatepreview":{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":162},"Applications.Core/environments@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":37},"Applications.Core/applications@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":51},"Applications.Core/httpRoutes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":67},"Applications.Core/gateways@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":84},"Applications.Core/containers@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":143},"Applications.Core/volumes@2022-03-15-privatepreview":{"RelativePath":"applications/applications.core/2022-03-15-privatepreview/types.json","Index":180}},"Functions":{"applications.connector/mongodatabases":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":163}]},"applications.connector/rediscaches":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":164}]},"applications.connector/rabbitmqmessagequeues":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":165}]},"applications.connector/extenders":{"2022-03-15-privatepreview":[{"RelativePath":"applications/applications.connector/2022-03-15-privatepreview/types.json","Index":167}]}}}
\ No newline at end of file
diff --git a/hack/bicep-types-radius/generated/index.md b/hack/bicep-types-radius/generated/index.md
index 4b32084eb..bac608ffc 100644
--- a/hack/bicep-types-radius/generated/index.md
+++ b/hack/bicep-types-radius/generated/index.md
@@ -43,3 +43,6 @@
 ### applications.core/httproutes
 * [2022-03-15-privatepreview](applications/applications.core/2022-03-15-privatepreview/types.md#resource-applicationscorehttproutes2022-03-15-privatepreview)
 
+### applications.core/volumes
+* [2022-03-15-privatepreview](applications/applications.core/2022-03-15-privatepreview/types.md#resource-applicationscorevolumes2022-03-15-privatepreview)
+
diff --git a/pkg/armrpc/api/v1/types.go b/pkg/armrpc/api/v1/types.go
index 58e7f3c9f..a6cdf7d10 100644
--- a/pkg/armrpc/api/v1/types.go
+++ b/pkg/armrpc/api/v1/types.go
@@ -181,6 +181,12 @@ type BasicResourceProperties struct {
 	Status ResourceStatus `json:"status,omitempty"`
 }
 
+// BasicDaprResourceProperties is the basic resource properties for dapr resources.
+type BasicDaprResourceProperties struct {
+	// ComponentName represents the name of the component.
+	ComponentName string `json:"componentName,omitempty"`
+}
+
 // EqualLinkedResource returns true if the resource belongs to the same environment and application.
 func (b *BasicResourceProperties) EqualLinkedResource(prop *BasicResourceProperties) bool {
 	return strings.EqualFold(b.Application, prop.Application) && strings.EqualFold(b.Environment, prop.Environment)
diff --git a/pkg/armrpc/frontend/controller/operation.go b/pkg/armrpc/frontend/controller/operation.go
index 8b2e5f319..89427f6d5 100644
--- a/pkg/armrpc/frontend/controller/operation.go
+++ b/pkg/armrpc/frontend/controller/operation.go
@@ -213,5 +213,5 @@ func (c *Operation[P, T]) ConstructAsyncResponse(ctx context.Context, method, et
 		respCode = http.StatusCreated
 	}
 
-	return rest.NewAsyncOperationResponse(versioned, serviceCtx.Location, respCode, serviceCtx.ResourceID, serviceCtx.OperationID, serviceCtx.APIVersion), nil
+	return rest.NewAsyncOperationResponse(versioned, serviceCtx.Location, respCode, serviceCtx.ResourceID, serviceCtx.OperationID, serviceCtx.APIVersion, "", ""), nil
 }
diff --git a/pkg/armrpc/rest/results.go b/pkg/armrpc/rest/results.go
index eca4da2be..9b1103688 100644
--- a/pkg/armrpc/rest/results.go
+++ b/pkg/armrpc/rest/results.go
@@ -220,10 +220,12 @@ type AsyncOperationResponse struct {
 	ResourceID  resources.ID
 	OperationID uuid.UUID
 	APIVersion  string
+	RootScope   string // Everything before providers namespace for constructing an Async operation header. Used for AWS planes
+	PathBase    string // Base Path. Used for AWS planes
 }
 
 // NewAsyncOperationResponse creates an AsyncOperationResponse
-func NewAsyncOperationResponse(body interface{}, location string, code int, resourceID resources.ID, operationID uuid.UUID, apiVersion string) Response {
+func NewAsyncOperationResponse(body interface{}, location string, code int, resourceID resources.ID, operationID uuid.UUID, apiVersion string, rootScope string, pathBase string) Response {
 	return &AsyncOperationResponse{
 		Body:        body,
 		Location:    location,
@@ -231,6 +233,8 @@ func NewAsyncOperationResponse(body interface{}, location string, code int, reso
 		ResourceID:  resourceID,
 		OperationID: operationID,
 		APIVersion:  apiVersion,
+		RootScope:   rootScope,
+		PathBase:    pathBase,
 	}
 }
 
@@ -262,15 +266,21 @@ func (r *AsyncOperationResponse) Apply(ctx context.Context, w http.ResponseWrite
 
 // getAsyncLocationPath returns the async operation location path for the given resource type.
 func (r *AsyncOperationResponse) getAsyncLocationPath(req *http.Request, resourceType string) string {
+	rootScope := r.RootScope
+	if rootScope == "" {
+		rootScope = r.ResourceID.PlaneScope()
+	}
 	dest := url.URL{
 		Host:   req.Host,
 		Scheme: req.URL.Scheme,
-		Path: fmt.Sprintf("%s/providers/%s/locations/%s/%s/%s", r.ResourceID.PlaneScope(),
-			r.ResourceID.ProviderNamespace(), r.Location, resourceType, r.OperationID.String()),
+		Path:   fmt.Sprintf("%s%s/providers/%s/locations/%s/%s/%s", r.PathBase, rootScope, r.ResourceID.ProviderNamespace(), r.Location, resourceType, r.OperationID.String()),
 	}
 
 	query := url.Values{}
-	query.Add("api-version", r.APIVersion)
+	if r.APIVersion != "" {
+		query.Add("api-version", r.APIVersion)
+	}
+
 	dest.RawQuery = query.Encode()
 
 	// In production this is the header we get from app service for the 'real' protocol
@@ -279,7 +289,9 @@ func (r *AsyncOperationResponse) getAsyncLocationPath(req *http.Request, resourc
 		dest.Scheme = protocol
 	}
 
-	if dest.Scheme == "" {
+	if dest.Scheme == "" && req.TLS != nil {
+		dest.Scheme = "https"
+	} else if dest.Scheme == "" {
 		dest.Scheme = "http"
 	}
 
diff --git a/pkg/azure/clients/resourcedeploymentclient.go b/pkg/azure/clients/resourcedeploymentclient.go
index 588bc4a5f..28240936c 100644
--- a/pkg/azure/clients/resourcedeploymentclient.go
+++ b/pkg/azure/clients/resourcedeploymentclient.go
@@ -60,6 +60,11 @@ type Az struct {
 	Value Value  `json:"value,omitempty"`
 }
 
+type AWS struct {
+	Type  string `json:"type,omitempty"`
+	Value Value  `json:"value,omitempty"`
+}
+
 type Deployments struct {
 	Type  string `json:"type,omitempty"`
 	Value Value  `json:"value,omitempty"`
@@ -68,6 +73,7 @@ type Deployments struct {
 type ProviderConfig struct {
 	Radius      *Radius      `json:"radius,omitempty"`
 	Az          *Az          `json:"az,omitempty"`
+	AWS         *AWS         `json:"aws,omitempty"`
 	Deployments *Deployments `json:"deployments,omitempty"`
 }
 
diff --git a/pkg/cli/clients/clients.go b/pkg/cli/clients/clients.go
index e06780060..aa5c7f54f 100644
--- a/pkg/cli/clients/clients.go
+++ b/pkg/cli/clients/clients.go
@@ -13,6 +13,7 @@ import (
 	"github.com/project-radius/radius/pkg/cli/clients_new/generated"
 	"github.com/project-radius/radius/pkg/cli/output"
 	corerp "github.com/project-radius/radius/pkg/corerp/api/v20220315privatepreview"
+	ucp_v20220315privatepreview "github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
 	ucpresources "github.com/project-radius/radius/pkg/ucp/resources"
 )
 
@@ -134,6 +135,10 @@ type ApplicationsManagementClient interface {
 	ListEnv(ctx context.Context) ([]corerp.EnvironmentResource, error)
 	GetEnvDetails(ctx context.Context, envName string) (corerp.EnvironmentResource, error)
 	DeleteEnv(ctx context.Context, envName string) (bool, error)
+	CreateUCPGroup(ctx context.Context, planeType string, planeName string, resourceGroupName string, resourceGroup ucp_v20220315privatepreview.ResourceGroupResource) (bool, error)
+	DeleteUCPGroup(ctx context.Context, planeType string, planeName string, resourceGroupName string) (bool, error)
+	ShowUCPGroup(ctx context.Context, planeType string, planeName string, resourceGroupName string) (ucp_v20220315privatepreview.ResourceGroupResource, error)
+	ListUCPGroup(ctx context.Context, planeType string, planeName string) ([]ucp_v20220315privatepreview.ResourceGroupResource, error)
 }
 
 //go:generate mockgen -destination=./mock_cloudproviderclient.go -package=clients -self_package github.com/project-radius/radius/pkg/cli/clients github.com/project-radius/radius/pkg/cli/clients CloudProviderManagementClient
diff --git a/pkg/cli/clients/mock_applicationsclient.go b/pkg/cli/clients/mock_applicationsclient.go
index 91f2c5030..dc669a89e 100644
--- a/pkg/cli/clients/mock_applicationsclient.go
+++ b/pkg/cli/clients/mock_applicationsclient.go
@@ -11,6 +11,7 @@ import (
 	gomock "github.com/golang/mock/gomock"
 	generated "github.com/project-radius/radius/pkg/cli/clients_new/generated"
 	v20220315privatepreview "github.com/project-radius/radius/pkg/corerp/api/v20220315privatepreview"
+	v20220315privatepreview0 "github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
 )
 
 // MockApplicationsManagementClient is a mock of ApplicationsManagementClient interface.
@@ -36,6 +37,21 @@ func (m *MockApplicationsManagementClient) EXPECT() *MockApplicationsManagementC
 	return m.recorder
 }
 
+// CreateUCPGroup mocks base method.
+func (m *MockApplicationsManagementClient) CreateUCPGroup(arg0 context.Context, arg1, arg2, arg3 string, arg4 v20220315privatepreview0.ResourceGroupResource) (bool, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateUCPGroup", arg0, arg1, arg2, arg3, arg4)
+	ret0, _ := ret[0].(bool)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// CreateUCPGroup indicates an expected call of CreateUCPGroup.
+func (mr *MockApplicationsManagementClientMockRecorder) CreateUCPGroup(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateUCPGroup", reflect.TypeOf((*MockApplicationsManagementClient)(nil).CreateUCPGroup), arg0, arg1, arg2, arg3, arg4)
+}
+
 // DeleteApplication mocks base method.
 func (m *MockApplicationsManagementClient) DeleteApplication(arg0 context.Context, arg1 string) (bool, error) {
 	m.ctrl.T.Helper()
@@ -81,6 +97,21 @@ func (mr *MockApplicationsManagementClientMockRecorder) DeleteResource(arg0, arg
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteResource", reflect.TypeOf((*MockApplicationsManagementClient)(nil).DeleteResource), arg0, arg1, arg2)
 }
 
+// DeleteUCPGroup mocks base method.
+func (m *MockApplicationsManagementClient) DeleteUCPGroup(arg0 context.Context, arg1, arg2, arg3 string) (bool, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteUCPGroup", arg0, arg1, arg2, arg3)
+	ret0, _ := ret[0].(bool)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// DeleteUCPGroup indicates an expected call of DeleteUCPGroup.
+func (mr *MockApplicationsManagementClientMockRecorder) DeleteUCPGroup(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteUCPGroup", reflect.TypeOf((*MockApplicationsManagementClient)(nil).DeleteUCPGroup), arg0, arg1, arg2, arg3)
+}
+
 // GetEnvDetails mocks base method.
 func (m *MockApplicationsManagementClient) GetEnvDetails(arg0 context.Context, arg1 string) (v20220315privatepreview.EnvironmentResource, error) {
 	m.ctrl.T.Helper()
@@ -201,6 +232,21 @@ func (mr *MockApplicationsManagementClientMockRecorder) ListEnv(arg0 interface{}
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEnv", reflect.TypeOf((*MockApplicationsManagementClient)(nil).ListEnv), arg0)
 }
 
+// ListUCPGroup mocks base method.
+func (m *MockApplicationsManagementClient) ListUCPGroup(arg0 context.Context, arg1, arg2 string) ([]v20220315privatepreview0.ResourceGroupResource, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ListUCPGroup", arg0, arg1, arg2)
+	ret0, _ := ret[0].([]v20220315privatepreview0.ResourceGroupResource)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListUCPGroup indicates an expected call of ListUCPGroup.
+func (mr *MockApplicationsManagementClientMockRecorder) ListUCPGroup(arg0, arg1, arg2 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListUCPGroup", reflect.TypeOf((*MockApplicationsManagementClient)(nil).ListUCPGroup), arg0, arg1, arg2)
+}
+
 // ShowApplication mocks base method.
 func (m *MockApplicationsManagementClient) ShowApplication(arg0 context.Context, arg1 string) (v20220315privatepreview.ApplicationResource, error) {
 	m.ctrl.T.Helper()
@@ -230,3 +276,18 @@ func (mr *MockApplicationsManagementClientMockRecorder) ShowResource(arg0, arg1,
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShowResource", reflect.TypeOf((*MockApplicationsManagementClient)(nil).ShowResource), arg0, arg1, arg2)
 }
+
+// ShowUCPGroup mocks base method.
+func (m *MockApplicationsManagementClient) ShowUCPGroup(arg0 context.Context, arg1, arg2, arg3 string) (v20220315privatepreview0.ResourceGroupResource, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ShowUCPGroup", arg0, arg1, arg2, arg3)
+	ret0, _ := ret[0].(v20220315privatepreview0.ResourceGroupResource)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ShowUCPGroup indicates an expected call of ShowUCPGroup.
+func (mr *MockApplicationsManagementClientMockRecorder) ShowUCPGroup(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShowUCPGroup", reflect.TypeOf((*MockApplicationsManagementClient)(nil).ShowUCPGroup), arg0, arg1, arg2, arg3)
+}
diff --git a/pkg/cli/clivalidation.go b/pkg/cli/clivalidation.go
index 0165c6d8b..6176071c0 100644
--- a/pkg/cli/clivalidation.go
+++ b/pkg/cli/clivalidation.go
@@ -220,6 +220,36 @@ func RequireWorkspace(cmd *cobra.Command, config *viper.Viper) (*workspaces.Work
 	return ws, nil
 }
 
+// RequireUCPResourceGroup is used by commands that require specifying a UCP resouce group name using flag or positional args
+func RequireUCPResourceGroup(cmd *cobra.Command, args []string) (string, error) {
+	group, err := ReadResourceGroupNameArgs(cmd, args)
+	if err != nil {
+		return "", err
+	}
+	if group == "" {
+		return "", fmt.Errorf("resource group name is not provided or is empty ")
+	}
+
+	return group, nil
+}
+
+// ReadResourceGroupNameArgs is used to get the resource group name that is supplied as either the first argument for group commands or using a -g flag
+func ReadResourceGroupNameArgs(cmd *cobra.Command, args []string) (string, error) {
+	name, err := cmd.Flags().GetString("group")
+	if err != nil {
+		return "", err
+	}
+
+	if len(args) > 0 {
+		if name != "" {
+			return "", fmt.Errorf("cannot specify resource group name via both arguments and `-g`")
+		}
+		name = args[0]
+	}
+
+	return name, err
+}
+
 // RequireWorkspaceArgs is used by commands that require an existing workspace either set as the default,
 // or specified as a positional arg, or specified using the 'workspace' flag.
 func RequireWorkspaceArgs(cmd *cobra.Command, config *viper.Viper, args []string) (*workspaces.Workspace, error) {
@@ -241,6 +271,7 @@ func RequireWorkspaceArgs(cmd *cobra.Command, config *viper.Viper, args []string
 	return ws, nil
 }
 
+// ReadWorkspaceNameArgs is used to get the workspace name that is supplied as either the first argument or using a -w flag
 func ReadWorkspaceNameArgs(cmd *cobra.Command, args []string) (string, error) {
 	name, err := cmd.Flags().GetString("workspace")
 	if err != nil {
diff --git a/pkg/cli/cmd/commonflags/flags.go b/pkg/cli/cmd/commonflags/flags.go
index 62bb4bbd3..eba466662 100644
--- a/pkg/cli/cmd/commonflags/flags.go
+++ b/pkg/cli/cmd/commonflags/flags.go
@@ -22,6 +22,14 @@ func AddWorkspaceFlag(cmd *cobra.Command) {
 	cmd.Flags().StringP("workspace", "w", "", "The workspace name")
 }
 
+func AddResourceGroupFlag(cmd *cobra.Command) {
+	cmd.Flags().StringP("group", "g", "", "The resource group name")
+}
+
 func AddApplicationNameFlag(cmd *cobra.Command) {
 	cmd.Flags().StringP("application", "a", "", "The application name")
 }
+
+func AddConfirmationFlag(cmd *cobra.Command) {
+	cmd.Flags().BoolP("yes", "y", false, "The confirmation flag")
+}
diff --git a/pkg/cli/cmd/group/common/validation.go b/pkg/cli/cmd/group/common/validation.go
new file mode 100644
index 000000000..7efa508fc
--- /dev/null
+++ b/pkg/cli/cmd/group/common/validation.go
@@ -0,0 +1,32 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package common
+
+import (
+	"strings"
+
+	"regexp"
+
+	"github.com/project-radius/radius/pkg/cli"
+)
+
+func ValidateResourceGroupName(resourceGroupName string) error {
+
+	if len(resourceGroupName) < 1 || len(resourceGroupName) > 90 {
+		return &cli.FriendlyError{Message: "Resource group name should be between 1 and 90 characters long."}
+	}
+	if strings.HasSuffix(resourceGroupName, ".") {
+		return &cli.FriendlyError{Message: "Resource group names cannot end with a period"}
+	}
+
+	allAllowedChars := regexp.MustCompile(`^[A-Za-z0-9-_(){}\[\]]+$`).MatchString
+
+	if !allAllowedChars(resourceGroupName) {
+		return &cli.FriendlyError{Message: "Resource group name can only contain alphanumerics, underscores, parentheses, hyphens, periods"}
+	}
+
+	return nil
+}
diff --git a/pkg/cli/cmd/group/create/create.go b/pkg/cli/cmd/group/create/create.go
new file mode 100644
index 000000000..1fb5cba10
--- /dev/null
+++ b/pkg/cli/cmd/group/create/create.go
@@ -0,0 +1,111 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package create
+
+import (
+	"context"
+
+	"github.com/project-radius/radius/pkg/cli"
+	"github.com/project-radius/radius/pkg/cli/cmd/commonflags"
+	"github.com/project-radius/radius/pkg/cli/cmd/group/common"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	v20220315privatepreview "github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
+	"github.com/spf13/cobra"
+)
+
+func NewCommand(factory framework.Factory) (*cobra.Command, framework.Runner) {
+	runner := NewRunner(factory)
+
+	cmd := &cobra.Command{
+		Use:   "create resourcegroupname",
+		Short: "Create a new resource group",
+		Long: `Create a new resource group
+
+Resource groups are used to organize and manage Radius resources. They often contain resources that share a common lifecycle or unit of deployment.
+
+A Radius application and its resources can span one or more resource groups, and do not have to be in the same resource group as the Radius environment into which it's being deployed into.
+
+Note that these resource groups are separate from the Azure cloud provider and Azure resource groups configured with the cloud provider.
+`,
+		Example: `rad group create rgprod`,
+		Args:    cobra.MaximumNArgs(1),
+		RunE:    framework.RunCommand(runner),
+	}
+
+	commonflags.AddWorkspaceFlag(cmd)
+	commonflags.AddResourceGroupFlag(cmd)
+
+	return cmd, runner
+}
+
+type Runner struct {
+	ConfigHolder         *framework.ConfigHolder
+	ConnectionFactory    connections.Factory
+	Output               output.Interface
+	Workspace            *workspaces.Workspace
+	UCPResourceGroupName string
+}
+
+func NewRunner(factory framework.Factory) *Runner {
+	return &Runner{
+		ConnectionFactory: factory.GetConnectionFactory(),
+		ConfigHolder:      factory.GetConfigHolder(),
+		Output:            factory.GetOutput(),
+	}
+}
+
+func (r *Runner) Validate(cmd *cobra.Command, args []string) error {
+	config := r.ConfigHolder.Config
+
+	workspace, err := cli.RequireWorkspace(cmd, config)
+	if err != nil {
+		return err
+	}
+
+	resourceGroup, err := cli.RequireUCPResourceGroup(cmd, args)
+	if err != nil {
+		return err
+	}
+
+	err = common.ValidateResourceGroupName(resourceGroup)
+	if err != nil {
+		return err
+	}
+
+	r.UCPResourceGroupName = resourceGroup
+	r.Workspace = workspace
+
+	return nil
+}
+
+func (r *Runner) Run(ctx context.Context) error {
+
+	client, err := r.ConnectionFactory.CreateApplicationsManagementClient(ctx, *r.Workspace)
+	if err != nil {
+		return err
+	}
+
+	r.Output.LogInfo("creating resource group %q in workspace %q...\n", r.UCPResourceGroupName, r.Workspace.Name)
+
+	_, err = client.CreateUCPGroup(ctx, "radius", "local", r.UCPResourceGroupName, v20220315privatepreview.ResourceGroupResource{})
+	if err != nil {
+		return err
+	}
+
+	// TODO: we TEMPORARILY create a resource group in the deployments plane because the deployments RP requires it.
+	// We'll remove this in the future.
+	_, err = client.CreateUCPGroup(ctx, "deployments", "local", r.UCPResourceGroupName, v20220315privatepreview.ResourceGroupResource{})
+	if err != nil {
+		return err
+	}
+
+	r.Output.LogInfo("resource group %q created", r.UCPResourceGroupName)
+	return nil
+
+}
diff --git a/pkg/cli/cmd/group/delete/delete.go b/pkg/cli/cmd/group/delete/delete.go
new file mode 100644
index 000000000..9e4b55c68
--- /dev/null
+++ b/pkg/cli/cmd/group/delete/delete.go
@@ -0,0 +1,121 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package delete
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/project-radius/radius/pkg/cli"
+	"github.com/project-radius/radius/pkg/cli/cmd/commonflags"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/prompt"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/spf13/cobra"
+)
+
+func NewCommand(factory framework.Factory) (*cobra.Command, framework.Runner) {
+	runner := NewRunner(factory)
+
+	cmd := &cobra.Command{
+		Use:   "delete resourcegroupname",
+		Short: "Delete a resource group",
+		Long: `Delete a resource group. 
+		
+		Delete a resource group if it is empty. If not empty, delete the contents and try again`,
+		Example: `rad group delete rgprod`,
+		Args:    cobra.MaximumNArgs(1),
+		RunE:    framework.RunCommand(runner),
+	}
+
+	commonflags.AddWorkspaceFlag(cmd)
+	commonflags.AddResourceGroupFlag(cmd)
+	commonflags.AddConfirmationFlag(cmd)
+
+	return cmd, runner
+}
+
+type Runner struct {
+	ConfigHolder         *framework.ConfigHolder
+	ConnectionFactory    connections.Factory
+	Output               output.Interface
+	Workspace            *workspaces.Workspace
+	UCPResourceGroupName string
+	Confirmation         bool
+}
+
+func NewRunner(factory framework.Factory) *Runner {
+	return &Runner{
+		ConnectionFactory: factory.GetConnectionFactory(),
+		ConfigHolder:      factory.GetConfigHolder(),
+		Output:            factory.GetOutput(),
+	}
+}
+
+func (r *Runner) Validate(cmd *cobra.Command, args []string) error {
+	config := r.ConfigHolder.Config
+
+	workspace, err := cli.RequireWorkspace(cmd, config)
+	if err != nil {
+		return err
+	}
+
+	resourceGroup, err := cli.RequireUCPResourceGroup(cmd, args)
+	if err != nil {
+		return err
+	}
+
+	yes, err := cmd.Flags().GetBool("yes")
+	if err != nil {
+		return err
+	}
+
+	r.UCPResourceGroupName = resourceGroup
+	r.Workspace = workspace
+	r.Confirmation = yes
+
+	return nil
+}
+
+func (r *Runner) Run(ctx context.Context) error {
+
+	// Prompt user to confirm deletion
+	if !r.Confirmation {
+		confirmed, err := prompt.ConfirmWithDefault(fmt.Sprintf("Are you sure you want to delete the resource group '%v'? A resource group can be deleted only when empty", r.UCPResourceGroupName), prompt.No)
+		if err != nil {
+			return err
+		}
+		if !confirmed {
+			r.Output.LogInfo("resource group %q NOT deleted", r.UCPResourceGroupName)
+			return nil
+		}
+	}
+
+	r.Output.LogInfo("deleting resource group %q ...\n", r.UCPResourceGroupName)
+	client, err := r.ConnectionFactory.CreateApplicationsManagementClient(ctx, *r.Workspace)
+	if err != nil {
+		return err
+	}
+
+	_, err = client.DeleteUCPGroup(ctx, "radius", "local", r.UCPResourceGroupName)
+	if err != nil {
+		return err
+	}
+
+	deleted, err := client.DeleteUCPGroup(ctx, "deployments", "local", r.UCPResourceGroupName)
+	if err != nil {
+		return err
+	}
+
+	if deleted {
+		r.Output.LogInfo("resource group %q deleted", r.UCPResourceGroupName)
+	} else {
+		r.Output.LogInfo("resource group %q does not exist or has already been deleted", r.UCPResourceGroupName)
+	}
+	return nil
+}
diff --git a/pkg/cli/cmd/group/group.go b/pkg/cli/cmd/group/group.go
new file mode 100644
index 000000000..6f2ed1b78
--- /dev/null
+++ b/pkg/cli/cmd/group/group.go
@@ -0,0 +1,63 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package group
+
+import (
+	group_create "github.com/project-radius/radius/pkg/cli/cmd/group/create"
+	group_delete "github.com/project-radius/radius/pkg/cli/cmd/group/delete"
+	group_switch "github.com/project-radius/radius/pkg/cli/cmd/group/groupswitch"
+	group_list "github.com/project-radius/radius/pkg/cli/cmd/group/list"
+	group_show "github.com/project-radius/radius/pkg/cli/cmd/group/show"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/spf13/cobra"
+)
+
+func NewCommand(factory framework.Factory) *cobra.Command {
+	// This command is not runnable, and thus has no runner.
+	cmd := &cobra.Command{
+		Use:   "group",
+		Short: "Manage resource groups",
+		Long: `Manage resource groups
+		
+Resource groups are used to organize and manage Radius resources. They often contain resources that share a common lifecycle or unit of deployment.
+
+A Radius application and its resources can span one or more resource groups, and do not have to be in the same resource group as the Radius environment into which it's being deployed into.
+
+Note that these resource groups are separate from the Azure cloud provider and Azure resource groups configured with the cloud provider.
+`,
+		Example: `
+# List resource groups in default workspace
+rad group list
+
+# Create resource group in specified workspace
+rad group create prod -w localWorkspace
+
+# Delete resource group in default workspace
+rad group delete prod
+
+# Show details of resource group in default workspace
+rad group show dev
+`,
+	}
+
+	create, _ := group_create.NewCommand(factory)
+	cmd.AddCommand(create)
+
+	delete, _ := group_delete.NewCommand(factory)
+	cmd.AddCommand(delete)
+
+	list, _ := group_list.NewCommand(factory)
+	cmd.AddCommand(list)
+
+	show, _ := group_show.NewCommand(factory)
+	cmd.AddCommand(show)
+
+	groupswitch, _ := group_switch.NewCommand(factory)
+	cmd.AddCommand(groupswitch)
+
+	return cmd
+
+}
diff --git a/pkg/cli/cmd/group/groupswitch/switch.go b/pkg/cli/cmd/group/groupswitch/switch.go
new file mode 100644
index 000000000..955a02d4c
--- /dev/null
+++ b/pkg/cli/cmd/group/groupswitch/switch.go
@@ -0,0 +1,100 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package groupswitch
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/project-radius/radius/pkg/cli"
+	"github.com/project-radius/radius/pkg/cli/cmd/commonflags"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/spf13/cobra"
+)
+
+func NewCommand(factory framework.Factory) (*cobra.Command, framework.Runner) {
+	runner := NewRunner(factory)
+
+	cmd := &cobra.Command{
+		Use:   "switch resourcegroupname",
+		Short: "Switch default resource group scope",
+		Long: `Switch default resource group scope
+	
+	Radius workspaces contain a resource group scope, where Radius applications and resources are deployed by default. The switch command changes the default scope of the workspace to the specified resource group name.
+	
+	Resource groups are used to organize and manage Radius resources. They often contain resources that share a common lifecycle or unit of deployment.
+			
+	Note that these resource groups are separate from the Azure cloud provider and Azure resource groups configured with the cloud provider.`,
+		Example: `rad group switch rgprod -w wsprod`,
+		Args:    cobra.MaximumNArgs(1),
+		RunE:    framework.RunCommand(runner),
+	}
+
+	commonflags.AddWorkspaceFlag(cmd)
+	commonflags.AddResourceGroupFlag(cmd)
+
+	return cmd, runner
+}
+
+type Runner struct {
+	ConfigHolder         *framework.ConfigHolder
+	ConnectionFactory    connections.Factory
+	Workspace            *workspaces.Workspace
+	UCPResourceGroupName string
+}
+
+func NewRunner(factory framework.Factory) *Runner {
+	return &Runner{
+		ConnectionFactory: factory.GetConnectionFactory(),
+		ConfigHolder:      factory.GetConfigHolder(),
+	}
+}
+
+func (r *Runner) Validate(cmd *cobra.Command, args []string) error {
+	config := r.ConfigHolder.Config
+	workspace, err := cli.RequireWorkspace(cmd, config)
+	if err != nil {
+		return err
+	}
+
+	resourceGroup, err := cli.RequireUCPResourceGroup(cmd, args)
+	if err != nil {
+		return err
+	}
+
+	r.UCPResourceGroupName = resourceGroup
+	r.Workspace = workspace
+
+	return nil
+}
+
+func (r *Runner) Run(ctx context.Context) error {
+
+	client, err := r.ConnectionFactory.CreateApplicationsManagementClient(ctx, *r.Workspace)
+	if err != nil {
+		return err
+	}
+
+	_, err = client.ShowUCPGroup(ctx, "radius", "local", r.UCPResourceGroupName)
+	if err != nil {
+		return &cli.FriendlyError{Message: fmt.Sprintf("resource group %q does not exist. Run `rad group create` or `rad init` and try again \n", r.UCPResourceGroupName)}
+	}
+
+	scope := fmt.Sprintf("/planes/radius/local/resourceGroups/%s", r.UCPResourceGroupName)
+
+	err = cli.EditWorkspaces(ctx, r.ConfigHolder.Config, func(section *cli.WorkspaceSection) error {
+
+		workspace := *r.Workspace
+		workspace.Scope = scope
+		section.Items[workspace.Name] = workspace
+
+		return nil
+	})
+	return err
+
+}
diff --git a/pkg/cli/cmd/group/list/list.go b/pkg/cli/cmd/group/list/list.go
new file mode 100644
index 000000000..c8ad71ca3
--- /dev/null
+++ b/pkg/cli/cmd/group/list/list.go
@@ -0,0 +1,101 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package list
+
+import (
+	"context"
+
+	"github.com/project-radius/radius/pkg/cli"
+	"github.com/project-radius/radius/pkg/cli/cmd/commonflags"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/objectformats"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/spf13/cobra"
+)
+
+func NewCommand(factory framework.Factory) (*cobra.Command, framework.Runner) {
+	runner := NewRunner(factory)
+
+	cmd := &cobra.Command{
+		Use:   "list",
+		Short: "List resource groups within current/specified workspace",
+		Long: `List resource groups within current/specified workspace
+	
+	Resource groups are used to organize and manage Radius resources. They often contain resources that share a common lifecycle or unit of deployment.
+			
+	A Radius application and its resources can span one or more resource groups, and do not have to be in the same resource group as the Radius environment into which it's being deployed into.
+			
+	Note that these resource groups are separate from the Azure cloud provider and Azure resource groups configured with the cloud provider.`,
+		Example: `rad group list`,
+		Args:    cobra.ExactArgs(0),
+		RunE:    framework.RunCommand(runner),
+	}
+
+	commonflags.AddWorkspaceFlag(cmd)
+	cmd.Flags().StringP("output", "o", "", "The output format")
+
+	return cmd, runner
+}
+
+type Runner struct {
+	ConfigHolder         *framework.ConfigHolder
+	ConnectionFactory    connections.Factory
+	Output               output.Interface
+	Workspace            *workspaces.Workspace
+	UCPResourceGroupName string
+	ResourceType         string
+	ResourceName         string
+	Format               string
+}
+
+func NewRunner(factory framework.Factory) *Runner {
+	return &Runner{
+		ConnectionFactory: factory.GetConnectionFactory(),
+		ConfigHolder:      factory.GetConfigHolder(),
+		Output:            factory.GetOutput(),
+	}
+}
+
+func (r *Runner) Validate(cmd *cobra.Command, args []string) error {
+	config := r.ConfigHolder.Config
+	workspace, err := cli.RequireWorkspace(cmd, config)
+	if err != nil {
+		return err
+	}
+
+	format, err := cmd.Flags().GetString("output")
+	if err != nil {
+		return err
+	}
+	if format == "" {
+		format = "table"
+	}
+	r.Format = format
+	r.Workspace = workspace
+
+	return nil
+}
+
+func (r *Runner) Run(ctx context.Context) error {
+	client, err := r.ConnectionFactory.CreateApplicationsManagementClient(ctx, *r.Workspace)
+	if err != nil {
+		return err
+	}
+
+	resourceGroupDetails, err := client.ListUCPGroup(ctx, "radius", "local")
+	if err != nil {
+		return err
+	}
+
+	err = r.Output.WriteFormatted(r.Format, resourceGroupDetails, objectformats.GetResourceGroupTableFormat())
+
+	if err != nil {
+		return err
+	}
+	return err
+}
diff --git a/pkg/cli/cmd/group/show/show.go b/pkg/cli/cmd/group/show/show.go
new file mode 100644
index 000000000..6c499cd43
--- /dev/null
+++ b/pkg/cli/cmd/group/show/show.go
@@ -0,0 +1,110 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package show
+
+import (
+	"context"
+
+	"github.com/project-radius/radius/pkg/cli"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/objectformats"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/spf13/cobra"
+)
+
+func NewCommand(factory framework.Factory) (*cobra.Command, framework.Runner) {
+	runner := NewRunner(factory)
+
+	cmd := &cobra.Command{
+		Use:   "show resourcegroupname",
+		Short: "Show the details of a resource group",
+		Long: `Show the details of a resource group
+
+Resource groups are used to organize and manage Radius resources. They often contain resources that share a common lifecycle or unit of deployment.
+
+A Radius application and its resources can span one or more resource groups, and do not have to be in the same resource group as the Radius environment into which it's being deployed into.
+
+Note that these resource groups are separate from the Azure cloud provider and Azure resource groups configured with the cloud provider.
+`,
+		Example: `rad group show rgprod`,
+		Args:    cobra.MaximumNArgs(1),
+		RunE:    framework.RunCommand(runner),
+	}
+
+	cmd.Flags().StringP("group", "g", "", "The resource group name")
+	cmd.Flags().StringP("workspace", "w", "", "The workspace name")
+	cmd.Flags().StringP("output", "o", "", "The output format")
+
+	return cmd, runner
+}
+
+type Runner struct {
+	ConfigHolder         *framework.ConfigHolder
+	ConnectionFactory    connections.Factory
+	Output               output.Interface
+	Workspace            *workspaces.Workspace
+	UCPResourceGroupName string
+	ResourceType         string
+	ResourceName         string
+	Format               string
+}
+
+func NewRunner(factory framework.Factory) *Runner {
+	return &Runner{
+		ConnectionFactory: factory.GetConnectionFactory(),
+		ConfigHolder:      factory.GetConfigHolder(),
+		Output:            factory.GetOutput(),
+	}
+}
+
+func (r *Runner) Validate(cmd *cobra.Command, args []string) error {
+	config := r.ConfigHolder.Config
+	workspace, err := cli.RequireWorkspace(cmd, config)
+	if err != nil {
+		return err
+	}
+
+	format, err := cli.RequireOutput(cmd)
+	if err != nil {
+		return err
+	}
+	if format == "" {
+		format = "table"
+	}
+	resourcegroup, err := cli.RequireUCPResourceGroup(cmd, args)
+	if err != nil {
+		return err
+	}
+
+	r.Format = format
+	r.UCPResourceGroupName = resourcegroup
+	r.Workspace = workspace
+
+	return nil
+}
+
+func (r *Runner) Run(ctx context.Context) error {
+
+	client, err := r.ConnectionFactory.CreateApplicationsManagementClient(ctx, *r.Workspace)
+	if err != nil {
+		return err
+	}
+
+	resourceGroup, err := client.ShowUCPGroup(ctx, "radius", "local", r.UCPResourceGroupName)
+	if err != nil {
+		return err
+	}
+
+	err = r.Output.WriteFormatted(r.Format, resourceGroup, objectformats.GetResourceGroupTableFormat())
+
+	if err != nil {
+		return err
+	}
+	return err
+
+}
diff --git a/pkg/cli/config.go b/pkg/cli/config.go
index 14227f942..df4cff2cd 100644
--- a/pkg/cli/config.go
+++ b/pkg/cli/config.go
@@ -47,7 +47,7 @@ func (ws WorkspaceSection) HasWorkspace(name string) bool {
 // GetWorkspace returns the specified workspace or the default workspace if 'name' is empty.
 func (ws WorkspaceSection) GetWorkspace(name string) (*workspaces.Workspace, error) {
 	if name == "" && ws.Default == "" {
-		return nil, errors.New("the default workspace is not configured. use `rad workspace switch` to change the selected workspace.")
+		return nil, errors.New("the default workspace is not configured. use `rad workspace switch` to change the selected workspace")
 	}
 
 	if name == "" {
@@ -56,7 +56,7 @@ func (ws WorkspaceSection) GetWorkspace(name string) (*workspaces.Workspace, err
 
 	result, ok := ws.Items[cases.Fold().String(name)]
 	if !ok {
-		return nil, fmt.Errorf("the workspace '%v' could not be found in the list of workspace. use `rad workspace list` to list workspaces", name)
+		return nil, fmt.Errorf("the workspace '%v' does not exist. use `rad init` or `rad workspace create` and try again", name)
 	}
 
 	return &result, nil
diff --git a/pkg/cli/connections/factory.go b/pkg/cli/connections/factory.go
index 9db4e5015..994ac9764 100644
--- a/pkg/cli/connections/factory.go
+++ b/pkg/cli/connections/factory.go
@@ -21,7 +21,7 @@ import (
 	azclients "github.com/project-radius/radius/pkg/azure/clients"
 	aztoken "github.com/project-radius/radius/pkg/azure/tokencredentials"
 	"github.com/project-radius/radius/pkg/cli"
-	"github.com/project-radius/radius/pkg/cli/azure"
+	"github.com/project-radius/radius/pkg/cli/deployment"
 	"github.com/project-radius/radius/pkg/cli/clients"
 	"github.com/project-radius/radius/pkg/cli/clients_new/generated"
 	"github.com/project-radius/radius/pkg/cli/kubernetes"
@@ -78,11 +78,12 @@ func (*impl) CreateDeploymentClient(ctx context.Context, workspace workspaces.Wo
 			return nil, err
 		}
 
-		return &azure.ResourceDeploymentClient{
+		return &deployment.ResourceDeploymentClient{
 			Client:              dc,
 			OperationsClient:    op,
 			RadiusResourceGroup: id.FindScope(resources.ResourceGroupsSegment),
 			AzProvider:          workspace.ProviderConfig.Azure,
+			AWSProvider:         workspace.ProviderConfig.AWS,
 		}, nil
 	default:
 		return nil, fmt.Errorf("unsupported connection type: %+v", connection)
@@ -143,7 +144,7 @@ func (*impl) CreateDiagnosticsClient(ctx context.Context, workspace workspaces.W
 			return nil, err
 		}
 
-		return &azure.ARMDiagnosticsClient{
+		return &deployment.ARMDiagnosticsClient{
 			K8sTypedClient:    k8sClient,
 			RestConfig:        config,
 			K8sRuntimeClient:  client,
diff --git a/pkg/cli/azure/deploy.go b/pkg/cli/deployment/deploy.go
similarity index 96%
rename from pkg/cli/azure/deploy.go
rename to pkg/cli/deployment/deploy.go
index ab01c16e9..88151ff7a 100644
--- a/pkg/cli/azure/deploy.go
+++ b/pkg/cli/deployment/deploy.go
@@ -3,7 +3,7 @@
 // Licensed under the MIT License.
 // ------------------------------------------------------------
 
-package azure
+package deployment
 
 import (
 	"context"
@@ -36,6 +36,7 @@ type ResourceDeploymentClient struct {
 	OperationsClient    azclients.ResourceDeploymentOperationsClient
 	Tags                map[string]*string
 	AzProvider          *workspaces.AzureProvider
+	AWSProvider         *workspaces.AWSProvider
 }
 
 var _ clients.DeploymentClient = (*ResourceDeploymentClient)(nil)
@@ -121,6 +122,16 @@ func (dc *ResourceDeploymentClient) GetProviderConfigs() azclients.ProviderConfi
 		}
 	}
 
+	if dc.AWSProvider != nil {
+		scope := "/planes/aws/aws/accounts/" + dc.AWSProvider.AccountId + "/regions/" + dc.AWSProvider.Region
+		providerConfigs.AWS = &azclients.AWS{
+			Type: "AWS",
+			Value: azclients.Value{
+				Scope: scope,
+			},
+		}
+	}
+
 	if dc.RadiusResourceGroup != "" {
 		scope := "/planes/radius/local/resourceGroups/" + dc.RadiusResourceGroup
 		providerConfigs.Radius = &azclients.Radius{
diff --git a/pkg/cli/azure/diagnostics.go b/pkg/cli/deployment/diagnostics.go
similarity index 99%
rename from pkg/cli/azure/diagnostics.go
rename to pkg/cli/deployment/diagnostics.go
index cf79adccd..398d706a9 100644
--- a/pkg/cli/azure/diagnostics.go
+++ b/pkg/cli/deployment/diagnostics.go
@@ -3,7 +3,7 @@
 // Licensed under the MIT License.
 // ------------------------------------------------------------
 
-package azure
+package deployment
 
 import (
 	"context"
diff --git a/pkg/cli/localrp/deploy.go b/pkg/cli/localrp/deploy.go
index fc647ddb4..f4cc2605f 100644
--- a/pkg/cli/localrp/deploy.go
+++ b/pkg/cli/localrp/deploy.go
@@ -16,7 +16,7 @@ import (
 	"syscall"
 
 	"github.com/mitchellh/go-ps"
-	"github.com/project-radius/radius/pkg/cli/azure"
+	"github.com/project-radius/radius/pkg/cli/deployment"
 	"github.com/project-radius/radius/pkg/cli/clients"
 	"github.com/project-radius/radius/pkg/cli/de"
 )
@@ -25,7 +25,7 @@ var _ clients.DeploymentClient = (*LocalRPDeploymentClient)(nil)
 
 // Local RP Deployment Client to be used for local deployments to Azure environments
 type LocalRPDeploymentClient struct {
-	InnerClient azure.ResourceDeploymentClient
+	InnerClient deployment.ResourceDeploymentClient
 	BindUrl     string
 	BackendUrl  string
 }
diff --git a/pkg/cli/objectformats/objectformats.go b/pkg/cli/objectformats/objectformats.go
index 27c32a084..216734495 100644
--- a/pkg/cli/objectformats/objectformats.go
+++ b/pkg/cli/objectformats/objectformats.go
@@ -54,6 +54,21 @@ func GetResourceTableFormat() output.FormatterOptions {
 	}
 }
 
+func GetResourceGroupTableFormat() output.FormatterOptions {
+	return output.FormatterOptions{
+		Columns: []output.Column{
+			{
+				Heading:  "ID",
+				JSONPath: "{ .id }",
+			},
+			{
+				Heading:  "Name",
+				JSONPath: "{ .name }",
+			},
+		},
+	}
+}
+
 func GetGenericEnvironmentTableFormat() output.FormatterOptions {
 	return output.FormatterOptions{
 		Columns: []output.Column{
diff --git a/pkg/cli/ucp/ucp_management.go b/pkg/cli/ucp/ucp_management.go
index ff78c81c9..0b86f1f09 100644
--- a/pkg/cli/ucp/ucp_management.go
+++ b/pkg/cli/ucp/ucp_management.go
@@ -18,7 +18,8 @@ import (
 	aztoken "github.com/project-radius/radius/pkg/azure/tokencredentials"
 	"github.com/project-radius/radius/pkg/cli/clients"
 	"github.com/project-radius/radius/pkg/cli/clients_new/generated"
-	corerp "github.com/project-radius/radius/pkg/corerp/api/v20220315privatepreview"
+	"github.com/project-radius/radius/pkg/corerp/api/v20220315privatepreview"
+	ucpv20220315 "github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
 	"github.com/project-radius/radius/pkg/ucp/resources"
 )
 
@@ -161,15 +162,15 @@ func (amc *ARMApplicationsManagementClient) DeleteResource(ctx context.Context,
 	return respFromCtx.StatusCode != 204, nil
 }
 
-func (amc *ARMApplicationsManagementClient) ListApplications(ctx context.Context) ([]corerp.ApplicationResource, error) {
-	results := []corerp.ApplicationResource{}
+func (amc *ARMApplicationsManagementClient) ListApplications(ctx context.Context) ([]v20220315privatepreview.ApplicationResource, error) {
+	results := []v20220315privatepreview.ApplicationResource{}
 
-	client, err := corerp.NewApplicationsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
+	client, err := v20220315privatepreview.NewApplicationsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
 	if err != nil {
 		return results, err
 	}
 
-	pager := client.NewListByScopePager(&corerp.ApplicationsClientListByScopeOptions{})
+	pager := client.NewListByScopePager(&v20220315privatepreview.ApplicationsClientListByScopeOptions{})
 	for pager.More() {
 		nextPage, err := pager.NextPage(ctx)
 		if err != nil {
@@ -184,8 +185,8 @@ func (amc *ARMApplicationsManagementClient) ListApplications(ctx context.Context
 	return results, nil
 }
 
-func (amc *ARMApplicationsManagementClient) ListApplicationsByEnv(ctx context.Context, envName string) ([]corerp.ApplicationResource, error) {
-	results := []corerp.ApplicationResource{}
+func (amc *ARMApplicationsManagementClient) ListApplicationsByEnv(ctx context.Context, envName string) ([]v20220315privatepreview.ApplicationResource, error) {
+	results := []v20220315privatepreview.ApplicationResource{}
 	applicationsList, err := amc.ListApplications(ctx)
 	if err != nil {
 		return nil, err
@@ -199,14 +200,14 @@ func (amc *ARMApplicationsManagementClient) ListApplicationsByEnv(ctx context.Co
 	return results, nil
 }
 
-func (amc *ARMApplicationsManagementClient) ShowApplication(ctx context.Context, applicationName string) (corerp.ApplicationResource, error) {
-	client, err := corerp.NewApplicationsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
+func (amc *ARMApplicationsManagementClient) ShowApplication(ctx context.Context, applicationName string) (v20220315privatepreview.ApplicationResource, error) {
+	client, err := v20220315privatepreview.NewApplicationsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
 	if err != nil {
-		return corerp.ApplicationResource{}, err
+		return v20220315privatepreview.ApplicationResource{}, err
 	}
 
-	getResponse, err := client.Get(ctx, applicationName, &corerp.ApplicationsClientGetOptions{})
-	var result corerp.ApplicationResource
+	getResponse, err := client.Get(ctx, applicationName, &v20220315privatepreview.ApplicationsClientGetOptions{})
+	var result v20220315privatepreview.ApplicationResource
 	if err != nil {
 		return result, err
 	}
@@ -238,7 +239,7 @@ func (amc *ARMApplicationsManagementClient) DeleteApplication(ctx context.Contex
 		return false, err
 	}
 
-	client, err := corerp.NewApplicationsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
+	client, err := v20220315privatepreview.NewApplicationsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
 	if err != nil {
 		return false, err
 	}
@@ -302,15 +303,15 @@ func isResourceInEnvironment(ctx context.Context, resource generated.GenericReso
 	return false
 }
 
-func (amc *ARMApplicationsManagementClient) ListEnv(ctx context.Context) ([]corerp.EnvironmentResource, error) {
-	envResourceList := []corerp.EnvironmentResource{}
+func (amc *ARMApplicationsManagementClient) ListEnv(ctx context.Context) ([]v20220315privatepreview.EnvironmentResource, error) {
+	envResourceList := []v20220315privatepreview.EnvironmentResource{}
 
-	envClient, err := corerp.NewEnvironmentsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
+	envClient, err := v20220315privatepreview.NewEnvironmentsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
 	if err != nil {
 		return envResourceList, err
 	}
 
-	pager := envClient.NewListByScopePager(&corerp.EnvironmentsClientListByScopeOptions{})
+	pager := envClient.NewListByScopePager(&v20220315privatepreview.EnvironmentsClientListByScopeOptions{})
 	for pager.More() {
 		nextPage, err := pager.NextPage(ctx)
 		if err != nil {
@@ -326,18 +327,18 @@ func (amc *ARMApplicationsManagementClient) ListEnv(ctx context.Context) ([]core
 
 }
 
-func (amc *ARMApplicationsManagementClient) GetEnvDetails(ctx context.Context, envName string) (corerp.EnvironmentResource, error) {
-	envClient, err := corerp.NewEnvironmentsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
+func (amc *ARMApplicationsManagementClient) GetEnvDetails(ctx context.Context, envName string) (v20220315privatepreview.EnvironmentResource, error) {
+	envClient, err := v20220315privatepreview.NewEnvironmentsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
 	if err != nil {
-		return corerp.EnvironmentResource{}, err
+		return v20220315privatepreview.EnvironmentResource{}, err
 	}
 
-	envGetResp, err := envClient.Get(ctx, envName, &corerp.EnvironmentsClientGetOptions{})
+	envGetResp, err := envClient.Get(ctx, envName, &v20220315privatepreview.EnvironmentsClientGetOptions{})
 	if err == nil {
 		return envGetResp.EnvironmentResource, nil
 	}
 
-	return corerp.EnvironmentResource{}, err
+	return v20220315privatepreview.EnvironmentResource{}, err
 
 }
 
@@ -354,7 +355,7 @@ func (amc *ARMApplicationsManagementClient) DeleteEnv(ctx context.Context, envNa
 		}
 	}
 
-	envClient, err := corerp.NewEnvironmentsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
+	envClient, err := v20220315privatepreview.NewEnvironmentsClient(amc.RootScope, &aztoken.AnonymousCredential{}, amc.ClientOptions)
 	if err != nil {
 		return false, err
 	}
@@ -369,3 +370,74 @@ func (amc *ARMApplicationsManagementClient) DeleteEnv(ctx context.Context, envNa
 
 	return respFromCtx.StatusCode != 204, nil
 }
+
+func (amc *ARMApplicationsManagementClient) CreateUCPGroup(ctx context.Context, planeType string, planeName string, resourceGroupName string, resourceGroup ucpv20220315.ResourceGroupResource) (bool, error) {
+	var resourceGroupOptions *ucpv20220315.ResourceGroupsClientCreateOrUpdateOptions
+	resourcegroupClient, err := ucpv20220315.NewResourceGroupsClient(&aztoken.AnonymousCredential{}, amc.ClientOptions)
+	if err != nil {
+		return false, err
+	}
+
+	_, err = resourcegroupClient.CreateOrUpdate(ctx, planeType, planeName, resourceGroupName, resourceGroup, resourceGroupOptions)
+	if err != nil {
+		return false, err
+	}
+
+	return true, nil
+}
+
+func (amc *ARMApplicationsManagementClient) DeleteUCPGroup(ctx context.Context, planeType string, planeName string, resourceGroupName string) (bool, error) {
+	var resourceGroupOptions *ucpv20220315.ResourceGroupsClientDeleteOptions
+	resourcegroupClient, err := ucpv20220315.NewResourceGroupsClient(&aztoken.AnonymousCredential{}, amc.ClientOptions)
+
+	var respFromCtx *http.Response
+	ctxWithResp := runtime.WithCaptureResponse(ctx, &respFromCtx)
+	if err != nil {
+		return false, err
+	}
+
+	_, err = resourcegroupClient.Delete(ctxWithResp, planeType, planeName, resourceGroupName, resourceGroupOptions)
+	if err != nil {
+		return false, err
+	}
+
+	return respFromCtx.StatusCode == 204, nil
+
+}
+
+func (amc *ARMApplicationsManagementClient) ShowUCPGroup(ctx context.Context, planeType string, planeName string, resourceGroupName string) (ucpv20220315.ResourceGroupResource, error) {
+	var resourceGroupOptions *ucpv20220315.ResourceGroupsClientGetOptions
+	resourcegroupClient, err := ucpv20220315.NewResourceGroupsClient(&aztoken.AnonymousCredential{}, amc.ClientOptions)
+	if err != nil {
+		return ucpv20220315.ResourceGroupResource{}, err
+	}
+
+	resp, err := resourcegroupClient.Get(ctx, planeType, planeName, resourceGroupName, resourceGroupOptions)
+	if err != nil {
+		return ucpv20220315.ResourceGroupResource{}, err
+	}
+
+	return resp.ResourceGroupResource, nil
+}
+
+func (amc *ARMApplicationsManagementClient) ListUCPGroup(ctx context.Context, planeType string, planeName string) ([]ucpv20220315.ResourceGroupResource, error) {
+	var resourceGroupOptions *ucpv20220315.ResourceGroupsClientListOptions
+	resourceGroupResources := []ucpv20220315.ResourceGroupResource{}
+	resourcegroupClient, err := ucpv20220315.NewResourceGroupsClient(&aztoken.AnonymousCredential{}, amc.ClientOptions)
+	if err != nil {
+		return resourceGroupResources, err
+	}
+
+	resp, err := resourcegroupClient.List(ctx, planeType, planeName, resourceGroupOptions)
+	if err != nil {
+		return resourceGroupResources, err
+	}
+
+	resourceGroupList := resp.ResourceGroupResourceList.Value
+	for _, resourceGroup := range resourceGroupList {
+		resourceGroupResources = append(resourceGroupResources, *resourceGroup)
+
+	}
+
+	return resourceGroupResources, nil
+}
diff --git a/pkg/connectorrp/api/v20220315privatepreview/daprpubsubbroker_conversion.go b/pkg/connectorrp/api/v20220315privatepreview/daprpubsubbroker_conversion.go
index de438da7d..5391b7e18 100644
--- a/pkg/connectorrp/api/v20220315privatepreview/daprpubsubbroker_conversion.go
+++ b/pkg/connectorrp/api/v20220315privatepreview/daprpubsubbroker_conversion.go
@@ -89,6 +89,7 @@ func (dst *DaprPubSubBrokerResource) ConvertFrom(src conv.DataModelInterface) er
 			Kind:              fromDaprPubSubBrokerKindDataModel(daprPubSub.Properties.Kind),
 			Topic:             to.StringPtr(daprPubSub.Properties.Topic),
 			Resource:          to.StringPtr(daprPubSub.Properties.DaprPubSubAzureServiceBus.Resource),
+			ComponentName:     to.StringPtr(daprPubSub.Properties.ComponentName),
 		}
 	case datamodel.DaprPubSubBrokerKindGeneric:
 		dst.Properties = &DaprPubSubGenericResourceProperties{
@@ -103,6 +104,7 @@ func (dst *DaprPubSubBrokerResource) ConvertFrom(src conv.DataModelInterface) er
 			Type:              to.StringPtr(daprPubSub.Properties.DaprPubSubGeneric.Type),
 			Version:           to.StringPtr(daprPubSub.Properties.DaprPubSubGeneric.Version),
 			Metadata:          daprPubSub.Properties.DaprPubSubGeneric.Metadata,
+			ComponentName:     to.StringPtr(daprPubSub.Properties.ComponentName),
 		}
 	default:
 		return errors.New("Kind of DaprPubSubBroker is not specified.")
diff --git a/pkg/connectorrp/api/v20220315privatepreview/daprsecretstore_conversion.go b/pkg/connectorrp/api/v20220315privatepreview/daprsecretstore_conversion.go
index 8ced6d131..b2ff1b2df 100644
--- a/pkg/connectorrp/api/v20220315privatepreview/daprsecretstore_conversion.go
+++ b/pkg/connectorrp/api/v20220315privatepreview/daprsecretstore_conversion.go
@@ -33,7 +33,6 @@ func (src *DaprSecretStoreResource) ConvertTo() (conv.DataModelInterface, error)
 			Type:              to.String(src.Properties.Type),
 			Version:           to.String(src.Properties.Version),
 			Metadata:          src.Properties.Metadata,
-			SecretStoreName:   to.String(src.Properties.SecretStoreName),
 		},
 		InternalMetadata: v1.InternalMetadata{
 			UpdatedAPIVersion: Version,
@@ -72,7 +71,7 @@ func (dst *DaprSecretStoreResource) ConvertFrom(src conv.DataModelInterface) err
 		Type:              to.StringPtr(daprSecretStore.Properties.Type),
 		Version:           to.StringPtr(daprSecretStore.Properties.Version),
 		Metadata:          daprSecretStore.Properties.Metadata,
-		SecretStoreName:   to.StringPtr(daprSecretStore.Properties.SecretStoreName),
+		ComponentName:     to.StringPtr(daprSecretStore.Properties.ComponentName),
 	}
 	if daprSecretStore.Properties.Recipe.Name != "" {
 		dst.Properties.Recipe = &Recipe{
diff --git a/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models.go b/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models.go
index b6133d032..7e175df5f 100644
--- a/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models.go
+++ b/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models.go
@@ -11,6 +11,13 @@ package v20220315privatepreview
 
 import "time"
 
+// BasicDaprResourceProperties - Basic properties of a Dapr component object.
+type BasicDaprResourceProperties struct {
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+}
+
 // BasicResourceProperties - Basic properties of a Radius resource.
 type BasicResourceProperties struct {
 	// READ-ONLY; Status of the resource
@@ -112,6 +119,10 @@ type DaprPubSubAzureServiceBusResourceProperties struct {
 	// Topic name of the Azure ServiceBus resource
 	Topic *string `json:"topic,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the daprPubSubBroker connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
@@ -129,6 +140,7 @@ func (d *DaprPubSubAzureServiceBusResourceProperties) GetDaprPubSubBrokerPropert
 		Topic: d.Topic,
 		Recipe: d.Recipe,
 		Status: d.Status,
+		ComponentName: d.ComponentName,
 	}
 }
 
@@ -167,6 +179,10 @@ type DaprPubSubBrokerProperties struct {
 	// Topic name of the Azure ServiceBus resource
 	Topic *string `json:"topic,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the daprPubSubBroker connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
@@ -248,6 +264,10 @@ type DaprPubSubGenericResourceProperties struct {
 	// Topic name of the Azure ServiceBus resource
 	Topic *string `json:"topic,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the daprPubSubBroker connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
@@ -265,6 +285,7 @@ func (d *DaprPubSubGenericResourceProperties) GetDaprPubSubBrokerProperties() *D
 		Topic: d.Topic,
 		Recipe: d.Recipe,
 		Status: d.Status,
+		ComponentName: d.ComponentName,
 	}
 }
 
@@ -300,12 +321,13 @@ type DaprSecretStoreProperties struct {
 	// The recipe used to automatically deploy underlying infrastructure for the daprSecretStore connector
 	Recipe *Recipe `json:"recipe,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the dapr secret store connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
-	// READ-ONLY; The name of the Dapr Secret Store.
-	SecretStoreName *string `json:"secretStoreName,omitempty" azure:"ro"`
-
 	// READ-ONLY; Status of the resource
 	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
 }
@@ -372,12 +394,13 @@ type DaprStateStoreAzureTableStorageResourceProperties struct {
 	// The recipe used to automatically deploy underlying infrastructure for the daprStateStore connector
 	Recipe *Recipe `json:"recipe,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the daprStateStore connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
-	// READ-ONLY; The name of the Dapr State Store
-	StateStoreName *string `json:"stateStoreName,omitempty" azure:"ro"`
-
 	// READ-ONLY; Status of the resource
 	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
 }
@@ -389,9 +412,9 @@ func (d *DaprStateStoreAzureTableStorageResourceProperties) GetDaprStateStorePro
 		Environment: d.Environment,
 		Application: d.Application,
 		Kind: d.Kind,
-		StateStoreName: d.StateStoreName,
 		Recipe: d.Recipe,
 		Status: d.Status,
+		ComponentName: d.ComponentName,
 	}
 }
 
@@ -417,12 +440,13 @@ type DaprStateStoreGenericResourceProperties struct {
 	// The recipe used to automatically deploy underlying infrastructure for the daprStateStore connector
 	Recipe *Recipe `json:"recipe,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the daprStateStore connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
-	// READ-ONLY; The name of the Dapr State Store
-	StateStoreName *string `json:"stateStoreName,omitempty" azure:"ro"`
-
 	// READ-ONLY; Status of the resource
 	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
 }
@@ -434,9 +458,9 @@ func (d *DaprStateStoreGenericResourceProperties) GetDaprStateStoreProperties()
 		Environment: d.Environment,
 		Application: d.Application,
 		Kind: d.Kind,
-		StateStoreName: d.StateStoreName,
 		Recipe: d.Recipe,
 		Status: d.Status,
+		ComponentName: d.ComponentName,
 	}
 }
 
@@ -473,12 +497,13 @@ type DaprStateStoreProperties struct {
 	// The recipe used to automatically deploy underlying infrastructure for the daprStateStore connector
 	Recipe *Recipe `json:"recipe,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the daprStateStore connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
-	// READ-ONLY; The name of the Dapr State Store
-	StateStoreName *string `json:"stateStoreName,omitempty" azure:"ro"`
-
 	// READ-ONLY; Status of the resource
 	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
 }
@@ -526,12 +551,13 @@ type DaprStateStoreSQLServerResourceProperties struct {
 	// The recipe used to automatically deploy underlying infrastructure for the daprStateStore connector
 	Recipe *Recipe `json:"recipe,omitempty"`
 
+	// READ-ONLY; The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to
+// use the Dapr component.
+	ComponentName *string `json:"componentName,omitempty" azure:"ro"`
+
 	// READ-ONLY; Provisioning state of the daprStateStore connector at the time the operation was called
 	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
 
-	// READ-ONLY; The name of the Dapr State Store
-	StateStoreName *string `json:"stateStoreName,omitempty" azure:"ro"`
-
 	// READ-ONLY; Status of the resource
 	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
 }
@@ -543,9 +569,9 @@ func (d *DaprStateStoreSQLServerResourceProperties) GetDaprStateStoreProperties(
 		Environment: d.Environment,
 		Application: d.Application,
 		Kind: d.Kind,
-		StateStoreName: d.StateStoreName,
 		Recipe: d.Recipe,
 		Status: d.Status,
+		ComponentName: d.ComponentName,
 	}
 }
 
diff --git a/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models_serde.go b/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models_serde.go
index 53794c030..81374f348 100644
--- a/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models_serde.go
+++ b/pkg/connectorrp/api/v20220315privatepreview/zz_generated_models_serde.go
@@ -16,6 +16,33 @@ import (
 	"reflect"
 )
 
+// MarshalJSON implements the json.Marshaller interface for type BasicDaprResourceProperties.
+func (b BasicDaprResourceProperties) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "componentName", b.ComponentName)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type BasicDaprResourceProperties.
+func (b *BasicDaprResourceProperties) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", b, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &b.ComponentName)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", b, err)
+		}
+	}
+	return nil
+}
+
 // MarshalJSON implements the json.Marshaller interface for type BasicResourceProperties.
 func (b BasicResourceProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
@@ -176,6 +203,7 @@ func (d *DaprInvokeHTTPRouteResource) UnmarshalJSON(data []byte) error {
 func (d DaprPubSubAzureServiceBusResourceProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	objectMap["kind"] = DaprPubSubBrokerPropertiesKindPubsubAzureServicebus
 	populate(objectMap, "provisioningState", d.ProvisioningState)
@@ -198,6 +226,9 @@ func (d *DaprPubSubAzureServiceBusResourceProperties) UnmarshalJSON(data []byte)
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -262,6 +293,7 @@ func (d *DaprPubSubBrokerList) UnmarshalJSON(data []byte) error {
 func (d DaprPubSubBrokerProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	objectMap["kind"] = d.Kind
 	populate(objectMap, "provisioningState", d.ProvisioningState)
@@ -283,6 +315,9 @@ func (d *DaprPubSubBrokerProperties) UnmarshalJSON(data []byte) error {
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -364,6 +399,7 @@ func (d *DaprPubSubBrokerResource) UnmarshalJSON(data []byte) error {
 func (d DaprPubSubGenericResourceProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	objectMap["kind"] = DaprPubSubBrokerPropertiesKindGeneric
 	populate(objectMap, "metadata", d.Metadata)
@@ -388,6 +424,9 @@ func (d *DaprPubSubGenericResourceProperties) UnmarshalJSON(data []byte) error {
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -458,12 +497,12 @@ func (d *DaprSecretStoreList) UnmarshalJSON(data []byte) error {
 func (d DaprSecretStoreProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	populate(objectMap, "kind", d.Kind)
 	populate(objectMap, "metadata", d.Metadata)
 	populate(objectMap, "provisioningState", d.ProvisioningState)
 	populate(objectMap, "recipe", d.Recipe)
-	populate(objectMap, "secretStoreName", d.SecretStoreName)
 	populate(objectMap, "status", d.Status)
 	populate(objectMap, "type", d.Type)
 	populate(objectMap, "version", d.Version)
@@ -482,6 +521,9 @@ func (d *DaprSecretStoreProperties) UnmarshalJSON(data []byte) error {
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -497,9 +539,6 @@ func (d *DaprSecretStoreProperties) UnmarshalJSON(data []byte) error {
 		case "recipe":
 				err = unpopulate(val, "Recipe", &d.Recipe)
 				delete(rawMsg, key)
-		case "secretStoreName":
-				err = unpopulate(val, "SecretStoreName", &d.SecretStoreName)
-				delete(rawMsg, key)
 		case "status":
 				err = unpopulate(val, "Status", &d.Status)
 				delete(rawMsg, key)
@@ -572,12 +611,12 @@ func (d *DaprSecretStoreResource) UnmarshalJSON(data []byte) error {
 func (d DaprStateStoreAzureTableStorageResourceProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	objectMap["kind"] = DaprStateStorePropertiesKindStateAzureTablestorage
 	populate(objectMap, "provisioningState", d.ProvisioningState)
 	populate(objectMap, "recipe", d.Recipe)
 	populate(objectMap, "resource", d.Resource)
-	populate(objectMap, "stateStoreName", d.StateStoreName)
 	populate(objectMap, "status", d.Status)
 	return json.Marshal(objectMap)
 }
@@ -594,6 +633,9 @@ func (d *DaprStateStoreAzureTableStorageResourceProperties) UnmarshalJSON(data [
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -609,9 +651,6 @@ func (d *DaprStateStoreAzureTableStorageResourceProperties) UnmarshalJSON(data [
 		case "resource":
 				err = unpopulate(val, "Resource", &d.Resource)
 				delete(rawMsg, key)
-		case "stateStoreName":
-				err = unpopulate(val, "StateStoreName", &d.StateStoreName)
-				delete(rawMsg, key)
 		case "status":
 				err = unpopulate(val, "Status", &d.Status)
 				delete(rawMsg, key)
@@ -627,12 +666,12 @@ func (d *DaprStateStoreAzureTableStorageResourceProperties) UnmarshalJSON(data [
 func (d DaprStateStoreGenericResourceProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	objectMap["kind"] = DaprStateStorePropertiesKindGeneric
 	populate(objectMap, "metadata", d.Metadata)
 	populate(objectMap, "provisioningState", d.ProvisioningState)
 	populate(objectMap, "recipe", d.Recipe)
-	populate(objectMap, "stateStoreName", d.StateStoreName)
 	populate(objectMap, "status", d.Status)
 	populate(objectMap, "type", d.Type)
 	populate(objectMap, "version", d.Version)
@@ -651,6 +690,9 @@ func (d *DaprStateStoreGenericResourceProperties) UnmarshalJSON(data []byte) err
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -666,9 +708,6 @@ func (d *DaprStateStoreGenericResourceProperties) UnmarshalJSON(data []byte) err
 		case "recipe":
 				err = unpopulate(val, "Recipe", &d.Recipe)
 				delete(rawMsg, key)
-		case "stateStoreName":
-				err = unpopulate(val, "StateStoreName", &d.StateStoreName)
-				delete(rawMsg, key)
 		case "status":
 				err = unpopulate(val, "Status", &d.Status)
 				delete(rawMsg, key)
@@ -721,11 +760,11 @@ func (d *DaprStateStoreList) UnmarshalJSON(data []byte) error {
 func (d DaprStateStoreProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	objectMap["kind"] = d.Kind
 	populate(objectMap, "provisioningState", d.ProvisioningState)
 	populate(objectMap, "recipe", d.Recipe)
-	populate(objectMap, "stateStoreName", d.StateStoreName)
 	populate(objectMap, "status", d.Status)
 	return json.Marshal(objectMap)
 }
@@ -742,6 +781,9 @@ func (d *DaprStateStoreProperties) UnmarshalJSON(data []byte) error {
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -754,9 +796,6 @@ func (d *DaprStateStoreProperties) UnmarshalJSON(data []byte) error {
 		case "recipe":
 				err = unpopulate(val, "Recipe", &d.Recipe)
 				delete(rawMsg, key)
-		case "stateStoreName":
-				err = unpopulate(val, "StateStoreName", &d.StateStoreName)
-				delete(rawMsg, key)
 		case "status":
 				err = unpopulate(val, "Status", &d.Status)
 				delete(rawMsg, key)
@@ -823,12 +862,12 @@ func (d *DaprStateStoreResource) UnmarshalJSON(data []byte) error {
 func (d DaprStateStoreSQLServerResourceProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
 	populate(objectMap, "application", d.Application)
+	populate(objectMap, "componentName", d.ComponentName)
 	populate(objectMap, "environment", d.Environment)
 	objectMap["kind"] = DaprStateStorePropertiesKindStateSqlserver
 	populate(objectMap, "provisioningState", d.ProvisioningState)
 	populate(objectMap, "recipe", d.Recipe)
 	populate(objectMap, "resource", d.Resource)
-	populate(objectMap, "stateStoreName", d.StateStoreName)
 	populate(objectMap, "status", d.Status)
 	return json.Marshal(objectMap)
 }
@@ -845,6 +884,9 @@ func (d *DaprStateStoreSQLServerResourceProperties) UnmarshalJSON(data []byte) e
 		case "application":
 				err = unpopulate(val, "Application", &d.Application)
 				delete(rawMsg, key)
+		case "componentName":
+				err = unpopulate(val, "ComponentName", &d.ComponentName)
+				delete(rawMsg, key)
 		case "environment":
 				err = unpopulate(val, "Environment", &d.Environment)
 				delete(rawMsg, key)
@@ -860,9 +902,6 @@ func (d *DaprStateStoreSQLServerResourceProperties) UnmarshalJSON(data []byte) e
 		case "resource":
 				err = unpopulate(val, "Resource", &d.Resource)
 				delete(rawMsg, key)
-		case "stateStoreName":
-				err = unpopulate(val, "StateStoreName", &d.StateStoreName)
-				delete(rawMsg, key)
 		case "status":
 				err = unpopulate(val, "Status", &d.Status)
 				delete(rawMsg, key)
diff --git a/pkg/connectorrp/datamodel/daprpubsubbroker.go b/pkg/connectorrp/datamodel/daprpubsubbroker.go
index c231235f8..17fc51e62 100644
--- a/pkg/connectorrp/datamodel/daprpubsubbroker.go
+++ b/pkg/connectorrp/datamodel/daprpubsubbroker.go
@@ -7,6 +7,7 @@ package datamodel
 
 import (
 	v1 "github.com/project-radius/radius/pkg/armrpc/api/v1"
+	"github.com/project-radius/radius/pkg/rp"
 )
 
 type DaprPubSubBrokerKind string
@@ -50,6 +51,7 @@ type DaprPubSubAzureServiceBusResourceProperties struct {
 // DaprPubSubBrokerProperties represents the properties of DaprPubSubBroker resource.
 type DaprPubSubBrokerProperties struct {
 	v1.BasicResourceProperties
+	rp.BasicDaprResourceProperties
 	ProvisioningState         v1.ProvisioningState                        `json:"provisioningState,omitempty"`
 	Kind                      DaprPubSubBrokerKind                        `json:"kind"`
 	Topic                     string                                      `json:"topic,omitempty"` // Topic name of the Azure ServiceBus resource. Provided by the user.
diff --git a/pkg/connectorrp/datamodel/daprsecretstore.go b/pkg/connectorrp/datamodel/daprsecretstore.go
index 615cca87f..44c38b15a 100644
--- a/pkg/connectorrp/datamodel/daprsecretstore.go
+++ b/pkg/connectorrp/datamodel/daprsecretstore.go
@@ -7,6 +7,7 @@ package datamodel
 
 import (
 	v1 "github.com/project-radius/radius/pkg/armrpc/api/v1"
+	"github.com/project-radius/radius/pkg/rp"
 )
 
 type DaprSecretStoreKind string
@@ -39,11 +40,11 @@ func (daprSecretStore DaprSecretStore) ResourceTypeName() string {
 // DaprSecretStoreProperties represents the properties of DaprSecretStore resource.
 type DaprSecretStoreProperties struct {
 	v1.BasicResourceProperties
+	rp.BasicDaprResourceProperties
 	ProvisioningState v1.ProvisioningState   `json:"provisioningState,omitempty"`
 	Kind              DaprSecretStoreKind    `json:"kind"`
 	Type              string                 `json:"type"`
 	Version           string                 `json:"version"`
 	Metadata          map[string]interface{} `json:"metadata"`
-	SecretStoreName   string                 `json:"secretStoreName"`
 	Recipe            ConnectorRecipe        `json:"recipe,omitempty"`
 }
diff --git a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker.go b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker.go
index 98e5b29ff..eb65cfef1 100644
--- a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker.go
+++ b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker.go
@@ -15,6 +15,7 @@ import (
 	"github.com/project-radius/radius/pkg/armrpc/rest"
 	"github.com/project-radius/radius/pkg/connectorrp/datamodel"
 	"github.com/project-radius/radius/pkg/connectorrp/datamodel/converter"
+	"github.com/project-radius/radius/pkg/connectorrp/renderers"
 	"github.com/project-radius/radius/pkg/connectorrp/renderers/daprpubsubbrokers"
 	"github.com/project-radius/radius/pkg/rp/outputresource"
 	"github.com/project-radius/radius/pkg/ucp/store"
@@ -81,10 +82,15 @@ func (daprPubSub *CreateOrUpdateDaprPubSubBroker) Run(ctx context.Context, req *
 	newResource.Properties.BasicResourceProperties.Status.OutputResources = deploymentOutput.Resources
 	newResource.ComputedValues = deploymentOutput.ComputedValues
 	newResource.SecretValues = deploymentOutput.SecretValues
+
 	if topic, ok := deploymentOutput.ComputedValues[daprpubsubbrokers.TopicNameKey].(string); ok {
 		newResource.Properties.Topic = topic
 	}
 
+	if componentName, ok := deploymentOutput.ComputedValues[renderers.ComponentNameKey].(string); ok {
+		newResource.Properties.ComponentName = componentName
+	}
+
 	if !isNewResource {
 		diff := outputresource.GetGCOutputResources(newResource.Properties.Status.OutputResources, old.Properties.Status.OutputResources)
 		err = daprPubSub.DeploymentProcessor().Delete(ctx, serviceCtx.ResourceID, diff)
diff --git a/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore.go b/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore.go
index 0cebe2083..ee4d0e3ea 100644
--- a/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore.go
+++ b/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore.go
@@ -81,8 +81,9 @@ func (daprSecretStore *CreateOrUpdateDaprSecretStore) Run(ctx context.Context, r
 	newResource.Properties.BasicResourceProperties.Status.OutputResources = deploymentOutput.Resources
 	newResource.ComputedValues = deploymentOutput.ComputedValues
 	newResource.SecretValues = deploymentOutput.SecretValues
-	if secretStoreName, ok := deploymentOutput.ComputedValues[renderers.SecretStoreName].(string); ok {
-		newResource.Properties.SecretStoreName = secretStoreName
+
+	if componentName, ok := deploymentOutput.ComputedValues[renderers.ComponentNameKey].(string); ok {
+		newResource.Properties.ComponentName = componentName
 	}
 
 	if !isNewResource {
diff --git a/pkg/connectorrp/renderers/daprinvokehttproutes/renderer.go b/pkg/connectorrp/renderers/daprinvokehttproutes/renderer.go
index 9da2017ea..8f6d91999 100644
--- a/pkg/connectorrp/renderers/daprinvokehttproutes/renderer.go
+++ b/pkg/connectorrp/renderers/daprinvokehttproutes/renderer.go
@@ -12,6 +12,7 @@ import (
 	"github.com/project-radius/radius/pkg/armrpc/api/conv"
 	"github.com/project-radius/radius/pkg/connectorrp/datamodel"
 	"github.com/project-radius/radius/pkg/connectorrp/renderers"
+	"github.com/project-radius/radius/pkg/rp"
 )
 
 var _ renderers.Renderer = (*Renderer)(nil)
@@ -35,5 +36,6 @@ func (r Renderer) Render(ctx context.Context, dm conv.DataModelInterface, option
 				Value: to.String(&properties.AppId),
 			},
 		},
+		SecretValues: map[string]rp.SecretValueReference{},
 	}, nil
 }
diff --git a/pkg/connectorrp/renderers/daprpubsubbrokers/azure_servicebus.go b/pkg/connectorrp/renderers/daprpubsubbrokers/azure_servicebus.go
index 91c1b1beb..bef715466 100644
--- a/pkg/connectorrp/renderers/daprpubsubbrokers/azure_servicebus.go
+++ b/pkg/connectorrp/renderers/daprpubsubbrokers/azure_servicebus.go
@@ -20,27 +20,30 @@ import (
 
 func GetDaprPubSubAzureServiceBus(resource datamodel.DaprPubSubBroker, applicationName string, namespace string) (renderers.RendererOutput, error) {
 	properties := resource.Properties.DaprPubSubAzureServiceBus
-
 	var output outputresource.OutputResource
 
 	if properties.Resource == "" {
 		return renderers.RendererOutput{}, conv.NewClientErrInvalidRequest(renderers.ErrResourceMissingForResource.Error())
 	}
+
 	//Validate fully qualified resource identifier of the source resource is supplied for this connector
 	azureServiceBusNamespaceID, err := resources.Parse(properties.Resource)
 	if err != nil {
 		return renderers.RendererOutput{}, conv.NewClientErrInvalidRequest("the 'resource' field must be a valid resource id")
 	}
+
 	err = azureServiceBusNamespaceID.ValidateResourceType(NamespaceResourceType)
 	if err != nil {
 		return renderers.RendererOutput{}, conv.NewClientErrInvalidRequest("the 'resource' field must refer to a ServiceBus Namespace")
 	}
 
 	serviceBusNamespaceName := azureServiceBusNamespaceID.TypeSegments()[0].Name
+
 	topicName := resource.Properties.Topic
 	if topicName == "" {
 		topicName = resource.Name
 	}
+
 	output = outputresource.OutputResource{
 		LocalID: outputresource.LocalIDAzureServiceBusNamespace,
 		ResourceType: resourcemodel.ResourceType{
@@ -72,7 +75,11 @@ func GetDaprPubSubAzureServiceBus(resource datamodel.DaprPubSubBroker, applicati
 		TopicNameKey: {
 			Value: topicName,
 		},
+		renderers.ComponentNameKey: {
+			Value: kubernetes.MakeResourceName(applicationName, resource.Name),
+		},
 	}
+
 	secrets := map[string]rp.SecretValueReference{}
 
 	return renderers.RendererOutput{
diff --git a/pkg/connectorrp/renderers/daprpubsubbrokers/generic.go b/pkg/connectorrp/renderers/daprpubsubbrokers/generic.go
index c63ebbdee..9567cb0a9 100644
--- a/pkg/connectorrp/renderers/daprpubsubbrokers/generic.go
+++ b/pkg/connectorrp/renderers/daprpubsubbrokers/generic.go
@@ -7,10 +7,13 @@ package daprpubsubbrokers
 
 import (
 	"github.com/project-radius/radius/pkg/connectorrp/datamodel"
+	"github.com/project-radius/radius/pkg/connectorrp/handlers"
 	"github.com/project-radius/radius/pkg/connectorrp/renderers"
 	"github.com/project-radius/radius/pkg/connectorrp/renderers/dapr"
+	"github.com/project-radius/radius/pkg/kubernetes"
 	"github.com/project-radius/radius/pkg/resourcekinds"
 	"github.com/project-radius/radius/pkg/resourcemodel"
+	"github.com/project-radius/radius/pkg/rp"
 	"github.com/project-radius/radius/pkg/rp/outputresource"
 )
 
@@ -28,10 +31,34 @@ func GetDaprPubSubGeneric(resource datamodel.DaprPubSubBroker, applicationName s
 		return renderers.RendererOutput{}, err
 	}
 
+	topicName := resource.Properties.Topic
+	if topicName == "" {
+		topicName = resource.Name
+	}
+
+	values := map[string]renderers.ComputedValueReference{
+		NamespaceNameKey: {
+			Value: namespace,
+		},
+		PubSubNameKey: {
+			Value:             kubernetes.MakeResourceName(applicationName, resource.Name),
+			LocalID:           outputresource.LocalIDDaprComponent,
+			PropertyReference: handlers.ResourceName,
+		},
+		TopicNameKey: {
+			Value: topicName,
+		},
+		renderers.ComponentNameKey: {
+			Value: kubernetes.MakeResourceName(applicationName, resource.Name),
+		},
+	}
+
+	secrets := map[string]rp.SecretValueReference{}
+
 	return renderers.RendererOutput{
 		Resources:      outputResources,
-		ComputedValues: nil,
-		SecretValues:   nil,
+		ComputedValues: values,
+		SecretValues:   secrets,
 	}, nil
 
 }
diff --git a/pkg/connectorrp/renderers/daprsecretstores/renderer.go b/pkg/connectorrp/renderers/daprsecretstores/renderer.go
index a68389b82..5a0902280 100644
--- a/pkg/connectorrp/renderers/daprsecretstores/renderer.go
+++ b/pkg/connectorrp/renderers/daprsecretstores/renderer.go
@@ -53,15 +53,15 @@ func (r Renderer) Render(ctx context.Context, dm conv.DataModelInterface, option
 		applicationName = applicationID.Name()
 	}
 
-	resoures, err := secretStoreFunc(*resource, applicationName, options.Namespace)
+	resources, err := secretStoreFunc(*resource, applicationName, options.Namespace)
 	if err != nil {
 		return renderers.RendererOutput{}, err
 	}
 
 	return renderers.RendererOutput{
-		Resources: resoures,
+		Resources: resources,
 		ComputedValues: map[string]renderers.ComputedValueReference{
-			"secretStoreName": {
+			renderers.ComponentNameKey: {
 				Value: kubernetes.MakeResourceName(applicationName, resource.Name),
 			},
 		},
diff --git a/pkg/connectorrp/renderers/types.go b/pkg/connectorrp/renderers/types.go
index 7b215e620..d78a1c1e3 100644
--- a/pkg/connectorrp/renderers/types.go
+++ b/pkg/connectorrp/renderers/types.go
@@ -18,14 +18,13 @@ import (
 const (
 	ConnectionStringValue = "connectionString"
 	DatabaseNameValue     = "database"
-	SecretStoreName       = "secretStoreName"
-	StateStoreName        = "stateStoreName"
 	DatabaseName          = "database"
 	ServerNameValue       = "server"
 	UsernameStringValue   = "username"
 	PasswordStringHolder  = "password"
 	Host                  = "host"
 	Port                  = "port"
+	ComponentNameKey      = "componentName"
 )
 
 var ErrorResourceOrServerNameMissingFromResource = errors.New("either the 'resource' or 'server'/'database' is required")
diff --git a/pkg/corerp/api/README.md b/pkg/corerp/api/README.md
index f9562ec14..dff6ff867 100644
--- a/pkg/corerp/api/README.md
+++ b/pkg/corerp/api/README.md
@@ -39,6 +39,7 @@ input-file:
   - ../../../swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/httpRoutes.json
   - ../../../swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/gateways.json
   - ../../../swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/containers.json
+  - ../../../swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/volumes.json
 modelerfour: 
   treat-type-object-as-anything: false
 ```
diff --git a/pkg/corerp/api/v20220315privatepreview/zz_generated_constants.go b/pkg/corerp/api/v20220315privatepreview/zz_generated_constants.go
index 5e10ca2c9..d56c252f5 100644
--- a/pkg/corerp/api/v20220315privatepreview/zz_generated_constants.go
+++ b/pkg/corerp/api/v20220315privatepreview/zz_generated_constants.go
@@ -34,6 +34,40 @@ func PossibleCreatedByTypeValues() []CreatedByType {
 	}
 }
 
+// Encoding - Encoding format. Default utf-8
+type Encoding string
+
+const (
+	EncodingUTF8 Encoding = "utf-8"
+	EncodingHex Encoding = "hex"
+	EncodingBase64 Encoding = "base64"
+)
+
+// PossibleEncodingValues returns the possible values for the Encoding const type.
+func PossibleEncodingValues() []Encoding {
+	return []Encoding{	
+		EncodingUTF8,
+		EncodingHex,
+		EncodingBase64,
+	}
+}
+
+// Format - Certificate format. Default pem
+type Format string
+
+const (
+	FormatPem Format = "pem"
+	FormatPfx Format = "pfx"
+)
+
+// PossibleFormatValues returns the possible values for the Format const type.
+func PossibleFormatValues() []Format {
+	return []Format{	
+		FormatPem,
+		FormatPfx,
+	}
+}
+
 // Kind - The kind of IAM provider to configure
 type Kind string
 
@@ -110,6 +144,24 @@ func PossibleProvisioningStateValues() []ProvisioningState {
 	}
 }
 
+// Type - Certificate object type to be downloaded - the certificate itself, private key or public key of the certificate
+type Type string
+
+const (
+	TypeCertificate Type = "certificate"
+	TypePublickey Type = "publickey"
+	TypePrivatekey Type = "privatekey"
+)
+
+// PossibleTypeValues returns the possible values for the Type const type.
+func PossibleTypeValues() []Type {
+	return []Type{	
+		TypeCertificate,
+		TypePublickey,
+		TypePrivatekey,
+	}
+}
+
 // VolumeRbac - Container read/write access to the volume
 type VolumeRbac string
 
diff --git a/pkg/corerp/api/v20220315privatepreview/zz_generated_models.go b/pkg/corerp/api/v20220315privatepreview/zz_generated_models.go
index 6e5b3ea96..9f631403c 100644
--- a/pkg/corerp/api/v20220315privatepreview/zz_generated_models.go
+++ b/pkg/corerp/api/v20220315privatepreview/zz_generated_models.go
@@ -78,12 +78,68 @@ type ApplicationsClientUpdateOptions struct {
 	// placeholder for future optional parameters
 }
 
+type AzureKeyVaultVolumeProperties struct {
+	// REQUIRED; The volume kind
+	Kind *string `json:"kind,omitempty"`
+
+	// Fully qualified resource ID for the application that the volume is connected to.
+	Application *string `json:"application,omitempty"`
+
+	// The KeyVault certificates that this volume exposes
+	Certificates map[string]*CertificateObjectProperties `json:"certificates,omitempty"`
+
+	// The KeyVault keys that this volume exposes
+	Keys map[string]*KeyObjectProperties `json:"keys,omitempty"`
+
+	// The ID of the keyvault to use for this volume resource
+	Resource *string `json:"resource,omitempty"`
+
+	// The KeyVault secrets that this volume exposes
+	Secrets map[string]*SecretObjectProperties `json:"secrets,omitempty"`
+
+	// READ-ONLY; Provisioning state of the Volume at the time the operation was called.
+	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
+
+	// READ-ONLY; Status of the resource
+	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
+}
+
+// GetVolumeProperties implements the VolumePropertiesClassification interface for type AzureKeyVaultVolumeProperties.
+func (a *AzureKeyVaultVolumeProperties) GetVolumeProperties() *VolumeProperties {
+	return &VolumeProperties{
+		Kind: a.Kind,
+		ProvisioningState: a.ProvisioningState,
+		Application: a.Application,
+		Status: a.Status,
+	}
+}
+
 // BasicResourceProperties - Basic properties of a Radius resource.
 type BasicResourceProperties struct {
 	// READ-ONLY; Status of the resource
 	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
 }
 
+type CertificateObjectProperties struct {
+	// REQUIRED; The name of the certificate
+	Name *string `json:"name,omitempty"`
+
+	// File name when written to disk.
+	Alias *string `json:"alias,omitempty"`
+
+	// Certificate object type to be downloaded - the certificate itself, private key or public key of the certificate
+	CertType *Type `json:"certType,omitempty"`
+
+	// Encoding format. Default utf-8
+	Encoding *Encoding `json:"encoding,omitempty"`
+
+	// Certificate format. Default pem
+	Format *Format `json:"format,omitempty"`
+
+	// Certificate version
+	Version *string `json:"version,omitempty"`
+}
+
 type ConnectionProperties struct {
 	// REQUIRED; The source of the connection
 	Source *string `json:"source,omitempty"`
@@ -688,6 +744,17 @@ type IamProperties struct {
 	Roles []*string `json:"roles,omitempty"`
 }
 
+type KeyObjectProperties struct {
+	// REQUIRED; The name of the key
+	Name *string `json:"name,omitempty"`
+
+	// File name when written to disk.
+	Alias *string `json:"alias,omitempty"`
+
+	// Key version
+	Version *string `json:"version,omitempty"`
+}
+
 // KubernetesCompute - Specifies the properties for Kubernetes compute environment
 type KubernetesCompute struct {
 	// REQUIRED; Type of compute resource.
@@ -764,6 +831,20 @@ type ResourceStatus struct {
 	OutputResources []map[string]interface{} `json:"outputResources,omitempty"`
 }
 
+type SecretObjectProperties struct {
+	// REQUIRED; The name of the secret
+	Name *string `json:"name,omitempty"`
+
+	// File name when written to disk.
+	Alias *string `json:"alias,omitempty"`
+
+	// Encoding format. Default utf-8
+	Encoding *Encoding `json:"encoding,omitempty"`
+
+	// Secret version
+	Version *string `json:"version,omitempty"`
+}
+
 // SystemData - Metadata pertaining to creation and last modification of the resource.
 type SystemData struct {
 	// The timestamp of resource creation (UTC).
@@ -853,3 +934,87 @@ type Volume struct {
 // GetVolume implements the VolumeClassification interface for type Volume.
 func (v *Volume) GetVolume() *Volume { return v }
 
+// VolumePropertiesClassification provides polymorphic access to related types.
+// Call the interface's GetVolumeProperties() method to access the common type.
+// Use a type switch to determine the concrete type.  The possible types are:
+// - *AzureKeyVaultVolumeProperties, *VolumeProperties
+type VolumePropertiesClassification interface {
+	// GetVolumeProperties returns the VolumeProperties content of the underlying type.
+	GetVolumeProperties() *VolumeProperties
+}
+
+type VolumeProperties struct {
+	// REQUIRED; The volume kind
+	Kind *string `json:"kind,omitempty"`
+
+	// Fully qualified resource ID for the application that the volume is connected to.
+	Application *string `json:"application,omitempty"`
+
+	// READ-ONLY; Provisioning state of the Volume at the time the operation was called.
+	ProvisioningState *ProvisioningState `json:"provisioningState,omitempty" azure:"ro"`
+
+	// READ-ONLY; Status of the resource
+	Status *ResourceStatus `json:"status,omitempty" azure:"ro"`
+}
+
+// GetVolumeProperties implements the VolumePropertiesClassification interface for type VolumeProperties.
+func (v *VolumeProperties) GetVolumeProperties() *VolumeProperties { return v }
+
+// VolumeResource - Radius Volume Resource.
+type VolumeResource struct {
+	// REQUIRED; The geo-location where the resource lives
+	Location *string `json:"location,omitempty"`
+
+	// REQUIRED
+	Properties VolumePropertiesClassification `json:"properties,omitempty"`
+
+	// Resource tags.
+	Tags map[string]*string `json:"tags,omitempty"`
+
+	// READ-ONLY; Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
+	ID *string `json:"id,omitempty" azure:"ro"`
+
+	// READ-ONLY; The name of the resource
+	Name *string `json:"name,omitempty" azure:"ro"`
+
+	// READ-ONLY; Metadata pertaining to creation and last modification of the resource.
+	SystemData *SystemData `json:"systemData,omitempty" azure:"ro"`
+
+	// READ-ONLY; The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
+	Type *string `json:"type,omitempty" azure:"ro"`
+}
+
+// VolumeResourceList - The list of Volumes.
+type VolumeResourceList struct {
+	// The link used to get the next page of Volumes list.
+	NextLink *string `json:"nextLink,omitempty"`
+
+	// The list of Volume.
+	Value []*VolumeResource `json:"value,omitempty"`
+}
+
+// VolumesClientCreateOrUpdateOptions contains the optional parameters for the VolumesClient.CreateOrUpdate method.
+type VolumesClientCreateOrUpdateOptions struct {
+	// placeholder for future optional parameters
+}
+
+// VolumesClientDeleteOptions contains the optional parameters for the VolumesClient.Delete method.
+type VolumesClientDeleteOptions struct {
+	// placeholder for future optional parameters
+}
+
+// VolumesClientGetOptions contains the optional parameters for the VolumesClient.Get method.
+type VolumesClientGetOptions struct {
+	// placeholder for future optional parameters
+}
+
+// VolumesClientListByScopeOptions contains the optional parameters for the VolumesClient.ListByScope method.
+type VolumesClientListByScopeOptions struct {
+	// placeholder for future optional parameters
+}
+
+// VolumesClientUpdateOptions contains the optional parameters for the VolumesClient.Update method.
+type VolumesClientUpdateOptions struct {
+	// placeholder for future optional parameters
+}
+
diff --git a/pkg/corerp/api/v20220315privatepreview/zz_generated_models_serde.go b/pkg/corerp/api/v20220315privatepreview/zz_generated_models_serde.go
index 0ac309bd0..6f1a6dd5c 100644
--- a/pkg/corerp/api/v20220315privatepreview/zz_generated_models_serde.go
+++ b/pkg/corerp/api/v20220315privatepreview/zz_generated_models_serde.go
@@ -129,6 +129,61 @@ func (a *ApplicationResourceList) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
+// MarshalJSON implements the json.Marshaller interface for type AzureKeyVaultVolumeProperties.
+func (a AzureKeyVaultVolumeProperties) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "application", a.Application)
+	populate(objectMap, "certificates", a.Certificates)
+	populate(objectMap, "keys", a.Keys)
+	objectMap["kind"] = "azure.com.keyvault"
+	populate(objectMap, "provisioningState", a.ProvisioningState)
+	populate(objectMap, "resource", a.Resource)
+	populate(objectMap, "secrets", a.Secrets)
+	populate(objectMap, "status", a.Status)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type AzureKeyVaultVolumeProperties.
+func (a *AzureKeyVaultVolumeProperties) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", a, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "application":
+				err = unpopulate(val, "Application", &a.Application)
+				delete(rawMsg, key)
+		case "certificates":
+				err = unpopulate(val, "Certificates", &a.Certificates)
+				delete(rawMsg, key)
+		case "keys":
+				err = unpopulate(val, "Keys", &a.Keys)
+				delete(rawMsg, key)
+		case "kind":
+				err = unpopulate(val, "Kind", &a.Kind)
+				delete(rawMsg, key)
+		case "provisioningState":
+				err = unpopulate(val, "ProvisioningState", &a.ProvisioningState)
+				delete(rawMsg, key)
+		case "resource":
+				err = unpopulate(val, "Resource", &a.Resource)
+				delete(rawMsg, key)
+		case "secrets":
+				err = unpopulate(val, "Secrets", &a.Secrets)
+				delete(rawMsg, key)
+		case "status":
+				err = unpopulate(val, "Status", &a.Status)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", a, err)
+		}
+	}
+	return nil
+}
+
 // MarshalJSON implements the json.Marshaller interface for type BasicResourceProperties.
 func (b BasicResourceProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
@@ -156,6 +211,53 @@ func (b *BasicResourceProperties) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
+// MarshalJSON implements the json.Marshaller interface for type CertificateObjectProperties.
+func (c CertificateObjectProperties) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "alias", c.Alias)
+	populate(objectMap, "certType", c.CertType)
+	populate(objectMap, "encoding", c.Encoding)
+	populate(objectMap, "format", c.Format)
+	populate(objectMap, "name", c.Name)
+	populate(objectMap, "version", c.Version)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type CertificateObjectProperties.
+func (c *CertificateObjectProperties) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", c, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "alias":
+				err = unpopulate(val, "Alias", &c.Alias)
+				delete(rawMsg, key)
+		case "certType":
+				err = unpopulate(val, "CertType", &c.CertType)
+				delete(rawMsg, key)
+		case "encoding":
+				err = unpopulate(val, "Encoding", &c.Encoding)
+				delete(rawMsg, key)
+		case "format":
+				err = unpopulate(val, "Format", &c.Format)
+				delete(rawMsg, key)
+		case "name":
+				err = unpopulate(val, "Name", &c.Name)
+				delete(rawMsg, key)
+		case "version":
+				err = unpopulate(val, "Version", &c.Version)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", c, err)
+		}
+	}
+	return nil
+}
+
 // MarshalJSON implements the json.Marshaller interface for type ConnectionProperties.
 func (c ConnectionProperties) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
@@ -1287,6 +1389,41 @@ func (i *IamProperties) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
+// MarshalJSON implements the json.Marshaller interface for type KeyObjectProperties.
+func (k KeyObjectProperties) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "alias", k.Alias)
+	populate(objectMap, "name", k.Name)
+	populate(objectMap, "version", k.Version)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type KeyObjectProperties.
+func (k *KeyObjectProperties) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", k, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "alias":
+				err = unpopulate(val, "Alias", &k.Alias)
+				delete(rawMsg, key)
+		case "name":
+				err = unpopulate(val, "Name", &k.Name)
+				delete(rawMsg, key)
+		case "version":
+				err = unpopulate(val, "Version", &k.Version)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", k, err)
+		}
+	}
+	return nil
+}
+
 // MarshalJSON implements the json.Marshaller interface for type KubernetesCompute.
 func (k KubernetesCompute) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
@@ -1454,6 +1591,45 @@ func (r *ResourceStatus) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
+// MarshalJSON implements the json.Marshaller interface for type SecretObjectProperties.
+func (s SecretObjectProperties) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "alias", s.Alias)
+	populate(objectMap, "encoding", s.Encoding)
+	populate(objectMap, "name", s.Name)
+	populate(objectMap, "version", s.Version)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type SecretObjectProperties.
+func (s *SecretObjectProperties) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", s, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "alias":
+				err = unpopulate(val, "Alias", &s.Alias)
+				delete(rawMsg, key)
+		case "encoding":
+				err = unpopulate(val, "Encoding", &s.Encoding)
+				delete(rawMsg, key)
+		case "name":
+				err = unpopulate(val, "Name", &s.Name)
+				delete(rawMsg, key)
+		case "version":
+				err = unpopulate(val, "Version", &s.Version)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", s, err)
+		}
+	}
+	return nil
+}
+
 // MarshalJSON implements the json.Marshaller interface for type SystemData.
 func (s SystemData) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
@@ -1618,6 +1794,127 @@ func (v *Volume) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
+// MarshalJSON implements the json.Marshaller interface for type VolumeProperties.
+func (v VolumeProperties) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "application", v.Application)
+	objectMap["kind"] = v.Kind
+	populate(objectMap, "provisioningState", v.ProvisioningState)
+	populate(objectMap, "status", v.Status)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type VolumeProperties.
+func (v *VolumeProperties) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", v, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "application":
+				err = unpopulate(val, "Application", &v.Application)
+				delete(rawMsg, key)
+		case "kind":
+				err = unpopulate(val, "Kind", &v.Kind)
+				delete(rawMsg, key)
+		case "provisioningState":
+				err = unpopulate(val, "ProvisioningState", &v.ProvisioningState)
+				delete(rawMsg, key)
+		case "status":
+				err = unpopulate(val, "Status", &v.Status)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", v, err)
+		}
+	}
+	return nil
+}
+
+// MarshalJSON implements the json.Marshaller interface for type VolumeResource.
+func (v VolumeResource) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "id", v.ID)
+	populate(objectMap, "location", v.Location)
+	populate(objectMap, "name", v.Name)
+	populate(objectMap, "properties", v.Properties)
+	populate(objectMap, "systemData", v.SystemData)
+	populate(objectMap, "tags", v.Tags)
+	populate(objectMap, "type", v.Type)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type VolumeResource.
+func (v *VolumeResource) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", v, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "id":
+				err = unpopulate(val, "ID", &v.ID)
+				delete(rawMsg, key)
+		case "location":
+				err = unpopulate(val, "Location", &v.Location)
+				delete(rawMsg, key)
+		case "name":
+				err = unpopulate(val, "Name", &v.Name)
+				delete(rawMsg, key)
+		case "properties":
+				v.Properties, err = unmarshalVolumePropertiesClassification(val)
+				delete(rawMsg, key)
+		case "systemData":
+				err = unpopulate(val, "SystemData", &v.SystemData)
+				delete(rawMsg, key)
+		case "tags":
+				err = unpopulate(val, "Tags", &v.Tags)
+				delete(rawMsg, key)
+		case "type":
+				err = unpopulate(val, "Type", &v.Type)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", v, err)
+		}
+	}
+	return nil
+}
+
+// MarshalJSON implements the json.Marshaller interface for type VolumeResourceList.
+func (v VolumeResourceList) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "nextLink", v.NextLink)
+	populate(objectMap, "value", v.Value)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type VolumeResourceList.
+func (v *VolumeResourceList) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", v, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "nextLink":
+				err = unpopulate(val, "NextLink", &v.NextLink)
+				delete(rawMsg, key)
+		case "value":
+				err = unpopulate(val, "Value", &v.Value)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", v, err)
+		}
+	}
+	return nil
+}
+
 func populate(m map[string]interface{}, k string, v interface{}) {
 	if v == nil {
 		return
diff --git a/pkg/corerp/api/v20220315privatepreview/zz_generated_polymorphic_helpers.go b/pkg/corerp/api/v20220315privatepreview/zz_generated_polymorphic_helpers.go
index 934faa660..351ca5371 100644
--- a/pkg/corerp/api/v20220315privatepreview/zz_generated_polymorphic_helpers.go
+++ b/pkg/corerp/api/v20220315privatepreview/zz_generated_polymorphic_helpers.go
@@ -129,3 +129,21 @@ func unmarshalVolumeClassificationMap(rawMsg json.RawMessage) (map[string]Volume
 	return fMap, nil
 }
 
+func unmarshalVolumePropertiesClassification(rawMsg json.RawMessage) (VolumePropertiesClassification, error) {
+	if rawMsg == nil {
+		return nil, nil
+	}
+	var m map[string]interface{}
+	if err := json.Unmarshal(rawMsg, &m); err != nil {
+		return nil, err
+	}
+	var b VolumePropertiesClassification
+	switch m["kind"] {
+	case "azure.com.keyvault":
+		b = &AzureKeyVaultVolumeProperties{}
+	default:
+		b = &VolumeProperties{}
+	}
+	return b, json.Unmarshal(rawMsg, b)
+}
+
diff --git a/pkg/corerp/api/v20220315privatepreview/zz_generated_response_types.go b/pkg/corerp/api/v20220315privatepreview/zz_generated_response_types.go
index 578bba1a7..e6d8a0392 100644
--- a/pkg/corerp/api/v20220315privatepreview/zz_generated_response_types.go
+++ b/pkg/corerp/api/v20220315privatepreview/zz_generated_response_types.go
@@ -134,3 +134,28 @@ type HTTPRoutesClientUpdateResponse struct {
 	HTTPRouteResource
 }
 
+// VolumesClientCreateOrUpdateResponse contains the response from method VolumesClient.CreateOrUpdate.
+type VolumesClientCreateOrUpdateResponse struct {
+	VolumeResource
+}
+
+// VolumesClientDeleteResponse contains the response from method VolumesClient.Delete.
+type VolumesClientDeleteResponse struct {
+	// placeholder for future response values
+}
+
+// VolumesClientGetResponse contains the response from method VolumesClient.Get.
+type VolumesClientGetResponse struct {
+	VolumeResource
+}
+
+// VolumesClientListByScopeResponse contains the response from method VolumesClient.ListByScope.
+type VolumesClientListByScopeResponse struct {
+	VolumeResourceList
+}
+
+// VolumesClientUpdateResponse contains the response from method VolumesClient.Update.
+type VolumesClientUpdateResponse struct {
+	VolumeResource
+}
+
diff --git a/pkg/corerp/api/v20220315privatepreview/zz_generated_volumes_client.go b/pkg/corerp/api/v20220315privatepreview/zz_generated_volumes_client.go
new file mode 100644
index 000000000..ea73b21ce
--- /dev/null
+++ b/pkg/corerp/api/v20220315privatepreview/zz_generated_volumes_client.go
@@ -0,0 +1,297 @@
+//go:build go1.18
+// +build go1.18
+
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+// Code generated by Microsoft (R) AutoRest Code Generator.
+// Changes may cause incorrect behavior and will be lost if the code is regenerated.
+// DO NOT EDIT.
+
+package v20220315privatepreview
+
+import (
+	"context"
+	"errors"
+	"github.com/Azure/azure-sdk-for-go/sdk/azcore"
+	"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
+	armruntime "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm/runtime"
+	"github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud"
+	"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
+	"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+// VolumesClient contains the methods for the Volumes group.
+// Don't use this type directly, use NewVolumesClient() instead.
+type VolumesClient struct {
+	host string
+	rootScope string
+	pl runtime.Pipeline
+}
+
+// NewVolumesClient creates a new instance of VolumesClient with the specified values.
+// rootScope - The scope in which the resource is present. For Azure resource this would be /subscriptions/{subscriptionID}/resourceGroup/{resourcegroupID}
+// credential - used to authorize requests. Usually a credential from azidentity.
+// options - pass nil to accept the default values.
+func NewVolumesClient(rootScope string, credential azcore.TokenCredential, options *arm.ClientOptions) (*VolumesClient, error) {
+	if options == nil {
+		options = &arm.ClientOptions{}
+	}
+	ep := cloud.AzurePublic.Services[cloud.ResourceManager].Endpoint
+	if c, ok := options.Cloud.Services[cloud.ResourceManager]; ok {
+		ep = c.Endpoint
+	}
+	pl, err := armruntime.NewPipeline(moduleName, moduleVersion, credential, runtime.PipelineOptions{}, options)
+	if err != nil {
+		return nil, err
+	}
+	client := &VolumesClient{
+		rootScope: rootScope,
+		host: ep,
+pl: pl,
+	}
+	return client, nil
+}
+
+// CreateOrUpdate - Create or update an Volume.
+// If the operation fails it returns an *azcore.ResponseError type.
+// Generated from API version 2022-03-15-privatepreview
+// volumeName - The name of the Volume.
+// volumeResource - Volume details
+// options - VolumesClientCreateOrUpdateOptions contains the optional parameters for the VolumesClient.CreateOrUpdate method.
+func (client *VolumesClient) CreateOrUpdate(ctx context.Context, volumeName string, volumeResource VolumeResource, options *VolumesClientCreateOrUpdateOptions) (VolumesClientCreateOrUpdateResponse, error) {
+	req, err := client.createOrUpdateCreateRequest(ctx, volumeName, volumeResource, options)
+	if err != nil {
+		return VolumesClientCreateOrUpdateResponse{}, err
+	}
+	resp, err := client.pl.Do(req)
+	if err != nil {
+		return VolumesClientCreateOrUpdateResponse{}, err
+	}
+	if !runtime.HasStatusCode(resp, http.StatusOK, http.StatusCreated, http.StatusNoContent) {
+		return VolumesClientCreateOrUpdateResponse{}, runtime.NewResponseError(resp)
+	}
+	return client.createOrUpdateHandleResponse(resp)
+}
+
+// createOrUpdateCreateRequest creates the CreateOrUpdate request.
+func (client *VolumesClient) createOrUpdateCreateRequest(ctx context.Context, volumeName string, volumeResource VolumeResource, options *VolumesClientCreateOrUpdateOptions) (*policy.Request, error) {
+	urlPath := "/{rootScope}/providers/Applications.Core/volumes/{volumeName}"
+	urlPath = strings.ReplaceAll(urlPath, "{rootScope}", client.rootScope)
+	if volumeName == "" {
+		return nil, errors.New("parameter volumeName cannot be empty")
+	}
+	urlPath = strings.ReplaceAll(urlPath, "{volumeName}", url.PathEscape(volumeName))
+	req, err := runtime.NewRequest(ctx, http.MethodPut, runtime.JoinPaths(client.host, urlPath))
+	if err != nil {
+		return nil, err
+	}
+	reqQP := req.Raw().URL.Query()
+	reqQP.Set("api-version", "2022-03-15-privatepreview")
+	req.Raw().URL.RawQuery = reqQP.Encode()
+	req.Raw().Header["Accept"] = []string{"application/json"}
+	return req, runtime.MarshalAsJSON(req, volumeResource)
+}
+
+// createOrUpdateHandleResponse handles the CreateOrUpdate response.
+func (client *VolumesClient) createOrUpdateHandleResponse(resp *http.Response) (VolumesClientCreateOrUpdateResponse, error) {
+	result := VolumesClientCreateOrUpdateResponse{}
+	if err := runtime.UnmarshalAsJSON(resp, &result.VolumeResource); err != nil {
+		return VolumesClientCreateOrUpdateResponse{}, err
+	}
+	return result, nil
+}
+
+// Delete - Delete an Volume.
+// If the operation fails it returns an *azcore.ResponseError type.
+// Generated from API version 2022-03-15-privatepreview
+// volumeName - The name of the Volume.
+// options - VolumesClientDeleteOptions contains the optional parameters for the VolumesClient.Delete method.
+func (client *VolumesClient) Delete(ctx context.Context, volumeName string, options *VolumesClientDeleteOptions) (VolumesClientDeleteResponse, error) {
+	req, err := client.deleteCreateRequest(ctx, volumeName, options)
+	if err != nil {
+		return VolumesClientDeleteResponse{}, err
+	}
+	resp, err := client.pl.Do(req)
+	if err != nil {
+		return VolumesClientDeleteResponse{}, err
+	}
+	if !runtime.HasStatusCode(resp, http.StatusOK, http.StatusAccepted, http.StatusNoContent) {
+		return VolumesClientDeleteResponse{}, runtime.NewResponseError(resp)
+	}
+	return VolumesClientDeleteResponse{}, nil
+}
+
+// deleteCreateRequest creates the Delete request.
+func (client *VolumesClient) deleteCreateRequest(ctx context.Context, volumeName string, options *VolumesClientDeleteOptions) (*policy.Request, error) {
+	urlPath := "/{rootScope}/providers/Applications.Core/volumes/{volumeName}"
+	urlPath = strings.ReplaceAll(urlPath, "{rootScope}", client.rootScope)
+	if volumeName == "" {
+		return nil, errors.New("parameter volumeName cannot be empty")
+	}
+	urlPath = strings.ReplaceAll(urlPath, "{volumeName}", url.PathEscape(volumeName))
+	req, err := runtime.NewRequest(ctx, http.MethodDelete, runtime.JoinPaths(client.host, urlPath))
+	if err != nil {
+		return nil, err
+	}
+	reqQP := req.Raw().URL.Query()
+	reqQP.Set("api-version", "2022-03-15-privatepreview")
+	req.Raw().URL.RawQuery = reqQP.Encode()
+	req.Raw().Header["Accept"] = []string{"application/json"}
+	return req, nil
+}
+
+// Get - Gets the properties of an Volume.
+// If the operation fails it returns an *azcore.ResponseError type.
+// Generated from API version 2022-03-15-privatepreview
+// volumeName - The name of the Volume.
+// options - VolumesClientGetOptions contains the optional parameters for the VolumesClient.Get method.
+func (client *VolumesClient) Get(ctx context.Context, volumeName string, options *VolumesClientGetOptions) (VolumesClientGetResponse, error) {
+	req, err := client.getCreateRequest(ctx, volumeName, options)
+	if err != nil {
+		return VolumesClientGetResponse{}, err
+	}
+	resp, err := client.pl.Do(req)
+	if err != nil {
+		return VolumesClientGetResponse{}, err
+	}
+	if !runtime.HasStatusCode(resp, http.StatusOK) {
+		return VolumesClientGetResponse{}, runtime.NewResponseError(resp)
+	}
+	return client.getHandleResponse(resp)
+}
+
+// getCreateRequest creates the Get request.
+func (client *VolumesClient) getCreateRequest(ctx context.Context, volumeName string, options *VolumesClientGetOptions) (*policy.Request, error) {
+	urlPath := "/{rootScope}/providers/Applications.Core/volumes/{volumeName}"
+	urlPath = strings.ReplaceAll(urlPath, "{rootScope}", client.rootScope)
+	if volumeName == "" {
+		return nil, errors.New("parameter volumeName cannot be empty")
+	}
+	urlPath = strings.ReplaceAll(urlPath, "{volumeName}", url.PathEscape(volumeName))
+	req, err := runtime.NewRequest(ctx, http.MethodGet, runtime.JoinPaths(client.host, urlPath))
+	if err != nil {
+		return nil, err
+	}
+	reqQP := req.Raw().URL.Query()
+	reqQP.Set("api-version", "2022-03-15-privatepreview")
+	req.Raw().URL.RawQuery = reqQP.Encode()
+	req.Raw().Header["Accept"] = []string{"application/json"}
+	return req, nil
+}
+
+// getHandleResponse handles the Get response.
+func (client *VolumesClient) getHandleResponse(resp *http.Response) (VolumesClientGetResponse, error) {
+	result := VolumesClientGetResponse{}
+	if err := runtime.UnmarshalAsJSON(resp, &result.VolumeResource); err != nil {
+		return VolumesClientGetResponse{}, err
+	}
+	return result, nil
+}
+
+// NewListByScopePager - List all volumes in the given scope.
+// Generated from API version 2022-03-15-privatepreview
+// options - VolumesClientListByScopeOptions contains the optional parameters for the VolumesClient.ListByScope method.
+func (client *VolumesClient) NewListByScopePager(options *VolumesClientListByScopeOptions) (*runtime.Pager[VolumesClientListByScopeResponse]) {
+	return runtime.NewPager(runtime.PagingHandler[VolumesClientListByScopeResponse]{
+		More: func(page VolumesClientListByScopeResponse) bool {
+			return page.NextLink != nil && len(*page.NextLink) > 0
+		},
+		Fetcher: func(ctx context.Context, page *VolumesClientListByScopeResponse) (VolumesClientListByScopeResponse, error) {
+			var req *policy.Request
+			var err error
+			if page == nil {
+				req, err = client.listByScopeCreateRequest(ctx, options)
+			} else {
+				req, err = runtime.NewRequest(ctx, http.MethodGet, *page.NextLink)
+			}
+			if err != nil {
+				return VolumesClientListByScopeResponse{}, err
+			}
+			resp, err := client.pl.Do(req)
+			if err != nil {
+				return VolumesClientListByScopeResponse{}, err
+			}
+			if !runtime.HasStatusCode(resp, http.StatusOK) {
+				return VolumesClientListByScopeResponse{}, runtime.NewResponseError(resp)
+			}
+			return client.listByScopeHandleResponse(resp)
+		},
+	})
+}
+
+// listByScopeCreateRequest creates the ListByScope request.
+func (client *VolumesClient) listByScopeCreateRequest(ctx context.Context, options *VolumesClientListByScopeOptions) (*policy.Request, error) {
+	urlPath := "/{rootScope}/providers/Applications.Core/volumes"
+	urlPath = strings.ReplaceAll(urlPath, "{rootScope}", client.rootScope)
+	req, err := runtime.NewRequest(ctx, http.MethodGet, runtime.JoinPaths(client.host, urlPath))
+	if err != nil {
+		return nil, err
+	}
+	reqQP := req.Raw().URL.Query()
+	reqQP.Set("api-version", "2022-03-15-privatepreview")
+	req.Raw().URL.RawQuery = reqQP.Encode()
+	req.Raw().Header["Accept"] = []string{"application/json"}
+	return req, nil
+}
+
+// listByScopeHandleResponse handles the ListByScope response.
+func (client *VolumesClient) listByScopeHandleResponse(resp *http.Response) (VolumesClientListByScopeResponse, error) {
+	result := VolumesClientListByScopeResponse{}
+	if err := runtime.UnmarshalAsJSON(resp, &result.VolumeResourceList); err != nil {
+		return VolumesClientListByScopeResponse{}, err
+	}
+	return result, nil
+}
+
+// Update - Update the properties of an existing Volume.
+// If the operation fails it returns an *azcore.ResponseError type.
+// Generated from API version 2022-03-15-privatepreview
+// volumeName - The name of the Volume.
+// volumeResource - Volume details
+// options - VolumesClientUpdateOptions contains the optional parameters for the VolumesClient.Update method.
+func (client *VolumesClient) Update(ctx context.Context, volumeName string, volumeResource VolumeResource, options *VolumesClientUpdateOptions) (VolumesClientUpdateResponse, error) {
+	req, err := client.updateCreateRequest(ctx, volumeName, volumeResource, options)
+	if err != nil {
+		return VolumesClientUpdateResponse{}, err
+	}
+	resp, err := client.pl.Do(req)
+	if err != nil {
+		return VolumesClientUpdateResponse{}, err
+	}
+	if !runtime.HasStatusCode(resp, http.StatusOK, http.StatusCreated, http.StatusNoContent) {
+		return VolumesClientUpdateResponse{}, runtime.NewResponseError(resp)
+	}
+	return client.updateHandleResponse(resp)
+}
+
+// updateCreateRequest creates the Update request.
+func (client *VolumesClient) updateCreateRequest(ctx context.Context, volumeName string, volumeResource VolumeResource, options *VolumesClientUpdateOptions) (*policy.Request, error) {
+	urlPath := "/{rootScope}/providers/Applications.Core/volumes/{volumeName}"
+	urlPath = strings.ReplaceAll(urlPath, "{rootScope}", client.rootScope)
+	if volumeName == "" {
+		return nil, errors.New("parameter volumeName cannot be empty")
+	}
+	urlPath = strings.ReplaceAll(urlPath, "{volumeName}", url.PathEscape(volumeName))
+	req, err := runtime.NewRequest(ctx, http.MethodPatch, runtime.JoinPaths(client.host, urlPath))
+	if err != nil {
+		return nil, err
+	}
+	reqQP := req.Raw().URL.Query()
+	reqQP.Set("api-version", "2022-03-15-privatepreview")
+	req.Raw().URL.RawQuery = reqQP.Encode()
+	req.Raw().Header["Accept"] = []string{"application/json"}
+	return req, runtime.MarshalAsJSON(req, volumeResource)
+}
+
+// updateHandleResponse handles the Update response.
+func (client *VolumesClient) updateHandleResponse(resp *http.Response) (VolumesClientUpdateResponse, error) {
+	result := VolumesClientUpdateResponse{}
+	if err := runtime.UnmarshalAsJSON(resp, &result.VolumeResource); err != nil {
+		return VolumesClientUpdateResponse{}, err
+	}
+	return result, nil
+}
+
diff --git a/pkg/corerp/frontend/controller/containers/createorupdatecontainer.go b/pkg/corerp/frontend/controller/containers/createorupdatecontainer.go
index 7d9954a12..21ea3de5a 100644
--- a/pkg/corerp/frontend/controller/containers/createorupdatecontainer.go
+++ b/pkg/corerp/frontend/controller/containers/createorupdatecontainer.go
@@ -76,7 +76,7 @@ func (e *CreateOrUpdateContainer) Run(ctx context.Context, req *http.Request) (r
 
 	if r, err := e.PrepareAsyncOperation(ctx, newResource, v1.ProvisioningStateAccepted, AsyncPutContainerOperationTimeout, &etag); r != nil || err != nil {
 		return r, err
-	}
 
+	}
 	return e.ConstructAsyncResponse(ctx, req.Method, etag, newResource)
 }
diff --git a/pkg/rp/types.go b/pkg/rp/types.go
index a2d97e2e9..05ff5c1bf 100644
--- a/pkg/rp/types.go
+++ b/pkg/rp/types.go
@@ -100,3 +100,9 @@ type DeploymentDataModel interface {
 
 	OutputResources() []outputresource.OutputResource
 }
+
+// BasicDaprResourceProperties is the basic resource properties for dapr resources.
+type BasicDaprResourceProperties struct {
+	// ComponentName represents the name of the component.
+	ComponentName string `json:"componentName,omitempty"`
+}
diff --git a/pkg/ucp/api/README.md b/pkg/ucp/api/README.md
index 37bba1fee..4792e537c 100644
--- a/pkg/ucp/api/README.md
+++ b/pkg/ucp/api/README.md
@@ -60,4 +60,4 @@ These settings apply only when `--tag=ucp-2022-03-15-privatepreview` is specifie
 
 ```yaml $(tag) == 'ucp-2022-03-15-privatepreview'
 output-folder: ./v20220315privatepreview
-```
\ No newline at end of file
+```
diff --git a/pkg/ucp/api/v20220315privatepreview/zz_generated_models.go b/pkg/ucp/api/v20220315privatepreview/zz_generated_models.go
index 0e38fb67f..853a9f148 100644
--- a/pkg/ucp/api/v20220315privatepreview/zz_generated_models.go
+++ b/pkg/ucp/api/v20220315privatepreview/zz_generated_models.go
@@ -87,10 +87,34 @@ type PlanesClientListOptions struct {
 	// placeholder for future optional parameters
 }
 
+// Resource - Common fields that are returned in the response for all Azure Resource Manager resources
+type Resource struct {
+	// READ-ONLY; Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
+	ID *string `json:"id,omitempty" azure:"ro"`
+
+	// READ-ONLY; The name of the resource
+	Name *string `json:"name,omitempty" azure:"ro"`
+
+	// READ-ONLY; The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
+	Type *string `json:"type,omitempty" azure:"ro"`
+}
+
 // ResourceGroupResource - UCP ResourceGroup.
 type ResourceGroupResource struct {
-	// UCP ResourceGroup properties
-	Properties *ResourceGroupResourceProperties `json:"properties,omitempty"`
+	// REQUIRED; The geo-location where the resource lives
+	Location *string `json:"location,omitempty"`
+
+	// Resource tags.
+	Tags map[string]*string `json:"tags,omitempty"`
+
+	// READ-ONLY; Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
+	ID *string `json:"id,omitempty" azure:"ro"`
+
+	// READ-ONLY; The name of the resource
+	Name *string `json:"name,omitempty" azure:"ro"`
+
+	// READ-ONLY; The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
+	Type *string `json:"type,omitempty" azure:"ro"`
 }
 
 // ResourceGroupResourceList - The list of resource groups.
@@ -99,12 +123,6 @@ type ResourceGroupResourceList struct {
 	Value []*ResourceGroupResource `json:"value,omitempty"`
 }
 
-// ResourceGroupResourceProperties - UCP ResourceGroup properties
-type ResourceGroupResourceProperties struct {
-	// READ-ONLY; The name of the resource group
-	Name *string `json:"name,omitempty" azure:"ro"`
-}
-
 // ResourceGroupsClientCreateOrUpdateOptions contains the optional parameters for the ResourceGroupsClient.CreateOrUpdate
 // method.
 type ResourceGroupsClientCreateOrUpdateOptions struct {
@@ -126,3 +144,22 @@ type ResourceGroupsClientListOptions struct {
 	// placeholder for future optional parameters
 }
 
+// TrackedResource - The resource model definition for an Azure Resource Manager tracked top level resource which has 'tags'
+// and a 'location'
+type TrackedResource struct {
+	// REQUIRED; The geo-location where the resource lives
+	Location *string `json:"location,omitempty"`
+
+	// Resource tags.
+	Tags map[string]*string `json:"tags,omitempty"`
+
+	// READ-ONLY; Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
+	ID *string `json:"id,omitempty" azure:"ro"`
+
+	// READ-ONLY; The name of the resource
+	Name *string `json:"name,omitempty" azure:"ro"`
+
+	// READ-ONLY; The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
+	Type *string `json:"type,omitempty" azure:"ro"`
+}
+
diff --git a/pkg/ucp/api/v20220315privatepreview/zz_generated_models_serde.go b/pkg/ucp/api/v20220315privatepreview/zz_generated_models_serde.go
index 215ddc472..c90013541 100644
--- a/pkg/ucp/api/v20220315privatepreview/zz_generated_models_serde.go
+++ b/pkg/ucp/api/v20220315privatepreview/zz_generated_models_serde.go
@@ -206,10 +206,49 @@ func (p *PlaneResourceProperties) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
+// MarshalJSON implements the json.Marshaller interface for type Resource.
+func (r Resource) MarshalJSON() ([]byte, error) {
+	objectMap := make(map[string]interface{})
+	populate(objectMap, "id", r.ID)
+	populate(objectMap, "name", r.Name)
+	populate(objectMap, "type", r.Type)
+	return json.Marshal(objectMap)
+}
+
+// UnmarshalJSON implements the json.Unmarshaller interface for type Resource.
+func (r *Resource) UnmarshalJSON(data []byte) error {
+	var rawMsg map[string]json.RawMessage
+	if err := json.Unmarshal(data, &rawMsg); err != nil {
+		return fmt.Errorf("unmarshalling type %T: %v", r, err)
+	}
+	for key, val := range rawMsg {
+		var err error
+		switch key {
+		case "id":
+				err = unpopulate(val, "ID", &r.ID)
+				delete(rawMsg, key)
+		case "name":
+				err = unpopulate(val, "Name", &r.Name)
+				delete(rawMsg, key)
+		case "type":
+				err = unpopulate(val, "Type", &r.Type)
+				delete(rawMsg, key)
+		}
+		if err != nil {
+			return fmt.Errorf("unmarshalling type %T: %v", r, err)
+		}
+	}
+	return nil
+}
+
 // MarshalJSON implements the json.Marshaller interface for type ResourceGroupResource.
 func (r ResourceGroupResource) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
-	populate(objectMap, "properties", r.Properties)
+	populate(objectMap, "id", r.ID)
+	populate(objectMap, "location", r.Location)
+	populate(objectMap, "name", r.Name)
+	populate(objectMap, "tags", r.Tags)
+	populate(objectMap, "type", r.Type)
 	return json.Marshal(objectMap)
 }
 
@@ -222,8 +261,20 @@ func (r *ResourceGroupResource) UnmarshalJSON(data []byte) error {
 	for key, val := range rawMsg {
 		var err error
 		switch key {
-		case "properties":
-				err = unpopulate(val, "Properties", &r.Properties)
+		case "id":
+				err = unpopulate(val, "ID", &r.ID)
+				delete(rawMsg, key)
+		case "location":
+				err = unpopulate(val, "Location", &r.Location)
+				delete(rawMsg, key)
+		case "name":
+				err = unpopulate(val, "Name", &r.Name)
+				delete(rawMsg, key)
+		case "tags":
+				err = unpopulate(val, "Tags", &r.Tags)
+				delete(rawMsg, key)
+		case "type":
+				err = unpopulate(val, "Type", &r.Type)
 				delete(rawMsg, key)
 		}
 		if err != nil {
@@ -260,28 +311,44 @@ func (r *ResourceGroupResourceList) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-// MarshalJSON implements the json.Marshaller interface for type ResourceGroupResourceProperties.
-func (r ResourceGroupResourceProperties) MarshalJSON() ([]byte, error) {
+// MarshalJSON implements the json.Marshaller interface for type TrackedResource.
+func (t TrackedResource) MarshalJSON() ([]byte, error) {
 	objectMap := make(map[string]interface{})
-	populate(objectMap, "name", r.Name)
+	populate(objectMap, "id", t.ID)
+	populate(objectMap, "location", t.Location)
+	populate(objectMap, "name", t.Name)
+	populate(objectMap, "tags", t.Tags)
+	populate(objectMap, "type", t.Type)
 	return json.Marshal(objectMap)
 }
 
-// UnmarshalJSON implements the json.Unmarshaller interface for type ResourceGroupResourceProperties.
-func (r *ResourceGroupResourceProperties) UnmarshalJSON(data []byte) error {
+// UnmarshalJSON implements the json.Unmarshaller interface for type TrackedResource.
+func (t *TrackedResource) UnmarshalJSON(data []byte) error {
 	var rawMsg map[string]json.RawMessage
 	if err := json.Unmarshal(data, &rawMsg); err != nil {
-		return fmt.Errorf("unmarshalling type %T: %v", r, err)
+		return fmt.Errorf("unmarshalling type %T: %v", t, err)
 	}
 	for key, val := range rawMsg {
 		var err error
 		switch key {
+		case "id":
+				err = unpopulate(val, "ID", &t.ID)
+				delete(rawMsg, key)
+		case "location":
+				err = unpopulate(val, "Location", &t.Location)
+				delete(rawMsg, key)
 		case "name":
-				err = unpopulate(val, "Name", &r.Name)
+				err = unpopulate(val, "Name", &t.Name)
+				delete(rawMsg, key)
+		case "tags":
+				err = unpopulate(val, "Tags", &t.Tags)
+				delete(rawMsg, key)
+		case "type":
+				err = unpopulate(val, "Type", &t.Type)
 				delete(rawMsg, key)
 		}
 		if err != nil {
-			return fmt.Errorf("unmarshalling type %T: %v", r, err)
+			return fmt.Errorf("unmarshalling type %T: %v", t, err)
 		}
 	}
 	return nil
diff --git a/pkg/ucp/aws/errorhandler.go b/pkg/ucp/aws/errorhandler.go
new file mode 100644
index 000000000..f7b367f35
--- /dev/null
+++ b/pkg/ucp/aws/errorhandler.go
@@ -0,0 +1,60 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+package aws
+
+import (
+	"errors"
+
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol/types"
+	"github.com/aws/smithy-go"
+	smithyhttp "github.com/aws/smithy-go/transport/http"
+	"github.com/project-radius/radius/pkg/ucp/rest"
+)
+
+func IsAWSResourceNotFound(err error) bool {
+	target := &types.ResourceNotFoundException{}
+	return errors.As(err, &target)
+}
+
+func HandleAWSError(err error) (rest.Response, error) {
+	operationErr := &smithy.OperationError{}
+	if !errors.As(err, &operationErr) {
+		return nil, err
+	}
+
+	httpErr := &smithyhttp.ResponseError{}
+	if !errors.As(operationErr.Err, &httpErr) {
+		return nil, err
+	}
+
+	var apiErr smithy.APIError
+	if !errors.As(httpErr.Err, &apiErr) {
+		return nil, err
+	}
+
+	e := rest.ErrorResponse{
+		Error: rest.ErrorDetails{
+			Code:    apiErr.ErrorCode(),
+			Message: apiErr.ErrorMessage(),
+		},
+	}
+
+	// We can't always trust apiErr.Fault :-/
+	fault := apiErr.ErrorFault()
+	if fault == smithy.FaultUnknown {
+		switch apiErr.ErrorCode() {
+		case "ValidationException":
+			fault = smithy.FaultClient
+		default:
+			fault = smithy.FaultServer
+		}
+	}
+
+	if fault == smithy.FaultClient {
+		return rest.NewBadRequestARMResponse(e), nil
+	}
+
+	return rest.NewInternalServerErrorARMResponse(e), nil
+}
diff --git a/pkg/ucp/frontend/api/routes.go b/pkg/ucp/frontend/api/routes.go
index 43e10b400..0958ec88c 100644
--- a/pkg/ucp/frontend/api/routes.go
+++ b/pkg/ucp/frontend/api/routes.go
@@ -12,6 +12,7 @@ import (
 	"github.com/gorilla/mux"
 	v1 "github.com/project-radius/radius/pkg/armrpc/api/v1"
 	ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller"
+	awsproxy_ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller/awsproxy"
 	kubernetes_ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller/kubernetes"
 	planes_ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller/planes"
 	resourcegroups_ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller/resourcegroups"
@@ -22,9 +23,14 @@ import (
 
 // TODO: Use variables and construct the path as we add more APIs.
 const (
-	planeCollectionPath   = "/planes"
-	planeItemPath         = "/planes/{PlaneType}/{PlaneID}"
-	planeCollectionByType = "/planes/{PlaneType}"
+	planeCollectionPath       = "/planes"
+	awsPlaneType              = "/planes/aws"
+	planeItemPath             = "/planes/{PlaneType}/{PlaneID}"
+	planeCollectionByType     = "/planes/{PlaneType}"
+	awsOperationResultsPath   = "/{AWSPlaneName}/accounts/{AccountID}/regions/{Region}/providers/{Provider}/locations/{Location}/operationResults/{operationID}"
+	awsOperationStatusesPath  = "/{AWSPlaneName}/accounts/{AccountID}/regions/{Region}/providers/{Provider}/locations/{Location}/operationStatuses/{operationID}"
+	awsResourceCollectionPath = "/{AWSPlaneName}/accounts/{AccountID}/regions/{Region}/providers/{Provider}/{ResourceType}"
+	awsResourcePath           = "/{AWSPlaneName}/accounts/{AccountID}/regions/{Region}/providers/{Provider}/{ResourceType}/{ResourceName}"
 )
 
 var resourceGroupCollectionPath = fmt.Sprintf("%s/%s", planeItemPath, "resource{[gG]}roups")
@@ -62,9 +68,6 @@ func Register(ctx context.Context, router *mux.Router, ctrlOpts ctrl.Options) er
 		return err
 	}
 
-	subrouter := router.PathPrefix(baseURL + planeCollectionPath).Subrouter()
-	subrouter.Use(validator.APIValidatorUCP(specLoader))
-
 	rootScopeRouter := router.PathPrefix(baseURL + planeCollectionPath).Subrouter()
 	rootScopeRouter.Use(validator.APIValidatorUCP(specLoader))
 	ctrl.ConfigureDefaultHandlers(router, ctrl.Options{
@@ -78,6 +81,12 @@ func Register(ctx context.Context, router *mux.Router, ctrlOpts ctrl.Options) er
 	resourceGroupCollectionSubRouter := router.Path(fmt.Sprintf("%s%s", baseURL, resourceGroupCollectionPath)).Subrouter()
 	resourceGroupSubRouter := router.Path(fmt.Sprintf("%s%s", baseURL, resourceGroupItemPath)).Subrouter()
 
+	awsResourcesSubRouter := router.PathPrefix(fmt.Sprintf("%s%s", baseURL, awsPlaneType)).Subrouter()
+	awsResourceCollectionSubRouter := awsResourcesSubRouter.Path(awsResourceCollectionPath).Subrouter()
+	awsSingleResourceSubRouter := awsResourcesSubRouter.Path(awsResourcePath).Subrouter()
+	awsOperationStatusesSubRouter := awsResourcesSubRouter.PathPrefix(awsOperationStatusesPath).Subrouter()
+	awsOperationResultsSubRouter := awsResourcesSubRouter.PathPrefix(awsOperationResultsPath).Subrouter()
+
 	handlerOptions = append(handlerOptions, []ctrl.HandlerOptions{
 		// Planes resource handler registration.
 		{
@@ -127,6 +136,38 @@ func Register(ctx context.Context, router *mux.Router, ctrlOpts ctrl.Options) er
 			HandlerFactory: resourcegroups_ctrl.NewDeleteResourceGroup,
 		},
 
+		// AWS Plane handlers
+		{
+			ParentRouter:   awsOperationResultsSubRouter,
+			Method:         v1.OperationGet,
+			HandlerFactory: awsproxy_ctrl.NewGetAWSOperationResults,
+		},
+		{
+			ParentRouter:   awsOperationStatusesSubRouter,
+			Method:         v1.OperationGet,
+			HandlerFactory: awsproxy_ctrl.NewGetAWSOperationStatuses,
+		},
+		{
+			ParentRouter:   awsResourceCollectionSubRouter,
+			Method:         v1.OperationGet,
+			HandlerFactory: awsproxy_ctrl.NewListAWSResources,
+		},
+		{
+			ParentRouter:   awsSingleResourceSubRouter,
+			Method:         v1.OperationPut,
+			HandlerFactory: awsproxy_ctrl.NewCreateOrUpdateAWSResource,
+		},
+		{
+			ParentRouter:   awsSingleResourceSubRouter,
+			Method:         v1.OperationDelete,
+			HandlerFactory: awsproxy_ctrl.NewDeleteAWSResource,
+		},
+		{
+			ParentRouter:   awsSingleResourceSubRouter,
+			Method:         v1.OperationGet,
+			HandlerFactory: awsproxy_ctrl.NewGetAWSResource,
+		},
+
 		// Proxy request should take the least priority in routing and should therefore be last
 		{
 			ParentRouter:   router,
diff --git a/pkg/ucp/frontend/controller/awsproxy/aws_parsing.go b/pkg/ucp/frontend/controller/awsproxy/aws_parsing.go
new file mode 100644
index 000000000..7da8333f3
--- /dev/null
+++ b/pkg/ucp/frontend/controller/awsproxy/aws_parsing.go
@@ -0,0 +1,38 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package awsproxy
+
+import (
+	"context"
+	"net/http"
+
+	"github.com/aws/aws-sdk-go-v2/aws"
+	"github.com/aws/aws-sdk-go-v2/config"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
+	"github.com/project-radius/radius/pkg/middleware"
+	"github.com/project-radius/radius/pkg/ucp/resources"
+)
+
+func ParseAWSRequest(ctx context.Context, basePath string, r *http.Request) (*cloudcontrol.Client, string, resources.ID, error) {
+	// Common parsing in AWS plane requests
+	cfg, err := config.LoadDefaultConfig(ctx)
+	if err != nil {
+		return nil, "", resources.ID{}, err
+	}
+
+	cfg.ClientLogMode |= aws.LogRequestWithBody
+	cfg.ClientLogMode |= aws.LogResponseWithBody
+
+	client := cloudcontrol.NewFromConfig(cfg)
+	path := middleware.GetRelativePath(basePath, r.URL.Path)
+	id, err := resources.ParseByMethod(path, r.Method)
+	if err != nil {
+		return nil, "", resources.ID{}, err
+	}
+
+	resourceType := resources.ToARN(id)
+	return client, resourceType, id, nil
+}
diff --git a/pkg/ucp/frontend/controller/awsproxy/createorupdateawsresource.go b/pkg/ucp/frontend/controller/awsproxy/createorupdateawsresource.go
new file mode 100644
index 000000000..3ffea5318
--- /dev/null
+++ b/pkg/ucp/frontend/controller/awsproxy/createorupdateawsresource.go
@@ -0,0 +1,166 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+package awsproxy
+
+import (
+	"context"
+	"encoding/json"
+	http "net/http"
+
+	"github.com/aws/aws-sdk-go-v2/aws"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
+	"github.com/google/uuid"
+	radrprest "github.com/project-radius/radius/pkg/armrpc/rest"
+	awserror "github.com/project-radius/radius/pkg/ucp/aws"
+	ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller"
+	"github.com/project-radius/radius/pkg/ucp/rest"
+	"github.com/wI2L/jsondiff"
+)
+
+var _ ctrl.Controller = (*CreateOrUpdateAWSResource)(nil)
+
+// CreateOrUpdateAWSResource is the controller implementation to create/update an AWS resource.
+type CreateOrUpdateAWSResource struct {
+	ctrl.BaseController
+}
+
+// NewCreateOrUpdateAWSResource creates a new CreateOrUpdateAWSResource.
+func NewCreateOrUpdateAWSResource(opts ctrl.Options) (ctrl.Controller, error) {
+	return &CreateOrUpdateAWSResource{ctrl.NewBaseController(opts)}, nil
+}
+
+func (p *CreateOrUpdateAWSResource) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) {
+	client, resourceType, id, err := ParseAWSRequest(ctx, p.Options.BasePath, req)
+	if err != nil {
+		return nil, err
+	}
+
+	decoder := json.NewDecoder(req.Body)
+	defer req.Body.Close()
+
+	body := map[string]interface{}{}
+	err = decoder.Decode(&body)
+	if err != nil {
+		e := rest.ErrorResponse{
+			Error: rest.ErrorDetails{
+				Code:    rest.Invalid,
+				Message: "failed to read request body",
+			},
+		}
+
+		response := rest.NewBadRequestARMResponse(e)
+		err = response.Apply(ctx, w, req)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	properties := map[string]interface{}{}
+	obj, ok := body["properties"]
+	if ok {
+		pp, ok := obj.(map[string]interface{})
+		if ok {
+			properties = pp
+		}
+	}
+
+	// Create and update work differently for AWS - we need to know if the resource
+	// we're working on exists already.
+
+	existing := true
+	getResponse, err := client.GetResource(ctx, &cloudcontrol.GetResourceInput{
+		TypeName:   &resourceType,
+		Identifier: aws.String(id.Name()),
+	})
+	if awserror.IsAWSResourceNotFound(err) {
+		existing = false
+	} else if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	// AWS doesn't return the resource state as part of the cloud-control operation. Let's
+	// simulate that here.
+	responseProperties := map[string]interface{}{}
+	if getResponse != nil {
+		err = json.Unmarshal([]byte(*getResponse.ResourceDescription.Properties), &responseProperties)
+		if err != nil {
+			return awserror.HandleAWSError(err)
+		}
+	}
+
+	// Properties specified by users take precedence
+	for k, v := range properties {
+		responseProperties[k] = v
+	}
+
+	responseBody := map[string]interface{}{
+		"id":         id.String(),
+		"name":       id.Name(),
+		"type":       id.Type(),
+		"properties": responseProperties,
+	}
+	var operation uuid.UUID
+	desiredState, err := json.Marshal(properties)
+	if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	if existing {
+		// For an existing resource we need to convert the desired state into a JSON-patch document
+		patch, err := jsondiff.CompareJSON([]byte(*getResponse.ResourceDescription.Properties), desiredState)
+		if err != nil {
+			return awserror.HandleAWSError(err)
+		}
+
+		// We need to take out readonly properties. Those are usually not specified by the client, and so
+		// our library will generate "remove" operations.
+		//
+		// Iterate backwards because we're removing items from the array
+		for i := len(patch) - 1; i >= 0; i-- {
+			if patch[i].Type == "remove" {
+				patch = append(patch[:i], patch[i+1:]...)
+			}
+		}
+
+		// Call update only if the patch is not empty
+		if len(patch) > 0 {
+			marshaled, err := json.Marshal(&patch)
+			if err != nil {
+				return awserror.HandleAWSError(err)
+			}
+
+			response, err := client.UpdateResource(ctx, &cloudcontrol.UpdateResourceInput{
+				TypeName:      &resourceType,
+				Identifier:    aws.String(id.Name()),
+				PatchDocument: aws.String(string(marshaled)),
+			})
+			if err != nil {
+				return awserror.HandleAWSError(err)
+			}
+
+			operation, err = uuid.Parse(*response.ProgressEvent.RequestToken)
+			if err != nil {
+				return awserror.HandleAWSError(err)
+			}
+		}
+	} else {
+
+		response, err := client.CreateResource(ctx, &cloudcontrol.CreateResourceInput{
+			TypeName:     &resourceType,
+			DesiredState: aws.String(string(desiredState)),
+		})
+		if err != nil {
+			return awserror.HandleAWSError(err)
+		}
+
+		operation, err = uuid.Parse(*response.ProgressEvent.RequestToken)
+		if err != nil {
+			return awserror.HandleAWSError(err)
+		}
+	}
+
+	resp := radrprest.NewAsyncOperationResponse(responseBody, "global", 201, id, operation, "", id.RootScope(), p.Options.BasePath)
+	return resp, nil
+}
diff --git a/pkg/ucp/frontend/controller/awsproxy/deleteawsresource.go b/pkg/ucp/frontend/controller/awsproxy/deleteawsresource.go
new file mode 100644
index 000000000..6dd148920
--- /dev/null
+++ b/pkg/ucp/frontend/controller/awsproxy/deleteawsresource.go
@@ -0,0 +1,63 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+package awsproxy
+
+import (
+	"context"
+	http "net/http"
+
+	"github.com/aws/aws-sdk-go-v2/aws"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
+	"github.com/google/uuid"
+	radrprest "github.com/project-radius/radius/pkg/armrpc/rest"
+	awserror "github.com/project-radius/radius/pkg/ucp/aws"
+	ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller"
+	"github.com/project-radius/radius/pkg/ucp/rest"
+)
+
+var _ ctrl.Controller = (*DeleteAWSResource)(nil)
+
+// DeleteAWSResource is the controller implementation to delete AWS resource.
+type DeleteAWSResource struct {
+	ctrl.BaseController
+}
+
+// NewDeleteAWSResource creates a new DeleteAWSResource.
+func NewDeleteAWSResource(opts ctrl.Options) (ctrl.Controller, error) {
+	return &DeleteAWSResource{ctrl.NewBaseController(opts)}, nil
+}
+
+func (p *DeleteAWSResource) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) {
+	client, resourceType, id, err := ParseAWSRequest(ctx, p.Options.BasePath, req)
+	if err != nil {
+		return nil, err
+	}
+
+	_, err = client.GetResource(ctx, &cloudcontrol.GetResourceInput{
+		TypeName:   &resourceType,
+		Identifier: aws.String(id.Name()),
+	})
+	if awserror.IsAWSResourceNotFound(err) {
+		return rest.NewNoContentResponse(), nil
+	} else if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	response, err := client.DeleteResource(ctx, &cloudcontrol.DeleteResourceInput{
+		TypeName:   &resourceType,
+		Identifier: aws.String(id.Name()),
+	})
+	if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	operation, err := uuid.Parse(*response.ProgressEvent.RequestToken)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := radrprest.NewAsyncOperationResponse(map[string]interface{}{}, "global", 202, id, operation, "", id.RootScope(), p.Options.BasePath)
+	return resp, nil
+}
diff --git a/pkg/ucp/frontend/controller/awsproxy/getawsoperationresults.go b/pkg/ucp/frontend/controller/awsproxy/getawsoperationresults.go
new file mode 100644
index 000000000..fd34023f9
--- /dev/null
+++ b/pkg/ucp/frontend/controller/awsproxy/getawsoperationresults.go
@@ -0,0 +1,72 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+package awsproxy
+
+import (
+	"context"
+	http "net/http"
+
+	"github.com/aws/aws-sdk-go-v2/aws"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol/types"
+	armrpcv1 "github.com/project-radius/radius/pkg/armrpc/api/v1"
+	radrprest "github.com/project-radius/radius/pkg/armrpc/rest"
+	awserror "github.com/project-radius/radius/pkg/ucp/aws"
+	ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller"
+	"github.com/project-radius/radius/pkg/ucp/rest"
+)
+
+var _ ctrl.Controller = (*GetAWSOperationResults)(nil)
+
+// GetAWSOperationResults is the controller implementation to get AWS resource operation results.
+type GetAWSOperationResults struct {
+	ctrl.BaseController
+}
+
+// NewGetAWSOperationResults creates a new GetAWSOperationResults.
+func NewGetAWSOperationResults(opts ctrl.Options) (ctrl.Controller, error) {
+	return &GetAWSOperationResults{ctrl.NewBaseController(opts)}, nil
+}
+
+func (p *GetAWSOperationResults) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) {
+	client, _, id, err := ParseAWSRequest(ctx, p.Options.BasePath, req)
+	if err != nil {
+		return nil, err
+	}
+
+	response, err := client.GetResourceRequestStatus(ctx, &cloudcontrol.GetResourceRequestStatusInput{
+		RequestToken: aws.String(id.Name()),
+	})
+	if awserror.IsAWSResourceNotFound(err) {
+		return rest.NewNotFoundResponse(id.String()), nil
+	} else if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	isTerminal := isStatusTerminal(response)
+
+	if !isTerminal {
+		headers := map[string]string{
+			"Location":    req.URL.String(),
+			"Retry-After": armrpcv1.DefaultRetryAfter,
+		}
+		return radrprest.NewAsyncOperationResultResponse(headers), nil
+	}
+
+	return rest.NewNoContentResponse(), nil
+}
+
+func isStatusTerminal(response *cloudcontrol.GetResourceRequestStatusOutput) bool {
+	isTerminal := false
+	switch response.ProgressEvent.OperationStatus {
+	case types.OperationStatusSuccess:
+		isTerminal = true
+	case types.OperationStatusCancelComplete:
+		isTerminal = true
+	case types.OperationStatusFailed:
+		isTerminal = true
+	}
+	return isTerminal
+}
diff --git a/pkg/ucp/frontend/controller/awsproxy/getawsoperationstatuses.go b/pkg/ucp/frontend/controller/awsproxy/getawsoperationstatuses.go
new file mode 100644
index 000000000..453a5d62e
--- /dev/null
+++ b/pkg/ucp/frontend/controller/awsproxy/getawsoperationstatuses.go
@@ -0,0 +1,72 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+package awsproxy
+
+import (
+	"context"
+	http "net/http"
+
+	"github.com/aws/aws-sdk-go-v2/aws"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol/types"
+	armrpcv1 "github.com/project-radius/radius/pkg/armrpc/api/v1"
+	manager "github.com/project-radius/radius/pkg/armrpc/asyncoperation/statusmanager"
+	awserror "github.com/project-radius/radius/pkg/ucp/aws"
+	ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller"
+	"github.com/project-radius/radius/pkg/ucp/rest"
+)
+
+var _ ctrl.Controller = (*GetAWSOperationStatuses)(nil)
+
+// GetAWSOperationStatuses is the controller implementation to get AWS resource operation status.
+type GetAWSOperationStatuses struct {
+	ctrl.BaseController
+}
+
+// NewGetAWSOperationStatuses creates a new GetAWSOperationStatuses.
+func NewGetAWSOperationStatuses(opts ctrl.Options) (ctrl.Controller, error) {
+	return &GetAWSOperationStatuses{ctrl.NewBaseController(opts)}, nil
+}
+
+func (p *GetAWSOperationStatuses) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) {
+	client, _, id, err := ParseAWSRequest(ctx, p.Options.BasePath, req)
+	if err != nil {
+		return nil, err
+	}
+
+	response, err := client.GetResourceRequestStatus(ctx, &cloudcontrol.GetResourceRequestStatusInput{
+		RequestToken: aws.String(id.Name()),
+	})
+	if awserror.IsAWSResourceNotFound(err) {
+		return rest.NewNotFoundResponse(id.String()), nil
+	} else if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	opStatus := getAsyncOperationStatus(response)
+	return rest.NewOKResponse(opStatus), nil
+}
+
+func getAsyncOperationStatus(response *cloudcontrol.GetResourceRequestStatusOutput) armrpcv1.AsyncOperationStatus {
+	os := manager.Status{}
+	switch response.ProgressEvent.OperationStatus {
+	case types.OperationStatusSuccess:
+		os.AsyncOperationStatus.Status = armrpcv1.ProvisioningStateSucceeded
+	case types.OperationStatusCancelComplete:
+		os.AsyncOperationStatus.Status = armrpcv1.ProvisioningStateCanceled
+	case types.OperationStatusFailed:
+		os.AsyncOperationStatus.Status = armrpcv1.ProvisioningStateFailed
+	default:
+		os.AsyncOperationStatus.Status = armrpcv1.ProvisioningStateProvisioning
+	}
+	os.AsyncOperationStatus.StartTime = *response.ProgressEvent.EventTime
+	if response.ProgressEvent.OperationStatus == types.OperationStatusFailed {
+		os.Error = &armrpcv1.ErrorDetails{
+			Code:    string(response.ProgressEvent.ErrorCode),
+			Message: *response.ProgressEvent.StatusMessage,
+		}
+	}
+	return os.AsyncOperationStatus
+}
diff --git a/pkg/ucp/frontend/controller/awsproxy/getawsresource.go b/pkg/ucp/frontend/controller/awsproxy/getawsresource.go
new file mode 100644
index 000000000..133984603
--- /dev/null
+++ b/pkg/ucp/frontend/controller/awsproxy/getawsresource.go
@@ -0,0 +1,62 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+package awsproxy
+
+import (
+	"context"
+	"encoding/json"
+	http "net/http"
+
+	"github.com/aws/aws-sdk-go-v2/aws"
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
+	awserror "github.com/project-radius/radius/pkg/ucp/aws"
+	ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller"
+	"github.com/project-radius/radius/pkg/ucp/rest"
+)
+
+var _ ctrl.Controller = (*GetAWSResource)(nil)
+
+// GetAWSResource is the controller implementation to get AWS resource.
+type GetAWSResource struct {
+	ctrl.BaseController
+}
+
+// NewGetAWSResource creates a new GetAWSResource.
+func NewGetAWSResource(opts ctrl.Options) (ctrl.Controller, error) {
+	return &GetAWSResource{ctrl.NewBaseController(opts)}, nil
+}
+
+func (p *GetAWSResource) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) {
+	client, resourceType, id, err := ParseAWSRequest(ctx, p.Options.BasePath, req)
+	if err != nil {
+		return nil, err
+	}
+
+	response, err := client.GetResource(ctx, &cloudcontrol.GetResourceInput{
+		TypeName:   &resourceType,
+		Identifier: aws.String(id.Name()),
+	})
+	if awserror.IsAWSResourceNotFound(err) {
+		return rest.NewNotFoundResponse(id.String()), nil
+	} else if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	properties := map[string]interface{}{}
+	if response.ResourceDescription.Properties != nil {
+		err := json.Unmarshal([]byte(*response.ResourceDescription.Properties), &properties)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	body := map[string]interface{}{
+		"id":         id.String(),
+		"name":       response.ResourceDescription.Identifier,
+		"type":       id.Type(),
+		"properties": properties,
+	}
+	return rest.NewOKResponse(body), nil
+}
diff --git a/pkg/ucp/frontend/controller/awsproxy/listawsresources.go b/pkg/ucp/frontend/controller/awsproxy/listawsresources.go
new file mode 100644
index 000000000..85e0239fb
--- /dev/null
+++ b/pkg/ucp/frontend/controller/awsproxy/listawsresources.go
@@ -0,0 +1,71 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+package awsproxy
+
+import (
+	"context"
+	"encoding/json"
+	http "net/http"
+
+	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
+	awserror "github.com/project-radius/radius/pkg/ucp/aws"
+	ctrl "github.com/project-radius/radius/pkg/ucp/frontend/controller"
+	"github.com/project-radius/radius/pkg/ucp/rest"
+)
+
+var _ ctrl.Controller = (*ListAWSResources)(nil)
+
+// ListAWSResources is the controller implementation to get/list AWS resources.
+type ListAWSResources struct {
+	ctrl.BaseController
+}
+
+// NewListAWSResources creates a new ListAWSResources.
+func NewListAWSResources(opts ctrl.Options) (ctrl.Controller, error) {
+	return &ListAWSResources{ctrl.NewBaseController(opts)}, nil
+}
+
+func (p *ListAWSResources) Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) {
+	client, resourceType, id, err := ParseAWSRequest(ctx, p.Options.BasePath, req)
+	if err != nil {
+		return nil, err
+	}
+
+	// TODO pagination
+	response, err := client.ListResources(ctx, &cloudcontrol.ListResourcesInput{
+		TypeName: &resourceType,
+	})
+	if err != nil {
+		return awserror.HandleAWSError(err)
+	}
+
+	// TODO there some limitations with listing resources:
+	//
+	// https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/resource-operations-list.html
+
+	items := []interface{}{}
+	for _, result := range response.ResourceDescriptions {
+		properties := map[string]interface{}{}
+		if result.Properties != nil {
+			err := json.Unmarshal([]byte(*result.Properties), &properties)
+			if err != nil {
+				return nil, err
+			}
+		}
+
+		item := map[string]interface{}{
+			"id":         id.String(),
+			"name":       result.Identifier,
+			"type":       id.Type(),
+			"properties": properties,
+		}
+		items = append(items, item)
+	}
+
+	body := map[string]interface{}{
+		"value": items,
+	}
+	return rest.NewOKResponse(body), nil
+}
diff --git a/pkg/ucp/frontend/controller/planes/createorupdateplane.go b/pkg/ucp/frontend/controller/planes/createorupdateplane.go
index 8abf0de07..aa1d5d2b0 100644
--- a/pkg/ucp/frontend/controller/planes/createorupdateplane.go
+++ b/pkg/ucp/frontend/controller/planes/createorupdateplane.go
@@ -50,6 +50,7 @@ func (p *CreateOrUpdatePlane) Run(ctx context.Context, w http.ResponseWriter, re
 	if err != nil {
 		return rest.NewBadRequestResponse(err.Error()), nil
 	}
+
 	plane.Type = planes.PlaneTypePrefix + "/" + planeType
 	plane.Name = name
 	id, err := resources.Parse(plane.ID)
@@ -66,7 +67,7 @@ func (p *CreateOrUpdatePlane) Run(ctx context.Context, w http.ResponseWriter, re
 			err = fmt.Errorf("At least one resource provider must be configured for UCP native plane: %s", plane.Name)
 			return rest.NewBadRequestResponse(err.Error()), nil
 		}
-	} else {
+	} else if plane.Properties.Kind != rest.PlaneKindAWS {
 		if plane.Properties.URL == "" {
 			err = fmt.Errorf("URL must be specified for plane: %s", plane.Name)
 			return rest.NewBadRequestResponse(err.Error()), nil
diff --git a/pkg/ucp/frontend/controller/planes/proxyplane.go b/pkg/ucp/frontend/controller/planes/proxyplane.go
index efe5f4a66..64ff50fe3 100644
--- a/pkg/ucp/frontend/controller/planes/proxyplane.go
+++ b/pkg/ucp/frontend/controller/planes/proxyplane.go
@@ -72,6 +72,7 @@ func (p *ProxyPlane) Run(ctx context.Context, w http.ResponseWriter, req *http.R
 	ctx = ucplog.WrapLogContext(ctx,
 		ucplog.LogFieldPlaneID, planeID,
 		ucplog.LogFieldPlaneKind, plane.Properties.Kind)
+
 	if plane.Properties.Kind == rest.PlaneKindUCPNative {
 		// Check if the resource group exists
 		id, err := resources.Parse(newURL.Path)
diff --git a/pkg/ucp/resources/aws.go b/pkg/ucp/resources/aws.go
new file mode 100644
index 000000000..9ed072fd2
--- /dev/null
+++ b/pkg/ucp/resources/aws.go
@@ -0,0 +1,18 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package resources
+
+import "strings"
+
+func ToARN(id ID) string {
+	parts := []string{}
+	// AWS ARNs use :: as separator.
+	for _, segment := range id.TypeSegments() {
+		parts = append(parts, strings.ReplaceAll(strings.ReplaceAll(segment.Type, ".", "::"), "/", "::"))
+	}
+	arn := strings.Join(parts, "::")
+	return arn
+}
diff --git a/pkg/ucp/rest/objects.go b/pkg/ucp/rest/objects.go
index bf3074d53..4d1f9660f 100644
--- a/pkg/ucp/rest/objects.go
+++ b/pkg/ucp/rest/objects.go
@@ -10,13 +10,14 @@ import "strings"
 type PlaneProperties struct {
 	ResourceProviders map[string]string `json:"resourceProviders" yaml:"resourceProviders"` // Used only for UCP native planes
 	Kind              string            `json:"kind" yaml:"kind"`
-	URL               string            `json:"url" yaml:"url"` // Used only for non UCP native planes
+	URL               string            `json:"url" yaml:"url"` // Used only for non UCP native planes and non AWS planes
 }
 
 // Plane kinds
 const (
 	PlaneKindUCPNative = "UCPNative"
 	PlaneKindAzure     = "Azure"
+	PlaneKindAWS       = "AWS"
 )
 
 type Plane struct {
@@ -26,7 +27,7 @@ type Plane struct {
 	Properties PlaneProperties `json:"properties" yaml:"properties"`
 }
 
-//PlaneList represents a list of UCP planes in the ARM wire-format
+// PlaneList represents a list of UCP planes in the ARM wire-format
 type PlaneList struct {
 	Value []Plane `json:"value" yaml:"value"`
 }
diff --git a/schemas/rest-api-specs/radius.json b/schemas/rest-api-specs/radius.json
index 4936d8cc1..e83cc4123 100644
--- a/schemas/rest-api-specs/radius.json
+++ b/schemas/rest-api-specs/radius.json
@@ -190,6 +190,17 @@
       },
       "type": "object"
     },
+    "BasicDaprResourceProperties": {
+      "description": "Basic properties of a Dapr component object.",
+      "properties": {
+        "componentName": {
+          "type": "string",
+          "description": "The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component.",
+          "readOnly": true
+        }
+      },
+      "type": "object"
+    },
     "BasicRouteProperties": {
       "description": "Basic properties of a route.",
       "properties": {
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprInvokeHttpRoutes.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprInvokeHttpRoutes.json
index a249639bf..092f89d7b 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprInvokeHttpRoutes.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprInvokeHttpRoutes.json
@@ -283,14 +283,17 @@
           "description": "The Dapr appId used for the route",
           "type": "string"
         },
-        "recipe" : {
+        "recipe": {
           "description": "The recipe used to automatically deploy underlying infrastructure for the daprInvokeHttpRoute connector",
           "type": "object",
           "additionalProperties": false,
           "$ref": "global.json#/definitions/Recipe"
         }
       },
-      "required": ["environment", "appId"]
+      "required": [
+        "environment",
+        "appId"
+      ]
     }
   },
   "parameters": {
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprPubSubBrokers.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprPubSubBrokers.json
index 8868ad613..ab863fbcb 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprPubSubBrokers.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprPubSubBrokers.json
@@ -313,6 +313,9 @@
       "allOf": [
         {
           "$ref": "global.json#/definitions/BasicResourceProperties"
+        },
+        {
+          "$ref": "global.json#/definitions/BasicDaprResourceProperties"
         }
       ],
       "discriminator": "kind",
@@ -333,13 +336,16 @@
         "kind": {
           "description": "The DaprPubSubProperties kind",
           "type": "string",
-          "enum": ["pubsub.azure.servicebus","generic"]
+          "enum": [
+            "pubsub.azure.servicebus",
+            "generic"
+          ]
         },
         "topic": {
           "description": "Topic name of the Azure ServiceBus resource",
           "type": "string"
         },
-        "recipe" : {
+        "recipe": {
           "description": "The recipe used to automatically deploy underlying infrastructure for the daprPubSubBroker connector",
           "type": "object",
           "additionalProperties": false,
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprSecretStores.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprSecretStores.json
index bb5ea38ca..b9f072341 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprSecretStores.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprSecretStores.json
@@ -263,6 +263,9 @@
       "allOf": [
         {
           "$ref": "global.json#/definitions/BasicResourceProperties"
+        },
+        {
+          "$ref": "global.json#/definitions/BasicDaprResourceProperties"
         }
       ],
       "properties": {
@@ -299,11 +302,6 @@
           "description": "Metadata for the Secret Store resource. This should match the values specified in Dapr component spec",
           "type": "object"
         },
-        "secretStoreName": {
-          "description": "The name of the Dapr Secret Store.",
-          "type": "string",
-          "readOnly": true
-        },
         "recipe" : {
           "description": "The recipe used to automatically deploy underlying infrastructure for the daprSecretStore connector",
           "type": "object",
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprStateStores.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprStateStores.json
index b2d99c074..1a6ac0561 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprStateStores.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/daprStateStores.json
@@ -336,6 +336,9 @@
         "allOf": [
           {
             "$ref": "global.json#/definitions/BasicResourceProperties"
+          },
+          {
+            "$ref": "global.json#/definitions/BasicDaprResourceProperties"
           }
         ],
         "discriminator": "kind",
@@ -358,11 +361,6 @@
             "type": "string",
             "enum": ["state.sqlserver","state.azure.tablestorage","generic"]
           },
-          "stateStoreName": {
-            "description": "The name of the Dapr State Store",
-            "type": "string",
-            "readOnly": true
-          },
           "recipe" : {
             "description": "The recipe used to automatically deploy underlying infrastructure for the daprStateStore connector",
             "type": "object",
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json
index 0a1f061bc..c8d026752 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresGet.json
@@ -19,8 +19,7 @@
             "version": "v1",
             "metadata": {
               "foo": "bar"
-            },
-            "secretStoreName": "daprSecretStore0"
+            }
           }
         }
       }
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json
index 16cb266b7..fd582f2ec 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresList.json
@@ -20,8 +20,7 @@
                 "version": "v1",
                 "metadata": {
                     "foo": "bar"
-                },
-                "secretStoreName": "daprSecretStore0"
+                }
               }
             }
           ],
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json
index 0e8528dc8..0baa29df2 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprSecretStoresListByRootScope.json
@@ -20,8 +20,7 @@
                 "version": "v1",
                 "metadata": {
                     "foo": "bar"
-                },
-                "secretStoreName": "daprSecretStore0"
+                }
               }
             }
           ],
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json
index d783e0b2c..4eae18a3c 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresGet.json
@@ -15,8 +15,7 @@
             "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication",
             "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0",
             "kind": "state.sqlserver",
-            "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase",
-            "stateStoreName": "daprStateStore0"
+            "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase"
           }
         }
       }
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json
index ecc2369b9..9c59f99d6 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresList.json
@@ -16,8 +16,7 @@
                 "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication",
                 "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0",
                 "kind": "state.sqlserver",
-                "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase",
-                "stateStoreName": "daprStateStore0"
+                "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase"
               }
             },
             {
@@ -29,8 +28,7 @@
                   "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication",
                   "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0",
                   "kind": "state.azure.tablestorage",
-                  "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable",
-                  "stateStoreName": "daprStateStore0"
+                  "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable"
                 }
               },
             {
@@ -44,7 +42,6 @@
                 "kind": "generic",
                 "type": "state.zookeeper",
                 "version": "v1",
-                "stateStoreName": "daprStateStore0",
                 "metadata": {
                 "foo": "bar"
                 }
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json
index 7f98f8a46..cb232f764 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/examples/DaprStateStoresListByRootScope.json
@@ -16,8 +16,7 @@
                 "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication",
                 "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0",
                 "kind": "state.sqlserver",
-                "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase",
-                "stateStoreName": "daprStateStore0"
+                "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Sql/servers/testServer/databases/testDatabase"
               }
             },
             {
@@ -29,8 +28,7 @@
                 "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/testApplication",
                 "environment": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/environments/env0",
                 "kind": "state.azure.tablestorage",
-                "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable",
-                "stateStoreName": "daprStateStore0"
+                "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable"
               }
             },
             {
@@ -44,7 +42,6 @@
                   "kind": "generic",
                   "type": "state.zookeeper",
                   "version": "v1",
-                  "stateStoreName": "daprStateStore0",
                   "metadata": {
                   "foo": "bar"
                   }
diff --git a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/global.json b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/global.json
index 9bdbe6c67..9d9671179 100644
--- a/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/global.json
+++ b/swagger/specification/applications/resource-manager/Applications.Connector/preview/2022-03-15-privatepreview/global.json
@@ -69,6 +69,17 @@
         }
       }
     },
+    "BasicDaprResourceProperties": {
+      "description": "Basic properties of a Dapr component object.",
+      "type": "object",
+      "properties": {
+        "componentName": {
+          "type": "string",
+          "description": "The name of the Dapr component object. Use this value in your code when interacting with the Dapr client to use the Dapr component.",
+          "readOnly": true
+        }
+      }
+    },
     "ResourceStatus": {
       "description": "Status of a resource.",
       "type": "object",
diff --git a/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesDelete.json b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesDelete.json
new file mode 100644
index 000000000..532ff2273
--- /dev/null
+++ b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesDelete.json
@@ -0,0 +1,12 @@
+{
+  "parameters": {
+    "rootScope": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup",
+    "volumeName": "keyvault0",
+    "api-version": "2022-03-15-privatepreview"
+  },
+  "responses": {
+    "200": {},
+    "202": {},
+    "204": {}
+  }
+}
diff --git a/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesGet.json b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesGet.json
new file mode 100644
index 000000000..bf65fd419
--- /dev/null
+++ b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesGet.json
@@ -0,0 +1,52 @@
+{
+  "parameters": {
+    "rootScope": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup",
+    "api-version": "2022-03-15-privatepreview",
+    "volumeName": "keyvault0"
+  },
+  "responses": {
+    "200": {
+      "body": {
+        "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/volumes/keyvault0",
+        "name": "keyvault0",
+        "type": "Applications.Core/volumes",
+        "properties": {
+          "provisioningState": "Succeeded",
+          "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0",
+          "kind": "azure.com.keyvault",
+              "secrets": {
+                "mysecret-1": {
+                  "name": "mysecret-1",
+                  "version": "1"
+                },
+                "mysecret-2": {
+                  "name": "mysecret-2",
+                  "encoding": "base64"
+                }
+              },
+              "keys": {
+                "mykey-1": {
+                  "name": "key1",
+                  "version": "1"
+                },
+                "mykey-2": {
+                  "name": "key2"
+                }
+              },
+              "certificates": {
+                "mycert-1": {
+                  "name": "cert1",
+                  "certType": "certificate"
+                },
+                "mycert-2": {
+                  "name": "cert2",
+                  "certType": "privatekey",
+                  "format": "pfx",
+                  "encoding": "hex"
+                }
+              }
+        }
+      }
+    }
+  }
+}
diff --git a/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesList.json b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesList.json
new file mode 100644
index 000000000..bf5e90450
--- /dev/null
+++ b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesList.json
@@ -0,0 +1,97 @@
+{
+  "parameters": {
+    "rootScope": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup",
+    "api-version": "2022-03-15-privatepreview"
+  },
+  "responses": {
+    "200": {
+      "body": {
+        "value": [
+          {
+            "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/volumes/keyvault0",
+            "name": "keyvault0",
+            "type": "Applications.Core/volumes",
+            "properties": {
+              "provisioningState": "Succeeded",
+              "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0",
+              "kind": "azure.com.keyvault",
+              "secrets": {
+                "mysecret-1": {
+                  "name": "mysecret-1",
+                  "version": "1"
+                },
+                "mysecret-2": {
+                  "name": "mysecret-2",
+                  "encoding": "base64"
+                }
+              },
+              "keys": {
+                "mykey-1": {
+                  "name": "key1",
+                  "version": "1"
+                },
+                "mykey-2": {
+                  "name": "key2"
+                }
+              },
+              "certificates": {
+                "mycert-1": {
+                  "name": "cert1",
+                  "certType": "certificate"
+                },
+                "mycert-2": {
+                  "name": "cert2",
+                  "certType": "privatekey",
+                  "format": "pfx",
+                  "encoding": "hex"
+                }
+              }
+            }
+          },
+          {
+            "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/volumes/keyvault1",
+            "name": "keyvault1",
+            "type": "Applications.Core/volumes",
+            "properties": {
+              "provisioningState": "Succeeded",
+              "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0",
+              "kind": "azure.com.keyvault",
+              "secrets": {
+                "mysecret-1": {
+                  "name": "mysecret-1",
+                  "version": "1"
+                },
+                "mysecret-2": {
+                  "name": "mysecret-2",
+                  "encoding": "base64"
+                }
+              },
+              "keys": {
+                "mykey-1": {
+                  "name": "key1",
+                  "version": "1"
+                },
+                "mykey-2": {
+                  "name": "key2"
+                }
+              },
+              "certificates": {
+                "mycert-1": {
+                  "name": "cert1",
+                  "certType": "certificate"
+                },
+                "mycert-2": {
+                  "name": "cert2",
+                  "certType": "privatekey",
+                  "format": "pfx",
+                  "encoding": "hex"
+                }
+              }
+            }
+          }
+        ],
+        "nextLink": "https://serviceRoot/00000000-0000-0000-0000-000000000000/providers/Applications.Core/volumes?api-version=2022-03-15-privatepreview&$skiptoken=X'12345'"
+      }
+    }
+  }
+}
diff --git a/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesListByScope.json b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesListByScope.json
new file mode 100644
index 000000000..87f2dd9ec
--- /dev/null
+++ b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesListByScope.json
@@ -0,0 +1,97 @@
+{
+  "parameters": {
+    "rootScope": "/subscriptions/00000000-0000-0000-0000-00000000000",
+    "api-version": "2022-03-15-privatepreview"
+  },
+  "responses": {
+    "200": {
+      "body": {
+        "value": [
+          {
+            "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/volumes/keyvault0",
+            "name": "keyvault0",
+            "type": "Applications.Core/volumes",
+            "properties": {
+              "provisioningState": "Succeeded",
+              "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0",
+              "kind": "azure.com.keyvault",
+              "secrets": {
+                "mysecret-1": {
+                  "name": "mysecret-1",
+                  "version": "1"
+                },
+                "mysecret-2": {
+                  "name": "mysecret-2",
+                  "encoding": "base64"
+                }
+              },
+              "keys": {
+                "mykey-1": {
+                  "name": "key1",
+                  "version": "1"
+                },
+                "mykey-2": {
+                  "name": "key2"
+                }
+              },
+              "certificates": {
+                "mycert-1": {
+                  "name": "cert1",
+                  "certType": "certificate"
+                },
+                "mycert-2": {
+                  "name": "cert2",
+                  "certType": "privatekey",
+                  "format": "pfx",
+                  "encoding": "hex"
+                }
+              }
+            }
+          },
+          {
+            "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/volumes/keyvault1",
+            "name": "keyvault1",
+            "type": "Applications.Core/volumes",
+            "properties": {
+              "provisioningState": "Succeeded",
+              "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0",
+              "kind": "azure.com.keyvault",
+              "secrets": {
+                "mysecret-1": {
+                  "name": "mysecret-1",
+                  "version": "1"
+                },
+                "mysecret-2": {
+                  "name": "mysecret-2",
+                  "encoding": "base64"
+                }
+              },
+              "keys": {
+                "mykey-1": {
+                  "name": "key1",
+                  "version": "1"
+                },
+                "mykey-2": {
+                  "name": "key2"
+                }
+              },
+              "certificates": {
+                "mycert-1": {
+                  "name": "cert1",
+                  "certType": "certificate"
+                },
+                "mycert-2": {
+                  "name": "cert2",
+                  "certType": "privatekey",
+                  "format": "pfx",
+                  "encoding": "hex"
+                }
+              }
+            }
+          }
+        ],
+        "nextLink": "https://serviceRoot/00000000-0000-0000-0000-000000000000/providers/Applications.Core/volumes?api-version=2022-03-15-privatepreview&$skiptoken=X'12345'"
+      }
+    }
+  }
+}
diff --git a/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesPatch.json b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesPatch.json
new file mode 100644
index 000000000..5a061a314
--- /dev/null
+++ b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesPatch.json
@@ -0,0 +1,58 @@
+{
+  "parameters": {
+    "rootScope": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup",
+    "volumeName": "keyvault0",
+    "api-version": "2022-03-15-privatepreview",
+    "HttpRouteResource": {
+      "location": "West US",
+      "properties": {
+        "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0"
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "body": {
+        "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/volumes/routes0",
+        "name": "keyvault0",
+        "type": "Applications.Core/volumes",
+        "properties": {
+          "provisioningState": "Succeeded",
+          "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0",
+          "kind": "azure.com.keyvault",
+          "secrets": {
+            "mysecret-1": {
+              "name": "mysecret-1",
+              "version": "1"
+            },
+            "mysecret-2": {
+              "name": "mysecret-2",
+              "encoding": "base64"
+            }
+          },
+          "keys": {
+            "mykey-1": {
+              "name": "key1",
+              "version": "1"
+            },
+            "mykey-2": {
+              "name": "key2"
+            }
+          },
+          "certificates": {
+            "mycert-1": {
+              "name": "cert1",
+              "certType": "certificate"
+            },
+            "mycert-2": {
+              "name": "cert2",
+              "certType": "privatekey",
+              "format": "pfx",
+              "encoding": "hex"
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesPut.json b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesPut.json
new file mode 100644
index 000000000..5a061a314
--- /dev/null
+++ b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/examples/VolumesPut.json
@@ -0,0 +1,58 @@
+{
+  "parameters": {
+    "rootScope": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup",
+    "volumeName": "keyvault0",
+    "api-version": "2022-03-15-privatepreview",
+    "HttpRouteResource": {
+      "location": "West US",
+      "properties": {
+        "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0"
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "body": {
+        "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/volumes/routes0",
+        "name": "keyvault0",
+        "type": "Applications.Core/volumes",
+        "properties": {
+          "provisioningState": "Succeeded",
+          "application": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Applications.Core/applications/app0",
+          "kind": "azure.com.keyvault",
+          "secrets": {
+            "mysecret-1": {
+              "name": "mysecret-1",
+              "version": "1"
+            },
+            "mysecret-2": {
+              "name": "mysecret-2",
+              "encoding": "base64"
+            }
+          },
+          "keys": {
+            "mykey-1": {
+              "name": "key1",
+              "version": "1"
+            },
+            "mykey-2": {
+              "name": "key2"
+            }
+          },
+          "certificates": {
+            "mycert-1": {
+              "name": "cert1",
+              "certType": "certificate"
+            },
+            "mycert-2": {
+              "name": "cert2",
+              "certType": "privatekey",
+              "format": "pfx",
+              "encoding": "hex"
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/volumes.json b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/volumes.json
new file mode 100644
index 000000000..48486a053
--- /dev/null
+++ b/swagger/specification/applications/resource-manager/Applications.Core/preview/2022-03-15-privatepreview/volumes.json
@@ -0,0 +1,517 @@
+{
+    "swagger": "2.0",
+    "info": {
+      "title": "Applications.Core Management APIs",
+      "description": "REST API for Applications.Core Persistent Volume Resource",
+      "version": "2022-03-15-privatepreview"
+    },
+    "host": "management.azure.com",
+    "schemes": [
+      "https"
+    ],
+    "consumes": [
+      "application/json"
+    ],
+    "produces": [
+      "application/json"
+    ],
+    "security": [
+      {
+        "azure_auth": [
+          "user_impersonation"
+        ]
+      }
+    ],
+    "securityDefinitions": {
+      "azure_auth": {
+        "type": "oauth2",
+        "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/authorize",
+        "flow": "implicit",
+        "description": "Azure Active Directory OAuth2 Flow.",
+        "scopes": {
+          "user_impersonation": "impersonate your user account"
+        }
+      }
+    },
+    "paths": {
+      "/{rootScope}/providers/Applications.Core/volumes": {
+        "get": {
+          "description": "List all volumes in the given scope.",
+          "operationId": "Volumes_ListByScope",
+          "produces": [
+            "application/json"
+          ],
+          "x-ms-examples": {
+            "RadiusVolumesListByScope": {
+              "$ref": "./examples/VolumesListByScope.json"
+            }
+          },
+          "tags": [
+            "Volumes"
+          ],
+          "parameters": [
+            {
+              "$ref": "../../../../../common-types/resource-management/v2/types.json#/parameters/ApiVersionParameter"
+            },
+            {
+              "$ref": "global.json#/parameters/RootScopeParameter"
+            }
+          ],
+          "responses": {
+            "200": {
+              "description": "Volumes details.",
+              "schema": {
+                "$ref": "#/definitions/VolumeResourceList"
+              }
+            },
+            "default": {
+              "description": "Error response describing why the operation failed.",
+              "schema": {
+                "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/ErrorResponse"
+              }
+            }
+          },
+          "deprecated": false,
+          "x-ms-pageable": {
+            "nextLinkName": "nextLink"
+          }
+        }
+      },
+      "/{rootScope}/providers/Applications.Core/volumes/{volumeName}": {
+        "get": {
+          "description": "Gets the properties of an Volume.",
+          "operationId": "Volumes_Get",
+          "produces": [
+            "application/json"
+          ],
+          "x-ms-examples": {
+            "RadiusVolumesGet": {
+              "$ref": "./examples/VolumesGet.json"
+            }
+          },
+          "tags": [
+            "Volumes"
+          ],
+          "parameters": [
+            {
+              "$ref": "global.json#/parameters/RootScopeParameter"
+            },
+            {
+              "$ref": "../../../../../common-types/resource-management/v2/types.json#/parameters/ApiVersionParameter"
+            },
+            {
+              "$ref": "#/parameters/VolumeNameParameter"
+            }
+          ],
+          "responses": {
+            "200": {
+              "description": "Volume details.",
+              "schema": {
+                "$ref": "#/definitions/VolumeResource"
+              }
+            },
+            "default": {
+              "description": "Error response describing why the operation failed.",
+              "schema": {
+                "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/ErrorResponse"
+              }
+            }
+          }
+        },
+        "put": {
+          "description": "Create or update an Volume.",
+          "operationId": "Volumes_CreateOrUpdate",
+          "produces": [
+            "application/json"
+          ],
+          "x-ms-examples": {
+            "RadiusVolumesPut": {
+              "$ref": "./examples/VolumesPut.json"
+            }
+          },
+          "tags": [
+            "Volumes"
+          ],
+          "parameters": [
+            {
+              "$ref": "global.json#/parameters/RootScopeParameter"
+            },
+            {
+              "$ref": "../../../../../common-types/resource-management/v2/types.json#/parameters/ApiVersionParameter"
+            },
+            {
+              "$ref": "#/parameters/VolumeNameParameter"
+            },
+            {
+              "name": "VolumeResource",
+              "description": "Volume details",
+              "in": "body",
+              "required": true,
+              "schema": {
+                "$ref": "#/definitions/VolumeResource"
+              }
+            }
+          ],
+          "responses": {
+            "200": {
+              "description": "The resource was updated successfully.",
+              "schema": {
+                "$ref": "#/definitions/VolumeResource"
+              }
+            },
+            "201": {
+              "description": "The resource will be updated asynchronously.",
+              "schema": {
+                "$ref": "#/definitions/VolumeResource"
+              }
+            },
+            "204": {
+              "description": "The Volume does not exist."
+            },
+            "default": {
+              "description": "Error response describing why the operation failed.",
+              "schema": {
+                "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/ErrorResponse"
+              }
+            }
+          }
+        },
+        "patch": {
+          "description": "Update the properties of an existing Volume.",
+          "operationId": "Volumes_Update",
+          "produces": [
+            "application/json"
+          ],
+          "x-ms-examples": {
+            "RadiusVolumesPatch": {
+              "$ref": "./examples/VolumesPatch.json"
+            }
+          },
+          "tags": [
+            "Volumes"
+          ],
+          "parameters": [
+            {
+              "$ref": "global.json#/parameters/RootScopeParameter"
+            },
+            {
+              "$ref": "../../../../../common-types/resource-management/v2/types.json#/parameters/ApiVersionParameter"
+            },
+            {
+              "$ref": "#/parameters/VolumeNameParameter"
+            },
+            {
+              "name": "VolumeResource",
+              "description": "Volume details",
+              "in": "body",
+              "required": true,
+              "schema": {
+                "$ref": "#/definitions/VolumeResource"
+              }
+            }
+          ],
+          "responses": {
+            "200": {
+              "description": "The resource was updated successfully.",
+              "schema": {
+                "$ref": "#/definitions/VolumeResource"
+              }
+            },
+            "201": {
+              "description": "The resource will be updated asynchronously.",
+              "schema": {
+                "$ref": "#/definitions/VolumeResource"
+              }
+            },
+            "204": {
+              "description": "The Volume does not exist."
+            },
+            "default": {
+              "description": "Error response describing why the operation failed.",
+              "schema": {
+                "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/ErrorResponse"
+              }
+            }
+          }
+        },
+        "delete": {
+          "description": "Delete an Volume.",
+          "operationId": "Volumes_Delete",
+          "produces": [
+            "application/json"
+          ],
+          "x-ms-examples": {
+            "RadiusVolumesDelete": {
+              "$ref": "./examples/VolumesDelete.json"
+            }
+          },
+          "tags": [
+            "Volumes"
+          ],
+          "parameters": [
+            {
+              "$ref": "global.json#/parameters/RootScopeParameter"
+            },
+            {
+              "$ref": "../../../../../common-types/resource-management/v2/types.json#/parameters/ApiVersionParameter"
+            },
+            {
+              "$ref": "#/parameters/VolumeNameParameter"
+            }
+          ],
+          "responses": {
+            "200": {
+              "description": "The Volume was successfully deleted."
+            },
+            "202": {
+              "description": "The Volume will be deleted asynchronously."
+            },
+            "204": {
+              "description": "The Volume does not exist."
+            },
+            "default": {
+              "description": "Error response describing why the operation failed.",
+              "schema": {
+                "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/ErrorResponse"
+              }
+            }
+          }
+        }
+      }
+    },
+    "definitions": {
+      "VolumeResourceList": {
+        "description": "The list of Volumes.",
+        "type": "object",
+        "properties": {
+          "value": {
+            "description": "The list of Volume.",
+            "type": "array",
+            "items": {
+              "$ref": "#/definitions/VolumeResource"
+            }
+          },
+          "nextLink": {
+            "description": "The link used to get the next page of Volumes list.",
+            "type": "string"
+          }
+        }
+      },
+      "VolumeResource": {
+        "description": "Radius Volume Resource.",
+        "type": "object",
+        "allOf": [
+          {
+            "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/TrackedResource"
+          }
+        ],
+        "required": [
+          "properties"
+        ],
+        "properties": {
+          "systemData": {
+            "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/systemData"
+          },
+          "properties": {
+            "x-ms-client-flatten": true,
+            "$ref": "#/definitions/VolumeProperties"
+          }
+        }
+      },
+      "VolumeProperties": {
+        "allOf": [
+          {
+            "$ref": "global.json#/definitions/BasicResourceProperties"
+          }
+        ],
+        "discriminator": "kind",
+        "properties": {
+          "kind": {
+            "description": "The volume kind",
+            "type": "string"
+          },
+          "provisioningState": {
+            "readOnly": true,
+            "$ref": "global.json#/definitions/ProvisioningState",
+            "description": "Provisioning state of the Volume at the time the operation was called."
+          },
+          "application": {
+            "type": "string",
+            "description": "Fully qualified resource ID for the application that the volume is connected to."
+          }
+        },
+        "required": [
+          "kind"
+        ],
+        "type": "object"
+      },
+      "CertificateObjectProperties": {
+        "properties": {
+          "alias": {
+            "description": "File name when written to disk.",
+            "type": "string"
+          },
+          "encoding": {
+            "description": "Encoding format. Default utf-8",
+            "type": "string",
+            "enum": [
+              "utf-8",
+              "hex",
+              "base64"
+            ],
+            "default": "utf-8",
+            "x-ms-enum": {
+              "name": "encoding",
+              "modelAsString": false
+            }
+          },
+          "format": {
+            "description": "Certificate format. Default pem",
+            "type": "string",
+            "enum": [
+              "pem",
+              "pfx"
+            ],
+            "default": "pem",
+            "x-ms-enum": {
+              "name": "format",
+              "modelAsString": false
+            }
+          },
+          "name": {
+            "description": "The name of the certificate",
+            "type": "string"
+          },
+          "certType": {
+            "description": "Certificate object type to be downloaded - the certificate itself, private key or public key of the certificate",
+            "type": "string",
+            "enum": [
+              "certificate",
+              "publickey",
+              "privatekey"
+            ],
+            "x-ms-enum": {
+              "name": "type",
+              "modelAsString": false
+            }
+          },
+          "version": {
+            "description": "Certificate version",
+            "type": "string"
+          }
+        },
+        "required": [
+          "name",
+          "value"
+        ],
+        "type": "object"
+      },
+      "KeyObjectProperties": {
+        "properties": {
+          "alias": {
+            "description": "File name when written to disk.",
+            "type": "string"
+          },
+          "name": {
+            "description": "The name of the key",
+            "type": "string"
+          },
+          "version": {
+            "description": "Key version",
+            "type": "string"
+          }
+        },
+        "required": [
+          "name"
+        ],
+        "type": "object"
+      },
+      "SecretObjectProperties": {
+        "properties": {
+          "alias": {
+            "description": "File name when written to disk.",
+            "type": "string"
+          },
+          "encoding": {
+            "description": "Encoding format. Default utf-8",
+            "type": "string",
+            "enum": [
+              "utf-8",
+              "hex",
+              "base64"
+            ],
+            "default": "utf-8",
+            "x-ms-enum": {
+              "name": "encoding",
+              "modelAsString": false
+            }
+          },
+          "name": {
+            "description": "The name of the secret",
+            "type": "string"
+          },
+          "version": {
+            "description": "Secret version",
+            "type": "string"
+          }
+        },
+        "required": [
+          "name"
+        ],
+        "type": "object"
+      },
+      "AzureKeyVaultVolumeProperties": {
+        "additionalProperties": false,
+        "allOf": [
+          {
+            "$ref": "#/definitions/VolumeProperties"
+          }
+        ],
+        "properties": {
+          "certificates": {
+            "additionalProperties": {
+              "$ref": "#/definitions/CertificateObjectProperties"
+            },
+            "description": "The KeyVault certificates that this volume exposes",
+            "type": "object"
+          },
+          "keys": {
+            "additionalProperties": {
+              "$ref": "#/definitions/KeyObjectProperties"
+            },
+            "description": "The KeyVault keys that this volume exposes",
+            "type": "object"
+          },
+          "resource": {
+            "description": "The ID of the keyvault to use for this volume resource",
+            "type": "string"
+          },
+          "secrets": {
+            "additionalProperties": {
+              "$ref": "#/definitions/SecretObjectProperties"
+            },
+            "description": "The KeyVault secrets that this volume exposes",
+            "type": "object"
+          }
+        },
+        "required": [
+          "kind"
+        ],
+        "type": "object",
+        "x-ms-discriminator-value": "azure.com.keyvault"
+      }
+    },
+    "parameters": {
+      "VolumeNameParameter": {
+        "name": "volumeName",
+        "in": "path",
+        "required": true,
+        "type": "string",
+        "description": "The name of the Volume.",
+        "pattern": "^[a-z]([-a-z0-9]*[a-z0-9])?$",
+        "maxLength": 63,
+        "x-ms-parameter-location": "method"
+      }
+    }
+  }
+  
\ No newline at end of file
diff --git a/swagger/specification/applications/resource-manager/readme.md b/swagger/specification/applications/resource-manager/readme.md
index 8bd98c0fc..ddcbc5d09 100644
--- a/swagger/specification/applications/resource-manager/readme.md
+++ b/swagger/specification/applications/resource-manager/readme.md
@@ -49,6 +49,7 @@ input-file:
   - Applications.Core/preview/2022-03-15-privatepreview/httpRoutes.json
   - Applications.Core/preview/2022-03-15-privatepreview/gateways.json
   - Applications.Core/preview/2022-03-15-privatepreview/containers.json
+  - Applications.Core/preview/2022-03-15-privatepreview/volumes.json
 ```
 
 ### Tag: package-connector-2022-03-15-privatepreview
diff --git a/swagger/specification/ucp/resource-manager/UCP/preview/2022-03-15-privatepreview/ucp.json b/swagger/specification/ucp/resource-manager/UCP/preview/2022-03-15-privatepreview/ucp.json
index 848d4e888..0b03b4f02 100644
--- a/swagger/specification/ucp/resource-manager/UCP/preview/2022-03-15-privatepreview/ucp.json
+++ b/swagger/specification/ucp/resource-manager/UCP/preview/2022-03-15-privatepreview/ucp.json
@@ -444,31 +444,11 @@
       "ResourceGroupResource": {
         "description": "UCP ResourceGroup.",
         "type": "object",
-        "properties": {
-          "properties": {
-            "x-ms-client-flatten": true,
-            "$ref": "#/definitions/ResourceGroupResourceProperties"
+        "allOf": [
+          {
+            "$ref": "../../../../../common-types/resource-management/v2/types.json#/definitions/TrackedResource"
           }
-        }
-      },
-      "ResourceGroupResourceProperties": {
-        "description": "UCP ResourceGroup properties",
-        "type": "object",
-        "required": [
-          "name"
-        ],
-        "properties": {
-          "name": {
-            "$ref": "#/definitions/ResourceGroupName",
-            "readOnly": true
-          }
-        }
-      },
-      "ResourceGroupName": {
-        "type": "string",
-        "description": "The name of the resource group",
-        "pattern": "^[a-z]([-a-z0-9]*[a-z0-9])?$",
-        "maxLength": 63
+        ]
       },
       "ErrorDetail": {
         "description": "The error detail.",
diff --git a/swagger/specs.go b/swagger/specs.go
index 8215aa487..ae672c52a 100644
--- a/swagger/specs.go
+++ b/swagger/specs.go
@@ -19,6 +19,7 @@ var (
 	//go:embed specification/common-types/resource-management/v2/types.json
 	SpecFiles embed.FS
 
+	//go:embed specification/common-types/resource-management/v2/types.json
 	//go:embed specification/ucp/resource-manager/UCP/preview/2022-03-15-privatepreview/*.json
 	SpecFilesUCP embed.FS
 )



Test patch:
diff --git a/pkg/armrpc/rest/results_test.go b/pkg/armrpc/rest/results_test.go
index 2f127d4e7..81615adcf 100644
--- a/pkg/armrpc/rest/results_test.go
+++ b/pkg/armrpc/rest/results_test.go
@@ -166,6 +166,16 @@ func TestGetAsyncLocationPath(t *testing.T) {
 			fmt.Sprintf("/subscriptions/00000000-0000-0000-0000-000000000000/providers/Applications.Core/locations/global/operationResults/%s", operationID.String()),
 			fmt.Sprintf("/subscriptions/00000000-0000-0000-0000-000000000000/providers/Applications.Core/locations/global/operationStatuses/%s", operationID.String()),
 		},
+		{
+			"ucp-test-headers",
+			"https://ucp.dev",
+			"/planes/radius/local/resourceGroups/test-rg/providers/Applications.Core/containers/test-container-0",
+			"global",
+			operationID,
+			"",
+			fmt.Sprintf("/planes/radius/local/providers/Applications.Core/locations/global/operationResults/%s", operationID.String()),
+			fmt.Sprintf("/planes/radius/local/providers/Applications.Core/locations/global/operationStatuses/%s", operationID.String()),
+		},
 	}
 
 	for _, tt := range testCases {
@@ -174,7 +184,7 @@ func TestGetAsyncLocationPath(t *testing.T) {
 			require.NoError(t, err)
 
 			body := &datamodel.ContainerResource{}
-			r := NewAsyncOperationResponse(body, tt.loc, http.StatusAccepted, resourceID, tt.opID, tt.av)
+			r := NewAsyncOperationResponse(body, tt.loc, http.StatusAccepted, resourceID, tt.opID, tt.av, "", "")
 
 			req := httptest.NewRequest("GET", tt.base, nil)
 			w := httptest.NewRecorder()
@@ -182,10 +192,19 @@ func TestGetAsyncLocationPath(t *testing.T) {
 			require.NoError(t, err)
 
 			require.NotNil(t, w.Header().Get("Location"))
-			require.Equal(t, tt.base+tt.or+"?api-version="+tt.av, w.Header().Get("Location"))
+			if tt.av == "" {
+				require.Equal(t, tt.base+tt.or, w.Header().Get("Location"))
+			} else {
+				require.Equal(t, tt.base+tt.or+"?api-version="+tt.av, w.Header().Get("Location"))
+			}
 
 			require.NotNil(t, w.Header().Get("Azure-AsyncHeader"))
-			require.Equal(t, tt.base+tt.os+"?api-version="+tt.av, w.Header().Get("Azure-AsyncOperation"))
+			if tt.av == "" {
+				require.Equal(t, tt.base+tt.os, w.Header().Get("Azure-AsyncOperation"))
+
+			} else {
+				require.Equal(t, tt.base+tt.os+"?api-version="+tt.av, w.Header().Get("Azure-AsyncOperation"))
+			}
 		})
 	}
 }
diff --git a/pkg/cli/cmd/group/create/create_test.go b/pkg/cli/cmd/group/create/create_test.go
new file mode 100644
index 000000000..1027f0e47
--- /dev/null
+++ b/pkg/cli/cmd/group/create/create_test.go
@@ -0,0 +1,121 @@
+// // ------------------------------------------------------------
+// // Copyright (c) Microsoft Corporation.
+// // Licensed under the MIT License.
+// // ------------------------------------------------------------
+
+package create
+
+import (
+	"context"
+	"testing"
+
+	"github.com/golang/mock/gomock"
+	"github.com/project-radius/radius/pkg/cli/clients"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/project-radius/radius/test/radcli"
+	"github.com/stretchr/testify/require"
+)
+
+func Test_CommandValidation(t *testing.T) {
+	radcli.SharedCommandValidation(t, NewCommand)
+}
+
+func Test_Validate(t *testing.T) {
+	configWithWorkspace := radcli.LoadConfigWithWorkspace(t)
+	configWithoutWorkspace := radcli.LoadConfigWithoutWorkspace(t)
+	testcases := []radcli.ValidateInput{
+		{
+			Name:          "Create Command with incorrect args",
+			Input:         []string{""},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+		{
+			Name:          "Create Command with  valid args but no workspace",
+			Input:         []string{"rg"},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithoutWorkspace,
+			},
+		},
+		{
+			Name:          "Create Command with too many args",
+			Input:         []string{"a", "b"},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+		{
+			Name:          "Valid Create Command",
+			Input:         []string{"rg"},
+			ExpectedValid: true,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+		{
+			Name:          "Invalid regource group name",
+			Input:         []string{"rg#1"},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+	}
+	radcli.SharedValidateValidation(t, NewCommand, testcases)
+}
+
+func Test_Run(t *testing.T) {
+	t.Run("Run rad group create", func(t *testing.T) {
+
+		ctrl := gomock.NewController(t)
+		defer ctrl.Finish()
+
+		appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+		appManagementClient.EXPECT().CreateUCPGroup(gomock.Any(), gomock.Any(), gomock.Any(), "testrg", gomock.Any()).Return(true, nil).Times(2)
+
+		workspace := &workspaces.Workspace{
+			Connection: map[string]interface{}{
+				"kind":    "kubernetes",
+				"context": "kind-kind",
+			},
+
+			Name: "kind-kind",
+		}
+		outputSink := &output.MockOutput{}
+		runner := &Runner{
+			ConnectionFactory:    &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+			Workspace:            workspace,
+			UCPResourceGroupName: "testrg",
+			Output:               outputSink,
+		}
+
+		err := runner.Run(context.Background())
+		require.NoError(t, err)
+
+		expected := []interface{}{
+			output.LogOutput{
+				Format: "creating resource group %q in workspace %q...\n",
+				Params: []interface{}{"testrg", "kind-kind"},
+			},
+			output.LogOutput{
+				Format: "resource group %q created",
+				Params: []interface{}{"testrg"},
+			},
+		}
+		require.Equal(t, expected, outputSink.Writes)
+
+	})
+
+}
diff --git a/pkg/cli/cmd/group/delete/delete_test.go b/pkg/cli/cmd/group/delete/delete_test.go
new file mode 100644
index 000000000..aaeaea6dd
--- /dev/null
+++ b/pkg/cli/cmd/group/delete/delete_test.go
@@ -0,0 +1,145 @@
+// // ------------------------------------------------------------
+// // Copyright (c) Microsoft Corporation.
+// // Licensed under the MIT License.
+// // ------------------------------------------------------------
+
+package delete
+
+import (
+	"context"
+	"testing"
+
+	"github.com/golang/mock/gomock"
+	"github.com/project-radius/radius/pkg/cli/clients"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/project-radius/radius/test/radcli"
+	"github.com/stretchr/testify/require"
+)
+
+func Test_CommandValidation(t *testing.T) {
+	radcli.SharedCommandValidation(t, NewCommand)
+}
+
+func Test_Validate(t *testing.T) {
+	configWithWorkspace := radcli.LoadConfigWithWorkspace(t)
+	testcases := []radcli.ValidateInput{
+		{
+			Name:          "Delete Command with incorrect args",
+			Input:         []string{},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+		{
+			Name:          "Delete Command with correct args",
+			Input:         []string{"groupname"},
+			ExpectedValid: true,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+	}
+	radcli.SharedValidateValidation(t, NewCommand, testcases)
+}
+
+func Test_Run(t *testing.T) {
+
+	t.Run("Delete resource group", func(t *testing.T) {
+		t.Run("Success (non-existent)", func(t *testing.T) {
+			ctrl := gomock.NewController(t)
+
+			appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+			appManagementClient.EXPECT().DeleteUCPGroup(gomock.Any(), gomock.Any(), gomock.Any(), "testrg").Return(true, nil).Times(2)
+
+			outputSink := &output.MockOutput{}
+
+			runner := &Runner{
+				ConnectionFactory:    &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+				Workspace:            &workspaces.Workspace{},
+				UCPResourceGroupName: "testrg",
+				Confirmation:         true,
+				Output:               outputSink,
+			}
+
+			err := runner.Run(context.Background())
+			require.NoError(t, err)
+
+			expected := []interface{}{
+				output.LogOutput{
+					Format: "deleting resource group %q ...\n",
+					Params: []interface{}{"testrg"},
+				},
+				output.LogOutput{
+					Format: "resource group %q deleted",
+					Params: []interface{}{"testrg"},
+				},
+			}
+			require.Equal(t, expected, outputSink.Writes)
+		})
+
+		t.Run("Success (deleted)", func(t *testing.T) {
+			ctrl := gomock.NewController(t)
+
+			appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+			appManagementClient.EXPECT().DeleteUCPGroup(gomock.Any(), gomock.Any(), gomock.Any(), "testrg").Return(false, nil).Times(2)
+
+			outputSink := &output.MockOutput{}
+
+			runner := &Runner{
+				ConnectionFactory:    &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+				Workspace:            &workspaces.Workspace{},
+				UCPResourceGroupName: "testrg",
+				Confirmation:         true,
+				Output:               outputSink,
+			}
+
+			err := runner.Run(context.Background())
+			require.NoError(t, err)
+
+			expected := []interface{}{
+				output.LogOutput{
+					Format: "deleting resource group %q ...\n",
+					Params: []interface{}{"testrg"},
+				},
+				output.LogOutput{
+					Format: "resource group %q does not exist or has already been deleted",
+					Params: []interface{}{"testrg"},
+				},
+			}
+			require.Equal(t, expected, outputSink.Writes)
+
+		})
+
+		t.Run("Answer no on confirmation", func(t *testing.T) {
+			ctrl := gomock.NewController(t)
+			appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+			outputSink := &output.MockOutput{}
+			runner := &Runner{
+				ConnectionFactory:    &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+				Workspace:            &workspaces.Workspace{},
+				UCPResourceGroupName: "testrg",
+				Confirmation:         false,
+				Output:               outputSink,
+			}
+
+			err := runner.Run(context.Background())
+			require.NoError(t, err)
+
+			expected := []interface{}{
+				output.LogOutput{
+					Format: "resource group %q NOT deleted",
+					Params: []interface{}{"testrg"},
+				},
+			}
+			require.Equal(t, expected, outputSink.Writes)
+
+		})
+	})
+
+}
diff --git a/pkg/cli/cmd/group/groupswitch/switch_test.go b/pkg/cli/cmd/group/groupswitch/switch_test.go
new file mode 100644
index 000000000..2969bfcc6
--- /dev/null
+++ b/pkg/cli/cmd/group/groupswitch/switch_test.go
@@ -0,0 +1,200 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package groupswitch
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"path"
+	"testing"
+
+	"github.com/golang/mock/gomock"
+	"github.com/project-radius/radius/pkg/cli"
+	"github.com/project-radius/radius/pkg/cli/clients"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
+	"github.com/project-radius/radius/test/radcli"
+	"github.com/stretchr/testify/require"
+	"gopkg.in/yaml.v2"
+)
+
+func Test_CommandValidation(t *testing.T) {
+	radcli.SharedCommandValidation(t, NewCommand)
+}
+
+func Test_Validate(t *testing.T) {
+	configWithWorkspace := radcli.LoadConfigWithWorkspace(t)
+
+	testcases := []radcli.ValidateInput{
+		{
+			Name:          "Switch Command with incorrect args",
+			Input:         []string{},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+		{
+			Name:          "Switch command with correct arguments",
+			Input:         []string{"groupname"},
+			ExpectedValid: true,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+	}
+	radcli.SharedValidateValidation(t, NewCommand, testcases)
+}
+
+func Test_Run(t *testing.T) {
+	t.Run("Switch resource group", func(t *testing.T) {
+		t.Run("Success", func(t *testing.T) {
+			configPath := path.Join(t.TempDir(), "config.yaml")
+
+			yamlData, err := yaml.Marshal(map[string]interface{}{
+				"workspaces": cli.WorkspaceSection{
+					Default: "b",
+					Items: map[string]workspaces.Workspace{
+						"a": {
+							Connection: map[string]interface{}{
+								"kind":    workspaces.KindKubernetes,
+								"context": "my-context",
+							},
+							Scope: "/planes/radius/local/resourceGroups/a",
+						},
+						"b": {
+							Connection: map[string]interface{}{
+								"kind":    workspaces.KindKubernetes,
+								"context": "my-context",
+							},
+							Scope: "/planes/radius/local/resourceGroups/b",
+						},
+					},
+				},
+			})
+			require.NoError(t, err)
+
+			config := radcli.LoadConfig(t, string(yamlData))
+			config.SetConfigFile(configPath)
+
+			expectedConfig := cli.WorkspaceSection{
+				Default: "b",
+				Items: map[string]workspaces.Workspace{
+					"a": {
+						Name: "a",
+						Connection: map[string]interface{}{
+							"kind":    workspaces.KindKubernetes,
+							"context": "my-context",
+						},
+						Scope: "/planes/radius/local/resourceGroups/a",
+					},
+					"b": {
+						Name: "b",
+						Connection: map[string]interface{}{
+							"kind":    workspaces.KindKubernetes,
+							"context": "my-context",
+						},
+						Scope: "/planes/radius/local/resourceGroups/a",
+					},
+				},
+			}
+
+			testResourceGroup := v20220315privatepreview.ResourceGroupResource{}
+
+			ctrl := gomock.NewController(t)
+			defer ctrl.Finish()
+
+			appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+			appManagementClient.EXPECT().ShowUCPGroup(gomock.Any(), gomock.Any(), gomock.Any(), "a").Return(testResourceGroup, nil)
+
+			workspace := &workspaces.Workspace{
+				Name: "b",
+				Connection: map[string]interface{}{
+					"kind":    workspaces.KindKubernetes,
+					"context": "my-context",
+				},
+				Scope: "/planes/radius/local/resourceGroups/b",
+			}
+
+			runner := &Runner{
+				ConfigHolder: &framework.ConfigHolder{
+					Config:         config,
+					ConfigFilePath: configPath,
+				},
+				ConnectionFactory:    &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+				Workspace:            workspace,
+				UCPResourceGroupName: "a",
+			}
+
+			err = runner.Run(context.Background())
+			require.NoError(t, err)
+
+			actualConfig, err := cli.ReadWorkspaceSection(config)
+			require.NoError(t, err)
+			require.Equal(t, expectedConfig, actualConfig)
+		})
+
+		t.Run("Switch (not existant)", func(t *testing.T) {
+			configPath := path.Join(t.TempDir(), "config.yaml")
+
+			yamlData, err := yaml.Marshal(map[string]interface{}{
+				"workspaces": cli.WorkspaceSection{
+					Default: "b",
+					Items: map[string]workspaces.Workspace{
+
+						"b": {
+							Connection: map[string]interface{}{
+								"kind":    workspaces.KindKubernetes,
+								"context": "my-context",
+							},
+							Scope: "/planes/radius/local/resourceGroups/b",
+						},
+					},
+				},
+			})
+
+			config := radcli.LoadConfig(t, string(yamlData))
+			config.SetConfigFile(configPath)
+			require.NoError(t, err)
+
+			testResourceGroup := v20220315privatepreview.ResourceGroupResource{}
+
+			ctrl := gomock.NewController(t)
+			defer ctrl.Finish()
+
+			appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+			appManagementClient.EXPECT().ShowUCPGroup(gomock.Any(), gomock.Any(), gomock.Any(), "c").Return(testResourceGroup, errors.New("resource group doesnt exist"))
+
+			workspace := &workspaces.Workspace{
+				Name: "b",
+				Connection: map[string]interface{}{
+					"kind":    workspaces.KindKubernetes,
+					"context": "my-context",
+				},
+				Scope: "/planes/radius/local/resourceGroups/b",
+			}
+
+			runner := &Runner{
+				ConfigHolder: &framework.ConfigHolder{
+					Config:         config,
+					ConfigFilePath: configPath,
+				},
+				ConnectionFactory:    &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+				Workspace:            workspace,
+				UCPResourceGroupName: "c",
+			}
+
+			expected := &cli.FriendlyError{Message: fmt.Sprintf("resource group %q does not exist. Run `rad group create` or `rad init` and try again \n", runner.UCPResourceGroupName)}
+			err = runner.Run(context.Background())
+			require.Equal(t, expected, err)
+		})
+	})
+}
diff --git a/pkg/cli/cmd/group/list/list_test.go b/pkg/cli/cmd/group/list/list_test.go
new file mode 100644
index 000000000..c2db1589f
--- /dev/null
+++ b/pkg/cli/cmd/group/list/list_test.go
@@ -0,0 +1,99 @@
+// // ------------------------------------------------------------
+// // Copyright (c) Microsoft Corporation.
+// // Licensed under the MIT License.
+// // ------------------------------------------------------------
+
+package list
+
+import (
+	"context"
+	"testing"
+
+	"github.com/golang/mock/gomock"
+	"github.com/project-radius/radius/pkg/cli/clients"
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
+	"github.com/project-radius/radius/test/radcli"
+	"github.com/stretchr/testify/require"
+)
+
+func Test_CommandValidation(t *testing.T) {
+	radcli.SharedCommandValidation(t, NewCommand)
+}
+
+func Test_Validate(t *testing.T) {
+	configWithWorkspace := radcli.LoadConfigWithWorkspace(t)
+	configWithoutWorkspace := radcli.LoadConfigWithWorkspace(t)
+
+	testcases := []radcli.ValidateInput{
+		{
+			Name:          "List Command with incorrect args",
+			Input:         []string{"group"},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+		{
+			Name:          "List Command with correct options but bad workspace",
+			Input:         []string{"-w", "doesnotexist"},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithoutWorkspace,
+			},
+		},
+		{
+			Name:          "List Command with valid workspace specified",
+			Input:         []string{},
+			ExpectedValid: true,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+	}
+	radcli.SharedValidateValidation(t, NewCommand, testcases)
+}
+
+func Test_Run(t *testing.T) {
+
+	t.Run("Validate rad group list", func(t *testing.T) {
+
+		ctrl := gomock.NewController(t)
+		defer ctrl.Finish()
+
+		resourceGroups := []v20220315privatepreview.ResourceGroupResource{
+			radcli.CreateResourceGroup("rg1"),
+			radcli.CreateResourceGroup("rg2"),
+		}
+
+		appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+		appManagementClient.EXPECT().ListUCPGroup(gomock.Any(), gomock.Any(), gomock.Any()).Return(resourceGroups, nil).Times(1)
+
+		workspace := &workspaces.Workspace{
+			Connection: map[string]interface{}{
+				"kind":    "kubernetes",
+				"context": "kind-kind",
+			},
+
+			Name: "kind-kind",
+		}
+		outputSink := &output.MockOutput{}
+		runner := &Runner{
+			ConnectionFactory: &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+			Workspace:         workspace,
+			Format:            "table",
+			Output:            outputSink,
+		}
+
+		err := runner.Run(context.Background())
+		require.NoError(t, err)
+
+	})
+
+}
diff --git a/pkg/cli/cmd/group/show/show_test.go b/pkg/cli/cmd/group/show/show_test.go
new file mode 100644
index 000000000..c04e40861
--- /dev/null
+++ b/pkg/cli/cmd/group/show/show_test.go
@@ -0,0 +1,107 @@
+// ------------------------------------------------------------
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+// ------------------------------------------------------------
+
+package show
+
+import (
+	"context"
+	"testing"
+
+	"github.com/golang/mock/gomock"
+	"github.com/project-radius/radius/pkg/cli/clients"
+
+	"github.com/project-radius/radius/pkg/cli/connections"
+	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/cli/objectformats"
+	"github.com/project-radius/radius/pkg/cli/output"
+	"github.com/project-radius/radius/pkg/cli/workspaces"
+	"github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
+	"github.com/project-radius/radius/test/radcli"
+	"github.com/stretchr/testify/require"
+)
+
+func Test_CommandValidation(t *testing.T) {
+	radcli.SharedCommandValidation(t, NewCommand)
+}
+
+func Test_Validate(t *testing.T) {
+	configWithWorkspace := radcli.LoadConfigWithWorkspace(t)
+
+	testcases := []radcli.ValidateInput{
+		{
+			Name:          "Show Command with incorrect args",
+			Input:         []string{""},
+			ExpectedValid: false,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+		{
+			Name:          "Show Command with correct options",
+			Input:         []string{"groupname"},
+			ExpectedValid: true,
+			ConfigHolder: framework.ConfigHolder{
+				ConfigFilePath: "",
+				Config:         configWithWorkspace,
+			},
+		},
+	}
+	radcli.SharedValidateValidation(t, NewCommand, testcases)
+}
+
+func Test_Run(t *testing.T) {
+
+	t.Run("Validate rad group show", func(t *testing.T) {
+		id := "/planes/radius/local/resourceGroups/testrg"
+		name := "testrg"
+
+		testResourceGroup := v20220315privatepreview.ResourceGroupResource{
+			ID:   &id,
+			Name: &name,
+		}
+
+		ctrl := gomock.NewController(t)
+		defer ctrl.Finish()
+
+		appManagementClient := clients.NewMockApplicationsManagementClient(ctrl)
+		appManagementClient.EXPECT().ShowUCPGroup(gomock.Any(), gomock.Any(), gomock.Any(), "testrg").Return(testResourceGroup, nil)
+
+		workspace := &workspaces.Workspace{
+			Connection: map[string]interface{}{
+				"kind":    "kubernetes",
+				"context": "kind-kind",
+			},
+
+			Name: "kind-kind",
+		}
+		outputSink := &output.MockOutput{}
+		runner := &Runner{
+			ConnectionFactory:    &connections.MockFactory{ApplicationsManagementClient: appManagementClient},
+			Workspace:            workspace,
+			UCPResourceGroupName: "testrg",
+			Format:               "table",
+			Output:               outputSink,
+		}
+
+		err := runner.Run(context.Background())
+		require.NoError(t, err)
+
+		resourceGroup := v20220315privatepreview.ResourceGroupResource{
+			ID:   &id,
+			Name: &runner.UCPResourceGroupName,
+		}
+		expected := []interface{}{
+			output.FormattedOutput{
+				Format:  "table",
+				Obj:     resourceGroup,
+				Options: objectformats.GetResourceGroupTableFormat(),
+			},
+		}
+		require.Equal(t, expected, outputSink.Writes)
+
+	})
+
+}
diff --git a/pkg/cli/azure/deploy_test.go b/pkg/cli/deployment/deploy_test.go
similarity index 99%
rename from pkg/cli/azure/deploy_test.go
rename to pkg/cli/deployment/deploy_test.go
index 7804df294..52527521f 100644
--- a/pkg/cli/azure/deploy_test.go
+++ b/pkg/cli/deployment/deploy_test.go
@@ -3,7 +3,7 @@
 // Licensed under the MIT License.
 // ------------------------------------------------------------
 
-package azure
+package deployment
 
 import (
 	"testing"
diff --git a/pkg/connectorrp/api/v20220315privatepreview/daprstatestore_conversion.go b/pkg/connectorrp/api/v20220315privatepreview/daprstatestore_conversion.go
index e5920372d..edbbb25d3 100644
--- a/pkg/connectorrp/api/v20220315privatepreview/daprstatestore_conversion.go
+++ b/pkg/connectorrp/api/v20220315privatepreview/daprstatestore_conversion.go
@@ -19,7 +19,6 @@ func (src *DaprStateStoreResource) ConvertTo() (conv.DataModelInterface, error)
 		},
 		ProvisioningState: toProvisioningStateDataModel(src.Properties.GetDaprStateStoreProperties().ProvisioningState),
 		Kind:              toDaprStateStoreKindDataModel(src.Properties.GetDaprStateStoreProperties().Kind),
-		StateStoreName:    to.String(src.Properties.GetDaprStateStoreProperties().StateStoreName),
 	}
 
 	if src.Properties.GetDaprStateStoreProperties().Recipe != nil {
@@ -85,8 +84,8 @@ func (dst *DaprStateStoreResource) ConvertFrom(src conv.DataModelInterface) erro
 			Environment:       to.StringPtr(daprStateStore.Properties.Environment),
 			Application:       to.StringPtr(daprStateStore.Properties.Application),
 			Kind:              fromDaprStateStoreKindDataModel(daprStateStore.Properties.Kind),
-			StateStoreName:    to.StringPtr(daprStateStore.Properties.StateStoreName),
 			Resource:          to.StringPtr(daprStateStore.Properties.DaprStateStoreAzureTableStorage.Resource),
+			ComponentName:     to.StringPtr(daprStateStore.Properties.ComponentName),
 		}
 	case datamodel.DaprStateStoreKindStateSqlServer:
 		dst.Properties = &DaprStateStoreSQLServerResourceProperties{
@@ -97,8 +96,8 @@ func (dst *DaprStateStoreResource) ConvertFrom(src conv.DataModelInterface) erro
 			Environment:       to.StringPtr(daprStateStore.Properties.Environment),
 			Application:       to.StringPtr(daprStateStore.Properties.Application),
 			Kind:              fromDaprStateStoreKindDataModel(daprStateStore.Properties.Kind),
-			StateStoreName:    to.StringPtr(daprStateStore.Properties.StateStoreName),
 			Resource:          to.StringPtr(daprStateStore.Properties.DaprStateStoreSQLServer.Resource),
+			ComponentName:     to.StringPtr(daprStateStore.Properties.ComponentName),
 		}
 	case datamodel.DaprStateStoreKindGeneric:
 		dst.Properties = &DaprStateStoreGenericResourceProperties{
@@ -109,10 +108,10 @@ func (dst *DaprStateStoreResource) ConvertFrom(src conv.DataModelInterface) erro
 			Environment:       to.StringPtr(daprStateStore.Properties.Environment),
 			Application:       to.StringPtr(daprStateStore.Properties.Application),
 			Kind:              fromDaprStateStoreKindDataModel(daprStateStore.Properties.Kind),
-			StateStoreName:    to.StringPtr(daprStateStore.Properties.StateStoreName),
 			Type:              to.StringPtr(daprStateStore.Properties.DaprStateStoreGeneric.Type),
 			Version:           to.StringPtr(daprStateStore.Properties.DaprStateStoreGeneric.Version),
 			Metadata:          daprStateStore.Properties.DaprStateStoreGeneric.Metadata,
+			ComponentName:     to.StringPtr(daprStateStore.Properties.ComponentName),
 		}
 	default:
 		return errors.New("Kind of DaprStateStore is not specified.")
diff --git a/pkg/connectorrp/datamodel/daprstatestore.go b/pkg/connectorrp/datamodel/daprstatestore.go
index d2d888df5..2181b005a 100644
--- a/pkg/connectorrp/datamodel/daprstatestore.go
+++ b/pkg/connectorrp/datamodel/daprstatestore.go
@@ -7,6 +7,7 @@ package datamodel
 
 import (
 	v1 "github.com/project-radius/radius/pkg/armrpc/api/v1"
+	"github.com/project-radius/radius/pkg/rp"
 )
 
 type DaprStateStoreKind string
@@ -41,8 +42,8 @@ func (daprStateStore DaprStateStore) ResourceTypeName() string {
 // DaprStateStoreProperties represents the properties of DaprStateStore resource.
 type DaprStateStoreProperties struct {
 	v1.BasicResourceProperties
+	rp.BasicDaprResourceProperties
 	ProvisioningState               v1.ProvisioningState                              `json:"provisioningState,omitempty"`
-	StateStoreName                  string                                            `json:"stateStoreName"`
 	Kind                            DaprStateStoreKind                                `json:"kind"`
 	DaprStateStoreSQLServer         DaprStateStoreSQLServerResourceProperties         `json:"daprStateStoreSQLServer"`
 	DaprStateStoreAzureTableStorage DaprStateStoreAzureTableStorageResourceProperties `json:"daprStateStoreAzureTableStorage"`
diff --git a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker_test.go b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker_test.go
index 1e5421a42..95e6a18de 100644
--- a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker_test.go
+++ b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/createorupdatedaprpubsubbroker_test.go
@@ -59,6 +59,9 @@ func getDeploymentProcessorOutputs() (renderers.RendererOutput, deployment.Deplo
 		daprpubsubbrokers.TopicNameKey: {
 			Value: "test-topic",
 		},
+		renderers.ComponentNameKey: {
+			Value: "test-app-test-pub-sub-topic",
+		},
 	}
 	rendererOutput := renderers.RendererOutput{
 		Resources:      []outputresource.OutputResource{output},
@@ -78,6 +81,7 @@ func getDeploymentProcessorOutputs() (renderers.RendererOutput, deployment.Deplo
 		},
 		ComputedValues: map[string]interface{}{
 			daprpubsubbrokers.TopicNameKey: rendererOutput.ComputedValues[daprpubsubbrokers.TopicNameKey].Value,
+			renderers.ComponentNameKey:     rendererOutput.ComputedValues[renderers.ComponentNameKey].Value,
 		},
 	}
 
diff --git a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_datamodel.json b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_datamodel.json
index 766163b4e..bdb811cad 100644
--- a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_datamodel.json
+++ b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_datamodel.json
@@ -29,7 +29,8 @@
         "daprPubSubAzureServiceBus": {
           "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.ServiceBus/namespaces/radius-eastus-async"
         },
-        "topic": "test-topic"
+        "topic": "test-topic",
+        "componentName": "test-app-test-pub-sub-topic"
     },
     "tenantId": "00000000-0000-0000-0000-000000000000",
     "subscriptionId": "00000000-0000-0000-0000-000000000000",
diff --git a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_output.json b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_output.json
index 2500838be..3ac26ca84 100644
--- a/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_output.json
+++ b/pkg/connectorrp/frontend/controller/daprpubsubbrokers/testdata/20220315privatepreview_output.json
@@ -15,7 +15,8 @@
         "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.ServiceBus/namespaces/radius-eastus-async",
         "kind": "pubsub.azure.servicebus",
         "provisioningState": "Succeeded",
-        "topic": "test-topic"
+        "topic": "test-topic",
+        "componentName": "test-app-test-pub-sub-topic"
     },
     "systemData": {
         "createdAt": "2022-03-22T18:54:52.6857175Z",
diff --git a/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore_test.go b/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore_test.go
index 3a5651380..ec8c5bc90 100644
--- a/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore_test.go
+++ b/pkg/connectorrp/frontend/controller/daprsecretstores/createorupdatedaprsecretstore_test.go
@@ -40,8 +40,8 @@ func getDeploymentProcessorOutputs() (renderers.RendererOutput, deployment.Deplo
 		},
 		SecretValues: map[string]rp.SecretValueReference{},
 		ComputedValues: map[string]renderers.ComputedValueReference{
-			"secretStoreName": {
-				Value: "test-secret-store",
+			"componentName": {
+				Value: "test-app-test-secret-store",
 			},
 		},
 	}
@@ -57,7 +57,7 @@ func getDeploymentProcessorOutputs() (renderers.RendererOutput, deployment.Deplo
 			},
 		},
 		ComputedValues: map[string]interface{}{
-			"secretStoreName": rendererOutput.ComputedValues["secretStoreName"].Value,
+			"componentName": rendererOutput.ComputedValues["componentName"].Value,
 		},
 	}
 
diff --git a/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_datamodel.json b/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_datamodel.json
index 99f768fae..5adf81b7f 100644
--- a/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_datamodel.json
+++ b/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_datamodel.json
@@ -31,7 +31,7 @@
         "metadata": {
             "foo": "bar"
         },
-        "secretStoreName": "test-secret-store"
+        "componentName": "test-app-test-secret-store"
     },
     "tenantId": "00000000-0000-0000-0000-000000000000",
     "subscriptionId": "00000000-0000-0000-0000-000000000000",
diff --git a/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_output.json b/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_output.json
index 382b0b6b0..0c925d02e 100644
--- a/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_output.json
+++ b/pkg/connectorrp/frontend/controller/daprsecretstores/testdata/20220315privatepreview_output.json
@@ -19,7 +19,7 @@
             "foo": "bar"
         },
         "provisioningState": "Succeeded",
-        "secretStoreName": "test-secret-store"
+        "componentName": "test-app-test-secret-store"
     },
     "systemData": {
         "createdAt": "2022-03-22T18:54:52.6857175Z",
diff --git a/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore.go b/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore.go
index 96db1e034..559c1980b 100644
--- a/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore.go
+++ b/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore.go
@@ -82,8 +82,8 @@ func (daprStateStore *CreateOrUpdateDaprStateStore) Run(ctx context.Context, req
 	newResource.ComputedValues = deploymentOutput.ComputedValues
 	newResource.SecretValues = deploymentOutput.SecretValues
 
-	if stateStoreName, ok := deploymentOutput.ComputedValues[renderers.StateStoreName].(string); ok {
-		newResource.Properties.StateStoreName = stateStoreName
+	if componentName, ok := deploymentOutput.ComputedValues[renderers.ComponentNameKey].(string); ok {
+		newResource.Properties.ComponentName = componentName
 	}
 
 	if !isNewResource {
diff --git a/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore_test.go b/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore_test.go
index ee0c226de..79261b280 100644
--- a/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore_test.go
+++ b/pkg/connectorrp/frontend/controller/daprstatestores/createorupdatedaprstatestore_test.go
@@ -200,8 +200,8 @@ func getDeploymentProcessorOutputs() (renderers.RendererOutput, deployment.Deplo
 		},
 		SecretValues: map[string]rp.SecretValueReference{},
 		ComputedValues: map[string]renderers.ComputedValueReference{
-			"stateStoreName": {
-				Value: "test-resource",
+			"componentName": {
+				Value: "test-app-test-resource",
 			},
 		},
 	}
@@ -217,7 +217,7 @@ func getDeploymentProcessorOutputs() (renderers.RendererOutput, deployment.Deplo
 			},
 		},
 		ComputedValues: map[string]interface{}{
-			"stateStoreName": rendererOutput.ComputedValues["stateStoreName"].Value,
+			"componentName": rendererOutput.ComputedValues["componentName"].Value,
 		},
 	}
 
diff --git a/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_datamodel.json b/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_datamodel.json
index 123377a88..524a9cc90 100644
--- a/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_datamodel.json
+++ b/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_datamodel.json
@@ -29,7 +29,7 @@
                 }
             }]
         },
-        "stateStoreName": "test-resource"
+        "componentName": "test-app-test-resource"
     },
     "tenantId": "00000000-0000-0000-0000-000000000000",
     "subscriptionId": "00000000-0000-0000-0000-000000000000",
diff --git a/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_output.json b/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_output.json
index ec5aa2890..8c1bce2dd 100644
--- a/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_output.json
+++ b/pkg/connectorrp/frontend/controller/daprstatestores/testdata/20220315privatepreview_output.json
@@ -15,7 +15,7 @@
         "kind": "state.azure.tablestorage",
         "resource": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testGroup/providers/Microsoft.Storage/storageAccounts/tableServices/tables/testTable",
         "provisioningState": "Succeeded",
-        "stateStoreName": "test-resource"
+        "componentName": "test-app-test-resource"
     },
     "systemData": {
         "createdAt": "2022-03-22T18:54:52.6857175Z",
diff --git a/pkg/connectorrp/renderers/daprpubsubbrokers/renderer_test.go b/pkg/connectorrp/renderers/daprpubsubbrokers/renderer_test.go
index 3b02c9c2f..2c9acc88e 100644
--- a/pkg/connectorrp/renderers/daprpubsubbrokers/renderer_test.go
+++ b/pkg/connectorrp/renderers/daprpubsubbrokers/renderer_test.go
@@ -68,6 +68,7 @@ func Test_Render_Generic_Success(t *testing.T) {
 
 	require.Equal(t, outputresource.LocalIDDaprComponent, output.LocalID)
 	require.Equal(t, resourcekinds.DaprComponent, output.ResourceType.Type)
+	require.Equal(t, kubernetes.MakeResourceName(applicationName, resourceName), result.ComputedValues[renderers.ComponentNameKey].Value)
 
 	expected := &unstructured.Unstructured{
 		Object: map[string]interface{}{
@@ -250,6 +251,7 @@ func Test_Render_DaprPubSubAzureServiceBus_Success(t *testing.T) {
 
 	require.Equal(t, outputresource.LocalIDAzureServiceBusNamespace, output.LocalID)
 	require.Equal(t, resourcekinds.DaprPubSubTopicAzureServiceBus, output.ResourceType.Type)
+	require.Equal(t, kubernetes.MakeResourceName(applicationName, resourceName), result.ComputedValues[renderers.ComponentNameKey].Value)
 
 	expected := map[string]string{
 		handlers.ResourceName:               resourceName,
@@ -293,6 +295,7 @@ func Test_Render_DaprPubSubMissingTopicName_Success(t *testing.T) {
 
 	require.Equal(t, outputresource.LocalIDAzureServiceBusNamespace, output.LocalID)
 	require.Equal(t, resourcekinds.DaprPubSubTopicAzureServiceBus, output.ResourceType.Type)
+	require.Equal(t, kubernetes.MakeResourceName(applicationName, resourceName), result.ComputedValues[renderers.ComponentNameKey].Value)
 
 	expected := map[string]string{
 		handlers.ResourceName:               resourceName,
diff --git a/pkg/connectorrp/renderers/daprsecretstores/renderer_test.go b/pkg/connectorrp/renderers/daprsecretstores/renderer_test.go
index 61a70d7b8..4022bdcd1 100644
--- a/pkg/connectorrp/renderers/daprsecretstores/renderer_test.go
+++ b/pkg/connectorrp/renderers/daprsecretstores/renderer_test.go
@@ -100,7 +100,7 @@ func Test_Render_Generic_Success(t *testing.T) {
 	require.Equal(t, outputresource.LocalIDDaprComponent, outputResource.LocalID)
 	require.Equal(t, resourcekinds.DaprComponent, outputResource.ResourceType.Type)
 	expectedComputedValues := map[string]renderers.ComputedValueReference{
-		"secretStoreName": {
+		renderers.ComponentNameKey: {
 			Value: "test-app-test-secret-store",
 		},
 	}
@@ -263,6 +263,7 @@ func Test_Render_EmptyApplicationID(t *testing.T) {
 		},
 	}
 
-	_, err := renderer.Render(ctx, &resource, renderers.RenderOptions{Namespace: "radius-test"})
+	rendererOutput, err := renderer.Render(ctx, &resource, renderers.RenderOptions{Namespace: "radius-test"})
 	require.NoError(t, err)
+	require.Equal(t, kubernetes.MakeResourceName("", "test-secret-store"), rendererOutput.ComputedValues[renderers.ComponentNameKey].Value)
 }
diff --git a/pkg/connectorrp/renderers/daprstatestores/renderer.go b/pkg/connectorrp/renderers/daprstatestores/renderer.go
index c6e8211b7..d404bbb08 100644
--- a/pkg/connectorrp/renderers/daprstatestores/renderer.go
+++ b/pkg/connectorrp/renderers/daprstatestores/renderer.go
@@ -59,20 +59,20 @@ func (r *Renderer) Render(ctx context.Context, dm conv.DataModelInterface, optio
 		applicationName = applicationID.Name()
 	}
 
-	resoures, err := stateStoreFunc(*resource, applicationName, options.Namespace)
+	resources, err := stateStoreFunc(*resource, applicationName, options.Namespace)
 	if err != nil {
 		return renderers.RendererOutput{}, err
 	}
 
 	values := map[string]renderers.ComputedValueReference{
-		"stateStoreName": {
+		renderers.ComponentNameKey: {
 			Value: kubernetes.MakeResourceName(applicationName, resource.Name),
 		},
 	}
 	secrets := map[string]rp.SecretValueReference{}
 
 	return renderers.RendererOutput{
-		Resources:      resoures,
+		Resources:      resources,
 		ComputedValues: values,
 		SecretValues:   secrets,
 	}, nil
diff --git a/pkg/connectorrp/renderers/daprstatestores/renderer_test.go b/pkg/connectorrp/renderers/daprstatestores/renderer_test.go
index 844504e2e..d820d455b 100644
--- a/pkg/connectorrp/renderers/daprstatestores/renderer_test.go
+++ b/pkg/connectorrp/renderers/daprstatestores/renderer_test.go
@@ -61,6 +61,7 @@ func Test_Render_Success(t *testing.T) {
 
 	require.Equal(t, outputresource.LocalIDDaprStateStoreAzureStorage, output.LocalID)
 	require.Equal(t, resourcekinds.DaprStateStoreAzureStorage, output.ResourceType.Type)
+	require.Equal(t, kubernetes.MakeResourceName(applicationName, resourceName), result.ComputedValues[renderers.ComponentNameKey].Value)
 
 	expected := map[string]string{
 		handlers.KubernetesNameKey:       "test-state-store",
@@ -182,6 +183,7 @@ func Test_Render_Generic_Success(t *testing.T) {
 
 	require.Equal(t, outputresource.LocalIDDaprComponent, output.LocalID)
 	require.Equal(t, resourcekinds.DaprComponent, output.ResourceType.Type)
+	require.Equal(t, kubernetes.MakeResourceName(applicationName, resourceName), result.ComputedValues[renderers.ComponentNameKey].Value)
 
 	expected := unstructured.Unstructured{
 		Object: map[string]interface{}{
diff --git a/pkg/ucp/frontend/controller/planes/createorupdateplane_test.go b/pkg/ucp/frontend/controller/planes/createorupdateplane_test.go
index 3f4bf8fa6..6f40cac89 100644
--- a/pkg/ucp/frontend/controller/planes/createorupdateplane_test.go
+++ b/pkg/ucp/frontend/controller/planes/createorupdateplane_test.go
@@ -18,7 +18,7 @@ import (
 	"gotest.tools/assert"
 )
 
-func Test_CreatePlane(t *testing.T) {
+func Test_CreateUCPNativePlane(t *testing.T) {
 	ctx, cancel := testcontext.New(t)
 	defer cancel()
 
diff --git a/test/functional/corerp/resources/testdata/corerp-resources-dapr-pubsub-generic.bicep b/test/functional/corerp/resources/testdata/corerp-resources-dapr-pubsub-generic.bicep
index a6b2dc31c..c97030ade 100644
--- a/test/functional/corerp/resources/testdata/corerp-resources-dapr-pubsub-generic.bicep
+++ b/test/functional/corerp/resources/testdata/corerp-resources-dapr-pubsub-generic.bicep
@@ -26,12 +26,60 @@ resource publisher 'Applications.Core/containers@2022-03-15-privatepreview' = {
     }
     container: {
       image: magpieimage
-      readinessProbe:{
+      readinessProbe: {
         kind: 'httpGet'
         containerPort: 3000
         path: '/healthz'
       }
     }
+    extensions: [
+      {
+        kind: 'daprSidecar'
+        appId: 'gnrc-pubsub'
+        appPort: 3000
+      }
+    ]
+  }
+}
+
+resource redisContainer 'Applications.Core/containers@2022-03-15-privatepreview' = {
+  name: 'gnrc-redis-ctnr'
+  location: 'global'
+  properties: {
+    application: app.id
+    container: {
+      image: 'redis:6.2'
+      ports: {
+        redis: {
+          containerPort: 6379
+          provides: redisRoute.id
+        }
+      }
+    }
+    connections: {}
+  }
+}
+
+resource redisRoute 'Applications.Core/httproutes@2022-03-15-privatepreview' = {
+  name: 'gnrc-redis-rte'
+  location: 'global'
+  properties: {
+    application: app.id
+  }
+}
+
+resource redis 'Applications.Connector/redisCaches@2022-03-15-privatepreview' = {
+  name: 'gnrc-redis-rds'
+  location: 'global'
+  properties: {
+    environment: environment
+    application: app.id
+    host: redisRoute.properties.hostname
+    port: redisRoute.properties.port
+    secrets: {
+      connectionString: '${redisRoute.properties.hostname}:${redisRoute.properties.port}'
+      password: ''
+    }
   }
 }
 
@@ -42,10 +90,10 @@ resource pubsub 'Applications.Connector/daprPubSubBrokers@2022-03-15-privateprev
     environment: environment
     application: app.id
     kind: 'generic'
-    type: 'pubsub.kafka'
+    type: 'pubsub.redis'
     metadata: {
-      brokers: 'dapr-kafka.kafka.svc.cluster.local:9092'
-      authRequired: false
+      redisHost: '${redisRoute.properties.hostname}:${redisRoute.properties.port}'
+      redisPassword: ''
     }
     version: 'v1'
   }
diff --git a/test/functional/ucp/plane_test.go b/test/functional/ucp/plane_test.go
index 06f582887..fef994f69 100644
--- a/test/functional/ucp/plane_test.go
+++ b/test/functional/ucp/plane_test.go
@@ -25,7 +25,7 @@ func Test_Plane_Operations(t *testing.T) {
 
 		// By default, we configure default planes (radius and deployments planes) in UCP. Verify that by calling List Planes
 		planes := listPlanes(t, roundTripper, fmt.Sprintf("%s/planes", url))
-		require.Equal(t, 2, len(planes))
+		require.Equal(t, 3, len(planes))
 
 		t.Cleanup(func() {
 			deletePlane(t, roundTripper, planeURL)
diff --git a/test/magpiego/bindings/daprpubsub.go b/test/magpiego/bindings/daprpubsub.go
index ca4ba76bb..dc87098ff 100644
--- a/test/magpiego/bindings/daprpubsub.go
+++ b/test/magpiego/bindings/daprpubsub.go
@@ -10,15 +10,15 @@ import (
 )
 
 // Use this with a values like:
-// - CONNECTION_DAPRPUBSUB_PUBSUBNAME
+// - CONNECTION_DAPRPUBSUB_COMPONENTNAME
 // - CONNECTION_DAPRPUBSUB_TOPIC
 // - DAPR_GRPC_PORT
 func DaprPubSubBinding(envParams map[string]string) BindingStatus {
 	// From https://docs.dapr.io/developing-applications/building-blocks/pubsub/howto-publish-subscribe/
-	pubSubName := envParams["PUBSUBNAME"]
-	if pubSubName == "" {
-		log.Println("pub sub NAME is required")
-		return BindingStatus{false, "NAME is required"}
+	componentName := envParams["COMPONENTNAME"]
+	if componentName == "" {
+		log.Println("COMPONENTNAME is required")
+		return BindingStatus{false, "COMPONENTNAME is required"}
 	}
 	topic := envParams["TOPIC"]
 	if topic == "" {
@@ -32,8 +32,8 @@ func DaprPubSubBinding(envParams map[string]string) BindingStatus {
 	}
 	ctx := context.Background()
 	// Using Dapr SDK to publish a topic
-	if err := client.PublishEvent(ctx, pubSubName, topic, []byte("hello, world!")); err != nil {
-		log.Println("failed to publish Dapr event - ", pubSubName, " error - ", err.Error())
+	if err := client.PublishEvent(ctx, componentName, topic, []byte("hello, world!")); err != nil {
+		log.Println("failed to publish Dapr event - ", componentName, " error - ", err.Error())
 		return BindingStatus{false, "failed to publish Dapr"}
 	}
 	defer client.Close()
diff --git a/test/magpiego/bindings/daprsecretstore.go b/test/magpiego/bindings/daprsecretstore.go
index 819574aa6..6f2e53b2f 100644
--- a/test/magpiego/bindings/daprsecretstore.go
+++ b/test/magpiego/bindings/daprsecretstore.go
@@ -9,10 +9,10 @@ import (
 )
 
 func DaprSecretStoreBinding(envParams map[string]string) BindingStatus {
-	secretName := envParams["SECRETSTORENAME"]
+	secretName := envParams["COMPONENTNAME"]
 	if secretName == "" {
-		log.Println("SECRETSTORENAME is required")
-		return BindingStatus{false, "SECRETSTORENAME is required"}
+		log.Println("COMPONENTNAME is required")
+		return BindingStatus{false, "COMPONENTNAME is required"}
 	}
 	client, err := dapr.NewClientWithPort(os.Getenv("DAPR_GRPC_PORT"))
 	if err != nil {
diff --git a/test/magpiego/bindings/daprstatestore.go b/test/magpiego/bindings/daprstatestore.go
index 8d8bf7abd..4b57d8303 100644
--- a/test/magpiego/bindings/daprstatestore.go
+++ b/test/magpiego/bindings/daprstatestore.go
@@ -10,10 +10,10 @@ import (
 
 func DaprStateStoreBinding(envParams map[string]string) BindingStatus {
 	// From https://docs.dapr.io/developing-applications/sdks/go/go-client/
-	stateStoreName := envParams["STATESTORENAME"]
+	stateStoreName := envParams["COMPONENTNAME"]
 	if stateStoreName == "" {
-		log.Println("STATESTORENAME is required")
-		return BindingStatus{false, "STATESTORENAME is required"}
+		log.Println("COMPONENTNAME is required")
+		return BindingStatus{false, "COMPONENTNAME is required"}
 	}
 	client, err := dapr.NewClientWithPort(os.Getenv("DAPR_GRPC_PORT"))
 	if err != nil {
diff --git a/test/radcli/shared.go b/test/radcli/shared.go
index 843afa492..7d1c6df68 100644
--- a/test/radcli/shared.go
+++ b/test/radcli/shared.go
@@ -14,9 +14,11 @@ import (
 	armrpcv1 "github.com/project-radius/radius/pkg/armrpc/api/v1"
 	"github.com/project-radius/radius/pkg/cli/clients_new/generated"
 	"github.com/project-radius/radius/pkg/cli/framework"
+	"github.com/project-radius/radius/pkg/ucp/api/v20220315privatepreview"
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
 	"github.com/stretchr/testify/require"
+	"gotest.tools/assert"
 )
 
 type ValidateInput struct {
@@ -50,15 +52,16 @@ func SharedValidateValidation(t *testing.T, factory func(framework framework.Fac
 			require.NoError(t, err, "flag parsing failed")
 
 			err = cmd.ValidateArgs(cmd.Flags().Args())
-			if testcase.ExpectedValid && err != nil {
-				require.NoError(t, err, "validation should have passed but it failed")
-			} else if !testcase.ExpectedValid && err != nil {
+			if !testcase.ExpectedValid && err != nil {
 				return
 			}
 
 			err = runner.Validate(cmd, cmd.Flags().Args())
 			if testcase.ExpectedValid {
-				require.NoError(t, err, "validation should have passed but it failed")
+				if err != nil {
+					expectedErrorMsg := "kubernetes cluster unreachable"
+					assert.ErrorContains(t, err, "cluster unreachable", "Error should be: %v, got: %v", expectedErrorMsg, err)
+				}
 			} else {
 				require.Error(t, err, "validation should have failed but it passed")
 			}
@@ -123,3 +126,11 @@ func CreateResource(resourceType string, resourceName string) generated.GenericR
 		Location: &location,
 	}
 }
+
+func CreateResourceGroup(resourceGroupName string) v20220315privatepreview.ResourceGroupResource {
+	id := fmt.Sprintf("/planes/radius/local/resourcegroups/%s", resourceGroupName)
+	return v20220315privatepreview.ResourceGroupResource{
+		Name: &resourceGroupName,
+		ID:   &id,
+	}
+}