diff --git a/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/ArtifactDaoTest.java b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/ArtifactDaoTest.java
new file mode 100644
index 0000000..aa9d30c
--- /dev/null
+++ b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/ArtifactDaoTest.java
@@ -0,0 +1,577 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.resources;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import javax.annotation.Resource;
+
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.dao.api.IGenericSearchDAO;
+import org.openecomp.sdc.be.dao.api.ResourceUploadStatus;
+import org.openecomp.sdc.be.dao.es.ElasticSearchClient;
+import org.openecomp.sdc.be.resources.api.IResourceUploader;
+import org.openecomp.sdc.be.resources.data.ESArtifactData;
+import org.openecomp.sdc.common.api.ConfigurationSource;
+import org.openecomp.sdc.common.impl.ExternalConfiguration;
+import org.openecomp.sdc.common.impl.FSConfigurationSource;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
+import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
+
+import fj.data.Either;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("classpath:application-context-test.xml")
+@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class,
+		DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class }) // ,
+																								// CassandraUnitTestExecutionListener.class})
+// @EmbeddedCassandra(host ="localhost", port=9042)
+public class ArtifactDaoTest {
+	private static final String TEST_IMAGES_DIRECTORY = "src/test/resources/images";
+
+	@Resource
+	ElasticSearchClient esclient;
+
+	/*
+	 * @Resource(name = "artifact-dao") private IArtifactDAO artifactDAO;
+	 */
+
+	@Resource(name = "resource-upload")
+	private IResourceUploader daoUploader;
+	ESArtifactData arData;
+
+	@Resource(name = "resource-dao")
+	private IGenericSearchDAO resourceDAO;
+
+	private String nodeType = "NodeType1";
+	private String nodeTypeVersion = "1.0.0";
+
+	private String nodeType2 = "NodeType2";
+	private String nodeTypeVersion2 = "1.0.1";
+
+	private String nodeType3 = "NodeType3";
+	private String nodeNypeVersion3 = "1.1.1";
+
+	private String topologyId = "topology";
+	private String topologyTemplateName = "topologyTemplate";
+	private String topologyTemplateVersion = "1.1.1";
+
+	private String nodeTypeTemplate1 = "NodeTypeTemplate1";
+	private String nodeTypeTemplate2 = "NodeTypeTemplate2";
+	private String nodeTypeTemplate3 = "NodeTypeTemplate3";
+
+	private static ConfigurationManager configurationManager;
+
+	@Before
+	public void before() {
+		// try {
+		// clearIndex(ICatalogDAO.RESOURCES_INDEX, ArtifactData.class);
+		// clearIndex(ICatalogDAO.RESOURCES_INDEX, ServiceArtifactData.class);
+		// } catch (InterruptedException e) {
+		// TODO Auto-generated catch block
+		// e.printStackTrace();
+		// }
+
+	}
+
+	@BeforeClass
+	public static void setupBeforeClass() {
+		ExternalConfiguration.setAppName("catalog-dao");
+		String appConfigDir = "src/test/resources/config/catalog-dao";
+		ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(),
+				appConfigDir);
+		configurationManager = new ConfigurationManager(configurationSource);
+	}
+
+	// @Before
+	// public void createSchema(){
+	// SdcSchemaBuilder.createSchema();
+	// }
+	//
+
+	@Test
+	public void testSaveNewArtifact() {
+		// daoUploader = new ArtifactUploader(artifactDAO);
+		if (daoUploader == null) {
+			assertTrue(false);
+		}
+		String strData = "qweqwqweqw34e4wrwer";
+
+		String myNodeType = "MyNewNodeType";
+
+		ESArtifactData arData = new ESArtifactData("artifactNewMarina11", strData.getBytes());
+
+		ResourceUploadStatus status = daoUploader.saveArtifact(arData, true);
+
+		assertEquals(status, ResourceUploadStatus.OK);
+
+		daoUploader.deleteArtifact(arData.getId());
+
+	}
+
+	/*
+	 * @Test public void testSaveNewImage(){
+	 * 
+	 * Path iconPath = Paths.get(TEST_IMAGES_DIRECTORY, "apache.png");
+	 * 
+	 * ImageData imageData = new ImageData(); try {
+	 * imageData.setData(Files.readAllBytes(iconPath));
+	 * imageData.setComponentName("ComponentMarina");
+	 * imageData.setComponentVersion("v.1.0");
+	 * imageData.setArtifactName("apache.png");
+	 * imageData.setResourceCreator("Marina");
+	 * imageData.setResourceLastUpdater("Marina"); ResourceUploadStatus status =
+	 * daoUploader.saveImage(imageData, true); assertEquals(status,
+	 * ResourceUploadStatus.OK); } catch (IOException e) { // TODO
+	 * Auto-generated catch block e.printStackTrace(); }
+	 * 
+	 * 
+	 * }
+	 */
+
+	// @Test
+	// public void testGetArtifactsList() {
+	// //daoUploader = new ArtifactUploader(artifactDAO);
+	// if(daoUploader==null){
+	// assertTrue(false);
+	// }
+	// String myNodeType = "MyListNodeType";
+	//
+	//
+	//
+	// //resourceDAO.save(indexedNodeType);
+	//
+	// String strData = "qweqwqweqw34e4wrwer";
+	// ESArtifactData arData1 = new ESArtifactData("artifactNewMarina_1",
+	// strData.getBytes());
+	//
+	//
+	// ResourceUploadStatus status = daoUploader.saveArtifact(arData1, true);
+	// assertEquals(status, ResourceUploadStatus.OK);
+	//
+	// ESArtifactData arData2 = new ESArtifactData("artifactNewMarina_2",
+	// strData.getBytes());
+	//
+	//
+	// status = daoUploader.saveArtifact(arData2, true);
+	// assertEquals(status, ResourceUploadStatus.OK);
+	//
+	// ESArtifactData arData3 = new ESArtifactData("artifactNewMarina_3",
+	// strData.getBytes());
+	//
+	//
+	// status = daoUploader.saveArtifact(arData3, true);
+	// assertEquals(status, ResourceUploadStatus.OK);
+	//
+	//
+	//
+	// Either<List<ESArtifactData>, ResourceUploadStatus> arrArray =
+	// daoUploader.getArtifacts(myNodeType, nodeTypeVersion);
+	// assertTrue(arrArray.isLeft());
+	//
+	// assertEquals(3, arrArray.left().value().size());
+	//
+	// daoUploader.deleteArtifact(arData1.getId());
+	// daoUploader.deleteArtifact(arData2.getId());
+	// daoUploader.deleteArtifact(arData3.getId());
+	//
+	// //resourceDAO.delete(IndexedNodeType.class, indexedNodeType.getId());
+	//
+	// }
+	//
+
+	/*
+	 * @Test public void testGetSeviceArtifactsList() {
+	 * 
+	 * if(daoUploader==null){ assertTrue(false); } String strData =
+	 * "qweqwqweqw34e4wrwer";
+	 * 
+	 * ServiceArtifactData serviceArData = new
+	 * ServiceArtifactData("serviceArData", topologyTemplateName,
+	 * topologyTemplateVersion, nodeTypeTemplate1, nodeType, nodeTypeVersion,
+	 * "YANG", strData.getBytes(), strData.getBytes(), "Marina", null);
+	 * //serviceArData.setRefArtifactId(arData.getId()); ResourceUploadStatus
+	 * status = daoUploader.saveServiceArtifact(serviceArData, true);
+	 * 
+	 * ServiceArtifactData serviceArData1 = new
+	 * ServiceArtifactData("serviceArData1", topologyTemplateName,
+	 * topologyTemplateVersion, nodeTypeTemplate2, nodeType2, nodeTypeVersion2,
+	 * "YANG", strData.getBytes(), strData.getBytes(), "Marina", null);
+	 * //serviceArData1.setRefArtifactId(arData4.getId()); status =
+	 * daoUploader.saveServiceArtifact(serviceArData1, true);
+	 * ServiceArtifactData getServiceData =
+	 * daoUploader.getServiceArtifact(serviceArData.getId()).left().value();
+	 * 
+	 * List<ServiceArtifactData> arrArray =
+	 * daoUploader.getServiceArtifacts(topologyTemplateName,
+	 * topologyTemplateVersion).left().value();
+	 * 
+	 * assertEquals(2, arrArray.size());
+	 * 
+	 * daoUploader.deleteArtifact(serviceArData.getId());
+	 * daoUploader.deleteArtifact(serviceArData1.getId());
+	 * 
+	 * 
+	 * }
+	 */
+
+	@Test
+	public void testGetArtifact() {
+
+		String myNodeType = "MyNodeType";
+
+		// resourceDAO.save(indexedNodeType);
+		ESArtifactData arData = getArtifactData(myNodeType, nodeTypeVersion);
+
+		ESArtifactData getData = null;
+		Either<ESArtifactData, ResourceUploadStatus> getArtifactStatus = daoUploader
+				.getArtifact(myNodeType + "- dassasd" + ":" + nodeTypeVersion + ":updatedArtifact");
+		if (getArtifactStatus.isRight()) {
+			daoUploader.saveArtifact(arData, true);
+			getArtifactStatus = daoUploader.getArtifact(arData.getId());
+		}
+		assertNotNull(getArtifactStatus.left().value());
+
+	}
+
+	/*
+	 * @Test public void testGetSeviceArtifact() {
+	 * 
+	 * ServiceArtifactData servArData = getServiceArtifactData();
+	 * 
+	 * Either<ServiceArtifactData, ResourceUploadStatus>
+	 * getServiceArtifactStatus =
+	 * daoUploader.getServiceArtifact("MyService:v.1.1:updatedServiceArtifact");
+	 * if (!getServiceArtifactStatus.isLeft()){
+	 * daoUploader.saveServiceArtifact(servArData, true);
+	 * getServiceArtifactStatus =
+	 * daoUploader.getServiceArtifact(servArData.getId()); }
+	 * 
+	 * assertNotNull(getServiceArtifactStatus.left().value());
+	 * 
+	 * daoUploader.deleteArtifact(getServiceArtifactStatus.left().value().getId(
+	 * ));
+	 * 
+	 * 
+	 * }
+	 */
+
+	/*
+	 * @Test public void testGetSeviceArtifactsCollection() {
+	 * 
+	 * prepareTopolgyService(); prepareTestTopolgyService();
+	 * Either<ServiceArtifactsDataCollection, ResourceUploadStatus>
+	 * getServiceArtifactsCollectionStatus =
+	 * daoUploader.getServiceArtifactsCollection(topologyTemplateName,
+	 * topologyTemplateVersion); ServiceArtifactsDataCollection serviceAtrifacts
+	 * = getServiceArtifactsCollectionStatus.left().value();
+	 * 
+	 * Map<String, List<ArtifactData>> map =
+	 * serviceAtrifacts.getServiceArtifactDataMap();
+	 * 
+	 * List<ArtifactData> list = map.get(nodeType); assertNotNull(list);
+	 * assertEquals(2, list.size());
+	 * 
+	 * 
+	 * list = map.get(nodeTypeTemplate1 ); assertNotNull(list); assertEquals(1,
+	 * list.size());
+	 * 
+	 * list = map.get(nodeTypeTemplate2 ); assertNotNull(list); assertEquals(1,
+	 * list.size());
+	 * 
+	 * 
+	 * }
+	 */
+
+	@Test
+	public void testUpdateArtifact() {
+		// daoUploader = new ArtifactUploader(artifactDAO);
+		if (daoUploader == null) {
+			assertTrue(false);
+		}
+		ResourceUploadStatus status = ResourceUploadStatus.OK;
+
+		String myNodeType = "MyUpdatedNodeType";
+
+		// resourceDAO.save(indexedNodeType);
+
+		ESArtifactData arData = getArtifactData(myNodeType, nodeTypeVersion);
+		Either<ESArtifactData, ResourceUploadStatus> getArtifactStatus = daoUploader.getArtifact(arData.getId());
+
+		if (!getArtifactStatus.isLeft())
+			status = daoUploader.saveArtifact(arData, false);
+
+		String payload1 = "new payloadjfdsgh";
+		arData.setDataAsArray(payload1.getBytes());
+
+		status = daoUploader.updateArtifact(arData);
+
+		assertEquals(status, ResourceUploadStatus.OK);
+		// resourceDAO.delete(IndexedNodeType.class, indexedNodeType.getId());
+
+	}
+
+	private ESArtifactData getArtifactData(String componentName, String componentVersion) {
+		String strData = "qweqwqweqw34e4wrwer";
+		ESArtifactData arData = new ESArtifactData("updatedArtifact", strData.getBytes());
+
+		return arData;
+	}
+
+	/*
+	 * private ServiceArtifactData getServiceArtifactData(){ String strData =
+	 * "qweqwqweqw34e4wrwer"; ServiceArtifactData arData = new
+	 * ServiceArtifactData("updatedServiceArtifact", "MyService", "v.1.1",
+	 * "MyComponentTemplate", "MyComponent", "v.1.1", "YANG",
+	 * strData.getBytes(), strData.getBytes(), "Marina", null);
+	 * 
+	 * return arData; }
+	 */
+
+	/*
+	 * private void prepareTopolgyService(){
+	 * 
+	 * List<String> listCap = new ArrayList<String>(); listCap.add("very_evil");
+	 * List<String> listCap1 = new ArrayList<String>(); listCap.add("evil");
+	 * try{ // Initialize test data IndexedNodeType indexedNodeType = new
+	 * IndexedNodeType(); CSARDependency dep = new CSARDependency();
+	 * dep.setName(nodeType); dep.setVersion(nodeTypeVersion);
+	 * indexedNodeType.setElementId(nodeType);
+	 * indexedNodeType.setArchiveName(nodeType);
+	 * indexedNodeType.setArchiveVersion(nodeTypeVersion);
+	 * indexedNodeType.setCreationDate(new Date());
+	 * indexedNodeType.setLastUpdateDate(new Date());
+	 * indexedNodeType.setDefaultCapabilities(listCap);
+	 * resourceDAO.save(indexedNodeType);
+	 * 
+	 * 
+	 * IndexedNodeType indexedNodeType1 = new IndexedNodeType();
+	 * indexedNodeType1.setElementId(nodeType2);
+	 * indexedNodeType1.setArchiveName(nodeType2);
+	 * indexedNodeType1.setArchiveVersion(nodeTypeVersion2); CSARDependency dep1
+	 * = new CSARDependency(); dep1.setName(nodeType2);
+	 * dep1.setVersion(nodeTypeVersion2); indexedNodeType1.setCreationDate(new
+	 * Date()); indexedNodeType1.setLastUpdateDate(new Date());
+	 * indexedNodeType1.setDefaultCapabilities(listCap1);
+	 * resourceDAO.save(indexedNodeType1);
+	 * 
+	 * 
+	 * indexedNodeType.setElementId(nodeType3);
+	 * indexedNodeType.setArchiveName(nodeType3);
+	 * indexedNodeType.setArchiveVersion(nodeNypeVersion3); CSARDependency dep2
+	 * = new CSARDependency(); dep2.setName(nodeType3);
+	 * dep2.setVersion(nodeNypeVersion3); indexedNodeType.setCreationDate(new
+	 * Date()); indexedNodeType.setLastUpdateDate(new Date());
+	 * indexedNodeType.setDefaultCapabilities(null);
+	 * resourceDAO.save(indexedNodeType); String osgiliath100Id =
+	 * indexedNodeType.getId();
+	 * 
+	 * Topology topology = new Topology(); topology.setId(topologyId);
+	 * Set<CSARDependency> dependencies = new HashSet<CSARDependency>();
+	 * dependencies.add(dep); dependencies.add(dep2); dependencies.add(dep1);
+	 * topology.setDependencies(dependencies); Map<String, NodeTemplate>
+	 * nodeTemplates = new HashMap <String, NodeTemplate>();
+	 * 
+	 * NodeTemplate template1 = new NodeTemplate(nodeType, null, null, null,
+	 * null, null, null); template1.setName(nodeTypeTemplate1);
+	 * nodeTemplates.put(nodeTypeTemplate1, template1 );
+	 * 
+	 * NodeTemplate template2 = new NodeTemplate(nodeType2, null, null, null,
+	 * null, null, null); template2.setName(nodeTypeTemplate2 );
+	 * nodeTemplates.put(nodeTypeTemplate2, template2 );
+	 * 
+	 * NodeTemplate template3 = new NodeTemplate(nodeType, null, null, null,
+	 * null, null, null); template3.setName(nodeTypeTemplate3 );
+	 * nodeTemplates.put(nodeTypeTemplate3, template3);
+	 * 
+	 * topology.setNodeTemplates(nodeTemplates); resourceDAO.save(topology);
+	 * 
+	 * TopologyTemplate topologyTemplate = new TopologyTemplate();
+	 * topologyTemplate.setId(topologyTemplateName);
+	 * topologyTemplate.setName(topologyTemplateName);
+	 * topologyTemplate.setTopologyId(topology.getId());
+	 * topologyTemplate.setDescription("my topology template");
+	 * resourceDAO.save(topologyTemplate);
+	 * 
+	 * String strData = "qweqwqweqw34e4wrwer"; ArtifactData arData = new
+	 * ArtifactData("artifact1", nodeType, nodeTypeVersion, "YANG",
+	 * strData.getBytes(), strData.getBytes(), "Marina"); ArtifactData arData1 =
+	 * new ArtifactData("artifact2", nodeType, nodeTypeVersion, "YANG",
+	 * strData.getBytes(), strData.getBytes(), "Marina"); ResourceUploadStatus
+	 * status = daoUploader.saveArtifact(arData, true); status =
+	 * daoUploader.saveArtifact(arData1, true);
+	 * 
+	 * ArtifactData arData3 = new ArtifactData("artifact1", nodeType2,
+	 * nodeTypeVersion2, "YANG", strData.getBytes(), strData.getBytes(),
+	 * "Marina"); status = daoUploader.saveArtifact(arData3, true);
+	 * 
+	 * ArtifactData arData4 = new ArtifactData("artifact2", nodeType2,
+	 * nodeTypeVersion2, "YANG", strData.getBytes(), strData.getBytes(),
+	 * "Marina"); status = daoUploader.saveArtifact(arData4, true);
+	 * 
+	 * ServiceArtifactData serviceArData = new
+	 * ServiceArtifactData("serviceArData", topologyTemplateName,
+	 * topologyTemplateVersion, nodeTypeTemplate1, nodeType, nodeTypeVersion,
+	 * "YANG", strData.getBytes(), strData.getBytes(), "Marina",
+	 * arData.getId());
+	 * 
+	 * status = daoUploader.saveServiceArtifact(serviceArData, true);
+	 * 
+	 * ServiceArtifactData serviceArData1 = new
+	 * ServiceArtifactData("serviceArData1", topologyTemplateName,
+	 * topologyTemplateVersion, nodeTypeTemplate2, nodeType2, nodeTypeVersion2,
+	 * "YANG", strData.getBytes(), strData.getBytes(), "Marina",
+	 * arData4.getId());
+	 * 
+	 * status = daoUploader.saveServiceArtifact(serviceArData1, true);
+	 * 
+	 * 
+	 * } catch (Exception e) { // TODO Auto-generated catch block
+	 * e.printStackTrace(); }
+	 * 
+	 * }
+	 * 
+	 * private void prepareTestTopolgyService(){
+	 * 
+	 * List<String> listCap = new ArrayList<String>();
+	 * listCap.add("very_evil test"); List<String> listCap1 = new
+	 * ArrayList<String>(); listCap.add("evil test"); try{ // Initialize test
+	 * data IndexedNodeType indexedNodeType = new IndexedNodeType();
+	 * CSARDependency dep = new CSARDependency(); dep.setName(nodeType +
+	 * " test"); dep.setVersion(nodeTypeVersion);
+	 * indexedNodeType.setElementId(nodeType + " test");
+	 * indexedNodeType.setArchiveName(nodeType + " test");
+	 * indexedNodeType.setArchiveVersion(nodeTypeVersion);
+	 * indexedNodeType.setCreationDate(new Date());
+	 * indexedNodeType.setLastUpdateDate(new Date());
+	 * indexedNodeType.setDefaultCapabilities(listCap);
+	 * resourceDAO.save(indexedNodeType);
+	 * 
+	 * 
+	 * IndexedNodeType indexedNodeType1 = new IndexedNodeType();
+	 * indexedNodeType1.setElementId(nodeType2 + " test");
+	 * indexedNodeType1.setArchiveName(nodeType2 + " test");
+	 * indexedNodeType1.setArchiveVersion(nodeTypeVersion2); CSARDependency dep1
+	 * = new CSARDependency(); dep1.setName(nodeType2 + " test");
+	 * dep1.setVersion(nodeTypeVersion2); indexedNodeType1.setCreationDate(new
+	 * Date()); indexedNodeType1.setLastUpdateDate(new Date());
+	 * indexedNodeType1.setDefaultCapabilities(listCap1);
+	 * resourceDAO.save(indexedNodeType1);
+	 * 
+	 * 
+	 * indexedNodeType.setElementId(nodeType3 + " test");
+	 * indexedNodeType.setArchiveName(nodeType3 + " test");
+	 * indexedNodeType.setArchiveVersion(nodeNypeVersion3); CSARDependency dep2
+	 * = new CSARDependency(); dep2.setName(nodeType3 + " test");
+	 * dep2.setVersion(nodeNypeVersion3); indexedNodeType.setCreationDate(new
+	 * Date()); indexedNodeType.setLastUpdateDate(new Date());
+	 * indexedNodeType.setDefaultCapabilities(null);
+	 * resourceDAO.save(indexedNodeType); String osgiliath100Id =
+	 * indexedNodeType.getId();
+	 * 
+	 * Topology topology = new Topology(); topology.setId(topologyId + " test");
+	 * Set<CSARDependency> dependencies = new HashSet<CSARDependency>();
+	 * dependencies.add(dep); dependencies.add(dep2); dependencies.add(dep1);
+	 * topology.setDependencies(dependencies); Map<String, NodeTemplate>
+	 * nodeTemplates = new HashMap <String, NodeTemplate>();
+	 * 
+	 * NodeTemplate template1 = new NodeTemplate(nodeType + " test", null, null,
+	 * null, null, null, null); template1.setName(nodeTypeTemplate1 + " test");
+	 * nodeTemplates.put(nodeTypeTemplate1 + " test", template1 );
+	 * 
+	 * NodeTemplate template2 = new NodeTemplate(nodeType2 + " test", null,
+	 * null, null, null, null, null); template2.setName(nodeTypeTemplate2 +
+	 * " test" ); nodeTemplates.put(nodeTypeTemplate2 + " test", template2 );
+	 * 
+	 * NodeTemplate template3 = new NodeTemplate(nodeType, null, null, null,
+	 * null, null, null); template3.setName(nodeTypeTemplate3 + " test" );
+	 * nodeTemplates.put(nodeTypeTemplate3 + " test", template3);
+	 * 
+	 * topology.setNodeTemplates(nodeTemplates); resourceDAO.save(topology);
+	 * 
+	 * TopologyTemplate topologyTemplate = new TopologyTemplate();
+	 * topologyTemplate.setId(topologyTemplateName + " test");
+	 * topologyTemplate.setName(topologyTemplateName + " test");
+	 * topologyTemplate.setTopologyId(topology.getId());
+	 * topologyTemplate.setDescription("my topology template");
+	 * resourceDAO.save(topologyTemplate);
+	 * 
+	 * String strData = "qweqwqweqw34e4wrwer"; ArtifactData arData = new
+	 * ArtifactData("artifact1 test", nodeType + " test", nodeTypeVersion,
+	 * "YANG", strData.getBytes(), strData.getBytes(), "Marina"); ArtifactData
+	 * arData1 = new ArtifactData("artifact2 test", nodeType + " test",
+	 * nodeTypeVersion, "YANG", strData.getBytes(), strData.getBytes(),
+	 * "Marina"); ResourceUploadStatus status = daoUploader.saveArtifact(arData,
+	 * true); status = daoUploader.saveArtifact(arData1, true);
+	 * 
+	 * ArtifactData arData3 = new ArtifactData("artifact1 test", nodeType2 +
+	 * " test", nodeTypeVersion2, "YANG", strData.getBytes(),
+	 * strData.getBytes(), "Marina"); status = daoUploader.saveArtifact(arData3,
+	 * true);
+	 * 
+	 * ArtifactData arData4 = new ArtifactData("artifact2 test", nodeType2 +
+	 * " test", nodeTypeVersion2, "YANG", strData.getBytes(),
+	 * strData.getBytes(), "Marina"); status = daoUploader.saveArtifact(arData4,
+	 * true);
+	 * 
+	 * ServiceArtifactData serviceArData = new
+	 * ServiceArtifactData("serviceArData test" , topologyTemplateName +
+	 * " test", topologyTemplateVersion, nodeTypeTemplate1 + " test", nodeType +
+	 * " test", nodeTypeVersion, "YANG", strData.getBytes(), strData.getBytes(),
+	 * "Marina", arData.getId());
+	 * 
+	 * status = daoUploader.saveServiceArtifact(serviceArData, true);
+	 * 
+	 * ServiceArtifactData serviceArData1 = new
+	 * ServiceArtifactData("serviceArData1 test", topologyTemplateName +
+	 * " test", topologyTemplateVersion, nodeTypeTemplate2 + " test", nodeType2
+	 * + " test", nodeTypeVersion2, "YANG", strData.getBytes(),
+	 * strData.getBytes(), "Marina", arData4.getId());
+	 * 
+	 * status = daoUploader.saveServiceArtifact(serviceArData1, true);
+	 * 
+	 * 
+	 * } catch (Exception e) { // TODO Auto-generated catch block
+	 * e.printStackTrace(); }
+	 * 
+	 * }
+	 */
+
+	private void clearIndex(String indexName, Class<?> clazz) throws InterruptedException {
+
+		DeleteIndexResponse actionGet = esclient.getClient().admin().indices().delete(new DeleteIndexRequest(indexName))
+				.actionGet();
+		assertTrue(actionGet.isAcknowledged());
+	}
+
+}
diff --git a/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/AuditingDaoTest.java b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/AuditingDaoTest.java
new file mode 100644
index 0000000..06d26f7
--- /dev/null
+++ b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/AuditingDaoTest.java
@@ -0,0 +1,463 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.resources;
+
+import fj.data.Either;
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.index.query.MatchAllQueryBuilder;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openecomp.sdc.be.config.Configuration;
+import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.config.Configuration.ElasticSearchConfig.IndicesTimeFrequencyEntry;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.es.ElasticSearchClient;
+import org.openecomp.sdc.be.dao.impl.AuditingDao;
+import org.openecomp.sdc.be.resources.data.auditing.*;
+import org.openecomp.sdc.common.api.ConfigurationSource;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
+import org.openecomp.sdc.common.datastructure.ESTimeBasedEvent;
+import org.openecomp.sdc.common.impl.ExternalConfiguration;
+import org.openecomp.sdc.common.impl.FSConfigurationSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
+import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("classpath:application-context-test.xml")
+@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class,
+		DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class })
+public class AuditingDaoTest {
+	private static Logger log = LoggerFactory.getLogger(AuditingDaoTest.class.getName());
+	@Resource(name = "elasticsearch-client")
+	private ElasticSearchClient esclient;
+
+	@Resource(name = "auditingDao")
+	private AuditingDao auditingDao;
+
+	private static ConfigurationManager configurationManager;
+	// private static Map<AuditingFieldsKeysEnum, String> auditField2esField;
+
+	@BeforeClass
+	public static void setupBeforeClass() {
+
+		ExternalConfiguration.setAppName("catalog-dao");
+		String appConfigDir = "src/test/resources/config/catalog-dao";
+		ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(),
+				appConfigDir);
+		configurationManager = new ConfigurationManager(configurationSource);
+		// initAudit2EsMap();
+	}
+
+	@After
+	public void tearDown() {
+		deleteOldIndexes();
+	}
+
+	@Before
+	public void setup() {
+		auditingDao.setConfigurationManager(configurationManager);
+		deleteOldIndexes();
+	}
+
+	private void deleteOldIndexes() {
+		DeleteIndexResponse deleteResponse = esclient.getClient().admin().indices()
+				.prepareDelete(auditingDao.getIndexPrefix() + "*").execute().actionGet();
+		if (!deleteResponse.isAcknowledged()) {
+			log.debug("Couldn't delete old auditing indexes!");
+			assertTrue(false);
+		}
+	}
+
+	// @Test
+	public void testAddUpdateAdminEventMinute() {
+
+		String timestamp = "2015-06-23 13:34:53.123";
+
+		String creationPeriod = Constants.MINUTE;
+		String expectedIndexName = auditingDao.getIndexPrefix() + "-2015-06-23-13-34";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
+				.isExists());
+		Map<AuditingFieldsKeysEnum, Object> params = getUserAdminEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
+		params = getUserAccessEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
+		params = getResourceAdminEventParams(timestamp, "addResource");
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
+	}
+
+	// @Test
+	public void testAddUpdateAdminEventYearly() {
+
+		String timestamp = "2016-06-23 13:34:53.123";
+		String creationPeriod = Constants.YEAR;
+		String expectedIndexName = auditingDao.getIndexPrefix() + "-2016";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
+				.isExists());
+		Map<AuditingFieldsKeysEnum, Object> params = getUserAdminEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
+		params = getUserAccessEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
+		params = getResourceAdminEventParams(timestamp, "addResource");
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
+	}
+
+	@Test
+	public void testGetDistributionStatusEvent() {
+
+		String timestamp1 = "2016-06-23 13:34:53.123";
+		String creationPeriod = Constants.MONTH;
+		String expectedIndexName1 = auditingDao.getIndexPrefix() + "-2016-06";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName1).execute().actionGet()
+				.isExists());
+		Map<AuditingFieldsKeysEnum, Object> params = getDistributionStatusEventParams(timestamp1);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName1, DistributionStatusEvent.class);
+		String timestamp2 = "2015-06-23 13:34:53.123";
+
+		String expectedIndexName2 = auditingDao.getIndexPrefix() + "-2015-06";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName2).execute().actionGet()
+				.isExists());
+		Map<AuditingFieldsKeysEnum, Object> params2 = getDistributionStatusEventParams(timestamp2);
+		testCreationPeriodScenario(params2, creationPeriod, expectedIndexName2, DistributionStatusEvent.class);
+		Either<List<ESTimeBasedEvent>, ActionStatus> status = auditingDao.getListOfDistributionStatuses("123-456");
+		assertEquals(2, status.left().value().size());
+	}
+
+	@Test
+	public void testGetCountAdminEventMonthly() {
+
+		String timestamp1 = "2016-06-23 13:34:53.123";
+		String timestamp2 = "2015-06-23 13:34:53.123";
+		String creationPeriod = Constants.MONTH;
+		String expectedIndexName1 = auditingDao.getIndexPrefix() + "-2016-06";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName1).execute().actionGet()
+				.isExists());
+		String expectedIndexName2 = auditingDao.getIndexPrefix() + "-2015-06";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName2).execute().actionGet()
+				.isExists());
+
+		Map<AuditingFieldsKeysEnum, Object> params1 = getUserAdminEventParams(timestamp1);
+		testCreationPeriodScenario(params1, creationPeriod, expectedIndexName1, UserAdminEvent.class);
+		Map<AuditingFieldsKeysEnum, Object> params2 = getUserAdminEventParams(timestamp2);
+		testCreationPeriodScenario(params2, creationPeriod, expectedIndexName2, UserAdminEvent.class);
+
+		long count = auditingDao.count(UserAdminEvent.class, new MatchAllQueryBuilder());
+		log.debug("Testing auditing count {}", count);
+		assertEquals(2, count);
+	}
+
+	@Test
+	public void testServiceDistributionStatuses() {
+
+		String timestamp = "2016-06-23 13:34:53.123";
+		String creationPeriod = Constants.MONTH;
+		String expectedIndexName = auditingDao.getIndexPrefix() + "-2016-06";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
+				.isExists());
+		Map<AuditingFieldsKeysEnum, Object> params = getUserAdminEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
+		params = getUserAccessEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
+		params = getResourceAdminEventParams(timestamp, "DRequest");
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
+		params = getDistributionNotificationEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, DistributionNotificationEvent.class);
+		Either<List<ESTimeBasedEvent>, ActionStatus> status = auditingDao
+				.getServiceDistributionStatusesList("SeviceId");
+		log.debug("Testing auditing count {}", status);
+	}
+
+	@Test
+	public void testAddUpdateAdminEventMonthly() {
+
+		String timestamp = "2016-06-23 13:34:53.123";
+		String creationPeriod = Constants.MONTH;
+		String expectedIndexName = auditingDao.getIndexPrefix() + "-2016-06";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
+				.isExists());
+		Map<AuditingFieldsKeysEnum, Object> params = getUserAdminEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
+		params = getUserAccessEventParams(timestamp);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
+		params = getResourceAdminEventParams(timestamp, "addResource");
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
+	}
+
+	private SearchResponse testCreationPeriodScenario(Map<AuditingFieldsKeysEnum, Object> params, String creationPeriod,
+			String expectedIndexName, Class<? extends AuditingGenericEvent> clazz) {
+
+		String typeName = clazz.getSimpleName().toLowerCase();
+		log.debug("Testing auditing type {}", typeName);
+		setCreationPeriod(creationPeriod);
+		ActionStatus saveUserAdminEvent = auditingDao.addRecord(params, typeName);
+		assertEquals(ActionStatus.OK, saveUserAdminEvent);
+		assertTrue(esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
+				.isExists());
+		MatchAllQueryBuilder matchAllQueryBuilder = new MatchAllQueryBuilder();
+
+		SearchResponse searchResponse = esclient.getClient().prepareSearch(expectedIndexName).setTypes(typeName)
+				.setQuery(matchAllQueryBuilder).execute().actionGet();
+
+		SearchHits hits = searchResponse.getHits();
+		assertEquals(1, hits.getTotalHits());
+		log.debug("Checking that all expected fields are properly persisted");
+		validateHitValues(params, hits.getAt(0));
+		log.debug("testCreationPeriodScenario successful");
+		return searchResponse;
+	}
+
+	private void validateHitValues(Map<AuditingFieldsKeysEnum, Object> params, SearchHit searchHit) {
+		Map<String, Object> source = searchHit.getSource();
+		log.debug("Hit source is {}", searchHit.sourceAsString());
+		for (Entry<AuditingFieldsKeysEnum, Object> paramsEntry : params.entrySet()) {
+			AuditingFieldsKeysEnum key = paramsEntry.getKey();
+			log.debug("Testing auditing field {}", key.name());
+			Object value = paramsEntry.getValue();
+			// assertEquals(value, source.get(auditField2esField.get(key)));
+			assertEquals(value, source.get(key.getDisplayName()));
+		}
+	}
+
+	private void setCreationPeriod(String creationPeriod) {
+		Configuration configuration = configurationManager.getConfiguration();
+		List<IndicesTimeFrequencyEntry> indicesTimeFrequencyEntries = new ArrayList<>();
+		IndicesTimeFrequencyEntry indicesTimeFrequencyEntry = new IndicesTimeFrequencyEntry();
+		indicesTimeFrequencyEntry.setIndexPrefix("auditingevents");
+		indicesTimeFrequencyEntry.setCreationPeriod(creationPeriod);
+		configuration.getElasticSearch().setIndicesTimeFrequency(indicesTimeFrequencyEntries);
+	}
+
+	private Map<AuditingFieldsKeysEnum, Object> getUserAdminEventParams(String timestamp) {
+
+		Map<AuditingFieldsKeysEnum, Object> params = new HashMap<AuditingFieldsKeysEnum, Object>();
+		String action = "updateUser";
+		String modifierName = "moshe moshe";
+		String modifierUid = "mosheUid";
+		String userUid = "mosheUid";
+		String userBeforeName = "moshe moshe";
+		String userBeforeEmail = "moshe@moshe1.com";
+		String userBeforeRole = "TESTER";
+		String userAfterName = "moshe moshe";
+		String userAfterEmail = "moshe@moshe2.com";
+		String userAfterRole = "TESTER";
+		String userStatus = "200";
+		String userDesc = "OK";
+
+		params.put(AuditingFieldsKeysEnum.AUDIT_ACTION, action);
+		params.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, modifierName + '(' + modifierUid + ')');
+		params.put(AuditingFieldsKeysEnum.AUDIT_USER_UID, userUid);
+		params.put(AuditingFieldsKeysEnum.AUDIT_USER_BEFORE,
+				userUid + ", " + userBeforeName + ", " + userBeforeEmail + ", " + userBeforeRole);
+		params.put(AuditingFieldsKeysEnum.AUDIT_USER_AFTER,
+				userUid + ", " + userAfterName + ", " + userAfterEmail + ", " + userAfterRole);
+		params.put(AuditingFieldsKeysEnum.AUDIT_STATUS, userStatus);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DESC, userDesc);
+		params.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, timestamp);
+
+		return params;
+	}
+
+	private Map<AuditingFieldsKeysEnum, Object> getUserAccessEventParams(String timestamp) {
+
+		Map<AuditingFieldsKeysEnum, Object> params = new HashMap<AuditingFieldsKeysEnum, Object>();
+		String action = "userAccess";
+		String userUid = "mosheUid";
+		String userName = "moshe moshe";
+		String userStatus = "200";
+		String userDesc = "OK";
+
+		params.put(AuditingFieldsKeysEnum.AUDIT_ACTION, action);
+		params.put(AuditingFieldsKeysEnum.AUDIT_USER_UID, userName + '(' + userUid + ')');
+		params.put(AuditingFieldsKeysEnum.AUDIT_STATUS, userStatus);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DESC, userDesc);
+		params.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, timestamp);
+
+		return params;
+	}
+
+	private Map<AuditingFieldsKeysEnum, Object> getResourceAdminEventParams(String timestamp, String action) {
+
+		Map<AuditingFieldsKeysEnum, Object> params = new HashMap<AuditingFieldsKeysEnum, Object>();
+
+		String modifierName = "moshe moshe";
+		String modifierUid = "mosheUid";
+		String resourceName = "Centos";
+		String resourceType = "Resource";
+		String currState = "READY_FOR_CERTIFICATION";
+		String prevState = "CHECKED_OUT";
+		String currVersion = "1.1.4";
+		String prevVersion = "1.1.3";
+		String status = "200";
+		String desc = "OK";
+		String distributionId = "123-456";
+		String serviceId = "SeviceId";
+
+		params.put(AuditingFieldsKeysEnum.AUDIT_ACTION, action);
+		params.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME, modifierName);
+		params.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, modifierUid);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceName);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TYPE, resourceType);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_STATE, currState);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_PREV_STATE, prevState);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_VERSION, currVersion);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_PREV_VERSION, prevVersion);
+		params.put(AuditingFieldsKeysEnum.AUDIT_STATUS, status);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DESC, desc);
+		params.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, timestamp);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, distributionId);
+		params.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, serviceId);
+
+		return params;
+	}
+
+	private Map<AuditingFieldsKeysEnum, Object> getDistributionStatusEventParams(String timestamp) {
+
+		Map<AuditingFieldsKeysEnum, Object> params = new HashMap<AuditingFieldsKeysEnum, Object>();
+		String action = "DStatus";
+		String modifierName = "moshe moshe";
+		String modifierUid = "mosheUid";
+		String topicName = "Centos";
+		String serviceId = "SeviceId";
+		String resourceUrl = "resourceUrl";
+		String distributionId = "123-456";
+
+		String status = "200";
+		String desc = "OK";
+
+		params.put(AuditingFieldsKeysEnum.AUDIT_DESC, desc);
+		params.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, timestamp);
+		params.put(AuditingFieldsKeysEnum.AUDIT_STATUS, status);
+		params.put(AuditingFieldsKeysEnum.AUDIT_ACTION, action);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, distributionId);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_CONSUMER_ID, modifierUid);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_TOPIC_NAME, topicName);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_RESOURCE_URL, resourceUrl);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_STATUS_TIME, timestamp);
+		params.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, serviceId);
+
+		return params;
+	}
+
+	// @Test
+	public void getListOfDistributionByActionTest() {
+
+		String timestamp = "2016-06-23 13:34:53.123";
+		String distributionId = "123-456";
+
+		String creationPeriod = Constants.MONTH;
+		String expectedIndexName = auditingDao.getIndexPrefix() + "-2016-06";
+		assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
+				.isExists());
+
+		// Client client = esclient.getClient();
+		// final CreateIndexRequestBuilder createIndexRequestBuilder =
+		// client.admin().indices().prepareCreate(expectedIndexName);
+		// final XContentBuilder mappingBuilder =
+		// jsonBuilder().startObject().startObject("resourceadminevent")
+		// .startObject("_ttl").field("enabled", "true").field("default",
+		// "1s").endObject().endObject()
+		// .endObject();
+		// System.out.println(mappingBuilder.string());
+		// createIndexRequestBuilder.addMapping(documentType, mappingBuilder);
+		//
+		// // MAPPING DONE
+		// createIndexRequestBuilder.execute().actionGet();
+		//
+		//
+
+		Map<AuditingFieldsKeysEnum, Object> params = getResourceAdminEventParams(timestamp, "DRequest");
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, distributionId);
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
+		params = getDistributionNotificationEventParams(timestamp);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, distributionId);
+
+		testCreationPeriodScenario(params, creationPeriod, expectedIndexName, DistributionNotificationEvent.class);
+
+		Either<List<ESTimeBasedEvent>, ActionStatus> distributionByAction = auditingDao
+				.getListOfDistributionByAction(distributionId, "DRequest", "200", ResourceAdminEvent.class);
+		assertTrue(distributionByAction.isLeft());
+		assertFalse(distributionByAction.left().value().isEmpty());
+
+		distributionByAction = auditingDao.getListOfDistributionByAction(distributionId, "DNotify", "200",
+				DistributionNotificationEvent.class);
+		assertTrue(distributionByAction.isLeft());
+		assertFalse(distributionByAction.left().value().isEmpty());
+
+	}
+
+	private Map<AuditingFieldsKeysEnum, Object> getDistributionNotificationEventParams(String timestamp) {
+
+		Map<AuditingFieldsKeysEnum, Object> params = new HashMap<AuditingFieldsKeysEnum, Object>();
+
+		String action = "DNotify";
+		String modifierName = "moshe moshe";
+		String modifierUid = "mosheUid";
+		String resourceName = "Centos";
+		String resourceType = "Resource";
+
+		String currVersion = "1.1.4";
+		String currState = "READY_FOR_CERTIFICATION";
+		String status = "200";
+		String desc = "OK";
+		String did = "1027";
+		String topicName = "Centos";
+		String serviceId = "SeviceId";
+		String requestId = "12364";
+
+		params.put(AuditingFieldsKeysEnum.AUDIT_ACTION, action);
+		params.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME, requestId);
+		params.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, modifierUid);
+		params.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME, modifierName);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceName);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TYPE, resourceType);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_STATE, currState);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_TOPIC_NAME, topicName);
+		params.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_VERSION, currVersion);
+		params.put(AuditingFieldsKeysEnum.AUDIT_STATUS, status);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DESC, desc);
+		params.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, timestamp);
+		params.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, did);
+		params.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, serviceId);
+		return params;
+	}
+
+}
diff --git a/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/CassandraTest.java b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/CassandraTest.java
new file mode 100644
index 0000000..caaf070
--- /dev/null
+++ b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/CassandraTest.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.resources;
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.mapping.Mapper;
+import com.datastax.driver.mapping.MappingManager;
+
+import org.openecomp.sdc.be.dao.Account;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CassandraTest {
+	private static Logger log = LoggerFactory.getLogger(CassandraTest.class.getName());
+	private Cluster cluster;
+
+	// #\@Test
+	public void testCrud() {
+		String node = "mtanjv9sdcg44";
+
+		cluster = Cluster.builder().addContactPoint(node).build();
+
+		// Query
+		String query = "CREATE KEYSPACE IF NOT EXISTS dstest WITH replication "
+				+ "= {'class':'SimpleStrategy', 'replication_factor':1};";
+
+		String queryTable = "CREATE TABLE IF NOT EXISTS accounts(email varchar  PRIMARY KEY, name varchar);";
+
+		Session session = cluster.connect();
+		// Executing the query
+		session.execute(query);
+		// //using the KeySpace
+		session.execute("USE dstest");
+		session.execute(queryTable);
+
+		Mapper<Account> mapper = new MappingManager(session).mapper(Account.class);
+		Account account = new Account("John Doe", "jd@example.com");
+		// Class<? extends Account> class1 = account.getClass();
+		// Class class2 = Account.class;
+		mapper.save(account);
+
+		Account whose = mapper.get("jd@example.com");
+		log.debug("Account name: {}", whose.getName());
+
+		account.setName("Samanta Smit");
+		mapper.save(account);
+		whose = mapper.get("jd@example.com");
+		log.debug("Account name: {}", whose.getName());
+
+		mapper.delete(account);
+		whose = mapper.get("jd@example.com");
+
+		cluster.close();
+	}
+}
diff --git a/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/ESUsersDAOTest.java b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/ESUsersDAOTest.java
new file mode 100644
index 0000000..a99acbe
--- /dev/null
+++ b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/ESUsersDAOTest.java
@@ -0,0 +1,64 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.resources;
+
+//@RunWith(SpringJUnit4ClassRunner.class)
+//@ContextConfiguration("classpath:application-context-test.xml")
+//@TestExecutionListeners(listeners = {DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class})
+public class ESUsersDAOTest {
+
+	// @Resource
+	// ElasticSearchClient esclient;
+	//
+	//// @Resource(name = "users-dao")
+	// private IUsersDAO usersDao;
+
+	// @Test
+	public void testNewUserStub() {
+
+	}
+
+	// @Test
+	public void testNewUser() {
+		// if( usersDao == null ){
+		// assertTrue(false);
+		// }
+		//
+		// String id = "yhufksd57834601";
+		// UserData userData = new UserData("Myname", "Mylastname", id, "email",
+		// "Tester");
+		//
+		// ActionStatus saveUserData = usersDao.saveUserData(userData);
+		// assertEquals(saveUserData, ActionStatus.OK);
+		//
+		// Either<UserData, ActionStatus> statusFromEs =
+		// usersDao.getUserData(id);
+		// assertTrue(statusFromEs.isLeft() );
+		// UserData fromEs = statusFromEs.left().value();
+		// assertNotNull(fromEs);
+		// assertEquals(userData, fromEs);
+		//
+		//
+		// usersDao.deleteUserData(id);
+
+	}
+
+}
diff --git a/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/TitanGenericDaoTest.java b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/TitanGenericDaoTest.java
new file mode 100644
index 0000000..a4110f5
--- /dev/null
+++ b/catalog-dao/src/test/java/org/openecomp/sdc/be/resources/TitanGenericDaoTest.java
@@ -0,0 +1,721 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.resources;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.configuration.BaseConfiguration;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
+import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
+import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
+import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
+import org.openecomp.sdc.be.dao.utils.UserStatusEnum;
+import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.resources.data.AdditionalInfoParameterData;
+import org.openecomp.sdc.be.resources.data.ArtifactData;
+import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
+import org.openecomp.sdc.be.resources.data.GraphNodeLock;
+import org.openecomp.sdc.be.resources.data.ResourceMetadataData;
+import org.openecomp.sdc.be.resources.data.UserData;
+import org.openecomp.sdc.common.api.ConfigurationSource;
+import org.openecomp.sdc.common.api.UserRoleEnum;
+import org.openecomp.sdc.common.impl.ExternalConfiguration;
+import org.openecomp.sdc.common.impl.FSConfigurationSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
+import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
+
+import com.google.gson.Gson;
+import com.thinkaurelius.titan.core.PropertyKey;
+import com.thinkaurelius.titan.core.TitanEdge;
+import com.thinkaurelius.titan.core.TitanFactory;
+import com.thinkaurelius.titan.core.TitanGraph;
+import com.thinkaurelius.titan.core.TitanVertex;
+import com.thinkaurelius.titan.core.attribute.Text;
+import com.thinkaurelius.titan.core.schema.TitanManagement;
+
+import fj.data.Either;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("classpath:application-context-test.xml")
+@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class,
+		DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class })
+public class TitanGenericDaoTest {
+	private static Logger log = LoggerFactory.getLogger(TitanGenericDaoTest.class.getName());
+	private static ConfigurationManager configurationManager;
+
+	@Resource(name = "titan-generic-dao")
+	private TitanGenericDao titanDao;
+
+	@BeforeClass
+	public static void setupBeforeClass() {
+		ExternalConfiguration.setAppName("catalog-dao");
+		String appConfigDir = "src/test/resources/config/catalog-dao";
+		ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(),
+				appConfigDir);
+		configurationManager = new ConfigurationManager(configurationSource);
+		configurationManager.getConfiguration()
+				.setTitanCfgFile("../catalog-be/src/main/resources/config/titan.properties");
+		configurationManager.getConfiguration().setTitanInMemoryGraph(true);
+	}
+
+	// @Test
+	public void testcheckEdgeProps() {
+		TitanGraph graph = titanDao.getGraph().left().value();
+		TitanVertex v1 = graph.addVertex();
+		v1.property("prop1", 123);
+		TitanVertex v2 = graph.addVertex();
+		v2.property("prop1", 456);
+		TitanEdge addEdge = v1.addEdge("label11", v2);
+		addEdge.property("edgeProp", "my prop edge");
+		graph.tx().commit();
+
+		Either<TitanVertex, TitanOperationStatus> v11 = titanDao.getVertexByProperty("prop1", 123);
+		Iterator<Edge> edges = v11.left().value().edges(Direction.OUT, "label11");
+		Edge edge = edges.next();
+		// String value = (String)edge.value("edgeProp");
+		String value = (String) titanDao.getProperty(edge, "edgeProp");
+		log.debug(value);
+
+	}
+
+	@Test
+	public void testCrudNode() {
+
+		String id = "user12345abc";
+		UserData userData = new UserData("Myname123", "Mylastname", id, "email123", "Tester",
+				UserStatusEnum.ACTIVE.name(), null);
+
+		Either<UserData, TitanOperationStatus> newNode = titanDao.createNode(userData, UserData.class);
+
+		assertTrue(newNode.isLeft());
+
+		log.debug("{}", newNode.left().value());
+
+		titanDao.commit();
+
+		ImmutablePair<String, Object> keyValueId = userData.getKeyValueId();
+		Either<UserData, TitanOperationStatus> node = titanDao.getNode(keyValueId.getKey(), keyValueId.getValue(),
+				UserData.class);
+		titanDao.commit();
+		assertTrue(node.isLeft());
+		log.debug("{}", node.left().value());
+
+		userData.setRole("Designer");
+		node = titanDao.updateNode(userData, UserData.class);
+		assertTrue(node.isLeft());
+		log.debug("{}", node.left().value());
+		assertEquals(null, "Designer", node.left().value().getRole());
+		titanDao.commit();
+
+		node = titanDao.deleteNode(userData, UserData.class);
+		assertTrue(node.isLeft());
+		log.debug("{}", node.left().value());
+		titanDao.commit();
+
+		node = titanDao.getNode(keyValueId.getKey(), keyValueId.getValue(), UserData.class);
+		assertTrue(node.isRight());
+		log.debug("{}", node.right().value());
+
+	}
+
+	@Test
+	public void testGetByCategoryAndAll() {
+
+		// create 2 nodes
+		String id = "user12345abc";
+		UserData userData1 = new UserData("Myname123", "Mylastname", id, "email123", "Tester",
+				UserStatusEnum.ACTIVE.name(), null);
+
+		Either<UserData, TitanOperationStatus> node1 = titanDao.createNode(userData1, UserData.class);
+		assertTrue(node1.isLeft());
+		log.debug("{}", node1.left().value());
+
+		id = "userdfkoer45abc";
+		UserData userData2 = new UserData("Mynadyhme123", "Mylasghtname", id, "emaighdl123", "Designer",
+				UserStatusEnum.ACTIVE.name(), null);
+		Either<UserData, TitanOperationStatus> node2 = titanDao.createNode(userData2, UserData.class);
+		assertTrue(node2.isLeft());
+		log.debug("{}", node2.left().value());
+
+		titanDao.commit();
+
+		ImmutablePair<String, Object> keyValueId1 = userData1.getKeyValueId();
+		// get first node
+		Either<UserData, TitanOperationStatus> node = titanDao.getNode(keyValueId1.getKey(), keyValueId1.getValue(),
+				UserData.class);
+		assertTrue(node.isLeft());
+		log.debug("{}", node.left().value());
+		titanDao.commit();
+
+		// get all must be 2 + 1 default user = 3
+		Either<List<UserData>, TitanOperationStatus> all = titanDao.getAll(NodeTypeEnum.User, UserData.class);
+		assertTrue(all.isLeft());
+		assertTrue(all.left().value().size() > 0);
+
+		log.debug("{}", all.left().value());
+
+		Map<String, Object> props = new HashMap<String, Object>();
+
+		props.put(keyValueId1.getKey(), keyValueId1.getValue());
+
+		// get by criteria. must be 1
+		Either<List<UserData>, TitanOperationStatus> byCriteria = titanDao.getByCriteria(NodeTypeEnum.User, props,
+				UserData.class);
+		assertTrue(byCriteria.isLeft());
+		assertEquals(1, byCriteria.left().value().size());
+
+		log.debug("{}", byCriteria.left().value());
+
+		// delete all nodes
+		node = titanDao.deleteNode(userData1, UserData.class);
+		assertTrue(node.isLeft());
+		node = titanDao.deleteNode(userData2, UserData.class);
+		assertTrue(node.isLeft());
+	}
+
+	@Test
+	public void testGetEdgesForNode() {
+		String id = "user12345abc";
+		UserData userData = new UserData("Myname123", "Mylastname", id, "email123", UserRoleEnum.ADMIN.name(),
+				UserStatusEnum.ACTIVE.name(), null);
+		titanDao.createNode(userData, UserData.class);
+		ResourceMetadataData resourceData = new ResourceMetadataData();
+		resourceData.getMetadataDataDefinition().setName("resourceForLock");
+		resourceData.getMetadataDataDefinition().setVersion("0.1");
+		resourceData.getMetadataDataDefinition().setState("newState");
+		resourceData.getMetadataDataDefinition().setUniqueId(resourceData.getMetadataDataDefinition().getName() + "."
+				+ resourceData.getMetadataDataDefinition().getVersion());
+
+		titanDao.createNode(resourceData, ResourceMetadataData.class);
+		titanDao.createRelation(userData, resourceData, GraphEdgeLabels.LAST_MODIFIER, null);
+		titanDao.commit();
+
+		Either<List<Edge>, TitanOperationStatus> eitherEdges = titanDao.getEdgesForNode(userData, Direction.OUT);
+		assertTrue(eitherEdges.isLeft());
+		assertTrue(eitherEdges.left().value().size() == 1);
+
+		eitherEdges = titanDao.getEdgesForNode(userData, Direction.IN);
+		assertTrue(eitherEdges.isLeft());
+		assertTrue(eitherEdges.left().value().size() == 0);
+
+		eitherEdges = titanDao.getEdgesForNode(resourceData, Direction.OUT);
+		assertTrue(eitherEdges.isLeft());
+		assertTrue(eitherEdges.left().value().size() == 0);
+
+		eitherEdges = titanDao.getEdgesForNode(resourceData, Direction.IN);
+		assertTrue(eitherEdges.isLeft());
+		assertTrue(eitherEdges.left().value().size() == 1);
+
+		eitherEdges = titanDao.getEdgesForNode(resourceData, Direction.BOTH);
+		assertTrue(eitherEdges.isLeft());
+		assertTrue(eitherEdges.left().value().size() == 1);
+
+		eitherEdges = titanDao.getEdgesForNode(userData, Direction.BOTH);
+		assertTrue(eitherEdges.isLeft());
+		assertTrue(eitherEdges.left().value().size() == 1);
+
+		titanDao.deleteNode(userData, UserData.class);
+		titanDao.deleteNode(resourceData, ResourceMetadataData.class);
+		titanDao.commit();
+	}
+
+	@Test
+	public void testLockElement() {
+
+		ResourceMetadataData resourceData = new ResourceMetadataData();
+
+		resourceData.getMetadataDataDefinition().setName("resourceForLock");
+		resourceData.getMetadataDataDefinition().setVersion("0.1");
+		resourceData.getMetadataDataDefinition().setState("newState");
+		resourceData.getMetadataDataDefinition().setUniqueId(resourceData.getMetadataDataDefinition().getName() + "."
+				+ resourceData.getMetadataDataDefinition().getVersion());
+
+		Either<ResourceMetadataData, TitanOperationStatus> resource1 = titanDao.createNode(resourceData,
+				ResourceMetadataData.class);
+		assertTrue(resource1.isLeft());
+		titanDao.commit();
+		String lockId = "lock_" + resourceData.getLabel() + "_" + resource1.left().value().getUniqueId();
+
+		Either<GraphNodeLock, TitanOperationStatus> nodeLock = titanDao
+				.getNode(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), lockId, GraphNodeLock.class);
+		assertTrue(nodeLock.isRight());
+		assertEquals(TitanOperationStatus.NOT_FOUND, nodeLock.right().value());
+
+		TitanOperationStatus status = titanDao.lockElement(resourceData);
+		assertEquals(TitanOperationStatus.OK, status);
+
+		nodeLock = titanDao.getNode(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), lockId, GraphNodeLock.class);
+		assertTrue(nodeLock.isLeft());
+		assertEquals(lockId, nodeLock.left().value().getUniqueId());
+
+		titanDao.commit();
+
+		status = titanDao.lockElement(resourceData);
+		assertEquals(TitanOperationStatus.ALREADY_LOCKED, status);
+
+		status = titanDao.releaseElement(resourceData);
+		assertEquals(TitanOperationStatus.OK, status);
+
+		nodeLock = titanDao.getNode(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), lockId, GraphNodeLock.class);
+		assertTrue(nodeLock.isRight());
+		assertEquals(TitanOperationStatus.NOT_FOUND, nodeLock.right().value());
+		titanDao.deleteNode(resourceData, ResourceMetadataData.class);
+		titanDao.commit();
+
+	}
+
+	@Test
+	public void testReLockElement() throws InterruptedException {
+
+		ResourceMetadataData resourceData = new ResourceMetadataData();
+
+		resourceData.getMetadataDataDefinition().setName("resourceForReLock");
+		resourceData.getMetadataDataDefinition().setVersion("0.1");
+		resourceData.getMetadataDataDefinition().setState("newState");
+		resourceData.getMetadataDataDefinition().setUniqueId(resourceData.getMetadataDataDefinition().getName() + "."
+				+ resourceData.getMetadataDataDefinition().getVersion());
+
+		Either<ResourceMetadataData, TitanOperationStatus> resource1 = titanDao.createNode(resourceData,
+				ResourceMetadataData.class);
+		assertTrue(resource1.isLeft());
+		titanDao.commit();
+		String lockId = "lock_" + resourceData.getLabel() + "_" + resource1.left().value().getUniqueId();
+
+		Either<GraphNodeLock, TitanOperationStatus> nodeLock = titanDao
+				.getNode(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), lockId, GraphNodeLock.class);
+		assertTrue(nodeLock.isRight());
+		assertEquals(TitanOperationStatus.NOT_FOUND, nodeLock.right().value());
+
+		// lock
+		TitanOperationStatus status = titanDao.lockElement(resourceData);
+		assertEquals(TitanOperationStatus.OK, status);
+
+		nodeLock = titanDao.getNode(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), lockId, GraphNodeLock.class);
+		assertTrue(nodeLock.isLeft());
+		assertEquals(lockId, nodeLock.left().value().getUniqueId());
+		long time1 = nodeLock.left().value().getTime();
+
+		titanDao.commit();
+
+		// timeout
+		configurationManager.getConfiguration().setTitanLockTimeout(2L);
+		Thread.sleep(5001);
+
+		// relock
+		status = titanDao.lockElement(resourceData);
+		assertEquals(TitanOperationStatus.OK, status);
+
+		nodeLock = titanDao.getNode(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), lockId, GraphNodeLock.class);
+		assertTrue(nodeLock.isLeft());
+		assertEquals(lockId, nodeLock.left().value().getUniqueId());
+
+		long time2 = nodeLock.left().value().getTime();
+
+		assertTrue(time2 > time1);
+
+		status = titanDao.releaseElement(resourceData);
+		assertEquals(TitanOperationStatus.OK, status);
+
+		nodeLock = titanDao.getNode(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), lockId, GraphNodeLock.class);
+		assertTrue(nodeLock.isRight());
+		assertEquals(TitanOperationStatus.NOT_FOUND, nodeLock.right().value());
+
+		titanDao.deleteNode(resourceData, ResourceMetadataData.class);
+		titanDao.commit();
+
+	}
+
+	@Test
+	public void testBoolean() {
+		ResourceMetadataData resourceData = new ResourceMetadataData();
+
+		resourceData.getMetadataDataDefinition().setName("resourceForLock");
+		resourceData.getMetadataDataDefinition().setVersion("0.1");
+		resourceData.getMetadataDataDefinition().setState("NOT_CERTIFIED_CHECKOUT");
+		resourceData.getMetadataDataDefinition().setHighestVersion(true);
+		resourceData.getMetadataDataDefinition().setUniqueId(resourceData.getMetadataDataDefinition().getName() + "."
+				+ resourceData.getMetadataDataDefinition().getVersion());
+
+		Either<ResourceMetadataData, TitanOperationStatus> resource1 = titanDao.createNode(resourceData,
+				ResourceMetadataData.class);
+		assertTrue(resource1.isLeft());
+
+		resourceData = new ResourceMetadataData();
+
+		resourceData.getMetadataDataDefinition().setName("resourceForLock");
+		resourceData.getMetadataDataDefinition().setVersion("0.2");
+		resourceData.getMetadataDataDefinition().setState("NOT_CERTIFIED_CHECKOUT");
+		resourceData.getMetadataDataDefinition().setHighestVersion(false);
+		resourceData.getMetadataDataDefinition().setUniqueId(resourceData.getMetadataDataDefinition().getName() + "."
+				+ resourceData.getMetadataDataDefinition().getVersion());
+
+		Either<ResourceMetadataData, TitanOperationStatus> resource2 = titanDao.createNode(resourceData,
+				ResourceMetadataData.class);
+		titanDao.commit();
+
+		Map<String, Object> props = new HashMap<String, Object>();
+
+		props.put(GraphPropertiesDictionary.STATE.getProperty(), "NOT_CERTIFIED_CHECKOUT");
+		props.put("name", "resourceForLock");
+		props.put(GraphPropertiesDictionary.IS_HIGHEST_VERSION.getProperty(), false);
+
+		// get by criteria. must be 1
+		Either<List<ResourceMetadataData>, TitanOperationStatus> byCriteria = titanDao
+				.getByCriteria(NodeTypeEnum.Resource, props, ResourceMetadataData.class);
+		assertTrue(byCriteria.isLeft());
+
+		titanDao.deleteNode(resource1.left().value(), ResourceMetadataData.class);
+
+		titanDao.deleteNode(resource2.left().value(), ResourceMetadataData.class);
+		titanDao.commit();
+	}
+
+	// @Test
+	public void testStringSearch() {
+		TitanGraph graph;
+
+		BaseConfiguration conf = new BaseConfiguration();
+		conf.setProperty("storage.backend", "inmemory");
+		graph = TitanFactory.open(conf);
+
+		// TitanManagement graphMgt = graph.getManagementSystem();
+		TitanManagement graphMgt = graph.openManagement();
+		PropertyKey propKey = graphMgt.makePropertyKey("string1").dataType(String.class).make();
+		graphMgt.buildIndex("string1", Vertex.class).addKey(propKey).unique().buildCompositeIndex();
+
+		propKey = graphMgt.makePropertyKey("string2").dataType(String.class).make();
+
+		// graphMgt.buildIndex("string2", Vertex.class).addKey(propKey,
+		// Mapping.TEXT.getParameter()).buildMixedIndex("search");
+		graphMgt.buildIndex("string2", Vertex.class).addKey(propKey).unique().buildCompositeIndex();
+		graphMgt.commit();
+
+		// TitanVertex v = graph.addVertex();
+		// v.addProperty("string1", "My new String 1");
+		// v.addProperty("string2", "String11");
+		// graph.commit();
+		//
+		// v = graph.addVertex();
+		// v.addProperty("string1", "my new string 1");
+		// v.addProperty("string2", "string11");
+		// graph.commit();
+		//
+		// System.out.println("First index search - case");
+		//
+		// Iterable<Vertex> vertices = graph.getVertices("string1", "My new
+		// String 1");
+		// Iterator<Vertex> iter = vertices.iterator();
+		// while ( iter.hasNext() ){
+		// Vertex ver = iter.next();
+		// System.out.println(com.tinkerpop.blueprints.util.ElementHelper.getProperties(ver));
+		// }
+		// System.out.println("First index search non case");
+		//
+		// vertices = graph.getVertices("string1", "my new string 1");
+		// iter = vertices.iterator();
+		// while ( iter.hasNext() ){
+		// Vertex ver = iter.next();
+		// System.out.println(com.tinkerpop.blueprints.util.ElementHelper.getProperties(ver));
+		// }
+		// System.out.println("Second index search case");
+		//
+		// vertices = graph.getVertices("string2", "String11");
+		// iter = vertices.iterator();
+		// while ( iter.hasNext() ){
+		// Vertex ver = iter.next();
+		// System.out.println(com.tinkerpop.blueprints.util.ElementHelper.getProperties(ver));
+		// }
+		// System.out.println("second index search non case");
+		//
+		// vertices = graph.getVertices("string2", "string11");
+		// iter = vertices.iterator();
+		// while ( iter.hasNext() ){
+		// Vertex ver = iter.next();
+		// System.out.println(com.tinkerpop.blueprints.util.ElementHelper.getProperties(ver));
+		// }
+		// System.out.println("Query index search case");
+		// vertices = graph.query().has("string1", "My new String
+		// 1").vertices();
+		// iter = vertices.iterator();
+		// while ( iter.hasNext() ){
+		// Vertex ver = iter.next();
+		// System.out.println(com.tinkerpop.blueprints.util.ElementHelper.getProperties(ver));
+		// }
+		// System.out.println("Query index search non case");
+		// vertices = graph.query().has("string1", "my new string
+		// 1").vertices();
+		// iter = vertices.iterator();
+		// while ( iter.hasNext() ){
+		// Vertex ver = iter.next();
+		// System.out.println(com.tinkerpop.blueprints.util.ElementHelper.getProperties(ver));
+		// }
+
+		log.debug("**** predicat index search non case");
+		Iterable<TitanVertex> vertices = graph.query().has("string1", Text.REGEX, "my new string 1").vertices();
+		Iterator<TitanVertex> iter = vertices.iterator();
+		while (iter.hasNext()) {
+			Vertex ver = iter.next();
+			// System.out.println(com.tinkerpop.blueprints.util.ElementHelper.getProperties(ver));
+			log.debug("{}", titanDao.getProperties(ver));
+		}
+
+	}
+
+	@Test
+	public void testDuplicateResultDueToTitanBug() {
+
+		// TitanGraph titanGraph = titanDao.getGraph().left().value();
+		// TitanManagement managementSystem = titanGraph.getManagementSystem();
+
+		// GraphPropertiesDictionary[] properties = {
+		// GraphPropertiesDictionary.IS_ABSTRACT,
+		// GraphPropertiesDictionary.ADDITIONAL_INFO_ID_TO_KEY,
+		// GraphPropertiesDictionary.POSITION_X,
+		// GraphPropertiesDictionary.ARTIFACT_TIMEOUT };
+		//
+		// for (GraphPropertiesDictionary property : properties) {
+		// if (false ==
+		// managementSystem.containsGraphIndex(property.getProperty())) {
+		// PropertyKey propKey1 =
+		// managementSystem.makePropertyKey(property.getProperty()).dataType(property.getClazz()).make();
+		// managementSystem.buildIndex(property.getProperty(),
+		// Vertex.class).addKey(propKey1).unique().buildCompositeIndex();
+		// }
+		// }
+
+		// managementSystem.commit();
+
+		ResourceMetadataData resourceData1 = new ResourceMetadataData();
+		resourceData1.getMetadataDataDefinition().setUniqueId("A");
+		((ResourceMetadataDataDefinition) resourceData1.getMetadataDataDefinition()).setAbstract(true);
+		resourceData1.getMetadataDataDefinition().setName("aaaa");
+
+		Either<ResourceMetadataData, TitanOperationStatus> newNode1 = titanDao.createNode(resourceData1,
+				ResourceMetadataData.class);
+		assertTrue(newNode1.isLeft());
+		log.debug("{}", newNode1.left().value());
+		// titanDao.commit();
+
+		Map<String, Object> props = new HashMap<>();
+		props.put(GraphPropertiesDictionary.IS_ABSTRACT.getProperty(), true);
+		Either<List<ResourceMetadataData>, TitanOperationStatus> byCriteria = titanDao
+				.getByCriteria(NodeTypeEnum.Resource, props, ResourceMetadataData.class);
+		assertTrue(byCriteria.isLeft());
+		assertEquals("check one result returned", 1, byCriteria.left().value().size());
+		// titanDao.commit();
+
+		ResourceMetadataData resourceToUpdate = new ResourceMetadataData();
+		((ResourceMetadataDataDefinition) resourceToUpdate.getMetadataDataDefinition()).setAbstract(false);
+		resourceToUpdate.getMetadataDataDefinition().setUniqueId("A");
+		Either<ResourceMetadataData, TitanOperationStatus> updateNode = titanDao.updateNode(resourceToUpdate,
+				ResourceMetadataData.class);
+		assertTrue(updateNode.isLeft());
+		// titanDao.commit();
+
+		byCriteria = titanDao.getByCriteria(NodeTypeEnum.Resource, props, ResourceMetadataData.class);
+		assertTrue(byCriteria.isRight());
+		assertEquals("check one result returned due to titan bug", TitanOperationStatus.NOT_FOUND,
+				byCriteria.right().value());
+
+		AdditionalInfoParameterData infoParameterData = new AdditionalInfoParameterData();
+		infoParameterData.getAdditionalInfoParameterDataDefinition().setUniqueId("123");
+		Map<String, String> idToKey = new HashMap<>();
+		idToKey.put("key1", "value1");
+		infoParameterData.setIdToKey(idToKey);
+
+		Either<AdditionalInfoParameterData, TitanOperationStatus> newNode2 = titanDao.createNode(infoParameterData,
+				AdditionalInfoParameterData.class);
+		assertTrue(newNode2.isLeft());
+		log.debug("{}", newNode2.left().value());
+		// titanDao.commit();
+
+		Map<String, String> idToKey2 = new HashMap<>();
+		idToKey2.put("key1", "value2");
+
+		Map<String, Object> props2 = new HashMap<>();
+		props2.put(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), "123");
+		Gson gson = new Gson();
+		props2.put(GraphPropertiesDictionary.ADDITIONAL_INFO_ID_TO_KEY.getProperty(), gson.toJson(idToKey2));
+		// props2.put(GraphPropertiesDictionary.ADDITIONAL_INFO_ID_TO_KEY.getProperty(),
+		// idToKey2);
+
+		Either<List<AdditionalInfoParameterData>, TitanOperationStatus> byCriteria2 = titanDao
+				.getByCriteria(NodeTypeEnum.AdditionalInfoParameters, props2, AdditionalInfoParameterData.class);
+		assertTrue(byCriteria2.isRight());
+		assertEquals("check one result returned due to titan bug", TitanOperationStatus.NOT_FOUND,
+				byCriteria2.right().value());
+
+		infoParameterData.setIdToKey(idToKey2);
+
+		Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode2 = titanDao.updateNode(infoParameterData,
+				AdditionalInfoParameterData.class);
+		assertTrue(updateNode2.isLeft());
+		// titanDao.commit();
+
+		props2.put(GraphPropertiesDictionary.ADDITIONAL_INFO_ID_TO_KEY.getProperty(), idToKey);
+		byCriteria2 = titanDao.getByCriteria(NodeTypeEnum.AdditionalInfoParameters, props2,
+				AdditionalInfoParameterData.class);
+		assertTrue(byCriteria2.isRight());
+		assertEquals("check one result returned due to titan bug", TitanOperationStatus.NOT_FOUND,
+				byCriteria2.right().value());
+
+		ComponentInstanceData resourceInstanceData = new ComponentInstanceData();
+		resourceInstanceData.getComponentInstDataDefinition().setUniqueId("ri123");
+		resourceInstanceData.getComponentInstDataDefinition().setPosX("22");
+		resourceInstanceData.getComponentInstDataDefinition().setName("myresource_1");
+
+		Either<ComponentInstanceData, TitanOperationStatus> newNode3 = titanDao.createNode(resourceInstanceData,
+				ComponentInstanceData.class);
+		assertTrue(newNode3.isLeft());
+		log.debug("{}", newNode3.left().value());
+		// titanDao.commit();
+
+		resourceInstanceData.getComponentInstDataDefinition().setPosX("50");
+		Either<ComponentInstanceData, TitanOperationStatus> updateNode3 = titanDao.updateNode(resourceInstanceData,
+				ComponentInstanceData.class);
+		assertTrue(updateNode3.isLeft());
+		// titanDao.commit();
+
+		resourceInstanceData.getComponentInstDataDefinition().setName("myresource_2");
+		updateNode3 = titanDao.updateNode(resourceInstanceData, ComponentInstanceData.class);
+		assertTrue(updateNode3.isLeft());
+		// titanDao.commit();
+
+		Map<String, Object> props3 = new HashMap<>();
+		props3.put("positionX", "22");
+		Either<List<ComponentInstanceData>, TitanOperationStatus> byCriteria3 = titanDao
+				.getByCriteria(NodeTypeEnum.ResourceInstance, props3, ComponentInstanceData.class);
+		assertTrue(byCriteria3.isRight());
+		assertEquals("check one result returned due to titan bug", TitanOperationStatus.NOT_FOUND,
+				byCriteria3.right().value());
+
+		props3.put("positionX", "50");
+		byCriteria3 = titanDao.getByCriteria(NodeTypeEnum.ResourceInstance, props3, ComponentInstanceData.class);
+		assertTrue(byCriteria3.isLeft());
+
+		/////////////////////////// check integer ////////////////////////
+
+		ArtifactData artifactData = new ArtifactData();
+		artifactData.getArtifactDataDefinition().setUniqueId("ad234");
+		artifactData.getArtifactDataDefinition().setTimeout(100);
+
+		Either<ArtifactData, TitanOperationStatus> newNode4 = titanDao.createNode(artifactData, ArtifactData.class);
+		assertTrue(newNode4.isLeft());
+		log.debug("{}", newNode4.left().value());
+		// titanDao.commit();
+
+		artifactData.getArtifactDataDefinition().setTimeout(50);
+		Either<ArtifactData, TitanOperationStatus> updateNode4 = titanDao.updateNode(artifactData, ArtifactData.class);
+		assertTrue(updateNode4.isLeft());
+		// titanDao.commit();
+
+		Map<String, Object> props4 = new HashMap<>();
+		props4.put("timeout", 100);
+		Either<List<ArtifactData>, TitanOperationStatus> byCriteria4 = titanDao.getByCriteria(NodeTypeEnum.ArtifactRef,
+				props4, ArtifactData.class);
+		assertTrue(byCriteria4.isRight());
+		assertEquals("check one result returned due to titan bug", TitanOperationStatus.NOT_FOUND,
+				byCriteria4.right().value());
+
+		props4.put("timeout", 50);
+		byCriteria4 = titanDao.getByCriteria(NodeTypeEnum.ArtifactRef, props4, ArtifactData.class);
+		assertTrue(byCriteria4.isLeft());
+
+		titanDao.rollback();
+	}
+
+	@Test
+	public void testDuplicateResultUSeHasNotQueryDueToTitanBug() {
+
+		String name = "bbbb";
+
+		ResourceMetadataData resourceData1 = new ResourceMetadataData();
+		resourceData1.getMetadataDataDefinition().setUniqueId("A");
+		((ResourceMetadataDataDefinition) resourceData1.getMetadataDataDefinition()).setAbstract(true);
+		resourceData1.getMetadataDataDefinition().setName(name);
+
+		Either<ResourceMetadataData, TitanOperationStatus> newNode1 = titanDao.createNode(resourceData1,
+				ResourceMetadataData.class);
+		assertTrue(newNode1.isLeft());
+		log.debug("{}", newNode1.left().value());
+		// titanDao.commit();
+
+		Map<String, Object> props = new HashMap<>();
+		props.put(GraphPropertiesDictionary.IS_ABSTRACT.getProperty(), true);
+		Either<List<ResourceMetadataData>, TitanOperationStatus> byCriteria = titanDao
+				.getByCriteria(NodeTypeEnum.Resource, props, ResourceMetadataData.class);
+		assertTrue(byCriteria.isLeft());
+		assertEquals("check one result returned", 1, byCriteria.left().value().size());
+		// titanDao.commit();
+
+		ResourceMetadataData resourceToUpdate = new ResourceMetadataData();
+		((ResourceMetadataDataDefinition) resourceToUpdate.getMetadataDataDefinition()).setAbstract(false);
+		resourceToUpdate.getMetadataDataDefinition().setUniqueId("A");
+		Either<ResourceMetadataData, TitanOperationStatus> updateNode = titanDao.updateNode(resourceToUpdate,
+				ResourceMetadataData.class);
+		assertTrue(updateNode.isLeft());
+		// titanDao.commit();
+
+		// no result where isAbstract = true
+		byCriteria = titanDao.getByCriteria(NodeTypeEnum.Resource, props, ResourceMetadataData.class);
+		assertTrue(byCriteria.isRight());
+		assertEquals("check one result returned due to titan bug", TitanOperationStatus.NOT_FOUND,
+				byCriteria.right().value());
+
+		// one result where isAbstract != true
+		byCriteria = titanDao.getByCriteria(NodeTypeEnum.Resource, null, props, ResourceMetadataData.class);
+		assertTrue(byCriteria.isLeft());
+		assertEquals("check one result returned", 1, byCriteria.left().value().size());
+
+		props.put(GraphPropertiesDictionary.IS_ABSTRACT.getProperty(), false);
+		byCriteria = titanDao.getByCriteria(NodeTypeEnum.Resource, null, props, ResourceMetadataData.class);
+		assertTrue(byCriteria.isRight());
+		assertEquals("check one result returned due to titan bug", TitanOperationStatus.NOT_FOUND,
+				byCriteria.right().value());
+
+		titanDao.rollback();
+
+	}
+
+}
diff --git a/catalog-dao/src/test/resources/application-context-test.xml b/catalog-dao/src/test/resources/application-context-test.xml
new file mode 100644
index 0000000..468dab3
--- /dev/null
+++ b/catalog-dao/src/test/resources/application-context-test.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:util="http://www.springframework.org/schema/util"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
+           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
+           
+	<util:properties id="elasticsearchConfig" location="classpath:elasticsearch.yml" />
+  
+
+  <context:component-scan
+    base-package="
+       	org.openecomp.sdc.be.dao.impl,	
+    	org.openecomp.sdc.be.dao.es,
+		org.openecomp.sdc.be.dao.neo4j,
+		org.openecomp.sdc.be.dao.titan,
+		org.openecomp.sdc.be.resources.impl
+	">
+   
+  </context:component-scan>
+
+</beans>
diff --git a/catalog-dao/src/test/resources/cassandra.yaml b/catalog-dao/src/test/resources/cassandra.yaml
new file mode 100644
index 0000000..39f9871
--- /dev/null
+++ b/catalog-dao/src/test/resources/cassandra.yaml
@@ -0,0 +1,801 @@
+# Cassandra storage config YAML 
+
+# NOTE:
+#   See http://wiki.apache.org/cassandra/StorageConfiguration for
+#   full explanations of configuration directives
+# /NOTE
+
+# The name of the cluster. This is mainly used to prevent machines in
+# one logical cluster from joining another.
+cluster_name: 'Test Cluster'
+
+# This defines the number of tokens randomly assigned to this node on the ring
+# The more tokens, relative to other nodes, the larger the proportion of data
+# that this node will store. You probably want all nodes to have the same number
+# of tokens assuming they have equal hardware capability.
+#
+# If you leave this unspecified, Cassandra will use the default of 1 token for legacy compatibility,
+# and will use the initial_token as described below.
+#
+# Specifying initial_token will override this setting on the node's initial start,
+# on subsequent starts, this setting will apply even if initial token is set.
+#
+# If you already have a cluster with 1 token per node, and wish to migrate to 
+# multiple tokens per node, see http://wiki.apache.org/cassandra/Operations
+num_tokens: 256
+
+# initial_token allows you to specify tokens manually.  While you can use # it with
+# vnodes (num_tokens > 1, above) -- in which case you should provide a 
+# comma-separated list -- it's primarily used when adding nodes # to legacy clusters 
+# that do not have vnodes enabled.
+# initial_token:
+
+# See http://wiki.apache.org/cassandra/HintedHandoff
+# May either be "true" or "false" to enable globally, or contain a list
+# of data centers to enable per-datacenter.
+# hinted_handoff_enabled: DC1,DC2
+hinted_handoff_enabled: true
+# this defines the maximum amount of time a dead host will have hints
+# generated.  After it has been dead this long, new hints for it will not be
+# created until it has been seen alive and gone down again.
+max_hint_window_in_ms: 10800000 # 3 hours
+# Maximum throttle in KBs per second, per delivery thread.  This will be
+# reduced proportionally to the number of nodes in the cluster.  (If there
+# are two nodes in the cluster, each delivery thread will use the maximum
+# rate; if there are three, each will throttle to half of the maximum,
+# since we expect two nodes to be delivering hints simultaneously.)
+hinted_handoff_throttle_in_kb: 1024
+# Number of threads with which to deliver hints;
+# Consider increasing this number when you have multi-dc deployments, since
+# cross-dc handoff tends to be slower
+max_hints_delivery_threads: 2
+
+# Maximum throttle in KBs per second, total. This will be
+# reduced proportionally to the number of nodes in the cluster.
+batchlog_replay_throttle_in_kb: 1024
+
+# Authentication backend, implementing IAuthenticator; used to identify users
+# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthenticator,
+# PasswordAuthenticator}.
+#
+# - AllowAllAuthenticator performs no checks - set it to disable authentication.
+# - PasswordAuthenticator relies on username/password pairs to authenticate
+#   users. It keeps usernames and hashed passwords in system_auth.credentials table.
+#   Please increase system_auth keyspace replication factor if you use this authenticator.
+authenticator: AllowAllAuthenticator
+
+# Authorization backend, implementing IAuthorizer; used to limit access/provide permissions
+# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthorizer,
+# CassandraAuthorizer}.
+#
+# - AllowAllAuthorizer allows any action to any user - set it to disable authorization.
+# - CassandraAuthorizer stores permissions in system_auth.permissions table. Please
+#   increase system_auth keyspace replication factor if you use this authorizer.
+authorizer: AllowAllAuthorizer
+
+# Validity period for permissions cache (fetching permissions can be an
+# expensive operation depending on the authorizer, CassandraAuthorizer is
+# one example). Defaults to 2000, set to 0 to disable.
+# Will be disabled automatically for AllowAllAuthorizer.
+permissions_validity_in_ms: 2000
+
+# Refresh interval for permissions cache (if enabled).
+# After this interval, cache entries become eligible for refresh. Upon next
+# access, an async reload is scheduled and the old value returned until it
+# completes. If permissions_validity_in_ms is non-zero, then this must be
+# also.
+# Defaults to the same value as permissions_validity_in_ms.
+# permissions_update_interval_in_ms: 1000
+
+# The partitioner is responsible for distributing groups of rows (by
+# partition key) across nodes in the cluster.  You should leave this
+# alone for new clusters.  The partitioner can NOT be changed without
+# reloading all data, so when upgrading you should set this to the
+# same partitioner you were already using.
+#
+# Besides Murmur3Partitioner, partitioners included for backwards
+# compatibility include RandomPartitioner, ByteOrderedPartitioner, and
+# OrderPreservingPartitioner.
+#
+partitioner: org.apache.cassandra.dht.Murmur3Partitioner
+
+# Directories where Cassandra should store data on disk.  Cassandra
+# will spread data evenly across them, subject to the granularity of
+# the configured compaction strategy.
+# If not set, the default directory is $CASSANDRA_HOME/data/data.
+# data_file_directories:
+#     - /var/lib/cassandra/data
+
+# commit log.  when running on magnetic HDD, this should be a
+# separate spindle than the data directories.
+# If not set, the default directory is $CASSANDRA_HOME/data/commitlog.
+# commitlog_directory: /var/lib/cassandra/commitlog
+
+# policy for data disk failures:
+# die: shut down gossip and Thrift and kill the JVM for any fs errors or
+#      single-sstable errors, so the node can be replaced.
+# stop_paranoid: shut down gossip and Thrift even for single-sstable errors.
+# stop: shut down gossip and Thrift, leaving the node effectively dead, but
+#       can still be inspected via JMX.
+# best_effort: stop using the failed disk and respond to requests based on
+#              remaining available sstables.  This means you WILL see obsolete
+#              data at CL.ONE!
+# ignore: ignore fatal errors and let requests fail, as in pre-1.2 Cassandra
+disk_failure_policy: stop
+
+# policy for commit disk failures:
+# die: shut down gossip and Thrift and kill the JVM, so the node can be replaced.
+# stop: shut down gossip and Thrift, leaving the node effectively dead, but
+#       can still be inspected via JMX.
+# stop_commit: shutdown the commit log, letting writes collect but
+#              continuing to service reads, as in pre-2.0.5 Cassandra
+# ignore: ignore fatal errors and let the batches fail
+commit_failure_policy: stop
+
+# Maximum size of the key cache in memory.
+#
+# Each key cache hit saves 1 seek and each row cache hit saves 2 seeks at the
+# minimum, sometimes more. The key cache is fairly tiny for the amount of
+# time it saves, so it's worthwhile to use it at large numbers.
+# The row cache saves even more time, but must contain the entire row,
+# so it is extremely space-intensive. It's best to only use the
+# row cache if you have hot rows or static rows.
+#
+# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup.
+#
+# Default value is empty to make it "auto" (min(5% of Heap (in MB), 100MB)). Set to 0 to disable key cache.
+key_cache_size_in_mb:
+
+# Duration in seconds after which Cassandra should
+# save the key cache. Caches are saved to saved_caches_directory as
+# specified in this configuration file.
+#
+# Saved caches greatly improve cold-start speeds, and is relatively cheap in
+# terms of I/O for the key cache. Row cache saving is much more expensive and
+# has limited use.
+#
+# Default is 14400 or 4 hours.
+key_cache_save_period: 14400
+
+# Number of keys from the key cache to save
+# Disabled by default, meaning all keys are going to be saved
+# key_cache_keys_to_save: 100
+
+# Maximum size of the row cache in memory.
+# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup.
+#
+# Default value is 0, to disable row caching.
+row_cache_size_in_mb: 0
+
+# Duration in seconds after which Cassandra should
+# save the row cache. Caches are saved to saved_caches_directory as specified
+# in this configuration file.
+#
+# Saved caches greatly improve cold-start speeds, and is relatively cheap in
+# terms of I/O for the key cache. Row cache saving is much more expensive and
+# has limited use.
+#
+# Default is 0 to disable saving the row cache.
+row_cache_save_period: 0
+
+# Number of keys from the row cache to save
+# Disabled by default, meaning all keys are going to be saved
+# row_cache_keys_to_save: 100
+
+# Maximum size of the counter cache in memory.
+#
+# Counter cache helps to reduce counter locks' contention for hot counter cells.
+# In case of RF = 1 a counter cache hit will cause Cassandra to skip the read before
+# write entirely. With RF > 1 a counter cache hit will still help to reduce the duration
+# of the lock hold, helping with hot counter cell updates, but will not allow skipping
+# the read entirely. Only the local (clock, count) tuple of a counter cell is kept
+# in memory, not the whole counter, so it's relatively cheap.
+#
+# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup.
+#
+# Default value is empty to make it "auto" (min(2.5% of Heap (in MB), 50MB)). Set to 0 to disable counter cache.
+# NOTE: if you perform counter deletes and rely on low gcgs, you should disable the counter cache.
+counter_cache_size_in_mb:
+
+# Duration in seconds after which Cassandra should
+# save the counter cache (keys only). Caches are saved to saved_caches_directory as
+# specified in this configuration file.
+#
+# Default is 7200 or 2 hours.
+counter_cache_save_period: 7200
+
+# Number of keys from the counter cache to save
+# Disabled by default, meaning all keys are going to be saved
+# counter_cache_keys_to_save: 100
+
+# The off-heap memory allocator.  Affects storage engine metadata as
+# well as caches.  Experiments show that JEMAlloc saves some memory
+# than the native GCC allocator (i.e., JEMalloc is more
+# fragmentation-resistant).
+# 
+# Supported values are: NativeAllocator, JEMallocAllocator
+#
+# If you intend to use JEMallocAllocator you have to install JEMalloc as library and
+# modify cassandra-env.sh as directed in the file.
+#
+# Defaults to NativeAllocator
+# memory_allocator: NativeAllocator
+
+# saved caches
+# If not set, the default directory is $CASSANDRA_HOME/data/saved_caches.
+# saved_caches_directory: /var/lib/cassandra/saved_caches
+
+# commitlog_sync may be either "periodic" or "batch." 
+# 
+# When in batch mode, Cassandra won't ack writes until the commit log
+# has been fsynced to disk.  It will wait
+# commitlog_sync_batch_window_in_ms milliseconds between fsyncs.
+# This window should be kept short because the writer threads will
+# be unable to do extra work while waiting.  (You may need to increase
+# concurrent_writes for the same reason.)
+#
+# commitlog_sync: batch
+# commitlog_sync_batch_window_in_ms: 2
+#
+# the other option is "periodic" where writes may be acked immediately
+# and the CommitLog is simply synced every commitlog_sync_period_in_ms
+# milliseconds. 
+commitlog_sync: periodic
+commitlog_sync_period_in_ms: 10000
+
+# The size of the individual commitlog file segments.  A commitlog
+# segment may be archived, deleted, or recycled once all the data
+# in it (potentially from each columnfamily in the system) has been
+# flushed to sstables.  
+#
+# The default size is 32, which is almost always fine, but if you are
+# archiving commitlog segments (see commitlog_archiving.properties),
+# then you probably want a finer granularity of archiving; 8 or 16 MB
+# is reasonable.
+commitlog_segment_size_in_mb: 32
+
+# any class that implements the SeedProvider interface and has a
+# constructor that takes a Map<String, String> of parameters will do.
+seed_provider:
+    # Addresses of hosts that are deemed contact points. 
+    # Cassandra nodes use this list of hosts to find each other and learn
+    # the topology of the ring.  You must change this if you are running
+    # multiple nodes!
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          # seeds is actually a comma-delimited list of addresses.
+          # Ex: "<ip1>,<ip2>,<ip3>"
+          - seeds: "127.0.0.1"
+
+# For workloads with more data than can fit in memory, Cassandra's
+# bottleneck will be reads that need to fetch data from
+# disk. "concurrent_reads" should be set to (16 * number_of_drives) in
+# order to allow the operations to enqueue low enough in the stack
+# that the OS and drives can reorder them. Same applies to
+# "concurrent_counter_writes", since counter writes read the current
+# values before incrementing and writing them back.
+#
+# On the other hand, since writes are almost never IO bound, the ideal
+# number of "concurrent_writes" is dependent on the number of cores in
+# your system; (8 * number_of_cores) is a good rule of thumb.
+concurrent_reads: 32
+concurrent_writes: 32
+concurrent_counter_writes: 32
+
+# Total memory to use for sstable-reading buffers.  Defaults to
+# the smaller of 1/4 of heap or 512MB.
+# file_cache_size_in_mb: 512
+
+# Total permitted memory to use for memtables. Cassandra will stop 
+# accepting writes when the limit is exceeded until a flush completes,
+# and will trigger a flush based on memtable_cleanup_threshold
+# If omitted, Cassandra will set both to 1/4 the size of the heap.
+# memtable_heap_space_in_mb: 2048
+# memtable_offheap_space_in_mb: 2048
+
+# Ratio of occupied non-flushing memtable size to total permitted size
+# that will trigger a flush of the largest memtable.  Lager mct will
+# mean larger flushes and hence less compaction, but also less concurrent
+# flush activity which can make it difficult to keep your disks fed
+# under heavy write load.
+#
+# memtable_cleanup_threshold defaults to 1 / (memtable_flush_writers + 1)
+# memtable_cleanup_threshold: 0.11
+
+# Specify the way Cassandra allocates and manages memtable memory.
+# Options are:
+#   heap_buffers:    on heap nio buffers
+#   offheap_buffers: off heap (direct) nio buffers
+#   offheap_objects: native memory, eliminating nio buffer heap overhead
+memtable_allocation_type: heap_buffers
+
+# Total space to use for commitlogs.  Since commitlog segments are
+# mmapped, and hence use up address space, the default size is 32
+# on 32-bit JVMs, and 8192 on 64-bit JVMs.
+#
+# If space gets above this value (it will round up to the next nearest
+# segment multiple), Cassandra will flush every dirty CF in the oldest
+# segment and remove it.  So a small total commitlog space will tend
+# to cause more flush activity on less-active columnfamilies.
+# commitlog_total_space_in_mb: 8192
+
+# This sets the amount of memtable flush writer threads.  These will
+# be blocked by disk io, and each one will hold a memtable in memory
+# while blocked. 
+#
+# memtable_flush_writers defaults to the smaller of (number of disks,
+# number of cores), with a minimum of 2 and a maximum of 8.
+# 
+# If your data directories are backed by SSD, you should increase this
+# to the number of cores.
+#memtable_flush_writers: 8
+
+# A fixed memory pool size in MB for for SSTable index summaries. If left
+# empty, this will default to 5% of the heap size. If the memory usage of
+# all index summaries exceeds this limit, SSTables with low read rates will
+# shrink their index summaries in order to meet this limit.  However, this
+# is a best-effort process. In extreme conditions Cassandra may need to use
+# more than this amount of memory.
+index_summary_capacity_in_mb:
+
+# How frequently index summaries should be resampled.  This is done
+# periodically to redistribute memory from the fixed-size pool to sstables
+# proportional their recent read rates.  Setting to -1 will disable this
+# process, leaving existing index summaries at their current sampling level.
+index_summary_resize_interval_in_minutes: 60
+
+# Whether to, when doing sequential writing, fsync() at intervals in
+# order to force the operating system to flush the dirty
+# buffers. Enable this to avoid sudden dirty buffer flushing from
+# impacting read latencies. Almost always a good idea on SSDs; not
+# necessarily on platters.
+trickle_fsync: false
+trickle_fsync_interval_in_kb: 10240
+
+# TCP port, for commands and data
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+storage_port: 7000
+
+# SSL port, for encrypted communication.  Unused unless enabled in
+# encryption_options
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+ssl_storage_port: 7001
+
+# Address or interface to bind to and tell other Cassandra nodes to connect to.
+# You _must_ change this if you want multiple nodes to be able to communicate!
+#
+# Set listen_address OR listen_interface, not both. Interfaces must correspond
+# to a single address, IP aliasing is not supported.
+#
+# Leaving it blank leaves it up to InetAddress.getLocalHost(). This
+# will always do the Right Thing _if_ the node is properly configured
+# (hostname, name resolution, etc), and the Right Thing is to use the
+# address associated with the hostname (it might not be).
+#
+# Setting listen_address to 0.0.0.0 is always wrong.
+#
+# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address
+# you can specify which should be chosen using listen_interface_prefer_ipv6. If false the first ipv4
+# address will be used. If true the first ipv6 address will be used. Defaults to false preferring
+# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6.
+listen_address: localhost
+# listen_interface: eth0
+# listen_interface_prefer_ipv6: false
+
+# Address to broadcast to other Cassandra nodes
+# Leaving this blank will set it to the same value as listen_address
+# broadcast_address: 1.2.3.4
+
+# Internode authentication backend, implementing IInternodeAuthenticator;
+# used to allow/disallow connections from peer nodes.
+# internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
+
+# Whether to start the native transport server.
+# Please note that the address on which the native transport is bound is the
+# same as the rpc_address. The port however is different and specified below.
+start_native_transport: true
+# port for the CQL native transport to listen for clients on
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+native_transport_port: 9042
+# The maximum threads for handling requests when the native transport is used.
+# This is similar to rpc_max_threads though the default differs slightly (and
+# there is no native_transport_min_threads, idle threads will always be stopped
+# after 30 seconds).
+# native_transport_max_threads: 128
+#
+# The maximum size of allowed frame. Frame (requests) larger than this will
+# be rejected as invalid. The default is 256MB.
+# native_transport_max_frame_size_in_mb: 256
+
+# The maximum number of concurrent client connections.
+# The default is -1, which means unlimited.
+# native_transport_max_concurrent_connections: -1
+
+# The maximum number of concurrent client connections per source ip.
+# The default is -1, which means unlimited.
+# native_transport_max_concurrent_connections_per_ip: -1
+
+# Whether to start the thrift rpc server.
+start_rpc: true
+
+# The address or interface to bind the Thrift RPC service and native transport
+# server to.
+#
+# Set rpc_address OR rpc_interface, not both. Interfaces must correspond
+# to a single address, IP aliasing is not supported.
+#
+# Leaving rpc_address blank has the same effect as on listen_address
+# (i.e. it will be based on the configured hostname of the node).
+#
+# Note that unlike listen_address, you can specify 0.0.0.0, but you must also
+# set broadcast_rpc_address to a value other than 0.0.0.0.
+#
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+#
+# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address
+# you can specify which should be chosen using rpc_interface_prefer_ipv6. If false the first ipv4
+# address will be used. If true the first ipv6 address will be used. Defaults to false preferring
+# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6.
+rpc_address: 0.0.0.0
+# rpc_interface: eth1
+# rpc_interface_prefer_ipv6: false
+
+# port for Thrift to listen for clients on
+rpc_port: 9160
+
+# RPC address to broadcast to drivers and other Cassandra nodes. This cannot
+# be set to 0.0.0.0. If left blank, this will be set to the value of
+# rpc_address. If rpc_address is set to 0.0.0.0, broadcast_rpc_address must
+# be set.
+broadcast_rpc_address: 127.0.0.1
+
+
+
+
+
+
+# enable or disable keepalive on rpc/native connections
+rpc_keepalive: true
+
+# Cassandra provides two out-of-the-box options for the RPC Server:
+#
+# sync  -> One thread per thrift connection. For a very large number of clients, memory
+#          will be your limiting factor. On a 64 bit JVM, 180KB is the minimum stack size
+#          per thread, and that will correspond to your use of virtual memory (but physical memory
+#          may be limited depending on use of stack space).
+#
+# hsha  -> Stands for "half synchronous, half asynchronous." All thrift clients are handled
+#          asynchronously using a small number of threads that does not vary with the amount
+#          of thrift clients (and thus scales well to many clients). The rpc requests are still
+#          synchronous (one thread per active request). If hsha is selected then it is essential
+#          that rpc_max_threads is changed from the default value of unlimited.
+#
+# The default is sync because on Windows hsha is about 30% slower.  On Linux,
+# sync/hsha performance is about the same, with hsha of course using less memory.
+#
+# Alternatively,  can provide your own RPC server by providing the fully-qualified class name
+# of an o.a.c.t.TServerFactory that can create an instance of it.
+rpc_server_type: sync
+
+# Uncomment rpc_min|max_thread to set request pool size limits.
+#
+# Regardless of your choice of RPC server (see above), the number of maximum requests in the
+# RPC thread pool dictates how many concurrent requests are possible (but if you are using the sync
+# RPC server, it also dictates the number of clients that can be connected at all).
+#
+# The default is unlimited and thus provides no protection against clients overwhelming the server. You are
+# encouraged to set a maximum that makes sense for you in production, but do keep in mind that
+# rpc_max_threads represents the maximum number of client requests this server may execute concurrently.
+#
+# rpc_min_threads: 16
+# rpc_max_threads: 2048
+
+# uncomment to set socket buffer sizes on rpc connections
+# rpc_send_buff_size_in_bytes:
+# rpc_recv_buff_size_in_bytes:
+
+# Uncomment to set socket buffer size for internode communication
+# Note that when setting this, the buffer size is limited by net.core.wmem_max
+# and when not setting it it is defined by net.ipv4.tcp_wmem
+# See:
+# /proc/sys/net/core/wmem_max
+# /proc/sys/net/core/rmem_max
+# /proc/sys/net/ipv4/tcp_wmem
+# /proc/sys/net/ipv4/tcp_wmem
+# and: man tcp
+# internode_send_buff_size_in_bytes:
+# internode_recv_buff_size_in_bytes:
+
+# Frame size for thrift (maximum message length).
+thrift_framed_transport_size_in_mb: 15
+
+# Set to true to have Cassandra create a hard link to each sstable
+# flushed or streamed locally in a backups/ subdirectory of the
+# keyspace data.  Removing these links is the operator's
+# responsibility.
+incremental_backups: false
+
+# Whether or not to take a snapshot before each compaction.  Be
+# careful using this option, since Cassandra won't clean up the
+# snapshots for you.  Mostly useful if you're paranoid when there
+# is a data format change.
+snapshot_before_compaction: false
+
+# Whether or not a snapshot is taken of the data before keyspace truncation
+# or dropping of column families. The STRONGLY advised default of true 
+# should be used to provide data safety. If you set this flag to false, you will
+# lose data on truncation or drop.
+auto_snapshot: true
+
+# When executing a scan, within or across a partition, we need to keep the
+# tombstones seen in memory so we can return them to the coordinator, which
+# will use them to make sure other replicas also know about the deleted rows.
+# With workloads that generate a lot of tombstones, this can cause performance
+# problems and even exaust the server heap.
+# (http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets)
+# Adjust the thresholds here if you understand the dangers and want to
+# scan more tombstones anyway.  These thresholds may also be adjusted at runtime
+# using the StorageService mbean.
+tombstone_warn_threshold: 1000
+tombstone_failure_threshold: 100000
+
+# Granularity of the collation index of rows within a partition.
+# Increase if your rows are large, or if you have a very large
+# number of rows per partition.  The competing goals are these:
+#   1) a smaller granularity means more index entries are generated
+#      and looking up rows withing the partition by collation column
+#      is faster
+#   2) but, Cassandra will keep the collation index in memory for hot
+#      rows (as part of the key cache), so a larger granularity means
+#      you can cache more hot rows
+column_index_size_in_kb: 64
+
+
+# Log WARN on any batch size exceeding this value. 5kb per batch by default.
+# Caution should be taken on increasing the size of this threshold as it can lead to node instability.
+batch_size_warn_threshold_in_kb: 5
+
+# Number of simultaneous compactions to allow, NOT including
+# validation "compactions" for anti-entropy repair.  Simultaneous
+# compactions can help preserve read performance in a mixed read/write
+# workload, by mitigating the tendency of small sstables to accumulate
+# during a single long running compactions. The default is usually
+# fine and if you experience problems with compaction running too
+# slowly or too fast, you should look at
+# compaction_throughput_mb_per_sec first.
+#
+# concurrent_compactors defaults to the smaller of (number of disks,
+# number of cores), with a minimum of 2 and a maximum of 8.
+# 
+# If your data directories are backed by SSD, you should increase this
+# to the number of cores.
+#concurrent_compactors: 1
+
+# Throttles compaction to the given total throughput across the entire
+# system. The faster you insert data, the faster you need to compact in
+# order to keep the sstable count down, but in general, setting this to
+# 16 to 32 times the rate you are inserting data is more than sufficient.
+# Setting this to 0 disables throttling. Note that this account for all types
+# of compaction, including validation compaction.
+compaction_throughput_mb_per_sec: 16
+
+# When compacting, the replacement sstable(s) can be opened before they
+# are completely written, and used in place of the prior sstables for
+# any range that has been written. This helps to smoothly transfer reads 
+# between the sstables, reducing page cache churn and keeping hot rows hot
+sstable_preemptive_open_interval_in_mb: 50
+
+# Throttles all outbound streaming file transfers on this node to the
+# given total throughput in Mbps. This is necessary because Cassandra does
+# mostly sequential IO when streaming data during bootstrap or repair, which
+# can lead to saturating the network connection and degrading rpc performance.
+# When unset, the default is 200 Mbps or 25 MB/s.
+# stream_throughput_outbound_megabits_per_sec: 200
+
+# Throttles all streaming file transfer between the datacenters,
+# this setting allows users to throttle inter dc stream throughput in addition
+# to throttling all network stream traffic as configured with
+# stream_throughput_outbound_megabits_per_sec
+# inter_dc_stream_throughput_outbound_megabits_per_sec:
+
+# How long the coordinator should wait for read operations to complete
+read_request_timeout_in_ms: 5000
+# How long the coordinator should wait for seq or index scans to complete
+range_request_timeout_in_ms: 10000
+# How long the coordinator should wait for writes to complete
+write_request_timeout_in_ms: 2000
+# How long the coordinator should wait for counter writes to complete
+counter_write_request_timeout_in_ms: 5000
+# How long a coordinator should continue to retry a CAS operation
+# that contends with other proposals for the same row
+cas_contention_timeout_in_ms: 1000
+# How long the coordinator should wait for truncates to complete
+# (This can be much longer, because unless auto_snapshot is disabled
+# we need to flush first so we can snapshot before removing the data.)
+truncate_request_timeout_in_ms: 60000
+# The default timeout for other, miscellaneous operations
+request_timeout_in_ms: 10000
+
+# Enable operation timeout information exchange between nodes to accurately
+# measure request timeouts.  If disabled, replicas will assume that requests
+# were forwarded to them instantly by the coordinator, which means that
+# under overload conditions we will waste that much extra time processing 
+# already-timed-out requests.
+#
+# Warning: before enabling this property make sure to ntp is installed
+# and the times are synchronized between the nodes.
+cross_node_timeout: false
+
+# Enable socket timeout for streaming operation.
+# When a timeout occurs during streaming, streaming is retried from the start
+# of the current file. This _can_ involve re-streaming an important amount of
+# data, so you should avoid setting the value too low.
+# Default value is 0, which never timeout streams.
+# streaming_socket_timeout_in_ms: 0
+
+# phi value that must be reached for a host to be marked down.
+# most users should never need to adjust this.
+# phi_convict_threshold: 8
+
+# endpoint_snitch -- Set this to a class that implements
+# IEndpointSnitch.  The snitch has two functions:
+# - it teaches Cassandra enough about your network topology to route
+#   requests efficiently
+# - it allows Cassandra to spread replicas around your cluster to avoid
+#   correlated failures. It does this by grouping machines into
+#   "datacenters" and "racks."  Cassandra will do its best not to have
+#   more than one replica on the same "rack" (which may not actually
+#   be a physical location)
+#
+# IF YOU CHANGE THE SNITCH AFTER DATA IS INSERTED INTO THE CLUSTER,
+# YOU MUST RUN A FULL REPAIR, SINCE THE SNITCH AFFECTS WHERE REPLICAS
+# ARE PLACED.
+#
+# Out of the box, Cassandra provides
+#  - SimpleSnitch:
+#    Treats Strategy order as proximity. This can improve cache
+#    locality when disabling read repair.  Only appropriate for
+#    single-datacenter deployments.
+#  - GossipingPropertyFileSnitch
+#    This should be your go-to snitch for production use.  The rack
+#    and datacenter for the local node are defined in
+#    cassandra-rackdc.properties and propagated to other nodes via
+#    gossip.  If cassandra-topology.properties exists, it is used as a
+#    fallback, allowing migration from the PropertyFileSnitch.
+#  - PropertyFileSnitch:
+#    Proximity is determined by rack and data center, which are
+#    explicitly configured in cassandra-topology.properties.
+#  - Ec2Snitch:
+#    Appropriate for EC2 deployments in a single Region. Loads Region
+#    and Availability Zone information from the EC2 API. The Region is
+#    treated as the datacenter, and the Availability Zone as the rack.
+#    Only private IPs are used, so this will not work across multiple
+#    Regions.
+#  - Ec2MultiRegionSnitch:
+#    Uses public IPs as broadcast_address to allow cross-region
+#    connectivity.  (Thus, you should set seed addresses to the public
+#    IP as well.) You will need to open the storage_port or
+#    ssl_storage_port on the public IP firewall.  (For intra-Region
+#    traffic, Cassandra will switch to the private IP after
+#    establishing a connection.)
+#  - RackInferringSnitch:
+#    Proximity is determined by rack and data center, which are
+#    assumed to correspond to the 3rd and 2nd octet of each node's IP
+#    address, respectively.  Unless this happens to match your
+#    deployment conventions, this is best used as an example of
+#    writing a custom Snitch class and is provided in that spirit.
+#
+# You can use a custom Snitch by setting this to the full class name
+# of the snitch, which will be assumed to be on your classpath.
+endpoint_snitch: SimpleSnitch
+
+# controls how often to perform the more expensive part of host score
+# calculation
+dynamic_snitch_update_interval_in_ms: 100 
+# controls how often to reset all host scores, allowing a bad host to
+# possibly recover
+dynamic_snitch_reset_interval_in_ms: 600000
+# if set greater than zero and read_repair_chance is < 1.0, this will allow
+# 'pinning' of replicas to hosts in order to increase cache capacity.
+# The badness threshold will control how much worse the pinned host has to be
+# before the dynamic snitch will prefer other replicas over it.  This is
+# expressed as a double which represents a percentage.  Thus, a value of
+# 0.2 means Cassandra would continue to prefer the static snitch values
+# until the pinned host was 20% worse than the fastest.
+dynamic_snitch_badness_threshold: 0.1
+
+# request_scheduler -- Set this to a class that implements
+# RequestScheduler, which will schedule incoming client requests
+# according to the specific policy. This is useful for multi-tenancy
+# with a single Cassandra cluster.
+# NOTE: This is specifically for requests from the client and does
+# not affect inter node communication.
+# org.apache.cassandra.scheduler.NoScheduler - No scheduling takes place
+# org.apache.cassandra.scheduler.RoundRobinScheduler - Round robin of
+# client requests to a node with a separate queue for each
+# request_scheduler_id. The scheduler is further customized by
+# request_scheduler_options as described below.
+request_scheduler: org.apache.cassandra.scheduler.NoScheduler
+
+# Scheduler Options vary based on the type of scheduler
+# NoScheduler - Has no options
+# RoundRobin
+#  - throttle_limit -- The throttle_limit is the number of in-flight
+#                      requests per client.  Requests beyond 
+#                      that limit are queued up until
+#                      running requests can complete.
+#                      The value of 80 here is twice the number of
+#                      concurrent_reads + concurrent_writes.
+#  - default_weight -- default_weight is optional and allows for
+#                      overriding the default which is 1.
+#  - weights -- Weights are optional and will default to 1 or the
+#               overridden default_weight. The weight translates into how
+#               many requests are handled during each turn of the
+#               RoundRobin, based on the scheduler id.
+#
+# request_scheduler_options:
+#    throttle_limit: 80
+#    default_weight: 5
+#    weights:
+#      Keyspace1: 1
+#      Keyspace2: 5
+
+# request_scheduler_id -- An identifier based on which to perform
+# the request scheduling. Currently the only valid option is keyspace.
+# request_scheduler_id: keyspace
+
+# Enable or disable inter-node encryption
+# Default settings are TLS v1, RSA 1024-bit keys (it is imperative that
+# users generate their own keys) TLS_RSA_WITH_AES_128_CBC_SHA as the cipher
+# suite for authentication, key exchange and encryption of the actual data transfers.
+# Use the DHE/ECDHE ciphers if running in FIPS 140 compliant mode.
+# NOTE: No custom encryption options are enabled at the moment
+# The available internode options are : all, none, dc, rack
+#
+# If set to dc cassandra will encrypt the traffic between the DCs
+# If set to rack cassandra will encrypt the traffic between the racks
+#
+# The passwords used in these options must match the passwords used when generating
+# the keystore and truststore.  For instructions on generating these files, see:
+# http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore
+#
+server_encryption_options:
+    internode_encryption: none
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    truststore: conf/.truststore
+    truststore_password: cassandra
+    # More advanced defaults below:
+    # protocol: TLS
+    # algorithm: SunX509
+    # store_type: JKS
+    # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA]
+    # require_client_auth: false
+
+# enable or disable client/server encryption.
+client_encryption_options:
+    enabled: false
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    # require_client_auth: false
+    # Set trustore and truststore_password if require_client_auth is true
+    # truststore: conf/.truststore
+    # truststore_password: cassandra
+    # More advanced defaults below:
+    # protocol: TLS
+    # algorithm: SunX509
+    # store_type: JKS
+    # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA]
+
+# internode_compression controls whether traffic between nodes is
+# compressed.
+# can be:  all  - all traffic is compressed
+#          dc   - traffic between different datacenters is compressed
+#          none - nothing is compressed.
+internode_compression: all
+
+# Enable or disable tcp_nodelay for inter-dc communication.
+# Disabling it will result in larger (but fewer) network packets being sent,
+# reducing overhead from the TCP protocol itself, at the cost of increasing
+# latency if you block for cross-datacenter responses.
+inter_dc_tcp_nodelay: false
diff --git a/catalog-dao/src/test/resources/config/catalog-dao/configuration.yaml b/catalog-dao/src/test/resources/config/catalog-dao/configuration.yaml
new file mode 100644
index 0000000..0b43e3b
--- /dev/null
+++ b/catalog-dao/src/test/resources/config/catalog-dao/configuration.yaml
@@ -0,0 +1,120 @@
+identificationHeaderFields:
+   - HTTP_IV_USER
+   - HTTP_CSP_FIRSTNAME
+   - HTTP_CSP_LASTNAME
+   - HTTP_IV_REMOTE_ADDRESS
+   - HTTP_CSP_WSTYPE
+
+
+# catalog backend hostname
+beFqdn: 172.20.43.124:8080
+
+
+# catalog backend http port
+beHttpPort: 8080
+
+# catalog backend http context
+beContext: /sdc/rest/config/get
+
+# catalog backend protocol
+beProtocol: http
+
+# catalog backend ssl port
+beSslPort: 8443
+
+version: 1.0
+released: 2012-11-30
+
+titanCfgFile: src/main/resources/config/titan.properties
+titanInMemoryGraph: true
+titanLockTimeout: 30
+
+# Protocols
+protocols:
+   - http
+   - https
+
+# Users
+users:
+    tom: passwd
+    bob: passwd
+#Neoj4
+neo4j:
+    host: neo4jhost
+    port: 7474
+    user: neo4j
+    password: "12345"
+    maxHttpConnection: 100
+    maxHttpPerRoute: 20
+
+cassandraConfig:
+    cassandraHosts: ['mtanjv9sdcg44']
+    localDataCenter:
+    reconnectTimeout : 30000
+    authenticate: false
+    username: koko
+    password: bobo
+    ssl: false
+    truststorePath : /path/path
+    truststorePassword : 123123
+    keySpaces:
+        - { name: sdcaudit, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+        - { name: sdcartifact, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+
+#Application-specific settings of ES
+elasticSearch:
+    # Mapping of index prefix to time-based frame. For example, if below is configured:
+    #
+    # - indexPrefix: auditingevents
+    #    creationPeriod: minute
+    #
+    # then ES object of type which is mapped to "auditingevents-*" template, and created on 2015-12-23 13:24:54, will enter "auditingevents-2015-12-23-13-24" index.
+    # Another object created on 2015-12-23 13:25:54, will enter "auditingevents-2015-12-23-13-25" index.
+    # If creationPeriod: month, both of the above will enter "auditingevents-2015-12" index.
+    #
+    # Legal values for creationPeriod - year, month, day, hour, minute, none (meaning no time-based behaviour).
+    #
+    # If no creationPeriod is configured for indexPrefix, default behavour is creationPeriod: month.
+ 
+    indicesTimeFrequency:
+      - indexPrefix: auditingevents
+        creationPeriod: month
+
+switchoverDetector:
+    gBeFqdn: AIO-BE.ecomp.idns.cip
+    gFeFqdn: AIO-FE.ecomp.idns.cip
+    beVip: 1.2.3.4
+    feVip: 1.2.3.4
+    beResolveAttempts: 3
+    feResolveAttempts: 3
+    enabled: false
+    interval: 60
+    changePriorityUser: ecompasdc
+    changePriorityPassword: ecompasdc123
+    publishNetworkUrl: "http://cora.web/crt/CipDomain.ECOMP-ASDC-DEVST/config/update_network?user=root"
+    publishNetworkBody: '{"note":"publish network"}'
+    groups:
+      beSet: { changePriorityUrl: "http://cora.web/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-BE.ecomp.idns.cip?user=root",
+               changePriorityBody: '{"name":"AIO-BE.ecomp.idns.cip","uri":"/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-BE.ecomp.idns.cip","no_ad_redirection":false,"v4groups":{"failover_groups":["/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_mg_be","/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_bs_be"],"failover_policy":["FAILALL"]},"comment":"AIO BE G-fqdn","intended_app_proto":"DNS"}'}
+      feSet: { changePriorityUrl: "http://cora.web/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-FE.ecomp.idns.cip?user=root",
+               changePriorityBody: '{"comment":"AIO G-fqdn","name":"AIO-FE.ecomp.idns.cip","v4groups":{"failover_groups":["/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_mg_fe","/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_bs_fe"],"failover_policy":["FAILALL"]},"no_ad_redirection":false,"intended_app_proto":"DNS","uri":"/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-FE.ecomp.idns.cip"}'}
+
+applicationL1Cache:
+    datatypes:
+        enabled: true
+        firstRunDelay: 10
+        pollIntervalInSec: 60
+
+applicationL2Cache:
+    enabled: true
+    catalogL1Cache:
+        enabled: true
+        resourcesSizeInCache: 300
+        servicesSizeInCache: 200
+        productsSizeInCache: 100
+    queue:
+        syncIntervalInSecondes: 60
+        waitOnShutDownInMinutes: 30
+        numberOfCacheWorkers: 4
+toscaValidators:
+    stringMaxLength: 1024
\ No newline at end of file
diff --git a/catalog-dao/src/test/resources/config/catalog-dao/ecomp-error-configuration.yaml b/catalog-dao/src/test/resources/config/catalog-dao/ecomp-error-configuration.yaml
new file mode 100644
index 0000000..9d7cd74
--- /dev/null
+++ b/catalog-dao/src/test/resources/config/catalog-dao/ecomp-error-configuration.yaml
@@ -0,0 +1,383 @@
+###########################################
+# Note the conventions of the field values:
+# type can be one of: CONFIG_ERROR, SYSTEM_ERROR, DATA_ERROR, CONNECTION_PROBLEM, AUTHENTICATION_PROBLEM
+# severity can be one of: WARN, ERROR, FATAL
+# alarmSeverity can be one of: CRITICAL,MAJOR,MINOR,INFORMATIONAL,NONE
+# code is a unique integer in range of 3003-9999 (3000-3002 are occupied for internal usage)
+# The above enumeration values are out-of-the-box and can be changed in code. 
+# In case of config and code mismatch, the appropriate error will be printed to log
+#
+## Range of BE codes - 3010-7999
+
+errors:
+
+    BeRestApiGeneralError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4000,
+        severity: ERROR,
+        description: "Unexpected error during BE REST API execution",
+        alarmSeverity: CRITICAL
+    }
+
+    BeHealthCheckError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3010,
+        severity: ERROR,
+        description: "Error during BE Health Check",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInitializationError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4019,
+        severity: ERROR,
+        description: "Catalog-BE was not initialized properly",
+        alarmSeverity: CRITICAL
+    }
+
+    BeResourceMissingError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3011,
+        severity: ERROR,
+        description: "Mandatory resource %s cannot be found in repository",
+        alarmSeverity: MAJOR
+    }
+    
+    BeServiceMissingError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3012,
+        severity: ERROR,
+        description: "Mandatory service %s cannot be found in repository",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedAddingResourceInstanceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3013,
+        severity: ERROR,
+        description: "Failed to add resource instance of resource %s to service %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeIncorrectServiceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3014,
+        severity: ERROR,
+        description: "Service %s is not valid",
+        alarmSeverity: MAJOR
+    }
+     
+    BeRepositoryDeleteError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3015,
+        severity: ERROR,
+        description: "Failed to delete object %s from repository",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeRepositoryQueryError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3016,
+        severity: ERROR,
+        description: "Failed to fetch from repository %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeInvalidConfigurationError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3017,
+        severity: FATAL,
+        description: "Configuration parameter %s is invalid. Value configured is %s",
+        alarmSeverity: MAJOR
+    }
+   
+    BeUebConnectionError: {
+        type: CONNECTION_PROBLEM,
+        code: ASDC_4001,
+        severity: ERROR,
+        description: "Connection problem towards U-EB server. Reason: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3019,
+        severity: ERROR,
+        description: "Error occured during access to U-EB Server. Operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebObjectNotFoundError: {
+        type: DATA_ERROR,
+        code: ASDC_4005,
+        severity: ERROR,
+        description: "Error occured during access to U-EB Server. Data not found: %s",
+        alarmSeverity: MAJOR
+    }
+
+    BeDistributionEngineSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3021,
+        severity: ERROR,
+        description: "Error occured in Distribution Engine. Failed operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebAuthenticationError: {
+        type: AUTHENTICATION_PROBLEM,
+        code: ASDC_4003,
+        severity: ERROR,
+        description: "Authentication problem towards U-EB server. Reason: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebUnkownHostError: {
+        type: CONNECTION_PROBLEM,
+        code: ASDC_4002,
+        severity: ERROR,
+        description: "Connection problem towards U-EB server. Cannot reach host %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDistributionEngineInvalidArtifactType: {
+        type: DATA_ERROR,
+        code: ASDC_4006,
+        severity: WARN,
+        description: "The artifact type %s does not appear in the list of valid artifacts %s",
+        alarmSeverity: MAJOR
+    }
+    BeInvalidTypeError: {
+        type: DATA_ERROR,
+        code: ASDC_4008,
+        severity: WARN,
+        description: "The type %s of %s is invalid",
+        alarmSeverity: MAJOR
+    }
+    BeInvalidValueError: {
+        type: DATA_ERROR,
+        code: ASDC_3028,
+        severity: WARN,
+        description: "The value %s of %s from type %s is invalid",
+        alarmSeverity: MAJOR
+    } 
+    
+    BeFailedDeletingResourceInstanceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3029,
+        severity: ERROR,
+        description: "Failed to delete resource instance %s from service %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeMissingConfigurationError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3030,
+        severity: FATAL,
+        description: "Configuration parameter %s is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeConfigurationInvalidListSizeError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3031,
+        severity: FATAL,
+        description: "Configuration parameter %s is invalid. At least %s values shall be configured",
+        alarmSeverity: MAJOR
+    }
+    
+    ErrorConfigFileFormat: {
+        type: CONFIG_ERROR,
+        code: ASDC_3032,
+        severity: ERROR,
+        description: "Error element not found in YAML name: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeMissingArtifactInformationError: {
+        type: DATA_ERROR,
+        code: ASDC_4010,
+        severity: ERROR,
+        description: "Artifact uploaded has missing information. Missing %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4011,
+        severity: ERROR,
+        description: "Artifact %s requested is not found",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactPayloadInvalid: {
+        type: DATA_ERROR,
+        code: ASDC_4012,
+        severity: ERROR,
+        description: "Payload of artifact uploaded is invalid (invalid MD5 or encryption)",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUserMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4009,
+        severity: ERROR,
+        description: "User %s requested is not found",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactInformationInvalidError: {
+        type: DATA_ERROR,
+        code: ASDC_4013,
+        severity: ERROR,
+        description: "Input for artifact metadata is invalid",
+        alarmSeverity: MAJOR
+    }
+    BeFailedAddingCapabilityTypeError: {
+        type: DATA_ERROR,
+        code: ASDC_4015,
+        severity: ERROR,
+        description: "Failed adding capability type",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeCapabilityTypeMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4016,
+        severity: ERROR,
+        description: "Capability Type %s not found",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInterfaceMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4020,
+        severity: ERROR,
+        description: "Interface %s required is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDaoSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4014,
+        severity: ERROR,
+        description: "Operation towards database failed",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4017,
+        severity: ERROR,
+        description: "Unexpected error during operation",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeFailedLockObjectError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4007,
+        severity: WARN,
+        description: "Failed to lock object for update",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInvalidJsonInput: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4018,
+        severity: ERROR,
+        description: "Failed to convert json input to object",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDistributionMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4021,
+        severity: ERROR,
+        description: "Distribution %s required is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeHealthCheckRecovery: {
+        type: RECOVERY,
+        code: ASDC_4022,
+        severity: INFO,
+        description: "BE Health Check Recovery",
+        alarmSeverity: INFORMATIONAL
+    }
+    BeFailedCreateNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6000,
+        severity: ERROR,
+        description: "Failed to create node %s on graph. status is %s",
+        alarmSeverity: MAJOR
+    }
+    BeFailedUpdateNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6001,
+        severity: ERROR,
+        description: "Failed to update node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedDeleteNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6002,
+        severity: ERROR,
+        description: "Failed to delete node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedRetrieveNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6003,
+        severity: ERROR,
+        description: "Failed to retrieve node %s from graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeExecuteRollbackError: {
+        type: DATA_ERROR,
+        code: ASDC_6004,
+        severity: ERROR,
+        description: "Going to execute rollback on graph.",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindParentError: {
+        type: DATA_ERROR,
+        code: ASDC_6005,
+        severity: ERROR,
+        description: "Failed to find parent node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAllNodesError: {
+        type: DATA_ERROR,
+        code: ASDC_6006,
+        severity: ERROR,
+        description: "Failed to fetch all nodes with type %s of parent node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAssociationError: {
+        type: DATA_ERROR,
+        code: ASDC_6007,
+        severity: ERROR,
+        description: "Cannot find node with type %s associated with node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAssociationError: {
+        type: DATA_ERROR,
+        code: ASDC_6008,
+        severity: ERROR,
+        description: "Cannot find node with type %s associated with node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    BeComponentCleanerSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_6009,
+        severity: ERROR,
+        description: "Error occured in Component Cleaner Task. Failed operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
\ No newline at end of file
diff --git a/catalog-dao/src/test/resources/elasticsearch.yml b/catalog-dao/src/test/resources/elasticsearch.yml
new file mode 100644
index 0000000..e1808ad
--- /dev/null
+++ b/catalog-dao/src/test/resources/elasticsearch.yml
@@ -0,0 +1,392 @@
+
+elasticSearch.local: true
+elasticSearch.transportclient: false
+cluster.name: elasticsearch_1_5_2222
+  
+discovery.zen.ping.multicast.enabled: false
+discovery.zen.ping.unicast.enabled: true
+discovery.zen.ping.unicast.hosts: 1.2.3.4
+transport.client.initial_nodes:
+   - 1.2.3.4:9300
+
+
+#plugin.types: "DeleteByQueryPlugin"
+
+##################### Elasticsearch Configuration Example #####################
+
+# This file contains an overview of various configuration settings,
+# targeted at operations staff. Application developers should
+# consult the guide at <http://elasticsearch.org/guide>.
+#
+# The installation procedure is covered at
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html>.
+#
+# Elasticsearch comes with reasonable defaults for most settings,
+# so you can try it out without bothering with configuration.
+#
+# Most of the time, these defaults are just fine for running a production
+# cluster. If you're fine-tuning your cluster, or wondering about the
+# effect of certain configuration option, please _do ask_ on the
+# mailing list or IRC channel [http://elasticsearch.org/community].
+
+# Any element in the configuration can be replaced with environment variables
+# by placing them in ${...} notation. For example:
+#
+# node.rack: ${RACK_ENV_VAR}
+
+# For information on supported formats and syntax for the config file, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html>
+
+
+################################### Cluster ###################################
+
+# Cluster name identifies your cluster for auto-discovery. If you're running
+# multiple clusters on the same network, make sure you're using unique names.
+#
+# cluster.name: elasticsearch
+
+
+#################################### Node #####################################
+
+# Node names are generated dynamically on startup, so you're relieved
+# from configuring them manually. You can tie this node to a specific name:
+#
+# node.name: "Franz Kafka"
+
+# Every node can be configured to allow or deny being eligible as the master,
+# and to allow or deny to store the data.
+#
+# Allow this node to be eligible as a master node (enabled by default):
+#
+# node.master: true
+#
+# Allow this node to store data (enabled by default):
+#
+# node.data: true
+
+# You can exploit these settings to design advanced cluster topologies.
+#
+# 1. You want this node to never become a master node, only to hold data.
+#    This will be the "workhorse" of your cluster.
+#
+# node.master: false
+# node.data: true
+#
+# 2. You want this node to only serve as a master: to not store any data and
+#    to have free resources. This will be the "coordinator" of your cluster.
+#
+# node.master: true
+# node.data: false
+#
+# 3. You want this node to be neither master nor data node, but
+#    to act as a "search load balancer" (fetching data from nodes,
+#    aggregating results, etc.)
+#
+# node.master: false
+# node.data: false
+
+# Use the Cluster Health API [http://localhost:9200/_cluster/health], the
+# Node Info API [http://localhost:9200/_nodes] or GUI tools
+# such as <http://www.elasticsearch.org/overview/marvel/>,
+# <http://github.com/karmi/elasticsearch-paramedic>,
+# <http://github.com/lukas-vlcek/bigdesk> and
+# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.
+
+# A node can have generic attributes associated with it, which can later be used
+# for customized shard allocation filtering, or allocation awareness. An attribute
+# is a simple key value pair, similar to node.key: value, here is an example:
+#
+# node.rack: rack314
+
+# By default, multiple nodes are allowed to start from the same installation location
+# to disable it, set the following:
+# node.max_local_storage_nodes: 1
+
+
+#################################### Index ####################################
+
+# You can set a number of options (such as shard/replica options, mapping
+# or analyzer definitions, translog settings, ...) for indices globally,
+# in this file.
+#
+# Note, that it makes more sense to configure index settings specifically for
+# a certain index, either when creating it or by using the index templates API.
+#
+# See <http://elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html> and
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html>
+# for more information.
+
+# Set the number of shards (splits) of an index (5 by default):
+#
+# index.number_of_shards: 5
+
+# Set the number of replicas (additional copies) of an index (1 by default):
+#
+# index.number_of_replicas: 1
+
+# Note, that for development on a local machine, with small indices, it usually
+# makes sense to "disable" the distributed features:
+#
+index.number_of_shards: 1
+index.number_of_replicas: 0
+
+# These settings directly affect the performance of index and search operations
+# in your cluster. Assuming you have enough machines to hold shards and
+# replicas, the rule of thumb is:
+#
+# 1. Having more *shards* enhances the _indexing_ performance and allows to
+#    _distribute_ a big index across machines.
+# 2. Having more *replicas* enhances the _search_ performance and improves the
+#    cluster _availability_.
+#
+# The "number_of_shards" is a one-time setting for an index.
+#
+# The "number_of_replicas" can be increased or decreased anytime,
+# by using the Index Update Settings API.
+#
+# Elasticsearch takes care about load balancing, relocating, gathering the
+# results from nodes, etc. Experiment with different settings to fine-tune
+# your setup.
+
+# Use the Index Status API (<http://localhost:9200/A/_status>) to inspect
+# the index status.
+
+
+#################################### Paths ####################################
+path.home: /src/test/resources
+# Path to directory containing configuration (this file and logging.yml):
+#
+path.conf: /src/test/resources
+
+# Path to directory where to store index data allocated for this node.
+#
+path.data: target/esdata
+#
+# Can optionally include more than one location, causing data to be striped across
+# the locations (a la RAID 0) on a file level, favouring locations with most free
+# space on creation. For example:
+#
+# path.data: /path/to/data1,/path/to/data2
+
+# Path to temporary files:
+#
+path.work: /target/eswork
+
+# Path to log files:
+#
+path.logs: /target/eslogs
+
+# Path to where plugins are installed:
+#
+# path.plugins: /path/to/plugins
+
+
+#################################### Plugin ###################################
+
+# If a plugin listed here is not installed for current node, the node will not start.
+#
+# plugin.mandatory: mapper-attachments,lang-groovy
+
+
+################################### Memory ####################################
+
+# Elasticsearch performs poorly when JVM starts swapping: you should ensure that
+# it _never_ swaps.
+#
+# Set this property to true to lock the memory:
+#
+# bootstrap.mlockall: true
+
+# Make sure that the ES_MIN_MEM and ES_MAX_MEM environment variables are set
+# to the same value, and that the machine has enough memory to allocate
+# for Elasticsearch, leaving enough memory for the operating system itself.
+#
+# You should also make sure that the Elasticsearch process is allowed to lock
+# the memory, eg. by using `ulimit -l unlimited`.
+
+
+############################## Network And HTTP ###############################
+
+# Elasticsearch, by default, binds itself to the 0.0.0.0 address, and listens
+# on port [9200-9300] for HTTP traffic and on port [9300-9400] for node-to-node
+# communication. (the range means that if the port is busy, it will automatically
+# try the next port).
+
+# Set the bind address specifically (IPv4 or IPv6):
+#
+# network.bind_host: 192.168.0.1
+
+# Set the address other nodes will use to communicate with this node. If not
+# set, it is automatically derived. It must point to an actual IP address.
+#
+# network.publish_host: 192.168.0.1
+
+# Set both 'bind_host' and 'publish_host':
+#
+# network.host: 192.168.0.1
+
+# Set a custom port for the node to node communication (9300 by default):
+#
+# transport.tcp.port: 9300
+
+# Enable compression for all communication between nodes (disabled by default):
+#
+# transport.tcp.compress: true
+
+# Set a custom port to listen for HTTP traffic:
+#
+# http.port: 9200
+
+# Set a custom allowed content length:
+#
+# http.max_content_length: 100mb
+
+# Disable HTTP completely:
+#
+# http.enabled: false
+
+
+################################### Gateway ###################################
+
+# The gateway allows for persisting the cluster state between full cluster
+# restarts. Every change to the state (such as adding an index) will be stored
+# in the gateway, and when the cluster starts up for the first time,
+# it will read its state from the gateway.
+
+# There are several types of gateway implementations. For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-gateway.html>.
+
+# The default gateway type is the "local" gateway (recommended):
+#
+# gateway.type: local
+
+# Settings below control how and when to start the initial recovery process on
+# a full cluster restart (to reuse as much local data as possible when using shared
+# gateway).
+
+# Allow recovery process after N nodes in a cluster are up:
+#
+gateway.recover_after_nodes: 1
+
+# Set the timeout to initiate the recovery process, once the N nodes
+# from previous setting are up (accepts time value):
+#
+# gateway.recover_after_time: 5m
+
+# Set how many nodes are expected in this cluster. Once these N nodes
+# are up (and recover_after_nodes is met), begin recovery process immediately
+# (without waiting for recover_after_time to expire):
+#
+gateway.expected_nodes: 1
+
+
+############################# Recovery Throttling #############################
+
+# These settings allow to control the process of shards allocation between
+# nodes during initial recovery, replica allocation, rebalancing,
+# or when adding and removing nodes.
+
+# Set the number of concurrent recoveries happening on a node:
+#
+# 1. During the initial recovery
+#
+# cluster.routing.allocation.node_initial_primaries_recoveries: 4
+#
+# 2. During adding/removing nodes, rebalancing, etc
+#
+# cluster.routing.allocation.node_concurrent_recoveries: 2
+
+# Set to throttle throughput when recovering (eg. 100mb, by default 20mb):
+#
+# indices.recovery.max_bytes_per_sec: 20mb
+
+# Set to limit the number of open concurrent streams when
+# recovering a shard from a peer:
+#
+# indices.recovery.concurrent_streams: 5
+
+
+################################## Discovery ##################################
+
+# Discovery infrastructure ensures nodes can be found within a cluster
+# and master node is elected. Multicast discovery is the default.
+
+# Set to ensure a node sees N other master eligible nodes to be considered
+# operational within the cluster. Its recommended to set it to a higher value
+# than 1 when running more than 2 nodes in the cluster.
+#
+# discovery.zen.minimum_master_nodes: 1
+
+# Set the time to wait for ping responses from other nodes when discovering.
+# Set this option to a higher value on a slow or congested network
+# to minimize discovery failures:
+#
+# discovery.zen.ping.timeout: 3s
+
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html>
+
+# Unicast discovery allows to explicitly control which nodes will be used
+# to discover the cluster. It can be used when multicast is not present,
+# or to restrict the cluster communication-wise.
+#
+# 1. Disable multicast discovery (enabled by default):
+#
+# discovery.zen.ping.multicast.enabled: false
+#
+# 2. Configure an initial list of master nodes in the cluster
+#    to perform discovery when new nodes (master or data) are started:
+#
+# discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
+
+# EC2 discovery allows to use AWS EC2 API in order to perform discovery.
+#
+# You have to install the cloud-aws plugin for enabling the EC2 discovery.
+#
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-ec2.html>
+#
+# See <http://elasticsearch.org/tutorials/elasticsearch-on-ec2/>
+# for a step-by-step tutorial.
+
+# GCE discovery allows to use Google Compute Engine API in order to perform discovery.
+#
+# You have to install the cloud-gce plugin for enabling the GCE discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-gce>.
+
+# Azure discovery allows to use Azure API in order to perform discovery.
+#
+# You have to install the cloud-azure plugin for enabling the Azure discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-azure>.
+
+################################## Slow Log ##################################
+
+# Shard level query and fetch threshold logging.
+
+#index.search.slowlog.threshold.query.warn: 10s
+#index.search.slowlog.threshold.query.info: 5s
+#index.search.slowlog.threshold.query.debug: 2s
+#index.search.slowlog.threshold.query.trace: 500ms
+
+#index.search.slowlog.threshold.fetch.warn: 1s
+#index.search.slowlog.threshold.fetch.info: 800ms
+#index.search.slowlog.threshold.fetch.debug: 500ms
+#index.search.slowlog.threshold.fetch.trace: 200ms
+
+#index.indexing.slowlog.threshold.index.warn: 10s
+#index.indexing.slowlog.threshold.index.info: 5s
+#index.indexing.slowlog.threshold.index.debug: 2s
+#index.indexing.slowlog.threshold.index.trace: 500ms
+
+################################## GC Logging ################################
+
+#monitor.jvm.gc.young.warn: 1000ms
+#monitor.jvm.gc.young.info: 700ms
+#monitor.jvm.gc.young.debug: 400ms
+
+#monitor.jvm.gc.old.warn: 10s
+#monitor.jvm.gc.old.info: 5s
+#monitor.jvm.gc.old.debug: 2s
+
diff --git a/catalog-dao/src/test/resources/images/apache.png b/catalog-dao/src/test/resources/images/apache.png
new file mode 100644
index 0000000..8e9f402
--- /dev/null
+++ b/catalog-dao/src/test/resources/images/apache.png
Binary files differ
diff --git a/catalog-dao/src/test/resources/log4j.properties b/catalog-dao/src/test/resources/log4j.properties
new file mode 100644
index 0000000..c18c3da
--- /dev/null
+++ b/catalog-dao/src/test/resources/log4j.properties
@@ -0,0 +1,8 @@
+# Root logger option
+log4j.rootLogger=info, stdout
+
+# Direct log messages to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
diff --git a/catalog-dao/src/test/resources/logback-test.xml b/catalog-dao/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..4b7eb95
--- /dev/null
+++ b/catalog-dao/src/test/resources/logback-test.xml
@@ -0,0 +1,13 @@
+<!-- only one line, shut up logback ! -->
+<configuration >
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>
+                %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
+            </Pattern>
+        </encoder>
+    </appender>
+    <root level="OFF">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>
