Repository: kumahq/kuma
Pull request #2469 (2021-07-30 14:44:34)

chore(tools): add to resource-gen.go generation of kumactl options 
First commit is #2466 


codecov-commenter: # [Codecov](https://codecov.io/gh/kumahq/kuma/pull/2469?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq) Report
> Merging [#2469](https://codecov.io/gh/kumahq/kuma/pull/2469?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq) (421ea72) into [master](https://codecov.io/gh/kumahq/kuma/commit/4d7e7c03bab0c72fd2cbb77d82df97929dfd096c?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq) (4d7e7c0) will **decrease** coverage by `0.06%`.
> The diff coverage is `53.96%`.

[![Impacted file tree graph](https://codecov.io/gh/kumahq/kuma/pull/2469/graphs/tree.svg?width=650&height=150&src=pr&token=D7Yvqs6rwV&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq)](https://codecov.io/gh/kumahq/kuma/pull/2469?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq)

```diff
@@            Coverage Diff             @@
##           master    #2469      +/-   ##
==========================================
- Coverage   52.56%   52.50%   -0.07%     
==========================================
  Files         887      867      -20     
  Lines       48394    48383      -11     
==========================================
- Hits        25439    25402      -37     
- Misses      20906    20931      +25     
- Partials     2049     2050       +1     
```


| [Impacted Files](https://codecov.io/gh/kumahq/kuma/pull/2469?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq) | Coverage Δ | |
|---|---|---|
| [api/mesh/options.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvb3B0aW9ucy5wYi5nbw==) | `19.09% <0.00%> (-6.52%)` | :arrow_down: |
| [api/mesh/v1alpha1/circuit\_breaker.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvY2lyY3VpdF9icmVha2VyLnBiLmdv) | `46.08% <ø> (ø)` | |
| [api/mesh/v1alpha1/dataplane.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvZGF0YXBsYW5lLnBiLmdv) | `37.85% <ø> (ø)` | |
| [api/mesh/v1alpha1/dataplane\_insight.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvZGF0YXBsYW5lX2luc2lnaHQucGIuZ28=) | `41.66% <ø> (ø)` | |
| [api/mesh/v1alpha1/dataplane\_overview.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvZGF0YXBsYW5lX292ZXJ2aWV3LnBiLmdv) | `43.28% <ø> (ø)` | |
| [api/mesh/v1alpha1/externalservice.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvZXh0ZXJuYWxzZXJ2aWNlLnBiLmdv) | `51.65% <ø> (ø)` | |
| [api/mesh/v1alpha1/fault\_injection.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvZmF1bHRfaW5qZWN0aW9uLnBiLmdv) | `47.29% <ø> (ø)` | |
| [api/mesh/v1alpha1/gateway.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvZ2F0ZXdheS5wYi5nbw==) | `33.57% <ø> (ø)` | |
| [api/mesh/v1alpha1/health\_check.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvaGVhbHRoX2NoZWNrLnBiLmdv) | `30.54% <ø> (ø)` | |
| [api/mesh/v1alpha1/mesh.pb.go](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq#diff-YXBpL21lc2gvdjFhbHBoYTEvbWVzaC5wYi5nbw==) | `32.60% <ø> (ø)` | |
| ... and [46 more](https://codecov.io/gh/kumahq/kuma/pull/2469/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/kumahq/kuma/pull/2469?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/kumahq/kuma/pull/2469?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq). Last update [4d7e7c0...421ea72](https://codecov.io/gh/kumahq/kuma/pull/2469?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kumahq).

lahabana: I've forced-push because it was very different from the original.
I've taken into account you suggestion and also moved the ws inside the extension to keep things simple (like I mentioned in #2466).

Adding custom table printer is now simpler and doesn't rely on funky codegen.

Patch:
diff --git a/api/mesh/options.pb.go b/api/mesh/options.pb.go
index 2a92453a2..4c419a1d3 100644
--- a/api/mesh/options.pb.go
+++ b/api/mesh/options.pb.go
@@ -30,14 +30,15 @@ type KumaResourceOptions struct {
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// Name and value of the modelResourceType constant.
 	Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"`
-	// True if this resoure has global scope. Otherwise it will be mesh scope.
+	// True if this resource has global scope. Otherwise it will be mesh scope.
 	Global bool `protobuf:"varint,3,opt,name=global,proto3" json:"global,omitempty"`
 	// Name of the resource's Go package.
 	Package string `protobuf:"bytes,4,opt,name=package,proto3" json:"package,omitempty"`
 	// Whether to generate a no-op validation function.
 	SkipValidation bool `protobuf:"varint,5,opt,name=skip_validation,json=skipValidation,proto3" json:"skip_validation,omitempty"`
 	// Whether to skip type registration for this resource.
-	SkipRegistration bool `protobuf:"varint,6,opt,name=skip_registration,json=skipRegistration,proto3" json:"skip_registration,omitempty"`
+	SkipRegistration bool           `protobuf:"varint,6,opt,name=skip_registration,json=skipRegistration,proto3" json:"skip_registration,omitempty"`
+	Ws               *KumaWsOptions `protobuf:"bytes,7,opt,name=ws,proto3" json:"ws,omitempty"`
 }
 
 func (x *KumaResourceOptions) Reset() {
@@ -114,6 +115,13 @@ func (x *KumaResourceOptions) GetSkipRegistration() bool {
 	return false
 }
 
+func (x *KumaResourceOptions) GetWs() *KumaWsOptions {
+	if x != nil {
+		return x.Ws
+	}
+	return nil
+}
+
 type KumaWsOptions struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -200,22 +208,12 @@ var file_mesh_options_proto_extTypes = []protoimpl.ExtensionInfo{
 		Tag:           "bytes,43534533,opt,name=resource",
 		Filename:      "mesh/options.proto",
 	},
-	{
-		ExtendedType:  (*descriptorpb.MessageOptions)(nil),
-		ExtensionType: (*KumaWsOptions)(nil),
-		Field:         43534534,
-		Name:          "kuma.mesh.ws",
-		Tag:           "bytes,43534534,opt,name=ws",
-		Filename:      "mesh/options.proto",
-	},
 }
 
 // Extension fields to descriptorpb.MessageOptions.
 var (
 	// optional kuma.mesh.KumaResourceOptions resource = 43534533;
 	E_Resource = &file_mesh_options_proto_extTypes[0] // 'kuma'
-	// optional kuma.mesh.KumaWsOptions ws = 43534534;
-	E_Ws = &file_mesh_options_proto_extTypes[1]
 )
 
 var File_mesh_options_proto protoreflect.FileDescriptor
@@ -225,7 +223,7 @@ var file_mesh_options_proto_rawDesc = []byte{
 	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x1a,
 	0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
 	0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x22, 0xc5, 0x01, 0x0a, 0x13, 0x4b, 0x75, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
+	0x6f, 0x22, 0xef, 0x01, 0x0a, 0x13, 0x4b, 0x75, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
 	0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a,
 	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70,
@@ -237,28 +235,26 @@ var file_mesh_options_proto_rawDesc = []byte{
 	0x69, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11,
 	0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f,
 	0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x67,
-	0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x0d, 0x4b, 0x75, 0x6d,
-	0x61, 0x57, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16,
-	0x0a, 0x06, 0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f,
-	0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f,
-	0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x6f, 0x6e, 0x6c,
-	0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x4f, 0x6e,
-	0x6c, 0x79, 0x3a, 0x5e, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
-	0xc5, 0x91, 0xe1, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e,
-	0x6d, 0x65, 0x73, 0x68, 0x2e, 0x4b, 0x75, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
-	0x63, 0x65, 0x3a, 0x4c, 0x0a, 0x02, 0x77, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x02, 0x77, 0x73, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73,
+	0x68, 0x2e, 0x4b, 0x75, 0x6d, 0x61, 0x57, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x02, 0x77, 0x73, 0x22, 0x77, 0x0a, 0x0d, 0x4b, 0x75, 0x6d, 0x61, 0x57, 0x73, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x72,
+	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c,
+	0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a,
+	0x0a, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x3a, 0x5e, 0x0a, 0x08,
+	0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
 	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,
-	0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xc6, 0x91, 0xe1, 0x14, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x4b,
-	0x75, 0x6d, 0x61, 0x57, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x02, 0x77, 0x73,
-	0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b,
-	0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d,
-	0x65, 0x73, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xc5, 0x91, 0xe1, 0x14, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x4b,
+	0x75, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x21, 0x5a, 0x1f,
+	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68,
+	0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -280,15 +276,14 @@ var file_mesh_options_proto_goTypes = []interface{}{
 	(*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions
 }
 var file_mesh_options_proto_depIdxs = []int32{
-	2, // 0: kuma.mesh.resource:extendee -> google.protobuf.MessageOptions
-	2, // 1: kuma.mesh.ws:extendee -> google.protobuf.MessageOptions
+	1, // 0: kuma.mesh.KumaResourceOptions.ws:type_name -> kuma.mesh.KumaWsOptions
+	2, // 1: kuma.mesh.resource:extendee -> google.protobuf.MessageOptions
 	0, // 2: kuma.mesh.resource:type_name -> kuma.mesh.KumaResourceOptions
-	1, // 3: kuma.mesh.ws:type_name -> kuma.mesh.KumaWsOptions
-	4, // [4:4] is the sub-list for method output_type
-	4, // [4:4] is the sub-list for method input_type
-	2, // [2:4] is the sub-list for extension type_name
-	0, // [0:2] is the sub-list for extension extendee
-	0, // [0:0] is the sub-list for field type_name
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	2, // [2:3] is the sub-list for extension type_name
+	1, // [1:2] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
 func init() { file_mesh_options_proto_init() }
@@ -329,7 +324,7 @@ func file_mesh_options_proto_init() {
 			RawDescriptor: file_mesh_options_proto_rawDesc,
 			NumEnums:      0,
 			NumMessages:   2,
-			NumExtensions: 2,
+			NumExtensions: 1,
 			NumServices:   0,
 		},
 		GoTypes:           file_mesh_options_proto_goTypes,
diff --git a/api/mesh/options.proto b/api/mesh/options.proto
index b88c539b3..134bcfe3f 100644
--- a/api/mesh/options.proto
+++ b/api/mesh/options.proto
@@ -13,7 +13,7 @@ message KumaResourceOptions {
   // Name and value of the modelResourceType constant.
   string type = 2;
 
-  // True if this resoure has global scope. Otherwise it will be mesh scope.
+  // True if this resource has global scope. Otherwise it will be mesh scope.
   bool global = 3;
 
   // Name of the resource's Go package.
@@ -24,6 +24,8 @@ message KumaResourceOptions {
 
   // Whether to skip type registration for this resource.
   bool skip_registration = 6;
+
+  KumaWsOptions ws = 7;
 }
 
 message KumaWsOptions {
@@ -41,5 +43,4 @@ message KumaWsOptions {
 
 extend google.protobuf.MessageOptions {
   KumaResourceOptions resource = 43534533; // 'kuma'
-  KumaWsOptions ws = 43534534;
 }
diff --git a/api/mesh/v1alpha1/circuit_breaker.pb.go b/api/mesh/v1alpha1/circuit_breaker.pb.go
index 970d147f0..72c66b4c4 100644
--- a/api/mesh/v1alpha1/circuit_breaker.pb.go
+++ b/api/mesh/v1alpha1/circuit_breaker.pb.go
@@ -548,7 +548,7 @@ var file_mesh_v1alpha1_circuit_breaker_proto_rawDesc = []byte{
 	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f,
 	0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61,
 	0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e,
-	0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd5, 0x0f, 0x0a, 0x0e, 0x43, 0x69,
+	0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd7, 0x0f, 0x0a, 0x0e, 0x43, 0x69,
 	0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x07,
 	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
 	0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
@@ -668,18 +668,18 @@ var file_mesh_v1alpha1_circuit_breaker_proto_rawDesc = []byte{
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
 	0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x6d, 0x61, 0x78,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x3a, 0x57, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x18,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x3a, 0x59, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x18,
 	0x0a, 0x16, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72,
 	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x10, 0x12, 0x0e,
 	0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0xaa, 0x8c,
-	0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x11,
-	0x0a, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x2d, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65,
-	0x72, 0x42, 0x53, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
-	0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f,
-	0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18,
-	0x25, 0x50, 0x01, 0xa2, 0x01, 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65,
-	0x61, 0x6b, 0x65, 0x72, 0xf2, 0x01, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x2d, 0x62,
-	0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x13,
+	0x3a, 0x11, 0x0a, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x2d, 0x62, 0x72, 0x65, 0x61,
+	0x6b, 0x65, 0x72, 0x42, 0x53, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70,
+	0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a,
+	0xb5, 0x18, 0x25, 0x50, 0x01, 0xa2, 0x01, 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42,
+	0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0xf2, 0x01, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74,
+	0x2d, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/circuit_breaker.proto b/api/mesh/v1alpha1/circuit_breaker.proto
index e47a72622..f22d11616 100644
--- a/api/mesh/v1alpha1/circuit_breaker.proto
+++ b/api/mesh/v1alpha1/circuit_breaker.proto
@@ -22,7 +22,7 @@ message CircuitBreaker {
   option (kuma.mesh.resource).name = "CircuitBreakerResource";
   option (kuma.mesh.resource).type = "CircuitBreaker";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "circuit-breaker";
+  option (kuma.mesh.resource).ws.name = "circuit-breaker";
 
   // List of selectors to match dataplanes that are sources of traffic.
   repeated Selector sources = 1;
diff --git a/api/mesh/v1alpha1/dataplane.pb.go b/api/mesh/v1alpha1/dataplane.pb.go
index 02459e86c..da4f690cc 100644
--- a/api/mesh/v1alpha1/dataplane.pb.go
+++ b/api/mesh/v1alpha1/dataplane.pb.go
@@ -1029,7 +1029,7 @@ var file_mesh_v1alpha1_dataplane_proto_rawDesc = []byte{
 	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70,
 	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76,
-	0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x81, 0x18,
+	0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x83, 0x18,
 	0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x6e,
 	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
 	0x28, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
@@ -1217,15 +1217,15 @@ var file_mesh_v1alpha1_dataplane_proto_rawDesc = []byte{
 	0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x61, 0x74,
 	0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64,
 	0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x47, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x13,
+	0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x49, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x13,
 	0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75,
 	0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0b, 0x12, 0x09, 0x44, 0x61, 0x74, 0x61, 0x70,
 	0x6c, 0x61, 0x6e, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68,
-	0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x0b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e,
-	0x65, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
-	0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f,
-	0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0d, 0x3a, 0x0b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c,
+	0x61, 0x6e, 0x65, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70,
+	0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/dataplane.proto b/api/mesh/v1alpha1/dataplane.proto
index f1cb7b192..08e059f04 100644
--- a/api/mesh/v1alpha1/dataplane.proto
+++ b/api/mesh/v1alpha1/dataplane.proto
@@ -16,7 +16,7 @@ message Dataplane {
   option (kuma.mesh.resource).name = "DataplaneResource";
   option (kuma.mesh.resource).type = "Dataplane";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "dataplane";
+  option (kuma.mesh.resource).ws.name = "dataplane";
 
   // Networking describes inbound and outbound interfaces of a dataplane.
   message Networking {
diff --git a/api/mesh/v1alpha1/dataplane_insight.pb.go b/api/mesh/v1alpha1/dataplane_insight.pb.go
index f2e513872..3d9d26bf5 100644
--- a/api/mesh/v1alpha1/dataplane_insight.pb.go
+++ b/api/mesh/v1alpha1/dataplane_insight.pb.go
@@ -615,7 +615,7 @@ var file_mesh_v1alpha1_dataplane_insight_proto_rawDesc = []byte{
 	0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
 	0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 	0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64,
-	0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x93, 0x04, 0x0a, 0x10, 0x44, 0x61,
+	0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x04, 0x0a, 0x10, 0x44, 0x61,
 	0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4f,
 	0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
 	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73,
@@ -642,98 +642,98 @@ var file_mesh_v1alpha1_dataplane_insight_proto_rawDesc = []byte{
 	0x74, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
 	0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
 	0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x3a, 0x6d, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x1a, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c,
+	0x3a, 0x71, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x1a, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c,
 	0x61, 0x6e, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
 	0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x12, 0x12, 0x10, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c,
 	0x61, 0x6e, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06,
-	0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xb2, 0x8c,
-	0x89, 0xa6, 0x01, 0x13, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2d,
-	0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0x22,
-	0x8c, 0x03, 0x0a, 0x15, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x75, 0x62,
-	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02,
-	0x69, 0x64, 0x12, 0x42, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c,
-	0x61, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x16,
-	0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x49, 0x6e, 0x73, 0x74,
-	0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
-	0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xaa, 0x8c,
+	0x89, 0xa6, 0x01, 0x15, 0x3a, 0x13, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e,
+	0x65, 0x2d, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x04, 0x3a,
+	0x02, 0x18, 0x01, 0x22, 0x8c, 0x03, 0x0a, 0x15, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72,
+	0x79, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a,
+	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02,
+	0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x42, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f,
+	0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02,
+	0x10, 0x01, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x0c, 0x63, 0x6f,
+	0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, 0x42,
+	0x05, 0xb2, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54,
+	0x69, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
+	0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
 	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
-	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xb2, 0x01, 0x02,
-	0x08, 0x01, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12,
-	0x43, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69,
-	0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
-	0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
-	0x54, 0x69, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76,
-	0x65, 0x72, 0x79, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
-	0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e,
-	0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x65,
-	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x98,
-	0x03, 0x0a, 0x1b, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x75, 0x62, 0x73,
-	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x44,
-	0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69,
-	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
-	0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e,
+	0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e,
+	0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69,
+	0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01,
+	0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x76,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6b,
+	0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+	0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
+	0x6f, 0x6e, 0x22, 0x98, 0x03, 0x0a, 0x1b, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79,
+	0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d,
+	0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73,
+	0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x03, 0x63, 0x64, 0x73,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65,
+	0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63,
+	0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74,
+	0x73, 0x52, 0x03, 0x63, 0x64, 0x73, 0x12, 0x3b, 0x0a, 0x03, 0x65, 0x64, 0x73, 0x18, 0x04, 0x20,
 	0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e,
 	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65,
-	0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05,
-	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x03, 0x63, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72,
-	0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x03, 0x63,
-	0x64, 0x73, 0x12, 0x3b, 0x0a, 0x03, 0x65, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x03, 0x65, 0x64, 0x73, 0x12,
-	0x3b, 0x0a, 0x03, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b,
-	0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x03, 0x6c, 0x64, 0x73, 0x12, 0x3b, 0x0a, 0x03,
-	0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61,
-	0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44,
-	0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53,
-	0x74, 0x61, 0x74, 0x73, 0x52, 0x03, 0x72, 0x64, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x15, 0x44, 0x69,
-	0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74,
-	0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73,
-	0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x72, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x16, 0x72, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65,
-	0x64, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x72, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x73, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65,
-	0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x5f, 0x72,
-	0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x72,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64,
-	0x22, 0x7c, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x06, 0x6b,
-	0x75, 0x6d, 0x61, 0x44, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6b, 0x75,
-	0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x4b, 0x75, 0x6d, 0x61, 0x44, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06,
-	0x6b, 0x75, 0x6d, 0x61, 0x44, 0x70, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73,
-	0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79,
-	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x22, 0x7d,
-	0x0a, 0x0d, 0x4b, 0x75, 0x6d, 0x61, 0x44, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
-	0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x69, 0x74,
-	0x54, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x74, 0x54, 0x61,
-	0x67, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12,
-	0x1c, 0x0a, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x0a,
-	0x0c, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a,
-	0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x42, 0x2a, 0x5a,
-	0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
-	0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68,
-	0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x33,
+	0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x03,
+	0x65, 0x64, 0x73, 0x12, 0x3b, 0x0a, 0x03, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x03, 0x6c, 0x64, 0x73,
+	0x12, 0x3b, 0x0a, 0x03, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e,
+	0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x03, 0x72, 0x64, 0x73, 0x22, 0xa4, 0x01,
+	0x0a, 0x15, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x35,
+	0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x6b, 0x6e,
+	0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15,
+	0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c,
+	0x65, 0x64, 0x67, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x73, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x52, 0x65, 0x6a, 0x65,
+	0x63, 0x74, 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x39, 0x0a, 0x06, 0x6b, 0x75, 0x6d, 0x61, 0x44, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x21, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x75, 0x6d, 0x61, 0x44, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69,
+	0x6f, 0x6e, 0x52, 0x06, 0x6b, 0x75, 0x6d, 0x61, 0x44, 0x70, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x6e,
+	0x76, 0x6f, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6b, 0x75, 0x6d, 0x61,
+	0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45,
+	0x6e, 0x76, 0x6f, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x65, 0x6e, 0x76,
+	0x6f, 0x79, 0x22, 0x7d, 0x0a, 0x0d, 0x4b, 0x75, 0x6d, 0x61, 0x44, 0x70, 0x56, 0x65, 0x72, 0x73,
+	0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a,
+	0x06, 0x67, 0x69, 0x74, 0x54, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67,
+	0x69, 0x74, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d,
+	0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d,
+	0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74,
+	0x65, 0x22, 0x3e, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+	0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/dataplane_insight.proto b/api/mesh/v1alpha1/dataplane_insight.proto
index a0f009357..3bb450992 100644
--- a/api/mesh/v1alpha1/dataplane_insight.proto
+++ b/api/mesh/v1alpha1/dataplane_insight.proto
@@ -15,8 +15,8 @@ message DataplaneInsight {
   option (kuma.mesh.resource).type = "DataplaneInsight";
   option (kuma.mesh.resource).package = "mesh";
   option (kuma.mesh.resource).skip_validation = true;
-  option (kuma.mesh.ws).name = "dataplane-insight";
-  option (kuma.mesh.ws).read_only = true;
+  option (kuma.mesh.resource).ws.name = "dataplane-insight";
+  option (kuma.mesh.resource).ws.read_only = true;
 
   // List of ADS subscriptions created by a given Dataplane.
   repeated DiscoverySubscription subscriptions = 1;
diff --git a/api/mesh/v1alpha1/externalservice.pb.go b/api/mesh/v1alpha1/externalservice.pb.go
index 98a6c92de..bdcfd705d 100644
--- a/api/mesh/v1alpha1/externalservice.pb.go
+++ b/api/mesh/v1alpha1/externalservice.pb.go
@@ -242,7 +242,7 @@ var file_mesh_v1alpha1_externalservice_proto_rawDesc = []byte{
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x76,
 	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x6f, 0x75, 0x72,
 	0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdf, 0x05, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe1, 0x05, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72,
 	0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x6e, 0x65,
 	0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e,
 	0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
@@ -282,19 +282,19 @@ var file_mesh_v1alpha1_externalservice_proto_rawDesc = []byte{
 	0x69, 0x6f, 0x6e, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
 	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
 	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x5a, 0xaa, 0x8c,
+	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x5c, 0xaa, 0x8c,
 	0x89, 0xa6, 0x01, 0x19, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65,
 	0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89,
 	0xa6, 0x01, 0x11, 0x12, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72,
 	0x76, 0x69, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68,
-	0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x12, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
-	0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x55, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68,
-	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75,
-	0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x27, 0x50, 0x01, 0xa2, 0x01, 0x0f, 0x45, 0x78, 0x74,
-	0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xf2, 0x01, 0x10, 0x65,
-	0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x14, 0x3a, 0x12, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+	0x61, 0x6c, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x55, 0x5a, 0x28, 0x67, 0x69,
+	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f,
+	0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x27, 0x50, 0x01, 0xa2, 0x01, 0x0f, 0x45,
+	0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xf2, 0x01,
+	0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/externalservice.proto b/api/mesh/v1alpha1/externalservice.proto
index 15947503d..2567c7bba 100644
--- a/api/mesh/v1alpha1/externalservice.proto
+++ b/api/mesh/v1alpha1/externalservice.proto
@@ -23,7 +23,7 @@ message ExternalService {
   option (kuma.mesh.resource).name = "ExternalServiceResource";
   option (kuma.mesh.resource).type = "ExternalService";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "external-service";
+  option (kuma.mesh.resource).ws.name = "external-service";
 
   // Networking describes the properties of the external service connectivity
   message Networking {
diff --git a/api/mesh/v1alpha1/fault_injection.pb.go b/api/mesh/v1alpha1/fault_injection.pb.go
index 743efe9ba..f9f011ea9 100644
--- a/api/mesh/v1alpha1/fault_injection.pb.go
+++ b/api/mesh/v1alpha1/fault_injection.pb.go
@@ -355,7 +355,7 @@ var file_mesh_v1alpha1_fault_injection_proto_rawDesc = []byte{
 	0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f,
 	0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61,
 	0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e,
-	0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x07, 0x0a, 0x0e, 0x46, 0x61,
+	0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa5, 0x07, 0x0a, 0x0e, 0x46, 0x61,
 	0x75, 0x6c, 0x74, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x07,
 	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
 	0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
@@ -408,18 +408,18 @@ var file_mesh_v1alpha1_fault_injection_proto_rawDesc = []byte{
 	0x67, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
 	0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 	0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
-	0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x57, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x18, 0x0a, 0x16,
+	0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x59, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x18, 0x0a, 0x16,
 	0x46, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
 	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x10, 0x12, 0x0e, 0x46, 0x61,
 	0x75, 0x6c, 0x74, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xaa, 0x8c, 0x89, 0xa6,
-	0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x11, 0x0a, 0x0f,
-	0x66, 0x61, 0x75, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42,
-	0x53, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75,
-	0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65,
-	0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x25, 0x50,
-	0x01, 0xa2, 0x01, 0x0e, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0xf2, 0x01, 0x0f, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x6a, 0x65, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x13, 0x3a, 0x11,
+	0x0a, 0x0f, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x42, 0x53, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+	0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18,
+	0x25, 0x50, 0x01, 0xa2, 0x01, 0x0e, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6e, 0x6a, 0x65, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0xf2, 0x01, 0x0f, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x6a,
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/fault_injection.proto b/api/mesh/v1alpha1/fault_injection.proto
index af2957ec6..ed30130e4 100644
--- a/api/mesh/v1alpha1/fault_injection.proto
+++ b/api/mesh/v1alpha1/fault_injection.proto
@@ -22,7 +22,7 @@ message FaultInjection {
   option (kuma.mesh.resource).name = "FaultInjectionResource";
   option (kuma.mesh.resource).type = "FaultInjection";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "fault-injection";
+  option (kuma.mesh.resource).ws.name = "fault-injection";
 
   // List of selectors to match dataplanes that are sources of traffic.
   repeated Selector sources = 1;
diff --git a/api/mesh/v1alpha1/gateway.pb.go b/api/mesh/v1alpha1/gateway.pb.go
index 2069b5b32..08c662762 100644
--- a/api/mesh/v1alpha1/gateway.pb.go
+++ b/api/mesh/v1alpha1/gateway.pb.go
@@ -527,7 +527,7 @@ var file_mesh_v1alpha1_gateway_proto_rawDesc = []byte{
 	0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c,
 	0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f,
-	0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb2,
+	0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb4,
 	0x08, 0x0a, 0x07, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x6f,
 	0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x75,
 	0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
@@ -590,15 +590,15 @@ var file_mesh_v1alpha1_gateway_proto_rawDesc = []byte{
 	0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
 	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,
 	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x49, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x11,
+	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x4b, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x11,
 	0x0a, 0x0f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
 	0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x09, 0x12, 0x07, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
 	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6,
-	0x01, 0x02, 0x30, 0x01, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x09, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65,
-	0x77, 0x61, 0x79, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
-	0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70,
-	0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x01, 0x02, 0x30, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0b, 0x3a, 0x09, 0x0a, 0x07, 0x67, 0x61,
+	0x74, 0x65, 0x77, 0x61, 0x79, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f,
+	0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+	0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/gateway.proto b/api/mesh/v1alpha1/gateway.proto
index a83e25f5d..7851a2bb9 100644
--- a/api/mesh/v1alpha1/gateway.proto
+++ b/api/mesh/v1alpha1/gateway.proto
@@ -24,7 +24,7 @@ message Gateway {
   option (kuma.mesh.resource).package = "mesh";
 
   option (kuma.mesh.resource).skip_registration = true;
-  option (kuma.mesh.ws).name = "gateway";
+  option (kuma.mesh.resource).ws.name = "gateway";
 
   // TLSConfig describes a TLS configuration.
   message TLS {
diff --git a/api/mesh/v1alpha1/health_check.pb.go b/api/mesh/v1alpha1/health_check.pb.go
index 1e4b8876d..a8b12ef3b 100644
--- a/api/mesh/v1alpha1/health_check.pb.go
+++ b/api/mesh/v1alpha1/health_check.pb.go
@@ -558,7 +558,7 @@ var file_mesh_v1alpha1_health_check_proto_rawDesc = []byte{
 	0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
 	0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
 	0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
-	0xc0, 0x0e, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12,
+	0xc2, 0x0e, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12,
 	0x40, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
 	0x32, 0x1c, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61,
 	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x08,
@@ -669,17 +669,17 @@ var file_mesh_v1alpha1_health_check_proto_rawDesc = []byte{
 	0x0a, 0x06, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
 	0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x61, 0x70, 0x70, 0x65,
-	0x6e, 0x64, 0x3a, 0x4e, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c,
+	0x6e, 0x64, 0x3a, 0x50, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c,
 	0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa,
 	0x8c, 0x89, 0xa6, 0x01, 0x0d, 0x12, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65,
-	0x63, 0x6b, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c,
-	0x89, 0xa6, 0x01, 0x0e, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x65,
-	0x63, 0x6b, 0x42, 0x4d, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69,
-	0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5,
-	0x18, 0x1f, 0x50, 0x01, 0xa2, 0x01, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65,
-	0x63, 0x6b, 0xf2, 0x01, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x65, 0x63,
-	0x6b, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x63, 0x6b, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c,
+	0x89, 0xa6, 0x01, 0x10, 0x3a, 0x0e, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2d, 0x63,
+	0x68, 0x65, 0x63, 0x6b, 0x42, 0x4d, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61,
+	0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x8a, 0xb5, 0x18, 0x1f, 0x50, 0x01, 0xa2, 0x01, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43,
+	0x68, 0x65, 0x63, 0x6b, 0xf2, 0x01, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2d, 0x63, 0x68,
+	0x65, 0x63, 0x6b, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/health_check.proto b/api/mesh/v1alpha1/health_check.proto
index cbb601654..ee02369f9 100644
--- a/api/mesh/v1alpha1/health_check.proto
+++ b/api/mesh/v1alpha1/health_check.proto
@@ -23,7 +23,7 @@ message HealthCheck {
   option (kuma.mesh.resource).name = "HealthCheckResource";
   option (kuma.mesh.resource).type = "HealthCheck";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "health-check";
+  option (kuma.mesh.resource).ws.name = "health-check";
 
   // List of selectors to match dataplanes that should be configured to do
   // health checks.
diff --git a/api/mesh/v1alpha1/mesh.pb.go b/api/mesh/v1alpha1/mesh.pb.go
index c9c812047..5881da2f0 100644
--- a/api/mesh/v1alpha1/mesh.pb.go
+++ b/api/mesh/v1alpha1/mesh.pb.go
@@ -1024,7 +1024,7 @@ var file_mesh_v1alpha1_mesh_proto_rawDesc = []byte{
 	0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
 	0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
 	0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x04,
+	0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x04,
 	0x0a, 0x04, 0x4d, 0x65, 0x73, 0x68, 0x12, 0x31, 0x0a, 0x04, 0x6d, 0x74, 0x6c, 0x73, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68,
 	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x2e, 0x4d,
@@ -1054,107 +1054,107 @@ var file_mesh_v1alpha1_mesh_proto_rawDesc = []byte{
 	0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x65, 0x72,
 	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,
 	0x79, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
-	0x64, 0x73, 0x3a, 0x4e, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x0a, 0x0c, 0x4d, 0x65, 0x73, 0x68,
+	0x64, 0x73, 0x3a, 0x52, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x0a, 0x0c, 0x4d, 0x65, 0x73, 0x68,
 	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x12, 0x04,
 	0x4d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0xaa, 0x8c, 0x89, 0xa6,
-	0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x0a, 0x04,
-	0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x08, 0x12, 0x06, 0x6d, 0x65, 0x73, 0x68,
-	0x65, 0x73, 0x22, 0xd6, 0x02, 0x0a, 0x1b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
-	0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x65,
-	0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x64, 0x70,
-	0x43, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x6d,
-	0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f,
-	0x72, 0x69, 0x74, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x44, 0x70, 0x43, 0x65,
-	0x72, 0x74, 0x52, 0x06, 0x64, 0x70, 0x43, 0x65, 0x72, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x6f,
-	0x6e, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63,
-	0x74, 0x52, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x1a, 0x91, 0x01, 0x0a, 0x06, 0x44, 0x70, 0x43, 0x65,
-	0x72, 0x74, 0x12, 0x5b, 0x0a, 0x08, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68,
-	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
-	0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, 0x61,
-	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x44, 0x70, 0x43, 0x65, 0x72, 0x74, 0x2e, 0x52, 0x6f, 0x74,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,
-	0x2a, 0x0a, 0x08, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x65,
-	0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x0a,
-	0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x08, 0x6f, 0x75,
-	0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6b,
-	0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-	0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x75, 0x74,
-	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a,
-	0x48, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x70,
-	0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x70, 0x61,
-	0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x22, 0x71, 0x0a, 0x07, 0x54, 0x72, 0x61,
-	0x63, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42,
-	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65,
-	0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x3e, 0x0a, 0x08,
-	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22,
+	0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x08, 0x3a, 0x06,
+	0x0a, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0a, 0x3a, 0x08, 0x12, 0x06,
+	0x6d, 0x65, 0x73, 0x68, 0x65, 0x73, 0x22, 0xd6, 0x02, 0x0a, 0x1b, 0x43, 0x65, 0x72, 0x74, 0x69,
+	0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42,
+	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79,
+	0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x4e,
+	0x0a, 0x06, 0x64, 0x70, 0x43, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36,
 	0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b, 0x65,
-	0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x22, 0x9f, 0x01, 0x0a,
-	0x0e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12,
-	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61,
-	0x6c, 0x75, 0x65, 0x52, 0x08, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a,
-	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70,
-	0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x22, 0x4b,
-	0x0a, 0x1b, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67,
+	0x68, 0x61, 0x31, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41,
+	0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e,
+	0x44, 0x70, 0x43, 0x65, 0x72, 0x74, 0x52, 0x06, 0x64, 0x70, 0x43, 0x65, 0x72, 0x74, 0x12, 0x2b,
+	0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53,
+	0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x1a, 0x91, 0x01, 0x0a, 0x06,
+	0x44, 0x70, 0x43, 0x65, 0x72, 0x74, 0x12, 0x5b, 0x0a, 0x08, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e,
+	0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x65,
+	0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
+	0x74, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x44, 0x70, 0x43, 0x65, 0x72, 0x74,
+	0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x6f, 0x74, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x1a, 0x2a, 0x0a, 0x08, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+	0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+	0x9b, 0x01, 0x0a, 0x0a, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x43,
+	0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x27, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61,
+	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,
+	0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f,
+	0x75, 0x6e, 0x64, 0x1a, 0x48, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12,
+	0x3c, 0x0a, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x22, 0x71, 0x0a,
+	0x07, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61,
+	0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
+	0x12, 0x3e, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x42,
+	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73,
+	0x22, 0x9f, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b,
+	0x65, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x73, 0x61, 0x6d, 0x70, 0x6c,
+	0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62,
+	0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e,
+	0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x63, 0x6f,
+	0x6e, 0x66, 0x22, 0x4b, 0x0a, 0x1b, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, 0x54, 0x72, 0x61,
+	0x63, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70,
+	0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22,
+	0xbe, 0x01, 0x0a, 0x1a, 0x5a, 0x69, 0x70, 0x6b, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e,
+	0x67, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10,
+	0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c,
+	0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x31, 0x32, 0x38, 0x62, 0x69,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64,
+	0x31, 0x32, 0x38, 0x62, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x11, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64,
+	0x53, 0x70, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x73,
+	0x68, 0x61, 0x72, 0x65, 0x64, 0x53, 0x70, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74,
+	0x22, 0x71, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x64,
+	0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b,
+	0x65, 0x6e, 0x64, 0x12, 0x3e, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18,
+	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73,
+	0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x67, 0x69,
+	0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65,
+	0x6e, 0x64, 0x73, 0x22, 0x7d, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x61,
+	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+	0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x63, 0x6f,
+	0x6e, 0x66, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e,
+	0x67, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12,
+	0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61,
+	0x74, 0x68, 0x22, 0x33, 0x0a, 0x17, 0x54, 0x63, 0x70, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67,
 	0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a,
 	0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xbe, 0x01, 0x0a, 0x1a,
-	0x5a, 0x69, 0x70, 0x6b, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63,
-	0x6b, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72,
-	0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x24, 0x0a, 0x0d,
-	0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x31, 0x32, 0x38, 0x62, 0x69, 0x74, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x31, 0x32, 0x38, 0x62,
-	0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69,
-	0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x11, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x53, 0x70, 0x61, 0x6e,
-	0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x65,
-	0x64, 0x53, 0x70, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x71, 0x0a, 0x07,
-	0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75,
-	0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12,
-	0x3e, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x22, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x61,
-	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x22,
-	0x7d, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e,
-	0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a,
-	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70,
-	0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x22, 0x2e,
-	0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63,
-	0x6b, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61,
-	0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x33,
-	0x0a, 0x17, 0x54, 0x63, 0x70, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b,
-	0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64,
-	0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72,
-	0x65, 0x73, 0x73, 0x22, 0x49, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x3e,
-	0x0a, 0x1a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x77, 0x61, 0x72, 0x65, 0x4c,
-	0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x08, 0x52, 0x1a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x77, 0x61, 0x72,
-	0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x42, 0x2a,
-	0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d,
-	0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73,
-	0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x33,
+	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x49, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69,
+	0x6e, 0x67, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x77,
+	0x61, 0x72, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79,
+	0x41, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69,
+	0x6e, 0x67, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69,
+	0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/mesh.proto b/api/mesh/v1alpha1/mesh.proto
index 80b91fdb0..a7f1820bd 100644
--- a/api/mesh/v1alpha1/mesh.proto
+++ b/api/mesh/v1alpha1/mesh.proto
@@ -16,8 +16,8 @@ message Mesh {
   option (kuma.mesh.resource).type = "Mesh";
   option (kuma.mesh.resource).global = true;
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "mesh";
-  option (kuma.mesh.ws).plural = "meshes";
+  option (kuma.mesh.resource).ws.name = "mesh";
+  option (kuma.mesh.resource).ws.plural = "meshes";
 
   // mTLS settings of a Mesh.
   message Mtls {
diff --git a/api/mesh/v1alpha1/mesh_insight.pb.go b/api/mesh/v1alpha1/mesh_insight.pb.go
index 3636b2fdd..e3614d6b7 100644
--- a/api/mesh/v1alpha1/mesh_insight.pb.go
+++ b/api/mesh/v1alpha1/mesh_insight.pb.go
@@ -282,7 +282,7 @@ var file_mesh_v1alpha1_mesh_insight_proto_rawDesc = []byte{
 	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x12, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6f, 0x70, 0x74,
 	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67,
 	0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa9, 0x08, 0x0a, 0x0b,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xad, 0x08, 0x0a, 0x0b,
 	0x4d, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c,
 	0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
@@ -343,16 +343,16 @@ var file_mesh_v1alpha1_mesh_insight_proto_rawDesc = []byte{
 	0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x49,
 	0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65,
 	0x53, 0x74, 0x61, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a,
-	0x66, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x73,
+	0x6a, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x73,
 	0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6,
 	0x01, 0x0d, 0x12, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa,
 	0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d,
-	0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xb2, 0x8c, 0x89, 0xa6, 0x01,
-	0x0e, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x68, 0x2d, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xb2,
-	0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d,
-	0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70,
-	0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
+	0x10, 0x3a, 0x0e, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x68, 0x2d, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x68,
+	0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x04, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x2a, 0x5a, 0x28, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71,
+	0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76,
+	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/mesh_insight.proto b/api/mesh/v1alpha1/mesh_insight.proto
index c85d63f08..5463397fa 100644
--- a/api/mesh/v1alpha1/mesh_insight.proto
+++ b/api/mesh/v1alpha1/mesh_insight.proto
@@ -15,8 +15,8 @@ message MeshInsight {
   option (kuma.mesh.resource).global = true;
   option (kuma.mesh.resource).package = "mesh";
   option (kuma.mesh.resource).skip_validation = true;
-  option (kuma.mesh.ws).name = "mesh-insight";
-  option (kuma.mesh.ws).read_only = true;
+  option (kuma.mesh.resource).ws.name = "mesh-insight";
+  option (kuma.mesh.resource).ws.read_only = true;
 
   // last_sync is a time of the last synchronization
   google.protobuf.Timestamp last_sync = 1;
diff --git a/api/mesh/v1alpha1/proxy_template.pb.go b/api/mesh/v1alpha1/proxy_template.pb.go
index c44064b6e..1a6e2697b 100644
--- a/api/mesh/v1alpha1/proxy_template.pb.go
+++ b/api/mesh/v1alpha1/proxy_template.pb.go
@@ -1217,7 +1217,7 @@ var file_mesh_v1alpha1_proxy_template_proto_rawDesc = []byte{
 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x6d, 0x65,
 	0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x65, 0x6c, 0x65,
 	0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66,
-	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9d, 0x10, 0x0a, 0x0d, 0x50, 0x72, 0x6f,
+	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9f, 0x10, 0x0a, 0x0d, 0x50, 0x72, 0x6f,
 	0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x65,
 	0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
 	0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
@@ -1342,55 +1342,55 @@ var file_mesh_v1alpha1_proxy_template_proto_rawDesc = []byte{
 	0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
 	0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
 	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74,
-	0x79, 0x70, 0x65, 0x3a, 0x53, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x17, 0x0a, 0x15, 0x50, 0x72, 0x6f,
+	0x79, 0x70, 0x65, 0x3a, 0x55, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x17, 0x0a, 0x15, 0x50, 0x72, 0x6f,
 	0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
 	0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0f, 0x12, 0x0d, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54,
 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d,
-	0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x0f, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79,
-	0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x50, 0x72, 0x6f,
-	0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
-	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73,
-	0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79,
-	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53,
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,
-	0x12, 0x3e, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,
+	0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x11, 0x3a, 0x0f, 0x0a, 0x0d, 0x70, 0x72, 0x6f,
+	0x78, 0x79, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d,
+	0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f,
+	0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69,
+	0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x2a, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
+	0x74, 0x65, 0x52, 0x61, 0x77, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x03, 0x72,
+	0x61, 0x77, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xbf, 0x01, 0x0a, 0x1a, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66,
+	0x69, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a,
+	0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e,
 	0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
 	0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
-	0x52, 0x61, 0x77, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x77,
-	0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xbf, 0x01, 0x0a, 0x1a, 0x50, 0x72, 0x6f,
-	0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,
-	0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x06, 0x70,
-	0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75,
-	0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72,
-	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x61,
-	0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a,
-	0x39, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
-	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
-	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x64, 0x0a, 0x16, 0x50, 0x72,
-	0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x61, 0x77, 0x53, 0x6f,
-	0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
-	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d,
-	0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f,
-	0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73,
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
-	0x22, 0x64, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
-	0x65, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65,
-	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65,
-	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x51, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
-	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x8a, 0xb5, 0x18, 0x23, 0x50, 0x01, 0xa2, 0x01, 0x0d, 0x50, 0x72, 0x6f, 0x78, 0x79,
-	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0xf2, 0x01, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79,
-	0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x33,
+	0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x50, 0x61,
+	0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d,
+	0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x64, 0x0a, 0x16,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x61, 0x77,
+	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x6d, 0x61,
+	0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x61, 0x77, 0x52,
+	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
+	0x65, 0x73, 0x22, 0x64, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c,
+	0x61, 0x74, 0x65, 0x52, 0x61, 0x77, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08,
+	0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x51, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75,
+	0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x23, 0x50, 0x01, 0xa2, 0x01, 0x0d, 0x50, 0x72, 0x6f,
+	0x78, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0xf2, 0x01, 0x0e, 0x70, 0x72, 0x6f,
+	0x78, 0x79, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/proxy_template.proto b/api/mesh/v1alpha1/proxy_template.proto
index b385371c2..091a6aad0 100644
--- a/api/mesh/v1alpha1/proxy_template.proto
+++ b/api/mesh/v1alpha1/proxy_template.proto
@@ -20,7 +20,7 @@ message ProxyTemplate {
   option (kuma.mesh.resource).name = "ProxyTemplateResource";
   option (kuma.mesh.resource).type = "ProxyTemplate";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "proxytemplate";
+  option (kuma.mesh.resource).ws.name = "proxytemplate";
 
   // List of Dataplane selectors.
   // +optional
diff --git a/api/mesh/v1alpha1/rate_limit.pb.go b/api/mesh/v1alpha1/rate_limit.pb.go
index e9910b2ed..6ccb69d94 100644
--- a/api/mesh/v1alpha1/rate_limit.pb.go
+++ b/api/mesh/v1alpha1/rate_limit.pb.go
@@ -352,7 +352,7 @@ var file_mesh_v1alpha1_rate_limit_proto_rawDesc = []byte{
 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73,
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,
 	0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
-	0xa0, 0x06, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x40, 0x0a,
+	0xa2, 0x06, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x40, 0x0a,
 	0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,
 	0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
 	0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x08, 0xfa, 0x42,
@@ -397,15 +397,15 @@ var file_mesh_v1alpha1_rate_limit_proto_rawDesc = []byte{
 	0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03,
 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
-	0x52, 0x06, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x3a, 0x48, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x13,
+	0x52, 0x06, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x3a, 0x4a, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x13,
 	0x0a, 0x11, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75,
 	0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0b, 0x12, 0x09, 0x52, 0x61, 0x74, 0x65, 0x4c,
 	0x69, 0x6d, 0x69, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68,
-	0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x0c, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x6d,
-	0x69, 0x74, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69,
-	0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x3a, 0x0c, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x6c,
+	0x69, 0x6d, 0x69, 0x74, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61,
+	0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/rate_limit.proto b/api/mesh/v1alpha1/rate_limit.proto
index 00e9e9a41..65e9c00a8 100644
--- a/api/mesh/v1alpha1/rate_limit.proto
+++ b/api/mesh/v1alpha1/rate_limit.proto
@@ -16,7 +16,7 @@ message RateLimit {
   option (kuma.mesh.resource).name = "RateLimitResource";
   option (kuma.mesh.resource).type = "RateLimit";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "rate-limit";
+  option (kuma.mesh.resource).ws.name = "rate-limit";
 
   // List of selectors to match dataplanes that rate limit will be applied for
   repeated Selector sources = 1 [ (validate.rules).repeated .min_items = 1 ];
diff --git a/api/mesh/v1alpha1/retry.pb.go b/api/mesh/v1alpha1/retry.pb.go
index d3edac2e4..d96527cc8 100644
--- a/api/mesh/v1alpha1/retry.pb.go
+++ b/api/mesh/v1alpha1/retry.pb.go
@@ -480,7 +480,7 @@ var file_mesh_v1alpha1_retry_proto_rawDesc = []byte{
 	0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
 	0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69,
 	0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66,
-	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8b, 0x0a, 0x0a, 0x05, 0x52, 0x65, 0x74,
+	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x0a, 0x0a, 0x05, 0x52, 0x65, 0x74,
 	0x72, 0x79, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20,
 	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e,
 	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f,
@@ -556,16 +556,17 @@ var file_mesh_v1alpha1_retry_proto_rawDesc = []byte{
 	0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x10,
 	0x02, 0x12, 0x16, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x78,
 	0x68, 0x61, 0x75, 0x73, 0x74, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x75, 0x6e, 0x61,
-	0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x10, 0x04, 0x3a, 0x4a, 0xaa, 0x8c, 0x89, 0xa6,
+	0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x10, 0x04, 0x3a, 0x4e, 0xaa, 0x8c, 0x89, 0xa6,
 	0x01, 0x0f, 0x0a, 0x0d, 0x52, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
 	0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x07, 0x12, 0x05, 0x52, 0x65, 0x74, 0x72, 0x79, 0xaa, 0x8c,
-	0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x07,
-	0x0a, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x09, 0x12, 0x07, 0x72,
-	0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x40, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
-	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x8a, 0xb5, 0x18, 0x12, 0x50, 0x01, 0xa2, 0x01, 0x05, 0x52, 0x65, 0x74, 0x72, 0x79,
-	0xf2, 0x01, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x09,
+	0x3a, 0x07, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0b, 0x3a,
+	0x09, 0x12, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x40, 0x5a, 0x28, 0x67, 0x69,
+	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f,
+	0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31,
+	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x12, 0x50, 0x01, 0xa2, 0x01, 0x05, 0x52,
+	0x65, 0x74, 0x72, 0x79, 0xf2, 0x01, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/retry.proto b/api/mesh/v1alpha1/retry.proto
index b8005fb03..8bc8c71b5 100644
--- a/api/mesh/v1alpha1/retry.proto
+++ b/api/mesh/v1alpha1/retry.proto
@@ -23,8 +23,8 @@ message Retry {
   option (kuma.mesh.resource).name = "RetryResource";
   option (kuma.mesh.resource).type = "Retry";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "retry";
-  option (kuma.mesh.ws).plural = "retries";
+  option (kuma.mesh.resource).ws.name = "retry";
+  option (kuma.mesh.resource).ws.plural = "retries";
 
   // List of selectors to match dataplanes that retry policy should be
   // configured for
diff --git a/api/mesh/v1alpha1/service_insight.pb.go b/api/mesh/v1alpha1/service_insight.pb.go
index 4e03ca240..432d223ac 100644
--- a/api/mesh/v1alpha1/service_insight.pb.go
+++ b/api/mesh/v1alpha1/service_insight.pb.go
@@ -256,7 +256,7 @@ var file_mesh_v1alpha1_service_insight_proto_rawDesc = []byte{
 	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x12, 0x6d, 0x65, 0x73, 0x68, 0x2f,
 	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67,
 	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74,
-	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8c,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x90,
 	0x06, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68,
 	0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
@@ -299,17 +299,17 @@ var file_mesh_v1alpha1_service_insight_proto_rawDesc = []byte{
 	0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
 	0x61, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68,
 	0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-	0x3a, 0x02, 0x38, 0x01, 0x3a, 0x67, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x18, 0x0a, 0x16, 0x53, 0x65,
+	0x3a, 0x02, 0x38, 0x01, 0x3a, 0x6b, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x18, 0x0a, 0x16, 0x53, 0x65,
 	0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x6f,
 	0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x10, 0x12, 0x0e, 0x53, 0x65, 0x72, 0x76,
 	0x69, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06,
-	0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xb2, 0x8c,
-	0x89, 0xa6, 0x01, 0x11, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x6e,
-	0x73, 0x69, 0x67, 0x68, 0x74, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0x42, 0x2a, 0x5a,
-	0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
-	0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68,
-	0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x33,
+	0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xaa, 0x8c,
+	0x89, 0xa6, 0x01, 0x13, 0x3a, 0x11, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d,
+	0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x04, 0x3a, 0x02, 0x18,
+	0x01, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+	0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/service_insight.proto b/api/mesh/v1alpha1/service_insight.proto
index 8f3cb84bb..90f6ea006 100644
--- a/api/mesh/v1alpha1/service_insight.proto
+++ b/api/mesh/v1alpha1/service_insight.proto
@@ -13,8 +13,8 @@ message ServiceInsight {
   option (kuma.mesh.resource).type = "ServiceInsight";
   option (kuma.mesh.resource).package = "mesh";
   option (kuma.mesh.resource).skip_validation = true;
-  option (kuma.mesh.ws).name = "service-insight";
-  option (kuma.mesh.ws).read_only = true;
+  option (kuma.mesh.resource).ws.name = "service-insight";
+  option (kuma.mesh.resource).ws.read_only = true;
 
   google.protobuf.Timestamp last_sync = 1;
 
diff --git a/api/mesh/v1alpha1/timeout.pb.go b/api/mesh/v1alpha1/timeout.pb.go
index c81caf56b..fbe6d01c8 100644
--- a/api/mesh/v1alpha1/timeout.pb.go
+++ b/api/mesh/v1alpha1/timeout.pb.go
@@ -343,7 +343,7 @@ var file_mesh_v1alpha1_timeout_proto_rawDesc = []byte{
 	0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
 	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x22, 0xe6, 0x06, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a,
+	0x6f, 0x22, 0xe8, 0x06, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a,
 	0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,
 	0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
 	0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x73, 0x6f,
@@ -393,16 +393,16 @@ var file_mesh_v1alpha1_timeout_proto_rawDesc = []byte{
 	0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,
 	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44,
-	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x41, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x11, 0x0a,
+	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x43, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x11, 0x0a,
 	0x0f, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
 	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x09, 0x12, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0xaa,
-	0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01,
-	0x09, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x44, 0x5a, 0x28, 0x67, 0x69,
-	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f,
-	0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x16, 0x50, 0x01, 0xa2, 0x01, 0x07, 0x54,
-	0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0xf2, 0x01, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
-	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
+	0x0b, 0x3a, 0x09, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x44, 0x5a, 0x28,
+	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68,
+	0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x16, 0x50, 0x01, 0xa2, 0x01,
+	0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0xf2, 0x01, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f,
+	0x75, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/timeout.proto b/api/mesh/v1alpha1/timeout.proto
index e28fbd057..8a173a150 100644
--- a/api/mesh/v1alpha1/timeout.proto
+++ b/api/mesh/v1alpha1/timeout.proto
@@ -20,7 +20,7 @@ message Timeout {
   option (kuma.mesh.resource).name = "TimeoutResource";
   option (kuma.mesh.resource).type = "Timeout";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "timeout";
+  option (kuma.mesh.resource).ws.name = "timeout";
 
   // List of selectors to match dataplanes that are sources of traffic.
   repeated Selector sources = 1;
diff --git a/api/mesh/v1alpha1/traffic_log.pb.go b/api/mesh/v1alpha1/traffic_log.pb.go
index 6ff454dbd..9dea46433 100644
--- a/api/mesh/v1alpha1/traffic_log.pb.go
+++ b/api/mesh/v1alpha1/traffic_log.pb.go
@@ -148,7 +148,7 @@ var file_mesh_v1alpha1_traffic_log_proto_rawDesc = []byte{
 	0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x6d, 0x65, 0x73, 0x68, 0x2f,
 	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f,
 	0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xae, 0x02, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x02, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69,
 	0x63, 0x4c, 0x6f, 0x67, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18,
 	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73,
 	0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63,
@@ -162,17 +162,17 @@ var file_mesh_v1alpha1_traffic_log_proto_rawDesc = []byte{
 	0x31, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4c, 0x6f, 0x67, 0x2e, 0x43, 0x6f, 0x6e,
 	0x66, 0x52, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x1a, 0x20, 0x0a, 0x04, 0x43, 0x6f, 0x6e, 0x66, 0x12,
 	0x18, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3a, 0x4b, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
+	0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3a, 0x4d, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
 	0x14, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73,
 	0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0c, 0x12, 0x0a, 0x54, 0x72, 0x61,
 	0x66, 0x66, 0x69, 0x63, 0x4c, 0x6f, 0x67, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d,
-	0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x0d, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66,
-	0x69, 0x63, 0x2d, 0x6c, 0x6f, 0x67, 0x42, 0x4b, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
-	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-	0x61, 0x31, 0x8a, 0xb5, 0x18, 0x1d, 0x50, 0x01, 0xa2, 0x01, 0x0a, 0x54, 0x72, 0x61, 0x66, 0x66,
-	0x69, 0x63, 0x4c, 0x6f, 0x67, 0xf2, 0x01, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x2d,
-	0x6c, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0f, 0x3a, 0x0d, 0x0a, 0x0b, 0x74, 0x72, 0x61,
+	0x66, 0x66, 0x69, 0x63, 0x2d, 0x6c, 0x6f, 0x67, 0x42, 0x4b, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75,
+	0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x1d, 0x50, 0x01, 0xa2, 0x01, 0x0a, 0x54, 0x72, 0x61,
+	0x66, 0x66, 0x69, 0x63, 0x4c, 0x6f, 0x67, 0xf2, 0x01, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69,
+	0x63, 0x2d, 0x6c, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/traffic_log.proto b/api/mesh/v1alpha1/traffic_log.proto
index 54701d10f..1b0c84062 100644
--- a/api/mesh/v1alpha1/traffic_log.proto
+++ b/api/mesh/v1alpha1/traffic_log.proto
@@ -20,7 +20,7 @@ message TrafficLog {
   option (kuma.mesh.resource).name = "TrafficLogResource";
   option (kuma.mesh.resource).type = "TrafficLog";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "traffic-log";
+  option (kuma.mesh.resource).ws.name = "traffic-log";
 
   // List of selectors to match dataplanes that are sources of traffic.
   repeated Selector sources = 1;
diff --git a/api/mesh/v1alpha1/traffic_permission.pb.go b/api/mesh/v1alpha1/traffic_permission.pb.go
index 1cf6b914b..f84bfd729 100644
--- a/api/mesh/v1alpha1/traffic_permission.pb.go
+++ b/api/mesh/v1alpha1/traffic_permission.pb.go
@@ -90,7 +90,7 @@ var file_mesh_v1alpha1_traffic_permission_proto_rawDesc = []byte{
 	0x73, 0x68, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 	0x1a, 0x1c, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f,
 	0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c,
-	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xef, 0x01, 0x0a,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf1, 0x01, 0x0a,
 	0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,
 	0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20,
 	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e,
@@ -99,20 +99,20 @@ var file_mesh_v1alpha1_traffic_permission_proto_rawDesc = []byte{
 	0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
 	0x32, 0x1c, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61,
 	0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c,
-	0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x60, 0xaa, 0x8c,
+	0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x62, 0xaa, 0x8c,
 	0x89, 0xa6, 0x01, 0x1b, 0x0a, 0x19, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x65, 0x72,
 	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa,
 	0x8c, 0x89, 0xa6, 0x01, 0x13, 0x12, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x65,
 	0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04,
-	0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x14, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x66,
-	0x66, 0x69, 0x63, 0x2d, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x5b,
-	0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d,
-	0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73,
-	0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x2d, 0x50, 0x01,
-	0xa2, 0x01, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0xf2, 0x01, 0x13, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x2d,
-	0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x16, 0x3a, 0x14, 0x0a, 0x12, 0x74, 0x72,
+	0x61, 0x66, 0x66, 0x69, 0x63, 0x2d, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x42, 0x5b, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b,
+	0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d,
+	0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x8a, 0xb5, 0x18, 0x2d,
+	0x50, 0x01, 0xa2, 0x01, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x65, 0x72, 0x6d,
+	0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0xf2, 0x01, 0x13, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69,
+	0x63, 0x2d, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/traffic_permission.proto b/api/mesh/v1alpha1/traffic_permission.proto
index ed115c1ab..fad768484 100644
--- a/api/mesh/v1alpha1/traffic_permission.proto
+++ b/api/mesh/v1alpha1/traffic_permission.proto
@@ -20,7 +20,7 @@ message TrafficPermission {
   option (kuma.mesh.resource).name = "TrafficPermissionResource";
   option (kuma.mesh.resource).type = "TrafficPermission";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "traffic-permission";
+  option (kuma.mesh.resource).ws.name = "traffic-permission";
 
   // List of selectors to match dataplanes that are sources of traffic.
   repeated Selector sources = 1;
diff --git a/api/mesh/v1alpha1/traffic_route.pb.go b/api/mesh/v1alpha1/traffic_route.pb.go
index cbd8c36e5..9219d176e 100644
--- a/api/mesh/v1alpha1/traffic_route.pb.go
+++ b/api/mesh/v1alpha1/traffic_route.pb.go
@@ -1343,7 +1343,7 @@ var file_mesh_v1alpha1_traffic_route_proto_rawDesc = []byte{
 	0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64,
 	0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x22, 0xd1, 0x1a, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x6f, 0x75, 0x74,
+	0x22, 0xd3, 0x1a, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x6f, 0x75, 0x74,
 	0x65, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
 	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
 	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72,
@@ -1551,17 +1551,17 @@ var file_mesh_v1alpha1_traffic_route_proto_rawDesc = []byte{
 	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
 	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
 	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
-	0x01, 0x3a, 0x51, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x16, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x66, 0x66,
+	0x01, 0x3a, 0x53, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x16, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x66, 0x66,
 	0x69, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa,
 	0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x12, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x6f,
-	0x75, 0x74, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2,
-	0x8c, 0x89, 0xa6, 0x01, 0x0f, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x2d, 0x72,
-	0x6f, 0x75, 0x74, 0x65, 0x42, 0x4f, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
-	0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61,
-	0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x8a, 0xb5, 0x18, 0x21, 0x50, 0x01, 0xa2, 0x01, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63,
-	0x52, 0x6f, 0x75, 0x74, 0x65, 0xf2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x2d,
-	0x72, 0x6f, 0x75, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x75, 0x74, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa,
+	0x8c, 0x89, 0xa6, 0x01, 0x11, 0x3a, 0x0f, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63,
+	0x2d, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x4f, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
+	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x8a, 0xb5, 0x18, 0x21, 0x50, 0x01, 0xa2, 0x01, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66,
+	0x69, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0xf2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69,
+	0x63, 0x2d, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/traffic_route.proto b/api/mesh/v1alpha1/traffic_route.proto
index 092c215c6..d0681dcd9 100644
--- a/api/mesh/v1alpha1/traffic_route.proto
+++ b/api/mesh/v1alpha1/traffic_route.proto
@@ -22,7 +22,7 @@ message TrafficRoute {
   option (kuma.mesh.resource).name = "TrafficRouteResource";
   option (kuma.mesh.resource).type = "TrafficRoute";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "traffic-route";
+  option (kuma.mesh.resource).ws.name = "traffic-route";
 
   // List of selectors to match data plane proxies that are sources of traffic.
   repeated Selector sources = 1 [ (validate.rules).repeated .min_items = 1 ];
diff --git a/api/mesh/v1alpha1/traffic_trace.pb.go b/api/mesh/v1alpha1/traffic_trace.pb.go
index 3804e804a..ee944f272 100644
--- a/api/mesh/v1alpha1/traffic_trace.pb.go
+++ b/api/mesh/v1alpha1/traffic_trace.pb.go
@@ -139,7 +139,7 @@ var file_mesh_v1alpha1_traffic_trace_proto_rawDesc = []byte{
 	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x6d, 0x65, 0x73,
 	0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63,
 	0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69,
-	0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfa, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x66,
+	0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x66,
 	0x66, 0x69, 0x63, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65,
 	0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6b, 0x75,
 	0x6d, 0x61, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
@@ -150,17 +150,17 @@ var file_mesh_v1alpha1_traffic_trace_proto_rawDesc = []byte{
 	0x72, 0x61, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x04, 0x63, 0x6f, 0x6e, 0x66, 0x1a,
 	0x20, 0x0a, 0x04, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65,
 	0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
-	0x64, 0x3a, 0x51, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x16, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x66, 0x66,
+	0x64, 0x3a, 0x53, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x16, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x66, 0x66,
 	0x69, 0x63, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa,
 	0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x12, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, 0x72,
-	0x61, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2,
-	0x8c, 0x89, 0xa6, 0x01, 0x0f, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x2d, 0x74,
-	0x72, 0x61, 0x63, 0x65, 0x42, 0x4f, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
-	0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61,
-	0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x8a, 0xb5, 0x18, 0x21, 0x50, 0x01, 0xa2, 0x01, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63,
-	0x54, 0x72, 0x61, 0x63, 0x65, 0xf2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x2d,
-	0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x61, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa,
+	0x8c, 0x89, 0xa6, 0x01, 0x11, 0x3a, 0x0f, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63,
+	0x2d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x42, 0x4f, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
+	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+	0x61, 0x31, 0x8a, 0xb5, 0x18, 0x21, 0x50, 0x01, 0xa2, 0x01, 0x0c, 0x54, 0x72, 0x61, 0x66, 0x66,
+	0x69, 0x63, 0x54, 0x72, 0x61, 0x63, 0x65, 0xf2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69,
+	0x63, 0x2d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/traffic_trace.proto b/api/mesh/v1alpha1/traffic_trace.proto
index e8fdb1bfb..e5ff9e609 100644
--- a/api/mesh/v1alpha1/traffic_trace.proto
+++ b/api/mesh/v1alpha1/traffic_trace.proto
@@ -20,7 +20,7 @@ message TrafficTrace {
   option (kuma.mesh.resource).name = "TrafficTraceResource";
   option (kuma.mesh.resource).type = "TrafficTrace";
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "traffic-trace";
+  option (kuma.mesh.resource).ws.name = "traffic-trace";
 
   // List of selectors to match dataplanes.
   repeated Selector selectors = 1;
diff --git a/api/mesh/v1alpha1/zone_ingress.pb.go b/api/mesh/v1alpha1/zone_ingress.pb.go
index be39447bf..a5b4099fc 100644
--- a/api/mesh/v1alpha1/zone_ingress.pb.go
+++ b/api/mesh/v1alpha1/zone_ingress.pb.go
@@ -246,7 +246,7 @@ var file_mesh_v1alpha1_zone_ingress_proto_rawDesc = []byte{
 	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x12, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6f, 0x70, 0x74,
 	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69,
 	0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x05, 0x0a, 0x0b, 0x5a, 0x6f, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x05, 0x0a, 0x0b, 0x5a, 0x6f, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x72,
 	0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
 	0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f,
 	0x72, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x75,
@@ -281,17 +281,17 @@ var file_mesh_v1alpha1_zone_ingress_proto_rawDesc = []byte{
 	0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
 	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
 	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x6c, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x70, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13,
 	0x5a, 0x6f, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75,
 	0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0d, 0x12, 0x0b, 0x5a, 0x6f, 0x6e, 0x65, 0x49,
 	0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0xaa, 0x8c,
-	0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x0e,
-	0x0a, 0x0c, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0xb2, 0x8c,
-	0x89, 0xa6, 0x01, 0x10, 0x12, 0x0e, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x69, 0x6e, 0x67, 0x72, 0x65,
-	0x73, 0x73, 0x65, 0x73, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
-	0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61,
-	0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x10,
+	0x3a, 0x0e, 0x0a, 0x0c, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73,
+	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x12, 0x3a, 0x10, 0x12, 0x0e, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x69,
+	0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75,
+	0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c,
+	0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/zone_ingress.proto b/api/mesh/v1alpha1/zone_ingress.proto
index 50d213fec..ff861020c 100644
--- a/api/mesh/v1alpha1/zone_ingress.proto
+++ b/api/mesh/v1alpha1/zone_ingress.proto
@@ -16,8 +16,8 @@ message ZoneIngress {
   option (kuma.mesh.resource).type = "ZoneIngress";
   option (kuma.mesh.resource).global = true;
   option (kuma.mesh.resource).package = "mesh";
-  option (kuma.mesh.ws).name = "zone-ingress";
-  option (kuma.mesh.ws).plural = "zone-ingresses";
+  option (kuma.mesh.resource).ws.name = "zone-ingress";
+  option (kuma.mesh.resource).ws.plural = "zone-ingresses";
 
   // Zone field contains Zone name where ingress is serving, field will be
   // automatically set by Global Kuma CP
diff --git a/api/mesh/v1alpha1/zone_ingress_insight.pb.go b/api/mesh/v1alpha1/zone_ingress_insight.pb.go
index db0a71e9e..ff207e2d0 100644
--- a/api/mesh/v1alpha1/zone_ingress_insight.pb.go
+++ b/api/mesh/v1alpha1/zone_ingress_insight.pb.go
@@ -80,25 +80,25 @@ var file_mesh_v1alpha1_zone_ingress_insight_proto_rawDesc = []byte{
 	0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x1a, 0x25, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
 	0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x69,
-	0x67, 0x68, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe3, 0x01, 0x0a, 0x12, 0x5a, 0x6f,
+	0x67, 0x68, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe8, 0x01, 0x0a, 0x12, 0x5a, 0x6f,
 	0x6e, 0x65, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74,
 	0x12, 0x4f, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
 	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x6d,
 	0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73,
 	0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
 	0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x3a, 0x7c, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x1c, 0x0a, 0x1a, 0x5a, 0x6f, 0x6e, 0x65, 0x49,
-	0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73,
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x14, 0x12, 0x12, 0x5a, 0x6f, 0x6e,
-	0x65, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa,
-	0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
-	0x02, 0x18, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xb2, 0x8c, 0x89, 0xa6, 0x01,
-	0x16, 0x0a, 0x14, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2d,
-	0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0x42,
-	0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75,
-	0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65,
-	0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x73, 0x3a, 0x80, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x1c, 0x0a, 0x1a, 0x5a, 0x6f, 0x6e, 0x65,
+	0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65,
+	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x14, 0x12, 0x12, 0x5a, 0x6f,
+	0x6e, 0x65, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74,
+	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73, 0x68, 0xaa, 0x8c, 0x89, 0xa6,
+	0x01, 0x02, 0x18, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01, 0xaa, 0x8c, 0x89, 0xa6,
+	0x01, 0x18, 0x3a, 0x16, 0x0a, 0x14, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x69, 0x6e, 0x67, 0x72, 0x65,
+	0x73, 0x73, 0x2d, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x04,
+	0x3a, 0x02, 0x18, 0x01, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61,
+	0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/mesh/v1alpha1/zone_ingress_insight.proto b/api/mesh/v1alpha1/zone_ingress_insight.proto
index 34d8f9eac..05948011a 100644
--- a/api/mesh/v1alpha1/zone_ingress_insight.proto
+++ b/api/mesh/v1alpha1/zone_ingress_insight.proto
@@ -15,8 +15,8 @@ message ZoneIngressInsight {
   option (kuma.mesh.resource).package = "mesh";
   option (kuma.mesh.resource).global = true;
   option (kuma.mesh.resource).skip_validation = true;
-  option (kuma.mesh.ws).name = "zone-ingress-insight";
-  option (kuma.mesh.ws).read_only = true;
+  option (kuma.mesh.resource).ws.name = "zone-ingress-insight";
+  option (kuma.mesh.resource).ws.read_only = true;
 
   // List of ADS subscriptions created by a given Zone Kuma CP.
   repeated DiscoverySubscription subscriptions = 1;
diff --git a/api/system/v1alpha1/secret.pb.go b/api/system/v1alpha1/secret.pb.go
index 68b2c7522..c8a0d4db1 100644
--- a/api/system/v1alpha1/secret.pb.go
+++ b/api/system/v1alpha1/secret.pb.go
@@ -80,19 +80,19 @@ var file_system_v1alpha1_secret_proto_rawDesc = []byte{
 	0x70, 0x68, 0x61, 0x31, 0x1a, 0x12, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f,
 	0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
 	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
-	0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8b, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x63,
+	0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x63,
 	0x72, 0x65, 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
 	0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 	0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04,
-	0x64, 0x61, 0x74, 0x61, 0x3a, 0x50, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x10, 0x0a, 0x0e, 0x53, 0x65,
+	0x64, 0x61, 0x74, 0x61, 0x3a, 0x54, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x10, 0x0a, 0x0e, 0x53, 0x65,
 	0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6,
 	0x01, 0x08, 0x12, 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x08,
 	0x22, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x28, 0x01,
-	0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x08, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0xb2, 0x8c,
-	0x89, 0xa6, 0x01, 0x02, 0x20, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
-	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0a, 0x3a, 0x08, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74,
+	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x04, 0x3a, 0x02, 0x20, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69,
+	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f,
+	0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/system/v1alpha1/secret.proto b/api/system/v1alpha1/secret.proto
index 5c861355c..ea960c06c 100644
--- a/api/system/v1alpha1/secret.proto
+++ b/api/system/v1alpha1/secret.proto
@@ -14,8 +14,8 @@ message Secret {
   option (kuma.mesh.resource).type = "Secret";
   option (kuma.mesh.resource).package = "system";
   option (kuma.mesh.resource).skip_validation = true;
-  option (kuma.mesh.ws).name = "secret";
-  option (kuma.mesh.ws).admin_only = true;
+  option (kuma.mesh.resource).ws.name = "secret";
+  option (kuma.mesh.resource).ws.admin_only = true;
 
   // Value of the secret
   google.protobuf.BytesValue data = 1;
diff --git a/api/system/v1alpha1/zone.pb.go b/api/system/v1alpha1/zone.pb.go
index 2f8714085..5c8028d04 100644
--- a/api/system/v1alpha1/zone.pb.go
+++ b/api/system/v1alpha1/zone.pb.go
@@ -82,19 +82,19 @@ var file_system_v1alpha1_zone_proto_rawDesc = []byte{
 	0x61, 0x31, 0x1a, 0x12, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x88, 0x01, 0x0a, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0x12,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8a, 0x01, 0x0a, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0x12,
 	0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
 	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
 	0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x65, 0x6e,
-	0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x4a, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x0a, 0x0c, 0x5a,
+	0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x4c, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x0a, 0x0c, 0x5a,
 	0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
 	0x06, 0x12, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x08, 0x22, 0x06, 0x73,
 	0x79, 0x73, 0x74, 0x65, 0x6d, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0xaa, 0x8c, 0x89,
-	0xa6, 0x01, 0x02, 0x28, 0x01, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x0a, 0x04, 0x7a, 0x6f, 0x6e,
-	0x65, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
-	0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f,
-	0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0xa6, 0x01, 0x02, 0x28, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x08, 0x3a, 0x06, 0x0a, 0x04, 0x7a,
+	0x6f, 0x6e, 0x65, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70,
+	0x69, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+	0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/system/v1alpha1/zone.proto b/api/system/v1alpha1/zone.proto
index f2acfaee3..787bb47b4 100644
--- a/api/system/v1alpha1/zone.proto
+++ b/api/system/v1alpha1/zone.proto
@@ -16,7 +16,7 @@ message Zone {
   option (kuma.mesh.resource).package = "system";
   option (kuma.mesh.resource).global = true;
   option (kuma.mesh.resource).skip_validation = true;
-  option (kuma.mesh.ws).name = "zone";
+  option (kuma.mesh.resource).ws.name = "zone";
 
   // enable allows to turn the zone on/off and exclude the whole zone from
   // balancing traffic on it
diff --git a/api/system/v1alpha1/zone_insight.pb.go b/api/system/v1alpha1/zone_insight.pb.go
index 4db9f6353..b296af7de 100644
--- a/api/system/v1alpha1/zone_insight.pb.go
+++ b/api/system/v1alpha1/zone_insight.pb.go
@@ -444,89 +444,90 @@ var file_system_v1alpha1_zone_insight_proto_rawDesc = []byte{
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
 	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
 	0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
-	0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc4, 0x01, 0x0a, 0x0b, 0x5a, 0x6f, 0x6e,
+	0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc8, 0x01, 0x0a, 0x0b, 0x5a, 0x6f, 0x6e,
 	0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4b, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73,
 	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
 	0x25, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x31,
 	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x44, 0x53, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
 	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13, 0x5a,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x6c, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x15, 0x0a, 0x13, 0x5a,
 	0x6f, 0x6e, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
 	0x63, 0x65, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0d, 0x12, 0x0b, 0x5a, 0x6f, 0x6e, 0x65, 0x49, 0x6e,
 	0x73, 0x69, 0x67, 0x68, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x08, 0x22, 0x06, 0x73, 0x79, 0x73,
 	0x74, 0x65, 0x6d, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
-	0x02, 0x28, 0x01, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x0e, 0x0a, 0x0c, 0x7a, 0x6f, 0x6e, 0x65, 0x2d,
-	0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xb2, 0x8c, 0x89, 0xa6, 0x01, 0x02, 0x18, 0x01, 0x22,
-	0xf7, 0x02, 0x0a, 0x0f, 0x4b, 0x44, 0x53, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42,
-	0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x12,
-	0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f,
-	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10,
-	0x01, 0x52, 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
-	0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74,
-	0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xb2, 0x01, 0x02, 0x08, 0x01, 0x52,
-	0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x0f,
-	0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d,
-	0x65, 0x12, 0x4d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x2b, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x44, 0x53, 0x53, 0x75, 0x62, 0x73,
-	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x08,
-	0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x12, 0x37, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x1d, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e,
-	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-	0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xc5, 0x02, 0x0a, 0x15, 0x4b, 0x44,
-	0x53, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61,
-	0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x02, 0x28, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x10, 0x3a, 0x0e, 0x0a, 0x0c, 0x7a, 0x6f, 0x6e,
+	0x65, 0x2d, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x04, 0x3a,
+	0x02, 0x18, 0x01, 0x22, 0xf7, 0x02, 0x0a, 0x0f, 0x4b, 0x44, 0x53, 0x53, 0x75, 0x62, 0x73, 0x63,
+	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64,
+	0x12, 0x35, 0x0a, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42,
+	0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
+	0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x74, 0x6f, 0x74,
-	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xb2, 0x01,
+	0x02, 0x08, 0x01, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x43, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74,
+	0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
+	0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73,
+	0x74, 0x65, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x44, 0x53,
+	0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73,
+	0x74, 0x65, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xc5, 0x02,
+	0x0a, 0x15, 0x4b, 0x44, 0x53, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f,
+	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c,
+	0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a,
+	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6b,
+	0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+	0x68, 0x61, 0x31, 0x2e, 0x4b, 0x44, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x49, 0x0a, 0x04, 0x73, 0x74,
+	0x61, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e,
 	0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-	0x4b, 0x44, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52,
-	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x49, 0x0a, 0x04, 0x73, 0x74, 0x61, 0x74, 0x18, 0x03,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74,
-	0x65, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x44, 0x53, 0x53,
-	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x73, 0x74, 0x61,
-	0x74, 0x1a, 0x5e, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
-	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
-	0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x25, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x31,
-	0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x44, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
-	0x01, 0x22, 0x9e, 0x01, 0x0a, 0x0f, 0x4b, 0x44, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x72,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x16,
-	0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77,
-	0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x72, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64,
-	0x67, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73,
-	0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52,
-	0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74,
-	0x65, 0x64, 0x22, 0x46, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a,
-	0x06, 0x6b, 0x75, 0x6d, 0x61, 0x43, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
-	0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-	0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x75, 0x6d, 0x61, 0x43, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69,
-	0x6f, 0x6e, 0x52, 0x06, 0x6b, 0x75, 0x6d, 0x61, 0x43, 0x70, 0x22, 0x7d, 0x0a, 0x0d, 0x4b, 0x75,
-	0x6d, 0x61, 0x43, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76,
-	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65,
-	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x69, 0x74, 0x54, 0x61, 0x67, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x74, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a,
-	0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62,
-	0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
-	0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74,
-	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x68, 0x71, 0x2f, 0x6b,
-	0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x76,
-	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x4b, 0x44, 0x53, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x04, 0x73, 0x74, 0x61, 0x74, 0x1a, 0x5e, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65,
+	0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x44, 0x53, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x0f, 0x4b, 0x44, 0x53, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74,
+	0x12, 0x35, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x5f, 0x61, 0x63,
+	0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x15, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x41, 0x63, 0x6b, 0x6e, 0x6f,
+	0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x52, 0x65,
+	0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x46, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x12, 0x3b, 0x0a, 0x06, 0x6b, 0x75, 0x6d, 0x61, 0x43, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x23, 0x2e, 0x6b, 0x75, 0x6d, 0x61, 0x2e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e,
+	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x75, 0x6d, 0x61, 0x43, 0x70, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x6b, 0x75, 0x6d, 0x61, 0x43, 0x70, 0x22, 0x7d,
+	0x0a, 0x0d, 0x4b, 0x75, 0x6d, 0x61, 0x43, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x69, 0x74,
+	0x54, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x74, 0x54, 0x61,
+	0x67, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12,
+	0x1c, 0x0a, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x42, 0x2c, 0x5a,
+	0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x6d, 0x61,
+	0x68, 0x71, 0x2f, 0x6b, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x74,
+	0x65, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/api/system/v1alpha1/zone_insight.proto b/api/system/v1alpha1/zone_insight.proto
index 4ca654be3..3564db0b8 100644
--- a/api/system/v1alpha1/zone_insight.proto
+++ b/api/system/v1alpha1/zone_insight.proto
@@ -16,8 +16,8 @@ message ZoneInsight {
   option (kuma.mesh.resource).package = "system";
   option (kuma.mesh.resource).global = true;
   option (kuma.mesh.resource).skip_validation = true;
-  option (kuma.mesh.ws).name = "zone-insight";
-  option (kuma.mesh.ws).read_only = true;
+  option (kuma.mesh.resource).ws.name = "zone-insight";
+  option (kuma.mesh.resource).ws.read_only = true;
 
   // List of KDS subscriptions created by a given Zone Kuma CP.
   repeated KDSSubscription subscriptions = 1;
diff --git a/app/kumactl/cmd/delete/delete.go b/app/kumactl/cmd/delete/delete.go
index 17eb94e09..2ab7b2dea 100644
--- a/app/kumactl/cmd/delete/delete.go
+++ b/app/kumactl/cmd/delete/delete.go
@@ -2,11 +2,13 @@ package delete
 
 import (
 	"context"
+	"strings"
 
 	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 
 	kumactl_cmd "github.com/kumahq/kuma/app/kumactl/pkg/cmd"
+	"github.com/kumahq/kuma/app/kumactl/pkg/entities"
 	"github.com/kumahq/kuma/pkg/core/resources/model"
 	"github.com/kumahq/kuma/pkg/core/resources/registry"
 	"github.com/kumahq/kuma/pkg/core/resources/store"
@@ -22,10 +24,12 @@ func NewDeleteCmd(pctx *kumactl_cmd.RootContext) *cobra.Command {
 			resourceTypeArg := args[0]
 			name := args[1]
 
-			var resource model.Resource
-			resourceType, err := pctx.TypeForArg(resourceTypeArg)
-			if err != nil {
-				return err
+			def, ok := entities.ByName[resourceTypeArg]
+			if !ok {
+				return errors.Errorf("unknown TYPE: %s. Allowed values: %s", resourceTypeArg, strings.Join(entities.Names, ", "))
+			}
+			if def.ReadOnly {
+				return errors.Errorf("TYPE: %s is readOnly, can't use it for write action", resourceTypeArg)
 			}
 
 			rs, err := pctx.CurrentResourceStore()
@@ -33,7 +37,8 @@ func NewDeleteCmd(pctx *kumactl_cmd.RootContext) *cobra.Command {
 				return err
 			}
 
-			if resource, err = registry.Global().NewObject(resourceType); err != nil {
+			var resource model.Resource
+			if resource, err = registry.Global().NewObject(def.ResourceType); err != nil {
 				return err
 			}
 
@@ -42,11 +47,11 @@ func NewDeleteCmd(pctx *kumactl_cmd.RootContext) *cobra.Command {
 				mesh = pctx.CurrentMesh()
 			}
 
-			if err := deleteResource(name, mesh, resource, resourceType, rs); err != nil {
+			if err := deleteResource(name, mesh, resource, def.ResourceType, rs); err != nil {
 				return err
 			}
 
-			cmd.Printf("deleted %s %q\n", resourceType, name)
+			cmd.Printf("deleted %s %q\n", def.ResourceType, name)
 			return nil
 		},
 	}
diff --git a/app/kumactl/cmd/get/dataplanes_table_printer.go b/app/kumactl/cmd/get/dataplanes_table_printer.go
deleted file mode 100644
index 362c88b70..000000000
--- a/app/kumactl/cmd/get/dataplanes_table_printer.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package get
-
-import (
-	"io"
-	"time"
-
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/printers"
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/table"
-	"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
-	"github.com/kumahq/kuma/pkg/core/resources/model"
-)
-
-func printDataplanes(rootTime time.Time, resources model.ResourceList, out io.Writer) error {
-	dataplanes := resources.(*mesh.DataplaneResourceList)
-	data := printers.Table{
-		Headers: []string{"MESH", "NAME", "TAGS", "AGE"},
-		NextRow: func() func() []string {
-			i := 0
-			return func() []string {
-				defer func() { i++ }()
-				if len(dataplanes.Items) <= i {
-					return nil
-				}
-				dataplane := dataplanes.Items[i]
-
-				return []string{
-					dataplane.Meta.GetMesh(),                                        // MESH
-					dataplane.Meta.GetName(),                                        // NAME,
-					dataplane.Spec.TagSet().String(),                                // TAGS
-					table.TimeSince(dataplane.Meta.GetModificationTime(), rootTime), // AGE
-
-				}
-			}
-		}(),
-		Footer: table.PaginationFooter(dataplanes),
-	}
-	return printers.NewTablePrinter().Print(data, out)
-}
diff --git a/app/kumactl/cmd/get/external_services_table_printer.go b/app/kumactl/cmd/get/external_services_table_printer.go
deleted file mode 100644
index 3099992a8..000000000
--- a/app/kumactl/cmd/get/external_services_table_printer.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package get
-
-import (
-	"io"
-	"time"
-
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/printers"
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/table"
-	"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
-	"github.com/kumahq/kuma/pkg/core/resources/model"
-)
-
-func printExternalServices(rootTime time.Time, resources model.ResourceList, out io.Writer) error {
-	externalServices := resources.(*mesh.ExternalServiceResourceList)
-	data := printers.Table{
-		Headers: []string{"MESH", "NAME", "TAGS", "ADDRESS", "AGE"},
-		NextRow: func() func() []string {
-			i := 0
-			return func() []string {
-				defer func() { i++ }()
-				if len(externalServices.Items) <= i {
-					return nil
-				}
-				externalService := externalServices.Items[i]
-
-				return []string{
-					externalService.Meta.GetMesh(),                                        // MESH
-					externalService.Meta.GetName(),                                        // NAME,
-					externalService.Spec.TagSet().String(),                                // TAGS
-					externalService.Spec.Networking.Address,                               // ADDRESS
-					table.TimeSince(externalService.Meta.GetModificationTime(), rootTime), // AGE
-				}
-			}
-		}(),
-		Footer: table.PaginationFooter(externalServices),
-	}
-	return printers.NewTablePrinter().Print(data, out)
-}
diff --git a/app/kumactl/cmd/get/get.go b/app/kumactl/cmd/get/get.go
index d8a376c92..2418f9c98 100644
--- a/app/kumactl/cmd/get/get.go
+++ b/app/kumactl/cmd/get/get.go
@@ -5,10 +5,9 @@ import (
 
 	get_context "github.com/kumahq/kuma/app/kumactl/cmd/get/context"
 	kumactl_cmd "github.com/kumahq/kuma/app/kumactl/pkg/cmd"
+	"github.com/kumahq/kuma/app/kumactl/pkg/entities"
 	"github.com/kumahq/kuma/app/kumactl/pkg/output"
 	kuma_cmd "github.com/kumahq/kuma/pkg/cmd"
-	core_mesh "github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
-	core_system "github.com/kumahq/kuma/pkg/core/resources/apis/system"
 )
 
 func NewGetCmd(pctx *kumactl_cmd.RootContext) *cobra.Command {
@@ -19,44 +18,10 @@ func NewGetCmd(pctx *kumactl_cmd.RootContext) *cobra.Command {
 	}
 	// flags
 	cmd.PersistentFlags().StringVarP(&pctx.GetContext.Args.OutputFormat, "output", "o", string(output.TableFormat), kuma_cmd.UsageOptions("output format", output.TableFormat, output.YAMLFormat, output.JSONFormat))
-	// sub-commands
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "meshes", core_mesh.MeshType, printMeshes), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "dataplanes", core_mesh.DataplaneType, printDataplanes), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "external-services", core_mesh.ExternalServiceType, printExternalServices), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "healthchecks", core_mesh.HealthCheckType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "proxytemplates", core_mesh.ProxyTemplateType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "rate-limits", core_mesh.RateLimitType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "traffic-permissions", core_mesh.TrafficPermissionType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "traffic-routes", core_mesh.TrafficRouteType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "traffic-logs", core_mesh.TrafficLogType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "traffic-traces", core_mesh.TrafficTraceType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "fault-injections", core_mesh.FaultInjectionType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "circuit-breakers", core_mesh.CircuitBreakerType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "retries", core_mesh.RetryType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "timeouts", core_mesh.TimeoutType, BasicResourceTablePrinter), &pctx.ListContext))
-	cmd.AddCommand(NewGetResourcesCmd(pctx, "secrets", core_system.SecretType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourcesCmd(pctx, "global-secrets", core_system.GlobalSecretType, BasicGlobalResourceTablePrinter))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "zones", core_system.ZoneType, printZones), &pctx.ListContext))
-	cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, "zone-ingresses", core_mesh.ZoneIngressType, BasicGlobalResourceTablePrinter), &pctx.ListContext))
-
-	cmd.AddCommand(NewGetResourceCmd(pctx, "mesh", core_mesh.MeshType, printMeshes))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "dataplane", core_mesh.DataplaneType, printDataplanes))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "external-service", core_mesh.ExternalServiceType, printExternalServices))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "healthcheck", core_mesh.HealthCheckType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "proxytemplate", core_mesh.ProxyTemplateType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "rate-limit", core_mesh.RateLimitType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "traffic-permission", core_mesh.TrafficPermissionType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "traffic-route", core_mesh.TrafficRouteType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "traffic-log", core_mesh.TrafficLogType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "traffic-trace", core_mesh.TrafficTraceType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "fault-injection", core_mesh.FaultInjectionType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "circuit-breaker", core_mesh.CircuitBreakerType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "retry", core_mesh.RetryType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "timeout", core_mesh.TimeoutType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "secret", core_system.SecretType, BasicResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "global-secret", core_system.GlobalSecretType, BasicGlobalResourceTablePrinter))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "zone", core_system.ZoneType, printZones))
-	cmd.AddCommand(NewGetResourceCmd(pctx, "zone-ingress", core_mesh.ZoneIngressType, BasicGlobalResourceTablePrinter))
+	for _, cmdInst := range entities.All {
+		cmd.AddCommand(WithPaginationArgs(NewGetResourcesCmd(pctx, cmdInst.Plural, cmdInst.ResourceType), &pctx.ListContext))
+		cmd.AddCommand(NewGetResourceCmd(pctx, cmdInst.Singular, cmdInst.ResourceType))
+	}
 	return cmd
 }
 
diff --git a/app/kumactl/cmd/get/get_resource.go b/app/kumactl/cmd/get/get_resource.go
index 2dbac9de0..d6d434d1f 100644
--- a/app/kumactl/cmd/get/get_resource.go
+++ b/app/kumactl/cmd/get/get_resource.go
@@ -16,7 +16,7 @@ import (
 	"github.com/kumahq/kuma/pkg/core/resources/store"
 )
 
-func NewGetResourceCmd(pctx *kumactl_cmd.RootContext, use string, resourceType core_model.ResourceType, tablePrinter TablePrinter) *cobra.Command {
+func NewGetResourceCmd(pctx *kumactl_cmd.RootContext, use string, resourceType core_model.ResourceType) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   fmt.Sprintf("%s NAME", use),
 		Short: fmt.Sprintf("Show a single %s resource", resourceType),
@@ -61,7 +61,7 @@ func NewGetResourceCmd(pctx *kumactl_cmd.RootContext, use string, resourceType c
 
 			switch format := output.Format(pctx.GetContext.Args.OutputFormat); format {
 			case output.TableFormat:
-				return tablePrinter(pctx.Now(), resources, cmd.OutOrStdout())
+				return ResolvePrinter(resourceType, resource.Scope()).Print(pctx.Now(), resources, cmd.OutOrStdout())
 			default:
 				printer, err := printers.NewGenericPrinter(format)
 				if err != nil {
diff --git a/app/kumactl/cmd/get/get_resources.go b/app/kumactl/cmd/get/get_resources.go
index 55859dc54..7ba3d0386 100644
--- a/app/kumactl/cmd/get/get_resources.go
+++ b/app/kumactl/cmd/get/get_resources.go
@@ -16,7 +16,7 @@ import (
 	core_store "github.com/kumahq/kuma/pkg/core/resources/store"
 )
 
-func NewGetResourcesCmd(pctx *kumactl_cmd.RootContext, use string, resourceType model.ResourceType, tablePrinter TablePrinter) *cobra.Command {
+func NewGetResourcesCmd(pctx *kumactl_cmd.RootContext, use string, resourceType model.ResourceType) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   use,
 		Short: fmt.Sprintf("Show %s", resourceType),
@@ -32,7 +32,8 @@ func NewGetResourcesCmd(pctx *kumactl_cmd.RootContext, use string, resourceType
 				return err
 			}
 			currentMesh := pctx.CurrentMesh()
-			if resources.NewItem().Scope() == model.ScopeGlobal {
+			resource := resources.NewItem()
+			if resource.Scope() == model.ScopeGlobal {
 				currentMesh = ""
 			}
 			if err := rs.List(context.Background(), resources, core_store.ListByMesh(currentMesh), core_store.ListByPage(pctx.ListContext.Args.Size, pctx.ListContext.Args.Offset)); err != nil {
@@ -41,7 +42,7 @@ func NewGetResourcesCmd(pctx *kumactl_cmd.RootContext, use string, resourceType
 
 			switch format := output.Format(pctx.GetContext.Args.OutputFormat); format {
 			case output.TableFormat:
-				return tablePrinter(pctx.Now(), resources, cmd.OutOrStdout())
+				return ResolvePrinter(resourceType, resource.Scope()).Print(pctx.Now(), resources, cmd.OutOrStdout())
 			default:
 				printer, err := printers.NewGenericPrinter(format)
 				if err != nil {
diff --git a/app/kumactl/cmd/get/mesh_table_printer.go b/app/kumactl/cmd/get/mesh_table_printer.go
deleted file mode 100644
index a9d3b4bfc..000000000
--- a/app/kumactl/cmd/get/mesh_table_printer.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package get
-
-import (
-	"fmt"
-	"io"
-	"time"
-
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/printers"
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/table"
-	"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
-	"github.com/kumahq/kuma/pkg/core/resources/model"
-)
-
-func printMeshes(rootTime time.Time, resources model.ResourceList, out io.Writer) error {
-	meshes := resources.(*mesh.MeshResourceList)
-	data := printers.Table{
-		Headers: []string{"NAME", "mTLS", "METRICS", "LOGGING", "TRACING", "LOCALITY", "AGE"},
-		NextRow: func() func() []string {
-			i := 0
-			return func() []string {
-				defer func() { i++ }()
-				if len(meshes.Items) <= i {
-					return nil
-				}
-				mesh := meshes.Items[i]
-
-				mtls := "off"
-				if mesh.MTLSEnabled() {
-					backend := mesh.GetEnabledCertificateAuthorityBackend()
-					mtls = fmt.Sprintf("%s/%s", backend.Type, backend.Name)
-				}
-
-				metrics := "off"
-				if mesh.Spec.GetMetrics().GetEnabledBackend() != "" {
-					backend := mesh.GetEnabledMetricsBackend()
-					metrics = fmt.Sprintf("%s/%s", backend.Type, backend.Name)
-				}
-				logging := "off"
-				if mesh.Spec.GetLogging() != nil {
-					logging = mesh.GetLoggingBackends()
-					if len(logging) == 0 {
-						logging = "off"
-					}
-				}
-				tracing := "off"
-				if mesh.Spec.GetTracing() != nil {
-					tracing = mesh.GetTracingBackends()
-					if len(tracing) == 0 {
-						tracing = "off"
-					}
-				}
-				locality := "off"
-				if mesh.Spec.GetRouting().GetLocalityAwareLoadBalancing() {
-					locality = "on"
-				}
-				return []string{
-					mesh.GetMeta().GetName(), // NAME
-					mtls,                     // mTLS
-					metrics,                  // METRICS
-					logging,                  // LOGGING
-					tracing,                  // TRACING
-					locality,                 // LOCALITY
-					table.TimeSince(mesh.GetMeta().GetModificationTime(), rootTime), // AGE
-				}
-			}
-		}(),
-		Footer: table.PaginationFooter(meshes),
-	}
-	return printers.NewTablePrinter().Print(data, out)
-}
diff --git a/app/kumactl/cmd/get/table_printer.go b/app/kumactl/cmd/get/table_printer.go
index e80a2268f..eaea88a43 100644
--- a/app/kumactl/cmd/get/table_printer.go
+++ b/app/kumactl/cmd/get/table_printer.go
@@ -1,45 +1,103 @@
 package get
 
 import (
+	"fmt"
 	"io"
 	"time"
 
 	"github.com/kumahq/kuma/app/kumactl/pkg/output/printers"
 	"github.com/kumahq/kuma/app/kumactl/pkg/output/table"
+	"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
 	"github.com/kumahq/kuma/pkg/core/resources/model"
 )
 
-type TablePrinter = func(time.Time, model.ResourceList, io.Writer) error
+// CustomTablePrinters are used to define different ways to print entities in table format.
+var CustomTablePrinters = map[model.ResourceType]TablePrinter{
+	mesh.DataplaneType: RowPrinter{
+		Headers: []string{"MESH", "NAME", "TAGS", "AGE"},
+		RowFn: func(rootTime time.Time, item model.Resource) []string {
+			dataplane := item.(*mesh.DataplaneResource)
+			return []string{
+				dataplane.Meta.GetMesh(),                                        // MESH
+				dataplane.Meta.GetName(),                                        // NAME,
+				dataplane.Spec.TagSet().String(),                                // TAGS
+				table.TimeSince(dataplane.Meta.GetModificationTime(), rootTime), // AGE
+			}
+		},
+	},
+	mesh.ExternalServiceType: RowPrinter{
+		Headers: []string{"MESH", "NAME", "TAGS", "ADDRESS", "AGE"},
+		RowFn: func(rootTime time.Time, item model.Resource) []string {
+			externalService := item.(*mesh.ExternalServiceResource)
+			return []string{
+				externalService.Meta.GetMesh(),                                        // MESH
+				externalService.Meta.GetName(),                                        // NAME,
+				externalService.Spec.TagSet().String(),                                // TAGS
+				externalService.Spec.Networking.Address,                               // ADDRESS
+				table.TimeSince(externalService.Meta.GetModificationTime(), rootTime), // AGE
+			}
+		},
+	},
+	model.ScopeMesh: RowPrinter{
+		Headers: []string{"NAME", "mTLS", "METRICS", "LOGGING", "TRACING", "LOCALITY", "AGE"},
+		RowFn: func(rootTime time.Time, item model.Resource) []string {
+			mesh := item.(*mesh.MeshResource)
 
-func BasicResourceTablePrinter(rootTime time.Time, resources model.ResourceList, out io.Writer) error {
-	items := resources.GetItems()
-	data := printers.Table{
-		Headers: []string{"MESH", "NAME", "AGE"},
-		NextRow: func() func() []string {
-			i := 0
-			return func() []string {
-				defer func() { i++ }()
-				if len(items) <= i {
-					return nil
-				}
-				item := items[i]
+			mtls := "off"
+			if mesh.MTLSEnabled() {
+				backend := mesh.GetEnabledCertificateAuthorityBackend()
+				mtls = fmt.Sprintf("%s/%s", backend.Type, backend.Name)
+			}
 
-				return []string{
-					item.GetMeta().GetMesh(), // MESH
-					item.GetMeta().GetName(), // NAME
-					table.TimeSince(item.GetMeta().GetModificationTime(), rootTime), // AGE
+			metrics := "off"
+			if mesh.Spec.GetMetrics().GetEnabledBackend() != "" {
+				backend := mesh.GetEnabledMetricsBackend()
+				metrics = fmt.Sprintf("%s/%s", backend.Type, backend.Name)
+			}
+			logging := "off"
+			if mesh.Spec.GetLogging() != nil {
+				logging = mesh.GetLoggingBackends()
+				if len(logging) == 0 {
+					logging = "off"
 				}
 			}
-		}(),
-		Footer: table.PaginationFooter(resources),
-	}
-	return printers.NewTablePrinter().Print(data, out)
+			tracing := "off"
+			if mesh.Spec.GetTracing() != nil {
+				tracing = mesh.GetTracingBackends()
+				if len(tracing) == 0 {
+					tracing = "off"
+				}
+			}
+			locality := "off"
+			if mesh.Spec.GetRouting().GetLocalityAwareLoadBalancing() {
+				locality = "on"
+			}
+			return []string{
+				mesh.GetMeta().GetName(), // NAME
+				mtls,                     // mTLS
+				metrics,                  // METRICS
+				logging,                  // LOGGING
+				tracing,                  // TRACING
+				locality,                 // LOCALITY
+				table.TimeSince(mesh.GetMeta().GetModificationTime(), rootTime), // AGE
+			}
+		},
+	},
 }
 
-func BasicGlobalResourceTablePrinter(rootTime time.Time, resources model.ResourceList, out io.Writer) error {
+type TablePrinter interface {
+	Print(time.Time, model.ResourceList, io.Writer) error
+}
+
+type RowPrinter struct {
+	Headers []string
+	RowFn   func(rootTime time.Time, item model.Resource) []string
+}
+
+func (rp RowPrinter) Print(rootTime time.Time, resources model.ResourceList, out io.Writer) error {
 	items := resources.GetItems()
 	data := printers.Table{
-		Headers: []string{"NAME", "AGE"},
+		Headers: rp.Headers,
 		NextRow: func() func() []string {
 			i := 0
 			return func() []string {
@@ -47,15 +105,44 @@ func BasicGlobalResourceTablePrinter(rootTime time.Time, resources model.Resourc
 				if len(items) <= i {
 					return nil
 				}
-				item := items[i]
-
-				return []string{
-					item.GetMeta().GetName(), // NAME
-					table.TimeSince(item.GetMeta().GetModificationTime(), rootTime), // AGE
-				}
+				return rp.RowFn(rootTime, items[i])
 			}
 		}(),
 		Footer: table.PaginationFooter(resources),
 	}
 	return printers.NewTablePrinter().Print(data, out)
 }
+
+var BasicResourceTablePrinter = RowPrinter{
+	Headers: []string{"MESH", "NAME", "AGE"},
+	RowFn: func(rootTime time.Time, item model.Resource) []string {
+		return []string{
+			item.GetMeta().GetMesh(), // MESH
+			item.GetMeta().GetName(), // NAME
+			table.TimeSince(item.GetMeta().GetModificationTime(), rootTime), // AGE
+		}
+	},
+}
+
+var BasicGlobalResourceTablePrinter = RowPrinter{
+	Headers: []string{"NAME", "AGE"},
+	RowFn: func(rootTime time.Time, item model.Resource) []string {
+		return []string{
+			item.GetMeta().GetName(), // NAME
+			table.TimeSince(item.GetMeta().GetModificationTime(), rootTime), // AGE
+		}
+	},
+}
+
+func ResolvePrinter(resourceType model.ResourceType, scope model.ResourceScope) TablePrinter {
+	tablePrinter := CustomTablePrinters[resourceType]
+	if tablePrinter == nil {
+		switch scope {
+		case model.ScopeMesh:
+			tablePrinter = BasicResourceTablePrinter
+		case model.ScopeGlobal:
+			tablePrinter = BasicGlobalResourceTablePrinter
+		}
+	}
+	return tablePrinter
+}
diff --git a/app/kumactl/cmd/get/zones_table_printer.go b/app/kumactl/cmd/get/zones_table_printer.go
deleted file mode 100644
index 4bdca1905..000000000
--- a/app/kumactl/cmd/get/zones_table_printer.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package get
-
-import (
-	"io"
-	"time"
-
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/printers"
-	"github.com/kumahq/kuma/app/kumactl/pkg/output/table"
-	"github.com/kumahq/kuma/pkg/core/resources/apis/system"
-	"github.com/kumahq/kuma/pkg/core/resources/model"
-)
-
-func printZones(rootTime time.Time, resources model.ResourceList, out io.Writer) error {
-	zones := resources.(*system.ZoneResourceList)
-	data := printers.Table{
-		Headers: []string{"NAME", "AGE"},
-		NextRow: func() func() []string {
-			i := 0
-			return func() []string {
-				defer func() { i++ }()
-				if len(zones.Items) <= i {
-					return nil
-				}
-				zone := zones.Items[i]
-
-				return []string{
-					zone.GetMeta().GetName(), // NAME
-					table.TimeSince(zone.GetMeta().GetModificationTime(), rootTime), // AGE
-				}
-			}
-		}(),
-		Footer: table.PaginationFooter(zones),
-	}
-	return printers.NewTablePrinter().Print(data, out)
-}
diff --git a/app/kumactl/pkg/cmd/root_context.go b/app/kumactl/pkg/cmd/root_context.go
index 8eb80b7b1..898c3e1f0 100644
--- a/app/kumactl/pkg/cmd/root_context.go
+++ b/app/kumactl/pkg/cmd/root_context.go
@@ -12,8 +12,6 @@ import (
 	kumactl_resources "github.com/kumahq/kuma/app/kumactl/pkg/resources"
 	"github.com/kumahq/kuma/app/kumactl/pkg/tokens"
 	config_proto "github.com/kumahq/kuma/pkg/config/app/kumactl/v1alpha1"
-	core_mesh "github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
-	"github.com/kumahq/kuma/pkg/core/resources/apis/system"
 	core_model "github.com/kumahq/kuma/pkg/core/resources/model"
 	core_store "github.com/kumahq/kuma/pkg/core/resources/store"
 	util_files "github.com/kumahq/kuma/pkg/util/files"
@@ -45,7 +43,6 @@ type RootRuntime struct {
 // rootCmd := cmd.NewRootCmd(rootCtx)
 // err := rootCmd.Execute()
 type RootContext struct {
-	TypeArgs                            map[string]core_model.ResourceType
 	Args                                RootArgs
 	Runtime                             RootRuntime
 	GetContext                          get_context.GetContext
@@ -73,25 +70,6 @@ func DefaultRootContext() *RootContext {
 			NewZoneIngressTokenClient:    tokens.NewZoneIngressTokenClient,
 			NewAPIServerClient:           kumactl_resources.NewAPIServerClient,
 		},
-		TypeArgs: map[string]core_model.ResourceType{
-			"circuit-breaker":    core_mesh.CircuitBreakerType,
-			"dataplane":          core_mesh.DataplaneType,
-			"external-service":   core_mesh.ExternalServiceType,
-			"fault-injection":    core_mesh.FaultInjectionType,
-			"healthcheck":        core_mesh.HealthCheckType,
-			"mesh":               core_mesh.MeshType,
-			"proxytemplate":      core_mesh.ProxyTemplateType,
-			"rate-limit":         core_mesh.RateLimitType,
-			"retry":              core_mesh.RetryType,
-			"timeout":            core_mesh.TimeoutType,
-			"traffic-log":        core_mesh.TrafficLogType,
-			"traffic-permission": core_mesh.TrafficPermissionType,
-			"traffic-route":      core_mesh.TrafficRouteType,
-			"traffic-trace":      core_mesh.TrafficTraceType,
-			"global-secret":      system.GlobalSecretType,
-			"secret":             system.SecretType,
-			"zone":               system.ZoneType,
-		},
 		InstallCpContext:                    install_context.DefaultInstallCpContext(),
 		InstallCRDContext:                   install_context.DefaultInstallCrdsContext(),
 		InstallMetricsContext:               install_context.DefaultInstallMetricsContext(),
@@ -102,18 +80,6 @@ func DefaultRootContext() *RootContext {
 	}
 }
 
-func (rc *RootContext) TypeForArg(arg string) (core_model.ResourceType, error) {
-	typ, ok := rc.TypeArgs[arg]
-	if !ok {
-		allowedValues := ""
-		for v := range rc.TypeArgs {
-			allowedValues += v + ", "
-		}
-		return "", errors.Errorf("unknown TYPE: %s. Allowed values: %s:", arg, allowedValues)
-	}
-	return typ, nil
-}
-
 func (rc *RootContext) LoadConfig() error {
 	return config.Load(rc.Args.ConfigFile, &rc.Runtime.Config)
 }
diff --git a/app/kumactl/pkg/config/defualt.go b/app/kumactl/pkg/config/default.go
similarity index 100%
rename from app/kumactl/pkg/config/defualt.go
rename to app/kumactl/pkg/config/default.go
diff --git a/app/kumactl/pkg/entities/entities.go b/app/kumactl/pkg/entities/entities.go
new file mode 100644
index 000000000..c11d3b6b0
--- /dev/null
+++ b/app/kumactl/pkg/entities/entities.go
@@ -0,0 +1,33 @@
+package entities
+
+import (
+	core_system "github.com/kumahq/kuma/pkg/core/resources/apis/system"
+	"github.com/kumahq/kuma/pkg/core/resources/model"
+)
+
+type Definition struct {
+	Singular     string
+	Plural       string
+	ResourceType model.ResourceType
+	ReadOnly     bool
+}
+
+var All []Definition
+var Names []string
+var ByName = map[string]Definition{}
+
+func init() {
+	All = append(All, meshEntities...)
+	All = append(All, systemEntities...)
+	All = append(All, Definition{Singular: "global-secret", Plural: "global-secrets", ResourceType: core_system.GlobalSecretType})
+
+	for i := range All {
+		if All[i].Singular == "health-check" {
+			// Preserving incoherency between kumactl and the web-service.
+			All[i].Singular = "healthcheck"
+			All[i].Plural = "healthchecks"
+		}
+		ByName[All[i].Singular] = All[i]
+		Names = append(Names, All[i].Singular)
+	}
+}
diff --git a/app/kumactl/pkg/entities/generated_mesh_entities.go b/app/kumactl/pkg/entities/generated_mesh_entities.go
new file mode 100644
index 000000000..2eebca546
--- /dev/null
+++ b/app/kumactl/pkg/entities/generated_mesh_entities.go
@@ -0,0 +1,116 @@
+// Generated by tools/resource-gen.
+// Run "make generate" to update this file.
+// nolint:whitespace
+package entities
+
+import (
+	"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
+)
+
+var meshEntities = []Definition{
+
+	{
+		Singular:     "circuit-breaker",
+		Plural:       "circuit-breakers",
+		ResourceType: mesh.CircuitBreakerType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "dataplane",
+		Plural:       "dataplanes",
+		ResourceType: mesh.DataplaneType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "external-service",
+		Plural:       "external-services",
+		ResourceType: mesh.ExternalServiceType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "fault-injection",
+		Plural:       "fault-injections",
+		ResourceType: mesh.FaultInjectionType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "health-check",
+		Plural:       "health-checks",
+		ResourceType: mesh.HealthCheckType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "mesh",
+		Plural:       "meshes",
+		ResourceType: mesh.MeshType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "proxytemplate",
+		Plural:       "proxytemplates",
+		ResourceType: mesh.ProxyTemplateType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "rate-limit",
+		Plural:       "rate-limits",
+		ResourceType: mesh.RateLimitType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "retry",
+		Plural:       "retries",
+		ResourceType: mesh.RetryType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "timeout",
+		Plural:       "timeouts",
+		ResourceType: mesh.TimeoutType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "traffic-log",
+		Plural:       "traffic-logs",
+		ResourceType: mesh.TrafficLogType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "traffic-permission",
+		Plural:       "traffic-permissions",
+		ResourceType: mesh.TrafficPermissionType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "traffic-route",
+		Plural:       "traffic-routes",
+		ResourceType: mesh.TrafficRouteType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "traffic-trace",
+		Plural:       "traffic-traces",
+		ResourceType: mesh.TrafficTraceType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "zone-ingress",
+		Plural:       "zone-ingresses",
+		ResourceType: mesh.ZoneIngressType,
+		ReadOnly:     false,
+	},
+}
diff --git a/app/kumactl/pkg/entities/generated_system_entities.go b/app/kumactl/pkg/entities/generated_system_entities.go
new file mode 100644
index 000000000..3be80b6ba
--- /dev/null
+++ b/app/kumactl/pkg/entities/generated_system_entities.go
@@ -0,0 +1,25 @@
+// Generated by tools/resource-gen.
+// Run "make generate" to update this file.
+// nolint:whitespace
+package entities
+
+import (
+	"github.com/kumahq/kuma/pkg/core/resources/apis/system"
+)
+
+var systemEntities = []Definition{
+
+	{
+		Singular:     "secret",
+		Plural:       "secrets",
+		ResourceType: system.SecretType,
+		ReadOnly:     false,
+	},
+
+	{
+		Singular:     "zone",
+		Plural:       "zones",
+		ResourceType: system.ZoneType,
+		ReadOnly:     false,
+	},
+}
diff --git a/docs/cmd/kumactl/kumactl_get_global-secrets.md b/docs/cmd/kumactl/kumactl_get_global-secrets.md
index 512174c7d..c4ef1b66b 100644
--- a/docs/cmd/kumactl/kumactl_get_global-secrets.md
+++ b/docs/cmd/kumactl/kumactl_get_global-secrets.md
@@ -13,7 +13,9 @@ kumactl get global-secrets [flags]
 ### Options
 
 ```
-  -h, --help   help for global-secrets
+  -h, --help            help for global-secrets
+      --offset string   the offset that indicates starting element of the resources list to retrieve
+      --size int        maximum number of elements to return
 ```
 
 ### Options inherited from parent commands
diff --git a/docs/cmd/kumactl/kumactl_get_secrets.md b/docs/cmd/kumactl/kumactl_get_secrets.md
index e3cb39e89..058e1487a 100644
--- a/docs/cmd/kumactl/kumactl_get_secrets.md
+++ b/docs/cmd/kumactl/kumactl_get_secrets.md
@@ -13,7 +13,9 @@ kumactl get secrets [flags]
 ### Options
 
 ```
-  -h, --help   help for secrets
+  -h, --help            help for secrets
+      --offset string   the offset that indicates starting element of the resources list to retrieve
+      --size int        maximum number of elements to return
 ```
 
 ### Options inherited from parent commands
diff --git a/mk/generate.mk b/mk/generate.mk
index 11058ad42..c9505edab 100644
--- a/mk/generate.mk
+++ b/mk/generate.mk
@@ -23,16 +23,20 @@ clean/proto: ## Dev: Remove auto-generated Protobuf files
 
 .PHONY: generate
 generate:  ## Dev: Run code generators
-generate: clean/proto protoc/pkg/config/app/kumactl/v1alpha1 protoc/pkg/test/apis/sample/v1alpha1 protoc/plugins resources/type resources/ws generate/deepcopy
+generate: clean/proto protoc/pkg/config/app/kumactl/v1alpha1 protoc/pkg/test/apis/sample/v1alpha1 protoc/plugins resources/type resources/ws resources/kumactl generate/deepcopy
 
-.PHONY: resources/mesh
+.PHONY: resources/type
 resources/type:
 	$(GO_RUN) ./tools/resource-gen.go -generator type
 
-.PHONY: resources/mesh
+.PHONY: resources/ws
 resources/ws:
 	$(GO_RUN) ./tools/resource-gen.go -generator ws
 
+.PHONY: resources/kumactl
+resources/kumactl:
+	$(GO_RUN) ./tools/resource-gen.go -generator kumactl
+
 .PHONY: protoc/pkg/config/app/kumactl/v1alpha1
 protoc/pkg/config/app/kumactl/v1alpha1:
 	$(PROTOC_GO) pkg/config/app/kumactl/v1alpha1/*.proto
diff --git a/pkg/plugins/runtime/gateway/kumactl/plugin.go b/pkg/plugins/runtime/gateway/kumactl/plugin.go
index 9657d40a5..382890a72 100644
--- a/pkg/plugins/runtime/gateway/kumactl/plugin.go
+++ b/pkg/plugins/runtime/gateway/kumactl/plugin.go
@@ -3,8 +3,8 @@ package kumactl
 import (
 	"github.com/spf13/cobra"
 
-	kumactl_get "github.com/kumahq/kuma/app/kumactl/cmd/get"
 	kumactl_cmd "github.com/kumahq/kuma/app/kumactl/pkg/cmd"
+	"github.com/kumahq/kuma/app/kumactl/pkg/entities"
 	"github.com/kumahq/kuma/pkg/api-server/definitions"
 	core_mesh "github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
 	"github.com/kumahq/kuma/pkg/core/resources/registry"
@@ -27,21 +27,12 @@ func (p *Plugin) CustomizeContext(root *kumactl_cmd.RootContext) {
 			Path: "gateways",
 		},
 	)
-
-	root.TypeArgs["gateway"] = core_mesh.GatewayType
+	entities.All = append(entities.All, entities.Definition{
+		Singular:     "gateway",
+		Plural:       "gateways",
+		ResourceType: core_mesh.GatewayType,
+	})
 }
 
-func (p *Plugin) CustomizeCommand(root *cobra.Command) {
-	get := kumactl_cmd.FindSubCommand(root, "get")
-
-	get.AddCommand(
-		kumactl_get.WithPaginationArgs(
-			kumactl_get.NewGetResourcesCmd(p.rootContext, "gateways", core_mesh.GatewayType, kumactl_get.BasicResourceTablePrinter),
-			&p.rootContext.ListContext,
-		),
-	)
-
-	get.AddCommand(
-		kumactl_get.NewGetResourceCmd(p.rootContext, "gateway", core_mesh.GatewayType, kumactl_get.BasicResourceTablePrinter),
-	)
+func (p *Plugin) CustomizeCommand(_ *cobra.Command) {
 }
diff --git a/tools/resource-gen.go b/tools/resource-gen.go
index 4f0f05b29..ca760e6d1 100644
--- a/tools/resource-gen.go
+++ b/tools/resource-gen.go
@@ -19,7 +19,28 @@ import (
 	_ "github.com/kumahq/kuma/api/mesh/v1alpha1"
 )
 
-var WsResourceTemplate = template.Must(template.New("ws-resource").Parse(`
+var KumactlEntitiesTemplate = template.Must(template.New("kumactl").Parse(`
+// Generated by tools/resource-gen.
+// Run "make generate" to update this file.
+// nolint:whitespace
+package entities
+import (
+	"github.com/kumahq/kuma/pkg/core/resources/apis/{{.Package}}"
+)
+{{$pkg := .Package}}
+var {{.Package}}Entities = []Definition{
+	{{range .Resources}}{{if not .SkipKumactl }}
+	{
+		Singular: "{{.KumactlSingular}}",
+		Plural: "{{.KumactlPlural}}",
+		ResourceType: {{$pkg}}.{{.ResourceType}}Type,
+		ReadOnly: {{.WsReadOnly}},
+	},
+	{{end}}{{end}}
+}
+`))
+
+var WsResourceTemplate = template.Must(template.New("ws").Parse(`
 // Generated by tools/resource-gen.
 // Run "make generate" to update this file.
 
@@ -32,14 +53,14 @@ import (
 
 {{$pkg := .Package}}
 var {{.Package}}WsDefinitions = []ResourceWsDefinition{
-	{{range .Resources}}{{if ne .WsPath ""}}{{if not .SkipRegistration }}
+	{{range .Resources}}{{if not .SkipWs}}
 	{
 		Type: {{$pkg}}.{{.ResourceType}}Type,
 		Path: "{{.WsPath}}",
-		AdminOnly: {{.WsIsAdmin}},
-		ReadOnly: {{.WsIsReadOnly}},
+		AdminOnly: {{.WsAdminOnly}},
+		ReadOnly: {{.WsReadOnly}},
 	},
-	{{end}} {{end}}{{end}}
+	{{end}}{{end}}
 }
 `))
 
@@ -171,19 +192,14 @@ func init() {
 `))
 
 // KumaResourceForMessage fetches the Kuma resource option out of a message.
-func KumaResourceForMessage(m protoreflect.MessageType) (*mesh.KumaResourceOptions, *mesh.KumaWsOptions) {
+func KumaResourceForMessage(m protoreflect.MessageType) *mesh.KumaResourceOptions {
 	ext := proto.GetExtension(m.Descriptor().Options(), mesh.E_Resource)
 	var resOption *mesh.KumaResourceOptions
 	if r, ok := ext.(*mesh.KumaResourceOptions); ok {
 		resOption = r
 	}
-	ext = proto.GetExtension(m.Descriptor().Options(), mesh.E_Ws)
-	var wsOption *mesh.KumaWsOptions
-	if r, ok := ext.(*mesh.KumaWsOptions); ok {
-		wsOption = r
-	}
 
-	return resOption, wsOption
+	return resOption
 }
 
 // SelectorsForMessage finds all the top-level fields in the message are
@@ -212,13 +228,17 @@ type ResourceInfo struct {
 	SkipRegistration bool
 	SkipValidation   bool
 	Global           bool
-	WsIsReadOnly     bool
+	SkipKumactl      bool
+	KumactlSingular  string
+	KumactlPlural    string
+	SkipWs           bool
+	WsReadOnly       bool
 	WsPath           string
-	WsIsAdmin        bool
+	WsAdminOnly      bool
 }
 
 func ToResourceInfo(m protoreflect.MessageType) ResourceInfo {
-	r, ws := KumaResourceForMessage(m)
+	r := KumaResourceForMessage(m)
 
 	out := ResourceInfo{
 		ResourceType:     r.Type,
@@ -228,15 +248,21 @@ func ToResourceInfo(m protoreflect.MessageType) ResourceInfo {
 		SkipRegistration: r.SkipRegistration,
 		SkipValidation:   r.SkipValidation,
 		Global:           r.Global,
+		SkipWs:           true,
+		SkipKumactl:      true,
 	}
-	if ws != nil {
-		pluralResourceName := ws.Plural
+	if r.Ws != nil {
+		pluralResourceName := r.Ws.Plural
 		if pluralResourceName == "" {
-			pluralResourceName = ws.Name + "s"
+			pluralResourceName = r.Ws.Name + "s"
 		}
-		out.WsIsReadOnly = ws.ReadOnly
-		out.WsIsAdmin = ws.AdminOnly
+		out.WsReadOnly = r.Ws.ReadOnly
+		out.WsAdminOnly = r.Ws.AdminOnly
 		out.WsPath = pluralResourceName
+		out.KumactlSingular = r.Ws.Name
+		out.KumactlPlural = pluralResourceName
+		out.SkipWs = out.WsPath == "" || out.SkipRegistration
+		out.SkipKumactl = out.SkipWs || out.WsReadOnly
 	}
 
 	if p := m.Descriptor().Parent(); p != nil {
@@ -253,7 +279,7 @@ type ProtoMessageFunc func(protoreflect.MessageType) bool
 // OnKumaResourceMessage ...
 func OnKumaResourceMessage(pkg string, f ProtoMessageFunc) ProtoMessageFunc {
 	return func(m protoreflect.MessageType) bool {
-		r, _ := KumaResourceForMessage(m)
+		r := KumaResourceForMessage(m)
 		if r == nil {
 			return true
 		}
@@ -268,7 +294,7 @@ func OnKumaResourceMessage(pkg string, f ProtoMessageFunc) ProtoMessageFunc {
 
 func main() {
 	var gen string
-	flag.StringVar(&gen, "generator", "", "the type of generator to run options: (type,ws)")
+	flag.StringVar(&gen, "generator", "", "the type of generator to run options: (type,ws,kumactl)")
 	flag.Parse()
 
 	for _, pkg := range []string{"system", "mesh"} {
@@ -290,15 +316,19 @@ func main() {
 			resourceInfo := ToResourceInfo(t)
 			resources = append(resources, resourceInfo)
 		}
+
 		globalTemplates := map[string]*template.Template{}
 		switch gen {
 		case "type":
 			globalTemplates[path.Join(apisPath, "generated_resources.go")] = ResourceTemplate
 		case "ws":
 			globalTemplates[path.Join("pkg/api-server/definitions", fmt.Sprintf("generated_%s_definitions.go", pkg))] = WsResourceTemplate
+		case "kumactl":
+			globalTemplates[path.Join("app/kumactl/pkg/entities", fmt.Sprintf("generated_%s_entities.go", pkg))] = KumactlEntitiesTemplate
 		default:
 			panic(fmt.Sprintf("%s is not a valid generator option\n", gen))
 		}
+
 		for filename, tmpl := range globalTemplates {
 			outBuf := bytes.Buffer{}
 			if err := tmpl.Execute(&outBuf, struct {


Test patch:
diff --git a/app/kumactl/cmd/completion/testdata/bash.golden b/app/kumactl/cmd/completion/testdata/bash.golden
index 8002d6421..9ab2546c7 100644
--- a/app/kumactl/cmd/completion/testdata/bash.golden
+++ b/app/kumactl/cmd/completion/testdata/bash.golden
@@ -1243,6 +1243,10 @@ _kumactl_get_global-secrets()
     flags_with_completion=()
     flags_completion=()
 
+    flags+=("--offset=")
+    two_word_flags+=("--offset")
+    flags+=("--size=")
+    two_word_flags+=("--size")
     flags+=("--config-file=")
     two_word_flags+=("--config-file")
     flags+=("--log-level=")
@@ -1635,6 +1639,10 @@ _kumactl_get_secrets()
     flags_with_completion=()
     flags_completion=()
 
+    flags+=("--offset=")
+    two_word_flags+=("--offset")
+    flags+=("--size=")
+    two_word_flags+=("--size")
     flags+=("--config-file=")
     two_word_flags+=("--config-file")
     flags+=("--log-level=")
diff --git a/app/kumactl/cmd/get/get_test.go b/app/kumactl/cmd/get/get_test.go
index de35a5eff..d50ed93dc 100644
--- a/app/kumactl/cmd/get/get_test.go
+++ b/app/kumactl/cmd/get/get_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/kumahq/kuma/app/kumactl/cmd"
 	kumactl_cmd "github.com/kumahq/kuma/app/kumactl/pkg/cmd"
+	"github.com/kumahq/kuma/app/kumactl/pkg/entities"
 	config_proto "github.com/kumahq/kuma/pkg/config/app/kumactl/v1alpha1"
 	core_store "github.com/kumahq/kuma/pkg/core/resources/store"
 	memory_resources "github.com/kumahq/kuma/pkg/plugins/resources/memory"
@@ -48,11 +49,11 @@ var _ = Describe("kumactl get ", func() {
 
 		It("should have get commands for all defined types", func() {
 			// when
-			Expect(len(getCmd.Commands()) > len(rootCtx.TypeArgs)).To(BeTrue())
+			Expect(len(getCmd.Commands()) > len(entities.Names)).To(BeTrue())
 
 			// then
-			for sub := range rootCtx.TypeArgs {
-				Expect(hasSubCommand(getCmd, sub+" NAME")).To(BeTrue(), "failing to find "+sub)
+			for _, sub := range entities.All {
+				Expect(hasSubCommand(getCmd, sub.Singular+" NAME")).To(BeTrue(), "failing to find "+sub.Singular)
 			}
 		})
 	})