diff --git a/cmd/sync/main.go b/cmd/sync/main.go
index e24379b13e10c115ccad42cfbc26148ba502c56a..5e40681d1651251882c8f22aa8d6057a6a301824 100644
--- a/cmd/sync/main.go
+++ b/cmd/sync/main.go
@@ -22,7 +22,6 @@ import (
 const (
 	pathSeperator      = string(os.PathSeparator)
 	cloneFolder        = "temp"
-	defaultRepoFolder  = "policies"
 	policyFilename     = "policy.rego"
 	dataFilename       = "data.json"
 	dataConfigFilename = "data-config.json"
@@ -30,6 +29,7 @@ const (
 )
 
 type Policy struct {
+	Repository string
 	Filename   string
 	Name       string
 	Group      string
@@ -87,14 +87,15 @@ func sync(cfg *Config, db *mongo.Client) error {
 	}
 
 	// clone policy repository
-	if err := cloneRepo(context.Background(), cfg.Repo.URL, cfg.Repo.User, cfg.Repo.Pass, cfg.Repo.Branch); err != nil {
+	repo, err := cloneRepo(context.Background(), cfg.Repo.URL, cfg.Repo.User, cfg.Repo.Pass, cfg.Repo.Branch)
+	if err != nil {
 		return fmt.Errorf("error cloning repo: %v", err)
 	}
 
 	log.Println("Repository is cloned successfully.")
 
 	// get all policies from the repository and the given directory
-	policies, err := iterateRepo(cfg.Repo.Folder)
+	policies, err := iterateRepo(cfg.Repo.Folder, repo)
 	if err != nil {
 		return fmt.Errorf("error iterating repo: %v", err)
 	}
@@ -107,7 +108,7 @@ func sync(cfg *Config, db *mongo.Client) error {
 	}
 
 	// delete policy repository folder
-	if err := os.RemoveAll(cfg.Repo.Folder); err != nil {
+	if err := os.RemoveAll(cloneFolder); err != nil {
 		return fmt.Errorf("error deleting policy repo folder: %v", err)
 	}
 
@@ -117,7 +118,7 @@ func sync(cfg *Config, db *mongo.Client) error {
 }
 
 // cloneRepo clones the Policy repository to repoFolder
-func cloneRepo(ctx context.Context, url, user, pass, branch string) error {
+func cloneRepo(ctx context.Context, url, user, pass, branch string) (string, error) {
 	log.Println("Cloning repository...")
 
 	opts := &git.CloneOptions{
@@ -139,12 +140,12 @@ func cloneRepo(ctx context.Context, url, user, pass, branch string) error {
 
 	_, err := git.PlainCloneContext(ctx, cloneFolder, false, opts)
 
-	return err
+	return getRepoName(url), err
 }
 
 // iterateRepo iterates over the repoFolder and returns a map
 // of Policy structs
-func iterateRepo(repoFolder string) (map[string]*Policy, error) {
+func iterateRepo(repoFolder, repository string) (map[string]*Policy, error) {
 	if repoFolder == "" {
 		repoFolder = cloneFolder
 	} else {
@@ -159,7 +160,7 @@ func iterateRepo(repoFolder string) (map[string]*Policy, error) {
 			return err
 		}
 		if !d.IsDir() && d.Name() == policyFilename {
-			policy, err := createPolicy(p)
+			policy, err := createPolicy(p, repository)
 			if err != nil {
 				return err
 			}
@@ -172,7 +173,7 @@ func iterateRepo(repoFolder string) (map[string]*Policy, error) {
 }
 
 // createPolicy instantiates a Policy struct out of a policy file on given path
-func createPolicy(p string) (*Policy, error) {
+func createPolicy(p, repository string) (*Policy, error) {
 	ex, err := os.Executable()
 	if err != nil {
 		return nil, fmt.Errorf("error getting executable path: %v", err)
@@ -216,6 +217,7 @@ func createPolicy(p string) (*Policy, error) {
 	}
 
 	return &Policy{
+		Repository: repository,
 		Filename:   dbFilename,
 		Name:       name,
 		Group:      group,
@@ -296,15 +298,16 @@ func compare(currPolicies map[string]*Policy, repoPolicies map[string]*Policy) [
 // upsert inserts or updates policies in MongoDB collection
 //
 // Decision whether to insert or update is taken based on the composition of
-// Policy "group", "name" and "version" fields
+// Policy "repository", "group", "name" and "version" fields
 func upsert(ctx context.Context, policies []*Policy, db *mongo.Collection) error {
 	var ops []mongo.WriteModel
 	for _, policy := range policies {
 		op := mongo.NewUpdateOneModel()
 		op.SetFilter(bson.M{
-			"group":   policy.Group,
-			"name":    policy.Name,
-			"version": policy.Version,
+			"repository": policy.Repository,
+			"group":      policy.Group,
+			"name":       policy.Name,
+			"version":    policy.Version,
 		})
 		op.SetUpdate(bson.M{
 			"$set": bson.M{
@@ -341,6 +344,7 @@ func (p1 *Policy) equals(p2 *Policy) bool {
 	if p1.Rego == p2.Rego &&
 		p1.Data == p2.Data &&
 		p1.DataConfig == p2.DataConfig &&
+		p1.Repository == p2.Repository &&
 		p1.Name == p2.Name &&
 		p1.Version == p2.Version &&
 		p1.Filename == p2.Filename &&
@@ -351,6 +355,15 @@ func (p1 *Policy) equals(p2 *Policy) bool {
 	return false
 }
 
+// getRepoName returns the repository name out of a clone url
+//
+// Example: clone url - `https://gitlab.example.com/policy.git`; repoName - `policy`
+func getRepoName(url string) string {
+	ss := strings.Split(strings.TrimSuffix(url, ".git"), "/")
+
+	return ss[len(ss)-1]
+}
+
 func constructKey(p *Policy) string {
-	return fmt.Sprintf("%s.%s.%s", p.Group, p.Name, p.Version)
+	return fmt.Sprintf("%s.%s.%s.%s", p.Repository, p.Group, p.Name, p.Version)
 }
diff --git a/design/design.go b/design/design.go
index 0acfd5552d7c400383feca7660a12d3ce0012377..691e15fb88d289b6b808eff6ba8dadbf5475c705 100644
--- a/design/design.go
+++ b/design/design.go
@@ -23,9 +23,9 @@ var _ = Service("policy", func() {
 		Payload(EvaluateRequest)
 		Result(EvaluateResult)
 		HTTP(func() {
-			GET("/policy/{group}/{policyName}/{version}/evaluation/did.json")
-			GET("/policy/{group}/{policyName}/{version}/evaluation")
-			POST("/policy/{group}/{policyName}/{version}/evaluation")
+			GET("/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json")
+			GET("/policy/{repository}/{group}/{policyName}/{version}/evaluation")
+			POST("/policy/{repository}/{group}/{policyName}/{version}/evaluation")
 			Header("evaluationID:x-evaluation-id", String, "EvaluationID allows overwriting the randomly generated evaluationID", func() {
 				Example("did:web:example.com")
 			})
@@ -45,7 +45,7 @@ var _ = Service("policy", func() {
 		Payload(LockRequest)
 		Result(Empty)
 		HTTP(func() {
-			POST("/policy/{group}/{policyName}/{version}/lock")
+			POST("/policy/{repository}/{group}/{policyName}/{version}/lock")
 			Response(StatusOK)
 		})
 	})
@@ -55,7 +55,7 @@ var _ = Service("policy", func() {
 		Payload(UnlockRequest)
 		Result(Empty)
 		HTTP(func() {
-			DELETE("/policy/{group}/{policyName}/{version}/lock")
+			DELETE("/policy/{repository}/{group}/{policyName}/{version}/lock")
 			Response(StatusOK)
 		})
 	})
diff --git a/design/types.go b/design/types.go
index 37730bc9f7c6c6340c0b3816c1d00ca59e9eccc7..d84b6bc3f9146e1032271a71561ab22e600a1686 100644
--- a/design/types.go
+++ b/design/types.go
@@ -4,19 +4,22 @@ package design
 import . "goa.design/goa/v3/dsl"
 
 var EvaluateRequest = Type("EvaluateRequest", func() {
-	Field(1, "group", String, "Policy group.", func() {
+	Field(1, "repository", String, "Policy repository.", func() {
+		Example("policies")
+	})
+	Field(2, "group", String, "Policy group.", func() {
 		Example("example")
 	})
-	Field(2, "policyName", String, "Policy name.", func() {
+	Field(3, "policyName", String, "Policy name.", func() {
 		Example("example")
 	})
-	Field(3, "version", String, "Policy version.", func() {
+	Field(4, "version", String, "Policy version.", 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.")
-	Field(6, "ttl", Int, "TTL for storing policy result in cache")
-	Required("group", "policyName", "version")
+	Field(5, "input", Any, "Input data passed to the policy execution runtime.")
+	Field(6, "evaluationID", String, "Identifier created by external system and passed as parameter to overwrite the randomly generated evaluationID.")
+	Field(7, "ttl", Int, "TTL for storing policy result in cache")
+	Required("repository", "group", "policyName", "version")
 })
 
 var EvaluateResult = Type("EvaluateResult", func() {
@@ -26,29 +29,32 @@ var EvaluateResult = Type("EvaluateResult", func() {
 })
 
 var LockRequest = Type("LockRequest", func() {
-	Field(1, "group", String, "Policy group.")
-	Field(2, "policyName", String, "Policy name.")
-	Field(3, "version", String, "Policy version.")
-	Required("group", "policyName", "version")
+	Field(1, "repository", String, "Policy repository.")
+	Field(2, "group", String, "Policy group.")
+	Field(3, "policyName", String, "Policy name.")
+	Field(4, "version", String, "Policy version.")
+	Required("repository", "group", "policyName", "version")
 })
 
 var UnlockRequest = Type("UnlockRequest", func() {
-	Field(1, "group", String, "Policy group.")
-	Field(2, "policyName", String, "Policy name.")
-	Field(3, "version", String, "Policy version.")
-	Required("group", "policyName", "version")
+	Field(1, "repository", String, "Policy repository.")
+	Field(2, "group", String, "Policy group.")
+	Field(3, "policyName", String, "Policy name.")
+	Field(4, "version", String, "Policy version.")
+	Required("repository", "group", "policyName", "version")
 })
 
 var Policy = Type("Policy", func() {
-	Field(1, "policyName", String, "Policy name.")
-	Field(2, "group", String, "Policy group.")
-	Field(3, "version", String, "Policy version.")
-	Field(4, "rego", String, "Policy rego source code.")
-	Field(5, "data", String, "Policy static data.")
-	Field(6, "dataConfig", String, "Policy static data optional configuration.")
-	Field(7, "locked", Boolean, "Locked specifies if the policy is locked or allowed to execute.")
-	Field(8, "lastUpdate", Int64, "Last update (Unix timestamp).")
-	Required("group", "policyName", "version", "locked", "lastUpdate")
+	Field(1, "repository", String, "Policy repository.")
+	Field(2, "policyName", String, "Policy name.")
+	Field(3, "group", String, "Policy group.")
+	Field(4, "version", String, "Policy version.")
+	Field(5, "rego", String, "Policy rego source code.")
+	Field(6, "data", String, "Policy static data.")
+	Field(7, "dataConfig", String, "Policy static data optional configuration.")
+	Field(8, "locked", Boolean, "Locked specifies if the policy is locked or allowed to execute.")
+	Field(9, "lastUpdate", Int64, "Last update (Unix timestamp).")
+	Required("repository", "group", "policyName", "version", "locked", "lastUpdate")
 })
 
 var PoliciesRequest = Type("PoliciesRequest", func() {
diff --git a/gen/http/cli/policy/cli.go b/gen/http/cli/policy/cli.go
index b901113992ffc452cac13951552044c11b1a7a4d..c3babf308ec3120ebd1cf843c799561ccca586a6 100644
--- a/gen/http/cli/policy/cli.go
+++ b/gen/http/cli/policy/cli.go
@@ -30,7 +30,7 @@ health (liveness|readiness)
 
 // UsageExamples produces an example of a valid invocation of the CLI tool.
 func UsageExamples() string {
-	return os.Args[0] + ` policy evaluate --body "At incidunt unde consequatur voluptas dolorem nisi." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Illum est et hic." --ttl 5942762461305129155` + "\n" +
+	return os.Args[0] + ` policy evaluate --body "Ad omnis quasi aut consequuntur quibusdam." --repository "policies" --group "example" --policy-name "example" --version "1.0" --evaluation-id "Deleniti non nihil dolor aut sed." --ttl 380312255088624933` + "\n" +
 		os.Args[0] + ` health liveness` + "\n" +
 		""
 }
@@ -49,6 +49,7 @@ func ParseEndpoint(
 
 		policyEvaluateFlags            = flag.NewFlagSet("evaluate", flag.ExitOnError)
 		policyEvaluateBodyFlag         = policyEvaluateFlags.String("body", "REQUIRED", "")
+		policyEvaluateRepositoryFlag   = policyEvaluateFlags.String("repository", "REQUIRED", "Policy repository.")
 		policyEvaluateGroupFlag        = policyEvaluateFlags.String("group", "REQUIRED", "Policy group.")
 		policyEvaluatePolicyNameFlag   = policyEvaluateFlags.String("policy-name", "REQUIRED", "Policy name.")
 		policyEvaluateVersionFlag      = policyEvaluateFlags.String("version", "REQUIRED", "Policy version.")
@@ -56,11 +57,13 @@ func ParseEndpoint(
 		policyEvaluateTTLFlag          = policyEvaluateFlags.String("ttl", "", "")
 
 		policyLockFlags          = flag.NewFlagSet("lock", flag.ExitOnError)
+		policyLockRepositoryFlag = policyLockFlags.String("repository", "REQUIRED", "Policy repository.")
 		policyLockGroupFlag      = policyLockFlags.String("group", "REQUIRED", "Policy group.")
 		policyLockPolicyNameFlag = policyLockFlags.String("policy-name", "REQUIRED", "Policy name.")
 		policyLockVersionFlag    = policyLockFlags.String("version", "REQUIRED", "Policy version.")
 
 		policyUnlockFlags          = flag.NewFlagSet("unlock", flag.ExitOnError)
+		policyUnlockRepositoryFlag = policyUnlockFlags.String("repository", "REQUIRED", "Policy repository.")
 		policyUnlockGroupFlag      = policyUnlockFlags.String("group", "REQUIRED", "Policy group.")
 		policyUnlockPolicyNameFlag = policyUnlockFlags.String("policy-name", "REQUIRED", "Policy name.")
 		policyUnlockVersionFlag    = policyUnlockFlags.String("version", "REQUIRED", "Policy version.")
@@ -172,13 +175,13 @@ func ParseEndpoint(
 			switch epn {
 			case "evaluate":
 				endpoint = c.Evaluate()
-				data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag, *policyEvaluateEvaluationIDFlag, *policyEvaluateTTLFlag)
+				data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateRepositoryFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag, *policyEvaluateEvaluationIDFlag, *policyEvaluateTTLFlag)
 			case "lock":
 				endpoint = c.Lock()
-				data, err = policyc.BuildLockPayload(*policyLockGroupFlag, *policyLockPolicyNameFlag, *policyLockVersionFlag)
+				data, err = policyc.BuildLockPayload(*policyLockRepositoryFlag, *policyLockGroupFlag, *policyLockPolicyNameFlag, *policyLockVersionFlag)
 			case "unlock":
 				endpoint = c.Unlock()
-				data, err = policyc.BuildUnlockPayload(*policyUnlockGroupFlag, *policyUnlockPolicyNameFlag, *policyUnlockVersionFlag)
+				data, err = policyc.BuildUnlockPayload(*policyUnlockRepositoryFlag, *policyUnlockGroupFlag, *policyUnlockPolicyNameFlag, *policyUnlockVersionFlag)
 			case "list-policies":
 				endpoint = c.ListPolicies()
 				data, err = policyc.BuildListPoliciesPayload(*policyListPoliciesLockedFlag, *policyListPoliciesRegoFlag, *policyListPoliciesDataFlag, *policyListPoliciesDataConfigFlag)
@@ -219,10 +222,11 @@ 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 -evaluation-id STRING -ttl INT
+	fmt.Fprintf(os.Stderr, `%[1]s [flags] policy evaluate -body JSON -repository STRING -group STRING -policy-name STRING -version STRING -evaluation-id STRING -ttl INT
 
 Evaluate executes a policy with the given 'data' as input.
     -body JSON: 
+    -repository STRING: Policy repository.
     -group STRING: Policy group.
     -policy-name STRING: Policy name.
     -version STRING: Policy version.
@@ -230,33 +234,35 @@ Evaluate executes a policy with the given 'data' as input.
     -ttl INT: 
 
 Example:
-    %[1]s policy evaluate --body "At incidunt unde consequatur voluptas dolorem nisi." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Illum est et hic." --ttl 5942762461305129155
+    %[1]s policy evaluate --body "Ad omnis quasi aut consequuntur quibusdam." --repository "policies" --group "example" --policy-name "example" --version "1.0" --evaluation-id "Deleniti non nihil dolor aut sed." --ttl 380312255088624933
 `, os.Args[0])
 }
 
 func policyLockUsage() {
-	fmt.Fprintf(os.Stderr, `%[1]s [flags] policy lock -group STRING -policy-name STRING -version STRING
+	fmt.Fprintf(os.Stderr, `%[1]s [flags] policy lock -repository STRING -group STRING -policy-name STRING -version STRING
 
 Lock a policy so that it cannot be evaluated.
+    -repository STRING: Policy repository.
     -group STRING: Policy group.
     -policy-name STRING: Policy name.
     -version STRING: Policy version.
 
 Example:
-    %[1]s policy lock --group "At eos facilis molestias in voluptas rem." --policy-name "Ab accusantium ut ut aliquid sint animi." --version "Dolorem cumque laborum quis nesciunt."
+    %[1]s policy lock --repository "Dolorem cumque laborum quis nesciunt." --group "Aut voluptas." --policy-name "Sint nam voluptatem ea consequatur similique et." --version "Non mollitia nesciunt impedit facere."
 `, os.Args[0])
 }
 
 func policyUnlockUsage() {
-	fmt.Fprintf(os.Stderr, `%[1]s [flags] policy unlock -group STRING -policy-name STRING -version STRING
+	fmt.Fprintf(os.Stderr, `%[1]s [flags] policy unlock -repository STRING -group STRING -policy-name STRING -version STRING
 
 Unlock a policy so it can be evaluated again.
+    -repository STRING: Policy repository.
     -group STRING: Policy group.
     -policy-name STRING: Policy name.
     -version STRING: Policy version.
 
 Example:
-    %[1]s policy unlock --group "Ut commodi perspiciatis corporis." --policy-name "Accusamus autem sequi." --version "Et nulla."
+    %[1]s policy unlock --repository "Sunt in et quia cum." --group "Commodi nemo fugiat id praesentium accusantium expedita." --policy-name "Qui non quia." --version "Error maxime quasi quia non voluptatibus error."
 `, os.Args[0])
 }
 
@@ -270,7 +276,7 @@ List policies from storage with optional filters.
     -data-config BOOL: 
 
 Example:
-    %[1]s policy list-policies --locked true --rego true --data true --data-config false
+    %[1]s policy list-policies --locked false --rego false --data false --data-config true
 `, os.Args[0])
 }
 
diff --git a/gen/http/openapi.json b/gen/http/openapi.json
index 0c90717db27a6f1e14fca62fdba708f7dde42446..1d133bebf1ce400e47fef786529c841549341476 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.","schema":{"$ref":"#/definitions/HealthLivenessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","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":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"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"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","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":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"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"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"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":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"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"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"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.","schema":{"$ref":"#/definitions/HealthReadinessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","required":false,"type":"boolean"},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","required":false,"type":"boolean"},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","required":false,"type":"boolean"},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","required":false,"type":"boolean"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/PolicyListPoliciesResponseBody","required":["policies"]}}},"schemes":["http"]}}},"definitions":{"HealthLivenessResponseBody":{"title":"HealthLivenessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Quasi delectus debitis consectetur rerum vel sunt."},"status":{"type":"string","description":"Status message.","example":"Ea architecto iure est similique architecto id."},"version":{"type":"string","description":"Service runtime version.","example":"Ut est ut molestias sint ipsam."}},"example":{"service":"At ut dolore.","status":"Aperiam aut odio dolorum.","version":"Quae et et unde."},"required":["service","status","version"]},"HealthReadinessResponseBody":{"title":"HealthReadinessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Dolore ducimus accusamus et voluptatibus cupiditate."},"status":{"type":"string","description":"Status message.","example":"Repellat inventore ut doloremque recusandae earum et."},"version":{"type":"string","description":"Service runtime version.","example":"Nisi vitae iure fugiat sed sit dolores."}},"example":{"service":"Ut quibusdam.","status":"Eaque fugiat et.","version":"Vel non quo."},"required":["service","status","version"]},"PolicyListPoliciesResponseBody":{"title":"PolicyListPoliciesResponseBody","type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/definitions/PolicyResponseBody"},"description":"JSON array of policies.","example":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]}},"example":{"policies":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]},"required":["policies"]},"PolicyResponseBody":{"title":"PolicyResponseBody","type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Voluptate amet."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Aut et."},"group":{"type":"string","description":"Policy group.","example":"Totam officia necessitatibus tempore nulla animi."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":4355437808814429430,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":true},"policyName":{"type":"string","description":"Policy name.","example":"Corporis est rem."},"rego":{"type":"string","description":"Policy rego source code.","example":"Vitae dolores quas et aperiam dolores reiciendis."},"version":{"type":"string","description":"Policy version.","example":"Consequatur vel rerum rem ipsam nam."}},"example":{"data":"Aut asperiores.","dataConfig":"Vel dolores omnis molestiae tempora sed repellendus.","group":"Et dolores.","lastUpdate":8993739598055578473,"locked":false,"policyName":"Minus fugiat veritatis quam qui nostrum eaque.","rego":"Ipsa ad voluptatum maxime ut.","version":"Delectus rerum molestiae possimus cum laboriosam."},"required":["group","policyName","version","locked","lastUpdate"]}}}
\ 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.","schema":{"$ref":"#/definitions/HealthLivenessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"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":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"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"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"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":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"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"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"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":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"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"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]}},"/policy/{repository}/{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":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"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":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"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.","schema":{"$ref":"#/definitions/HealthReadinessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","required":false,"type":"boolean"},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","required":false,"type":"boolean"},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","required":false,"type":"boolean"},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","required":false,"type":"boolean"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/PolicyListPoliciesResponseBody","required":["policies"]}}},"schemes":["http"]}}},"definitions":{"HealthLivenessResponseBody":{"title":"HealthLivenessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Voluptatibus cupiditate ea repellat inventore."},"status":{"type":"string","description":"Status message.","example":"Doloremque recusandae earum."},"version":{"type":"string","description":"Service runtime version.","example":"Quis nisi."}},"example":{"service":"Iure fugiat sed sit dolores iusto ut.","status":"Et eaque.","version":"Et mollitia."},"required":["service","status","version"]},"HealthReadinessResponseBody":{"title":"HealthReadinessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Non quo ut molestias rerum sunt."},"status":{"type":"string","description":"Status message.","example":"Omnis dolores totam voluptatem rerum."},"version":{"type":"string","description":"Service runtime version.","example":"Architecto et enim omnis."}},"example":{"service":"Est impedit.","status":"Consequatur ut suscipit.","version":"Neque et sed modi accusantium."},"required":["service","status","version"]},"PolicyListPoliciesResponseBody":{"title":"PolicyListPoliciesResponseBody","type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/definitions/PolicyResponseBody"},"description":"JSON array of policies.","example":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]}},"example":{"policies":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]},"required":["policies"]},"PolicyResponseBody":{"title":"PolicyResponseBody","type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Aut asperiores."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Vel dolores omnis molestiae tempora sed repellendus."},"group":{"type":"string","description":"Policy group.","example":"Et dolores."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":8993739598055578473,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":false},"policyName":{"type":"string","description":"Policy name.","example":"Veritatis quam qui nostrum eaque."},"rego":{"type":"string","description":"Policy rego source code.","example":"Ipsa ad voluptatum maxime ut."},"repository":{"type":"string","description":"Policy repository.","example":"Maiores et minus."},"version":{"type":"string","description":"Policy version.","example":"Delectus rerum molestiae possimus cum laboriosam."}},"example":{"data":"Aperiam aut odio dolorum.","dataConfig":"Quae et et unde.","group":"Ea architecto iure est similique architecto id.","lastUpdate":2495518142683426670,"locked":false,"policyName":"Consectetur rerum vel sunt.","rego":"At ut dolore.","repository":"Vel voluptate quasi delectus.","version":"Ut est ut molestias sint ipsam."},"required":["repository","group","policyName","version","locked","lastUpdate"]}}}
\ No newline at end of file
diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml
index 0c3ffc8c7d8179ee284133fb671548183308817f..b55558423e73a3215335a5fe32e26b12f6a18e52 100644
--- a/gen/http/openapi.yaml
+++ b/gen/http/openapi.yaml
@@ -30,7 +30,7 @@ paths:
                             - version
             schemes:
                 - http
-    /policy/{group}/{policyName}/{version}/evaluation:
+    /policy/{repository}/{group}/{policyName}/{version}/evaluation:
         get:
             tags:
                 - policy
@@ -38,6 +38,11 @@ paths:
             description: Evaluate executes a policy with the given 'data' as input.
             operationId: policy#Evaluate#1
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  type: string
                 - name: group
                   in: path
                   description: Policy group.
@@ -89,6 +94,11 @@ paths:
             description: Evaluate executes a policy with the given 'data' as input.
             operationId: policy#Evaluate#2
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  type: string
                 - name: group
                   in: path
                   description: Policy group.
@@ -133,7 +143,7 @@ paths:
                             type: string
             schemes:
                 - http
-    /policy/{group}/{policyName}/{version}/evaluation/did.json:
+    /policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json:
         get:
             tags:
                 - policy
@@ -141,6 +151,11 @@ paths:
             description: Evaluate executes a policy with the given 'data' as input.
             operationId: policy#Evaluate
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  type: string
                 - name: group
                   in: path
                   description: Policy group.
@@ -185,7 +200,7 @@ paths:
                             type: string
             schemes:
                 - http
-    /policy/{group}/{policyName}/{version}/lock:
+    /policy/{repository}/{group}/{policyName}/{version}/lock:
         post:
             tags:
                 - policy
@@ -193,6 +208,11 @@ paths:
             description: Lock a policy so that it cannot be evaluated.
             operationId: policy#Lock
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  type: string
                 - name: group
                   in: path
                   description: Policy group.
@@ -220,6 +240,11 @@ paths:
             description: Unlock a policy so it can be evaluated again.
             operationId: policy#Unlock
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  type: string
                 - name: group
                   in: path
                   description: Policy group.
@@ -302,19 +327,19 @@ definitions:
             service:
                 type: string
                 description: Service name.
-                example: Quasi delectus debitis consectetur rerum vel sunt.
+                example: Voluptatibus cupiditate ea repellat inventore.
             status:
                 type: string
                 description: Status message.
-                example: Ea architecto iure est similique architecto id.
+                example: Doloremque recusandae earum.
             version:
                 type: string
                 description: Service runtime version.
-                example: Ut est ut molestias sint ipsam.
+                example: Quis nisi.
         example:
-            service: At ut dolore.
-            status: Aperiam aut odio dolorum.
-            version: Quae et et unde.
+            service: Iure fugiat sed sit dolores iusto ut.
+            status: Et eaque.
+            version: Et mollitia.
         required:
             - service
             - status
@@ -326,19 +351,19 @@ definitions:
             service:
                 type: string
                 description: Service name.
-                example: Dolore ducimus accusamus et voluptatibus cupiditate.
+                example: Non quo ut molestias rerum sunt.
             status:
                 type: string
                 description: Status message.
-                example: Repellat inventore ut doloremque recusandae earum et.
+                example: Omnis dolores totam voluptatem rerum.
             version:
                 type: string
                 description: Service runtime version.
-                example: Nisi vitae iure fugiat sed sit dolores.
+                example: Architecto et enim omnis.
         example:
-            service: Ut quibusdam.
-            status: Eaque fugiat et.
-            version: Vel non quo.
+            service: Est impedit.
+            status: Consequatur ut suscipit.
+            version: Neque et sed modi accusantium.
         required:
             - service
             - status
@@ -353,40 +378,53 @@ definitions:
                     $ref: '#/definitions/PolicyResponseBody'
                 description: JSON array of policies.
                 example:
-                    - data: Optio quia et laborum.
-                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                      lastUpdate: 9002532952206938167
-                      locked: false
-                      policyName: Et aliquam sunt in et quia cum.
-                      rego: Error maxime quasi quia non voluptatibus error.
-                      version: Qui non quia.
-                    - data: Optio quia et laborum.
-                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                      lastUpdate: 9002532952206938167
-                      locked: false
-                      policyName: Et aliquam sunt in et quia cum.
-                      rego: Error maxime quasi quia non voluptatibus error.
-                      version: Qui non quia.
+                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                      group: Accusamus enim.
+                      lastUpdate: 4303309286764032455
+                      locked: true
+                      policyName: Ut amet.
+                      rego: Quam dolores architecto itaque.
+                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                      version: Recusandae est rerum corrupti quia.
+                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                      group: Accusamus enim.
+                      lastUpdate: 4303309286764032455
+                      locked: true
+                      policyName: Ut amet.
+                      rego: Quam dolores architecto itaque.
+                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                      version: Recusandae est rerum corrupti quia.
+                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                      group: Accusamus enim.
+                      lastUpdate: 4303309286764032455
+                      locked: true
+                      policyName: Ut amet.
+                      rego: Quam dolores architecto itaque.
+                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                      version: Recusandae est rerum corrupti quia.
         example:
             policies:
-                - data: Optio quia et laborum.
-                  dataConfig: In libero perspiciatis voluptatum ut soluta.
-                  group: Commodi nemo fugiat id praesentium accusantium expedita.
-                  lastUpdate: 9002532952206938167
-                  locked: false
-                  policyName: Et aliquam sunt in et quia cum.
-                  rego: Error maxime quasi quia non voluptatibus error.
-                  version: Qui non quia.
-                - data: Optio quia et laborum.
-                  dataConfig: In libero perspiciatis voluptatum ut soluta.
-                  group: Commodi nemo fugiat id praesentium accusantium expedita.
-                  lastUpdate: 9002532952206938167
-                  locked: false
-                  policyName: Et aliquam sunt in et quia cum.
-                  rego: Error maxime quasi quia non voluptatibus error.
-                  version: Qui non quia.
+                - data: Voluptas ad corporis adipisci inventore ipsum.
+                  dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                  group: Accusamus enim.
+                  lastUpdate: 4303309286764032455
+                  locked: true
+                  policyName: Ut amet.
+                  rego: Quam dolores architecto itaque.
+                  repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                  version: Recusandae est rerum corrupti quia.
+                - data: Voluptas ad corporis adipisci inventore ipsum.
+                  dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                  group: Accusamus enim.
+                  lastUpdate: 4303309286764032455
+                  locked: true
+                  policyName: Ut amet.
+                  rego: Quam dolores architecto itaque.
+                  repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                  version: Recusandae est rerum corrupti quia.
         required:
             - policies
     PolicyResponseBody:
@@ -396,46 +434,52 @@ definitions:
             data:
                 type: string
                 description: Policy static data.
-                example: Voluptate amet.
+                example: Aut asperiores.
             dataConfig:
                 type: string
                 description: Policy static data optional configuration.
-                example: Aut et.
+                example: Vel dolores omnis molestiae tempora sed repellendus.
             group:
                 type: string
                 description: Policy group.
-                example: Totam officia necessitatibus tempore nulla animi.
+                example: Et dolores.
             lastUpdate:
                 type: integer
                 description: Last update (Unix timestamp).
-                example: 4355437808814429430
+                example: 8993739598055578473
                 format: int64
             locked:
                 type: boolean
                 description: Locked specifies if the policy is locked or allowed to execute.
-                example: true
+                example: false
             policyName:
                 type: string
                 description: Policy name.
-                example: Corporis est rem.
+                example: Veritatis quam qui nostrum eaque.
             rego:
                 type: string
                 description: Policy rego source code.
-                example: Vitae dolores quas et aperiam dolores reiciendis.
+                example: Ipsa ad voluptatum maxime ut.
+            repository:
+                type: string
+                description: Policy repository.
+                example: Maiores et minus.
             version:
                 type: string
                 description: Policy version.
-                example: Consequatur vel rerum rem ipsam nam.
+                example: Delectus rerum molestiae possimus cum laboriosam.
         example:
-            data: Aut asperiores.
-            dataConfig: Vel dolores omnis molestiae tempora sed repellendus.
-            group: Et dolores.
-            lastUpdate: 8993739598055578473
+            data: Aperiam aut odio dolorum.
+            dataConfig: Quae et et unde.
+            group: Ea architecto iure est similique architecto id.
+            lastUpdate: 2495518142683426670
             locked: false
-            policyName: Minus fugiat veritatis quam qui nostrum eaque.
-            rego: Ipsa ad voluptatum maxime ut.
-            version: Delectus rerum molestiae possimus cum laboriosam.
+            policyName: Consectetur rerum vel sunt.
+            rego: At ut dolore.
+            repository: Vel voluptate quasi delectus.
+            version: Ut est ut molestias sint ipsam.
         required:
+            - repository
             - group
             - policyName
             - version
diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json
index d83285dd02cd7021a5a2eb4c985cd34f6c315bdc..9c166a184a5f13cd1e59f6470e614a9b78d7aad6 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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Accusamus enim.","status":"Recusandae est rerum corrupti quia.","version":"Quam dolores architecto itaque."}}}}}}},"/policy/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","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"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"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":"Molestias rerum sunt eaque.","format":"binary"},"example":"Dignissimos enim."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Error et sunt maxime aperiam."},"example":"Et exercitationem perspiciatis quidem accusamus."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Dolores totam voluptatem.","format":"binary"},"example":"Molestiae fugiat harum quia corporis ullam natus."}}}}},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","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"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"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":"Molestias rerum sunt eaque.","format":"binary"},"example":"Animi omnis minima fuga numquam."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Ipsum explicabo assumenda delectus."},"example":"Rerum saepe dolores laborum odio."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Dolores totam voluptatem.","format":"binary"},"example":"Eos nemo repudiandae."}}}}}},"/policy/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"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"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"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":"Molestias rerum sunt eaque.","format":"binary"},"example":"Dolorem aut accusantium."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Dolor culpa."},"example":"Ad omnis possimus."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Dolores totam voluptatem.","format":"binary"},"example":"Cupiditate qui quo."}}}}}},"/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":"Iusto mollitia rerum quis ut et."},"example":"Ipsam est alias officiis."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Qui dolores natus qui doloremque voluptatem."},"example":"Omnis aut quas eos qui minima non."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Non consequuntur."},"example":"Aut in."}],"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":"Eveniet voluptas rerum."},"example":"Facilis tempora dolor consectetur."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Consequatur aut ipsam."},"example":"Aut provident ducimus vero adipisci nemo."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Itaque laborum."},"example":"Quos saepe dolorum qui tenetur aut."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Voluptas ad corporis adipisci inventore ipsum.","status":"Recusandae dolorum nisi distinctio vitae ad.","version":"Perspiciatis voluptatem."}}}}}}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Filter to return locked/unlocked policies (optional).","example":true},"example":true},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy source code in results (optional).","example":true},"example":false},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy static data in results (optional). ","example":false},"example":true},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include static data config (optional).","example":true},"example":true}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoliciesResult"},"example":{"policies":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]}}}}}}}},"components":{"schemas":{"HealthResponse":{"type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Aut officiis veritatis impedit rerum recusandae."},"status":{"type":"string","description":"Status message.","example":"In id quibusdam."},"version":{"type":"string","description":"Service runtime version.","example":"Deserunt officiis ipsa molestiae."}},"example":{"service":"Unde doloremque quae ullam.","status":"Optio nobis iure rerum non.","version":"Sapiente laborum."},"required":["service","status","version"]},"PoliciesResult":{"type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/components/schemas/Policy"},"description":"JSON array of policies.","example":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]}},"example":{"policies":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]},"required":["policies"]},"Policy":{"type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Rerum asperiores nulla."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Tenetur rerum necessitatibus fugit."},"group":{"type":"string","description":"Policy group.","example":"Est impedit."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":2958895584654309878,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":false},"policyName":{"type":"string","description":"Policy name.","example":"Sapiente architecto et enim omnis."},"rego":{"type":"string","description":"Policy rego source code.","example":"Neque et sed modi accusantium."},"version":{"type":"string","description":"Policy version.","example":"Consequatur ut suscipit."}},"example":{"data":"Vel saepe nisi et.","dataConfig":"Ut reiciendis fugit dolorum cupiditate.","group":"Occaecati quam tempora.","lastUpdate":8725218653039851118,"locked":false,"policyName":"Aut nobis repellendus quis rem.","rego":"Expedita ipsum minus ipsam.","version":"Harum voluptate et ut similique doloremque quis."},"required":["group","policyName","version","locked","lastUpdate"]}}},"tags":[{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."},{"name":"health","description":"Health service provides health check endpoints."}]}
\ 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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Corporis est rem.","status":"Totam officia necessitatibus tempore nulla animi.","version":"Consequatur vel rerum rem ipsam nam."}}}}}}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"policies"},"example":"policies"},{"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"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"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":"Rerum asperiores nulla.","format":"binary"},"example":"Eos nemo repudiandae."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Eveniet voluptas rerum."},"example":"Consequatur aut ipsam."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Tenetur rerum necessitatibus fugit.","format":"binary"},"example":"Aut provident ducimus vero adipisci nemo."}}}}},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"policies"},"example":"policies"},{"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"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"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":"Rerum asperiores nulla.","format":"binary"},"example":"Itaque laborum."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Quos saepe dolorum qui tenetur aut."},"example":"Ipsam est alias officiis."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Tenetur rerum necessitatibus fugit.","format":"binary"},"example":"Qui dolores natus qui doloremque voluptatem."}}}}}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"policies"},"example":"policies"},{"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"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"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":"Rerum asperiores nulla.","format":"binary"},"example":"Molestiae fugiat harum quia corporis ullam natus."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Animi omnis minima fuga numquam."},"example":"Eius sed."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Tenetur rerum necessitatibus fugit.","format":"binary"},"example":"Rerum saepe dolores laborum odio."}}}}}},"/policy/{repository}/{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":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"Accusamus dolores non temporibus est magni."},"example":"Earum quis odit eius saepe."},{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Delectus sit saepe dicta mollitia molestiae."},"example":"Deserunt blanditiis repudiandae quasi."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Ut unde pariatur velit esse."},"example":"Veniam repudiandae delectus facere est."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Commodi esse repellendus reiciendis molestias qui."},"example":"Nostrum animi omnis."}],"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":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"Omnis aut quas eos qui minima non."},"example":"Non consequuntur."},{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Aut in."},"example":"Et qui ut deleniti."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Eos cumque asperiores."},"example":"Commodi illo quidem omnis eveniet et."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Adipisci harum."},"example":"Ratione sit numquam non cupiditate sed omnis."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Vitae dolores quas et aperiam dolores reiciendis.","status":"Voluptate amet.","version":"Aut et."}}}}}}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Filter to return locked/unlocked policies (optional).","example":false},"example":false},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy source code in results (optional).","example":false},"example":true},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy static data in results (optional). ","example":true},"example":false},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include static data config (optional).","example":true},"example":true}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoliciesResult"},"example":{"policies":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]}}}}}}}},"components":{"schemas":{"HealthResponse":{"type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Ea et ad omnis."},"status":{"type":"string","description":"Status message.","example":"Eveniet cupiditate qui quo."},"version":{"type":"string","description":"Service runtime version.","example":"Dignissimos enim."}},"example":{"service":"Error et sunt maxime aperiam.","status":"Et sit qui fugit enim labore.","version":"Et exercitationem perspiciatis quidem accusamus."},"required":["service","status","version"]},"PoliciesResult":{"type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/components/schemas/Policy"},"description":"JSON array of policies.","example":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]}},"example":{"policies":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]},"required":["policies"]},"Policy":{"type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Dolorum cupiditate provident."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Dolor dolorem modi aut officiis veritatis impedit."},"group":{"type":"string","description":"Policy group.","example":"Laborum harum voluptate et ut similique doloremque."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":1580298023389806623,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":false},"policyName":{"type":"string","description":"Policy name.","example":"Rem et occaecati quam."},"rego":{"type":"string","description":"Policy rego source code.","example":"Nisi et praesentium ut reiciendis."},"repository":{"type":"string","description":"Policy repository.","example":"Ut velit aut nobis repellendus."},"version":{"type":"string","description":"Policy version.","example":"Explicabo expedita ipsum minus ipsam at vel."}},"example":{"data":"Dolorem aut accusantium.","dataConfig":"Dolor culpa.","group":"Unde doloremque quae ullam.","lastUpdate":8514723213962082729,"locked":true,"policyName":"Deserunt officiis ipsa molestiae.","rego":"Sapiente laborum.","repository":"In id quibusdam.","version":"Optio nobis iure rerum non."},"required":["repository","group","policyName","version","locked","lastUpdate"]}}},"tags":[{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."},{"name":"health","description":"Health service provides health check endpoints."}]}
\ No newline at end of file
diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml
index aaa659524546346e1ae303bc9b1dd685b83af5e9..2b80fafe02040810b596e99498a65256acb12705 100644
--- a/gen/http/openapi3.yaml
+++ b/gen/http/openapi3.yaml
@@ -21,10 +21,10 @@ paths:
                             schema:
                                 $ref: '#/components/schemas/HealthResponse'
                             example:
-                                service: Accusamus enim.
-                                status: Recusandae est rerum corrupti quia.
-                                version: Quam dolores architecto itaque.
-    /policy/{group}/{policyName}/{version}/evaluation:
+                                service: Corporis est rem.
+                                status: Totam officia necessitatibus tempore nulla animi.
+                                version: Consequatur vel rerum rem ipsam nam.
+    /policy/{repository}/{group}/{policyName}/{version}/evaluation:
         get:
             tags:
                 - policy
@@ -32,6 +32,15 @@ paths:
             description: Evaluate executes a policy with the given 'data' as input.
             operationId: policy#Evaluate#1
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  schema:
+                    type: string
+                    description: Policy repository.
+                    example: policies
+                  example: policies
                 - name: group
                   in: path
                   description: Policy group.
@@ -86,9 +95,9 @@ paths:
                         schema:
                             type: string
                             description: Input data passed to the policy execution runtime.
-                            example: Molestias rerum sunt eaque.
+                            example: Rerum asperiores nulla.
                             format: binary
-                        example: Dignissimos enim.
+                        example: Eos nemo repudiandae.
             responses:
                 "200":
                     description: OK response.
@@ -99,16 +108,16 @@ paths:
                             schema:
                                 type: string
                                 description: ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.
-                                example: Error et sunt maxime aperiam.
-                            example: Et exercitationem perspiciatis quidem accusamus.
+                                example: Eveniet voluptas rerum.
+                            example: Consequatur aut ipsam.
                     content:
                         application/json:
                             schema:
                                 type: string
                                 description: Arbitrary JSON response.
-                                example: Dolores totam voluptatem.
+                                example: Tenetur rerum necessitatibus fugit.
                                 format: binary
-                            example: Molestiae fugiat harum quia corporis ullam natus.
+                            example: Aut provident ducimus vero adipisci nemo.
         post:
             tags:
                 - policy
@@ -116,6 +125,15 @@ paths:
             description: Evaluate executes a policy with the given 'data' as input.
             operationId: policy#Evaluate#2
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  schema:
+                    type: string
+                    description: Policy repository.
+                    example: policies
+                  example: policies
                 - name: group
                   in: path
                   description: Policy group.
@@ -170,9 +188,9 @@ paths:
                         schema:
                             type: string
                             description: Input data passed to the policy execution runtime.
-                            example: Molestias rerum sunt eaque.
+                            example: Rerum asperiores nulla.
                             format: binary
-                        example: Animi omnis minima fuga numquam.
+                        example: Itaque laborum.
             responses:
                 "200":
                     description: OK response.
@@ -183,17 +201,17 @@ paths:
                             schema:
                                 type: string
                                 description: ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.
-                                example: Ipsum explicabo assumenda delectus.
-                            example: Rerum saepe dolores laborum odio.
+                                example: Quos saepe dolorum qui tenetur aut.
+                            example: Ipsam est alias officiis.
                     content:
                         application/json:
                             schema:
                                 type: string
                                 description: Arbitrary JSON response.
-                                example: Dolores totam voluptatem.
+                                example: Tenetur rerum necessitatibus fugit.
                                 format: binary
-                            example: Eos nemo repudiandae.
-    /policy/{group}/{policyName}/{version}/evaluation/did.json:
+                            example: Qui dolores natus qui doloremque voluptatem.
+    /policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json:
         get:
             tags:
                 - policy
@@ -201,6 +219,15 @@ paths:
             description: Evaluate executes a policy with the given 'data' as input.
             operationId: policy#Evaluate
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  schema:
+                    type: string
+                    description: Policy repository.
+                    example: policies
+                  example: policies
                 - name: group
                   in: path
                   description: Policy group.
@@ -255,9 +282,9 @@ paths:
                         schema:
                             type: string
                             description: Input data passed to the policy execution runtime.
-                            example: Molestias rerum sunt eaque.
+                            example: Rerum asperiores nulla.
                             format: binary
-                        example: Dolorem aut accusantium.
+                        example: Molestiae fugiat harum quia corporis ullam natus.
             responses:
                 "200":
                     description: OK response.
@@ -268,17 +295,17 @@ paths:
                             schema:
                                 type: string
                                 description: ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.
-                                example: Dolor culpa.
-                            example: Ad omnis possimus.
+                                example: Animi omnis minima fuga numquam.
+                            example: Eius sed.
                     content:
                         application/json:
                             schema:
                                 type: string
                                 description: Arbitrary JSON response.
-                                example: Dolores totam voluptatem.
+                                example: Tenetur rerum necessitatibus fugit.
                                 format: binary
-                            example: Cupiditate qui quo.
-    /policy/{group}/{policyName}/{version}/lock:
+                            example: Rerum saepe dolores laborum odio.
+    /policy/{repository}/{group}/{policyName}/{version}/lock:
         delete:
             tags:
                 - policy
@@ -286,6 +313,15 @@ paths:
             description: Unlock a policy so it can be evaluated again.
             operationId: policy#Unlock
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  schema:
+                    type: string
+                    description: Policy repository.
+                    example: Accusamus dolores non temporibus est magni.
+                  example: Earum quis odit eius saepe.
                 - name: group
                   in: path
                   description: Policy group.
@@ -293,8 +329,8 @@ paths:
                   schema:
                     type: string
                     description: Policy group.
-                    example: Iusto mollitia rerum quis ut et.
-                  example: Ipsam est alias officiis.
+                    example: Delectus sit saepe dicta mollitia molestiae.
+                  example: Deserunt blanditiis repudiandae quasi.
                 - name: policyName
                   in: path
                   description: Policy name.
@@ -302,8 +338,8 @@ paths:
                   schema:
                     type: string
                     description: Policy name.
-                    example: Qui dolores natus qui doloremque voluptatem.
-                  example: Omnis aut quas eos qui minima non.
+                    example: Ut unde pariatur velit esse.
+                  example: Veniam repudiandae delectus facere est.
                 - name: version
                   in: path
                   description: Policy version.
@@ -311,8 +347,8 @@ paths:
                   schema:
                     type: string
                     description: Policy version.
-                    example: Non consequuntur.
-                  example: Aut in.
+                    example: Commodi esse repellendus reiciendis molestias qui.
+                  example: Nostrum animi omnis.
             responses:
                 "200":
                     description: OK response.
@@ -323,6 +359,15 @@ paths:
             description: Lock a policy so that it cannot be evaluated.
             operationId: policy#Lock
             parameters:
+                - name: repository
+                  in: path
+                  description: Policy repository.
+                  required: true
+                  schema:
+                    type: string
+                    description: Policy repository.
+                    example: Omnis aut quas eos qui minima non.
+                  example: Non consequuntur.
                 - name: group
                   in: path
                   description: Policy group.
@@ -330,8 +375,8 @@ paths:
                   schema:
                     type: string
                     description: Policy group.
-                    example: Eveniet voluptas rerum.
-                  example: Facilis tempora dolor consectetur.
+                    example: Aut in.
+                  example: Et qui ut deleniti.
                 - name: policyName
                   in: path
                   description: Policy name.
@@ -339,8 +384,8 @@ paths:
                   schema:
                     type: string
                     description: Policy name.
-                    example: Consequatur aut ipsam.
-                  example: Aut provident ducimus vero adipisci nemo.
+                    example: Eos cumque asperiores.
+                  example: Commodi illo quidem omnis eveniet et.
                 - name: version
                   in: path
                   description: Policy version.
@@ -348,8 +393,8 @@ paths:
                   schema:
                     type: string
                     description: Policy version.
-                    example: Itaque laborum.
-                  example: Quos saepe dolorum qui tenetur aut.
+                    example: Adipisci harum.
+                  example: Ratione sit numquam non cupiditate sed omnis.
             responses:
                 "200":
                     description: OK response.
@@ -367,9 +412,9 @@ paths:
                             schema:
                                 $ref: '#/components/schemas/HealthResponse'
                             example:
-                                service: Voluptas ad corporis adipisci inventore ipsum.
-                                status: Recusandae dolorum nisi distinctio vitae ad.
-                                version: Perspiciatis voluptatem.
+                                service: Vitae dolores quas et aperiam dolores reiciendis.
+                                status: Voluptate amet.
+                                version: Aut et.
     /v1/policies:
         get:
             tags:
@@ -385,8 +430,8 @@ paths:
                   schema:
                     type: boolean
                     description: Filter to return locked/unlocked policies (optional).
-                    example: true
-                  example: true
+                    example: false
+                  example: false
                 - name: rego
                   in: query
                   description: Include policy source code in results (optional).
@@ -394,8 +439,8 @@ paths:
                   schema:
                     type: boolean
                     description: Include policy source code in results (optional).
-                    example: true
-                  example: false
+                    example: false
+                  example: true
                 - name: data
                   in: query
                   description: 'Include policy static data in results (optional). '
@@ -403,8 +448,8 @@ paths:
                   schema:
                     type: boolean
                     description: 'Include policy static data in results (optional). '
-                    example: false
-                  example: true
+                    example: true
+                  example: false
                 - name: dataConfig
                   in: query
                   description: Include static data config (optional).
@@ -423,38 +468,42 @@ paths:
                                 $ref: '#/components/schemas/PoliciesResult'
                             example:
                                 policies:
-                                    - data: Optio quia et laborum.
-                                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                                      lastUpdate: 9002532952206938167
-                                      locked: false
-                                      policyName: Et aliquam sunt in et quia cum.
-                                      rego: Error maxime quasi quia non voluptatibus error.
-                                      version: Qui non quia.
-                                    - data: Optio quia et laborum.
-                                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                                      lastUpdate: 9002532952206938167
-                                      locked: false
-                                      policyName: Et aliquam sunt in et quia cum.
-                                      rego: Error maxime quasi quia non voluptatibus error.
-                                      version: Qui non quia.
-                                    - data: Optio quia et laborum.
-                                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                                      lastUpdate: 9002532952206938167
-                                      locked: false
-                                      policyName: Et aliquam sunt in et quia cum.
-                                      rego: Error maxime quasi quia non voluptatibus error.
-                                      version: Qui non quia.
-                                    - data: Optio quia et laborum.
-                                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                                      lastUpdate: 9002532952206938167
-                                      locked: false
-                                      policyName: Et aliquam sunt in et quia cum.
-                                      rego: Error maxime quasi quia non voluptatibus error.
-                                      version: Qui non quia.
+                                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                                      group: Accusamus enim.
+                                      lastUpdate: 4303309286764032455
+                                      locked: true
+                                      policyName: Ut amet.
+                                      rego: Quam dolores architecto itaque.
+                                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                                      version: Recusandae est rerum corrupti quia.
+                                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                                      group: Accusamus enim.
+                                      lastUpdate: 4303309286764032455
+                                      locked: true
+                                      policyName: Ut amet.
+                                      rego: Quam dolores architecto itaque.
+                                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                                      version: Recusandae est rerum corrupti quia.
+                                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                                      group: Accusamus enim.
+                                      lastUpdate: 4303309286764032455
+                                      locked: true
+                                      policyName: Ut amet.
+                                      rego: Quam dolores architecto itaque.
+                                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                                      version: Recusandae est rerum corrupti quia.
+                                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                                      group: Accusamus enim.
+                                      lastUpdate: 4303309286764032455
+                                      locked: true
+                                      policyName: Ut amet.
+                                      rego: Quam dolores architecto itaque.
+                                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                                      version: Recusandae est rerum corrupti quia.
 components:
     schemas:
         HealthResponse:
@@ -463,19 +512,19 @@ components:
                 service:
                     type: string
                     description: Service name.
-                    example: Aut officiis veritatis impedit rerum recusandae.
+                    example: Ea et ad omnis.
                 status:
                     type: string
                     description: Status message.
-                    example: In id quibusdam.
+                    example: Eveniet cupiditate qui quo.
                 version:
                     type: string
                     description: Service runtime version.
-                    example: Deserunt officiis ipsa molestiae.
+                    example: Dignissimos enim.
             example:
-                service: Unde doloremque quae ullam.
-                status: Optio nobis iure rerum non.
-                version: Sapiente laborum.
+                service: Error et sunt maxime aperiam.
+                status: Et sit qui fugit enim labore.
+                version: Et exercitationem perspiciatis quidem accusamus.
             required:
                 - service
                 - status
@@ -489,56 +538,71 @@ components:
                         $ref: '#/components/schemas/Policy'
                     description: JSON array of policies.
                     example:
-                        - data: Optio quia et laborum.
-                          dataConfig: In libero perspiciatis voluptatum ut soluta.
-                          group: Commodi nemo fugiat id praesentium accusantium expedita.
-                          lastUpdate: 9002532952206938167
-                          locked: false
-                          policyName: Et aliquam sunt in et quia cum.
-                          rego: Error maxime quasi quia non voluptatibus error.
-                          version: Qui non quia.
-                        - data: Optio quia et laborum.
-                          dataConfig: In libero perspiciatis voluptatum ut soluta.
-                          group: Commodi nemo fugiat id praesentium accusantium expedita.
-                          lastUpdate: 9002532952206938167
-                          locked: false
-                          policyName: Et aliquam sunt in et quia cum.
-                          rego: Error maxime quasi quia non voluptatibus error.
-                          version: Qui non quia.
-                        - data: Optio quia et laborum.
-                          dataConfig: In libero perspiciatis voluptatum ut soluta.
-                          group: Commodi nemo fugiat id praesentium accusantium expedita.
-                          lastUpdate: 9002532952206938167
-                          locked: false
-                          policyName: Et aliquam sunt in et quia cum.
-                          rego: Error maxime quasi quia non voluptatibus error.
-                          version: Qui non quia.
-                        - data: Optio quia et laborum.
-                          dataConfig: In libero perspiciatis voluptatum ut soluta.
-                          group: Commodi nemo fugiat id praesentium accusantium expedita.
-                          lastUpdate: 9002532952206938167
-                          locked: false
-                          policyName: Et aliquam sunt in et quia cum.
-                          rego: Error maxime quasi quia non voluptatibus error.
-                          version: Qui non quia.
+                        - data: Voluptas ad corporis adipisci inventore ipsum.
+                          dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                          group: Accusamus enim.
+                          lastUpdate: 4303309286764032455
+                          locked: true
+                          policyName: Ut amet.
+                          rego: Quam dolores architecto itaque.
+                          repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                          version: Recusandae est rerum corrupti quia.
+                        - data: Voluptas ad corporis adipisci inventore ipsum.
+                          dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                          group: Accusamus enim.
+                          lastUpdate: 4303309286764032455
+                          locked: true
+                          policyName: Ut amet.
+                          rego: Quam dolores architecto itaque.
+                          repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                          version: Recusandae est rerum corrupti quia.
+                        - data: Voluptas ad corporis adipisci inventore ipsum.
+                          dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                          group: Accusamus enim.
+                          lastUpdate: 4303309286764032455
+                          locked: true
+                          policyName: Ut amet.
+                          rego: Quam dolores architecto itaque.
+                          repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                          version: Recusandae est rerum corrupti quia.
             example:
                 policies:
-                    - data: Optio quia et laborum.
-                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                      lastUpdate: 9002532952206938167
-                      locked: false
-                      policyName: Et aliquam sunt in et quia cum.
-                      rego: Error maxime quasi quia non voluptatibus error.
-                      version: Qui non quia.
-                    - data: Optio quia et laborum.
-                      dataConfig: In libero perspiciatis voluptatum ut soluta.
-                      group: Commodi nemo fugiat id praesentium accusantium expedita.
-                      lastUpdate: 9002532952206938167
-                      locked: false
-                      policyName: Et aliquam sunt in et quia cum.
-                      rego: Error maxime quasi quia non voluptatibus error.
-                      version: Qui non quia.
+                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                      group: Accusamus enim.
+                      lastUpdate: 4303309286764032455
+                      locked: true
+                      policyName: Ut amet.
+                      rego: Quam dolores architecto itaque.
+                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                      version: Recusandae est rerum corrupti quia.
+                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                      group: Accusamus enim.
+                      lastUpdate: 4303309286764032455
+                      locked: true
+                      policyName: Ut amet.
+                      rego: Quam dolores architecto itaque.
+                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                      version: Recusandae est rerum corrupti quia.
+                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                      group: Accusamus enim.
+                      lastUpdate: 4303309286764032455
+                      locked: true
+                      policyName: Ut amet.
+                      rego: Quam dolores architecto itaque.
+                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                      version: Recusandae est rerum corrupti quia.
+                    - data: Voluptas ad corporis adipisci inventore ipsum.
+                      dataConfig: Recusandae dolorum nisi distinctio vitae ad.
+                      group: Accusamus enim.
+                      lastUpdate: 4303309286764032455
+                      locked: true
+                      policyName: Ut amet.
+                      rego: Quam dolores architecto itaque.
+                      repository: Reprehenderit in libero perspiciatis voluptatum ut soluta.
+                      version: Recusandae est rerum corrupti quia.
             required:
                 - policies
         Policy:
@@ -547,19 +611,19 @@ components:
                 data:
                     type: string
                     description: Policy static data.
-                    example: Rerum asperiores nulla.
+                    example: Dolorum cupiditate provident.
                 dataConfig:
                     type: string
                     description: Policy static data optional configuration.
-                    example: Tenetur rerum necessitatibus fugit.
+                    example: Dolor dolorem modi aut officiis veritatis impedit.
                 group:
                     type: string
                     description: Policy group.
-                    example: Est impedit.
+                    example: Laborum harum voluptate et ut similique doloremque.
                 lastUpdate:
                     type: integer
                     description: Last update (Unix timestamp).
-                    example: 2958895584654309878
+                    example: 1580298023389806623
                     format: int64
                 locked:
                     type: boolean
@@ -568,25 +632,31 @@ components:
                 policyName:
                     type: string
                     description: Policy name.
-                    example: Sapiente architecto et enim omnis.
+                    example: Rem et occaecati quam.
                 rego:
                     type: string
                     description: Policy rego source code.
-                    example: Neque et sed modi accusantium.
+                    example: Nisi et praesentium ut reiciendis.
+                repository:
+                    type: string
+                    description: Policy repository.
+                    example: Ut velit aut nobis repellendus.
                 version:
                     type: string
                     description: Policy version.
-                    example: Consequatur ut suscipit.
+                    example: Explicabo expedita ipsum minus ipsam at vel.
             example:
-                data: Vel saepe nisi et.
-                dataConfig: Ut reiciendis fugit dolorum cupiditate.
-                group: Occaecati quam tempora.
-                lastUpdate: 8725218653039851118
-                locked: false
-                policyName: Aut nobis repellendus quis rem.
-                rego: Expedita ipsum minus ipsam.
-                version: Harum voluptate et ut similique doloremque quis.
+                data: Dolorem aut accusantium.
+                dataConfig: Dolor culpa.
+                group: Unde doloremque quae ullam.
+                lastUpdate: 8514723213962082729
+                locked: true
+                policyName: Deserunt officiis ipsa molestiae.
+                rego: Sapiente laborum.
+                repository: In id quibusdam.
+                version: Optio nobis iure rerum non.
             required:
+                - repository
                 - group
                 - policyName
                 - version
diff --git a/gen/http/policy/client/cli.go b/gen/http/policy/client/cli.go
index 7b6988b1174f3aea8b276226a0091af793a91bc6..289bca63e92c83a6c145d8b300a2ba6be9d9accd 100644
--- a/gen/http/policy/client/cli.go
+++ b/gen/http/policy/client/cli.go
@@ -17,15 +17,19 @@ import (
 
 // BuildEvaluatePayload builds the payload for the policy Evaluate endpoint
 // from CLI flags.
-func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string, policyEvaluateEvaluationID string, policyEvaluateTTL string) (*policy.EvaluateRequest, error) {
+func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateRepository string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string, policyEvaluateEvaluationID string, policyEvaluateTTL string) (*policy.EvaluateRequest, error) {
 	var err error
 	var body any
 	{
 		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, "\"At incidunt unde consequatur voluptas dolorem nisi.\"")
+			return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "\"Ad omnis quasi aut consequuntur quibusdam.\"")
 		}
 	}
+	var repository string
+	{
+		repository = policyEvaluateRepository
+	}
 	var group string
 	{
 		group = policyEvaluateGroup
@@ -60,6 +64,7 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string,
 	res := &policy.EvaluateRequest{
 		Input: &v,
 	}
+	res.Repository = repository
 	res.Group = group
 	res.PolicyName = policyName
 	res.Version = version
@@ -71,7 +76,11 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string,
 
 // BuildLockPayload builds the payload for the policy Lock endpoint from CLI
 // flags.
-func BuildLockPayload(policyLockGroup string, policyLockPolicyName string, policyLockVersion string) (*policy.LockRequest, error) {
+func BuildLockPayload(policyLockRepository string, policyLockGroup string, policyLockPolicyName string, policyLockVersion string) (*policy.LockRequest, error) {
+	var repository string
+	{
+		repository = policyLockRepository
+	}
 	var group string
 	{
 		group = policyLockGroup
@@ -85,6 +94,7 @@ func BuildLockPayload(policyLockGroup string, policyLockPolicyName string, polic
 		version = policyLockVersion
 	}
 	v := &policy.LockRequest{}
+	v.Repository = repository
 	v.Group = group
 	v.PolicyName = policyName
 	v.Version = version
@@ -94,7 +104,11 @@ func BuildLockPayload(policyLockGroup string, policyLockPolicyName string, polic
 
 // BuildUnlockPayload builds the payload for the policy Unlock endpoint from
 // CLI flags.
-func BuildUnlockPayload(policyUnlockGroup string, policyUnlockPolicyName string, policyUnlockVersion string) (*policy.UnlockRequest, error) {
+func BuildUnlockPayload(policyUnlockRepository string, policyUnlockGroup string, policyUnlockPolicyName string, policyUnlockVersion string) (*policy.UnlockRequest, error) {
+	var repository string
+	{
+		repository = policyUnlockRepository
+	}
 	var group string
 	{
 		group = policyUnlockGroup
@@ -108,6 +122,7 @@ func BuildUnlockPayload(policyUnlockGroup string, policyUnlockPolicyName string,
 		version = policyUnlockVersion
 	}
 	v := &policy.UnlockRequest{}
+	v.Repository = repository
 	v.Group = group
 	v.PolicyName = policyName
 	v.Version = version
diff --git a/gen/http/policy/client/encode_decode.go b/gen/http/policy/client/encode_decode.go
index 417538d82bfd8fffd8819c87b9aab48745cd6445..8b5d9b1cda7065e7945312a6feed2832f6fec05d 100644
--- a/gen/http/policy/client/encode_decode.go
+++ b/gen/http/policy/client/encode_decode.go
@@ -25,6 +25,7 @@ import (
 // set to call the "policy" service "Evaluate" endpoint
 func (c *Client) BuildEvaluateRequest(ctx context.Context, v any) (*http.Request, error) {
 	var (
+		repository string
 		group      string
 		policyName string
 		version    string
@@ -34,11 +35,12 @@ func (c *Client) BuildEvaluateRequest(ctx context.Context, v any) (*http.Request
 		if !ok {
 			return nil, goahttp.ErrInvalidType("policy", "Evaluate", "*policy.EvaluateRequest", v)
 		}
+		repository = p.Repository
 		group = p.Group
 		policyName = p.PolicyName
 		version = p.Version
 	}
-	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: EvaluatePolicyPath(group, policyName, version)}
+	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: EvaluatePolicyPath(repository, group, policyName, version)}
 	req, err := http.NewRequest("GET", u.String(), nil)
 	if err != nil {
 		return nil, goahttp.ErrInvalidURL("policy", "Evaluate", u.String(), err)
@@ -126,6 +128,7 @@ func DecodeEvaluateResponse(decoder func(*http.Response) goahttp.Decoder, restor
 // to call the "policy" service "Lock" endpoint
 func (c *Client) BuildLockRequest(ctx context.Context, v any) (*http.Request, error) {
 	var (
+		repository string
 		group      string
 		policyName string
 		version    string
@@ -135,11 +138,12 @@ func (c *Client) BuildLockRequest(ctx context.Context, v any) (*http.Request, er
 		if !ok {
 			return nil, goahttp.ErrInvalidType("policy", "Lock", "*policy.LockRequest", v)
 		}
+		repository = p.Repository
 		group = p.Group
 		policyName = p.PolicyName
 		version = p.Version
 	}
-	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: LockPolicyPath(group, policyName, version)}
+	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: LockPolicyPath(repository, group, policyName, version)}
 	req, err := http.NewRequest("POST", u.String(), nil)
 	if err != nil {
 		return nil, goahttp.ErrInvalidURL("policy", "Lock", u.String(), err)
@@ -182,6 +186,7 @@ func DecodeLockResponse(decoder func(*http.Response) goahttp.Decoder, restoreBod
 // set to call the "policy" service "Unlock" endpoint
 func (c *Client) BuildUnlockRequest(ctx context.Context, v any) (*http.Request, error) {
 	var (
+		repository string
 		group      string
 		policyName string
 		version    string
@@ -191,11 +196,12 @@ func (c *Client) BuildUnlockRequest(ctx context.Context, v any) (*http.Request,
 		if !ok {
 			return nil, goahttp.ErrInvalidType("policy", "Unlock", "*policy.UnlockRequest", v)
 		}
+		repository = p.Repository
 		group = p.Group
 		policyName = p.PolicyName
 		version = p.Version
 	}
-	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: UnlockPolicyPath(group, policyName, version)}
+	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: UnlockPolicyPath(repository, group, policyName, version)}
 	req, err := http.NewRequest("DELETE", u.String(), nil)
 	if err != nil {
 		return nil, goahttp.ErrInvalidURL("policy", "Unlock", u.String(), err)
@@ -319,6 +325,7 @@ func DecodeListPoliciesResponse(decoder func(*http.Response) goahttp.Decoder, re
 // *policy.Policy from a value of type *PolicyResponseBody.
 func unmarshalPolicyResponseBodyToPolicyPolicy(v *PolicyResponseBody) *policy.Policy {
 	res := &policy.Policy{
+		Repository: *v.Repository,
 		PolicyName: *v.PolicyName,
 		Group:      *v.Group,
 		Version:    *v.Version,
diff --git a/gen/http/policy/client/paths.go b/gen/http/policy/client/paths.go
index a5da8845a897c497d06e6dc0ed55e98437560100..e822118a8e095069fd4819f41ec24ad6848c11af 100644
--- a/gen/http/policy/client/paths.go
+++ b/gen/http/policy/client/paths.go
@@ -12,28 +12,28 @@ import (
 )
 
 // EvaluatePolicyPath returns the URL path to the policy service Evaluate HTTP endpoint.
-func EvaluatePolicyPath(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/evaluation/did.json", group, policyName, version)
+func EvaluatePolicyPath(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation/did.json", repository, group, policyName, version)
 }
 
 // EvaluatePolicyPath2 returns the URL path to the policy service Evaluate HTTP endpoint.
-func EvaluatePolicyPath2(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version)
+func EvaluatePolicyPath2(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version)
 }
 
 // EvaluatePolicyPath3 returns the URL path to the policy service Evaluate HTTP endpoint.
-func EvaluatePolicyPath3(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version)
+func EvaluatePolicyPath3(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version)
 }
 
 // LockPolicyPath returns the URL path to the policy service Lock HTTP endpoint.
-func LockPolicyPath(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version)
+func LockPolicyPath(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version)
 }
 
 // UnlockPolicyPath returns the URL path to the policy service Unlock HTTP endpoint.
-func UnlockPolicyPath(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version)
+func UnlockPolicyPath(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version)
 }
 
 // ListPoliciesPolicyPath returns the URL path to the policy service ListPolicies HTTP endpoint.
diff --git a/gen/http/policy/client/types.go b/gen/http/policy/client/types.go
index 4f9370b3baf08b33de636c9855b34fbb7e16873d..f56f0fb5df16450b64f0a3ae1e7d8220f1fe43d2 100644
--- a/gen/http/policy/client/types.go
+++ b/gen/http/policy/client/types.go
@@ -21,6 +21,8 @@ type ListPoliciesResponseBody struct {
 
 // PolicyResponseBody is used to define fields on response body types.
 type PolicyResponseBody struct {
+	// Policy repository.
+	Repository *string `form:"repository,omitempty" json:"repository,omitempty" xml:"repository,omitempty"`
 	// Policy name.
 	PolicyName *string `form:"policyName,omitempty" json:"policyName,omitempty" xml:"policyName,omitempty"`
 	// Policy group.
@@ -81,6 +83,9 @@ func ValidateListPoliciesResponseBody(body *ListPoliciesResponseBody) (err error
 
 // ValidatePolicyResponseBody runs the validations defined on PolicyResponseBody
 func ValidatePolicyResponseBody(body *PolicyResponseBody) (err error) {
+	if body.Repository == nil {
+		err = goa.MergeErrors(err, goa.MissingFieldError("repository", "body"))
+	}
 	if body.Group == nil {
 		err = goa.MergeErrors(err, goa.MissingFieldError("group", "body"))
 	}
diff --git a/gen/http/policy/server/encode_decode.go b/gen/http/policy/server/encode_decode.go
index 8556a4be5eb12a836422f45341b5a3b9d0cf2cc5..e6c030abb97b55501551cae2eb1149cf27bf5001 100644
--- a/gen/http/policy/server/encode_decode.go
+++ b/gen/http/policy/server/encode_decode.go
@@ -49,6 +49,7 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt
 		}
 
 		var (
+			repository   string
 			group        string
 			policyName   string
 			version      string
@@ -57,6 +58,7 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt
 
 			params = mux.Vars(r)
 		)
+		repository = params["repository"]
 		group = params["group"]
 		policyName = params["policyName"]
 		version = params["version"]
@@ -78,7 +80,7 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt
 		if err != nil {
 			return nil, err
 		}
-		payload := NewEvaluateRequest(body, group, policyName, version, evaluationID, ttl)
+		payload := NewEvaluateRequest(body, repository, group, policyName, version, evaluationID, ttl)
 
 		return payload, nil
 	}
@@ -98,16 +100,18 @@ func EncodeLockResponse(encoder func(context.Context, http.ResponseWriter) goaht
 func DecodeLockRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (any, error) {
 	return func(r *http.Request) (any, error) {
 		var (
+			repository string
 			group      string
 			policyName string
 			version    string
 
 			params = mux.Vars(r)
 		)
+		repository = params["repository"]
 		group = params["group"]
 		policyName = params["policyName"]
 		version = params["version"]
-		payload := NewLockRequest(group, policyName, version)
+		payload := NewLockRequest(repository, group, policyName, version)
 
 		return payload, nil
 	}
@@ -127,16 +131,18 @@ func EncodeUnlockResponse(encoder func(context.Context, http.ResponseWriter) goa
 func DecodeUnlockRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (any, error) {
 	return func(r *http.Request) (any, error) {
 		var (
+			repository string
 			group      string
 			policyName string
 			version    string
 
 			params = mux.Vars(r)
 		)
+		repository = params["repository"]
 		group = params["group"]
 		policyName = params["policyName"]
 		version = params["version"]
-		payload := NewUnlockRequest(group, policyName, version)
+		payload := NewUnlockRequest(repository, group, policyName, version)
 
 		return payload, nil
 	}
@@ -218,6 +224,7 @@ func DecodeListPoliciesRequest(mux goahttp.Muxer, decoder func(*http.Request) go
 // *PolicyResponseBody from a value of type *policy.Policy.
 func marshalPolicyPolicyToPolicyResponseBody(v *policy.Policy) *PolicyResponseBody {
 	res := &PolicyResponseBody{
+		Repository: v.Repository,
 		PolicyName: v.PolicyName,
 		Group:      v.Group,
 		Version:    v.Version,
diff --git a/gen/http/policy/server/paths.go b/gen/http/policy/server/paths.go
index f224fbe4c1bc4f5ef5c1d86d22d95f746c08feec..983b69f128e511eca05a71341a9e460d89f8e3c8 100644
--- a/gen/http/policy/server/paths.go
+++ b/gen/http/policy/server/paths.go
@@ -12,28 +12,28 @@ import (
 )
 
 // EvaluatePolicyPath returns the URL path to the policy service Evaluate HTTP endpoint.
-func EvaluatePolicyPath(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/evaluation/did.json", group, policyName, version)
+func EvaluatePolicyPath(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation/did.json", repository, group, policyName, version)
 }
 
 // EvaluatePolicyPath2 returns the URL path to the policy service Evaluate HTTP endpoint.
-func EvaluatePolicyPath2(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version)
+func EvaluatePolicyPath2(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version)
 }
 
 // EvaluatePolicyPath3 returns the URL path to the policy service Evaluate HTTP endpoint.
-func EvaluatePolicyPath3(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version)
+func EvaluatePolicyPath3(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version)
 }
 
 // LockPolicyPath returns the URL path to the policy service Lock HTTP endpoint.
-func LockPolicyPath(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version)
+func LockPolicyPath(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version)
 }
 
 // UnlockPolicyPath returns the URL path to the policy service Unlock HTTP endpoint.
-func UnlockPolicyPath(group string, policyName string, version string) string {
-	return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version)
+func UnlockPolicyPath(repository string, group string, policyName string, version string) string {
+	return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version)
 }
 
 // ListPoliciesPolicyPath returns the URL path to the policy service ListPolicies HTTP endpoint.
diff --git a/gen/http/policy/server/server.go b/gen/http/policy/server/server.go
index 2043d7396d4c8ca1b50983eda1b7664ee9e11a2b..33fce435da180a01a74967b941d3cecf486c28d9 100644
--- a/gen/http/policy/server/server.go
+++ b/gen/http/policy/server/server.go
@@ -52,11 +52,11 @@ func New(
 ) *Server {
 	return &Server{
 		Mounts: []*MountPoint{
-			{"Evaluate", "GET", "/policy/{group}/{policyName}/{version}/evaluation/did.json"},
-			{"Evaluate", "GET", "/policy/{group}/{policyName}/{version}/evaluation"},
-			{"Evaluate", "POST", "/policy/{group}/{policyName}/{version}/evaluation"},
-			{"Lock", "POST", "/policy/{group}/{policyName}/{version}/lock"},
-			{"Unlock", "DELETE", "/policy/{group}/{policyName}/{version}/lock"},
+			{"Evaluate", "GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json"},
+			{"Evaluate", "GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation"},
+			{"Evaluate", "POST", "/policy/{repository}/{group}/{policyName}/{version}/evaluation"},
+			{"Lock", "POST", "/policy/{repository}/{group}/{policyName}/{version}/lock"},
+			{"Unlock", "DELETE", "/policy/{repository}/{group}/{policyName}/{version}/lock"},
 			{"ListPolicies", "GET", "/v1/policies"},
 		},
 		Evaluate:     NewEvaluateHandler(e.Evaluate, mux, decoder, encoder, errhandler, formatter),
@@ -102,9 +102,9 @@ func MountEvaluateHandler(mux goahttp.Muxer, h http.Handler) {
 			h.ServeHTTP(w, r)
 		}
 	}
-	mux.Handle("GET", "/policy/{group}/{policyName}/{version}/evaluation/did.json", f)
-	mux.Handle("GET", "/policy/{group}/{policyName}/{version}/evaluation", f)
-	mux.Handle("POST", "/policy/{group}/{policyName}/{version}/evaluation", f)
+	mux.Handle("GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json", f)
+	mux.Handle("GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation", f)
+	mux.Handle("POST", "/policy/{repository}/{group}/{policyName}/{version}/evaluation", f)
 }
 
 // NewEvaluateHandler creates a HTTP handler which loads the HTTP request and
@@ -155,7 +155,7 @@ func MountLockHandler(mux goahttp.Muxer, h http.Handler) {
 			h.ServeHTTP(w, r)
 		}
 	}
-	mux.Handle("POST", "/policy/{group}/{policyName}/{version}/lock", f)
+	mux.Handle("POST", "/policy/{repository}/{group}/{policyName}/{version}/lock", f)
 }
 
 // NewLockHandler creates a HTTP handler which loads the HTTP request and calls
@@ -206,7 +206,7 @@ func MountUnlockHandler(mux goahttp.Muxer, h http.Handler) {
 			h.ServeHTTP(w, r)
 		}
 	}
-	mux.Handle("DELETE", "/policy/{group}/{policyName}/{version}/lock", f)
+	mux.Handle("DELETE", "/policy/{repository}/{group}/{policyName}/{version}/lock", f)
 }
 
 // NewUnlockHandler creates a HTTP handler which loads the HTTP request and
diff --git a/gen/http/policy/server/types.go b/gen/http/policy/server/types.go
index 31b816ef74eb879775e220f44c2da4d73d4df8b4..f487d9380031e867f211e1d9ec7ed8bf98c4e9a9 100644
--- a/gen/http/policy/server/types.go
+++ b/gen/http/policy/server/types.go
@@ -20,6 +20,8 @@ type ListPoliciesResponseBody struct {
 
 // PolicyResponseBody is used to define fields on response body types.
 type PolicyResponseBody struct {
+	// Policy repository.
+	Repository string `form:"repository" json:"repository" xml:"repository"`
 	// Policy name.
 	PolicyName string `form:"policyName" json:"policyName" xml:"policyName"`
 	// Policy group.
@@ -54,11 +56,12 @@ func NewListPoliciesResponseBody(res *policy.PoliciesResult) *ListPoliciesRespon
 }
 
 // NewEvaluateRequest builds a policy service Evaluate endpoint payload.
-func NewEvaluateRequest(body any, group string, policyName string, version string, evaluationID *string, ttl *int) *policy.EvaluateRequest {
+func NewEvaluateRequest(body any, repository string, group string, policyName string, version string, evaluationID *string, ttl *int) *policy.EvaluateRequest {
 	v := body
 	res := &policy.EvaluateRequest{
 		Input: &v,
 	}
+	res.Repository = repository
 	res.Group = group
 	res.PolicyName = policyName
 	res.Version = version
@@ -69,8 +72,9 @@ func NewEvaluateRequest(body any, group string, policyName string, version strin
 }
 
 // NewLockRequest builds a policy service Lock endpoint payload.
-func NewLockRequest(group string, policyName string, version string) *policy.LockRequest {
+func NewLockRequest(repository string, group string, policyName string, version string) *policy.LockRequest {
 	v := &policy.LockRequest{}
+	v.Repository = repository
 	v.Group = group
 	v.PolicyName = policyName
 	v.Version = version
@@ -79,8 +83,9 @@ func NewLockRequest(group string, policyName string, version string) *policy.Loc
 }
 
 // NewUnlockRequest builds a policy service Unlock endpoint payload.
-func NewUnlockRequest(group string, policyName string, version string) *policy.UnlockRequest {
+func NewUnlockRequest(repository string, group string, policyName string, version string) *policy.UnlockRequest {
 	v := &policy.UnlockRequest{}
+	v.Repository = repository
 	v.Group = group
 	v.PolicyName = policyName
 	v.Version = version
diff --git a/gen/policy/service.go b/gen/policy/service.go
index 2ca613b9186fc1be5c01ab16a0671819c7c90dc7..a8bec54a7be9f794b6fb8e5fabed30240854dd25 100644
--- a/gen/policy/service.go
+++ b/gen/policy/service.go
@@ -35,6 +35,8 @@ var MethodNames = [4]string{"Evaluate", "Lock", "Unlock", "ListPolicies"}
 
 // EvaluateRequest is the payload type of the policy service Evaluate method.
 type EvaluateRequest struct {
+	// Policy repository.
+	Repository string
 	// Policy group.
 	Group string
 	// Policy name.
@@ -61,6 +63,8 @@ type EvaluateResult struct {
 
 // LockRequest is the payload type of the policy service Lock method.
 type LockRequest struct {
+	// Policy repository.
+	Repository string
 	// Policy group.
 	Group string
 	// Policy name.
@@ -85,6 +89,8 @@ type PoliciesResult struct {
 }
 
 type Policy struct {
+	// Policy repository.
+	Repository string
 	// Policy name.
 	PolicyName string
 	// Policy group.
@@ -105,6 +111,8 @@ type Policy struct {
 
 // UnlockRequest is the payload type of the policy service Unlock method.
 type UnlockRequest struct {
+	// Policy repository.
+	Repository string
 	// Policy group.
 	Group string
 	// Policy name.
diff --git a/internal/notify/notify.go b/internal/notify/notify.go
index 4f52c85eb87523dec1dd28241a8991937999b519..c2c80a18b49ac139634d92c56e21e45c970fcc97 100644
--- a/internal/notify/notify.go
+++ b/internal/notify/notify.go
@@ -15,9 +15,10 @@ type Notifier struct {
 }
 
 type EventPolicyChange struct {
-	Name    string `json:"name"`
-	Version string `json:"version"`
-	Group   string `json:"group"`
+	Repository string `json:"repository"`
+	Name       string `json:"name"`
+	Version    string `json:"version"`
+	Group      string `json:"group"`
 }
 
 // New creates a policy change notifier for interested subscribers.
diff --git a/internal/service/policy/policydata/refresher.go b/internal/service/policy/policydata/refresher.go
index 9b48847d9bc6175584762055b50caa7a1015e618..7000d441b8aa5c9767b1da6b68e3d5d8aea80882 100644
--- a/internal/service/policy/policydata/refresher.go
+++ b/internal/service/policy/policydata/refresher.go
@@ -72,6 +72,7 @@ loop:
 
 func (e *Refresher) Execute(ctx context.Context, p *storage.Policy) {
 	logger := e.logger.With(
+		zap.String("policyRepository", p.Repository),
 		zap.String("policyName", p.Name),
 		zap.String("policyGroup", p.Group),
 		zap.String("policyVersion", p.Version),
diff --git a/internal/service/policy/policyfakes/fake_storage.go b/internal/service/policy/policyfakes/fake_storage.go
index acf20f5ae889e77e6fbc799dccdfa87270d15293..cd52a7c153cf12ac241c3b058fe3a3f40ef4074f 100644
--- a/internal/service/policy/policyfakes/fake_storage.go
+++ b/internal/service/policy/policyfakes/fake_storage.go
@@ -24,13 +24,14 @@ type FakeStorage struct {
 		result1 []*storage.Policy
 		result2 error
 	}
-	PolicyStub        func(context.Context, string, string, string) (*storage.Policy, error)
+	PolicyStub        func(context.Context, string, string, string, string) (*storage.Policy, error)
 	policyMutex       sync.RWMutex
 	policyArgsForCall []struct {
 		arg1 context.Context
 		arg2 string
 		arg3 string
 		arg4 string
+		arg5 string
 	}
 	policyReturns struct {
 		result1 *storage.Policy
@@ -40,14 +41,15 @@ type FakeStorage struct {
 		result1 *storage.Policy
 		result2 error
 	}
-	SetPolicyLockStub        func(context.Context, string, string, string, bool) error
+	SetPolicyLockStub        func(context.Context, string, string, string, string, bool) error
 	setPolicyLockMutex       sync.RWMutex
 	setPolicyLockArgsForCall []struct {
 		arg1 context.Context
 		arg2 string
 		arg3 string
 		arg4 string
-		arg5 bool
+		arg5 string
+		arg6 bool
 	}
 	setPolicyLockReturns struct {
 		result1 error
@@ -124,7 +126,7 @@ func (fake *FakeStorage) GetPoliciesReturnsOnCall(i int, result1 []*storage.Poli
 	}{result1, result2}
 }
 
-func (fake *FakeStorage) Policy(arg1 context.Context, arg2 string, arg3 string, arg4 string) (*storage.Policy, error) {
+func (fake *FakeStorage) Policy(arg1 context.Context, arg2 string, arg3 string, arg4 string, arg5 string) (*storage.Policy, error) {
 	fake.policyMutex.Lock()
 	ret, specificReturn := fake.policyReturnsOnCall[len(fake.policyArgsForCall)]
 	fake.policyArgsForCall = append(fake.policyArgsForCall, struct {
@@ -132,13 +134,14 @@ func (fake *FakeStorage) Policy(arg1 context.Context, arg2 string, arg3 string,
 		arg2 string
 		arg3 string
 		arg4 string
-	}{arg1, arg2, arg3, arg4})
+		arg5 string
+	}{arg1, arg2, arg3, arg4, arg5})
 	stub := fake.PolicyStub
 	fakeReturns := fake.policyReturns
-	fake.recordInvocation("Policy", []interface{}{arg1, arg2, arg3, arg4})
+	fake.recordInvocation("Policy", []interface{}{arg1, arg2, arg3, arg4, arg5})
 	fake.policyMutex.Unlock()
 	if stub != nil {
-		return stub(arg1, arg2, arg3, arg4)
+		return stub(arg1, arg2, arg3, arg4, arg5)
 	}
 	if specificReturn {
 		return ret.result1, ret.result2
@@ -152,17 +155,17 @@ func (fake *FakeStorage) PolicyCallCount() int {
 	return len(fake.policyArgsForCall)
 }
 
-func (fake *FakeStorage) PolicyCalls(stub func(context.Context, string, string, string) (*storage.Policy, error)) {
+func (fake *FakeStorage) PolicyCalls(stub func(context.Context, string, string, string, string) (*storage.Policy, error)) {
 	fake.policyMutex.Lock()
 	defer fake.policyMutex.Unlock()
 	fake.PolicyStub = stub
 }
 
-func (fake *FakeStorage) PolicyArgsForCall(i int) (context.Context, string, string, string) {
+func (fake *FakeStorage) PolicyArgsForCall(i int) (context.Context, string, string, string, string) {
 	fake.policyMutex.RLock()
 	defer fake.policyMutex.RUnlock()
 	argsForCall := fake.policyArgsForCall[i]
-	return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4
+	return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5
 }
 
 func (fake *FakeStorage) PolicyReturns(result1 *storage.Policy, result2 error) {
@@ -191,7 +194,7 @@ func (fake *FakeStorage) PolicyReturnsOnCall(i int, result1 *storage.Policy, res
 	}{result1, result2}
 }
 
-func (fake *FakeStorage) SetPolicyLock(arg1 context.Context, arg2 string, arg3 string, arg4 string, arg5 bool) error {
+func (fake *FakeStorage) SetPolicyLock(arg1 context.Context, arg2 string, arg3 string, arg4 string, arg5 string, arg6 bool) error {
 	fake.setPolicyLockMutex.Lock()
 	ret, specificReturn := fake.setPolicyLockReturnsOnCall[len(fake.setPolicyLockArgsForCall)]
 	fake.setPolicyLockArgsForCall = append(fake.setPolicyLockArgsForCall, struct {
@@ -199,14 +202,15 @@ func (fake *FakeStorage) SetPolicyLock(arg1 context.Context, arg2 string, arg3 s
 		arg2 string
 		arg3 string
 		arg4 string
-		arg5 bool
-	}{arg1, arg2, arg3, arg4, arg5})
+		arg5 string
+		arg6 bool
+	}{arg1, arg2, arg3, arg4, arg5, arg6})
 	stub := fake.SetPolicyLockStub
 	fakeReturns := fake.setPolicyLockReturns
-	fake.recordInvocation("SetPolicyLock", []interface{}{arg1, arg2, arg3, arg4, arg5})
+	fake.recordInvocation("SetPolicyLock", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6})
 	fake.setPolicyLockMutex.Unlock()
 	if stub != nil {
-		return stub(arg1, arg2, arg3, arg4, arg5)
+		return stub(arg1, arg2, arg3, arg4, arg5, arg6)
 	}
 	if specificReturn {
 		return ret.result1
@@ -220,17 +224,17 @@ func (fake *FakeStorage) SetPolicyLockCallCount() int {
 	return len(fake.setPolicyLockArgsForCall)
 }
 
-func (fake *FakeStorage) SetPolicyLockCalls(stub func(context.Context, string, string, string, bool) error) {
+func (fake *FakeStorage) SetPolicyLockCalls(stub func(context.Context, string, string, string, string, bool) error) {
 	fake.setPolicyLockMutex.Lock()
 	defer fake.setPolicyLockMutex.Unlock()
 	fake.SetPolicyLockStub = stub
 }
 
-func (fake *FakeStorage) SetPolicyLockArgsForCall(i int) (context.Context, string, string, string, bool) {
+func (fake *FakeStorage) SetPolicyLockArgsForCall(i int) (context.Context, string, string, string, string, bool) {
 	fake.setPolicyLockMutex.RLock()
 	defer fake.setPolicyLockMutex.RUnlock()
 	argsForCall := fake.setPolicyLockArgsForCall[i]
-	return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5
+	return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6
 }
 
 func (fake *FakeStorage) SetPolicyLockReturns(result1 error) {
diff --git a/internal/service/policy/service.go b/internal/service/policy/service.go
index 819c997cb8391c8dc54716ce302e945f8c56fff0..dc9df440a83a67a281cc54b18e099af17becbeed 100644
--- a/internal/service/policy/service.go
+++ b/internal/service/policy/service.go
@@ -27,8 +27,8 @@ type Cache interface {
 }
 
 type Storage interface {
-	Policy(ctx context.Context, group, name, version string) (*storage.Policy, error)
-	SetPolicyLock(ctx context.Context, group, name, version string, lock bool) error
+	Policy(ctx context.Context, repository, group, name, version string) (*storage.Policy, error)
+	SetPolicyLock(ctx context.Context, repository, group, name, version string, lock bool) error
 	GetPolicies(ctx context.Context, locked *bool) ([]*storage.Policy, error)
 }
 
@@ -70,6 +70,7 @@ func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (*p
 	}
 
 	logger := s.logger.With(
+		zap.String("repository", req.Repository),
 		zap.String("group", req.Group),
 		zap.String("name", req.PolicyName),
 		zap.String("version", req.Version),
@@ -77,7 +78,7 @@ func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (*p
 	)
 
 	headers, _ := header.FromContext(ctx)
-	query, err := s.prepareQuery(ctx, req.Group, req.PolicyName, req.Version, headers)
+	query, err := s.prepareQuery(ctx, req.Repository, req.Group, req.PolicyName, req.Version, headers)
 	if err != nil {
 		logger.Error("error getting prepared query", zap.Error(err))
 		return nil, errors.New("error evaluating policy", err)
@@ -142,12 +143,13 @@ func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (*p
 // Lock a policy so that it cannot be evaluated.
 func (s *Service) Lock(ctx context.Context, req *policy.LockRequest) error {
 	logger := s.logger.With(
+		zap.String("repository", req.Repository),
 		zap.String("group", req.Group),
 		zap.String("name", req.PolicyName),
 		zap.String("version", req.Version),
 	)
 
-	pol, err := s.storage.Policy(ctx, req.Group, req.PolicyName, req.Version)
+	pol, err := s.storage.Policy(ctx, req.Repository, req.Group, req.PolicyName, req.Version)
 	if err != nil {
 		logger.Error("error getting policy from storage", zap.Error(err))
 		if errors.Is(errors.NotFound, err) {
@@ -160,7 +162,7 @@ func (s *Service) Lock(ctx context.Context, req *policy.LockRequest) error {
 		return errors.New(errors.Forbidden, "policy is already locked")
 	}
 
-	if err := s.storage.SetPolicyLock(ctx, req.Group, req.PolicyName, req.Version, true); err != nil {
+	if err := s.storage.SetPolicyLock(ctx, req.Repository, req.Group, req.PolicyName, req.Version, true); err != nil {
 		logger.Error("error locking policy", zap.Error(err))
 		return errors.New("error locking policy", err)
 	}
@@ -173,12 +175,13 @@ func (s *Service) Lock(ctx context.Context, req *policy.LockRequest) error {
 // Unlock a policy so it can be evaluated again.
 func (s *Service) Unlock(ctx context.Context, req *policy.UnlockRequest) error {
 	logger := s.logger.With(
+		zap.String("repository", req.Repository),
 		zap.String("group", req.Group),
 		zap.String("name", req.PolicyName),
 		zap.String("version", req.Version),
 	)
 
-	pol, err := s.storage.Policy(ctx, req.Group, req.PolicyName, req.Version)
+	pol, err := s.storage.Policy(ctx, req.Repository, req.Group, req.PolicyName, req.Version)
 	if err != nil {
 		logger.Error("error getting policy from storage", zap.Error(err))
 		if errors.Is(errors.NotFound, err) {
@@ -191,7 +194,7 @@ func (s *Service) Unlock(ctx context.Context, req *policy.UnlockRequest) error {
 		return errors.New(errors.Forbidden, "policy is unlocked")
 	}
 
-	if err := s.storage.SetPolicyLock(ctx, req.Group, req.PolicyName, req.Version, false); err != nil {
+	if err := s.storage.SetPolicyLock(ctx, req.Repository, req.Group, req.PolicyName, req.Version, false); err != nil {
 		logger.Error("error unlocking policy", zap.Error(err))
 		return errors.New("error unlocking policy", err)
 	}
@@ -216,6 +219,7 @@ func (s *Service) ListPolicies(ctx context.Context, req *policy.PoliciesRequest)
 
 	for _, p := range policies {
 		policy := &policy.Policy{
+			Repository: p.Repository,
 			PolicyName: p.Name,
 			Group:      p.Group,
 			Version:    p.Version,
@@ -244,14 +248,14 @@ func (s *Service) ListPolicies(ctx context.Context, req *policy.PoliciesRequest)
 // prepareQuery tries to get a prepared query from the regocache.
 // If the policyCache entry is not found, it will try to prepare a new
 // query and will set it into the policyCache for future use.
-func (s *Service) prepareQuery(ctx context.Context, group, policyName, version string, headers map[string]string) (*rego.PreparedEvalQuery, error) {
+func (s *Service) prepareQuery(ctx context.Context, repository, group, policyName, version string, headers map[string]string) (*rego.PreparedEvalQuery, error) {
 	// retrieve policy from cache
-	key := s.queryCacheKey(group, policyName, version)
+	key := s.queryCacheKey(repository, group, policyName, version)
 	pol, ok := s.policyCache.Get(key)
 	if !ok {
 		// retrieve policy from database storage
 		var err error
-		pol, err = s.storage.Policy(ctx, group, policyName, version)
+		pol, err = s.storage.Policy(ctx, repository, group, policyName, version)
 		if err != nil {
 			if errors.Is(errors.NotFound, err) {
 				return nil, err
@@ -315,6 +319,6 @@ func (s *Service) buildRegoArgs(filename, regoPolicy, regoQuery, regoData string
 	return availableFuncs, nil
 }
 
-func (s *Service) queryCacheKey(group, policyName, version string) string {
-	return fmt.Sprintf("%s,%s,%s", group, policyName, version)
+func (s *Service) queryCacheKey(repository, group, policyName, version string) string {
+	return fmt.Sprintf("%s,%s,%s,%s", repository, group, policyName, version)
 }
diff --git a/internal/service/policy/service_test.go b/internal/service/policy/service_test.go
index dbfcc966e957daa1cc09e69808a8955f2dfffa75..76e121fa29eec14657dad0c60e27b7719e39cdfa 100644
--- a/internal/service/policy/service_test.go
+++ b/internal/service/policy/service_test.go
@@ -27,6 +27,7 @@ func TestNew(t *testing.T) {
 
 func TestService_Evaluate(t *testing.T) {
 	testPolicy := &storage.Policy{
+		Repository: "policies",
 		Filename:   "policy.rego",
 		Name:       "example",
 		Group:      "testgroup",
@@ -52,6 +53,7 @@ func TestService_Evaluate(t *testing.T) {
 		var body interface{} = input
 
 		return &goapolicy.EvaluateRequest{
+			Repository: "policies",
 			Group:      "testgroup",
 			PolicyName: "example",
 			Version:    "1.0",
@@ -65,6 +67,7 @@ func TestService_Evaluate(t *testing.T) {
 		var body interface{}
 
 		return &goapolicy.EvaluateRequest{
+			Repository: "policies",
 			Group:      "testgroup",
 			PolicyName: "example",
 			Version:    "1.0",
@@ -126,7 +129,7 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return nil, errors.New(errors.NotFound)
 				},
 			},
@@ -143,7 +146,7 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return nil, errors.New("some error")
 				},
 			},
@@ -160,7 +163,7 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{Locked: true}, nil
 				},
 			},
@@ -178,7 +181,7 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return testPolicy, nil
 				},
 			},
@@ -201,7 +204,7 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return testPolicy, nil
 				},
 			},
@@ -223,8 +226,9 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{
+						Repository: "policies",
 						Name:       "example",
 						Group:      "testgroup",
 						Version:    "1.0",
@@ -253,8 +257,9 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{
+						Repository: "policies",
 						Name:       "example",
 						Group:      "testgroup",
 						Version:    "1.0",
@@ -283,8 +288,9 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{
+						Repository: "policies",
 						Name:       "example",
 						Group:      "testgroup",
 						Version:    "1.0",
@@ -314,8 +320,9 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{
+						Repository: "policies",
 						Name:       "example",
 						Group:      "testgroup",
 						Version:    "1.0",
@@ -344,7 +351,7 @@ func TestService_Evaluate(t *testing.T) {
 				},
 			},
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return testPolicy, nil
 				},
 			},
@@ -407,7 +414,7 @@ func TestService_Lock(t *testing.T) {
 			name: "policy is not found",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return nil, errors.New(errors.NotFound)
 				},
 			},
@@ -418,7 +425,7 @@ func TestService_Lock(t *testing.T) {
 			name: "error getting policy from storage",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return nil, errors.New("some error")
 				},
 			},
@@ -429,7 +436,7 @@ func TestService_Lock(t *testing.T) {
 			name: "policy is already locked",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{Locked: true}, nil
 				},
 			},
@@ -440,10 +447,10 @@ func TestService_Lock(t *testing.T) {
 			name: "fail to lock policy",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{Locked: false}, nil
 				},
-				SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error {
+				SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error {
 					return errors.New(errors.Internal, "error locking policy")
 				},
 			},
@@ -454,10 +461,10 @@ func TestService_Lock(t *testing.T) {
 			name: "policy is locked successfully",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{Locked: false}, nil
 				},
-				SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error {
+				SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error {
 					return nil
 				},
 			},
@@ -486,6 +493,7 @@ func TestService_Unlock(t *testing.T) {
 	// prepare test request to be used in tests
 	testReq := func() *goapolicy.UnlockRequest {
 		return &goapolicy.UnlockRequest{
+			Repository: "policies",
 			Group:      "testgroup",
 			PolicyName: "example",
 			Version:    "1.0",
@@ -504,7 +512,7 @@ func TestService_Unlock(t *testing.T) {
 			name: "policy is not found",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return nil, errors.New(errors.NotFound)
 				},
 			},
@@ -515,7 +523,7 @@ func TestService_Unlock(t *testing.T) {
 			name: "error getting policy from storage",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return nil, errors.New("some error")
 				},
 			},
@@ -526,7 +534,7 @@ func TestService_Unlock(t *testing.T) {
 			name: "policy is unlocked",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{Locked: false}, nil
 				},
 			},
@@ -537,10 +545,10 @@ func TestService_Unlock(t *testing.T) {
 			name: "fail to unlock policy",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{Locked: true}, nil
 				},
-				SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error {
+				SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error {
 					return errors.New(errors.Internal, "error unlocking policy")
 				},
 			},
@@ -551,10 +559,10 @@ func TestService_Unlock(t *testing.T) {
 			name: "policy is unlocked successfully",
 			req:  testReq(),
 			storage: &policyfakes.FakeStorage{
-				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) {
+				PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
 					return &storage.Policy{Locked: true}, nil
 				},
-				SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error {
+				SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error {
 					return nil
 				},
 			},
@@ -611,6 +619,7 @@ func TestService_ListPolicies(t *testing.T) {
 			name: "request without errors and any additional request parameter return all policies",
 			storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) {
 				return []*storage.Policy{{
+					Repository: "policies",
 					Name:       "example",
 					Group:      "example",
 					Version:    "example",
@@ -620,6 +629,7 @@ func TestService_ListPolicies(t *testing.T) {
 					Locked:     false,
 					LastUpdate: time.Time{},
 				}, {
+					Repository: "policies",
 					Name:       "example",
 					Group:      "example",
 					Version:    "example",
@@ -635,6 +645,7 @@ func TestService_ListPolicies(t *testing.T) {
 			response: &goapolicy.PoliciesResult{
 				Policies: []*goapolicy.Policy{
 					{
+						Repository: "policies",
 						PolicyName: "example",
 						Group:      "example",
 						Version:    "example",
@@ -642,6 +653,7 @@ func TestService_ListPolicies(t *testing.T) {
 						LastUpdate: time.Time{}.Unix(),
 					},
 					{
+						Repository: "policies",
 						PolicyName: "example",
 						Group:      "example",
 						Version:    "example",
@@ -655,6 +667,7 @@ func TestService_ListPolicies(t *testing.T) {
 			name: "request with only locked parameter equal to true returns only locked policies",
 			storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) {
 				return []*storage.Policy{{
+					Repository: "policies",
 					Name:       "example",
 					Group:      "example",
 					Version:    "example",
@@ -672,6 +685,7 @@ func TestService_ListPolicies(t *testing.T) {
 			response: &goapolicy.PoliciesResult{
 				Policies: []*goapolicy.Policy{
 					{
+						Repository: "policies",
 						PolicyName: "example",
 						Group:      "example",
 						Version:    "example",
@@ -685,6 +699,7 @@ func TestService_ListPolicies(t *testing.T) {
 			name: "request with only locked parameter equal to false returns only unlocked policies",
 			storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) {
 				return []*storage.Policy{{
+					Repository: "policies",
 					Name:       "example",
 					Group:      "example",
 					Version:    "example",
@@ -702,6 +717,7 @@ func TestService_ListPolicies(t *testing.T) {
 			response: &goapolicy.PoliciesResult{
 				Policies: []*goapolicy.Policy{
 					{
+						Repository: "policies",
 						PolicyName: "example",
 						Group:      "example",
 						Version:    "example",
@@ -715,6 +731,7 @@ func TestService_ListPolicies(t *testing.T) {
 			name: "request with all additional params set to true",
 			storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) {
 				return []*storage.Policy{{
+					Repository: "policies",
 					Name:       "example",
 					Group:      "example",
 					Version:    "example",
@@ -735,6 +752,7 @@ func TestService_ListPolicies(t *testing.T) {
 			response: &goapolicy.PoliciesResult{
 				Policies: []*goapolicy.Policy{
 					{
+						Repository: "policies",
 						PolicyName: "example",
 						Group:      "example",
 						Version:    "example",
@@ -751,6 +769,7 @@ func TestService_ListPolicies(t *testing.T) {
 			name: "request with all additional params set to false",
 			storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) {
 				return []*storage.Policy{{
+					Repository: "policies",
 					Name:       "example",
 					Group:      "example",
 					Version:    "example",
@@ -771,6 +790,7 @@ func TestService_ListPolicies(t *testing.T) {
 			response: &goapolicy.PoliciesResult{
 				Policies: []*goapolicy.Policy{
 					{
+						Repository: "policies",
 						PolicyName: "example",
 						Group:      "example",
 						Version:    "example",
diff --git a/internal/storage/storage.go b/internal/storage/storage.go
index 81c1dd83116bfae8bde0250213aff9d868d2beb4..3f50796badc989966e4af2226de130f4641b2b4c 100644
--- a/internal/storage/storage.go
+++ b/internal/storage/storage.go
@@ -29,6 +29,7 @@ type PolicyChangeSubscriber interface {
 type Policy struct {
 	ID                  primitive.ObjectID `bson:"_id"`
 	Filename            string
+	Repository          string
 	Name                string
 	Group               string
 	Version             string
@@ -59,17 +60,19 @@ func New(db *mongo.Client, dbname, collection string, logger *zap.Logger) (*Stor
 	}, nil
 }
 
-func (s *Storage) Policy(ctx context.Context, group, name, version string) (*Policy, error) {
+func (s *Storage) Policy(ctx context.Context, repository, group, name, version string) (*Policy, error) {
 	s.logger.Debug("get policy from storage",
+		zap.String("repository", repository),
 		zap.String("group", group),
 		zap.String("policy", name),
 		zap.String("version", version),
 	)
 
 	result := s.policy.FindOne(ctx, bson.M{
-		"group":   group,
-		"name":    name,
-		"version": version,
+		"repository": repository,
+		"group":      group,
+		"name":       name,
+		"version":    version,
 	})
 
 	if result.Err() != nil {
@@ -87,13 +90,14 @@ func (s *Storage) Policy(ctx context.Context, group, name, version string) (*Pol
 	return &policy, nil
 }
 
-func (s *Storage) SetPolicyLock(ctx context.Context, group, name, version string, lock bool) error {
+func (s *Storage) SetPolicyLock(ctx context.Context, repository, group, name, version string, lock bool) error {
 	_, err := s.policy.UpdateOne(
 		ctx,
 		bson.M{
-			"group":   group,
-			"name":    name,
-			"version": version,
+			"repository": repository,
+			"group":      group,
+			"name":       name,
+			"version":    version,
 		},
 		bson.M{
 			"$set": bson.M{
@@ -130,7 +134,7 @@ func (s *Storage) ListenPolicyDataChanges(ctx context.Context) error {
 		for _, subscriber := range s.subscribers {
 			err := subscriber.PolicyDataChange(
 				ctx,
-				&notify.EventPolicyChange{Name: policy.Name, Version: policy.Version, Group: policy.Group},
+				&notify.EventPolicyChange{Repository: policy.Repository, Name: policy.Name, Version: policy.Version, Group: policy.Group},
 			)
 			if err != nil {
 				return err