diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParameterizedIndexUpgradeToolIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParameterizedIndexUpgradeToolIT.java
index 1df46a8..16f99e3 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParameterizedIndexUpgradeToolIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ParameterizedIndexUpgradeToolIT.java
@@ -18,9 +18,11 @@
 package org.apache.phoenix.end2end;
 
 import com.google.common.collect.Maps;
+import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.end2end.index.IndexCoprocIT;
 import org.apache.phoenix.hbase.index.IndexRegionObserver;
 import org.apache.phoenix.hbase.index.Indexer;
 import org.apache.phoenix.index.GlobalIndexChecker;
@@ -230,18 +232,22 @@
             throws IOException {
         if (mutable) {
             for (String table : tableList) {
+                HTableDescriptor indexDesc = admin.getTableDescriptor(TableName.valueOf(table));
                 Assert.assertTrue("Can't find IndexRegionObserver for " + table,
-                    admin.getTableDescriptor(TableName.valueOf(table))
-                        .hasCoprocessor(IndexRegionObserver.class.getName()));
+                    indexDesc.hasCoprocessor(IndexRegionObserver.class.getName()));
                 Assert.assertFalse("Found Indexer on " + table,
-                    admin.getTableDescriptor(TableName.valueOf(table))
-                        .hasCoprocessor(Indexer.class.getName()));
+                        indexDesc.hasCoprocessor(Indexer.class.getName()));
+                IndexCoprocIT.assertCoprocConfig(indexDesc, IndexRegionObserver.class.getName(),
+                    IndexCoprocIT.INDEX_REGION_OBSERVER_CONFIG);
             }
+
         }
         for (String index : indexList) {
+            HTableDescriptor indexDesc = admin.getTableDescriptor(TableName.valueOf(index));
             Assert.assertTrue("Couldn't find GlobalIndexChecker on " + index,
-                admin.getTableDescriptor(TableName.valueOf(index))
-                    .hasCoprocessor(GlobalIndexChecker.class.getName()));
+                indexDesc.hasCoprocessor(GlobalIndexChecker.class.getName()));
+            IndexCoprocIT.assertCoprocConfig(indexDesc, GlobalIndexChecker.class.getName(),
+                IndexCoprocIT.GLOBAL_INDEX_CHECKER_CONFIG);
         }
         // Transactional indexes should not have new coprocessors
         for (String index : TRANSACTIONAL_INDEXES_LIST) {
@@ -260,12 +266,13 @@
             throws IOException {
         if (mutable) {
             for (String table : tableList) {
+                HTableDescriptor indexDesc = admin.getTableDescriptor(TableName.valueOf(table));
                 Assert.assertTrue("Can't find Indexer for " + table,
-                    admin.getTableDescriptor(TableName.valueOf(table))
-                        .hasCoprocessor(Indexer.class.getName()));
+                    indexDesc.hasCoprocessor(Indexer.class.getName()));
                 Assert.assertFalse("Found IndexRegionObserver on " + table,
-                    admin.getTableDescriptor(TableName.valueOf(table))
-                        .hasCoprocessor(IndexRegionObserver.class.getName()));
+                    indexDesc.hasCoprocessor(IndexRegionObserver.class.getName()));
+                IndexCoprocIT.assertCoprocConfig(indexDesc, Indexer.class.getName(),
+                    IndexCoprocIT.INDEXER_CONFIG);
             }
         }
         for (String index : indexList) {
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexCoprocIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexCoprocIT.java
index cdf45e2..839d46b 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexCoprocIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexCoprocIT.java
@@ -22,16 +22,18 @@
 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.HTable;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.phoenix.end2end.ParallelStatsDisabledIT;
 import org.apache.phoenix.hbase.index.IndexRegionObserver;
 import org.apache.phoenix.hbase.index.Indexer;
 import org.apache.phoenix.hbase.index.covered.NonTxIndexBuilder;
 import org.apache.phoenix.index.GlobalIndexChecker;
+import org.apache.phoenix.index.PhoenixIndexBuilder;
 import org.apache.phoenix.index.PhoenixIndexCodec;
 import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.query.QueryServices;
+import org.apache.phoenix.query.QueryServicesOptions;
 import org.apache.phoenix.util.SchemaUtil;
 import org.junit.Assert;
 import org.junit.Test;
@@ -51,6 +53,18 @@
 public class IndexCoprocIT extends ParallelStatsDisabledIT {
     private boolean isNamespaceMapped = false;
     private boolean isMultiTenant = false;
+    public static final String GLOBAL_INDEX_CHECKER_CONFIG =
+        "|org.apache.phoenix.index.GlobalIndexChecker|805306365|";
+    public static final String INDEX_REGION_OBSERVER_CONFIG =
+        "|org.apache.phoenix.hbase.index.IndexRegionObserver" +
+            "|805306366|org.apache.hadoop.hbase.index.codec.class=" +
+            "org.apache.phoenix.index.PhoenixIndexCodec," +
+            "index.builder=org.apache.phoenix.index.PhoenixIndexBuilder";
+    public static final String INDEXER_CONFIG =
+        "|org.apache.phoenix.hbase.index.Indexer" +
+            "|805306366|org.apache.hadoop.hbase.index.codec.class=" +
+            "org.apache.phoenix.index.PhoenixIndexCodec," +
+            "index.builder=org.apache.phoenix.index.PhoenixIndexBuilder";
 
     public IndexCoprocIT(boolean isMultiTenant){
         this.isMultiTenant = isMultiTenant;
@@ -86,8 +100,8 @@
 
         Map<String, String> props = new HashMap<String, String>();
         props.put(NonTxIndexBuilder.CODEC_CLASS_NAME_KEY, PhoenixIndexCodec.class.getName());
-        Indexer.enableIndexing(baseDescriptor, NonTxIndexBuilder.class,
-            props, 100);
+        Indexer.enableIndexing(baseDescriptor, PhoenixIndexBuilder.class,
+            props, QueryServicesOptions.DEFAULT_COPROCESSOR_PRIORITY);
         admin.modifyTable(baseDescriptor.getTableName(), baseDescriptor);
         baseDescriptor = admin.getTableDescriptor(TableName.valueOf(physicalTableName));
         indexDescriptor = admin.getTableDescriptor(TableName.valueOf(physicalIndexName));
@@ -153,6 +167,8 @@
     private void assertUsingOldCoprocs(HTableDescriptor baseDescriptor,
                                        HTableDescriptor indexDescriptor) {
         assertCoprocsContains(Indexer.class, baseDescriptor);
+        assertCoprocConfig(baseDescriptor, Indexer.class.getName(),
+            INDEXER_CONFIG);
         assertCoprocsNotContains(IndexRegionObserver.class, baseDescriptor);
         assertCoprocsNotContains(IndexRegionObserver.class, indexDescriptor);
         assertCoprocsNotContains(GlobalIndexChecker.class, indexDescriptor);
@@ -166,9 +182,13 @@
     private void assertUsingNewCoprocs(HTableDescriptor baseDescriptor,
                                        HTableDescriptor indexDescriptor) {
         assertCoprocsContains(IndexRegionObserver.class, baseDescriptor);
+        assertCoprocConfig(baseDescriptor, IndexRegionObserver.class.getName(),
+            INDEX_REGION_OBSERVER_CONFIG);
         assertCoprocsNotContains(Indexer.class, baseDescriptor);
         assertCoprocsNotContains(Indexer.class, indexDescriptor);
         assertCoprocsContains(GlobalIndexChecker.class, indexDescriptor);
+        assertCoprocConfig(indexDescriptor, GlobalIndexChecker.class.getName(),
+            GLOBAL_INDEX_CHECKER_CONFIG);
     }
 
     private void assertCoprocsContains(Class clazz, HTableDescriptor descriptor) {
@@ -196,6 +216,28 @@
         return foundCoproc;
     }
 
+    public static void assertCoprocConfig(HTableDescriptor indexDesc,
+                                   String className, String expectedConfigValue){
+        boolean foundConfig = false;
+        for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry :
+            indexDesc.getValues().entrySet()){
+            String propKey = Bytes.toString(entry.getKey().get());
+            String propValue = Bytes.toString(entry.getValue().get());
+            //Unfortunately, a good API to read coproc properties didn't show up until
+            //HBase 2.0. Doing this the painful String-matching way to be compatible with 1.x
+            if (propKey.contains("coprocessor")){
+                if (propValue.contains(className)){
+                    Assert.assertEquals(className + " is configured incorrectly",
+                        expectedConfigValue,
+                        propValue);
+                    foundConfig = true;
+                    break;
+                }
+            }
+        }
+        Assert.assertTrue("Couldn't find config for " + className, foundConfig);
+    }
+
     private void removeCoproc(Class clazz, HTableDescriptor descriptor, Admin admin) throws Exception {
        descriptor.removeCoprocessor(clazz.getName());
        admin.modifyTable(descriptor.getTableName(), descriptor);
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexUpgradeTool.java b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexUpgradeTool.java
index 437738a..ef8c492 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexUpgradeTool.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/mapreduce/index/IndexUpgradeTool.java
@@ -19,7 +19,6 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
-import com.google.gson.Gson;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.HelpFormatter;
@@ -108,6 +107,7 @@
 
     private HashMap<String, HashSet<String>> tablesAndIndexes = new HashMap<>();
     private HashMap<String, String> prop = new  HashMap<>();
+    private HashMap<String, String> emptyProp = new HashMap<>();
 
     private boolean dryRun, upgrade, syncRebuild;
     private String operation;
@@ -461,11 +461,17 @@
     }
 
     private void addCoprocessor(Admin admin, String tableName, HTableDescriptor tableDesc,
-            String coprocName) throws IOException {
+                                String coprocName) throws IOException {
+        addCoprocessor(admin, tableName, tableDesc, coprocName,
+            QueryServicesOptions.DEFAULT_COPROCESSOR_PRIORITY, prop);
+    }
+
+    private void addCoprocessor(Admin admin, String tableName, HTableDescriptor tableDesc,
+            String coprocName, int priority, Map<String, String> propsToAdd) throws IOException {
         if (!admin.getTableDescriptor(TableName.valueOf(tableName)).hasCoprocessor(coprocName)) {
             if (!dryRun) {
                 tableDesc.addCoprocessor(coprocName,
-                        null, QueryServicesOptions.DEFAULT_COPROCESSOR_PRIORITY, prop);
+                        null, priority, propsToAdd);
             }
             LOGGER.info("Loaded " + coprocName + " coprocessor on table " + tableName);
         } else {
@@ -490,7 +496,10 @@
         for (String indexName : indexes) {
             HTableDescriptor indexTableDesc = admin.getTableDescriptor(TableName.valueOf(indexName));
             if (upgrade) {
-                addCoprocessor(admin, indexName, indexTableDesc, GlobalIndexChecker.class.getName());
+                //GlobalIndexChecker needs to be a "lower" priority than all the others so that it
+                //goes first. It also doesn't get the codec props the IndexRegionObserver needs
+                addCoprocessor(admin, indexName, indexTableDesc, GlobalIndexChecker.class.getName(),
+                    QueryServicesOptions.DEFAULT_COPROCESSOR_PRIORITY -1, emptyProp);
             } else {
                 removeCoprocessor(admin, indexName, indexTableDesc,
                         GlobalIndexChecker.class.getName());
