diff --git a/bpmn/MSOURN-plugin/pom.xml b/bpmn/MSOURN-plugin/pom.xml
index a8b198d..40dcd1f 100644
--- a/bpmn/MSOURN-plugin/pom.xml
+++ b/bpmn/MSOURN-plugin/pom.xml
@@ -61,11 +61,5 @@
 			<version>${project.version}</version>
 			<scope>compile</scope>
 		</dependency>
-		<dependency>
-             <groupId>org.evosuite</groupId>
-             <artifactId>evosuite-standalone-runtime</artifactId>
-             <version>${evosuiteVersion}</version>
-             <scope>test</scope>
-        </dependency>
 	</dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/URNMapPluginESTest.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/URNMapPluginESTest.java
deleted file mode 100644
index e8d1af5..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/URNMapPluginESTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * This file was automatically generated by EvoSuite
- * Mon Nov 14 13:49:02 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-import java.util.List;
-import java.util.Set;
-
-import org.evosuite.runtime.EvoRunner;
-import org.evosuite.runtime.EvoRunnerParameters;
-import org.junit.runner.RunWith;
-import org.openecomp.camunda.bpmn.plugin.urnmap.URNMapPlugin;
-
-@RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, useJEE = true) 
-public class URNMapPluginESTest extends URNMapPluginESTestscaffolding {
-
-  @Test(timeout = 4000)
-  public void test0()  throws Throwable  {
-      URNMapPlugin uRNMapPlugin0 = new URNMapPlugin();
-      Set<Class<?>> set0 = uRNMapPlugin0.getResourceClasses();
-      assertFalse(set0.isEmpty());
-  }
-
-  @Test(timeout = 4000)
-  public void test1()  throws Throwable  {
-      URNMapPlugin uRNMapPlugin0 = new URNMapPlugin();
-      String string0 = uRNMapPlugin0.getId();
-      assertEquals("urnMap-plugin", string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test2()  throws Throwable  {
-      URNMapPlugin uRNMapPlugin0 = new URNMapPlugin();
-      List<String> list0 = uRNMapPlugin0.getMappingFiles();
-      assertEquals(1, list0.size());
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/URNMapPluginESTestscaffolding.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/URNMapPluginESTestscaffolding.java
deleted file mode 100644
index 8a24352..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/URNMapPluginESTestscaffolding.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Scaffolding file used to store all the setups needed to run 
- * tests automatically generated by EvoSuite
- * Mon Nov 14 13:49:02 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap;
-
-import org.evosuite.runtime.annotation.EvoSuiteClassExclude;
-import org.junit.BeforeClass;
-import org.junit.Before;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.evosuite.runtime.sandbox.Sandbox;
-
-@EvoSuiteClassExclude
-public class URNMapPluginESTestscaffolding {
-
-  @org.junit.Rule 
-  public org.evosuite.runtime.vnet.NonFunctionalRequirementRule nfr = new org.evosuite.runtime.vnet.NonFunctionalRequirementRule();
-
-  private static final java.util.Properties defaultProperties = (java.util.Properties) java.lang.System.getProperties().clone(); 
-
-  private org.evosuite.runtime.thread.ThreadStopper threadStopper =  new org.evosuite.runtime.thread.ThreadStopper (org.evosuite.runtime.thread.KillSwitchHandler.getInstance(), 3000);
-
-  @BeforeClass 
-  public static void initEvoSuiteFramework() { 
-    org.evosuite.runtime.RuntimeSettings.className = "org.openecomp.camunda.bpmn.plugin.urnmap.URNMapPlugin"; 
-    org.evosuite.runtime.GuiSupport.initialize(); 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfThreads = 100; 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationsPerLoop = 10000; 
-    org.evosuite.runtime.RuntimeSettings.mockSystemIn = true; 
-    org.evosuite.runtime.RuntimeSettings.sandboxMode = org.evosuite.runtime.sandbox.Sandbox.SandboxMode.RECOMMENDED; 
-    org.evosuite.runtime.sandbox.Sandbox.initializeSecurityManagerForSUT(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.init(); 
-    initializeClasses();
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-  } 
-
-  @AfterClass 
-  public static void clearEvoSuiteFramework(){ 
-    Sandbox.resetDefaultSecurityManager(); 
-    java.lang.System.setProperties((java.util.Properties) defaultProperties.clone()); 
-  } 
-
-  @Before 
-  public void initTestCase(){ 
-    threadStopper.storeCurrentThreads();
-    threadStopper.startRecordingTime();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().initHandler(); 
-    org.evosuite.runtime.sandbox.Sandbox.goingToExecuteSUTCode(); 
-     
-    org.evosuite.runtime.GuiSupport.setHeadless(); 
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.activate(); 
-  } 
-
-  @After 
-  public void doneWithTestCase(){ 
-    threadStopper.killAndJoinClientThreads();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().safeExecuteAddedHooks(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.reset(); 
-    resetClasses(); 
-    org.evosuite.runtime.sandbox.Sandbox.doneWithExecutingSUTCode(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.deactivate(); 
-    org.evosuite.runtime.GuiSupport.restoreHeadlessMode(); 
-  } 
-
-
-  private static void initializeClasses() {
-    org.evosuite.runtime.classhandling.ClassStateSupport.initializeClasses(URNMapPluginESTestscaffolding.class.getClassLoader() ,
-      "org.camunda.bpm.webapp.plugin.spi.impl.AbstractAppPlugin",
-      "org.camunda.bpm.webapp.plugin.spi.AppPlugin",
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractPluginRootResource",
-      "org.camunda.bpm.cockpit.plugin.spi.impl.AbstractCockpitPlugin",
-      "org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource",
-      "org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNMapPluginRootResource",
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginRootResource",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.URNMapPlugin"
-    );
-  } 
-
-  private static void resetClasses() {
-    org.evosuite.runtime.classhandling.ClassResetter.getInstance().setClassLoader(URNMapPluginESTestscaffolding.class.getClassLoader());
-
-    org.evosuite.runtime.classhandling.ClassStateSupport.resetClasses(
-      "org.openecomp.camunda.bpmn.plugin.urnmap.URNMapPlugin"
-    );
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNDataESTest.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNDataESTest.java
deleted file mode 100644
index dedd6b3..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNDataESTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * This file was automatically generated by EvoSuite
- * Mon Nov 14 13:48:50 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.db;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-import org.evosuite.runtime.EvoRunner;
-import org.evosuite.runtime.EvoRunnerParameters;
-import org.junit.runner.RunWith;
-import org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData;
-
-@RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, useJEE = true) 
-public class URNDataESTest extends URNDataESTestscaffolding {
-
-  @Test(timeout = 4000)
-  public void test0()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      uRNData0.setVer_("yE)");
-      String string0 = uRNData0.getVer_();
-      assertEquals("yE)", string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test1()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      uRNData0.setURNValue("Dw]M@,~.D");
-      String string0 = uRNData0.getURNValue();
-      assertEquals("Dw]M@,~.D", string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test2()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      uRNData0.setURNName("");
-      String string0 = uRNData0.getURNName();
-      assertEquals("", string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test3()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      String string0 = uRNData0.getVer_();
-      assertNull(string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test4()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      String string0 = uRNData0.getURNValue();
-      assertNull(string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test5()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      String string0 = uRNData0.getURNName();
-      assertNull(string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test6()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      uRNData0.setURNValue("");
-      String string0 = uRNData0.getURNValue();
-      assertEquals("", string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test7()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      uRNData0.setVer_("");
-      String string0 = uRNData0.getVer_();
-      assertEquals("", string0);
-  }
-
-  @Test(timeout = 4000)
-  public void test8()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      uRNData0.setURNName("2Gv9h[mmV=,z\"VSY`t)");
-      String string0 = uRNData0.getURNName();
-      assertEquals("2Gv9h[mmV=,z\"VSY`t)", string0);
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNDataESTestscaffolding.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNDataESTestscaffolding.java
deleted file mode 100644
index eef0d9b..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNDataESTestscaffolding.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Scaffolding file used to store all the setups needed to run 
- * tests automatically generated by EvoSuite
- * Mon Nov 14 13:48:50 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.db;
-
-import org.evosuite.runtime.annotation.EvoSuiteClassExclude;
-import org.junit.BeforeClass;
-import org.junit.Before;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.evosuite.runtime.sandbox.Sandbox;
-
-@EvoSuiteClassExclude
-public class URNDataESTestscaffolding {
-
-  @org.junit.Rule 
-  public org.evosuite.runtime.vnet.NonFunctionalRequirementRule nfr = new org.evosuite.runtime.vnet.NonFunctionalRequirementRule();
-
-  private static final java.util.Properties defaultProperties = (java.util.Properties) java.lang.System.getProperties().clone(); 
-
-  private org.evosuite.runtime.thread.ThreadStopper threadStopper =  new org.evosuite.runtime.thread.ThreadStopper (org.evosuite.runtime.thread.KillSwitchHandler.getInstance(), 3000);
-
-  @BeforeClass 
-  public static void initEvoSuiteFramework() { 
-    org.evosuite.runtime.RuntimeSettings.className = "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData"; 
-    org.evosuite.runtime.GuiSupport.initialize(); 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfThreads = 100; 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationsPerLoop = 10000; 
-    org.evosuite.runtime.RuntimeSettings.mockSystemIn = true; 
-    org.evosuite.runtime.RuntimeSettings.sandboxMode = org.evosuite.runtime.sandbox.Sandbox.SandboxMode.RECOMMENDED; 
-    org.evosuite.runtime.sandbox.Sandbox.initializeSecurityManagerForSUT(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.init(); 
-    initializeClasses();
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-  } 
-
-  @AfterClass 
-  public static void clearEvoSuiteFramework(){ 
-    Sandbox.resetDefaultSecurityManager(); 
-    java.lang.System.setProperties((java.util.Properties) defaultProperties.clone()); 
-  } 
-
-  @Before 
-  public void initTestCase(){ 
-    threadStopper.storeCurrentThreads();
-    threadStopper.startRecordingTime();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().initHandler(); 
-    org.evosuite.runtime.sandbox.Sandbox.goingToExecuteSUTCode(); 
-     
-    org.evosuite.runtime.GuiSupport.setHeadless(); 
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.activate(); 
-  } 
-
-  @After 
-  public void doneWithTestCase(){ 
-    threadStopper.killAndJoinClientThreads();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().safeExecuteAddedHooks(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.reset(); 
-    resetClasses(); 
-    org.evosuite.runtime.sandbox.Sandbox.doneWithExecutingSUTCode(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.deactivate(); 
-    org.evosuite.runtime.GuiSupport.restoreHeadlessMode(); 
-  } 
-
-
-  private static void initializeClasses() {
-    org.evosuite.runtime.classhandling.ClassStateSupport.initializeClasses(URNDataESTestscaffolding.class.getClassLoader() ,
-      "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData"
-    );
-  } 
-
-  private static void resetClasses() {
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNServiceESTest.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNServiceESTest.java
deleted file mode 100644
index b79468c..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNServiceESTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * This file was automatically generated by EvoSuite
- * Mon Nov 14 13:47:07 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.db;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-import static org.evosuite.runtime.EvoAssertions.*;
-
-import org.evosuite.runtime.EvoRunner;
-import org.evosuite.runtime.EvoRunnerParameters;
-import org.junit.runner.RunWith;
-import org.openecomp.camunda.bpmn.plugin.urnmap.db.URNService;
-
-@RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, useJEE = true) 
-public class URNServiceESTest extends URNServiceESTestscaffolding {
-
-  @Test(timeout = 4000)
-  public void test0()  throws Throwable  {
-      URNService uRNService0 = new URNService();
-      // Undeclared exception!
-      try { 
-        uRNService0.getProperties();
-        fail("Expecting exception: NullPointerException");
-      
-      } catch(NullPointerException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("org.openecomp.camunda.bpmn.plugin.urnmap.db.URNService", e);
-      }
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNServiceESTestscaffolding.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNServiceESTestscaffolding.java
deleted file mode 100644
index dbbce2d..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/db/URNServiceESTestscaffolding.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Scaffolding file used to store all the setups needed to run 
- * tests automatically generated by EvoSuite
- * Mon Nov 14 13:47:07 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.db;
-
-import org.evosuite.runtime.annotation.EvoSuiteClassExclude;
-import org.junit.BeforeClass;
-import org.junit.Before;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.evosuite.runtime.sandbox.Sandbox;
-
-@EvoSuiteClassExclude
-public class URNServiceESTestscaffolding {
-
-  @org.junit.Rule 
-  public org.evosuite.runtime.vnet.NonFunctionalRequirementRule nfr = new org.evosuite.runtime.vnet.NonFunctionalRequirementRule();
-
-  private static final java.util.Properties defaultProperties = (java.util.Properties) java.lang.System.getProperties().clone(); 
-
-  private org.evosuite.runtime.thread.ThreadStopper threadStopper =  new org.evosuite.runtime.thread.ThreadStopper (org.evosuite.runtime.thread.KillSwitchHandler.getInstance(), 3000);
-
-  @BeforeClass 
-  public static void initEvoSuiteFramework() { 
-    org.evosuite.runtime.RuntimeSettings.className = "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNService"; 
-    org.evosuite.runtime.GuiSupport.initialize(); 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfThreads = 100; 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationsPerLoop = 10000; 
-    org.evosuite.runtime.RuntimeSettings.mockSystemIn = true; 
-    org.evosuite.runtime.RuntimeSettings.sandboxMode = org.evosuite.runtime.sandbox.Sandbox.SandboxMode.RECOMMENDED; 
-    org.evosuite.runtime.sandbox.Sandbox.initializeSecurityManagerForSUT(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.init(); 
-    initializeClasses();
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-  } 
-
-  @AfterClass 
-  public static void clearEvoSuiteFramework(){ 
-    Sandbox.resetDefaultSecurityManager(); 
-    java.lang.System.setProperties((java.util.Properties) defaultProperties.clone()); 
-  } 
-
-  @Before 
-  public void initTestCase(){ 
-    threadStopper.storeCurrentThreads();
-    threadStopper.startRecordingTime();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().initHandler(); 
-    org.evosuite.runtime.sandbox.Sandbox.goingToExecuteSUTCode(); 
-     
-    org.evosuite.runtime.GuiSupport.setHeadless(); 
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.activate(); 
-  } 
-
-  @After 
-  public void doneWithTestCase(){ 
-    threadStopper.killAndJoinClientThreads();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().safeExecuteAddedHooks(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.reset(); 
-    resetClasses(); 
-    org.evosuite.runtime.sandbox.Sandbox.doneWithExecutingSUTCode(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.deactivate(); 
-    org.evosuite.runtime.GuiSupport.restoreHeadlessMode(); 
-  } 
-
-
-  private static void initializeClasses() {
-    org.evosuite.runtime.classhandling.ClassStateSupport.initializeClasses(URNServiceESTestscaffolding.class.getClassLoader() ,
-      "org.camunda.bpm.engine.ProcessEngineException",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNService",
-      "org.camunda.bpm.engine.impl.interceptor.Command",
-      "org.camunda.bpm.engine.ClassLoadingException",
-      "org.camunda.bpm.engine.ProcessEngine",
-      "org.camunda.bpm.engine.ProcessEngines",
-      "org.camunda.bpm.engine.ProcessEngineInfo",
-      "org.camunda.bpm.application.ProcessApplicationUnavailableException",
-      "org.camunda.bpm.engine.impl.ProcessEngineImpl",
-      "org.camunda.bpm.engine.impl.context.Context",
-      "org.camunda.bpm.engine.impl.util.ReflectUtil",
-      "org.camunda.bpm.engine.ProcessEngineServices",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData"
-    );
-  } 
-
-  private static void resetClasses() {
-    org.evosuite.runtime.classhandling.ClassResetter.getInstance().setClassLoader(URNServiceESTestscaffolding.class.getClassLoader());
-
-    org.evosuite.runtime.classhandling.ClassStateSupport.resetClasses(
-      "org.camunda.bpm.engine.impl.context.Context",
-      "org.camunda.bpm.engine.ProcessEngines",
-      "org.camunda.bpm.engine.impl.util.ReflectUtil"
-    );
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/ProcessInstanceResourceESTest.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/ProcessInstanceResourceESTest.java
deleted file mode 100644
index 21ca18c..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/ProcessInstanceResourceESTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * This file was automatically generated by EvoSuite
- * Mon Nov 14 13:45:16 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.resources;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-import static org.evosuite.runtime.EvoAssertions.*;
-
-import java.util.NoSuchElementException;
-
-import org.evosuite.runtime.EvoRunner;
-import org.evosuite.runtime.EvoRunnerParameters;
-import org.junit.runner.RunWith;
-import org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData;
-import org.openecomp.camunda.bpmn.plugin.urnmap.resources.ProcessInstanceResource;
-
-@RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, useJEE = true) 
-public class ProcessInstanceResourceESTest extends ProcessInstanceResourceESTestscaffolding {
-
-  @Test(timeout = 4000)
-  public void test0()  throws Throwable  {
-      ProcessInstanceResource processInstanceResource0 = new ProcessInstanceResource((String) null);
-      // Undeclared exception!
-      try { 
-        processInstanceResource0.getUrnDataMap();
-        fail("Expecting exception: NullPointerException");
-      
-      } catch(NullPointerException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("org.camunda.bpm.cockpit.Cockpit", e);
-      }
-  }
-
-  @Test(timeout = 4000)
-  public void test1()  throws Throwable  {
-      ProcessInstanceResource processInstanceResource0 = new ProcessInstanceResource("DEUtDF$-rb|D]l9");
-      // Undeclared exception!
-      try { 
-        processInstanceResource0.insertNewRow("DEUtDF$-rb|D]l9");
-        fail("Expecting exception: NullPointerException");
-      
-      } catch(NullPointerException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("org.camunda.bpm.cockpit.Cockpit", e);
-      }
-  }
-
-  @Test(timeout = 4000)
-  public void test2()  throws Throwable  {
-      URNData uRNData0 = new URNData();
-      ProcessInstanceResource processInstanceResource0 = new ProcessInstanceResource("|");
-      // Undeclared exception!
-      try { 
-        processInstanceResource0.getPersistData(uRNData0);
-        fail("Expecting exception: NullPointerException");
-      
-      } catch(NullPointerException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("org.camunda.bpm.cockpit.Cockpit", e);
-      }
-  }
-
-  @Test(timeout = 4000)
-  public void test3()  throws Throwable  {
-      ProcessInstanceResource processInstanceResource0 = new ProcessInstanceResource("xGUKD= Ea6(aT");
-      // Undeclared exception!
-      try { 
-        processInstanceResource0.insertNewRow("xGUKD= Ea6(aT");
-        fail("Expecting exception: NoSuchElementException");
-      
-      } catch(NoSuchElementException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("java.util.StringTokenizer", e);
-      }
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/ProcessInstanceResourceESTestscaffolding.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/ProcessInstanceResourceESTestscaffolding.java
deleted file mode 100644
index 4408ada..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/ProcessInstanceResourceESTestscaffolding.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * Scaffolding file used to store all the setups needed to run 
- * tests automatically generated by EvoSuite
- * Mon Nov 14 13:45:16 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.resources;
-
-import org.evosuite.runtime.annotation.EvoSuiteClassExclude;
-import org.junit.BeforeClass;
-import org.junit.Before;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.evosuite.runtime.sandbox.Sandbox;
-
-@EvoSuiteClassExclude
-public class ProcessInstanceResourceESTestscaffolding {
-
-  @org.junit.Rule 
-  public org.evosuite.runtime.vnet.NonFunctionalRequirementRule nfr = new org.evosuite.runtime.vnet.NonFunctionalRequirementRule();
-
-  private static final java.util.Properties defaultProperties = (java.util.Properties) java.lang.System.getProperties().clone(); 
-
-  private org.evosuite.runtime.thread.ThreadStopper threadStopper =  new org.evosuite.runtime.thread.ThreadStopper (org.evosuite.runtime.thread.KillSwitchHandler.getInstance(), 3000);
-
-  @BeforeClass 
-  public static void initEvoSuiteFramework() { 
-    org.evosuite.runtime.RuntimeSettings.className = "org.openecomp.camunda.bpmn.plugin.urnmap.resources.ProcessInstanceResource"; 
-    org.evosuite.runtime.GuiSupport.initialize(); 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfThreads = 100; 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationsPerLoop = 10000; 
-    org.evosuite.runtime.RuntimeSettings.mockSystemIn = true; 
-    org.evosuite.runtime.RuntimeSettings.sandboxMode = org.evosuite.runtime.sandbox.Sandbox.SandboxMode.RECOMMENDED; 
-    org.evosuite.runtime.sandbox.Sandbox.initializeSecurityManagerForSUT(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.init(); 
-    initializeClasses();
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-  } 
-
-  @AfterClass 
-  public static void clearEvoSuiteFramework(){ 
-    Sandbox.resetDefaultSecurityManager(); 
-    java.lang.System.setProperties((java.util.Properties) defaultProperties.clone()); 
-  } 
-
-  @Before 
-  public void initTestCase(){ 
-    threadStopper.storeCurrentThreads();
-    threadStopper.startRecordingTime();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().initHandler(); 
-    org.evosuite.runtime.sandbox.Sandbox.goingToExecuteSUTCode(); 
-     
-    org.evosuite.runtime.GuiSupport.setHeadless(); 
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.activate(); 
-  } 
-
-  @After 
-  public void doneWithTestCase(){ 
-    threadStopper.killAndJoinClientThreads();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().safeExecuteAddedHooks(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.reset(); 
-    resetClasses(); 
-    org.evosuite.runtime.sandbox.Sandbox.doneWithExecutingSUTCode(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.deactivate(); 
-    org.evosuite.runtime.GuiSupport.restoreHeadlessMode(); 
-  } 
-
-
-  private static void initializeClasses() {
-    org.evosuite.runtime.classhandling.ClassStateSupport.initializeClasses(ProcessInstanceResourceESTestscaffolding.class.getClassLoader() ,
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource",
-      "org.camunda.bpm.cockpit.CockpitRuntimeDelegate",
-      "org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginResource",
-      "org.camunda.bpm.webapp.AppRuntimeDelegate",
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractPluginResource",
-      "org.camunda.bpm.cockpit.db.QueryService",
-      "org.camunda.bpm.engine.ProcessEngine",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.resources.ProcessInstanceResource",
-      "org.camunda.bpm.engine.ProcessEngineServices",
-      "org.camunda.bpm.cockpit.db.CommandExecutor",
-      "org.camunda.bpm.cockpit.Cockpit",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData"
-    );
-  } 
-
-  private static void resetClasses() {
-    org.evosuite.runtime.classhandling.ClassResetter.getInstance().setClassLoader(ProcessInstanceResourceESTestscaffolding.class.getClassLoader());
-
-    org.evosuite.runtime.classhandling.ClassStateSupport.resetClasses(
-      "org.camunda.bpm.cockpit.Cockpit"
-    );
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNMapPluginRootResourceESTest.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNMapPluginRootResourceESTest.java
deleted file mode 100644
index c1dccfc..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNMapPluginRootResourceESTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * This file was automatically generated by EvoSuite
- * Mon Nov 14 13:48:27 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.resources;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-import static org.evosuite.shaded.org.mockito.Mockito.*;
-
-import javax.servlet.ServletContext;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.UriInfo;
-
-import org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource;
-import org.evosuite.runtime.EvoRunner;
-import org.evosuite.runtime.EvoRunnerParameters;
-import org.evosuite.runtime.ViolatedAssumptionAnswer;
-import org.evosuite.runtime.javaee.injection.Injector;
-import org.junit.runner.RunWith;
-import org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNMapPluginRootResource;
-import org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNResource;
-
-@RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, useJEE = true) 
-public class URNMapPluginRootResourceESTest extends URNMapPluginRootResourceESTestscaffolding {
-
-  @Test(timeout = 4000)
-  public void test0()  throws Throwable  {
-      URNMapPluginRootResource uRNMapPluginRootResource0 = new URNMapPluginRootResource();
-      HttpHeaders httpHeaders0 = mock(HttpHeaders.class, new ViolatedAssumptionAnswer());
-      Injector.inject(uRNMapPluginRootResource0, (Class<?>) AbstractAppPluginRootResource.class, "headers", (Object) httpHeaders0);
-      ServletContext servletContext0 = mock(ServletContext.class, new ViolatedAssumptionAnswer());
-      Injector.inject(uRNMapPluginRootResource0, (Class<?>) AbstractAppPluginRootResource.class, "servletContext", (Object) servletContext0);
-      UriInfo uriInfo0 = mock(UriInfo.class, new ViolatedAssumptionAnswer());
-      Injector.inject(uRNMapPluginRootResource0, (Class<?>) AbstractAppPluginRootResource.class, "uriInfo", (Object) uriInfo0);
-      Injector.validateBean(uRNMapPluginRootResource0, (Class<?>) URNMapPluginRootResource.class);
-      URNResource uRNResource0 = uRNMapPluginRootResource0.getProcessInstanceResource("}+njRy')#n?K^");
-      assertNotNull(uRNResource0);
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNMapPluginRootResourceESTestscaffolding.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNMapPluginRootResourceESTestscaffolding.java
deleted file mode 100644
index 1033de9..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNMapPluginRootResourceESTestscaffolding.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * Scaffolding file used to store all the setups needed to run 
- * tests automatically generated by EvoSuite
- * Mon Nov 14 13:48:27 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.resources;
-
-import org.evosuite.runtime.annotation.EvoSuiteClassExclude;
-import org.junit.BeforeClass;
-import org.junit.Before;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.evosuite.runtime.sandbox.Sandbox;
-
-@EvoSuiteClassExclude
-public class URNMapPluginRootResourceESTestscaffolding {
-
-  @org.junit.Rule 
-  public org.evosuite.runtime.vnet.NonFunctionalRequirementRule nfr = new org.evosuite.runtime.vnet.NonFunctionalRequirementRule();
-
-  private static final java.util.Properties defaultProperties = (java.util.Properties) java.lang.System.getProperties().clone(); 
-
-  private org.evosuite.runtime.thread.ThreadStopper threadStopper =  new org.evosuite.runtime.thread.ThreadStopper (org.evosuite.runtime.thread.KillSwitchHandler.getInstance(), 3000);
-
-  @BeforeClass 
-  public static void initEvoSuiteFramework() { 
-    org.evosuite.runtime.RuntimeSettings.className = "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNMapPluginRootResource"; 
-    org.evosuite.runtime.GuiSupport.initialize(); 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfThreads = 100; 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationsPerLoop = 10000; 
-    org.evosuite.runtime.RuntimeSettings.mockSystemIn = true; 
-    org.evosuite.runtime.RuntimeSettings.sandboxMode = org.evosuite.runtime.sandbox.Sandbox.SandboxMode.RECOMMENDED; 
-    org.evosuite.runtime.sandbox.Sandbox.initializeSecurityManagerForSUT(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.init(); 
-    initializeClasses();
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-  } 
-
-  @AfterClass 
-  public static void clearEvoSuiteFramework(){ 
-    Sandbox.resetDefaultSecurityManager(); 
-    java.lang.System.setProperties((java.util.Properties) defaultProperties.clone()); 
-  } 
-
-  @Before 
-  public void initTestCase(){ 
-    threadStopper.storeCurrentThreads();
-    threadStopper.startRecordingTime();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().initHandler(); 
-    org.evosuite.runtime.sandbox.Sandbox.goingToExecuteSUTCode(); 
-     
-    org.evosuite.runtime.GuiSupport.setHeadless(); 
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.activate(); 
-  } 
-
-  @After 
-  public void doneWithTestCase(){ 
-    threadStopper.killAndJoinClientThreads();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().safeExecuteAddedHooks(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.reset(); 
-    resetClasses(); 
-    org.evosuite.runtime.sandbox.Sandbox.doneWithExecutingSUTCode(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.deactivate(); 
-    org.evosuite.runtime.GuiSupport.restoreHeadlessMode(); 
-  } 
-
-
-  private static void initializeClasses() {
-    org.evosuite.runtime.classhandling.ClassStateSupport.initializeClasses(URNMapPluginRootResourceESTestscaffolding.class.getClassLoader() ,
-      "org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginResource",
-      "org.camunda.bpm.webapp.plugin.spi.AppPlugin",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNResource",
-      "com.att.eelf.i18n.EELFResourceManager$RESOURCE_TYPES",
-      "org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource",
-      "org.openecomp.mso.logger.MsoLogger$ErrorCode",
-      "org.camunda.bpm.cockpit.Cockpit",
-      "com.att.eelf.configuration.EELFLogger",
-      "org.camunda.bpm.engine.rest.exception.RestException",
-      "com.att.eelf.configuration.SLF4jWrapper",
-      "com.att.eelf.i18n.EELFResourceManager",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData",
-      "org.openecomp.mso.logger.MsoLogger",
-      "org.openecomp.mso.logger.MessageEnum",
-      "com.att.eelf.i18n.EELFResolvableErrorEnum",
-      "org.openecomp.mso.logger.MsoLogger$ResponseCode",
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractPluginRootResource",
-      "org.openecomp.mso.entity.MsoRequest",
-      "org.camunda.bpm.webapp.AppRuntimeDelegate",
-      "org.openecomp.mso.logger.MsoLogger$StatusCode",
-      "com.att.eelf.configuration.EELFManager",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNMapPluginRootResource",
-      "com.att.eelf.i18n.EELFMsgs",
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginRootResource",
-      "com.att.eelf.configuration.EELFLogger$Level",
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource",
-      "org.openecomp.mso.logger.MsoLogger$Catalog"
-    );
-  } 
-
-  private static void resetClasses() {
-    org.evosuite.runtime.classhandling.ClassResetter.getInstance().setClassLoader(URNMapPluginRootResourceESTestscaffolding.class.getClassLoader());
-
-    org.evosuite.runtime.classhandling.ClassStateSupport.resetClasses(
-      "org.camunda.bpm.cockpit.Cockpit",
-      "org.openecomp.mso.logger.MsoLogger$Catalog",
-      "org.openecomp.mso.logger.MsoLogger",
-      "com.att.eelf.i18n.EELFResourceManager",
-      "com.att.eelf.i18n.EELFMsgs",
-      "com.att.eelf.i18n.EELFResourceManager$RESOURCE_TYPES",
-      "com.att.eelf.configuration.EELFLogger$Level",
-      "com.att.eelf.configuration.EELFManager",
-      "org.openecomp.mso.logger.MessageEnum",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNResource",
-      "org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource"
-    );
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNResourceESTest.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNResourceESTest.java
deleted file mode 100644
index ca04263..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNResourceESTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * This file was automatically generated by EvoSuite
- * Mon Nov 14 13:47:41 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.resources;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-import static org.evosuite.shaded.org.mockito.Mockito.*;
-import static org.evosuite.runtime.EvoAssertions.*;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import org.evosuite.runtime.EvoRunner;
-import org.evosuite.runtime.EvoRunnerParameters;
-import org.evosuite.runtime.PrivateAccess;
-import org.evosuite.runtime.ViolatedAssumptionAnswer;
-import org.junit.runner.RunWith;
-import org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData;
-import org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNResource;
-
-@RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, useJEE = true) 
-public class URNResourceESTest extends URNResourceESTestscaffolding {
-
-  @Test(timeout = 4000)
-  public void test00()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("pE|b");
-      PreparedStatement preparedStatement0 = mock(PreparedStatement.class, new ViolatedAssumptionAnswer());
-      doReturn((-3202)).when(preparedStatement0).executeUpdate();
-      Connection connection0 = mock(Connection.class, new ViolatedAssumptionAnswer());
-      doReturn("").when(connection0).toString();
-      doReturn(preparedStatement0).when(connection0).prepareStatement(anyString());
-      PrivateAccess.setVariable((Class<URNResource>) URNResource.class, uRNResource0, "conn", (Object) connection0);
-      uRNResource0.insertNewRow("pE|b");
-  }
-
-  @Test(timeout = 4000)
-  public void test01()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("pE|b");
-      Connection connection0 = mock(Connection.class, new ViolatedAssumptionAnswer());
-      doReturn((String) null).when(connection0).toString();
-      doReturn((PreparedStatement) null).when(connection0).prepareStatement(anyString());
-      PrivateAccess.setVariable((Class<URNResource>) URNResource.class, uRNResource0, "conn", (Object) connection0);
-      uRNResource0.insertNewRow("pE|b");
-  }
-
-  @Test(timeout = 4000)
-  public void test02()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("");
-      List<URNData> list0 = uRNResource0.getUrnDataMap();
-      assertTrue(list0.isEmpty());
-  }
-
-  @Test(timeout = 4000)
-  public void test03()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("pE|b");
-      PreparedStatement preparedStatement0 = mock(PreparedStatement.class, new ViolatedAssumptionAnswer());
-      doReturn((-3202)).when(preparedStatement0).executeUpdate();
-      Connection connection0 = mock(Connection.class, new ViolatedAssumptionAnswer());
-      doReturn("").when(connection0).toString();
-      doReturn(preparedStatement0).when(connection0).prepareStatement(anyString());
-      PrivateAccess.setVariable((Class<URNResource>) URNResource.class, uRNResource0, "conn", (Object) connection0);
-      URNData uRNData0 = new URNData();
-      uRNResource0.getPersistData(uRNData0);
-      assertNull(uRNData0.getVer_());
-  }
-
-  @Test(timeout = 4000)
-  public void test04()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("pE|b");
-      Connection connection0 = mock(Connection.class, new ViolatedAssumptionAnswer());
-      doReturn((String) null).when(connection0).toString();
-      doReturn((PreparedStatement) null).when(connection0).prepareStatement(anyString());
-      PrivateAccess.setVariable((Class<URNResource>) URNResource.class, uRNResource0, "conn", (Object) connection0);
-      URNData uRNData0 = new URNData();
-      uRNResource0.getPersistData(uRNData0);
-      assertNull(uRNData0.getVer_());
-  }
-
-  @Test(timeout = 4000)
-  public void test05()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("LR6iOYH?>Bg%1-x=lK");
-      // Undeclared exception!
-      try { 
-        uRNResource0.insertNewRow("LR6iOYH?>Bg%1-x=lK");
-        fail("Expecting exception: NoSuchElementException");
-      
-      } catch(NoSuchElementException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("java.util.StringTokenizer", e);
-      }
-  }
-
-  @Test(timeout = 4000)
-  public void test06()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("");
-      // Undeclared exception!
-      try { 
-        uRNResource0.insertNewRow((String) null);
-        fail("Expecting exception: NullPointerException");
-      
-      } catch(NullPointerException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("java.util.StringTokenizer", e);
-      }
-  }
-
-  @Test(timeout = 4000)
-  public void test07()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("pE|b");
-      // Undeclared exception!
-      try { 
-        uRNResource0.getUrnDataMapOLD();
-        fail("Expecting exception: NullPointerException");
-      
-      } catch(NullPointerException e) {
-         //
-         // no message in exception (getMessage() returned null)
-         //
-         verifyException("org.camunda.bpm.cockpit.Cockpit", e);
-      }
-  }
-
-  @Test(timeout = 4000)
-  public void test08()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("");
-      Connection connection0 = uRNResource0.getDBConnection();
-      assertNull(connection0);
-  }
-
-  @Test(timeout = 4000)
-  public void test09()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("pE|b");
-      Connection connection0 = mock(Connection.class, new ViolatedAssumptionAnswer());
-      doReturn((String) null).when(connection0).toString();
-      PrivateAccess.setVariable((Class<URNResource>) URNResource.class, uRNResource0, "conn", (Object) connection0);
-      Connection connection1 = uRNResource0.getDBConnection();
-      assertSame(connection1, connection0);
-  }
-
-  @Test(timeout = 4000)
-  public void test10()  throws Throwable  {
-      URNResource uRNResource0 = new URNResource("pE|b");
-      ResultSet resultSet0 = mock(ResultSet.class, new ViolatedAssumptionAnswer());
-      doReturn(false).when(resultSet0).next();
-      PreparedStatement preparedStatement0 = mock(PreparedStatement.class, new ViolatedAssumptionAnswer());
-      doReturn(resultSet0).when(preparedStatement0).executeQuery();
-      Connection connection0 = mock(Connection.class, new ViolatedAssumptionAnswer());
-      doReturn("").when(connection0).toString();
-      doReturn(preparedStatement0).when(connection0).prepareStatement(anyString());
-      PrivateAccess.setVariable((Class<URNResource>) URNResource.class, uRNResource0, "conn", (Object) connection0);
-      List<URNData> list0 = uRNResource0.getUrnDataMap();
-      assertTrue(list0.isEmpty());
-  }
-}
diff --git a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNResourceESTestscaffolding.java b/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNResourceESTestscaffolding.java
deleted file mode 100644
index 33171b9..0000000
--- a/bpmn/MSOURN-plugin/src/test/java/org/openecomp/camunda/bpmn/plugin/urnmap/resources/URNResourceESTestscaffolding.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/**
- * Scaffolding file used to store all the setups needed to run 
- * tests automatically generated by EvoSuite
- * Mon Nov 14 13:47:41 GMT 2016
- */
-
-package org.openecomp.camunda.bpmn.plugin.urnmap.resources;
-
-import org.evosuite.runtime.annotation.EvoSuiteClassExclude;
-import org.junit.BeforeClass;
-import org.junit.Before;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.evosuite.runtime.sandbox.Sandbox;
-
-@EvoSuiteClassExclude
-public class URNResourceESTestscaffolding {
-
-  @org.junit.Rule 
-  public org.evosuite.runtime.vnet.NonFunctionalRequirementRule nfr = new org.evosuite.runtime.vnet.NonFunctionalRequirementRule();
-
-  private static final java.util.Properties defaultProperties = (java.util.Properties) java.lang.System.getProperties().clone(); 
-
-  private org.evosuite.runtime.thread.ThreadStopper threadStopper =  new org.evosuite.runtime.thread.ThreadStopper (org.evosuite.runtime.thread.KillSwitchHandler.getInstance(), 3000);
-
-  @BeforeClass 
-  public static void initEvoSuiteFramework() { 
-    org.evosuite.runtime.RuntimeSettings.className = "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNResource"; 
-    org.evosuite.runtime.GuiSupport.initialize(); 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfThreads = 100; 
-    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationsPerLoop = 10000; 
-    org.evosuite.runtime.RuntimeSettings.mockSystemIn = true; 
-    org.evosuite.runtime.RuntimeSettings.sandboxMode = org.evosuite.runtime.sandbox.Sandbox.SandboxMode.RECOMMENDED; 
-    org.evosuite.runtime.sandbox.Sandbox.initializeSecurityManagerForSUT(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.init(); 
-    initializeClasses();
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-  } 
-
-  @AfterClass 
-  public static void clearEvoSuiteFramework(){ 
-    Sandbox.resetDefaultSecurityManager(); 
-    java.lang.System.setProperties((java.util.Properties) defaultProperties.clone()); 
-  } 
-
-  @Before 
-  public void initTestCase(){ 
-    threadStopper.storeCurrentThreads();
-    threadStopper.startRecordingTime();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().initHandler(); 
-    org.evosuite.runtime.sandbox.Sandbox.goingToExecuteSUTCode(); 
-     
-    org.evosuite.runtime.GuiSupport.setHeadless(); 
-    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.activate(); 
-  } 
-
-  @After 
-  public void doneWithTestCase(){ 
-    threadStopper.killAndJoinClientThreads();
-    org.evosuite.runtime.jvm.ShutdownHookHandler.getInstance().safeExecuteAddedHooks(); 
-    org.evosuite.runtime.classhandling.JDKClassResetter.reset(); 
-    resetClasses(); 
-    org.evosuite.runtime.sandbox.Sandbox.doneWithExecutingSUTCode(); 
-    org.evosuite.runtime.agent.InstrumentingAgent.deactivate(); 
-    org.evosuite.runtime.GuiSupport.restoreHeadlessMode(); 
-  } 
-
-
-  private static void initializeClasses() {
-    org.evosuite.runtime.classhandling.ClassStateSupport.initializeClasses(URNResourceESTestscaffolding.class.getClassLoader() ,
-      "org.h2.store.LobStorage",
-      "com.mysql.jdbc.VersionedStringProperty",
-      "com.mysql.jdbc.StatementInterceptorV2",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty",
-      "org.h2.engine.SessionInterface",
-      "org.h2.index.BaseIndex",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$LongConnectionProperty",
-      "org.h2.store.fs.FileNioMemData",
-      "org.h2.store.fs.FileNioMem",
-      "org.h2.store.fs.FilePathCrypt$FileCrypt",
-      "org.h2.result.Row",
-      "org.h2.engine.RightOwner",
-      "org.h2.table.TableView",
-      "com.mysql.jdbc.JDBC4ClientInfoProvider",
-      "com.mysql.jdbc.CachedResultSetMetaData",
-      "org.h2.store.fs.FileMem$1",
-      "com.mysql.jdbc.ConnectionFeatureNotAvailableException",
-      "org.h2.security.BlockCipher",
-      "org.h2.command.CommandInterface",
-      "com.mysql.jdbc.MysqlIO",
-      "com.mysql.jdbc.Connection",
-      "com.att.eelf.i18n.EELFMsgs",
-      "com.mysql.jdbc.ConnectionPropertiesImpl",
-      "org.h2.constant.DbSettings",
-      "com.mysql.jdbc.SingleByteCharsetConverter",
-      "com.mysql.jdbc.PingTarget",
-      "org.h2.index.PageIndex",
-      "org.h2.util.BitField",
-      "org.h2.value.ValueNull",
-      "org.h2.value.ValueShort",
-      "com.mysql.jdbc.SocketFactory",
-      "org.h2.value.ValueDecimal",
-      "com.mysql.jdbc.PacketTooBigException",
-      "com.mysql.jdbc.log.StandardLogger",
-      "com.mysql.jdbc.ConnectionImpl$3",
-      "com.mysql.jdbc.ConnectionImpl$2",
-      "com.mysql.jdbc.ConnectionImpl$5",
-      "com.mysql.jdbc.ConnectionImpl$4",
-      "com.mysql.jdbc.ConnectionImpl$7",
-      "com.mysql.jdbc.ConnectionImpl$6",
-      "org.h2.util.SmallLRUCache",
-      "org.h2.mvstore.Chunk",
-      "com.mysql.jdbc.ConnectionImpl$9",
-      "com.mysql.jdbc.ConnectionImpl$8",
-      "com.mysql.jdbc.log.Log",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$MemorySizeConnectionProperty",
-      "com.mysql.jdbc.StringUtils",
-      "org.h2.mvstore.MVStore",
-      "org.h2.engine.DbObjectBase",
-      "org.h2.store.FileLock",
-      "com.mysql.jdbc.ResultSetImpl",
-      "org.h2.schema.Sequence",
-      "org.h2.value.Value",
-      "org.h2.store.fs.FilePathMem",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty",
-      "org.h2.store.fs.FilePath",
-      "org.h2.engine.DatabaseCloser",
-      "org.h2.expression.ExpressionColumn",
-      "com.mysql.jdbc.Statement",
-      "com.mysql.jdbc.Buffer",
-      "org.h2.store.fs.FilePathNioMem",
-      "com.mysql.jdbc.ParameterBindings",
-      "org.h2.security.SecureFileStore",
-      "org.h2.store.fs.FileMem",
-      "com.mysql.jdbc.BufferRow",
-      "org.h2.expression.Expression",
-      "org.h2.store.fs.FileSplit",
-      "org.h2.util.Utils$1",
-      "org.h2.value.CompareMode",
-      "org.h2.util.Utils",
-      "com.mysql.jdbc.exceptions.MySQLTimeoutException",
-      "org.h2.command.dml.SetTypes",
-      "org.openecomp.mso.logger.MsoLogger$ErrorCode",
-      "org.h2.jdbcx.JdbcDataSourceFactory",
-      "com.mysql.jdbc.Util",
-      "org.camunda.bpm.cockpit.Cockpit",
-      "org.h2.value.ValueString",
-      "org.h2.value.ValueJavaObject",
-      "org.h2.store.PageStore",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$XmlMap",
-      "org.h2.schema.Schema",
-      "org.h2.engine.SettingsBase",
-      "com.mysql.jdbc.CommunicationsException",
-      "org.h2.value.CompareModeDefault",
-      "org.h2.engine.SessionWithState",
-      "org.h2.table.TableLinkConnection",
-      "org.h2.message.Trace",
-      "org.h2.engine.Comment",
-      "org.h2.util.New",
-      "org.camunda.bpm.engine.ProcessEngine",
-      "org.h2.value.ValueInt",
-      "org.h2.util.CacheWriter",
-      "com.mysql.jdbc.CompressedInputStream",
-      "org.h2.result.ResultInterface",
-      "org.h2.util.StringUtils",
-      "org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource",
-      "org.h2.table.IndexColumn",
-      "org.openecomp.mso.logger.MsoLogger$Catalog",
-      "org.h2.value.CompareModeIcu4J",
-      "com.mysql.jdbc.ResultSetRow",
-      "com.mysql.jdbc.ConnectionImpl",
-      "com.mysql.jdbc.log.NullLogger",
-      "org.camunda.bpm.cockpit.db.QueryService",
-      "org.camunda.bpm.engine.ProcessEngineServices",
-      "com.mysql.jdbc.JDBC4PreparedStatement",
-      "org.h2.schema.SchemaObject",
-      "org.h2.store.FileStore",
-      "org.h2.engine.SessionRemote",
-      "org.h2.value.ValueUuid",
-      "org.h2.mvstore.type.DataType",
-      "org.h2.index.IndexType",
-      "org.h2.value.ValueDate",
-      "org.h2.result.SearchRow",
-      "org.h2.table.Table",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.db.URNData",
-      "org.h2.store.fs.FileMemData",
-      "org.h2.value.ValueFloat",
-      "org.openecomp.mso.entity.MsoRequest",
-      "org.camunda.bpm.webapp.AppRuntimeDelegate",
-      "org.h2.value.Transfer",
-      "com.mysql.jdbc.Messages",
-      "org.h2.store.fs.FileDisk",
-      "com.mysql.jdbc.NetworkResources",
-      "org.h2.result.RowList",
-      "com.mysql.jdbc.CallableStatement$CallableStatementParamInfo",
-      "org.h2.constant.ErrorCode",
-      "com.mysql.jdbc.Collation",
-      "org.h2.message.TraceObject",
-      "com.mysql.jdbc.ByteArrayRow",
-      "org.h2.store.fs.FileChannelOutputStream",
-      "org.h2.value.ValueBoolean",
-      "org.h2.value.ValueLobDb",
-      "org.h2.util.SourceCompiler",
-      "org.h2.engine.UserDataType",
-      "org.h2.constraint.Constraint",
-      "org.h2.table.TableBase",
-      "org.h2.jdbcx.JdbcConnectionPool",
-      "com.mysql.jdbc.authentication.Sha256PasswordPlugin",
-      "org.h2.value.ValueLong",
-      "org.h2.engine.DbObject",
-      "com.mysql.jdbc.JDBC4CallableStatement",
-      "org.h2.util.SortedProperties",
-      "org.h2.value.ValueStringIgnoreCase",
-      "org.h2.table.PlanItem",
-      "org.h2.jdbcx.JdbcXAConnection",
-      "org.h2.engine.UserAggregate",
-      "org.h2.message.DbException",
-      "com.mysql.jdbc.JDBC4ServerPreparedStatement",
-      "org.h2.mvstore.MVMapConcurrent",
-      "com.mysql.jdbc.Extension",
-      "org.hsqldb.jdbc.JDBCDriver",
-      "org.h2.engine.Database",
-      "org.h2.api.DatabaseEventListener",
-      "org.h2.jdbcx.JdbcDataSource",
-      "org.h2.schema.TriggerObject",
-      "org.h2.store.DataReader",
-      "com.mysql.jdbc.StatementImpl",
-      "org.hsqldb.jdbc.JDBCDriver$1",
-      "org.h2.value.ValueBytes",
-      "org.h2.value.ValueResultSet",
-      "com.att.eelf.i18n.EELFResolvableErrorEnum",
-      "org.h2.value.ValueDouble",
-      "com.mysql.jdbc.CallableStatement$CallableStatementParam",
-      "org.h2.schema.SchemaObjectBase",
-      "com.att.eelf.configuration.EELFLogger$Level",
-      "com.mysql.jdbc.StatementImpl$CancelTask$1",
-      "org.h2.mvstore.Page",
-      "org.h2.index.PageDelegateIndex",
-      "org.h2.store.fs.FileBase",
-      "com.mysql.jdbc.StatementImpl$CancelTask",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNResource",
-      "org.h2.message.TraceWriter",
-      "com.att.eelf.i18n.EELFResourceManager$RESOURCE_TYPES",
-      "com.att.eelf.configuration.EELFLogger",
-      "org.h2.table.Column",
-      "org.h2.engine.Session",
-      "org.h2.engine.Mode",
-      "com.mysql.jdbc.exceptions.MySQLTransientException",
-      "org.h2.engine.Setting",
-      "org.h2.util.SourceCompiler$1",
-      "org.h2.value.ValueArray",
-      "com.mysql.jdbc.MySQLConnection",
-      "org.h2.util.TempFileDeleter",
-      "org.h2.store.fs.FileNioMem$1",
-      "com.mysql.jdbc.AuthenticationPlugin",
-      "org.h2.util.MathUtils",
-      "org.h2.mvstore.DataUtils",
-      "org.h2.store.fs.FilePathSplit",
-      "org.h2.value.ValueStringFixed",
-      "com.mysql.jdbc.JDBC4Connection",
-      "com.mysql.jdbc.NonRegisteringDriver$1",
-      "org.h2.engine.User",
-      "org.h2.value.ValueTimestamp",
-      "org.h2.value.Value$ValueBlob",
-      "org.h2.store.fs.FilePathWrapper",
-      "org.h2.constant.SysProperties",
-      "com.mysql.jdbc.IterateBlock",
-      "org.h2.table.RegularTable",
-      "com.mysql.jdbc.Util$RandStructcture",
-      "org.h2.store.fs.FileChannelInputStream",
-      "com.mysql.jdbc.exceptions.MySQLStatementCancelledException",
-      "com.mysql.jdbc.PreparedStatement",
-      "org.h2.compress.Compressor",
-      "com.mysql.jdbc.util.LRUCache",
-      "com.mysql.jdbc.util.ReadAheadInputStream",
-      "org.h2.index.Index",
-      "com.mysql.jdbc.MysqlDataTruncation",
-      "com.mysql.jdbc.CharsetMapping",
-      "org.h2.store.fs.FilePathDisk",
-      "org.h2.mvstore.MVMap",
-      "com.mysql.jdbc.Field",
-      "com.att.eelf.configuration.SLF4jWrapper",
-      "com.mysql.jdbc.PreparedStatement$BatchVisitor",
-      "org.h2.store.DataHandler",
-      "org.h2.jdbc.JdbcConnection",
-      "org.openecomp.mso.logger.MsoLogger",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$StringConnectionProperty",
-      "com.mysql.jdbc.ConnectionProperties",
-      "org.h2.Driver",
-      "org.h2.engine.Role",
-      "com.mysql.jdbc.Driver",
-      "org.h2.value.ValueByte",
-      "com.mysql.jdbc.ServerPreparedStatement",
-      "org.camunda.bpm.cockpit.db.CommandExecutor",
-      "com.mysql.jdbc.exceptions.MySQLNonTransientException",
-      "org.camunda.bpm.cockpit.CockpitRuntimeDelegate",
-      "org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginResource",
-      "com.mysql.jdbc.MysqlSavepoint",
-      "com.mysql.jdbc.CallableStatement",
-      "com.mysql.jdbc.RowData",
-      "org.h2.value.Value$ValueClob",
-      "com.att.eelf.i18n.EELFResourceManager",
-      "org.h2.value.ValueJavaObject$NotSerialized",
-      "org.h2.value.CaseInsensitiveMap",
-      "com.mysql.jdbc.CallableStatement$CallableStatementParamInfoJDBC3",
-      "org.h2.util.IOUtils",
-      "com.mysql.jdbc.PreparedStatement$ParseInfo",
-      "org.h2.message.TraceSystem",
-      "org.openecomp.mso.logger.MessageEnum",
-      "org.openecomp.mso.logger.MsoLogger$ResponseCode",
-      "org.openecomp.mso.logger.MsoLogger$StatusCode",
-      "com.att.eelf.configuration.EELFManager",
-      "com.mysql.jdbc.StreamingNotifiable",
-      "com.mysql.jdbc.ResultSetInternalMethods",
-      "org.h2.command.Prepared",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$IntegerConnectionProperty",
-      "com.mysql.jdbc.NonRegisteringDriver",
-      "org.h2.jdbc.JdbcSQLException",
-      "org.h2.mvstore.MVMap$MapBuilder",
-      "org.h2.engine.ConnectionInfo",
-      "com.att.eelf.i18n.EELFResourceManager$1",
-      "com.mysql.jdbc.ExceptionInterceptor",
-      "org.h2.value.ValueTime"
-    );
-  } 
-
-  private static void resetClasses() {
-    org.evosuite.runtime.classhandling.ClassResetter.getInstance().setClassLoader(URNResourceESTestscaffolding.class.getClassLoader());
-
-    org.evosuite.runtime.classhandling.ClassStateSupport.resetClasses(
-      "org.openecomp.mso.logger.MsoLogger$Catalog",
-      "org.openecomp.mso.logger.MsoLogger",
-      "com.att.eelf.i18n.EELFResourceManager",
-      "com.att.eelf.i18n.EELFMsgs",
-      "com.att.eelf.i18n.EELFResourceManager$RESOURCE_TYPES",
-      "com.att.eelf.configuration.EELFLogger$Level",
-      "com.att.eelf.configuration.EELFManager",
-      "org.openecomp.mso.logger.MessageEnum",
-      "org.openecomp.camunda.bpmn.plugin.urnmap.resources.URNResource",
-      "org.camunda.bpm.cockpit.Cockpit",
-      "org.h2.jdbcx.JdbcConnectionPool",
-      "org.h2.message.TraceObject",
-      "com.mysql.jdbc.NonRegisteringDriver",
-      "com.mysql.jdbc.Driver",
-      "org.hsqldb.jdbc.JDBCDriver",
-      "org.h2.Driver",
-      "org.h2.jdbcx.JdbcDataSource",
-      "org.h2.jdbcx.JdbcDataSourceFactory",
-      "org.h2.message.TraceSystem",
-      "org.h2.util.Utils",
-      "org.h2.util.MathUtils",
-      "org.h2.constant.SysProperties",
-      "org.h2.message.Trace",
-      "org.h2.util.StringUtils",
-      "org.h2.value.Value",
-      "org.h2.value.ValueDecimal",
-      "org.h2.jdbcx.JdbcXAConnection",
-      "org.h2.mvstore.MVStore",
-      "com.mysql.jdbc.Messages",
-      "com.mysql.jdbc.ConnectionPropertiesImpl",
-      "com.mysql.jdbc.Util",
-      "com.mysql.jdbc.ConnectionImpl",
-      "com.mysql.jdbc.JDBC4Connection",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$IntegerConnectionProperty",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$MemorySizeConnectionProperty",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$StringConnectionProperty",
-      "com.mysql.jdbc.ConnectionPropertiesImpl$LongConnectionProperty",
-      "com.mysql.jdbc.StringUtils",
-      "com.mysql.jdbc.CharsetMapping",
-      "com.mysql.jdbc.log.StandardLogger",
-      "org.h2.engine.SessionRemote",
-      "org.h2.mvstore.DataUtils",
-      "org.h2.message.DbException",
-      "org.h2.constant.ErrorCode",
-      "org.h2.jdbc.JdbcSQLException",
-      "org.h2.command.dml.SetTypes",
-      "org.h2.engine.ConnectionInfo",
-      "org.h2.engine.Database",
-      "org.h2.util.BitField",
-      "org.h2.engine.Mode",
-      "org.h2.store.fs.FilePath",
-      "org.h2.store.fs.FilePathDisk",
-      "org.h2.store.fs.FilePathMem",
-      "org.h2.store.fs.FilePathNioMem",
-      "org.h2.store.fs.FilePathSplit",
-      "org.h2.constant.DbSettings",
-      "org.h2.value.CompareMode",
-      "org.h2.store.FileLock",
-      "org.h2.util.SortedProperties",
-      "org.h2.table.Table",
-      "com.mysql.jdbc.StatementImpl",
-      "com.mysql.jdbc.PreparedStatement",
-      "com.mysql.jdbc.MysqlIO",
-      "com.mysql.jdbc.CallableStatement"
-    );
-  }
-}
