You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by st...@apache.org on 2020/07/23 04:50:33 UTC

[phoenix] branch master updated: PHOENIX-6016 Support HBase 2.3.0

This is an automated email from the ASF dual-hosted git repository.

stoty pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/master by this push:
     new a8d6ba0  PHOENIX-6016 Support HBase 2.3.0
a8d6ba0 is described below

commit a8d6ba036bc15eb66004a99e88a5d8a4fd1cab4c
Author: Istvan Toth <st...@apache.org>
AuthorDate: Fri Jul 17 07:51:20 2020 +0200

    PHOENIX-6016 Support HBase 2.3.0
---
 phoenix-core/pom.xml                               |  25 ++++
 ...WALReplayWithIndexWritesAndCompressedWALIT.java |  17 +--
 .../phoenix/end2end/BackwardCompatibilityIT.java   |   3 +
 .../apache/phoenix/end2end/PermissionsCacheIT.java |   4 +-
 .../apache/phoenix/end2end/index/LocalIndexIT.java |  29 +++--
 .../it/resources/compatible_client_versions.json   |   4 +-
 .../regionserver/IndexHalfStoreFileReader.java     |   6 +-
 .../IndexHalfStoreFileReaderGenerator.java         |   4 +-
 .../coprocessor/PhoenixAccessController.java       |   3 +-
 .../org/apache/phoenix/execute/DelegateHTable.java |   6 +-
 .../iterate/TableSnapshotResultIterator.java       |   4 +-
 .../phoenix/mapreduce/MultiHfileOutputFormat.java  |  24 ++--
 .../phoenix/mapreduce/index/IndexScrutinyTool.java |   3 +-
 .../apache/phoenix/mapreduce/index/IndexTool.java  |  11 +-
 .../phoenix/transaction/OmidTransactionTable.java  |   4 +-
 .../recovery/TestPerRegionIndexWriteCache.java     |   4 +-
 .../phoenix/jdbc/PhoenixEmbeddedDriverTest.java    |  13 +-
 .../phoenix/compat/hbase/CompatDelegateHTable.java |  20 +--
 .../compat/hbase/CompatOmidTransactionTable.java   |  13 +-
 .../phoenix/compat/hbase/CompatPermissionUtil.java |   8 +-
 .../compat/hbase/CompatPhoenixRpcScheduler.java    |  23 ++--
 .../compat/hbase/CompatStoreFileReader.java        |  29 ++---
 .../apache/phoenix/compat/hbase/CompatUtil.java    |  37 ++++--
 .../phoenix/compat/hbase/CompatDelegateHTable.java |  20 +--
 .../compat/hbase/CompatOmidTransactionTable.java   |  13 +-
 .../phoenix/compat/hbase/CompatPermissionUtil.java |   6 +
 .../compat/hbase/CompatPhoenixRpcScheduler.java    |  23 ++--
 ...{CompatUtil.java => CompatStoreFileReader.java} |  29 ++---
 .../apache/phoenix/compat/hbase/CompatUtil.java    |  36 ++++--
 phoenix-hbase-compat-2.3.0/pom.xml                 |  88 +++++++++++++
 .../phoenix/compat/hbase/CompatDelegateHTable.java |  27 ++--
 .../compat/hbase/CompatOmidTransactionTable.java   |  21 ++--
 .../phoenix/compat/hbase/CompatPermissionUtil.java |   9 +-
 .../compat/hbase/CompatPhoenixRpcScheduler.java    |  23 ++--
 .../compat/hbase/CompatStoreFileReader.java        |  48 +++++++
 .../apache/phoenix/compat/hbase/CompatUtil.java    |  72 +++++++++++
 .../apache/phoenix/compat/hbase/OffsetCell.java    | 136 ++++++++++++++++++++
 .../phoenix/compat/hbase/test/DelegateCell.java    | 139 +++++++++++++++++++++
 pom.xml                                            |  55 ++++++--
 39 files changed, 837 insertions(+), 202 deletions(-)

diff --git a/phoenix-core/pom.xml b/phoenix-core/pom.xml
index 66386ad..1eece7f 100644
--- a/phoenix-core/pom.xml
+++ b/phoenix-core/pom.xml
@@ -140,6 +140,13 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <ignoredUsedUndeclaredDependencies>
+            <ignoredUsedUndeclaredDependency>
+              dnsjava:dnsjava
+            </ignoredUsedUndeclaredDependency>
+          </ignoredUsedUndeclaredDependencies>
+        </configuration>
         <executions>
           <execution>
             <!-- generates the file that will be used by the sandbox script in the dev env -->
@@ -493,6 +500,24 @@
 
   </dependencies>
 
+<profiles>
+  <profile>
+    <id>phoenix-hbase-compat-2.3.0</id>
+    <!-- keep dependency plugin happy -->
+    <activation>
+      <property>
+        <name>hbase.profile</name>
+        <value>2.3</value>
+      </property>
+    </activation>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.zookeeper</groupId>
+        <artifactId>zookeeper-jute</artifactId>
+      </dependency>
+    </dependencies>
+  </profile>
+</profiles>
   <reporting>
       <plugins>
           <plugin>
diff --git a/phoenix-core/src/it/java/org/apache/hadoop/hbase/regionserver/wal/WALReplayWithIndexWritesAndCompressedWALIT.java b/phoenix-core/src/it/java/org/apache/hadoop/hbase/regionserver/wal/WALReplayWithIndexWritesAndCompressedWALIT.java
index 0314289..12618dd 100644
--- a/phoenix-core/src/it/java/org/apache/hadoop/hbase/regionserver/wal/WALReplayWithIndexWritesAndCompressedWALIT.java
+++ b/phoenix-core/src/it/java/org/apache/hadoop/hbase/regionserver/wal/WALReplayWithIndexWritesAndCompressedWALIT.java
@@ -52,7 +52,7 @@ import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.regionserver.RegionServerAccounting;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.wal.WAL;
 import org.apache.hadoop.hbase.wal.WALFactory;
 import org.apache.hadoop.hbase.wal.WALSplitter;
@@ -176,11 +176,14 @@ public class WALReplayWithIndexWritesAndCompressedWALIT {
    */
 @Test
   public void testReplayEditsWrittenViaHRegion() throws Exception {
-    final String tableNameStr = "testReplayEditsWrittenViaHRegion";
-    final RegionInfo hri = RegionInfoBuilder.newBuilder(org.apache.hadoop.hbase.TableName.valueOf(tableNameStr)).setSplit(false).build();
-    final Path basedir = FSUtils.getTableDir(hbaseRootDir, org.apache.hadoop.hbase.TableName.valueOf(tableNameStr));
-    deleteDir(basedir);
-    final TableDescriptor htd = createBasic3FamilyHTD(tableNameStr);
+      final String tableNameStr = "testReplayEditsWrittenViaHRegion";
+      final RegionInfo hri =
+              RegionInfoBuilder.newBuilder(TableName.valueOf(tableNameStr))
+                      .setSplit(false).build();
+      final Path basedir =
+              CommonFSUtils.getTableDir(hbaseRootDir, TableName.valueOf(tableNameStr));
+      deleteDir(basedir);
+      final TableDescriptor htd = createBasic3FamilyHTD(tableNameStr);
     
     //setup basic indexing for the table
     // enable indexing to a non-existant index table
@@ -234,7 +237,7 @@ public class WALReplayWithIndexWritesAndCompressedWALIT {
             ConnectionFactory.createConnection(UTIL.getConfiguration());
 
     // now check to ensure that we wrote to the index table
-    Table index = hbaseConn.getTable(org.apache.hadoop.hbase.TableName.valueOf(INDEX_TABLE_NAME));
+    Table index = hbaseConn.getTable(TableName.valueOf(INDEX_TABLE_NAME));
     int indexSize = getKeyValueCount(index);
     assertEquals("Index wasn't propertly updated from WAL replay!", 1, indexSize);
     Get g = new Get(rowkey);
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java
index fde2f69..8dae498 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java
@@ -106,6 +106,7 @@ public class BackwardCompatibilityIT {
     private static HBaseTestingUtility hbaseTestUtil;
     private static String zkQuorum;
     private static String url;
+    private String tmpDir;
 
     public BackwardCompatibilityIT(String compatibleClientVersion) {
         this.compatibleClientVersion = compatibleClientVersion;
@@ -118,6 +119,7 @@ public class BackwardCompatibilityIT {
 
     @Before
     public synchronized void doSetup() throws Exception {
+        tmpDir = System.getProperty("java.io.tmpdir");
         conf = HBaseConfiguration.create();
         hbaseTestUtil = new HBaseTestingUtility(conf);
         setUpConfigForMiniCluster(conf);
@@ -136,6 +138,7 @@ public class BackwardCompatibilityIT {
         } finally {
             hbaseTestUtil.shutdownMiniCluster();
         }
+        System.setProperty("java.io.tmpdir", tmpDir);
     }
     
     private static List<String> computeClientVersions() throws Exception {
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/PermissionsCacheIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/PermissionsCacheIT.java
index 2833a23..fb3e550 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/PermissionsCacheIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/PermissionsCacheIT.java
@@ -27,13 +27,13 @@ import java.util.List;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.AuthUtil;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.hadoop.hbase.security.access.AccessControlLists;
 import org.apache.hadoop.hbase.security.access.Permission;
 import org.apache.hadoop.hbase.security.access.Permission.Action;
 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
 import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
 import org.apache.hadoop.hbase.zookeeper.ZNodePaths;
 import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;
+import org.apache.phoenix.compat.hbase.CompatUtil;
 import org.apache.phoenix.util.SchemaUtil;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -89,7 +89,7 @@ public class PermissionsCacheIT extends BasePermissionsIT {
             String tableZNode = ZNodePaths.joinZNode(aclZNode, "@" + schema);
             byte[] data = ZKUtil.getData(zkw, tableZNode);
             ListMultimap<String, ? extends Permission> userPermissions =
-                    AccessControlLists.readPermissions(data, conf);
+                    CompatUtil.readPermissions(data, conf);
             assertTrue("User permissions not found in cache:",
                 userPermissions.containsKey(regularUser1.getName()));
             List<? extends Permission> tablePermissions =
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
index 0be30c2..724da6e 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
@@ -53,7 +53,7 @@ import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.coprocessor.BaseScannerRegionObserver;
@@ -1039,17 +1039,22 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         conn1.close();
     }
 
-    private void copyLocalIndexHFiles(Configuration conf, RegionInfo fromRegion, RegionInfo toRegion, boolean move)
-            throws IOException {
-        Path root = FSUtils.getRootDir(conf);
-
-        Path seondRegion = new Path(FSUtils.getTableDir(root, fromRegion.getTable()) + Path.SEPARATOR
-                + fromRegion.getEncodedName() + Path.SEPARATOR + "L#0/");
-        Path hfilePath = FSUtils.getCurrentFileSystem(conf).listFiles(seondRegion, true).next().getPath();
-        Path firstRegionPath = new Path(FSUtils.getTableDir(root, toRegion.getTable()) + Path.SEPARATOR
-                + toRegion.getEncodedName() + Path.SEPARATOR + "L#0/");
-        FileSystem currentFileSystem = FSUtils.getCurrentFileSystem(conf);
-        assertTrue(FileUtil.copy(currentFileSystem, hfilePath, currentFileSystem, firstRegionPath, move, conf));
+    private void copyLocalIndexHFiles(Configuration conf, RegionInfo fromRegion,
+            RegionInfo toRegion, boolean move) throws IOException {
+        Path root = CommonFSUtils.getRootDir(conf);
+
+        Path seondRegion =
+                new Path(CommonFSUtils.getTableDir(root, fromRegion.getTable()) + Path.SEPARATOR
+                        + fromRegion.getEncodedName() + Path.SEPARATOR + "L#0/");
+        Path hfilePath =
+                CommonFSUtils.getCurrentFileSystem(conf).listFiles(seondRegion, true).next()
+                        .getPath();
+        Path firstRegionPath =
+                new Path(CommonFSUtils.getTableDir(root, toRegion.getTable()) + Path.SEPARATOR
+                        + toRegion.getEncodedName() + Path.SEPARATOR + "L#0/");
+        FileSystem currentFileSystem = CommonFSUtils.getCurrentFileSystem(conf);
+        assertTrue(FileUtil.copy(currentFileSystem, hfilePath, currentFileSystem, firstRegionPath,
+            move, conf));
     }
 
     private int getCount(PhoenixConnection conn, String tableName, String columnFamily)
diff --git a/phoenix-core/src/it/resources/compatible_client_versions.json b/phoenix-core/src/it/resources/compatible_client_versions.json
index 810265c..692cb38 100644
--- a/phoenix-core/src/it/resources/compatible_client_versions.json
+++ b/phoenix-core/src/it/resources/compatible_client_versions.json
@@ -20,7 +20,7 @@
     "1.3": ["4.14.3", "4.15.0"],
     "1.4": ["4.14.3", "4.15.0"],
     "1.5": ["4.15.0"],
-    "2.0": ["5.1.0"],
     "2.1": ["5.1.0"],
-    "2.2": ["5.1.0"]
+    "2.2": ["5.1.0"],
+    "2.3": ["5.1.0"]
 }
diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java
index f4e9354..99ba0ff 100644
--- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java
+++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java
@@ -35,6 +35,7 @@ import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.io.Reference;
 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.compat.hbase.CompatStoreFileReader;
 import org.apache.phoenix.index.IndexMaintainer;
 
 /**
@@ -52,7 +53,7 @@ import org.apache.phoenix.index.IndexMaintainer;
  * This file is not splitable. Calls to {@link #midkey()} return null.
  */
 
-public class IndexHalfStoreFileReader extends StoreFileReader {
+public class IndexHalfStoreFileReader extends CompatStoreFileReader {
     private final boolean top;
     // This is the key we split around. Its the first possible entry on a row:
     // i.e. empty column and a timestamp of LATEST_TIMESTAMP.
@@ -88,8 +89,7 @@ public class IndexHalfStoreFileReader extends StoreFileReader {
             final byte[][] viewConstants, final RegionInfo regionInfo,
             byte[] regionStartKeyInHFile, byte[] splitKey, boolean primaryReplicaStoreFile,
             AtomicInteger refCount, RegionInfo currentRegion) throws IOException {
-        super(fs, p, in, size, cacheConf, primaryReplicaStoreFile, refCount, false,
-                conf);
+        super(fs, p, in, size, cacheConf, primaryReplicaStoreFile, refCount, conf);
         this.splitkey = splitKey == null ? r.getSplitKey() : splitKey;
         // Is it top or bottom half?
         this.top = Reference.isTopFileRegion(r.getFileRegion());
diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java
index 680eb3f..cdf0a2b 100644
--- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java
+++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java
@@ -53,8 +53,6 @@ import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;
 import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.Pair;
-import org.apache.phoenix.compat.hbase.CompatUtil;
 import org.apache.phoenix.index.IndexMaintainer;
 import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.query.QueryConstants;
@@ -118,7 +116,7 @@ public class IndexHalfStoreFileReaderGenerator implements RegionObserver, Region
                 }
                 if (result == null || result.isEmpty()) {
                     List<RegionInfo> mergeRegions =
-                            CompatUtil.getMergeRegions(ctx.getEnvironment().getConnection(),
+                            MetaTableAccessor.getMergeRegions(ctx.getEnvironment().getConnection(),
                                 region.getRegionInfo().getRegionName());
                     if (mergeRegions == null || mergeRegions.isEmpty()){
                         return reader;
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java
index 8acc42f..18787ec 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java
@@ -153,12 +153,13 @@ public class PhoenixAccessController extends BaseMetaDataEndpointObserver {
                     "Not a valid environment, should be loaded by PhoenixMetaDataControllerEnvironment");
         }
 
+        //2.3+ doesn't need to access ZK object.
         ZKWatcher zk = null;
         RegionCoprocessorEnvironment regionEnv = this.env.getRegionCoprocessorEnvironment();
         if (regionEnv instanceof HasRegionServerServices) {
             zk = ((HasRegionServerServices) regionEnv).getRegionServerServices().getZooKeeper();
         }
-        accessChecker = new AccessChecker(env.getConfiguration(), zk);
+        accessChecker = CompatPermissionUtil.newAccessChecker(env.getConfiguration(), zk);
         // set the user-provider.
         this.userProvider = UserProvider.instantiate(env.getConfiguration());
         // init superusers and add the server principal (if using security)
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateHTable.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateHTable.java
index c953c8d..5b0b268 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateHTable.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateHTable.java
@@ -43,17 +43,17 @@ import org.apache.hadoop.hbase.client.coprocessor.Batch.Call;
 import org.apache.hadoop.hbase.client.coprocessor.Batch.Callback;
 import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
 import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
+import org.apache.phoenix.compat.hbase.CompatDelegateHTable;
 
 import com.google.protobuf.Descriptors.MethodDescriptor;
 import com.google.protobuf.Message;
 import com.google.protobuf.Service;
 import com.google.protobuf.ServiceException;
 
-public class DelegateHTable implements Table {
-    protected final Table delegate;
+public class DelegateHTable extends CompatDelegateHTable implements Table {
 
     public DelegateHTable(Table delegate) {
-        this.delegate = delegate;
+        super(delegate);
     }
 
     @Override
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableSnapshotResultIterator.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableSnapshotResultIterator.java
index 5063ae7..09355bb 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableSnapshotResultIterator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableSnapshotResultIterator.java
@@ -33,7 +33,7 @@ import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper;
-import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.phoenix.mapreduce.util.PhoenixConfigurationUtil;
 import org.apache.phoenix.monitoring.ScanMetricsHolder;
 import org.apache.phoenix.schema.tuple.Tuple;
@@ -80,7 +80,7 @@ public class TableSnapshotResultIterator implements ResultIterator {
         UUID.randomUUID().toString());
     this.snapshotName = configuration.get(
         PhoenixConfigurationUtil.SNAPSHOT_NAME_KEY);
-    this.rootDir = FSUtils.getRootDir(configuration);
+    this.rootDir = CommonFSUtils.getRootDir(configuration);
     this.fs = rootDir.getFileSystem(configuration);
     init();
   }
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/MultiHfileOutputFormat.java b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/MultiHfileOutputFormat.java
index f4458ce..3216dcf 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/MultiHfileOutputFormat.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/MultiHfileOutputFormat.java
@@ -72,6 +72,7 @@ import org.apache.hadoop.mapreduce.TaskAttemptContext;
 import org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter;
 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 import org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner;
+import org.apache.phoenix.compat.hbase.CompatUtil;
 import org.apache.phoenix.mapreduce.bulkload.TableRowkeyPair;
 import org.apache.phoenix.mapreduce.bulkload.TargetTableRef;
 import org.apache.phoenix.mapreduce.bulkload.TargetTableRefFunctions;
@@ -227,14 +228,14 @@ public class MultiHfileOutputFormat extends FileOutputFormat<TableRowkeyPair, Ce
               WriterLength wl = new WriterLength();
               Path tableOutputPath = CsvBulkImportUtil.getOutputPath(outputdir, tableName);
               Path familydir = new Path(tableOutputPath, Bytes.toString(family));
-            
+
               // phoenix-2216: start : fetching the configuration properties that were set to the table.
               // create a map from column family to the compression algorithm for the table.
               final Map<byte[], Algorithm> compressionMap = createFamilyCompressionMap(conf,tableName);
               final Map<byte[], BloomType> bloomTypeMap = createFamilyBloomTypeMap(conf,tableName);
               final Map<byte[], Integer> blockSizeMap = createFamilyBlockSizeMap(conf,tableName);
               // phoenix-2216: end
-            
+
               String dataBlockEncodingStr = conf.get(DATABLOCK_ENCODING_OVERRIDE_CONF_KEY);
               final Map<byte[], DataBlockEncoding> datablockEncodingMap = createFamilyDataBlockEncodingMap(conf,tableName);
               final DataBlockEncoding overriddenEncoding;
@@ -243,7 +244,7 @@ public class MultiHfileOutputFormat extends FileOutputFormat<TableRowkeyPair, Ce
               } else {
                   overriddenEncoding = null;
               }
-            
+
               Algorithm compression = compressionMap.get(family);
               compression = compression == null ? defaultCompression : compression;
               BloomType bloomType = bloomTypeMap.get(family);
@@ -259,14 +260,17 @@ public class MultiHfileOutputFormat extends FileOutputFormat<TableRowkeyPair, Ce
                                         .withCompression(compression)
                                         .withChecksumType(HStore.getChecksumType(conf))
                                         .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))
-                                        .withBlockSize(blockSize);
-              contextBuilder.withDataBlockEncoding(encoding);
+                                        .withBlockSize(blockSize)
+                                        .withDataBlockEncoding(encoding);
+              CompatUtil.withComparator(contextBuilder, CellComparatorImpl.COMPARATOR);
               HFileContext hFileContext = contextBuilder.build();
-                                        
-              wl.writer = new StoreFileWriter.Builder(conf, new CacheConfig(tempConf), fs)
-                .withOutputDir(familydir).withBloomType(bloomType)
-                .withComparator(CellComparatorImpl.COMPARATOR)
-                .withFileContext(hFileContext).build();
+
+                StoreFileWriter.Builder storeFileWriterBuilder =
+                        new StoreFileWriter.Builder(conf, new CacheConfig(tempConf), fs)
+                                .withOutputDir(familydir).withBloomType(bloomType)
+                                .withFileContext(hFileContext);
+              CompatUtil.withComparator(storeFileWriterBuilder, CellComparatorImpl.COMPARATOR);
+              wl.writer = storeFileWriterBuilder.build();
 
               // join and put it in the writers map .
               // phoenix-2216: start : holds a map of writers where the 
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexScrutinyTool.java b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexScrutinyTool.java
index 29fddf7..fd856fb 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexScrutinyTool.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexScrutinyTool.java
@@ -42,6 +42,7 @@ import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.mapreduce.Job;
@@ -327,7 +328,7 @@ public class IndexScrutinyTool extends Configured implements Tool {
                 }
                 // root dir not a subdirectory of hbase dir
                 Path rootDir = new Path("hdfs:///index-snapshot-dir");
-                FSUtils.setRootDir(configuration, rootDir);
+                CommonFSUtils.setRootDir(configuration, rootDir);
 
                 // set input for map reduce job using hbase snapshots
                 //PhoenixMapReduceUtil.setInput(job, PhoenixIndexDBWritable.class, snapshotName,
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexTool.java b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexTool.java
index 55eccba..0e3e5d8 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexTool.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexTool.java
@@ -51,15 +51,12 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.ConnectionFactory;
 import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.HBaseAdmin;
-import org.apache.hadoop.hbase.client.HTable;
 import org.apache.hadoop.hbase.client.RegionLocator;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
@@ -69,7 +66,7 @@ import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
 import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
 import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.io.IntWritable;
 import org.apache.hadoop.io.NullWritable;
 import org.apache.hadoop.mapreduce.Job;
@@ -94,8 +91,6 @@ import org.apache.phoenix.mapreduce.util.PhoenixConfigurationUtil;
 import org.apache.phoenix.mapreduce.util.PhoenixMapReduceUtil;
 import org.apache.phoenix.parse.HintNode.Hint;
 import org.apache.phoenix.query.ConnectionQueryServices;
-import org.apache.phoenix.query.HConnectionFactory;
-import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.query.QueryServicesOptions;
 import org.apache.phoenix.schema.PIndexState;
@@ -658,8 +653,8 @@ public class IndexTool extends Configured implements Tool {
                 }
                 // root dir not a subdirectory of hbase dir
                 Path rootDir = new Path("hdfs:///index-snapshot-dir");
-                FSUtils.setRootDir(configuration, rootDir);
-                Path restoreDir = new Path(FSUtils.getRootDir(configuration), "restore-dir");
+                CommonFSUtils.setRootDir(configuration, rootDir);
+                Path restoreDir = new Path(CommonFSUtils.getRootDir(configuration), "restore-dir");
 
                 // set input for map reduce job using hbase snapshots
                 PhoenixMapReduceUtil
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/transaction/OmidTransactionTable.java b/phoenix-core/src/main/java/org/apache/phoenix/transaction/OmidTransactionTable.java
index 5749d83..886ca60 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/transaction/OmidTransactionTable.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/transaction/OmidTransactionTable.java
@@ -47,6 +47,7 @@ import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
 import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
 import org.apache.omid.transaction.TTable;
 import org.apache.omid.transaction.Transaction;
+import org.apache.phoenix.compat.hbase.CompatOmidTransactionTable;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.exception.SQLExceptionInfo;
 
@@ -55,7 +56,7 @@ import com.google.protobuf.Message;
 import com.google.protobuf.Service;
 import com.google.protobuf.ServiceException;
 
-public class OmidTransactionTable implements Table {
+public class OmidTransactionTable extends CompatOmidTransactionTable implements Table {
     // Copied from HBase ProtobufUtil since it's not accessible
     final static Result EMPTY_RESULT_EXISTS_TRUE = Result.create(null, true);
 
@@ -375,4 +376,5 @@ public class OmidTransactionTable implements Table {
     public long getOperationTimeout(TimeUnit unit) {
         throw new UnsupportedOperationException();
     }
+
 }
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/hbase/index/write/recovery/TestPerRegionIndexWriteCache.java b/phoenix-core/src/test/java/org/apache/phoenix/hbase/index/write/recovery/TestPerRegionIndexWriteCache.java
index 0ff7f29..d043f2c 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/hbase/index/write/recovery/TestPerRegionIndexWriteCache.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/hbase/index/write/recovery/TestPerRegionIndexWriteCache.java
@@ -40,7 +40,7 @@ import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.wal.WAL;
 import org.apache.hadoop.hbase.wal.WALFactory;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
@@ -102,7 +102,7 @@ public class TestPerRegionIndexWriteCache {
 
       FileSystem newFS = miniDfs.getFileSystem();
       RegionInfo hri = RegionInfoBuilder.newBuilder(tableName).setStartKey(null).setEndKey(null).setSplit(false).build();
-      Path basedir = FSUtils.getTableDir(hbaseRootDir, tableName);
+      Path basedir = CommonFSUtils.getTableDir(hbaseRootDir, tableName);
       Random rn = new Random();
       tableName = TableName.valueOf("TestPerRegion" + rn.nextInt());
       WALFactory walFactory = new WALFactory(TEST_UTIL.getConfiguration(), getClass().getSimpleName());
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixEmbeddedDriverTest.java b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixEmbeddedDriverTest.java
index ba64892..1cc3f3f 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixEmbeddedDriverTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixEmbeddedDriverTest.java
@@ -26,13 +26,20 @@ import java.sql.Driver;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.phoenix.exception.SQLExceptionCode;
 import org.apache.phoenix.jdbc.PhoenixEmbeddedDriver.ConnectionInfo;
+import org.apache.phoenix.query.HBaseFactoryProvider;
 import org.junit.Test;
 
 public class PhoenixEmbeddedDriverTest {
     @Test
     public void testGetConnectionInfo() throws SQLException {
+        Configuration config =
+                HBaseFactoryProvider.getConfigurationFactory().getConfiguration();
+        String defaultQuorum = config.get(HConstants.ZOOKEEPER_QUORUM);
+
         String[] urls = new String[] {
             null,
             "",
@@ -73,9 +80,9 @@ public class PhoenixEmbeddedDriverTest {
             "jdbc:phoenix:v1,v2,v3:345:/hbase:user1:C:\\Documents and Settings\\user1\\user1.keytab;test=false",
         };
         ConnectionInfo[] infos = new ConnectionInfo[] {
-            new ConnectionInfo("localhost",2181,"/hbase"),
-            new ConnectionInfo("localhost",2181,"/hbase"),
-            new ConnectionInfo("localhost",2181,"/hbase"),
+            new ConnectionInfo(defaultQuorum, 2181, "/hbase"),
+            new ConnectionInfo(defaultQuorum, 2181, "/hbase"),
+            new ConnectionInfo(defaultQuorum, 2181, "/hbase"),
             new ConnectionInfo(null,null,null),
             new ConnectionInfo("localhost",null,null),
             new ConnectionInfo("localhost",null,null),
diff --git a/phoenix-core/src/it/resources/compatible_client_versions.json b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
similarity index 67%
copy from phoenix-core/src/it/resources/compatible_client_versions.json
copy to phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
index 810265c..a55ae5b 100644
--- a/phoenix-core/src/it/resources/compatible_client_versions.json
+++ b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
@@ -15,12 +15,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-{
-    "_comment": "Lists all phoenix compatible client versions against the current branch version for a given hbase profile If hbase profile is 1.3, phoenix client versions 4.14.3 and 4.15.0 are tested against current branch version",
-    "1.3": ["4.14.3", "4.15.0"],
-    "1.4": ["4.14.3", "4.15.0"],
-    "1.5": ["4.15.0"],
-    "2.0": ["5.1.0"],
-    "2.1": ["5.1.0"],
-    "2.2": ["5.1.0"]
+package org.apache.phoenix.compat.hbase;
+
+import org.apache.hadoop.hbase.client.Table;
+
+public abstract class CompatDelegateHTable implements Table {
+
+    protected final Table delegate;
+
+    public CompatDelegateHTable(Table delegate) {
+        this.delegate = delegate;
+    }
+
 }
diff --git a/phoenix-core/src/it/resources/compatible_client_versions.json b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
similarity index 67%
copy from phoenix-core/src/it/resources/compatible_client_versions.json
copy to phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
index 810265c..d01868b 100644
--- a/phoenix-core/src/it/resources/compatible_client_versions.json
+++ b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
@@ -15,12 +15,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-{
-    "_comment": "Lists all phoenix compatible client versions against the current branch version for a given hbase profile If hbase profile is 1.3, phoenix client versions 4.14.3 and 4.15.0 are tested against current branch version",
-    "1.3": ["4.14.3", "4.15.0"],
-    "1.4": ["4.14.3", "4.15.0"],
-    "1.5": ["4.15.0"],
-    "2.0": ["5.1.0"],
-    "2.1": ["5.1.0"],
-    "2.2": ["5.1.0"]
+package org.apache.phoenix.compat.hbase;
+
+import org.apache.hadoop.hbase.client.Table;
+
+public abstract class CompatOmidTransactionTable implements Table {
 }
diff --git a/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
index fdf572c..78068ab 100644
--- a/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
+++ b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
@@ -19,6 +19,7 @@ package org.apache.phoenix.compat.hbase;
 
 import java.io.IOException;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.security.access.AccessChecker;
@@ -26,11 +27,16 @@ import org.apache.hadoop.hbase.security.access.Permission;
 import org.apache.hadoop.hbase.security.access.TableAuthManager;
 import org.apache.hadoop.hbase.security.access.UserPermission;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
 
 public class CompatPermissionUtil {
 
     private CompatPermissionUtil() {
-        //Nott to be instantiated
+        //Not to be instantiated
+    }
+
+    public static AccessChecker newAccessChecker(final Configuration conf, ZKWatcher zk) {
+        return new AccessChecker(conf, zk);
     }
 
     public static void stopAccessChecker(AccessChecker accessChecker) throws IOException {
diff --git a/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
index af25975..ff296f3 100644
--- a/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
+++ b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
@@ -1,12 +1,19 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
- * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
- * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
- * for the specific language governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.apache.phoenix.compat.hbase;
 
diff --git a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
similarity index 55%
copy from phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
copy to phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
index 4a9090c..9867ac6 100644
--- a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
+++ b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
@@ -18,25 +18,22 @@
 package org.apache.phoenix.compat.hbase;
 
 import java.io.IOException;
-import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.MetaTableAccessor;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper;
+import org.apache.hadoop.hbase.io.hfile.CacheConfig;
+import org.apache.hadoop.hbase.regionserver.StoreFileReader;
 
-public class CompatUtil {
+public class CompatStoreFileReader extends StoreFileReader {
 
-    private CompatUtil() {
-        //Not to be instantiated
-    }
-
-    public static List<RegionInfo> getMergeRegions(Connection conn, byte[] regionName)
+    public CompatStoreFileReader(final FileSystem fs, final Path p,
+            final FSDataInputStreamWrapper in, long size, final CacheConfig cacheConf,
+            boolean primaryReplicaStoreFile, AtomicInteger refCount, final Configuration conf)
             throws IOException {
-        return MetaTableAccessor.getMergeRegions(conn, regionName);
+        super(fs, p, in, size, cacheConf, primaryReplicaStoreFile, refCount, false, conf);
     }
 
-    public static int getCellSerializedSize(Cell cell) {
-        return cell.getSerializedSize();
-    }
-}
+}
\ No newline at end of file
diff --git a/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
index 61dfeec..7b9d36a 100644
--- a/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
+++ b/phoenix-hbase-compat-2.1.6/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
@@ -17,26 +17,39 @@
  */
 package org.apache.phoenix.compat.hbase;
 
-import java.io.IOException;
-import java.util.List;
-
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.MetaTableAccessor;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.CellComparatorImpl;
+
+import org.apache.hadoop.hbase.exceptions.DeserializationException;
+import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;
+import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
+import org.apache.hadoop.hbase.security.access.AccessControlLists;
+import org.apache.hadoop.hbase.security.access.Permission;
+import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;
 
 public class CompatUtil {
 
     private CompatUtil() {
-        //Not to be instantiated
-    }
-
-    public static List<RegionInfo> getMergeRegions(Connection conn, byte[] regionName) 
-            throws IOException {
-        return MetaTableAccessor.getMergeRegions(conn, regionName);
+        // Not to be instantiated
     }
 
     public static int getCellSerializedSize(Cell cell) {
         return org.apache.hadoop.hbase.KeyValueUtil.length(cell);
     }
+
+    public static ListMultimap<String, ? extends Permission> readPermissions(byte[] data,
+            Configuration conf) throws DeserializationException {
+        return AccessControlLists.readPermissions(data, conf);
+    }
+
+    public static HFileContextBuilder withComparator(HFileContextBuilder contextBuilder,
+            CellComparatorImpl cellComparator) {
+        return contextBuilder;
+    }
+
+    public static StoreFileWriter.Builder withComparator(StoreFileWriter.Builder builder,
+            CellComparatorImpl cellComparator) {
+        return builder.withComparator(cellComparator);
+    }
 }
diff --git a/phoenix-core/src/it/resources/compatible_client_versions.json b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
similarity index 67%
copy from phoenix-core/src/it/resources/compatible_client_versions.json
copy to phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
index 810265c..a55ae5b 100644
--- a/phoenix-core/src/it/resources/compatible_client_versions.json
+++ b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
@@ -15,12 +15,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-{
-    "_comment": "Lists all phoenix compatible client versions against the current branch version for a given hbase profile If hbase profile is 1.3, phoenix client versions 4.14.3 and 4.15.0 are tested against current branch version",
-    "1.3": ["4.14.3", "4.15.0"],
-    "1.4": ["4.14.3", "4.15.0"],
-    "1.5": ["4.15.0"],
-    "2.0": ["5.1.0"],
-    "2.1": ["5.1.0"],
-    "2.2": ["5.1.0"]
+package org.apache.phoenix.compat.hbase;
+
+import org.apache.hadoop.hbase.client.Table;
+
+public abstract class CompatDelegateHTable implements Table {
+
+    protected final Table delegate;
+
+    public CompatDelegateHTable(Table delegate) {
+        this.delegate = delegate;
+    }
+
 }
diff --git a/phoenix-core/src/it/resources/compatible_client_versions.json b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
similarity index 67%
copy from phoenix-core/src/it/resources/compatible_client_versions.json
copy to phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
index 810265c..d01868b 100644
--- a/phoenix-core/src/it/resources/compatible_client_versions.json
+++ b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
@@ -15,12 +15,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-{
-    "_comment": "Lists all phoenix compatible client versions against the current branch version for a given hbase profile If hbase profile is 1.3, phoenix client versions 4.14.3 and 4.15.0 are tested against current branch version",
-    "1.3": ["4.14.3", "4.15.0"],
-    "1.4": ["4.14.3", "4.15.0"],
-    "1.5": ["4.15.0"],
-    "2.0": ["5.1.0"],
-    "2.1": ["5.1.0"],
-    "2.2": ["5.1.0"]
+package org.apache.phoenix.compat.hbase;
+
+import org.apache.hadoop.hbase.client.Table;
+
+public abstract class CompatOmidTransactionTable implements Table {
 }
diff --git a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
index 84b304b..4a13cfd 100644
--- a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
+++ b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
@@ -19,11 +19,13 @@ package org.apache.phoenix.compat.hbase;
 
 import java.io.IOException;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.security.access.AccessChecker;
 import org.apache.hadoop.hbase.security.access.Permission;
 import org.apache.hadoop.hbase.security.access.UserPermission;
+import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
 
 public class CompatPermissionUtil {
 
@@ -31,6 +33,10 @@ public class CompatPermissionUtil {
         //Not to be instantiated
     }
 
+    public static AccessChecker newAccessChecker(final Configuration conf, ZKWatcher zk) {
+        return new AccessChecker(conf, zk);
+    }
+
     public static void stopAccessChecker(AccessChecker accessChecker) throws IOException {
         accessChecker.stop();
     }
diff --git a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
index 059a39e..13d69a7 100644
--- a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
+++ b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
@@ -1,12 +1,19 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
- * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
- * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
- * for the specific language governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.apache.phoenix.compat.hbase;
 
diff --git a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
similarity index 55%
copy from phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
copy to phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
index 4a9090c..9867ac6 100644
--- a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
+++ b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
@@ -18,25 +18,22 @@
 package org.apache.phoenix.compat.hbase;
 
 import java.io.IOException;
-import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.MetaTableAccessor;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper;
+import org.apache.hadoop.hbase.io.hfile.CacheConfig;
+import org.apache.hadoop.hbase.regionserver.StoreFileReader;
 
-public class CompatUtil {
+public class CompatStoreFileReader extends StoreFileReader {
 
-    private CompatUtil() {
-        //Not to be instantiated
-    }
-
-    public static List<RegionInfo> getMergeRegions(Connection conn, byte[] regionName)
+    public CompatStoreFileReader(final FileSystem fs, final Path p,
+            final FSDataInputStreamWrapper in, long size, final CacheConfig cacheConf,
+            boolean primaryReplicaStoreFile, AtomicInteger refCount, final Configuration conf)
             throws IOException {
-        return MetaTableAccessor.getMergeRegions(conn, regionName);
+        super(fs, p, in, size, cacheConf, primaryReplicaStoreFile, refCount, false, conf);
     }
 
-    public static int getCellSerializedSize(Cell cell) {
-        return cell.getSerializedSize();
-    }
-}
+}
\ No newline at end of file
diff --git a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
index 4a9090c..b2cefe4 100644
--- a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
+++ b/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
@@ -17,26 +17,38 @@
  */
 package org.apache.phoenix.compat.hbase;
 
-import java.io.IOException;
-import java.util.List;
-
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.MetaTableAccessor;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.CellComparatorImpl;
+import org.apache.hadoop.hbase.exceptions.DeserializationException;
+import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;
+import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
+import org.apache.hadoop.hbase.security.access.AccessControlLists;
+import org.apache.hadoop.hbase.security.access.Permission;
+import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;
 
 public class CompatUtil {
 
     private CompatUtil() {
-        //Not to be instantiated
-    }
-
-    public static List<RegionInfo> getMergeRegions(Connection conn, byte[] regionName)
-            throws IOException {
-        return MetaTableAccessor.getMergeRegions(conn, regionName);
+        // Not to be instantiated
     }
 
     public static int getCellSerializedSize(Cell cell) {
         return cell.getSerializedSize();
     }
+
+    public static ListMultimap<String, ? extends Permission> readPermissions(byte[] data,
+            Configuration conf) throws DeserializationException {
+        return AccessControlLists.readPermissions(data, conf);
+    }
+
+    public static HFileContextBuilder withComparator(HFileContextBuilder contextBuilder,
+            CellComparatorImpl cellComparator) {
+        return contextBuilder;
+    }
+
+    public static StoreFileWriter.Builder withComparator(StoreFileWriter.Builder builder,
+            CellComparatorImpl cellComparator) {
+        return builder.withComparator(cellComparator);
+    }
 }
diff --git a/phoenix-hbase-compat-2.3.0/pom.xml b/phoenix-hbase-compat-2.3.0/pom.xml
new file mode 100644
index 0000000..045c793
--- /dev/null
+++ b/phoenix-hbase-compat-2.3.0/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project
+  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation=
+    "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+    <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>21</version>
+  </parent>
+  <groupId>org.apache.phoenix</groupId>
+  <artifactId>phoenix-hbase-compat-2.3.0</artifactId>
+  <version>5.1.0-SNAPSHOT</version>
+  <name>Phoenix Hbase 2.3.0 compatibility</name>
+  <description>Compatibility module for HBase 2.3.0+</description>
+
+  <build>
+    <plugins>
+      <!-- Setup eclipse -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-eclipse-plugin</artifactId>
+        <version>2.9</version>
+        <configuration>
+          <buildcommands>
+            <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
+          </buildcommands>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+       <!-- HBase dependencies -->
+      <dependency>
+        <groupId>org.apache.hbase</groupId>
+        <artifactId>hbase-client</artifactId>
+        <version>2.3.0</version>
+        <scope>provided</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.hbase</groupId>
+        <artifactId>hbase-common</artifactId>
+        <version>2.3.0</version>
+        <scope>provided</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.hbase</groupId>
+        <artifactId>hbase-server</artifactId>
+        <version>2.3.0</version>
+        <scope>provided</scope>
+      </dependency>
+  </dependencies>
+
+  <reporting>
+      <plugins>
+          <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-project-info-reports-plugin</artifactId>
+          </plugin>
+          <plugin>
+              <groupId>org.codehaus.mojo</groupId>
+              <artifactId>findbugs-maven-plugin</artifactId>
+          </plugin>
+      </plugins>
+  </reporting>
+</project>
diff --git a/phoenix-core/src/it/resources/compatible_client_versions.json b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
similarity index 62%
copy from phoenix-core/src/it/resources/compatible_client_versions.json
copy to phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
index 810265c..770e858 100644
--- a/phoenix-core/src/it/resources/compatible_client_versions.json
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatDelegateHTable.java
@@ -15,12 +15,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-{
-    "_comment": "Lists all phoenix compatible client versions against the current branch version for a given hbase profile If hbase profile is 1.3, phoenix client versions 4.14.3 and 4.15.0 are tested against current branch version",
-    "1.3": ["4.14.3", "4.15.0"],
-    "1.4": ["4.14.3", "4.15.0"],
-    "1.5": ["4.15.0"],
-    "2.0": ["5.1.0"],
-    "2.1": ["5.1.0"],
-    "2.2": ["5.1.0"]
+package org.apache.phoenix.compat.hbase;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hbase.client.RegionLocator;
+import org.apache.hadoop.hbase.client.Table;
+
+public abstract class CompatDelegateHTable implements Table {
+
+    protected final Table delegate;
+
+    public CompatDelegateHTable(Table delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public RegionLocator getRegionLocator() throws IOException {
+        return delegate.getRegionLocator();
+    }
 }
diff --git a/phoenix-core/src/it/resources/compatible_client_versions.json b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
similarity index 67%
copy from phoenix-core/src/it/resources/compatible_client_versions.json
copy to phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
index 810265c..e1396ca 100644
--- a/phoenix-core/src/it/resources/compatible_client_versions.json
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatOmidTransactionTable.java
@@ -15,12 +15,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-{
-    "_comment": "Lists all phoenix compatible client versions against the current branch version for a given hbase profile If hbase profile is 1.3, phoenix client versions 4.14.3 and 4.15.0 are tested against current branch version",
-    "1.3": ["4.14.3", "4.15.0"],
-    "1.4": ["4.14.3", "4.15.0"],
-    "1.5": ["4.15.0"],
-    "2.0": ["5.1.0"],
-    "2.1": ["5.1.0"],
-    "2.2": ["5.1.0"]
+package org.apache.phoenix.compat.hbase;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hbase.client.RegionLocator;
+import org.apache.hadoop.hbase.client.Table;
+
+public abstract class CompatOmidTransactionTable implements Table {
+
+    @Override
+    public RegionLocator getRegionLocator() throws IOException {
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
similarity index 87%
copy from phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
copy to phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
index 84b304b..80a99b3 100644
--- a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatPermissionUtil.java
@@ -19,11 +19,13 @@ package org.apache.phoenix.compat.hbase;
 
 import java.io.IOException;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.security.access.AccessChecker;
 import org.apache.hadoop.hbase.security.access.Permission;
 import org.apache.hadoop.hbase.security.access.UserPermission;
+import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
 
 public class CompatPermissionUtil {
 
@@ -31,8 +33,13 @@ public class CompatPermissionUtil {
         //Not to be instantiated
     }
 
+    public static AccessChecker newAccessChecker(final Configuration conf, ZKWatcher zk) {
+        //Ignore ZK parameter
+        return new AccessChecker(conf);
+    }
+
     public static void stopAccessChecker(AccessChecker accessChecker) throws IOException {
-        accessChecker.stop();
+        //NOOP
     }
 
     public static String getUserFromUP(UserPermission userPermission) {
diff --git a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
similarity index 57%
copy from phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
copy to phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
index 059a39e..13d69a7 100644
--- a/phoenix-hbase-compat-2.2.1/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatPhoenixRpcScheduler.java
@@ -1,12 +1,19 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
- * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
- * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
- * for the specific language governing permissions and limitations under the License.
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.apache.phoenix.compat.hbase;
 
diff --git a/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
new file mode 100644
index 0000000..03aa257
--- /dev/null
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatStoreFileReader.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.compat.hbase;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.fs.HFileSystem;
+import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper;
+import org.apache.hadoop.hbase.io.hfile.CacheConfig;
+import org.apache.hadoop.hbase.io.hfile.HFileInfo;
+import org.apache.hadoop.hbase.io.hfile.ReaderContext;
+import org.apache.hadoop.hbase.io.hfile.ReaderContext.ReaderType;
+import org.apache.hadoop.hbase.regionserver.StoreFileReader;
+
+public class CompatStoreFileReader extends StoreFileReader {
+
+    public CompatStoreFileReader(final FileSystem fs, final Path p,
+            final FSDataInputStreamWrapper in, long size, final CacheConfig cacheConf,
+            boolean primaryReplicaStoreFile, AtomicInteger refCount, final Configuration conf)
+            throws IOException {
+        super(new ReaderContext(p, in, size, new HFileSystem(fs), primaryReplicaStoreFile,
+                ReaderType.STREAM),
+                new HFileInfo(new ReaderContext(p, in, size, new HFileSystem(fs),
+                        primaryReplicaStoreFile, ReaderType.STREAM), conf),
+                cacheConf, refCount, conf);
+        getHFileReader().getHFileInfo().initMetaAndIndex(getHFileReader());
+    }
+
+}
\ No newline at end of file
diff --git a/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
new file mode 100644
index 0000000..efe6efb
--- /dev/null
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/CompatUtil.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.compat.hbase;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
+import org.apache.hadoop.hbase.exceptions.DeserializationException;
+import org.apache.hadoop.hbase.io.compress.Compression.Algorithm;
+import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
+import org.apache.hadoop.hbase.io.hfile.HFileContext;
+import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;
+import org.apache.hadoop.hbase.regionserver.HStore;
+import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
+import org.apache.hadoop.hbase.security.access.Permission;
+import org.apache.hadoop.hbase.security.access.PermissionStorage;
+import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;
+
+
+public class CompatUtil {
+
+    private CompatUtil() {
+        //Not to be instantiated
+    }
+
+    public static int getCellSerializedSize(Cell cell) {
+        return cell.getSerializedSize();
+    }
+
+    public static ListMultimap<String, ? extends Permission> readPermissions(
+            byte[] data, Configuration conf) throws DeserializationException {
+        return PermissionStorage.readPermissions(data, conf);
+    }
+
+    public static HFileContext createHFileContext(Configuration conf, Algorithm compression,
+            Integer blockSize, DataBlockEncoding encoding, CellComparator comparator) {
+
+        return new HFileContextBuilder()
+            .withCompression(compression)
+            .withChecksumType(HStore.getChecksumType(conf))
+            .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))
+            .withBlockSize(blockSize)
+            .withDataBlockEncoding(encoding)
+            .build();
+    }
+
+    public static HFileContextBuilder withComparator(HFileContextBuilder contextBuilder,
+            CellComparatorImpl cellComparator) {
+        return contextBuilder.withCellComparator(cellComparator);
+    }
+
+    public static StoreFileWriter.Builder withComparator(StoreFileWriter.Builder builder,
+            CellComparatorImpl cellComparator) {
+        return builder;
+    }
+}
diff --git a/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/OffsetCell.java b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/OffsetCell.java
new file mode 100644
index 0000000..c5485a5
--- /dev/null
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/OffsetCell.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.compat.hbase;
+
+import org.apache.hadoop.hbase.Cell;
+
+public class OffsetCell implements Cell {
+
+    private Cell cell;
+    private int offset;
+
+    public OffsetCell(Cell cell, int offset) {
+        this.cell = cell;
+        this.offset = offset;
+    }
+
+    @Override
+    public byte[] getRowArray() {
+        return cell.getRowArray();
+    }
+
+    @Override
+    public int getRowOffset() {
+        return cell.getRowOffset() + offset;
+    }
+
+    @Override
+    public short getRowLength() {
+        return (short) (cell.getRowLength() - offset);
+    }
+
+    @Override
+    public byte[] getFamilyArray() {
+        return cell.getFamilyArray();
+    }
+
+    @Override
+    public int getFamilyOffset() {
+        return cell.getFamilyOffset();
+    }
+
+    @Override
+    public byte getFamilyLength() {
+        return cell.getFamilyLength();
+    }
+
+    @Override
+    public byte[] getQualifierArray() {
+        return cell.getQualifierArray();
+    }
+
+    @Override
+    public int getQualifierOffset() {
+        return cell.getQualifierOffset();
+    }
+
+    @Override
+    public int getQualifierLength() {
+        return cell.getQualifierLength();
+    }
+
+    @Override
+    public long getTimestamp() {
+        return cell.getTimestamp();
+    }
+
+    @Override
+    public byte getTypeByte() {
+        return cell.getTypeByte();
+    }
+
+    @Override public long getSequenceId() {
+        return cell.getSequenceId();
+    }
+
+    @Override
+    public byte[] getValueArray() {
+        return cell.getValueArray();
+    }
+
+    @Override
+    public int getValueOffset() {
+        return cell.getValueOffset();
+    }
+
+    @Override
+    public int getValueLength() {
+        return cell.getValueLength();
+    }
+
+    @Override
+    public byte[] getTagsArray() {
+        return cell.getTagsArray();
+    }
+
+    @Override
+    public int getTagsOffset() {
+        return cell.getTagsOffset();
+    }
+
+    @Override
+    public int getTagsLength() {
+        return cell.getTagsLength();
+    }
+
+    @Override
+    public Type getType() {
+        return cell.getType();
+    }
+
+    @Override
+    public long heapSize() {
+        return cell.heapSize();
+    }
+
+    @Override
+    public int getSerializedSize() {
+        return cell.getSerializedSize() - offset;
+    }
+
+}
diff --git a/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/test/DelegateCell.java b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/test/DelegateCell.java
new file mode 100644
index 0000000..0c7dfd8
--- /dev/null
+++ b/phoenix-hbase-compat-2.3.0/src/main/java/org/apache/phoenix/compat/hbase/test/DelegateCell.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.compat.hbase.test;
+
+import org.apache.hadoop.hbase.Cell;
+
+public class DelegateCell implements Cell {
+    private final Cell delegate;
+    private final String name;
+    public DelegateCell(Cell delegate, String name) {
+        this.delegate = delegate;
+        this.name = name;
+    }
+
+    @Override
+    public int getValueOffset() {
+        return delegate.getValueOffset();
+    }
+
+    @Override
+    public int getValueLength() {
+        return delegate.getValueLength();
+    }
+
+    @Override
+    public byte[] getValueArray() {
+        return delegate.getValueArray();
+    }
+
+    @Override
+    public byte getTypeByte() {
+        return delegate.getTypeByte();
+    }
+
+    @Override
+    public long getTimestamp() {
+        return delegate.getTimestamp();
+    }
+
+    @Override
+    public int getTagsOffset() {
+        return delegate.getTagsOffset();
+    }
+
+    @Override
+    public byte[] getTagsArray() {
+        return delegate.getTagsArray();
+    }
+
+    @Override
+    public int getRowOffset() {
+        return delegate.getRowOffset();
+    }
+
+    @Override
+    public short getRowLength() {
+        return delegate.getRowLength();
+    }
+
+    @Override
+    public byte[] getRowArray() {
+        return delegate.getRowArray();
+    }
+
+    @Override
+    public int getQualifierOffset() {
+        return delegate.getQualifierOffset();
+    }
+
+    @Override
+    public int getQualifierLength() {
+        return delegate.getQualifierLength();
+    }
+
+    @Override
+    public byte[] getQualifierArray() {
+        return delegate.getQualifierArray();
+    }
+
+    @Override
+    public int getFamilyOffset() {
+        return delegate.getFamilyOffset();
+    }
+
+    @Override
+    public byte getFamilyLength() {
+        return delegate.getFamilyLength();
+    }
+
+    @Override
+    public byte[] getFamilyArray() {
+        return delegate.getFamilyArray();
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+
+    @Override
+    public long getSequenceId() {
+        return delegate.getSequenceId();
+    }
+
+    @Override
+    public int getTagsLength() {
+        return delegate.getTagsLength();
+    }
+
+    @Override
+    public Type getType() {
+        return delegate.getType();
+    }
+
+    @Override
+    public long heapSize() {
+        return delegate.heapSize();
+    }
+
+    @Override
+    public int getSerializedSize() {
+        return delegate.getSerializedSize();
+    }
+}
diff --git a/pom.xml b/pom.xml
index c6c755a..63d1def 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,6 +40,7 @@
   </organization>
 
   <modules>
+    <module>phoenix-hbase-compat-2.3.0</module>
     <module>phoenix-hbase-compat-2.2.1</module>
     <module>phoenix-hbase-compat-2.1.6</module>
     <module>phoenix-core</module>
@@ -436,20 +437,15 @@
                    hbasePatch = Integer.parseInt(versionMatcher.group(3));
 
                    hbaseMajor == 2 &amp;&amp; (
-                     ("${hbase.compat.version}".equals("2.0.1")
-                       &amp;&amp; hbaseMinor == 0
-                       &amp;&amp; hbasePatch &gt;=1
-                       &amp;&amp; hbasePatch &lt;=4)
-                     || ("${hbase.compat.version}".equals("2.0.1")
-                       &amp;&amp; hbaseMinor == 1
-                       &amp;&amp; hbasePatch &gt;=1
-                       &amp;&amp; hbasePatch &lt;=2)
-                     || ("${hbase.compat.version}".equals("2.1.6")
+                     ("${hbase.compat.version}".equals("2.1.6")
                        &amp;&amp; hbaseMinor == 1
                        &amp;&amp; hbasePatch &gt;=6)
                      || ("${hbase.compat.version}".equals("2.2.1")
                        &amp;&amp; hbaseMinor == 2
                        &amp;&amp; hbasePatch &gt;=1)
+                     || ("${hbase.compat.version}".equals("2.3.0")
+                       &amp;&amp; hbaseMinor == 3
+                       &amp;&amp; hbasePatch &gt;=0)
                    )
                    </condition>
                   </evaluateBeanshell>
@@ -635,7 +631,11 @@
         <artifactId>phoenix-hbase-compat-2.2.1</artifactId>
         <version>${project.version}</version>
       </dependency>
-
+      <dependency>
+        <groupId>org.apache.phoenix</groupId>
+        <artifactId>phoenix-hbase-compat-2.3.0</artifactId>
+        <version>${project.version}</version>
+      </dependency>
       <!-- Intra-project test dependencies -->
       <dependency>
         <groupId>org.apache.phoenix</groupId>
@@ -1205,6 +1205,11 @@
         <version>${zookeeper.version}</version>
       </dependency>
       <dependency>
+        <groupId>org.apache.zookeeper</groupId>
+        <artifactId>zookeeper-jute</artifactId>
+        <version>${zookeeper.version}</version>
+      </dependency>
+      <dependency>
         <groupId>org.antlr</groupId>
         <artifactId>antlr-runtime</artifactId>
         <version>${antlr.version}</version>
@@ -1471,8 +1476,31 @@
       <properties>
         <hbase.profile>2.2</hbase.profile>
         <hbase.compat.version>2.2.1</hbase.compat.version>
-        <!-- PHOENIX-5993 HBase 2.2.5 public maven artifacts are incompatible with Hadoop 3 -->
         <hbase.version>2.2.4</hbase.version>
+        <!-- PHOENIX-5993 We should use this, if we could,
+        as 2.2.4 is not the latest version, Hadoop 3.0.3 is unsupported with Hbase 2.2.x
+        <hbase.version>2.2.5</hbase.version>
+        <hadoop.version>3.1.2</hadoop.version>
+        -->
+      </properties>
+    </profile>
+    <profile>
+      <!-- PHOENIX-5993 This  won't work with the public HBase artifacts -->
+      <id>phoenix-hbase-compat-2.3.0</id>
+      <activation>
+        <property>
+          <name>hbase.profile</name>
+          <value>2.3</value>
+        </property>
+      </activation>
+      <properties>
+        <hbase.profile>2.3</hbase.profile>
+        <hbase.compat.version>2.3.0</hbase.compat.version>
+        <hbase.version>2.3.0</hbase.version>
+        <!-- PHOENIX-6010 3.1.3 doesn't work because of Guava rebase -->
+        <hadoop.version>3.1.2</hadoop.version>
+        <hbase.thirdparty.version>3.3.0</hbase.thirdparty.version>
+        <zookeeper.version>3.5.7</zookeeper.version>
       </properties>
     </profile>
     <profile>
@@ -1486,8 +1514,11 @@
       <properties>
         <hbase.profile>2.2</hbase.profile>
         <hbase.compat.version>2.2.1</hbase.compat.version>
-        <!-- PHOENIX-5993 HBase 2.2.5 public maven artifacts are incompatible with Hadoop 3 -->
         <hbase.version>2.2.4</hbase.version>
+        <!-- PHOENIX-5993 We should use this, if we could
+        <hbase.version>2.2.5</hbase.version>
+        <hadoop.version>3.1.2</hadoop.version>
+        -->
       </properties>
     </profile>
     <profile>