Repository: clouditor/clouditor
Pull request #429 (2021-12-20 11:03:14)

Refactor according to MEDINA workflow
Address #419 (adapt according to Medina Workflow), #425 (fix operator and target value in assessment result) and #464 (add RPC `ListAssessmentResult` in Orchestrator)

codecov[bot]: # [Codecov](https://codecov.io/gh/clouditor/clouditor/pull/429?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) Report
> Merging [#429](https://codecov.io/gh/clouditor/clouditor/pull/429?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) (072ed69) into [main](https://codecov.io/gh/clouditor/clouditor/commit/63a2871e53959831e231407888930fcc059af5c1?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) (63a2871) will **increase** coverage by `0.12%`.
> The diff coverage is `95.45%`.

> :exclamation: Current head 072ed69 differs from pull request most recent head f636b27. Consider uploading reports for the commit f636b27 to get more accurate results
[![Impacted file tree graph](https://codecov.io/gh/clouditor/clouditor/pull/429/graphs/tree.svg?width=650&height=150&src=pr&token=syrXsw5LTX&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor)](https://codecov.io/gh/clouditor/clouditor/pull/429?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor)

```diff
@@            Coverage Diff             @@
##             main     #429      +/-   ##
==========================================
+ Coverage   68.73%   68.85%   +0.12%     
==========================================
  Files          39       39              
  Lines        3518     3535      +17     
==========================================
+ Hits         2418     2434      +16     
- Misses        977      978       +1     
  Partials      123      123              
```

| Flag | Coverage Δ | |
|---|---|---|
| unittests | `68.85% <95.45%> (+0.12%)` | :arrow_up: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/clouditor/clouditor/pull/429?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) | Coverage Δ | |
|---|---|---|
| [service/assessment/assessment.go](https://codecov.io/gh/clouditor/clouditor/pull/429/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-c2VydmljZS9hc3Nlc3NtZW50L2Fzc2Vzc21lbnQuZ28=) | `87.50% <95.00%> (+1.26%)` | :arrow_up: |
| [service/discovery/discovery.go](https://codecov.io/gh/clouditor/clouditor/pull/429/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-c2VydmljZS9kaXNjb3ZlcnkvZGlzY292ZXJ5Lmdv) | `48.68% <100.00%> (-0.67%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/clouditor/clouditor/pull/429?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor).
> **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=clouditor)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/clouditor/clouditor/pull/429?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor). Last update [63a2871...f636b27](https://codecov.io/gh/clouditor/clouditor/pull/429?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor). 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=clouditor).

lebogg: I have removed the go:generate command in `rest.go` and add the grpc gateway parameter to each single command into `compile_proto_files.go`. The reason is that `--grpc-gateway_opt=Massessment.proto=clouditor.io/clouditor/api/assessment` was not working correctly: It created a new folder `clouditor.io/clouditor` instead of just naming the imported package accodringly in the orchestrator generated file.

We need that option since now both, Orchestrator and Assessment, have the RPC `ListAssessmentResults` which share the same request and response type. Of course, we could also use different types. But I think for now they just deliver assessment results with no further properties attached to it. In the future, Orchestrator may also add the respective tool_id to it.

Patch:
diff --git a/api/assessment/assessment.pb.go b/api/assessment/assessment.pb.go
index c30570d5..f0cc2acc 100644
--- a/api/assessment/assessment.pb.go
+++ b/api/assessment/assessment.pb.go
@@ -50,16 +50,14 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
-type TriggerAssessmentRequest struct {
+type ListAssessmentResultsRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
-
-	SomeOption string `protobuf:"bytes,1,opt,name=someOption,proto3" json:"someOption,omitempty"`
 }
 
-func (x *TriggerAssessmentRequest) Reset() {
-	*x = TriggerAssessmentRequest{}
+func (x *ListAssessmentResultsRequest) Reset() {
+	*x = ListAssessmentResultsRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_assessment_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -67,13 +65,13 @@ func (x *TriggerAssessmentRequest) Reset() {
 	}
 }
 
-func (x *TriggerAssessmentRequest) String() string {
+func (x *ListAssessmentResultsRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*TriggerAssessmentRequest) ProtoMessage() {}
+func (*ListAssessmentResultsRequest) ProtoMessage() {}
 
-func (x *TriggerAssessmentRequest) ProtoReflect() protoreflect.Message {
+func (x *ListAssessmentResultsRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_assessment_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -85,26 +83,21 @@ func (x *TriggerAssessmentRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use TriggerAssessmentRequest.ProtoReflect.Descriptor instead.
-func (*TriggerAssessmentRequest) Descriptor() ([]byte, []int) {
+// Deprecated: Use ListAssessmentResultsRequest.ProtoReflect.Descriptor instead.
+func (*ListAssessmentResultsRequest) Descriptor() ([]byte, []int) {
 	return file_assessment_proto_rawDescGZIP(), []int{0}
 }
 
-func (x *TriggerAssessmentRequest) GetSomeOption() string {
-	if x != nil {
-		return x.SomeOption
-	}
-	return ""
-}
-
-type ListAssessmentResultsRequest struct {
+type ListAssessmentResultsResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
+
+	Results []*AssessmentResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
 }
 
-func (x *ListAssessmentResultsRequest) Reset() {
-	*x = ListAssessmentResultsRequest{}
+func (x *ListAssessmentResultsResponse) Reset() {
+	*x = ListAssessmentResultsResponse{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_assessment_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -112,13 +105,13 @@ func (x *ListAssessmentResultsRequest) Reset() {
 	}
 }
 
-func (x *ListAssessmentResultsRequest) String() string {
+func (x *ListAssessmentResultsResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*ListAssessmentResultsRequest) ProtoMessage() {}
+func (*ListAssessmentResultsResponse) ProtoMessage() {}
 
-func (x *ListAssessmentResultsRequest) ProtoReflect() protoreflect.Message {
+func (x *ListAssessmentResultsResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_assessment_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -130,21 +123,26 @@ func (x *ListAssessmentResultsRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use ListAssessmentResultsRequest.ProtoReflect.Descriptor instead.
-func (*ListAssessmentResultsRequest) Descriptor() ([]byte, []int) {
+// Deprecated: Use ListAssessmentResultsResponse.ProtoReflect.Descriptor instead.
+func (*ListAssessmentResultsResponse) Descriptor() ([]byte, []int) {
 	return file_assessment_proto_rawDescGZIP(), []int{1}
 }
 
-type ListAssessmentResultsResponse struct {
+func (x *ListAssessmentResultsResponse) GetResults() []*AssessmentResult {
+	if x != nil {
+		return x.Results
+	}
+	return nil
+}
+
+type ConfigureAssessmentRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
-
-	Results []*AssessmentResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
 }
 
-func (x *ListAssessmentResultsResponse) Reset() {
-	*x = ListAssessmentResultsResponse{}
+func (x *ConfigureAssessmentRequest) Reset() {
+	*x = ConfigureAssessmentRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_assessment_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -152,13 +150,13 @@ func (x *ListAssessmentResultsResponse) Reset() {
 	}
 }
 
-func (x *ListAssessmentResultsResponse) String() string {
+func (x *ConfigureAssessmentRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*ListAssessmentResultsResponse) ProtoMessage() {}
+func (*ConfigureAssessmentRequest) ProtoMessage() {}
 
-func (x *ListAssessmentResultsResponse) ProtoReflect() protoreflect.Message {
+func (x *ConfigureAssessmentRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_assessment_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -170,16 +168,94 @@ func (x *ListAssessmentResultsResponse) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use ListAssessmentResultsResponse.ProtoReflect.Descriptor instead.
-func (*ListAssessmentResultsResponse) Descriptor() ([]byte, []int) {
+// Deprecated: Use ConfigureAssessmentRequest.ProtoReflect.Descriptor instead.
+func (*ConfigureAssessmentRequest) Descriptor() ([]byte, []int) {
 	return file_assessment_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *ListAssessmentResultsResponse) GetResults() []*AssessmentResult {
+type ConfigureAssessmentResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ConfigureAssessmentResponse) Reset() {
+	*x = ConfigureAssessmentResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_assessment_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ConfigureAssessmentResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ConfigureAssessmentResponse) ProtoMessage() {}
+
+func (x *ConfigureAssessmentResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_assessment_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ConfigureAssessmentResponse.ProtoReflect.Descriptor instead.
+func (*ConfigureAssessmentResponse) Descriptor() ([]byte, []int) {
+	return file_assessment_proto_rawDescGZIP(), []int{3}
+}
+
+type TriggerAssessmentRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SomeOption string `protobuf:"bytes,1,opt,name=someOption,proto3" json:"someOption,omitempty"`
+}
+
+func (x *TriggerAssessmentRequest) Reset() {
+	*x = TriggerAssessmentRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_assessment_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TriggerAssessmentRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TriggerAssessmentRequest) ProtoMessage() {}
+
+func (x *TriggerAssessmentRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_assessment_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use TriggerAssessmentRequest.ProtoReflect.Descriptor instead.
+func (*TriggerAssessmentRequest) Descriptor() ([]byte, []int) {
+	return file_assessment_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *TriggerAssessmentRequest) GetSomeOption() string {
 	if x != nil {
-		return x.Results
+		return x.SomeOption
 	}
-	return nil
+	return ""
 }
 
 type AssessEvidenceRequest struct {
@@ -193,7 +269,7 @@ type AssessEvidenceRequest struct {
 func (x *AssessEvidenceRequest) Reset() {
 	*x = AssessEvidenceRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_assessment_proto_msgTypes[3]
+		mi := &file_assessment_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -206,7 +282,7 @@ func (x *AssessEvidenceRequest) String() string {
 func (*AssessEvidenceRequest) ProtoMessage() {}
 
 func (x *AssessEvidenceRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_assessment_proto_msgTypes[3]
+	mi := &file_assessment_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -219,7 +295,7 @@ func (x *AssessEvidenceRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssessEvidenceRequest.ProtoReflect.Descriptor instead.
 func (*AssessEvidenceRequest) Descriptor() ([]byte, []int) {
-	return file_assessment_proto_rawDescGZIP(), []int{3}
+	return file_assessment_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *AssessEvidenceRequest) GetEvidence() *evidence.Evidence {
@@ -240,7 +316,7 @@ type AssessEvidenceResponse struct {
 func (x *AssessEvidenceResponse) Reset() {
 	*x = AssessEvidenceResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_assessment_proto_msgTypes[4]
+		mi := &file_assessment_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -253,7 +329,7 @@ func (x *AssessEvidenceResponse) String() string {
 func (*AssessEvidenceResponse) ProtoMessage() {}
 
 func (x *AssessEvidenceResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_assessment_proto_msgTypes[4]
+	mi := &file_assessment_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -266,7 +342,7 @@ func (x *AssessEvidenceResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssessEvidenceResponse.ProtoReflect.Descriptor instead.
 func (*AssessEvidenceResponse) Descriptor() ([]byte, []int) {
-	return file_assessment_proto_rawDescGZIP(), []int{4}
+	return file_assessment_proto_rawDescGZIP(), []int{6}
 }
 
 func (x *AssessEvidenceResponse) GetStatus() bool {
@@ -304,7 +380,7 @@ type AssessmentResult struct {
 func (x *AssessmentResult) Reset() {
 	*x = AssessmentResult{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_assessment_proto_msgTypes[5]
+		mi := &file_assessment_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -317,7 +393,7 @@ func (x *AssessmentResult) String() string {
 func (*AssessmentResult) ProtoMessage() {}
 
 func (x *AssessmentResult) ProtoReflect() protoreflect.Message {
-	mi := &file_assessment_proto_msgTypes[5]
+	mi := &file_assessment_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -330,7 +406,7 @@ func (x *AssessmentResult) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssessmentResult.ProtoReflect.Descriptor instead.
 func (*AssessmentResult) Descriptor() ([]byte, []int) {
-	return file_assessment_proto_rawDescGZIP(), []int{5}
+	return file_assessment_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *AssessmentResult) GetId() string {
@@ -401,63 +477,58 @@ var file_assessment_proto_rawDesc = []byte{
 	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, 0x0e, 0x65, 0x76, 0x69, 0x64, 0x65,
 	0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69,
-	0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3a, 0x0a, 0x18, 0x54, 0x72, 0x69, 0x67, 0x67,
-	0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x6d, 0x65, 0x4f, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73,
-	0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x22, 0x56, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73,
-	0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18,
-	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
-	0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75,
-	0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x48, 0x0a, 0x15, 0x41,
-	0x73, 0x73, 0x65, 0x73, 0x73, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x65, 0x76, 0x69,
-	0x64, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x30, 0x0a, 0x16, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x45,
-	0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe4, 0x02, 0x0a, 0x10, 0x41, 0x73, 0x73, 0x65,
-	0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02,
-	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09,
-	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 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, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d,
-	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x72, 0x69,
-	0x63, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x63, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65,
-	0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x52, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75,
-	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69,
-	0x61, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c,
-	0x69, 0x61, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65,
-	0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x76, 0x69, 0x64, 0x65,
-	0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f,
-	0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6e, 0x6f, 0x6e, 0x5f, 0x63, 0x6f,
-	0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,
-	0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6e, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70,
-	0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x32, 0xc8,
-	0x03, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a,
-	0x11, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65,
-	0x6e, 0x74, 0x12, 0x23, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x54,
-	0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
-	0x00, 0x12, 0x8a, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73,
-	0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x63, 0x6c,
-	0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65,
-	0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72,
-	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e,
-	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x73, 0x73, 0x65,
-	0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x89,
+	0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41,
+	0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x56, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41,
+	0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75,
+	0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
+	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74,
+	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22,
+	0x1c, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65,
+	0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1d, 0x0a,
+	0x1b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73,
+	0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x18,
+	0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x6d, 0x65,
+	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f,
+	0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x48, 0x0a, 0x15, 0x41, 0x73, 0x73, 0x65,
+	0x73, 0x73, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x2f, 0x0a, 0x08, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
+	0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e,
+	0x63, 0x65, 0x22, 0x30, 0x0a, 0x16, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x45, 0x76, 0x69, 0x64,
+	0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x22, 0xe4, 0x02, 0x0a, 0x10, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d,
+	0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 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, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x64,
+	0x12, 0x51, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,
+	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13,
+	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x74,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e,
+	0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65,
+	0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69,
+	0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
+	0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6e, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c,
+	0x69, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x08,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6e, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61,
+	0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x32, 0xc8, 0x03, 0x0a, 0x0a,
+	0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x11, 0x54, 0x72,
+	0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x12,
+	0x23, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x54, 0x72, 0x69, 0x67,
+	0x67, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x89,
 	0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63,
 	0x65, 0x12, 0x20, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x73,
 	0x73, 0x65, 0x73, 0x73, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
@@ -471,9 +542,17 @@ var file_assessment_proto_rawDesc = []byte{
 	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73,
 	0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
 	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x42, 0x10, 0x5a, 0x0e, 0x61, 0x70, 0x69,
-	0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x8a, 0x01, 0x0a, 0x15, 0x4c, 0x69,
+	0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75,
+	0x6c, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
+	0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65,
+	0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63,
+	0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73,
+	0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16,
+	0x2f, 0x76, 0x31, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x72,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x10, 0x5a, 0x0e, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x73,
+	0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -488,37 +567,39 @@ func file_assessment_proto_rawDescGZIP() []byte {
 	return file_assessment_proto_rawDescData
 }
 
-var file_assessment_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+var file_assessment_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
 var file_assessment_proto_goTypes = []interface{}{
-	(*TriggerAssessmentRequest)(nil),      // 0: clouditor.TriggerAssessmentRequest
-	(*ListAssessmentResultsRequest)(nil),  // 1: clouditor.ListAssessmentResultsRequest
-	(*ListAssessmentResultsResponse)(nil), // 2: clouditor.ListAssessmentResultsResponse
-	(*AssessEvidenceRequest)(nil),         // 3: clouditor.AssessEvidenceRequest
-	(*AssessEvidenceResponse)(nil),        // 4: clouditor.AssessEvidenceResponse
-	(*AssessmentResult)(nil),              // 5: clouditor.AssessmentResult
-	(*evidence.Evidence)(nil),             // 6: clouditor.Evidence
-	(*timestamppb.Timestamp)(nil),         // 7: google.protobuf.Timestamp
-	(*MetricConfiguration)(nil),           // 8: clouditor.MetricConfiguration
-	(*emptypb.Empty)(nil),                 // 9: google.protobuf.Empty
+	(*ListAssessmentResultsRequest)(nil),  // 0: clouditor.ListAssessmentResultsRequest
+	(*ListAssessmentResultsResponse)(nil), // 1: clouditor.ListAssessmentResultsResponse
+	(*ConfigureAssessmentRequest)(nil),    // 2: clouditor.ConfigureAssessmentRequest
+	(*ConfigureAssessmentResponse)(nil),   // 3: clouditor.ConfigureAssessmentResponse
+	(*TriggerAssessmentRequest)(nil),      // 4: clouditor.TriggerAssessmentRequest
+	(*AssessEvidenceRequest)(nil),         // 5: clouditor.AssessEvidenceRequest
+	(*AssessEvidenceResponse)(nil),        // 6: clouditor.AssessEvidenceResponse
+	(*AssessmentResult)(nil),              // 7: clouditor.AssessmentResult
+	(*evidence.Evidence)(nil),             // 8: clouditor.Evidence
+	(*timestamppb.Timestamp)(nil),         // 9: google.protobuf.Timestamp
+	(*MetricConfiguration)(nil),           // 10: clouditor.MetricConfiguration
+	(*emptypb.Empty)(nil),                 // 11: google.protobuf.Empty
 }
 var file_assessment_proto_depIdxs = []int32{
-	5, // 0: clouditor.ListAssessmentResultsResponse.results:type_name -> clouditor.AssessmentResult
-	6, // 1: clouditor.AssessEvidenceRequest.evidence:type_name -> clouditor.Evidence
-	7, // 2: clouditor.AssessmentResult.timestamp:type_name -> google.protobuf.Timestamp
-	8, // 3: clouditor.AssessmentResult.metric_configuration:type_name -> clouditor.MetricConfiguration
-	0, // 4: clouditor.Assessment.TriggerAssessment:input_type -> clouditor.TriggerAssessmentRequest
-	1, // 5: clouditor.Assessment.ListAssessmentResults:input_type -> clouditor.ListAssessmentResultsRequest
-	3, // 6: clouditor.Assessment.AssessEvidence:input_type -> clouditor.AssessEvidenceRequest
-	3, // 7: clouditor.Assessment.AssessEvidences:input_type -> clouditor.AssessEvidenceRequest
-	9, // 8: clouditor.Assessment.TriggerAssessment:output_type -> google.protobuf.Empty
-	2, // 9: clouditor.Assessment.ListAssessmentResults:output_type -> clouditor.ListAssessmentResultsResponse
-	4, // 10: clouditor.Assessment.AssessEvidence:output_type -> clouditor.AssessEvidenceResponse
-	9, // 11: clouditor.Assessment.AssessEvidences:output_type -> google.protobuf.Empty
-	8, // [8:12] is the sub-list for method output_type
-	4, // [4:8] is the sub-list for method input_type
-	4, // [4:4] is the sub-list for extension type_name
-	4, // [4:4] is the sub-list for extension extendee
-	0, // [0:4] is the sub-list for field type_name
+	7,  // 0: clouditor.ListAssessmentResultsResponse.results:type_name -> clouditor.AssessmentResult
+	8,  // 1: clouditor.AssessEvidenceRequest.evidence:type_name -> clouditor.Evidence
+	9,  // 2: clouditor.AssessmentResult.timestamp:type_name -> google.protobuf.Timestamp
+	10, // 3: clouditor.AssessmentResult.metric_configuration:type_name -> clouditor.MetricConfiguration
+	4,  // 4: clouditor.Assessment.TriggerAssessment:input_type -> clouditor.TriggerAssessmentRequest
+	5,  // 5: clouditor.Assessment.AssessEvidence:input_type -> clouditor.AssessEvidenceRequest
+	5,  // 6: clouditor.Assessment.AssessEvidences:input_type -> clouditor.AssessEvidenceRequest
+	0,  // 7: clouditor.Assessment.ListAssessmentResults:input_type -> clouditor.ListAssessmentResultsRequest
+	11, // 8: clouditor.Assessment.TriggerAssessment:output_type -> google.protobuf.Empty
+	6,  // 9: clouditor.Assessment.AssessEvidence:output_type -> clouditor.AssessEvidenceResponse
+	11, // 10: clouditor.Assessment.AssessEvidences:output_type -> google.protobuf.Empty
+	1,  // 11: clouditor.Assessment.ListAssessmentResults:output_type -> clouditor.ListAssessmentResultsResponse
+	8,  // [8:12] is the sub-list for method output_type
+	4,  // [4:8] is the sub-list for method input_type
+	4,  // [4:4] is the sub-list for extension type_name
+	4,  // [4:4] is the sub-list for extension extendee
+	0,  // [0:4] is the sub-list for field type_name
 }
 
 func init() { file_assessment_proto_init() }
@@ -529,7 +610,7 @@ func file_assessment_proto_init() {
 	file_metric_proto_init()
 	if !protoimpl.UnsafeEnabled {
 		file_assessment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TriggerAssessmentRequest); i {
+			switch v := v.(*ListAssessmentResultsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -541,7 +622,7 @@ func file_assessment_proto_init() {
 			}
 		}
 		file_assessment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListAssessmentResultsRequest); i {
+			switch v := v.(*ListAssessmentResultsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -553,7 +634,7 @@ func file_assessment_proto_init() {
 			}
 		}
 		file_assessment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListAssessmentResultsResponse); i {
+			switch v := v.(*ConfigureAssessmentRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -565,7 +646,7 @@ func file_assessment_proto_init() {
 			}
 		}
 		file_assessment_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AssessEvidenceRequest); i {
+			switch v := v.(*ConfigureAssessmentResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -577,7 +658,7 @@ func file_assessment_proto_init() {
 			}
 		}
 		file_assessment_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AssessEvidenceResponse); i {
+			switch v := v.(*TriggerAssessmentRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -589,6 +670,30 @@ func file_assessment_proto_init() {
 			}
 		}
 		file_assessment_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AssessEvidenceRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_assessment_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AssessEvidenceResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_assessment_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*AssessmentResult); i {
 			case 0:
 				return &v.state
@@ -607,7 +712,7 @@ func file_assessment_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_assessment_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   6,
+			NumMessages:   8,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/api/assessment/assessment.pb.gw.go b/api/assessment/assessment.pb.gw.go
index bc9a0d58..b152c9ab 100644
--- a/api/assessment/assessment.pb.gw.go
+++ b/api/assessment/assessment.pb.gw.go
@@ -31,24 +31,6 @@ var _ = runtime.String
 var _ = utilities.NewDoubleArray
 var _ = metadata.Join
 
-func request_Assessment_ListAssessmentResults_0(ctx context.Context, marshaler runtime.Marshaler, client AssessmentClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
-	var protoReq ListAssessmentResultsRequest
-	var metadata runtime.ServerMetadata
-
-	msg, err := client.ListAssessmentResults(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
-	return msg, metadata, err
-
-}
-
-func local_request_Assessment_ListAssessmentResults_0(ctx context.Context, marshaler runtime.Marshaler, server AssessmentServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
-	var protoReq ListAssessmentResultsRequest
-	var metadata runtime.ServerMetadata
-
-	msg, err := server.ListAssessmentResults(ctx, &protoReq)
-	return msg, metadata, err
-
-}
-
 func request_Assessment_AssessEvidence_0(ctx context.Context, marshaler runtime.Marshaler, client AssessmentClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
 	var protoReq AssessEvidenceRequest
 	var metadata runtime.ServerMetadata
@@ -83,24 +65,42 @@ func local_request_Assessment_AssessEvidence_0(ctx context.Context, marshaler ru
 
 }
 
+func request_Assessment_ListAssessmentResults_0(ctx context.Context, marshaler runtime.Marshaler, client AssessmentClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq ListAssessmentResultsRequest
+	var metadata runtime.ServerMetadata
+
+	msg, err := client.ListAssessmentResults(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_Assessment_ListAssessmentResults_0(ctx context.Context, marshaler runtime.Marshaler, server AssessmentServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq ListAssessmentResultsRequest
+	var metadata runtime.ServerMetadata
+
+	msg, err := server.ListAssessmentResults(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
 // RegisterAssessmentHandlerServer registers the http handlers for service Assessment to "mux".
 // UnaryRPC     :call AssessmentServer directly.
 // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
 // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAssessmentHandlerFromEndpoint instead.
 func RegisterAssessmentHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AssessmentServer) error {
 
-	mux.Handle("GET", pattern_Assessment_ListAssessmentResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+	mux.Handle("POST", pattern_Assessment_AssessEvidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Assessment/ListAssessmentResults")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Assessment/AssessEvidence", runtime.WithHTTPPathPattern("/v1/assessment/evidences"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
-		resp, md, err := local_request_Assessment_ListAssessmentResults_0(rctx, inboundMarshaler, server, req, pathParams)
+		resp, md, err := local_request_Assessment_AssessEvidence_0(rctx, inboundMarshaler, server, req, pathParams)
 		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
 		ctx = runtime.NewServerMetadataContext(ctx, md)
 		if err != nil {
@@ -108,22 +108,22 @@ func RegisterAssessmentHandlerServer(ctx context.Context, mux *runtime.ServeMux,
 			return
 		}
 
-		forward_Assessment_ListAssessmentResults_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+		forward_Assessment_AssessEvidence_0(ctx, mux, outboundMarshaler, w, req, response_Assessment_AssessEvidence_0{resp}, mux.GetForwardResponseOptions()...)
 
 	})
 
-	mux.Handle("POST", pattern_Assessment_AssessEvidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+	mux.Handle("GET", pattern_Assessment_ListAssessmentResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Assessment/AssessEvidence")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Assessment/ListAssessmentResults", runtime.WithHTTPPathPattern("/v1/assessment/results"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
-		resp, md, err := local_request_Assessment_AssessEvidence_0(rctx, inboundMarshaler, server, req, pathParams)
+		resp, md, err := local_request_Assessment_ListAssessmentResults_0(rctx, inboundMarshaler, server, req, pathParams)
 		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
 		ctx = runtime.NewServerMetadataContext(ctx, md)
 		if err != nil {
@@ -131,7 +131,7 @@ func RegisterAssessmentHandlerServer(ctx context.Context, mux *runtime.ServeMux,
 			return
 		}
 
-		forward_Assessment_AssessEvidence_0(ctx, mux, outboundMarshaler, w, req, response_Assessment_AssessEvidence_0{resp}, mux.GetForwardResponseOptions()...)
+		forward_Assessment_ListAssessmentResults_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
 
 	})
 
@@ -176,43 +176,43 @@ func RegisterAssessmentHandler(ctx context.Context, mux *runtime.ServeMux, conn
 // "AssessmentClient" to call the correct interceptors.
 func RegisterAssessmentHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AssessmentClient) error {
 
-	mux.Handle("GET", pattern_Assessment_ListAssessmentResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+	mux.Handle("POST", pattern_Assessment_AssessEvidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Assessment/ListAssessmentResults")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Assessment/AssessEvidence", runtime.WithHTTPPathPattern("/v1/assessment/evidences"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
-		resp, md, err := request_Assessment_ListAssessmentResults_0(rctx, inboundMarshaler, client, req, pathParams)
+		resp, md, err := request_Assessment_AssessEvidence_0(rctx, inboundMarshaler, client, req, pathParams)
 		ctx = runtime.NewServerMetadataContext(ctx, md)
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
 
-		forward_Assessment_ListAssessmentResults_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+		forward_Assessment_AssessEvidence_0(ctx, mux, outboundMarshaler, w, req, response_Assessment_AssessEvidence_0{resp}, mux.GetForwardResponseOptions()...)
 
 	})
 
-	mux.Handle("POST", pattern_Assessment_AssessEvidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+	mux.Handle("GET", pattern_Assessment_ListAssessmentResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Assessment/AssessEvidence")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Assessment/ListAssessmentResults", runtime.WithHTTPPathPattern("/v1/assessment/results"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
-		resp, md, err := request_Assessment_AssessEvidence_0(rctx, inboundMarshaler, client, req, pathParams)
+		resp, md, err := request_Assessment_ListAssessmentResults_0(rctx, inboundMarshaler, client, req, pathParams)
 		ctx = runtime.NewServerMetadataContext(ctx, md)
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
 
-		forward_Assessment_AssessEvidence_0(ctx, mux, outboundMarshaler, w, req, response_Assessment_AssessEvidence_0{resp}, mux.GetForwardResponseOptions()...)
+		forward_Assessment_ListAssessmentResults_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
 
 	})
 
@@ -229,13 +229,13 @@ func (m response_Assessment_AssessEvidence_0) XXX_ResponseBody() interface{} {
 }
 
 var (
-	pattern_Assessment_ListAssessmentResults_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "assessment", "results"}, ""))
-
 	pattern_Assessment_AssessEvidence_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "assessment", "evidences"}, ""))
+
+	pattern_Assessment_ListAssessmentResults_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "assessment", "results"}, ""))
 )
 
 var (
-	forward_Assessment_ListAssessmentResults_0 = runtime.ForwardResponseMessage
-
 	forward_Assessment_AssessEvidence_0 = runtime.ForwardResponseMessage
+
+	forward_Assessment_ListAssessmentResults_0 = runtime.ForwardResponseMessage
 )
diff --git a/api/assessment/assessment_grpc.pb.go b/api/assessment/assessment_grpc.pb.go
index 89797b64..1adbf042 100644
--- a/api/assessment/assessment_grpc.pb.go
+++ b/api/assessment/assessment_grpc.pb.go
@@ -21,12 +21,12 @@ const _ = grpc.SupportPackageIsVersion7
 type AssessmentClient interface {
 	// Triggers the assessment. Part of the private API. Not exposed as REST.
 	TriggerAssessment(ctx context.Context, in *TriggerAssessmentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
-	// List all assessment results. Part of the public API, also exposed as REST.
-	ListAssessmentResults(ctx context.Context, in *ListAssessmentResultsRequest, opts ...grpc.CallOption) (*ListAssessmentResultsResponse, error)
 	// Assesses the evidence sent by the discovery. Part of the public API, also exposed as REST.
 	AssessEvidence(ctx context.Context, in *AssessEvidenceRequest, opts ...grpc.CallOption) (*AssessEvidenceResponse, error)
 	// Assesses stream of evidences sent by the discovery. Part of the public API. Not exposed as REST.
 	AssessEvidences(ctx context.Context, opts ...grpc.CallOption) (Assessment_AssessEvidencesClient, error)
+	// List all assessment results. Part of the public API, also exposed as REST.
+	ListAssessmentResults(ctx context.Context, in *ListAssessmentResultsRequest, opts ...grpc.CallOption) (*ListAssessmentResultsResponse, error)
 }
 
 type assessmentClient struct {
@@ -46,15 +46,6 @@ func (c *assessmentClient) TriggerAssessment(ctx context.Context, in *TriggerAss
 	return out, nil
 }
 
-func (c *assessmentClient) ListAssessmentResults(ctx context.Context, in *ListAssessmentResultsRequest, opts ...grpc.CallOption) (*ListAssessmentResultsResponse, error) {
-	out := new(ListAssessmentResultsResponse)
-	err := c.cc.Invoke(ctx, "/clouditor.Assessment/ListAssessmentResults", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
 func (c *assessmentClient) AssessEvidence(ctx context.Context, in *AssessEvidenceRequest, opts ...grpc.CallOption) (*AssessEvidenceResponse, error) {
 	out := new(AssessEvidenceResponse)
 	err := c.cc.Invoke(ctx, "/clouditor.Assessment/AssessEvidence", in, out, opts...)
@@ -98,18 +89,27 @@ func (x *assessmentAssessEvidencesClient) CloseAndRecv() (*emptypb.Empty, error)
 	return m, nil
 }
 
+func (c *assessmentClient) ListAssessmentResults(ctx context.Context, in *ListAssessmentResultsRequest, opts ...grpc.CallOption) (*ListAssessmentResultsResponse, error) {
+	out := new(ListAssessmentResultsResponse)
+	err := c.cc.Invoke(ctx, "/clouditor.Assessment/ListAssessmentResults", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // AssessmentServer is the server API for Assessment service.
 // All implementations must embed UnimplementedAssessmentServer
 // for forward compatibility
 type AssessmentServer interface {
 	// Triggers the assessment. Part of the private API. Not exposed as REST.
 	TriggerAssessment(context.Context, *TriggerAssessmentRequest) (*emptypb.Empty, error)
-	// List all assessment results. Part of the public API, also exposed as REST.
-	ListAssessmentResults(context.Context, *ListAssessmentResultsRequest) (*ListAssessmentResultsResponse, error)
 	// Assesses the evidence sent by the discovery. Part of the public API, also exposed as REST.
 	AssessEvidence(context.Context, *AssessEvidenceRequest) (*AssessEvidenceResponse, error)
 	// Assesses stream of evidences sent by the discovery. Part of the public API. Not exposed as REST.
 	AssessEvidences(Assessment_AssessEvidencesServer) error
+	// List all assessment results. Part of the public API, also exposed as REST.
+	ListAssessmentResults(context.Context, *ListAssessmentResultsRequest) (*ListAssessmentResultsResponse, error)
 	mustEmbedUnimplementedAssessmentServer()
 }
 
@@ -120,15 +120,15 @@ type UnimplementedAssessmentServer struct {
 func (UnimplementedAssessmentServer) TriggerAssessment(context.Context, *TriggerAssessmentRequest) (*emptypb.Empty, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method TriggerAssessment not implemented")
 }
-func (UnimplementedAssessmentServer) ListAssessmentResults(context.Context, *ListAssessmentResultsRequest) (*ListAssessmentResultsResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method ListAssessmentResults not implemented")
-}
 func (UnimplementedAssessmentServer) AssessEvidence(context.Context, *AssessEvidenceRequest) (*AssessEvidenceResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method AssessEvidence not implemented")
 }
 func (UnimplementedAssessmentServer) AssessEvidences(Assessment_AssessEvidencesServer) error {
 	return status.Errorf(codes.Unimplemented, "method AssessEvidences not implemented")
 }
+func (UnimplementedAssessmentServer) ListAssessmentResults(context.Context, *ListAssessmentResultsRequest) (*ListAssessmentResultsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListAssessmentResults not implemented")
+}
 func (UnimplementedAssessmentServer) mustEmbedUnimplementedAssessmentServer() {}
 
 // UnsafeAssessmentServer may be embedded to opt out of forward compatibility for this service.
@@ -160,24 +160,6 @@ func _Assessment_TriggerAssessment_Handler(srv interface{}, ctx context.Context,
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Assessment_ListAssessmentResults_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(ListAssessmentResultsRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(AssessmentServer).ListAssessmentResults(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/clouditor.Assessment/ListAssessmentResults",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(AssessmentServer).ListAssessmentResults(ctx, req.(*ListAssessmentResultsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
 func _Assessment_AssessEvidence_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(AssessEvidenceRequest)
 	if err := dec(in); err != nil {
@@ -222,6 +204,24 @@ func (x *assessmentAssessEvidencesServer) Recv() (*AssessEvidenceRequest, error)
 	return m, nil
 }
 
+func _Assessment_ListAssessmentResults_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListAssessmentResultsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AssessmentServer).ListAssessmentResults(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/clouditor.Assessment/ListAssessmentResults",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AssessmentServer).ListAssessmentResults(ctx, req.(*ListAssessmentResultsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // Assessment_ServiceDesc is the grpc.ServiceDesc for Assessment service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -233,14 +233,14 @@ var Assessment_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "TriggerAssessment",
 			Handler:    _Assessment_TriggerAssessment_Handler,
 		},
-		{
-			MethodName: "ListAssessmentResults",
-			Handler:    _Assessment_ListAssessmentResults_Handler,
-		},
 		{
 			MethodName: "AssessEvidence",
 			Handler:    _Assessment_AssessEvidence_Handler,
 		},
+		{
+			MethodName: "ListAssessmentResults",
+			Handler:    _Assessment_ListAssessmentResults_Handler,
+		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
diff --git a/api/auth/auth.pb.gw.go b/api/auth/auth.pb.gw.go
index 19e18fdb..44c6463e 100644
--- a/api/auth/auth.pb.gw.go
+++ b/api/auth/auth.pb.gw.go
@@ -77,7 +77,7 @@ func RegisterAuthenticationHandlerServer(ctx context.Context, mux *runtime.Serve
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Authentication/Login")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Authentication/Login", runtime.WithHTTPPathPattern("/v1/auth/login"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -139,7 +139,7 @@ func RegisterAuthenticationHandlerClient(ctx context.Context, mux *runtime.Serve
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Authentication/Login")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Authentication/Login", runtime.WithHTTPPathPattern("/v1/auth/login"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
diff --git a/api/discovery/discovery.pb.go b/api/discovery/discovery.pb.go
index 7fef5613..3e684d0a 100644
--- a/api/discovery/discovery.pb.go
+++ b/api/discovery/discovery.pb.go
@@ -48,6 +48,7 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
+// TODO(lebogg): Add destinations (url+port) for assessment and evidence store
 type StartDiscoveryRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
diff --git a/api/discovery/discovery.pb.gw.go b/api/discovery/discovery.pb.gw.go
index 11f24a90..f769205d 100644
--- a/api/discovery/discovery.pb.gw.go
+++ b/api/discovery/discovery.pb.gw.go
@@ -111,7 +111,7 @@ func RegisterDiscoveryHandlerServer(ctx context.Context, mux *runtime.ServeMux,
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Discovery/Start")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Discovery/Start", runtime.WithHTTPPathPattern("/v1/discovery/start"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -134,7 +134,7 @@ func RegisterDiscoveryHandlerServer(ctx context.Context, mux *runtime.ServeMux,
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Discovery/Query")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Discovery/Query", runtime.WithHTTPPathPattern("/v1/discovery/query"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -196,7 +196,7 @@ func RegisterDiscoveryHandlerClient(ctx context.Context, mux *runtime.ServeMux,
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Discovery/Start")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Discovery/Start", runtime.WithHTTPPathPattern("/v1/discovery/start"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -216,7 +216,7 @@ func RegisterDiscoveryHandlerClient(ctx context.Context, mux *runtime.ServeMux,
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Discovery/Query")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Discovery/Query", runtime.WithHTTPPathPattern("/v1/discovery/query"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
diff --git a/api/evidence/evidence_store.pb.gw.go b/api/evidence/evidence_store.pb.gw.go
index 98a0b52b..baaf4839 100644
--- a/api/evidence/evidence_store.pb.gw.go
+++ b/api/evidence/evidence_store.pb.gw.go
@@ -95,7 +95,7 @@ func RegisterEvidenceStoreHandlerServer(ctx context.Context, mux *runtime.ServeM
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.EvidenceStore/StoreEvidence")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.EvidenceStore/StoreEvidence", runtime.WithHTTPPathPattern("/v1/evidence_store/evidence"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -118,7 +118,7 @@ func RegisterEvidenceStoreHandlerServer(ctx context.Context, mux *runtime.ServeM
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.EvidenceStore/ListEvidences")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.EvidenceStore/ListEvidences", runtime.WithHTTPPathPattern("/v1/evidence_store/evidences"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -180,7 +180,7 @@ func RegisterEvidenceStoreHandlerClient(ctx context.Context, mux *runtime.ServeM
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.EvidenceStore/StoreEvidence")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.EvidenceStore/StoreEvidence", runtime.WithHTTPPathPattern("/v1/evidence_store/evidence"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -200,7 +200,7 @@ func RegisterEvidenceStoreHandlerClient(ctx context.Context, mux *runtime.ServeM
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.EvidenceStore/ListEvidences")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.EvidenceStore/ListEvidences", runtime.WithHTTPPathPattern("/v1/evidence_store/evidences"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
diff --git a/api/orchestrator/orchestrator.pb.go b/api/orchestrator/orchestrator.pb.go
index 5836555a..f8b42bb9 100644
--- a/api/orchestrator/orchestrator.pb.go
+++ b/api/orchestrator/orchestrator.pb.go
@@ -1243,7 +1243,7 @@ var file_orchestrator_proto_rawDesc = []byte{
 	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65,
 	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xa2, 0x12, 0x0a,
+	0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xbc, 0x13, 0x0a,
 	0x0c, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x8e, 0x01,
 	0x0a, 0x16, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73,
 	0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
@@ -1308,90 +1308,100 @@ var file_orchestrator_proto_rawDesc = []byte{
 	0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
 	0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75,
 	0x6c, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x6e, 0x0a, 0x0b,
-	0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1d, 0x2e, 0x63, 0x6c,
-	0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6c, 0x6f,
-	0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69,
-	0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93,
-	0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72,
-	0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x6a, 0x0a, 0x09,
-	0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
-	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69,
-	0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93,
-	0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72,
-	0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2f, 0x7b, 0x6d, 0x65,
-	0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x67,
-	0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x12, 0x26, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65,
-	0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
-	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f,
-	0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f,
-	0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x07, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43,
-	0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6c,
-	0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c,
-	0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c,
-	0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93,
-	0x02, 0x37, 0x1a, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x97, 0x01, 0x0a,
+	0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
+	0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
+	0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+	0x25, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61,
+	0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x6a, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74,
+	0x72, 0x69, 0x63, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
+	0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76,
+	0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69,
+	0x64, 0x7d, 0x12, 0x6e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
+	0x73, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69,
+	0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72,
+	0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43,
+	0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x63, 0x6c,
+	0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
+	0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
+	0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x30, 0x82, 0xd3,
+	0xe4, 0x93, 0x02, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73,
+	0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x92,
+	0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
+	0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6c,
+	0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x1a, 0x2c, 0x2f, 0x76,
+	0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63,
+	0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x07, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69,
+	0x74, 0x6f, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x6f,
+	0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x31,
+	0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c,
+	0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x87, 0x01, 0x0a, 0x11, 0x4c, 0x69,
+	0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12,
+	0x23, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72,
+	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93,
+	0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72,
 	0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d,
-	0x3a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x47, 0x65,
-	0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x2e,
-	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x6f,
+	0x63, 0x65, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c,
+	0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6c, 0x6f,
+	0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x6f,
 	0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f,
-	0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61,
-	0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12,
-	0x87, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
-	0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6c, 0x6f,
-	0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64,
-	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72,
-	0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,
-	0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x12, 0x52, 0x65,
-	0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x12, 0x24, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x6d,
-	0x6f, 0x76, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x34,
-	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x2a, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68,
-	0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73,
-	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x5f, 0x69, 0x64, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
-	0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
-	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66,
-	0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x50, 0x12, 0x4e, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61,
-	0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f,
-	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64,
-	0x7d, 0x12, 0xbd, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29,
-	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
-	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f,
-	0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f,
-	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x42, 0x12, 0x5a, 0x10, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74,
-	0x72, 0x61, 0x74, 0x6f, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e,
+	0x2a, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74,
+	0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xba,
+	0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
+	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
+	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, 0x76, 0x31,
+	0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c,
+	0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
+	0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
+	0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xbd, 0x01, 0x0a, 0x18,
+	0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
+	0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
+	0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63,
+	0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x12, 0x5a, 0x10, 0x61,
+	0x70, 0x69, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1408,33 +1418,35 @@ func file_orchestrator_proto_rawDescGZIP() []byte {
 
 var file_orchestrator_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
 var file_orchestrator_proto_goTypes = []interface{}{
-	(*RegisterAssessmentToolRequest)(nil),   // 0: clouditor.RegisterAssessmentToolRequest
-	(*ListAssessmentToolsRequest)(nil),      // 1: clouditor.ListAssessmentToolsRequest
-	(*ListAssessmentToolsResponse)(nil),     // 2: clouditor.ListAssessmentToolsResponse
-	(*GetAssessmentToolRequest)(nil),        // 3: clouditor.GetAssessmentToolRequest
-	(*UpdateAssessmentToolRequest)(nil),     // 4: clouditor.UpdateAssessmentToolRequest
-	(*DeregisterAssessmentToolRequest)(nil), // 5: clouditor.DeregisterAssessmentToolRequest
-	(*StoreAssessmentResultRequest)(nil),    // 6: clouditor.StoreAssessmentResultRequest
-	(*StoreAssessmentResultResponse)(nil),   // 7: clouditor.StoreAssessmentResultResponse
-	(*GetMetricsRequest)(nil),               // 8: clouditor.GetMetricsRequest
-	(*ListMetricsRequest)(nil),              // 9: clouditor.ListMetricsRequest
-	(*ListMetricsResponse)(nil),             // 10: clouditor.ListMetricsResponse
-	(*GetCloudServiceRequest)(nil),          // 11: clouditor.GetCloudServiceRequest
-	(*RegisterCloudServiceRequest)(nil),     // 12: clouditor.RegisterCloudServiceRequest
-	(*UpdateCloudServiceRequest)(nil),       // 13: clouditor.UpdateCloudServiceRequest
-	(*RemoveCloudServiceRequest)(nil),       // 14: clouditor.RemoveCloudServiceRequest
-	(*ListCloudServicesRequest)(nil),        // 15: clouditor.ListCloudServicesRequest
-	(*ListCloudServicesResponse)(nil),       // 16: clouditor.ListCloudServicesResponse
-	(*GetMetricConfigurationRequest)(nil),   // 17: clouditor.GetMetricConfigurationRequest
-	(*ListMetricConfigurationRequest)(nil),  // 18: clouditor.ListMetricConfigurationRequest
-	(*ListMetricConfigurationResponse)(nil), // 19: clouditor.ListMetricConfigurationResponse
-	(*AssessmentTool)(nil),                  // 20: clouditor.AssessmentTool
-	(*CloudService)(nil),                    // 21: clouditor.CloudService
-	nil,                                     // 22: clouditor.ListMetricConfigurationResponse.ConfigurationsEntry
-	(*assessment.AssessmentResult)(nil),     // 23: clouditor.AssessmentResult
-	(*assessment.Metric)(nil),               // 24: clouditor.Metric
-	(*assessment.MetricConfiguration)(nil),  // 25: clouditor.MetricConfiguration
-	(*emptypb.Empty)(nil),                   // 26: google.protobuf.Empty
+	(*RegisterAssessmentToolRequest)(nil),            // 0: clouditor.RegisterAssessmentToolRequest
+	(*ListAssessmentToolsRequest)(nil),               // 1: clouditor.ListAssessmentToolsRequest
+	(*ListAssessmentToolsResponse)(nil),              // 2: clouditor.ListAssessmentToolsResponse
+	(*GetAssessmentToolRequest)(nil),                 // 3: clouditor.GetAssessmentToolRequest
+	(*UpdateAssessmentToolRequest)(nil),              // 4: clouditor.UpdateAssessmentToolRequest
+	(*DeregisterAssessmentToolRequest)(nil),          // 5: clouditor.DeregisterAssessmentToolRequest
+	(*StoreAssessmentResultRequest)(nil),             // 6: clouditor.StoreAssessmentResultRequest
+	(*StoreAssessmentResultResponse)(nil),            // 7: clouditor.StoreAssessmentResultResponse
+	(*GetMetricsRequest)(nil),                        // 8: clouditor.GetMetricsRequest
+	(*ListMetricsRequest)(nil),                       // 9: clouditor.ListMetricsRequest
+	(*ListMetricsResponse)(nil),                      // 10: clouditor.ListMetricsResponse
+	(*GetCloudServiceRequest)(nil),                   // 11: clouditor.GetCloudServiceRequest
+	(*RegisterCloudServiceRequest)(nil),              // 12: clouditor.RegisterCloudServiceRequest
+	(*UpdateCloudServiceRequest)(nil),                // 13: clouditor.UpdateCloudServiceRequest
+	(*RemoveCloudServiceRequest)(nil),                // 14: clouditor.RemoveCloudServiceRequest
+	(*ListCloudServicesRequest)(nil),                 // 15: clouditor.ListCloudServicesRequest
+	(*ListCloudServicesResponse)(nil),                // 16: clouditor.ListCloudServicesResponse
+	(*GetMetricConfigurationRequest)(nil),            // 17: clouditor.GetMetricConfigurationRequest
+	(*ListMetricConfigurationRequest)(nil),           // 18: clouditor.ListMetricConfigurationRequest
+	(*ListMetricConfigurationResponse)(nil),          // 19: clouditor.ListMetricConfigurationResponse
+	(*AssessmentTool)(nil),                           // 20: clouditor.AssessmentTool
+	(*CloudService)(nil),                             // 21: clouditor.CloudService
+	nil,                                              // 22: clouditor.ListMetricConfigurationResponse.ConfigurationsEntry
+	(*assessment.AssessmentResult)(nil),              // 23: clouditor.AssessmentResult
+	(*assessment.Metric)(nil),                        // 24: clouditor.Metric
+	(*assessment.MetricConfiguration)(nil),           // 25: clouditor.MetricConfiguration
+	(*assessment.ListAssessmentResultsRequest)(nil),  // 26: clouditor.ListAssessmentResultsRequest
+	(*emptypb.Empty)(nil),                            // 27: google.protobuf.Empty
+	(*assessment.ListAssessmentResultsResponse)(nil), // 28: clouditor.ListAssessmentResultsResponse
 }
 var file_orchestrator_proto_depIdxs = []int32{
 	20, // 0: clouditor.RegisterAssessmentToolRequest.tool:type_name -> clouditor.AssessmentTool
@@ -1454,33 +1466,35 @@ var file_orchestrator_proto_depIdxs = []int32{
 	5,  // 14: clouditor.Orchestrator.DeregisterAssessmentTool:input_type -> clouditor.DeregisterAssessmentToolRequest
 	6,  // 15: clouditor.Orchestrator.StoreAssessmentResult:input_type -> clouditor.StoreAssessmentResultRequest
 	23, // 16: clouditor.Orchestrator.StoreAssessmentResults:input_type -> clouditor.AssessmentResult
-	9,  // 17: clouditor.Orchestrator.ListMetrics:input_type -> clouditor.ListMetricsRequest
+	26, // 17: clouditor.Orchestrator.ListAssessmentResults:input_type -> clouditor.ListAssessmentResultsRequest
 	8,  // 18: clouditor.Orchestrator.GetMetric:input_type -> clouditor.GetMetricsRequest
-	12, // 19: clouditor.Orchestrator.RegisterCloudService:input_type -> clouditor.RegisterCloudServiceRequest
-	13, // 20: clouditor.Orchestrator.UpdateCloudService:input_type -> clouditor.UpdateCloudServiceRequest
-	11, // 21: clouditor.Orchestrator.GetCloudService:input_type -> clouditor.GetCloudServiceRequest
-	15, // 22: clouditor.Orchestrator.ListCloudServices:input_type -> clouditor.ListCloudServicesRequest
-	14, // 23: clouditor.Orchestrator.RemoveCloudService:input_type -> clouditor.RemoveCloudServiceRequest
-	17, // 24: clouditor.Orchestrator.GetMetricConfiguration:input_type -> clouditor.GetMetricConfigurationRequest
-	18, // 25: clouditor.Orchestrator.ListMetricConfigurations:input_type -> clouditor.ListMetricConfigurationRequest
-	20, // 26: clouditor.Orchestrator.RegisterAssessmentTool:output_type -> clouditor.AssessmentTool
-	2,  // 27: clouditor.Orchestrator.ListAssessmentTools:output_type -> clouditor.ListAssessmentToolsResponse
-	20, // 28: clouditor.Orchestrator.GetAssessmentTool:output_type -> clouditor.AssessmentTool
-	20, // 29: clouditor.Orchestrator.UpdateAssessmentTool:output_type -> clouditor.AssessmentTool
-	26, // 30: clouditor.Orchestrator.DeregisterAssessmentTool:output_type -> google.protobuf.Empty
-	7,  // 31: clouditor.Orchestrator.StoreAssessmentResult:output_type -> clouditor.StoreAssessmentResultResponse
-	26, // 32: clouditor.Orchestrator.StoreAssessmentResults:output_type -> google.protobuf.Empty
-	10, // 33: clouditor.Orchestrator.ListMetrics:output_type -> clouditor.ListMetricsResponse
-	24, // 34: clouditor.Orchestrator.GetMetric:output_type -> clouditor.Metric
-	21, // 35: clouditor.Orchestrator.RegisterCloudService:output_type -> clouditor.CloudService
-	21, // 36: clouditor.Orchestrator.UpdateCloudService:output_type -> clouditor.CloudService
-	21, // 37: clouditor.Orchestrator.GetCloudService:output_type -> clouditor.CloudService
-	16, // 38: clouditor.Orchestrator.ListCloudServices:output_type -> clouditor.ListCloudServicesResponse
-	26, // 39: clouditor.Orchestrator.RemoveCloudService:output_type -> google.protobuf.Empty
-	25, // 40: clouditor.Orchestrator.GetMetricConfiguration:output_type -> clouditor.MetricConfiguration
-	19, // 41: clouditor.Orchestrator.ListMetricConfigurations:output_type -> clouditor.ListMetricConfigurationResponse
-	26, // [26:42] is the sub-list for method output_type
-	10, // [10:26] is the sub-list for method input_type
+	9,  // 19: clouditor.Orchestrator.ListMetrics:input_type -> clouditor.ListMetricsRequest
+	12, // 20: clouditor.Orchestrator.RegisterCloudService:input_type -> clouditor.RegisterCloudServiceRequest
+	13, // 21: clouditor.Orchestrator.UpdateCloudService:input_type -> clouditor.UpdateCloudServiceRequest
+	11, // 22: clouditor.Orchestrator.GetCloudService:input_type -> clouditor.GetCloudServiceRequest
+	15, // 23: clouditor.Orchestrator.ListCloudServices:input_type -> clouditor.ListCloudServicesRequest
+	14, // 24: clouditor.Orchestrator.RemoveCloudService:input_type -> clouditor.RemoveCloudServiceRequest
+	17, // 25: clouditor.Orchestrator.GetMetricConfiguration:input_type -> clouditor.GetMetricConfigurationRequest
+	18, // 26: clouditor.Orchestrator.ListMetricConfigurations:input_type -> clouditor.ListMetricConfigurationRequest
+	20, // 27: clouditor.Orchestrator.RegisterAssessmentTool:output_type -> clouditor.AssessmentTool
+	2,  // 28: clouditor.Orchestrator.ListAssessmentTools:output_type -> clouditor.ListAssessmentToolsResponse
+	20, // 29: clouditor.Orchestrator.GetAssessmentTool:output_type -> clouditor.AssessmentTool
+	20, // 30: clouditor.Orchestrator.UpdateAssessmentTool:output_type -> clouditor.AssessmentTool
+	27, // 31: clouditor.Orchestrator.DeregisterAssessmentTool:output_type -> google.protobuf.Empty
+	7,  // 32: clouditor.Orchestrator.StoreAssessmentResult:output_type -> clouditor.StoreAssessmentResultResponse
+	27, // 33: clouditor.Orchestrator.StoreAssessmentResults:output_type -> google.protobuf.Empty
+	28, // 34: clouditor.Orchestrator.ListAssessmentResults:output_type -> clouditor.ListAssessmentResultsResponse
+	24, // 35: clouditor.Orchestrator.GetMetric:output_type -> clouditor.Metric
+	10, // 36: clouditor.Orchestrator.ListMetrics:output_type -> clouditor.ListMetricsResponse
+	21, // 37: clouditor.Orchestrator.RegisterCloudService:output_type -> clouditor.CloudService
+	21, // 38: clouditor.Orchestrator.UpdateCloudService:output_type -> clouditor.CloudService
+	21, // 39: clouditor.Orchestrator.GetCloudService:output_type -> clouditor.CloudService
+	16, // 40: clouditor.Orchestrator.ListCloudServices:output_type -> clouditor.ListCloudServicesResponse
+	27, // 41: clouditor.Orchestrator.RemoveCloudService:output_type -> google.protobuf.Empty
+	25, // 42: clouditor.Orchestrator.GetMetricConfiguration:output_type -> clouditor.MetricConfiguration
+	19, // 43: clouditor.Orchestrator.ListMetricConfigurations:output_type -> clouditor.ListMetricConfigurationResponse
+	27, // [27:44] is the sub-list for method output_type
+	10, // [10:27] is the sub-list for method input_type
 	10, // [10:10] is the sub-list for extension type_name
 	10, // [10:10] is the sub-list for extension extendee
 	0,  // [0:10] is the sub-list for field type_name
diff --git a/api/orchestrator/orchestrator.pb.gw.go b/api/orchestrator/orchestrator.pb.gw.go
index 49470cf3..62ae314d 100644
--- a/api/orchestrator/orchestrator.pb.gw.go
+++ b/api/orchestrator/orchestrator.pb.gw.go
@@ -13,6 +13,7 @@ import (
 	"io"
 	"net/http"
 
+	assessment_0 "clouditor.io/clouditor/api/assessment"
 	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
 	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
 	"google.golang.org/grpc"
@@ -359,20 +360,20 @@ func local_request_Orchestrator_StoreAssessmentResult_0(ctx context.Context, mar
 
 }
 
-func request_Orchestrator_ListMetrics_0(ctx context.Context, marshaler runtime.Marshaler, client OrchestratorClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
-	var protoReq ListMetricsRequest
+func request_Orchestrator_ListAssessmentResults_0(ctx context.Context, marshaler runtime.Marshaler, client OrchestratorClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq assessment_0.ListAssessmentResultsRequest
 	var metadata runtime.ServerMetadata
 
-	msg, err := client.ListMetrics(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	msg, err := client.ListAssessmentResults(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
 	return msg, metadata, err
 
 }
 
-func local_request_Orchestrator_ListMetrics_0(ctx context.Context, marshaler runtime.Marshaler, server OrchestratorServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
-	var protoReq ListMetricsRequest
+func local_request_Orchestrator_ListAssessmentResults_0(ctx context.Context, marshaler runtime.Marshaler, server OrchestratorServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq assessment_0.ListAssessmentResultsRequest
 	var metadata runtime.ServerMetadata
 
-	msg, err := server.ListMetrics(ctx, &protoReq)
+	msg, err := server.ListAssessmentResults(ctx, &protoReq)
 	return msg, metadata, err
 
 }
@@ -429,6 +430,24 @@ func local_request_Orchestrator_GetMetric_0(ctx context.Context, marshaler runti
 
 }
 
+func request_Orchestrator_ListMetrics_0(ctx context.Context, marshaler runtime.Marshaler, client OrchestratorClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq ListMetricsRequest
+	var metadata runtime.ServerMetadata
+
+	msg, err := client.ListMetrics(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_Orchestrator_ListMetrics_0(ctx context.Context, marshaler runtime.Marshaler, server OrchestratorServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq ListMetricsRequest
+	var metadata runtime.ServerMetadata
+
+	msg, err := server.ListMetrics(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
 func request_Orchestrator_RegisterCloudService_0(ctx context.Context, marshaler runtime.Marshaler, client OrchestratorClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
 	var protoReq RegisterCloudServiceRequest
 	var metadata runtime.ServerMetadata
@@ -789,7 +808,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterAssessmentTool")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -812,7 +831,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -835,7 +854,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools", runtime.WithHTTPPathPattern("/v1/orchestrator/{metric_id}/assessment_tools"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -858,7 +877,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetAssessmentTool")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools/{tool_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -881,7 +900,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateAssessmentTool")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools/{tool_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -904,7 +923,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/DeregisterAssessmentTool")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/DeregisterAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools/{tool_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -927,7 +946,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/StoreAssessmentResult")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/StoreAssessmentResult", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_results"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -944,18 +963,18 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 
 	})
 
-	mux.Handle("GET", pattern_Orchestrator_ListMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+	mux.Handle("GET", pattern_Orchestrator_ListAssessmentResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetrics")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentResults", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_results"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
-		resp, md, err := local_request_Orchestrator_ListMetrics_0(rctx, inboundMarshaler, server, req, pathParams)
+		resp, md, err := local_request_Orchestrator_ListAssessmentResults_0(rctx, inboundMarshaler, server, req, pathParams)
 		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
 		ctx = runtime.NewServerMetadataContext(ctx, md)
 		if err != nil {
@@ -963,7 +982,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 			return
 		}
 
-		forward_Orchestrator_ListMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+		forward_Orchestrator_ListAssessmentResults_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
 
 	})
 
@@ -973,7 +992,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetric")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetric", runtime.WithHTTPPathPattern("/v1/orchestrator/metrics/{metric_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -990,13 +1009,36 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 
 	})
 
+	mux.Handle("GET", pattern_Orchestrator_ListMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetrics", runtime.WithHTTPPathPattern("/v1/orchestrator/metrics"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_Orchestrator_ListMetrics_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_Orchestrator_ListMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	mux.Handle("POST", pattern_Orchestrator_RegisterCloudService_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterCloudService")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1019,7 +1061,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateCloudService")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1042,7 +1084,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetCloudService")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1065,7 +1107,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListCloudServices")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListCloudServices", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1088,7 +1130,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/RemoveCloudService")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/RemoveCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1111,7 +1153,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetricConfiguration")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetricConfiguration", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}/metric_configurations/{metric_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1134,7 +1176,7 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 		var stream runtime.ServerTransportStream
 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetricConfigurations")
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetricConfigurations", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}/metric_configurations"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1196,7 +1238,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterAssessmentTool")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1216,7 +1258,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1236,7 +1278,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentTools", runtime.WithHTTPPathPattern("/v1/orchestrator/{metric_id}/assessment_tools"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1256,7 +1298,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetAssessmentTool")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools/{tool_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1276,7 +1318,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateAssessmentTool")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools/{tool_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1296,7 +1338,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/DeregisterAssessmentTool")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/DeregisterAssessmentTool", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_tools/{tool_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1316,7 +1358,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/StoreAssessmentResult")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/StoreAssessmentResult", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_results"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1332,23 +1374,23 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 
 	})
 
-	mux.Handle("GET", pattern_Orchestrator_ListMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+	mux.Handle("GET", pattern_Orchestrator_ListAssessmentResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetrics")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListAssessmentResults", runtime.WithHTTPPathPattern("/v1/orchestrator/assessment_results"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
-		resp, md, err := request_Orchestrator_ListMetrics_0(rctx, inboundMarshaler, client, req, pathParams)
+		resp, md, err := request_Orchestrator_ListAssessmentResults_0(rctx, inboundMarshaler, client, req, pathParams)
 		ctx = runtime.NewServerMetadataContext(ctx, md)
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
 		}
 
-		forward_Orchestrator_ListMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+		forward_Orchestrator_ListAssessmentResults_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
 
 	})
 
@@ -1356,7 +1398,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetric")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetric", runtime.WithHTTPPathPattern("/v1/orchestrator/metrics/{metric_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1372,11 +1414,31 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 
 	})
 
+	mux.Handle("GET", pattern_Orchestrator_ListMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetrics", runtime.WithHTTPPathPattern("/v1/orchestrator/metrics"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_Orchestrator_ListMetrics_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_Orchestrator_ListMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	mux.Handle("POST", pattern_Orchestrator_RegisterCloudService_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterCloudService")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/RegisterCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1396,7 +1458,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateCloudService")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/UpdateCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1416,7 +1478,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetCloudService")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1436,7 +1498,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListCloudServices")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListCloudServices", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1456,7 +1518,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/RemoveCloudService")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/RemoveCloudService", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1476,7 +1538,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetricConfiguration")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/GetMetricConfiguration", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}/metric_configurations/{metric_id}"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1496,7 +1558,7 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
-		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetricConfigurations")
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListMetricConfigurations", runtime.WithHTTPPathPattern("/v1/orchestrator/cloud_services/{service_id}/metric_configurations"))
 		if err != nil {
 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 			return
@@ -1530,10 +1592,12 @@ var (
 
 	pattern_Orchestrator_StoreAssessmentResult_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "assessment_results"}, ""))
 
-	pattern_Orchestrator_ListMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "metrics"}, ""))
+	pattern_Orchestrator_ListAssessmentResults_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "assessment_results"}, ""))
 
 	pattern_Orchestrator_GetMetric_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "orchestrator", "metrics", "metric_id"}, ""))
 
+	pattern_Orchestrator_ListMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "metrics"}, ""))
+
 	pattern_Orchestrator_RegisterCloudService_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "cloud_services"}, ""))
 
 	pattern_Orchestrator_UpdateCloudService_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "orchestrator", "cloud_services", "service_id"}, ""))
@@ -1564,10 +1628,12 @@ var (
 
 	forward_Orchestrator_StoreAssessmentResult_0 = runtime.ForwardResponseMessage
 
-	forward_Orchestrator_ListMetrics_0 = runtime.ForwardResponseMessage
+	forward_Orchestrator_ListAssessmentResults_0 = runtime.ForwardResponseMessage
 
 	forward_Orchestrator_GetMetric_0 = runtime.ForwardResponseMessage
 
+	forward_Orchestrator_ListMetrics_0 = runtime.ForwardResponseMessage
+
 	forward_Orchestrator_RegisterCloudService_0 = runtime.ForwardResponseMessage
 
 	forward_Orchestrator_UpdateCloudService_0 = runtime.ForwardResponseMessage
diff --git a/api/orchestrator/orchestrator_grpc.pb.go b/api/orchestrator/orchestrator_grpc.pb.go
index f445ad43..67c041d3 100644
--- a/api/orchestrator/orchestrator_grpc.pb.go
+++ b/api/orchestrator/orchestrator_grpc.pb.go
@@ -36,10 +36,12 @@ type OrchestratorClient interface {
 	StoreAssessmentResult(ctx context.Context, in *StoreAssessmentResultRequest, opts ...grpc.CallOption) (*StoreAssessmentResultResponse, error)
 	// Stores stream of assessment results provided by an assessment tool
 	StoreAssessmentResults(ctx context.Context, opts ...grpc.CallOption) (Orchestrator_StoreAssessmentResultsClient, error)
-	// List all metrics provided by the metric catalog
-	ListMetrics(ctx context.Context, in *ListMetricsRequest, opts ...grpc.CallOption) (*ListMetricsResponse, error)
+	// List all assessment results. Part of the public API, also exposed as REST.
+	ListAssessmentResults(ctx context.Context, in *assessment.ListAssessmentResultsRequest, opts ...grpc.CallOption) (*assessment.ListAssessmentResultsResponse, error)
 	// Returns the metric with the passed metric id
 	GetMetric(ctx context.Context, in *GetMetricsRequest, opts ...grpc.CallOption) (*assessment.Metric, error)
+	// List all metrics provided by the metric catalog
+	ListMetrics(ctx context.Context, in *ListMetricsRequest, opts ...grpc.CallOption) (*ListMetricsResponse, error)
 	// Registers a new target cloud service
 	RegisterCloudService(ctx context.Context, in *RegisterCloudServiceRequest, opts ...grpc.CallOption) (*CloudService, error)
 	// Registers a new target cloud service
@@ -152,9 +154,9 @@ func (x *orchestratorStoreAssessmentResultsClient) CloseAndRecv() (*emptypb.Empt
 	return m, nil
 }
 
-func (c *orchestratorClient) ListMetrics(ctx context.Context, in *ListMetricsRequest, opts ...grpc.CallOption) (*ListMetricsResponse, error) {
-	out := new(ListMetricsResponse)
-	err := c.cc.Invoke(ctx, "/clouditor.Orchestrator/ListMetrics", in, out, opts...)
+func (c *orchestratorClient) ListAssessmentResults(ctx context.Context, in *assessment.ListAssessmentResultsRequest, opts ...grpc.CallOption) (*assessment.ListAssessmentResultsResponse, error) {
+	out := new(assessment.ListAssessmentResultsResponse)
+	err := c.cc.Invoke(ctx, "/clouditor.Orchestrator/ListAssessmentResults", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -170,6 +172,15 @@ func (c *orchestratorClient) GetMetric(ctx context.Context, in *GetMetricsReques
 	return out, nil
 }
 
+func (c *orchestratorClient) ListMetrics(ctx context.Context, in *ListMetricsRequest, opts ...grpc.CallOption) (*ListMetricsResponse, error) {
+	out := new(ListMetricsResponse)
+	err := c.cc.Invoke(ctx, "/clouditor.Orchestrator/ListMetrics", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *orchestratorClient) RegisterCloudService(ctx context.Context, in *RegisterCloudServiceRequest, opts ...grpc.CallOption) (*CloudService, error) {
 	out := new(CloudService)
 	err := c.cc.Invoke(ctx, "/clouditor.Orchestrator/RegisterCloudService", in, out, opts...)
@@ -253,10 +264,12 @@ type OrchestratorServer interface {
 	StoreAssessmentResult(context.Context, *StoreAssessmentResultRequest) (*StoreAssessmentResultResponse, error)
 	// Stores stream of assessment results provided by an assessment tool
 	StoreAssessmentResults(Orchestrator_StoreAssessmentResultsServer) error
-	// List all metrics provided by the metric catalog
-	ListMetrics(context.Context, *ListMetricsRequest) (*ListMetricsResponse, error)
+	// List all assessment results. Part of the public API, also exposed as REST.
+	ListAssessmentResults(context.Context, *assessment.ListAssessmentResultsRequest) (*assessment.ListAssessmentResultsResponse, error)
 	// Returns the metric with the passed metric id
 	GetMetric(context.Context, *GetMetricsRequest) (*assessment.Metric, error)
+	// List all metrics provided by the metric catalog
+	ListMetrics(context.Context, *ListMetricsRequest) (*ListMetricsResponse, error)
 	// Registers a new target cloud service
 	RegisterCloudService(context.Context, *RegisterCloudServiceRequest) (*CloudService, error)
 	// Registers a new target cloud service
@@ -299,12 +312,15 @@ func (UnimplementedOrchestratorServer) StoreAssessmentResult(context.Context, *S
 func (UnimplementedOrchestratorServer) StoreAssessmentResults(Orchestrator_StoreAssessmentResultsServer) error {
 	return status.Errorf(codes.Unimplemented, "method StoreAssessmentResults not implemented")
 }
-func (UnimplementedOrchestratorServer) ListMetrics(context.Context, *ListMetricsRequest) (*ListMetricsResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method ListMetrics not implemented")
+func (UnimplementedOrchestratorServer) ListAssessmentResults(context.Context, *assessment.ListAssessmentResultsRequest) (*assessment.ListAssessmentResultsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListAssessmentResults not implemented")
 }
 func (UnimplementedOrchestratorServer) GetMetric(context.Context, *GetMetricsRequest) (*assessment.Metric, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetMetric not implemented")
 }
+func (UnimplementedOrchestratorServer) ListMetrics(context.Context, *ListMetricsRequest) (*ListMetricsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListMetrics not implemented")
+}
 func (UnimplementedOrchestratorServer) RegisterCloudService(context.Context, *RegisterCloudServiceRequest) (*CloudService, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method RegisterCloudService not implemented")
 }
@@ -473,20 +489,20 @@ func (x *orchestratorStoreAssessmentResultsServer) Recv() (*assessment.Assessmen
 	return m, nil
 }
 
-func _Orchestrator_ListMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(ListMetricsRequest)
+func _Orchestrator_ListAssessmentResults_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(assessment.ListAssessmentResultsRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(OrchestratorServer).ListMetrics(ctx, in)
+		return srv.(OrchestratorServer).ListAssessmentResults(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/clouditor.Orchestrator/ListMetrics",
+		FullMethod: "/clouditor.Orchestrator/ListAssessmentResults",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OrchestratorServer).ListMetrics(ctx, req.(*ListMetricsRequest))
+		return srv.(OrchestratorServer).ListAssessmentResults(ctx, req.(*assessment.ListAssessmentResultsRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
@@ -509,6 +525,24 @@ func _Orchestrator_GetMetric_Handler(srv interface{}, ctx context.Context, dec f
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Orchestrator_ListMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListMetricsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OrchestratorServer).ListMetrics(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/clouditor.Orchestrator/ListMetrics",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OrchestratorServer).ListMetrics(ctx, req.(*ListMetricsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Orchestrator_RegisterCloudService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(RegisterCloudServiceRequest)
 	if err := dec(in); err != nil {
@@ -667,13 +701,17 @@ var Orchestrator_ServiceDesc = grpc.ServiceDesc{
 			Handler:    _Orchestrator_StoreAssessmentResult_Handler,
 		},
 		{
-			MethodName: "ListMetrics",
-			Handler:    _Orchestrator_ListMetrics_Handler,
+			MethodName: "ListAssessmentResults",
+			Handler:    _Orchestrator_ListAssessmentResults_Handler,
 		},
 		{
 			MethodName: "GetMetric",
 			Handler:    _Orchestrator_GetMetric_Handler,
 		},
+		{
+			MethodName: "ListMetrics",
+			Handler:    _Orchestrator_ListMetrics_Handler,
+		},
 		{
 			MethodName: "RegisterCloudService",
 			Handler:    _Orchestrator_RegisterCloudService_Handler,
diff --git a/cli/commands/commands.go b/cli/commands/commands.go
index e67b85e1..51ce9af6 100644
--- a/cli/commands/commands.go
+++ b/cli/commands/commands.go
@@ -33,6 +33,7 @@ import (
 	"clouditor.io/clouditor/cli/commands/discovery"
 	"clouditor.io/clouditor/cli/commands/login"
 	"clouditor.io/clouditor/cli/commands/metric"
+	"clouditor.io/clouditor/cli/commands/orchestrator"
 	"clouditor.io/clouditor/cli/commands/tool"
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
@@ -46,6 +47,7 @@ func AddCommands(cmd *cobra.Command) {
 		metric.NewMetricCommand(),
 		tool.NewToolCommand(),
 		assessment.NewAssessmentCommand(),
+		orchestrator.NewOrchestratorCommand(),
 		completion.NewCompletionCommand(),
 		cloud.NewCloudCommand(),
 	)
diff --git a/cli/commands/orchestrator/orchestrator.go b/cli/commands/orchestrator/orchestrator.go
new file mode 100644
index 00000000..1ce7955f
--- /dev/null
+++ b/cli/commands/orchestrator/orchestrator.go
@@ -0,0 +1,87 @@
+// Copyright 2021 Fraunhofer AISEC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//           $$\                           $$\ $$\   $$\
+//           $$ |                          $$ |\__|  $$ |
+//  $$$$$$$\ $$ | $$$$$$\  $$\   $$\  $$$$$$$ |$$\ $$$$$$\    $$$$$$\   $$$$$$\
+// $$  _____|$$ |$$  __$$\ $$ |  $$ |$$  __$$ |$$ |\_$$  _|  $$  __$$\ $$  __$$\
+// $$ /      $$ |$$ /  $$ |$$ |  $$ |$$ /  $$ |$$ |  $$ |    $$ /  $$ |$$ | \__|
+// $$ |      $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$\ $$ |  $$ |$$ |
+// \$$$$$$\  $$ |\$$$$$   |\$$$$$   |\$$$$$$  |$$ |  \$$$   |\$$$$$   |$$ |
+//  \_______|\__| \______/  \______/  \_______|\__|   \____/  \______/ \__|
+//
+// This file is part of Clouditor Community Edition.
+
+package orchestrator
+
+import (
+	"clouditor.io/clouditor/api/assessment"
+	"clouditor.io/clouditor/api/orchestrator"
+	"context"
+	"fmt"
+
+	"clouditor.io/clouditor/cli"
+	"github.com/spf13/cobra"
+)
+
+// NewListResultsCommand returns a cobra command for the `list` subcommand
+func NewListResultsCommand() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "list",
+		Short: "Lists all assessment results",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			var (
+				err     error
+				session *cli.Session
+				client  orchestrator.OrchestratorClient
+				res     *assessment.ListAssessmentResultsResponse
+			)
+
+			if session, err = cli.ContinueSession(); err != nil {
+				fmt.Printf("Error while retrieving the session. Please re-authenticate.\n")
+				return nil
+			}
+
+			client = orchestrator.NewOrchestratorClient(session)
+
+			res, err = client.ListAssessmentResults(context.Background(), &assessment.ListAssessmentResultsRequest{})
+
+			return session.HandleResponse(res, err)
+		},
+		ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
+			return []string{}, cobra.ShellCompDirectiveNoFileComp
+		},
+	}
+
+	return cmd
+}
+
+// NewOrchestratorCommand returns a cobra command for `assessment` subcommands
+func NewOrchestratorCommand() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "orchestrator",
+		Short: "Orchestrator commands",
+	}
+
+	AddCommands(cmd)
+
+	return cmd
+}
+
+// AddCommands adds all subcommands
+func AddCommands(cmd *cobra.Command) {
+	cmd.AddCommand(
+		NewListResultsCommand(),
+	)
+}
diff --git a/cmd/engine/engine.go b/cmd/engine/engine.go
index 6077c24e..7d91c99d 100644
--- a/cmd/engine/engine.go
+++ b/cmd/engine/engine.go
@@ -185,18 +185,7 @@ func doCmd(_ *cobra.Command, _ []string) (err error) {
 
 	// orchestratorService.RegisterAssessmentResultHook(func(result *assessment.AssessmentResult, err error) {})
 	// evidenceStoreService.RegisterEvidenceHook(func(result *evidence.Evidence, err error) {})
-	assessmentService.RegisterAssessmentResultHook(func(result *assessment.AssessmentResult, err error) {
-
-		if err != nil {
-			return
-		}
-		_, err = orchestratorService.StoreAssessmentResult(context.Background(), &orchestrator.StoreAssessmentResultRequest{
-			Result: result})
-
-		if err != nil {
-			log.Errorf("error storing assessment result in orchestrator: %v", err)
-		}
-	})
+	// assessmentService.RegisterAssessmentResultHook(func(result *assessment.AssessmentResult, err error) {}
 
 	authService.CreateDefaultUser(viper.GetString(APIDefaultUserFlag), viper.GetString(APIDefaultPasswordFlag))
 
diff --git a/openapi/discovery/openapi.yaml b/openapi/discovery/openapi.yaml
index ac3426bc..342b407e 100644
--- a/openapi/discovery/openapi.yaml
+++ b/openapi/discovery/openapi.yaml
@@ -71,6 +71,7 @@ components:
         StartDiscoveryRequest:
             type: object
             properties: {}
+            description: 'TODO(lebogg): Add destinations (url+port) for assessment and evidence store'
         StartDiscoveryResponse:
             type: object
             properties:
diff --git a/openapi/orchestrator/openapi.yaml b/openapi/orchestrator/openapi.yaml
index d48b1b37..be31045e 100644
--- a/openapi/orchestrator/openapi.yaml
+++ b/openapi/orchestrator/openapi.yaml
@@ -8,6 +8,18 @@ info:
     version: 0.0.1
 paths:
     /v1/orchestrator/assessment_results:
+        get:
+            tags:
+                - Orchestrator
+            description: List all assessment results. Part of the public API, also exposed as REST.
+            operationId: Orchestrator_ListAssessmentResults
+            responses:
+                "200":
+                    description: OK
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/ListAssessmentResultsResponse'
         post:
             tags:
                 - Orchestrator
@@ -351,6 +363,13 @@ components:
                     type: string
                 description:
                     type: string
+        ListAssessmentResultsResponse:
+            type: object
+            properties:
+                results:
+                    type: array
+                    items:
+                        $ref: '#/components/schemas/AssessmentResult'
         ListAssessmentToolsResponse:
             type: object
             properties:
diff --git a/policies/operators.rego b/policies/operators.rego
index 896af9a9..a188e29d 100644
--- a/policies/operators.rego
+++ b/policies/operators.rego
@@ -1,5 +1,10 @@
 package clouditor
 
+
+# operator and target_value are declared here to add them to the output of each single policy (so assessment can use it)
+operator = data.operator
+target_value = data.target_value
+
 compare(operator, target_value, actual_value) {
     operator == "=="
     target_value == actual_value
diff --git a/policies/policies.go b/policies/policies.go
index 8cbe0dc3..465e2969 100644
--- a/policies/policies.go
+++ b/policies/policies.go
@@ -48,7 +48,11 @@ func RunEvidence(evidence *evidence.Evidence) ([]map[string]interface{}, error)
 	var types []string
 
 	if rawTypes, ok := m["type"].([]interface{}); ok {
-		types = make([]string, len(rawTypes))
+		if len(rawTypes) != 0 {
+			types = make([]string, len(rawTypes))
+		} else {
+			return nil, fmt.Errorf("list of types is empty")
+		}
 	} else {
 		return nil, fmt.Errorf("got type '%T' but wanted '[]interface {}'. Check if resource types are specified ", rawTypes)
 	}
diff --git a/proto/assessment.proto b/proto/assessment.proto
index aa36d41f..70702053 100644
--- a/proto/assessment.proto
+++ b/proto/assessment.proto
@@ -39,18 +39,11 @@ option go_package = "api/assessment";
 // Representing the link between orchestrator and discovery: Assessing evidences
 // from discovery and sending results to orchestrator
 service Assessment {
+
   // Triggers the assessment. Part of the private API. Not exposed as REST.
   rpc TriggerAssessment(TriggerAssessmentRequest)
       returns (google.protobuf.Empty) {}
 
-  // List all assessment results. Part of the public API, also exposed as REST.
-  rpc ListAssessmentResults(ListAssessmentResultsRequest)
-      returns (ListAssessmentResultsResponse) {
-    option (google.api.http) = {
-      get : "/v1/assessment/results"
-    };
-  }
-
   // Assesses the evidence sent by the discovery. Part of the public API, also exposed as REST.
   rpc AssessEvidence(AssessEvidenceRequest) returns (AssessEvidenceResponse) {
     option (google.api.http) = {
@@ -62,13 +55,24 @@ service Assessment {
 
   // Assesses stream of evidences sent by the discovery. Part of the public API. Not exposed as REST.
   rpc AssessEvidences(stream AssessEvidenceRequest) returns (google.protobuf.Empty);
-};
 
-message TriggerAssessmentRequest { string someOption = 1; }
+  // List all assessment results. Part of the public API, also exposed as REST.
+  rpc ListAssessmentResults(ListAssessmentResultsRequest)
+      returns (ListAssessmentResultsResponse) {
+    option (google.api.http) = {
+      get : "/v1/assessment/results"
+    };
+  }
+};
 
 message ListAssessmentResultsRequest {}
 message ListAssessmentResultsResponse { repeated AssessmentResult results = 1; }
 
+message ConfigureAssessmentRequest {}
+message ConfigureAssessmentResponse{}
+
+message TriggerAssessmentRequest { string someOption = 1; }
+
 message AssessEvidenceRequest { Evidence evidence = 1; }
 message AssessEvidenceResponse { bool status = 1; }
 
diff --git a/proto/compile_proto_files.go b/proto/compile_proto_files.go
index ef1bdd33..1380885d 100644
--- a/proto/compile_proto_files.go
+++ b/proto/compile_proto_files.go
@@ -29,8 +29,8 @@ package proto
 
 //go:generate protoc -I ./ -I ../third_party metric.proto --go_out=../
 //go:generate protoc -I ./ -I ../third_party evidence.proto --go_out=../
-//go:generate protoc -I ./ -I ../third_party assessment.proto --go_out=../ --go-grpc_out=../ --go_opt=Mevidence.proto=clouditor.io/clouditor/api/evidence --go-grpc_opt=Mevidence.proto=clouditor.io/clouditor/api/evidence --openapi_out=../openapi/assessment
-//go:generate protoc -I ./ -I ../third_party auth.proto --go_out=../ --go-grpc_out=../
-//go:generate protoc -I ./ -I ../third_party discovery.proto --go_out=../ --go-grpc_out=../ --openapi_out=../openapi/discovery
-//go:generate protoc -I ./ -I ../third_party evidence_store.proto --go_out=../ --go-grpc_out=../  --openapi_out=../openapi/evidence
-//go:generate protoc -I ./ -I ../third_party orchestrator.proto --go_out=../ --go-grpc_out=../ --go_opt=Mmetric.proto=clouditor.io/clouditor/api/assessment --go-grpc_opt=Mmetric.proto=clouditor.io/clouditor/api/assessment --go_opt=Massessment.proto=clouditor.io/clouditor/api/assessment --go-grpc_opt=Massessment.proto=clouditor.io/clouditor/api/assessment --openapi_out=../openapi/orchestrator
+//go:generate protoc -I ./ -I ../third_party assessment.proto --go_out=../ --go-grpc_out=../ --go_opt=Mevidence.proto=clouditor.io/clouditor/api/evidence --go-grpc_opt=Mevidence.proto=clouditor.io/clouditor/api/evidence --openapi_out=../openapi/assessment --grpc-gateway_out=../ --grpc-gateway_opt logtostderr=true
+//go:generate protoc -I ./ -I ../third_party auth.proto --go_out=../ --go-grpc_out=../ --grpc-gateway_out=../ --grpc-gateway_opt logtostderr=true
+//go:generate protoc -I ./ -I ../third_party discovery.proto --go_out=../ --go-grpc_out=../ --openapi_out=../openapi/discovery --grpc-gateway_out=../ --grpc-gateway_opt logtostderr=true
+//go:generate protoc -I ./ -I ../third_party evidence_store.proto --go_out=../ --go-grpc_out=../  --openapi_out=../openapi/evidence --grpc-gateway_out=../ --grpc-gateway_opt logtostderr=true
+//go:generate protoc -I ./ -I ../third_party orchestrator.proto --go_out=../ --go-grpc_out=../ --go_opt=Mmetric.proto=clouditor.io/clouditor/api/assessment --go-grpc_opt=Mmetric.proto=clouditor.io/clouditor/api/assessment --go_opt=Massessment.proto=clouditor.io/clouditor/api/assessment --go-grpc_opt=Massessment.proto=clouditor.io/clouditor/api/assessment --openapi_out=../openapi/orchestrator --grpc-gateway_out=../ --grpc-gateway_opt logtostderr=true --grpc-gateway_opt=Massessment.proto=clouditor.io/clouditor/api/assessment
diff --git a/proto/discovery.proto b/proto/discovery.proto
index 2a0650d9..218c6728 100644
--- a/proto/discovery.proto
+++ b/proto/discovery.proto
@@ -55,6 +55,7 @@ service Discovery {
   }
 }
 
+// TODO(lebogg): Add destinations (url+port) for assessment and evidence store
 message StartDiscoveryRequest {}
 
 message StartDiscoveryResponse { bool successful = 1; }
diff --git a/proto/orchestrator.proto b/proto/orchestrator.proto
index d8d4e71a..4d0d70f0 100644
--- a/proto/orchestrator.proto
+++ b/proto/orchestrator.proto
@@ -94,10 +94,11 @@ service Orchestrator {
   rpc StoreAssessmentResults(stream AssessmentResult)
       returns (google.protobuf.Empty);
 
-  // List all metrics provided by the metric catalog
-  rpc ListMetrics(ListMetricsRequest) returns (ListMetricsResponse) {
+  // List all assessment results. Part of the public API, also exposed as REST.
+  rpc ListAssessmentResults(ListAssessmentResultsRequest)
+      returns (ListAssessmentResultsResponse) {
     option (google.api.http) = {
-      get : "/v1/orchestrator/metrics"
+      get : "/v1/orchestrator/assessment_results"
     };
   }
 
@@ -108,6 +109,13 @@ service Orchestrator {
     };
   }
 
+  // List all metrics provided by the metric catalog
+  rpc ListMetrics(ListMetricsRequest) returns (ListMetricsResponse) {
+    option (google.api.http) = {
+      get : "/v1/orchestrator/metrics"
+    };
+  }
+
   // Registers a new target cloud service
   rpc RegisterCloudService(RegisterCloudServiceRequest) returns (CloudService) {
     option (google.api.http) = {
diff --git a/rest/rest.go b/rest/rest.go
index 9f7b8631..e5d0ee2f 100644
--- a/rest/rest.go
+++ b/rest/rest.go
@@ -51,8 +51,6 @@ func init() {
 	log = logrus.WithField("component", "rest")
 }
 
-//go:generate protoc -I ../proto -I ../third_party auth.proto discovery.proto orchestrator.proto assessment.proto evidence_store.proto --grpc-gateway_out=../ --grpc-gateway_opt logtostderr=true
-
 func RunServer(ctx context.Context, grpcPort int, httpPort int) error {
 	ctx, cancel := context.WithCancel(ctx)
 	defer cancel()
diff --git a/service/assessment/assessment.go b/service/assessment/assessment.go
index cee8c6fe..44eb0d27 100644
--- a/service/assessment/assessment.go
+++ b/service/assessment/assessment.go
@@ -28,17 +28,22 @@ package assessment
 import (
 	"clouditor.io/clouditor/api/assessment"
 	"clouditor.io/clouditor/api/evidence"
+	"clouditor.io/clouditor/api/orchestrator"
 	"clouditor.io/clouditor/policies"
 	"context"
+	"encoding/json"
 	"fmt"
 	"github.com/google/uuid"
 	"github.com/sirupsen/logrus"
+	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/credentials/insecure"
 	"google.golang.org/grpc/status"
 	"google.golang.org/protobuf/types/known/emptypb"
 	"google.golang.org/protobuf/types/known/structpb"
 	"google.golang.org/protobuf/types/known/timestamppb"
 	"io"
+	"sync"
 )
 
 var log *logrus.Entry
@@ -52,22 +57,38 @@ Service is an implementation of the Clouditor Assessment service. It should not
 NewService constructor should be used. It implements the AssessmentServer interface
 */
 type Service struct {
+	// Embedded for FWD compatibility
+	assessment.UnimplementedAssessmentServer
+
+	// evidenceStoreStream sends evidences to the Evidence Store
+	evidenceStoreStream  evidence.EvidenceStore_StoreEvidencesClient
+	EvidenceStoreAddress string
+
+	// orchestratorStream sends ARs to the Orchestrator
+	orchestratorStream  orchestrator.Orchestrator_StoreAssessmentResultsClient
+	OrchestratorAddress string
+
 	// resultHooks is a list of hook functions that can be used if one wants to be
 	// informed about each assessment result
 	resultHooks []assessment.ResultHookFunc
+	// hookMutex is used for (un)locking result hook calls
+	hookMutex sync.Mutex
 
+	// Currently, results are just stored as a map (=in-memory). In the future, we will use a DB.
 	results map[string]*assessment.AssessmentResult
-	assessment.UnimplementedAssessmentServer
 }
 
+// NewService creates a new assessment service with default values
 func NewService() *Service {
 	return &Service{
-		results: make(map[string]*assessment.AssessmentResult),
+		results:              make(map[string]*assessment.AssessmentResult),
+		EvidenceStoreAddress: "localhost:9090",
+		OrchestratorAddress:  "localhost:9090",
 	}
 }
 
 // AssessEvidence is a method implementation of the assessment interface: It assesses a single evidence
-func (s Service) AssessEvidence(_ context.Context, req *assessment.AssessEvidenceRequest) (res *assessment.AssessEvidenceResponse, err error) {
+func (s *Service) AssessEvidence(_ context.Context, req *assessment.AssessEvidenceRequest) (res *assessment.AssessEvidenceResponse, err error) {
 	resourceId, err := req.Evidence.Validate()
 	if err != nil {
 		log.Errorf("Invalid evidence: %v", err)
@@ -82,7 +103,9 @@ func (s Service) AssessEvidence(_ context.Context, req *assessment.AssessEvidenc
 		return res, status.Errorf(codes.InvalidArgument, "invalid req: %v", newError)
 	}
 
+	// Assess evidence
 	err = s.handleEvidence(req.Evidence, resourceId)
+
 	if err != nil {
 		res = &assessment.AssessEvidenceResponse{
 			Status: false,
@@ -99,7 +122,7 @@ func (s Service) AssessEvidence(_ context.Context, req *assessment.AssessEvidenc
 }
 
 // AssessEvidences is a method implementation of the assessment interface: It assesses multiple evidences (stream)
-func (s Service) AssessEvidences(stream assessment.Assessment_AssessEvidencesServer) (err error) {
+func (s *Service) AssessEvidences(stream assessment.Assessment_AssessEvidencesServer) (err error) {
 	var (
 		req *assessment.AssessEvidenceRequest
 	)
@@ -129,7 +152,7 @@ func (s Service) AssessEvidences(stream assessment.Assessment_AssessEvidencesSer
 }
 
 // handleEvidence is the helper method for the actual assessment used by AssessEvidence and AssessEvidences
-func (s Service) handleEvidence(evidence *evidence.Evidence, resourceId string) error {
+func (s *Service) handleEvidence(evidence *evidence.Evidence, resourceId string) (err error) {
 
 	log.Infof("Running evidence %s (%s) collected by %s at %v", evidence.Id, resourceId, evidence.ToolId, evidence.Timestamp)
 	log.Debugf("Evidence: %+v", evidence)
@@ -139,10 +162,16 @@ func (s Service) handleEvidence(evidence *evidence.Evidence, resourceId string)
 		newError := fmt.Errorf("could not evaluate evidence: %w", err)
 		log.Errorf(newError.Error())
 
-		s.informHooks(nil, newError)
+		go s.informHooks(nil, newError)
 
 		return newError
 	}
+	// The evidence is sent to the evidence store since it has been successfully evaluated
+	// We could also just log, but an AR could be sent without an accompanying evidence in the Evidence Store
+	err = s.sendToEvidenceStore(evidence)
+	if err != nil {
+		return fmt.Errorf("could not send evidence to the Evidence Store: %v", err)
+	}
 
 	for i, data := range evaluations {
 		metricId := data["metricId"].(string)
@@ -151,15 +180,20 @@ func (s Service) handleEvidence(evidence *evidence.Evidence, resourceId string)
 
 		// Get output values of Rego evaluation. If they are not given, the zero value is used
 		operator, _ := data["operator"].(string)
-		targetValue, _ := data["target_value"].(*structpb.Value)
+		targetValue := data["target_value"]
 		compliant, _ := data["compliant"].(bool)
 
+		convertedTargetValue, err := convertTargetValue(targetValue)
+		if err != nil {
+			return fmt.Errorf("could not convert target value: %w", err)
+		}
+
 		result := &assessment.AssessmentResult{
 			Id:        uuid.NewString(),
 			Timestamp: timestamppb.Now(),
 			MetricId:  metricId,
 			MetricConfiguration: &assessment.MetricConfiguration{
-				TargetValue: targetValue,
+				TargetValue: convertedTargetValue,
 				Operator:    operator,
 			},
 			Compliant:             compliant,
@@ -171,24 +205,48 @@ func (s Service) handleEvidence(evidence *evidence.Evidence, resourceId string)
 		// Just a little hack to quickly enable multiple results per resource
 		s.results[fmt.Sprintf("%s-%d", resourceId, i)] = result
 
-		s.informHooks(result, nil)
+		// Inform hooks about new assessment result
+		go s.informHooks(result, nil)
+		// Send assessment result to the Orchestrator
+		err = s.sendToOrchestrator(result)
+		if err != nil {
+			return fmt.Errorf("could not send assessment result to Orchestrator: %v", err)
+		}
 	}
-
 	return nil
 }
 
+// convertTargetValue converts v in a format accepted by protobuf (structpb.Value)
+func convertTargetValue(v interface{}) (s *structpb.Value, err error) {
+	var b []byte
+
+	// json.Marshal and json.Unmarshaling is used instead of structpb.NewValue() which cannot handle json numbers
+	if b, err = json.Marshal(v); err != nil {
+		return nil, fmt.Errorf("JSON marshal failed: %w", err)
+	}
+	if err = json.Unmarshal(b, &s); err != nil {
+		return nil, fmt.Errorf("JSON unmarshal failed: %w", err)
+	}
+	return
+
+}
+
 // informHooks informs the registered hook functions
-func (s Service) informHooks(result *assessment.AssessmentResult, err error) {
+func (s *Service) informHooks(result *assessment.AssessmentResult, err error) {
+	s.hookMutex.Lock()
+	defer s.hookMutex.Unlock()
+
 	// Inform our hook, if we have any
 	if s.resultHooks != nil {
 		for _, hook := range s.resultHooks {
-			go hook(result, err)
+			// We could do hook concurrent again (assuming different hooks don't interfere with each other)
+			hook(result, err)
 		}
 	}
 }
 
 // ListAssessmentResults is a method implementation of the assessment interface
-func (s Service) ListAssessmentResults(_ context.Context, _ *assessment.ListAssessmentResultsRequest) (res *assessment.ListAssessmentResultsResponse, err error) {
+func (s *Service) ListAssessmentResults(_ context.Context, _ *assessment.ListAssessmentResultsRequest) (res *assessment.ListAssessmentResultsResponse, err error) {
 	res = new(assessment.ListAssessmentResultsResponse)
 	res.Results = []*assessment.AssessmentResult{}
 
@@ -202,3 +260,71 @@ func (s Service) ListAssessmentResults(_ context.Context, _ *assessment.ListAsse
 func (s *Service) RegisterAssessmentResultHook(assessmentResultsHook func(result *assessment.AssessmentResult, err error)) {
 	s.resultHooks = append(s.resultHooks, assessmentResultsHook)
 }
+
+// initEvidenceStoreStream initializes the stream to the Evidence Store
+func (s *Service) initEvidenceStoreStream() error {
+	// Establish connection to evidenceStore component
+	target := s.EvidenceStoreAddress
+	log.Infof("Establishing connection to Evidence Store (%v)", target)
+	conn, err := grpc.Dial(target, grpc.WithTransportCredentials(insecure.NewCredentials()))
+	if err != nil {
+		return fmt.Errorf("could not connect to the Evidence Store service: %v", err)
+	}
+	evidenceStoreClient := evidence.NewEvidenceStoreClient(conn)
+	s.evidenceStoreStream, err = evidenceStoreClient.StoreEvidences(context.Background())
+	if err != nil {
+		return fmt.Errorf("could not set up stream for storing evidences: %v", err)
+	}
+	log.Infof("Connected to Evidence Store")
+	return nil
+}
+
+// sendToEvidenceStore sends evidence e to the Evidence Store
+func (s *Service) sendToEvidenceStore(e *evidence.Evidence) error {
+	if s.evidenceStoreStream == nil {
+		err := s.initEvidenceStoreStream()
+		if err != nil {
+			return fmt.Errorf("could not initialize stream to Evidence Store: %v", err)
+		}
+	}
+	log.Infof("Sending evidence (%v) to Evidence Store", e.Id)
+	err := s.evidenceStoreStream.Send(&evidence.StoreEvidenceRequest{Evidence: e})
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// initOrchestratorStream initializes the stream to the Orchestrator
+func (s *Service) initOrchestratorStream() error {
+	// Establish connection to orchestrator component
+	target := s.OrchestratorAddress
+	log.Infof("Establishing connection to Orchestrator (%v)", target)
+	conn, err := grpc.Dial(target, grpc.WithTransportCredentials(insecure.NewCredentials()))
+	if err != nil {
+		return fmt.Errorf("could not connect to the Orchestrator service: %v", err)
+	}
+	orchestratorClient := orchestrator.NewOrchestratorClient(conn)
+	s.orchestratorStream, err = orchestratorClient.StoreAssessmentResults(context.Background())
+	if err != nil {
+		return fmt.Errorf("could not set up stream for storing assessment results: %v", err)
+	}
+	log.Infof("Connected to Orchestrator")
+	return nil
+}
+
+// sendToOrchestrator sends the assessment result to the Orchestrator
+func (s *Service) sendToOrchestrator(result *assessment.AssessmentResult) error {
+	if s.orchestratorStream == nil {
+		err := s.initOrchestratorStream()
+		if err != nil {
+			return fmt.Errorf("could not initialize stream to Orchestrator: %v", err)
+		}
+	}
+	log.Infof("Sending assessment result (%v) to Orchestrator", result.Id)
+	err := s.orchestratorStream.Send(result)
+	if err != nil {
+		return err
+	}
+	return nil
+}
diff --git a/service/discovery/discovery.go b/service/discovery/discovery.go
index ab7c55d2..3a0141dd 100644
--- a/service/discovery/discovery.go
+++ b/service/discovery/discovery.go
@@ -27,7 +27,7 @@ package discovery
 
 import (
 	"context"
-	"strings"
+	"fmt"
 	"time"
 
 	"clouditor.io/clouditor/service/discovery/azure"
@@ -61,10 +61,9 @@ type Service struct {
 	discovery.UnimplementedDiscoveryServer
 
 	Configurations map[discovery.Discoverer]*Configuration
-	// TODO(oxisto) do not expose this. just makes tests easier for now
-	AssessmentStream assessment.Assessment_AssessEvidencesClient
 
-	EvidenceStoreStream evidence.EvidenceStore_StoreEvidencesClient
+	assessmentStream  assessment.Assessment_AssessEvidencesClient
+	AssessmentAddress string
 
 	resources map[string]voc.IsCloudResource
 	scheduler *gocron.Scheduler
@@ -84,16 +83,16 @@ func init() {
 
 func NewService() *Service {
 	return &Service{
-		resources:      make(map[string]voc.IsCloudResource),
-		scheduler:      gocron.NewScheduler(time.UTC),
-		Configurations: make(map[discovery.Discoverer]*Configuration),
+		AssessmentAddress: "localhost:9090",
+		resources:         make(map[string]voc.IsCloudResource),
+		scheduler:         gocron.NewScheduler(time.UTC),
+		Configurations:    make(map[discovery.Discoverer]*Configuration),
 	}
 }
 
 // Start starts discovery
-func (s *Service) Start(_ context.Context, _ *discovery.StartDiscoveryRequest) (response *discovery.StartDiscoveryResponse, err error) {
-
-	response = &discovery.StartDiscoveryResponse{Successful: true}
+func (s *Service) Start(_ context.Context, _ *discovery.StartDiscoveryRequest) (resp *discovery.StartDiscoveryResponse, err error) {
+	resp = &discovery.StartDiscoveryResponse{Successful: true}
 
 	log.Infof("Starting discovery...")
 
@@ -102,23 +101,15 @@ func (s *Service) Start(_ context.Context, _ *discovery.StartDiscoveryRequest) (
 	// Establish connection to assessment component
 	var client assessment.AssessmentClient
 	// TODO(oxisto): support assessment on Another tcp/port
-	cc, err := grpc.Dial("localhost:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
+	conn, err := grpc.Dial(s.AssessmentAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
 	if err != nil {
 		return nil, status.Errorf(codes.Internal, "could not connect to assessment service: %v", err)
 	}
-	client = assessment.NewAssessmentClient(cc)
-	// ToDo(lebogg): whats with the err?
-	s.AssessmentStream, _ = client.AssessEvidences(context.Background())
-
-	// Establish connection to evidenceStore component
-	var evidenceStoreClient evidence.EvidenceStoreClient
-	cc, err = grpc.Dial("localhost:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
+	client = assessment.NewAssessmentClient(conn)
+	s.assessmentStream, err = client.AssessEvidences(context.Background())
 	if err != nil {
-		return nil, status.Errorf(codes.Internal, "could not connect to evidence store service: %v", err)
+		return nil, status.Errorf(codes.Internal, "could not set up stream for assessing evidences: %v", err)
 	}
-	evidenceStoreClient = evidence.NewEvidenceStoreClient(cc)
-	// ToDo(lebogg): whats with the err?
-	s.EvidenceStoreStream, _ = evidenceStoreClient.StoreEvidences(context.Background())
 
 	// create an authorizer from env vars or Azure Managed Service Identity
 	authorizer, err := auth.NewAuthorizerFromCLI()
@@ -171,7 +162,7 @@ func (s *Service) Start(_ context.Context, _ *discovery.StartDiscoveryRequest) (
 
 	s.scheduler.StartAsync()
 
-	return response, nil
+	return resp, nil
 }
 
 func (s Service) Shutdown() {
@@ -195,8 +186,7 @@ func (s Service) StartDiscovery(discoverer discovery.Discoverer) {
 		s.resources[string(resource.GetID())] = resource
 
 		var (
-			v   *structpb.Value
-			err error
+			v *structpb.Value
 		)
 
 		v, err = voc.ToStruct(resource)
@@ -213,26 +203,13 @@ func (s Service) StartDiscovery(discoverer discovery.Discoverer) {
 			Resource:  v,
 		}
 
-		if s.AssessmentStream == nil {
+		if s.assessmentStream == nil {
 			log.Warnf("Evidence stream to Assessment component not available")
 			continue
 		}
 
-		if s.EvidenceStoreStream == nil {
-			log.Warnf("Evidence stream to EvidenceStore component not available")
-			continue
-		}
-
-		log.Debugf("Sending evidence for resource %s (%s)...", resource.GetID(), strings.Join(resource.GetType(), ", "))
-
-		err = s.AssessmentStream.Send(&assessment.AssessEvidenceRequest{Evidence: e})
-		if err != nil {
-			log.Errorf("Could not send evidence to Assessment: %v", err)
-		}
-
-		err = s.EvidenceStoreStream.Send(&evidence.StoreEvidenceRequest{Evidence: e})
-		if err != nil {
-			log.Errorf("Could not send evidence to EvidenceStore: %v", err)
+		if err = s.assessmentStream.Send(&assessment.AssessEvidenceRequest{Evidence: e}); err != nil {
+			log.WithError(handleError(err, "Assessment"))
 		}
 	}
 }
@@ -264,3 +241,15 @@ func (s Service) Query(_ context.Context, request *discovery.QueryRequest) (resp
 		Results: &structpb.ListValue{Values: r},
 	}, nil
 }
+
+// handleError prints out the error according to the status code
+func handleError(err error, dest string) error {
+	prefix := "could not send evidence to " + dest
+	if status.Code(err) == codes.Internal {
+		return fmt.Errorf("%s. Internal error on the server side: %v", prefix, err)
+	} else if status.Code(err) == codes.InvalidArgument {
+		return fmt.Errorf("invalid evidence - provide evidence in the right format: %v", err)
+	} else {
+		return err
+	}
+}
diff --git a/service/evidence/evidence_store.go b/service/evidence/evidence_store.go
index 9c48dba6..8e6c5de2 100644
--- a/service/evidence/evidence_store.go
+++ b/service/evidence/evidence_store.go
@@ -29,6 +29,7 @@ import (
 	"context"
 	"fmt"
 	"io"
+	"sync"
 
 	"clouditor.io/clouditor/api/evidence"
 	"github.com/sirupsen/logrus"
@@ -47,6 +48,8 @@ type Service struct {
 	// evidenceHooks is a list of hook functions that can be used if one wants to be
 	// informed about each evidence
 	evidenceHooks []evidence.EvidenceHookFunc
+	// mu is used for (un)locking result hook calls
+	mu sync.Mutex
 
 	evidence.UnimplementedEvidenceStoreServer
 }
@@ -58,10 +61,10 @@ func NewService() *Service {
 }
 
 func init() {
-	log = logrus.WithField("component", "req")
+	log = logrus.WithField("component", "Evidence Store")
 }
 
-// StoreEvidence is a method implementation of the evidenceServer interface: It receives an req and stores it
+// StoreEvidence is a method implementation of the evidenceServer interface: It receives a req and stores it
 func (s *Service) StoreEvidence(_ context.Context, req *evidence.StoreEvidenceRequest) (resp *evidence.StoreEvidenceResponse, err error) {
 
 	_, err = req.Evidence.Validate()
@@ -69,7 +72,7 @@ func (s *Service) StoreEvidence(_ context.Context, req *evidence.StoreEvidenceRe
 		log.Errorf("Invalid evidence: %v", err)
 		newError := fmt.Errorf("invalid evidence: %w", err)
 
-		s.informHooks(nil, newError)
+		go s.informHooks(nil, newError)
 
 		resp = &evidence.StoreEvidenceResponse{
 			Status: false,
@@ -79,12 +82,14 @@ func (s *Service) StoreEvidence(_ context.Context, req *evidence.StoreEvidenceRe
 	}
 
 	s.evidences[req.Evidence.Id] = req.Evidence
-	s.informHooks(req.Evidence, nil)
+	go s.informHooks(req.Evidence, nil)
 
 	resp = &evidence.StoreEvidenceResponse{
 		Status: true,
 	}
 
+	log.Infof("Evidence stored with id: %v", req.Evidence.Id)
+
 	return resp, nil
 }
 
@@ -130,11 +135,14 @@ func (s *Service) RegisterEvidenceHook(evidenceHook evidence.EvidenceHookFunc) {
 	s.evidenceHooks = append(s.evidenceHooks, evidenceHook)
 }
 
-func (s Service) informHooks(result *evidence.Evidence, err error) {
+func (s *Service) informHooks(result *evidence.Evidence, err error) {
+	s.mu.Lock()
+	defer s.mu.Unlock()
 	// Inform our hook, if we have any
 	if s.evidenceHooks != nil {
 		for _, hook := range s.evidenceHooks {
-			go hook(result, err)
+			// TODO(all): We could do hook concurrent again (assuming different hooks don't interfere with each other)
+			hook(result, err)
 		}
 	}
 }
diff --git a/service/orchestrator/orchestrator.go b/service/orchestrator/orchestrator.go
index e2dbe6e1..06203b83 100644
--- a/service/orchestrator/orchestrator.go
+++ b/service/orchestrator/orchestrator.go
@@ -33,6 +33,7 @@ import (
 	"google.golang.org/protobuf/types/known/emptypb"
 	"io"
 	"io/ioutil"
+	"sync"
 
 	"clouditor.io/clouditor/api/assessment"
 	"clouditor.io/clouditor/api/orchestrator"
@@ -65,6 +66,8 @@ type Service struct {
 
 	// Hook
 	AssessmentResultHooks []func(result *assessment.AssessmentResult, err error)
+	// mu is used for (un)locking result hook calls
+	mu sync.Mutex
 
 	db *gorm.DB
 }
@@ -205,14 +208,15 @@ func (s *Service) StoreAssessmentResult(_ context.Context, req *orchestrator.Sto
 		log.Errorf("Invalid assessment result: %v", err)
 		newError := fmt.Errorf("invalid assessment result: %w", err)
 
-		s.informHook(nil, newError)
+		go s.informHook(nil, newError)
 
 		return resp, status.Errorf(codes.InvalidArgument, "invalid req: %v", err)
 	}
 
+	// TODO(all): We do not check ID in Validate. Therefore, I assume that we have to set ID here?
 	s.results[req.Result.Id] = req.Result
 
-	s.informHook(req.Result, nil)
+	go s.informHook(req.Result, nil)
 
 	return
 }
@@ -246,15 +250,30 @@ func (s *Service) StoreAssessmentResults(stream orchestrator.Orchestrator_StoreA
 
 }
 
+// ListAssessmentResults is a method implementation of the orchestrator interface
+func (s *Service) ListAssessmentResults(_ context.Context, _ *assessment.ListAssessmentResultsRequest) (res *assessment.ListAssessmentResultsResponse, err error) {
+	res = new(assessment.ListAssessmentResultsResponse)
+	res.Results = []*assessment.AssessmentResult{}
+
+	for _, result := range s.results {
+		res.Results = append(res.Results, result)
+	}
+
+	return
+}
+
 func (s *Service) RegisterAssessmentResultHook(hook func(result *assessment.AssessmentResult, err error)) {
 	s.AssessmentResultHooks = append(s.AssessmentResultHooks, hook)
 }
 
-func (s Service) informHook(result *assessment.AssessmentResult, err error) {
+func (s *Service) informHook(result *assessment.AssessmentResult, err error) {
+	s.mu.Lock()
+	defer s.mu.Unlock()
 	// Inform our hook, if we have any
 	if s.AssessmentResultHooks != nil {
 		for _, hook := range s.AssessmentResultHooks {
-			go hook(result, err)
+			// TODO(all): We could do hook concurrent again (assuming different hooks don't interfere with each other)
+			hook(result, err)
 		}
 	}
 }


Test patch:
diff --git a/cli/commands/orchestrator/orchestrator_test.go b/cli/commands/orchestrator/orchestrator_test.go
new file mode 100644
index 00000000..11012dba
--- /dev/null
+++ b/cli/commands/orchestrator/orchestrator_test.go
@@ -0,0 +1,144 @@
+package orchestrator
+
+import (
+	"bytes"
+	"clouditor.io/clouditor/api/assessment"
+	"clouditor.io/clouditor/api/orchestrator"
+	"clouditor.io/clouditor/cli"
+	"clouditor.io/clouditor/cli/commands/login"
+	"clouditor.io/clouditor/persistence"
+	service_auth "clouditor.io/clouditor/service/auth"
+	service_orchestrator "clouditor.io/clouditor/service/orchestrator"
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/spf13/viper"
+	"github.com/stretchr/testify/assert"
+	"google.golang.org/grpc"
+	"google.golang.org/protobuf/encoding/protojson"
+	"google.golang.org/protobuf/types/known/structpb"
+	"google.golang.org/protobuf/types/known/timestamppb"
+	"io/ioutil"
+	"net"
+	"os"
+	"testing"
+)
+
+var sock net.Listener
+var server *grpc.Server
+
+func TestMain(m *testing.M) {
+	var (
+		err     error
+		dir     string
+		service *service_orchestrator.Service
+	)
+
+	err = os.Chdir("../../../")
+	if err != nil {
+		panic(err)
+	}
+
+	err = persistence.InitDB(true, "", 0)
+	if err != nil {
+		panic(err)
+	}
+
+	service = service_orchestrator.NewService()
+
+	sock, server, err = service_auth.StartDedicatedAuthServer(":0")
+	if err != nil {
+		panic(err)
+	}
+	orchestrator.RegisterOrchestratorServer(server, service)
+	_, err = service.StoreAssessmentResult(context.TODO(), &orchestrator.StoreAssessmentResultRequest{
+		Result: &assessment.AssessmentResult{
+			Id:         "assessmentResultID",
+			MetricId:   "assessmentResultMetricID",
+			EvidenceId: "evidenceID",
+			Timestamp:  timestamppb.Now(),
+			MetricConfiguration: &assessment.MetricConfiguration{
+				TargetValue: toStruct(1.0),
+				Operator:    "operator",
+				IsDefault:   true,
+			}}})
+
+	if err != nil {
+		panic(err)
+	}
+
+	defer func(sock net.Listener) {
+		err = sock.Close()
+		if err != nil {
+			panic(err)
+		}
+	}(sock)
+	defer server.Stop()
+
+	dir, err = ioutil.TempDir(os.TempDir(), ".clouditor")
+	if err != nil {
+		panic(err)
+	}
+
+	viper.Set("username", "clouditor")
+	viper.Set("password", "clouditor")
+	viper.Set("session-directory", dir)
+
+	cmd := login.NewLoginCommand()
+	err = cmd.RunE(nil, []string{fmt.Sprintf("localhost:%d", sock.Addr().(*net.TCPAddr).Port)})
+	if err != nil {
+		panic(err)
+	}
+	defer os.Exit(m.Run())
+}
+
+func TestAddCommands(t *testing.T) {
+	cmd := NewOrchestratorCommand()
+
+	// Check if sub commands were added
+	assert.True(t, cmd.HasSubCommands())
+
+	// Check if NewListResultsCommand was added
+	for _, v := range cmd.Commands() {
+		if v.Use == "list" {
+			return
+		}
+	}
+	t.Errorf("No list command was added")
+}
+
+func TestNewListResultsCommand(t *testing.T) {
+	var b bytes.Buffer
+
+	cli.Output = &b
+
+	cmd := NewListResultsCommand()
+	err := cmd.RunE(nil, []string{})
+	assert.Nil(t, err)
+
+	var response = &assessment.ListAssessmentResultsResponse{}
+	err = protojson.Unmarshal(b.Bytes(), response)
+
+	assert.Nil(t, err)
+	assert.NotNil(t, response)
+	assert.NotEmpty(t, response.Results)
+}
+
+func toStruct(f float32) (s *structpb.Value) {
+	var (
+		b   []byte
+		err error
+	)
+
+	s = new(structpb.Value)
+
+	b, err = json.Marshal(f)
+	if err != nil {
+		return nil
+	}
+	if err = json.Unmarshal(b, &s); err != nil {
+		return nil
+	}
+
+	return
+}
diff --git a/service/assessment/assessment_test.go b/service/assessment/assessment_test.go
index 6a5ff86c..7ed44d55 100644
--- a/service/assessment/assessment_test.go
+++ b/service/assessment/assessment_test.go
@@ -28,14 +28,25 @@ package assessment
 import (
 	"clouditor.io/clouditor/api/assessment"
 	"clouditor.io/clouditor/api/evidence"
+	"clouditor.io/clouditor/api/orchestrator"
+	service_evidenceStore "clouditor.io/clouditor/service/evidence"
+	service_orchestrator "clouditor.io/clouditor/service/orchestrator"
 	"clouditor.io/clouditor/voc"
 	"context"
+	"encoding/json"
+	"fmt"
 	"github.com/stretchr/testify/assert"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/credentials/insecure"
 	"google.golang.org/grpc/metadata"
+	"google.golang.org/grpc/status"
+	"google.golang.org/grpc/test/bufconn"
 	"google.golang.org/protobuf/types/known/emptypb"
 	"google.golang.org/protobuf/types/known/structpb"
 	"google.golang.org/protobuf/types/known/timestamppb"
 	"io"
+	"net"
 	"os"
 	"reflect"
 	"runtime"
@@ -43,7 +54,21 @@ import (
 	"time"
 )
 
+var lis *bufconn.Listener
+
 func TestMain(m *testing.M) {
+	// pre-configuration for mocking evidence store
+	const bufSize = 1024 * 1024 * 2
+	lis = bufconn.Listen(bufSize)
+	s := grpc.NewServer()
+	evidence.RegisterEvidenceStoreServer(s, service_evidenceStore.NewService())
+	orchestrator.RegisterOrchestratorServer(s, service_orchestrator.NewService())
+	go func() {
+		if err := s.Serve(lis); err != nil {
+			log.Fatalf("Server exited with error: %v", err)
+		}
+	}()
+
 	// make sure, that we are in the clouditor root folder to find the policies
 	err := os.Chdir("../../")
 	if err != nil {
@@ -64,6 +89,8 @@ func TestNewService(t *testing.T) {
 			want: &Service{
 				results:                       make(map[string]*assessment.AssessmentResult),
 				UnimplementedAssessmentServer: assessment.UnimplementedAssessmentServer{},
+				EvidenceStoreAddress:          "localhost:9090",
+				OrchestratorAddress:           "localhost:9090",
 			},
 		},
 	}
@@ -83,10 +110,12 @@ func TestAssessEvidence(t *testing.T) {
 		evidence *evidence.Evidence
 	}
 	tests := []struct {
-		name     string
-		args     args
-		wantResp *assessment.AssessEvidenceResponse
-		wantErr  bool
+		name string
+		args args
+		// hasRPCConnection is true when connected to orchestrator and evidence store
+		hasRPCConnection bool
+		wantResp         *assessment.AssessEvidenceResponse
+		wantErr          bool
 	}{
 		{
 			name: "Assess resource without id",
@@ -98,6 +127,7 @@ func TestAssessEvidence(t *testing.T) {
 					Resource:  toStruct(voc.VirtualMachine{}, t),
 				},
 			},
+			hasRPCConnection: true,
 			wantResp: &assessment.AssessEvidenceResponse{
 				Status: false,
 			},
@@ -112,6 +142,7 @@ func TestAssessEvidence(t *testing.T) {
 					Resource:  toStruct(voc.VirtualMachine{}, t),
 				},
 			},
+			hasRPCConnection: true,
 			wantResp: &assessment.AssessEvidenceResponse{
 				Status: false,
 			},
@@ -126,6 +157,7 @@ func TestAssessEvidence(t *testing.T) {
 					Resource: toStruct(voc.VirtualMachine{}, t),
 				},
 			},
+			hasRPCConnection: true,
 			wantResp: &assessment.AssessEvidenceResponse{
 				Status: false,
 			},
@@ -136,20 +168,41 @@ func TestAssessEvidence(t *testing.T) {
 			args: args{
 				in0: context.TODO(),
 				evidence: &evidence.Evidence{
+					Id:        "mockEvidenceId",
 					ToolId:    "mock",
 					Timestamp: timestamppb.Now(),
 					Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{"VirtualMachine"}}}}, t),
 				},
 			},
+			hasRPCConnection: true,
 			wantResp: &assessment.AssessEvidenceResponse{
 				Status: true,
 			},
 			wantErr: false,
 		},
+		{
+			name: "No RPC connections",
+			args: args{
+				in0: context.TODO(),
+				evidence: &evidence.Evidence{
+					Id:        "mockEvidenceId",
+					ToolId:    "mock",
+					Timestamp: timestamppb.Now(),
+					Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{"VirtualMachine"}}}}, t),
+				},
+			},
+			hasRPCConnection: false,
+			wantResp:         &assessment.AssessEvidenceResponse{Status: false},
+			wantErr:          true,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			s := NewService()
+			if tt.hasRPCConnection {
+				assert.NoError(t, s.mockEvidenceStream())
+				assert.NoError(t, s.mockOrchestratorStream())
+			}
 
 			gotResp, err := s.AssessEvidence(tt.args.in0, &assessment.AssessEvidenceRequest{Evidence: tt.args.evidence})
 			if (err != nil) != tt.wantErr {
@@ -164,8 +217,9 @@ func TestAssessEvidence(t *testing.T) {
 	}
 }
 
-func TestService_AssessEvidences(t *testing.T) {
+func TestAssessEvidences(t *testing.T) {
 	type fields struct {
+		hasRPCConnection              bool
 		ResultHooks                   []assessment.ResultHookFunc
 		results                       map[string]*assessment.AssessmentResult
 		UnimplementedAssessmentServer assessment.UnimplementedAssessmentServer
@@ -181,8 +235,10 @@ func TestService_AssessEvidences(t *testing.T) {
 		wantErrMessage string
 	}{
 		{
-			name:   "Assessing evidences fails due to missing toolId",
-			fields: fields{results: make(map[string]*assessment.AssessmentResult)},
+			name: "Missing toolId",
+			fields: fields{
+				hasRPCConnection: true,
+				results:          make(map[string]*assessment.AssessmentResult)},
 			args: args{stream: &mockAssessmentStream{
 				evidence: &evidence.Evidence{
 					Timestamp: timestamppb.Now(),
@@ -193,10 +249,13 @@ func TestService_AssessEvidences(t *testing.T) {
 			wantErrMessage: "invalid evidence",
 		},
 		{
-			name:   "Assess evidences",
-			fields: fields{results: make(map[string]*assessment.AssessmentResult)},
+			name: "Assess evidences",
+			fields: fields{
+				hasRPCConnection: true,
+				results:          make(map[string]*assessment.AssessmentResult)},
 			args: args{stream: &mockAssessmentStream{
 				evidence: &evidence.Evidence{
+					Id:        "MockEvidenceId",
 					ToolId:    "mock",
 					Timestamp: timestamppb.Now(),
 					Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{"VirtualMachine"}}}}, t),
@@ -205,6 +264,15 @@ func TestService_AssessEvidences(t *testing.T) {
 			wantErr:        false,
 			wantErrMessage: "",
 		},
+		{
+			name: "No RPC connections",
+			fields: fields{
+				hasRPCConnection: false,
+			},
+			args:           args{stream: &mockAssessmentStreamWithRecvErr{}},
+			wantErr:        true,
+			wantErrMessage: codes.Internal.String(),
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -213,9 +281,15 @@ func TestService_AssessEvidences(t *testing.T) {
 				results:                       tt.fields.results,
 				UnimplementedAssessmentServer: tt.fields.UnimplementedAssessmentServer,
 			}
+			if tt.fields.hasRPCConnection {
+				assert.NoError(t, s.mockEvidenceStream())
+				assert.NoError(t, s.mockOrchestratorStream())
+			}
+
 			err := s.AssessEvidences(tt.args.stream)
+			fmt.Println(err)
 			if (err != nil) != tt.wantErr {
-				t.Errorf("AssessEvidence() error = %v, wantErr %v", err, tt.wantErr)
+				t.Errorf("Got AssessEvidence() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
 
@@ -282,6 +356,8 @@ func TestAssessmentResultHooks(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			hookCallCounter = 0
 			s := NewService()
+			assert.NoError(t, s.mockEvidenceStream())
+			assert.NoError(t, s.mockOrchestratorStream())
 
 			for i, hookFunction := range tt.args.resultHooks {
 				s.RegisterAssessmentResultHook(hookFunction)
@@ -312,8 +388,11 @@ func TestAssessmentResultHooks(t *testing.T) {
 
 func TestListAssessmentResults(t *testing.T) {
 	s := NewService()
+	assert.NoError(t, s.mockEvidenceStream())
+	assert.NoError(t, s.mockOrchestratorStream())
 	_, err := s.AssessEvidence(context.TODO(), &assessment.AssessEvidenceRequest{
 		Evidence: &evidence.Evidence{
+			Id:        "mockEvidenceId",
 			ToolId:    "mock",
 			Timestamp: timestamppb.Now(),
 			Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{"VirtualMachine"}}}}, t),
@@ -379,3 +458,278 @@ func (mockAssessmentStream) SendMsg(interface{}) error {
 func (mockAssessmentStream) RecvMsg(interface{}) error {
 	return nil
 }
+
+// mockAssessmentStream implements Assessment_AssessEvidencesServer which directly throws error on Recv
+type mockAssessmentStreamWithRecvErr struct {
+}
+
+func (mockAssessmentStreamWithRecvErr) SendAndClose(*emptypb.Empty) error {
+	return nil
+}
+
+func (mockAssessmentStreamWithRecvErr) Recv() (*assessment.AssessEvidenceRequest, error) {
+	return nil, status.Errorf(codes.Internal, "receiving internal error")
+}
+
+func (mockAssessmentStreamWithRecvErr) SetHeader(metadata.MD) error {
+	return nil
+}
+
+func (mockAssessmentStreamWithRecvErr) SendHeader(metadata.MD) error {
+	return nil
+}
+
+func (mockAssessmentStreamWithRecvErr) SetTrailer(metadata.MD) {
+}
+
+func (mockAssessmentStreamWithRecvErr) Context() context.Context {
+	return nil
+}
+
+func (mockAssessmentStreamWithRecvErr) SendMsg(interface{}) error {
+	return nil
+}
+
+func (mockAssessmentStreamWithRecvErr) RecvMsg(interface{}) error {
+	return nil
+}
+
+func TestConvertTargetValue(t *testing.T) {
+	type args struct {
+		value interface{}
+	}
+	tests := []struct {
+		name                     string
+		args                     args
+		wantConvertedTargetValue *structpb.Value
+		wantErr                  assert.ErrorAssertionFunc
+	}{
+		{
+			name:                     "string",
+			args:                     args{value: "TLS1.3"},
+			wantConvertedTargetValue: &structpb.Value{Kind: &structpb.Value_StringValue{StringValue: "TLS1.3"}},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return err == nil
+			},
+		},
+		{
+			name:                     "bool",
+			args:                     args{value: false},
+			wantConvertedTargetValue: &structpb.Value{Kind: &structpb.Value_BoolValue{BoolValue: false}},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return err == nil
+			},
+		},
+		{
+			name:                     "jsonNumber",
+			args:                     args{value: json.Number("4")},
+			wantConvertedTargetValue: &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: 4.}},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return err == nil
+			},
+		},
+		{
+			name:                     "int",
+			args:                     args{value: 4},
+			wantConvertedTargetValue: &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: 4.}},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return err == nil
+			},
+		},
+		{
+			name:                     "float64",
+			args:                     args{value: 4.},
+			wantConvertedTargetValue: &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: 4.}},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return err == nil
+			},
+		},
+		{
+			name:                     "float32",
+			args:                     args{value: float32(4.)},
+			wantConvertedTargetValue: &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: 4.}},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return err == nil
+			},
+		},
+		{
+			name: "list of strings",
+			args: args{value: []string{"TLS1.2", "TLS1.3"}},
+			wantConvertedTargetValue: &structpb.Value{Kind: &structpb.Value_ListValue{ListValue: &structpb.ListValue{Values: []*structpb.Value{
+				{Kind: &structpb.Value_StringValue{StringValue: "TLS1.2"}},
+				{Kind: &structpb.Value_StringValue{StringValue: "TLS1.3"}},
+			}}}},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return err == nil
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			gotConvertedTargetValue, err := convertTargetValue(tt.args.value)
+			if !tt.wantErr(t, err, fmt.Sprintf("convertTargetValue(%v)", tt.args.value)) {
+				return
+			}
+			// Checking against 'String()' allows to compare the actual values instead of the respective pointers
+			assert.Equalf(t, tt.wantConvertedTargetValue.String(), gotConvertedTargetValue.String(), "convertTargetValue(%v)", tt.args.value)
+		})
+	}
+}
+
+// Mocking evidence store service
+
+func bufDialer(context.Context, string) (net.Conn, error) {
+	return lis.Dial()
+}
+
+func (s *Service) mockEvidenceStream() error {
+	ctx := context.Background()
+	conn, err := grpc.DialContext(ctx, "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithTransportCredentials(insecure.NewCredentials()))
+	if err != nil {
+		return err
+	}
+	client, err := evidence.NewEvidenceStoreClient(conn).StoreEvidences(ctx)
+	if err != nil {
+		return err
+	}
+	s.evidenceStoreStream = client
+	return nil
+}
+
+func (s *Service) mockOrchestratorStream() error {
+	ctx := context.Background()
+	conn, err := grpc.DialContext(ctx, "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithTransportCredentials(insecure.NewCredentials()))
+	if err != nil {
+		return err
+	}
+	client, err := orchestrator.NewOrchestratorClient(conn).StoreAssessmentResults(ctx)
+	if err != nil {
+		return err
+	}
+	s.orchestratorStream = client
+	return nil
+}
+
+func TestHandleEvidence(t *testing.T) {
+	type fields struct {
+		hasEvidenceStoreStream bool
+		hasOrchestratorStream  bool
+		//results                       map[string]*assessment.AssessmentResult
+	}
+	type args struct {
+		evidence   *evidence.Evidence
+		resourceId string
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr assert.ErrorAssertionFunc
+	}{
+		{
+			name: "correct evidence",
+			fields: fields{
+				hasOrchestratorStream:  true,
+				hasEvidenceStoreStream: true,
+			},
+			args: args{
+				evidence: &evidence.Evidence{
+					Id:        "mockEvidenceId",
+					ToolId:    "mock",
+					Timestamp: timestamppb.Now(),
+					Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{"VirtualMachine"}}}}, t),
+				},
+				resourceId: "my-resource-id",
+			},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				assert.NoError(t, err)
+				return false
+			},
+		},
+		{
+			name: "missing type in evidence",
+			fields: fields{
+				hasOrchestratorStream:  true,
+				hasEvidenceStoreStream: true,
+			},
+			args: args{
+				evidence: &evidence.Evidence{
+					Id:        "mockEvidenceId",
+					ToolId:    "mock",
+					Timestamp: timestamppb.Now(),
+					Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{}}}}, t),
+				},
+				resourceId: "my-resource-id",
+			},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				assert.Error(t, err)
+				// Check if error message contains "empty" (list of types)
+				assert.Contains(t, err.Error(), "empty")
+				return true
+			},
+		},
+		{
+			name: "no connection to Evidence Store",
+			fields: fields{
+				hasOrchestratorStream:  true,
+				hasEvidenceStoreStream: false,
+			},
+			args: args{
+				evidence: &evidence.Evidence{
+					Id:        "mockEvidenceId",
+					ToolId:    "mock",
+					Timestamp: timestamppb.Now(),
+					Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{"VirtualMachine"}}}}, t),
+				},
+				resourceId: "my-resource-id",
+			},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				assert.Error(t, err)
+				// Check if error message contains "empty" (list of types)
+				assert.Contains(t, err.Error(), "Evidence Store")
+				assert.Contains(t, err.Error(), "Unavailable desc")
+				return true
+			},
+		},
+		{
+			name: "no connection to Orchestrator",
+			fields: fields{
+				hasOrchestratorStream:  false,
+				hasEvidenceStoreStream: true,
+			},
+			args: args{
+				evidence: &evidence.Evidence{
+					Id:        "mockEvidenceId",
+					ToolId:    "mock",
+					Timestamp: timestamppb.Now(),
+					Resource:  toStruct(voc.VirtualMachine{Compute: &voc.Compute{CloudResource: &voc.CloudResource{ID: "my-resource-id", Type: []string{"VirtualMachine"}}}}, t),
+				},
+				resourceId: "my-resource-id",
+			},
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				assert.Error(t, err)
+				// Check if error message contains "empty" (list of types)
+				assert.Contains(t, err.Error(), "Orchestrator")
+				assert.Contains(t, err.Error(), "Unavailable desc")
+				return true
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := NewService()
+			// Mock streams for target services if needed
+			if tt.fields.hasEvidenceStoreStream {
+				assert.NoError(t, s.mockEvidenceStream())
+			}
+			if tt.fields.hasOrchestratorStream {
+				assert.NoError(t, s.mockOrchestratorStream())
+			}
+			// Two tests: 1st) wantErr function. 2nd) if wantErr false then check if a result is added to map
+			if !tt.wantErr(t, s.handleEvidence(tt.args.evidence, tt.args.resourceId), fmt.Sprintf("handleEvidence(%v, %v)", tt.args.evidence, tt.args.resourceId)) {
+				assert.NotEmpty(t, s.results)
+			}
+
+		})
+	}
+}
diff --git a/service/discovery/discovery_test.go b/service/discovery/discovery_test.go
index b66c506c..f2ad8418 100644
--- a/service/discovery/discovery_test.go
+++ b/service/discovery/discovery_test.go
@@ -27,7 +27,10 @@ package discovery
 
 import (
 	"context"
+	"errors"
 	"fmt"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
 	"testing"
 	"time"
 
@@ -95,13 +98,12 @@ func TestStartDiscovery(t *testing.T) {
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			discoveryService.AssessmentStream = tt.fields.assessmentStream
-			discoveryService.EvidenceStoreStream = tt.fields.evidenceStoreStream
+			discoveryService.assessmentStream = tt.fields.assessmentStream
 			discoveryService.StartDiscovery(tt.fields.discoverer)
 
 			// APIs for assessment and evidence store both send the same evidence. Thus, testing one is enough.
 			if tt.checkEvidence {
-				e := discoveryService.AssessmentStream.(*mockAssessmentStream).sentEvidence
+				e := discoveryService.assessmentStream.(*mockAssessmentStream).sentEvidence
 				// Check if UUID has been created
 				assert.NotEmpty(t, e.Id)
 				// Check if cloud resources / properties are there
@@ -181,13 +183,57 @@ func TestShutdown(t *testing.T) {
 
 }
 
+// TestHandleError tests handleError (if all error cases are executed/printed)
+func TestHandleError(t *testing.T) {
+	type args struct {
+		err  error
+		dest string
+	}
+	tests := []struct {
+		name           string
+		args           args
+		wantErrSnippet string
+	}{
+		{
+			name: "handleInternalError",
+			args: args{
+				err:  status.Error(codes.Internal, "internal error"),
+				dest: "SomeDestination",
+			},
+			wantErrSnippet: "internal",
+		},
+		{
+			name: "handleInvalidError",
+			args: args{
+				err:  status.Errorf(codes.InvalidArgument, "invalid argument"),
+				dest: "SomeDestination",
+			},
+			wantErrSnippet: "invalid",
+		},
+		{
+			name: "handleSomeOtherErr",
+			args: args{
+				err:  errors.New("some other error"),
+				dest: "SomeDestination",
+			},
+			wantErrSnippet: "some other error",
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := handleError(tt.args.err, tt.args.dest)
+			assert.Contains(t, err.Error(), tt.wantErrSnippet)
+		})
+	}
+}
+
 // mockDiscoverer implements Discoverer and mocks the API to cloud resources
 type mockDiscoverer struct {
 	// testCase allows for different implementations for table tests in TestStartDiscovery
 	testCase int
 }
 
-func (m mockDiscoverer) Name() string { return "just mocking" }
+func (mockDiscoverer) Name() string { return "just mocking" }
 
 func (m mockDiscoverer) List() ([]voc.IsCloudResource, error) {
 	switch m.testCase {