diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/ExtensionStatement.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/ExtensionStatement.java
index 15267aa..9507e16 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/ExtensionStatement.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/ExtensionStatement.java
@@ -36,6 +36,8 @@
         return Kind.EXTENSION;
     }
 
+    public abstract String getName();
+
     /**
      * Called when the {@code IStatementExecutor} encounters an extension statement.
      * An implementation class should implement the actual processing of the statement in this method.
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
index e242258..417a130 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
@@ -22,6 +22,7 @@
 
 import org.apache.asterix.common.api.ICommonRequestParameters;
 import org.apache.asterix.om.base.IAObject;
+import org.apache.asterix.translator.IStatementExecutor.StatementProperties;
 import org.apache.asterix.translator.IStatementExecutor.Stats;
 import org.apache.hyracks.api.result.IResultSet;
 
@@ -45,6 +46,12 @@
     Stats getStats();
 
     /**
+     * @return a reference on which to write properties of executed queries (e.g. what kind of statement was parsed
+     *         by the parser)
+     */
+    StatementProperties getStatementProperties();
+
+    /**
      * @return a reference to write the metadata of executed queries
      */
     IStatementExecutor.ResultMetadata getOutMetadata();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
index e7fec0c..5911c1e 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
@@ -36,6 +36,7 @@
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.IStatementRewriter;
+import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.Query;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.om.base.IAObject;
@@ -216,6 +217,38 @@
         }
     }
 
+    class StatementProperties implements Serializable {
+        private static final long serialVersionUID = -1L;
+
+        private Statement.Kind kind;
+        private String name;
+
+        public Statement.Kind getKind() {
+            return kind;
+        }
+
+        public void setKind(Statement.Kind kind) {
+            this.kind = kind;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public boolean isValid() {
+            return kind != null && (kind != Statement.Kind.EXTENSION || name != null);
+        }
+
+        @Override
+        public String toString() {
+            return Statement.Kind.EXTENSION == kind ? String.valueOf(name) : String.valueOf(kind);
+        }
+    }
+
     /**
      * Compiles and executes a list of statements
      *
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java
index b6ac3f1..47e897d 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java
@@ -155,7 +155,7 @@
             long startTime = System.currentTimeMillis();
             final IRequestParameters requestParameters = new RequestParameters(requestReference, query, resultSet,
                     new ResultProperties(IStatementExecutor.ResultDelivery.IMMEDIATE), new IStatementExecutor.Stats(),
-                    null, null, null, null, true);
+                    new IStatementExecutor.StatementProperties(), null, null, null, null, true);
             translator.compileAndExecute(hcc, requestParameters);
             long endTime = System.currentTimeMillis();
             duration = (endTime - startTime) / 1000.00;
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
index 6953d1f..1b2b00d 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
@@ -69,8 +69,9 @@
 
     @Override
     protected void executeStatement(IRequestReference requestReference, String statementsText,
-            SessionOutput sessionOutput, ResultProperties resultProperties, IStatementExecutor.Stats stats,
-            QueryServiceRequestParameters param, RequestExecutionState execution,
+            SessionOutput sessionOutput, ResultProperties resultProperties,
+            IStatementExecutor.StatementProperties statementProperties, IStatementExecutor.Stats stats,
+            QueryServiceRequestParameters param, RequestExecutionState executionState,
             Map<String, String> optionalParameters, Map<String, byte[]> statementParameters,
             ResponsePrinter responsePrinter, List<Warning> warnings) throws Exception {
         // Running on NC -> send 'execute' message to CC
@@ -89,7 +90,7 @@
                     resultProperties.getNcToCcResultProperties(), param.getClientContextID(), handleUrl,
                     optionalParameters, statementParameters, param.isMultiStatement(), param.getProfileType(),
                     stmtCategoryRestrictionMask, requestReference);
-            execution.start();
+            executionState.start();
             ncMb.sendMessageToPrimaryCC(requestMsg);
             try {
                 responseMsg = (ExecuteStatementResponseMessage) responseFuture.get(timeout, TimeUnit.MILLISECONDS);
@@ -103,11 +104,12 @@
                 cancelQuery(ncMb, ncCtx.getNodeId(), requestReference.getUuid(), param.getClientContextID(), hde, true);
                 throw hde;
             }
-            execution.end();
+            executionState.end();
         } finally {
             ncMb.deregisterMessageFuture(responseFuture.getFutureId());
         }
 
+        updatePropertiesFromCC(statementProperties, responseMsg);
         Throwable err = responseMsg.getError();
         if (err != null) {
             if (err instanceof Error) {
@@ -118,6 +120,8 @@
                 throw new Exception(err.toString(), err);
             }
         }
+        // if the was no error, we can set the result status to success
+        executionState.setStatus(ResultStatus.SUCCESS, HttpResponseStatus.OK);
         updateStatsFromCC(stats, responseMsg);
         if (hasResult(responseMsg)) {
             responsePrinter.addResultPrinter(
@@ -151,14 +155,14 @@
     }
 
     @Override
-    protected void handleExecuteStatementException(Throwable t, RequestExecutionState state,
+    protected void handleExecuteStatementException(Throwable t, RequestExecutionState executionState,
             QueryServiceRequestParameters param) {
         if (t instanceof TimeoutException // TODO(mblow): I don't think t can ever been an instance of TimeoutException
                 || ExceptionUtils.matchingCause(t, candidate -> candidate instanceof IPCException)) {
             GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, t.toString(), t);
-            state.setStatus(ResultStatus.FAILED, HttpResponseStatus.SERVICE_UNAVAILABLE);
+            executionState.setStatus(ResultStatus.FAILED, HttpResponseStatus.SERVICE_UNAVAILABLE);
         } else {
-            super.handleExecuteStatementException(t, state, param);
+            super.handleExecuteStatementException(t, executionState, param);
         }
     }
 
@@ -177,4 +181,13 @@
         stats.setProcessedObjects(responseStats.getProcessedObjects());
         stats.updateTotalWarningsCount(responseStats.getTotalWarningsCount());
     }
+
+    private static void updatePropertiesFromCC(IStatementExecutor.StatementProperties statementProperties,
+            ExecuteStatementResponseMessage responseMsg) {
+        IStatementExecutor.StatementProperties responseStmtProps = responseMsg.getStatementProperties();
+        if (responseStmtProps != null) {
+            statementProperties.setKind(responseStmtProps.getKind());
+            statementProperties.setName(responseStmtProps.getName());
+        }
+    }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
index 6e70d27..2379e69 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
@@ -117,6 +117,7 @@
     private ResultDelivery mode = ResultDelivery.IMMEDIATE;
     private PlanFormat planFormat = PlanFormat.JSON;
     private ProfileType profileType = ProfileType.COUNTS;
+    private Map<String, String> optionalParams = null;
     private Map<String, JsonNode> statementParams = null;
     private boolean pretty = false;
     private boolean expressionTree = false;
@@ -220,6 +221,14 @@
         this.planFormat = planFormat;
     }
 
+    public Map<String, String> getOptionalParams() {
+        return optionalParams;
+    }
+
+    public void setOptionalParams(Map<String, String> optionalParams) {
+        this.optionalParams = optionalParams;
+    }
+
     public Map<String, JsonNode> getStatementParams() {
         return statementParams;
     }
@@ -367,6 +376,7 @@
         setHost(servlet.host(request));
         setPath(servlet.servletPath(request));
         String contentType = HttpUtil.getContentTypeOnly(request);
+        setOptionalParams(optionalParams);
         try {
             if (HttpUtil.ContentType.APPLICATION_JSON.equals(contentType)) {
                 setParamFromJSON(request, optionalParams);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
index 319d959..cb1d6cf 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
@@ -88,6 +88,7 @@
 import org.apache.asterix.translator.SessionOutput;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.IServiceContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.exceptions.Warning;
 import org.apache.hyracks.control.common.controllers.CCConfig;
@@ -152,18 +153,18 @@
         response.setStatus(HttpResponseStatus.OK);
     }
 
-    protected static final class RequestExecutionState {
+    protected static class RequestExecutionState {
         private long execStart = -1;
         private long execEnd = -1;
-        private ResultStatus resultStatus = ResultStatus.SUCCESS;
-        private HttpResponseStatus httpResponseStatus = HttpResponseStatus.OK;
+        private ResultStatus resultStatus = ResultStatus.FATAL;
+        private HttpResponseStatus httpResponseStatus = HttpResponseStatus.INTERNAL_SERVER_ERROR;
 
         public void setStatus(ResultStatus resultStatus, HttpResponseStatus httpResponseStatus) {
             this.resultStatus = resultStatus;
             this.httpResponseStatus = httpResponseStatus;
         }
 
-        ResultStatus getResultStatus() {
+        public ResultStatus getResultStatus() {
             return resultStatus;
         }
 
@@ -187,9 +188,19 @@
             }
         }
 
-        long duration() {
+        public long duration() {
             return execEnd - execStart;
         }
+
+        protected StringBuilder append(StringBuilder sb) {
+            return sb.append("ResultStatus: ").append(resultStatus.str()).append(" HTTPStatus: ")
+                    .append(String.valueOf(httpResponseStatus));
+        }
+
+        @Override
+        public String toString() {
+            return append(new StringBuilder()).toString();
+        }
     }
 
     private static SessionOutput createSessionOutput(PrintWriter resultWriter) {
@@ -201,7 +212,12 @@
     }
 
     protected void setRequestParam(IServletRequest request, QueryServiceRequestParameters param,
-            Map<String, String> optionalParams) throws IOException, AlgebricksException {
+            Function<IServletRequest, Map<String, String>> optionalParamProvider, RequestExecutionState executionState)
+            throws IOException, AlgebricksException {
+        Map<String, String> optionalParams = null;
+        if (optionalParamProvider != null) {
+            optionalParams = optionalParamProvider.apply(request);
+        }
         param.setParameters(this, request, optionalParams);
     }
 
@@ -248,22 +264,18 @@
         long elapsedStart = System.nanoTime();
         long errorCount = 1;
         Stats stats = new Stats();
-        RequestExecutionState execution = new RequestExecutionState();
         List<Warning> warnings = new ArrayList<>();
         Charset resultCharset = HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request);
         PrintWriter httpWriter = response.writer();
         SessionOutput sessionOutput = createSessionOutput(httpWriter);
-        QueryServiceRequestParameters param = newRequestParameters();
         ResponsePrinter responsePrinter = new ResponsePrinter(sessionOutput);
         ResultDelivery delivery = ResultDelivery.IMMEDIATE;
+        QueryServiceRequestParameters param = newRequestParameters();
+        RequestExecutionState executionState = newRequestExecutionState();
         try {
             // buffer the output until we are ready to set the status of the response message correctly
             responsePrinter.begin();
-            Map<String, String> optionalParams = null;
-            if (optionalParamProvider != null) {
-                optionalParams = optionalParamProvider.apply(request);
-            }
-            setRequestParam(request, param, optionalParams);
+            setRequestParam(request, param, optionalParamProvider, executionState);
             if (forceReadOnly) {
                 param.setReadOnly(true);
             }
@@ -278,27 +290,32 @@
             if (param.isParseOnly()) {
                 ResultUtil.ParseOnlyResult parseOnlyResult = parseStatement(statementsText);
                 setAccessControlHeaders(request, response);
-                response.setStatus(execution.getHttpStatus());
+                executionState.setStatus(ResultStatus.SUCCESS, HttpResponseStatus.OK);
+                response.setStatus(executionState.getHttpStatus());
                 responsePrinter.addResultPrinter(new ParseOnlyResultPrinter(parseOnlyResult));
             } else {
                 Map<String, byte[]> statementParams = org.apache.asterix.app.translator.RequestParameters
                         .serializeParameterValues(param.getStatementParams());
                 setAccessControlHeaders(request, response);
-                response.setStatus(execution.getHttpStatus());
                 stats.setProfileType(param.getProfileType());
-                executeStatement(requestRef, statementsText, sessionOutput, resultProperties, stats, param, execution,
-                        optionalParams, statementParams, responsePrinter, warnings);
+                IStatementExecutor.StatementProperties statementProperties =
+                        new IStatementExecutor.StatementProperties();
+                response.setStatus(HttpResponseStatus.OK);
+                executeStatement(requestRef, statementsText, sessionOutput, resultProperties, statementProperties,
+                        stats, param, executionState, param.getOptionalParams(), statementParams, responsePrinter,
+                        warnings);
+                executionState.setStatus(ResultStatus.SUCCESS, HttpResponseStatus.OK);
             }
             errorCount = 0;
         } catch (Exception | TokenMgrError | org.apache.asterix.aqlplus.parser.TokenMgrError e) {
-            handleExecuteStatementException(e, execution, param);
-            response.setStatus(execution.getHttpStatus());
+            handleExecuteStatementException(e, executionState, param);
+            response.setStatus(executionState.getHttpStatus());
             requestFailed(e, responsePrinter);
         } finally {
-            execution.finish();
+            executionState.finish();
         }
         responsePrinter.printResults();
-        buildResponseFooters(elapsedStart, errorCount, stats, execution, resultCharset, responsePrinter, delivery);
+        buildResponseFooters(elapsedStart, errorCount, stats, executionState, resultCharset, responsePrinter, delivery);
         responsePrinter.printFooters();
         responsePrinter.end();
         if (sessionOutput.out().checkError()) {
@@ -306,6 +323,10 @@
         }
     }
 
+    protected RequestExecutionState newRequestExecutionState() throws HyracksDataException {
+        return new RequestExecutionState();
+    }
+
     protected void buildResponseHeaders(IRequestReference requestRef, SessionOutput sessionOutput,
             QueryServiceRequestParameters param, ResponsePrinter responsePrinter, ResultDelivery delivery) {
         responsePrinter.addHeaderPrinter(new RequestIdPrinter(requestRef.getUuid()));
@@ -322,7 +343,7 @@
     }
 
     protected void buildResponseResults(ResponsePrinter responsePrinter, SessionOutput sessionOutput,
-            ExecutionPlans plans, List<Warning> warnings) {
+            ExecutionPlans plans, List<Warning> warnings) throws HyracksDataException {
         responsePrinter.addResultPrinter(new PlansPrinter(plans, sessionOutput.config().getPlanFormat()));
         if (!warnings.isEmpty()) {
             List<ICodedMessage> codedWarnings = new ArrayList<>();
@@ -331,20 +352,21 @@
         }
     }
 
-    protected void buildResponseFooters(long elapsedStart, long errorCount, Stats stats,
-            RequestExecutionState execution, Charset resultCharset, ResponsePrinter responsePrinter,
+    protected ResponseMetrics buildResponseFooters(long elapsedStart, long errorCount, Stats stats,
+            RequestExecutionState executionState, Charset resultCharset, ResponsePrinter responsePrinter,
             ResultDelivery delivery) {
         if (ResultDelivery.ASYNC != delivery) {
             // in case of ASYNC delivery, the status is printed by query translator
-            responsePrinter.addFooterPrinter(new StatusPrinter(execution.getResultStatus()));
+            responsePrinter.addFooterPrinter(new StatusPrinter(executionState.getResultStatus()));
         }
         final ResponseMetrics metrics =
-                ResponseMetrics.of(System.nanoTime() - elapsedStart, execution.duration(), stats.getCount(),
+                ResponseMetrics.of(System.nanoTime() - elapsedStart, executionState.duration(), stats.getCount(),
                         stats.getSize(), stats.getProcessedObjects(), errorCount, stats.getTotalWarningsCount());
         responsePrinter.addFooterPrinter(new MetricsPrinter(metrics, resultCharset));
         if (isPrintingProfile(stats)) {
             responsePrinter.addFooterPrinter(new ProfilePrinter(stats.getJobProfile()));
         }
+        return metrics;
     }
 
     protected void validateStatement(String statement) throws RuntimeDataException {
@@ -365,8 +387,9 @@
     }
 
     protected void executeStatement(IRequestReference requestReference, String statementsText,
-            SessionOutput sessionOutput, ResultProperties resultProperties, Stats stats,
-            QueryServiceRequestParameters param, RequestExecutionState execution,
+            SessionOutput sessionOutput, ResultProperties resultProperties,
+            IStatementExecutor.StatementProperties statementProperties, Stats stats,
+            QueryServiceRequestParameters param, RequestExecutionState executionState,
             Map<String, String> optionalParameters, Map<String, byte[]> statementParameters,
             ResponsePrinter responsePrinter, List<Warning> warnings) throws Exception {
         IClusterManagementWork.ClusterState clusterState =
@@ -383,22 +406,23 @@
         MetadataManager.INSTANCE.init();
         IStatementExecutor translator = statementExecutorFactory.create((ICcApplicationContext) appCtx, statements,
                 sessionOutput, compilationProvider, componentProvider, responsePrinter);
-        execution.start();
+        executionState.start();
         Map<String, IAObject> stmtParams =
                 org.apache.asterix.app.translator.RequestParameters.deserializeParameterValues(statementParameters);
         int stmtCategoryRestriction = org.apache.asterix.app.translator.RequestParameters
                 .getStatementCategoryRestrictionMask(param.isReadOnly());
-        IRequestParameters requestParameters = new org.apache.asterix.app.translator.RequestParameters(requestReference,
-                statementsText, getResultSet(), resultProperties, stats, null, param.getClientContextID(),
-                optionalParameters, stmtParams, param.isMultiStatement(), stmtCategoryRestriction);
+        IRequestParameters requestParameters =
+                new org.apache.asterix.app.translator.RequestParameters(requestReference, statementsText,
+                        getResultSet(), resultProperties, stats, statementProperties, null, param.getClientContextID(),
+                        optionalParameters, stmtParams, param.isMultiStatement(), stmtCategoryRestriction);
         translator.compileAndExecute(getHyracksClientConnection(), requestParameters);
-        execution.end();
+        executionState.end();
         translator.getWarnings(warnings, maxWarnings - warnings.size());
         stats.updateTotalWarningsCount(parserTotalWarningsCount);
         buildResponseResults(responsePrinter, sessionOutput, translator.getExecutionPlans(), warnings);
     }
 
-    protected void handleExecuteStatementException(Throwable t, RequestExecutionState state,
+    protected void handleExecuteStatementException(Throwable t, RequestExecutionState executionState,
             QueryServiceRequestParameters param) {
         if (t instanceof org.apache.asterix.aqlplus.parser.TokenMgrError || t instanceof TokenMgrError
                 || t instanceof AlgebricksException) {
@@ -408,37 +432,37 @@
                 LOGGER.info(() -> "handleException: " + t.getMessage() + ": "
                         + LogRedactionUtil.userData(param.toString()));
             }
-            state.setStatus(ResultStatus.FATAL, HttpResponseStatus.BAD_REQUEST);
+            executionState.setStatus(ResultStatus.FATAL, HttpResponseStatus.BAD_REQUEST);
         } else if (t instanceof HyracksException) {
             HyracksException he = (HyracksException) t;
             switch (he.getComponent() + he.getErrorCode()) {
                 case ASTERIX + REQUEST_TIMEOUT:
                     LOGGER.info(() -> "handleException: request execution timed out: "
                             + LogRedactionUtil.userData(param.toString()));
-                    state.setStatus(ResultStatus.TIMEOUT, HttpResponseStatus.OK);
+                    executionState.setStatus(ResultStatus.TIMEOUT, HttpResponseStatus.OK);
                     break;
                 case ASTERIX + REJECT_BAD_CLUSTER_STATE:
                 case ASTERIX + REJECT_NODE_UNREGISTERED:
                     LOGGER.warn(() -> "handleException: " + he.getMessage() + ": "
                             + LogRedactionUtil.userData(param.toString()));
-                    state.setStatus(ResultStatus.FATAL, HttpResponseStatus.SERVICE_UNAVAILABLE);
+                    executionState.setStatus(ResultStatus.FATAL, HttpResponseStatus.SERVICE_UNAVAILABLE);
                     break;
                 case ASTERIX + INVALID_REQ_PARAM_VAL:
                 case ASTERIX + INVALID_REQ_JSON_VAL:
                 case ASTERIX + NO_STATEMENT_PROVIDED:
                 case HYRACKS + JOB_REQUIREMENTS_EXCEED_CAPACITY:
-                    state.setStatus(ResultStatus.FATAL, HttpResponseStatus.BAD_REQUEST);
+                    executionState.setStatus(ResultStatus.FATAL, HttpResponseStatus.BAD_REQUEST);
                     break;
                 default:
                     LOGGER.warn(() -> "handleException: unexpected exception " + he.getMessage() + ": "
                             + LogRedactionUtil.userData(param.toString()), he);
-                    state.setStatus(ResultStatus.FATAL, HttpResponseStatus.INTERNAL_SERVER_ERROR);
+                    executionState.setStatus(ResultStatus.FATAL, HttpResponseStatus.INTERNAL_SERVER_ERROR);
                     break;
             }
         } else {
             LOGGER.warn(() -> "handleException: unexpected exception: " + LogRedactionUtil.userData(param.toString()),
                     t);
-            state.setStatus(ResultStatus.FATAL, HttpResponseStatus.INTERNAL_SERVER_ERROR);
+            executionState.setStatus(ResultStatus.FATAL, HttpResponseStatus.INTERNAL_SERVER_ERROR);
         }
     }
 
@@ -473,7 +497,7 @@
         return new QueryServiceRequestParameters();
     }
 
-    private static boolean isPrintingProfile(IStatementExecutor.Stats stats) {
+    protected static boolean isPrintingProfile(IStatementExecutor.Stats stats) {
         return stats.getProfileType() == Stats.ProfileType.FULL && stats.getJobProfile() != null;
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
index 1cdf6f7..4fe6582 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
@@ -136,8 +136,8 @@
         final RequestReference requestReference =
                 RequestReference.of(UUID.randomUUID().toString(), "CC", System.currentTimeMillis());
         final IRequestParameters requestParameters = new RequestParameters(requestReference, statement, null,
-                new ResultProperties(IStatementExecutor.ResultDelivery.IMMEDIATE), new IStatementExecutor.Stats(), null,
-                null, null, statementParams, true);
+                new ResultProperties(IStatementExecutor.ResultDelivery.IMMEDIATE), new IStatementExecutor.Stats(),
+                new IStatementExecutor.StatementProperties(), null, null, null, statementParams, true);
         translator.compileAndExecute(hcc, requestParameters);
         executionPlans = translator.getExecutionPlans();
         writer.flush();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
index 94080da..149ed33 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
@@ -146,10 +146,12 @@
                     compilationProvider, storageComponentProvider, new ResponsePrinter(sessionOutput));
             final IStatementExecutor.Stats stats = new IStatementExecutor.Stats();
             stats.setProfileType(profileType);
+            final IStatementExecutor.StatementProperties statementProperties =
+                    new IStatementExecutor.StatementProperties();
             Map<String, IAObject> stmtParams = RequestParameters.deserializeParameterValues(statementParameters);
             final IRequestParameters requestParameters = new RequestParameters(requestReference, statementsText, null,
-                    resultProperties, stats, outMetadata, clientContextID, optionalParameters, stmtParams,
-                    multiStatement, statementCategoryRestrictionMask);
+                    resultProperties, stats, statementProperties, outMetadata, clientContextID, optionalParameters,
+                    stmtParams, multiStatement, statementCategoryRestrictionMask);
             translator.compileAndExecute(ccApp.getHcc(), requestParameters);
             translator.getWarnings(warnings, maxWarnings - warnings.size());
             stats.updateTotalWarningsCount(parserTotalWarningsCount);
@@ -157,6 +159,7 @@
             responseMsg.setResult(outWriter.toString());
             responseMsg.setMetadata(outMetadata);
             responseMsg.setStats(stats);
+            responseMsg.setStatementProperties(statementProperties);
             responseMsg.setExecutionPlans(translator.getExecutionPlans());
             responseMsg.setWarnings(warnings);
         } catch (AlgebricksException | HyracksException | TokenMgrError
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementResponseMessage.java
index 58898cf..2cdede1 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementResponseMessage.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementResponseMessage.java
@@ -41,6 +41,8 @@
 
     private IStatementExecutor.Stats stats;
 
+    private IStatementExecutor.StatementProperties statementProperties;
+
     private Throwable error;
 
     private ExecutionPlans executionPlans;
@@ -92,6 +94,14 @@
         this.stats = stats;
     }
 
+    public IStatementExecutor.StatementProperties getStatementProperties() {
+        return statementProperties;
+    }
+
+    public void setStatementProperties(IStatementExecutor.StatementProperties statementProperties) {
+        this.statementProperties = statementProperties;
+    }
+
     public ExecutionPlans getExecutionPlans() {
         return executionPlans;
     }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index ed3eb8b..b814b0a 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -291,6 +291,7 @@
         final ResultDelivery resultDelivery = requestParameters.getResultProperties().getDelivery();
         final long maxResultReads = requestParameters.getResultProperties().getMaxReads();
         final Stats stats = requestParameters.getStats();
+        final StatementProperties statementProperties = requestParameters.getStatementProperties();
         final ResultMetadata outMetadata = requestParameters.getOutMetadata();
         final Map<String, IAObject> stmtParams = requestParameters.getStatementParameters();
         warningCollector.setMaxWarnings(sessionConfig.getMaxWarnings());
@@ -307,7 +308,9 @@
                 metadataProvider.setWriterFactory(writerFactory);
                 metadataProvider.setResultSerializerFactoryProvider(resultSerializerFactoryProvider);
                 metadataProvider.setOutputFile(outputFile);
-                switch (stmt.getKind()) {
+                Statement.Kind kind = stmt.getKind();
+                statementProperties.setKind(kind);
+                switch (kind) {
                     case SET:
                         handleSetStatement(stmt, config);
                         break;
@@ -417,12 +420,13 @@
                         // No op
                         break;
                     case EXTENSION:
-                        ((ExtensionStatement) stmt).handle(hcc, this, requestParameters, metadataProvider,
-                                resultSetIdCounter);
+                        final ExtensionStatement extStmt = (ExtensionStatement) stmt;
+                        statementProperties.setName(extStmt.getName());
+                        extStmt.handle(hcc, this, requestParameters, metadataProvider, resultSetIdCounter);
                         break;
                     default:
                         throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, stmt.getSourceLocation(),
-                                "Unexpected statement: " + stmt.getKind());
+                                "Unexpected statement: " + kind);
                 }
             }
         } finally {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
index 90602e7..5ebc9ba 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
@@ -31,6 +31,7 @@
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.translator.IRequestParameters;
 import org.apache.asterix.translator.IStatementExecutor;
+import org.apache.asterix.translator.IStatementExecutor.StatementProperties;
 import org.apache.asterix.translator.IStatementExecutor.Stats;
 import org.apache.asterix.translator.ResultProperties;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -49,6 +50,7 @@
     private final IResultSet resultSet;
     private final ResultProperties resultProperties;
     private final Stats stats;
+    private final StatementProperties statementProperties;
     private final Map<String, String> optionalParameters;
     private final IStatementExecutor.ResultMetadata outMetadata;
     private final String clientContextId;
@@ -58,22 +60,24 @@
     private final String statement;
 
     public RequestParameters(IRequestReference requestReference, String statement, IResultSet resultSet,
-            ResultProperties resultProperties, Stats stats, IStatementExecutor.ResultMetadata outMetadata,
-            String clientContextId, Map<String, String> optionalParameters, Map<String, IAObject> statementParameters,
-            boolean multiStatement) {
-        this(requestReference, statement, resultSet, resultProperties, stats, outMetadata, clientContextId,
-                optionalParameters, statementParameters, multiStatement, NO_CATEGORY_RESTRICTION_MASK);
+            ResultProperties resultProperties, Stats stats, StatementProperties statementProperties,
+            IStatementExecutor.ResultMetadata outMetadata, String clientContextId,
+            Map<String, String> optionalParameters, Map<String, IAObject> statementParameters, boolean multiStatement) {
+        this(requestReference, statement, resultSet, resultProperties, stats, statementProperties, outMetadata,
+                clientContextId, optionalParameters, statementParameters, multiStatement, NO_CATEGORY_RESTRICTION_MASK);
     }
 
     public RequestParameters(IRequestReference requestReference, String statement, IResultSet resultSet,
-            ResultProperties resultProperties, Stats stats, IStatementExecutor.ResultMetadata outMetadata,
-            String clientContextId, Map<String, String> optionalParameters, Map<String, IAObject> statementParameters,
-            boolean multiStatement, int statementCategoryRestrictionMask) {
+            ResultProperties resultProperties, Stats stats, StatementProperties statementProperties,
+            IStatementExecutor.ResultMetadata outMetadata, String clientContextId,
+            Map<String, String> optionalParameters, Map<String, IAObject> statementParameters, boolean multiStatement,
+            int statementCategoryRestrictionMask) {
         this.requestReference = requestReference;
         this.statement = statement;
         this.resultSet = resultSet;
         this.resultProperties = resultProperties;
         this.stats = stats;
+        this.statementProperties = statementProperties;
         this.outMetadata = outMetadata;
         this.clientContextId = clientContextId;
         this.optionalParameters = optionalParameters;
@@ -93,11 +97,16 @@
     }
 
     @Override
-    public IStatementExecutor.Stats getStats() {
+    public Stats getStats() {
         return stats;
     }
 
     @Override
+    public StatementProperties getStatementProperties() {
+        return statementProperties;
+    }
+
+    @Override
     public Map<String, String> getOptionalParameters() {
         return optionalParameters;
     }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java
index 348b947..50e1155 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java
@@ -70,8 +70,8 @@
         verify(mockResponse, times(1)).setStatus(HttpResponseStatus.NOT_FOUND);
 
         final RequestReference requestReference = RequestReference.of("1", "node1", System.currentTimeMillis());
-        RequestParameters requestParameters =
-                new RequestParameters(requestReference, "select 1", null, null, null, null, "1", null, null, true);
+        RequestParameters requestParameters = new RequestParameters(requestReference, "select 1", null, null, null,
+                null, null, "1", null, null, true);
         ClientRequest request = new ClientRequest(requestParameters);
         request.setJobId(new JobId(1));
         request.markCancellable();
@@ -87,8 +87,8 @@
 
         // Tests the case that the job cancellation hit some exception from Hyracks.
         final RequestReference requestReference2 = RequestReference.of("2", "node1", System.currentTimeMillis());
-        requestParameters =
-                new RequestParameters(requestReference2, "select 1", null, null, null, null, "2", null, null, true);
+        requestParameters = new RequestParameters(requestReference2, "select 1", null, null, null, null, null, "2",
+                null, null, true);
         ClientRequest request2 = new ClientRequest(requestParameters);
         request2.setJobId(new JobId(2));
         request2.markCancellable();
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
index ed0c802..17ba250 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
@@ -144,16 +144,18 @@
             return extract(resultStream, resultFields, resultCharset, "", "", "");
         }
 
-        throw new AsterixException("Unkown output format for result of test query");
+        throw new AsterixException("Unknown output format for result of test query");
     }
 
     private static ExtractedResult extract(InputStream resultStream, EnumSet<ResultField> resultFields,
             Charset resultCharset, String openMarker, String separator, String closeMarker) throws Exception {
         ExtractedResult extractedResult = new ExtractedResult();
         final String resultStr = IOUtils.toString(resultStream, resultCharset);
+
+        LOGGER.debug("+++++++\n" + resultStr + "\n+++++++\n");
+
         final ObjectNode result = OBJECT_MAPPER.readValue(resultStr, ObjectNode.class);
 
-        LOGGER.debug("+++++++\n" + result + "\n+++++++\n");
         // if we have errors field in the results, we will always return it
         checkForErrors(result);
         final StringBuilder resultBuilder = new StringBuilder();
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index 56dbac2..6bae914 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -1415,7 +1415,6 @@
                 FilenameUtils.getExtension(ctx.getFile().getName()));
         return executeQuery(fmt, statement, variableCtx, ctx, expectedResultFile, actualResultFile, queryCount,
                 numResultFiles, params, compare, uri);
-
     }
 
     private void polldynamic(TestCaseContext testCaseCtx, TestFileContext ctx, Map<String, Object> variableCtx,
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestReference.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestReference.java
index 8a25ed2..c7f8d30 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestReference.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IRequestReference.java
@@ -42,4 +42,18 @@
      * @return the time at which the request was received.
      */
     long getTime();
+
+    /**
+     * Gets the user agent from which the request was received.
+     *
+     * @return user agent from which the request was received.
+     */
+    String getUserAgent();
+
+    /**
+     * Gets the remote address from which the request was received.
+     *
+     * @return remote address from which the request was received.
+     */
+    String getRemoteAddr();
 }
