diff --git a/charts/kyverno/templates/configmap.yaml b/charts/kyverno/templates/configmap.yaml
index a99c877491..53e23a3e73 100644
--- a/charts/kyverno/templates/configmap.yaml
+++ b/charts/kyverno/templates/configmap.yaml
@@ -20,4 +20,7 @@ data:
   {{- if .Values.config.webhooks }}
   webhooks: {{ .Values.config.webhooks  | toJson | quote }}
   {{- end -}}
+  {{- if .Values.config.generateSuccessEvents }}
+  generateSuccessEvents: {{ .Values.config.generateSuccessEvents | quote }}
+  {{- end -}}
 {{- end -}}
diff --git a/charts/kyverno/values.yaml b/charts/kyverno/values.yaml
index 59d7a36f73..f757569f94 100644
--- a/charts/kyverno/values.yaml
+++ b/charts/kyverno/values.yaml
@@ -146,7 +146,7 @@ config:
   # will be forwarded to the webhookconfigurations.
   webhooks:
   # webhooks: [{"namespaceSelector":{"matchExpressions":[{"key":"environment","operator":"In","values":["prod"]}]}}]
-
+  generateSuccessEvents: 'false'
   # existingConfig: init-config
 
 service:
diff --git a/cmd/kyverno/main.go b/cmd/kyverno/main.go
index a99a2086f6..ffea52b583 100755
--- a/cmd/kyverno/main.go
+++ b/cmd/kyverno/main.go
@@ -179,6 +179,7 @@ func main() {
 	eventGenerator := event.NewEventGenerator(
 		client,
 		pInformer.Kyverno().V1().ClusterPolicies(),
+		pInformer.Kyverno().V1().Policies(),
 		rCache,
 		log.Log.WithName("EventGenerator"))
 
diff --git a/definitions/install.yaml b/definitions/install.yaml
index 2db2b534bf..e07737407e 100644
--- a/definitions/install.yaml
+++ b/definitions/install.yaml
@@ -3462,6 +3462,7 @@ subjects:
 apiVersion: v1
 data:
   excludeGroupRole: system:serviceaccounts:kube-system,system:nodes,system:kube-scheduler
+  generateSuccessEvents: "false"
   resourceFilters: '[Event,*,*][*,kube-system,*][*,kube-public,*][*,kube-node-lease,*][Node,*,*][APIService,*,*][TokenReview,*,*][SubjectAccessReview,*,*][SelfSubjectAccessReview,*,*][*,kyverno,*][Binding,*,*][ReplicaSet,*,*][ReportChangeRequest,*,*][ClusterReportChangeRequest,*,*][PolicyReport,*,*][ClusterPolicyReport,*,*]'
 kind: ConfigMap
 metadata:
diff --git a/definitions/install_debug.yaml b/definitions/install_debug.yaml
index ae0e315956..ca9d6832bb 100755
--- a/definitions/install_debug.yaml
+++ b/definitions/install_debug.yaml
@@ -3311,6 +3311,7 @@ subjects:
 apiVersion: v1
 data:
   excludeGroupRole: system:serviceaccounts:kube-system,system:nodes,system:kube-scheduler
+  generateSuccessEvents: "false"
   resourceFilters: '[Event,*,*][*,kube-system,*][*,kube-public,*][*,kube-node-lease,*][Node,*,*][APIService,*,*][TokenReview,*,*][SubjectAccessReview,*,*][SelfSubjectAccessReview,*,*][*,kyverno,*][Binding,*,*][ReplicaSet,*,*][ReportChangeRequest,*,*][ClusterReportChangeRequest,*,*][PolicyReport,*,*][ClusterPolicyReport,*,*]'
 kind: ConfigMap
 metadata:
diff --git a/definitions/k8s-resource/configmap.yaml b/definitions/k8s-resource/configmap.yaml
index 11f51b6229..5a8746b7c7 100755
--- a/definitions/k8s-resource/configmap.yaml
+++ b/definitions/k8s-resource/configmap.yaml
@@ -2,6 +2,7 @@ apiVersion: v1
 data:
   resourceFilters: '[Event,*,*][*,kube-system,*][*,kube-public,*][*,kube-node-lease,*][Node,*,*][APIService,*,*][TokenReview,*,*][SubjectAccessReview,*,*][SelfSubjectAccessReview,*,*][*,kyverno,*][Binding,*,*][ReplicaSet,*,*][ReportChangeRequest,*,*][ClusterReportChangeRequest,*,*][PolicyReport,*,*][ClusterPolicyReport,*,*]'
   excludeGroupRole: 'system:serviceaccounts:kube-system,system:nodes,system:kube-scheduler'
+  generateSuccessEvents: 'false'
 kind: ConfigMap
 metadata:
   labels:
diff --git a/go.mod b/go.mod
index 2eae61abb9..e33c291ee1 100644
--- a/go.mod
+++ b/go.mod
@@ -25,6 +25,7 @@ require (
 	github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a
 	github.com/mattn/go-runewidth v0.0.7 // indirect
 	github.com/minio/pkg v1.0.4
+	github.com/mitchellh/mapstructure v1.3.2 // indirect
 	github.com/onsi/ginkgo v1.14.1
 	github.com/onsi/gomega v1.10.2
 	github.com/opencontainers/go-digest v1.0.0 // indirect
diff --git a/go.sum b/go.sum
index ba68df1360..e0a75ddfa7 100644
--- a/go.sum
+++ b/go.sum
@@ -816,6 +816,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg=
+github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
 github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
diff --git a/pkg/config/dynamicconfig.go b/pkg/config/dynamicconfig.go
index 3aa5a16f14..c1acacafe2 100644
--- a/pkg/config/dynamicconfig.go
+++ b/pkg/config/dynamicconfig.go
@@ -5,6 +5,7 @@ import (
 	"os"
 	"reflect"
 	"regexp"
+	"strconv"
 	"strings"
 	"sync"
 
@@ -37,6 +38,7 @@ type ConfigData struct {
 	excludeUsername             []string
 	restrictDevelopmentUsername []string
 	webhooks                    []WebhookConfig
+	generateSuccessEvents       bool
 	cmSycned                    cache.InformerSynced
 	reconcilePolicyReport       chan<- bool
 	updateWebhookConfigurations chan<- bool
@@ -83,6 +85,13 @@ func (cd *ConfigData) GetExcludeUsername() []string {
 	return cd.excludeUsername
 }
 
+// GetGenerateSuccessEvents return if should generate success events
+func (cd *ConfigData) GetGenerateSuccessEvents() bool {
+	cd.mux.RLock()
+	defer cd.mux.RUnlock()
+	return cd.generateSuccessEvents
+}
+
 // FilterNamespaces filters exclude namespace
 func (cd *ConfigData) FilterNamespaces(namespaces []string) []string {
 	var results []string
@@ -110,6 +119,7 @@ type Interface interface {
 	ToFilter(kind, namespace, name string) bool
 	GetExcludeGroupRole() []string
 	GetExcludeUsername() []string
+	GetGenerateSuccessEvents() bool
 	RestrictDevelopmentUsername() []string
 	FilterNamespaces(namespaces []string) []string
 	GetWebhooks() []WebhookConfig
@@ -290,6 +300,23 @@ func (cd *ConfigData) load(cm v1.ConfigMap) (reconcilePolicyReport, updateWebhoo
 			updateWebhook = true
 		}
 	}
+
+	generateSuccessEvents, ok := cm.Data["generateSuccessEvents"]
+	if !ok {
+		logger.V(4).Info("configuration: No generateSuccessEvents defined in ConfigMap")
+	} else {
+		generateSuccessEvents, err := strconv.ParseBool(generateSuccessEvents)
+		if err != nil {
+			logger.V(4).Info("configuration: generateSuccessEvents must be either true/false")
+		} else if generateSuccessEvents == cd.generateSuccessEvents {
+			logger.V(4).Info("generateSuccessEvents did not change")
+		} else {
+			logger.V(2).Info("Updated generateSuccessEvents", "oldGenerateSuccessEvents", cd.generateSuccessEvents, "newGenerateSuccessEvents", generateSuccessEvents)
+			cd.generateSuccessEvents = generateSuccessEvents
+			reconcilePolicyReport = true
+		}
+	}
+
 	return
 }
 
@@ -333,6 +360,7 @@ func (cd *ConfigData) unload(cm v1.ConfigMap) {
 	cd.excludeGroupRole = []string{}
 	cd.excludeGroupRole = append(cd.excludeGroupRole, defaultExcludeGroupRole...)
 	cd.excludeUsername = []string{}
+	cd.generateSuccessEvents = false
 }
 
 type k8Resource struct {
diff --git a/pkg/engine/generation.go b/pkg/engine/generation.go
index 3e0487ac84..a8487170f6 100644
--- a/pkg/engine/generation.go
+++ b/pkg/engine/generation.go
@@ -25,7 +25,10 @@ func filterRules(policyContext *PolicyContext, startTime time.Time) *response.En
 	apiVersion := policyContext.NewResource.GetAPIVersion()
 	resp := &response.EngineResponse{
 		PolicyResponse: response.PolicyResponse{
-			Policy: policyContext.Policy.Name,
+			Policy: response.PolicySpec{
+				Name:      policyContext.Policy.GetName(),
+				Namespace: policyContext.Policy.GetNamespace(),
+			},
 			PolicyStats: response.PolicyStats{
 				PolicyExecutionTimestamp: startTime.Unix(),
 			},
diff --git a/pkg/engine/mutation.go b/pkg/engine/mutation.go
index 02a0a514fc..8d8c441196 100644
--- a/pkg/engine/mutation.go
+++ b/pkg/engine/mutation.go
@@ -134,7 +134,8 @@ func startMutateResultResponse(resp *response.EngineResponse, policy kyverno.Clu
 		return
 	}
 
-	resp.PolicyResponse.Policy = policy.Name
+	resp.PolicyResponse.Policy.Name = policy.GetName()
+	resp.PolicyResponse.Policy.Namespace = policy.GetNamespace()
 	resp.PolicyResponse.Resource.Name = resource.GetName()
 	resp.PolicyResponse.Resource.Namespace = resource.GetNamespace()
 	resp.PolicyResponse.Resource.Kind = resource.GetKind()
diff --git a/pkg/engine/response/response.go b/pkg/engine/response/response.go
index a14b4ac8f7..79a214b098 100644
--- a/pkg/engine/response/response.go
+++ b/pkg/engine/response/response.go
@@ -17,8 +17,8 @@ type EngineResponse struct {
 
 //PolicyResponse policy application response
 type PolicyResponse struct {
-	// policy name
-	Policy string `json:"policy"`
+	// policy details
+	Policy PolicySpec `json:"policy"`
 	// resource details
 	Resource ResourceSpec `json:"resource"`
 	// policy statistics
@@ -29,6 +29,12 @@ type PolicyResponse struct {
 	ValidationFailureAction string
 }
 
+//PolicySpec policy
+type PolicySpec struct {
+	Name      string `json:"name"`
+	Namespace string `json:"namespace"`
+}
+
 //ResourceSpec resource action applied on
 type ResourceSpec struct {
 	Kind       string `json:"kind"`
@@ -95,6 +101,16 @@ func (er EngineResponse) IsSuccessful() bool {
 	return true
 }
 
+//IsFailed checks if any rule has succeeded or not
+func (er EngineResponse) IsFailed() bool {
+	for _, r := range er.PolicyResponse.Rules {
+		if r.Success {
+			return false
+		}
+	}
+	return true
+}
+
 //GetPatches returns all the patches joined
 func (er EngineResponse) GetPatches() [][]byte {
 	var patches [][]byte
diff --git a/pkg/engine/validation.go b/pkg/engine/validation.go
index 7f4bd83df7..382dce3479 100644
--- a/pkg/engine/validation.go
+++ b/pkg/engine/validation.go
@@ -60,7 +60,8 @@ func buildResponse(logger logr.Logger, ctx *PolicyContext, resp *response.Engine
 		resp.PatchedResource = resource
 	}
 
-	resp.PolicyResponse.Policy = ctx.Policy.Name
+	resp.PolicyResponse.Policy.Name = ctx.Policy.GetName()
+	resp.PolicyResponse.Policy.Namespace = ctx.Policy.GetNamespace()
 	resp.PolicyResponse.Resource.Name = resp.PatchedResource.GetName()
 	resp.PolicyResponse.Resource.Namespace = resp.PatchedResource.GetNamespace()
 	resp.PolicyResponse.Resource.Kind = resp.PatchedResource.GetKind()
diff --git a/pkg/event/builder_test.go b/pkg/event/builder_test.go
index 17588ac77e..984e3387e2 100644
--- a/pkg/event/builder_test.go
+++ b/pkg/event/builder_test.go
@@ -11,7 +11,7 @@ func TestPositive(t *testing.T) {
 	resourceName := "test_resource"
 	ruleName := "test_rule"
 	expectedMsg := fmt.Sprintf("Rule(s) '%s' failed to apply on resource %s", ruleName, resourceName)
-	msg, err := getEventMsg(FPolicyApplyFailed, ruleName, resourceName)
+	msg, err := getEventMsg(FPolicyApply, ruleName, resourceName)
 	assert.NilError(t, err)
 	assert.Equal(t, expectedMsg, msg)
 }
@@ -19,6 +19,6 @@ func TestPositive(t *testing.T) {
 // passing incorrect args
 func TestIncorrectArgs(t *testing.T) {
 	resourceName := "test_resource"
-	_, err := getEventMsg(FPolicyApplyFailed, resourceName, "extra_args1", "extra_args2")
+	_, err := getEventMsg(FPolicyApply, resourceName, "extra_args1", "extra_args2")
 	assert.Error(t, err, "message expects 2 arguments, but 3 arguments passed")
 }
diff --git a/pkg/event/controller.go b/pkg/event/controller.go
index f10090b19b..7f09422f4f 100644
--- a/pkg/event/controller.go
+++ b/pkg/event/controller.go
@@ -26,8 +26,12 @@ import (
 type Generator struct {
 	client *client.Client
 	// list/get cluster policy
-	pLister kyvernolister.ClusterPolicyLister
+	cpLister kyvernolister.ClusterPolicyLister
 	// returns true if the cluster policy store has been synced at least once
+	cpSynced cache.InformerSynced
+	// list/get policy
+	pLister kyvernolister.PolicyLister
+	// returns true if the policy store has been synced at least once
 	pSynced cache.InformerSynced
 	// queue to store event generation requests
 	queue workqueue.RateLimitingInterface
@@ -47,13 +51,15 @@ type Interface interface {
 }
 
 //NewEventGenerator to generate a new event controller
-func NewEventGenerator(client *client.Client, pInformer kyvernoinformer.ClusterPolicyInformer, resCache resourcecache.ResourceCache, log logr.Logger) *Generator {
+func NewEventGenerator(client *client.Client, cpInformer kyvernoinformer.ClusterPolicyInformer, pInformer kyvernoinformer.PolicyInformer, resCache resourcecache.ResourceCache, log logr.Logger) *Generator {
 
 	gen := Generator{
 		client:               client,
+		cpLister:             cpInformer.Lister(),
+		cpSynced:             cpInformer.Informer().HasSynced,
 		pLister:              pInformer.Lister(),
-		queue:                workqueue.NewNamedRateLimitingQueue(rateLimiter(), eventWorkQueueName),
 		pSynced:              pInformer.Informer().HasSynced,
+		queue:                workqueue.NewNamedRateLimitingQueue(rateLimiter(), eventWorkQueueName),
 		policyCtrRecorder:    initRecorder(client, PolicyController, log),
 		admissionCtrRecorder: initRecorder(client, AdmissionController, log),
 		genPolicyRecorder:    initRecorder(client, GeneratePolicyController, log),
@@ -112,7 +118,7 @@ func (gen *Generator) Run(workers int, stopCh <-chan struct{}) {
 	logger.Info("start")
 	defer logger.Info("shutting down")
 
-	if !cache.WaitForCacheSync(stopCh, gen.pSynced) {
+	if !cache.WaitForCacheSync(stopCh, gen.cpSynced, gen.pSynced) {
 		logger.Info("failed to sync informer cache")
 	}
 
@@ -183,7 +189,13 @@ func (gen *Generator) syncHandler(key Info) error {
 	switch key.Kind {
 	case "ClusterPolicy":
 		//TODO: policy is clustered resource so wont need namespace
-		robj, err = gen.pLister.Get(key.Name)
+		robj, err = gen.cpLister.Get(key.Name)
+		if err != nil {
+			logger.Error(err, "failed to get cluster policy", "name", key.Name)
+			return err
+		}
+	case "Policy":
+		robj, err = gen.pLister.Policies(key.Namespace).Get(key.Name)
 		if err != nil {
 			logger.Error(err, "failed to get policy", "name", key.Name)
 			return err
@@ -200,6 +212,9 @@ func (gen *Generator) syncHandler(key Info) error {
 
 	// set the event type based on reason
 	eventType := v1.EventTypeWarning
+	if key.Reason == PolicyApplied.String() {
+		eventType = v1.EventTypeNormal
+	}
 
 	// based on the source of event generation, use different event recorders
 	switch key.Source {
diff --git a/pkg/event/msgbuilder.go b/pkg/event/msgbuilder.go
index 387e7d9fea..3e00c1396b 100644
--- a/pkg/event/msgbuilder.go
+++ b/pkg/event/msgbuilder.go
@@ -10,20 +10,16 @@ type MsgKey int
 
 //Message id for pre-defined messages
 const (
-	FPolicyApplyBlockCreate MsgKey = iota
-	FPolicyApplyBlockUpdate
-	FPolicyBlockResourceUpdate
-	FPolicyApplyFailed
-	FResourcePolicyFailed
+	FPolicyApply = iota
+	FResourcePolicyApply
+	SPolicyApply
 )
 
 func (k MsgKey) String() string {
 	return [...]string{
-		"Resource %s creation blocked by rule(s) %s",
-		"Rule(s) '%s' of policy '%s' blocked update of the resource",
-		"Resource %s update blocked by rule(s) %s",
 		"Rule(s) '%s' failed to apply on resource %s",
 		"Rule(s) '%s' of policy '%s' failed to apply on the resource",
+		"Rule(s) '%s' successfully applied on resource %s",
 	}[k]
 }
 
diff --git a/pkg/event/reason.go b/pkg/event/reason.go
index 1de55d07f3..8d286ad562 100644
--- a/pkg/event/reason.go
+++ b/pkg/event/reason.go
@@ -6,8 +6,8 @@ type Reason int
 const (
 	//PolicyViolation there is a violation of policy
 	PolicyViolation Reason = iota
-	//RequestBlocked the request to create/update the resource was blocked( generated from admission-controller)
-	RequestBlocked
+	//PolicyApplied policy applied
+	PolicyApplied
 	//PolicyFailed policy failed
 	PolicyFailed
 )
@@ -15,7 +15,7 @@ const (
 func (r Reason) String() string {
 	return [...]string{
 		"PolicyViolation",
-		"RequestBlocked",
+		"PolicyApplied",
 		"PolicyFailed",
 	}[r]
 }
diff --git a/pkg/generate/generate.go b/pkg/generate/generate.go
index 10e12635c9..b23e1884c9 100644
--- a/pkg/generate/generate.go
+++ b/pkg/generate/generate.go
@@ -152,7 +152,7 @@ func (c *Controller) applyGenerate(resource unstructured.Unstructured, gr kyvern
 		if !r.Success {
 			logger.V(4).Info("querying all generate requests")
 			selector := labels.SelectorFromSet(labels.Set(map[string]string{
-				"generate.kyverno.io/policy-name":        engineResponse.PolicyResponse.Policy,
+				"generate.kyverno.io/policy-name":        engineResponse.PolicyResponse.Policy.Name,
 				"generate.kyverno.io/resource-name":      engineResponse.PolicyResponse.Resource.Name,
 				"generate.kyverno.io/resource-kind":      engineResponse.PolicyResponse.Resource.Kind,
 				"generate.kyverno.io/resource-namespace": engineResponse.PolicyResponse.Resource.Namespace,
diff --git a/pkg/generate/report.go b/pkg/generate/report.go
index e8cb177ce2..a536f4e503 100644
--- a/pkg/generate/report.go
+++ b/pkg/generate/report.go
@@ -9,7 +9,6 @@ import (
 )
 
 func failedEvents(err error, gr kyverno.GenerateRequest, resource unstructured.Unstructured) []event.Info {
-
 	re := event.Info{}
 	re.Kind = resource.GetKind()
 	re.Namespace = resource.GetNamespace()
diff --git a/pkg/kyverno/apply/report_test.go b/pkg/kyverno/apply/report_test.go
index 75054fc903..5424897edc 100644
--- a/pkg/kyverno/apply/report_test.go
+++ b/pkg/kyverno/apply/report_test.go
@@ -26,7 +26,7 @@ var engineResponses = []*response.EngineResponse{
 			},
 		},
 		PolicyResponse: response.PolicyResponse{
-			Policy:   "policy1",
+			Policy:   response.PolicySpec{Name: "policy1"},
 			Resource: response.ResourceSpec{Name: "policy1-pod"},
 			Rules: []response.RuleResponse{
 				{
@@ -52,7 +52,7 @@ var engineResponses = []*response.EngineResponse{
 			},
 		},
 		PolicyResponse: response.PolicyResponse{
-			Policy:   "clusterpolicy2",
+			Policy:   response.PolicySpec{Name: "clusterpolicy2"},
 			Resource: response.ResourceSpec{Name: "policy2-clusterrole"},
 			Rules: []response.RuleResponse{
 				{
diff --git a/pkg/kyverno/test/command.go b/pkg/kyverno/test/command.go
index 2f35ce9b61..f08f8cf437 100644
--- a/pkg/kyverno/test/command.go
+++ b/pkg/kyverno/test/command.go
@@ -225,7 +225,7 @@ func buildPolicyResults(resps []*response.EngineResponse, testResults []TestResu
 	results := make(map[string]report.PolicyReportResult)
 	infos := policyreport.GeneratePRsFromEngineResponse(resps, log.Log)
 	for _, resp := range resps {
-		policyName := resp.PolicyResponse.Policy
+		policyName := resp.PolicyResponse.Policy.Name
 		resourceName := resp.PolicyResponse.Resource.Name
 		var rules []string
 		for _, rule := range resp.PolicyResponse.Rules {
diff --git a/pkg/policy/existing.go b/pkg/policy/existing.go
index 4b601b2f07..8d545c6a5c 100644
--- a/pkg/policy/existing.go
+++ b/pkg/policy/existing.go
@@ -95,7 +95,7 @@ func (pc *PolicyController) applyAndReportPerNamespace(policy *kyverno.ClusterPo
 		*metricAlreadyRegistered = true
 	}
 
-	pc.report(policy.Name, engineResponses, logger)
+	pc.report(engineResponses, logger)
 }
 
 func (pc *PolicyController) registerPolicyRuleResultsMetricValidationBS(logger logr.Logger, policy kyverno.ClusterPolicy, engineResponse response.EngineResponse, backgroundScanTimestamp int64) {
diff --git a/pkg/policy/report.go b/pkg/policy/report.go
index 5187f2b9ac..eb498d9edd 100644
--- a/pkg/policy/report.go
+++ b/pkg/policy/report.go
@@ -17,10 +17,15 @@ import (
 	"k8s.io/apimachinery/pkg/labels"
 )
 
-func (pc *PolicyController) report(policy string, engineResponses []*response.EngineResponse, logger logr.Logger) {
-	eventInfos := generateEvents(logger, engineResponses)
+func (pc *PolicyController) report(engineResponses []*response.EngineResponse, logger logr.Logger) {
+	eventInfos := generateFailEvents(logger, engineResponses)
 	pc.eventGen.Add(eventInfos...)
 
+	if pc.configHandler.GetGenerateSuccessEvents() {
+		successEventInfos := generateSuccessEvents(logger, engineResponses)
+		pc.eventGen.Add(successEventInfos...)
+	}
+
 	pvInfos := policyreport.GeneratePRsFromEngineResponse(engineResponses, logger)
 
 	// as engineResponses holds the results for all matched resources in one namespace
@@ -131,22 +136,43 @@ func (pc *PolicyController) requeuePolicies() {
 	}
 }
 
-func generateEvents(log logr.Logger, ers []*response.EngineResponse) []event.Info {
-	var eventInfos []event.Info
+func generateSuccessEvents(log logr.Logger, ers []*response.EngineResponse) (eventInfos []event.Info) {
 	for _, er := range ers {
-		if er.IsSuccessful() {
-			continue
+		logger := log.WithValues("policy", er.PolicyResponse.Policy, "kind", er.PolicyResponse.Resource.Kind, "namespace", er.PolicyResponse.Resource.Namespace, "name", er.PolicyResponse.Resource.Name)
+		logger.V(4).Info("reporting success results for policy")
+
+		if !er.IsFailed() {
+			// generate event on policy for success rules
+			logger.V(4).Info("generating event on policy for success rules")
+			e := event.Info{}
+			kind := "ClusterPolicy"
+			if er.PolicyResponse.Policy.Namespace != "" {
+				kind = "Policy"
+			}
+			e.Kind = kind
+			e.Namespace = er.PolicyResponse.Policy.Namespace
+			e.Name = er.PolicyResponse.Policy.Name
+			e.Reason = event.PolicyApplied.String()
+			e.Source = event.PolicyController
+			e.Message = fmt.Sprintf("rules '%v' successfully applied on resource '%s/%s/%s'", er.GetSuccessRules(), er.PolicyResponse.Resource.Kind, er.PolicyResponse.Resource.Namespace, er.PolicyResponse.Resource.Name)
+			eventInfos = append(eventInfos, e)
 		}
-		eventInfos = append(eventInfos, generateEventsPerEr(log, er)...)
 	}
 	return eventInfos
 }
 
-func generateEventsPerEr(log logr.Logger, er *response.EngineResponse) []event.Info {
+func generateFailEvents(log logr.Logger, ers []*response.EngineResponse) (eventInfos []event.Info) {
+	for _, er := range ers {
+		eventInfos = append(eventInfos, generateFailEventsPerEr(log, er)...)
+	}
+	return eventInfos
+}
+
+func generateFailEventsPerEr(log logr.Logger, er *response.EngineResponse) []event.Info {
 	var eventInfos []event.Info
 
-	logger := log.WithValues("policy", er.PolicyResponse.Policy, "kind", er.PolicyResponse.Resource.Kind, "namespace", er.PolicyResponse.Resource.Namespace, "name", er.PolicyResponse.Resource.Name)
-	logger.V(4).Info("reporting results for policy")
+	logger := log.WithValues("policy", er.PolicyResponse.Policy.Name, "kind", er.PolicyResponse.Resource.Kind, "namespace", er.PolicyResponse.Resource.Namespace, "name", er.PolicyResponse.Resource.Name)
+	logger.V(4).Info("reporting fail results for policy")
 
 	for _, rule := range er.PolicyResponse.Rules {
 		if rule.Success {
@@ -160,10 +186,43 @@ func generateEventsPerEr(log logr.Logger, er *response.EngineResponse) []event.I
 		e.Name = er.PolicyResponse.Resource.Name
 		e.Reason = event.PolicyViolation.String()
 		e.Source = event.PolicyController
-		e.Message = fmt.Sprintf("policy '%s' (%s) rule '%s' failed. %v", er.PolicyResponse.Policy, rule.Type, rule.Name, rule.Message)
+		e.Message = fmt.Sprintf("policy '%s' (%s) rule '%s' failed. %v", er.PolicyResponse.Policy.Name, rule.Type, rule.Name, rule.Message)
 		eventInfos = append(eventInfos, e)
 	}
 
+	if !er.IsFailed() {
+		// generate event on policy for success rules
+		logger.V(4).Info("generating event on policy for success rules")
+		e := event.Info{}
+		kind := "ClusterPolicy"
+		if er.PolicyResponse.Policy.Namespace != "" {
+			kind = "Policy"
+		}
+		e.Kind = kind
+		e.Namespace = er.PolicyResponse.Policy.Namespace
+		e.Name = er.PolicyResponse.Policy.Name
+		e.Reason = event.PolicyApplied.String()
+		e.Source = event.PolicyController
+		e.Message = fmt.Sprintf("rules '%v' successfully applied on resource '%s/%s/%s'", er.GetSuccessRules(), er.PolicyResponse.Resource.Kind, er.PolicyResponse.Resource.Namespace, er.PolicyResponse.Resource.Name)
+		eventInfos = append(eventInfos, e)
+	}
+
+	if !er.IsSuccessful() {
+		// generate event on policy for failed rules
+		logger.V(4).Info("generating event on policy")
+		e := event.Info{}
+		kind := "ClusterPolicy"
+		if er.PolicyResponse.Policy.Namespace != "" {
+			kind = "Policy"
+		}
+		e.Kind = kind
+		e.Name = er.PolicyResponse.Policy.Name
+		e.Namespace = er.PolicyResponse.Policy.Namespace
+		e.Reason = event.PolicyViolation.String()
+		e.Source = event.PolicyController
+		e.Message = fmt.Sprintf("rules '%v' not satisfied on resource '%s/%s/%s'", er.GetFailedRules(), er.PolicyResponse.Resource.Kind, er.PolicyResponse.Resource.Namespace, er.PolicyResponse.Resource.Name)
+		eventInfos = append(eventInfos, e)
+	}
 	return eventInfos
 }
 
diff --git a/pkg/policyreport/builder.go b/pkg/policyreport/builder.go
index c277f35a4e..d447db7ca0 100755
--- a/pkg/policyreport/builder.go
+++ b/pkg/policyreport/builder.go
@@ -230,7 +230,7 @@ func calculateSummary(results []*report.PolicyReportResult) (summary report.Poli
 
 func buildPVInfo(er *response.EngineResponse) Info {
 	info := Info{
-		PolicyName: er.PolicyResponse.Policy,
+		PolicyName: er.PolicyResponse.Policy.Name,
 		Namespace:  er.PatchedResource.GetNamespace(),
 		Results: []EngineResponseResult{
 			{
diff --git a/pkg/testrunner/scenario.go b/pkg/testrunner/scenario.go
index c7092c95c4..cd43347aae 100644
--- a/pkg/testrunner/scenario.go
+++ b/pkg/testrunner/scenario.go
@@ -235,10 +235,8 @@ func validateResponse(t *testing.T, er response.PolicyResponse, expected respons
 	// cant do deepEquals and the stats will be different, or we nil those fields and then do a comparison
 	// forcing only the fields that are specified to be comprared
 	// doing a field by fields comparison will allow us to provied more details logs and granular error reporting
-	// check policy name is same :P
-	if er.Policy != expected.Policy {
-		t.Errorf("Policy name: expected %s, received %s", expected.Policy, er.Policy)
-	}
+	// compare policy spec
+	comparePolicySpec(t, er.Policy, expected.Policy)
 	// compare resource spec
 	compareResourceSpec(t, er.Resource, expected.Resource)
 	// //TODO stats
@@ -260,6 +258,17 @@ func validateResponse(t *testing.T, er response.PolicyResponse, expected respons
 	}
 }
 
+func comparePolicySpec(t *testing.T, policy response.PolicySpec, expectedPolicy response.PolicySpec) {
+	// namespace
+	if policy.Namespace != expectedPolicy.Namespace {
+		t.Errorf("namespace: expected %s, received %s", expectedPolicy.Namespace, policy.Namespace)
+	}
+	// name
+	if policy.Name != expectedPolicy.Name {
+		t.Errorf("name: expected %s, received %s", expectedPolicy.Name, policy.Name)
+	}
+}
+
 func compareResourceSpec(t *testing.T, resource response.ResourceSpec, expectedResource response.ResourceSpec) {
 	// kind
 	if resource.Kind != expectedResource.Kind {
diff --git a/pkg/webhooks/annotations.go b/pkg/webhooks/annotations.go
index ced296bc57..cca62f31b6 100644
--- a/pkg/webhooks/annotations.go
+++ b/pkg/webhooks/annotations.go
@@ -97,7 +97,7 @@ func annotationFromEngineResponses(engineResponses []*response.EngineResponse, l
 	var annotationContent = make(map[string]string)
 	for _, engineResponse := range engineResponses {
 		if !engineResponse.IsSuccessful() {
-			log.V(3).Info("skip building annotation; policy failed to apply", "policy", engineResponse.PolicyResponse.Policy)
+			log.V(3).Info("skip building annotation; policy failed to apply", "policy", engineResponse.PolicyResponse.Policy.Name)
 			continue
 		}
 
@@ -106,7 +106,7 @@ func annotationFromEngineResponses(engineResponses []*response.EngineResponse, l
 			continue
 		}
 
-		policyName := engineResponse.PolicyResponse.Policy
+		policyName := engineResponse.PolicyResponse.Policy.Name
 		for _, rulePatch := range rulePatches {
 			annotationContent[rulePatch.RuleName+"."+policyName+".kyverno.io"] = operationToPastTense[rulePatch.Op] + " " + rulePatch.Path
 		}
diff --git a/pkg/webhooks/annotations_test.go b/pkg/webhooks/annotations_test.go
index a341df5e38..bea97d8f10 100644
--- a/pkg/webhooks/annotations_test.go
+++ b/pkg/webhooks/annotations_test.go
@@ -16,7 +16,7 @@ func newPolicyResponse(policy, rule string, patchesStr []string, success bool) r
 	}
 
 	return response.PolicyResponse{
-		Policy: policy,
+		Policy: response.PolicySpec{Name: policy},
 		Rules: []response.RuleResponse{
 			{
 				Name:    rule,
diff --git a/pkg/webhooks/common.go b/pkg/webhooks/common.go
index 3610ee6844..d7eb8f8a91 100644
--- a/pkg/webhooks/common.go
+++ b/pkg/webhooks/common.go
@@ -30,7 +30,7 @@ func isResponseSuccessful(engineReponses []*response.EngineResponse) bool {
 func toBlockResource(engineReponses []*response.EngineResponse, log logr.Logger) bool {
 	for _, er := range engineReponses {
 		if !er.IsSuccessful() && er.PolicyResponse.ValidationFailureAction == common.Enforce {
-			log.Info("spec.ValidationFailureAction set to enforce blocking resource request", "policy", er.PolicyResponse.Policy)
+			log.Info("spec.ValidationFailureAction set to enforce blocking resource request", "policy", er.PolicyResponse.Policy.Name)
 			return true
 		}
 	}
@@ -52,7 +52,7 @@ func getEnforceFailureErrorMsg(engineResponses []*response.EngineResponse) strin
 			}
 			resourceName = fmt.Sprintf("%s/%s/%s", er.PolicyResponse.Resource.Kind, er.PolicyResponse.Resource.Namespace, er.PolicyResponse.Resource.Name)
 
-			policyToRule[er.PolicyResponse.Policy] = ruleToReason
+			policyToRule[er.PolicyResponse.Policy.Name] = ruleToReason
 		}
 	}
 
@@ -69,7 +69,7 @@ func getErrorMsg(engineReponses []*response.EngineResponse) string {
 		if !er.IsSuccessful() {
 			// resource in engineReponses is identical as this was called per admission request
 			resourceInfo = fmt.Sprintf("%s/%s/%s", er.PolicyResponse.Resource.Kind, er.PolicyResponse.Resource.Namespace, er.PolicyResponse.Resource.Name)
-			str = append(str, fmt.Sprintf("failed policy %s:", er.PolicyResponse.Policy))
+			str = append(str, fmt.Sprintf("failed policy %s:", er.PolicyResponse.Policy.Name))
 			for _, rule := range er.PolicyResponse.Rules {
 				if !rule.Success {
 					str = append(str, rule.ToString())
diff --git a/pkg/webhooks/generation.go b/pkg/webhooks/generation.go
index 4931dafb5c..2756b7740e 100644
--- a/pkg/webhooks/generation.go
+++ b/pkg/webhooks/generation.go
@@ -366,7 +366,7 @@ func (ws *WebhookServer) handleDelete(request *v1beta1.AdmissionRequest) {
 func (ws *WebhookServer) deleteGR(logger logr.Logger, engineResponse *response.EngineResponse) {
 	logger.V(4).Info("querying all generate requests")
 	selector := labels.SelectorFromSet(labels.Set(map[string]string{
-		"generate.kyverno.io/policy-name":        engineResponse.PolicyResponse.Policy,
+		"generate.kyverno.io/policy-name":        engineResponse.PolicyResponse.Policy.Name,
 		"generate.kyverno.io/resource-name":      engineResponse.PolicyResponse.Resource.Name,
 		"generate.kyverno.io/resource-kind":      engineResponse.PolicyResponse.Resource.Kind,
 		"generate.kyverno.io/resource-namespace": engineResponse.PolicyResponse.Resource.Namespace,
@@ -401,7 +401,7 @@ func applyGenerateRequest(gnGenerator generate.GenerateRequests, userRequestInfo
 
 func transform(userRequestInfo kyverno.RequestInfo, er *response.EngineResponse) kyverno.GenerateRequestSpec {
 	gr := kyverno.GenerateRequestSpec{
-		Policy: er.PolicyResponse.Policy,
+		Policy: er.PolicyResponse.Policy.Name,
 		Resource: kyverno.ResourceSpec{
 			Kind:       er.PolicyResponse.Resource.Kind,
 			Namespace:  er.PolicyResponse.Resource.Namespace,
@@ -421,7 +421,7 @@ type generateStats struct {
 }
 
 func (gs generateStats) PolicyName() string {
-	return gs.resp.PolicyResponse.Policy
+	return gs.resp.PolicyResponse.Policy.Name
 }
 
 func (gs generateStats) UpdateStatus(status kyverno.PolicyStatus) kyverno.PolicyStatus {
diff --git a/pkg/webhooks/mutation.go b/pkg/webhooks/mutation.go
index 5483b05a22..42c7e9139e 100644
--- a/pkg/webhooks/mutation.go
+++ b/pkg/webhooks/mutation.go
@@ -180,9 +180,9 @@ type mutateStats struct {
 
 func (ms mutateStats) PolicyName() string {
 	if ms.namespace == "" {
-		return ms.resp.PolicyResponse.Policy
+		return ms.resp.PolicyResponse.Policy.Name
 	}
-	return ms.namespace + "/" + ms.resp.PolicyResponse.Policy
+	return ms.namespace + "/" + ms.resp.PolicyResponse.Policy.Name
 }
 
 func (ms mutateStats) UpdateStatus(status kyverno.PolicyStatus) kyverno.PolicyStatus {
diff --git a/pkg/webhooks/policyStatus_test.go b/pkg/webhooks/policyStatus_test.go
index aba56b2c42..fb4d801d4b 100644
--- a/pkg/webhooks/policyStatus_test.go
+++ b/pkg/webhooks/policyStatus_test.go
@@ -19,7 +19,7 @@ func Test_GenerateStats(t *testing.T) {
 		generateStats: []*response.EngineResponse{
 			{
 				PolicyResponse: response.PolicyResponse{
-					Policy: "policy1",
+					Policy: response.PolicySpec{Name: "policy1"},
 					Rules: []response.RuleResponse{
 						{
 							Name:    "rule5",
@@ -40,7 +40,7 @@ func Test_GenerateStats(t *testing.T) {
 			},
 			{
 				PolicyResponse: response.PolicyResponse{
-					Policy: "policy2",
+					Policy: response.PolicySpec{Name: "policy2"},
 					Rules: []response.RuleResponse{
 						{
 							Name:    "rule5",
@@ -86,7 +86,7 @@ func Test_MutateStats(t *testing.T) {
 		mutateStats: []*response.EngineResponse{
 			{
 				PolicyResponse: response.PolicyResponse{
-					Policy: "policy1",
+					Policy: response.PolicySpec{Name: "policy1"},
 					Rules: []response.RuleResponse{
 						{
 							Name:    "rule1",
@@ -107,7 +107,7 @@ func Test_MutateStats(t *testing.T) {
 			},
 			{
 				PolicyResponse: response.PolicyResponse{
-					Policy: "policy2",
+					Policy: response.PolicySpec{Name: "policy2"},
 					Rules: []response.RuleResponse{
 						{
 							Name:    "rule1",
@@ -152,7 +152,7 @@ func Test_ValidateStats(t *testing.T) {
 		validateStats: []*response.EngineResponse{
 			{
 				PolicyResponse: response.PolicyResponse{
-					Policy:                  "policy1",
+					Policy:                  response.PolicySpec{Name: "policy1"},
 					ValidationFailureAction: "enforce",
 					Rules: []response.RuleResponse{
 						{
@@ -174,7 +174,7 @@ func Test_ValidateStats(t *testing.T) {
 			},
 			{
 				PolicyResponse: response.PolicyResponse{
-					Policy: "policy2",
+					Policy: response.PolicySpec{Name: "policy2"},
 					Rules: []response.RuleResponse{
 						{
 							Name:    "rule3",
diff --git a/pkg/webhooks/report.go b/pkg/webhooks/report.go
index fd82f118ee..508f29827c 100644
--- a/pkg/webhooks/report.go
+++ b/pkg/webhooks/report.go
@@ -1,10 +1,10 @@
 package webhooks
 
 import (
-	"strings"
-
 	"github.com/go-logr/logr"
+	kyvernov1alpha1 "github.com/kyverno/kyverno/pkg/api/kyverno/v1alpha1"
 	"github.com/kyverno/kyverno/pkg/engine/response"
+	"strings"
 
 	"github.com/kyverno/kyverno/pkg/event"
 )
@@ -15,33 +15,75 @@ func generateEvents(engineResponses []*response.EngineResponse, blocked, onUpdat
 
 	// - Admission-Response is SUCCESS
 	//   - Some/All policies failed (policy violations generated)
-	//     - report event on resource that failed
+	//     - report failure event on policy
+	//     - report failure event on resource
+	//   - Some/All policies succeeded
+	//     - report success event on policy
+	//     - report success event on resource
 
 	for _, er := range engineResponses {
-		if er.IsSuccessful() {
-			// do not create event on rules that were successful
-			continue
+		if !er.IsSuccessful() {
+			// Rules that failed
+			failedRules := er.GetFailedRules()
+			failedRulesStr := strings.Join(failedRules, ";")
+
+			// Event on the policy
+			kind := "ClusterPolicy"
+			if er.PolicyResponse.Policy.Namespace != "" {
+				kind = "Policy"
+			}
+			pe := event.NewEvent(
+				log,
+				kind,
+				kyvernov1alpha1.SchemeGroupVersion.String(),
+				er.PolicyResponse.Policy.Namespace,
+				er.PolicyResponse.Policy.Name,
+				event.PolicyViolation.String(),
+				event.AdmissionController,
+				event.FPolicyApply,
+				failedRulesStr,
+				er.PolicyResponse.Resource.GetKey(),
+			)
+
+			// Event on the resource
+			re := event.NewEvent(
+				log,
+				er.PolicyResponse.Resource.Kind,
+				er.PolicyResponse.Resource.APIVersion,
+				er.PolicyResponse.Resource.Namespace,
+				er.PolicyResponse.Resource.Name,
+				event.PolicyViolation.String(),
+				event.AdmissionController,
+				event.FResourcePolicyApply,
+				failedRulesStr,
+				er.PolicyResponse.Policy.Name,
+			)
+			events = append(events, pe, re)
 		}
-		// Rules that failed
-		failedRules := er.GetFailedRules()
-		filedRulesStr := strings.Join(failedRules, ";")
 
-		// Event on the resource
-		// event on resource
-		e := event.NewEvent(
-			log,
-			er.PolicyResponse.Resource.Kind,
-			er.PolicyResponse.Resource.APIVersion,
-			er.PolicyResponse.Resource.Namespace,
-			er.PolicyResponse.Resource.Name,
-			event.PolicyViolation.String(),
-			event.AdmissionController,
-			event.FResourcePolicyFailed,
-			filedRulesStr,
-			er.PolicyResponse.Policy,
-		)
-		events = append(events, e)
+		if !er.IsFailed() {
+			successRules := er.GetSuccessRules()
+			successRulesStr := strings.Join(successRules, ";")
+
+			// Event on the policy
+			kind := "ClusterPolicy"
+			if er.PolicyResponse.Policy.Namespace != "" {
+				kind = "Policy"
+			}
+			e := event.NewEvent(
+				log,
+				kind,
+				kyvernov1alpha1.SchemeGroupVersion.String(),
+				er.PolicyResponse.Policy.Namespace,
+				er.PolicyResponse.Policy.Name,
+				event.PolicyApplied.String(),
+				event.AdmissionController,
+				event.SPolicyApply,
+				successRulesStr,
+				er.PolicyResponse.Resource.GetKey(),
+			)
+			events = append(events, e)
+		}
 	}
-
 	return events
 }
diff --git a/pkg/webhooks/validation.go b/pkg/webhooks/validation.go
index 902b3deeda..3f2d1441d0 100644
--- a/pkg/webhooks/validation.go
+++ b/pkg/webhooks/validation.go
@@ -218,9 +218,9 @@ type validateStats struct {
 
 func (vs validateStats) PolicyName() string {
 	if vs.namespace == "" {
-		return vs.resp.PolicyResponse.Policy
+		return vs.resp.PolicyResponse.Policy.Name
 	}
-	return vs.namespace + "/" + vs.resp.PolicyResponse.Policy
+	return vs.namespace + "/" + vs.resp.PolicyResponse.Policy.Name
 
 }
 
diff --git a/test/scenarios/other/scenario_mutate_endpoint.yaml b/test/scenarios/other/scenario_mutate_endpoint.yaml
index 381e5fb5fc..6b56e2f821 100644
--- a/test/scenarios/other/scenario_mutate_endpoint.yaml
+++ b/test/scenarios/other/scenario_mutate_endpoint.yaml
@@ -6,7 +6,9 @@ expected:
   mutation:
     patchedresource: test/output/output_mutate_endpoint.yaml
     policyresponse:
-      policy: policy-endpoints
+      policy:
+        namespace: ''
+        name: policy-endpoints
       resource:
         kind: Endpoints
         apiVersion: v1
diff --git a/test/scenarios/other/scenario_mutate_pod_spec.yaml b/test/scenarios/other/scenario_mutate_pod_spec.yaml
index 33d157b394..10a662edb2 100644
--- a/test/scenarios/other/scenario_mutate_pod_spec.yaml
+++ b/test/scenarios/other/scenario_mutate_pod_spec.yaml
@@ -6,7 +6,8 @@ expected:
   mutation:
     patchedresource: test/output/output_mutate_pod_spec.yaml
     policyresponse:
-      policy: mutate-pods-spec
+      policy:
+        name: mutate-pods-spec
       resource:
         kind: Deployment
         apiVersion: apps/v1
diff --git a/test/scenarios/other/scenario_mutate_validate_qos.yaml b/test/scenarios/other/scenario_mutate_validate_qos.yaml
index 83b7723626..a061ee4560 100644
--- a/test/scenarios/other/scenario_mutate_validate_qos.yaml
+++ b/test/scenarios/other/scenario_mutate_validate_qos.yaml
@@ -6,7 +6,9 @@ expected:
   mutation:
     patchedresource: test/output/output_mutate_validate_qos.yaml
     policyresponse:
-      policy: policy-qos
+      policy:
+        namespace: ''
+        name: policy-qos
       resource:
         kind: Deployment
         apiVersion: apps/v1
@@ -19,7 +21,9 @@ expected:
           message: successfully processed strategic merge patch
   validation:
     policyresponse:
-      policy: policy-qos
+      policy:
+        namespace: ''
+        name: policy-qos
       resource:
         kind: Deployment
         apiVersion: apps/v1
diff --git a/test/scenarios/other/scenario_validate_default_proc_mount.yaml b/test/scenarios/other/scenario_validate_default_proc_mount.yaml
index 90828ac310..8d506c7494 100644
--- a/test/scenarios/other/scenario_validate_default_proc_mount.yaml
+++ b/test/scenarios/other/scenario_validate_default_proc_mount.yaml
@@ -6,7 +6,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: validate-default-proc-mount
+      policy:
+        namespace: ''
+        name: validate-default-proc-mount
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/other/scenario_validate_disallow_default_serviceaccount.yaml b/test/scenarios/other/scenario_validate_disallow_default_serviceaccount.yaml
index 93baed821f..686d414840 100644
--- a/test/scenarios/other/scenario_validate_disallow_default_serviceaccount.yaml
+++ b/test/scenarios/other/scenario_validate_disallow_default_serviceaccount.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: validate-disallow-default-serviceaccount
+      policy:
+        namespace: ''
+        name: validate-disallow-default-serviceaccount
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/other/scenario_validate_healthChecks.yaml b/test/scenarios/other/scenario_validate_healthChecks.yaml
index 36d618e76e..6c802ba7d3 100644
--- a/test/scenarios/other/scenario_validate_healthChecks.yaml
+++ b/test/scenarios/other/scenario_validate_healthChecks.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: check-probe-exists
+      policy:
+        namespace: ''
+        name: check-probe-exists
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/other/scenario_validate_selinux_context.yaml b/test/scenarios/other/scenario_validate_selinux_context.yaml
index e6b8f75000..302b01f175 100644
--- a/test/scenarios/other/scenario_validate_selinux_context.yaml
+++ b/test/scenarios/other/scenario_validate_selinux_context.yaml
@@ -6,7 +6,8 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: validate-selinux-options
+      policy:
+        name: validate-selinux-options
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/other/scenario_validate_volume_whiltelist.yaml b/test/scenarios/other/scenario_validate_volume_whiltelist.yaml
index 0e5a62f8fd..c7503fe1fa 100644
--- a/test/scenarios/other/scenario_validate_volume_whiltelist.yaml
+++ b/test/scenarios/other/scenario_validate_volume_whiltelist.yaml
@@ -6,7 +6,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: validate-volumes-whitelist
+      policy:
+        namespace: ''
+        name: validate-volumes-whitelist
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/add_networkPolicy.yaml b/test/scenarios/samples/best_practices/add_networkPolicy.yaml
index 0e20ccdb68..6825c6a414 100644
--- a/test/scenarios/samples/best_practices/add_networkPolicy.yaml
+++ b/test/scenarios/samples/best_practices/add_networkPolicy.yaml
@@ -9,7 +9,9 @@ expected:
         kind: NetworkPolicy
         namespace: devtest
     policyresponse:
-      policy: add-networkpolicy
+      policy:
+        namespace: ''
+        name: add-networkpolicy
       resource:
         kind: Namespace
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/add_ns_quota.yaml b/test/scenarios/samples/best_practices/add_ns_quota.yaml
index 7eb0442ab7..9d179aabb3 100644
--- a/test/scenarios/samples/best_practices/add_ns_quota.yaml
+++ b/test/scenarios/samples/best_practices/add_ns_quota.yaml
@@ -9,7 +9,9 @@ expected:
         kind: ResourceQuota
         namespace: test-namespace-quota
     policyresponse:
-      policy: add-ns-quota
+      policy:
+        namespace: ''
+        name: add-ns-quota
       resource:
         kind: Namespace
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/add_safe_to_evict.yaml b/test/scenarios/samples/best_practices/add_safe_to_evict.yaml
index c45c09f2db..30f3429ca9 100644
--- a/test/scenarios/samples/best_practices/add_safe_to_evict.yaml
+++ b/test/scenarios/samples/best_practices/add_safe_to_evict.yaml
@@ -6,7 +6,9 @@ expected:
   mutation:
     patchedresource: test/output/pod-with-emptydir.yaml
     policyresponse:
-      policy: add-safe-to-evict
+      policy:
+        namespace: ''
+        name: add-safe-to-evict
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/add_safe_to_evict2.yaml b/test/scenarios/samples/best_practices/add_safe_to_evict2.yaml
index b99202ce58..4bd9ebb28d 100644
--- a/test/scenarios/samples/best_practices/add_safe_to_evict2.yaml
+++ b/test/scenarios/samples/best_practices/add_safe_to_evict2.yaml
@@ -6,7 +6,9 @@ expected:
   mutation:
     patchedresource: test/output/pod-with-hostpath.yaml
     policyresponse:
-      policy: add-safe-to-evict
+      policy:
+        namespace: ''
+        name: add-safe-to-evict
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/add_safe_to_evict3.yaml b/test/scenarios/samples/best_practices/add_safe_to_evict3.yaml
index 49aa001830..16f09c257e 100644
--- a/test/scenarios/samples/best_practices/add_safe_to_evict3.yaml
+++ b/test/scenarios/samples/best_practices/add_safe_to_evict3.yaml
@@ -6,7 +6,9 @@ expected:
   mutation:
     patchedresource: test/resources/pod-with-default-volume.yaml
     policyresponse:
-      policy: add-safe-to-evict
+      policy:
+        namespace: ''
+        name: add-safe-to-evict
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/disallow_bind_mounts_fail.yaml b/test/scenarios/samples/best_practices/disallow_bind_mounts_fail.yaml
index f48fb3ccd8..02ab854227 100644
--- a/test/scenarios/samples/best_practices/disallow_bind_mounts_fail.yaml
+++ b/test/scenarios/samples/best_practices/disallow_bind_mounts_fail.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: disallow-bind-mounts
+      policy:
+        namespace: ''
+        name: disallow-bind-mounts
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/disallow_bind_mounts_pass.yaml b/test/scenarios/samples/best_practices/disallow_bind_mounts_pass.yaml
index 0af786ece8..35ebbf6fd0 100644
--- a/test/scenarios/samples/best_practices/disallow_bind_mounts_pass.yaml
+++ b/test/scenarios/samples/best_practices/disallow_bind_mounts_pass.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: disallow-bind-mounts
+      policy:
+        namespace: ''
+        name: disallow-bind-mounts
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/disallow_host_network_port.yaml b/test/scenarios/samples/best_practices/disallow_host_network_port.yaml
index 8888a83a5c..757996ec10 100644
--- a/test/scenarios/samples/best_practices/disallow_host_network_port.yaml
+++ b/test/scenarios/samples/best_practices/disallow_host_network_port.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: disallow-host-network-port
+      policy:
+        namespace: ''
+        name: disallow-host-network-port
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/disallow_host_pid_ipc.yaml b/test/scenarios/samples/best_practices/disallow_host_pid_ipc.yaml
index 410ffaddac..60d224b44c 100644
--- a/test/scenarios/samples/best_practices/disallow_host_pid_ipc.yaml
+++ b/test/scenarios/samples/best_practices/disallow_host_pid_ipc.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: disallow-host-pid-ipc
+      policy:
+        namespace: ''
+        name: disallow-host-pid-ipc
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/disallow_priviledged.yaml b/test/scenarios/samples/best_practices/disallow_priviledged.yaml
index 64dad33ad5..42891aca3d 100644
--- a/test/scenarios/samples/best_practices/disallow_priviledged.yaml
+++ b/test/scenarios/samples/best_practices/disallow_priviledged.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: disallow-privileged
+      policy:
+        namespace: ''
+        name: disallow-privileged
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/best_practices/disallow_sysctls.yaml b/test/scenarios/samples/best_practices/disallow_sysctls.yaml
index 1eff10dd6d..d6cc4fe650 100644
--- a/test/scenarios/samples/best_practices/disallow_sysctls.yaml
+++ b/test/scenarios/samples/best_practices/disallow_sysctls.yaml
@@ -6,7 +6,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: disallow-sysctls
+      policy:
+        namespace: ''
+        name: disallow-sysctls
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/more/restrict_automount_sa_token.yaml b/test/scenarios/samples/more/restrict_automount_sa_token.yaml
index 876d52dd91..6d95e5657e 100644
--- a/test/scenarios/samples/more/restrict_automount_sa_token.yaml
+++ b/test/scenarios/samples/more/restrict_automount_sa_token.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: restrict-automount-sa-token
+      policy:
+        namespace: ''
+        name: restrict-automount-sa-token
       resource:
         kind: Pod
         apiVersion: v1
diff --git a/test/scenarios/samples/more/restrict_ingress_classes.yaml b/test/scenarios/samples/more/restrict_ingress_classes.yaml
index 3412782c05..ef6569ed2c 100644
--- a/test/scenarios/samples/more/restrict_ingress_classes.yaml
+++ b/test/scenarios/samples/more/restrict_ingress_classes.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: restrict-ingress-classes
+      policy:
+        namespace: ''
+        name: restrict-ingress-classes
       resource:
         kind: Ingress
         apiVersion: v1
diff --git a/test/scenarios/samples/more/unknown_ingress_class.yaml b/test/scenarios/samples/more/unknown_ingress_class.yaml
index 1652182596..4c731552c4 100644
--- a/test/scenarios/samples/more/unknown_ingress_class.yaml
+++ b/test/scenarios/samples/more/unknown_ingress_class.yaml
@@ -5,7 +5,9 @@ input:
 expected:
   validation:
     policyresponse:
-      policy: restrict-ingress-classes
+      policy:
+        namespace: ''
+        name: restrict-ingress-classes
       resource:
         kind: Ingress
         apiVersion: v1