diff --git a/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java b/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java
index f725248..5398eb8 100644
--- a/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java
+++ b/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java
@@ -1,6 +1,5 @@
 package net.onrc.onos.core.datastore.hazelcast;
 
-import java.io.FileNotFoundException;
 import java.util.Collection;
 import java.util.List;
 
@@ -18,17 +17,10 @@
 import net.onrc.onos.core.datastore.hazelcast.HZTable.VersionedValue;
 import net.onrc.onos.core.datastore.internal.IModifiableMultiEntryOperation;
 import net.onrc.onos.core.datastore.utils.ByteArrayUtil;
-import net.onrc.onos.core.util.serializers.HazelcastSerializationConstants;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.hazelcast.client.HazelcastClient;
-import com.hazelcast.client.config.ClientConfig;
 import com.hazelcast.config.Config;
-import com.hazelcast.config.FileSystemXmlConfig;
-import com.hazelcast.config.MapConfig;
-import com.hazelcast.config.SerializationConfig;
 import com.hazelcast.core.Hazelcast;
 import com.hazelcast.core.HazelcastInstance;
 import com.hazelcast.core.IAtomicLong;
@@ -46,15 +38,6 @@
 
     private static final String BASE_CONFIG_FILENAME =
             System.getProperty("net.onrc.onos.core.datastore.hazelcast.baseConfig", "conf/hazelcast.xml");
-    private static final String HAZELCAST_DEFAULT_XML = "conf/hazelcast.default.xml";
-
-    // XXX Remove this mode at some point
-    private static boolean useClientMode = Boolean.parseBoolean(
-            System.getProperty("net.onrc.onos.core.datastore.hazelcast.clientMode", "true"));
-
-    // Note: xml configuration will overwrite this value if present
-    private static int backupCount = Integer.parseInt(
-            System.getProperty("net.onrc.onos.core.datastore.hazelcast.backupCount", "3"));
 
     private final HazelcastInstance hazelcastInstance;
 
@@ -77,122 +60,10 @@
     private HZClient() {
         Config config = HazelcastDatagrid.loadHazelcastConfig(BASE_CONFIG_FILENAME);
         // Try to get the existing HZ instance in JVM if possible.
-        HazelcastInstance instance = Hazelcast.getOrCreateHazelcastInstance(config);
-        if (instance == null) {
-            log.error("Failed to get the Hazelcast instance in JVM. "
-                    + "Probably DataStoreClient was requested before "
-                    + "IDatagridService was started "
-                    + "or running as part of unit tests. "
-                    + "Creating instance on it's own.");
-            instance = getFallbackHZinstance(BASE_CONFIG_FILENAME);
-        }
-        hazelcastInstance = instance;
+        hazelcastInstance = Hazelcast.getOrCreateHazelcastInstance(config);
     }
 
     /**
-     * Get or create the hazelcast instance to use for datastore, when existing
-     * Hazelcast instance cannot be retrieved.
-     * <p/>
-     *
-     * @param hazelcastConfigFileName Hazelcast configuration to use when creating a
-     * @return HazelcastInstance to use for datastore
-     */
-    private static HazelcastInstance getFallbackHZinstance(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);
-            // Fallback mechanism to support running unit test without setup.
-            log.error("Falling back to default Hazelcast XML {}", HAZELCAST_DEFAULT_XML);
-            try {
-                baseHzConfig = new FileSystemXmlConfig(HAZELCAST_DEFAULT_XML);
-            } catch (FileNotFoundException e2) {
-                log.error("Error opening fall back Hazelcast XML configuration. "
-                        + "File not found: " + HAZELCAST_DEFAULT_XML, e2);
-
-                // intentionally throwing Exception "e" thrown from non-fallback
-                // Hazelcast configuration loading.
-                throw new IllegalStateException("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();
-        }
-
-        HazelcastInstance instance = null;
-        // TODO Client mode should be removed at some point.
-        // we can get HZ instance used by ONOS using getHazelcastInstanceByName
-        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.core.datastore.hazelcast.client.server", "localhost");
-            clientConfig.getNetworkConfig().addAddress(server + ":" + port);
-
-            // client mode connection limit.
-            // set to 0 for fast fall back to Instance mode.
-            String sAttempts = System.getProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit");
-            if (sAttempts != null) {
-                clientConfig.getNetworkConfig().setConnectionAttemptLimit(Integer.parseInt(sAttempts));
-            }
-
-            // 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
-
-            registerSerializer(clientConfig.getSerializationConfig());
-
-            log.info("Starting Hazelcast datastore client for [{}]", clientConfig.getNetworkConfig().getAddresses());
-
-            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);
-
-        registerSerializer(baseHzConfig.getSerializationConfig());
-
-        return Hazelcast.newHazelcastInstance(baseHzConfig);
-    }
-
-    /**
-     * Register serializer for VersionedValue class used to imitate value version.
-     *
-     * @param config SerializationConfig to add VersionedValueSerializableFactory.
-     */
-    private static void registerSerializer(final SerializationConfig config) {
-        // TODO remove this function at some point.
-        // This method is no longer required, if equibalent to the following
-        // is defined in hazelcast.xml
-        config.addDataSerializableFactoryClass(
-                HazelcastSerializationConstants.VERSIONED_VALUE_SERIALIZABLE_FACTORY_ID,
-                VersionedValueSerializableFactory.class);
-    }
-
-
-    /**
      * Gets the HazelcastInstance object.
      *
      * @return HazelcastInstance
@@ -205,24 +76,6 @@
     public IKVTable getTable(final String 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 (config.getBackupCount() != backupCount) {
-                config.setAsyncBackupCount(0);
-                config.setBackupCount(backupCount);
-            }
-        }
-
         return new HZTable(tableName, map);
     }
 
diff --git a/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java b/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java
index 9003bc6..b641e98 100644
--- a/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java
+++ b/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java
@@ -18,11 +18,6 @@
 
 public class ArpCacheTest {
 
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
-
     private static final int SHORTENED_TIMEOUT_MS = 500;
 
     ArpCache arpCache;
diff --git a/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java b/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
index 29bb95a..901a14e 100644
--- a/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
+++ b/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
@@ -55,11 +55,6 @@
 @SuppressWarnings({ "rawtypes", "unchecked" })
 public class ProxyArpManagerTest {
 
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
-
     String defaultStrAgingMsec = "60000";
     String defaultStrCleanupMsec = "60000";
 
diff --git a/src/test/java/net/onrc/onos/core/datastore/AtomicCounterTest.java b/src/test/java/net/onrc/onos/core/datastore/AtomicCounterTest.java
index c2d4aa3..1de9322 100644
--- a/src/test/java/net/onrc/onos/core/datastore/AtomicCounterTest.java
+++ b/src/test/java/net/onrc/onos/core/datastore/AtomicCounterTest.java
@@ -22,11 +22,6 @@
 
 public class AtomicCounterTest {
 
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
-
     private static final String TEST_COUNTER = "TestCounter" + UUID.randomUUID();
     private static final byte[] LONG_ZERO = {0, 0, 0, 0, 0, 0, 0, 0}; // 0L
     private IKVTableID counterID;
diff --git a/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZDistributedAtomicLongTest.java b/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZDistributedAtomicLongTest.java
index fbfc058..4813672 100644
--- a/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZDistributedAtomicLongTest.java
+++ b/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZDistributedAtomicLongTest.java
@@ -25,10 +25,6 @@
  * Test cases for HZDistributedAtomicLong.
  */
 public class HZDistributedAtomicLongTest {
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
 
     static final String TEST_COUNTER_NAME = "Counter" + UUID.randomUUID();
 
diff --git a/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZTableTest.java b/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZTableTest.java
index 3f43e38..f1e157d 100644
--- a/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZTableTest.java
+++ b/src/test/java/net/onrc/onos/core/datastore/hazelcast/HZTableTest.java
@@ -31,11 +31,6 @@
     @Rule
     public TestName name = new TestName();
 
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
-
     static final String TEST_TABLE_NAME = "TableForUnitTest" + UUID.randomUUID();
     HZTable table;
 
diff --git a/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java b/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java
index bbef22e..a62ce61 100644
--- a/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java
+++ b/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java
@@ -27,11 +27,6 @@
 
     private static final Logger log = LoggerFactory.getLogger(KVSwitchTest.class);
 
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
-
     private static final String NAMESPACE = UUID.randomUUID().toString();
 
     IKVTable switchTable;
diff --git a/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java b/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java
index 0085e09..e934ed0 100644
--- a/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java
+++ b/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java
@@ -39,11 +39,6 @@
 
     private static final Logger log = LoggerFactory.getLogger(KVTopologyTest.class);
 
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
-
     static final long VERSION_NONEXISTENT = DataStoreClient.getClient().getVersionNonexistant();
 
     private static final byte[] DEVICE2_MAC_SW2P2 = new byte[]{6, 5, 4, 3, 2, 1, 0};
diff --git a/src/test/java/net/onrc/onos/core/util/distributed/sharedlog/example/LogAtomicLongTest.java b/src/test/java/net/onrc/onos/core/util/distributed/sharedlog/example/LogAtomicLongTest.java
index 91fd2be..cd94eba 100644
--- a/src/test/java/net/onrc/onos/core/util/distributed/sharedlog/example/LogAtomicLongTest.java
+++ b/src/test/java/net/onrc/onos/core/util/distributed/sharedlog/example/LogAtomicLongTest.java
@@ -23,12 +23,6 @@
  */
 public class LogAtomicLongTest {
 
-    static {
-        // configuration to quickly fall back to instance mode for faster test run
-        System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
-    }
-
-
     private LogAtomicLong along;
 
     /**
