diff --git a/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/DGLoaderTest.java b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/DGLoaderTest.java
new file mode 100644
index 0000000..fea884c
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/DGLoaderTest.java
@@ -0,0 +1,188 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.dg.loader;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.osgi.framework.internal.core.BundleContextImpl;
+import org.eclipse.osgi.framework.internal.core.BundleHost;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.openecomp.sdnc.sli.ConfigurationException;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicStore;
+import org.openecomp.sdnc.sli.SvcLogicStoreFactory;
+import org.osgi.framework.BundleContext;
+import org.powermock.reflect.Whitebox;
+import org.powermock.*;
+
+public class DGLoaderTest {
+    
+    @Test
+    public void testXMLGenerator() throws Exception {
+        DGXMLGenerator application = new DGXMLGenerator();
+        String jsonPath = null;
+        String xmlPath = null;
+        String propertyPath = "somePath";
+        // Generate, GenerateLoad, GenerateLoadActivate
+        String []args = new String[]{"src/test/resources/json","src/test/resources/xml"};
+        //logger.info("DGXML Conversion Started with arguments :"+ args[0] +":"+ args[1]);
+        if(args != null && args.length >= 2){
+            jsonPath = args[0];
+            xmlPath = args[1];
+        }
+    
+        application.generateXMLFromJSON(jsonPath, xmlPath, propertyPath);
+        File dir=new File("src/test/resources/xml");
+        String extensions[]=new String[] {"xml","XML"};
+        List<File> files = new ArrayList<File>();
+        files=(List<File>) FileUtils.listFiles(dir, extensions, true);
+        assertNotNull(files.get(0));
+        assertNotNull(files.get(0).getName());
+    }
+    
+    @Test
+    public void testXMLGeneratorMain() throws Exception {
+        String []args = new String[]{"src/test/resources/json","src/test/resources/xml"};
+        DGXMLGenerator.main(args);
+        File dir=new File("src/test/resources/xml");
+        String extensions[]=new String[] {"xml","XML"};
+        List<File> files = new ArrayList<File>();
+        files=(List<File>) FileUtils.listFiles(dir, extensions, true);
+        assertNotNull(files.get(0));
+        assertNotNull(files.get(0).getName());
+    }
+        
+    @Test
+    public void testDGLoader() throws Exception {
+        String propertyPath = "src/test/resources/dummy.properties";
+        String xmlPath = "src/test/resources/xml/Appc_UniTest.xml";
+        DGXMLLoad dgXMLLoad = new MockDGXMLLoad();
+        dgXMLLoad.loadDGXMLFile(xmlPath);
+       }
+    
+    @Test
+    public void testDGLoaderWithDir() throws Exception {
+        String propertyPath = "src/test/resources/dummy.properties";
+        String xmlPath = "src/test/resources/xml";
+        DGXMLLoad dgXMLLoad = new MockDGXMLLoad();
+        Whitebox.invokeMethod(dgXMLLoad, "loadDGXMLDir",xmlPath);
+    }
+    
+    @Test
+    public void testDGLoaderWithDirThrowsException() throws Exception {
+        String propertyPath = "src/test/resources/dummy.properties";
+        String xmlPath = "src/test/resources/xml/xml";
+        DGXMLLoad dgXMLLoad = new MockDGXMLLoad();
+        Whitebox.invokeMethod(dgXMLLoad, "loadDGXMLDir",xmlPath);
+    }
+    
+    @Test
+    public void testDGActivate() throws Exception {
+        String propertyPath = "src/test/resources/dummy.properties";
+        String activateFilePath = "src/test/resources/dg_activate_test";
+        DGXMLActivate dgXMLActivate = new MockDGXMLActivate();
+        dgXMLActivate.activateDg(activateFilePath);
+
+    }
+    
+    @Test
+    public void testDGActivateThrowsException() throws Exception {
+        String propertyPath = "src/test/resources/dummy.properties";
+        String activateFilePath = "src/test/resources/someFile";
+        DGXMLActivate dgXMLActivate = new MockDGXMLActivate();
+        dgXMLActivate.activateDg(activateFilePath);
+
+    }
+    
+    @Test
+    public void testDGLoadNActivate() throws Exception {
+        String propertyPath = "src/test/resources/dummy.properties";
+        String activateFilePath = "src/test/resources/dg_activate_test";
+        String xmlPath = "src/test/resources/xml/Appc_UniTest.xml";
+        DGXMLLoadNActivate dgXMLLoadNActivate = new MockDGXMLLoadNActivate();
+        dgXMLLoadNActivate.loadDGXMLFile(xmlPath);
+        dgXMLLoadNActivate.activateDg(activateFilePath);
+    }
+    
+    @Test
+    public void testDGLoadNActivateThrowsException() throws Exception {
+        String propertyPath = "src/test/resources/dummy.properties";
+        String activateFilePath = "src/test/resources/someFile";
+        String xmlPath = "src/test/resources/xml/Appc_UniTest.xml";
+        DGXMLLoadNActivate dgXMLLoadNActivate = new MockDGXMLLoadNActivate();
+        dgXMLLoadNActivate.loadDGXMLFile(xmlPath);
+        dgXMLLoadNActivate.activateDg(activateFilePath);
+    }
+    
+    @Test
+    public void testDGLoadNActivateloadDGXMLDir() throws Exception {
+        String xmlPath = "src/test/resources/xml";
+        DGXMLLoadNActivate dgXMLLoadNActivate = new MockDGXMLLoadNActivate();
+        Whitebox.invokeMethod(dgXMLLoadNActivate,"loadDGXMLDir",xmlPath);
+     }
+    
+    
+    public void testDGLoadNActivateloadDGXMLDirThrowsException() throws Exception {
+        String xmlPath = "src/test/resources/someDir";
+        DGXMLLoadNActivate dgXMLLoadNActivate = new MockDGXMLLoadNActivate();
+        Whitebox.invokeMethod(dgXMLLoadNActivate,"loadDGXMLDir",xmlPath);
+     }
+    
+    @Test
+    public void testDGLoaderActivator() throws Exception {
+        String xmlPath = "src/test/resources/xml";
+        DGLoaderActivator dgLoaderActivator = new DGLoaderActivator();
+        dgLoaderActivator.start(null);
+        dgLoaderActivator.stop(null);
+        assertTrue(true);
+    }
+
+    @Test (expected=Exception.class)
+    public void testDGActivateConstructorThrowsException() throws Exception {
+        String somePath="";
+        DGXMLActivate dgXMLActivate = new DGXMLActivate(somePath);
+    }
+    
+    @Test (expected=Exception.class)
+    public void testDGXMLLoadConstructorThrowsException() throws Exception {
+        String somePath="";
+        DGXMLLoad dgXMLLoad = new DGXMLLoad(somePath);
+    }
+    
+    @Test (expected=Exception.class)
+    public void testDGLoadNActivateConstructorThrowsException() throws Exception {
+        String somePath="";
+        DGXMLLoadNActivate dgXMLLoadNActivate = new DGXMLLoadNActivate(somePath);
+    }
+    
+}
diff --git a/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLActivate.java b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLActivate.java
new file mode 100644
index 0000000..5143120
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLActivate.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.dg.loader;
+
+import org.openecomp.sdnc.sli.SvcLogicStore;
+
+public class MockDGXMLActivate extends DGXMLActivate {
+    private final static SvcLogicStore storeChild=MockSvcLogicFactory.getMockSvcLogicStore();;
+    MockDGXMLActivate() throws Exception {
+        super(storeChild);
+    }
+
+}
diff --git a/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLLoad.java b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLLoad.java
new file mode 100644
index 0000000..56cabbf
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLLoad.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.dg.loader;
+
+import org.mockito.internal.util.reflection.Whitebox;
+import org.openecomp.sdnc.sli.SvcLogicStore;
+
+public class MockDGXMLLoad extends DGXMLLoad{
+
+    private final static SvcLogicStore storeChild=MockSvcLogicFactory.getMockSvcLogicStore();;
+    MockDGXMLLoad() throws Exception {
+        super(storeChild);
+    }
+
+}
diff --git a/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLLoadNActivate.java b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLLoadNActivate.java
new file mode 100644
index 0000000..266f1cd
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockDGXMLLoadNActivate.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.dg.loader;
+
+import org.openecomp.sdnc.sli.SvcLogicStore;
+
+public class MockDGXMLLoadNActivate extends DGXMLLoadNActivate {
+    private final static SvcLogicStore storeChild=MockSvcLogicFactory.getMockSvcLogicStore();;
+        MockDGXMLLoadNActivate() throws Exception {
+        super(storeChild);
+    }
+}
diff --git a/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockSvcLogicDblibStore.java b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockSvcLogicDblibStore.java
new file mode 100644
index 0000000..ab96ef7
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockSvcLogicDblibStore.java
@@ -0,0 +1,86 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.dg.loader;
+
+import java.util.Properties;
+
+import org.openecomp.sdnc.sli.SvcLogicDblibStore;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicGraph;
+import org.openecomp.sdnc.sli.SvcLogicStore;
+
+public class MockSvcLogicDblibStore implements SvcLogicStore {
+
+    @Override
+    public boolean hasGraph(String module, String rpc, String version,
+            String mode) {
+        return true;
+    }
+    @Override
+    public SvcLogicGraph fetch(String module, String rpc, String version,
+            String mode) throws SvcLogicException {
+        SvcLogicGraph retVal=new SvcLogicGraph();
+        retVal.setMode("sync");
+        retVal.setModule("Appc");
+        retVal.setRpc("unitTestDG");
+        retVal.setVersion("4.0.0");
+        return retVal;
+        
+    }
+    @Override
+    public void store(SvcLogicGraph graph) throws SvcLogicException {
+
+    }
+    @Override
+    public void init(Properties props) throws SvcLogicException {
+        // TODO Auto-generated method stub
+        
+    }
+    @Override
+    public void registerNodeType(String nodeType) throws SvcLogicException {
+        // TODO Auto-generated method stub
+        
+    }
+    @Override
+    public void unregisterNodeType(String nodeType) throws SvcLogicException {
+        // TODO Auto-generated method stub
+        
+    }
+    @Override
+    public boolean isValidNodeType(String nodeType) throws SvcLogicException {
+        // TODO Auto-generated method stub
+        return true;
+    }
+    @Override
+    public void delete(String module, String rpc, String version, String mode) throws SvcLogicException {
+        // TODO Auto-generated method stub
+        
+    }
+    @Override
+    public void activate(SvcLogicGraph graph) throws SvcLogicException {
+        // TODO Auto-generated method stub
+        
+    }
+}
diff --git a/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockSvcLogicFactory.java b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockSvcLogicFactory.java
new file mode 100644
index 0000000..e38c64e
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/java/org/openecomp/sdnc/dg/loader/MockSvcLogicFactory.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdnc.dg.loader;
+
+import org.openecomp.sdnc.sli.SvcLogicStore;
+import org.openecomp.sdnc.sli.SvcLogicStoreFactory;
+import org.openecomp.sdnc.sli.SvcLogicDblibStore;
+
+public class MockSvcLogicFactory extends SvcLogicStoreFactory {
+    static SvcLogicStore getMockSvcLogicStore() {
+         SvcLogicStore store=new MockSvcLogicDblibStore();
+         return store;
+    }
+}
diff --git a/appc-directed-graph/dg-loader/provider/src/test/resources/dg_activate_test b/appc-directed-graph/dg-loader/provider/src/test/resources/dg_activate_test
new file mode 100644
index 0000000..895e177
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/resources/dg_activate_test
@@ -0,0 +1,3 @@
+# MODULE NAME:RPC NAME:VERSION:MODE
+# Example -> APPC:GetDeviceRunningConfiguration:3.0.0:sync
+Appc:UniTest:4.0.0:sync
\ No newline at end of file
diff --git a/appc-directed-graph/dg-loader/provider/src/test/resources/dummy.properties b/appc-directed-graph/dg-loader/provider/src/test/resources/dummy.properties
new file mode 100644
index 0000000..4545f89
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/resources/dummy.properties
@@ -0,0 +1,38 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# 
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# ============LICENSE_END=========================================================
+###
+
+org.openecomp.sdnc.sli.dbtype=jdbc
+
+org.openecomp.sdnc.sli.jdbc.hosts=
+org.openecomp.sdnc.sli.jdbc.url=
+org.openecomp.sdnc.sli.jdbc.database=
+org.openecomp.sdnc.sli.jdbc.user=
+org.openecomp.sdnc.sli.jdbc.password=
+org.openecomp.sdnc.sli.jdbc.connection.name=
+
+org.openecomp.sdnc.sli.jdbc.connection.timeout=50
+org.openecomp.sdnc.sli.jdbc.request.timeout=100
+org.openecomp.sdnc.sli.jdbc.limit.init=10
+org.openecomp.sdnc.sli.jdbc.limit.min=10
+org.openecomp.sdnc.sli.jdbc.limit.max=20
diff --git a/appc-directed-graph/dg-loader/provider/src/test/resources/json/Appc_UniTest.json b/appc-directed-graph/dg-loader/provider/src/test/resources/json/Appc_UniTest.json
new file mode 100644
index 0000000..2a6e49b
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/resources/json/Appc_UniTest.json
@@ -0,0 +1 @@
+[{"id":"1606180e.6254c","type":"dgstart","name":"DGSTART","outputs":1,"x":494.75,"y":149.75,"z":"7174441c.9fb7f4","wires":[["f650067e.2ad7e"]]},{"id":"f650067e.2ad7e","type":"service-logic","name":"Appc 4.0.0","module":"Appc","version":"4.0.0","comments":"","xml":"<service-logic xmlns='http://www.openecomp.org/sdnc/svclogic' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.openecomp.org/sdnc/svclogic ./svclogic.xsd' module='Appc' version='4.0.0'>","outputs":1,"x":642.75,"y":151.75,"z":"7174441c.9fb7f4","wires":[["10b2117c.ee118f"]]},{"id":"e928ee64.3762c","type":"block","name":"block","xml":"<block>\n","atomic":"false","comments":"","outputs":1,"x":952.75,"y":145.75,"z":"7174441c.9fb7f4","wires":[["342ce050.4a2fe8"]]},{"id":"342ce050.4a2fe8","type":"returnSuccess","name":"return success","xml":"<return status='success'>\n\n","comments":"","x":1115.75,"y":146.75,"z":"7174441c.9fb7f4","wires":[]},{"id":"10b2117c.ee118f","type":"method","name":"unitTest","xml":"<method rpc='unitTestDG' mode='sync'>\n","comments":"","outputs":1,"x":815.75,"y":147.75,"z":"7174441c.9fb7f4","wires":[["e928ee64.3762c"]]}]
diff --git a/appc-directed-graph/dg-loader/provider/src/test/resources/xml/Appc_UniTest.xml b/appc-directed-graph/dg-loader/provider/src/test/resources/xml/Appc_UniTest.xml
new file mode 100644
index 0000000..6eca104
--- /dev/null
+++ b/appc-directed-graph/dg-loader/provider/src/test/resources/xml/Appc_UniTest.xml
@@ -0,0 +1,5 @@
+<service-logic xmlns='http://www.openecomp.org/sdnc/svclogic' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.openecomp.org/sdnc/svclogic ./svclogic.xsd' module='Appc' version='4.0.0'><method rpc='unitTestDG' mode='sync'>
+<block>
+<return status='success'>
+
+</return></block></method></service-logic>
\ No newline at end of file
