import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.controlloop.ControlLoopOperation;
 import org.onap.policy.controlloop.ControlLoopResponse;
+import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
                      */
                     state = (outcome.getResult() == PolicyResult.SUCCESS ? State.OPERATION_SUCCESS
                                     : State.OPERATION_FAILURE);
-                    controlLoopResponse = outcome.getControlLoopResponse();
+                    controlLoopResponse = makeControlLoopResponse(outcome.getControlLoopResponse());
                     if (!operationHistory.isEmpty() && operationHistory.peekLast().getClOperation().getEnd() == null) {
                         operationHistory.removeLast();
                     }
         operContext.updated(this);
     }
 
+    /**
+     * Makes a control loop response.
+     *
+     * @param source original control loop response or {@code null}
+     * @return a new control loop response, or {@code null} none is required
+     */
+    protected ControlLoopResponse makeControlLoopResponse(ControlLoopResponse source) {
+        if (source != null) {
+            return source;
+        }
+
+        // only generate response for certain actors.
+        if (!actor.equals("SDNR")) {
+            return null;
+        }
+
+        VirtualControlLoopEvent event = eventContext.getEvent();
+
+        ControlLoopResponse clRsp = new ControlLoopResponse();
+        clRsp.setFrom(actor);
+        clRsp.setTarget("DCAE");
+        clRsp.setClosedLoopControlName(event.getClosedLoopControlName());
+        clRsp.setPolicyName(event.getPolicyName());
+        clRsp.setPolicyVersion(event.getPolicyVersion());
+        clRsp.setRequestId(event.getRequestId());
+        clRsp.setVersion(event.getVersion());
+
+        return clRsp;
+    }
+
     /**
      * Get the operation, as a message.
      *
 
 import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.common.utils.time.PseudoExecutor;
 import org.onap.policy.controlloop.ControlLoopOperation;
+import org.onap.policy.controlloop.ControlLoopResponse;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.actor.guard.GuardActorServiceProvider;
 import org.onap.policy.controlloop.actor.guard.GuardOperation;
         assertSame(POLICY_TIMEOUT, params.getTimeoutSec());
     }
 
+    @Test
+    public void testMakeControlLoopResponse() {
+        // should always return its input, if non-null
+        ControlLoopResponse resp = new ControlLoopResponse();
+        assertSame(resp, mgr.makeControlLoopResponse(resp));
+
+        // not an SDNR action - should return null
+        assertNull(mgr.makeControlLoopResponse(null));
+
+        /*
+         * now work with SDNR actor
+         */
+        policy.setActor("SDNR");
+        mgr = new ControlLoopOperationManager2(mgrctx, context, policy, executor);
+
+        // should still return its input, if non-null
+        resp = new ControlLoopResponse();
+        assertSame(resp, mgr.makeControlLoopResponse(resp));
+
+        // should generate a response
+        resp = mgr.makeControlLoopResponse(null);
+        assertNotNull(resp);
+        assertEquals(REQ_ID, resp.getRequestId());
+        assertNull(resp.getPayload());
+    }
+
     @Test
     public void testGetOperationMessage() {
         // no history yet