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);
     }
 
