diff --git a/src/main/java/net/onrc/onos/datastore/DataStoreClient.java b/src/main/java/net/onrc/onos/datastore/DataStoreClient.java
index 6aeb49e..bdf5df5 100644
--- a/src/main/java/net/onrc/onos/datastore/DataStoreClient.java
+++ b/src/main/java/net/onrc/onos/datastore/DataStoreClient.java
@@ -11,15 +11,15 @@
     private DataStoreClient() {}
 
     public static IKVClient getClient() {
-	// TODO read config and return appropriate IKVClient
-	switch (BACKEND) {
-	case "ramcloud":
-	    return RCClient.getClient();
-	case "hazelcast":
-	    return HZClient.getClient();
-	default:
-	    return HZClient.getClient();
-	}
+        // TODO read config and return appropriate IKVClient
+        switch (BACKEND) {
+        case "ramcloud":
+            return RCClient.getClient();
+        case "hazelcast":
+            return HZClient.getClient();
+        default:
+            return HZClient.getClient();
+        }
     }
 
 
diff --git a/src/main/java/net/onrc/onos/datastore/IKVClient.java b/src/main/java/net/onrc/onos/datastore/IKVClient.java
index eba804c..d2602c9 100644
--- a/src/main/java/net/onrc/onos/datastore/IKVClient.java
+++ b/src/main/java/net/onrc/onos/datastore/IKVClient.java
@@ -65,7 +65,7 @@
      * @throws WrongVersionException
      */
     public long update(IKVTableID tableId, byte[] key, byte[] value, long version)
-	    throws ObjectDoesntExistException, WrongVersionException;
+            throws ObjectDoesntExistException, WrongVersionException;
 
     /**
      * Update an existing Key-Value entry in table, without checking version.
@@ -79,7 +79,7 @@
      */
     @Deprecated
     public long update(IKVTableID tableId, byte[] key, byte[] value)
-	    throws ObjectDoesntExistException;
+            throws ObjectDoesntExistException;
 
     // TODO Adding serialized value as parameter to this interface may
     // give an option to improve performance on some backends.
@@ -95,7 +95,7 @@
      * @throws WrongVersionException
      */
     public long delete(IKVTableID tableId, byte[] key, long version)
-	    throws ObjectDoesntExistException, WrongVersionException;
+            throws ObjectDoesntExistException, WrongVersionException;
 
     /**
      * Remove a Key-Value entry in table
@@ -123,15 +123,15 @@
     public IMultiEntryOperation createOp(IKVTableID tableId, byte[] key, byte[] value);
 
     public IMultiEntryOperation forceCreateOp(IKVTableID tableId, byte[] key,
-	    byte[] value);
+            byte[] value);
 
     public IMultiEntryOperation readOp(IKVTableID tableId, byte[] key);
 
     public IMultiEntryOperation updateOp(IKVTableID tableId, byte[] key, byte[] value,
-	    long version);
+            long version);
 
     public IMultiEntryOperation deleteOp(IKVTableID tableId, byte[] key, byte[] value,
-	    long version);
+            long version);
 
     public IMultiEntryOperation forceDeleteOp(IKVTableID tableId, byte[] key);
 
diff --git a/src/main/java/net/onrc/onos/datastore/IKVTable.java b/src/main/java/net/onrc/onos/datastore/IKVTable.java
index 0164293..3151808 100644
--- a/src/main/java/net/onrc/onos/datastore/IKVTable.java
+++ b/src/main/java/net/onrc/onos/datastore/IKVTable.java
@@ -17,11 +17,11 @@
      */
     public static interface IKVEntry {
 
-	public byte[] getKey();
+        public byte[] getKey();
 
-	public byte[] getValue();
+        public byte[] getValue();
 
-	public long getVersion();
+        public long getVersion();
 
     }
 
@@ -70,7 +70,7 @@
      * @throws WrongVersionException
      */
     public long update(byte[] key, byte[] value, long version)
-	    throws ObjectDoesntExistException, WrongVersionException;
+            throws ObjectDoesntExistException, WrongVersionException;
 
     /**
      * Update an existing Key-Value entry in table, without checking version.
@@ -81,7 +81,7 @@
      * @throws ObjectDoesntExistException
      */
     public long update(byte[] key, byte[] value)
-	    throws ObjectDoesntExistException;
+            throws ObjectDoesntExistException;
 
     /**
      * Remove an existing Key-Value entry in table
@@ -94,7 +94,7 @@
      * @throws WrongVersionException
      */
     public long delete(byte[] key, long version)
-	    throws ObjectDoesntExistException, WrongVersionException;
+            throws ObjectDoesntExistException, WrongVersionException;
 
     /**
      * Remove a Key-Value entry in table
diff --git a/src/main/java/net/onrc/onos/datastore/IMultiEntryOperation.java b/src/main/java/net/onrc/onos/datastore/IMultiEntryOperation.java
index 25d5a13..dab1aad 100644
--- a/src/main/java/net/onrc/onos/datastore/IMultiEntryOperation.java
+++ b/src/main/java/net/onrc/onos/datastore/IMultiEntryOperation.java
@@ -6,11 +6,11 @@
 public interface IMultiEntryOperation {
 
     public enum STATUS {
-	NOT_EXECUTED, SUCCESS, FAILED
+        NOT_EXECUTED, SUCCESS, FAILED
     }
 
     public enum OPERATION {
-	CREATE, FORCE_CREATE, UPDATE, READ, DELETE, FORCE_DELETE
+        CREATE, FORCE_CREATE, UPDATE, READ, DELETE, FORCE_DELETE
     }
 
     public boolean hasSucceeded();
diff --git a/src/main/java/net/onrc/onos/datastore/ObjectDoesntExistException.java b/src/main/java/net/onrc/onos/datastore/ObjectDoesntExistException.java
index 712ba4e..030680f 100644
--- a/src/main/java/net/onrc/onos/datastore/ObjectDoesntExistException.java
+++ b/src/main/java/net/onrc/onos/datastore/ObjectDoesntExistException.java
@@ -9,17 +9,17 @@
     private static final long serialVersionUID = 859082748533417866L;
 
     public ObjectDoesntExistException(final String message) {
-	super(message);
+        super(message);
     }
 
     public ObjectDoesntExistException(final IKVTableID tableID,
-	    final byte[] key, final Throwable cause) {
-	super(ByteArrayUtil.toHexStringBuffer(key, ":")
-	        + " did not exist on table:" + tableID, cause);
+            final byte[] key, final Throwable cause) {
+        super(ByteArrayUtil.toHexStringBuffer(key, ":")
+                + " did not exist on table:" + tableID, cause);
     }
 
     public ObjectDoesntExistException(final IKVTableID tableID, final byte[] key) {
-	super(ByteArrayUtil.toHexStringBuffer(key, ":")
-	        + " did not exist on table:" + tableID);
+        super(ByteArrayUtil.toHexStringBuffer(key, ":")
+                + " did not exist on table:" + tableID);
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/ObjectExistsException.java b/src/main/java/net/onrc/onos/datastore/ObjectExistsException.java
index 3ac3bf8..8ce6055 100644
--- a/src/main/java/net/onrc/onos/datastore/ObjectExistsException.java
+++ b/src/main/java/net/onrc/onos/datastore/ObjectExistsException.java
@@ -9,17 +9,17 @@
     private static final long serialVersionUID = -1488647215779909457L;
 
     public ObjectExistsException(final String message) {
-	super(message);
+        super(message);
     }
 
     public ObjectExistsException(final IKVTableID tableID, final byte[] key,
-	    final Throwable cause) {
-	super(ByteArrayUtil.toHexStringBuffer(key, ":")
-	        + " already exist on table:" + tableID, cause);
+            final Throwable cause) {
+        super(ByteArrayUtil.toHexStringBuffer(key, ":")
+                + " already exist on table:" + tableID, cause);
     }
 
     public ObjectExistsException(final IKVTableID tableID, final byte[] key) {
-	super(ByteArrayUtil.toHexStringBuffer(key, ":")
-	        + " already exist on table:" + tableID);
+        super(ByteArrayUtil.toHexStringBuffer(key, ":")
+                + " already exist on table:" + tableID);
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/RejectRulesException.java b/src/main/java/net/onrc/onos/datastore/RejectRulesException.java
index 0bd5072..1777ef6 100644
--- a/src/main/java/net/onrc/onos/datastore/RejectRulesException.java
+++ b/src/main/java/net/onrc/onos/datastore/RejectRulesException.java
@@ -11,14 +11,14 @@
     private static final long serialVersionUID = -1444683012320423530L;
 
     public RejectRulesException(final String message) {
-	super(message);
+        super(message);
     }
 
     public RejectRulesException(final String message, final Throwable cause) {
-	super(message, cause);
+        super(message, cause);
     }
 
     public RejectRulesException(final Throwable cause) {
-	super(cause);
+        super(cause);
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/WrongVersionException.java b/src/main/java/net/onrc/onos/datastore/WrongVersionException.java
index 9b59ff1..441409f 100644
--- a/src/main/java/net/onrc/onos/datastore/WrongVersionException.java
+++ b/src/main/java/net/onrc/onos/datastore/WrongVersionException.java
@@ -9,23 +9,23 @@
     private static final long serialVersionUID = -1644202495890190823L;
 
     public WrongVersionException(final String message) {
-	super(message);
+        super(message);
     }
 
     public WrongVersionException(final IKVTableID tableID, final byte[] key,
-	    final long expectedVersion, final Throwable cause) {
-	// It will be best if {@code cause} has actual version encountered, but
-	// doesn't currently.
-	super(ByteArrayUtil.toHexStringBuffer(key, ":") + " on table:"
-	        + tableID + " was expected to be version:" + expectedVersion,
-	        cause);
+            final long expectedVersion, final Throwable cause) {
+        // It will be best if {@code cause} has actual version encountered, but
+        // doesn't currently.
+        super(ByteArrayUtil.toHexStringBuffer(key, ":") + " on table:"
+                + tableID + " was expected to be version:" + expectedVersion,
+                cause);
     }
 
     public WrongVersionException(final IKVTableID tableID, final byte[] key,
-	    final long expectedVersion, final long encounteredVersion) {
-	super(ByteArrayUtil.toHexStringBuffer(key, ":") + " on table:"
-	        + tableID + " was expected to be version:" + expectedVersion
-	        + " but found:" + encounteredVersion);
+            final long expectedVersion, final long encounteredVersion) {
+        super(ByteArrayUtil.toHexStringBuffer(key, ":") + " on table:"
+                + tableID + " was expected to be version:" + expectedVersion
+                + " but found:" + encounteredVersion);
     }
 
 }
diff --git a/src/main/java/net/onrc/onos/datastore/hazelcast/HZClient.java b/src/main/java/net/onrc/onos/datastore/hazelcast/HZClient.java
index 2c2b3a4..aec9f9d 100644
--- a/src/main/java/net/onrc/onos/datastore/hazelcast/HZClient.java
+++ b/src/main/java/net/onrc/onos/datastore/hazelcast/HZClient.java
@@ -49,71 +49,71 @@
     private static final HZClient THE_INSTANCE = new HZClient();
 
     public static HZClient getClient() {
-	return THE_INSTANCE;
+        return THE_INSTANCE;
     }
 
     private HZClient() {
-	hazelcastInstance = getHZinstance(BASE_CONFIG_FILENAME);
+        hazelcastInstance = getHZinstance(BASE_CONFIG_FILENAME);
     }
 
     private static HazelcastInstance getHZinstance(final String hazelcastConfigFileName) {
-	Config baseHzConfig = null;
-	try {
-	    baseHzConfig = new FileSystemXmlConfig(hazelcastConfigFileName);
-	} catch (FileNotFoundException e) {
-	    log.error("Error opening Hazelcast XML configuration. File not found: " + hazelcastConfigFileName, e);
-	    throw new Error("Cannot find Hazelcast configuration: " + hazelcastConfigFileName , e);
-	}
+        Config baseHzConfig = null;
+        try {
+            baseHzConfig = new FileSystemXmlConfig(hazelcastConfigFileName);
+        } catch (FileNotFoundException e) {
+            log.error("Error opening Hazelcast XML configuration. File not found: " + hazelcastConfigFileName, e);
+            throw new Error("Cannot find Hazelcast configuration: " + hazelcastConfigFileName , e);
+        }
 
-	// use xml config if present, if not use System.property
-	MapConfig mapConfig = baseHzConfig.getMapConfigs().get(MAP_PREFIX + "*");
-	if (mapConfig != null) {
-	    backupCount = mapConfig.getBackupCount();
-	}
+        // use xml config if present, if not use System.property
+        MapConfig mapConfig = baseHzConfig.getMapConfigs().get(MAP_PREFIX + "*");
+        if (mapConfig != null) {
+            backupCount = mapConfig.getBackupCount();
+        }
 
-	HazelcastInstance instance = null;
-	if (useClientMode) {
-	    log.info("Configuring Hazelcast datastore as Client mode");
-	    ClientConfig clientConfig = new ClientConfig();
-	    final int port = baseHzConfig.getNetworkConfig().getPort();
+        HazelcastInstance instance = null;
+        if (useClientMode) {
+            log.info("Configuring Hazelcast datastore as Client mode");
+            ClientConfig clientConfig = new ClientConfig();
+            final int port = baseHzConfig.getNetworkConfig().getPort();
 
-	    String server = System.getProperty("net.onrc.onos.datastore.hazelcast.client.server", "localhost");
-	    clientConfig.addAddress(server + ":" + port);
+            String server = System.getProperty("net.onrc.onos.datastore.hazelcast.client.server", "localhost");
+            clientConfig.addAddress(server + ":" + port);
 
-	    // copy group config from base Hazelcast configuration
-	    clientConfig.getGroupConfig().setName(baseHzConfig.getGroupConfig().getName());
-	    clientConfig.getGroupConfig().setPassword(baseHzConfig.getGroupConfig().getPassword());
+            // copy group config from base Hazelcast configuration
+            clientConfig.getGroupConfig().setName(baseHzConfig.getGroupConfig().getName());
+            clientConfig.getGroupConfig().setPassword(baseHzConfig.getGroupConfig().getPassword());
 
-	    // TODO We probably need to figure out what else need to be
-	    // derived from baseConfig
+            // TODO We probably need to figure out what else need to be
+            // derived from baseConfig
 
-	    registerSerializer(clientConfig.getSerializationConfig());
+            registerSerializer(clientConfig.getSerializationConfig());
 
-	    log.info("Starting Hazelcast datastore client for [{}]", clientConfig.getAddressList());
+            log.info("Starting Hazelcast datastore client for [{}]", clientConfig.getAddressList());
 
-	    try {
-		instance = HazelcastClient.newHazelcastClient(clientConfig);
-		if (!instance.getCluster().getMembers().isEmpty()) {
-		    log.debug("Members in cluster: " + instance.getCluster().getMembers());
-		    return instance;
-		}
-		log.info("Failed to find cluster member, falling back to Instance mode");
-	    } catch (IllegalStateException e) {
-		log.info("Failed to initialize HazelcastClient, falling back to Instance mode");
-	    }
-	    useClientMode = false;
-	    instance = null;
-	}
-	log.info("Configuring Hazelcast datastore as Instance mode");
+            try {
+                instance = HazelcastClient.newHazelcastClient(clientConfig);
+                if (!instance.getCluster().getMembers().isEmpty()) {
+                    log.debug("Members in cluster: " + instance.getCluster().getMembers());
+                    return instance;
+                }
+                log.info("Failed to find cluster member, falling back to Instance mode");
+            } catch (IllegalStateException e) {
+                log.info("Failed to initialize HazelcastClient, falling back to Instance mode");
+            }
+            useClientMode = false;
+            instance = null;
+        }
+        log.info("Configuring Hazelcast datastore as Instance mode");
 
-	// To run 2 Hazelcast instance in 1 JVM,
-	// we probably need to something like below
-	//int port = hazelcastConfig.getNetworkConfig().getPort();
-	//hazelcastConfig.getNetworkConfig().setPort(port+1);
+        // To run 2 Hazelcast instance in 1 JVM,
+        // we probably need to something like below
+        //int port = hazelcastConfig.getNetworkConfig().getPort();
+        //hazelcastConfig.getNetworkConfig().setPort(port+1);
 
-	registerSerializer(baseHzConfig.getSerializationConfig());
+        registerSerializer(baseHzConfig.getSerializationConfig());
 
-	return Hazelcast.newHazelcastInstance(baseHzConfig);
+        return Hazelcast.newHazelcastInstance(baseHzConfig);
     }
 
     /**
@@ -121,224 +121,224 @@
      * @param config
      */
     private static void registerSerializer(final SerializationConfig config) {
-	config.addDataSerializableFactoryClass(
-		    VersionedValueSerializableFactory.FACTORY_ID,
-		    VersionedValueSerializableFactory.class);
+        config.addDataSerializableFactoryClass(
+                VersionedValueSerializableFactory.FACTORY_ID,
+                VersionedValueSerializableFactory.class);
     }
 
     @Override
     public IKVTable getTable(final String tableName) {
-	IMap<byte[], VersionedValue> map = hazelcastInstance.getMap(MAP_PREFIX + tableName);
+        IMap<byte[], VersionedValue> map = hazelcastInstance.getMap(MAP_PREFIX + tableName);
 
-	if (!useClientMode) {
-	    // config only available in Instance Mode
-	    // Client Mode must rely on hazelcast.xml to be properly configured.
-	    MapConfig config = hazelcastInstance.getConfig().getMapConfig(MAP_PREFIX + tableName);
-	    // config for this map to be strong consistent
-	    if (config.isReadBackupData()) {
-		config.setReadBackupData(false);
-	    }
-	    if (config.isNearCacheEnabled()) {
-		config.getNearCacheConfig().setMaxSize(0);
-	    }
+        if (!useClientMode) {
+            // config only available in Instance Mode
+            // Client Mode must rely on hazelcast.xml to be properly configured.
+            MapConfig config = hazelcastInstance.getConfig().getMapConfig(MAP_PREFIX + tableName);
+            // config for this map to be strong consistent
+            if (config.isReadBackupData()) {
+                config.setReadBackupData(false);
+            }
+            if (config.isNearCacheEnabled()) {
+                config.getNearCacheConfig().setMaxSize(0);
+            }
 
-	    if (config.getBackupCount() != backupCount) {
-		config.setAsyncBackupCount(0);
-		config.setBackupCount(backupCount);
-	    }
-	}
+            if (config.getBackupCount() != backupCount) {
+                config.setAsyncBackupCount(0);
+                config.setBackupCount(backupCount);
+            }
+        }
 
-	return new HZTable(tableName, map);
+        return new HZTable(tableName, map);
     }
 
     @Override
     public void dropTable(final IKVTable table) {
-	((HZTable) table).getBackendMap().clear();
+        ((HZTable) table).getBackendMap().clear();
     }
 
     @Override
     public long create(final IKVTableID tableId, final byte[] key, final byte[] value)
             throws ObjectExistsException {
-	IKVTable table = (IKVTable) tableId;
-	return table.create(key, value);
+        IKVTable table = (IKVTable) tableId;
+        return table.create(key, value);
     }
 
     @Override
     public long forceCreate(final IKVTableID tableId, final byte[] key, final byte[] value) {
-	IKVTable table = (IKVTable) tableId;
-	return table.forceCreate(key, value);
+        IKVTable table = (IKVTable) tableId;
+        return table.forceCreate(key, value);
     }
 
     @Override
     public IKVEntry read(final IKVTableID tableId, final byte[] key)
             throws ObjectDoesntExistException {
-	IKVTable table = (IKVTable) tableId;
-	return table.read(key);
+        IKVTable table = (IKVTable) tableId;
+        return table.read(key);
     }
 
     @Override
     public long update(final IKVTableID tableId, final byte[] key, final byte[] value,
             final long version) throws ObjectDoesntExistException,
             WrongVersionException {
-	IKVTable table = (IKVTable) tableId;
-	return table.update(key, value, version);
+        IKVTable table = (IKVTable) tableId;
+        return table.update(key, value, version);
     }
 
     @Override
     public long update(final IKVTableID tableId, final byte[] key, final byte[] value)
             throws ObjectDoesntExistException {
-	IKVTable table = (IKVTable) tableId;
-	return table.update(key, value);
+        IKVTable table = (IKVTable) tableId;
+        return table.update(key, value);
     }
 
     @Override
     public long delete(final IKVTableID tableId, final byte[] key, final long version)
             throws ObjectDoesntExistException, WrongVersionException {
-	IKVTable table = (IKVTable) tableId;
-	return table.delete(key, version);
+        IKVTable table = (IKVTable) tableId;
+        return table.delete(key, version);
     }
 
     @Override
     public long forceDelete(final IKVTableID tableId, final byte[] key) {
-	IKVTable table = (IKVTable) tableId;
-	return table.forceDelete(key);
+        IKVTable table = (IKVTable) tableId;
+        return table.forceDelete(key);
     }
 
     @Override
     public Iterable<IKVEntry> getAllEntries(final IKVTableID tableId) {
-	IKVTable table = (IKVTable) tableId;
-	return table.getAllEntries();
+        IKVTable table = (IKVTable) tableId;
+        return table.getAllEntries();
     }
 
     @Override
     public IMultiEntryOperation createOp(final IKVTableID tableId, final byte[] key,
             final byte[] value) {
-	return new HZMultiEntryOperation((HZTable) tableId, key, value, HZClient.VERSION_NONEXISTENT, OPERATION.CREATE);
+        return new HZMultiEntryOperation((HZTable) tableId, key, value, HZClient.VERSION_NONEXISTENT, OPERATION.CREATE);
     }
 
     @Override
     public IMultiEntryOperation forceCreateOp(final IKVTableID tableId, final byte[] key,
             final byte[] value) {
-	return new HZMultiEntryOperation((HZTable) tableId, key, value, HZClient.VERSION_NONEXISTENT, OPERATION.FORCE_CREATE);
+        return new HZMultiEntryOperation((HZTable) tableId, key, value, HZClient.VERSION_NONEXISTENT, OPERATION.FORCE_CREATE);
     }
 
     @Override
     public IMultiEntryOperation readOp(final IKVTableID tableId, final byte[] key) {
-	return new HZMultiEntryOperation((HZTable) tableId, key, OPERATION.READ);
+        return new HZMultiEntryOperation((HZTable) tableId, key, OPERATION.READ);
     }
 
     @Override
     public IMultiEntryOperation updateOp(final IKVTableID tableId, final byte[] key,
             final byte[] value, final long version) {
-	return new HZMultiEntryOperation((HZTable) tableId, key, value, version, OPERATION.UPDATE);
+        return new HZMultiEntryOperation((HZTable) tableId, key, value, version, OPERATION.UPDATE);
     }
 
     @Override
     public IMultiEntryOperation deleteOp(final IKVTableID tableId, final byte[] key,
             final byte[] value, final long version) {
-	return new HZMultiEntryOperation((HZTable) tableId, key, value, version, OPERATION.DELETE);
+        return new HZMultiEntryOperation((HZTable) tableId, key, value, version, OPERATION.DELETE);
     }
 
     @Override
     public IMultiEntryOperation forceDeleteOp(final IKVTableID tableId, final byte[] key) {
-	return new HZMultiEntryOperation((HZTable) tableId, key, OPERATION.FORCE_DELETE);
+        return new HZMultiEntryOperation((HZTable) tableId, key, OPERATION.FORCE_DELETE);
     }
 
     @Override
     public boolean multiDelete(final Collection<IMultiEntryOperation> ops) {
-	boolean failExists = false;
-	for (IMultiEntryOperation op : ops) {
-	    HZMultiEntryOperation mop = (HZMultiEntryOperation) op;
-	    switch (mop.getOperation()) {
-	    case DELETE:
-		try {
-		    final long version = delete(mop.getTableId(), mop.getKey(), mop.getVersion());
-		    mop.setVersion(version);
-		    mop.setStatus(STATUS.SUCCESS);
-		} catch (ObjectDoesntExistException | WrongVersionException e) {
-		    log.error(mop + " failed.", e);
-		    mop.setStatus(STATUS.FAILED);
+        boolean failExists = false;
+        for (IMultiEntryOperation op : ops) {
+            HZMultiEntryOperation mop = (HZMultiEntryOperation) op;
+            switch (mop.getOperation()) {
+            case DELETE:
+                try {
+                    final long version = delete(mop.getTableId(), mop.getKey(), mop.getVersion());
+                    mop.setVersion(version);
+                    mop.setStatus(STATUS.SUCCESS);
+                } catch (ObjectDoesntExistException | WrongVersionException e) {
+                    log.error(mop + " failed.", e);
+                    mop.setStatus(STATUS.FAILED);
                     failExists = true;
-		}
-		break;
-	    case FORCE_DELETE:
-		final long version = forceDelete(mop.getTableId(), mop.getKey());
-		mop.setVersion(version);
-		mop.setStatus(STATUS.SUCCESS);
-		break;
-	    default:
-		throw new UnsupportedOperationException(mop.toString());
-	    }
-	}
-	return failExists;
+                }
+                break;
+            case FORCE_DELETE:
+                final long version = forceDelete(mop.getTableId(), mop.getKey());
+                mop.setVersion(version);
+                mop.setStatus(STATUS.SUCCESS);
+                break;
+            default:
+                throw new UnsupportedOperationException(mop.toString());
+            }
+        }
+        return failExists;
     }
 
     @Override
     public boolean multiWrite(final List<IMultiEntryOperation> ops) {
-	// there may be room to batch to improve performance
-	boolean failExists = false;
-	for (IMultiEntryOperation op : ops) {
-	    IModifiableMultiEntryOperation mop = (IModifiableMultiEntryOperation) op;
-	    switch (mop.getOperation()) {
-	    case CREATE:
-		try {
-		    long version = create(mop.getTableId(), mop.getKey(), mop.getValue());
-		    mop.setVersion(version);
-		    mop.setStatus(STATUS.SUCCESS);
-		} catch (ObjectExistsException e) {
-		    log.error(mop + " failed.", e);
-		    mop.setStatus(STATUS.FAILED);
-		    failExists = true;
-		}
-		break;
-	    case FORCE_CREATE:
-	    {
-		final long version = forceCreate(mop.getTableId(), mop.getKey(), mop.getValue());
-		mop.setVersion(version);
-		mop.setStatus(STATUS.SUCCESS);
-		break;
-	    }
-	    case UPDATE:
-		try {
-		    long version = update(mop.getTableId(), mop.getKey(), mop.getValue(), mop.getVersion());
-		    mop.setVersion(version);
-		    mop.setStatus(STATUS.SUCCESS);
-		} catch (ObjectDoesntExistException | WrongVersionException e) {
-		    log.error(mop + " failed.", e);
-		    mop.setStatus(STATUS.FAILED);
-		    failExists = true;
-		}
-		break;
-	    default:
-		throw new UnsupportedOperationException(mop.toString());
-	    }
-	}
-	return failExists;
+        // there may be room to batch to improve performance
+        boolean failExists = false;
+        for (IMultiEntryOperation op : ops) {
+            IModifiableMultiEntryOperation mop = (IModifiableMultiEntryOperation) op;
+            switch (mop.getOperation()) {
+            case CREATE:
+                try {
+                    long version = create(mop.getTableId(), mop.getKey(), mop.getValue());
+                    mop.setVersion(version);
+                    mop.setStatus(STATUS.SUCCESS);
+                } catch (ObjectExistsException e) {
+                    log.error(mop + " failed.", e);
+                    mop.setStatus(STATUS.FAILED);
+                    failExists = true;
+                }
+                break;
+            case FORCE_CREATE:
+            {
+                final long version = forceCreate(mop.getTableId(), mop.getKey(), mop.getValue());
+                mop.setVersion(version);
+                mop.setStatus(STATUS.SUCCESS);
+                break;
+            }
+            case UPDATE:
+                try {
+                    long version = update(mop.getTableId(), mop.getKey(), mop.getValue(), mop.getVersion());
+                    mop.setVersion(version);
+                    mop.setStatus(STATUS.SUCCESS);
+                } catch (ObjectDoesntExistException | WrongVersionException e) {
+                    log.error(mop + " failed.", e);
+                    mop.setStatus(STATUS.FAILED);
+                    failExists = true;
+                }
+                break;
+            default:
+                throw new UnsupportedOperationException(mop.toString());
+            }
+        }
+        return failExists;
     }
 
     @Override
     public boolean multiRead(final Collection<IMultiEntryOperation> ops) {
-	boolean failExists = false;
-	for (IMultiEntryOperation op : ops) {
-	    IModifiableMultiEntryOperation mop = (IModifiableMultiEntryOperation) op;
-	    HZTable table = (HZTable) op.getTableId();
-	    ((HZMultiEntryOperation) mop.getActualOperation()).setFuture(table.getBackendMap().getAsync(op.getKey()));
-	}
-	for (IMultiEntryOperation op : ops) {
-	    IModifiableMultiEntryOperation mop = (IModifiableMultiEntryOperation) op;
-	    if (mop.hasSucceeded()) {
-		// status update is already done, nothing to do.
-	    } else {
-		failExists = true;
-	    }
-	}
+        boolean failExists = false;
+        for (IMultiEntryOperation op : ops) {
+            IModifiableMultiEntryOperation mop = (IModifiableMultiEntryOperation) op;
+            HZTable table = (HZTable) op.getTableId();
+            ((HZMultiEntryOperation) mop.getActualOperation()).setFuture(table.getBackendMap().getAsync(op.getKey()));
+        }
+        for (IMultiEntryOperation op : ops) {
+            IModifiableMultiEntryOperation mop = (IModifiableMultiEntryOperation) op;
+            if (mop.hasSucceeded()) {
+                // status update is already done, nothing to do.
+            } else {
+                failExists = true;
+            }
+        }
 
-	return failExists;
+        return failExists;
     }
 
     @Override
     public long VERSION_NONEXISTENT() {
-	return VERSION_NONEXISTENT;
+        return VERSION_NONEXISTENT;
     }
 
 
diff --git a/src/main/java/net/onrc/onos/datastore/hazelcast/HZMultiEntryOperation.java b/src/main/java/net/onrc/onos/datastore/hazelcast/HZMultiEntryOperation.java
index 1da7f1a..67a868e 100644
--- a/src/main/java/net/onrc/onos/datastore/hazelcast/HZMultiEntryOperation.java
+++ b/src/main/java/net/onrc/onos/datastore/hazelcast/HZMultiEntryOperation.java
@@ -33,13 +33,13 @@
      * @param operation
      */
     public HZMultiEntryOperation(final HZTable table, final byte[] key, final OPERATION operation) {
-	this.table = table;
-	this.key = key;
-	this.status = STATUS.NOT_EXECUTED;
-	this.operation = operation;
+        this.table = table;
+        this.key = key;
+        this.status = STATUS.NOT_EXECUTED;
+        this.operation = operation;
 
-	this.future = null;
-	this.writeValue = null;
+        this.future = null;
+        this.writeValue = null;
     }
 
     /**
@@ -51,59 +51,59 @@
      * @param operation
      */
     public HZMultiEntryOperation(final HZTable table, final byte[] key, final byte[] value, final long version, final OPERATION operation) {
-	this.table = table;
-	this.key = key;
-	this.status = STATUS.NOT_EXECUTED;
-	this.operation = operation;
+        this.table = table;
+        this.key = key;
+        this.status = STATUS.NOT_EXECUTED;
+        this.operation = operation;
 
-	this.future = null;
-	this.writeValue = new VersionedValue(value, version);
+        this.future = null;
+        this.writeValue = new VersionedValue(value, version);
     }
 
     @Override
     public boolean hasSucceeded() {
 
-	VersionedValue value = get();
-	return (value != null) && (this.status == STATUS.SUCCESS);
+        VersionedValue value = get();
+        return (value != null) && (this.status == STATUS.SUCCESS);
     }
 
     @Override
     public STATUS getStatus() {
-	get();
-	return status;
+        get();
+        return status;
     }
 
     @Override
     public IKVTableID getTableId() {
-	return table;
+        return table;
     }
 
     @Override
     public byte[] getKey() {
-	return key;
+        return key;
     }
 
     @Override
     public byte[] getValue() {
-	if (future != null) {
-	    VersionedValue value = get();
-	    return value.getValue();
-	}
-	return writeValue.getValue();
+        if (future != null) {
+            VersionedValue value = get();
+            return value.getValue();
+        }
+        return writeValue.getValue();
     }
 
     @Override
     public long getVersion() {
-	if (future != null) {
-	    VersionedValue value = get();
-	    return value.getVersion();
-	}
-	return writeValue.getVersion();
+        if (future != null) {
+            VersionedValue value = get();
+            return value.getVersion();
+        }
+        return writeValue.getVersion();
     }
 
     @Override
     public OPERATION getOperation() {
-	return operation;
+        return operation;
     }
 
     /**
@@ -125,28 +125,28 @@
 
     @Override
     public void setValue(final byte[] value, final long version) {
-	writeValue = new VersionedValue(value, version);
-	setVersion(version);
+        writeValue = new VersionedValue(value, version);
+        setVersion(version);
     }
 
     @Override
     public void setVersion(final long version) {
-	if (future != null) {
-	    // no-op on read
-	}
-	if (writeValue == null) {
-	    writeValue = new VersionedValue(null, version);
-	}
+        if (future != null) {
+            // no-op on read
+        }
+        if (writeValue == null) {
+            writeValue = new VersionedValue(null, version);
+        }
     }
 
     @Override
     public void setStatus(final STATUS status) {
-	this.status = status;
+        this.status = status;
     }
 
     @Override
     public IModifiableMultiEntryOperation getActualOperation() {
-	return this;
+        return this;
     }
 
     void setFuture(final Future<VersionedValue> future) {
@@ -155,8 +155,8 @@
 
     @Override
     public String toString() {
-	return "[HZMultiEntryOperation table=" + table + ", key="
-	        + ByteArrayUtil.toHexStringBuffer(key, ":") + ", operation=" + operation
-	        + ", status=" + status + ", writeValue=" + writeValue + "]";
+        return "[HZMultiEntryOperation table=" + table + ", key="
+                + ByteArrayUtil.toHexStringBuffer(key, ":") + ", operation=" + operation
+                + ", status=" + status + ", writeValue=" + writeValue + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/hazelcast/HZTable.java b/src/main/java/net/onrc/onos/datastore/hazelcast/HZTable.java
index ec98349..894854c 100644
--- a/src/main/java/net/onrc/onos/datastore/hazelcast/HZTable.java
+++ b/src/main/java/net/onrc/onos/datastore/hazelcast/HZTable.java
@@ -33,12 +33,12 @@
      * @return initial value
      */
     protected static long getInitialVersion() {
-	long version = initialVersion.incrementAndGet();
-	if (version == HZClient.VERSION_NONEXISTENT) {
-	    // used up whole 64bit space?
-	    version = initialVersion.incrementAndGet();
-	}
-	return version;
+        long version = initialVersion.incrementAndGet();
+        if (version == HZClient.VERSION_NONEXISTENT) {
+            // used up whole 64bit space?
+            version = initialVersion.incrementAndGet();
+        }
+        return version;
     }
 
     /**
@@ -47,141 +47,141 @@
      * @return
      */
     protected static long getNextVersion(final long version) {
-	long nextVersion = version + 1;
-	if (nextVersion == HZClient.VERSION_NONEXISTENT) {
-	    ++nextVersion;
-	}
-	return nextVersion;
+        long nextVersion = version + 1;
+        if (nextVersion == HZClient.VERSION_NONEXISTENT) {
+            ++nextVersion;
+        }
+        return nextVersion;
     }
 
     static class VersionedValue implements IdentifiedDataSerializable {
-	private static final long serialVersionUID = -3149375966890712708L;
+        private static final long serialVersionUID = -3149375966890712708L;
 
-	private byte[] value;
-	private long version;
+        private byte[] value;
+        private long version;
 
-	protected VersionedValue() {
-	    value = new byte[0];
-	    version = HZClient.VERSION_NONEXISTENT;
-	}
+        protected VersionedValue() {
+            value = new byte[0];
+            version = HZClient.VERSION_NONEXISTENT;
+        }
 
-	public VersionedValue(final byte[] value, final long version) {
-	    this.value = value;
-	    this.version = version;
-	}
+        public VersionedValue(final byte[] value, final long version) {
+            this.value = value;
+            this.version = version;
+        }
 
-	public byte[] getValue() {
-	    return value;
-	}
+        public byte[] getValue() {
+            return value;
+        }
 
-	public long getVersion() {
-	    return version;
-	}
+        public long getVersion() {
+            return version;
+        }
 
-	public void setValue(final byte[] value) {
-	    this.value = value;
-	}
+        public void setValue(final byte[] value) {
+            this.value = value;
+        }
 
-	public void setNextVersion() {
-	    this.version = getNextVersion(this.version);
-	}
+        public void setNextVersion() {
+            this.version = getNextVersion(this.version);
+        }
 
-	@Override
-	public void writeData(final ObjectDataOutput out) throws IOException {
-	    out.writeLong(version);
-	    out.writeInt(value.length);
-	    if (value.length > 0) {
-		out.write(value);
-	    }
-	}
+        @Override
+        public void writeData(final ObjectDataOutput out) throws IOException {
+            out.writeLong(version);
+            out.writeInt(value.length);
+            if (value.length > 0) {
+                out.write(value);
+            }
+        }
 
-	@Override
-	public void readData(final ObjectDataInput in) throws IOException {
-	    version = in.readLong();
-	    final int valueLen = in.readInt();
-	    value = new byte[valueLen];
-	    in.readFully(value);
-	}
+        @Override
+        public void readData(final ObjectDataInput in) throws IOException {
+            version = in.readLong();
+            final int valueLen = in.readInt();
+            value = new byte[valueLen];
+            in.readFully(value);
+        }
 
-	@Override
-	public int getFactoryId() {
-	    return VersionedValueSerializableFactory.FACTORY_ID;
-	}
+        @Override
+        public int getFactoryId() {
+            return VersionedValueSerializableFactory.FACTORY_ID;
+        }
 
-	@Override
-	public int getId() {
-	    return VersionedValueSerializableFactory.VERSIONED_VALUE_ID;
-	}
+        @Override
+        public int getId() {
+            return VersionedValueSerializableFactory.VERSIONED_VALUE_ID;
+        }
 
-	@Override
-	public int hashCode() {
-	    final int prime = 31;
-	    int result = 1;
-	    result = prime * result + (int) (version ^ (version >>> 32));
-	    result = prime * result + Arrays.hashCode(value);
-	    return result;
-	}
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + (int) (version ^ (version >>> 32));
+            result = prime * result + Arrays.hashCode(value);
+            return result;
+        }
 
-	@Override
-	public boolean equals(final Object obj) {
-	    if (this == obj) {
-		return true;
-	    }
-	    if (obj == null) {
-		return false;
-	    }
-	    if (getClass() != obj.getClass()) {
-		return false;
-	    }
-	    VersionedValue other = (VersionedValue) obj;
-	    if (version != other.version) {
-		return false;
-	    }
-	    if (!Arrays.equals(value, other.value)) {
-		return false;
-	    }
-	    return true;
-	}
+        @Override
+        public boolean equals(final Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            VersionedValue other = (VersionedValue) obj;
+            if (version != other.version) {
+                return false;
+            }
+            if (!Arrays.equals(value, other.value)) {
+                return false;
+            }
+            return true;
+        }
     }
 
     // TODO Refactor and extract common parts
     public static class Entry implements IKVEntry {
-	final byte[] key;
-	byte[] value;
-	long version;
+        final byte[] key;
+        byte[] value;
+        long version;
 
-	public Entry(final byte[] key, final byte[] value, final long version) {
-	    this.key = key;
-	    this.setValue(value);
-	    this.setVersion(version);
-	}
+        public Entry(final byte[] key, final byte[] value, final long version) {
+            this.key = key;
+            this.setValue(value);
+            this.setVersion(version);
+        }
 
-	public Entry(final byte[] key) {
-	    this(key, null, HZClient.VERSION_NONEXISTENT);
-	}
+        public Entry(final byte[] key) {
+            this(key, null, HZClient.VERSION_NONEXISTENT);
+        }
 
-	@Override
-	public byte[] getKey() {
-	    return key;
-	}
+        @Override
+        public byte[] getKey() {
+            return key;
+        }
 
-	@Override
-	public byte[] getValue() {
-	    return value;
-	}
+        @Override
+        public byte[] getValue() {
+            return value;
+        }
 
-	@Override
-	public long getVersion() {
-	    return version;
-	}
+        @Override
+        public long getVersion() {
+            return version;
+        }
 
-	void setValue(final byte[] value) {
-	    this.value = value;
-	}
+        void setValue(final byte[] value) {
+            this.value = value;
+        }
 
-	void setVersion(final long version) {
-	    this.version = version;
-	}
+        void setVersion(final long version) {
+            this.version = version;
+        }
     }
 
 
@@ -190,136 +190,136 @@
     private final IMap<byte[], VersionedValue> map;
 
     public HZTable(final String mapName, final IMap<byte[], VersionedValue> map) {
-	this.mapName = mapName;
-	this.map = map;
+        this.mapName = mapName;
+        this.map = map;
     }
 
     @Override
     public String getTableName() {
-	return mapName;
+        return mapName;
     }
 
     @Override
     public IKVTableID getTableId() {
-	return this;
+        return this;
     }
 
     @Override
     public long create(final byte[] key, final byte[] value) throws ObjectExistsException {
-	final long version = getInitialVersion();
-	VersionedValue existing = map.putIfAbsent(key, new VersionedValue(value, version));
-	if (existing != null) {
-	    throw new ObjectExistsException(this, key);
-	}
-	return version;
+        final long version = getInitialVersion();
+        VersionedValue existing = map.putIfAbsent(key, new VersionedValue(value, version));
+        if (existing != null) {
+            throw new ObjectExistsException(this, key);
+        }
+        return version;
     }
 
     @Override
     public long forceCreate(final byte[] key, final byte[] value) {
-	final long version = getInitialVersion();
-	map.set(key, new VersionedValue(value, version));
-	return version;
+        final long version = getInitialVersion();
+        map.set(key, new VersionedValue(value, version));
+        return version;
     }
 
     @Override
     public IKVEntry read(final byte[] key) throws ObjectDoesntExistException {
-	final VersionedValue value = map.get(key);
-	if (value == null) {
-	    throw new ObjectDoesntExistException(this, key);
-	}
-	return new Entry(key, value.getValue(), value.getVersion());
+        final VersionedValue value = map.get(key);
+        if (value == null) {
+            throw new ObjectDoesntExistException(this, key);
+        }
+        return new Entry(key, value.getValue(), value.getVersion());
     }
 
     @Override
     public long update(final byte[] key, final byte[] value, final long version)
             throws ObjectDoesntExistException, WrongVersionException {
 
-	try {
-	    map.lock(key);
-	    final VersionedValue oldValue = map.get(key);
-	    if (oldValue == null) {
-		throw new ObjectDoesntExistException(this, key);
-	    }
-	    if (oldValue.getVersion() != version) {
-		throw new WrongVersionException(this, key, version, oldValue.getVersion());
-	    }
-	    final long nextVersion = getNextVersion(version);
-	    map.set(key, new VersionedValue(value, nextVersion));
-	    return nextVersion;
-	} finally {
-	    map.unlock(key);
-	}
+        try {
+            map.lock(key);
+            final VersionedValue oldValue = map.get(key);
+            if (oldValue == null) {
+                throw new ObjectDoesntExistException(this, key);
+            }
+            if (oldValue.getVersion() != version) {
+                throw new WrongVersionException(this, key, version, oldValue.getVersion());
+            }
+            final long nextVersion = getNextVersion(version);
+            map.set(key, new VersionedValue(value, nextVersion));
+            return nextVersion;
+        } finally {
+            map.unlock(key);
+        }
     }
 
     @Override
     public long update(final byte[] key, final byte[] value)
             throws ObjectDoesntExistException {
 
-	try {
-	    map.lock(key);
-	    final VersionedValue valueInMap = map.get(key);
-	    if (valueInMap == null) {
-		throw new ObjectDoesntExistException(this, key);
-	    }
-	    valueInMap.setValue(value);
-	    valueInMap.setNextVersion();
-	    map.set(key, valueInMap);
-	    return valueInMap.getVersion();
-	} finally {
-	    map.unlock(key);
-	}
+        try {
+            map.lock(key);
+            final VersionedValue valueInMap = map.get(key);
+            if (valueInMap == null) {
+                throw new ObjectDoesntExistException(this, key);
+            }
+            valueInMap.setValue(value);
+            valueInMap.setNextVersion();
+            map.set(key, valueInMap);
+            return valueInMap.getVersion();
+        } finally {
+            map.unlock(key);
+        }
     }
 
     @Override
     public long delete(final byte[] key, final long version)
             throws ObjectDoesntExistException, WrongVersionException {
 
-	try {
-	    map.lock(key);
-	    final VersionedValue oldValue = map.get(key);
-	    if (oldValue == null) {
-		throw new ObjectDoesntExistException(this, key);
-	    }
-	    if (oldValue.getVersion() != version) {
-		throw new WrongVersionException(this, key, version, oldValue.getVersion());
-	    }
-	    map.delete(key);
-	    return oldValue.getVersion();
-	} finally {
-	    map.unlock(key);
-	}
+        try {
+            map.lock(key);
+            final VersionedValue oldValue = map.get(key);
+            if (oldValue == null) {
+                throw new ObjectDoesntExistException(this, key);
+            }
+            if (oldValue.getVersion() != version) {
+                throw new WrongVersionException(this, key, version, oldValue.getVersion());
+            }
+            map.delete(key);
+            return oldValue.getVersion();
+        } finally {
+            map.unlock(key);
+        }
     }
 
     @Override
     public long forceDelete(final byte[] key) {
-	final VersionedValue valueInMap = map.remove(key);
-	if (valueInMap == null) {
-	    return HZClient.VERSION_NONEXISTENT;
-	}
-	return valueInMap.getVersion();
+        final VersionedValue valueInMap = map.remove(key);
+        if (valueInMap == null) {
+            return HZClient.VERSION_NONEXISTENT;
+        }
+        return valueInMap.getVersion();
     }
 
     @Override
     public Iterable<IKVEntry> getAllEntries() {
-	final Set<IMap.Entry<byte[], VersionedValue>> entries = map.entrySet();
-	List<IKVEntry> entryList = new ArrayList<IKVTable.IKVEntry>(entries.size());
-	for (IMap.Entry<byte[], VersionedValue> entry : entries) {
-	    entryList.add(new Entry(entry.getKey(), entry.getValue().getValue(), entry.getValue().getVersion()));
-	}
-	return entryList;
+        final Set<IMap.Entry<byte[], VersionedValue>> entries = map.entrySet();
+        List<IKVEntry> entryList = new ArrayList<IKVTable.IKVEntry>(entries.size());
+        for (IMap.Entry<byte[], VersionedValue> entry : entries) {
+            entryList.add(new Entry(entry.getKey(), entry.getValue().getValue(), entry.getValue().getVersion()));
+        }
+        return entryList;
     }
 
     @Override
     public String toString() {
-	return "[HZTable " + mapName + "]";
+        return "[HZTable " + mapName + "]";
     }
 
     IMap<byte[], VersionedValue> getBackendMap() {
-	return this.map;
+        return this.map;
     }
 
     @Override
     public long VERSION_NONEXISTENT() {
-	return HZClient.VERSION_NONEXISTENT;
+        return HZClient.VERSION_NONEXISTENT;
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/hazelcast/VersionedValueSerializableFactory.java b/src/main/java/net/onrc/onos/datastore/hazelcast/VersionedValueSerializableFactory.java
index a4e7fb9..3326890 100644
--- a/src/main/java/net/onrc/onos/datastore/hazelcast/VersionedValueSerializableFactory.java
+++ b/src/main/java/net/onrc/onos/datastore/hazelcast/VersionedValueSerializableFactory.java
@@ -1,6 +1,5 @@
 package net.onrc.onos.datastore.hazelcast;
 
-
 import com.hazelcast.nio.serialization.DataSerializableFactory;
 import com.hazelcast.nio.serialization.IdentifiedDataSerializable;
 
@@ -13,13 +12,13 @@
 
     @Override
     public IdentifiedDataSerializable create(final int typeId) {
-	switch (typeId) {
-	case VERSIONED_VALUE_ID:
-	    return new HZTable.VersionedValue();
+        switch (typeId) {
+        case VERSIONED_VALUE_ID:
+            return new HZTable.VersionedValue();
 
-	default:
-		return null;
-	}
+        default:
+            return null;
+        }
     }
 
 }
diff --git a/src/main/java/net/onrc/onos/datastore/ramcloud/RCClient.java b/src/main/java/net/onrc/onos/datastore/ramcloud/RCClient.java
index 0f18d9c..a11e82f 100644
--- a/src/main/java/net/onrc/onos/datastore/ramcloud/RCClient.java
+++ b/src/main/java/net/onrc/onos/datastore/ramcloud/RCClient.java
@@ -47,16 +47,16 @@
 
     // FIXME come up with a proper way to retrieve configuration
     public static final int MAX_MULTI_READS = Math.max(1, Integer
-	    .valueOf(System.getProperty("ramcloud.max_multi_reads", "400")));
+            .valueOf(System.getProperty("ramcloud.max_multi_reads", "400")));
 
     public static final int MAX_MULTI_WRITES = Math.max(1, Integer
-	    .valueOf(System.getProperty("ramcloud.max_multi_writes", "800")));
+            .valueOf(System.getProperty("ramcloud.max_multi_writes", "800")));
 
     private static final ThreadLocal<JRamCloud> tlsRCClient = new ThreadLocal<JRamCloud>() {
-	@Override
-	protected JRamCloud initialValue() {
-	    return new JRamCloud(getCoordinatorUrl(config));
-	}
+        @Override
+        protected JRamCloud initialValue() {
+            return new JRamCloud(getCoordinatorUrl(config));
+        }
     };
 
     /**
@@ -66,47 +66,47 @@
      *       may be accessed later by another thread.
      */
     static JRamCloud getJRamCloudClient() {
-	return tlsRCClient.get();
+        return tlsRCClient.get();
     }
 
     // Currently RCClient is state-less
     private static final RCClient theInstance= new RCClient();
 
     public static RCClient getClient() {
-	return theInstance;
+        return theInstance;
     }
 
     public static final Configuration getConfiguration() {
-	final File configFile = new File(System.getProperty("ramcloud.config.path", DB_CONFIG_FILE));
-	return getConfiguration(configFile);
+        final File configFile = new File(System.getProperty("ramcloud.config.path", DB_CONFIG_FILE));
+        return getConfiguration(configFile);
     }
 
     public static final Configuration getConfiguration(final File configFile) {
-	if (configFile == null) {
-	    throw new IllegalArgumentException("Need to specify a configuration file or storage directory");
-	}
+        if (configFile == null) {
+            throw new IllegalArgumentException("Need to specify a configuration file or storage directory");
+        }
 
-	if (!configFile.isFile()) {
-	    throw new IllegalArgumentException("Location of configuration must be a file");
-	}
+        if (!configFile.isFile()) {
+            throw new IllegalArgumentException("Location of configuration must be a file");
+        }
 
-	try {
-	    return new PropertiesConfiguration(configFile);
-	} catch (ConfigurationException e) {
-	    throw new IllegalArgumentException("Could not load configuration at: " + configFile, e);
-	}
+        try {
+            return new PropertiesConfiguration(configFile);
+        } catch (ConfigurationException e) {
+            throw new IllegalArgumentException("Could not load configuration at: " + configFile, e);
+        }
     }
 
     public static String getCoordinatorUrl(final Configuration configuration) {
-	final String coordinatorIp = configuration.getString("ramcloud.coordinatorIp", "fast+udp:host=127.0.0.1");
-	final String coordinatorPort = configuration.getString("ramcloud.coordinatorPort", "port=12246");
-	final String coordinatorURL = coordinatorIp + "," + coordinatorPort;
-	return coordinatorURL;
+        final String coordinatorIp = configuration.getString("ramcloud.coordinatorIp", "fast+udp:host=127.0.0.1");
+        final String coordinatorPort = configuration.getString("ramcloud.coordinatorPort", "port=12246");
+        final String coordinatorURL = coordinatorIp + "," + coordinatorPort;
+        return coordinatorURL;
     }
 
     @Override
     public IMultiEntryOperation createOp(IKVTableID tableId, byte[] key, byte[] value) {
-	return RCMultiEntryOperation.create(tableId, key, value);
+        return RCMultiEntryOperation.create(tableId, key, value);
     }
 
     /**
@@ -114,459 +114,459 @@
      */
     @Override
     public long create(IKVTableID tableId, byte[] key, byte[] value)
-	    throws ObjectExistsException {
+            throws ObjectExistsException {
 
-	RCTableID rcTableId = (RCTableID) tableId;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        RCTableID rcTableId = (RCTableID) tableId;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	RejectRules rules = new RejectRules();
-	rules.rejectIfExists();
+        RejectRules rules = new RejectRules();
+        rules.rejectIfExists();
 
-	try {
-	    return rcClient.write(rcTableId.getTableID(), key, value, rules);
-	} catch (JRamCloud.ObjectExistsException e) {
-	    throw new ObjectExistsException(rcTableId, key, e);
-	} catch (JRamCloud.RejectRulesException e) {
-	    log.error("Unexpected RejectRulesException", e);
-	    return JRamCloud.VERSION_NONEXISTENT;
-	}
+        try {
+            return rcClient.write(rcTableId.getTableID(), key, value, rules);
+        } catch (JRamCloud.ObjectExistsException e) {
+            throw new ObjectExistsException(rcTableId, key, e);
+        } catch (JRamCloud.RejectRulesException e) {
+            log.error("Unexpected RejectRulesException", e);
+            return JRamCloud.VERSION_NONEXISTENT;
+        }
     }
 
     @Override
     public IMultiEntryOperation forceCreateOp(IKVTableID tableId, byte[] key, byte[] value) {
-	return RCMultiEntryOperation.forceCreate(tableId, key, value);
+        return RCMultiEntryOperation.forceCreate(tableId, key, value);
     }
 
     @Override
     public long forceCreate(IKVTableID tableId, byte[] key, byte[] value) {
-	RCTableID rcTableId = (RCTableID) tableId;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        RCTableID rcTableId = (RCTableID) tableId;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	long updated_version = rcClient.write(rcTableId.getTableID(), key, value);
-	return updated_version;
+        long updated_version = rcClient.write(rcTableId.getTableID(), key, value);
+        return updated_version;
     }
 
     @Override
     public IMultiEntryOperation readOp(IKVTableID tableId, byte[] key) {
-	return RCMultiEntryOperation.read(tableId, key);
+        return RCMultiEntryOperation.read(tableId, key);
     }
 
     @Override
     public IKVEntry read(IKVTableID tableId, byte[] key)
-	    throws ObjectDoesntExistException {
+            throws ObjectDoesntExistException {
 
-	RCTableID rcTableId = (RCTableID) tableId;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        RCTableID rcTableId = (RCTableID) tableId;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	RejectRules rules = new RejectRules();
-	rules.rejectIfDoesntExists();
-	try {
-	    JRamCloud.Object rcObj = rcClient.read(rcTableId.getTableID(), key, rules);
-	    return new Entry(rcObj.key, rcObj.value, rcObj.version);
-	} catch (JRamCloud.ObjectDoesntExistException e) {
-	    throw new ObjectDoesntExistException(rcTableId, key, e);
-	} catch (JRamCloud.RejectRulesException e) {
-	    log.error("Unexpected RejectRulesException", e);
-	    return null;
-	}
+        RejectRules rules = new RejectRules();
+        rules.rejectIfDoesntExists();
+        try {
+            JRamCloud.Object rcObj = rcClient.read(rcTableId.getTableID(), key, rules);
+            return new Entry(rcObj.key, rcObj.value, rcObj.version);
+        } catch (JRamCloud.ObjectDoesntExistException e) {
+            throw new ObjectDoesntExistException(rcTableId, key, e);
+        } catch (JRamCloud.RejectRulesException e) {
+            log.error("Unexpected RejectRulesException", e);
+            return null;
+        }
     }
 
     @Override
     public IMultiEntryOperation updateOp(IKVTableID tableId, byte[] key, byte[] value,long version) {
-	return RCMultiEntryOperation.update(tableId, key, value, version);
+        return RCMultiEntryOperation.update(tableId, key, value, version);
     }
 
     @Override
     public long update(IKVTableID tableId, byte[] key, byte[] value,
-	    long version) throws ObjectDoesntExistException,
-	    WrongVersionException {
+            long version) throws ObjectDoesntExistException,
+            WrongVersionException {
 
-	RCTableID rcTableId = (RCTableID) tableId;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        RCTableID rcTableId = (RCTableID) tableId;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	RejectRules rules = new RejectRules();
-	rules.rejectIfDoesntExists();
-	rules.rejectIfNeVersion(version);
+        RejectRules rules = new RejectRules();
+        rules.rejectIfDoesntExists();
+        rules.rejectIfNeVersion(version);
 
-	try {
-	    return rcClient.write(rcTableId.getTableID(), key, value, rules);
-	} catch (JRamCloud.ObjectDoesntExistException e) {
-	    throw new ObjectDoesntExistException(rcTableId, key, e);
-	} catch (JRamCloud.WrongVersionException e) {
-	    throw new WrongVersionException(rcTableId, key, version, e);
-	} catch (JRamCloud.RejectRulesException e) {
-	    log.error("Unexpected RejectRulesException", e);
-	    return JRamCloud.VERSION_NONEXISTENT;
-	}
+        try {
+            return rcClient.write(rcTableId.getTableID(), key, value, rules);
+        } catch (JRamCloud.ObjectDoesntExistException e) {
+            throw new ObjectDoesntExistException(rcTableId, key, e);
+        } catch (JRamCloud.WrongVersionException e) {
+            throw new WrongVersionException(rcTableId, key, version, e);
+        } catch (JRamCloud.RejectRulesException e) {
+            log.error("Unexpected RejectRulesException", e);
+            return JRamCloud.VERSION_NONEXISTENT;
+        }
     }
 
 
     @Override
     public long update(IKVTableID tableId, byte[] key, byte[] value)
-	    throws ObjectDoesntExistException {
+            throws ObjectDoesntExistException {
 
-	RCTableID rcTableId = (RCTableID) tableId;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        RCTableID rcTableId = (RCTableID) tableId;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	RejectRules rules = new RejectRules();
-	rules.rejectIfDoesntExists();
+        RejectRules rules = new RejectRules();
+        rules.rejectIfDoesntExists();
 
-	try {
-	    return rcClient.write(rcTableId.getTableID(), key, value, rules);
-	} catch (JRamCloud.ObjectDoesntExistException e) {
-	    throw new ObjectDoesntExistException(rcTableId, key, e);
-	} catch (JRamCloud.RejectRulesException e) {
-	    log.error("Unexpected RejectRulesException", e);
-	    return JRamCloud.VERSION_NONEXISTENT;
-	}
+        try {
+            return rcClient.write(rcTableId.getTableID(), key, value, rules);
+        } catch (JRamCloud.ObjectDoesntExistException e) {
+            throw new ObjectDoesntExistException(rcTableId, key, e);
+        } catch (JRamCloud.RejectRulesException e) {
+            log.error("Unexpected RejectRulesException", e);
+            return JRamCloud.VERSION_NONEXISTENT;
+        }
     }
 
     @Override
     public IMultiEntryOperation deleteOp(IKVTableID tableId, byte[] key, byte[] value,long version) {
-	return RCMultiEntryOperation.delete(tableId, key, value, version);
+        return RCMultiEntryOperation.delete(tableId, key, value, version);
     }
 
     @Override
     public long delete(IKVTableID tableId, byte[] key, long version)
-	    throws ObjectDoesntExistException, WrongVersionException {
+            throws ObjectDoesntExistException, WrongVersionException {
 
-	RCTableID rcTableId = (RCTableID) tableId;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        RCTableID rcTableId = (RCTableID) tableId;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	RejectRules rules = new RejectRules();
-	rules.rejectIfDoesntExists();
-	rules.rejectIfNeVersion(version);
+        RejectRules rules = new RejectRules();
+        rules.rejectIfDoesntExists();
+        rules.rejectIfNeVersion(version);
 
-	try {
-	    return rcClient.remove(rcTableId.getTableID(), key, rules);
-	} catch (JRamCloud.ObjectDoesntExistException e) {
-	    throw new ObjectDoesntExistException(rcTableId, key, e);
-	} catch (JRamCloud.WrongVersionException e) {
-	    throw new WrongVersionException(rcTableId, key, version, e);
-	} catch (JRamCloud.RejectRulesException e) {
-	    log.error("Unexpected RejectRulesException", e);
-	    return JRamCloud.VERSION_NONEXISTENT;
-	}
+        try {
+            return rcClient.remove(rcTableId.getTableID(), key, rules);
+        } catch (JRamCloud.ObjectDoesntExistException e) {
+            throw new ObjectDoesntExistException(rcTableId, key, e);
+        } catch (JRamCloud.WrongVersionException e) {
+            throw new WrongVersionException(rcTableId, key, version, e);
+        } catch (JRamCloud.RejectRulesException e) {
+            log.error("Unexpected RejectRulesException", e);
+            return JRamCloud.VERSION_NONEXISTENT;
+        }
     }
 
     @Override
     public IMultiEntryOperation forceDeleteOp(IKVTableID tableId, byte[] key) {
-	return RCMultiEntryOperation.forceDelete(tableId, key);
+        return RCMultiEntryOperation.forceDelete(tableId, key);
     }
 
     @Override
     public long forceDelete(IKVTableID tableId, byte[] key) {
-	RCTableID rcTableId = (RCTableID) tableId;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
-	long removed_version = rcClient.remove(rcTableId.getTableID(), key);
-	return removed_version;
+        RCTableID rcTableId = (RCTableID) tableId;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
+        long removed_version = rcClient.remove(rcTableId.getTableID(), key);
+        return removed_version;
     }
 
     @Override
     public Iterable<IKVEntry> getAllEntries(IKVTableID tableId) {
-	return new RCTableEntryIterable((RCTableID) tableId);
+        return new RCTableEntryIterable((RCTableID) tableId);
     }
 
     static class RCTableEntryIterable implements Iterable<IKVEntry> {
-	private final RCTableID tableId;
+        private final RCTableID tableId;
 
-	public RCTableEntryIterable(final RCTableID tableId) {
-	    this.tableId = tableId;
-	}
+        public RCTableEntryIterable(final RCTableID tableId) {
+            this.tableId = tableId;
+        }
 
-	@Override
-	public Iterator<IKVEntry> iterator() {
-	    return new RCClient.RCTableIterator(tableId);
-	}
+        @Override
+        public Iterator<IKVEntry> iterator() {
+            return new RCClient.RCTableIterator(tableId);
+        }
     }
 
     public static class RCTableIterator implements Iterator<IKVEntry> {
-	private final RCTableID tableId;
-	protected final TableEnumerator2 enumerator;
-	private JRamCloud.Object last;
+        private final RCTableID tableId;
+        protected final TableEnumerator2 enumerator;
+        private JRamCloud.Object last;
 
-	public RCTableIterator(final RCTableID tableId) {
-	    this.tableId = tableId;
-	    this.enumerator = getJRamCloudClient().new TableEnumerator2(tableId.getTableID());
-	    this.last = null;
-	}
+        public RCTableIterator(final RCTableID tableId) {
+            this.tableId = tableId;
+            this.enumerator = getJRamCloudClient().new TableEnumerator2(tableId.getTableID());
+            this.last = null;
+        }
 
-	@Override
-	public boolean hasNext() {
-	    return this.enumerator.hasNext();
-	}
+        @Override
+        public boolean hasNext() {
+            return this.enumerator.hasNext();
+        }
 
-	@Override
-	public RCTable.Entry next() {
-	    last = enumerator.next();
-	    return new RCTable.Entry(last.key, last.value, last.version);
-	}
+        @Override
+        public RCTable.Entry next() {
+            last = enumerator.next();
+            return new RCTable.Entry(last.key, last.value, last.version);
+        }
 
-	@Override
-	public void remove() {
-	    if (last != null) {
-		getJRamCloudClient();
-		JRamCloud rcClient = RCClient.getJRamCloudClient();
+        @Override
+        public void remove() {
+            if (last != null) {
+                getJRamCloudClient();
+                JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-		RejectRules rules = new RejectRules();
-		rules.rejectIfNeVersion(last.version);
-		try {
-		    rcClient.remove(tableId.getTableID(), last.key, rules);
-		} catch (RejectRulesException e) {
-		    log.trace("remove failed", e);
-		}
-		last = null;
-	    }
-	}
+                RejectRules rules = new RejectRules();
+                rules.rejectIfNeVersion(last.version);
+                try {
+                    rcClient.remove(tableId.getTableID(), last.key, rules);
+                } catch (RejectRulesException e) {
+                    log.trace("remove failed", e);
+                }
+                last = null;
+            }
+        }
     }
 
     @Override
     public boolean multiRead(final Collection<IMultiEntryOperation> ops) {
 
-	if ( ops.size() <= MAX_MULTI_READS && ops instanceof ArrayList) {
-	    @SuppressWarnings({ "unchecked", "rawtypes" })
-	    final ArrayList<RCMultiEntryOperation> arrays = (ArrayList)ops;
-	    return multiReadInternal(arrays);
-	}
+        if ( ops.size() <= MAX_MULTI_READS && ops instanceof ArrayList) {
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            final ArrayList<RCMultiEntryOperation> arrays = (ArrayList)ops;
+            return multiReadInternal(arrays);
+        }
 
-	boolean fail_exists = false;
+        boolean fail_exists = false;
 
-	ArrayList<RCMultiEntryOperation> req = new ArrayList<>();
-	Iterator<IMultiEntryOperation> it = ops.iterator();
-	while (it.hasNext()) {
+        ArrayList<RCMultiEntryOperation> req = new ArrayList<>();
+        Iterator<IMultiEntryOperation> it = ops.iterator();
+        while (it.hasNext()) {
 
-	    req.add((RCMultiEntryOperation) it.next());
+            req.add((RCMultiEntryOperation) it.next());
 
-	    if (req.size() >= MAX_MULTI_READS) {
-		// dispatch multiRead
-		fail_exists |= multiReadInternal(req);
-		req.clear();
-	    }
-	}
+            if (req.size() >= MAX_MULTI_READS) {
+                // dispatch multiRead
+                fail_exists |= multiReadInternal(req);
+                req.clear();
+            }
+        }
 
-	if (!req.isEmpty()) {
-	    // dispatch multiRead
-	    fail_exists |= multiReadInternal(req);
-	    req.clear();
-	}
+        if (!req.isEmpty()) {
+            // dispatch multiRead
+            fail_exists |= multiReadInternal(req);
+            req.clear();
+        }
 
-	return fail_exists;
+        return fail_exists;
     }
 
     @Override
     public boolean multiWrite(final List<IMultiEntryOperation> ops) {
 
-	if ( ops.size() <= MAX_MULTI_WRITES && ops instanceof ArrayList) {
-	    @SuppressWarnings({ "unchecked", "rawtypes" })
-	    final ArrayList<RCMultiEntryOperation> arrays = (ArrayList)ops;
-	    return multiWriteInternal(arrays);
-	}
+        if ( ops.size() <= MAX_MULTI_WRITES && ops instanceof ArrayList) {
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            final ArrayList<RCMultiEntryOperation> arrays = (ArrayList)ops;
+            return multiWriteInternal(arrays);
+        }
 
-	boolean fail_exists = false;
+        boolean fail_exists = false;
 
-	ArrayList<RCMultiEntryOperation> req = new ArrayList<>();
-	Iterator<IMultiEntryOperation> it = ops.iterator();
-	while (it.hasNext()) {
+        ArrayList<RCMultiEntryOperation> req = new ArrayList<>();
+        Iterator<IMultiEntryOperation> it = ops.iterator();
+        while (it.hasNext()) {
 
-	    req.add((RCMultiEntryOperation) it.next());
+            req.add((RCMultiEntryOperation) it.next());
 
-	    if (req.size() >= MAX_MULTI_WRITES) {
-		// dispatch multiWrite
-		fail_exists |= multiWriteInternal(req);
-		req.clear();
-	    }
-	}
+            if (req.size() >= MAX_MULTI_WRITES) {
+                // dispatch multiWrite
+                fail_exists |= multiWriteInternal(req);
+                req.clear();
+            }
+        }
 
-	if (!req.isEmpty()) {
-	    // dispatch multiWrite
-	    fail_exists |= multiWriteInternal(req);
-	    req.clear();
-	}
+        if (!req.isEmpty()) {
+            // dispatch multiWrite
+            fail_exists |= multiWriteInternal(req);
+            req.clear();
+        }
 
-	return fail_exists;
+        return fail_exists;
     }
 
     @Override
     public boolean multiDelete(final Collection<IMultiEntryOperation> ops) {
 
-	// TODO implement multiRemove JNI, etc. if we need performance
+        // TODO implement multiRemove JNI, etc. if we need performance
 
-	boolean fail_exists = false;
-	JRamCloud rcClient = getJRamCloudClient();
+        boolean fail_exists = false;
+        JRamCloud rcClient = getJRamCloudClient();
 
-	for (IMultiEntryOperation iop : ops) {
-	    RCMultiEntryOperation op = (RCMultiEntryOperation)iop;
-	    switch (op.getOperation()) {
-	    case DELETE:
-		RejectRules rules = new RejectRules();
-		rules.rejectIfDoesntExists();
-		rules.rejectIfNeVersion(op.getVersion());
+        for (IMultiEntryOperation iop : ops) {
+            RCMultiEntryOperation op = (RCMultiEntryOperation)iop;
+            switch (op.getOperation()) {
+            case DELETE:
+                RejectRules rules = new RejectRules();
+                rules.rejectIfDoesntExists();
+                rules.rejectIfNeVersion(op.getVersion());
 
-		try {
-		    long removed_version = rcClient.remove(op.tableId.getTableID(), op.entry.getKey(), rules);
-		    op.entry.setVersion(removed_version);
-		    op.status = STATUS.SUCCESS;
-		} catch (JRamCloud.ObjectDoesntExistException|JRamCloud.WrongVersionException e) {
-		    log.error("Failed to remove key:" + ByteArrayUtil.toHexStringBuffer(op.entry.getKey(), "") + " from tableID:" + op.tableId, e );
-		    fail_exists = true;
-		    op.status = STATUS.FAILED;
-		} catch (JRamCloud.RejectRulesException e) {
-		    log.error("Failed to remove key:" + ByteArrayUtil.toHexStringBuffer(op.entry.getKey(), "") + " from tableID:" + op.tableId, e );
-		    fail_exists = true;
-		    op.status = STATUS.FAILED;
-		}
-		break;
+                try {
+                    long removed_version = rcClient.remove(op.tableId.getTableID(), op.entry.getKey(), rules);
+                    op.entry.setVersion(removed_version);
+                    op.status = STATUS.SUCCESS;
+                } catch (JRamCloud.ObjectDoesntExistException|JRamCloud.WrongVersionException e) {
+                    log.error("Failed to remove key:" + ByteArrayUtil.toHexStringBuffer(op.entry.getKey(), "") + " from tableID:" + op.tableId, e );
+                    fail_exists = true;
+                    op.status = STATUS.FAILED;
+                } catch (JRamCloud.RejectRulesException e) {
+                    log.error("Failed to remove key:" + ByteArrayUtil.toHexStringBuffer(op.entry.getKey(), "") + " from tableID:" + op.tableId, e );
+                    fail_exists = true;
+                    op.status = STATUS.FAILED;
+                }
+                break;
 
-	    case FORCE_DELETE:
-		long removed_version = rcClient.remove(op.tableId.getTableID(), op.entry.getKey());
-		if (removed_version != JRamCloud.VERSION_NONEXISTENT) {
-		    op.entry.setVersion(removed_version);
-		    op.status = STATUS.SUCCESS;
-		} else {
-		    log.error("Failed to remove key:{} from tableID:{}", ByteArrayUtil.toHexStringBuffer(op.entry.getKey(), ""), op.tableId );
-		    fail_exists = true;
-		    op.status = STATUS.FAILED;
-		}
-		break;
+            case FORCE_DELETE:
+                long removed_version = rcClient.remove(op.tableId.getTableID(), op.entry.getKey());
+                if (removed_version != JRamCloud.VERSION_NONEXISTENT) {
+                    op.entry.setVersion(removed_version);
+                    op.status = STATUS.SUCCESS;
+                } else {
+                    log.error("Failed to remove key:{} from tableID:{}", ByteArrayUtil.toHexStringBuffer(op.entry.getKey(), ""), op.tableId );
+                    fail_exists = true;
+                    op.status = STATUS.FAILED;
+                }
+                break;
 
-	    default:
-		log.error("Invalid operation {} specified on multiDelete", op.getOperation() );
-		fail_exists = true;
-		op.status = STATUS.FAILED;
-		break;
-	    }
-	}
-	return fail_exists;
+            default:
+                log.error("Invalid operation {} specified on multiDelete", op.getOperation() );
+                fail_exists = true;
+                op.status = STATUS.FAILED;
+                break;
+            }
+        }
+        return fail_exists;
     }
 
     private boolean multiReadInternal(final ArrayList<RCMultiEntryOperation> ops) {
-	boolean fail_exists = false;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        boolean fail_exists = false;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	final int reqs = ops.size();
+        final int reqs = ops.size();
 
-	MultiReadObject multiReadObjects = new MultiReadObject(reqs);
+        MultiReadObject multiReadObjects = new MultiReadObject(reqs);
 
-	// setup multi-read operation objects
-	for (int i = 0; i < reqs; ++i) {
-	    IMultiEntryOperation op = ops.get(i);
-	    multiReadObjects.setObject(i, ((RCTableID)op.getTableId()).getTableID(), op.getKey());
-	}
+        // setup multi-read operation objects
+        for (int i = 0; i < reqs; ++i) {
+            IMultiEntryOperation op = ops.get(i);
+            multiReadObjects.setObject(i, ((RCTableID)op.getTableId()).getTableID(), op.getKey());
+        }
 
-	// execute
-	JRamCloud.Object[] results = rcClient.multiRead(multiReadObjects.tableId, multiReadObjects.key, multiReadObjects.keyLength, reqs);
-	if (results.length != reqs) {
-	    log.error("multiRead returned unexpected number of results. (requested:{}, returned:{})", reqs, results.length);
-	    fail_exists = true;
-	}
+        // execute
+        JRamCloud.Object[] results = rcClient.multiRead(multiReadObjects.tableId, multiReadObjects.key, multiReadObjects.keyLength, reqs);
+        if (results.length != reqs) {
+            log.error("multiRead returned unexpected number of results. (requested:{}, returned:{})", reqs, results.length);
+            fail_exists = true;
+        }
 
-	for (int i = 0; i < results.length; ++i) {
-	    IModifiableMultiEntryOperation op = ops.get(i);
-	    if (results[i] == null) {
-		log.error("MultiRead error, skipping {}, {}", op.getTableId(), op);
-		fail_exists = true;
-		op.setStatus(STATUS.FAILED);
-		continue;
-	    }
-	    assert (Arrays.equals(results[i].key, op.getKey()));
+        for (int i = 0; i < results.length; ++i) {
+            IModifiableMultiEntryOperation op = ops.get(i);
+            if (results[i] == null) {
+                log.error("MultiRead error, skipping {}, {}", op.getTableId(), op);
+                fail_exists = true;
+                op.setStatus(STATUS.FAILED);
+                continue;
+            }
+            assert (Arrays.equals(results[i].key, op.getKey()));
 
-	    op.setValue(results[i].value, results[i].version);
-	    if (results[i].version == JRamCloud.VERSION_NONEXISTENT) {
-		fail_exists = true;
-		op.setStatus(STATUS.FAILED);
-	    } else {
-		op.setStatus(STATUS.SUCCESS);
-	    }
-	}
+            op.setValue(results[i].value, results[i].version);
+            if (results[i].version == JRamCloud.VERSION_NONEXISTENT) {
+                fail_exists = true;
+                op.setStatus(STATUS.FAILED);
+            } else {
+                op.setStatus(STATUS.SUCCESS);
+            }
+        }
 
-	return fail_exists;
+        return fail_exists;
     }
 
     private boolean multiWriteInternal(final ArrayList<RCMultiEntryOperation> ops) {
-	boolean fail_exists = false;
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
+        boolean fail_exists = false;
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
 
-	final int reqs = ops.size();
+        final int reqs = ops.size();
 
-	MultiWriteObject multiWriteObjects = new MultiWriteObject(reqs);
+        MultiWriteObject multiWriteObjects = new MultiWriteObject(reqs);
 
-	for (int i = 0; i < reqs; ++i) {
+        for (int i = 0; i < reqs; ++i) {
 
-	    IModifiableMultiEntryOperation op = ops.get(i);
-	    RejectRules rules = new RejectRules();
+            IModifiableMultiEntryOperation op = ops.get(i);
+            RejectRules rules = new RejectRules();
 
-	    switch (op.getOperation()) {
-	    case CREATE:
-		rules.rejectIfExists();
-		break;
-	    case FORCE_CREATE:
-		// no reject rule
-		break;
-	    case UPDATE:
-		rules.rejectIfDoesntExists();
-		rules.rejectIfNeVersion(op.getVersion());
-		break;
+            switch (op.getOperation()) {
+            case CREATE:
+                rules.rejectIfExists();
+                break;
+            case FORCE_CREATE:
+                // no reject rule
+                break;
+            case UPDATE:
+                rules.rejectIfDoesntExists();
+                rules.rejectIfNeVersion(op.getVersion());
+                break;
 
-	    default:
-		log.error("Invalid operation {} specified on multiWriteInternal", op.getOperation() );
-		fail_exists = true;
-		op.setStatus(STATUS.FAILED);
-		return fail_exists;
-	    }
-	    multiWriteObjects.setObject(i, ((RCTableID)op.getTableId()).getTableID(), op.getKey(), op.getValue(), rules);
-	}
+            default:
+                log.error("Invalid operation {} specified on multiWriteInternal", op.getOperation() );
+                fail_exists = true;
+                op.setStatus(STATUS.FAILED);
+                return fail_exists;
+            }
+            multiWriteObjects.setObject(i, ((RCTableID)op.getTableId()).getTableID(), op.getKey(), op.getValue(), rules);
+        }
 
-	MultiWriteRspObject[] results = rcClient.multiWrite(multiWriteObjects.tableId, multiWriteObjects.key, multiWriteObjects.keyLength, multiWriteObjects.value, multiWriteObjects.valueLength, ops.size(), multiWriteObjects.rules);
-	if (results.length != reqs) {
-	    log.error("multiWrite returned unexpected number of results. (requested:{}, returned:{})", reqs, results.length);
-	    fail_exists = true;
-	}
+        MultiWriteRspObject[] results = rcClient.multiWrite(multiWriteObjects.tableId, multiWriteObjects.key, multiWriteObjects.keyLength, multiWriteObjects.value, multiWriteObjects.valueLength, ops.size(), multiWriteObjects.rules);
+        if (results.length != reqs) {
+            log.error("multiWrite returned unexpected number of results. (requested:{}, returned:{})", reqs, results.length);
+            fail_exists = true;
+        }
 
-	for (int i = 0; i < results.length; ++i) {
-	    IModifiableMultiEntryOperation op = ops.get(i);
+        for (int i = 0; i < results.length; ++i) {
+            IModifiableMultiEntryOperation op = ops.get(i);
 
-	    if (results[i] != null
-		    && results[i].getStatus() == RCClient.STATUS_OK) {
-		op.setStatus(STATUS.SUCCESS);
-		op.setVersion(results[i].getVersion());
-	    } else {
-		op.setStatus(STATUS.FAILED);
-		fail_exists = true;
-	    }
-	}
+            if (results[i] != null
+                    && results[i].getStatus() == RCClient.STATUS_OK) {
+                op.setStatus(STATUS.SUCCESS);
+                op.setVersion(results[i].getVersion());
+            } else {
+                op.setStatus(STATUS.FAILED);
+                fail_exists = true;
+            }
+        }
 
-	return fail_exists;
+        return fail_exists;
     }
 
     private static final ConcurrentHashMap<String, RCTable> tables = new ConcurrentHashMap<>();
 
     @Override
     public IKVTable getTable(final String tableName) {
-	RCTable table = tables.get(tableName);
-	if (table == null) {
-	    RCTable new_table = new RCTable(tableName);
-	    RCTable existing_table = tables
-		    .putIfAbsent(tableName, new_table);
-	    if (existing_table != null) {
-		return existing_table;
-	    } else {
-		return new_table;
-	    }
-	}
-	return table;
+        RCTable table = tables.get(tableName);
+        if (table == null) {
+            RCTable new_table = new RCTable(tableName);
+            RCTable existing_table = tables
+                    .putIfAbsent(tableName, new_table);
+            if (existing_table != null) {
+                return existing_table;
+            } else {
+                return new_table;
+            }
+        }
+        return table;
     }
 
     @Override
     public void dropTable(IKVTable table) {
-	JRamCloud rcClient = RCClient.getJRamCloudClient();
-	rcClient.dropTable(table.getTableId().getTableName());
-	tables.remove(table.getTableId().getTableName());
+        JRamCloud rcClient = RCClient.getJRamCloudClient();
+        rcClient.dropTable(table.getTableId().getTableName());
+        tables.remove(table.getTableId().getTableName());
     }
 
     static final long VERSION_NONEXISTENT = JRamCloud.VERSION_NONEXISTENT;
 
     @Override
     public long VERSION_NONEXISTENT() {
-	return VERSION_NONEXISTENT;
+        return VERSION_NONEXISTENT;
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/ramcloud/RCMultiEntryOperation.java b/src/main/java/net/onrc/onos/datastore/ramcloud/RCMultiEntryOperation.java
index 0feec0a..28c5a0b 100644
--- a/src/main/java/net/onrc/onos/datastore/ramcloud/RCMultiEntryOperation.java
+++ b/src/main/java/net/onrc/onos/datastore/ramcloud/RCMultiEntryOperation.java
@@ -14,70 +14,70 @@
 
     @Override
     public boolean hasSucceeded() {
-	return this.status == STATUS.SUCCESS;
+        return this.status == STATUS.SUCCESS;
     }
 
     @Override
     public STATUS getStatus() {
-	return status;
+        return status;
     }
 
     @Override
     public IKVTableID getTableId() {
-	return tableId;
+        return tableId;
     }
 
     @Override
     public byte[] getKey() {
-	return entry.key;
+        return entry.key;
     }
 
     @Override
     public byte[] getValue() {
-	return entry.value;
+        return entry.value;
     }
 
     @Override
     public long getVersion() {
-	return entry.version;
+        return entry.version;
     }
 
     @Override
     public OPERATION getOperation() {
-	return operation;
+        return operation;
     }
 
     @Override
     public void setStatus(final STATUS status) {
-	this.status = status;
+        this.status = status;
     }
 
     @Override
     public void setValue(byte[] value, final long version) {
-	this.entry.setValue(value);
-	setVersion(version);
+        this.entry.setValue(value);
+        setVersion(version);
     }
 
     @Override
     public void setVersion(final long version) {
-	this.entry.setVersion(version);
+        this.entry.setVersion(version);
     }
 
 
     public RCMultiEntryOperation(final IKVTableID tableId, final Entry entry, final OPERATION operation) {
-	this.tableId = (RCTableID) tableId;
-	this.operation = operation;
+        this.tableId = (RCTableID) tableId;
+        this.operation = operation;
 
-	this.entry = entry;
-	this.status = STATUS.NOT_EXECUTED;
+        this.entry = entry;
+        this.status = STATUS.NOT_EXECUTED;
     }
 
     public static IMultiEntryOperation create(final IKVTableID tableId, final byte[] key, final byte[] value) {
-	return  new RCMultiEntryOperation(tableId, new Entry(key,value, RCClient.VERSION_NONEXISTENT), OPERATION.CREATE);
+        return  new RCMultiEntryOperation(tableId, new Entry(key,value, RCClient.VERSION_NONEXISTENT), OPERATION.CREATE);
     }
 
     public static IMultiEntryOperation forceCreate(final IKVTableID tableId, final byte[] key, final byte[] value) {
-	return  new RCMultiEntryOperation(tableId, new Entry(key,value, RCClient.VERSION_NONEXISTENT), OPERATION.FORCE_CREATE);
+        return  new RCMultiEntryOperation(tableId, new Entry(key,value, RCClient.VERSION_NONEXISTENT), OPERATION.FORCE_CREATE);
     }
 
     /**
@@ -87,29 +87,29 @@
      * @param key key of an Entry to read
      */
     public static IMultiEntryOperation read(final IKVTableID tableId, final byte[] key) {
-	return new RCMultiEntryOperation(tableId, new Entry(key), OPERATION.READ);
+        return new RCMultiEntryOperation(tableId, new Entry(key), OPERATION.READ);
     }
 
     public static IMultiEntryOperation update(final IKVTableID tableId, final byte[] key, final byte[] value, final long version) {
-	return  new RCMultiEntryOperation(tableId, new Entry(key,value, version), OPERATION.UPDATE);
+        return  new RCMultiEntryOperation(tableId, new Entry(key,value, version), OPERATION.UPDATE);
     }
 
     public static IMultiEntryOperation delete(final IKVTableID tableId, final byte[] key, final byte[] value, final long version) {
-	return  new RCMultiEntryOperation(tableId, new Entry(key,value, version), OPERATION.DELETE);
+        return  new RCMultiEntryOperation(tableId, new Entry(key,value, version), OPERATION.DELETE);
     }
 
     public static IMultiEntryOperation forceDelete(final IKVTableID tableId, final byte[] key) {
-	return  new RCMultiEntryOperation(tableId, new Entry(key), OPERATION.FORCE_DELETE);
+        return  new RCMultiEntryOperation(tableId, new Entry(key), OPERATION.FORCE_DELETE);
     }
 
     @Override
     public IModifiableMultiEntryOperation getActualOperation() {
-	return this;
+        return this;
     }
 
     @Override
     public String toString() {
-	return "[RCMultiEntryOperation tableId=" + tableId + ", entry=" + entry
-	        + ", operation=" + operation + ", status=" + status + "]";
+        return "[RCMultiEntryOperation tableId=" + tableId + ", entry=" + entry
+                + ", operation=" + operation + ", status=" + status + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/ramcloud/RCTable.java b/src/main/java/net/onrc/onos/datastore/ramcloud/RCTable.java
index f823eae..741df0a 100644
--- a/src/main/java/net/onrc/onos/datastore/ramcloud/RCTable.java
+++ b/src/main/java/net/onrc/onos/datastore/ramcloud/RCTable.java
@@ -17,42 +17,42 @@
     private static final Logger log = LoggerFactory.getLogger(RCTable.class);
 
     public static class Entry implements IKVEntry {
-	final byte[] key;
-	byte[] value;
-	long version;
+        final byte[] key;
+        byte[] value;
+        long version;
 
-	public Entry(final byte[] key, final byte[] value, final long version) {
-	    this.key = key;
-	    this.setValue(value);
-	    this.setVersion(version);
-	}
+        public Entry(final byte[] key, final byte[] value, final long version) {
+            this.key = key;
+            this.setValue(value);
+            this.setVersion(version);
+        }
 
-	public Entry(final byte[] key) {
-	    this(key, null, RCClient.VERSION_NONEXISTENT);
-	}
+        public Entry(final byte[] key) {
+            this(key, null, RCClient.VERSION_NONEXISTENT);
+        }
 
-	@Override
-	public byte[] getKey() {
-	    return key;
-	}
+        @Override
+        public byte[] getKey() {
+            return key;
+        }
 
-	@Override
-	public byte[] getValue() {
-	    return value;
-	}
+        @Override
+        public byte[] getValue() {
+            return value;
+        }
 
-	@Override
-	public long getVersion() {
-	    return version;
-	}
+        @Override
+        public long getVersion() {
+            return version;
+        }
 
-	void setValue(byte[] value) {
-	    this.value = value;
-	}
+        void setValue(byte[] value) {
+            this.value = value;
+        }
 
-	void setVersion(long version) {
-	    this.version = version;
-	}
+        void setVersion(long version) {
+            this.version = version;
+        }
     }
 
     private final RCTableID rcTableId;
@@ -63,72 +63,72 @@
      * @param rcTableName RAMCloud table name
      */
     RCTable(final String rcTableName) {
-	this.rcTableId = new RCTableID(rcTableName);
+        this.rcTableId = new RCTableID(rcTableName);
 
-	// Trigger RAMCloud ID allocation. If lazy allocation is OK, remove.
-	this.rcTableId.getTableID();
+        // Trigger RAMCloud ID allocation. If lazy allocation is OK, remove.
+        this.rcTableId.getTableID();
     }
 
     @Override
     public IKVTableID getTableId() {
-	return this.rcTableId;
+        return this.rcTableId;
     }
 
     public String getTableName() {
-	return this.rcTableId.getTableName();
+        return this.rcTableId.getTableName();
     }
 
     @Override
     public long create(final byte[] key, final byte[] value)
-	    throws ObjectExistsException {
+            throws ObjectExistsException {
 
-	return RCClient.getClient().create(this.rcTableId, key, value);
+        return RCClient.getClient().create(this.rcTableId, key, value);
     }
 
     @Override
     public long forceCreate(final byte[] key, final byte[] value) {
-	return RCClient.getClient().forceCreate(rcTableId, key, value);
+        return RCClient.getClient().forceCreate(rcTableId, key, value);
     }
 
     @Override
     public IKVEntry read(final byte[] key) throws ObjectDoesntExistException {
-	return RCClient.getClient().read(rcTableId, key);
+        return RCClient.getClient().read(rcTableId, key);
     }
 
     @Override
     public long update(final byte[] key, final byte[] value, final long version)
-	    throws ObjectDoesntExistException, WrongVersionException {
+            throws ObjectDoesntExistException, WrongVersionException {
 
-	return RCClient.getClient().update(rcTableId, key, value, version);
+        return RCClient.getClient().update(rcTableId, key, value, version);
     }
 
     @Override
     public long update(final byte[] key, final byte[] value)
-	    throws ObjectDoesntExistException {
+            throws ObjectDoesntExistException {
 
-	return RCClient.getClient().update(rcTableId, key, value);
+        return RCClient.getClient().update(rcTableId, key, value);
     }
 
     @Override
     public long delete(final byte[] key, final long version)
-	    throws ObjectDoesntExistException, WrongVersionException {
+            throws ObjectDoesntExistException, WrongVersionException {
 
-	return RCClient.getClient().delete(rcTableId, key, version);
+        return RCClient.getClient().delete(rcTableId, key, version);
     }
 
     @Override
     public long forceDelete(final byte[] key) {
-	return RCClient.getClient().forceDelete(rcTableId, key);
+        return RCClient.getClient().forceDelete(rcTableId, key);
     }
 
     @Override
     public Iterable<IKVEntry> getAllEntries() {
-	return RCClient.getClient().getAllEntries(this.getTableId());
+        return RCClient.getClient().getAllEntries(this.getTableId());
     }
 
     @Override
     public long VERSION_NONEXISTENT() {
-	return RCClient.VERSION_NONEXISTENT;
+        return RCClient.VERSION_NONEXISTENT;
     }
 
 }
diff --git a/src/main/java/net/onrc/onos/datastore/ramcloud/RCTableID.java b/src/main/java/net/onrc/onos/datastore/ramcloud/RCTableID.java
index 5fa56c2..0c2f6b0 100644
--- a/src/main/java/net/onrc/onos/datastore/ramcloud/RCTableID.java
+++ b/src/main/java/net/onrc/onos/datastore/ramcloud/RCTableID.java
@@ -9,49 +9,49 @@
     private long tableID;
 
     public RCTableID(String tableName) {
-	this.tableName = tableName;
-	this.tableID = 0;
+        this.tableName = tableName;
+        this.tableID = 0;
     }
 
     @Override
     public String getTableName() {
-	return tableName;
+        return tableName;
     }
 
     // following is RAMCloud specific
 
     public long getTableID() {
-	if ( tableID != 0) {
-	    return tableID;
-	}
-	tableID = RCClient.getJRamCloudClient().createTable(tableName);
-	return tableID;
+        if ( tableID != 0) {
+            return tableID;
+        }
+        tableID = RCClient.getJRamCloudClient().createTable(tableName);
+        return tableID;
     }
 
     void resetTableID() {
-	this.tableID = 0;
+        this.tableID = 0;
     }
 
     @Override
     public String toString() {
-	return "["+tableName + "]@" + getTableID();
+        return "["+tableName + "]@" + getTableID();
     }
 
     @Override
     public int hashCode() {
-	return Objects.hash(tableName, getTableID());
+        return Objects.hash(tableName, getTableID());
     }
 
     @Override
     public boolean equals(Object obj) {
-	if (this == obj)
-	    return true;
-	if (obj == null)
-	    return false;
-	if (getClass() != obj.getClass())
-	    return false;
-	RCTableID other = (RCTableID) obj;
-	return Objects.equals(tableName, other.tableName)
-		&& Objects.equals(getTableID(), other.getTableID());
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        RCTableID other = (RCTableID) obj;
+        return Objects.equals(tableName, other.tableName)
+                && Objects.equals(getTableID(), other.getTableID());
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/datastore/topology/KVDevice.java b/src/main/java/net/onrc/onos/datastore/topology/KVDevice.java
index 105f6f7..e076c14 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/KVDevice.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/KVDevice.java
@@ -32,18 +32,18 @@
     private static final Logger log = LoggerFactory.getLogger(KVDevice.class);
 
     private static final ThreadLocal<Kryo> deviceKryo = new ThreadLocal<Kryo>() {
-	@Override
-	protected Kryo initialValue() {
-	    Kryo kryo = new Kryo();
-	    kryo.setRegistrationRequired(true);
-	    kryo.setReferences(false);
-	    kryo.register(byte[].class);
-	    kryo.register(byte[][].class);
-	    kryo.register(HashMap.class);
-	    // TODO check if we should explicitly specify EnumSerializer
-	    kryo.register(STATUS.class);
-	    return kryo;
-	}
+        @Override
+        protected Kryo initialValue() {
+            Kryo kryo = new Kryo();
+            kryo.setRegistrationRequired(true);
+            kryo.setReferences(false);
+            kryo.register(byte[].class);
+            kryo.register(byte[][].class);
+            kryo.register(HashMap.class);
+            // TODO check if we should explicitly specify EnumSerializer
+            kryo.register(STATUS.class);
+            return kryo;
+        }
     };
 
     public static final String GLOBAL_DEVICE_TABLE_NAME = "G:Device";
@@ -58,25 +58,25 @@
 
     // Assuming mac is unique cluster-wide
     public static byte[] getDeviceID(final byte[] mac) {
-	return DeviceEvent.getDeviceID(mac).array();
+        return DeviceEvent.getDeviceID(mac).array();
     }
 
     public static byte[] getMacFromKey(final byte[] key) {
-	ByteBuffer keyBuf = ByteBuffer.wrap(key);
-	if (keyBuf.getChar() != 'D') {
-	    throw new IllegalArgumentException("Invalid Device key");
-	}
-	byte[] mac = new byte[keyBuf.remaining()];
-	keyBuf.get(mac);
-	return mac;
+        ByteBuffer keyBuf = ByteBuffer.wrap(key);
+        if (keyBuf.getChar() != 'D') {
+            throw new IllegalArgumentException("Invalid Device key");
+        }
+        byte[] mac = new byte[keyBuf.remaining()];
+        keyBuf.get(mac);
+        return mac;
     }
 
     public KVDevice(final byte[] mac) {
-	super(DataStoreClient.getClient().getTable(GLOBAL_DEVICE_TABLE_NAME), getDeviceID(mac));
+        super(DataStoreClient.getClient().getTable(GLOBAL_DEVICE_TABLE_NAME), getDeviceID(mac));
 
-	this.mac = mac;
-	this.portIds = new TreeSet<>(ByteArrayComparator.BYTEARRAY_COMPARATOR);
-	this.isPortIdsModified = true;
+        this.mac = mac;
+        this.portIds = new TreeSet<>(ByteArrayComparator.BYTEARRAY_COMPARATOR);
+        this.isPortIdsModified = true;
     }
 
     /**
@@ -87,62 +87,62 @@
      * @return
      */
     public static KVDevice createFromKey(final byte[] key) {
-	return new KVDevice(getMacFromKey(key));
+        return new KVDevice(getMacFromKey(key));
     }
 
     public static Iterable<KVDevice> getAllDevices() {
-	return new DeviceEnumerator();
+        return new DeviceEnumerator();
     }
 
     public static class DeviceEnumerator implements Iterable<KVDevice> {
 
-	@Override
-	public Iterator<KVDevice> iterator() {
-	    return new DeviceIterator();
-	}
+        @Override
+        public Iterator<KVDevice> iterator() {
+            return new DeviceIterator();
+        }
     }
 
     public static class DeviceIterator extends AbstractObjectIterator<KVDevice> {
 
-	public DeviceIterator() {
-	    super(DataStoreClient.getClient().getTable(GLOBAL_DEVICE_TABLE_NAME));
-	}
+        public DeviceIterator() {
+            super(DataStoreClient.getClient().getTable(GLOBAL_DEVICE_TABLE_NAME));
+        }
 
-	@Override
-	public KVDevice next() {
-	    IKVEntry o = enumerator.next();
-	    KVDevice e = KVDevice.createFromKey(o.getKey());
-	    e.deserialize(o.getValue(), o.getVersion());
-	    return e;
-	}
+        @Override
+        public KVDevice next() {
+            IKVEntry o = enumerator.next();
+            KVDevice e = KVDevice.createFromKey(o.getKey());
+            e.deserialize(o.getValue(), o.getVersion());
+            return e;
+        }
     }
 
     public byte[] getMac() {
-	// TODO may need to clone() to be sure this object will be immutable.
-	return mac;
+        // TODO may need to clone() to be sure this object will be immutable.
+        return mac;
     }
 
     public byte[] getId() {
-	return getKey();
+        return getKey();
     }
 
     public void addPortId(final byte[] portId) {
-	// TODO: Should we copy portId, or reference is OK.
-	isPortIdsModified |= portIds.add(portId);
+        // TODO: Should we copy portId, or reference is OK.
+        isPortIdsModified |= portIds.add(portId);
     }
 
     public void removePortId(final byte[] portId) {
-	isPortIdsModified |= portIds.remove(portId);
+        isPortIdsModified |= portIds.remove(portId);
     }
 
     public void emptyPortIds() {
-	portIds.clear();
-	this.isPortIdsModified = true;
+        portIds.clear();
+        this.isPortIdsModified = true;
     }
 
     public void addAllToPortIds(final Collection<byte[]> portIds) {
-	// TODO: Should we copy portId, or reference is OK.
-	isPortIdsModified |= this.portIds.addAll(portIds);
+        // TODO: Should we copy portId, or reference is OK.
+        isPortIdsModified |= this.portIds.addAll(portIds);
     }
 
     /**
@@ -150,53 +150,53 @@
      * @return Unmodifiable Set view of all the PortIds;
      */
     public Set<byte[]> getAllPortIds() {
-	return Collections.unmodifiableSet(portIds);
+        return Collections.unmodifiableSet(portIds);
     }
 
     @Override
     public byte[] serialize() {
-	Map<Object, Object> map = getPropertyMap();
+        Map<Object, Object> map = getPropertyMap();
 
-	map.put(PROP_MAC, mac);
-	if (isPortIdsModified) {
-	    byte[][] portIdArray = new byte[portIds.size()][];
-	    map.put(PROP_PORT_IDS, portIds.toArray(portIdArray));
-	    isPortIdsModified = false;
-	}
+        map.put(PROP_MAC, mac);
+        if (isPortIdsModified) {
+            byte[][] portIdArray = new byte[portIds.size()][];
+            map.put(PROP_PORT_IDS, portIds.toArray(portIdArray));
+            isPortIdsModified = false;
+        }
 
-	return serializePropertyMap(deviceKryo.get(), map);
+        return serializePropertyMap(deviceKryo.get(), map);
     }
 
     @Override
     protected boolean deserialize(final byte[] bytes) {
-	boolean success = deserializePropertyMap(deviceKryo.get(), bytes);
-	if (!success) {
-	    log.error("Deserializing Link: " + this + " failed.");
-	    return false;
-	}
-	Map<Object, Object> map = this.getPropertyMap();
+        boolean success = deserializePropertyMap(deviceKryo.get(), bytes);
+        if (!success) {
+            log.error("Deserializing Link: " + this + " failed.");
+            return false;
+        }
+        Map<Object, Object> map = this.getPropertyMap();
 
-	if (this.portIds == null) {
-	    this.portIds = new TreeSet<>(
-		    ByteArrayComparator.BYTEARRAY_COMPARATOR);
-	}
-	byte[][] portIdArray = (byte[][]) map.get(PROP_PORT_IDS);
-	if (portIdArray != null) {
-	    this.portIds.clear();
-	    this.portIds.addAll(Arrays.asList(portIdArray));
-	    isPortIdsModified = false;
-	} else {
-	    // trigger write on next serialize
-	    isPortIdsModified = true;
-	}
+        if (this.portIds == null) {
+            this.portIds = new TreeSet<>(
+                    ByteArrayComparator.BYTEARRAY_COMPARATOR);
+        }
+        byte[][] portIdArray = (byte[][]) map.get(PROP_PORT_IDS);
+        if (portIdArray != null) {
+            this.portIds.clear();
+            this.portIds.addAll(Arrays.asList(portIdArray));
+            isPortIdsModified = false;
+        } else {
+            // trigger write on next serialize
+            isPortIdsModified = true;
+        }
 
-	return success;
+        return success;
     }
 
     @Override
     public String toString() {
-	// TODO output all properties?
-	return "[" + this.getClass().getSimpleName()
-		+ " " + ByteArrayUtil.toHexStringBuffer(mac, ":") + "]";
+        // TODO output all properties?
+        return "[" + this.getClass().getSimpleName()
+                + " " + ByteArrayUtil.toHexStringBuffer(mac, ":") + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/topology/KVLink.java b/src/main/java/net/onrc/onos/datastore/topology/KVLink.java
index c9273ae..5fbf070 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/KVLink.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/KVLink.java
@@ -26,41 +26,41 @@
     private static final Logger log = LoggerFactory.getLogger(KVLink.class);
 
     private static final ThreadLocal<Kryo> linkKryo = new ThreadLocal<Kryo>() {
-	@Override
-	protected Kryo initialValue() {
-	    Kryo kryo = new Kryo();
-	    kryo.setRegistrationRequired(true);
-	    kryo.setReferences(false);
-	    kryo.register(byte[].class);
-	    kryo.register(byte[][].class);
-	    kryo.register(HashMap.class);
-	    // TODO check if we should explicitly specify EnumSerializer
-	    kryo.register(STATUS.class);
-	    return kryo;
-	}
+        @Override
+        protected Kryo initialValue() {
+            Kryo kryo = new Kryo();
+            kryo.setRegistrationRequired(true);
+            kryo.setReferences(false);
+            kryo.register(byte[].class);
+            kryo.register(byte[][].class);
+            kryo.register(HashMap.class);
+            // TODO check if we should explicitly specify EnumSerializer
+            kryo.register(STATUS.class);
+            return kryo;
+        }
     };
 
     public static class SwitchPort {
-	public final Long dpid;
-	public final Long number;
+        public final Long dpid;
+        public final Long number;
 
-	public SwitchPort(final Long dpid, final Long number) {
-	    this.dpid = dpid;
-	    this.number = number;
-	}
+        public SwitchPort(final Long dpid, final Long number) {
+            this.dpid = dpid;
+            this.number = number;
+        }
 
-	public byte[] getPortID() {
-	    return KVPort.getPortID(dpid, number);
-	}
+        public byte[] getPortID() {
+            return KVPort.getPortID(dpid, number);
+        }
 
-	public byte[] getSwitchID() {
-	    return KVSwitch.getSwitchID(dpid);
-	}
+        public byte[] getSwitchID() {
+            return KVSwitch.getSwitchID(dpid);
+        }
 
-	@Override
-	public String toString() {
-	    return "(" + Long.toHexString(dpid) + "@" + number + ")";
-	}
+        @Override
+        public String toString() {
+            return "(" + Long.toHexString(dpid) + "@" + number + ")";
+        }
 
     }
 
@@ -68,7 +68,7 @@
 
     // must not re-order enum members, ordinal will be sent over wire
     public enum STATUS {
-	INACTIVE, ACTIVE;
+        INACTIVE, ACTIVE;
     }
 
     private final SwitchPort src;
@@ -76,40 +76,40 @@
     private STATUS status;
 
     public static byte[] getLinkID(final Long src_dpid, final Long src_port_no,
-	    final Long dst_dpid, final Long dst_port_no) {
-	return LinkEvent.getLinkID(src_dpid, src_port_no, dst_dpid,
-		dst_port_no).array();
+            final Long dst_dpid, final Long dst_port_no) {
+        return LinkEvent.getLinkID(src_dpid, src_port_no, dst_dpid,
+                dst_port_no).array();
     }
 
     public static long[] getLinkTupleFromKey(final byte[] key) {
-	return getLinkTupleFromKey(ByteBuffer.wrap(key));
+        return getLinkTupleFromKey(ByteBuffer.wrap(key));
     }
 
     public static long[] getLinkTupleFromKey(final ByteBuffer keyBuf) {
-	long[] tuple = new long[4];
-	if (keyBuf.getChar() != 'L') {
-	    throw new IllegalArgumentException("Invalid Link key");
-	}
-	long[] src_port_pair = KVPort.getPortPairFromKey(keyBuf.slice());
-	keyBuf.position(2 + PortEvent.PORTID_BYTES);
-	long[] dst_port_pair = KVPort.getPortPairFromKey(keyBuf.slice());
+        long[] tuple = new long[4];
+        if (keyBuf.getChar() != 'L') {
+            throw new IllegalArgumentException("Invalid Link key");
+        }
+        long[] src_port_pair = KVPort.getPortPairFromKey(keyBuf.slice());
+        keyBuf.position(2 + PortEvent.PORTID_BYTES);
+        long[] dst_port_pair = KVPort.getPortPairFromKey(keyBuf.slice());
 
-	tuple[0] = src_port_pair[0];
-	tuple[1] = src_port_pair[1];
-	tuple[2] = dst_port_pair[0];
-	tuple[3] = dst_port_pair[1];
+        tuple[0] = src_port_pair[0];
+        tuple[1] = src_port_pair[1];
+        tuple[2] = dst_port_pair[0];
+        tuple[3] = dst_port_pair[1];
 
-	return tuple;
+        return tuple;
     }
 
     public KVLink(final Long src_dpid, final Long src_port_no,
-	    final Long dst_dpid, final Long dst_port_no) {
-	super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME), getLinkID(src_dpid,
-		src_port_no, dst_dpid, dst_port_no));
+            final Long dst_dpid, final Long dst_port_no) {
+        super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME), getLinkID(src_dpid,
+                src_port_no, dst_dpid, dst_port_no));
 
-	src = new SwitchPort(src_dpid, src_port_no);
-	dst = new SwitchPort(dst_dpid, dst_port_no);
-	status = STATUS.INACTIVE;
+        src = new SwitchPort(src_dpid, src_port_no);
+        dst = new SwitchPort(dst_dpid, dst_port_no);
+        status = STATUS.INACTIVE;
     }
 
     /**
@@ -120,98 +120,98 @@
      * @return KVLink instance
      */
     public static KVLink createFromKey(final byte[] key) {
-	long[] linkTuple = getLinkTupleFromKey(key);
-	return new KVLink(linkTuple[0], linkTuple[1], linkTuple[2],
-		linkTuple[3]);
+        long[] linkTuple = getLinkTupleFromKey(key);
+        return new KVLink(linkTuple[0], linkTuple[1], linkTuple[2],
+                linkTuple[3]);
     }
 
     public static Iterable<KVLink> getAllLinks() {
-	return new LinkEnumerator();
+        return new LinkEnumerator();
     }
 
     public static class LinkEnumerator implements Iterable<KVLink> {
 
-	@Override
-	public Iterator<KVLink> iterator() {
-	    return new LinkIterator();
-	}
+        @Override
+        public Iterator<KVLink> iterator() {
+            return new LinkIterator();
+        }
     }
 
     public static class LinkIterator extends AbstractObjectIterator<KVLink> {
 
-	public LinkIterator() {
-	    super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME));
-	}
+        public LinkIterator() {
+            super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME));
+        }
 
-	@Override
-	public KVLink next() {
-	    IKVEntry o = enumerator.next();
-	    KVLink e = KVLink.createFromKey(o.getKey());
-	    e.deserialize(o.getValue(), o.getVersion());
-	    return e;
-	}
+        @Override
+        public KVLink next() {
+            IKVEntry o = enumerator.next();
+            KVLink e = KVLink.createFromKey(o.getKey());
+            e.deserialize(o.getValue(), o.getVersion());
+            return e;
+        }
     }
 
     public STATUS getStatus() {
-	return status;
+        return status;
     }
 
     public void setStatus(final STATUS status) {
-	this.status = status;
+        this.status = status;
     }
 
     public SwitchPort getSrc() {
-	return src;
+        return src;
     }
 
     public SwitchPort getDst() {
-	return dst;
+        return dst;
     }
 
     public byte[] getId() {
-	return getKey();
+        return getKey();
     }
 
     @Override
     public byte[] serialize() {
-	Map<Object, Object> map = getPropertyMap();
+        Map<Object, Object> map = getPropertyMap();
 
-	LinkProperty.Builder link = LinkProperty.newBuilder();
-	link.setSrcSwId(ByteString.copyFrom(src.getSwitchID()));
-	link.setSrcPortId(ByteString.copyFrom(src.getPortID()));
-	link.setDstSwId(ByteString.copyFrom(dst.getSwitchID()));
-	link.setDstPortId(ByteString.copyFrom(dst.getPortID()));
-	link.setStatus(status.ordinal());
+        LinkProperty.Builder link = LinkProperty.newBuilder();
+        link.setSrcSwId(ByteString.copyFrom(src.getSwitchID()));
+        link.setSrcPortId(ByteString.copyFrom(src.getPortID()));
+        link.setDstSwId(ByteString.copyFrom(dst.getSwitchID()));
+        link.setDstPortId(ByteString.copyFrom(dst.getPortID()));
+        link.setStatus(status.ordinal());
 
-	if (!map.isEmpty()) {
-	    byte[] propMaps = serializePropertyMap(linkKryo.get(), map);
-	    link.setValue(ByteString.copyFrom(propMaps));
-	}
+        if (!map.isEmpty()) {
+            byte[] propMaps = serializePropertyMap(linkKryo.get(), map);
+            link.setValue(ByteString.copyFrom(propMaps));
+        }
 
-	return link.build().toByteArray();
+        return link.build().toByteArray();
     }
 
     @Override
     protected boolean deserialize(final byte[] bytes) {
-	try {
-	    boolean success = true;
+        try {
+            boolean success = true;
 
-	    LinkProperty link = LinkProperty.parseFrom(bytes);
-	    byte[] props = link.getValue().toByteArray();
-	    success &= deserializePropertyMap(linkKryo.get(), props);
-	    this.status = STATUS.values()[link.getStatus()];
+            LinkProperty link = LinkProperty.parseFrom(bytes);
+            byte[] props = link.getValue().toByteArray();
+            success &= deserializePropertyMap(linkKryo.get(), props);
+            this.status = STATUS.values()[link.getStatus()];
 
-	    return success;
-	} catch (InvalidProtocolBufferException e) {
-	    log.error("Deserializing Link: " + this + " failed.", e);
-	    return false;
-	}
+            return success;
+        } catch (InvalidProtocolBufferException e) {
+            log.error("Deserializing Link: " + this + " failed.", e);
+            return false;
+        }
     }
 
     @Override
     public String toString() {
-	// TODO output all properties?
-	return "[" + this.getClass().getSimpleName()
-		+ " " + src + "->" + dst + " STATUS:" + status + "]";
+        // TODO output all properties?
+        return "[" + this.getClass().getSimpleName()
+                + " " + src + "->" + dst + " STATUS:" + status + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/topology/KVPort.java b/src/main/java/net/onrc/onos/datastore/topology/KVPort.java
index 3b66864..452bf94 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/KVPort.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/KVPort.java
@@ -30,25 +30,25 @@
     private static final Logger log = LoggerFactory.getLogger(KVPort.class);
 
     private static final ThreadLocal<Kryo> portKryo = new ThreadLocal<Kryo>() {
-	@Override
-	protected Kryo initialValue() {
-	    Kryo kryo = new Kryo();
-	    kryo.setRegistrationRequired(true);
-	    kryo.setReferences(false);
-	    kryo.register(byte[].class);
-	    kryo.register(byte[][].class);
-	    kryo.register(HashMap.class);
-	    // TODO check if we should explicitly specify EnumSerializer
-	    kryo.register(STATUS.class);
-	    return kryo;
-	}
+        @Override
+        protected Kryo initialValue() {
+            Kryo kryo = new Kryo();
+            kryo.setRegistrationRequired(true);
+            kryo.setReferences(false);
+            kryo.register(byte[].class);
+            kryo.register(byte[][].class);
+            kryo.register(HashMap.class);
+            // TODO check if we should explicitly specify EnumSerializer
+            kryo.register(STATUS.class);
+            return kryo;
+        }
     };
 
     public static final String GLOBAL_PORT_TABLE_NAME = "G:Port";
 
     // must not re-order enum members, ordinal will be sent over wire
     public enum STATUS {
-	INACTIVE, ACTIVE;
+        INACTIVE, ACTIVE;
     }
 
     private final Long dpid;
@@ -57,49 +57,49 @@
     private STATUS status;
 
     public static byte[] getPortID(final Long dpid, final Long number) {
-	return PortEvent.getPortID(dpid, number).array();
+        return PortEvent.getPortID(dpid, number).array();
     }
 
     public static long[] getPortPairFromKey(final byte[] key) {
-	return getPortPairFromKey(ByteBuffer.wrap(key));
+        return getPortPairFromKey(ByteBuffer.wrap(key));
     }
 
     public static long[] getPortPairFromKey(final ByteBuffer keyBuf) {
-	long[] pair = new long[2];
-	if (keyBuf.getChar() != 'S') {
-	    throw new IllegalArgumentException("Invalid Port key:" + keyBuf
-		    + " "
-		    + ByteArrayUtil.toHexStringBuffer(keyBuf.array(), ":"));
-	}
-	pair[0] = keyBuf.getLong();
-	if (keyBuf.getChar() != 'P') {
-	    throw new IllegalArgumentException("Invalid Port key:" + keyBuf
-		    + " "
-		    + ByteArrayUtil.toHexStringBuffer(keyBuf.array(), ":"));
-	}
-	pair[1] = keyBuf.getLong();
-	return pair;
+        long[] pair = new long[2];
+        if (keyBuf.getChar() != 'S') {
+            throw new IllegalArgumentException("Invalid Port key:" + keyBuf
+                    + " "
+                    + ByteArrayUtil.toHexStringBuffer(keyBuf.array(), ":"));
+        }
+        pair[0] = keyBuf.getLong();
+        if (keyBuf.getChar() != 'P') {
+            throw new IllegalArgumentException("Invalid Port key:" + keyBuf
+                    + " "
+                    + ByteArrayUtil.toHexStringBuffer(keyBuf.array(), ":"));
+        }
+        pair[1] = keyBuf.getLong();
+        return pair;
 
     }
 
     public static long getDpidFromKey(final byte[] key) {
-	return getPortPairFromKey(key)[0];
+        return getPortPairFromKey(key)[0];
     }
 
     public static long getNumberFromKey(final byte[] key) {
-	return getPortPairFromKey(key)[1];
+        return getPortPairFromKey(key)[1];
     }
 
     // FIXME specify DPID,number here, or Should caller specify the key it self?
     // In other words, should layer above have the control of the ID?
     public KVPort(final Long dpid, final Long number) {
-	super(DataStoreClient.getClient().getTable(GLOBAL_PORT_TABLE_NAME), getPortID(dpid, number));
+        super(DataStoreClient.getClient().getTable(GLOBAL_PORT_TABLE_NAME), getPortID(dpid, number));
 
-	// TODO Auto-generated constructor stub
+        // TODO Auto-generated constructor stub
 
-	this.dpid = dpid;
-	this.number = number;
-	this.status = STATUS.INACTIVE;
+        this.dpid = dpid;
+        this.number = number;
+        this.status = STATUS.INACTIVE;
     }
 
     /**
@@ -110,96 +110,96 @@
      * @return KVPort instance
      */
     public static KVPort createFromKey(final byte[] key) {
-	long[] pair = getPortPairFromKey(key);
-	return new KVPort(pair[0], pair[1]);
+        long[] pair = getPortPairFromKey(key);
+        return new KVPort(pair[0], pair[1]);
     }
 
     public static Iterable<KVPort> getAllPorts() {
-	return new PortEnumerator();
+        return new PortEnumerator();
     }
 
     public static class PortEnumerator implements Iterable<KVPort> {
 
-	@Override
-	public Iterator<KVPort> iterator() {
-	    return new PortIterator();
-	}
+        @Override
+        public Iterator<KVPort> iterator() {
+            return new PortIterator();
+        }
     }
 
     public static class PortIterator extends AbstractObjectIterator<KVPort> {
 
-	public PortIterator() {
-	    super(DataStoreClient.getClient().getTable(GLOBAL_PORT_TABLE_NAME));
-	}
+        public PortIterator() {
+            super(DataStoreClient.getClient().getTable(GLOBAL_PORT_TABLE_NAME));
+        }
 
-	@Override
-	public KVPort next() {
-	    IKVEntry o = enumerator.next();
-	    KVPort e = KVPort.createFromKey(o.getKey());
-	    e.deserialize(o.getValue(), o.getVersion());
-	    return e;
-	}
+        @Override
+        public KVPort next() {
+            IKVEntry o = enumerator.next();
+            KVPort e = KVPort.createFromKey(o.getKey());
+            e.deserialize(o.getValue(), o.getVersion());
+            return e;
+        }
     }
 
     public STATUS getStatus() {
-	return status;
+        return status;
     }
 
     public void setStatus(final STATUS status) {
-	this.status = status;
+        this.status = status;
     }
 
     public Long getDpid() {
-	return dpid;
+        return dpid;
     }
 
     public Long getNumber() {
-	return number;
+        return number;
     }
 
     public byte[] getId() {
-	return getKey();
+        return getKey();
     }
 
     @Override
     public byte[] serialize() {
-	Map<Object, Object> map = getPropertyMap();
+        Map<Object, Object> map = getPropertyMap();
 
-	PortProperty.Builder port = PortProperty.newBuilder();
-	port.setDpid(dpid);
-	port.setNumber(number);
-	port.setStatus(status.ordinal());
+        PortProperty.Builder port = PortProperty.newBuilder();
+        port.setDpid(dpid);
+        port.setNumber(number);
+        port.setStatus(status.ordinal());
 
-	if (!map.isEmpty()) {
-	    byte[] propMaps = serializePropertyMap(portKryo.get(), map);
-	    port.setValue(ByteString.copyFrom(propMaps));
-	}
+        if (!map.isEmpty()) {
+            byte[] propMaps = serializePropertyMap(portKryo.get(), map);
+            port.setValue(ByteString.copyFrom(propMaps));
+        }
 
-	return port.build().toByteArray();
+        return port.build().toByteArray();
     }
 
     @Override
     protected boolean deserialize(final byte[] bytes) {
-	try {
-	    boolean success = true;
+        try {
+            boolean success = true;
 
-	    PortProperty port = PortProperty.parseFrom(bytes);
-	    byte[] props = port.getValue().toByteArray();
-	    success &= deserializePropertyMap(portKryo.get(), props);
-	    this.status = STATUS.values()[port.getStatus()];
+            PortProperty port = PortProperty.parseFrom(bytes);
+            byte[] props = port.getValue().toByteArray();
+            success &= deserializePropertyMap(portKryo.get(), props);
+            this.status = STATUS.values()[port.getStatus()];
 
-	    return success;
-	} catch (InvalidProtocolBufferException e) {
-	    log.error("Deserializing Port: " + this + " failed.", e);
-	    return false;
-	}
+            return success;
+        } catch (InvalidProtocolBufferException e) {
+            log.error("Deserializing Port: " + this + " failed.", e);
+            return false;
+        }
     }
 
     @Override
     public String toString() {
-	// TODO output all properties?
-	return "[" + this.getClass().getSimpleName()
-		+ " 0x" + Long.toHexString(dpid) + "@" + number
-		+ " STATUS:" + status + "]";
+        // TODO output all properties?
+        return "[" + this.getClass().getSimpleName()
+                + " 0x" + Long.toHexString(dpid) + "@" + number
+                + " STATUS:" + status + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/topology/KVSwitch.java b/src/main/java/net/onrc/onos/datastore/topology/KVSwitch.java
index e915160..5f1c8fd 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/KVSwitch.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/KVSwitch.java
@@ -29,52 +29,52 @@
     private static final Logger log = LoggerFactory.getLogger(KVSwitch.class);
 
     private static final ThreadLocal<Kryo> switchKryo = new ThreadLocal<Kryo>() {
-	@Override
-	protected Kryo initialValue() {
-	    Kryo kryo = new Kryo();
-	    kryo.setRegistrationRequired(true);
-	    kryo.setReferences(false);
-	    kryo.register(byte[].class);
-	    kryo.register(byte[][].class);
-	    kryo.register(HashMap.class);
-	    // TODO check if we should explicitly specify EnumSerializer
-	    kryo.register(STATUS.class);
-	    return kryo;
-	}
+        @Override
+        protected Kryo initialValue() {
+            Kryo kryo = new Kryo();
+            kryo.setRegistrationRequired(true);
+            kryo.setReferences(false);
+            kryo.register(byte[].class);
+            kryo.register(byte[][].class);
+            kryo.register(HashMap.class);
+            // TODO check if we should explicitly specify EnumSerializer
+            kryo.register(STATUS.class);
+            return kryo;
+        }
     };
 
     public static final String GLOBAL_SWITCH_TABLE_NAME = "G:Switch";
 
     // must not re-order enum members, ordinal will be sent over wire
     public enum STATUS {
-	INACTIVE, ACTIVE;
+        INACTIVE, ACTIVE;
     }
 
     private final Long dpid;
     private STATUS status;
 
     public static byte[] getSwitchID(final Long dpid) {
-	return SwitchEvent.getSwitchID(dpid).array();
+        return SwitchEvent.getSwitchID(dpid).array();
     }
 
     public static long getDpidFromKey(final byte[] key) {
-	return getDpidFromKey(ByteBuffer.wrap(key));
+        return getDpidFromKey(ByteBuffer.wrap(key));
     }
 
     public static long getDpidFromKey(final ByteBuffer keyBuf) {
-	if (keyBuf.getChar() != 'S') {
-	    throw new IllegalArgumentException("Invalid Switch key");
-	}
-	return keyBuf.getLong();
+        if (keyBuf.getChar() != 'S') {
+            throw new IllegalArgumentException("Invalid Switch key");
+        }
+        return keyBuf.getLong();
     }
 
     // FIXME specify DPID here, or Should caller specify the key it self?
     // In other words, should layer above have the control of the ID?
     public KVSwitch(final Long dpid) {
-	super(DataStoreClient.getClient().getTable(GLOBAL_SWITCH_TABLE_NAME), getSwitchID(dpid));
+        super(DataStoreClient.getClient().getTable(GLOBAL_SWITCH_TABLE_NAME), getSwitchID(dpid));
 
-	this.dpid = dpid;
-	this.status = STATUS.INACTIVE;
+        this.dpid = dpid;
+        this.status = STATUS.INACTIVE;
     }
 
     /**
@@ -85,90 +85,90 @@
      * @return KVSwitch instance
      */
     public static KVSwitch createFromKey(final byte[] key) {
-	return new KVSwitch(getDpidFromKey(key));
+        return new KVSwitch(getDpidFromKey(key));
     }
 
     public static Iterable<KVSwitch> getAllSwitches() {
-	return new SwitchEnumerator();
+        return new SwitchEnumerator();
     }
 
     public static class SwitchEnumerator implements Iterable<KVSwitch> {
 
-	@Override
-	public Iterator<KVSwitch> iterator() {
-	    return new SwitchIterator();
-	}
+        @Override
+        public Iterator<KVSwitch> iterator() {
+            return new SwitchIterator();
+        }
     }
 
     public static class SwitchIterator extends AbstractObjectIterator<KVSwitch> {
 
-	public SwitchIterator() {
-	    super(DataStoreClient.getClient().getTable(GLOBAL_SWITCH_TABLE_NAME));
-	}
+        public SwitchIterator() {
+            super(DataStoreClient.getClient().getTable(GLOBAL_SWITCH_TABLE_NAME));
+        }
 
-	@Override
-	public KVSwitch next() {
-	    IKVEntry o = enumerator.next();
-	    KVSwitch e = KVSwitch.createFromKey(o.getKey());
-	    e.deserialize(o.getValue(), o.getVersion());
-	    return e;
-	}
+        @Override
+        public KVSwitch next() {
+            IKVEntry o = enumerator.next();
+            KVSwitch e = KVSwitch.createFromKey(o.getKey());
+            e.deserialize(o.getValue(), o.getVersion());
+            return e;
+        }
     }
 
     public STATUS getStatus() {
-	return status;
+        return status;
     }
 
     public void setStatus(final STATUS status) {
-	this.status = status;
+        this.status = status;
     }
 
     public Long getDpid() {
-	return dpid;
+        return dpid;
     }
 
     public byte[] getId() {
-	return getKey();
+        return getKey();
     }
 
     @Override
     public byte[] serialize() {
-	Map<Object, Object> map = getPropertyMap();
+        Map<Object, Object> map = getPropertyMap();
 
-	SwitchProperty.Builder sw = SwitchProperty.newBuilder();
-	sw.setDpid(dpid);
-	sw.setStatus(status.ordinal());
+        SwitchProperty.Builder sw = SwitchProperty.newBuilder();
+        sw.setDpid(dpid);
+        sw.setStatus(status.ordinal());
 
-	if (!map.isEmpty()) {
-	    byte[] propMaps = serializePropertyMap(switchKryo.get(), map);
-	    sw.setValue(ByteString.copyFrom(propMaps));
-	}
+        if (!map.isEmpty()) {
+            byte[] propMaps = serializePropertyMap(switchKryo.get(), map);
+            sw.setValue(ByteString.copyFrom(propMaps));
+        }
 
-	return sw.build().toByteArray();
+        return sw.build().toByteArray();
     }
 
     @Override
     protected boolean deserialize(final byte[] bytes) {
-	try {
-	    boolean success = true;
+        try {
+            boolean success = true;
 
-	    SwitchProperty sw = SwitchProperty.parseFrom(bytes);
-	    byte[] props = sw.getValue().toByteArray();
-	    success &= deserializePropertyMap(switchKryo.get(), props);
-	    this.status = STATUS.values()[sw.getStatus()];
+            SwitchProperty sw = SwitchProperty.parseFrom(bytes);
+            byte[] props = sw.getValue().toByteArray();
+            success &= deserializePropertyMap(switchKryo.get(), props);
+            this.status = STATUS.values()[sw.getStatus()];
 
-	    return success;
-	} catch (InvalidProtocolBufferException e) {
-	    log.error("Deserializing Switch: " + this + " failed.", e);
-	    return false;
-	}
+            return success;
+        } catch (InvalidProtocolBufferException e) {
+            log.error("Deserializing Switch: " + this + " failed.", e);
+            return false;
+        }
     }
 
     @Override
     public String toString() {
-	// TODO output all properties?
-	return "[" + this.getClass().getSimpleName()
-		+ " 0x" + Long.toHexString(dpid) + " STATUS:" + status + "]";
+        // TODO output all properties?
+        return "[" + this.getClass().getSimpleName()
+                + " 0x" + Long.toHexString(dpid) + " STATUS:" + status + "]";
     }
 
 }
diff --git a/src/main/java/net/onrc/onos/datastore/utils/ByteArrayComparator.java b/src/main/java/net/onrc/onos/datastore/utils/ByteArrayComparator.java
index 56b088f..fbe3ebd 100644
--- a/src/main/java/net/onrc/onos/datastore/utils/ByteArrayComparator.java
+++ b/src/main/java/net/onrc/onos/datastore/utils/ByteArrayComparator.java
@@ -17,8 +17,8 @@
 
     @Override
     public int compare(final byte[] o1, final byte[] o2) {
-	final ByteBuffer b1 = ByteBuffer.wrap(o1);
-	final ByteBuffer b2 = ByteBuffer.wrap(o2);
-	return b1.compareTo(b2);
+        final ByteBuffer b1 = ByteBuffer.wrap(o1);
+        final ByteBuffer b2 = ByteBuffer.wrap(o2);
+        return b1.compareTo(b2);
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/utils/ByteArrayUtil.java b/src/main/java/net/onrc/onos/datastore/utils/ByteArrayUtil.java
index c13d7ea..c7e3765 100644
--- a/src/main/java/net/onrc/onos/datastore/utils/ByteArrayUtil.java
+++ b/src/main/java/net/onrc/onos/datastore/utils/ByteArrayUtil.java
@@ -17,8 +17,8 @@
      * @return {@code bytes} converted to a StringBuffer
      */
     public static StringBuffer toHexStringBuffer(final byte[] bytes,
-	    final String sep) {
-	return toHexStringBuffer(bytes, sep, new StringBuffer());
+            final String sep) {
+        return toHexStringBuffer(bytes, sep, new StringBuffer());
     }
 
     /**
@@ -32,22 +32,22 @@
      * @return {@code buf}
      */
     public static StringBuffer toHexStringBuffer(final byte[] bytes,
-	    final String sep, final StringBuffer buf) {
-	if (bytes == null) {
-	    return buf;
-	}
+            final String sep, final StringBuffer buf) {
+        if (bytes == null) {
+            return buf;
+        }
 
-	ByteBuffer wrap = ByteBuffer.wrap(bytes);
+        ByteBuffer wrap = ByteBuffer.wrap(bytes);
 
-	boolean hasWritten = false;
-	while (wrap.hasRemaining()) {
-	    if (hasWritten) {
-		buf.append(sep);
-	    }
-	    buf.append(Integer.toHexString(wrap.get()));
-	    hasWritten = true;
-	}
+        boolean hasWritten = false;
+        while (wrap.hasRemaining()) {
+            if (hasWritten) {
+                buf.append(sep);
+            }
+            buf.append(Integer.toHexString(wrap.get()));
+            hasWritten = true;
+        }
 
-	return buf;
+        return buf;
     }
 }
diff --git a/src/main/java/net/onrc/onos/datastore/utils/KVObject.java b/src/main/java/net/onrc/onos/datastore/utils/KVObject.java
index 2aac0e3..b46c9f5 100644
--- a/src/main/java/net/onrc/onos/datastore/utils/KVObject.java
+++ b/src/main/java/net/onrc/onos/datastore/utils/KVObject.java
@@ -36,13 +36,13 @@
     // each sub-class should prepare their own serializer, which has required
     // objects registered for better performance.
     private static final ThreadLocal<Kryo> defaultKryo = new ThreadLocal<Kryo>() {
-	@Override
-	protected Kryo initialValue() {
-	    Kryo kryo = new Kryo();
-	    // kryo.setRegistrationRequired(true);
-	    // kryo.setReferences(false);
-	    return kryo;
-	}
+        @Override
+        protected Kryo initialValue() {
+            Kryo kryo = new Kryo();
+            // kryo.setRegistrationRequired(true);
+            // kryo.setReferences(false);
+            return kryo;
+        }
     };
 
     private final IKVTable table;
@@ -60,46 +60,46 @@
     private Map<Object, Object> propertyMap;
 
     public KVObject(final IKVTable table, final byte[] key) {
-	this(table, key, null, table.VERSION_NONEXISTENT());
+        this(table, key, null, table.VERSION_NONEXISTENT());
     }
 
     public KVObject(final IKVTable table, final byte[] key, final byte[] value, final long version) {
-	if (table == null) {
-	    throw new IllegalArgumentException("table cannot be null");
-	}
-	if (key == null) {
-	    throw new IllegalArgumentException("key cannot be null");
-	}
-	this.table = table;
-	this.key = key;
-	this.version = version;
-	this.propertyMap = new HashMap<Object, Object>();
+        if (table == null) {
+            throw new IllegalArgumentException("table cannot be null");
+        }
+        if (key == null) {
+            throw new IllegalArgumentException("key cannot be null");
+        }
+        this.table = table;
+        this.key = key;
+        this.version = version;
+        this.propertyMap = new HashMap<Object, Object>();
 
-	if (value != null) {
-	    deserialize(value);
-	}
+        if (value != null) {
+            deserialize(value);
+        }
     }
 
     protected static KVObject createFromKey(final byte[] key) {
-	// Equivalent of this method is expected to be implemented by SubClasses
-	throw new UnsupportedOperationException(
-		"createFromKey() is not expected to be called for RCObject");
+        // Equivalent of this method is expected to be implemented by SubClasses
+        throw new UnsupportedOperationException(
+                "createFromKey() is not expected to be called for RCObject");
     }
 
     public IKVTable getTable() {
-	return table;
+        return table;
     }
 
     public IKVTableID getTableId() {
-	return table.getTableId();
+        return table.getTableId();
     }
 
     public byte[] getKey() {
-	return key;
+        return key;
     }
 
     public long getVersion() {
-	return version;
+        return version;
     }
 
     /**
@@ -109,13 +109,13 @@
      * @return Will return null, if never been set, or was not deserialized
      */
     protected Map<Object, Object> getPropertyMap() {
-	return this.propertyMap;
+        return this.propertyMap;
     }
 
     protected Map<Object, Object> replacePropertyMap(final Map<Object, Object> newMap) {
-	Map<Object, Object> oldMap = this.propertyMap;
-	this.propertyMap = newMap;
-	return oldMap;
+        Map<Object, Object> oldMap = this.propertyMap;
+        this.propertyMap = newMap;
+        return oldMap;
     }
 
     /**
@@ -126,18 +126,18 @@
      * @return serialized byte array
      */
     public byte[] serialize() {
-	return serializePropertyMap(defaultKryo.get(), this.propertyMap);
+        return serializePropertyMap(defaultKryo.get(), this.propertyMap);
     }
 
     protected byte[] serializePropertyMap(final Kryo kryo,
-	    final Map<Object, Object> propMap) {
+            final Map<Object, Object> propMap) {
 
 
-	// value
-	byte[] rcTemp = new byte[1024 * 1024];
-	Output output = new Output(rcTemp);
-	kryo.writeObject(output, propMap);
-	return output.toBytes();
+        // value
+        byte[] rcTemp = new byte[1024 * 1024];
+        Output output = new Output(rcTemp);
+        kryo.writeObject(output, propMap);
+        return output.toBytes();
     }
 
 
@@ -149,8 +149,8 @@
      * @return true if success
      */
     public boolean deserialize(final byte[] bytes, final long version) {
-	this.version = version;
-	return deserialize(bytes);
+        this.version = version;
+        return deserialize(bytes);
     }
 
     /**
@@ -162,8 +162,8 @@
      * @return true if success
      */
     protected boolean deserialize(final byte[] bytes) {
-	deserializePropertyMap(defaultKryo.get(), bytes);
-	return true;
+        deserializePropertyMap(defaultKryo.get(), bytes);
+        return true;
     }
 
     /**
@@ -173,26 +173,26 @@
      * @return true if success
      */
     protected boolean deserializePropertyMap(final Kryo kryo, final byte[] bytes) {
-	@SuppressWarnings("unchecked")
-	Map<Object, Object> map = deserializePropertyMap(kryo, bytes, HashMap.class);
-	if (map == null) {
-	    map = new HashMap<>();
-	}
-	this.propertyMap = map;
-	return true;
+        @SuppressWarnings("unchecked")
+        Map<Object, Object> map = deserializePropertyMap(kryo, bytes, HashMap.class);
+        if (map == null) {
+            map = new HashMap<>();
+        }
+        this.propertyMap = map;
+        return true;
     }
 
     protected <T extends Map<?, ?>> T deserializePropertyMap(final Kryo kryo,
-	    final byte[] bytes, final Class<T> type) {
+            final byte[] bytes, final Class<T> type) {
 
-	if (bytes == null || bytes.length == 0) {
-	    return null;
-	}
+        if (bytes == null || bytes.length == 0) {
+            return null;
+        }
 
-	Input input = new Input(bytes);
-	T map = kryo.readObject(input, type);
+        Input input = new Input(bytes);
+        T map = kryo.readObject(input, type);
 
-	return map;
+        return map;
     }
 
 
@@ -205,22 +205,22 @@
      */
     public void create() throws ObjectExistsException {
 
-	if (this.propertyMap == null) {
-	    log.warn("No object map was set. Setting empty Map.");
-	    replacePropertyMap(new HashMap<Object, Object>());
-	}
+        if (this.propertyMap == null) {
+            log.warn("No object map was set. Setting empty Map.");
+            replacePropertyMap(new HashMap<Object, Object>());
+        }
 
-	this.version = table.create(key, this.serialize());
+        this.version = table.create(key, this.serialize());
     }
 
     public void forceCreate() {
 
-	if (this.propertyMap == null) {
-	    log.warn("No object map was set. Setting empty Map.");
-	    replacePropertyMap(new HashMap<Object, Object>());
-	}
+        if (this.propertyMap == null) {
+            log.warn("No object map was set. Setting empty Map.");
+            replacePropertyMap(new HashMap<Object, Object>());
+        }
 
-	this.version = table.forceCreate(key, this.serialize());
+        this.version = table.forceCreate(key, this.serialize());
     }
 
     /**
@@ -232,8 +232,8 @@
      *
      */
     public void read() throws ObjectDoesntExistException {
-	IKVEntry e = table.read(key);
-	deserialize(e.getValue(), e.getVersion());
+        IKVEntry e = table.read(key);
+        deserialize(e.getValue(), e.getVersion());
     }
 
     /**
@@ -246,11 +246,11 @@
      */
     public void update() throws ObjectDoesntExistException,
     WrongVersionException {
-	if (this.propertyMap == null) {
-	    replacePropertyMap(new HashMap<Object, Object>());
-	}
+        if (this.propertyMap == null) {
+            replacePropertyMap(new HashMap<Object, Object>());
+        }
 
-	this.version = table.update(key, this.serialize(), version);
+        this.version = table.update(key, this.serialize(), version);
     }
 
     /**
@@ -263,36 +263,36 @@
      */
     public void delete() throws ObjectDoesntExistException,
     WrongVersionException {
-	this.version = table.delete(key, this.version);
+        this.version = table.delete(key, this.version);
     }
 
     public void forceDelete() {
-	this.version = table.forceDelete(key);
+        this.version = table.forceDelete(key);
     }
 
     public WriteOp forceCreateOp(IKVClient client) {
-	return new WriteOp(client.forceCreateOp(getTableId(), getKey(), serialize()), this);
+        return new WriteOp(client.forceCreateOp(getTableId(), getKey(), serialize()), this);
     }
 
     public WriteOp createOp(IKVClient client) {
-	return new WriteOp(client.createOp(getTableId(), getKey(), serialize()), this);
+        return new WriteOp(client.createOp(getTableId(), getKey(), serialize()), this);
     }
 
     // this might not be needed?
     public WriteOp readOp(IKVClient client) {
-	return new WriteOp(client.readOp(getTableId(), getKey()), this);
+        return new WriteOp(client.readOp(getTableId(), getKey()), this);
     }
 
     public WriteOp updateOp(IKVClient client) {
-	return new WriteOp(client.updateOp(getTableId(), getKey(), serialize(), getVersion()), this);
+        return new WriteOp(client.updateOp(getTableId(), getKey(), serialize(), getVersion()), this);
     }
 
     public WriteOp deleteOp(IKVClient client) {
-	return new WriteOp(client.deleteOp(getTableId(), getKey(), serialize(), getVersion()), this);
+        return new WriteOp(client.deleteOp(getTableId(), getKey(), serialize(), getVersion()), this);
     }
 
     public WriteOp forceDeleteOp(IKVClient client) {
-	return new WriteOp(client.forceDeleteOp(getTableId(), getKey()), this);
+        return new WriteOp(client.forceDeleteOp(getTableId(), getKey()), this);
     }
 
     /**
@@ -306,32 +306,32 @@
      */
     public static boolean multiRead(final List<? extends KVObject> objects) {
 
-	final IKVClient client = DataStoreClient.getClient();
+        final IKVClient client = DataStoreClient.getClient();
 
-	final ArrayList<IMultiEntryOperation> readOps = new ArrayList<>(objects.size());
-	for (KVObject o : objects) {
-	    readOps.add(o.readOp(client));
-	}
+        final ArrayList<IMultiEntryOperation> readOps = new ArrayList<>(objects.size());
+        for (KVObject o : objects) {
+            readOps.add(o.readOp(client));
+        }
 
-	boolean failExists = client.multiRead(readOps);
+        boolean failExists = client.multiRead(readOps);
 
-	for (int i = 0; i < readOps.size(); ++i) {
-	    KVObject obj = objects.get(i);
-	    IMultiEntryOperation entry = readOps.get(i);
-	    if ( entry.hasSucceeded() ) {
-		if ( !obj.deserialize(entry.getValue(), entry.getVersion()) ) {
-		    //deserialize return true on success
-		    failExists = true;
-		    log.error("MultiRead error, failed to deserialize {}, {}", obj.getTable(), obj);
-		}
-	    } else {
-		log.error("MultiRead error, skipping {}, {}", obj.getTable(), obj);
-		obj.version = obj.getTable().VERSION_NONEXISTENT();
-		failExists = true;
-	    }
-	}
+        for (int i = 0; i < readOps.size(); ++i) {
+            KVObject obj = objects.get(i);
+            IMultiEntryOperation entry = readOps.get(i);
+            if ( entry.hasSucceeded() ) {
+                if ( !obj.deserialize(entry.getValue(), entry.getVersion()) ) {
+                    //deserialize return true on success
+                    failExists = true;
+                    log.error("MultiRead error, failed to deserialize {}, {}", obj.getTable(), obj);
+                }
+            } else {
+                log.error("MultiRead error, skipping {}, {}", obj.getTable(), obj);
+                obj.version = obj.getTable().VERSION_NONEXISTENT();
+                failExists = true;
+            }
+        }
 
-	return failExists;
+        return failExists;
     }
 
     /**
@@ -339,131 +339,131 @@
      */
     public static class WriteOp implements IMultiObjectOperation, IModifiableMultiEntryOperation {
 
-	private final IModifiableMultiEntryOperation base;
-	private final KVObject obj;
+        private final IModifiableMultiEntryOperation base;
+        private final KVObject obj;
 
-	public WriteOp(IMultiEntryOperation base, final KVObject obj) {
-	    this.base = (IModifiableMultiEntryOperation) base;
-	    this.obj = obj;
+        public WriteOp(IMultiEntryOperation base, final KVObject obj) {
+            this.base = (IModifiableMultiEntryOperation) base;
+            this.obj = obj;
 
-	    //	    switch (base.getOperation()) {
-	    //	    case CREATE:
-	    //	    case FORCE_CREATE:
-	    //	    case UPDATE:
-	    //		break;
-	    //	    default:
-	    //		throw new UnsupportedOperationException("Unexpected OPERATION:"+base.getOperation());
-	    //	    }
-	}
+            //	    switch (base.getOperation()) {
+            //	    case CREATE:
+            //	    case FORCE_CREATE:
+            //	    case UPDATE:
+            //		break;
+            //	    default:
+            //		throw new UnsupportedOperationException("Unexpected OPERATION:"+base.getOperation());
+            //	    }
+        }
 
-	@Override
-	public KVObject getObject() {
-	    return obj;
-	}
+        @Override
+        public KVObject getObject() {
+            return obj;
+        }
 
-	@Deprecated
-	public OPERATION getOp() {
-	    return this.getOperation();
-	}
+        @Deprecated
+        public OPERATION getOp() {
+            return this.getOperation();
+        }
 
-	@Override
-	public boolean hasSucceeded() {
-	    return base.hasSucceeded();
-	}
+        @Override
+        public boolean hasSucceeded() {
+            return base.hasSucceeded();
+        }
 
-	@Override
-	public STATUS getStatus() {
-	    return base.getStatus();
-	}
+        @Override
+        public STATUS getStatus() {
+            return base.getStatus();
+        }
 
-	@Override
-	public IKVTableID getTableId() {
-	    return base.getTableId();
-	}
+        @Override
+        public IKVTableID getTableId() {
+            return base.getTableId();
+        }
 
-	@Override
-	public byte[] getKey() {
-	    return base.getKey();
-	}
+        @Override
+        public byte[] getKey() {
+            return base.getKey();
+        }
 
-	@Override
-	public byte[] getValue() {
-	    return base.getValue();
-	}
+        @Override
+        public byte[] getValue() {
+            return base.getValue();
+        }
 
-	@Override
-	public long getVersion() {
-	    return base.getVersion();
-	}
+        @Override
+        public long getVersion() {
+            return base.getVersion();
+        }
 
-	@Override
-	public OPERATION getOperation() {
-	    return base.getOperation();
-	}
+        @Override
+        public OPERATION getOperation() {
+            return base.getOperation();
+        }
 
-	@Override
-	public void setStatus(STATUS status) {
-	    base.setStatus(status);
-	}
+        @Override
+        public void setStatus(STATUS status) {
+            base.setStatus(status);
+        }
 
-	@Override
-	public void setValue(byte[] value, long version) {
-	    base.setValue(value, version);
-	}
+        @Override
+        public void setValue(byte[] value, long version) {
+            base.setValue(value, version);
+        }
 
-	@Override
-	public void setVersion(long version) {
-	    base.setVersion(version);
-	    this.obj.version = version;
-	}
+        @Override
+        public void setVersion(long version) {
+            base.setVersion(version);
+            this.obj.version = version;
+        }
 
-	@Override
-	public IModifiableMultiEntryOperation getActualOperation() {
-	    return base;
-	}
+        @Override
+        public IModifiableMultiEntryOperation getActualOperation() {
+            return base;
+        }
     }
 
     public static boolean multiWrite(final List<WriteOp> objects) {
 
-	final IKVClient client = DataStoreClient.getClient();
+        final IKVClient client = DataStoreClient.getClient();
 
-	final ArrayList<IMultiEntryOperation> writeOps = new ArrayList<>(objects.size());
-	for (WriteOp o : objects) {
-	    writeOps.add(o);
-	}
+        final ArrayList<IMultiEntryOperation> writeOps = new ArrayList<>(objects.size());
+        for (WriteOp o : objects) {
+            writeOps.add(o);
+        }
 
-	return client.multiWrite(writeOps);
+        return client.multiWrite(writeOps);
     }
 
     public abstract static class AbstractObjectIterator<E extends KVObject> implements
     Iterator<E> {
 
-	protected Iterator<IKVEntry> enumerator;
+        protected Iterator<IKVEntry> enumerator;
 
-	public AbstractObjectIterator(final IKVTable table) {
-	    this.enumerator = table.getAllEntries().iterator();
-	}
+        public AbstractObjectIterator(final IKVTable table) {
+            this.enumerator = table.getAllEntries().iterator();
+        }
 
-	@Override
-	public boolean hasNext() {
-	    return enumerator.hasNext();
-	}
+        @Override
+        public boolean hasNext() {
+            return enumerator.hasNext();
+        }
 
-	// Implement something similar to below to realize Iterator
-	//	@Override
-	//	public E next() {
-	//	    IKVTable.IKVEntry o = enumerator.next();
-	//	    E obj = E.createFromKey(o.getKey());
-	//	    obj.deserialize(o.getValue(), o.getVersion());
-	//	    return obj;
-	//	}
+        // Implement something similar to below to realize Iterator
+        //	@Override
+        //	public E next() {
+        //	    IKVTable.IKVEntry o = enumerator.next();
+        //	    E obj = E.createFromKey(o.getKey());
+        //	    obj.deserialize(o.getValue(), o.getVersion());
+        //	    return obj;
+        //	}
 
-	@Deprecated
-	@Override
-	public void remove() {
-	    // TODO Not implemented, as I cannot find a use-case for it.
-	    throw new UnsupportedOperationException("Not implemented yet");
-	}
+        @Deprecated
+        @Override
+        public void remove() {
+            // TODO Not implemented, as I cannot find a use-case for it.
+            throw new UnsupportedOperationException("Not implemented yet");
+        }
 
     }
 
