http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
index f6052a7..e710c82 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
@@ -57,9 +57,9 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
 import org.apache.hadoop.hbase.filter.PageFilter;
@@ -161,7 +161,7 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
     static final Function<HRegionLocation, KeyRange> TO_KEY_RANGE = new 
Function<HRegionLocation, KeyRange>() {
         @Override
         public KeyRange apply(HRegionLocation region) {
-            return KeyRange.getKeyRange(region.getRegionInfo().getStartKey(), 
region.getRegionInfo().getEndKey());
+            return KeyRange.getKeyRange(region.getRegion().getStartKey(), 
region.getRegion().getEndKey());
         }
     };
 
@@ -533,7 +533,7 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
         int nBoundaries = regionLocations.size() - 1;
         List<byte[]> ranges = Lists.newArrayListWithExpectedSize(nBoundaries);
         for (int i = 0; i < nBoundaries; i++) {
-            HRegionInfo regionInfo = regionLocations.get(i).getRegionInfo();
+            RegionInfo regionInfo = regionLocations.get(i).getRegion();
             ranges.add(regionInfo.getEndKey());
         }
         return ranges;
@@ -650,7 +650,7 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
         List<Scan> scans = Lists.newArrayListWithExpectedSize(2);
         while (regionIndex <= stopIndex) {
             HRegionLocation regionLocation = regionLocations.get(regionIndex);
-            HRegionInfo regionInfo = regionLocation.getRegionInfo();
+            RegionInfo regionInfo = regionLocation.getRegion();
             Scan newScan = ScanUtil.newScan(scan);
             byte[] endKey;
             if (regionIndex == stopIndex) {
@@ -727,7 +727,7 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
         if (stopKey.length > 0) {
             stopIndex = Math.min(stopIndex, regionIndex + 
getIndexContainingExclusive(regionBoundaries.subList(regionIndex, stopIndex), 
stopKey));
             if (isLocalIndex) {
-                stopKey = 
regionLocations.get(stopIndex).getRegionInfo().getEndKey();
+                stopKey = 
regionLocations.get(stopIndex).getRegion().getEndKey();
             }
         }
         List<List<Scan>> parallelScans = 
Lists.newArrayListWithExpectedSize(stopIndex - regionIndex + 1);
@@ -773,7 +773,7 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
             // Merge bisect with guideposts for all but the last region
             while (regionIndex <= stopIndex) {
                 HRegionLocation regionLocation = 
regionLocations.get(regionIndex);
-                HRegionInfo regionInfo = regionLocation.getRegionInfo();
+                RegionInfo regionInfo = regionLocation.getRegion();
                 byte[] currentGuidePostBytes = currentGuidePost.copyBytes();
                 byte[] endKey, endRegionKey = EMPTY_BYTE_ARRAY;
                 if (regionIndex == stopIndex) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/iterate/MapReduceParallelScanGrouper.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/MapReduceParallelScanGrouper.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/MapReduceParallelScanGrouper.java
index 593608f..f25d89d 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/MapReduceParallelScanGrouper.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/MapReduceParallelScanGrouper.java
@@ -22,15 +22,16 @@ import java.util.List;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
-import org.apache.hadoop.hbase.protobuf.generated.SnapshotProtos;
+import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
+import 
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;
+import 
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest;
 import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;
 import org.apache.hadoop.hbase.snapshot.SnapshotManifest;
 import org.apache.phoenix.compile.QueryPlan;
@@ -66,7 +67,7 @@ public class MapReduceParallelScanGrouper implements 
ParallelScanGrouper {
                                Path rootDir = new 
Path(conf.get(HConstants.HBASE_DIR));
                                FileSystem fs = rootDir.getFileSystem(conf);
                                Path snapshotDir = 
SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, rootDir);
-                               HBaseProtos.SnapshotDescription 
snapshotDescription = SnapshotDescriptionUtils.readSnapshotInfo(fs, 
snapshotDir);
+                               SnapshotDescription snapshotDescription = 
SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);
                                SnapshotManifest manifest = 
SnapshotManifest.open(conf, fs, snapshotDir, snapshotDescription);
                                return getRegionLocationsFromManifest(manifest);
                        }
@@ -80,14 +81,14 @@ public class MapReduceParallelScanGrouper implements 
ParallelScanGrouper {
        }
 
        private List<HRegionLocation> 
getRegionLocationsFromManifest(SnapshotManifest manifest) {
-               List<SnapshotProtos.SnapshotRegionManifest> regionManifests = 
manifest.getRegionManifests();
+               List<SnapshotRegionManifest> regionManifests = 
manifest.getRegionManifests();
                Preconditions.checkNotNull(regionManifests);
 
                List<HRegionLocation> regionLocations = 
Lists.newArrayListWithCapacity(regionManifests.size());
 
-               for (SnapshotProtos.SnapshotRegionManifest regionManifest : 
regionManifests) {
+               for (SnapshotRegionManifest regionManifest : regionManifests) {
                        regionLocations.add(new HRegionLocation(
-                                       
HRegionInfo.convert(regionManifest.getRegionInfo()), null));
+                                       
ProtobufUtil.toRegionInfo(regionManifest.getRegionInfo()), null));
                }
 
                return regionLocations;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java
index 3dcbef9..59f08ae 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java
@@ -21,6 +21,7 @@ package org.apache.phoenix.iterate;
 import com.google.common.collect.ImmutableList;
 
 import org.apache.hadoop.hbase.*;
+import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
@@ -105,7 +106,7 @@ public abstract class RegionScannerFactory {
     return new RegionScanner() {
 
       private boolean hasReferences = checkForReferenceFiles();
-      private HRegionInfo regionInfo = env.getRegionInfo();
+      private RegionInfo regionInfo = env.getRegionInfo();
       private byte[] actualStartKey = getActualStartKey();
 
       // If there are any reference files after local index region merge some 
cases we might
@@ -150,7 +151,7 @@ public abstract class RegionScannerFactory {
       }
 
       @Override
-      public HRegionInfo getRegionInfo() {
+      public RegionInfo getRegionInfo() {
         return s.getRegionInfo();
       }
 

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/iterate/SnapshotScanner.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/SnapshotScanner.java 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/SnapshotScanner.java
index c09b3c4..35f40ac 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/SnapshotScanner.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/SnapshotScanner.java
@@ -19,25 +19,35 @@
 package org.apache.phoenix.iterate;
 
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentMap;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.*;
-import org.apache.hadoop.hbase.client.*;
-
+import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.client.AbstractClientScanner;
+import org.apache.hadoop.hbase.client.Connection;
+import org.apache.hadoop.hbase.client.IsolationLevel;
+import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.client.Scan;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;
 import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
-import org.apache.hadoop.hbase.regionserver.*;
+import org.apache.hadoop.hbase.metrics.MetricRegistry;
+import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.regionserver.OnlineRegions;
+import org.apache.hadoop.hbase.regionserver.Region;
+import org.apache.hadoop.hbase.regionserver.RegionScanner;
 import org.apache.phoenix.coprocessor.BaseScannerRegionObserver;
 import org.apache.phoenix.schema.PTable;
-import org.apache.phoenix.util.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutorService;
+import org.apache.phoenix.util.EncodedColumnsUtil;
 
 public class SnapshotScanner extends AbstractClientScanner {
 
@@ -48,7 +58,7 @@ public class SnapshotScanner extends AbstractClientScanner {
   List<Cell> values;
 
   public SnapshotScanner(Configuration conf, FileSystem fs, Path rootDir,
-      HTableDescriptor htd, HRegionInfo hri,  Scan scan) throws Throwable{
+      TableDescriptor htd, RegionInfo hri,  Scan scan) throws Throwable{
 
     scan.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);
     values = new ArrayList<>();
@@ -119,16 +129,11 @@ public class SnapshotScanner extends 
AbstractClientScanner {
       }
 
       @Override
-      public HRegionInfo getRegionInfo() {
+      public RegionInfo getRegionInfo() {
         return region.getRegionInfo();
       }
 
       @Override
-      public RegionServerServices getRegionServerServices() {
-        throw new UnsupportedOperationException();
-      }
-
-      @Override
       public ConcurrentMap<String, Object> getSharedData() {
         throw new UnsupportedOperationException();
       }
@@ -144,11 +149,6 @@ public class SnapshotScanner extends AbstractClientScanner 
{
       }
 
       @Override
-      public Coprocessor getInstance() {
-        throw new UnsupportedOperationException();
-      }
-
-      @Override
       public int getPriority() {
         throw new UnsupportedOperationException();
       }
@@ -164,20 +164,34 @@ public class SnapshotScanner extends 
AbstractClientScanner {
       }
 
       @Override
-      public Table getTable(TableName tableName) throws IOException {
+      public ClassLoader getClassLoader() {
         throw new UnsupportedOperationException();
       }
 
-      @Override
-      public Table getTable(TableName tableName, ExecutorService 
executorService)
-          throws IOException {
+    @Override
+    public RegionCoprocessor getInstance() {
         throw new UnsupportedOperationException();
-      }
+    }
 
-      @Override
-      public ClassLoader getClassLoader() {
+    @Override
+    public OnlineRegions getOnlineRegions() {
         throw new UnsupportedOperationException();
-      }
+    }
+
+    @Override
+    public ServerName getServerName() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Connection getConnection() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public MetricRegistry getMetricRegistryForRegionServer() {
+        throw new UnsupportedOperationException();
+    }
     };
   }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/iterate/TableSnapshotResultIterator.java
----------------------------------------------------------------------
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 df60339..984cb84 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
@@ -18,13 +18,20 @@
 
 package org.apache.phoenix.iterate;
 
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HRegionInfo;
-import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.RegionInfo;
 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;
@@ -33,13 +40,6 @@ import org.apache.phoenix.monitoring.ScanMetricsHolder;
 import org.apache.phoenix.schema.tuple.Tuple;
 import org.apache.phoenix.util.ServerUtil;
 
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
 public class TableSnapshotResultIterator implements ResultIterator {
 
   private final Scan scan;
@@ -48,8 +48,8 @@ public class TableSnapshotResultIterator implements 
ResultIterator {
   private final ScanMetricsHolder scanMetricsHolder;
   private Tuple lastTuple = null;
   private static final ResultIterator UNINITIALIZED_SCANNER = 
ResultIterator.EMPTY_ITERATOR;
-  private ArrayList<HRegionInfo> regions;
-  private HTableDescriptor htd;
+  private ArrayList<RegionInfo> regions;
+  private TableDescriptor htd;
   private String snapshotName;
 
   private Path restoreDir;
@@ -83,14 +83,14 @@ public class TableSnapshotResultIterator implements 
ResultIterator {
     Iterator i$ = restoredRegions.iterator();
 
     while(i$.hasNext()) {
-      HRegionInfo hri = (HRegionInfo)i$.next();
+      RegionInfo hri = (RegionInfo)i$.next();
       if(CellUtil.overlappingKeys(this.scan.getStartRow(), 
this.scan.getStopRow(),
           hri.getStartKey(), hri.getEndKey())) {
         this.regions.add(hri);
       }
     }
 
-    Collections.sort(this.regions);
+    Collections.sort(this.regions,RegionInfo.COMPARATOR);
   }
 
   public boolean initSnapshotScanner() throws SQLException {
@@ -103,7 +103,7 @@ public class TableSnapshotResultIterator implements 
ResultIterator {
       if (this.currentRegion >= this.regions.size())
         return false;
       try {
-        HRegionInfo hri = regions.get(this.currentRegion);
+        RegionInfo hri = regions.get(this.currentRegion);
         this.scanIterator =
             new ScanningResultIterator(new SnapshotScanner(configuration, fs, 
restoreDir, htd, hri, scan),
                 scan, scanMetricsHolder);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/parse/CreateTableStatement.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/parse/CreateTableStatement.java 
b/phoenix-core/src/main/java/org/apache/phoenix/parse/CreateTableStatement.java
index 73b7a11..2d9629d 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/parse/CreateTableStatement.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/parse/CreateTableStatement.java
@@ -17,16 +17,12 @@
  */
 package org.apache.phoenix.parse;
 
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
-import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.schema.PTableType;
-import org.apache.phoenix.schema.TableProperty;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java
index 1cac944..b49e221 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java
@@ -25,11 +25,11 @@ import java.util.Set;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HRegionLocation;
-import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.Mutation;
 import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.phoenix.compile.MutationPlan;
@@ -69,7 +69,7 @@ public interface ConnectionQueryServices extends 
QueryServices, MetaDataMutated
      */
     public Table getTable(byte[] tableName) throws SQLException;
 
-    public HTableDescriptor getTableDescriptor(byte[] tableName) throws 
SQLException;
+    public TableDescriptor getTableDescriptor(byte[] tableName) throws 
SQLException;
 
     public HRegionLocation getTableRegionLocation(byte[] tableName, byte[] 
row) throws SQLException;
     public List<HRegionLocation> getAllTableRegions(byte[] tableName) throws 
SQLException;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c3ec80d3/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
index 66e4661..2077272 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
@@ -17,7 +17,7 @@
  */
 package org.apache.phoenix.query;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.apache.hadoop.hbase.HColumnDescriptor.TTL;
+import static org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder.TTL;
 import static 
org.apache.phoenix.coprocessor.MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP;
 import static 
org.apache.phoenix.coprocessor.MetaDataProtocol.PHOENIX_MAJOR_VERSION;
 import static 
org.apache.phoenix.coprocessor.MetaDataProtocol.PHOENIX_MINOR_VERSION;
@@ -94,26 +94,30 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
 
 import javax.annotation.concurrent.GuardedBy;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionLocation;
-import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.KeepDeletedCells;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.TableExistsException;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.ClusterConnection;
+import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
+import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.Increment;
 import org.apache.hadoop.hbase.client.Mutation;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
 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.client.coprocessor.Batch;
 import org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
@@ -435,10 +439,10 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
     }
 
     @Override
-    public HTableDescriptor getTableDescriptor(byte[] tableName) throws 
SQLException {
+    public TableDescriptor getTableDescriptor(byte[] tableName) throws 
SQLException {
         Table htable = getTable(tableName);
         try {
-            return htable.getTableDescriptor();
+            return htable.getDescriptor();
         } catch (IOException e) {
             if(e instanceof org.apache.hadoop.hbase.TableNotFoundException
                     || e.getCause() instanceof 
org.apache.hadoop.hbase.TableNotFoundException) {
@@ -568,7 +572,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     HRegionLocation regionLocation = 
((ClusterConnection)connection).getRegionLocation(
                             TableName.valueOf(tableName), currentKey, reload);
                     locations.add(regionLocation);
-                    currentKey = regionLocation.getRegionInfo().getEndKey();
+                    currentKey = regionLocation.getRegion().getEndKey();
                 } while (!Bytes.equals(currentKey, HConstants.EMPTY_END_ROW));
                 return locations;
             } catch (org.apache.hadoop.hbase.TableNotFoundException e) {
@@ -700,30 +704,31 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
     }
 
 
-    private HColumnDescriptor 
generateColumnFamilyDescriptor(Pair<byte[],Map<String,Object>> family, 
PTableType tableType) throws SQLException {
-        HColumnDescriptor columnDesc = new 
HColumnDescriptor(family.getFirst());
+    private ColumnFamilyDescriptor 
generateColumnFamilyDescriptor(Pair<byte[],Map<String,Object>> family, 
PTableType tableType) throws SQLException {
+        ColumnFamilyDescriptorBuilder columnDescBuilder = 
ColumnFamilyDescriptorBuilder.newBuilder(family.getFirst());
         if (tableType != PTableType.VIEW) {
             if(props.get(QueryServices.DEFAULT_KEEP_DELETED_CELLS_ATTRIB) != 
null){
-                columnDesc.setKeepDeletedCells(props.getBoolean(
-                        QueryServices.DEFAULT_KEEP_DELETED_CELLS_ATTRIB, 
QueryServicesOptions.DEFAULT_KEEP_DELETED_CELLS));
+                
columnDescBuilder.setKeepDeletedCells(props.getBoolean(QueryServices.DEFAULT_KEEP_DELETED_CELLS_ATTRIB,
+                        QueryServicesOptions.DEFAULT_KEEP_DELETED_CELLS) ? 
KeepDeletedCells.TRUE
+                                : KeepDeletedCells.FALSE);
             }
-            
columnDesc.setDataBlockEncoding(SchemaUtil.DEFAULT_DATA_BLOCK_ENCODING);
-            columnDesc.setBloomFilterType(BloomType.NONE);
+            
columnDescBuilder.setDataBlockEncoding(SchemaUtil.DEFAULT_DATA_BLOCK_ENCODING);
+            columnDescBuilder.setBloomFilterType(BloomType.NONE);
             for (Entry<String,Object> entry : family.getSecond().entrySet()) {
                 String key = entry.getKey();
                 Object value = entry.getValue();
-                setHColumnDescriptorValue(columnDesc, key, value);
+                setHColumnDescriptorValue(columnDescBuilder, key, value);
             }
         }
-        return columnDesc;
+        return columnDescBuilder.build();
     }
 
     // Workaround HBASE-14737
-    private static void setHColumnDescriptorValue(HColumnDescriptor 
columnDesc, String key, Object value) {
+    private static void 
setHColumnDescriptorValue(ColumnFamilyDescriptorBuilder columnDescBuilder, 
String key, Object value) {
         if (HConstants.VERSIONS.equals(key)) {
-            columnDesc.setMaxVersions(getMaxVersion(value));
+            columnDescBuilder.setMaxVersions(getMaxVersion(value));
         } else {
-            columnDesc.setValue(key, value == null ? null : value.toString());
+            columnDescBuilder.setValue(key, value == null ? null : 
value.toString());
         }
     }
 
@@ -741,7 +746,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         return Integer.parseInt(stringValue);
     }
 
-    private void modifyColumnFamilyDescriptor(HColumnDescriptor hcd, 
Map<String,Object> props) throws SQLException {
+    private void modifyColumnFamilyDescriptor(ColumnFamilyDescriptorBuilder 
hcd, Map<String,Object> props) throws SQLException {
         for (Entry<String, Object> entry : props.entrySet()) {
             String propName = entry.getKey();
             Object value = entry.getValue();
@@ -749,32 +754,32 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         }
     }
 
-    private HTableDescriptor generateTableDescriptor(byte[] physicalTableName, 
HTableDescriptor existingDesc,
+    private TableDescriptorBuilder generateTableDescriptor(byte[] 
physicalTableName, TableDescriptor existingDesc,
             PTableType tableType, Map<String, Object> tableProps, 
List<Pair<byte[], Map<String, Object>>> families,
             byte[][] splits, boolean isNamespaceMapped) throws SQLException {
         String defaultFamilyName = 
(String)tableProps.remove(PhoenixDatabaseMetaData.DEFAULT_COLUMN_FAMILY_NAME);
-        HTableDescriptor tableDescriptor = (existingDesc != null) ? new 
HTableDescriptor(existingDesc)
-        : new HTableDescriptor(physicalTableName);
+        TableDescriptorBuilder tableDescriptorBuilder = (existingDesc != null) 
?TableDescriptorBuilder.newBuilder(existingDesc)
+        : 
TableDescriptorBuilder.newBuilder(TableName.valueOf(physicalTableName));
         // By default, do not automatically rebuild/catch up an index on a 
write failure
         for (Entry<String,Object> entry : tableProps.entrySet()) {
             String key = entry.getKey();
             if (!TableProperty.isPhoenixTableProperty(key)) {
                 Object value = entry.getValue();
-                tableDescriptor.setValue(key, value == null ? null : 
value.toString());
+                tableDescriptorBuilder.setValue(key, value == null ? null : 
value.toString());
             }
         }
         if (families.isEmpty()) {
             if (tableType != PTableType.VIEW) {
                 byte[] defaultFamilyByes = defaultFamilyName == null ? 
QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES : Bytes.toBytes(defaultFamilyName);
                 // Add dummy column family so we have key values for tables 
that
-                HColumnDescriptor columnDescriptor = 
generateColumnFamilyDescriptor(new 
Pair<byte[],Map<String,Object>>(defaultFamilyByes,Collections.<String,Object>emptyMap()),
 tableType);
-                tableDescriptor.addFamily(columnDescriptor);
+                ColumnFamilyDescriptor columnDescriptor = 
generateColumnFamilyDescriptor(new 
Pair<byte[],Map<String,Object>>(defaultFamilyByes,Collections.<String,Object>emptyMap()),
 tableType);
+                tableDescriptorBuilder.addColumnFamily(columnDescriptor);
             }
         } else {
             for (Pair<byte[],Map<String,Object>> family : families) {
                 // If family is only in phoenix description, add it. 
otherwise, modify its property accordingly.
                 byte[] familyByte = family.getFirst();
-                if (tableDescriptor.getFamily(familyByte) == null) {
+                if (tableDescriptorBuilder.build().getColumnFamily(familyByte) 
== null) {
                     if (tableType == PTableType.VIEW) {
                         String fullTableName = 
Bytes.toString(physicalTableName);
                         throw new ReadOnlyTableException(
@@ -783,32 +788,34 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                                 
SchemaUtil.getTableNameFromFullName(fullTableName),
                                 Bytes.toString(familyByte));
                     }
-                    HColumnDescriptor columnDescriptor = 
generateColumnFamilyDescriptor(family, tableType);
-                    tableDescriptor.addFamily(columnDescriptor);
+                    ColumnFamilyDescriptor columnDescriptor = 
generateColumnFamilyDescriptor(family, tableType);
+                    tableDescriptorBuilder.addColumnFamily(columnDescriptor);
                 } else {
                     if (tableType != PTableType.VIEW) {
-                        HColumnDescriptor columnDescriptor = 
tableDescriptor.getFamily(familyByte);
+                        ColumnFamilyDescriptor columnDescriptor = 
tableDescriptorBuilder.build().getColumnFamily(familyByte);
                         if (columnDescriptor == null) {
                             throw new IllegalArgumentException("Unable to find 
column descriptor with family name " + Bytes.toString(family.getFirst()));
                         }
-                        modifyColumnFamilyDescriptor(columnDescriptor, 
family.getSecond());
+                        ColumnFamilyDescriptorBuilder columnDescriptorBuilder 
= ColumnFamilyDescriptorBuilder.newBuilder(columnDescriptor);
+                        modifyColumnFamilyDescriptor(columnDescriptorBuilder, 
family.getSecond());
+                        
tableDescriptorBuilder.addColumnFamily(columnDescriptorBuilder.build());
                     }
                 }
             }
         }
-        addCoprocessors(physicalTableName, tableDescriptor, tableType, 
tableProps);
+        addCoprocessors(physicalTableName, tableDescriptorBuilder, tableType, 
tableProps);
 
         // PHOENIX-3072: Set index priority if this is a system table or index 
table
         if (tableType == PTableType.SYSTEM) {
-            tableDescriptor.setValue(QueryConstants.PRIORITY,
+            tableDescriptorBuilder.setValue(QueryConstants.PRIORITY,
                     
String.valueOf(PhoenixRpcSchedulerFactory.getMetadataPriority(config)));
         } else if (tableType == PTableType.INDEX // Global, mutable index
-                && !isLocalIndexTable(tableDescriptor.getFamiliesKeys())
+                && 
!isLocalIndexTable(tableDescriptorBuilder.build().getColumnFamilyNames())
                 && 
!Boolean.TRUE.equals(tableProps.get(PhoenixDatabaseMetaData.IMMUTABLE_ROWS))) {
-            tableDescriptor.setValue(QueryConstants.PRIORITY,
+            tableDescriptorBuilder.setValue(QueryConstants.PRIORITY,
                     
String.valueOf(PhoenixRpcSchedulerFactory.getIndexPriority(config)));
         }
-        return tableDescriptor;
+        return tableDescriptorBuilder;
     }
 
     private boolean isLocalIndexTable(Collection<byte[]> families) {
@@ -822,22 +829,17 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
     }
 
 
-    private void addCoprocessors(byte[] tableName, HTableDescriptor 
descriptor, PTableType tableType, Map<String,Object> tableProps) throws 
SQLException {
+    private void addCoprocessors(byte[] tableName, TableDescriptorBuilder 
builder, PTableType tableType, Map<String,Object> tableProps) throws 
SQLException {
         // The phoenix jar must be available on HBase classpath
         int priority = props.getInt(QueryServices.COPROCESSOR_PRIORITY_ATTRIB, 
QueryServicesOptions.DEFAULT_COPROCESSOR_PRIORITY);
         try {
-            if 
(!descriptor.hasCoprocessor(ScanRegionObserver.class.getName())) {
-                descriptor.addCoprocessor(ScanRegionObserver.class.getName(), 
null, priority, null);
-            }
-            if 
(!descriptor.hasCoprocessor(UngroupedAggregateRegionObserver.class.getName())) {
-                
descriptor.addCoprocessor(UngroupedAggregateRegionObserver.class.getName(), 
null, priority, null);
-            }
-            if 
(!descriptor.hasCoprocessor(GroupedAggregateRegionObserver.class.getName())) {
-                
descriptor.addCoprocessor(GroupedAggregateRegionObserver.class.getName(), null, 
priority, null);
-            }
-            if 
(!descriptor.hasCoprocessor(ServerCachingEndpointImpl.class.getName())) {
-                
descriptor.addCoprocessor(ServerCachingEndpointImpl.class.getName(), null, 
priority, null);
-            }
+                builder.addCoprocessor(ScanRegionObserver.class.getName(), 
null, priority, null);
+            
+                
builder.addCoprocessor(UngroupedAggregateRegionObserver.class.getName(), null, 
priority, null);
+            
+                
builder.addCoprocessor(GroupedAggregateRegionObserver.class.getName(), null, 
priority, null);
+            
+                
builder.addCoprocessor(ServerCachingEndpointImpl.class.getName(), null, 
priority, null);
             boolean isTransactional =
                     
Boolean.TRUE.equals(tableProps.get(TableProperty.TRANSACTIONAL.name())) ||
                     
Boolean.TRUE.equals(tableProps.get(PhoenixTransactionContext.READ_NON_TX_DATA));
 // For ALTER TABLE
@@ -849,67 +851,49 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     && !SchemaUtil.isMetaTable(tableName)
                     && !SchemaUtil.isStatsTable(tableName)) {
                 if (isTransactional) {
-                    if 
(!descriptor.hasCoprocessor(PhoenixTransactionalIndexer.class.getName())) {
-                        
descriptor.addCoprocessor(PhoenixTransactionalIndexer.class.getName(), null, 
priority, null);
-                    }
+                        
builder.addCoprocessor(PhoenixTransactionalIndexer.class.getName(), null, 
priority, null);
                     // For alter table, remove non transactional index 
coprocessor
-                    if (descriptor.hasCoprocessor(Indexer.class.getName())) {
-                        descriptor.removeCoprocessor(Indexer.class.getName());
-                    }
+                        builder.removeCoprocessor(Indexer.class.getName());
                 } else {
-                    if (!descriptor.hasCoprocessor(Indexer.class.getName())) {
+                    if 
(!builder.build().hasCoprocessor(Indexer.class.getName())) {
                         // If exception on alter table to transition back to 
non transactional
-                        if 
(descriptor.hasCoprocessor(PhoenixTransactionalIndexer.class.getName())) {
-                            
descriptor.removeCoprocessor(PhoenixTransactionalIndexer.class.getName());
-                        }
+                            
builder.removeCoprocessor(PhoenixTransactionalIndexer.class.getName());
                         Map<String, String> opts = 
Maps.newHashMapWithExpectedSize(1);
                         opts.put(NonTxIndexBuilder.CODEC_CLASS_NAME_KEY, 
PhoenixIndexCodec.class.getName());
-                        Indexer.enableIndexing(descriptor, 
PhoenixIndexBuilder.class, opts, priority);
+                        Indexer.enableIndexing(builder, 
PhoenixIndexBuilder.class, opts, priority);
                     }
                 }
             }
-            if (SchemaUtil.isStatsTable(tableName) && 
!descriptor.hasCoprocessor(MultiRowMutationEndpoint.class.getName())) {
-                
descriptor.addCoprocessor(MultiRowMutationEndpoint.class.getName(),
+            if (SchemaUtil.isStatsTable(tableName)) {
+                
builder.addCoprocessor(MultiRowMutationEndpoint.class.getName(),
                         null, priority, null);
             }
 
-            Set<byte[]> familiesKeys = descriptor.getFamiliesKeys();
+            Set<byte[]> familiesKeys = builder.build().getColumnFamilyNames();
             for(byte[] family: familiesKeys) {
                 
if(Bytes.toString(family).startsWith(QueryConstants.LOCAL_INDEX_COLUMN_FAMILY_PREFIX))
 {
-                    if 
(!descriptor.hasCoprocessor(IndexHalfStoreFileReaderGenerator.class.getName())) 
{
-                        
descriptor.addCoprocessor(IndexHalfStoreFileReaderGenerator.class.getName(),
+                        
builder.addCoprocessor(IndexHalfStoreFileReaderGenerator.class.getName(),
                                 null, priority, null);
                         break;
-                    }
                 }
             }
 
             // Setup split policy on Phoenix metadata table to ensure that the 
key values of a Phoenix table
             // stay on the same region.
             if (SchemaUtil.isMetaTable(tableName) || 
SchemaUtil.isFunctionTable(tableName)) {
-                if 
(!descriptor.hasCoprocessor(MetaDataEndpointImpl.class.getName())) {
-                    
descriptor.addCoprocessor(MetaDataEndpointImpl.class.getName(), null, priority, 
null);
-                }
+                    
builder.addCoprocessor(MetaDataEndpointImpl.class.getName(), null, priority, 
null);
                 if(SchemaUtil.isMetaTable(tableName) ) {
-                    if 
(!descriptor.hasCoprocessor(MetaDataRegionObserver.class.getName())) {
-                        
descriptor.addCoprocessor(MetaDataRegionObserver.class.getName(), null, 
priority + 1, null);
-                    }
+                        
builder.addCoprocessor(MetaDataRegionObserver.class.getName(), null, priority + 
1, null);
                 }
             } else if (SchemaUtil.isSequenceTable(tableName)) {
-                if 
(!descriptor.hasCoprocessor(SequenceRegionObserver.class.getName())) {
-                    
descriptor.addCoprocessor(SequenceRegionObserver.class.getName(), null, 
priority, null);
-                }
+                builder.addCoprocessor(SequenceRegionObserver.class.getName(), 
null, priority, null);
             }
 
             if (isTransactional) {
-                if 
(!descriptor.hasCoprocessor(PhoenixTransactionalProcessor.class.getName())) {
-                    
descriptor.addCoprocessor(PhoenixTransactionalProcessor.class.getName(), null, 
priority - 10, null);
-                }
+                    
builder.addCoprocessor(PhoenixTransactionalProcessor.class.getName(), null, 
priority - 10, null);
             } else {
                 // If exception on alter table to transition back to non 
transactional
-                if 
(descriptor.hasCoprocessor(PhoenixTransactionalProcessor.class.getName())) {
-                    
descriptor.removeCoprocessor(PhoenixTransactionalProcessor.class.getName());
-                }
+                    
builder.removeCoprocessor(PhoenixTransactionalProcessor.class.getName());
             }
         } catch (IOException e) {
             throw ServerUtil.parseServerException(e);
@@ -921,7 +905,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         String getOperationName();
     }
 
-    private void pollForUpdatedTableDescriptor(final Admin admin, final 
HTableDescriptor newTableDescriptor,
+    private void pollForUpdatedTableDescriptor(final Admin admin, final 
TableDescriptor newTableDescriptor,
             final byte[] tableName) throws InterruptedException, 
TimeoutException {
         checkAndRetry(new RetriableOperation() {
 
@@ -932,7 +916,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
 
             @Override
             public boolean checkForCompletion() throws TimeoutException, 
IOException {
-                HTableDescriptor tableDesc = 
admin.getTableDescriptor(TableName.valueOf(tableName));
+                TableDescriptor tableDesc = 
admin.getDescriptor(TableName.valueOf(tableName));
                 return newTableDescriptor.equals(tableDesc);
             }
         });
@@ -1020,11 +1004,11 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
      * @return true if table was created and false if it already exists
      * @throws SQLException
      */
-    private HTableDescriptor ensureTableCreated(byte[] physicalTableName, 
PTableType tableType, Map<String, Object> props,
+    private TableDescriptor ensureTableCreated(byte[] physicalTableName, 
PTableType tableType, Map<String, Object> props,
             List<Pair<byte[], Map<String, Object>>> families, byte[][] splits, 
boolean modifyExistingMetaData,
             boolean isNamespaceMapped) throws SQLException {
         SQLException sqlE = null;
-        HTableDescriptor existingDesc = null;
+        TableDescriptor existingDesc = null;
         boolean isMetaTable = SchemaUtil.isMetaTable(physicalTableName);
         boolean tableExist = true;
         try (Admin admin = getAdmin()) {
@@ -1032,7 +1016,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
             final String znode = 
this.props.get(HConstants.ZOOKEEPER_ZNODE_PARENT);
             logger.debug("Found quorum: " + quorum + ":" + znode);
             try {
-                existingDesc = 
admin.getTableDescriptor(TableName.valueOf(physicalTableName));
+                existingDesc = 
admin.getDescriptor(TableName.valueOf(physicalTableName));
             } catch (org.apache.hadoop.hbase.TableNotFoundException e) {
                 tableExist = false;
                 if (tableType == PTableType.VIEW) {
@@ -1044,23 +1028,23 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                 }
             }
 
-            HTableDescriptor newDesc = 
generateTableDescriptor(physicalTableName, existingDesc, tableType, props, 
families,
+            TableDescriptorBuilder newDesc = 
generateTableDescriptor(physicalTableName, existingDesc, tableType, props, 
families,
                     splits, isNamespaceMapped);
-
+            
             if (!tableExist) {
-                if 
(newDesc.getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_BYTES) != null && 
Boolean.TRUE.equals(
-                        
PBoolean.INSTANCE.toObject(newDesc.getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_BYTES))))
 {
-                    newDesc.setValue(HTableDescriptor.SPLIT_POLICY, 
IndexRegionSplitPolicy.class.getName());
+                if 
(newDesc.build().getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_BYTES) != null 
&& Boolean.TRUE.equals(
+                        
PBoolean.INSTANCE.toObject(newDesc.build().getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_BYTES))))
 {
+                    
newDesc.setValue(Bytes.toBytes(TableDescriptorBuilder.SPLIT_POLICY), 
Bytes.toBytes(IndexRegionSplitPolicy.class.getName()));
                 }
                 // Remove the splitPolicy attribute to prevent HBASE-12570
                 if (isMetaTable) {
-                    newDesc.remove(HTableDescriptor.SPLIT_POLICY);
+                    
newDesc.removeValue(Bytes.toBytes(TableDescriptorBuilder.SPLIT_POLICY));
                 }
                 try {
                     if (splits == null) {
-                        admin.createTable(newDesc);
+                        admin.createTable(newDesc.build());
                     } else {
-                        admin.createTable(newDesc, splits);
+                        admin.createTable(newDesc.build(), splits);
                     }
                 } catch (TableExistsException e) {
                     // We can ignore this, as it just means that another 
client beat us
@@ -1074,8 +1058,8 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                      * server and compatible. This works around HBASE-12570 
which causes the cluster to be
                      * brought down.
                      */
-                    newDesc.setValue(HTableDescriptor.SPLIT_POLICY, 
MetaDataSplitPolicy.class.getName());
-                    modifyTable(physicalTableName, newDesc, true);
+                    newDesc.setValue(TableDescriptorBuilder.SPLIT_POLICY, 
MetaDataSplitPolicy.class.getName());
+                    modifyTable(physicalTableName, newDesc.build(), true);
                 }
                 return null;
             } else {
@@ -1083,11 +1067,11 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     
checkClientServerCompatibility(SchemaUtil.getPhysicalName(SYSTEM_CATALOG_NAME_BYTES,
 this.getProps()).getName());
                 } else {
                     for(Pair<byte[],Map<String,Object>> family: families) {
-                        if 
((newDesc.getValue(HTableDescriptor.SPLIT_POLICY)==null || 
!newDesc.getValue(HTableDescriptor.SPLIT_POLICY).equals(
+                        if 
((newDesc.build().getValue(TableDescriptorBuilder.SPLIT_POLICY)==null || 
!newDesc.build().getValue(TableDescriptorBuilder.SPLIT_POLICY).equals(
                                 IndexRegionSplitPolicy.class.getName()))
                                 && 
Bytes.toString(family.getFirst()).startsWith(
                                         
QueryConstants.LOCAL_INDEX_COLUMN_FAMILY_PREFIX)) {
-                            newDesc.setValue(HTableDescriptor.SPLIT_POLICY, 
IndexRegionSplitPolicy.class.getName());
+                            
newDesc.setValue(TableDescriptorBuilder.SPLIT_POLICY, 
IndexRegionSplitPolicy.class.getName());
                             break;
                         }
                     }
@@ -1110,14 +1094,14 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                         
.setSchemaName(SchemaUtil.getSchemaNameFromFullName(physicalTableName))
                         
.setTableName(SchemaUtil.getTableNameFromFullName(physicalTableName)).build().buildException();
                     }
-                    newDesc.remove(PhoenixTransactionContext.READ_NON_TX_DATA);
+                    
newDesc.removeValue(Bytes.toBytes(PhoenixTransactionContext.READ_NON_TX_DATA));
                 }
                 if (existingDesc.equals(newDesc)) {
                     return null; // Indicate that no metadata was changed
                 }
 
-                modifyTable(physicalTableName, newDesc, true);
-                return newDesc;
+                modifyTable(physicalTableName, newDesc.build(), true);
+                return newDesc.build();
             }
 
         } catch (IOException e) {
@@ -1136,16 +1120,16 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         return null; // will never make it here
     }
 
-    private void modifyTable(byte[] tableName, HTableDescriptor newDesc, 
boolean shouldPoll) throws IOException,
+    private void modifyTable(byte[] tableName, TableDescriptor newDesc, 
boolean shouldPoll) throws IOException,
     InterruptedException, TimeoutException, SQLException {
         TableName tn = TableName.valueOf(tableName);
         try (Admin admin = getAdmin()) {
             if (!allowOnlineTableSchemaUpdate()) {
                 admin.disableTable(tn);
-                admin.modifyTable(tn, newDesc); // TODO: Update to 
TableDescriptor
+                admin.modifyTable(newDesc); // TODO: Update to TableDescriptor
                 admin.enableTable(tn);
             } else {
-                admin.modifyTable(tn, newDesc); // TODO: Update to 
TableDescriptor
+                admin.modifyTable(newDesc); // TODO: Update to TableDescriptor
                 if (shouldPoll) {
                     pollForUpdatedTableDescriptor(admin, newDesc, tableName);
                 }
@@ -1181,8 +1165,8 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
             List<byte[]> regionKeys = 
Lists.newArrayListWithExpectedSize(locations.size());
             for (HRegionLocation entry : locations) {
                 if (!serverMap.contains(entry)) {
-                    regionKeys.add(entry.getRegionInfo().getStartKey());
-                    regionMap.put(entry.getRegionInfo().getRegionName(), 
entry);
+                    regionKeys.add(entry.getRegion().getStartKey());
+                    regionMap.put(entry.getRegion().getRegionName(), entry);
                     serverMap.add(entry);
                 }
             }
@@ -1308,7 +1292,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         byte[] physicalIndexName = 
MetaDataUtil.getViewIndexPhysicalName(physicalTableName);
 
         tableProps.put(MetaDataUtil.IS_VIEW_INDEX_TABLE_PROP_NAME, 
TRUE_BYTES_AS_STRING);
-        HTableDescriptor desc = ensureTableCreated(physicalIndexName, 
PTableType.TABLE, tableProps, families, splits,
+        TableDescriptor desc = ensureTableCreated(physicalIndexName, 
PTableType.TABLE, tableProps, families, splits,
                 false, isNamespaceMapped);
         if (desc != null) {
             if 
(!Boolean.TRUE.equals(PBoolean.INSTANCE.toObject(desc.getValue(MetaDataUtil.IS_VIEW_INDEX_TABLE_PROP_BYTES))))
 {
@@ -1327,7 +1311,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         try (Admin admin = getAdmin()) {
             try {
                 TableName physicalIndexTableName = 
TableName.valueOf(physicalIndexName);
-                HTableDescriptor desc = 
admin.getTableDescriptor(physicalIndexTableName);
+                TableDescriptor desc = 
admin.getDescriptor(physicalIndexTableName);
                 if 
(Boolean.TRUE.equals(PBoolean.INSTANCE.toObject(desc.getValue(MetaDataUtil.IS_VIEW_INDEX_TABLE_PROP_BYTES))))
 {
                     final ReadOnlyProps props = this.getProps();
                     final boolean dropMetadata = 
props.getBoolean(DROP_METADATA_ATTRIB, DEFAULT_DROP_METADATA);
@@ -1350,19 +1334,19 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
     }
 
     private boolean ensureLocalIndexTableDropped(byte[] physicalTableName, 
long timestamp) throws SQLException {
-        HTableDescriptor desc = null;
+        TableDescriptor desc = null;
         boolean wasDeleted = false;
         try (Admin admin = getAdmin()) {
             try {
-                desc = 
admin.getTableDescriptor(TableName.valueOf(physicalTableName));
-                for (byte[] fam : desc.getFamiliesKeys()) {
+                desc = 
admin.getDescriptor(TableName.valueOf(physicalTableName));
+                for (byte[] fam : desc.getColumnFamilyNames()) {
                     this.tableStatsCache.invalidate(new 
GuidePostsKey(physicalTableName, fam));
                 }
                 final ReadOnlyProps props = this.getProps();
                 final boolean dropMetadata = 
props.getBoolean(DROP_METADATA_ATTRIB, DEFAULT_DROP_METADATA);
                 if (dropMetadata) {
                     List<String> columnFamiles = new ArrayList<String>();
-                    for(HColumnDescriptor cf : desc.getColumnFamilies()) {
+                    for(ColumnFamilyDescriptor cf : desc.getColumnFamilies()) {
                         
if(cf.getNameAsString().startsWith(QueryConstants.LOCAL_INDEX_COLUMN_FAMILY_PREFIX))
 {
                             columnFamiles.add(cf.getNameAsString());
                         }
@@ -1627,7 +1611,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                 for ( byte[] tableName : tableNamesToDelete ) {
                     try {
                         TableName tn = TableName.valueOf(tableName);
-                        HTableDescriptor htableDesc = 
this.getTableDescriptor(tableName);
+                        TableDescriptor htableDesc = 
this.getTableDescriptor(tableName);
                         admin.disableTable(tn);
                         admin.deleteTable(tn);
                         tableStatsCache.invalidateAll(htableDesc);
@@ -1646,12 +1630,13 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         }
     }
 
-    private static Map<String,Object> 
createPropertiesMap(Map<ImmutableBytesWritable,ImmutableBytesWritable> 
htableProps) {
+    private static Map<String,Object> createPropertiesMap(Map<Bytes,Bytes> 
htableProps) {
         Map<String,Object> props = 
Maps.newHashMapWithExpectedSize(htableProps.size());
-        for (Map.Entry<ImmutableBytesWritable,ImmutableBytesWritable> entry : 
htableProps.entrySet()) {
-            ImmutableBytesWritable key = entry.getKey();
-            ImmutableBytesWritable value = entry.getValue();
-            props.put(Bytes.toString(key.get(), key.getOffset(), 
key.getLength()), Bytes.toString(value.get(), value.getOffset(), 
value.getLength()));
+        for (Map.Entry<Bytes,Bytes> entry : htableProps.entrySet()) {
+            Bytes key = entry.getKey();
+            Bytes value = entry.getValue();
+            props.put(Bytes.toString(key.get(), key.getOffset(), 
key.getLength()),
+                    Bytes.toString(value.get(), value.getOffset(), 
value.getLength()));
         }
         return props;
     }
@@ -1690,17 +1675,17 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
     private void ensureViewIndexTableCreated(PTable table, long timestamp, 
boolean isNamespaceMapped)
             throws SQLException {
         byte[] physicalTableName = table.getPhysicalName().getBytes();
-        HTableDescriptor htableDesc = 
this.getTableDescriptor(physicalTableName);
+       TableDescriptor htableDesc = this.getTableDescriptor(physicalTableName);
         Map<String,Object> tableProps = 
createPropertiesMap(htableDesc.getValues());
         List<Pair<byte[],Map<String,Object>>> families = 
Lists.newArrayListWithExpectedSize(Math.max(1, 
table.getColumnFamilies().size()+1));
         if (families.isEmpty()) {
             byte[] familyName = SchemaUtil.getEmptyColumnFamily(table);
-            Map<String,Object> familyProps = 
createPropertiesMap(htableDesc.getFamily(familyName).getValues());
+            Map<String,Object> familyProps = 
createPropertiesMap(htableDesc.getColumnFamily(familyName).getValues());
             families.add(new Pair<byte[],Map<String,Object>>(familyName, 
familyProps));
         } else {
             for (PColumnFamily family : table.getColumnFamilies()) {
                 byte[] familyName = family.getName().getBytes();
-                Map<String,Object> familyProps = 
createPropertiesMap(htableDesc.getFamily(familyName).getValues());
+                Map<String,Object> familyProps = 
createPropertiesMap(htableDesc.getColumnFamily(familyName).getValues());
                 families.add(new Pair<byte[],Map<String,Object>>(familyName, 
familyProps));
             }
             // Always create default column family, because we don't know in 
advance if we'll
@@ -1723,12 +1708,12 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
     public MetaDataMutationResult addColumn(final List<Mutation> 
tableMetaData, PTable table, Map<String, List<Pair<String,Object>>> 
stmtProperties, Set<String> colFamiliesForPColumnsToBeAdded, List<PColumn> 
columns) throws SQLException {
         List<Pair<byte[], Map<String, Object>>> families = new 
ArrayList<>(stmtProperties.size());
         Map<String, Object> tableProps = new HashMap<String, Object>();
-        Set<HTableDescriptor> tableDescriptors = Collections.emptySet();
-        Set<HTableDescriptor> origTableDescriptors = Collections.emptySet();
+        Set<TableDescriptor> tableDescriptors = Collections.emptySet();
+        Set<TableDescriptor> origTableDescriptors = Collections.emptySet();
         boolean nonTxToTx = false;
-        Pair<HTableDescriptor,HTableDescriptor> tableDescriptorPair = 
separateAndValidateProperties(table, stmtProperties, 
colFamiliesForPColumnsToBeAdded, tableProps);
-        HTableDescriptor tableDescriptor = tableDescriptorPair.getSecond();
-        HTableDescriptor origTableDescriptor = tableDescriptorPair.getFirst();
+        Pair<TableDescriptor,TableDescriptor> tableDescriptorPair = 
separateAndValidateProperties(table, stmtProperties, 
colFamiliesForPColumnsToBeAdded, families, tableProps);
+        TableDescriptor tableDescriptor = tableDescriptorPair.getSecond();
+        TableDescriptor origTableDescriptor = tableDescriptorPair.getFirst();
         if (tableDescriptor != null) {
             tableDescriptors = Sets.newHashSetWithExpectedSize(3 + 
table.getIndexes().size());
             origTableDescriptors = Sets.newHashSetWithExpectedSize(3 + 
table.getIndexes().size());
@@ -1739,9 +1724,12 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
              * If the table was transitioned from non transactional to 
transactional, we need
              * to also transition the index tables.
              */
+            
+            TableDescriptorBuilder tableDescriptorBuilder = 
TableDescriptorBuilder.newBuilder(tableDescriptor);
             if (nonTxToTx) {
-                updateDescriptorForTx(table, tableProps, tableDescriptor, 
Boolean.TRUE.toString(), tableDescriptors, origTableDescriptors);
+                updateDescriptorForTx(table, tableProps, 
tableDescriptorBuilder, Boolean.TRUE.toString(), tableDescriptors, 
origTableDescriptors);
             }
+            tableDescriptor=tableDescriptorBuilder.build();
         }
 
         boolean success = false;
@@ -1834,11 +1822,11 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         }
         return result;
     }
-    private void updateDescriptorForTx(PTable table, Map<String, Object> 
tableProps, HTableDescriptor tableDescriptor,
-            String txValue, Set<HTableDescriptor> descriptorsToUpdate, 
Set<HTableDescriptor> origDescriptors) throws SQLException {
+    private void updateDescriptorForTx(PTable table, Map<String, Object> 
tableProps, TableDescriptorBuilder tableDescriptorBuilder,
+            String txValue, Set<TableDescriptor> descriptorsToUpdate, 
Set<TableDescriptor> origDescriptors) throws SQLException {
         byte[] physicalTableName = table.getPhysicalName().getBytes();
         try (Admin admin = getAdmin()) {
-            setTransactional(tableDescriptor, table.getType(), txValue, 
tableProps);
+            setTransactional(physicalTableName, tableDescriptorBuilder, 
table.getType(), txValue, tableProps);
             Map<String, Object> indexTableProps;
             if (txValue == null) {
                 indexTableProps = Collections.<String,Object>emptyMap();
@@ -1847,46 +1835,50 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                 
indexTableProps.put(PhoenixTransactionContext.READ_NON_TX_DATA, 
Boolean.valueOf(txValue));
             }
             for (PTable index : table.getIndexes()) {
-                HTableDescriptor indexDescriptor = 
admin.getTableDescriptor(TableName.valueOf(index.getPhysicalName().getBytes()));
-                origDescriptors.add(indexDescriptor);
-                indexDescriptor = new HTableDescriptor(indexDescriptor);
-                descriptorsToUpdate.add(indexDescriptor);
+                TableDescriptor indexDesc = 
admin.getDescriptor(TableName.valueOf(index.getPhysicalName().getBytes()));
+                origDescriptors.add(indexDesc);
+                TableDescriptorBuilder indexDescriptorBuilder = 
TableDescriptorBuilder.newBuilder(indexDesc);
+                descriptorsToUpdate.add(indexDescriptorBuilder.build());
                 if (index.getColumnFamilies().isEmpty()) {
                     byte[] dataFamilyName = 
SchemaUtil.getEmptyColumnFamily(table);
                     byte[] indexFamilyName = 
SchemaUtil.getEmptyColumnFamily(index);
-                    HColumnDescriptor indexColDescriptor = 
indexDescriptor.getFamily(indexFamilyName);
-                    HColumnDescriptor tableColDescriptor = 
tableDescriptor.getFamily(dataFamilyName);
+                    ColumnFamilyDescriptorBuilder indexColDescriptor = 
ColumnFamilyDescriptorBuilder.newBuilder(indexDescriptorBuilder.build().getColumnFamily(indexFamilyName));
+                    ColumnFamilyDescriptor tableColDescriptor = 
tableDescriptorBuilder.build().getColumnFamily(dataFamilyName);
                     
indexColDescriptor.setMaxVersions(tableColDescriptor.getMaxVersions());
-                    
indexColDescriptor.setValue(PhoenixTransactionContext.PROPERTY_TTL, 
tableColDescriptor.getValue(PhoenixTransactionContext.PROPERTY_TTL));
+                    
indexColDescriptor.setValue(Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL),
+                            
tableColDescriptor.getValue(Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL)));
+                    
indexDescriptorBuilder.addColumnFamily(indexColDescriptor.build());
                 } else {
                     for (PColumnFamily family : index.getColumnFamilies()) {
                         byte[] familyName = family.getName().getBytes();
-                        
indexDescriptor.getFamily(familyName).setMaxVersions(tableDescriptor.getFamily(familyName).getMaxVersions());
-                        HColumnDescriptor indexColDescriptor = 
indexDescriptor.getFamily(familyName);
-                        HColumnDescriptor tableColDescriptor = 
tableDescriptor.getFamily(familyName);
+                        ColumnFamilyDescriptorBuilder indexColDescriptor = 
ColumnFamilyDescriptorBuilder.newBuilder(indexDescriptorBuilder.build().getColumnFamily(familyName));
+                        ColumnFamilyDescriptor tableColDescriptor = 
tableDescriptorBuilder.build().getColumnFamily(familyName);
                         
indexColDescriptor.setMaxVersions(tableColDescriptor.getMaxVersions());
-                        
indexColDescriptor.setValue(PhoenixTransactionContext.PROPERTY_TTL, 
tableColDescriptor.getValue(PhoenixTransactionContext.PROPERTY_TTL));
+                        
indexColDescriptor.setValue(Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL),
+                                
tableColDescriptor.getValue(Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL)));
+                        
indexDescriptorBuilder.addColumnFamily(indexColDescriptor.build());
                     }
                 }
-                setTransactional(indexDescriptor, index.getType(), txValue, 
indexTableProps);
+                setTransactional(index.getPhysicalName().getBytes(), 
indexDescriptorBuilder, index.getType(), txValue, indexTableProps);
             }
             try {
-                HTableDescriptor indexDescriptor = 
admin.getTableDescriptor(TableName.valueOf(MetaDataUtil.getViewIndexPhysicalName(physicalTableName)));
+                TableDescriptor indexDescriptor = 
admin.getDescriptor(TableName.valueOf(MetaDataUtil.getViewIndexPhysicalName(physicalTableName)));
                 origDescriptors.add(indexDescriptor);
-                indexDescriptor = new HTableDescriptor(indexDescriptor);
-                descriptorsToUpdate.add(indexDescriptor);
-                setSharedIndexMaxVersion(table, tableDescriptor, 
indexDescriptor);
-                setTransactional(indexDescriptor, PTableType.INDEX, txValue, 
indexTableProps);
+                TableDescriptorBuilder indexDescriptorBuilder = 
TableDescriptorBuilder.newBuilder(indexDescriptor);
+                setSharedIndexMaxVersion(table, 
tableDescriptorBuilder.build(), indexDescriptorBuilder);
+                
setTransactional(MetaDataUtil.getViewIndexPhysicalName(physicalTableName), 
indexDescriptorBuilder, PTableType.INDEX, txValue, indexTableProps);
+                descriptorsToUpdate.add(indexDescriptorBuilder.build());
             } catch (org.apache.hadoop.hbase.TableNotFoundException ignore) {
                 // Ignore, as we may never have created a view index table
             }
             try {
-                HTableDescriptor indexDescriptor = 
admin.getTableDescriptor(TableName.valueOf(MetaDataUtil.getLocalIndexPhysicalName(physicalTableName)));
+                TableDescriptor indexDescriptor = 
admin.getDescriptor(TableName.valueOf(MetaDataUtil.getLocalIndexPhysicalName(physicalTableName)));
                 origDescriptors.add(indexDescriptor);
-                indexDescriptor = new HTableDescriptor(indexDescriptor);
-                descriptorsToUpdate.add(indexDescriptor);
-                setSharedIndexMaxVersion(table, tableDescriptor, 
indexDescriptor);
-                setTransactional(indexDescriptor, PTableType.INDEX, txValue, 
indexTableProps);
+                TableDescriptorBuilder indexDescriptorBuilder = 
TableDescriptorBuilder.newBuilder(indexDescriptor);
+                
+                setSharedIndexMaxVersion(table, 
tableDescriptorBuilder.build(), indexDescriptorBuilder);
+                
setTransactional(MetaDataUtil.getViewIndexPhysicalName(physicalTableName), 
indexDescriptorBuilder, PTableType.INDEX, txValue, indexTableProps);
+                descriptorsToUpdate.add(indexDescriptorBuilder.build());
             } catch (org.apache.hadoop.hbase.TableNotFoundException ignore) {
                 // Ignore, as we may never have created a view index table
             }
@@ -1894,32 +1886,36 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
             throw ServerUtil.parseServerException(e);
         }
     }
-    private void setSharedIndexMaxVersion(PTable table, HTableDescriptor 
tableDescriptor,
-            HTableDescriptor indexDescriptor) {
+    private void setSharedIndexMaxVersion(PTable table, TableDescriptor 
tableDescriptor,
+            TableDescriptorBuilder indexDescriptorBuilder) {
         if (table.getColumnFamilies().isEmpty()) {
             byte[] familyName = SchemaUtil.getEmptyColumnFamily(table);
-            HColumnDescriptor indexColDescriptor = 
indexDescriptor.getFamily(familyName);
-            HColumnDescriptor tableColDescriptor = 
tableDescriptor.getFamily(familyName);
-            
indexColDescriptor.setMaxVersions(tableColDescriptor.getMaxVersions());
-            
indexColDescriptor.setValue(PhoenixTransactionContext.PROPERTY_TTL, 
tableColDescriptor.getValue(PhoenixTransactionContext.PROPERTY_TTL));
+            ColumnFamilyDescriptorBuilder indexColDescriptorBuilder = 
ColumnFamilyDescriptorBuilder.newBuilder(indexDescriptorBuilder.build().getColumnFamily(familyName));
+            ColumnFamilyDescriptor tableColDescriptor = 
tableDescriptor.getColumnFamily(familyName);
+            
indexColDescriptorBuilder.setMaxVersions(tableColDescriptor.getMaxVersions());
+            indexColDescriptorBuilder.setValue( 
Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL),tableColDescriptor.getValue(Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL)));
+            
indexDescriptorBuilder.addColumnFamily(indexColDescriptorBuilder.build());
         } else {
             for (PColumnFamily family : table.getColumnFamilies()) {
                 byte[] familyName = family.getName().getBytes();
-                HColumnDescriptor indexColDescriptor = 
indexDescriptor.getFamily(familyName);
+                ColumnFamilyDescriptor indexColDescriptor = 
indexDescriptorBuilder.build().getColumnFamily(familyName);
                 if (indexColDescriptor != null) {
-                    HColumnDescriptor tableColDescriptor = 
tableDescriptor.getFamily(familyName);
-                    
indexColDescriptor.setMaxVersions(tableColDescriptor.getMaxVersions());
-                    
indexColDescriptor.setValue(PhoenixTransactionContext.PROPERTY_TTL, 
tableColDescriptor.getValue(PhoenixTransactionContext.PROPERTY_TTL));
+                    ColumnFamilyDescriptor tableColDescriptor = 
tableDescriptor.getColumnFamily(familyName);
+                    ColumnFamilyDescriptorBuilder indexColDescriptorBuilder = 
ColumnFamilyDescriptorBuilder.newBuilder(indexColDescriptor);
+                    
indexColDescriptorBuilder.setMaxVersions(tableColDescriptor.getMaxVersions());
+                    indexColDescriptorBuilder.setValue( 
Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL),tableColDescriptor.getValue(Bytes.toBytes(PhoenixTransactionContext.PROPERTY_TTL)));
+                    
indexDescriptorBuilder.addColumnFamily(indexColDescriptorBuilder.build());
+                    
                 }
             }
         }
     }
 
-    private void sendHBaseMetaData(Set<HTableDescriptor> tableDescriptors, 
boolean pollingNeeded) throws SQLException {
+    private void sendHBaseMetaData(Set<TableDescriptor> tableDescriptors, 
boolean pollingNeeded) throws SQLException {
         SQLException sqlE = null;
-        for (HTableDescriptor descriptor : tableDescriptors) {
+        for (TableDescriptor descriptor : tableDescriptors) {
             try {
-                modifyTable(descriptor.getName(), descriptor, pollingNeeded);
+                modifyTable(descriptor.getTableName().getName(), descriptor, 
pollingNeeded);
             } catch (IOException e) {
                 sqlE = ServerUtil.parseServerException(e);
             } catch (InterruptedException e) {
@@ -1935,17 +1931,18 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
             }
         }
     }
-    private void setTransactional(HTableDescriptor tableDescriptor, PTableType 
tableType, String txValue, Map<String, Object> tableProps) throws SQLException {
+    private void setTransactional(byte[] physicalTableName, 
TableDescriptorBuilder tableDescriptorBuilder, PTableType tableType, String 
txValue, Map<String, Object> tableProps) throws SQLException {
         if (txValue == null) {
-            tableDescriptor.remove(PhoenixTransactionContext.READ_NON_TX_DATA);
+            
tableDescriptorBuilder.removeValue(Bytes.toBytes(PhoenixTransactionContext.READ_NON_TX_DATA));
         } else {
-            
tableDescriptor.setValue(PhoenixTransactionContext.READ_NON_TX_DATA, txValue);
+            
tableDescriptorBuilder.setValue(PhoenixTransactionContext.READ_NON_TX_DATA, 
txValue);
         }
-        this.addCoprocessors(tableDescriptor.getName(), tableDescriptor, 
tableType, tableProps);
+        this.addCoprocessors(physicalTableName, tableDescriptorBuilder, 
tableType, tableProps);
     }
 
-    private Pair<HTableDescriptor,HTableDescriptor> 
separateAndValidateProperties(PTable table, Map<String, List<Pair<String, 
Object>>> properties,
-      Set<String> colFamiliesForPColumnsToBeAdded, Map<String, Object> 
tableProps) throws SQLException {
+    private Pair<TableDescriptor, TableDescriptor> 
separateAndValidateProperties(PTable table,
+            Map<String, List<Pair<String, Object>>> properties, Set<String> 
colFamiliesForPColumnsToBeAdded,
+            List<Pair<byte[], Map<String, Object>>> families, Map<String, 
Object> tableProps) throws SQLException {
         Map<String, Map<String, Object>> stmtFamiliesPropsMap = new 
HashMap<>(properties.size());
         Map<String,Object> commonFamilyProps = new HashMap<>();
         boolean addingColumns = colFamiliesForPColumnsToBeAdded != null && 
!colFamiliesForPColumnsToBeAdded.isEmpty();
@@ -2090,21 +2087,21 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
             .buildException();
         }
 
-        HTableDescriptor newTableDescriptor = null;
-        HTableDescriptor origTableDescriptor = null;
+        TableDescriptorBuilder newTableDescriptorBuilder = null;
+        TableDescriptor origTableDescriptor = null;
         if (!allFamiliesProps.isEmpty() || !tableProps.isEmpty()) {
             byte[] tableNameBytes = 
Bytes.toBytes(table.getPhysicalName().getString());
-            HTableDescriptor existingTableDescriptor = origTableDescriptor = 
getTableDescriptor(tableNameBytes);
-            newTableDescriptor = new HTableDescriptor(existingTableDescriptor);
+            TableDescriptor existingTableDescriptor = origTableDescriptor = 
this.getTableDescriptor(tableNameBytes);
+            newTableDescriptorBuilder = 
TableDescriptorBuilder.newBuilder(existingTableDescriptor);
             if (!tableProps.isEmpty()) {
                 // add all the table properties to the existing table 
descriptor
                 for (Entry<String, Object> entry : tableProps.entrySet()) {
-                    newTableDescriptor.setValue(entry.getKey(), 
entry.getValue() != null ? entry.getValue().toString() : null);
+                    newTableDescriptorBuilder.setValue(entry.getKey(), 
entry.getValue() != null ? entry.getValue().toString() : null);
                 }
             }
             if (addingColumns) {
                 // Make sure that all the CFs of the table have the same TTL 
as the empty CF.
-                setTTLForNewCFs(allFamiliesProps, table, newTableDescriptor, 
newTTL);
+                setTTLForNewCFs(allFamiliesProps, table, 
newTableDescriptorBuilder, newTTL);
             }
             // Set TTL on all table column families, even if they're not 
referenced here
             if (newTTL != null) {
@@ -2125,7 +2122,8 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                 }
                 if (defaultTxMaxVersions == null) {
                     if (isTransactional) {
-                        defaultTxMaxVersions = 
newTableDescriptor.getFamily(SchemaUtil.getEmptyColumnFamily(table)).getMaxVersions();
+                        defaultTxMaxVersions = 
newTableDescriptorBuilder.build()
+                                
.getColumnFamily(SchemaUtil.getEmptyColumnFamily(table)).getMaxVersions();
                     } else {
                         defaultTxMaxVersions =
                                 this.getProps().getInt(
@@ -2148,8 +2146,8 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
             // transitioning to become transactional or setting TTL on
             // an already transactional table.
             if (isOrWillBeTransactional) {
-                int ttl = getTTL(table, newTableDescriptor, newTTL);
-                if (ttl != HColumnDescriptor.DEFAULT_TTL) {
+                int ttl = getTTL(table, newTableDescriptorBuilder.build(), 
newTTL);
+                if (ttl != ColumnFamilyDescriptorBuilder.DEFAULT_TTL) {
                     for (Map.Entry<String, Map<String, Object>> entry : 
allFamiliesProps.entrySet()) {
                         Map<String, Object> props = entry.getValue();
                         if (props == null) {
@@ -2158,7 +2156,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                         props.put(PhoenixTransactionContext.PROPERTY_TTL, ttl);
                         // Remove HBase TTL if we're not transitioning an 
existing table to become transactional
                         // or if the existing transactional table wasn't 
originally non transactional.
-                        if (!willBeTransactional && 
!Boolean.valueOf(newTableDescriptor.getValue(PhoenixTransactionContext.READ_NON_TX_DATA)))
 {
+                        if (!willBeTransactional && 
!Boolean.valueOf(newTableDescriptorBuilder.build().getValue(PhoenixTransactionContext.READ_NON_TX_DATA)))
 {
                             props.remove(TTL);
                         }
                     }
@@ -2172,23 +2170,25 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     }
                 }
                 byte[] cf = Bytes.toBytes(entry.getKey());
-                HColumnDescriptor colDescriptor = 
newTableDescriptor.getFamily(cf);
+                ColumnFamilyDescriptor colDescriptor = 
newTableDescriptorBuilder.build().getColumnFamily(cf);
                 if (colDescriptor == null) {
                     // new column family
                     colDescriptor = generateColumnFamilyDescriptor(new 
Pair<>(cf, familyProps), table.getType());
-                    newTableDescriptor.addFamily(colDescriptor);
+                    newTableDescriptorBuilder.addColumnFamily(colDescriptor);
                 } else {
-                    modifyColumnFamilyDescriptor(colDescriptor, familyProps);
+                    ColumnFamilyDescriptorBuilder colDescriptorBuilder = 
ColumnFamilyDescriptorBuilder.newBuilder(colDescriptor);
+                    modifyColumnFamilyDescriptor(colDescriptorBuilder, 
familyProps);
+                    colDescriptor = colDescriptorBuilder.build();
                 }
                 if (isOrWillBeTransactional) {
                     checkTransactionalVersionsValue(colDescriptor);
                 }
             }
         }
-        return new Pair<>(origTableDescriptor, newTableDescriptor);
+        return new Pair<>(origTableDescriptor, 
newTableDescriptorBuilder.build());
     }
 
-    private void checkTransactionalVersionsValue(HColumnDescriptor 
colDescriptor) throws SQLException {
+    private void checkTransactionalVersionsValue(ColumnFamilyDescriptor 
colDescriptor) throws SQLException {
         int maxVersions = colDescriptor.getMaxVersions();
         if (maxVersions <= 1) {
             throw new 
SQLExceptionInfo.Builder(SQLExceptionCode.TX_MAX_VERSIONS_MUST_BE_GREATER_THAN_ONE)
@@ -2212,17 +2212,17 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         return cfNames;
     }
 
-    private static int getTTL(PTable table, HTableDescriptor tableDesc, 
Integer newTTL) throws SQLException {
+    private static int getTTL(PTable table, TableDescriptor tableDesc, Integer 
newTTL) throws SQLException {
         // If we're setting TTL now, then use that value. Otherwise, use empty 
column family value
         int ttl = newTTL != null ? newTTL
-                : 
tableDesc.getFamily(SchemaUtil.getEmptyColumnFamily(table)).getTimeToLive();
+                : 
tableDesc.getColumnFamily(SchemaUtil.getEmptyColumnFamily(table)).getTimeToLive();
         return ttl;
     }
 
     private static void setTTLForNewCFs(Map<String, Map<String, Object>> 
familyProps, PTable table,
-            HTableDescriptor tableDesc, Integer newTTL) throws SQLException {
+            TableDescriptorBuilder tableDescBuilder, Integer newTTL) throws 
SQLException {
         if (!familyProps.isEmpty()) {
-            int ttl = getTTL(table, tableDesc, newTTL);
+            int ttl = getTTL(table, tableDescBuilder.build(), newTTL);
             for (Map.Entry<String, Map<String, Object>> entry : 
familyProps.entrySet()) {
                 Map<String, Object> props = entry.getValue();
                 if (props == null) {
@@ -2538,11 +2538,11 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                 logger.debug("System mutex table already appears to exist, not 
creating it");
                 return;
             }
-            HTableDescriptor tableDesc = new HTableDescriptor(mutexTableName);
-            HColumnDescriptor columnDesc = new HColumnDescriptor(
-                    PhoenixDatabaseMetaData.SYSTEM_MUTEX_FAMILY_NAME_BYTES);
-            columnDesc.setTimeToLive(TTL_FOR_MUTEX); // Let mutex expire after 
some time
-            tableDesc.addFamily(columnDesc);
+            TableDescriptor tableDesc = 
TableDescriptorBuilder.newBuilder(mutexTableName)
+                    .addColumnFamily(ColumnFamilyDescriptorBuilder
+                            
.newBuilder(PhoenixDatabaseMetaData.SYSTEM_MUTEX_FAMILY_NAME_BYTES)
+                            .setTimeToLive(TTL_FOR_MUTEX).build())
+                    .build();
             admin.createTable(tableDesc);
             try (Table sysMutexTable = getTable(mutexTableName.getName())) {
                 byte[] mutexRowKey = SchemaUtil.getTableKey(null, 
PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA,
@@ -2557,7 +2557,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
     }
 
     List<TableName> getSystemTableNames(Admin admin) throws IOException {
-        return 
Lists.newArrayList(admin.listTableNames(QueryConstants.SYSTEM_SCHEMA_NAME + 
"\\..*")); // TODO: replace to pattern
+        return 
Lists.newArrayList(admin.listTableNames(Pattern.compile(QueryConstants.SYSTEM_SCHEMA_NAME
 + "\\..*"))); // TODO: replace to pattern
     }
 
     private void createOtherSystemTables(PhoenixConnection metaConnection, 
Admin hbaseAdmin) throws SQLException, IOException {
@@ -2632,19 +2632,21 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     columnsToAdd = addColumn(columnsToAdd, 
PhoenixDatabaseMetaData.STORE_NULLS
                             + " " + PBoolean.INSTANCE.getSqlTypeName());
                     try (Admin admin = getAdmin()) {
-                        HTableDescriptor[] localIndexTables = admin
-                                
.listTables(MetaDataUtil.LOCAL_INDEX_TABLE_PREFIX + ".*");
-                        for (HTableDescriptor table : localIndexTables) {
+                        List<TableDescriptor> localIndexTables =
+                                admin.listTableDescriptors(Pattern
+                                        
.compile(MetaDataUtil.LOCAL_INDEX_TABLE_PREFIX + ".*"));
+                        for (TableDescriptor table : localIndexTables) {
                             if (table.getValue(MetaDataUtil.PARENT_TABLE_KEY) 
== null
                                     && 
table.getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_NAME) != null) {
-                                table.setValue(MetaDataUtil.PARENT_TABLE_KEY,
-                                        
MetaDataUtil.getLocalIndexUserTableName(table.getNameAsString()));
+                                
+                                
table=TableDescriptorBuilder.newBuilder(table).setValue(Bytes.toBytes(MetaDataUtil.PARENT_TABLE_KEY),
+                                        
Bytes.toBytes(MetaDataUtil.getLocalIndexUserTableName(table.getTableName().getNameAsString()))).build();
                                 // Explicitly disable, modify and enable the 
table to ensure
                                 // co-location of data and index regions. If 
we just modify the
                                 // table descriptor when online schema change 
enabled may reopen 
                                 // the region in same region server instead of 
following data region.
                                 admin.disableTable(table.getTableName());
-                                admin.modifyTable(table.getTableName(), table);
+                                admin.modifyTable(table);
                                 admin.enableTable(table.getTableName());
                             }
                         }
@@ -3680,7 +3682,6 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         incrementSequenceValues(sequenceAllocations, timestamp, values, 
exceptions, Sequence.ValueOp.INCREMENT_SEQUENCE);
     }
 
-    @SuppressWarnings("deprecation")
     private void incrementSequenceValues(List<SequenceAllocation> 
sequenceAllocations, long timestamp, long[] values, SQLException[] exceptions, 
Sequence.ValueOp op) throws SQLException {
         List<Sequence> sequences = 
Lists.newArrayListWithExpectedSize(sequenceAllocations.size());
         for (SequenceAllocation sequenceAllocation : sequenceAllocations) {
@@ -3808,7 +3809,6 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
         }
     }
 
-    @SuppressWarnings("deprecation")
     @Override
     public void returnSequences(List<SequenceKey> keys, long timestamp, 
SQLException[] exceptions) throws SQLException {
         List<Sequence> sequences = 
Lists.newArrayListWithExpectedSize(keys.size());
@@ -3885,7 +3885,6 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
 
     // Take no locks, as this only gets run when there are no open connections
     // so there's no danger of contention.
-    @SuppressWarnings("deprecation")
     private void returnAllSequences(ConcurrentMap<SequenceKey,Sequence> 
sequenceMap) throws SQLException {
         List<Append> mutations = 
Lists.newArrayListWithExpectedSize(sequenceMap.size());
         for (Sequence sequence : sequenceMap.values()) {

Reply via email to