You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by cg...@apache.org on 2021/01/10 13:17:41 UTC

[drill] branch master updated: DRILL-5405: Add missing operator types without dependency on protobuf enum

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3d1bc2c  DRILL-5405: Add missing operator types without dependency on protobuf enum
3d1bc2c is described below

commit 3d1bc2c07e620187bb251cf61bac1858f4dcceda
Author: Volodymyr Vysotskyi <vv...@gmail.com>
AuthorDate: Fri Jan 8 19:13:56 2021 +0200

    DRILL-5405: Add missing operator types without dependency on protobuf enum
---
 .../drill/exec/store/esri/ShpFormatPlugin.java     |   32 +-
 .../drill/exec/store/excel/ExcelFormatPlugin.java  |   31 +-
 .../drill/exec/store/hdf5/HDF5FormatPlugin.java    |   29 +-
 .../exec/store/httpd/HttpdLogFormatPlugin.java     |   29 +-
 .../drill/exec/store/ltsv/LTSVFormatPlugin.java    |    9 +-
 .../drill/exec/store/mapr/db/MapRDBSubScan.java    |    7 +-
 .../drill/exec/store/spss/SpssFormatPlugin.java    |   26 +-
 .../exec/store/syslog/SyslogFormatPlugin.java      |   26 +-
 .../drill/exec/store/xml/XMLFormatPlugin.java      |   28 +-
 .../native/client/src/protobuf/UserBitShared.pb.cc |  299 +++---
 .../native/client/src/protobuf/UserBitShared.pb.h  |  239 +++--
 .../drill/exec/store/druid/DruidSubScan.java       |    8 +-
 .../drill/exec/store/hbase/HBaseSubScan.java       |    7 +-
 .../hive/HiveDrillNativeParquetRowGroupScan.java   |    7 +-
 .../apache/drill/exec/store/hive/HiveSubScan.java  |    7 +-
 .../apache/drill/exec/store/http/HttpSubScan.java  |   11 +-
 .../apache/drill/exec/store/jdbc/JdbcSubScan.java  |    7 +-
 .../drill/exec/store/kafka/KafkaSubScan.java       |    7 +-
 .../apache/drill/exec/store/kudu/KuduSubScan.java  |    7 +-
 .../apache/drill/exec/store/kudu/KuduWriter.java   |    7 +-
 .../drill/exec/store/mongo/MongoSubScan.java       |   10 +-
 .../drill/exec/store/openTSDB/OpenTSDBSubScan.java |    7 +-
 .../org/apache/drill/exec/ops/FragmentStats.java   |   13 +-
 .../org/apache/drill/exec/ops/OpProfileDef.java    |    6 +-
 .../drill/exec/ops/OperatorMetricRegistry.java     |   55 +-
 .../org/apache/drill/exec/ops/OperatorStats.java   |   41 +-
 .../drill/exec/physical/base/AbstractExchange.java |    4 +-
 .../exec/physical/base/AbstractGroupScan.java      |    2 +-
 .../drill/exec/physical/base/PhysicalOperator.java |    2 +-
 .../exec/physical/config/BroadcastSender.java      |    8 +-
 .../drill/exec/physical/config/ComplexToJson.java  |    8 +-
 .../drill/exec/physical/config/ExternalSort.java   |    8 +-
 .../apache/drill/exec/physical/config/Filter.java  |    7 +-
 .../drill/exec/physical/config/FlattenPOP.java     |   10 +-
 .../drill/exec/physical/config/HashAggregate.java  |    7 +-
 .../drill/exec/physical/config/HashJoinPOP.java    |   10 +-
 .../exec/physical/config/HashPartitionSender.java  |    8 +-
 .../exec/physical/config/IteratorValidator.java    |    9 +-
 .../drill/exec/physical/config/LateralJoinPOP.java |    8 +-
 .../apache/drill/exec/physical/config/Limit.java   |    8 +-
 .../drill/exec/physical/config/MergeJoinPOP.java   |   10 +-
 .../exec/physical/config/MergingReceiverPOP.java   |   10 +-
 .../physical/config/MetadataControllerPOP.java     |    8 +-
 .../exec/physical/config/MetadataHandlerPOP.java   |    8 +-
 .../exec/physical/config/NestedLoopJoinPOP.java    |    8 +-
 .../physical/config/OrderedPartitionSender.java    |   14 +-
 .../drill/exec/physical/config/PartitionLimit.java |    8 +-
 .../exec/physical/config/ProducerConsumer.java     |    8 +-
 .../apache/drill/exec/physical/config/Project.java |   10 +-
 .../exec/physical/config/RangePartitionSender.java |   11 +-
 .../drill/exec/physical/config/RowKeyJoinPOP.java  |    8 +-
 .../exec/physical/config/RuntimeFilterPOP.java     |    7 +-
 .../apache/drill/exec/physical/config/Screen.java  |    8 +-
 .../physical/config/SelectionVectorRemover.java    |    7 +-
 .../drill/exec/physical/config/SingleSender.java   |    8 +-
 .../apache/drill/exec/physical/config/Sort.java    |   10 +-
 .../exec/physical/config/StatisticsAggregate.java  |    8 +-
 .../exec/physical/config/StatisticsMerge.java      |    7 +-
 .../exec/physical/config/StreamingAggregate.java   |    7 +-
 .../apache/drill/exec/physical/config/TopN.java    |    8 +-
 .../apache/drill/exec/physical/config/Trace.java   |    7 +-
 .../drill/exec/physical/config/UnionAll.java       |    7 +-
 .../drill/exec/physical/config/UnnestPOP.java      |   13 +-
 .../exec/physical/config/UnorderedReceiver.java    |    7 +-
 .../drill/exec/physical/config/UnpivotMaps.java    |    8 +-
 .../apache/drill/exec/physical/config/Values.java  |    8 +-
 .../drill/exec/physical/config/WindowPOP.java      |    7 +-
 .../exec/server/rest/profile/CoreOperatorType.java |  342 +++++++
 .../exec/server/rest/profile/OperatorWrapper.java  |   34 +-
 .../exec/server/rest/profile/ProfileWrapper.java   |   13 +-
 .../drill/exec/store/avro/AvroFormatPlugin.java    |   26 +-
 .../exec/store/dfs/easy/EasyFormatPlugin.java      |  309 +++++-
 .../drill/exec/store/dfs/easy/EasyGroupScan.java   |    7 +-
 .../drill/exec/store/dfs/easy/EasySubScan.java     |    2 +-
 .../drill/exec/store/dfs/easy/EasyWriter.java      |    5 +-
 .../drill/exec/store/direct/DirectSubScan.java     |    9 +-
 .../exec/store/easy/json/JSONFormatPlugin.java     |   12 +-
 .../sequencefile/SequenceFileFormatPlugin.java     |   29 +-
 .../exec/store/easy/text/TextFormatPlugin.java     |   35 +-
 .../drill/exec/store/image/ImageFormatPlugin.java  |    8 +-
 .../exec/store/ischema/InfoSchemaSubScan.java      |    7 +-
 .../drill/exec/store/log/LogFormatPlugin.java      |   32 +-
 .../apache/drill/exec/store/mock/MockStorePOP.java |    3 +-
 .../drill/exec/store/mock/MockSubScanPOP.java      |    7 +-
 .../exec/store/parquet/ParquetRowGroupScan.java    |    7 +-
 .../drill/exec/store/parquet/ParquetWriter.java    |   10 +-
 .../drill/exec/store/pcap/PcapFormatPlugin.java    |   26 +-
 .../exec/store/pcapng/PcapngFormatPlugin.java      |   26 +-
 .../drill/exec/store/sys/SystemTableScan.java      |    7 +-
 .../src/main/resources/rest/profile/profile.ftl    |    3 +-
 .../java/org/apache/drill/TestOperatorMetrics.java |   18 +-
 .../apache/drill/exec/memory/TestAllocators.java   |   10 +-
 .../exec/physical/impl/agg/TestHashAggrSpill.java  |    3 +-
 .../exec/physical/impl/scan/ScanTestUtils.java     |    4 +-
 .../physical/impl/scan/TestScanBatchWriters.java   |    4 +-
 .../exec/physical/impl/scan/v3/ScanFixture.java    |    4 +-
 .../scan/v3/lifecycle/BaseTestScanLifecycle.java   |    2 +-
 .../physical/impl/xsort/TestExternalSortExec.java  |    3 +-
 .../impl/xsort/TestExternalSortInternals.java      |    3 +-
 .../drill/exec/record/TestRecordIterator.java      |    6 +-
 .../drill/exec/store/dfs/TestDrillFileSystem.java  |    2 +-
 .../store/parquet/TestParquetFilterPushDown.java   |    7 +-
 .../org/apache/drill/test/OperatorFixture.java     |    2 +-
 .../apache/drill/test/OperatorTestBuilderTest.java |    4 +-
 .../apache/drill/test/PhysicalOpUnitTestBase.java  |    4 +-
 .../java/org/apache/drill/test/ProfileParser.java  |   33 +-
 .../drill/exec/proto/SchemaUserBitShared.java      |    7 +
 .../org/apache/drill/exec/proto/UserBitShared.java | 1028 +++++---------------
 protocol/src/main/protobuf/UserBitShared.proto     |   78 +-
 109 files changed, 1655 insertions(+), 1810 deletions(-)

diff --git a/contrib/format-esri/src/main/java/org/apache/drill/exec/store/esri/ShpFormatPlugin.java b/contrib/format-esri/src/main/java/org/apache/drill/exec/store/esri/ShpFormatPlugin.java
index 01dda6c..20bb704 100644
--- a/contrib/format-esri/src/main/java/org/apache/drill/exec/store/esri/ShpFormatPlugin.java
+++ b/contrib/format-esri/src/main/java/org/apache/drill/exec/store/esri/ShpFormatPlugin.java
@@ -26,7 +26,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchem
 
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileReaderFactory;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -34,14 +33,8 @@ import org.apache.drill.exec.store.dfs.easy.EasySubScan;
 import org.apache.drill.exec.store.esri.ShpBatchReader.ShpReaderConfig;
 import org.apache.hadoop.conf.Configuration;
 
-import org.apache.drill.shaded.guava.com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 public class ShpFormatPlugin extends EasyFormatPlugin<ShpFormatConfig> {
 
-  private static final Logger logger = LoggerFactory.getLogger(ShpFormatPlugin.class);
-
   public static final String PLUGIN_NAME = "shp";
 
   public static class ShpReaderFactory extends FileReaderFactory {
@@ -79,18 +72,17 @@ public class ShpFormatPlugin extends EasyFormatPlugin<ShpFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, ShpFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = false;
-    config.supportsProjectPushdown = true;
-    config.extensions = Lists.newArrayList(pluginConfig.getExtensions());
-    config.fsConf = fsConf;
-    config.defaultName = PLUGIN_NAME;
-    config.readerOperatorType = CoreOperatorType.SHP_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(false)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(PLUGIN_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 }
diff --git a/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelFormatPlugin.java b/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelFormatPlugin.java
index 0d8d52d..58cae94 100644
--- a/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelFormatPlugin.java
+++ b/contrib/format-excel/src/main/java/org/apache/drill/exec/store/excel/ExcelFormatPlugin.java
@@ -18,7 +18,6 @@
 
 package org.apache.drill.exec.store.excel;
 
-import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.exceptions.UserException;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.types.TypeProtos;
@@ -28,7 +27,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanB
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchemaNegotiator;
 
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -66,29 +64,28 @@ public class ExcelFormatPlugin extends EasyFormatPlugin<ExcelFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, ExcelFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = DEFAULT_NAME;
-    config.readerOperatorType = UserBitShared.CoreOperatorType.EXCEL_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(DEFAULT_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
   public ManagedReader<? extends FileSchemaNegotiator> newBatchReader(
-    EasySubScan scan, OptionManager options) throws ExecutionSetupException {
+    EasySubScan scan, OptionManager options) {
     return new ExcelBatchReader(formatConfig.getReaderConfig(this), scan.getMaxRecords());
   }
 
   @Override
-  protected FileScanBuilder frameworkBuilder(OptionManager options, EasySubScan scan) throws ExecutionSetupException {
+  protected FileScanBuilder frameworkBuilder(OptionManager options, EasySubScan scan) {
     FileScanBuilder builder = new FileScanBuilder();
     ExcelReaderConfig readerConfig = new ExcelReaderConfig(this);
 
diff --git a/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatPlugin.java b/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatPlugin.java
index 3e9480f..07e0763 100644
--- a/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatPlugin.java
+++ b/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatPlugin.java
@@ -19,7 +19,6 @@
 package org.apache.drill.exec.store.hdf5;
 
 import org.apache.drill.common.config.DrillConfig;
-import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.types.TypeProtos;
 import org.apache.drill.common.types.Types;
@@ -28,7 +27,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanBuilder;
 
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasySubScan;
@@ -55,23 +53,22 @@ public class HDF5FormatPlugin extends EasyFormatPlugin<HDF5FormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, HDF5FormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = DEFAULT_NAME;
-    config.readerOperatorType = UserBitShared.CoreOperatorType.HDF5_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(DEFAULT_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
-  protected FileScanBuilder frameworkBuilder(OptionManager options, EasySubScan scan) throws ExecutionSetupException {
+  protected FileScanBuilder frameworkBuilder(OptionManager options, EasySubScan scan) {
     FileScanBuilder builder = new FileScanBuilder();
 
     builder.setReaderFactory(new HDF5ReaderFactory(new HDF5BatchReader.HDF5ReaderConfig(this, formatConfig), scan.getMaxRecords()));
diff --git a/contrib/format-httpd/src/main/java/org/apache/drill/exec/store/httpd/HttpdLogFormatPlugin.java b/contrib/format-httpd/src/main/java/org/apache/drill/exec/store/httpd/HttpdLogFormatPlugin.java
index e81372f..c3120d1 100644
--- a/contrib/format-httpd/src/main/java/org/apache/drill/exec/store/httpd/HttpdLogFormatPlugin.java
+++ b/contrib/format-httpd/src/main/java/org/apache/drill/exec/store/httpd/HttpdLogFormatPlugin.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileReaderFactory;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchemaNegotiator;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -36,6 +35,8 @@ public class HttpdLogFormatPlugin extends EasyFormatPlugin<HttpdLogFormatConfig>
 
   protected static final String DEFAULT_NAME = "httpd";
 
+  public static final String OPERATOR_TYPE = "HTPPD_LOG_SUB_SCAN";
+
   private static class HttpLogReaderFactory extends FileReaderFactory {
 
     private final HttpdLogFormatConfig config;
@@ -64,19 +65,19 @@ public class HttpdLogFormatPlugin extends EasyFormatPlugin<HttpdLogFormatConfig>
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, HttpdLogFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = DEFAULT_NAME;
-    config.readerOperatorType = UserBitShared.CoreOperatorType.HTPPD_LOG_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(DEFAULT_NAME)
+        .readerOperatorType(OPERATOR_TYPE)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
diff --git a/contrib/format-ltsv/src/main/java/org/apache/drill/exec/store/ltsv/LTSVFormatPlugin.java b/contrib/format-ltsv/src/main/java/org/apache/drill/exec/store/ltsv/LTSVFormatPlugin.java
index a1d5c20..c28b101 100644
--- a/contrib/format-ltsv/src/main/java/org/apache/drill/exec/store/ltsv/LTSVFormatPlugin.java
+++ b/contrib/format-ltsv/src/main/java/org/apache/drill/exec/store/ltsv/LTSVFormatPlugin.java
@@ -21,7 +21,6 @@ import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.planner.common.DrillStatsTable.TableStatistics;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.RecordReader;
 import org.apache.drill.exec.store.RecordWriter;
@@ -54,14 +53,8 @@ public class LTSVFormatPlugin extends EasyFormatPlugin<LTSVFormatPluginConfig> {
     return new LTSVRecordReader(context, fileWork.getPath(), dfs, columns);
   }
 
-
-  @Override
-  public int getReaderOperatorType() {
-    return UserBitShared.CoreOperatorType.LTSV_SUB_SCAN_VALUE;
-  }
-
   @Override
-  public int getWriterOperatorType() {
+  public String getWriterOperatorType() {
     throw new UnsupportedOperationException("Drill doesn't currently support writing to LTSV files.");
   }
 
diff --git a/contrib/format-maprdb/src/main/java/org/apache/drill/exec/store/mapr/db/MapRDBSubScan.java b/contrib/format-maprdb/src/main/java/org/apache/drill/exec/store/mapr/db/MapRDBSubScan.java
index 92195f5..9b352c6 100644
--- a/contrib/format-maprdb/src/main/java/org/apache/drill/exec/store/mapr/db/MapRDBSubScan.java
+++ b/contrib/format-maprdb/src/main/java/org/apache/drill/exec/store/mapr/db/MapRDBSubScan.java
@@ -28,7 +28,6 @@ import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.physical.base.AbstractDbSubScan;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.metadata.TupleMetadata;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
@@ -43,6 +42,8 @@ import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 
 public class MapRDBSubScan extends AbstractDbSubScan {
 
+  public static final String OPERATOR_TYPE = "MAPRDB_SUB_SCAN";
+
   private final MapRDBFormatPlugin formatPlugin;
   private final List<MapRDBSubScanSpec> regionScanSpecList;
   private final List<SchemaPath> columns;
@@ -143,8 +144,8 @@ public class MapRDBSubScan extends AbstractDbSubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.MAPRDB_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @JsonIgnore
diff --git a/contrib/format-spss/src/main/java/org/apache/drill/exec/store/spss/SpssFormatPlugin.java b/contrib/format-spss/src/main/java/org/apache/drill/exec/store/spss/SpssFormatPlugin.java
index 53e618b..7e3e94f 100644
--- a/contrib/format-spss/src/main/java/org/apache/drill/exec/store/spss/SpssFormatPlugin.java
+++ b/contrib/format-spss/src/main/java/org/apache/drill/exec/store/spss/SpssFormatPlugin.java
@@ -26,7 +26,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanB
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchemaNegotiator;
 
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -59,19 +58,18 @@ public class SpssFormatPlugin extends EasyFormatPlugin<SpssFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, SpssFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = DEFAULT_NAME;
-    config.readerOperatorType = UserBitShared.CoreOperatorType.SPSS_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(DEFAULT_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
diff --git a/contrib/format-syslog/src/main/java/org/apache/drill/exec/store/syslog/SyslogFormatPlugin.java b/contrib/format-syslog/src/main/java/org/apache/drill/exec/store/syslog/SyslogFormatPlugin.java
index 88b53d1..b439c5e 100644
--- a/contrib/format-syslog/src/main/java/org/apache/drill/exec/store/syslog/SyslogFormatPlugin.java
+++ b/contrib/format-syslog/src/main/java/org/apache/drill/exec/store/syslog/SyslogFormatPlugin.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileReade
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanBuilder;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchemaNegotiator;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -61,19 +60,18 @@ public class SyslogFormatPlugin extends EasyFormatPlugin<SyslogFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, SyslogFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = DEFAULT_NAME;
-    config.readerOperatorType = CoreOperatorType.SYSLOG_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(DEFAULT_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
diff --git a/contrib/format-xml/src/main/java/org/apache/drill/exec/store/xml/XMLFormatPlugin.java b/contrib/format-xml/src/main/java/org/apache/drill/exec/store/xml/XMLFormatPlugin.java
index 7cf3932..b0a3e82 100644
--- a/contrib/format-xml/src/main/java/org/apache/drill/exec/store/xml/XMLFormatPlugin.java
+++ b/contrib/format-xml/src/main/java/org/apache/drill/exec/store/xml/XMLFormatPlugin.java
@@ -24,15 +24,12 @@ import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanBuilder;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
 import org.apache.drill.exec.store.dfs.easy.EasySubScan;
-import org.apache.drill.shaded.guava.com.google.common.collect.Lists;
 import org.apache.hadoop.conf.Configuration;
 
-
 public class XMLFormatPlugin extends EasyFormatPlugin<XMLFormatConfig> {
 
   public static final String DEFAULT_NAME = "xml";
@@ -61,19 +58,18 @@ public class XMLFormatPlugin extends EasyFormatPlugin<XMLFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, XMLFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = Lists.newArrayList(pluginConfig.getExtensions());
-    config.fsConf = fsConf;
-    config.defaultName = DEFAULT_NAME;
-    config.readerOperatorType = CoreOperatorType.XML_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(DEFAULT_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
diff --git a/contrib/native/client/src/protobuf/UserBitShared.pb.cc b/contrib/native/client/src/protobuf/UserBitShared.pb.cc
index 26b2e4f..ad98dc4 100644
--- a/contrib/native/client/src/protobuf/UserBitShared.pb.cc
+++ b/contrib/native/client/src/protobuf/UserBitShared.pb.cc
@@ -469,7 +469,7 @@ static void InitDefaultsscc_info_UserCredentials_UserBitShared_2eproto() {
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_UserCredentials_UserBitShared_2eproto}, {}};
 
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_UserBitShared_2eproto[22];
-static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_UserBitShared_2eproto[8];
+static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_UserBitShared_2eproto[7];
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_UserBitShared_2eproto = nullptr;
 
 const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_UserBitShared_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
@@ -742,14 +742,16 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_UserBitShared_2eproto::offsets
   PROTOBUF_FIELD_OFFSET(::exec::shared::OperatorProfile, peak_local_memory_allocated_),
   PROTOBUF_FIELD_OFFSET(::exec::shared::OperatorProfile, metric_),
   PROTOBUF_FIELD_OFFSET(::exec::shared::OperatorProfile, wait_nanos_),
+  PROTOBUF_FIELD_OFFSET(::exec::shared::OperatorProfile, operator_type_name_),
   ~0u,
-  0,
   1,
   2,
   3,
   4,
-  ~0u,
   5,
+  ~0u,
+  6,
+  0,
   PROTOBUF_FIELD_OFFSET(::exec::shared::StreamProfile, _has_bits_),
   PROTOBUF_FIELD_OFFSET(::exec::shared::StreamProfile, _internal_metadata_),
   ~0u,  // no _extensions_
@@ -817,12 +819,12 @@ static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOB
   { 169, 197, sizeof(::exec::shared::QueryProfile)},
   { 220, 227, sizeof(::exec::shared::MajorFragmentProfile)},
   { 229, 245, sizeof(::exec::shared::MinorFragmentProfile)},
-  { 256, 269, sizeof(::exec::shared::OperatorProfile)},
-  { 277, 285, sizeof(::exec::shared::StreamProfile)},
-  { 288, 296, sizeof(::exec::shared::MetricValue)},
-  { 299, 305, sizeof(::exec::shared::Registry)},
-  { 306, 313, sizeof(::exec::shared::Jar)},
-  { 315, 323, sizeof(::exec::shared::SaslMessage)},
+  { 256, 270, sizeof(::exec::shared::OperatorProfile)},
+  { 279, 287, sizeof(::exec::shared::StreamProfile)},
+  { 290, 298, sizeof(::exec::shared::MetricValue)},
+  { 301, 307, sizeof(::exec::shared::Registry)},
+  { 308, 315, sizeof(::exec::shared::Jar)},
+  { 317, 325, sizeof(::exec::shared::SaslMessage)},
 };
 
 static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = {
@@ -935,68 +937,33 @@ const char descriptor_table_protodef_UserBitShared_2eproto[] PROTOBUF_SECTION_VA
   "y_used\030\007 \001(\003\022\027\n\017max_memory_used\030\010 \001(\003\022(\n"
   "\010endpoint\030\t \001(\0132\026.exec.DrillbitEndpoint\022"
   "\023\n\013last_update\030\n \001(\003\022\025\n\rlast_progress\030\013 "
-  "\001(\003\"\377\001\n\017OperatorProfile\0221\n\rinput_profile"
+  "\001(\003\"\237\002\n\017OperatorProfile\0221\n\rinput_profile"
   "\030\001 \003(\0132\032.exec.shared.StreamProfile\022\023\n\013op"
-  "erator_id\030\003 \001(\005\022\025\n\roperator_type\030\004 \001(\005\022\023"
-  "\n\013setup_nanos\030\005 \001(\003\022\025\n\rprocess_nanos\030\006 \001"
-  "(\003\022#\n\033peak_local_memory_allocated\030\007 \001(\003\022"
-  "(\n\006metric\030\010 \003(\0132\030.exec.shared.MetricValu"
-  "e\022\022\n\nwait_nanos\030\t \001(\003\"B\n\rStreamProfile\022\017"
-  "\n\007records\030\001 \001(\003\022\017\n\007batches\030\002 \001(\003\022\017\n\007sche"
-  "mas\030\003 \001(\003\"J\n\013MetricValue\022\021\n\tmetric_id\030\001 "
-  "\001(\005\022\022\n\nlong_value\030\002 \001(\003\022\024\n\014double_value\030"
-  "\003 \001(\001\")\n\010Registry\022\035\n\003jar\030\001 \003(\0132\020.exec.sh"
-  "ared.Jar\"/\n\003Jar\022\014\n\004name\030\001 \001(\t\022\032\n\022functio"
-  "n_signature\030\002 \003(\t\"W\n\013SaslMessage\022\021\n\tmech"
-  "anism\030\001 \001(\t\022\014\n\004data\030\002 \001(\014\022\'\n\006status\030\003 \001("
-  "\0162\027.exec.shared.SaslStatus*5\n\nRpcChannel"
-  "\022\017\n\013BIT_CONTROL\020\000\022\014\n\010BIT_DATA\020\001\022\010\n\004USER\020"
-  "\002*V\n\tQueryType\022\007\n\003SQL\020\001\022\013\n\007LOGICAL\020\002\022\014\n\010"
-  "PHYSICAL\020\003\022\r\n\tEXECUTION\020\004\022\026\n\022PREPARED_ST"
-  "ATEMENT\020\005*\207\001\n\rFragmentState\022\013\n\007SENDING\020\000"
-  "\022\027\n\023AWAITING_ALLOCATION\020\001\022\013\n\007RUNNING\020\002\022\014"
-  "\n\010FINISHED\020\003\022\r\n\tCANCELLED\020\004\022\n\n\006FAILED\020\005\022"
-  "\032\n\026CANCELLATION_REQUESTED\020\006*\260\013\n\020CoreOper"
-  "atorType\022\021\n\rSINGLE_SENDER\020\000\022\024\n\020BROADCAST"
-  "_SENDER\020\001\022\n\n\006FILTER\020\002\022\022\n\016HASH_AGGREGATE\020"
-  "\003\022\r\n\tHASH_JOIN\020\004\022\016\n\nMERGE_JOIN\020\005\022\031\n\025HASH"
-  "_PARTITION_SENDER\020\006\022\t\n\005LIMIT\020\007\022\024\n\020MERGIN"
-  "G_RECEIVER\020\010\022\034\n\030ORDERED_PARTITION_SENDER"
-  "\020\t\022\013\n\007PROJECT\020\n\022\026\n\022UNORDERED_RECEIVER\020\013\022"
-  "\032\n\026RANGE_PARTITION_SENDER\020\014\022\n\n\006SCREEN\020\r\022"
-  "\034\n\030SELECTION_VECTOR_REMOVER\020\016\022\027\n\023STREAMI"
-  "NG_AGGREGATE\020\017\022\016\n\nTOP_N_SORT\020\020\022\021\n\rEXTERN"
-  "AL_SORT\020\021\022\t\n\005TRACE\020\022\022\t\n\005UNION\020\023\022\014\n\010OLD_S"
-  "ORT\020\024\022\032\n\026PARQUET_ROW_GROUP_SCAN\020\025\022\021\n\rHIV"
-  "E_SUB_SCAN\020\026\022\025\n\021SYSTEM_TABLE_SCAN\020\027\022\021\n\rM"
-  "OCK_SUB_SCAN\020\030\022\022\n\016PARQUET_WRITER\020\031\022\023\n\017DI"
-  "RECT_SUB_SCAN\020\032\022\017\n\013TEXT_WRITER\020\033\022\021\n\rTEXT"
-  "_SUB_SCAN\020\034\022\021\n\rJSON_SUB_SCAN\020\035\022\030\n\024INFO_S"
-  "CHEMA_SUB_SCAN\020\036\022\023\n\017COMPLEX_TO_JSON\020\037\022\025\n"
-  "\021PRODUCER_CONSUMER\020 \022\022\n\016HBASE_SUB_SCAN\020!"
-  "\022\n\n\006WINDOW\020\"\022\024\n\020NESTED_LOOP_JOIN\020#\022\021\n\rAV"
-  "RO_SUB_SCAN\020$\022\021\n\rPCAP_SUB_SCAN\020%\022\022\n\016KAFK"
-  "A_SUB_SCAN\020&\022\021\n\rKUDU_SUB_SCAN\020\'\022\013\n\007FLATT"
-  "EN\020(\022\020\n\014LATERAL_JOIN\020)\022\n\n\006UNNEST\020*\022,\n(HI"
-  "VE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN\020+"
-  "\022\r\n\tJDBC_SCAN\020,\022\022\n\016REGEX_SUB_SCAN\020-\022\023\n\017M"
-  "APRDB_SUB_SCAN\020.\022\022\n\016MONGO_SUB_SCAN\020/\022\017\n\013"
-  "KUDU_WRITER\0200\022\026\n\022OPEN_TSDB_SUB_SCAN\0201\022\017\n"
-  "\013JSON_WRITER\0202\022\026\n\022HTPPD_LOG_SUB_SCAN\0203\022\022"
-  "\n\016IMAGE_SUB_SCAN\0204\022\025\n\021SEQUENCE_SUB_SCAN\020"
-  "5\022\023\n\017PARTITION_LIMIT\0206\022\023\n\017PCAPNG_SUB_SCA"
-  "N\0207\022\022\n\016RUNTIME_FILTER\0208\022\017\n\013ROWKEY_JOIN\0209"
-  "\022\023\n\017SYSLOG_SUB_SCAN\020:\022\030\n\024STATISTICS_AGGR"
-  "EGATE\020;\022\020\n\014UNPIVOT_MAPS\020<\022\024\n\020STATISTICS_"
-  "MERGE\020=\022\021\n\rLTSV_SUB_SCAN\020>\022\021\n\rHDF5_SUB_S"
-  "CAN\020\?\022\022\n\016EXCEL_SUB_SCAN\020@\022\020\n\014SHP_SUB_SCA"
-  "N\020A\022\024\n\020METADATA_HANDLER\020B\022\027\n\023METADATA_CO"
-  "NTROLLER\020C\022\022\n\016DRUID_SUB_SCAN\020D\022\021\n\rSPSS_S"
-  "UB_SCAN\020E\022\021\n\rHTTP_SUB_SCAN\020F\022\020\n\014XML_SUB_"
-  "SCAN\020G*g\n\nSaslStatus\022\020\n\014SASL_UNKNOWN\020\000\022\016"
-  "\n\nSASL_START\020\001\022\024\n\020SASL_IN_PROGRESS\020\002\022\020\n\014"
-  "SASL_SUCCESS\020\003\022\017\n\013SASL_FAILED\020\004B.\n\033org.a"
-  "pache.drill.exec.protoB\rUserBitSharedH\001"
+  "erator_id\030\003 \001(\005\022\031\n\roperator_type\030\004 \001(\005B\002"
+  "\030\001\022\023\n\013setup_nanos\030\005 \001(\003\022\025\n\rprocess_nanos"
+  "\030\006 \001(\003\022#\n\033peak_local_memory_allocated\030\007 "
+  "\001(\003\022(\n\006metric\030\010 \003(\0132\030.exec.shared.Metric"
+  "Value\022\022\n\nwait_nanos\030\t \001(\003\022\032\n\022operator_ty"
+  "pe_name\030\n \001(\t\"B\n\rStreamProfile\022\017\n\007record"
+  "s\030\001 \001(\003\022\017\n\007batches\030\002 \001(\003\022\017\n\007schemas\030\003 \001("
+  "\003\"J\n\013MetricValue\022\021\n\tmetric_id\030\001 \001(\005\022\022\n\nl"
+  "ong_value\030\002 \001(\003\022\024\n\014double_value\030\003 \001(\001\")\n"
+  "\010Registry\022\035\n\003jar\030\001 \003(\0132\020.exec.shared.Jar"
+  "\"/\n\003Jar\022\014\n\004name\030\001 \001(\t\022\032\n\022function_signat"
+  "ure\030\002 \003(\t\"W\n\013SaslMessage\022\021\n\tmechanism\030\001 "
+  "\001(\t\022\014\n\004data\030\002 \001(\014\022\'\n\006status\030\003 \001(\0162\027.exec"
+  ".shared.SaslStatus*5\n\nRpcChannel\022\017\n\013BIT_"
+  "CONTROL\020\000\022\014\n\010BIT_DATA\020\001\022\010\n\004USER\020\002*V\n\tQue"
+  "ryType\022\007\n\003SQL\020\001\022\013\n\007LOGICAL\020\002\022\014\n\010PHYSICAL"
+  "\020\003\022\r\n\tEXECUTION\020\004\022\026\n\022PREPARED_STATEMENT\020"
+  "\005*\207\001\n\rFragmentState\022\013\n\007SENDING\020\000\022\027\n\023AWAI"
+  "TING_ALLOCATION\020\001\022\013\n\007RUNNING\020\002\022\014\n\010FINISH"
+  "ED\020\003\022\r\n\tCANCELLED\020\004\022\n\n\006FAILED\020\005\022\032\n\026CANCE"
+  "LLATION_REQUESTED\020\006*g\n\nSaslStatus\022\020\n\014SAS"
+  "L_UNKNOWN\020\000\022\016\n\nSASL_START\020\001\022\024\n\020SASL_IN_P"
+  "ROGRESS\020\002\022\020\n\014SASL_SUCCESS\020\003\022\017\n\013SASL_FAIL"
+  "ED\020\004B.\n\033org.apache.drill.exec.protoB\rUse"
+  "rBitSharedH\001"
   ;
 static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_UserBitShared_2eproto_deps[3] = {
   &::descriptor_table_Coordination_2eproto,
@@ -1030,7 +997,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_Use
 static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_UserBitShared_2eproto_once;
 static bool descriptor_table_UserBitShared_2eproto_initialized = false;
 const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_UserBitShared_2eproto = {
-  &descriptor_table_UserBitShared_2eproto_initialized, descriptor_table_protodef_UserBitShared_2eproto, "UserBitShared.proto", 5839,
+  &descriptor_table_UserBitShared_2eproto_initialized, descriptor_table_protodef_UserBitShared_2eproto, "UserBitShared.proto", 4412,
   &descriptor_table_UserBitShared_2eproto_once, descriptor_table_UserBitShared_2eproto_sccs, descriptor_table_UserBitShared_2eproto_deps, 22, 3,
   schemas, file_default_instances, TableStruct_UserBitShared_2eproto::offsets,
   file_level_metadata_UserBitShared_2eproto, 22, file_level_enum_descriptors_UserBitShared_2eproto, file_level_service_descriptors_UserBitShared_2eproto,
@@ -1192,93 +1159,9 @@ bool FragmentState_IsValid(int value) {
   }
 }
 
-const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* CoreOperatorType_descriptor() {
-  ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_UserBitShared_2eproto);
-  return file_level_enum_descriptors_UserBitShared_2eproto[6];
-}
-bool CoreOperatorType_IsValid(int value) {
-  switch (value) {
-    case 0:
-    case 1:
-    case 2:
-    case 3:
-    case 4:
-    case 5:
-    case 6:
-    case 7:
-    case 8:
-    case 9:
-    case 10:
-    case 11:
-    case 12:
-    case 13:
-    case 14:
-    case 15:
-    case 16:
-    case 17:
-    case 18:
-    case 19:
-    case 20:
-    case 21:
-    case 22:
-    case 23:
-    case 24:
-    case 25:
-    case 26:
-    case 27:
-    case 28:
-    case 29:
-    case 30:
-    case 31:
-    case 32:
-    case 33:
-    case 34:
-    case 35:
-    case 36:
-    case 37:
-    case 38:
-    case 39:
-    case 40:
-    case 41:
-    case 42:
-    case 43:
-    case 44:
-    case 45:
-    case 46:
-    case 47:
-    case 48:
-    case 49:
-    case 50:
-    case 51:
-    case 52:
-    case 53:
-    case 54:
-    case 55:
-    case 56:
-    case 57:
-    case 58:
-    case 59:
-    case 60:
-    case 61:
-    case 62:
-    case 63:
-    case 64:
-    case 65:
-    case 66:
-    case 67:
-    case 68:
-    case 69:
-    case 70:
-    case 71:
-      return true;
-    default:
-      return false;
-  }
-}
-
 const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* SaslStatus_descriptor() {
   ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_UserBitShared_2eproto);
-  return file_level_enum_descriptors_UserBitShared_2eproto[7];
+  return file_level_enum_descriptors_UserBitShared_2eproto[6];
 }
 bool SaslStatus_IsValid(int value) {
   switch (value) {
@@ -7454,22 +7337,25 @@ class OperatorProfile::_Internal {
  public:
   using HasBits = decltype(std::declval<OperatorProfile>()._has_bits_);
   static void set_has_operator_id(HasBits* has_bits) {
-    (*has_bits)[0] |= 1u;
+    (*has_bits)[0] |= 2u;
   }
   static void set_has_operator_type(HasBits* has_bits) {
-    (*has_bits)[0] |= 2u;
+    (*has_bits)[0] |= 4u;
   }
   static void set_has_setup_nanos(HasBits* has_bits) {
-    (*has_bits)[0] |= 4u;
+    (*has_bits)[0] |= 8u;
   }
   static void set_has_process_nanos(HasBits* has_bits) {
-    (*has_bits)[0] |= 8u;
+    (*has_bits)[0] |= 16u;
   }
   static void set_has_peak_local_memory_allocated(HasBits* has_bits) {
-    (*has_bits)[0] |= 16u;
+    (*has_bits)[0] |= 32u;
   }
   static void set_has_wait_nanos(HasBits* has_bits) {
-    (*has_bits)[0] |= 32u;
+    (*has_bits)[0] |= 64u;
+  }
+  static void set_has_operator_type_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
 };
 
@@ -7485,6 +7371,10 @@ OperatorProfile::OperatorProfile(const OperatorProfile& from)
       input_profile_(from.input_profile_),
       metric_(from.metric_) {
   _internal_metadata_.MergeFrom(from._internal_metadata_);
+  operator_type_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  if (from._internal_has_operator_type_name()) {
+    operator_type_name_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.operator_type_name_);
+  }
   ::memcpy(&operator_id_, &from.operator_id_,
     static_cast<size_t>(reinterpret_cast<char*>(&wait_nanos_) -
     reinterpret_cast<char*>(&operator_id_)) + sizeof(wait_nanos_));
@@ -7493,6 +7383,7 @@ OperatorProfile::OperatorProfile(const OperatorProfile& from)
 
 void OperatorProfile::SharedCtor() {
   ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OperatorProfile_UserBitShared_2eproto.base);
+  operator_type_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
   ::memset(&operator_id_, 0, static_cast<size_t>(
       reinterpret_cast<char*>(&wait_nanos_) -
       reinterpret_cast<char*>(&operator_id_)) + sizeof(wait_nanos_));
@@ -7504,6 +7395,7 @@ OperatorProfile::~OperatorProfile() {
 }
 
 void OperatorProfile::SharedDtor() {
+  operator_type_name_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
 }
 
 void OperatorProfile::SetCachedSize(int size) const {
@@ -7524,7 +7416,10 @@ void OperatorProfile::Clear() {
   input_profile_.Clear();
   metric_.Clear();
   cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 0x0000003fu) {
+  if (cached_has_bits & 0x00000001u) {
+    operator_type_name_.ClearNonDefaultToEmptyNoArena();
+  }
+  if (cached_has_bits & 0x0000007eu) {
     ::memset(&operator_id_, 0, static_cast<size_t>(
         reinterpret_cast<char*>(&wait_nanos_) -
         reinterpret_cast<char*>(&operator_id_)) + sizeof(wait_nanos_));
@@ -7561,7 +7456,7 @@ const char* OperatorProfile::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPAC
           CHK_(ptr);
         } else goto handle_unusual;
         continue;
-      // optional int32 operator_type = 4;
+      // optional int32 operator_type = 4 [deprecated = true];
       case 4:
         if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32)) {
           _Internal::set_has_operator_type(&has_bits);
@@ -7613,6 +7508,17 @@ const char* OperatorProfile::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPAC
           CHK_(ptr);
         } else goto handle_unusual;
         continue;
+      // optional string operator_type_name = 10;
+      case 10:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 82)) {
+          auto str = _internal_mutable_operator_type_name();
+          ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx);
+          #ifndef NDEBUG
+          ::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "exec.shared.OperatorProfile.operator_type_name");
+          #endif  // !NDEBUG
+          CHK_(ptr);
+        } else goto handle_unusual;
+        continue;
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
@@ -7650,31 +7556,31 @@ failure:
 
   cached_has_bits = _has_bits_[0];
   // optional int32 operator_id = 3;
-  if (cached_has_bits & 0x00000001u) {
+  if (cached_has_bits & 0x00000002u) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->_internal_operator_id(), target);
   }
 
-  // optional int32 operator_type = 4;
-  if (cached_has_bits & 0x00000002u) {
+  // optional int32 operator_type = 4 [deprecated = true];
+  if (cached_has_bits & 0x00000004u) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(4, this->_internal_operator_type(), target);
   }
 
   // optional int64 setup_nanos = 5;
-  if (cached_has_bits & 0x00000004u) {
+  if (cached_has_bits & 0x00000008u) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt64ToArray(5, this->_internal_setup_nanos(), target);
   }
 
   // optional int64 process_nanos = 6;
-  if (cached_has_bits & 0x00000008u) {
+  if (cached_has_bits & 0x00000010u) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt64ToArray(6, this->_internal_process_nanos(), target);
   }
 
   // optional int64 peak_local_memory_allocated = 7;
-  if (cached_has_bits & 0x00000010u) {
+  if (cached_has_bits & 0x00000020u) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt64ToArray(7, this->_internal_peak_local_memory_allocated(), target);
   }
@@ -7688,11 +7594,21 @@ failure:
   }
 
   // optional int64 wait_nanos = 9;
-  if (cached_has_bits & 0x00000020u) {
+  if (cached_has_bits & 0x00000040u) {
     target = stream->EnsureSpace(target);
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt64ToArray(9, this->_internal_wait_nanos(), target);
   }
 
+  // optional string operator_type_name = 10;
+  if (cached_has_bits & 0x00000001u) {
+    ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->_internal_operator_type_name().data(), static_cast<int>(this->_internal_operator_type_name().length()),
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SERIALIZE,
+      "exec.shared.OperatorProfile.operator_type_name");
+    target = stream->WriteStringMaybeAliased(
+        10, this->_internal_operator_type_name(), target);
+  }
+
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields(), target, stream);
@@ -7724,44 +7640,51 @@ size_t OperatorProfile::ByteSizeLong() const {
   }
 
   cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 0x0000003fu) {
-    // optional int32 operator_id = 3;
+  if (cached_has_bits & 0x0000007fu) {
+    // optional string operator_type_name = 10;
     if (cached_has_bits & 0x00000001u) {
       total_size += 1 +
+        ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+          this->_internal_operator_type_name());
+    }
+
+    // optional int32 operator_id = 3;
+    if (cached_has_bits & 0x00000002u) {
+      total_size += 1 +
         ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size(
           this->_internal_operator_id());
     }
 
-    // optional int32 operator_type = 4;
-    if (cached_has_bits & 0x00000002u) {
+    // optional int32 operator_type = 4 [deprecated = true];
+    if (cached_has_bits & 0x00000004u) {
       total_size += 1 +
         ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size(
           this->_internal_operator_type());
     }
 
     // optional int64 setup_nanos = 5;
-    if (cached_has_bits & 0x00000004u) {
+    if (cached_has_bits & 0x00000008u) {
       total_size += 1 +
         ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int64Size(
           this->_internal_setup_nanos());
     }
 
     // optional int64 process_nanos = 6;
-    if (cached_has_bits & 0x00000008u) {
+    if (cached_has_bits & 0x00000010u) {
       total_size += 1 +
         ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int64Size(
           this->_internal_process_nanos());
     }
 
     // optional int64 peak_local_memory_allocated = 7;
-    if (cached_has_bits & 0x00000010u) {
+    if (cached_has_bits & 0x00000020u) {
       total_size += 1 +
         ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int64Size(
           this->_internal_peak_local_memory_allocated());
     }
 
     // optional int64 wait_nanos = 9;
-    if (cached_has_bits & 0x00000020u) {
+    if (cached_has_bits & 0x00000040u) {
       total_size += 1 +
         ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int64Size(
           this->_internal_wait_nanos());
@@ -7802,23 +7725,27 @@ void OperatorProfile::MergeFrom(const OperatorProfile& from) {
   input_profile_.MergeFrom(from.input_profile_);
   metric_.MergeFrom(from.metric_);
   cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 0x0000003fu) {
+  if (cached_has_bits & 0x0000007fu) {
     if (cached_has_bits & 0x00000001u) {
-      operator_id_ = from.operator_id_;
+      _has_bits_[0] |= 0x00000001u;
+      operator_type_name_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.operator_type_name_);
     }
     if (cached_has_bits & 0x00000002u) {
-      operator_type_ = from.operator_type_;
+      operator_id_ = from.operator_id_;
     }
     if (cached_has_bits & 0x00000004u) {
-      setup_nanos_ = from.setup_nanos_;
+      operator_type_ = from.operator_type_;
     }
     if (cached_has_bits & 0x00000008u) {
-      process_nanos_ = from.process_nanos_;
+      setup_nanos_ = from.setup_nanos_;
     }
     if (cached_has_bits & 0x00000010u) {
-      peak_local_memory_allocated_ = from.peak_local_memory_allocated_;
+      process_nanos_ = from.process_nanos_;
     }
     if (cached_has_bits & 0x00000020u) {
+      peak_local_memory_allocated_ = from.peak_local_memory_allocated_;
+    }
+    if (cached_has_bits & 0x00000040u) {
       wait_nanos_ = from.wait_nanos_;
     }
     _has_bits_[0] |= cached_has_bits;
@@ -7849,6 +7776,8 @@ void OperatorProfile::InternalSwap(OperatorProfile* other) {
   swap(_has_bits_[0], other->_has_bits_[0]);
   input_profile_.InternalSwap(&other->input_profile_);
   metric_.InternalSwap(&other->metric_);
+  operator_type_name_.Swap(&other->operator_type_name_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
   swap(operator_id_, other->operator_id_);
   swap(operator_type_, other->operator_type_);
   swap(setup_nanos_, other->setup_nanos_);
diff --git a/contrib/native/client/src/protobuf/UserBitShared.pb.h b/contrib/native/client/src/protobuf/UserBitShared.pb.h
index c9afda2..1e7ac8a 100644
--- a/contrib/native/client/src/protobuf/UserBitShared.pb.h
+++ b/contrib/native/client/src/protobuf/UserBitShared.pb.h
@@ -321,99 +321,6 @@ inline bool FragmentState_Parse(
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FragmentState>(
     FragmentState_descriptor(), name, value);
 }
-enum CoreOperatorType : int {
-  SINGLE_SENDER = 0,
-  BROADCAST_SENDER = 1,
-  FILTER = 2,
-  HASH_AGGREGATE = 3,
-  HASH_JOIN = 4,
-  MERGE_JOIN = 5,
-  HASH_PARTITION_SENDER = 6,
-  LIMIT = 7,
-  MERGING_RECEIVER = 8,
-  ORDERED_PARTITION_SENDER = 9,
-  PROJECT = 10,
-  UNORDERED_RECEIVER = 11,
-  RANGE_PARTITION_SENDER = 12,
-  SCREEN = 13,
-  SELECTION_VECTOR_REMOVER = 14,
-  STREAMING_AGGREGATE = 15,
-  TOP_N_SORT = 16,
-  EXTERNAL_SORT = 17,
-  TRACE = 18,
-  UNION = 19,
-  OLD_SORT = 20,
-  PARQUET_ROW_GROUP_SCAN = 21,
-  HIVE_SUB_SCAN = 22,
-  SYSTEM_TABLE_SCAN = 23,
-  MOCK_SUB_SCAN = 24,
-  PARQUET_WRITER = 25,
-  DIRECT_SUB_SCAN = 26,
-  TEXT_WRITER = 27,
-  TEXT_SUB_SCAN = 28,
-  JSON_SUB_SCAN = 29,
-  INFO_SCHEMA_SUB_SCAN = 30,
-  COMPLEX_TO_JSON = 31,
-  PRODUCER_CONSUMER = 32,
-  HBASE_SUB_SCAN = 33,
-  WINDOW = 34,
-  NESTED_LOOP_JOIN = 35,
-  AVRO_SUB_SCAN = 36,
-  PCAP_SUB_SCAN = 37,
-  KAFKA_SUB_SCAN = 38,
-  KUDU_SUB_SCAN = 39,
-  FLATTEN = 40,
-  LATERAL_JOIN = 41,
-  UNNEST = 42,
-  HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN = 43,
-  JDBC_SCAN = 44,
-  REGEX_SUB_SCAN = 45,
-  MAPRDB_SUB_SCAN = 46,
-  MONGO_SUB_SCAN = 47,
-  KUDU_WRITER = 48,
-  OPEN_TSDB_SUB_SCAN = 49,
-  JSON_WRITER = 50,
-  HTPPD_LOG_SUB_SCAN = 51,
-  IMAGE_SUB_SCAN = 52,
-  SEQUENCE_SUB_SCAN = 53,
-  PARTITION_LIMIT = 54,
-  PCAPNG_SUB_SCAN = 55,
-  RUNTIME_FILTER = 56,
-  ROWKEY_JOIN = 57,
-  SYSLOG_SUB_SCAN = 58,
-  STATISTICS_AGGREGATE = 59,
-  UNPIVOT_MAPS = 60,
-  STATISTICS_MERGE = 61,
-  LTSV_SUB_SCAN = 62,
-  HDF5_SUB_SCAN = 63,
-  EXCEL_SUB_SCAN = 64,
-  SHP_SUB_SCAN = 65,
-  METADATA_HANDLER = 66,
-  METADATA_CONTROLLER = 67,
-  DRUID_SUB_SCAN = 68,
-  SPSS_SUB_SCAN = 69,
-  HTTP_SUB_SCAN = 70,
-  XML_SUB_SCAN = 71
-};
-bool CoreOperatorType_IsValid(int value);
-constexpr CoreOperatorType CoreOperatorType_MIN = SINGLE_SENDER;
-constexpr CoreOperatorType CoreOperatorType_MAX = XML_SUB_SCAN;
-constexpr int CoreOperatorType_ARRAYSIZE = CoreOperatorType_MAX + 1;
-
-const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* CoreOperatorType_descriptor();
-template<typename T>
-inline const std::string& CoreOperatorType_Name(T enum_t_value) {
-  static_assert(::std::is_same<T, CoreOperatorType>::value ||
-    ::std::is_integral<T>::value,
-    "Incorrect type passed to function CoreOperatorType_Name.");
-  return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    CoreOperatorType_descriptor(), enum_t_value);
-}
-inline bool CoreOperatorType_Parse(
-    const std::string& name, CoreOperatorType* value) {
-  return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<CoreOperatorType>(
-    CoreOperatorType_descriptor(), name, value);
-}
 enum SaslStatus : int {
   SASL_UNKNOWN = 0,
   SASL_START = 1,
@@ -4246,6 +4153,7 @@ class OperatorProfile :
   enum : int {
     kInputProfileFieldNumber = 1,
     kMetricFieldNumber = 8,
+    kOperatorTypeNameFieldNumber = 10,
     kOperatorIdFieldNumber = 3,
     kOperatorTypeFieldNumber = 4,
     kSetupNanosFieldNumber = 5,
@@ -4289,6 +4197,26 @@ class OperatorProfile :
   const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::exec::shared::MetricValue >&
       metric() const;
 
+  // optional string operator_type_name = 10;
+  bool has_operator_type_name() const;
+  private:
+  bool _internal_has_operator_type_name() const;
+  public:
+  void clear_operator_type_name();
+  const std::string& operator_type_name() const;
+  void set_operator_type_name(const std::string& value);
+  void set_operator_type_name(std::string&& value);
+  void set_operator_type_name(const char* value);
+  void set_operator_type_name(const char* value, size_t size);
+  std::string* mutable_operator_type_name();
+  std::string* release_operator_type_name();
+  void set_allocated_operator_type_name(std::string* operator_type_name);
+  private:
+  const std::string& _internal_operator_type_name() const;
+  void _internal_set_operator_type_name(const std::string& value);
+  std::string* _internal_mutable_operator_type_name();
+  public:
+
   // optional int32 operator_id = 3;
   bool has_operator_id() const;
   private:
@@ -4302,14 +4230,14 @@ class OperatorProfile :
   void _internal_set_operator_id(::PROTOBUF_NAMESPACE_ID::int32 value);
   public:
 
-  // optional int32 operator_type = 4;
-  bool has_operator_type() const;
+  // optional int32 operator_type = 4 [deprecated = true];
+  PROTOBUF_DEPRECATED bool has_operator_type() const;
   private:
   bool _internal_has_operator_type() const;
   public:
-  void clear_operator_type();
-  ::PROTOBUF_NAMESPACE_ID::int32 operator_type() const;
-  void set_operator_type(::PROTOBUF_NAMESPACE_ID::int32 value);
+  PROTOBUF_DEPRECATED void clear_operator_type();
+  PROTOBUF_DEPRECATED ::PROTOBUF_NAMESPACE_ID::int32 operator_type() const;
+  PROTOBUF_DEPRECATED void set_operator_type(::PROTOBUF_NAMESPACE_ID::int32 value);
   private:
   ::PROTOBUF_NAMESPACE_ID::int32 _internal_operator_type() const;
   void _internal_set_operator_type(::PROTOBUF_NAMESPACE_ID::int32 value);
@@ -4376,6 +4304,7 @@ class OperatorProfile :
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
   ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::exec::shared::StreamProfile > input_profile_;
   ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::exec::shared::MetricValue > metric_;
+  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr operator_type_name_;
   ::PROTOBUF_NAMESPACE_ID::int32 operator_id_;
   ::PROTOBUF_NAMESPACE_ID::int32 operator_type_;
   ::PROTOBUF_NAMESPACE_ID::int64 setup_nanos_;
@@ -9318,7 +9247,7 @@ OperatorProfile::input_profile() const {
 
 // optional int32 operator_id = 3;
 inline bool OperatorProfile::_internal_has_operator_id() const {
-  bool value = (_has_bits_[0] & 0x00000001u) != 0;
+  bool value = (_has_bits_[0] & 0x00000002u) != 0;
   return value;
 }
 inline bool OperatorProfile::has_operator_id() const {
@@ -9326,7 +9255,7 @@ inline bool OperatorProfile::has_operator_id() const {
 }
 inline void OperatorProfile::clear_operator_id() {
   operator_id_ = 0;
-  _has_bits_[0] &= ~0x00000001u;
+  _has_bits_[0] &= ~0x00000002u;
 }
 inline ::PROTOBUF_NAMESPACE_ID::int32 OperatorProfile::_internal_operator_id() const {
   return operator_id_;
@@ -9336,7 +9265,7 @@ inline ::PROTOBUF_NAMESPACE_ID::int32 OperatorProfile::operator_id() const {
   return _internal_operator_id();
 }
 inline void OperatorProfile::_internal_set_operator_id(::PROTOBUF_NAMESPACE_ID::int32 value) {
-  _has_bits_[0] |= 0x00000001u;
+  _has_bits_[0] |= 0x00000002u;
   operator_id_ = value;
 }
 inline void OperatorProfile::set_operator_id(::PROTOBUF_NAMESPACE_ID::int32 value) {
@@ -9344,9 +9273,9 @@ inline void OperatorProfile::set_operator_id(::PROTOBUF_NAMESPACE_ID::int32 valu
   // @@protoc_insertion_point(field_set:exec.shared.OperatorProfile.operator_id)
 }
 
-// optional int32 operator_type = 4;
+// optional int32 operator_type = 4 [deprecated = true];
 inline bool OperatorProfile::_internal_has_operator_type() const {
-  bool value = (_has_bits_[0] & 0x00000002u) != 0;
+  bool value = (_has_bits_[0] & 0x00000004u) != 0;
   return value;
 }
 inline bool OperatorProfile::has_operator_type() const {
@@ -9354,7 +9283,7 @@ inline bool OperatorProfile::has_operator_type() const {
 }
 inline void OperatorProfile::clear_operator_type() {
   operator_type_ = 0;
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline ::PROTOBUF_NAMESPACE_ID::int32 OperatorProfile::_internal_operator_type() const {
   return operator_type_;
@@ -9364,7 +9293,7 @@ inline ::PROTOBUF_NAMESPACE_ID::int32 OperatorProfile::operator_type() const {
   return _internal_operator_type();
 }
 inline void OperatorProfile::_internal_set_operator_type(::PROTOBUF_NAMESPACE_ID::int32 value) {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000004u;
   operator_type_ = value;
 }
 inline void OperatorProfile::set_operator_type(::PROTOBUF_NAMESPACE_ID::int32 value) {
@@ -9374,7 +9303,7 @@ inline void OperatorProfile::set_operator_type(::PROTOBUF_NAMESPACE_ID::int32 va
 
 // optional int64 setup_nanos = 5;
 inline bool OperatorProfile::_internal_has_setup_nanos() const {
-  bool value = (_has_bits_[0] & 0x00000004u) != 0;
+  bool value = (_has_bits_[0] & 0x00000008u) != 0;
   return value;
 }
 inline bool OperatorProfile::has_setup_nanos() const {
@@ -9382,7 +9311,7 @@ inline bool OperatorProfile::has_setup_nanos() const {
 }
 inline void OperatorProfile::clear_setup_nanos() {
   setup_nanos_ = PROTOBUF_LONGLONG(0);
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::_internal_setup_nanos() const {
   return setup_nanos_;
@@ -9392,7 +9321,7 @@ inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::setup_nanos() const {
   return _internal_setup_nanos();
 }
 inline void OperatorProfile::_internal_set_setup_nanos(::PROTOBUF_NAMESPACE_ID::int64 value) {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000008u;
   setup_nanos_ = value;
 }
 inline void OperatorProfile::set_setup_nanos(::PROTOBUF_NAMESPACE_ID::int64 value) {
@@ -9402,7 +9331,7 @@ inline void OperatorProfile::set_setup_nanos(::PROTOBUF_NAMESPACE_ID::int64 valu
 
 // optional int64 process_nanos = 6;
 inline bool OperatorProfile::_internal_has_process_nanos() const {
-  bool value = (_has_bits_[0] & 0x00000008u) != 0;
+  bool value = (_has_bits_[0] & 0x00000010u) != 0;
   return value;
 }
 inline bool OperatorProfile::has_process_nanos() const {
@@ -9410,7 +9339,7 @@ inline bool OperatorProfile::has_process_nanos() const {
 }
 inline void OperatorProfile::clear_process_nanos() {
   process_nanos_ = PROTOBUF_LONGLONG(0);
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00000010u;
 }
 inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::_internal_process_nanos() const {
   return process_nanos_;
@@ -9420,7 +9349,7 @@ inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::process_nanos() const {
   return _internal_process_nanos();
 }
 inline void OperatorProfile::_internal_set_process_nanos(::PROTOBUF_NAMESPACE_ID::int64 value) {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00000010u;
   process_nanos_ = value;
 }
 inline void OperatorProfile::set_process_nanos(::PROTOBUF_NAMESPACE_ID::int64 value) {
@@ -9430,7 +9359,7 @@ inline void OperatorProfile::set_process_nanos(::PROTOBUF_NAMESPACE_ID::int64 va
 
 // optional int64 peak_local_memory_allocated = 7;
 inline bool OperatorProfile::_internal_has_peak_local_memory_allocated() const {
-  bool value = (_has_bits_[0] & 0x00000010u) != 0;
+  bool value = (_has_bits_[0] & 0x00000020u) != 0;
   return value;
 }
 inline bool OperatorProfile::has_peak_local_memory_allocated() const {
@@ -9438,7 +9367,7 @@ inline bool OperatorProfile::has_peak_local_memory_allocated() const {
 }
 inline void OperatorProfile::clear_peak_local_memory_allocated() {
   peak_local_memory_allocated_ = PROTOBUF_LONGLONG(0);
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::_internal_peak_local_memory_allocated() const {
   return peak_local_memory_allocated_;
@@ -9448,7 +9377,7 @@ inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::peak_local_memory_allocat
   return _internal_peak_local_memory_allocated();
 }
 inline void OperatorProfile::_internal_set_peak_local_memory_allocated(::PROTOBUF_NAMESPACE_ID::int64 value) {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000020u;
   peak_local_memory_allocated_ = value;
 }
 inline void OperatorProfile::set_peak_local_memory_allocated(::PROTOBUF_NAMESPACE_ID::int64 value) {
@@ -9497,7 +9426,7 @@ OperatorProfile::metric() const {
 
 // optional int64 wait_nanos = 9;
 inline bool OperatorProfile::_internal_has_wait_nanos() const {
-  bool value = (_has_bits_[0] & 0x00000020u) != 0;
+  bool value = (_has_bits_[0] & 0x00000040u) != 0;
   return value;
 }
 inline bool OperatorProfile::has_wait_nanos() const {
@@ -9505,7 +9434,7 @@ inline bool OperatorProfile::has_wait_nanos() const {
 }
 inline void OperatorProfile::clear_wait_nanos() {
   wait_nanos_ = PROTOBUF_LONGLONG(0);
-  _has_bits_[0] &= ~0x00000020u;
+  _has_bits_[0] &= ~0x00000040u;
 }
 inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::_internal_wait_nanos() const {
   return wait_nanos_;
@@ -9515,7 +9444,7 @@ inline ::PROTOBUF_NAMESPACE_ID::int64 OperatorProfile::wait_nanos() const {
   return _internal_wait_nanos();
 }
 inline void OperatorProfile::_internal_set_wait_nanos(::PROTOBUF_NAMESPACE_ID::int64 value) {
-  _has_bits_[0] |= 0x00000020u;
+  _has_bits_[0] |= 0x00000040u;
   wait_nanos_ = value;
 }
 inline void OperatorProfile::set_wait_nanos(::PROTOBUF_NAMESPACE_ID::int64 value) {
@@ -9523,6 +9452,77 @@ inline void OperatorProfile::set_wait_nanos(::PROTOBUF_NAMESPACE_ID::int64 value
   // @@protoc_insertion_point(field_set:exec.shared.OperatorProfile.wait_nanos)
 }
 
+// optional string operator_type_name = 10;
+inline bool OperatorProfile::_internal_has_operator_type_name() const {
+  bool value = (_has_bits_[0] & 0x00000001u) != 0;
+  return value;
+}
+inline bool OperatorProfile::has_operator_type_name() const {
+  return _internal_has_operator_type_name();
+}
+inline void OperatorProfile::clear_operator_type_name() {
+  operator_type_name_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline const std::string& OperatorProfile::operator_type_name() const {
+  // @@protoc_insertion_point(field_get:exec.shared.OperatorProfile.operator_type_name)
+  return _internal_operator_type_name();
+}
+inline void OperatorProfile::set_operator_type_name(const std::string& value) {
+  _internal_set_operator_type_name(value);
+  // @@protoc_insertion_point(field_set:exec.shared.OperatorProfile.operator_type_name)
+}
+inline std::string* OperatorProfile::mutable_operator_type_name() {
+  // @@protoc_insertion_point(field_mutable:exec.shared.OperatorProfile.operator_type_name)
+  return _internal_mutable_operator_type_name();
+}
+inline const std::string& OperatorProfile::_internal_operator_type_name() const {
+  return operator_type_name_.GetNoArena();
+}
+inline void OperatorProfile::_internal_set_operator_type_name(const std::string& value) {
+  _has_bits_[0] |= 0x00000001u;
+  operator_type_name_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value);
+}
+inline void OperatorProfile::set_operator_type_name(std::string&& value) {
+  _has_bits_[0] |= 0x00000001u;
+  operator_type_name_.SetNoArena(
+    &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:exec.shared.OperatorProfile.operator_type_name)
+}
+inline void OperatorProfile::set_operator_type_name(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  _has_bits_[0] |= 0x00000001u;
+  operator_type_name_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:exec.shared.OperatorProfile.operator_type_name)
+}
+inline void OperatorProfile::set_operator_type_name(const char* value, size_t size) {
+  _has_bits_[0] |= 0x00000001u;
+  operator_type_name_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:exec.shared.OperatorProfile.operator_type_name)
+}
+inline std::string* OperatorProfile::_internal_mutable_operator_type_name() {
+  _has_bits_[0] |= 0x00000001u;
+  return operator_type_name_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+}
+inline std::string* OperatorProfile::release_operator_type_name() {
+  // @@protoc_insertion_point(field_release:exec.shared.OperatorProfile.operator_type_name)
+  if (!_internal_has_operator_type_name()) {
+    return nullptr;
+  }
+  _has_bits_[0] &= ~0x00000001u;
+  return operator_type_name_.ReleaseNonDefaultNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+}
+inline void OperatorProfile::set_allocated_operator_type_name(std::string* operator_type_name) {
+  if (operator_type_name != nullptr) {
+    _has_bits_[0] |= 0x00000001u;
+  } else {
+    _has_bits_[0] &= ~0x00000001u;
+  }
+  operator_type_name_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), operator_type_name);
+  // @@protoc_insertion_point(field_set_allocated:exec.shared.OperatorProfile.operator_type_name)
+}
+
 // -------------------------------------------------------------------
 
 // StreamProfile
@@ -10149,11 +10149,6 @@ template <>
 inline const EnumDescriptor* GetEnumDescriptor< ::exec::shared::FragmentState>() {
   return ::exec::shared::FragmentState_descriptor();
 }
-template <> struct is_proto_enum< ::exec::shared::CoreOperatorType> : ::std::true_type {};
-template <>
-inline const EnumDescriptor* GetEnumDescriptor< ::exec::shared::CoreOperatorType>() {
-  return ::exec::shared::CoreOperatorType_descriptor();
-}
 template <> struct is_proto_enum< ::exec::shared::SaslStatus> : ::std::true_type {};
 template <>
 inline const EnumDescriptor* GetEnumDescriptor< ::exec::shared::SaslStatus>() {
diff --git a/contrib/storage-druid/src/main/java/org/apache/drill/exec/store/druid/DruidSubScan.java b/contrib/storage-druid/src/main/java/org/apache/drill/exec/store/druid/DruidSubScan.java
old mode 100755
new mode 100644
index e8beb3d..6eff2ea
--- a/contrib/storage-druid/src/main/java/org/apache/drill/exec/store/druid/DruidSubScan.java
+++ b/contrib/storage-druid/src/main/java/org/apache/drill/exec/store/druid/DruidSubScan.java
@@ -29,7 +29,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 import org.apache.drill.exec.store.druid.common.DruidFilter;
 import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
@@ -45,6 +44,9 @@ import static java.util.Collections.emptyIterator;
  */
 @JsonTypeName("druid-datasource-scan")
 public class DruidSubScan extends AbstractBase implements SubScan {
+
+  public static final String OPERATOR_TYPE = "DRUID_SUB_SCAN";
+
   @JsonIgnore
   private final DruidStoragePlugin druidStoragePlugin;
   private final List<DruidSubScanSpec> scanSpec;
@@ -112,8 +114,8 @@ public class DruidSubScan extends AbstractBase implements SubScan {
 
   @JsonIgnore
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.DRUID_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseSubScan.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseSubScan.java
index d4ea999..75bf85f 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseSubScan.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseSubScan.java
@@ -28,7 +28,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 import org.apache.hadoop.hbase.filter.Filter;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -46,6 +45,8 @@ import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 @JsonTypeName("hbase-region-scan")
 public class HBaseSubScan extends AbstractBase implements SubScan {
 
+  public static final String OPERATOR_TYPE = "HBASE_SUB_SCAN";
+
   private final HBaseStoragePlugin hbaseStoragePlugin;
   private final List<HBaseSubScanSpec> regionScanSpecList;
   private final List<SchemaPath> columns;
@@ -212,7 +213,7 @@ public class HBaseSubScan extends AbstractBase implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.HBASE_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveDrillNativeParquetRowGroupScan.java b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveDrillNativeParquetRowGroupScan.java
index 6e6d469..6de82a2 100644
--- a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveDrillNativeParquetRowGroupScan.java
+++ b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveDrillNativeParquetRowGroupScan.java
@@ -29,7 +29,6 @@ import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.expression.LogicalExpression;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 import org.apache.drill.exec.store.parquet.AbstractParquetRowGroupScan;
 import org.apache.drill.exec.store.parquet.RowGroupReadEntry;
@@ -45,6 +44,8 @@ import java.util.Map;
 @JsonTypeName("hive-drill-native-parquet-row-group-scan")
 public class HiveDrillNativeParquetRowGroupScan extends AbstractParquetRowGroupScan {
 
+  public static final String OPERATOR_TYPE = "HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN";
+
   private final HiveStoragePlugin hiveStoragePlugin;
   private final HiveStoragePluginConfig hiveStoragePluginConfig;
   private final HivePartitionHolder hivePartitionHolder;
@@ -116,8 +117,8 @@ public class HiveDrillNativeParquetRowGroupScan extends AbstractParquetRowGroupS
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveSubScan.java b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveSubScan.java
index 5efa505..ba3a04a 100644
--- a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveSubScan.java
+++ b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveSubScan.java
@@ -33,7 +33,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.mapred.InputSplit;
@@ -48,6 +47,8 @@ import org.apache.drill.shaded.guava.com.google.common.io.ByteStreams;
 @JsonTypeName("hive-sub-scan")
 public class HiveSubScan extends AbstractBase implements SubScan {
 
+  public static final String OPERATOR_TYPE = "HIVE_SUB_SCAN";
+
   private final HiveReadEntry hiveReadEntry;
   private final List<List<InputSplit>> inputSplits = new ArrayList<>();
   private final HiveStoragePlugin hiveStoragePlugin;
@@ -175,8 +176,8 @@ public class HiveSubScan extends AbstractBase implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.HIVE_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   private static List<InputSplit> deserializeInputSplit(List<String> base64, String className)
diff --git a/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpSubScan.java b/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpSubScan.java
index d818824..e517259 100644
--- a/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpSubScan.java
+++ b/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpSubScan.java
@@ -17,6 +17,7 @@
  */
 package org.apache.drill.exec.store.http;
 
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -32,12 +33,12 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
-import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableSet;
 
 @JsonTypeName("http-sub-scan")
 public class HttpSubScan extends AbstractBase implements SubScan {
 
+  public static final String OPERATOR_TYPE = "HTTP_SUB_SCAN";
+
   private final HttpScanSpec tableSpec;
   private final List<SchemaPath> columns;
   private final Map<String, String> filters;
@@ -90,13 +91,13 @@ public class HttpSubScan extends AbstractBase implements SubScan {
 
   @Override
   @JsonIgnore
-  public int getOperatorType() {
-    return CoreOperatorType.HTTP_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
   public Iterator<PhysicalOperator> iterator() {
-    return ImmutableSet.<PhysicalOperator>of().iterator();
+    return Collections.emptyIterator();
   }
 
   @Override
diff --git a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcSubScan.java b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcSubScan.java
old mode 100755
new mode 100644
index 9991f6f..def31fa
--- a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcSubScan.java
+++ b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcSubScan.java
@@ -21,7 +21,6 @@ import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.physical.base.AbstractSubScan;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
 import com.fasterxml.jackson.annotation.JacksonInject;
@@ -35,6 +34,8 @@ import java.util.List;
 @JsonTypeName("jdbc-sub-scan")
 public class JdbcSubScan extends AbstractSubScan {
 
+  public static final String OPERATOR_TYPE = "JDBC_SCAN";
+
   private final String sql;
   private final JdbcStoragePlugin plugin;
   private final List<SchemaPath> columns;
@@ -59,8 +60,8 @@ public class JdbcSubScan extends AbstractSubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return UserBitShared.CoreOperatorType.JDBC_SCAN.getNumber();
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   public String getSql() {
diff --git a/contrib/storage-kafka/src/main/java/org/apache/drill/exec/store/kafka/KafkaSubScan.java b/contrib/storage-kafka/src/main/java/org/apache/drill/exec/store/kafka/KafkaSubScan.java
index 9341aa6..c55f1e7 100644
--- a/contrib/storage-kafka/src/main/java/org/apache/drill/exec/store/kafka/KafkaSubScan.java
+++ b/contrib/storage-kafka/src/main/java/org/apache/drill/exec/store/kafka/KafkaSubScan.java
@@ -28,7 +28,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
 import com.fasterxml.jackson.annotation.JacksonInject;
@@ -41,6 +40,8 @@ import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 @JsonTypeName("kafka-partition-scan")
 public class KafkaSubScan extends AbstractBase implements SubScan {
 
+  public static final String OPERATOR_TYPE = "KAFKA_SUB_SCAN";
+
   private final KafkaStoragePlugin kafkaStoragePlugin;
   private final List<SchemaPath> columns;
   private final List<KafkaPartitionScanSpec> partitionSubScanSpecList;
@@ -105,7 +106,7 @@ public class KafkaSubScan extends AbstractBase implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.KAFKA_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduSubScan.java b/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduSubScan.java
index 22e13a6..a4f99bc 100644
--- a/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduSubScan.java
+++ b/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduSubScan.java
@@ -28,7 +28,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
 import com.fasterxml.jackson.annotation.JacksonInject;
@@ -44,6 +43,8 @@ import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 @JsonTypeName("kudu-sub-scan")
 public class KuduSubScan extends AbstractBase implements SubScan {
 
+  public static final String OPERATOR_TYPE = "KUDU_SUB_SCAN";
+
   private final KuduStoragePlugin kuduStoragePlugin;
   private final List<KuduSubScanSpec> tabletScanSpecList;
   private final List<SchemaPath> columns;
@@ -127,7 +128,7 @@ public class KuduSubScan extends AbstractBase implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.KUDU_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduWriter.java b/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduWriter.java
index 95f286e..c456058 100644
--- a/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduWriter.java
+++ b/contrib/storage-kudu/src/main/java/org/apache/drill/exec/store/kudu/KuduWriter.java
@@ -23,7 +23,6 @@ import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.physical.base.AbstractWriter;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
 import com.fasterxml.jackson.annotation.JacksonInject;
@@ -33,6 +32,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class KuduWriter extends AbstractWriter {
 
+  public static final String OPERATOR_TYPE = "KUDU_WRITER";
+
   private final KuduStoragePlugin plugin;
   private final String name;
 
@@ -55,8 +56,8 @@ public class KuduWriter extends AbstractWriter {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.KUDU_WRITER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoSubScan.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoSubScan.java
index c85dc61..551886f 100644
--- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoSubScan.java
+++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoSubScan.java
@@ -30,11 +30,8 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.annotation.JacksonInject;
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -45,7 +42,8 @@ import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 
 @JsonTypeName("mongo-shard-read")
 public class MongoSubScan extends AbstractBase implements SubScan {
-  static final Logger logger = LoggerFactory.getLogger(MongoSubScan.class);
+
+  public static final String OPERATOR_TYPE = "MONGO_SUB_SCAN";
 
   @JsonProperty
   private final MongoStoragePluginConfig mongoPluginConfig;
@@ -114,8 +112,8 @@ public class MongoSubScan extends AbstractBase implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.MONGO_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/OpenTSDBSubScan.java b/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/OpenTSDBSubScan.java
index 01e418b..5544942 100644
--- a/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/OpenTSDBSubScan.java
+++ b/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/OpenTSDBSubScan.java
@@ -29,7 +29,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
 import java.util.Collections;
@@ -40,6 +39,8 @@ import java.util.List;
 @JsonTypeName("openTSDB-sub-scan")
 public class OpenTSDBSubScan extends AbstractBase implements SubScan {
 
+  public static final String OPERATOR_TYPE = "OPEN_TSDB_SUB_SCAN";
+
   public final OpenTSDBStoragePluginConfig storage;
 
   private final List<SchemaPath> columns;
@@ -68,8 +69,8 @@ public class OpenTSDBSubScan extends AbstractBase implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.OPEN_TSDB_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentStats.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentStats.java
index 2129411..5ac0cae 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentStats.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentStats.java
@@ -32,7 +32,7 @@ import org.apache.drill.exec.proto.UserBitShared.MinorFragmentProfile;
 public class FragmentStats {
 //  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FragmentStats.class);
 
-  private Map<ImmutablePair<Integer, Integer>, OperatorStats> operators = new LinkedHashMap<>();
+  private final Map<ImmutablePair<Integer, String>, OperatorStats> operators = new LinkedHashMap<>();
   private final long startTime;
   private final DrillbitEndpoint endpoint;
   private final BufferAllocator allocator;
@@ -48,7 +48,7 @@ public class FragmentStats {
     prfB.setMaxMemoryUsed(allocator.getPeakMemoryAllocation());
     prfB.setEndTime(System.currentTimeMillis());
     prfB.setEndpoint(endpoint);
-    for(Entry<ImmutablePair<Integer, Integer>, OperatorStats> o : operators.entrySet()){
+    for(Entry<ImmutablePair<Integer, String>, OperatorStats> o : operators.entrySet()){
       prfB.addOperatorProfile(o.getValue().getProfile());
     }
   }
@@ -62,15 +62,14 @@ public class FragmentStats {
    */
   public OperatorStats newOperatorStats(final OpProfileDef profileDef, final BufferAllocator allocator) {
     final OperatorStats stats = new OperatorStats(profileDef, allocator);
-    if(profileDef.operatorType != -1) {
-      @SuppressWarnings("unused")
-      OperatorStats existingStatsHolder = addOperatorStats(stats);
+    if (profileDef.operatorType != null) {
+      addOperatorStats(stats);
     }
     return stats;
   }
 
-  public OperatorStats addOperatorStats(OperatorStats stats) {
-    return operators.put(new ImmutablePair<>(stats.operatorId, stats.operatorType), stats);
+  public void addOperatorStats(OperatorStats stats) {
+    operators.put(new ImmutablePair<>(stats.operatorId, stats.operatorType), stats);
   }
 
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OpProfileDef.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OpProfileDef.java
index 8768eb3..e7b4f6c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OpProfileDef.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OpProfileDef.java
@@ -20,10 +20,10 @@ package org.apache.drill.exec.ops;
 public class OpProfileDef {
 
   public int operatorId;
-  public int operatorType;
+  public String operatorType;
   public int incomingCount;
 
-  public OpProfileDef(int operatorId, int operatorType, int incomingCount) {
+  public OpProfileDef(int operatorId, String operatorType, int incomingCount) {
     this.operatorId = operatorId;
     this.operatorType = operatorType;
     this.incomingCount = incomingCount;
@@ -32,7 +32,7 @@ public class OpProfileDef {
     return operatorId;
   }
 
-  public int getOperatorType(){
+  public String getOperatorType(){
     return operatorType;
   }
   public int getIncomingCount(){
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorMetricRegistry.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorMetricRegistry.java
index da59068..c64a726 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorMetricRegistry.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorMetricRegistry.java
@@ -17,6 +17,21 @@
  */
 package org.apache.drill.exec.ops;
 
+import org.apache.drill.exec.physical.config.BroadcastSender;
+import org.apache.drill.exec.physical.config.ExternalSort;
+import org.apache.drill.exec.physical.config.FlattenPOP;
+import org.apache.drill.exec.physical.config.HashAggregate;
+import org.apache.drill.exec.physical.config.HashJoinPOP;
+import org.apache.drill.exec.physical.config.HashPartitionSender;
+import org.apache.drill.exec.physical.config.LateralJoinPOP;
+import org.apache.drill.exec.physical.config.MergeJoinPOP;
+import org.apache.drill.exec.physical.config.MergingReceiverPOP;
+import org.apache.drill.exec.physical.config.RuntimeFilterPOP;
+import org.apache.drill.exec.physical.config.Screen;
+import org.apache.drill.exec.physical.config.SingleSender;
+import org.apache.drill.exec.physical.config.UnionAll;
+import org.apache.drill.exec.physical.config.UnnestPOP;
+import org.apache.drill.exec.physical.config.UnorderedReceiver;
 import org.apache.drill.exec.physical.impl.ScreenCreator;
 import org.apache.drill.exec.physical.impl.SingleSenderCreator;
 import org.apache.drill.exec.physical.impl.aggregate.HashAggTemplate;
@@ -29,8 +44,8 @@ import org.apache.drill.exec.physical.impl.partitionsender.PartitionSenderRootEx
 import org.apache.drill.exec.physical.impl.unnest.UnnestRecordBatch;
 import org.apache.drill.exec.physical.impl.unorderedreceiver.UnorderedReceiverBatch;
 import org.apache.drill.exec.physical.impl.xsort.ExternalSortBatch;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.AbstractBinaryRecordBatch;
+import org.apache.drill.exec.store.parquet.ParquetRowGroupScan;
 import org.apache.drill.exec.store.parquet.columnreaders.ParquetRecordReader;
 
 import java.util.Arrays;
@@ -44,28 +59,28 @@ public class OperatorMetricRegistry {
 //  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(OperatorMetricRegistry.class);
 
   // Mapping: key : operator type, value : metric id --> metric name
-  private static final Map<Integer, String[]> OPERATOR_METRICS = new HashMap<>();
+  private static final Map<String, String[]> OPERATOR_METRICS = new HashMap<>();
 
   static {
-    register(CoreOperatorType.SCREEN_VALUE, ScreenCreator.ScreenRoot.Metric.class);
-    register(CoreOperatorType.SINGLE_SENDER_VALUE, SingleSenderCreator.SingleSenderRootExec.Metric.class);
-    register(CoreOperatorType.BROADCAST_SENDER_VALUE, BroadcastSenderRootExec.Metric.class);
-    register(CoreOperatorType.HASH_PARTITION_SENDER_VALUE, PartitionSenderRootExec.Metric.class);
-    register(CoreOperatorType.MERGING_RECEIVER_VALUE, MergingRecordBatch.Metric.class);
-    register(CoreOperatorType.UNORDERED_RECEIVER_VALUE, UnorderedReceiverBatch.Metric.class);
-    register(CoreOperatorType.HASH_AGGREGATE_VALUE, HashAggTemplate.Metric.class);
-    register(CoreOperatorType.HASH_JOIN_VALUE, HashJoinBatch.Metric.class);
-    register(CoreOperatorType.EXTERNAL_SORT_VALUE, ExternalSortBatch.Metric.class);
-    register(CoreOperatorType.PARQUET_ROW_GROUP_SCAN_VALUE, ParquetRecordReader.Metric.class);
-    register(CoreOperatorType.FLATTEN_VALUE, FlattenRecordBatch.Metric.class);
-    register(CoreOperatorType.MERGE_JOIN_VALUE, AbstractBinaryRecordBatch.Metric.class);
-    register(CoreOperatorType.LATERAL_JOIN_VALUE, AbstractBinaryRecordBatch.Metric.class);
-    register(CoreOperatorType.UNNEST_VALUE, UnnestRecordBatch.Metric.class);
-    register(CoreOperatorType.UNION_VALUE, AbstractBinaryRecordBatch.Metric.class);
-    register(CoreOperatorType.RUNTIME_FILTER_VALUE, RuntimeFilterRecordBatch.Metric.class);
+    register(Screen.OPERATOR_TYPE, ScreenCreator.ScreenRoot.Metric.class);
+    register(SingleSender.OPERATOR_TYPE, SingleSenderCreator.SingleSenderRootExec.Metric.class);
+    register(BroadcastSender.OPERATOR_TYPE, BroadcastSenderRootExec.Metric.class);
+    register(HashPartitionSender.OPERATOR_TYPE, PartitionSenderRootExec.Metric.class);
+    register(MergingReceiverPOP.OPERATOR_TYPE, MergingRecordBatch.Metric.class);
+    register(UnorderedReceiver.OPERATOR_TYPE, UnorderedReceiverBatch.Metric.class);
+    register(HashAggregate.OPERATOR_TYPE, HashAggTemplate.Metric.class);
+    register(HashJoinPOP.OPERATOR_TYPE, HashJoinBatch.Metric.class);
+    register(ExternalSort.OPERATOR_TYPE, ExternalSortBatch.Metric.class);
+    register(ParquetRowGroupScan.OPERATOR_TYPE, ParquetRecordReader.Metric.class);
+    register(FlattenPOP.OPERATOR_TYPE, FlattenRecordBatch.Metric.class);
+    register(MergeJoinPOP.OPERATOR_TYPE, AbstractBinaryRecordBatch.Metric.class);
+    register(LateralJoinPOP.OPERATOR_TYPE, AbstractBinaryRecordBatch.Metric.class);
+    register(UnnestPOP.OPERATOR_TYPE, UnnestRecordBatch.Metric.class);
+    register(UnionAll.OPERATOR_TYPE, AbstractBinaryRecordBatch.Metric.class);
+    register(RuntimeFilterPOP.OPERATOR_TYPE, RuntimeFilterRecordBatch.Metric.class);
   }
 
-  private static void register(final int operatorType, final Class<? extends MetricDef> metricDef) {
+  private static void register(String operatorType, Class<? extends MetricDef> metricDef) {
     // Currently registers a metric def that has enum constants
     MetricDef[] enumConstants = metricDef.getEnumConstants();
     if (enumConstants != null) {
@@ -82,7 +97,7 @@ public class OperatorMetricRegistry {
    * @param operatorType the operator type
    * @return metric names if operator was registered, null otherwise
    */
-  public static String[] getMetricNames(int operatorType) {
+  public static String[] getMetricNames(String operatorType) {
     return OPERATOR_METRICS.get(operatorType);
   }
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorStats.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorStats.java
index 67a8b80..2f9300d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorStats.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorStats.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.ops;
 import java.util.Iterator;
 
 import org.apache.drill.exec.memory.BufferAllocator;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.proto.UserBitShared.MetricValue;
 import org.apache.drill.exec.proto.UserBitShared.OperatorProfile;
 import org.apache.drill.exec.proto.UserBitShared.OperatorProfile.Builder;
@@ -32,19 +31,20 @@ import com.carrotsearch.hppc.cursors.IntDoubleCursor;
 import com.carrotsearch.hppc.cursors.IntLongCursor;
 import com.carrotsearch.hppc.procedures.IntDoubleProcedure;
 import com.carrotsearch.hppc.procedures.IntLongProcedure;
+import org.apache.drill.exec.server.rest.profile.CoreOperatorType;
 import org.apache.drill.shaded.guava.com.google.common.annotations.VisibleForTesting;
 
 public class OperatorStats {
   protected final int operatorId;
-  protected final int operatorType;
+  protected final String operatorType;
   private final BufferAllocator allocator;
 
-  private IntLongHashMap longMetrics = new IntLongHashMap();
-  private IntDoubleHashMap doubleMetrics = new IntDoubleHashMap();
+  private final IntLongHashMap longMetrics = new IntLongHashMap();
+  private final IntDoubleHashMap doubleMetrics = new IntDoubleHashMap();
 
   public long[] recordsReceivedByInput;
   public long[] batchesReceivedByInput;
-  private long[] schemaCountByInput;
+  private final long[] schemaCountByInput;
 
 
   private boolean inProcessing = false;
@@ -59,7 +59,7 @@ public class OperatorStats {
   private long setupMark;
   private long waitMark;
 
-  private int inputCount;
+  private final int inputCount;
 
   public OperatorStats(OpProfileDef def, BufferAllocator allocator){
     this(def.getOperatorId(), def.getOperatorType(), def.getIncomingCount(), allocator);
@@ -88,7 +88,7 @@ public class OperatorStats {
   }
 
   @VisibleForTesting
-  public OperatorStats(int operatorId, int operatorType, int inputCount, BufferAllocator allocator) {
+  public OperatorStats(int operatorId, String operatorType, int inputCount, BufferAllocator allocator) {
     super();
     this.allocator = allocator;
     this.operatorId = operatorId;
@@ -191,24 +191,31 @@ public class OperatorStats {
   }
 
   public String getId() {
-    StringBuilder s = new StringBuilder();
-    return s.append(this.operatorId)
+    return new StringBuilder()
+        .append(this.operatorId)
         .append(":")
         .append("[")
-        .append(UserBitShared.CoreOperatorType.valueOf(operatorType))
+        .append(operatorType)
         .append("]")
         .toString();
   }
 
+  @SuppressWarnings("deprecation")
   public OperatorProfile getProfile() {
-    final OperatorProfile.Builder b = OperatorProfile //
-        .newBuilder() //
-        .setOperatorType(operatorType) //
-        .setOperatorId(operatorId) //
-        .setSetupNanos(setupNanos) //
+    final OperatorProfile.Builder b = OperatorProfile
+        .newBuilder()
+        .setOperatorTypeName(operatorType)
+        .setOperatorId(operatorId)
+        .setSetupNanos(setupNanos)
         .setProcessNanos(processingNanos)
         .setWaitNanos(waitNanos);
 
+    CoreOperatorType coreOperatorType = CoreOperatorType.forName(operatorType);
+
+    if (coreOperatorType != null) {
+      b.setOperatorType(coreOperatorType.getId());
+    }
+
     if (allocator != null) {
       b.setPeakLocalMemoryAllocated(allocator.getPeakMemoryAllocation());
     }
@@ -229,7 +236,7 @@ public class OperatorStats {
     }
   }
 
-  private class LongProc implements IntLongProcedure {
+  private static class LongProc implements IntLongProcedure {
 
     private final OperatorProfile.Builder builder;
 
@@ -250,7 +257,7 @@ public class OperatorStats {
     }
   }
 
-  private class DoubleProc implements IntDoubleProcedure {
+  private static class DoubleProc implements IntDoubleProcedure {
     private final OperatorProfile.Builder builder;
 
     public DoubleProc(Builder builder) {
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractExchange.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractExchange.java
index 4106205..e77dbcb 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractExchange.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractExchange.java
@@ -96,7 +96,7 @@ public abstract class AbstractExchange extends AbstractSingle implements Exchang
     return new ArrayList<>(affinityMap.values());
   }
 
-  protected void setupSenders(List<DrillbitEndpoint> senderLocations) throws PhysicalOperatorSetupException {
+  protected void setupSenders(List<DrillbitEndpoint> senderLocations) {
     this.senderLocations = ImmutableList.copyOf(senderLocations);
   }
 
@@ -122,7 +122,7 @@ public abstract class AbstractExchange extends AbstractSingle implements Exchang
   }
 
   @Override
-  public int getOperatorType() {
+  public String getOperatorType() {
     throw new UnsupportedOperationException();
   }
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractGroupScan.java
index c4f04b3..cc549b1 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractGroupScan.java
@@ -138,7 +138,7 @@ public abstract class AbstractGroupScan extends AbstractBase implements GroupSca
   }
 
   @Override
-  public int getOperatorType() {
+  public String getOperatorType() {
     throw new UnsupportedOperationException();
   }
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/PhysicalOperator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/PhysicalOperator.java
index 3bca02e..325d587 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/PhysicalOperator.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/PhysicalOperator.java
@@ -116,5 +116,5 @@ public interface PhysicalOperator extends GraphValue<PhysicalOperator> {
   String getUserName();
 
   @JsonIgnore
-  int getOperatorType();
+  String getOperatorType();
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/BroadcastSender.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/BroadcastSender.java
index 0cdc72b..8c2b0e6 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/BroadcastSender.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/BroadcastSender.java
@@ -23,7 +23,6 @@ import org.apache.drill.exec.physical.MinorFragmentEndpoint;
 import org.apache.drill.exec.physical.base.AbstractSender;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -31,7 +30,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("broadcast-sender")
 public class BroadcastSender extends AbstractSender {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(BroadcastSender.class);
+
+  public static final String OPERATOR_TYPE = "BROADCAST_SENDER";
 
   @JsonCreator
   public BroadcastSender(@JsonProperty("receiver-major-fragment") int oppositeMajorFragmentId,
@@ -51,8 +51,8 @@ public class BroadcastSender extends AbstractSender {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.BROADCAST_SENDER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ComplexToJson.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ComplexToJson.java
index b5e8eca..78fcaed 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ComplexToJson.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ComplexToJson.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.physical.config;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -29,7 +28,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("complex-to-json")
 public class ComplexToJson extends AbstractSingle {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ComplexToJson.class);
+
+  public static final String OPERATOR_TYPE = "COMPLEX_TO_JSON";
 
   @JsonCreator
   public ComplexToJson(@JsonProperty("child") PhysicalOperator child) {
@@ -52,8 +52,8 @@ public class ComplexToJson extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.COMPLEX_TO_JSON_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ExternalSort.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ExternalSort.java
index 9ead21c..c09020d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ExternalSort.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ExternalSort.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.apache.drill.common.logical.data.Order.Ordering;
 import org.apache.drill.exec.ops.QueryContext;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -30,10 +29,11 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("external-sort")
 public class ExternalSort extends Sort {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExternalSort.class);
 
   public static final long DEFAULT_SORT_ALLOCATION = 20_000_000;
 
+  public static final String OPERATOR_TYPE = "EXTERNAL_SORT";
+
   @JsonCreator
   public ExternalSort(@JsonProperty("child") PhysicalOperator child, @JsonProperty("orderings") List<Ordering> orderings, @JsonProperty("reverse") boolean reverse) {
     super(child, orderings, reverse);
@@ -48,8 +48,8 @@ public class ExternalSort extends Sort {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.EXTERNAL_SORT_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   /**
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Filter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Filter.java
index d6eaf76..a944cbe 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Filter.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Filter.java
@@ -21,7 +21,6 @@ import org.apache.drill.common.expression.LogicalExpression;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -31,7 +30,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 @JsonTypeName("filter")
 public class Filter extends AbstractSingle {
 
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Filter.class);
+  public static final String OPERATOR_TYPE = "FILTER";
 
   private final LogicalExpression expr;
   private final float selectivity;
@@ -67,8 +66,8 @@ public class Filter extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.FILTER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/FlattenPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/FlattenPOP.java
index 74ef426..4e371b1 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/FlattenPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/FlattenPOP.java
@@ -25,15 +25,15 @@ import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared;
 
 import java.util.Iterator;
 
 @JsonTypeName("flatten")
 public class FlattenPOP extends AbstractSingle {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FlattenPOP.class);
 
-  private SchemaPath column;
+  public static final String OPERATOR_TYPE = "FLATTEN";
+
+  private final SchemaPath column;
 
   @JsonCreator
   public FlattenPOP(
@@ -64,7 +64,7 @@ public class FlattenPOP extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return UserBitShared.CoreOperatorType.FLATTEN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashAggregate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashAggregate.java
index 521aba1..d862c8a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashAggregate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashAggregate.java
@@ -24,7 +24,6 @@ import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.planner.physical.AggPrelBase;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -35,7 +34,7 @@ import java.util.List;
 @JsonTypeName("hash-aggregate")
 public class HashAggregate extends AbstractSingle {
 
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(HashAggregate.class);
+  public static final String OPERATOR_TYPE = "HASH_AGGREGATE";
 
   private final AggPrelBase.OperatorPhase aggPhase;
   private final List<NamedExpression> groupByExprs;
@@ -83,8 +82,8 @@ public class HashAggregate extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.HASH_AGGREGATE_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   /**
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashJoinPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashJoinPOP.java
index 35c187c..8b1ae3c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashJoinPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashJoinPOP.java
@@ -26,7 +26,6 @@ import org.apache.drill.exec.ops.QueryContext;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.SubScan;
 import org.apache.drill.exec.planner.common.JoinControl;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.calcite.rel.core.JoinRelType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -41,7 +40,8 @@ import org.apache.drill.exec.work.filter.RuntimeFilterDef;
 @JsonTypeName("hash-join")
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class HashJoinPOP extends AbstractJoinPop {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(HashJoinPOP.class);
+
+  public static final String OPERATOR_TYPE = "HASH_JOIN";
 
   private RuntimeFilterDef runtimeFilterDef;
 
@@ -134,9 +134,9 @@ public class HashJoinPOP extends AbstractJoinPop {
   }
 
   @Override
-  public int getOperatorType() {
-        return CoreOperatorType.HASH_JOIN_VALUE;
-    }
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
+  }
 
   /**
    *
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashPartitionSender.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashPartitionSender.java
index a586bbe..2bc7447 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashPartitionSender.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/HashPartitionSender.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.base.AbstractSender;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.impl.partitionsender.Partitioner;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -33,7 +32,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("hash-partition-sender")
 public class HashPartitionSender extends AbstractSender {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(HashPartitionSender.class);
+
+  public static final String OPERATOR_TYPE = "HASH_PARTITION_SENDER";
 
   private final LogicalExpression expr;
   private final int outgoingBatchSize;
@@ -76,8 +76,8 @@ public class HashPartitionSender extends AbstractSender {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.HASH_PARTITION_SENDER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/IteratorValidator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/IteratorValidator.java
index 4f73b00..ec08e88 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/IteratorValidator.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/IteratorValidator.java
@@ -22,7 +22,9 @@ import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 
 public class IteratorValidator extends AbstractSingle{
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(IteratorValidator.class);
+
+  public static final String OPERATOR_TYPE = "ITERATOR_VALIDATOR";
+
   /* isRepeatable flag will be set to true if this validator is created by a Repeatable pipeline.
    * In a repeatable pipeline some state transitions are valid i.e downstream operator
    * can call the upstream operator even after receiving NONE.
@@ -50,8 +52,7 @@ public class IteratorValidator extends AbstractSingle{
   }
 
   @Override
-  public int getOperatorType() {
-    // TODO: DRILL-6643: this implementation should be revisited
-    return -1;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/LateralJoinPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/LateralJoinPOP.java
index 9e00f7c..2be30b3 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/LateralJoinPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/LateralJoinPOP.java
@@ -27,13 +27,13 @@ import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.exec.physical.base.AbstractJoinPop;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import java.util.List;
 
 @JsonTypeName("lateral-join")
 public class LateralJoinPOP extends AbstractJoinPop {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(LateralJoinPOP.class);
+
+  public static final String OPERATOR_TYPE = "LATERAL_JOIN";
 
   @JsonProperty("excludedColumns")
   private List<SchemaPath> excludedColumns;
@@ -87,8 +87,8 @@ public class LateralJoinPOP extends AbstractJoinPop {
   public String getImplicitRIDColumn() { return this.implicitRIDColumn; }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.LATERAL_JOIN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Limit.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Limit.java
index f79aa93..9850f40 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Limit.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Limit.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.physical.config;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -29,6 +28,9 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("limit")
 public class Limit extends AbstractSingle {
+
+  public static final String OPERATOR_TYPE = "LIMIT";
+
   private final Integer first;
   private final Integer last;
 
@@ -63,7 +65,7 @@ public class Limit extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.LIMIT_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergeJoinPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergeJoinPOP.java
index eb1a31a..266ee4d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergeJoinPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergeJoinPOP.java
@@ -26,13 +26,13 @@ import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.drill.common.logical.data.JoinCondition;
 import org.apache.drill.exec.physical.base.AbstractJoinPop;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import java.util.List;
 
 @JsonTypeName("merge-join")
-public class MergeJoinPOP extends AbstractJoinPop{
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MergeJoinPOP.class);
+public class MergeJoinPOP extends AbstractJoinPop {
+
+  public static final String OPERATOR_TYPE = "MERGE_JOIN";
 
   @JsonCreator
   public MergeJoinPOP(
@@ -66,7 +66,7 @@ public class MergeJoinPOP extends AbstractJoinPop{
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.MERGE_JOIN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergingReceiverPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergingReceiverPOP.java
index a72ff1b..7eef240 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergingReceiverPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MergingReceiverPOP.java
@@ -23,7 +23,6 @@ import org.apache.drill.common.logical.data.Order.Ordering;
 import org.apache.drill.exec.physical.MinorFragmentEndpoint;
 import org.apache.drill.exec.physical.base.AbstractReceiver;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -34,8 +33,9 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 // is guaranteed to be in order, so the operator simply merges the incoming
 // batches.  This is accomplished by building and depleting a priority queue.
 @JsonTypeName("merging-receiver")
-public class MergingReceiverPOP extends AbstractReceiver{
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MergingReceiverPOP.class);
+public class MergingReceiverPOP extends AbstractReceiver {
+
+  public static final String OPERATOR_TYPE = "MERGING_RECEIVER";
 
   private final List<Ordering> orderings;
 
@@ -63,7 +63,7 @@ public class MergingReceiverPOP extends AbstractReceiver{
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.MERGING_RECEIVER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataControllerPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataControllerPOP.java
index 6b317ff..adad975 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataControllerPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataControllerPOP.java
@@ -24,7 +24,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.metastore.analyze.MetadataControllerContext;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 
 import java.util.Arrays;
@@ -33,6 +32,9 @@ import java.util.List;
 
 @JsonTypeName("metadataController")
 public class MetadataControllerPOP extends AbstractBase {
+
+  public static final String OPERATOR_TYPE = "METADATA_CONTROLLER";
+
   private final MetadataControllerContext context;
   private final PhysicalOperator left;
   private final PhysicalOperator right;
@@ -57,8 +59,8 @@ public class MetadataControllerPOP extends AbstractBase {
   }
 
   @Override
-  public int getOperatorType() {
-    return UserBitShared.CoreOperatorType.METADATA_CONTROLLER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataHandlerPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataHandlerPOP.java
index 1599d90..9841459 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataHandlerPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/MetadataHandlerPOP.java
@@ -24,10 +24,12 @@ import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.metastore.analyze.MetadataHandlerContext;
-import org.apache.drill.exec.proto.UserBitShared;
 
 @JsonTypeName("metadataHandler")
 public class MetadataHandlerPOP extends AbstractSingle {
+
+  public static final String OPERATOR_TYPE = "METADATA_HANDLER";
+
   private final MetadataHandlerContext context;
 
   @JsonCreator
@@ -48,8 +50,8 @@ public class MetadataHandlerPOP extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return UserBitShared.CoreOperatorType.METADATA_HANDLER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   public MetadataHandlerContext getContext() {
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/NestedLoopJoinPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/NestedLoopJoinPOP.java
index 5783b4e..4d6aca4 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/NestedLoopJoinPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/NestedLoopJoinPOP.java
@@ -25,13 +25,13 @@ import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.drill.common.expression.LogicalExpression;
 import org.apache.drill.exec.physical.base.AbstractJoinPop;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import java.util.List;
 
 @JsonTypeName("nested-loop-join")
 public class NestedLoopJoinPOP extends AbstractJoinPop {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(NestedLoopJoinPOP.class);
+
+  public static final String OPERATOR_TYPE = "NESTED_LOOP_JOIN";
 
   @JsonCreator
   public NestedLoopJoinPOP(
@@ -50,7 +50,7 @@ public class NestedLoopJoinPOP extends AbstractJoinPop {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.NESTED_LOOP_JOIN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/OrderedPartitionSender.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/OrderedPartitionSender.java
index 320bc6d..7b18036 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/OrderedPartitionSender.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/OrderedPartitionSender.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.MinorFragmentEndpoint;
 import org.apache.drill.exec.physical.base.AbstractSender;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -34,15 +33,16 @@ import org.apache.drill.shaded.guava.com.google.common.collect.Lists;
 
 @JsonTypeName("OrderedPartitionSender")
 public class OrderedPartitionSender extends AbstractSender {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(OrderedPartitionSender.class);
+
+  public static final String OPERATOR_TYPE = "ORDERED_PARTITION_SENDER";
 
   private final List<Ordering> orderings;
   private final FieldReference ref;
   private final int sendingWidth;
 
-  private int recordsToSample;
-  private int samplingFactor;
-  private float completionFactor;
+  private final int recordsToSample;
+  private final int samplingFactor;
+  private final float completionFactor;
 
   @JsonCreator
   public OrderedPartitionSender(@JsonProperty("orderings") List<Ordering> orderings,
@@ -103,8 +103,8 @@ public class OrderedPartitionSender extends AbstractSender {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.ORDERED_PARTITION_SENDER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/PartitionLimit.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/PartitionLimit.java
index 4ea710d..aa71e90 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/PartitionLimit.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/PartitionLimit.java
@@ -22,11 +22,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 @JsonTypeName("partition-limit")
 public class PartitionLimit extends Limit {
+
+  public static final String OPERATOR_TYPE = "PARTITION_LIMIT";
+
   private final String partitionColumn;
 
   @JsonCreator
@@ -56,8 +58,8 @@ public class PartitionLimit extends Limit {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.PARTITION_LIMIT_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ProducerConsumer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ProducerConsumer.java
index e31f417..8d880bb 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ProducerConsumer.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/ProducerConsumer.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.physical.config;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -28,7 +27,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("producer-consumer")
 public class ProducerConsumer extends AbstractSingle{
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ProducerConsumer.class);
+
+  public static final String OPERATOR_TYPE = "PRODUCER_CONSUMER";
 
   private final int size;
 
@@ -53,7 +53,7 @@ public class ProducerConsumer extends AbstractSingle{
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.PRODUCER_CONSUMER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Project.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Project.java
index 7c40a9c..b2fc8dd 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Project.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Project.java
@@ -23,7 +23,6 @@ import org.apache.drill.common.logical.data.NamedExpression;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -32,7 +31,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("project")
 public class Project extends AbstractSingle{
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Project.class);
+
+  public static final String OPERATOR_TYPE = "PROJECT";
 
   private final List<NamedExpression> exprs;
 
@@ -58,7 +58,7 @@ public class Project extends AbstractSingle{
   }
 
   /**
-   * @Return true if Project is for the query's final output. Such Project is added by TopProjectVisitor,
+   * @return true if Project is for the query's final output. Such Project is added by TopProjectVisitor,
    * to handle fast NONE when all the inputs to the query are empty and are skipped.
    */
   public boolean isOutputProj() {
@@ -81,7 +81,7 @@ public class Project extends AbstractSingle{
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.PROJECT_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RangePartitionSender.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RangePartitionSender.java
index 0c0852a..862ffda 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RangePartitionSender.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RangePartitionSender.java
@@ -24,7 +24,6 @@ import org.apache.drill.exec.physical.base.AbstractSender;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.planner.physical.PartitionFunction;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -33,13 +32,13 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 @JsonTypeName("range-partition-sender")
 public class RangePartitionSender extends AbstractSender{
 
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RangePartitionSender.class);
-
   // The number of records in the outgoing batch. This is overriding the default value in Partitioner
   public static final int RANGE_PARTITION_OUTGOING_BATCH_SIZE = (1 << 12) - 1;
 
+  public static final String OPERATOR_TYPE = "RANGE_PARTITION_SENDER";
+
   @JsonProperty("partitionFunction")
-  private PartitionFunction partitionFunction;
+  private final PartitionFunction partitionFunction;
 
   @JsonCreator
   public RangePartitionSender(@JsonProperty("receiver-major-fragment") int oppositeMajorFragmentId,
@@ -66,8 +65,8 @@ public class RangePartitionSender extends AbstractSender{
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.RANGE_PARTITION_SENDER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RowKeyJoinPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RowKeyJoinPOP.java
index 1b0980d..3690dfa 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RowKeyJoinPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RowKeyJoinPOP.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -35,7 +34,8 @@ import org.apache.drill.shaded.guava.com.google.common.collect.Iterators;
 
 @JsonTypeName("rowkey-join")
 public class RowKeyJoinPOP extends AbstractBase {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RowKeyJoinPOP.class);
+
+  public static final String OPERATOR_TYPE = "ROWKEY_JOIN";
 
 
   private final PhysicalOperator left;
@@ -90,7 +90,7 @@ public class RowKeyJoinPOP extends AbstractBase {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.ROWKEY_JOIN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RuntimeFilterPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RuntimeFilterPOP.java
index b35bf29..f3df51e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RuntimeFilterPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/RuntimeFilterPOP.java
@@ -23,13 +23,12 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 @JsonTypeName("runtime-filter")
 public class RuntimeFilterPOP extends AbstractSingle {
 
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RuntimeFilterPOP.class);
+  public static final String OPERATOR_TYPE = "RUNTIME_FILTER";
 
   private long identifier;
 
@@ -55,8 +54,8 @@ public class RuntimeFilterPOP extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.RUNTIME_FILTER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java
index 13dbbb7..8c1e552 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java
@@ -28,7 +28,6 @@ import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.Store;
 import org.apache.drill.exec.planner.fragment.DistributionAffinity;
 import org.apache.drill.exec.proto.CoordinationProtos.DrillbitEndpoint;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JacksonInject;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -37,7 +36,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("screen")
 public class Screen extends AbstractStore {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Screen.class);
+
+  public static final String OPERATOR_TYPE = "SCREEN";
 
   private final DrillbitEndpoint endpoint;
 
@@ -99,8 +99,8 @@ public class Screen extends AbstractStore {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.SCREEN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SelectionVectorRemover.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SelectionVectorRemover.java
index 1dcf913..5074e01 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SelectionVectorRemover.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SelectionVectorRemover.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.physical.config;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -30,7 +29,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 @JsonTypeName("selection-vector-remover")
 public class SelectionVectorRemover extends AbstractSingle {
 
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SelectionVectorRemover.class);
+  public static final String OPERATOR_TYPE = "SELECTION_VECTOR_REMOVER";
 
   @JsonCreator
   public SelectionVectorRemover(@JsonProperty("child") PhysicalOperator child) {
@@ -53,7 +52,7 @@ public class SelectionVectorRemover extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.SELECTION_VECTOR_REMOVER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SingleSender.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SingleSender.java
index 1e74136..59895f3 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SingleSender.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/SingleSender.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.base.AbstractSender;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.proto.CoordinationProtos.DrillbitEndpoint;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -37,7 +36,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
  */
 @JsonTypeName("single-sender")
 public class SingleSender extends AbstractSender {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SingleSender.class);
+
+  public static final String OPERATOR_TYPE = "SINGLE_SENDER";
 
   /**
    * Create a SingleSender which sends data to fragment identified by given MajorFragmentId and MinorFragmentId,
@@ -96,8 +96,8 @@ public class SingleSender extends AbstractSender {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.SINGLE_SENDER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Sort.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Sort.java
index 5d65c39..4337024 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Sort.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Sort.java
@@ -23,7 +23,6 @@ import org.apache.drill.common.logical.data.Order.Ordering;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -32,10 +31,11 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("sort")
 public class Sort extends AbstractSingle{
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Sort.class);
+
+  public static final String OPERATOR_TYPE = "OLD_SORT";
 
   protected final List<Ordering> orderings;
-  protected boolean reverse = false;
+  protected boolean reverse;
 
   @JsonCreator
   public Sort(@JsonProperty("child") PhysicalOperator child, @JsonProperty("orderings") List<Ordering> orderings, @JsonProperty("reverse") boolean reverse) {
@@ -68,8 +68,8 @@ public class Sort extends AbstractSingle{
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.OLD_SORT_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsAggregate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsAggregate.java
index 58fee51..c6709c1 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsAggregate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsAggregate.java
@@ -21,7 +21,6 @@ import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableList;
 
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -31,6 +30,9 @@ import java.util.List;
 
 @JsonTypeName("statistics-aggregate")
 public class StatisticsAggregate extends StreamingAggregate {
+
+  public static final String OPERATOR_TYPE = "STATISTICS_AGGREGATE";
+
   private final List<String> functions;
 
   @JsonCreator
@@ -57,8 +59,8 @@ public class StatisticsAggregate extends StreamingAggregate {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.STATISTICS_AGGREGATE_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsMerge.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsMerge.java
index 1570660..16595d1 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsMerge.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StatisticsMerge.java
@@ -24,12 +24,13 @@ import java.util.Map;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableMap;
 
 @JsonTypeName("statistics-merge")
 public class StatisticsMerge extends AbstractSingle {
 
+  public static final String OPERATOR_TYPE = "STATISTICS_MERGE";
+
   private final Map<String, String> functions;
   private final double samplePercent;
 
@@ -63,7 +64,7 @@ public class StatisticsMerge extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.STATISTICS_MERGE_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StreamingAggregate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StreamingAggregate.java
index 3d074bf..bbad8a1 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StreamingAggregate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/StreamingAggregate.java
@@ -21,7 +21,6 @@ import org.apache.drill.common.logical.data.NamedExpression;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -32,6 +31,8 @@ import java.util.List;
 @JsonTypeName("streaming-aggregate")
 public class StreamingAggregate extends AbstractSingle {
 
+  public static final String OPERATOR_TYPE = "STREAMING_AGGREGATE";
+
   private final List<NamedExpression> keys;
   private final List<NamedExpression> exprs;
 
@@ -63,7 +64,7 @@ public class StreamingAggregate extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.STREAMING_AGGREGATE_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/TopN.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/TopN.java
index d2a87d5..3b45b5d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/TopN.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/TopN.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.apache.drill.common.logical.data.Order.Ordering;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -30,7 +29,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("top-n")
 public class TopN extends Sort {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TopN.class);
+
+  public static final String OPERATOR_TYPE = "TOP_N_SORT";
 
   private final int limit;
 
@@ -65,8 +65,8 @@ public class TopN extends Sort {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.TOP_N_SORT_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Trace.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Trace.java
index c777e0d..6550e29 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Trace.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Trace.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.physical.config;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
@@ -28,7 +27,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 @JsonTypeName("trace")
 public class Trace extends AbstractSingle {
 
-    static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Trace.class);
+    public static final String OPERATOR_TYPE = "TRACE";
 
     /* Tag associated with each trace operator
      * Printed along with trace output to distinguish
@@ -52,7 +51,7 @@ public class Trace extends AbstractSingle {
     }
 
     @Override
-    public int getOperatorType() {
-      return CoreOperatorType.TRACE_VALUE;
+    public String getOperatorType() {
+      return OPERATOR_TYPE;
     }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnionAll.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnionAll.java
index 4593737..59b4bfd 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnionAll.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnionAll.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.apache.drill.exec.physical.base.AbstractMultiple;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -32,6 +31,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 public class UnionAll extends AbstractMultiple {
 
+  public static final String OPERATOR_TYPE = "UNION";
+
   @JsonCreator
   public UnionAll(@JsonProperty("children") List<PhysicalOperator> children) {
     super(children);
@@ -48,7 +49,7 @@ public class UnionAll extends AbstractMultiple {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.UNION_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnnestPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnnestPOP.java
index 42635a8..4bef1b8 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnnestPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnnestPOP.java
@@ -33,16 +33,15 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-import static org.apache.drill.exec.proto.UserBitShared.CoreOperatorType.UNNEST_VALUE;
-
 @JsonTypeName("unnest")
 public class UnnestPOP extends AbstractBase implements Leaf {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(UnnestPOP.class);
+
+  public static final String OPERATOR_TYPE = "UNNEST";
 
   @JsonProperty("implicitColumn")
-  private String implicitColumn;
+  private final String implicitColumn;
 
-  private SchemaPath column;
+  private final SchemaPath column;
 
   @JsonIgnore
   private UnnestRecordBatch unnestBatch;
@@ -91,7 +90,7 @@ public class UnnestPOP extends AbstractBase implements Leaf {
   public String getImplicitColumn() { return this.implicitColumn; }
 
   @Override
-  public int getOperatorType() {
-    return UNNEST_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnorderedReceiver.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnorderedReceiver.java
index da6f07a..da0be8d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnorderedReceiver.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnorderedReceiver.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.apache.drill.exec.physical.MinorFragmentEndpoint;
 import org.apache.drill.exec.physical.base.AbstractReceiver;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -31,6 +30,8 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 @JsonTypeName("unordered-receiver")
 public class UnorderedReceiver extends AbstractReceiver{
 
+  public static final String OPERATOR_TYPE = "UNORDERED_RECEIVER";
+
   @JsonCreator
   public UnorderedReceiver(@JsonProperty("sender-major-fragment") int oppositeMajorFragmentId,
                            @JsonProperty("senders") List<MinorFragmentEndpoint> senders,
@@ -49,7 +50,7 @@ public class UnorderedReceiver extends AbstractReceiver{
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.UNORDERED_RECEIVER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnpivotMaps.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnpivotMaps.java
index 2210f7a..89fc5f5 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnpivotMaps.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/UnpivotMaps.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -30,6 +29,9 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("unpivot-maps")
 public class UnpivotMaps extends AbstractSingle {
+
+  public static final String OPERATOR_TYPE = "UNPIVOT_MAPS";
+
   private final List<String> mapFieldNames;
 
   @JsonCreator
@@ -54,7 +56,7 @@ public class UnpivotMaps extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.UNPIVOT_MAPS_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Values.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Values.java
index c454d60..d4bb862 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Values.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Values.java
@@ -33,8 +33,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class Values extends AbstractBase implements Leaf {
 
-  @SuppressWarnings("unused")
-  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Values.class);
+  public static final String OPERATOR_TYPE = "VALUES";
 
   private final JSONOptions content;
 
@@ -59,9 +58,8 @@ public class Values extends AbstractBase implements Leaf {
   }
 
   @Override
-  public int getOperatorType() {
-    // TODO: DRILL-6643: this implementation should be revisited
-    return -1;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/WindowPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/WindowPOP.java
index 3ddaa7f..5d272c0 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/WindowPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/WindowPOP.java
@@ -26,13 +26,14 @@ import org.apache.drill.common.logical.data.Order;
 import org.apache.drill.exec.physical.base.AbstractSingle;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
-import org.apache.drill.exec.proto.UserBitShared;
 
 import java.util.List;
 
 @JsonTypeName("window")
 public class WindowPOP extends AbstractSingle {
 
+  public static final String OPERATOR_TYPE = "WINDOW";
+
   private final List<NamedExpression> withins;
   private final List<NamedExpression> aggregations;
   private final List<Order.Ordering> orderings;
@@ -67,8 +68,8 @@ public class WindowPOP extends AbstractSingle {
   }
 
   @Override
-  public int getOperatorType() {
-    return UserBitShared.CoreOperatorType.WINDOW_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   public Bound getStart() {
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/CoreOperatorType.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/CoreOperatorType.java
new file mode 100644
index 0000000..254817c
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/CoreOperatorType.java
@@ -0,0 +1,342 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.server.rest.profile;
+
+
+import java.util.Arrays;
+
+/**
+ * This class is used for backward compatibility when reading older query profiles that
+ * stored operator id instead of its name.
+ * <b>Please do not update this class. It will be removed for Drill 2.0</b>
+ */
+public enum CoreOperatorType {
+
+  /**
+   * <code>SINGLE_SENDER = 0;</code>
+   */
+  SINGLE_SENDER(0),
+  /**
+   * <code>BROADCAST_SENDER = 1;</code>
+   */
+  BROADCAST_SENDER(1),
+  /**
+   * <code>FILTER = 2;</code>
+   */
+  FILTER(2),
+  /**
+   * <code>HASH_AGGREGATE = 3;</code>
+   */
+  HASH_AGGREGATE(3),
+  /**
+   * <code>HASH_JOIN = 4;</code>
+   */
+  HASH_JOIN(4),
+  /**
+   * <code>MERGE_JOIN = 5;</code>
+   */
+  MERGE_JOIN(5),
+  /**
+   * <code>HASH_PARTITION_SENDER = 6;</code>
+   */
+  HASH_PARTITION_SENDER(6),
+  /**
+   * <code>LIMIT = 7;</code>
+   */
+  LIMIT(7),
+  /**
+   * <code>MERGING_RECEIVER = 8;</code>
+   */
+  MERGING_RECEIVER(8),
+  /**
+   * <code>ORDERED_PARTITION_SENDER = 9;</code>
+   */
+  ORDERED_PARTITION_SENDER(9),
+  /**
+   * <code>PROJECT = 10;</code>
+   */
+  PROJECT(10),
+  /**
+   * <code>UNORDERED_RECEIVER = 11;</code>
+   */
+  UNORDERED_RECEIVER(11),
+  /**
+   * <code>RANGE_PARTITION_SENDER = 12;</code>
+   */
+  RANGE_PARTITION_SENDER(12),
+  /**
+   * <code>SCREEN = 13;</code>
+   */
+  SCREEN(13),
+  /**
+   * <code>SELECTION_VECTOR_REMOVER = 14;</code>
+   */
+  SELECTION_VECTOR_REMOVER(14),
+  /**
+   * <code>STREAMING_AGGREGATE = 15;</code>
+   */
+  STREAMING_AGGREGATE(15),
+  /**
+   * <code>TOP_N_SORT = 16;</code>
+   */
+  TOP_N_SORT(16),
+  /**
+   * <code>EXTERNAL_SORT = 17;</code>
+   */
+  EXTERNAL_SORT(17),
+  /**
+   * <code>TRACE = 18;</code>
+   */
+  TRACE(18),
+  /**
+   * <code>UNION = 19;</code>
+   */
+  UNION(19),
+  /**
+   * <code>OLD_SORT = 20;</code>
+   */
+  OLD_SORT(20),
+  /**
+   * <code>PARQUET_ROW_GROUP_SCAN = 21;</code>
+   */
+  PARQUET_ROW_GROUP_SCAN(21),
+  /**
+   * <code>HIVE_SUB_SCAN = 22;</code>
+   */
+  HIVE_SUB_SCAN(22),
+  /**
+   * <code>SYSTEM_TABLE_SCAN = 23;</code>
+   */
+  SYSTEM_TABLE_SCAN(23),
+  /**
+   * <code>MOCK_SUB_SCAN = 24;</code>
+   */
+  MOCK_SUB_SCAN(24),
+  /**
+   * <code>PARQUET_WRITER = 25;</code>
+   */
+  PARQUET_WRITER(25),
+  /**
+   * <code>DIRECT_SUB_SCAN = 26;</code>
+   */
+  DIRECT_SUB_SCAN(26),
+  /**
+   * <code>TEXT_WRITER = 27;</code>
+   */
+  TEXT_WRITER(27),
+  /**
+   * <code>TEXT_SUB_SCAN = 28;</code>
+   */
+  TEXT_SUB_SCAN(28),
+  /**
+   * <code>JSON_SUB_SCAN = 29;</code>
+   */
+  JSON_SUB_SCAN(29),
+  /**
+   * <code>INFO_SCHEMA_SUB_SCAN = 30;</code>
+   */
+  INFO_SCHEMA_SUB_SCAN(30),
+  /**
+   * <code>COMPLEX_TO_JSON = 31;</code>
+   */
+  COMPLEX_TO_JSON(31),
+  /**
+   * <code>PRODUCER_CONSUMER = 32;</code>
+   */
+  PRODUCER_CONSUMER(32),
+  /**
+   * <code>HBASE_SUB_SCAN = 33;</code>
+   */
+  HBASE_SUB_SCAN(33),
+  /**
+   * <code>WINDOW = 34;</code>
+   */
+  WINDOW(34),
+  /**
+   * <code>NESTED_LOOP_JOIN = 35;</code>
+   */
+  NESTED_LOOP_JOIN(35),
+  /**
+   * <code>AVRO_SUB_SCAN = 36;</code>
+   */
+  AVRO_SUB_SCAN(36),
+  /**
+   * <code>PCAP_SUB_SCAN = 37;</code>
+   */
+  PCAP_SUB_SCAN(37),
+  /**
+   * <code>KAFKA_SUB_SCAN = 38;</code>
+   */
+  KAFKA_SUB_SCAN(38),
+  /**
+   * <code>KUDU_SUB_SCAN = 39;</code>
+   */
+  KUDU_SUB_SCAN(39),
+  /**
+   * <code>FLATTEN = 40;</code>
+   */
+  FLATTEN(40),
+  /**
+   * <code>LATERAL_JOIN = 41;</code>
+   */
+  LATERAL_JOIN(41),
+  /**
+   * <code>UNNEST = 42;</code>
+   */
+  UNNEST(42),
+  /**
+   * <code>HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN = 43;</code>
+   */
+  HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN(43),
+  /**
+   * <code>JDBC_SCAN = 44;</code>
+   */
+  JDBC_SCAN(44),
+  /**
+   * <code>REGEX_SUB_SCAN = 45;</code>
+   */
+  REGEX_SUB_SCAN(45),
+  /**
+   * <code>MAPRDB_SUB_SCAN = 46;</code>
+   */
+  MAPRDB_SUB_SCAN(46),
+  /**
+   * <code>MONGO_SUB_SCAN = 47;</code>
+   */
+  MONGO_SUB_SCAN(47),
+  /**
+   * <code>KUDU_WRITER = 48;</code>
+   */
+  KUDU_WRITER(48),
+  /**
+   * <code>OPEN_TSDB_SUB_SCAN = 49;</code>
+   */
+  OPEN_TSDB_SUB_SCAN(49),
+  /**
+   * <code>JSON_WRITER = 50;</code>
+   */
+  JSON_WRITER(50),
+  /**
+   * <code>HTPPD_LOG_SUB_SCAN = 51;</code>
+   */
+  HTPPD_LOG_SUB_SCAN(51),
+  /**
+   * <code>IMAGE_SUB_SCAN = 52;</code>
+   */
+  IMAGE_SUB_SCAN(52),
+  /**
+   * <code>SEQUENCE_SUB_SCAN = 53;</code>
+   */
+  SEQUENCE_SUB_SCAN(53),
+  /**
+   * <code>PARTITION_LIMIT = 54;</code>
+   */
+  PARTITION_LIMIT(54),
+  /**
+   * <code>PCAPNG_SUB_SCAN = 55;</code>
+   */
+  PCAPNG_SUB_SCAN(55),
+  /**
+   * <code>RUNTIME_FILTER = 56;</code>
+   */
+  RUNTIME_FILTER(56),
+  /**
+   * <code>ROWKEY_JOIN = 57;</code>
+   */
+  ROWKEY_JOIN(57),
+  /**
+   * <code>SYSLOG_SUB_SCAN = 58;</code>
+   */
+  SYSLOG_SUB_SCAN(58),
+  /**
+   * <code>STATISTICS_AGGREGATE = 59;</code>
+   */
+  STATISTICS_AGGREGATE(59),
+  /**
+   * <code>UNPIVOT_MAPS = 60;</code>
+   */
+  UNPIVOT_MAPS(60),
+  /**
+   * <code>STATISTICS_MERGE = 61;</code>
+   */
+  STATISTICS_MERGE(61),
+  /**
+   * <code>LTSV_SUB_SCAN = 62;</code>
+   */
+  LTSV_SUB_SCAN(62),
+  /**
+   * <code>HDF5_SUB_SCAN = 63;</code>
+   */
+  HDF5_SUB_SCAN(63),
+  /**
+   * <code>EXCEL_SUB_SCAN = 64;</code>
+   */
+  EXCEL_SUB_SCAN(64),
+  /**
+   * <code>SHP_SUB_SCAN = 65;</code>
+   */
+  SHP_SUB_SCAN(65),
+  /**
+   * <code>METADATA_HANDLER = 66;</code>
+   */
+  METADATA_HANDLER(66),
+  /**
+   * <code>METADATA_CONTROLLER = 67;</code>
+   */
+  METADATA_CONTROLLER(67),
+  /**
+   * <code>DRUID_SUB_SCAN = 68;</code>
+   */
+  DRUID_SUB_SCAN(68),
+  /**
+   * <code>SPSS_SUB_SCAN = 69;</code>
+   */
+  SPSS_SUB_SCAN(69),
+  /**
+   * <code>HTTP_SUB_SCAN = 70;</code>
+   */
+  HTTP_SUB_SCAN(70),
+  /**
+   * <code>XML_SUB_SCAN = 71;</code>
+   */
+  XML_SUB_SCAN(71);
+
+  private final int value;
+
+  CoreOperatorType(int value) {
+    this.value = value;
+  }
+
+  public int getId() {
+    return value;
+  }
+
+  public static CoreOperatorType valueOf(int id) {
+    if (id >= 0 && id <= XML_SUB_SCAN.getId()) {
+      return values()[id];
+    }
+    return null;
+  }
+
+  public static CoreOperatorType forName(String name) {
+    return Arrays.stream(values())
+        .filter(value -> value.name().equalsIgnoreCase(name))
+        .findFirst()
+        .orElse(null);
+  }
+}
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
index 2e593b6..25fad85 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/OperatorWrapper.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.TimeUnit;
@@ -31,7 +32,9 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.drill.common.config.DrillConfig;
 import org.apache.drill.exec.ExecConstants;
 import org.apache.drill.exec.ops.OperatorMetricRegistry;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
+import org.apache.drill.exec.physical.config.ExternalSort;
+import org.apache.drill.exec.physical.config.HashAggregate;
+import org.apache.drill.exec.physical.config.HashJoinPOP;
 import org.apache.drill.exec.proto.UserBitShared.MetricValue;
 import org.apache.drill.exec.proto.UserBitShared.OperatorProfile;
 import org.apache.drill.exec.proto.UserBitShared.StreamProfile;
@@ -51,7 +54,7 @@ public class OperatorWrapper {
   private final int major;
   private final List<ImmutablePair<ImmutablePair<OperatorProfile, Integer>, String>> opsAndHosts; // [(operatorProfile --> minorFragment number,host), ...]
   private final OperatorProfile firstProfile;
-  private final CoreOperatorType operatorType;
+  private final String operatorType;
   private final String operatorName;
   private final int size;
   private final int timeSkewMin;
@@ -70,12 +73,19 @@ public class OperatorWrapper {
     Preconditions.checkArgument(opsAndHostsList.size() > 0);
     this.major = major;
     firstProfile = opsAndHostsList.get(0).getLeft().getLeft();
-    operatorType = CoreOperatorType.valueOf(firstProfile.getOperatorType());
+    if (firstProfile.hasOperatorTypeName()) {
+      operatorType = firstProfile.getOperatorTypeName();
+    } else {
+      CoreOperatorType operatorType = CoreOperatorType.valueOf(firstProfile.getOperatorType());
+      this.operatorType = operatorType != null
+          ? Objects.requireNonNull(operatorType).name()
+          : null;
+    }
     //Update Name from Physical Map
     String path = new OperatorPathBuilder().setMajor(major).setOperator(firstProfile).build();
     //Use Plan Extracted Operator Names if available
     String extractedOpName = phyOperMap.get(path);
-    String inferredOpName = operatorType == null ? UNKNOWN_OPERATOR : operatorType.toString();
+    String inferredOpName = operatorType == null ? UNKNOWN_OPERATOR : operatorType;
     //Revert to inferred names for exceptional cases
     // 1. Extracted 'FLATTEN' operator is NULL
     // 2. Extracted 'SCAN' could be a PARQUET_ROW_GROUP_SCAN, or KAFKA_SUB_SCAN, or etc.
@@ -225,7 +235,7 @@ public class OperatorWrapper {
     tb.appendNanos(avgProcTime);
     long maxProcTime = longProcess.getLeft().getProcessNanos();
     //Calculating skew of longest processing fragment w.r.t. average
-    double maxSkew = (avgProcTime > 0) ? maxProcTime/Double.valueOf(avgProcTime) : 0.0d;
+    double maxSkew = (avgProcTime > 0) ? maxProcTime/ (double) avgProcTime : 0.0d;
     //Marking skew if both thresholds are crossed
     if (avgProcTime > TimeUnit.SECONDS.toNanos(timeSkewMin) && maxSkew > timeSkewRatio ) {
       timeSkewMap = new HashMap<>();
@@ -256,7 +266,7 @@ public class OperatorWrapper {
     //Skewed Wait Warning
     timeSkewMap = null; //Resetting
     //Calculating skew of longest waiting fragment w.r.t. average
-    maxSkew = (avgWaitTime > 0) ? maxWaitTime/Double.valueOf(avgWaitTime) : 0.0d;
+    maxSkew = (avgWaitTime > 0) ? maxWaitTime/ (double) avgWaitTime : 0.0d;
     //Marking skew if both thresholds are crossed
     if (avgWaitTime > TimeUnit.SECONDS.toNanos(timeSkewMin) && maxSkew > waitSkewRatio) {
       timeSkewMap = new HashMap<>();
@@ -303,7 +313,7 @@ public class OperatorWrapper {
    * @param operatorType
    * @return index of spill metric
    */
-  private int getSpillCycleMetricIndex(CoreOperatorType operatorType) {
+  private int getSpillCycleMetricIndex(String operatorType) {
     // TODO: DRILL-6642, replace null values for ProtocolMessageEnum with UNRECOGNIZED NullValue to avoid null checks
     if (operatorType == null) {
       return NO_SPILL_METRIC_INDEX;
@@ -311,11 +321,11 @@ public class OperatorWrapper {
     String metricName;
 
     switch (operatorType) {
-    case EXTERNAL_SORT:
+    case ExternalSort.OPERATOR_TYPE:
       metricName = "SPILL_COUNT";
       break;
-    case HASH_AGGREGATE:
-    case HASH_JOIN:
+    case HashAggregate.OPERATOR_TYPE:
+    case HashJoinPOP.OPERATOR_TYPE:
       metricName = "SPILL_CYCLE";
       break;
     default:
@@ -323,7 +333,7 @@ public class OperatorWrapper {
     }
 
     int metricIndex = 0; //Default
-    String[] metricNames = OperatorMetricRegistry.getMetricNames(operatorType.getNumber());
+    String[] metricNames = OperatorMetricRegistry.getMetricNames(operatorType);
     for (String name : metricNames) {
       if (name.equalsIgnoreCase(metricName)) {
         return metricIndex;
@@ -338,7 +348,7 @@ public class OperatorWrapper {
     if (operatorType == null) {
       return "";
     }
-    final String[] metricNames = OperatorMetricRegistry.getMetricNames(operatorType.getNumber());
+    final String[] metricNames = OperatorMetricRegistry.getMetricNames(operatorType);
     if (metricNames == null) {
       return "";
     }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
index e5c4133..b0838da 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileWrapper.java
@@ -31,7 +31,6 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.drill.common.config.DrillConfig;
 import org.apache.drill.exec.ExecConstants;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.proto.UserBitShared.MajorFragmentProfile;
 import org.apache.drill.exec.proto.UserBitShared.MinorFragmentProfile;
 import org.apache.drill.exec.proto.UserBitShared.OperatorProfile;
@@ -68,7 +67,7 @@ public class ProfileWrapper {
   private Map<String, String> physicalOperatorMap;
   private final String noProgressWarningThreshold;
   private final int defaultAutoLimit;
-  private boolean showEstimatedRows;
+  private final boolean showEstimatedRows;
   private final String csrfToken;
 
   public ProfileWrapper(final QueryProfile profile, DrillConfig drillConfig, HttpServletRequest request) {
@@ -324,16 +323,6 @@ public class ProfileWrapper {
     return tb.build();
   }
 
-  public String getOperatorsJSON() {
-    final StringBuilder sb = new StringBuilder("{");
-    String sep = "";
-    for (final CoreOperatorType op : CoreOperatorType.values()) {
-      sb.append(String.format("%s\"%d\" : \"%s\"", sep, op.ordinal(), op));
-      sep = ", ";
-    }
-    return sb.append("}").toString();
-  }
-
   public Map<String, String> getOptions() {
     return getOptions(o -> true);
   }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroFormatPlugin.java
index 854c6be..5051cb4 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroFormatPlugin.java
@@ -22,7 +22,6 @@ import org.apache.drill.common.types.TypeProtos;
 import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -45,19 +44,18 @@ public class AvroFormatPlugin extends EasyFormatPlugin<AvroFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, AvroFormatConfig formatConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = true;
-    config.compressible = false;
-    config.supportsProjectPushdown = true;
-    config.extensions = formatConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = DEFAULT_NAME;
-    config.readerOperatorType = CoreOperatorType.AVRO_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(true)
+        .compressible(false)
+        .supportsProjectPushdown(true)
+        .extensions(formatConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(DEFAULT_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java
index af931f9..5c290d3 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyFormatPlugin.java
@@ -18,9 +18,12 @@
 package org.apache.drill.exec.store.dfs.easy;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
 import org.apache.drill.common.exceptions.ExecutionSetupException;
@@ -90,34 +93,253 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
    * vary across uses of the plugin.
    */
   public static class EasyFormatConfig {
-    public BasicFormatMatcher matcher;
-    public boolean readable = true;
-    public boolean writable;
-    public boolean blockSplittable;
-    public boolean compressible;
-    public Configuration fsConf;
-    public List<String> extensions;
-    public String defaultName;
+    private BasicFormatMatcher matcher;
+    private final boolean readable;
+    private final boolean writable;
+    private final boolean blockSplittable;
+    private final boolean compressible;
+    private final Configuration fsConf;
+    private final List<String> extensions;
+    private final String defaultName;
 
     // Config options that, prior to Drill 1.15, required the plugin to
     // override methods. Moving forward, plugins should be migrated to
     // use this simpler form. New plugins should use these options
     // instead of overriding methods.
 
-    public boolean supportsLimitPushdown;
-    public boolean supportsProjectPushdown;
-    public boolean supportsFileImplicitColumns = true;
-    public boolean supportsAutoPartitioning;
-    public boolean supportsStatistics;
-    public int readerOperatorType = -1;
-    public int writerOperatorType = -1;
+    private final boolean supportsLimitPushdown;
+    private final boolean supportsProjectPushdown;
+    private final boolean supportsFileImplicitColumns;
+    private final boolean supportsAutoPartitioning;
+    private final boolean supportsStatistics;
+    private final String readerOperatorType;
+    private final String writerOperatorType;
 
     /**
      *  Choose whether to use the "traditional" or "enhanced" reader
      *  structure. Can also be selected at runtime by overriding
-     *  {@link #useEnhancedScan(OptionManager)}.
+     *  {@link #useEnhancedScan()}.
      */
-    public boolean useEnhancedScan;
+    private final boolean useEnhancedScan;
+
+    public EasyFormatConfig(EasyFormatConfigBuilder builder) {
+      this.matcher = builder.matcher;
+      this.readable = builder.readable;
+      this.writable = builder.writable;
+      this.blockSplittable = builder.blockSplittable;
+      this.compressible = builder.compressible;
+      this.fsConf = builder.fsConf;
+      this.extensions = builder.extensions;
+      this.defaultName = builder.defaultName;
+      this.supportsLimitPushdown = builder.supportsLimitPushdown;
+      this.supportsProjectPushdown = builder.supportsProjectPushdown;
+      this.supportsFileImplicitColumns = builder.supportsFileImplicitColumns;
+      this.supportsAutoPartitioning = builder.supportsAutoPartitioning;
+      this.supportsStatistics = builder.supportsStatistics;
+      this.readerOperatorType = builder.readerOperatorType;
+      this.writerOperatorType = builder.writerOperatorType;
+      this.useEnhancedScan = builder.useEnhancedScan;
+    }
+
+    public BasicFormatMatcher getMatcher() {
+      return matcher;
+    }
+
+    public boolean isReadable() {
+      return readable;
+    }
+
+    public boolean isWritable() {
+      return writable;
+    }
+
+    public boolean isBlockSplittable() {
+      return blockSplittable;
+    }
+
+    public boolean isCompressible() {
+      return compressible;
+    }
+
+    public Configuration getFsConf() {
+      return fsConf;
+    }
+
+    public List<String> getExtensions() {
+      return extensions;
+    }
+
+    public String getDefaultName() {
+      return defaultName;
+    }
+
+    public boolean supportsLimitPushdown() {
+      return supportsLimitPushdown;
+    }
+
+    public boolean supportsProjectPushdown() {
+      return supportsProjectPushdown;
+    }
+
+    public boolean supportsFileImplicitColumns() {
+      return supportsFileImplicitColumns;
+    }
+
+    public boolean supportsAutoPartitioning() {
+      return supportsAutoPartitioning;
+    }
+
+    public boolean supportsStatistics() {
+      return supportsStatistics;
+    }
+
+    public String getReaderOperatorType() {
+      return readerOperatorType;
+    }
+
+    public String getWriterOperatorType() {
+      return writerOperatorType;
+    }
+
+    public boolean useEnhancedScan() {
+      return useEnhancedScan;
+    }
+
+    public static EasyFormatConfigBuilder builder() {
+      return new EasyFormatConfigBuilder();
+    }
+
+    public EasyFormatConfigBuilder toBuilder() {
+      return builder()
+          .matcher(matcher)
+          .readable(readable)
+          .writable(writable)
+          .blockSplittable(blockSplittable)
+          .compressible(compressible)
+          .fsConf(fsConf)
+          .extensions(extensions)
+          .defaultName(defaultName)
+          .supportsLimitPushdown(supportsLimitPushdown)
+          .supportsProjectPushdown(supportsProjectPushdown)
+          .supportsFileImplicitColumns(supportsFileImplicitColumns)
+          .supportsAutoPartitioning(supportsAutoPartitioning)
+          .supportsStatistics(supportsStatistics)
+          .readerOperatorType(readerOperatorType)
+          .writerOperatorType(writerOperatorType)
+          .useEnhancedScan(useEnhancedScan);
+    }
+  }
+
+  public static class EasyFormatConfigBuilder {
+    private BasicFormatMatcher matcher;
+    private boolean readable = true;
+    private boolean writable;
+    private boolean blockSplittable;
+    private boolean compressible;
+    private Configuration fsConf;
+    private List<String> extensions;
+    private String defaultName;
+    private boolean supportsLimitPushdown;
+    private boolean supportsProjectPushdown;
+    private boolean supportsFileImplicitColumns = true;
+    private boolean supportsAutoPartitioning;
+    private boolean supportsStatistics;
+    private String readerOperatorType;
+    private String writerOperatorType = "";
+    private boolean useEnhancedScan;
+
+    public EasyFormatConfigBuilder matcher(BasicFormatMatcher matcher) {
+      this.matcher = matcher;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder readable(boolean readable) {
+      this.readable = readable;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder writable(boolean writable) {
+      this.writable = writable;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder blockSplittable(boolean blockSplittable) {
+      this.blockSplittable = blockSplittable;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder compressible(boolean compressible) {
+      this.compressible = compressible;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder fsConf(Configuration fsConf) {
+      this.fsConf = fsConf;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder extensions(List<String> extensions) {
+      this.extensions = extensions;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder extensions(String... extensions) {
+      this.extensions = Arrays.asList(extensions);
+      return this;
+    }
+
+    public EasyFormatConfigBuilder defaultName(String defaultName) {
+      this.defaultName = defaultName;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder supportsLimitPushdown(boolean supportsLimitPushdown) {
+      this.supportsLimitPushdown = supportsLimitPushdown;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder supportsProjectPushdown(boolean supportsProjectPushdown) {
+      this.supportsProjectPushdown = supportsProjectPushdown;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder supportsFileImplicitColumns(boolean supportsFileImplicitColumns) {
+      this.supportsFileImplicitColumns = supportsFileImplicitColumns;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder supportsAutoPartitioning(boolean supportsAutoPartitioning) {
+      this.supportsAutoPartitioning = supportsAutoPartitioning;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder supportsStatistics(boolean supportsStatistics) {
+      this.supportsStatistics = supportsStatistics;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder readerOperatorType(String readerOperatorType) {
+      this.readerOperatorType = readerOperatorType;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder writerOperatorType(String writerOperatorType) {
+      this.writerOperatorType = writerOperatorType;
+      return this;
+    }
+
+    public EasyFormatConfigBuilder useEnhancedScan(boolean useEnhancedScan) {
+      this.useEnhancedScan = useEnhancedScan;
+      return this;
+    }
+
+    public EasyFormatConfig build() {
+      Objects.requireNonNull(defaultName, "defaultName is not set");
+      readerOperatorType = readerOperatorType == null
+          ? defaultName.toUpperCase(Locale.ROOT) + "_SUB_SCAN"
+          : readerOperatorType;
+      return new EasyFormatConfig(this);
+    }
   }
 
   /**
@@ -163,14 +385,16 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
       boolean blockSplittable,
       boolean compressible, List<String> extensions, String defaultName) {
     this.name = name == null ? defaultName : name;
-    easyConfig = new EasyFormatConfig();
-    easyConfig.matcher = new BasicFormatMatcher(this, fsConf, extensions, compressible);
-    easyConfig.readable = readable;
-    easyConfig.writable = writable;
+    easyConfig = EasyFormatConfig.builder()
+        .matcher(new BasicFormatMatcher(this, fsConf, extensions, compressible))
+        .readable(readable)
+        .writable(writable)
+        .blockSplittable(blockSplittable)
+        .compressible(compressible)
+        .fsConf(fsConf)
+        .defaultName(defaultName)
+        .build();
     this.context = context;
-    easyConfig.blockSplittable = blockSplittable;
-    easyConfig.compressible = compressible;
-    easyConfig.fsConf = fsConf;
     this.storageConfig = storageConfig;
     this.formatConfig = formatConfig;
   }
@@ -203,7 +427,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
   }
 
   @Override
-  public Configuration getFsConf() { return easyConfig.fsConf; }
+  public Configuration getFsConf() { return easyConfig.getFsConf(); }
 
   @Override
   public DrillbitContext getContext() { return context; }
@@ -220,7 +444,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
    * that are identified at the first row.  CSV for example.  If the user only wants 100 rows, it
    * does not make sense to read the entire file.
    */
-  public boolean supportsLimitPushdown() { return easyConfig.supportsLimitPushdown; }
+  public boolean supportsLimitPushdown() { return easyConfig.supportsLimitPushdown(); }
 
   /**
    * Does this plugin support projection push down? That is, can the reader
@@ -230,7 +454,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
    * @return {@code true} if the plugin supports projection push-down,
    * {@code false} if Drill should do the task by adding a project operator
    */
-  public boolean supportsPushDown() { return easyConfig.supportsProjectPushdown; }
+  public boolean supportsPushDown() { return easyConfig.supportsProjectPushdown(); }
 
   /**
    * Whether this format plugin supports implicit file columns.
@@ -239,7 +463,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
    * {@code false} otherwise
    */
   public boolean supportsFileImplicitColumns() {
-    return easyConfig.supportsFileImplicitColumns;
+    return easyConfig.supportsFileImplicitColumns();
   }
 
   /**
@@ -249,7 +473,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
    *
    * @return {@code true} if splitable.
    */
-  public boolean isBlockSplittable() { return easyConfig.blockSplittable; }
+  public boolean isBlockSplittable() { return easyConfig.isBlockSplittable(); }
 
   /**
    * Indicates whether or not this format could also be in a compression
@@ -259,7 +483,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
    *
    * @return {@code true} if it is compressible
    */
-  public boolean isCompressible() { return easyConfig.compressible; }
+  public boolean isCompressible() { return easyConfig.isCompressible(); }
 
   /**
    * Return a record reader for the specific file format, when using the original
@@ -279,7 +503,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
 
   protected CloseableRecordBatch getReaderBatch(FragmentContext context,
       EasySubScan scan) throws ExecutionSetupException {
-    if (useEnhancedScan(context.getOptions())) {
+    if (useEnhancedScan()) {
       return buildScan(context, scan);
     } else {
       return buildScanBatch(context, scan);
@@ -295,8 +519,8 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
    * @return true to use the enhanced scan framework, false for the
    * traditional scan-batch framework
    */
-  protected boolean useEnhancedScan(OptionManager options) {
-    return easyConfig.useEnhancedScan;
+  protected boolean useEnhancedScan() {
+    return easyConfig.useEnhancedScan();
   }
 
   /**
@@ -409,7 +633,7 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
     // Additional error context to identify this plugin
     builder.errorContext(
         currentBuilder -> currentBuilder
-            .addContext("Format plugin", easyConfig.defaultName)
+            .addContext("Format plugin", easyConfig.getDefaultName())
             .addContext("Format plugin", EasyFormatPlugin.this.getClass().getSimpleName())
             .addContext("Plugin config name", getName()));
   }
@@ -498,27 +722,30 @@ public abstract class EasyFormatPlugin<T extends FormatPluginConfig> implements
   public StoragePluginConfig getStorageConfig() { return storageConfig; }
 
   @Override
-  public boolean supportsRead() { return easyConfig.readable; }
+  public boolean supportsRead() { return easyConfig.isReadable(); }
 
   @Override
-  public boolean supportsWrite() { return easyConfig.writable; }
+  public boolean supportsWrite() { return easyConfig.isWritable(); }
 
   @Override
-  public boolean supportsAutoPartitioning() { return easyConfig.supportsAutoPartitioning; }
+  public boolean supportsAutoPartitioning() { return easyConfig.supportsAutoPartitioning(); }
 
   @Override
-  public FormatMatcher getMatcher() { return easyConfig.matcher; }
+  public FormatMatcher getMatcher() { return easyConfig.getMatcher(); }
 
   @Override
   public Set<StoragePluginOptimizerRule> getOptimizerRules() {
     return ImmutableSet.of();
   }
 
-  public int getReaderOperatorType() { return easyConfig.readerOperatorType; }
-  public int getWriterOperatorType() { return easyConfig.writerOperatorType; }
+  public String getReaderOperatorType() {
+    return easyConfig.getReaderOperatorType();
+  }
+
+  public String getWriterOperatorType() { return easyConfig.getWriterOperatorType(); }
 
   @Override
-  public boolean supportsStatistics() { return easyConfig.supportsStatistics; }
+  public boolean supportsStatistics() { return easyConfig.supportsStatistics(); }
 
   @Override
   public TableStatistics readStatistics(FileSystem fs, Path statsTablePath) throws IOException {
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
index c968f6c..928ebac 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.collections.MapUtils;
 import org.apache.drill.common.PlanStringBuilder;
 import org.apache.drill.common.exceptions.DrillRuntimeException;
 import org.apache.drill.common.expression.SchemaPath;
@@ -87,7 +88,6 @@ public class EasyGroupScan extends AbstractGroupScanWithMetadata<TableMetadataPr
   private List<EndpointAffinity> endpointAffinities;
   private final Path selectionRoot;
   private final int maxRecords;
-  private final boolean supportsLimitPushdown;
 
   @JsonCreator
   public EasyGroupScan(
@@ -106,7 +106,6 @@ public class EasyGroupScan extends AbstractGroupScanWithMetadata<TableMetadataPr
     this.columns = columns == null ? ALL_COLUMNS : columns;
     this.selectionRoot = selectionRoot;
     this.maxRecords = getMaxRecords();
-    this.supportsLimitPushdown = formatPlugin.easyConfig().supportsLimitPushdown;
     this.metadataProvider = defaultTableMetadataProviderBuilder(new FileSystemMetadataProviderManager())
         .withSelection(selection)
         .withSchema(schema)
@@ -142,7 +141,6 @@ public class EasyGroupScan extends AbstractGroupScanWithMetadata<TableMetadataPr
     this.usedMetastore = metadataProviderManager.usesMetastore();
     initFromSelection(selection, formatPlugin);
     checkMetadataConsistency(selection, formatPlugin.getFsConf());
-    this.supportsLimitPushdown = formatPlugin.easyConfig().supportsLimitPushdown;
     this.maxRecords = getMaxRecords();
   }
 
@@ -180,7 +178,6 @@ public class EasyGroupScan extends AbstractGroupScanWithMetadata<TableMetadataPr
     partitionDepth = that.partitionDepth;
     metadataProvider = that.metadataProvider;
     maxRecords = getMaxRecords();
-    supportsLimitPushdown = that.formatPlugin.easyConfig().supportsLimitPushdown;
   }
 
   @JsonIgnore
@@ -402,7 +399,7 @@ public class EasyGroupScan extends AbstractGroupScanWithMetadata<TableMetadataPr
       EasyGroupScan newScan = new EasyGroupScan((EasyGroupScan) source);
       newScan.tableMetadata = tableMetadata;
       // updates common row count and nulls counts for every column
-      if (newScan.getTableMetadata() != null && files != null && newScan.getFilesMetadata().size() != files.size()) {
+      if (newScan.getTableMetadata() != null && MapUtils.isNotEmpty(files) && newScan.getFilesMetadata().size() != files.size()) {
         newScan.tableMetadata = TableMetadataUtils.updateRowCount(newScan.getTableMetadata(), files.values());
       }
       newScan.partitions = partitions;
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasySubScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasySubScan.java
index b9a6db2..dd31b90 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasySubScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasySubScan.java
@@ -110,5 +110,5 @@ public class EasySubScan extends AbstractSubScan {
   public int getMaxRecords() { return maxRecords; }
 
   @Override
-  public int getOperatorType() { return formatPlugin.getReaderOperatorType(); }
+  public String getOperatorType() { return formatPlugin.getReaderOperatorType(); }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyWriter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyWriter.java
index 2dec8c8..7197678 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyWriter.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyWriter.java
@@ -31,12 +31,9 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @JsonTypeName("fs-writer")
 public class EasyWriter extends AbstractWriter {
-  static final Logger logger = LoggerFactory.getLogger(EasyWriter.class);
 
   private final String location;
   private final List<String> partitionColumns;
@@ -98,7 +95,7 @@ public class EasyWriter extends AbstractWriter {
   }
 
   @Override
-  public int getOperatorType() {
+  public String getOperatorType() {
     return formatPlugin.getWriterOperatorType();
   }
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectSubScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectSubScan.java
index 89b0ef6..e4fcff9 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectSubScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/direct/DirectSubScan.java
@@ -21,7 +21,6 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
 import org.apache.drill.exec.physical.base.AbstractSubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.RecordReader;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
@@ -32,7 +31,8 @@ import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT;
 @JsonTypeName("direct-sub-scan")
 public class DirectSubScan extends AbstractSubScan {
 
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DirectSubScan.class);
+  public static final String OPERATOR_TYPE = "DIRECT_SUB_SCAN";
+
   @JsonTypeInfo(use=NAME, include=WRAPPER_OBJECT)
   private final RecordReader reader;
 
@@ -43,14 +43,13 @@ public class DirectSubScan extends AbstractSubScan {
   }
 
   @JsonProperty
-  //@JsonGetter("reader")
   public RecordReader getReader() {
     return reader;
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.DIRECT_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java
index 7204686..34da747 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONFormatPlugin.java
@@ -33,7 +33,6 @@ import org.apache.drill.exec.ops.QueryContext.SqlStatementType;
 import org.apache.drill.exec.planner.common.DrillStatsTable;
 import org.apache.drill.exec.planner.common.DrillStatsTable.TableStatistics;
 import org.apache.drill.exec.proto.ExecProtos.FragmentHandle;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.RecordReader;
 import org.apache.drill.exec.store.RecordWriter;
@@ -61,11 +60,14 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class JSONFormatPlugin extends EasyFormatPlugin<JSONFormatConfig> {
+
   private static final Logger logger = LoggerFactory.getLogger(JSONFormatPlugin.class);
   public static final String DEFAULT_NAME = "json";
 
   private static final boolean IS_COMPRESSIBLE = true;
 
+  public static final String OPERATOR_TYPE = "JSON_SUB_SCAN";
+
   public JSONFormatPlugin(String name, DrillbitContext context,
       Configuration fsConf, StoragePluginConfig storageConfig) {
     this(name, context, fsConf, storageConfig, new JSONFormatConfig(null));
@@ -215,13 +217,13 @@ public class JSONFormatPlugin extends EasyFormatPlugin<JSONFormatConfig> {
   }
 
   @Override
-  public int getReaderOperatorType() {
-    return CoreOperatorType.JSON_SUB_SCAN_VALUE;
+  public String getReaderOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
-  public int getWriterOperatorType() {
-     return CoreOperatorType.JSON_WRITER_VALUE;
+  public String getWriterOperatorType() {
+     return "JSON_WRITER";
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileFormatPlugin.java
index 3c62fd5..6da129e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileFormatPlugin.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileReade
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanBuilder;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchemaNegotiator;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -34,6 +33,8 @@ import org.apache.hadoop.conf.Configuration;
 
 public class SequenceFileFormatPlugin extends EasyFormatPlugin<SequenceFileFormatConfig> {
 
+  public static final String OPERATOR_TYPE = "SEQUENCE_SUB_SCAN";
+
   public SequenceFileFormatPlugin(String name,
                                   DrillbitContext context,
                                   Configuration fsConf,
@@ -43,19 +44,19 @@ public class SequenceFileFormatPlugin extends EasyFormatPlugin<SequenceFileForma
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, SequenceFileFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = true;
-    config.compressible = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.readerOperatorType = CoreOperatorType.SEQUENCE_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    config.supportsProjectPushdown = true;
-    config.defaultName = SequenceFileFormatConfig.NAME;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(true)
+        .compressible(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .readerOperatorType(OPERATOR_TYPE)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .supportsProjectPushdown(true)
+        .defaultName(SequenceFileFormatConfig.NAME)
+        .build();
   }
 
   private static class SequenceFileReaderFactory extends FileReaderFactory {
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
index 3dd1e89..3cfba3a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/TextFormatPlugin.java
@@ -46,7 +46,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchem
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
 import org.apache.drill.exec.planner.physical.PlannerSettings;
 import org.apache.drill.exec.proto.ExecProtos.FragmentHandle;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.metadata.Propertied;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
@@ -83,6 +82,7 @@ import java.util.Objects;
  * as to support provided schema.)
  */
 public class TextFormatPlugin extends EasyFormatPlugin<TextFormatPlugin.TextFormatConfig> {
+
   private final static String PLUGIN_NAME = "text";
 
   public static final int MAXIMUM_NUMBER_COLUMNS = 64 * 1024;
@@ -109,6 +109,8 @@ public class TextFormatPlugin extends EasyFormatPlugin<TextFormatPlugin.TextForm
   public static final String TRIM_WHITESPACE_PROP = TEXT_PREFIX + "trim";
   public static final String PARSE_UNESCAPED_QUOTES_PROP = TEXT_PREFIX + "parseQuotes";
 
+  public static final String WRITER_OPERATOR_TYPE = "TEXT_WRITER";
+
   @JsonTypeName(PLUGIN_NAME)
   @JsonInclude(Include.NON_DEFAULT)
   public static class TextFormatConfig implements FormatPluginConfig {
@@ -143,8 +145,8 @@ public class TextFormatPlugin extends EasyFormatPlugin<TextFormatPlugin.TextForm
       this.quote = Strings.isNullOrEmpty(quote) ? '"' : quote.charAt(0);
       this.escape = Strings.isNullOrEmpty(escape) ? '"' : escape.charAt(0);
       this.comment = Strings.isNullOrEmpty(comment) ? '#' : comment.charAt(0);
-      this.skipFirstLine = skipFirstLine == null ? false : skipFirstLine;
-      this.extractHeader = extractHeader == null ? false : extractHeader;
+      this.skipFirstLine = skipFirstLine != null && skipFirstLine;
+      this.extractHeader = extractHeader != null && extractHeader;
     }
 
     public TextFormatConfig() {
@@ -231,20 +233,19 @@ public class TextFormatPlugin extends EasyFormatPlugin<TextFormatPlugin.TextForm
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, TextFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = true;
-    config.blockSplittable = true;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = PLUGIN_NAME;
-    config.readerOperatorType = CoreOperatorType.TEXT_SUB_SCAN_VALUE;
-    config.writerOperatorType = CoreOperatorType.TEXT_WRITER_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(true)
+        .blockSplittable(true)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(PLUGIN_NAME)
+        .writerOperatorType(WRITER_OPERATOR_TYPE)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/image/ImageFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/image/ImageFormatPlugin.java
index 048aa82..e1af3b5 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/image/ImageFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/image/ImageFormatPlugin.java
@@ -26,7 +26,6 @@ import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.planner.common.DrillStatsTable;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.RecordReader;
 import org.apache.drill.exec.store.RecordWriter;
@@ -67,12 +66,7 @@ public class ImageFormatPlugin extends EasyFormatPlugin<ImageFormatConfig> {
   }
 
   @Override
-  public int getReaderOperatorType() {
-    return CoreOperatorType.IMAGE_SUB_SCAN_VALUE;
-  }
-
-  @Override
-  public int getWriterOperatorType() {
+  public String getWriterOperatorType() {
     throw new UnsupportedOperationException("Drill doesn't currently support writing to image files.");
   }
 
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaSubScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaSubScan.java
index 4a0bba5..8b19e4e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaSubScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaSubScan.java
@@ -20,10 +20,11 @@ package org.apache.drill.exec.store.ischema;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.apache.drill.exec.physical.base.AbstractSubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 
 public class InfoSchemaSubScan extends AbstractSubScan {
 
+  public static final String OPERATOR_TYPE = "INFO_SCHEMA_SUB_SCAN";
+
   private final InfoSchemaTableType table;
   private final InfoSchemaFilter filter;
 
@@ -46,7 +47,7 @@ public class InfoSchemaSubScan extends AbstractSubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.INFO_SCHEMA_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/log/LogFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/log/LogFormatPlugin.java
index 1027fc7..67305c9 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/log/LogFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/log/LogFormatPlugin.java
@@ -28,7 +28,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileReade
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanBuilder;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchemaNegotiator;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.record.metadata.MetadataUtils;
 import org.apache.drill.exec.record.metadata.Propertied;
@@ -44,13 +43,13 @@ import org.apache.hadoop.conf.Configuration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
 public class LogFormatPlugin extends EasyFormatPlugin<LogFormatConfig> {
+
   private static final Logger logger = LoggerFactory.getLogger(LogFormatPlugin.class);
 
   public static final String PLUGIN_NAME = "logRegex";
@@ -58,6 +57,8 @@ public class LogFormatPlugin extends EasyFormatPlugin<LogFormatConfig> {
   public static final String REGEX_PROP = PROP_PREFIX + "regex";
   public static final String MAX_ERRORS_PROP = PROP_PREFIX + "maxErrors";
 
+  public static final String OPERATOR_TYPE = "REGEX_SUB_SCAN";
+
   private static class LogReaderFactory extends FileReaderFactory {
     private final LogReaderConfig readerConfig;
     private final int maxRecords;
@@ -80,20 +81,19 @@ public class LogFormatPlugin extends EasyFormatPlugin<LogFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, LogFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    // Should be block splitable, but logic not yet implemented.
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = Collections.singletonList(pluginConfig.getExtension());
-    config.fsConf = fsConf;
-    config.defaultName = PLUGIN_NAME;
-    config.readerOperatorType = CoreOperatorType.REGEX_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false) // Should be block splitable, but logic not yet implemented.
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtension())
+        .fsConf(fsConf)
+        .defaultName(PLUGIN_NAME)
+        .readerOperatorType(OPERATOR_TYPE)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   /**
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockStorePOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockStorePOP.java
index a723aca..d09bf0c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockStorePOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockStorePOP.java
@@ -32,7 +32,6 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("mock-store")
 public class MockStorePOP extends AbstractStore {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MockStorePOP.class);
 
   @JsonCreator
   public MockStorePOP(@JsonProperty("child") PhysicalOperator child) {
@@ -65,7 +64,7 @@ public class MockStorePOP extends AbstractStore {
   }
 
   @Override
-  public int getOperatorType() {
+  public String getOperatorType() {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockSubScanPOP.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockSubScanPOP.java
index 644a3be..980187f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockSubScanPOP.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockSubScanPOP.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.base.PhysicalVisitor;
 import org.apache.drill.exec.physical.base.SubScan;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.mock.MockTableDef.MockScanEntry;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -43,6 +42,8 @@ import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 @JsonTypeName("mock-sub-scan")
 public class MockSubScanPOP extends AbstractBase implements SubScan {
 
+  public static final String OPERATOR_TYPE = "MOCK_SUB_SCAN";
+
   private final String url;
   protected final List<MockScanEntry> readEntries;
   private final boolean extended;
@@ -116,7 +117,7 @@ public class MockSubScanPOP extends AbstractBase implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.MOCK_SUB_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 }
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRowGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRowGroupScan.java
index 75cb302..9478061 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRowGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetRowGroupScan.java
@@ -26,7 +26,6 @@ import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.FormatPluginConfig;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.metadata.TupleMetadata;
 import org.apache.drill.exec.store.ColumnExplorer;
 import org.apache.drill.exec.store.StoragePluginRegistry;
@@ -44,6 +43,8 @@ import org.apache.hadoop.fs.Path;
 @JsonTypeName("parquet-row-group-scan")
 public class ParquetRowGroupScan extends AbstractParquetRowGroupScan {
 
+  public static final String OPERATOR_TYPE = "PARQUET_ROW_GROUP_SCAN";
+
   private final ParquetFormatPlugin formatPlugin;
   private final ParquetFormatConfig formatConfig;
 
@@ -103,8 +104,8 @@ public class ParquetRowGroupScan extends AbstractParquetRowGroupScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.PARQUET_ROW_GROUP_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetWriter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetWriter.java
index 61bd44f..9ab886a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetWriter.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetWriter.java
@@ -26,9 +26,6 @@ import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.physical.base.AbstractWriter;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.store.StorageStrategy;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
 import com.fasterxml.jackson.annotation.JacksonInject;
@@ -39,7 +36,6 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName("parquet-writer")
 public class ParquetWriter extends AbstractWriter {
-  static final Logger logger = LoggerFactory.getLogger(ParquetWriter.class);
 
 /** Version of Drill's Parquet writer. Increment this version (by 1) any time we make any format change to the file.
  * Format changes include:
@@ -53,6 +49,8 @@ public class ParquetWriter extends AbstractWriter {
  */
   public static final int WRITER_VERSION = 3;
 
+  public static final String OPERATOR_TYPE = "PARQUET_WRITER";
+
   private final String location;
   private final List<String> partitionColumns;
   private final ParquetFormatPlugin formatPlugin;
@@ -117,8 +115,8 @@ public class ParquetWriter extends AbstractWriter {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.PARQUET_WRITER_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcap/PcapFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcap/PcapFormatPlugin.java
index b5b77fc..69dbfc5 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcap/PcapFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcap/PcapFormatPlugin.java
@@ -26,7 +26,6 @@ import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasySubScan;
 import org.apache.drill.common.logical.StoragePluginConfig;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
 import org.apache.hadoop.conf.Configuration;
@@ -59,19 +58,18 @@ public class PcapFormatPlugin extends EasyFormatPlugin<PcapFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, PcapFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.supportsProjectPushdown = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.defaultName = PLUGIN_NAME;
-    config.readerOperatorType = UserBitShared.CoreOperatorType.PCAP_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .supportsProjectPushdown(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .defaultName(PLUGIN_NAME)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .build();
   }
 
   @Override
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcapng/PcapngFormatPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcapng/PcapngFormatPlugin.java
index d80e8ac..0cccd6b 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcapng/PcapngFormatPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/pcapng/PcapngFormatPlugin.java
@@ -25,7 +25,6 @@ import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileReade
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileScanBuilder;
 import org.apache.drill.exec.physical.impl.scan.file.FileScanFramework.FileSchemaNegotiator;
 import org.apache.drill.exec.physical.impl.scan.framework.ManagedReader;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.options.OptionManager;
 import org.apache.drill.exec.store.dfs.easy.EasyFormatPlugin;
@@ -43,19 +42,18 @@ public class PcapngFormatPlugin extends EasyFormatPlugin<PcapngFormatConfig> {
   }
 
   private static EasyFormatConfig easyConfig(Configuration fsConf, PcapngFormatConfig pluginConfig) {
-    EasyFormatConfig config = new EasyFormatConfig();
-    config.readable = true;
-    config.writable = false;
-    config.blockSplittable = false;
-    config.compressible = true;
-    config.extensions = pluginConfig.getExtensions();
-    config.fsConf = fsConf;
-    config.readerOperatorType = CoreOperatorType.PCAPNG_SUB_SCAN_VALUE;
-    config.useEnhancedScan = true;
-    config.supportsLimitPushdown = true;
-    config.supportsProjectPushdown = true;
-    config.defaultName = PcapngFormatConfig.NAME;
-    return config;
+    return EasyFormatConfig.builder()
+        .readable(true)
+        .writable(false)
+        .blockSplittable(false)
+        .compressible(true)
+        .extensions(pluginConfig.getExtensions())
+        .fsConf(fsConf)
+        .useEnhancedScan(true)
+        .supportsLimitPushdown(true)
+        .supportsProjectPushdown(true)
+        .defaultName(PcapngFormatConfig.NAME)
+        .build();
   }
 
   private static class PcapngReaderFactory extends FileReaderFactory {
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java
index b2e37fe..150ed1a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTableScan.java
@@ -37,12 +37,13 @@ import org.apache.drill.exec.physical.base.ScanStats;
 import org.apache.drill.exec.physical.base.SubScan;
 import org.apache.drill.exec.planner.fragment.DistributionAffinity;
 import org.apache.drill.exec.proto.CoordinationProtos.DrillbitEndpoint;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 
 @JsonTypeName("sys")
 public class SystemTableScan extends AbstractGroupScan implements SubScan {
 
+  public static final String OPERATOR_TYPE = "SYSTEM_TABLE_SCAN";
+
   private final SystemTable table;
   private final SystemTablePlugin plugin;
   private final int maxRecordsToRead;
@@ -137,8 +138,8 @@ public class SystemTableScan extends AbstractGroupScan implements SubScan {
   }
 
   @Override
-  public int getOperatorType() {
-    return CoreOperatorType.SYSTEM_TABLE_SCAN_VALUE;
+  public String getOperatorType() {
+    return OPERATOR_TYPE;
   }
 
   /**
diff --git a/exec/java-exec/src/main/resources/rest/profile/profile.ftl b/exec/java-exec/src/main/resources/rest/profile/profile.ftl
index 34eed51..e9a8a5b 100644
--- a/exec/java-exec/src/main/resources/rest/profile/profile.ftl
+++ b/exec/java-exec/src/main/resources/rest/profile/profile.ftl
@@ -37,8 +37,7 @@
 
 <script>
     var globalconfig = {
-        "queryid" : "${model.getQueryId()}",
-        "operators" : ${model.getOperatorsJSON()?no_esc}
+        "queryid" : "${model.getQueryId()}"
     };
 
     $(document).ready(function() {
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestOperatorMetrics.java b/exec/java-exec/src/test/java/org/apache/drill/TestOperatorMetrics.java
index ed21275..e411271 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestOperatorMetrics.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestOperatorMetrics.java
@@ -19,13 +19,15 @@ package org.apache.drill;
 
 import org.apache.drill.categories.OperatorTest;
 import org.apache.drill.exec.ops.OperatorMetricRegistry;
-import org.apache.drill.exec.proto.UserBitShared;
+import org.apache.drill.exec.physical.config.ExternalSort;
+import org.apache.drill.exec.physical.config.NestedLoopJoinPOP;
+import org.apache.drill.exec.physical.config.Screen;
 import org.apache.drill.test.BaseTestQuery;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertNull;
 
 @Category(OperatorTest.class)
@@ -33,18 +35,18 @@ public class TestOperatorMetrics extends BaseTestQuery {
 
   @Test
   public void testMetricNames() {
-    assertEquals(new String[]{"BYTES_SENT"},
-              OperatorMetricRegistry.getMetricNames(UserBitShared.CoreOperatorType.SCREEN_VALUE));
+    assertArrayEquals(new String[]{"BYTES_SENT"},
+              OperatorMetricRegistry.getMetricNames(Screen.OPERATOR_TYPE));
 
-    assertEquals(new String[]{"SPILL_COUNT", "NOT_USED", "PEAK_BATCHES_IN_MEMORY", "MERGE_COUNT", "MIN_BUFFER",
+    assertArrayEquals(new String[]{"SPILL_COUNT", "NOT_USED", "PEAK_BATCHES_IN_MEMORY", "MERGE_COUNT", "MIN_BUFFER",
                       "SPILL_MB"},
-              OperatorMetricRegistry.getMetricNames(UserBitShared.CoreOperatorType.EXTERNAL_SORT_VALUE));
+              OperatorMetricRegistry.getMetricNames(ExternalSort.OPERATOR_TYPE));
   }
 
   @Test
   public void testNonExistentMetricNames() {
-    assertNull(OperatorMetricRegistry.getMetricNames(UserBitShared.CoreOperatorType.NESTED_LOOP_JOIN_VALUE));
+    assertNull(OperatorMetricRegistry.getMetricNames(NestedLoopJoinPOP.OPERATOR_TYPE));
 
-    assertNull(OperatorMetricRegistry.getMetricNames(202));
+    assertNull(OperatorMetricRegistry.getMetricNames("FOO_BAR"));
   }
 }
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/memory/TestAllocators.java b/exec/java-exec/src/test/java/org/apache/drill/exec/memory/TestAllocators.java
index 4fb5a8f..061a86c 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/memory/TestAllocators.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/memory/TestAllocators.java
@@ -39,16 +39,18 @@ import org.apache.drill.exec.ops.OperatorStats;
 import org.apache.drill.exec.ops.OperatorUtilities;
 import org.apache.drill.exec.physical.PhysicalPlan;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
+import org.apache.drill.exec.physical.config.UnionAll;
 import org.apache.drill.exec.planner.PhysicalPlanReader;
 import org.apache.drill.exec.planner.PhysicalPlanReaderTestFactory;
 import org.apache.drill.exec.proto.BitControl;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.record.MaterializedField;
 import org.apache.drill.exec.server.Drillbit;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.RemoteServiceSet;
 import org.apache.drill.exec.store.StoragePluginRegistry;
 import org.apache.drill.exec.store.StoragePluginRegistryImpl;
+import org.apache.drill.exec.store.easy.text.TextFormatPlugin;
+import org.apache.drill.exec.store.mock.MockSubScanPOP;
 import org.apache.drill.exec.vector.BitVector;
 import org.apache.drill.exec.vector.IntVector;
 import org.apache.drill.test.DrillTest;
@@ -219,7 +221,7 @@ public class TestAllocators extends DrillTest {
       OperatorStats stats;
 
       // Use some bogus operator type to create a new operator context.
-      def = new OpProfileDef(physicalOperator1.getOperatorId(), UserBitShared.CoreOperatorType.MOCK_SUB_SCAN_VALUE,
+      def = new OpProfileDef(physicalOperator1.getOperatorId(), MockSubScanPOP.OPERATOR_TYPE,
           OperatorUtilities.getChildCount(physicalOperator1));
       stats = fragmentContext1.getStats().newOperatorStats(def, fragmentContext1.getAllocator());
 
@@ -233,7 +235,7 @@ public class TestAllocators extends DrillTest {
 
       OperatorContext oContext21 = fragmentContext1.newOperatorContext(physicalOperator3);
 
-      def = new OpProfileDef(physicalOperator4.getOperatorId(), UserBitShared.CoreOperatorType.TEXT_WRITER_VALUE,
+      def = new OpProfileDef(physicalOperator4.getOperatorId(), TextFormatPlugin.WRITER_OPERATOR_TYPE,
           OperatorUtilities.getChildCount(physicalOperator4));
       stats = fragmentContext2.getStats().newOperatorStats(def, fragmentContext2.getAllocator());
       OperatorContext oContext22 = fragmentContext2.newOperatorContext(physicalOperator4, stats);
@@ -247,7 +249,7 @@ public class TestAllocators extends DrillTest {
       FragmentContextImpl fragmentContext3 = new FragmentContextImpl(bitContext, pf3, null, functionRegistry);
 
       // New fragment starts an operator that allocates an amount within the limit
-      def = new OpProfileDef(physicalOperator5.getOperatorId(), UserBitShared.CoreOperatorType.UNION_VALUE,
+      def = new OpProfileDef(physicalOperator5.getOperatorId(), UnionAll.OPERATOR_TYPE,
           OperatorUtilities.getChildCount(physicalOperator5));
       stats = fragmentContext3.getStats().newOperatorStats(def, fragmentContext3.getAllocator());
       OperatorContext oContext31 = fragmentContext3.newOperatorContext(physicalOperator5, stats);
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/agg/TestHashAggrSpill.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/agg/TestHashAggrSpill.java
index 87a324f..cae84b6 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/agg/TestHashAggrSpill.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/agg/TestHashAggrSpill.java
@@ -28,6 +28,7 @@ import org.apache.drill.categories.OperatorTest;
 import org.apache.drill.categories.SlowTest;
 import org.apache.drill.common.exceptions.UserRemoteException;
 import org.apache.drill.exec.ExecConstants;
+import org.apache.drill.exec.physical.config.HashAggregate;
 import org.apache.drill.exec.physical.impl.aggregate.HashAggTemplate;
 import org.apache.drill.exec.planner.physical.PlannerSettings;
 import org.apache.drill.exec.proto.UserBitShared;
@@ -107,7 +108,7 @@ public class TestHashAggrSpill extends DrillTest {
     }
 
     ProfileParser profile = client.parseProfile(summary.queryIdString());
-    List<ProfileParser.OperatorProfile> ops = profile.getOpsOfType(UserBitShared.CoreOperatorType.HASH_AGGREGATE_VALUE);
+    List<ProfileParser.OperatorProfile> ops = profile.getOpsOfType(HashAggregate.OPERATOR_TYPE);
 
     assertFalse(ops.isEmpty());
     // check for the first op only
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/ScanTestUtils.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/ScanTestUtils.java
index bfdff94..4cfca2f 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/ScanTestUtils.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/ScanTestUtils.java
@@ -102,8 +102,8 @@ public class ScanTestUtils {
       Scan scanConfig = new AbstractSubScan("bob") {
 
         @Override
-        public int getOperatorType() {
-          return 0;
+        public String getOperatorType() {
+          return "";
         }
       };
       OperatorContext opContext = opFixture.newOperatorContext(scanConfig);
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/TestScanBatchWriters.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/TestScanBatchWriters.java
index a9572ce..fd53d6f 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/TestScanBatchWriters.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/TestScanBatchWriters.java
@@ -52,8 +52,8 @@ public class TestScanBatchWriters extends SubOperatorTest {
     Scan scanConfig = new AbstractSubScan("bob") {
 
       @Override
-      public int getOperatorType() {
-        return 0;
+      public String getOperatorType() {
+        return "";
       }
     };
     OperatorContext opContext = fixture.newOperatorContext(scanConfig);
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/ScanFixture.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/ScanFixture.java
index 5b1b01d..6fe612b 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/ScanFixture.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/ScanFixture.java
@@ -81,8 +81,8 @@ public class ScanFixture {
       Scan scanConfig = new AbstractSubScan("bob") {
 
         @Override
-        public int getOperatorType() {
-          return 0;
+        public String getOperatorType() {
+          return "";
         }
       };
       OperatorContext opContext = opFixture.newOperatorContext(scanConfig);
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/lifecycle/BaseTestScanLifecycle.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/lifecycle/BaseTestScanLifecycle.java
index 66f10fc..df1fa0c 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/lifecycle/BaseTestScanLifecycle.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/scan/v3/lifecycle/BaseTestScanLifecycle.java
@@ -52,7 +52,7 @@ public class BaseTestScanLifecycle extends SubOperatorTest {
     }
 
     @Override
-    public int getOperatorType() { return 0; }
+    public String getOperatorType() { return "DUMMY_SUB_SCAN"; }
   }
 
   protected static abstract class SingleReaderFactory implements ReaderFactory<SchemaNegotiator> {
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortExec.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortExec.java
index 32a98e0..d567fe8 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortExec.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortExec.java
@@ -32,7 +32,6 @@ import org.apache.drill.common.logical.data.Order.Ordering;
 import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.physical.base.AbstractBase;
 import org.apache.drill.exec.physical.config.ExternalSort;
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
 import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
 import org.apache.drill.test.DrillTest;
 import org.junit.Test;
@@ -174,7 +173,7 @@ public class TestExternalSortExec extends DrillTest {
     assertSame(ordering, popConfig.getOrderings().get(0));
     assertFalse(popConfig.getReverse());
     assertEquals(SelectionVectorMode.FOUR_BYTE, popConfig.getSVMode());
-    assertEquals(CoreOperatorType.EXTERNAL_SORT_VALUE, popConfig.getOperatorType());
+    assertEquals(ExternalSort.OPERATOR_TYPE, popConfig.getOperatorType());
     assertEquals(ExternalSort.DEFAULT_SORT_ALLOCATION, popConfig.getInitialAllocation());
     assertEquals(AbstractBase.MAX_ALLOCATION, popConfig.getMaxAllocation());
     assertTrue(popConfig.isExecutable());
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortInternals.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortInternals.java
index 856bfff..200785f 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortInternals.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/xsort/TestExternalSortInternals.java
@@ -25,6 +25,7 @@ import org.apache.drill.categories.OperatorTest;
 import org.apache.drill.exec.ExecConstants;
 import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.ops.OperatorStats;
+import org.apache.drill.exec.physical.config.ExternalSort;
 import org.apache.drill.exec.physical.impl.xsort.SortMemoryManager.MergeAction;
 import org.apache.drill.exec.physical.impl.xsort.SortMemoryManager.MergeTask;
 import org.apache.drill.test.BaseDirTestWatcher;
@@ -655,7 +656,7 @@ public class TestExternalSortInternals extends SubOperatorTest {
 
   @Test
   public void testMetrics() {
-    OperatorStats stats = new OperatorStats(100, 101, 0, fixture.allocator());
+    OperatorStats stats = new OperatorStats(100, ExternalSort.OPERATOR_TYPE, 0, fixture.allocator());
     SortMetrics metrics = new SortMetrics(stats);
 
     // Input stats
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestRecordIterator.java b/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestRecordIterator.java
index 01c06a4..e85dd1b 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestRecordIterator.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestRecordIterator.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import org.apache.drill.exec.store.mock.MockSubScanPOP;
 import org.apache.drill.shaded.guava.com.google.common.collect.Lists;
 
 import org.apache.drill.categories.VectorTest;
@@ -41,7 +42,6 @@ import org.apache.drill.exec.planner.PhysicalPlanReaderTestFactory;
 import org.apache.drill.exec.pop.PopUnitTestBase;
 import org.apache.drill.exec.planner.PhysicalPlanReader;
 import org.apache.drill.exec.proto.BitControl;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.rpc.UserClientConnection;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.vector.ValueVector;
@@ -76,7 +76,7 @@ public class TestRecordIterator extends PopUnitTestBase {
 
     RecordBatch singleBatch = exec.getIncoming();
     PhysicalOperator dummyPop = operatorList.iterator().next();
-    OpProfileDef def = new OpProfileDef(dummyPop.getOperatorId(), UserBitShared.CoreOperatorType.MOCK_SUB_SCAN_VALUE,
+    OpProfileDef def = new OpProfileDef(dummyPop.getOperatorId(), MockSubScanPOP.OPERATOR_TYPE,
       OperatorUtilities.getChildCount(dummyPop));
     OperatorStats stats = exec.getContext().getStats().newOperatorStats(def, exec.getContext().getAllocator());
     RecordIterator iter = new RecordIterator(singleBatch, null, exec.getContext().newOperatorContext(dummyPop, stats), 0, false, null);
@@ -132,7 +132,7 @@ public class TestRecordIterator extends PopUnitTestBase {
 
     RecordBatch singleBatch = exec.getIncoming();
     PhysicalOperator dummyPop = operatorList.iterator().next();
-    OpProfileDef def = new OpProfileDef(dummyPop.getOperatorId(), UserBitShared.CoreOperatorType.MOCK_SUB_SCAN_VALUE,
+    OpProfileDef def = new OpProfileDef(dummyPop.getOperatorId(), MockSubScanPOP.OPERATOR_TYPE,
         OperatorUtilities.getChildCount(dummyPop));
     OperatorStats stats = exec.getContext().getStats().newOperatorStats(def, exec.getContext().getAllocator());
     RecordIterator iter = new RecordIterator(singleBatch, null, exec.getContext().newOperatorContext(dummyPop, stats), 0, null);
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestDrillFileSystem.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestDrillFileSystem.java
index ec841a3..b5582ef 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestDrillFileSystem.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestDrillFileSystem.java
@@ -68,7 +68,7 @@ public class TestDrillFileSystem extends BaseTest {
     InputStream is = null;
     Configuration conf = new Configuration();
     conf.set(FileSystem.FS_DEFAULT_NAME_KEY, FileSystem.DEFAULT_FS);
-    OpProfileDef profileDef = new OpProfileDef(0 /*operatorId*/, 0 /*operatorType*/, 0 /*inputCount*/);
+    OpProfileDef profileDef = new OpProfileDef(0 /*operatorId*/, "" /*operatorType*/, 0 /*inputCount*/);
     OperatorStats stats = new OperatorStats(profileDef, null /*allocator*/);
 
     // start wait time method in OperatorStats expects the OperatorStats state to be in "processing"
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetFilterPushDown.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetFilterPushDown.java
index f530945..bf57128 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetFilterPushDown.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetFilterPushDown.java
@@ -26,7 +26,6 @@ import org.apache.drill.exec.expr.stat.RowsMatch;
 import org.apache.drill.exec.ops.FragmentContextImpl;
 import org.apache.drill.exec.planner.physical.PlannerSettings;
 import org.apache.drill.exec.proto.BitControl;
-import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.store.parquet.columnreaders.ParquetRecordReader;
 import org.apache.drill.exec.store.parquet.metadata.Metadata;
 import org.apache.drill.exec.store.parquet.metadata.MetadataBase;
@@ -59,7 +58,7 @@ import java.util.Comparator;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 
 public class TestParquetFilterPushDown extends PlanTestBase {
   private static final String CTAS_TABLE = "order_ctas";
@@ -781,9 +780,9 @@ public class TestParquetFilterPushDown extends PlanTestBase {
     }
 
     ProfileParser profile = client.parseProfile(summary.queryIdString());
-    List<ProfileParser.OperatorProfile> ops = profile.getOpsOfType(UserBitShared.CoreOperatorType.PARQUET_ROW_GROUP_SCAN_VALUE);
+    List<ProfileParser.OperatorProfile> ops = profile.getOpsOfType(ParquetRowGroupScan.OPERATOR_TYPE);
 
-    assertTrue(!ops.isEmpty());
+    assertFalse(ops.isEmpty());
     // check for the first op only
     ProfileParser.OperatorProfile parquestScan0 = ops.get(0);
     long resultNumRowgroups = parquestScan0.getMetric(ParquetRecordReader.Metric.NUM_ROWGROUPS.ordinal());
diff --git a/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java b/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java
index 6b0992c..2fbba16 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java
@@ -452,7 +452,7 @@ public class OperatorFixture extends BaseFixture implements AutoCloseable {
                                BufferAllocator allocator,
                                PhysicalOperator config) {
       super(fragContext, allocator, config);
-      this.operatorStats = new OperatorStats(new OpProfileDef(0, 0, 100), allocator);
+      this.operatorStats = new OperatorStats(new OpProfileDef(0, "", 100), allocator);
     }
 
     @Override
diff --git a/exec/java-exec/src/test/java/org/apache/drill/test/OperatorTestBuilderTest.java b/exec/java-exec/src/test/java/org/apache/drill/test/OperatorTestBuilderTest.java
index 82e30bb..2282e19 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/test/OperatorTestBuilderTest.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/test/OperatorTestBuilderTest.java
@@ -145,8 +145,8 @@ public class OperatorTestBuilderTest extends PhysicalOpUnitTestBase {
     }
 
     @Override
-    public int getOperatorType() {
-      return 0;
+    public String getOperatorType() {
+      return "";
     }
 
     @Override
diff --git a/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java b/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java
index ecc3918..a329b53 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java
@@ -330,8 +330,8 @@ public class PhysicalOpUnitTestBase extends ExecTest {
     }
 
     @Override
-    public int getOperatorType() {
-      return 0;
+    public String getOperatorType() {
+      return "";
     }
 
     @Override
diff --git a/exec/java-exec/src/test/java/org/apache/drill/test/ProfileParser.java b/exec/java-exec/src/test/java/org/apache/drill/test/ProfileParser.java
index e4dcd98..88ba9a0 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/test/ProfileParser.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/test/ProfileParser.java
@@ -26,6 +26,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -36,8 +37,7 @@ import javax.json.JsonObject;
 import javax.json.JsonReader;
 import javax.json.JsonValue;
 
-import org.apache.drill.exec.proto.UserBitShared.CoreOperatorType;
-
+import org.apache.drill.exec.server.rest.profile.CoreOperatorType;
 import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -396,8 +396,7 @@ public class ProfileParser {
           logger.info("Can't find operator def: {}-{}", major.id, op.opId);
           continue;
         }
-        op.opName = CoreOperatorType.forNumber(op.type).name();
-        op.opName = op.opName.replace("_", " ");
+        op.opName = op.type.replace("_", " ");
         op.name = opDef.name;
         if (op.name.equalsIgnoreCase(op.opName)) {
           op.opName = null;
@@ -422,7 +421,7 @@ public class ProfileParser {
     public int majorFragId;
     public int minorFragId;
     public int opId;
-    public int type;
+    public String type;
     public String name;
     public long processMs;
     public long waitMs;
@@ -437,7 +436,10 @@ public class ProfileParser {
       majorFragId = majorId;
       minorFragId = minorId;
       opId = opProfile.getInt("operatorId");
-      type = opProfile.getInt("operatorType");
+      JsonValue.ValueType valueType = opProfile.get("operatorType").getValueType();
+      type = valueType == JsonValue.ValueType.STRING
+          ? opProfile.getString("operatorType")
+          : Objects.requireNonNull(CoreOperatorType.valueOf(opProfile.getInt("operatorType"))).name();
       processMs = opProfile.getJsonNumber("processNanos").longValue() / 1_000_000;
       waitMs = opProfile.getJsonNumber("waitNanos").longValue() / 1_000_000;
       setupMs = opProfile.getJsonNumber("setupNanos").longValue() / 1_000_000;
@@ -469,7 +471,7 @@ public class ProfileParser {
 
     @Override
     public String toString() {
-      return String.format("[OperatorProfile %02d-%02d-%02d, type: %d, name: %s]",
+      return String.format("[OperatorProfile %02d-%02d-%02d, type: %s, name: %s]",
           majorFragId, opId, minorFragId, type,
           (name == null) ? "null" : name);
     }
@@ -489,7 +491,7 @@ public class ProfileParser {
    */
 
   public static class OperatorSummary {
-    public int type;
+    public String type;
     public long processMs;
     public long setupMs;
     public int execCount;
@@ -697,9 +699,9 @@ public class ProfileParser {
   public static class FindOpVisitor extends TreeVisitor
   {
     private List<OperatorSummary> ops;
-    private int type;
+    private String type;
 
-    public List<OperatorSummary> find(int type, OperatorSummary node) {
+    public List<OperatorSummary> find(String type, OperatorSummary node) {
       ops = new ArrayList<>();
       this.type = type;
       visit(node);
@@ -708,7 +710,7 @@ public class ProfileParser {
 
     @Override
     protected void visitOp(OperatorSummary node, int indentLevel) {
-      if (node.type == type) {
+      if (type.equals(node.type)) {
         ops.add(node);
       }
     }
@@ -738,12 +740,11 @@ public class ProfileParser {
   /**
    * For a single-slice query, get all operators of a given numeric operator
    * type.
-   * @param type the operator type as specified in
-   * {@link org.apache.drill.exec.proto.UserBitShared.CoreOperatorType}
+   * @param type the operator type
    * @return a list of operators of the given type
    */
 
-  public List<OperatorProfile> getOpsOfType(int type) {
+  public List<OperatorProfile> getOpsOfType(String type) {
     List<OperatorProfile> ops = new ArrayList<>();
     List<OperatorSummary> opDefs = getOpDefsOfType(type);
     for (OperatorSummary opDef : opDefs) {
@@ -752,7 +753,7 @@ public class ProfileParser {
     return ops;
   }
 
-  public List<OperatorSummary> getOpDefsOfType(int type) {
+  public List<OperatorSummary> getOpDefsOfType(String type) {
     return new FindOpVisitor().find(type, topoOrder.get(0));
   }
 
@@ -891,7 +892,7 @@ public class ProfileParser {
       logger.info("Op: {} {}", op.opId, op.name);
       logger.info("Setup:   {} - {}%, {}%", op.setupMs, percent(op.setupMs, totalSetup), percent(op.setupMs, total));
       logger.info("Process: {} - {}%, {}%", op.processMs, percent(op.processMs, totalProcess), percent(op.processMs, total));
-      if (op.type == 17) {
+      if (op.type.equals("EXTERNAL_SORT")) {
         long value = op.getMetric(0);
         logger.info("  Spills: {}", value);
       }
diff --git a/protocol/src/main/java/org/apache/drill/exec/proto/SchemaUserBitShared.java b/protocol/src/main/java/org/apache/drill/exec/proto/SchemaUserBitShared.java
index 5aeff0f..2437fb6 100644
--- a/protocol/src/main/java/org/apache/drill/exec/proto/SchemaUserBitShared.java
+++ b/protocol/src/main/java/org/apache/drill/exec/proto/SchemaUserBitShared.java
@@ -2377,6 +2377,8 @@ public final class SchemaUserBitShared
 
                 if(message.hasWaitNanos())
                     output.writeInt64(9, message.getWaitNanos(), false);
+                if(message.hasOperatorTypeName())
+                    output.writeString(10, message.getOperatorTypeName(), false);
             }
             public boolean isInitialized(org.apache.drill.exec.proto.UserBitShared.OperatorProfile message)
             {
@@ -2442,6 +2444,9 @@ public final class SchemaUserBitShared
                         case 9:
                             builder.setWaitNanos(input.readInt64());
                             break;
+                        case 10:
+                            builder.setOperatorTypeName(input.readString());
+                            break;
                         default:
                             input.handleUnknownField(number, this);
                     }
@@ -2490,6 +2495,7 @@ public final class SchemaUserBitShared
                 case 7: return "peakLocalMemoryAllocated";
                 case 8: return "metric";
                 case 9: return "waitNanos";
+                case 10: return "operatorTypeName";
                 default: return null;
             }
         }
@@ -2509,6 +2515,7 @@ public final class SchemaUserBitShared
             fieldMap.put("peakLocalMemoryAllocated", 7);
             fieldMap.put("metric", 8);
             fieldMap.put("waitNanos", 9);
+            fieldMap.put("operatorTypeName", 10);
         }
     }
 
diff --git a/protocol/src/main/java/org/apache/drill/exec/proto/UserBitShared.java b/protocol/src/main/java/org/apache/drill/exec/proto/UserBitShared.java
index 4292ec1..4254143 100644
--- a/protocol/src/main/java/org/apache/drill/exec/proto/UserBitShared.java
+++ b/protocol/src/main/java/org/apache/drill/exec/proto/UserBitShared.java
@@ -409,732 +409,6 @@ public final class UserBitShared {
   }
 
   /**
-   * Protobuf enum {@code exec.shared.CoreOperatorType}
-   */
-  public enum CoreOperatorType
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>SINGLE_SENDER = 0;</code>
-     */
-    SINGLE_SENDER(0),
-    /**
-     * <code>BROADCAST_SENDER = 1;</code>
-     */
-    BROADCAST_SENDER(1),
-    /**
-     * <code>FILTER = 2;</code>
-     */
-    FILTER(2),
-    /**
-     * <code>HASH_AGGREGATE = 3;</code>
-     */
-    HASH_AGGREGATE(3),
-    /**
-     * <code>HASH_JOIN = 4;</code>
-     */
-    HASH_JOIN(4),
-    /**
-     * <code>MERGE_JOIN = 5;</code>
-     */
-    MERGE_JOIN(5),
-    /**
-     * <code>HASH_PARTITION_SENDER = 6;</code>
-     */
-    HASH_PARTITION_SENDER(6),
-    /**
-     * <code>LIMIT = 7;</code>
-     */
-    LIMIT(7),
-    /**
-     * <code>MERGING_RECEIVER = 8;</code>
-     */
-    MERGING_RECEIVER(8),
-    /**
-     * <code>ORDERED_PARTITION_SENDER = 9;</code>
-     */
-    ORDERED_PARTITION_SENDER(9),
-    /**
-     * <code>PROJECT = 10;</code>
-     */
-    PROJECT(10),
-    /**
-     * <code>UNORDERED_RECEIVER = 11;</code>
-     */
-    UNORDERED_RECEIVER(11),
-    /**
-     * <code>RANGE_PARTITION_SENDER = 12;</code>
-     */
-    RANGE_PARTITION_SENDER(12),
-    /**
-     * <code>SCREEN = 13;</code>
-     */
-    SCREEN(13),
-    /**
-     * <code>SELECTION_VECTOR_REMOVER = 14;</code>
-     */
-    SELECTION_VECTOR_REMOVER(14),
-    /**
-     * <code>STREAMING_AGGREGATE = 15;</code>
-     */
-    STREAMING_AGGREGATE(15),
-    /**
-     * <code>TOP_N_SORT = 16;</code>
-     */
-    TOP_N_SORT(16),
-    /**
-     * <code>EXTERNAL_SORT = 17;</code>
-     */
-    EXTERNAL_SORT(17),
-    /**
-     * <code>TRACE = 18;</code>
-     */
-    TRACE(18),
-    /**
-     * <code>UNION = 19;</code>
-     */
-    UNION(19),
-    /**
-     * <code>OLD_SORT = 20;</code>
-     */
-    OLD_SORT(20),
-    /**
-     * <code>PARQUET_ROW_GROUP_SCAN = 21;</code>
-     */
-    PARQUET_ROW_GROUP_SCAN(21),
-    /**
-     * <code>HIVE_SUB_SCAN = 22;</code>
-     */
-    HIVE_SUB_SCAN(22),
-    /**
-     * <code>SYSTEM_TABLE_SCAN = 23;</code>
-     */
-    SYSTEM_TABLE_SCAN(23),
-    /**
-     * <code>MOCK_SUB_SCAN = 24;</code>
-     */
-    MOCK_SUB_SCAN(24),
-    /**
-     * <code>PARQUET_WRITER = 25;</code>
-     */
-    PARQUET_WRITER(25),
-    /**
-     * <code>DIRECT_SUB_SCAN = 26;</code>
-     */
-    DIRECT_SUB_SCAN(26),
-    /**
-     * <code>TEXT_WRITER = 27;</code>
-     */
-    TEXT_WRITER(27),
-    /**
-     * <code>TEXT_SUB_SCAN = 28;</code>
-     */
-    TEXT_SUB_SCAN(28),
-    /**
-     * <code>JSON_SUB_SCAN = 29;</code>
-     */
-    JSON_SUB_SCAN(29),
-    /**
-     * <code>INFO_SCHEMA_SUB_SCAN = 30;</code>
-     */
-    INFO_SCHEMA_SUB_SCAN(30),
-    /**
-     * <code>COMPLEX_TO_JSON = 31;</code>
-     */
-    COMPLEX_TO_JSON(31),
-    /**
-     * <code>PRODUCER_CONSUMER = 32;</code>
-     */
-    PRODUCER_CONSUMER(32),
-    /**
-     * <code>HBASE_SUB_SCAN = 33;</code>
-     */
-    HBASE_SUB_SCAN(33),
-    /**
-     * <code>WINDOW = 34;</code>
-     */
-    WINDOW(34),
-    /**
-     * <code>NESTED_LOOP_JOIN = 35;</code>
-     */
-    NESTED_LOOP_JOIN(35),
-    /**
-     * <code>AVRO_SUB_SCAN = 36;</code>
-     */
-    AVRO_SUB_SCAN(36),
-    /**
-     * <code>PCAP_SUB_SCAN = 37;</code>
-     */
-    PCAP_SUB_SCAN(37),
-    /**
-     * <code>KAFKA_SUB_SCAN = 38;</code>
-     */
-    KAFKA_SUB_SCAN(38),
-    /**
-     * <code>KUDU_SUB_SCAN = 39;</code>
-     */
-    KUDU_SUB_SCAN(39),
-    /**
-     * <code>FLATTEN = 40;</code>
-     */
-    FLATTEN(40),
-    /**
-     * <code>LATERAL_JOIN = 41;</code>
-     */
-    LATERAL_JOIN(41),
-    /**
-     * <code>UNNEST = 42;</code>
-     */
-    UNNEST(42),
-    /**
-     * <code>HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN = 43;</code>
-     */
-    HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN(43),
-    /**
-     * <code>JDBC_SCAN = 44;</code>
-     */
-    JDBC_SCAN(44),
-    /**
-     * <code>REGEX_SUB_SCAN = 45;</code>
-     */
-    REGEX_SUB_SCAN(45),
-    /**
-     * <code>MAPRDB_SUB_SCAN = 46;</code>
-     */
-    MAPRDB_SUB_SCAN(46),
-    /**
-     * <code>MONGO_SUB_SCAN = 47;</code>
-     */
-    MONGO_SUB_SCAN(47),
-    /**
-     * <code>KUDU_WRITER = 48;</code>
-     */
-    KUDU_WRITER(48),
-    /**
-     * <code>OPEN_TSDB_SUB_SCAN = 49;</code>
-     */
-    OPEN_TSDB_SUB_SCAN(49),
-    /**
-     * <code>JSON_WRITER = 50;</code>
-     */
-    JSON_WRITER(50),
-    /**
-     * <code>HTPPD_LOG_SUB_SCAN = 51;</code>
-     */
-    HTPPD_LOG_SUB_SCAN(51),
-    /**
-     * <code>IMAGE_SUB_SCAN = 52;</code>
-     */
-    IMAGE_SUB_SCAN(52),
-    /**
-     * <code>SEQUENCE_SUB_SCAN = 53;</code>
-     */
-    SEQUENCE_SUB_SCAN(53),
-    /**
-     * <code>PARTITION_LIMIT = 54;</code>
-     */
-    PARTITION_LIMIT(54),
-    /**
-     * <code>PCAPNG_SUB_SCAN = 55;</code>
-     */
-    PCAPNG_SUB_SCAN(55),
-    /**
-     * <code>RUNTIME_FILTER = 56;</code>
-     */
-    RUNTIME_FILTER(56),
-    /**
-     * <code>ROWKEY_JOIN = 57;</code>
-     */
-    ROWKEY_JOIN(57),
-    /**
-     * <code>SYSLOG_SUB_SCAN = 58;</code>
-     */
-    SYSLOG_SUB_SCAN(58),
-    /**
-     * <code>STATISTICS_AGGREGATE = 59;</code>
-     */
-    STATISTICS_AGGREGATE(59),
-    /**
-     * <code>UNPIVOT_MAPS = 60;</code>
-     */
-    UNPIVOT_MAPS(60),
-    /**
-     * <code>STATISTICS_MERGE = 61;</code>
-     */
-    STATISTICS_MERGE(61),
-    /**
-     * <code>LTSV_SUB_SCAN = 62;</code>
-     */
-    LTSV_SUB_SCAN(62),
-    /**
-     * <code>HDF5_SUB_SCAN = 63;</code>
-     */
-    HDF5_SUB_SCAN(63),
-    /**
-     * <code>EXCEL_SUB_SCAN = 64;</code>
-     */
-    EXCEL_SUB_SCAN(64),
-    /**
-     * <code>SHP_SUB_SCAN = 65;</code>
-     */
-    SHP_SUB_SCAN(65),
-    /**
-     * <code>METADATA_HANDLER = 66;</code>
-     */
-    METADATA_HANDLER(66),
-    /**
-     * <code>METADATA_CONTROLLER = 67;</code>
-     */
-    METADATA_CONTROLLER(67),
-    /**
-     * <code>DRUID_SUB_SCAN = 68;</code>
-     */
-    DRUID_SUB_SCAN(68),
-    /**
-     * <code>SPSS_SUB_SCAN = 69;</code>
-     */
-    SPSS_SUB_SCAN(69),
-    /**
-     * <code>HTTP_SUB_SCAN = 70;</code>
-     */
-    HTTP_SUB_SCAN(70),
-    /**
-     * <code>XML_SUB_SCAN = 71;</code>
-     */
-    XML_SUB_SCAN(71),
-    ;
-
-    /**
-     * <code>SINGLE_SENDER = 0;</code>
-     */
-    public static final int SINGLE_SENDER_VALUE = 0;
-    /**
-     * <code>BROADCAST_SENDER = 1;</code>
-     */
-    public static final int BROADCAST_SENDER_VALUE = 1;
-    /**
-     * <code>FILTER = 2;</code>
-     */
-    public static final int FILTER_VALUE = 2;
-    /**
-     * <code>HASH_AGGREGATE = 3;</code>
-     */
-    public static final int HASH_AGGREGATE_VALUE = 3;
-    /**
-     * <code>HASH_JOIN = 4;</code>
-     */
-    public static final int HASH_JOIN_VALUE = 4;
-    /**
-     * <code>MERGE_JOIN = 5;</code>
-     */
-    public static final int MERGE_JOIN_VALUE = 5;
-    /**
-     * <code>HASH_PARTITION_SENDER = 6;</code>
-     */
-    public static final int HASH_PARTITION_SENDER_VALUE = 6;
-    /**
-     * <code>LIMIT = 7;</code>
-     */
-    public static final int LIMIT_VALUE = 7;
-    /**
-     * <code>MERGING_RECEIVER = 8;</code>
-     */
-    public static final int MERGING_RECEIVER_VALUE = 8;
-    /**
-     * <code>ORDERED_PARTITION_SENDER = 9;</code>
-     */
-    public static final int ORDERED_PARTITION_SENDER_VALUE = 9;
-    /**
-     * <code>PROJECT = 10;</code>
-     */
-    public static final int PROJECT_VALUE = 10;
-    /**
-     * <code>UNORDERED_RECEIVER = 11;</code>
-     */
-    public static final int UNORDERED_RECEIVER_VALUE = 11;
-    /**
-     * <code>RANGE_PARTITION_SENDER = 12;</code>
-     */
-    public static final int RANGE_PARTITION_SENDER_VALUE = 12;
-    /**
-     * <code>SCREEN = 13;</code>
-     */
-    public static final int SCREEN_VALUE = 13;
-    /**
-     * <code>SELECTION_VECTOR_REMOVER = 14;</code>
-     */
-    public static final int SELECTION_VECTOR_REMOVER_VALUE = 14;
-    /**
-     * <code>STREAMING_AGGREGATE = 15;</code>
-     */
-    public static final int STREAMING_AGGREGATE_VALUE = 15;
-    /**
-     * <code>TOP_N_SORT = 16;</code>
-     */
-    public static final int TOP_N_SORT_VALUE = 16;
-    /**
-     * <code>EXTERNAL_SORT = 17;</code>
-     */
-    public static final int EXTERNAL_SORT_VALUE = 17;
-    /**
-     * <code>TRACE = 18;</code>
-     */
-    public static final int TRACE_VALUE = 18;
-    /**
-     * <code>UNION = 19;</code>
-     */
-    public static final int UNION_VALUE = 19;
-    /**
-     * <code>OLD_SORT = 20;</code>
-     */
-    public static final int OLD_SORT_VALUE = 20;
-    /**
-     * <code>PARQUET_ROW_GROUP_SCAN = 21;</code>
-     */
-    public static final int PARQUET_ROW_GROUP_SCAN_VALUE = 21;
-    /**
-     * <code>HIVE_SUB_SCAN = 22;</code>
-     */
-    public static final int HIVE_SUB_SCAN_VALUE = 22;
-    /**
-     * <code>SYSTEM_TABLE_SCAN = 23;</code>
-     */
-    public static final int SYSTEM_TABLE_SCAN_VALUE = 23;
-    /**
-     * <code>MOCK_SUB_SCAN = 24;</code>
-     */
-    public static final int MOCK_SUB_SCAN_VALUE = 24;
-    /**
-     * <code>PARQUET_WRITER = 25;</code>
-     */
-    public static final int PARQUET_WRITER_VALUE = 25;
-    /**
-     * <code>DIRECT_SUB_SCAN = 26;</code>
-     */
-    public static final int DIRECT_SUB_SCAN_VALUE = 26;
-    /**
-     * <code>TEXT_WRITER = 27;</code>
-     */
-    public static final int TEXT_WRITER_VALUE = 27;
-    /**
-     * <code>TEXT_SUB_SCAN = 28;</code>
-     */
-    public static final int TEXT_SUB_SCAN_VALUE = 28;
-    /**
-     * <code>JSON_SUB_SCAN = 29;</code>
-     */
-    public static final int JSON_SUB_SCAN_VALUE = 29;
-    /**
-     * <code>INFO_SCHEMA_SUB_SCAN = 30;</code>
-     */
-    public static final int INFO_SCHEMA_SUB_SCAN_VALUE = 30;
-    /**
-     * <code>COMPLEX_TO_JSON = 31;</code>
-     */
-    public static final int COMPLEX_TO_JSON_VALUE = 31;
-    /**
-     * <code>PRODUCER_CONSUMER = 32;</code>
-     */
-    public static final int PRODUCER_CONSUMER_VALUE = 32;
-    /**
-     * <code>HBASE_SUB_SCAN = 33;</code>
-     */
-    public static final int HBASE_SUB_SCAN_VALUE = 33;
-    /**
-     * <code>WINDOW = 34;</code>
-     */
-    public static final int WINDOW_VALUE = 34;
-    /**
-     * <code>NESTED_LOOP_JOIN = 35;</code>
-     */
-    public static final int NESTED_LOOP_JOIN_VALUE = 35;
-    /**
-     * <code>AVRO_SUB_SCAN = 36;</code>
-     */
-    public static final int AVRO_SUB_SCAN_VALUE = 36;
-    /**
-     * <code>PCAP_SUB_SCAN = 37;</code>
-     */
-    public static final int PCAP_SUB_SCAN_VALUE = 37;
-    /**
-     * <code>KAFKA_SUB_SCAN = 38;</code>
-     */
-    public static final int KAFKA_SUB_SCAN_VALUE = 38;
-    /**
-     * <code>KUDU_SUB_SCAN = 39;</code>
-     */
-    public static final int KUDU_SUB_SCAN_VALUE = 39;
-    /**
-     * <code>FLATTEN = 40;</code>
-     */
-    public static final int FLATTEN_VALUE = 40;
-    /**
-     * <code>LATERAL_JOIN = 41;</code>
-     */
-    public static final int LATERAL_JOIN_VALUE = 41;
-    /**
-     * <code>UNNEST = 42;</code>
-     */
-    public static final int UNNEST_VALUE = 42;
-    /**
-     * <code>HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN = 43;</code>
-     */
-    public static final int HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN_VALUE = 43;
-    /**
-     * <code>JDBC_SCAN = 44;</code>
-     */
-    public static final int JDBC_SCAN_VALUE = 44;
-    /**
-     * <code>REGEX_SUB_SCAN = 45;</code>
-     */
-    public static final int REGEX_SUB_SCAN_VALUE = 45;
-    /**
-     * <code>MAPRDB_SUB_SCAN = 46;</code>
-     */
-    public static final int MAPRDB_SUB_SCAN_VALUE = 46;
-    /**
-     * <code>MONGO_SUB_SCAN = 47;</code>
-     */
-    public static final int MONGO_SUB_SCAN_VALUE = 47;
-    /**
-     * <code>KUDU_WRITER = 48;</code>
-     */
-    public static final int KUDU_WRITER_VALUE = 48;
-    /**
-     * <code>OPEN_TSDB_SUB_SCAN = 49;</code>
-     */
-    public static final int OPEN_TSDB_SUB_SCAN_VALUE = 49;
-    /**
-     * <code>JSON_WRITER = 50;</code>
-     */
-    public static final int JSON_WRITER_VALUE = 50;
-    /**
-     * <code>HTPPD_LOG_SUB_SCAN = 51;</code>
-     */
-    public static final int HTPPD_LOG_SUB_SCAN_VALUE = 51;
-    /**
-     * <code>IMAGE_SUB_SCAN = 52;</code>
-     */
-    public static final int IMAGE_SUB_SCAN_VALUE = 52;
-    /**
-     * <code>SEQUENCE_SUB_SCAN = 53;</code>
-     */
-    public static final int SEQUENCE_SUB_SCAN_VALUE = 53;
-    /**
-     * <code>PARTITION_LIMIT = 54;</code>
-     */
-    public static final int PARTITION_LIMIT_VALUE = 54;
-    /**
-     * <code>PCAPNG_SUB_SCAN = 55;</code>
-     */
-    public static final int PCAPNG_SUB_SCAN_VALUE = 55;
-    /**
-     * <code>RUNTIME_FILTER = 56;</code>
-     */
-    public static final int RUNTIME_FILTER_VALUE = 56;
-    /**
-     * <code>ROWKEY_JOIN = 57;</code>
-     */
-    public static final int ROWKEY_JOIN_VALUE = 57;
-    /**
-     * <code>SYSLOG_SUB_SCAN = 58;</code>
-     */
-    public static final int SYSLOG_SUB_SCAN_VALUE = 58;
-    /**
-     * <code>STATISTICS_AGGREGATE = 59;</code>
-     */
-    public static final int STATISTICS_AGGREGATE_VALUE = 59;
-    /**
-     * <code>UNPIVOT_MAPS = 60;</code>
-     */
-    public static final int UNPIVOT_MAPS_VALUE = 60;
-    /**
-     * <code>STATISTICS_MERGE = 61;</code>
-     */
-    public static final int STATISTICS_MERGE_VALUE = 61;
-    /**
-     * <code>LTSV_SUB_SCAN = 62;</code>
-     */
-    public static final int LTSV_SUB_SCAN_VALUE = 62;
-    /**
-     * <code>HDF5_SUB_SCAN = 63;</code>
-     */
-    public static final int HDF5_SUB_SCAN_VALUE = 63;
-    /**
-     * <code>EXCEL_SUB_SCAN = 64;</code>
-     */
-    public static final int EXCEL_SUB_SCAN_VALUE = 64;
-    /**
-     * <code>SHP_SUB_SCAN = 65;</code>
-     */
-    public static final int SHP_SUB_SCAN_VALUE = 65;
-    /**
-     * <code>METADATA_HANDLER = 66;</code>
-     */
-    public static final int METADATA_HANDLER_VALUE = 66;
-    /**
-     * <code>METADATA_CONTROLLER = 67;</code>
-     */
-    public static final int METADATA_CONTROLLER_VALUE = 67;
-    /**
-     * <code>DRUID_SUB_SCAN = 68;</code>
-     */
-    public static final int DRUID_SUB_SCAN_VALUE = 68;
-    /**
-     * <code>SPSS_SUB_SCAN = 69;</code>
-     */
-    public static final int SPSS_SUB_SCAN_VALUE = 69;
-    /**
-     * <code>HTTP_SUB_SCAN = 70;</code>
-     */
-    public static final int HTTP_SUB_SCAN_VALUE = 70;
-    /**
-     * <code>XML_SUB_SCAN = 71;</code>
-     */
-    public static final int XML_SUB_SCAN_VALUE = 71;
-
-
-    public final int getNumber() {
-      return value;
-    }
-
-    /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static CoreOperatorType valueOf(int value) {
-      return forNumber(value);
-    }
-
-    /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
-     */
-    public static CoreOperatorType forNumber(int value) {
-      switch (value) {
-        case 0: return SINGLE_SENDER;
-        case 1: return BROADCAST_SENDER;
-        case 2: return FILTER;
-        case 3: return HASH_AGGREGATE;
-        case 4: return HASH_JOIN;
-        case 5: return MERGE_JOIN;
-        case 6: return HASH_PARTITION_SENDER;
-        case 7: return LIMIT;
-        case 8: return MERGING_RECEIVER;
-        case 9: return ORDERED_PARTITION_SENDER;
-        case 10: return PROJECT;
-        case 11: return UNORDERED_RECEIVER;
-        case 12: return RANGE_PARTITION_SENDER;
-        case 13: return SCREEN;
-        case 14: return SELECTION_VECTOR_REMOVER;
-        case 15: return STREAMING_AGGREGATE;
-        case 16: return TOP_N_SORT;
-        case 17: return EXTERNAL_SORT;
-        case 18: return TRACE;
-        case 19: return UNION;
-        case 20: return OLD_SORT;
-        case 21: return PARQUET_ROW_GROUP_SCAN;
-        case 22: return HIVE_SUB_SCAN;
-        case 23: return SYSTEM_TABLE_SCAN;
-        case 24: return MOCK_SUB_SCAN;
-        case 25: return PARQUET_WRITER;
-        case 26: return DIRECT_SUB_SCAN;
-        case 27: return TEXT_WRITER;
-        case 28: return TEXT_SUB_SCAN;
-        case 29: return JSON_SUB_SCAN;
-        case 30: return INFO_SCHEMA_SUB_SCAN;
-        case 31: return COMPLEX_TO_JSON;
-        case 32: return PRODUCER_CONSUMER;
-        case 33: return HBASE_SUB_SCAN;
-        case 34: return WINDOW;
-        case 35: return NESTED_LOOP_JOIN;
-        case 36: return AVRO_SUB_SCAN;
-        case 37: return PCAP_SUB_SCAN;
-        case 38: return KAFKA_SUB_SCAN;
-        case 39: return KUDU_SUB_SCAN;
-        case 40: return FLATTEN;
-        case 41: return LATERAL_JOIN;
-        case 42: return UNNEST;
-        case 43: return HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN;
-        case 44: return JDBC_SCAN;
-        case 45: return REGEX_SUB_SCAN;
-        case 46: return MAPRDB_SUB_SCAN;
-        case 47: return MONGO_SUB_SCAN;
-        case 48: return KUDU_WRITER;
-        case 49: return OPEN_TSDB_SUB_SCAN;
-        case 50: return JSON_WRITER;
-        case 51: return HTPPD_LOG_SUB_SCAN;
-        case 52: return IMAGE_SUB_SCAN;
-        case 53: return SEQUENCE_SUB_SCAN;
-        case 54: return PARTITION_LIMIT;
-        case 55: return PCAPNG_SUB_SCAN;
-        case 56: return RUNTIME_FILTER;
-        case 57: return ROWKEY_JOIN;
-        case 58: return SYSLOG_SUB_SCAN;
-        case 59: return STATISTICS_AGGREGATE;
-        case 60: return UNPIVOT_MAPS;
-        case 61: return STATISTICS_MERGE;
-        case 62: return LTSV_SUB_SCAN;
-        case 63: return HDF5_SUB_SCAN;
-        case 64: return EXCEL_SUB_SCAN;
-        case 65: return SHP_SUB_SCAN;
-        case 66: return METADATA_HANDLER;
-        case 67: return METADATA_CONTROLLER;
-        case 68: return DRUID_SUB_SCAN;
-        case 69: return SPSS_SUB_SCAN;
-        case 70: return HTTP_SUB_SCAN;
-        case 71: return XML_SUB_SCAN;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<CoreOperatorType>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        CoreOperatorType> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<CoreOperatorType>() {
-            public CoreOperatorType findValueByNumber(int number) {
-              return CoreOperatorType.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return org.apache.drill.exec.proto.UserBitShared.getDescriptor().getEnumTypes().get(3);
-    }
-
-    private static final CoreOperatorType[] VALUES = values();
-
-    public static CoreOperatorType valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private CoreOperatorType(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:exec.shared.CoreOperatorType)
-  }
-
-  /**
    * Protobuf enum {@code exec.shared.SaslStatus}
    */
   public enum SaslStatus
@@ -1234,7 +508,7 @@ public final class UserBitShared {
     }
     public static final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptor() {
-      return org.apache.drill.exec.proto.UserBitShared.getDescriptor().getEnumTypes().get(4);
+      return org.apache.drill.exec.proto.UserBitShared.getDescriptor().getEnumTypes().get(3);
     }
 
     private static final SaslStatus[] VALUES = values();
@@ -23278,15 +22552,15 @@ public final class UserBitShared {
     int getOperatorId();
 
     /**
-     * <code>optional int32 operator_type = 4;</code>
+     * <code>optional int32 operator_type = 4 [deprecated = true];</code>
      * @return Whether the operatorType field is set.
      */
-    boolean hasOperatorType();
+    @java.lang.Deprecated boolean hasOperatorType();
     /**
-     * <code>optional int32 operator_type = 4;</code>
+     * <code>optional int32 operator_type = 4 [deprecated = true];</code>
      * @return The operatorType.
      */
-    int getOperatorType();
+    @java.lang.Deprecated int getOperatorType();
 
     /**
      * <code>optional int64 setup_nanos = 5;</code>
@@ -23355,6 +22629,23 @@ public final class UserBitShared {
      * @return The waitNanos.
      */
     long getWaitNanos();
+
+    /**
+     * <code>optional string operator_type_name = 10;</code>
+     * @return Whether the operatorTypeName field is set.
+     */
+    boolean hasOperatorTypeName();
+    /**
+     * <code>optional string operator_type_name = 10;</code>
+     * @return The operatorTypeName.
+     */
+    java.lang.String getOperatorTypeName();
+    /**
+     * <code>optional string operator_type_name = 10;</code>
+     * @return The bytes for operatorTypeName.
+     */
+    com.google.protobuf.ByteString
+        getOperatorTypeNameBytes();
   }
   /**
    * Protobuf type {@code exec.shared.OperatorProfile}
@@ -23371,6 +22662,7 @@ public final class UserBitShared {
     private OperatorProfile() {
       inputProfile_ = java.util.Collections.emptyList();
       metric_ = java.util.Collections.emptyList();
+      operatorTypeName_ = "";
     }
 
     @java.lang.Override
@@ -23452,6 +22744,12 @@ public final class UserBitShared {
               waitNanos_ = input.readInt64();
               break;
             }
+            case 82: {
+              com.google.protobuf.ByteString bs = input.readBytes();
+              bitField0_ |= 0x00000040;
+              operatorTypeName_ = bs;
+              break;
+            }
             default: {
               if (!parseUnknownField(
                   input, unknownFields, extensionRegistry, tag)) {
@@ -23546,17 +22844,17 @@ public final class UserBitShared {
     public static final int OPERATOR_TYPE_FIELD_NUMBER = 4;
     private int operatorType_;
     /**
-     * <code>optional int32 operator_type = 4;</code>
+     * <code>optional int32 operator_type = 4 [deprecated = true];</code>
      * @return Whether the operatorType field is set.
      */
-    public boolean hasOperatorType() {
+    @java.lang.Deprecated public boolean hasOperatorType() {
       return ((bitField0_ & 0x00000002) != 0);
     }
     /**
-     * <code>optional int32 operator_type = 4;</code>
+     * <code>optional int32 operator_type = 4 [deprecated = true];</code>
      * @return The operatorType.
      */
-    public int getOperatorType() {
+    @java.lang.Deprecated public int getOperatorType() {
       return operatorType_;
     }
 
@@ -23663,6 +22961,51 @@ public final class UserBitShared {
       return waitNanos_;
     }
 
+    public static final int OPERATOR_TYPE_NAME_FIELD_NUMBER = 10;
+    private volatile java.lang.Object operatorTypeName_;
+    /**
+     * <code>optional string operator_type_name = 10;</code>
+     * @return Whether the operatorTypeName field is set.
+     */
+    public boolean hasOperatorTypeName() {
+      return ((bitField0_ & 0x00000040) != 0);
+    }
+    /**
+     * <code>optional string operator_type_name = 10;</code>
+     * @return The operatorTypeName.
+     */
+    public java.lang.String getOperatorTypeName() {
+      java.lang.Object ref = operatorTypeName_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          operatorTypeName_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string operator_type_name = 10;</code>
+     * @return The bytes for operatorTypeName.
+     */
+    public com.google.protobuf.ByteString
+        getOperatorTypeNameBytes() {
+      java.lang.Object ref = operatorTypeName_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        operatorTypeName_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
     public final boolean isInitialized() {
@@ -23701,6 +23044,9 @@ public final class UserBitShared {
       if (((bitField0_ & 0x00000020) != 0)) {
         output.writeInt64(9, waitNanos_);
       }
+      if (((bitField0_ & 0x00000040) != 0)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 10, operatorTypeName_);
+      }
       unknownFields.writeTo(output);
     }
 
@@ -23742,6 +23088,9 @@ public final class UserBitShared {
         size += com.google.protobuf.CodedOutputStream
           .computeInt64Size(9, waitNanos_);
       }
+      if (((bitField0_ & 0x00000040) != 0)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, operatorTypeName_);
+      }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
       return size;
@@ -23791,6 +23140,11 @@ public final class UserBitShared {
         if (getWaitNanos()
             != other.getWaitNanos()) return false;
       }
+      if (hasOperatorTypeName() != other.hasOperatorTypeName()) return false;
+      if (hasOperatorTypeName()) {
+        if (!getOperatorTypeName()
+            .equals(other.getOperatorTypeName())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -23838,6 +23192,10 @@ public final class UserBitShared {
         hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
             getWaitNanos());
       }
+      if (hasOperatorTypeName()) {
+        hash = (37 * hash) + OPERATOR_TYPE_NAME_FIELD_NUMBER;
+        hash = (53 * hash) + getOperatorTypeName().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
@@ -23997,6 +23355,8 @@ public final class UserBitShared {
         }
         waitNanos_ = 0L;
         bitField0_ = (bitField0_ & ~0x00000080);
+        operatorTypeName_ = "";
+        bitField0_ = (bitField0_ & ~0x00000100);
         return this;
       }
 
@@ -24067,6 +23427,10 @@ public final class UserBitShared {
           result.waitNanos_ = waitNanos_;
           to_bitField0_ |= 0x00000020;
         }
+        if (((from_bitField0_ & 0x00000100) != 0)) {
+          to_bitField0_ |= 0x00000040;
+        }
+        result.operatorTypeName_ = operatorTypeName_;
         result.bitField0_ = to_bitField0_;
         onBuilt();
         return result;
@@ -24186,6 +23550,11 @@ public final class UserBitShared {
         if (other.hasWaitNanos()) {
           setWaitNanos(other.getWaitNanos());
         }
+        if (other.hasOperatorTypeName()) {
+          bitField0_ |= 0x00000100;
+          operatorTypeName_ = other.operatorTypeName_;
+          onChanged();
+        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -24495,35 +23864,35 @@ public final class UserBitShared {
 
       private int operatorType_ ;
       /**
-       * <code>optional int32 operator_type = 4;</code>
+       * <code>optional int32 operator_type = 4 [deprecated = true];</code>
        * @return Whether the operatorType field is set.
        */
-      public boolean hasOperatorType() {
+      @java.lang.Deprecated public boolean hasOperatorType() {
         return ((bitField0_ & 0x00000004) != 0);
       }
       /**
-       * <code>optional int32 operator_type = 4;</code>
+       * <code>optional int32 operator_type = 4 [deprecated = true];</code>
        * @return The operatorType.
        */
-      public int getOperatorType() {
+      @java.lang.Deprecated public int getOperatorType() {
         return operatorType_;
       }
       /**
-       * <code>optional int32 operator_type = 4;</code>
+       * <code>optional int32 operator_type = 4 [deprecated = true];</code>
        * @param value The operatorType to set.
        * @return This builder for chaining.
        */
-      public Builder setOperatorType(int value) {
+      @java.lang.Deprecated public Builder setOperatorType(int value) {
         bitField0_ |= 0x00000004;
         operatorType_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>optional int32 operator_type = 4;</code>
+       * <code>optional int32 operator_type = 4 [deprecated = true];</code>
        * @return This builder for chaining.
        */
-      public Builder clearOperatorType() {
+      @java.lang.Deprecated public Builder clearOperatorType() {
         bitField0_ = (bitField0_ & ~0x00000004);
         operatorType_ = 0;
         onChanged();
@@ -24917,6 +24286,90 @@ public final class UserBitShared {
         onChanged();
         return this;
       }
+
+      private java.lang.Object operatorTypeName_ = "";
+      /**
+       * <code>optional string operator_type_name = 10;</code>
+       * @return Whether the operatorTypeName field is set.
+       */
+      public boolean hasOperatorTypeName() {
+        return ((bitField0_ & 0x00000100) != 0);
+      }
+      /**
+       * <code>optional string operator_type_name = 10;</code>
+       * @return The operatorTypeName.
+       */
+      public java.lang.String getOperatorTypeName() {
+        java.lang.Object ref = operatorTypeName_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            operatorTypeName_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string operator_type_name = 10;</code>
+       * @return The bytes for operatorTypeName.
+       */
+      public com.google.protobuf.ByteString
+          getOperatorTypeNameBytes() {
+        java.lang.Object ref = operatorTypeName_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          operatorTypeName_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string operator_type_name = 10;</code>
+       * @param value The operatorTypeName to set.
+       * @return This builder for chaining.
+       */
+      public Builder setOperatorTypeName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000100;
+        operatorTypeName_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string operator_type_name = 10;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearOperatorTypeName() {
+        bitField0_ = (bitField0_ & ~0x00000100);
+        operatorTypeName_ = getDefaultInstance().getOperatorTypeName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string operator_type_name = 10;</code>
+       * @param value The bytes for operatorTypeName to set.
+       * @return This builder for chaining.
+       */
+      public Builder setOperatorTypeNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000100;
+        operatorTypeName_ = value;
+        onChanged();
+        return this;
+      }
       @java.lang.Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -29043,68 +28496,33 @@ public final class UserBitShared {
       "y_used\030\007 \001(\003\022\027\n\017max_memory_used\030\010 \001(\003\022(\n" +
       "\010endpoint\030\t \001(\0132\026.exec.DrillbitEndpoint\022" +
       "\023\n\013last_update\030\n \001(\003\022\025\n\rlast_progress\030\013 " +
-      "\001(\003\"\377\001\n\017OperatorProfile\0221\n\rinput_profile" +
+      "\001(\003\"\237\002\n\017OperatorProfile\0221\n\rinput_profile" +
       "\030\001 \003(\0132\032.exec.shared.StreamProfile\022\023\n\013op" +
-      "erator_id\030\003 \001(\005\022\025\n\roperator_type\030\004 \001(\005\022\023" +
-      "\n\013setup_nanos\030\005 \001(\003\022\025\n\rprocess_nanos\030\006 \001" +
-      "(\003\022#\n\033peak_local_memory_allocated\030\007 \001(\003\022" +
-      "(\n\006metric\030\010 \003(\0132\030.exec.shared.MetricValu" +
-      "e\022\022\n\nwait_nanos\030\t \001(\003\"B\n\rStreamProfile\022\017" +
-      "\n\007records\030\001 \001(\003\022\017\n\007batches\030\002 \001(\003\022\017\n\007sche" +
-      "mas\030\003 \001(\003\"J\n\013MetricValue\022\021\n\tmetric_id\030\001 " +
-      "\001(\005\022\022\n\nlong_value\030\002 \001(\003\022\024\n\014double_value\030" +
-      "\003 \001(\001\")\n\010Registry\022\035\n\003jar\030\001 \003(\0132\020.exec.sh" +
-      "ared.Jar\"/\n\003Jar\022\014\n\004name\030\001 \001(\t\022\032\n\022functio" +
-      "n_signature\030\002 \003(\t\"W\n\013SaslMessage\022\021\n\tmech" +
-      "anism\030\001 \001(\t\022\014\n\004data\030\002 \001(\014\022\'\n\006status\030\003 \001(" +
-      "\0162\027.exec.shared.SaslStatus*5\n\nRpcChannel" +
-      "\022\017\n\013BIT_CONTROL\020\000\022\014\n\010BIT_DATA\020\001\022\010\n\004USER\020" +
-      "\002*V\n\tQueryType\022\007\n\003SQL\020\001\022\013\n\007LOGICAL\020\002\022\014\n\010" +
-      "PHYSICAL\020\003\022\r\n\tEXECUTION\020\004\022\026\n\022PREPARED_ST" +
-      "ATEMENT\020\005*\207\001\n\rFragmentState\022\013\n\007SENDING\020\000" +
-      "\022\027\n\023AWAITING_ALLOCATION\020\001\022\013\n\007RUNNING\020\002\022\014" +
-      "\n\010FINISHED\020\003\022\r\n\tCANCELLED\020\004\022\n\n\006FAILED\020\005\022" +
-      "\032\n\026CANCELLATION_REQUESTED\020\006*\260\013\n\020CoreOper" +
-      "atorType\022\021\n\rSINGLE_SENDER\020\000\022\024\n\020BROADCAST" +
-      "_SENDER\020\001\022\n\n\006FILTER\020\002\022\022\n\016HASH_AGGREGATE\020" +
-      "\003\022\r\n\tHASH_JOIN\020\004\022\016\n\nMERGE_JOIN\020\005\022\031\n\025HASH" +
-      "_PARTITION_SENDER\020\006\022\t\n\005LIMIT\020\007\022\024\n\020MERGIN" +
-      "G_RECEIVER\020\010\022\034\n\030ORDERED_PARTITION_SENDER" +
-      "\020\t\022\013\n\007PROJECT\020\n\022\026\n\022UNORDERED_RECEIVER\020\013\022" +
-      "\032\n\026RANGE_PARTITION_SENDER\020\014\022\n\n\006SCREEN\020\r\022" +
-      "\034\n\030SELECTION_VECTOR_REMOVER\020\016\022\027\n\023STREAMI" +
-      "NG_AGGREGATE\020\017\022\016\n\nTOP_N_SORT\020\020\022\021\n\rEXTERN" +
-      "AL_SORT\020\021\022\t\n\005TRACE\020\022\022\t\n\005UNION\020\023\022\014\n\010OLD_S" +
-      "ORT\020\024\022\032\n\026PARQUET_ROW_GROUP_SCAN\020\025\022\021\n\rHIV" +
-      "E_SUB_SCAN\020\026\022\025\n\021SYSTEM_TABLE_SCAN\020\027\022\021\n\rM" +
-      "OCK_SUB_SCAN\020\030\022\022\n\016PARQUET_WRITER\020\031\022\023\n\017DI" +
-      "RECT_SUB_SCAN\020\032\022\017\n\013TEXT_WRITER\020\033\022\021\n\rTEXT" +
-      "_SUB_SCAN\020\034\022\021\n\rJSON_SUB_SCAN\020\035\022\030\n\024INFO_S" +
-      "CHEMA_SUB_SCAN\020\036\022\023\n\017COMPLEX_TO_JSON\020\037\022\025\n" +
-      "\021PRODUCER_CONSUMER\020 \022\022\n\016HBASE_SUB_SCAN\020!" +
-      "\022\n\n\006WINDOW\020\"\022\024\n\020NESTED_LOOP_JOIN\020#\022\021\n\rAV" +
-      "RO_SUB_SCAN\020$\022\021\n\rPCAP_SUB_SCAN\020%\022\022\n\016KAFK" +
-      "A_SUB_SCAN\020&\022\021\n\rKUDU_SUB_SCAN\020\'\022\013\n\007FLATT" +
-      "EN\020(\022\020\n\014LATERAL_JOIN\020)\022\n\n\006UNNEST\020*\022,\n(HI" +
-      "VE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN\020+" +
-      "\022\r\n\tJDBC_SCAN\020,\022\022\n\016REGEX_SUB_SCAN\020-\022\023\n\017M" +
-      "APRDB_SUB_SCAN\020.\022\022\n\016MONGO_SUB_SCAN\020/\022\017\n\013" +
-      "KUDU_WRITER\0200\022\026\n\022OPEN_TSDB_SUB_SCAN\0201\022\017\n" +
-      "\013JSON_WRITER\0202\022\026\n\022HTPPD_LOG_SUB_SCAN\0203\022\022" +
-      "\n\016IMAGE_SUB_SCAN\0204\022\025\n\021SEQUENCE_SUB_SCAN\020" +
-      "5\022\023\n\017PARTITION_LIMIT\0206\022\023\n\017PCAPNG_SUB_SCA" +
-      "N\0207\022\022\n\016RUNTIME_FILTER\0208\022\017\n\013ROWKEY_JOIN\0209" +
-      "\022\023\n\017SYSLOG_SUB_SCAN\020:\022\030\n\024STATISTICS_AGGR" +
-      "EGATE\020;\022\020\n\014UNPIVOT_MAPS\020<\022\024\n\020STATISTICS_" +
-      "MERGE\020=\022\021\n\rLTSV_SUB_SCAN\020>\022\021\n\rHDF5_SUB_S" +
-      "CAN\020?\022\022\n\016EXCEL_SUB_SCAN\020@\022\020\n\014SHP_SUB_SCA" +
-      "N\020A\022\024\n\020METADATA_HANDLER\020B\022\027\n\023METADATA_CO" +
-      "NTROLLER\020C\022\022\n\016DRUID_SUB_SCAN\020D\022\021\n\rSPSS_S" +
-      "UB_SCAN\020E\022\021\n\rHTTP_SUB_SCAN\020F\022\020\n\014XML_SUB_" +
-      "SCAN\020G*g\n\nSaslStatus\022\020\n\014SASL_UNKNOWN\020\000\022\016" +
-      "\n\nSASL_START\020\001\022\024\n\020SASL_IN_PROGRESS\020\002\022\020\n\014" +
-      "SASL_SUCCESS\020\003\022\017\n\013SASL_FAILED\020\004B.\n\033org.a" +
-      "pache.drill.exec.protoB\rUserBitSharedH\001"
+      "erator_id\030\003 \001(\005\022\031\n\roperator_type\030\004 \001(\005B\002" +
+      "\030\001\022\023\n\013setup_nanos\030\005 \001(\003\022\025\n\rprocess_nanos" +
+      "\030\006 \001(\003\022#\n\033peak_local_memory_allocated\030\007 " +
+      "\001(\003\022(\n\006metric\030\010 \003(\0132\030.exec.shared.Metric" +
+      "Value\022\022\n\nwait_nanos\030\t \001(\003\022\032\n\022operator_ty" +
+      "pe_name\030\n \001(\t\"B\n\rStreamProfile\022\017\n\007record" +
+      "s\030\001 \001(\003\022\017\n\007batches\030\002 \001(\003\022\017\n\007schemas\030\003 \001(" +
+      "\003\"J\n\013MetricValue\022\021\n\tmetric_id\030\001 \001(\005\022\022\n\nl" +
+      "ong_value\030\002 \001(\003\022\024\n\014double_value\030\003 \001(\001\")\n" +
+      "\010Registry\022\035\n\003jar\030\001 \003(\0132\020.exec.shared.Jar" +
+      "\"/\n\003Jar\022\014\n\004name\030\001 \001(\t\022\032\n\022function_signat" +
+      "ure\030\002 \003(\t\"W\n\013SaslMessage\022\021\n\tmechanism\030\001 " +
+      "\001(\t\022\014\n\004data\030\002 \001(\014\022\'\n\006status\030\003 \001(\0162\027.exec" +
+      ".shared.SaslStatus*5\n\nRpcChannel\022\017\n\013BIT_" +
+      "CONTROL\020\000\022\014\n\010BIT_DATA\020\001\022\010\n\004USER\020\002*V\n\tQue" +
+      "ryType\022\007\n\003SQL\020\001\022\013\n\007LOGICAL\020\002\022\014\n\010PHYSICAL" +
+      "\020\003\022\r\n\tEXECUTION\020\004\022\026\n\022PREPARED_STATEMENT\020" +
+      "\005*\207\001\n\rFragmentState\022\013\n\007SENDING\020\000\022\027\n\023AWAI" +
+      "TING_ALLOCATION\020\001\022\013\n\007RUNNING\020\002\022\014\n\010FINISH" +
+      "ED\020\003\022\r\n\tCANCELLED\020\004\022\n\n\006FAILED\020\005\022\032\n\026CANCE" +
+      "LLATION_REQUESTED\020\006*g\n\nSaslStatus\022\020\n\014SAS" +
+      "L_UNKNOWN\020\000\022\016\n\nSASL_START\020\001\022\024\n\020SASL_IN_P" +
+      "ROGRESS\020\002\022\020\n\014SASL_SUCCESS\020\003\022\017\n\013SASL_FAIL" +
+      "ED\020\004B.\n\033org.apache.drill.exec.protoB\rUse" +
+      "rBitSharedH\001"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -29214,7 +28632,7 @@ public final class UserBitShared {
     internal_static_exec_shared_OperatorProfile_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_exec_shared_OperatorProfile_descriptor,
-        new java.lang.String[] { "InputProfile", "OperatorId", "OperatorType", "SetupNanos", "ProcessNanos", "PeakLocalMemoryAllocated", "Metric", "WaitNanos", });
+        new java.lang.String[] { "InputProfile", "OperatorId", "OperatorType", "SetupNanos", "ProcessNanos", "PeakLocalMemoryAllocated", "Metric", "WaitNanos", "OperatorTypeName", });
     internal_static_exec_shared_StreamProfile_descriptor =
       getDescriptor().getMessageTypes().get(17);
     internal_static_exec_shared_StreamProfile_fieldAccessorTable = new
diff --git a/protocol/src/main/protobuf/UserBitShared.proto b/protocol/src/main/protobuf/UserBitShared.proto
index c2304cf..45bdd84 100644
--- a/protocol/src/main/protobuf/UserBitShared.proto
+++ b/protocol/src/main/protobuf/UserBitShared.proto
@@ -280,12 +280,13 @@ message MinorFragmentProfile {
 message OperatorProfile {
   repeated StreamProfile input_profile = 1;
   optional int32 operator_id = 3;
-  optional int32 operator_type = 4;
+  optional int32 operator_type = 4 [deprecated = true];
   optional int64 setup_nanos = 5;
   optional int64 process_nanos = 6;
   optional int64 peak_local_memory_allocated = 7;
   repeated MetricValue metric = 8;
   optional int64 wait_nanos = 9;
+  optional string operator_type_name = 10;
 }
 
 message StreamProfile {
@@ -310,81 +311,6 @@ enum FragmentState {
   CANCELLATION_REQUESTED = 6;
 }
 
-enum CoreOperatorType {
-  SINGLE_SENDER = 0;
-  BROADCAST_SENDER = 1;
-  FILTER = 2;
-  HASH_AGGREGATE = 3;
-  HASH_JOIN = 4;
-  MERGE_JOIN = 5;
-  HASH_PARTITION_SENDER = 6;
-  LIMIT = 7;
-  MERGING_RECEIVER = 8;
-  ORDERED_PARTITION_SENDER = 9;
-  PROJECT = 10;
-  UNORDERED_RECEIVER = 11;
-  RANGE_PARTITION_SENDER = 12;
-  SCREEN = 13;
-  SELECTION_VECTOR_REMOVER = 14;
-  STREAMING_AGGREGATE = 15;
-  TOP_N_SORT = 16;
-  EXTERNAL_SORT = 17;
-  TRACE = 18;
-  UNION = 19;
-  OLD_SORT = 20;
-  PARQUET_ROW_GROUP_SCAN = 21;
-  HIVE_SUB_SCAN = 22;
-  SYSTEM_TABLE_SCAN = 23;
-  MOCK_SUB_SCAN = 24;
-  PARQUET_WRITER = 25;
-  DIRECT_SUB_SCAN = 26;
-  TEXT_WRITER = 27;
-  TEXT_SUB_SCAN = 28;
-  JSON_SUB_SCAN = 29;
-  INFO_SCHEMA_SUB_SCAN = 30;
-  COMPLEX_TO_JSON = 31;
-  PRODUCER_CONSUMER = 32;
-  HBASE_SUB_SCAN = 33;
-  WINDOW = 34;
-  NESTED_LOOP_JOIN = 35;
-  AVRO_SUB_SCAN = 36;
-  PCAP_SUB_SCAN = 37;
-  KAFKA_SUB_SCAN = 38;
-  KUDU_SUB_SCAN = 39;
-  FLATTEN = 40;
-  LATERAL_JOIN = 41;
-  UNNEST = 42;
-  HIVE_DRILL_NATIVE_PARQUET_ROW_GROUP_SCAN = 43;
-  JDBC_SCAN = 44;
-  REGEX_SUB_SCAN = 45;
-  MAPRDB_SUB_SCAN = 46;
-  MONGO_SUB_SCAN = 47;
-  KUDU_WRITER = 48;
-  OPEN_TSDB_SUB_SCAN = 49;
-  JSON_WRITER = 50;
-  HTPPD_LOG_SUB_SCAN = 51;
-  IMAGE_SUB_SCAN = 52;
-  SEQUENCE_SUB_SCAN = 53;
-  PARTITION_LIMIT = 54;
-  PCAPNG_SUB_SCAN = 55;
-  RUNTIME_FILTER = 56;
-  ROWKEY_JOIN = 57;
-  SYSLOG_SUB_SCAN = 58;
-  STATISTICS_AGGREGATE = 59;
-  UNPIVOT_MAPS = 60;
-  STATISTICS_MERGE = 61;
-  LTSV_SUB_SCAN = 62;
-  HDF5_SUB_SCAN = 63;
-  EXCEL_SUB_SCAN = 64;
-  SHP_SUB_SCAN = 65;
-  METADATA_HANDLER = 66;
-  METADATA_CONTROLLER = 67;
-  DRUID_SUB_SCAN = 68;
-  SPSS_SUB_SCAN = 69;
-  HTTP_SUB_SCAN = 70;
-  XML_SUB_SCAN = 71;
-}
-
 /* Registry that contains list of jars, each jar contains its name and list of function signatures.
 Structure example:
 REGISTRY    -> Jar1.jar   -> upper(VARCHAR-REQUIRED)