diff --git a/.gitignore b/.gitignore
index 13bbe5b9112f9828a4f0eae28e0eb34e5fdb58d1..9f11b755a17d8192c60f61cb17b8902dffbd9f23 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1 @@
 .idea/
-
diff --git a/design/design.go b/design/design.go
index 109dc62bdde2af20ef3b5ee3628027ed979823e5..abce41007ea0e4a0f318f53ea93c190092d77992 100644
--- a/design/design.go
+++ b/design/design.go
@@ -24,6 +24,9 @@ var _ = Service("policy", func() {
 		Result(Any)
 		HTTP(func() {
 			POST("/policy/{group}/{policyName}/{version}/evaluation")
+			Header("evaluationID:x-evaluation-id", String, "EvaluationID allows overwriting the randomly generated evaluationID", func() {
+				Example("did:web:example.com")
+			})
 			Body("input")
 			Response(StatusOK)
 		})
diff --git a/design/types.go b/design/types.go
index 26996205e55069980fe530a538f7b7f0e66f86c6..ca2d039047465aec00835e953f49b0b2d25adf86 100644
--- a/design/types.go
+++ b/design/types.go
@@ -14,6 +14,7 @@ var EvaluateRequest = Type("EvaluateRequest", func() {
 		Example("1.0")
 	})
 	Field(4, "input", Any, "Input data passed to the policy execution runtime.")
+	Field(5, "evaluationID", String, "Identifier created by external system and passed as parameter to overwrite the randomly generated evaluationID.")
 	Required("group", "policyName", "version", "input")
 })
 
diff --git a/gen/http/cli/policy/cli.go b/gen/http/cli/policy/cli.go
index 431940373d2895bc45f21758efb31617747abb04..91de667a21a728f23092a956ff5f4f5255a262b8 100644
--- a/gen/http/cli/policy/cli.go
+++ b/gen/http/cli/policy/cli.go
@@ -32,7 +32,7 @@ policy (evaluate|lock|unlock)
 // UsageExamples produces an example of a valid invocation of the CLI tool.
 func UsageExamples() string {
 	return os.Args[0] + ` health liveness` + "\n" +
-		os.Args[0] + ` policy evaluate --body "Ab accusamus voluptatem et est." --group "example" --policy-name "example" --version "1.0"` + "\n" +
+		os.Args[0] + ` policy evaluate --body "Illum ad assumenda consectetur minima voluptatibus." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Ab accusamus voluptatem et est."` + "\n" +
 		""
 }
 
@@ -54,11 +54,12 @@ func ParseEndpoint(
 
 		policyFlags = flag.NewFlagSet("policy", flag.ContinueOnError)
 
-		policyEvaluateFlags          = flag.NewFlagSet("evaluate", flag.ExitOnError)
-		policyEvaluateBodyFlag       = policyEvaluateFlags.String("body", "REQUIRED", "")
-		policyEvaluateGroupFlag      = policyEvaluateFlags.String("group", "REQUIRED", "Policy group.")
-		policyEvaluatePolicyNameFlag = policyEvaluateFlags.String("policy-name", "REQUIRED", "Policy name.")
-		policyEvaluateVersionFlag    = policyEvaluateFlags.String("version", "REQUIRED", "Policy version.")
+		policyEvaluateFlags            = flag.NewFlagSet("evaluate", flag.ExitOnError)
+		policyEvaluateBodyFlag         = policyEvaluateFlags.String("body", "REQUIRED", "")
+		policyEvaluateGroupFlag        = policyEvaluateFlags.String("group", "REQUIRED", "Policy group.")
+		policyEvaluatePolicyNameFlag   = policyEvaluateFlags.String("policy-name", "REQUIRED", "Policy name.")
+		policyEvaluateVersionFlag      = policyEvaluateFlags.String("version", "REQUIRED", "Policy version.")
+		policyEvaluateEvaluationIDFlag = policyEvaluateFlags.String("evaluation-id", "", "")
 
 		policyLockFlags          = flag.NewFlagSet("lock", flag.ExitOnError)
 		policyLockGroupFlag      = policyLockFlags.String("group", "REQUIRED", "Policy group.")
@@ -171,7 +172,7 @@ func ParseEndpoint(
 			switch epn {
 			case "evaluate":
 				endpoint = c.Evaluate()
-				data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag)
+				data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag, *policyEvaluateEvaluationIDFlag)
 			case "lock":
 				endpoint = c.Lock()
 				data, err = policyc.BuildLockPayload(*policyLockGroupFlag, *policyLockPolicyNameFlag, *policyLockVersionFlag)
@@ -238,16 +239,17 @@ Additional help:
 `, os.Args[0])
 }
 func policyEvaluateUsage() {
-	fmt.Fprintf(os.Stderr, `%[1]s [flags] policy evaluate -body JSON -group STRING -policy-name STRING -version STRING
+	fmt.Fprintf(os.Stderr, `%[1]s [flags] policy evaluate -body JSON -group STRING -policy-name STRING -version STRING -evaluation-id STRING
 
 Evaluate executes a policy with the given 'data' as input.
     -body JSON: 
     -group STRING: Policy group.
     -policy-name STRING: Policy name.
     -version STRING: Policy version.
+    -evaluation-id STRING: 
 
 Example:
-    %[1]s policy evaluate --body "Ab accusamus voluptatem et est." --group "example" --policy-name "example" --version "1.0"
+    %[1]s policy evaluate --body "Illum ad assumenda consectetur minima voluptatibus." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Ab accusamus voluptatem et est."
 `, os.Args[0])
 }
 
@@ -260,7 +262,7 @@ Lock a policy so that it cannot be evaluated.
     -version STRING: Policy version.
 
 Example:
-    %[1]s policy lock --group "Vitae qui." --policy-name "Provident fugiat at cupiditate." --version "Commodi vitae voluptatem."
+    %[1]s policy lock --group "Commodi vitae voluptatem." --policy-name "Similique quisquam optio." --version "Explicabo beatae quisquam officiis libero voluptatibus."
 `, os.Args[0])
 }
 
@@ -273,6 +275,6 @@ Unlock a policy so it can be evaluated again.
     -version STRING: Policy version.
 
 Example:
-    %[1]s policy unlock --group "Aut ut fuga quae eius minus." --policy-name "Architecto quibusdam ab." --version "In illum est et hic."
+    %[1]s policy unlock --group "In illum est et hic." --policy-name "Deleniti non nihil dolor aut sed." --version "Incidunt unde consequatur voluptas dolorem nisi temporibus."
 `, os.Args[0])
 }
diff --git a/gen/http/openapi.json b/gen/http/openapi.json
index e45394a13bd6d5c554dec72c55245d7e1f09fcae..b87425d258c3be0080a5d16b598585dcfe870853 100644
--- a/gen/http/openapi.json
+++ b/gen/http/openapi.json
@@ -1 +1 @@
-{"swagger":"2.0","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":""},"host":"localhost:8081","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"}}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/lock":{"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]},"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}}}}
\ No newline at end of file
+{"swagger":"2.0","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":""},"host":"localhost:8081","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","required":false,"type":"string"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"}}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/lock":{"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]},"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}}}}
\ No newline at end of file
diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml
index e8bcb485a33fadf93c1fd3cc62f9d1273a2a89d5..3552e210a9053c6309155fb89bafad26270d441b 100644
--- a/gen/http/openapi.yaml
+++ b/gen/http/openapi.yaml
@@ -47,6 +47,11 @@ paths:
         description: Policy version.
         required: true
         type: string
+      - name: x-evaluation-id
+        in: header
+        description: EvaluationID allows overwriting the randomly generated evaluationID
+        required: false
+        type: string
       - name: any
         in: body
         description: Input data passed to the policy execution runtime.
diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json
index 87f8be3859ea0679e8151b3d3e9cd10c22973d63..ab7d6bd20a75a405353148b5eadf480c81cb12b1 100644
--- a/gen/http/openapi3.json
+++ b/gen/http/openapi3.json
@@ -1 +1 @@
-{"openapi":"3.0.3","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":"1.0"},"servers":[{"url":"http://localhost:8081","description":"Policy Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Deleniti non nihil dolor aut sed.","format":"binary"},"example":"Omnis quasi aut consequuntur."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Incidunt unde consequatur voluptas dolorem nisi temporibus.","format":"binary"},"example":"Tempore minus."}}}}}},"/policy/{group}/{policyName}/{version}/lock":{"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Dolorem cumque laborum quis nesciunt."},"example":"Aut voluptas."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Sint nam voluptatem ea consequatur similique et."},"example":"Non mollitia nesciunt impedit facere."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Ut commodi perspiciatis corporis."},"example":"Accusamus autem sequi."}],"responses":{"200":{"description":"OK response."}}},"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Quis quos qui earum velit illum."},"example":"Aliquam atque voluptatum ut dolorem."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Aut facere veniam repudiandae id."},"example":"Aut minus alias."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"At eos facilis molestias in voluptas rem."},"example":"Ab accusantium ut ut aliquid sint animi."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}}},"components":{},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."}]}
\ No newline at end of file
+{"openapi":"3.0.3","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":"1.0"},"servers":[{"url":"http://localhost:8081","description":"Policy Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","allowEmptyValue":true,"schema":{"type":"string","description":"EvaluationID allows overwriting the randomly generated evaluationID","example":"did:web:example.com"},"example":"did:web:example.com"}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Omnis quasi aut consequuntur.","format":"binary"},"example":"Quis quos qui earum velit illum."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Tempore minus.","format":"binary"},"example":"Aliquam atque voluptatum ut dolorem."}}}}}},"/policy/{group}/{policyName}/{version}/lock":{"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Sint nam voluptatem ea consequatur similique et."},"example":"Non mollitia nesciunt impedit facere."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Ut commodi perspiciatis corporis."},"example":"Accusamus autem sequi."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Et nulla."},"example":"In quis nesciunt autem et."}],"responses":{"200":{"description":"OK response."}}},"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Aut facere veniam repudiandae id."},"example":"Aut minus alias."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"At eos facilis molestias in voluptas rem."},"example":"Ab accusantium ut ut aliquid sint animi."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Dolorem cumque laborum quis nesciunt."},"example":"Aut voluptas."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}}},"components":{},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."}]}
\ No newline at end of file
diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml
index f5a2f231aada97499f8271846caddaf3886f66c1..db303ce37efc518726e4239ffdc17e45c41e86ac 100644
--- a/gen/http/openapi3.yaml
+++ b/gen/http/openapi3.yaml
@@ -51,6 +51,15 @@ paths:
           description: Policy version.
           example: "1.0"
         example: "1.0"
+      - name: x-evaluation-id
+        in: header
+        description: EvaluationID allows overwriting the randomly generated evaluationID
+        allowEmptyValue: true
+        schema:
+          type: string
+          description: EvaluationID allows overwriting the randomly generated evaluationID
+          example: did:web:example.com
+        example: did:web:example.com
       requestBody:
         description: Input data passed to the policy execution runtime.
         required: true
@@ -59,9 +68,9 @@ paths:
             schema:
               type: string
               description: Input data passed to the policy execution runtime.
-              example: Deleniti non nihil dolor aut sed.
+              example: Omnis quasi aut consequuntur.
               format: binary
-            example: Omnis quasi aut consequuntur.
+            example: Quis quos qui earum velit illum.
       responses:
         "200":
           description: OK response.
@@ -69,9 +78,9 @@ paths:
             application/json:
               schema:
                 type: string
-                example: Incidunt unde consequatur voluptas dolorem nisi temporibus.
+                example: Tempore minus.
                 format: binary
-              example: Tempore minus.
+              example: Aliquam atque voluptatum ut dolorem.
   /policy/{group}/{policyName}/{version}/lock:
     delete:
       tags:
@@ -87,8 +96,8 @@ paths:
         schema:
           type: string
           description: Policy group.
-          example: Dolorem cumque laborum quis nesciunt.
-        example: Aut voluptas.
+          example: Sint nam voluptatem ea consequatur similique et.
+        example: Non mollitia nesciunt impedit facere.
       - name: policyName
         in: path
         description: Policy name.
@@ -96,8 +105,8 @@ paths:
         schema:
           type: string
           description: Policy name.
-          example: Sint nam voluptatem ea consequatur similique et.
-        example: Non mollitia nesciunt impedit facere.
+          example: Ut commodi perspiciatis corporis.
+        example: Accusamus autem sequi.
       - name: version
         in: path
         description: Policy version.
@@ -105,8 +114,8 @@ paths:
         schema:
           type: string
           description: Policy version.
-          example: Ut commodi perspiciatis corporis.
-        example: Accusamus autem sequi.
+          example: Et nulla.
+        example: In quis nesciunt autem et.
       responses:
         "200":
           description: OK response.
@@ -124,8 +133,8 @@ paths:
         schema:
           type: string
           description: Policy group.
-          example: Quis quos qui earum velit illum.
-        example: Aliquam atque voluptatum ut dolorem.
+          example: Aut facere veniam repudiandae id.
+        example: Aut minus alias.
       - name: policyName
         in: path
         description: Policy name.
@@ -133,8 +142,8 @@ paths:
         schema:
           type: string
           description: Policy name.
-          example: Aut facere veniam repudiandae id.
-        example: Aut minus alias.
+          example: At eos facilis molestias in voluptas rem.
+        example: Ab accusantium ut ut aliquid sint animi.
       - name: version
         in: path
         description: Policy version.
@@ -142,8 +151,8 @@ paths:
         schema:
           type: string
           description: Policy version.
-          example: At eos facilis molestias in voluptas rem.
-        example: Ab accusantium ut ut aliquid sint animi.
+          example: Dolorem cumque laborum quis nesciunt.
+        example: Aut voluptas.
       responses:
         "200":
           description: OK response.
diff --git a/gen/http/policy/client/cli.go b/gen/http/policy/client/cli.go
index 931cc1ad0c56cd7647ed6924e700826f5f6b0c10..0f885b7a30e6878583c5f23773188cc47a17405b 100644
--- a/gen/http/policy/client/cli.go
+++ b/gen/http/policy/client/cli.go
@@ -16,13 +16,13 @@ import (
 
 // BuildEvaluatePayload builds the payload for the policy Evaluate endpoint
 // from CLI flags.
-func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string) (*policy.EvaluateRequest, error) {
+func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string, policyEvaluateEvaluationID string) (*policy.EvaluateRequest, error) {
 	var err error
 	var body interface{}
 	{
 		err = json.Unmarshal([]byte(policyEvaluateBody), &body)
 		if err != nil {
-			return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "\"Ab accusamus voluptatem et est.\"")
+			return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "\"Illum ad assumenda consectetur minima voluptatibus.\"")
 		}
 	}
 	var group string
@@ -37,6 +37,12 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string,
 	{
 		version = policyEvaluateVersion
 	}
+	var evaluationID *string
+	{
+		if policyEvaluateEvaluationID != "" {
+			evaluationID = &policyEvaluateEvaluationID
+		}
+	}
 	v := body
 	res := &policy.EvaluateRequest{
 		Input: v,
@@ -44,6 +50,7 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string,
 	res.Group = group
 	res.PolicyName = policyName
 	res.Version = version
+	res.EvaluationID = evaluationID
 
 	return res, nil
 }
diff --git a/gen/http/policy/client/encode_decode.go b/gen/http/policy/client/encode_decode.go
index d4a2a5f74eef5f02bf3ef2314eb8caadb28fc280..309e2fd62787e93acf767008b248386215d26901 100644
--- a/gen/http/policy/client/encode_decode.go
+++ b/gen/http/policy/client/encode_decode.go
@@ -55,6 +55,10 @@ func EncodeEvaluateRequest(encoder func(*http.Request) goahttp.Encoder) func(*ht
 		if !ok {
 			return goahttp.ErrInvalidType("policy", "Evaluate", "*policy.EvaluateRequest", v)
 		}
+		if p.EvaluationID != nil {
+			head := *p.EvaluationID
+			req.Header.Set("x-evaluation-id", head)
+		}
 		body := p.Input
 		if err := encoder(req).Encode(&body); err != nil {
 			return goahttp.ErrEncodingError("policy", "Evaluate", err)
diff --git a/gen/http/policy/server/encode_decode.go b/gen/http/policy/server/encode_decode.go
index 6d676cb40ded28d66368dfa9bdb89fbd11d7984c..3bb6113290c5725c435938692e6489b635e2955b 100644
--- a/gen/http/policy/server/encode_decode.go
+++ b/gen/http/policy/server/encode_decode.go
@@ -45,16 +45,21 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt
 		}
 
 		var (
-			group      string
-			policyName string
-			version    string
+			group        string
+			policyName   string
+			version      string
+			evaluationID *string
 
 			params = mux.Vars(r)
 		)
 		group = params["group"]
 		policyName = params["policyName"]
 		version = params["version"]
-		payload := NewEvaluateRequest(body, group, policyName, version)
+		evaluationIDRaw := r.Header.Get("x-evaluation-id")
+		if evaluationIDRaw != "" {
+			evaluationID = &evaluationIDRaw
+		}
+		payload := NewEvaluateRequest(body, group, policyName, version, evaluationID)
 
 		return payload, nil
 	}
diff --git a/gen/http/policy/server/types.go b/gen/http/policy/server/types.go
index e39296d9694ab5be167b84d4e5311b5c8b1036bc..1a20ddf5006e4abaeb11d5a67889b0551e49b405 100644
--- a/gen/http/policy/server/types.go
+++ b/gen/http/policy/server/types.go
@@ -12,7 +12,7 @@ import (
 )
 
 // NewEvaluateRequest builds a policy service Evaluate endpoint payload.
-func NewEvaluateRequest(body interface{}, group string, policyName string, version string) *policy.EvaluateRequest {
+func NewEvaluateRequest(body interface{}, group string, policyName string, version string, evaluationID *string) *policy.EvaluateRequest {
 	v := body
 	res := &policy.EvaluateRequest{
 		Input: v,
@@ -20,6 +20,7 @@ func NewEvaluateRequest(body interface{}, group string, policyName string, versi
 	res.Group = group
 	res.PolicyName = policyName
 	res.Version = version
+	res.EvaluationID = evaluationID
 
 	return res
 }
diff --git a/gen/policy/service.go b/gen/policy/service.go
index 3895194865fa885d9569cde5e97c02e2b7ae33ec..4abb1bcdcde12ad0b54ddfbc412308a536c131f4 100644
--- a/gen/policy/service.go
+++ b/gen/policy/service.go
@@ -41,6 +41,9 @@ type EvaluateRequest struct {
 	Version string
 	// Input data passed to the policy execution runtime.
 	Input interface{}
+	// Identifier created by external system and passed as parameter to overwrite
+	// the randomly generated evaluationID.
+	EvaluationID *string
 }
 
 // LockRequest is the payload type of the policy service Lock method.
diff --git a/internal/service/policy/service.go b/internal/service/policy/service.go
index bf01650102a1934b4dc268b2a6c2eb666627faa7..b8f6e76d2a281d3d9295b42415713f9200b8d9e8 100644
--- a/internal/service/policy/service.go
+++ b/internal/service/policy/service.go
@@ -59,7 +59,13 @@ func New(storage Storage, queryCache RegoCache, cache Cache, logger *zap.Logger)
 // return results correctly, only if the package declaration inside the policy is:
 // `package mygroup.example`.
 func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (interface{}, error) {
-	evaluationID := uuid.NewString()
+	var evaluationID string
+	if req.EvaluationID != nil && *req.EvaluationID != "" {
+		evaluationID = *req.EvaluationID
+	} else {
+		evaluationID = uuid.NewString()
+	}
+
 	logger := s.logger.With(
 		zap.String("group", req.Group),
 		zap.String("name", req.PolicyName),