diff --git a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudElement.java b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudElement.java
index f1183c5..9241093 100644
--- a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudElement.java
+++ b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudElement.java
@@ -43,6 +43,7 @@
     private byte[] rcPropTableKey;
     private long rcPropTableId;
     private RamCloudGraph graph;
+    private long propVersion;
 
     private static final ThreadLocal<Kryo> kryo = new ThreadLocal<Kryo>() {
         @Override
@@ -79,6 +80,7 @@
 	    pm.read_start("RamCloudElement getPropertyMap()");
 	    propTableEntry = vertTable.read(rcPropTableId, rcPropTableKey);
 	    pm.read_end("RamCloudElement getPropertyMap()");
+	    propVersion = propTableEntry.version;
 	    if (propTableEntry.value.length > 1024 * 1024 * 0.9) {
 		log.warn("Element[id={}] property map size is near 1MB limit!", new String(rcPropTableKey));
 	    }
@@ -113,59 +115,27 @@
 	    return null;
 	} else if (byteArray.length != 0) {
 	    PerfMon pm = PerfMon.getInstance();
-	    long startTime = 0;
-	    if(RamCloudGraph.measureSerializeTimeProp == 1) {
-		startTime = System.nanoTime();
-	    }
 	    pm.deser_start("RamCloudElement convertRcBytesToPropertyMap()");
 	    ByteBufferInput input = new ByteBufferInput(byteArray);
 	    TreeMap map = kryo.get().readObject(input, TreeMap.class);
 	    pm.deser_end("RamCloudElement convertRcBytesToPropertyMap()");
-	    if(RamCloudGraph.measureSerializeTimeProp == 1) {
-            	long endTime = System.nanoTime();
-            	log.error("Performance element kryo deserialization key {} {} size {}", this, endTime - startTime, byteArray.length);
-	    }
 	    return map;
 	} else {
 	    return new TreeMap<String, Object>();
 	}
     }
 
-    private void setPropertyMap(Map<String, Object> map) {
+    private static byte[] convertVertexPropertyMapToRcBytes(Map<String, Object> map) {
 	byte[] rcValue;
 	PerfMon pm = PerfMon.getInstance();
 
-	long startKryoTime = 0;
-	if(RamCloudGraph.measureSerializeTimeProp == 1) {
-	    startKryoTime = System.nanoTime();
-	}
 	pm.ser_start("RamCloudElement setPropertyMap()");
 	byte[] rcTemp = new byte[1024*1024];
 	Output output = new Output(rcTemp);
 	kryo.get().writeObject(output, map);
-	long midKryoTime = 0;
-	if(RamCloudGraph.measureSerializeTimeProp == 1) {
-	    midKryoTime = System.nanoTime();
-	}
 	rcValue = output.toBytes();
 	pm.ser_end("RamCloudElement setPropertyMap()");
-	if(RamCloudGraph.measureSerializeTimeProp == 1) {
-        	long endKryoTime = System.nanoTime();
-        	log.error("Performance element kryo serialization key {} mid {}, total {}, size {}", this, midKryoTime - startKryoTime, endKryoTime - startKryoTime, rcValue.length);
-	}
-
-	long startTime = 0;
-	JRamCloud vertTable = graph.getRcClient();
-	if (graph.measureRcTimeProp == 1) {
-	    startTime = System.nanoTime();
-	}
-	pm.write_start("RamCloudElement setPropertyMap()");
-	vertTable.write(rcPropTableId, rcPropTableKey, rcValue);
-	pm.write_end("RamCloudElement setPropertyMap()");
-	if (graph.measureRcTimeProp == 1) {
-	    long endTime = System.nanoTime();
-	    log.error("Performance setPropertyMap write time key {} {}", this, endTime - startTime);
-	}
+	return rcValue;
     }
 
     @Override
@@ -184,34 +154,61 @@
 	return getPropertyMap();
     }
     public void setProperties(Map<String, Object> properties) {
-        Map<String, Object> map = getPropertyMap();
+	Map<String, Object> map = getPropertyMap();
         Map<String, Object> oldValueMap = new HashMap<String, Object>(map.size());
-        for (Map.Entry<String, Object> property : properties.entrySet()) {
-            String key = property.getKey();
-            if (key == null) {
-                throw ExceptionFactory.propertyKeyCanNotBeNull();
-            }
+	for (Map.Entry<String, Object> property : properties.entrySet()) {
+	    String key = property.getKey();
+	    if (key == null) {
+	        throw ExceptionFactory.propertyKeyCanNotBeNull();
+	    }
 
-            if (key.equals("")) {
-                throw ExceptionFactory.propertyKeyCanNotBeEmpty();
-            }
+	    if (key.equals("")) {
+	        throw ExceptionFactory.propertyKeyCanNotBeEmpty();
+	    }
 
-            if (key.equals("id")) {
-                throw ExceptionFactory.propertyKeyIdIsReserved();
-            }
+	    if (key.equals("id")) {
+	        throw ExceptionFactory.propertyKeyIdIsReserved();
+	    }
 
-            if (this instanceof RamCloudEdge && key.equals("label")) {
-                throw ExceptionFactory.propertyKeyLabelIsReservedForEdges();
-            }
-            Object value = property.getValue();
-            if (value == null) {
-                throw ExceptionFactory.propertyValueCanNotBeNull();
-            }
+	    if (this instanceof RamCloudEdge && key.equals("label")) {
+	        throw ExceptionFactory.propertyKeyLabelIsReservedForEdges();
+	    }
+	    Object value = property.getValue();
+	    if (value == null) {
+		throw ExceptionFactory.propertyValueCanNotBeNull();
+	    }
 
-            oldValueMap.put(key, map.put(key, value));
+	    oldValueMap.put(key, map.put(key, value));
 
-        }
-        setPropertyMap(map);
+	}
+	byte[] rcValue = convertVertexPropertyMapToRcBytes(map);
+
+	if (rcValue.length != 0) {
+	    if (!writeWithRules(rcValue)) {
+		log.debug("getSetProperties cond. write failure RETRYING 1");
+		for (int i = 0; i < graph.CONDITIONALWRITE_RETRY_MAX ; i++){
+		    map = getPropertyMap();
+		    oldValueMap = new HashMap<String, Object>(map.size());
+		    for (Map.Entry<String, Object> property : properties.entrySet()) {
+			String key = property.getKey();
+			Object value = property.getValue();
+			oldValueMap.put(key, map.put(key, value));
+		    }
+
+		    rcValue = convertVertexPropertyMapToRcBytes(map);
+		    if (rcValue.length != 0) {
+			if (writeWithRules(rcValue)) {
+			    break;
+			} else {
+			    log.debug("getSetProperties cond. write failure RETRYING {}", i+1);
+                            if (i + 1 == graph.CONDITIONALWRITE_RETRY_MAX) {
+                                log.error("setProperties cond. write failure Gaveup RETRYING");
+                            }
+			}
+		    }
+		}
+	    }
+	}
 
         // TODO use multi-write
         for (Map.Entry<String, Object> oldProperty : oldValueMap.entrySet()) {
@@ -229,25 +226,25 @@
     }
 
     @Override
-    public void setProperty(String key, Object value) {
-	Object oldValue;
-	if (value == null) {
+    public void setProperty(String propKey, Object propValue) {
+	Object oldValue = null;
+	if (propValue == null) {
 	    throw ExceptionFactory.propertyValueCanNotBeNull();
 	}
 
-	if (key == null) {
+	if (propKey == null) {
 	    throw ExceptionFactory.propertyKeyCanNotBeNull();
 	}
 
-	if (key.equals("")) {
+	if (propKey.equals("")) {
 	    throw ExceptionFactory.propertyKeyCanNotBeEmpty();
 	}
 
-	if (key.equals("id")) {
+	if (propKey.equals("id")) {
 	    throw ExceptionFactory.propertyKeyIdIsReserved();
 	}
 
-	if (this instanceof RamCloudEdge && key.equals("label")) {
+	if (this instanceof RamCloudEdge && propKey.equals("label")) {
 	    throw ExceptionFactory.propertyKeyLabelIsReservedForEdges();
 	}
 
@@ -256,41 +253,74 @@
 	    startTime = System.nanoTime();
 	}
 
-	Map<String, Object> map = getPropertyMap();
-	oldValue = map.put(key, value);
-	setPropertyMap(map);
+	for (int i = 0; i < graph.CONDITIONALWRITE_RETRY_MAX; i++) {
+	    Map<String, Object> map = getPropertyMap();
+	    oldValue = map.put(propKey, propValue);
+
+	    byte[] rcValue = convertVertexPropertyMapToRcBytes(map);
+
+	    if (rcValue.length != 0) {
+		if (writeWithRules(rcValue)) {
+		    break;
+		} else {
+		    log.debug("setProperty(String {}, Object {}) cond. write failure RETRYING {}", propKey, propValue, i+1);
+		    if (i + 1 == graph.CONDITIONALWRITE_RETRY_MAX) {
+			log.error("setProperty(String {}, Object {}) cond. write failure Gaveup RETRYING", propKey, propValue);
+		    }
+		}
+	    }
+	}
 
 	boolean ret = false;
 	if (this instanceof RamCloudVertex) {
-	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, key, value, graph, Vertex.class);
-	    ret = keyIndex.autoUpdate(key, value, oldValue, this);
+	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, propKey, propValue, graph, Vertex.class);
+	    ret = keyIndex.autoUpdate(propKey, propValue, oldValue, this);
 	} else {
-	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, key, value, graph, Edge.class);
-	    keyIndex.autoUpdate(key, value, oldValue, this);
+	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, propKey, propValue, graph, Edge.class);
+	    keyIndex.autoUpdate(propKey, propValue, oldValue, this);
 	}
 
 	if (graph.measureBPTimeProp == 1) {
 	    long endTime = System.nanoTime();
 	    if (ret) {
-		log.error("Performance vertex setProperty(key {}) which is index total time {}", key, endTime - startTime);
+		log.error("Performance vertex setProperty(key {}) which is total time {}", propKey, endTime - startTime);
 	    } else {
-		log.error("Performance vertex setProperty(key {}) does not index time {}", key, endTime - startTime);
+		log.error("Performance vertex setProperty(key {}) does not time {}", propKey, endTime - startTime);
 	    }
 	}
 
     }
 
+    protected boolean writeWithRules(byte[] rcValue) {
+	return RamCloudWrite.writeWithRules(this.rcPropTableId, this.rcPropTableKey, rcValue, this.propVersion, this.graph, RamCloudWrite.PerfMonEnum.WRITE);
+    }
+
     @Override
-    public <T> T removeProperty(String key) {
-	Map<String, Object> map = getPropertyMap();
-	T retVal = (T) map.remove(key);
-	setPropertyMap(map);
+    public <T> T removeProperty(String propKey) {
+	T retVal = null;
+	for (int i = 0; i < graph.CONDITIONALWRITE_RETRY_MAX; i++) {
+	    Map<String, Object> map = getPropertyMap();
+	    retVal = (T) map.remove(propKey);
+	    byte[] rcValue = convertVertexPropertyMapToRcBytes(map);
+
+	    if (rcValue.length != 0) {
+		if (writeWithRules(rcValue)) {
+		    break;
+		} else {
+		    log.debug("removeProperty(String {}) cond. write failure RETRYING {}", propKey, i+1);
+		    if (i + 1 == graph.CONDITIONALWRITE_RETRY_MAX) {
+			log.error("removeProperty(String {}) cond. write failure Gaveup RETRYING", propKey);
+		    }
+		}
+	    }
+	}
+
 	if (this instanceof RamCloudVertex) {
-	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, key, retVal, graph, Vertex.class);
-	    keyIndex.autoRemove(key, retVal.toString(), this);
+	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, propKey, retVal, graph, Vertex.class);
+	    keyIndex.autoRemove(propKey, retVal.toString(), this);
 	} else {
-	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, key, retVal, graph, Edge.class);
-	    keyIndex.autoRemove(key, retVal.toString(), this);
+	    RamCloudKeyIndex keyIndex = new RamCloudKeyIndex(graph.kidxVertTableId, propKey, retVal, graph, Edge.class);
+	    keyIndex.autoRemove(propKey, retVal.toString(), this);
 	}
 
 	return retVal;
diff --git a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudGraph.java b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudGraph.java
index 4843b01..9871aaa 100644
--- a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudGraph.java
+++ b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudGraph.java
@@ -84,6 +84,8 @@
     private final long INSTANCE_ID_RANGE = 100000;
     private String coordinatorLocation;
     private static final Features FEATURES = new Features();
+    // FIXME better loop variable name
+    public final int CONDITIONALWRITE_RETRY_MAX = 100;
     public final long measureBPTimeProp = Long.valueOf(System.getProperty("benchmark.measureBP", "0"));
     public final long measureRcTimeProp = Long.valueOf(System.getProperty("benchmark.measureRc", "0"));
     public static final long measureSerializeTimeProp = Long.valueOf(System.getProperty("benchmark.measureSerializeTimeProp", "0"));
@@ -279,7 +281,7 @@
         }
         if (instanceEntry != null) {
 	    long curInstanceId = 1;
-	    for (int i = 0 ; i < 100 ; i++) {
+	    for (int i = 0 ; i < CONDITIONALWRITE_RETRY_MAX ; i++) {
 		Map<String, Long> propMap = null;
 		if (instanceEntry.value == null) {
 		    log.warn("Got a null byteArray argument");
diff --git a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudIndex.java b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudIndex.java
index 0ba951d..634df25 100644
--- a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudIndex.java
+++ b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudIndex.java
@@ -51,21 +51,6 @@
     // FIXME this should not be defined here
     private long indexVersion;
 
-//    private static final ThreadLocal<Kryo> kryo = new ThreadLocal<Kryo>() {
-//        @Override
-//        protected Kryo initialValue() {
-//                 Kryo kryo = new Kryo();
-//                 kryo.setRegistrationRequired(true);
-//                 kryo.register(Long.class);
-//                 kryo.register(String.class);
-//                 kryo.register(TreeMap.class);
-//                 kryo.register(ArrayList.class);
-//                 kryo.setReferences(false);
-//                 return kryo;
-//        }
-//    };
-
-
     public RamCloudIndex(long tableId, String indexName, Object propValue, RamCloudGraph graph, Class<T> indexClass) {
 	this.tableId = tableId;
 	this.graph = graph;
@@ -89,7 +74,6 @@
 	    JRamCloud.Object vertTableEntry;
 	    JRamCloud vertTable = graph.getRcClient();
 
-	    //vertTableEntry = graph.getRcClient().read(tableId, rcKey);
 	    pm.indexread_start("RamCloudIndex exists()");
 	    vertTableEntry = vertTable.read(tableId, rcKey);
 	    pm.indexread_end("RamCloudIndex exists()");
@@ -110,7 +94,6 @@
 		JRamCloud.RejectRules rules = rcClient.new RejectRules();
 		rules.setExists();
 
-		//graph.getRcClient().writeRule(tableId, rcKey, ByteBuffer.allocate(0).array(), rules);
 		pm.indexwrite_start("RamCloudIndex create()");
 		rcClient.writeRule(tableId, rcKey, ByteBuffer.allocate(0).array(), rules);
 		pm.indexwrite_end("RamCloudIndex create()");
@@ -181,8 +164,7 @@
 
 	create();
 
-	// FIXME give more meaningful loop variable
-	for (int i = 0; i < 100; i++) {
+	for (int i = 0; i < graph.CONDITIONALWRITE_RETRY_MAX; i++) {
 	    Map<Object, List<Object>> map = readIndexPropertyMapFromDB();
 	    List<Object> values = map.get(propValue);
 	    if (values == null) {
@@ -193,20 +175,14 @@
 		values.add(elmId);
 	    }
 
-            //Masa commented out the following measurement b/c Serialization delay is measured in onvertIndexPropertyMapToRcBytes(map)
-	    //long serStartTime = System.nanoTime();
 	    byte[] rcValue = convertIndexPropertyMapToRcBytes(map);
-	    //if(RamCloudGraph.measureSerializeTimeProp == 1) {
-	    //	long serEndTime = System.nanoTime();
-	    //	log.error("Performance index kryo serialization [id={}] {} size {}", elmId, serEndTime - serStartTime, rcValue.length);
-            //}
 
 	    if (rcValue.length != 0) {
 		if (writeWithRules(rcValue)) {
 		    break;
 		} else {
 		    log.debug("getSetProperty(String {}, Object {}) cond. write failure RETRYING {}", propValue, elmId, i+1);
-		    if (i == 100) {
+		    if (i + 1 == graph.CONDITIONALWRITE_RETRY_MAX) {
 			log.error("getSetProperty(String {}, Object {}) cond. write failure Gaveup RETRYING", propValue, elmId);
 		    }
 		}
@@ -261,9 +237,7 @@
 	    log.error("Index name mismatch indexName:{}, remove({},{},...). SOMETHING IS WRONG", indexName, propName, propValue);
 	}
 
-	// FIXME better loop variable name
-	final int MAX_RETRYS = 100;
-	for (int i = 0; i < MAX_RETRYS; ++i) {
+	for (int i = 0; i < graph.CONDITIONALWRITE_RETRY_MAX; ++i) {
 	    Map<Object, List<Object>> map = readIndexPropertyMapFromDB();
 
 	    if (map.containsKey(propValue)) {
@@ -281,17 +255,7 @@
 		// no change to DB so exit now
 		return;
 	    }
-	    //long startTime = System.nanoTime();
-	    //if(RamCloudGraph.measureSerializeTimeProp == 1) {
-	    //   pm.ser_start("SC");
-	    //}
 	    byte[] rcValue = convertIndexPropertyMapToRcBytes(map);
-	    //if(RamCloudGraph.measureSerializeTimeProp == 1) {
-	    //    pm.ser_end("SC");
-	    	//long endTime = System.nanoTime();
-		//pm.ser_add(endTime - startTime);
-	    	//log.error("Performance index kryo serialization for removal key {} {} size {}", element, endTime - startTime, rcValue.length);
-	    //}
 
 	    if (rcValue.length == 0) {
 		return;
@@ -301,7 +265,7 @@
 		break;
 	    } else {
 		log.debug("remove({}, {}, T element) write failure RETRYING {}", propName, propValue, (i + 1));
-		if (i + 1 == MAX_RETRYS) {
+		if (i + 1 == graph.CONDITIONALWRITE_RETRY_MAX) {
 		    log.error("remove({}, {}, T element) write failed completely. gave up RETRYING", propName, propValue);
 		}
 	    }
@@ -341,15 +305,14 @@
 		// nothing to write
 		continue;
 	    }
-	    if (writeWithRules(tableId, tableEntry.key, rcValue, tableEntry.version, graph)) {
+	    if (RamCloudWrite.writeWithRules(tableId, tableEntry.key, rcValue, tableEntry.version, graph, RamCloudWrite.PerfMonEnum.INDEXWRITE)) {
 		// cond. write success
 		continue;
 	    } else {
 		// cond. write failure
 		log.debug("removeElement({}, {}, ...) cond. key/value write failure RETRYING", tableId, element );
 		// FIXME Dirty hack
-		final int RETRY_MAX = 100;
-		for (int retry = RETRY_MAX; retry >= 0; --retry) {
+		for (int retry = graph.CONDITIONALWRITE_RETRY_MAX; retry >= 0; --retry) {
 		    RamCloudKeyIndex idx = new RamCloudKeyIndex(tableId, tableEntry.key, graph, element.getClass());
 		    Map<Object, List<Object>> rereadMap = idx.readIndexPropertyMapFromDB();
 
@@ -370,7 +333,7 @@
 		    }
 
 		    if (idx.writeWithRules(convertIndexPropertyMapToRcBytes(rereadMap))) {
-			log.debug("removeElement({}, {}, ...) cond. key/value {} write failure RETRYING {}", tableId, element, rereadMap, RETRY_MAX - retry);
+			log.debug("removeElement({}, {}, ...) cond. key/value {} write failure RETRYING {}", tableId, element, rereadMap, graph.CONDITIONALWRITE_RETRY_MAX - retry);
 			// cond. re-write success
 			break;
 		    }
@@ -384,31 +347,20 @@
     }
 
     public Map<Object, List<Object>> readIndexPropertyMapFromDB() {
-	//log.debug("getIndexPropertyMap() ");
 	JRamCloud.Object propTableEntry;
-	long startTime = 0;
 	PerfMon pm = PerfMon.getInstance();
 
 	try {
 	    JRamCloud vertTable = graph.getRcClient();
-	    if (graph.measureRcTimeProp == 1) {
-		startTime = System.nanoTime();
-	    }
-	    //propTableEntry = graph.getRcClient().read(tableId, rcKey);
 	    pm.indexread_start("RamCloudIndex readIndexPropertyMapFromDB()");
 	    propTableEntry = vertTable.read(tableId, rcKey);
 	    pm.indexread_end("RamCloudIndex readIndexPropertyMapFromDB()");
-	    if (graph.measureRcTimeProp == 1) {
-		long endTime = System.nanoTime();
-		log.error("Performance readIndexPropertyMapFromDB(indexName {}) read time {}", indexName, endTime - startTime);
-	    }
 	    indexVersion = propTableEntry.version;
 	} catch (Exception e) {
 	    pm.indexread_end("RamCloudIndex readIndexPropertyMapFromDB()");
 	    indexVersion = 0;
-	    if (graph.measureRcTimeProp == 1) {
-		long endTime = System.nanoTime();
-		log.error("Performance readIndexPropertyMapFromDB(indexName {}) exception read time {}", indexName, endTime - startTime);
+	    if (e instanceof JRamCloud.ObjectDoesntExistException) {
+		return null;
 	    }
 	    log.warn("readIndexPropertyMapFromDB() Element does not have a index property table entry! tableId :" + tableId + " indexName : " + indexName + " ", e);
 	    return null;
@@ -423,10 +375,6 @@
 	    return null;
 	} else if (byteArray.length != 0) {
 	    PerfMon pm = PerfMon.getInstance();
-            long startTime = 0;
-            if(RamCloudGraph.measureSerializeTimeProp == 1) {
-        	startTime = System.nanoTime();
-            }
 	    pm.indexdeser_start("RamCloudIndex convertRcBytesToIndexPropertyMap()");
 	    IndexBlob blob;
 	    TreeMap<Object, List<Object>> map = new TreeMap<Object, List<Object>>();
@@ -434,18 +382,12 @@
 		blob = IndexBlob.parseFrom(byteArray);
 		List const_list = blob.getVertexIdList();
 		ArrayList list = new ArrayList<>(const_list);
-//		ByteBufferInput input = new ByteBufferInput(byteArray);
-//		ArrayList list = kryo.get().readObject(input, ArrayList.class);
 		map.put(rcKeyToPropName(rcKey), list);
 	    } catch (InvalidProtocolBufferException e) {
 		log.error("{" + toString() + "}: Read malformed edge list: ", e);
 	    } finally {
 		pm.indexdeser_end("RamCloudIndex convertRcBytesToIndexPropertyMap()");
 	    }
-            if(RamCloudGraph.measureSerializeTimeProp == 1) {
-            	long endTime = System.nanoTime();
-                log.error("Performance index kryo deserialization [id=N/A] {} size {}", endTime - startTime, byteArray.length);
-            }
 	    return map;
 	} else {
 	    return new TreeMap<Object, List<Object>>();
@@ -454,10 +396,6 @@
 
     public static byte[] convertIndexPropertyMapToRcBytes(Map<Object, List<Object>> map) {
 	PerfMon pm = PerfMon.getInstance();
-	long startTime = 0;
-	if(RamCloudGraph.measureSerializeTimeProp == 1) {
-	    startTime = System.nanoTime();
-	}
 	byte[] bytes;
 
 	pm.indexser_start("RamCloudIndex convertIndexPropertyMapToRcBytes()");
@@ -468,47 +406,12 @@
 	}
 	IndexBlob blob = builder.build();
 	bytes = blob.toByteArray();
-//	ByteBufferOutput output = new ByteBufferOutput(1024*1024);
-//	if ( map.values().size() == 0 ) {
-//	    kryo.get().writeObject(output, new ArrayList<Object>());
-//	} else {
-//	    kryo.get().writeObject(output, vtxIds);
-//	}
-//	bytes = output.toBytes();
         pm.indexser_end("RamCloudIndex convertIndexPropertyMapToRcBytes()");
-	if(RamCloudGraph.measureSerializeTimeProp == 1) {
-        	long endTime = System.nanoTime();
-		log.error("Performance index ProtoBuff serialization {}, size={}", endTime - startTime, bytes);
-	}
 	return bytes;
     }
 
     protected boolean writeWithRules(byte[] rcValue) {
-	return writeWithRules(this.tableId, this.rcKey, rcValue, this.indexVersion, this.graph);
-    }
-
-    private static boolean writeWithRules(long tableId, byte[] rcKey, byte[] rcValue, long expectedVersion, RamCloudGraph graph) {
-	JRamCloud.RejectRules rules = graph.getRcClient().new RejectRules();
-
-	if (expectedVersion == 0) {
-	    rules.setExists();
-	} else {
-	    rules.setNeVersion(expectedVersion);
-	}
-
-	PerfMon pm = PerfMon.getInstance();
-	try {
-	    JRamCloud vertTable = graph.getRcClient();
-	    pm.indexwrite_start("RamCloudIndex writeWithRules()");
-	    vertTable.writeRule(tableId, rcKey, rcValue, rules);
-	    pm.indexwrite_end("RamCloudIndex writeWithRules()");
-	} catch (Exception e) {
-            pm.indexwrite_end("RamCloudIndex writeWithRules()");
-            pm.indexwrite_condfail("RamCloudIndex writeWithRules()");
-	    log.debug("Cond. Write index property: {} failed {} expected version: {}", rcKeyToIndexName(rcKey), e, expectedVersion);
-	    return false;
-	}
-	return true;
+	return RamCloudWrite.writeWithRules(this.tableId, this.rcKey, rcValue, this.indexVersion, this.graph, RamCloudWrite.PerfMonEnum.INDEXWRITE);
     }
 
     public List<Object> getElmIdListForPropValue(Object propValue) {
@@ -526,7 +429,7 @@
     }
 
     public <T> T removeIndexProperty(String key) {
-	for (int i = 0; i < 100; ++i) {
+	for (int i = 0; i < graph.CONDITIONALWRITE_RETRY_MAX; ++i) {
 	    Map<Object, List<Object>> map = readIndexPropertyMapFromDB();
 	    T retVal = (T) map.remove(key);
 	    byte[] rcValue = convertIndexPropertyMapToRcBytes(map);
diff --git a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudVertex.java b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudVertex.java
index 421db77..b41dca8 100644
--- a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudVertex.java
+++ b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudVertex.java
@@ -189,11 +189,11 @@
 	/*
 	 * RamCloudVertex specific methods
 	 */
-	private static byte[] idToRcKey(long id) {
+	public static byte[] idToRcKey(long id) {
 		return ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(id).array();
 	}
 
-	private static long rcKeyToId(byte[] rcKey) {
+	public static long rcKeyToId(byte[] rcKey) {
 		return ByteBuffer.wrap(rcKey).order(ByteOrder.LITTLE_ENDIAN).getLong();
 	}
 
diff --git a/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudWrite.java b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudWrite.java
new file mode 100644
index 0000000..6b3fba2
--- /dev/null
+++ b/src/main/java/com/tinkerpop/blueprints/impls/ramcloud/RamCloudWrite.java
@@ -0,0 +1,47 @@
+package com.tinkerpop.blueprints.impls.ramcloud;
+
+import edu.stanford.ramcloud.JRamCloud;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RamCloudWrite {
+    public enum PerfMonEnum {
+	WRITE,
+	INDEXWRITE
+    }
+    private final static Logger log = LoggerFactory.getLogger(RamCloudGraph.class);
+    
+    public static boolean writeWithRules(long tableId, byte[] rcKey, byte[] rcValue, long expectedVersion, RamCloudGraph graph, PerfMonEnum perfMonKind) {
+	JRamCloud.RejectRules rules = graph.getRcClient().new RejectRules();
+
+	if (expectedVersion == 0) {
+	    rules.setExists();
+	} else {
+	    rules.setNeVersion(expectedVersion);
+	}
+
+	PerfMon pm = PerfMon.getInstance();
+	try {
+	    JRamCloud rcClient = graph.getRcClient();
+	    if (perfMonKind.equals(PerfMonEnum.WRITE)) {
+		pm.write_start("RamCloudIndex writeWithRules()");
+	    } else if (perfMonKind.equals(PerfMonEnum.INDEXWRITE)) {
+		pm.indexwrite_start("RamCloudIndex writeWithRules()");
+	    }
+	    rcClient.writeRule(tableId, rcKey, rcValue, rules);
+	    pm.indexwrite_end("RamCloudIndex writeWithRules()");
+	} catch (Exception e) {
+	    if (perfMonKind.equals(PerfMonEnum.WRITE)) {
+		pm.write_end("RamCloudIndex writeWithRules()");
+		pm.write_condfail("RamCloudIndex writeWithRules()");
+	    	log.debug("Cond. Write property: {} failed {} expected version: {}", RamCloudVertex.rcKeyToId(rcKey), e, expectedVersion);
+	    } else if (perfMonKind.equals(PerfMonEnum.INDEXWRITE)) {
+		pm.indexwrite_end("RamCloudIndex writeWithRules()");
+		pm.indexwrite_condfail("RamCloudIndex writeWithRules()");
+	    	log.debug("Cond. Write index property: {} failed {} expected version: {}", RamCloudIndex.rcKeyToIndexName(rcKey), e, expectedVersion);
+	    }
+	    return false;
+	}
+	return true;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/graph/DBOperation.java b/src/main/java/net/onrc/onos/graph/DBOperation.java
index 6e278d9..c291544 100644
--- a/src/main/java/net/onrc/onos/graph/DBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/DBOperation.java
@@ -56,7 +56,6 @@
 	 */
 	@Override
 	public ISwitchObject newSwitch(final String dpid) {
-	    //System.out.println("newSwitch");
 	    ISwitchObject obj = (ISwitchObject) conn.getFramedGraph().addVertex(null, ISwitchObject.class);
 	    if (obj != null) {
 		obj.setType("switch");
@@ -79,7 +78,6 @@
 	 */
 	@Override
 	public Iterable<ISwitchObject> getAllSwitches() {
-	    //System.out.println("getAllSwitches");
 	    Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
 	    return switches;
 	}
@@ -89,7 +87,6 @@
 	 */
 	@Override
 	public Iterable<ISwitchObject> getInactiveSwitches() {
-	    //System.out.println("getInactiveSwitches");
 	    Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
 	    List<ISwitchObject> inactiveSwitches = new ArrayList<ISwitchObject>();
 
@@ -117,13 +114,11 @@
 	 */
 	@Override
 	public void removeSwitch(ISwitchObject sw) {
-	    //System.out.println("removeSwitch");
 	    conn.getFramedGraph().removeVertex(sw.asVertex());
 	}
 
 	@Override
 	public IPortObject newPort(String dpid, Short portNum) {
-	    //System.out.println("newPort");
 	    IPortObject obj = (IPortObject) conn.getFramedGraph().addVertex(null, IPortObject.class);
 	    if (obj != null) {
 		obj.setType("port");
@@ -171,7 +166,6 @@
 	 */
 	@Override
 	public void removePort(IPortObject port) {
-	    //System.out.println("removeProt");
 	    if (conn.getFramedGraph() != null) {
 		conn.getFramedGraph().removeVertex(port.asVertex());
 	    }
@@ -182,7 +176,6 @@
 	 */
 	@Override
 	public IDeviceObject newDevice() {
-	    //System.out.println("newDevice");
 	    IDeviceObject obj = (IDeviceObject) conn.getFramedGraph().addVertex(null, IDeviceObject.class);
 	    if (obj != null) {
 		obj.setType("device");
@@ -195,7 +188,6 @@
 	 */
 	@Override
 	public Iterable<IDeviceObject> getDevices() {
-	    //System.out.println("getDeiveces");
 	    return conn.getFramedGraph() != null ? conn.getFramedGraph().getVertices("type", "device", IDeviceObject.class) : null;
 	}
 
@@ -205,7 +197,6 @@
 	 */
 	@Override
 	public void removeDevice(IDeviceObject dev) {
-	    //System.out.println("removeDevice");
 	    if (conn.getFramedGraph() != null) {
 		conn.getFramedGraph().removeVertex(dev.asVertex());
 	    }
@@ -216,9 +207,7 @@
 	*/
 	@Override
 	public IFlowPath newFlowPath() {
-	    //System.out.println("newFlowPath");
 	    IFlowPath flowPath = (IFlowPath)conn.getFramedGraph().addVertex(null, IFlowPath.class);
-	    //System.out.println("flowPath : " + flowPath);
 	    if (flowPath != null) {
 		flowPath.setType("flow");
 	    }
@@ -297,7 +286,6 @@
 	 */
 	@Override
 	public Iterable<IFlowPath> getAllFlowPaths() {
-	    //System.out.println("getAllFlowPaths");
 	    Iterable<IFlowPath> flowPaths = conn.getFramedGraph().getVertices("type", "flow", IFlowPath.class);
 
 	    List<IFlowPath> nonNullFlows = new ArrayList<IFlowPath>();
@@ -316,7 +304,6 @@
 	 */
 	@Override
 	public void removeFlowPath(IFlowPath flowPath) {
-	    //System.out.println("removeFlowPath");
 	    conn.getFramedGraph().removeVertex(flowPath.asVertex());
 	}
 
@@ -346,7 +333,6 @@
 	 */
 	@Override
 	public void removeFlowEntry(IFlowEntry flowEntry) {
-	    //System.out.println("removeFlowEntry");
 	    conn.getFramedGraph().removeVertex(flowEntry.asVertex());
 	}
 
@@ -355,7 +341,6 @@
 	 */
 	@Override
 	public IFlowEntry newFlowEntry() {
-	    //System.out.println("newFlowEntry");
 	    IFlowEntry flowEntry = (IFlowEntry) conn.getFramedGraph().addVertex(null, IFlowEntry.class);
 	    if (flowEntry != null) {
 		flowEntry.setType("flow_entry");
@@ -402,7 +387,6 @@
 	}
 
 	public void removeIpv4Address(IIpv4Address ipv4Address) {
-		//System.out.println("removeIpv4Address");
 		conn.getFramedGraph().removeVertex(ipv4Address.asVertex());
 	}
 
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java
index 99a2eb1..3aea9a4 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java
@@ -35,7 +35,7 @@
 
 	@Override
 	public List<Link> getActiveLinks() {
-		dbop = GraphDBManager.getDBOperation("ramcloud", "/tmp/ramcloudconf");
+		dbop = GraphDBManager.getDBOperation("ramcloud", "/tmp/ramcloud.conf");
 		//dbop = GraphDBManager.getDBOperation("", "");
 		//dbop.commit(); //Commit to ensure we see latest data
 		Iterable<ISwitchObject> switches = dbop.getActiveSwitches();
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
index 04f99a1..74c8075 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
@@ -126,7 +126,7 @@
      * Startup processing.
      */
     private void startup() {
-	this.dbHandler = GraphDBManager.getDBOperation("ramcloud", "/tmp/ramcloudconf");
+	this.dbHandler = GraphDBManager.getDBOperation("ramcloud", "/tmp/ramcloud.conf");
 
 	//
 	// Obtain the initial Topology state
