diff --git a/src/main/java/net/onrc/onos/datastore/RCObject.java b/src/main/java/net/onrc/onos/datastore/RCObject.java
index 5bea2c5..4370d00 100644
--- a/src/main/java/net/onrc/onos/datastore/RCObject.java
+++ b/src/main/java/net/onrc/onos/datastore/RCObject.java
@@ -122,7 +122,8 @@
 	serializeAndSetValue(defaultKryo.get(), this.propertyMap);
     }
 
-    protected void serializeAndSetValue(Kryo kryo, Map<Object, Object> javaObject) {
+    protected void serializeAndSetValue(Kryo kryo,
+	    Map<Object, Object> javaObject) {
 
 	// value
 	byte[] rcTemp = new byte[1024 * 1024];
@@ -144,7 +145,8 @@
 	return deserializeObjectFromValue(kryo, HashMap.class);
     }
 
-    protected <T extends Map> T deserializeObjectFromValue(Kryo kryo, Class<T> type) {
+    protected <T extends Map> T deserializeObjectFromValue(Kryo kryo,
+	    Class<T> type) {
 	if (this.value == null)
 	    return null;
 
@@ -160,7 +162,6 @@
      *
      * Fails if the Object with same key already exists.
      *
-     * @note create an Empty Object if no object has never been set.
      * @throws ObjectExistsException
      */
     public void create() throws ObjectExistsException {
@@ -215,9 +216,10 @@
      * Fails if the Object with key does not exists.
      *
      * @throws ObjectDoesntExistException
+     * @throws WrongVersionException
      */
-    public void delete() throws ObjectDoesntExistException {
-	this.version = table.delete(key);
+    public void delete() throws ObjectDoesntExistException, WrongVersionException {
+	this.version = table.delete(key, this.version);
     }
 
     /**
@@ -301,8 +303,8 @@
     public static Collection<? extends RCObject> getAllObjects() {
 	// TODO implement
 	throw new UnsupportedOperationException("Not implemented yet");
-	//Collection<? extends RCObject> list = new ArrayList<>();
-	//return list;
+	// Collection<? extends RCObject> list = new ArrayList<>();
+	// return list;
     }
 
 }
diff --git a/src/main/java/net/onrc/onos/datastore/RCTable.java b/src/main/java/net/onrc/onos/datastore/RCTable.java
index 4836f24..55de05a 100644
--- a/src/main/java/net/onrc/onos/datastore/RCTable.java
+++ b/src/main/java/net/onrc/onos/datastore/RCTable.java
@@ -92,7 +92,14 @@
 
     // TODO: Enumerate whole table?
 
-    // Reject if exist
+    /**
+     * Create a Key-Value entry on table.
+     *
+     * @param key
+     * @param value
+     * @return version of the created entry
+     * @throws ObjectExistsException
+     */
     public long create(final byte[] key, final byte[] value)
 	    throws ObjectExistsException {
 
@@ -106,7 +113,28 @@
 	return updated_version;
     }
 
-    // read
+    /**
+     * Create a Key-Value entry on table, without existance checking.
+     *
+     * @param key
+     * @param value
+     * @return version of the created entry
+     */
+    public long forceCreate(final byte[] key, final byte[] value) {
+	JRamCloud rcClient = RCClient.getClient();
+
+	long updated_version = rcClient.write(this.rcTableId, key, value);
+	return updated_version;
+
+    }
+
+    /**
+     * Read a Key-Value entry from table.
+     *
+     * @param key
+     * @return Corresponding {@link Entry}
+     * @throws ObjectDoesntExistException
+     */
     public Entry read(final byte[] key) throws ObjectDoesntExistException {
 
 	JRamCloud rcClient = RCClient.getClient();
@@ -120,7 +148,17 @@
 	return new Entry(rcObj.key, rcObj.value, rcObj.version);
     }
 
-    // Reject if version neq
+    /**
+     * Update an existing Key-Value entry in table.
+     *
+     * @param key
+     * @param value
+     * @param version
+     *            expected version in the data store
+     * @return version after update
+     * @throws ObjectDoesntExistException
+     * @throws WrongVersionException
+     */
     public long update(final byte[] key, final byte[] value, final long version)
 	    throws ObjectDoesntExistException, WrongVersionException {
 
@@ -135,7 +173,14 @@
 	return updated_version;
     }
 
-    // Reject if not exist
+    /**
+     * Update an existing Key-Value entry in table, without checking version.
+     *
+     * @param key
+     * @param value
+     * @return version after update
+     * @throws ObjectDoesntExistException
+     */
     public long update(final byte[] key, final byte[] value)
 	    throws ObjectDoesntExistException {
 
@@ -150,16 +195,38 @@
 
     }
 
-    // Reject if not exist
-    public long delete(final byte[] key) throws ObjectDoesntExistException {
+    /**
+     * Remove an existing Key-Value entry in table
+     *
+     * @param key
+     * @param version
+     *            expected version in the data store
+     * @return version of removed object
+     * @throws ObjectDoesntExistException
+     * @throws WrongVersionException
+     */
+    public long delete(final byte[] key, final long version)
+	    throws ObjectDoesntExistException, WrongVersionException {
 	JRamCloud rcClient = RCClient.getClient();
 
-	// FIXME underlying JRamCloud does not support cond remove
+	// FIXME underlying JRamCloud does not support cond. remove now
 	RejectRules rules = rcClient.new RejectRules();
 	rules.setDoesntExists();
+	rules.setNeVersion(version);
 
 	long removed_version = rcClient.remove(this.rcTableId, key, rules);
 	return removed_version;
     }
 
+    /**
+     * Remove a Key-Value entry in table
+     *
+     * @param key
+     * @return version of removed object or -1, if it did not exist.
+     */
+    public long forceDelete(final byte[] key) {
+	JRamCloud rcClient = RCClient.getClient();
+	long removed_version = rcClient.remove(this.rcTableId, key);
+	return removed_version;
+    }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java b/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
index de9d5a4..175209d 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
@@ -239,7 +239,7 @@
 	assert (swRead2.getAllPortIds().size() == 1);
 	try {
 	    swRead2.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Deleting Switch Failed", e);
 	}
 
@@ -476,57 +476,57 @@
 	try {
 	    sw1.read();
 	    sw1.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Switch Failed", e);
 	}
 	try {
 	    sw1p1.read();
 	    sw1p1.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Port Failed", e);
 	}
 	try {
 	    sw1p2.read();
 	    sw1p2.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Port Failed", e);
 	}
 	try {
 	    d1.read();
 	    d1.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Device Failed", e);
 	}
 
 	try {
 	    l1.read();
 	    l1.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Link Failed", e);
 	}
 
 	try {
 	    sw2.read();
 	    sw2.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Switch Failed", e);
 	}
 	try {
 	    sw2p1.read();
 	    sw2p1.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Port Failed", e);
 	}
 	try {
 	    sw2p2.read();
 	    sw2p2.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Port Failed", e);
 	}
 	try {
 	    d2.read();
 	    d2.delete();
-	} catch (ObjectDoesntExistException e) {
+	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.debug("Delete Device Failed", e);
 	}
 
