diff --git a/asterixdb/asterix-app/pom.xml b/asterixdb/asterix-app/pom.xml
index f74fbf3..c919856 100644
--- a/asterixdb/asterix-app/pom.xml
+++ b/asterixdb/asterix-app/pom.xml
@@ -675,7 +675,6 @@
     <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-storage-am-lsm-invertedindex</artifactId>
-      <version>${hyracks.version}</version>
     </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
index 8fdcc41..7f74c92 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
@@ -18,12 +18,14 @@
  */
 package org.apache.asterix.api.http.server;
 
+import java.io.IOException;
 import java.util.concurrent.ConcurrentMap;
 
 import org.apache.asterix.app.result.ResultHandle;
 import org.apache.asterix.app.result.ResultReader;
 import org.apache.asterix.common.api.IApplicationContext;
 import org.apache.asterix.translator.IStatementExecutor.Stats;
+import org.apache.asterix.translator.SessionConfig;
 import org.apache.asterix.translator.SessionOutput;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -91,7 +93,7 @@
             // way to send the same OutputFormat value here as was
             // originally determined there. Need to save this value on
             // some object that we can obtain here.
-            SessionOutput sessionOutput = RestApiServlet.initResponse(request, response);
+            SessionOutput sessionOutput = initResponse(request, response);
             ResultUtil.printResults(appCtx, resultReader, sessionOutput, new Stats(), null);
         } catch (HyracksDataException e) {
             final int errorCode = e.getErrorCode();
@@ -112,4 +114,82 @@
         }
     }
 
+    /**
+     * Initialize the Content-Type of the response, and construct a
+     * SessionConfig with the appropriate output writer and output-format
+     * based on the Accept: header and other servlet parameters.
+     */
+    static SessionOutput initResponse(IServletRequest request, IServletResponse response) throws IOException {
+        // CLEAN_JSON output is the default; most generally useful for a
+        // programmatic HTTP API
+        SessionConfig.OutputFormat format = SessionConfig.OutputFormat.CLEAN_JSON;
+        // First check the "output" servlet parameter.
+        String output = request.getParameter("output");
+        String accept = request.getHeader("Accept", "");
+        if (output != null) {
+            if ("CSV".equals(output)) {
+                format = SessionConfig.OutputFormat.CSV;
+            } else if ("ADM".equals(output)) {
+                format = SessionConfig.OutputFormat.ADM;
+            }
+        } else {
+            // Second check the Accept: HTTP header.
+            if (accept.contains("application/x-adm")) {
+                format = SessionConfig.OutputFormat.ADM;
+            } else if (accept.contains("text/csv")) {
+                format = SessionConfig.OutputFormat.CSV;
+            }
+        }
+        SessionConfig.PlanFormat planFormat = SessionConfig.PlanFormat.get(request.getParameter("plan-format"),
+                "plan format", SessionConfig.PlanFormat.STRING, LOGGER);
+
+        // If it's JSON, check for the "lossless" flag
+
+        if (format == SessionConfig.OutputFormat.CLEAN_JSON
+                && ("true".equals(request.getParameter("lossless")) || accept.contains("lossless=true"))) {
+            format = SessionConfig.OutputFormat.LOSSLESS_JSON;
+        }
+
+        SessionOutput.ResultAppender appendHandle = (app, handle) -> app.append("{ \"").append("handle")
+                .append("\":" + " \"").append(handle).append("\" }");
+        SessionConfig sessionConfig = new SessionConfig(format, planFormat);
+
+        // If it's JSON or ADM, check for the "wrapper-array" flag. Default is
+        // "true" for JSON and "false" for ADM. (Not applicable for CSV.)
+        boolean wrapperArray =
+                format == SessionConfig.OutputFormat.CLEAN_JSON || format == SessionConfig.OutputFormat.LOSSLESS_JSON;
+        String wrapperParam = request.getParameter("wrapper-array");
+        if (wrapperParam != null) {
+            wrapperArray = Boolean.valueOf(wrapperParam);
+        } else if (accept.contains("wrap-array=true")) {
+            wrapperArray = true;
+        } else if (accept.contains("wrap-array=false")) {
+            wrapperArray = false;
+        }
+        sessionConfig.set(SessionConfig.FORMAT_WRAPPER_ARRAY, wrapperArray);
+        // Now that format is set, output the content-type
+        switch (format) {
+            case ADM:
+                HttpUtil.setContentType(response, "application/x-adm", request);
+                break;
+            case CLEAN_JSON:
+                // No need to reflect "clean-ness" in output type; fall through
+            case LOSSLESS_JSON:
+                HttpUtil.setContentType(response, "application/json", request);
+                break;
+            case CSV:
+                // Check for header parameter or in Accept:.
+                if ("present".equals(request.getParameter("header")) || accept.contains("header=present")) {
+                    HttpUtil.setContentType(response, "text/csv; header=present", request);
+                    sessionConfig.set(SessionConfig.FORMAT_CSV_HEADER, true);
+                } else {
+                    HttpUtil.setContentType(response, "text/csv; header=absent", request);
+                }
+                break;
+            default:
+                throw new IOException("Unknown format " + format);
+        }
+        return new SessionOutput(sessionConfig, response.writer(), null, null, appendHandle, null);
+    }
+
 }
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 31b784f..ffbb614 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
@@ -28,6 +28,8 @@
 import java.io.PrintWriter;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -85,7 +87,6 @@
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonNode;
-
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class QueryServiceServlet extends AbstractQueryApiServlet {
@@ -319,16 +320,18 @@
     }
 
     private static void printMetrics(PrintWriter pw, long elapsedTime, long executionTime, long resultCount,
-            long resultSize, long processedObjects, long errorCount, long warnCount) {
+            long resultSize, long processedObjects, long errorCount, long warnCount, Charset resultCharset) {
         boolean hasErrors = errorCount != 0;
         boolean hasWarnings = warnCount != 0;
+        boolean useAscii = !StandardCharsets.UTF_8.equals(resultCharset)
+                && !"μ".contentEquals(resultCharset.decode(resultCharset.encode("μ")));
         pw.print("\t\"");
         pw.print(ResultFields.METRICS.str());
         pw.print("\": {\n");
         pw.print("\t");
-        ResultUtil.printField(pw, Metrics.ELAPSED_TIME.str(), Duration.formatNanos(elapsedTime));
+        ResultUtil.printField(pw, Metrics.ELAPSED_TIME.str(), Duration.formatNanos(elapsedTime, useAscii));
         pw.print("\t");
-        ResultUtil.printField(pw, Metrics.EXECUTION_TIME.str(), Duration.formatNanos(executionTime));
+        ResultUtil.printField(pw, Metrics.EXECUTION_TIME.str(), Duration.formatNanos(executionTime, useAscii));
         pw.print("\t");
         ResultUtil.printField(pw, Metrics.RESULT_COUNT.str(), resultCount, true);
         pw.print("\t");
@@ -346,16 +349,33 @@
         pw.print("\t}\n");
     }
 
+    protected String getOptText(JsonNode node, Parameter parameter) {
+        return getOptText(node, parameter.str());
+    }
+
     protected String getOptText(JsonNode node, String fieldName) {
         final JsonNode value = node.get(fieldName);
         return value != null ? value.asText() : null;
     }
 
-    private boolean getOptBoolean(JsonNode node, String fieldName, boolean defaultValue) {
+    protected boolean getOptBoolean(JsonNode node, Parameter parameter, boolean defaultValue) {
+        return getOptBoolean(node, parameter.str(), defaultValue);
+    }
+
+    protected boolean getOptBoolean(JsonNode node, String fieldName, boolean defaultValue) {
         final JsonNode value = node.get(fieldName);
         return value != null ? value.asBoolean() : defaultValue;
     }
 
+    protected String getParameter(IServletRequest request, Parameter parameter) {
+        return request.getParameter(parameter.str());
+    }
+
+    protected boolean getOptBoolean(IServletRequest request, Parameter parameter, boolean defaultValue) {
+        String value = request.getParameter(parameter.str());
+        return value == null ? defaultValue : Boolean.parseBoolean(value);
+    }
+
     @FunctionalInterface
     interface CheckedFunction<I, O> {
         O apply(I requestParamValue) throws IOException;
@@ -411,27 +431,24 @@
     private void setParamFromJSON(IServletRequest request, QueryServiceRequestParameters param,
             Map<String, String> optionalParameters) throws IOException {
         JsonNode jsonRequest = OBJECT_MAPPER.readTree(HttpUtil.getRequestBody(request));
-        param.setFormat(toLower(getOptText(jsonRequest, Parameter.FORMAT.str())));
-        param.setPretty(getOptBoolean(jsonRequest, Parameter.PRETTY.str(), false));
-        param.setMode(toLower(getOptText(jsonRequest, Parameter.MODE.str())));
-        param.setClientContextID(getOptText(jsonRequest, Parameter.CLIENT_ID.str()));
-        param.setTimeout(getOptText(jsonRequest, Parameter.TIMEOUT.str()));
-        param.setMaxResultReads(getOptText(jsonRequest, Parameter.MAX_RESULT_READS.str()));
-        param.setPlanFormat(getOptText(jsonRequest, Parameter.PLAN_FORMAT.str()));
-        param.setExpressionTree(getOptBoolean(jsonRequest, Parameter.EXPRESSION_TREE.str(), false));
-        param.setRewrittenExpressionTree(getOptBoolean(jsonRequest, Parameter.REWRITTEN_EXPRESSION_TREE.str(), false));
-        param.setLogicalPlan(getOptBoolean(jsonRequest, Parameter.LOGICAL_PLAN.str(), false));
-        param.setParseOnly(getOptBoolean(jsonRequest, Parameter.PARSE_ONLY.str(), false));
-        param.setOptimizedLogicalPlan(getOptBoolean(jsonRequest, Parameter.OPTIMIZED_LOGICAL_PLAN.str(), false));
-        param.setJob(getOptBoolean(jsonRequest, Parameter.JOB.str(), false));
-        param.setSignature(getOptBoolean(jsonRequest, Parameter.SIGNATURE.str(), true));
+        param.setStatement(getOptText(jsonRequest, Parameter.STATEMENT));
+        param.setFormat(toLower(getOptText(jsonRequest, Parameter.FORMAT)));
+        param.setPretty(getOptBoolean(jsonRequest, Parameter.PRETTY, false));
+        param.setMode(toLower(getOptText(jsonRequest, Parameter.MODE)));
+        param.setClientContextID(getOptText(jsonRequest, Parameter.CLIENT_ID));
+        param.setTimeout(getOptText(jsonRequest, Parameter.TIMEOUT));
+        param.setMaxResultReads(getOptText(jsonRequest, Parameter.MAX_RESULT_READS));
+        param.setPlanFormat(getOptText(jsonRequest, Parameter.PLAN_FORMAT));
+        param.setExpressionTree(getOptBoolean(jsonRequest, Parameter.EXPRESSION_TREE, false));
+        param.setRewrittenExpressionTree(getOptBoolean(jsonRequest, Parameter.REWRITTEN_EXPRESSION_TREE, false));
+        param.setLogicalPlan(getOptBoolean(jsonRequest, Parameter.LOGICAL_PLAN, false));
+        param.setParseOnly(getOptBoolean(jsonRequest, Parameter.PARSE_ONLY, false));
+        param.setOptimizedLogicalPlan(getOptBoolean(jsonRequest, Parameter.OPTIMIZED_LOGICAL_PLAN, false));
+        param.setJob(getOptBoolean(jsonRequest, Parameter.JOB, false));
+        param.setSignature(getOptBoolean(jsonRequest, Parameter.SIGNATURE, true));
         param.setStatementParams(
                 getOptStatementParameters(jsonRequest, jsonRequest.fieldNames(), JsonNode::get, v -> v));
-        param.setMultiStatement(getOptBoolean(jsonRequest, Parameter.MULTI_STATEMENT.str(), true));
-        String statementParam = Parameter.STATEMENT.str();
-        if (jsonRequest.has(statementParam)) {
-            param.setStatement(jsonRequest.get(statementParam).asText());
-        }
+        param.setMultiStatement(getOptBoolean(jsonRequest, Parameter.MULTI_STATEMENT, true));
         setJsonOptionalParameters(jsonRequest, optionalParameters);
     }
 
@@ -440,20 +457,19 @@
     }
 
     private void setParamFromRequest(IServletRequest request, QueryServiceRequestParameters param) throws IOException {
-        param.setStatement(request.getParameter(Parameter.STATEMENT.str()));
+        param.setStatement(getParameter(request, Parameter.STATEMENT));
         if (param.getStatement() == null) {
             param.setStatement(HttpUtil.getRequestBody(request));
         }
-        param.setFormat(toLower(request.getParameter(Parameter.FORMAT.str())));
-        param.setPretty(Boolean.parseBoolean(request.getParameter(Parameter.PRETTY.str())));
-        param.setMode(toLower(request.getParameter(Parameter.MODE.str())));
-        param.setClientContextID(request.getParameter(Parameter.CLIENT_ID.str()));
-        param.setTimeout(request.getParameter(Parameter.TIMEOUT.str()));
-        param.setMaxResultReads(request.getParameter(Parameter.MAX_RESULT_READS.str()));
-        param.setPlanFormat(request.getParameter(Parameter.PLAN_FORMAT.str()));
-        param.setParseOnly(Boolean.parseBoolean(request.getParameter(Parameter.PARSE_ONLY.str())));
-        final String multiStatementParam = request.getParameter(Parameter.MULTI_STATEMENT.str());
-        param.setMultiStatement(multiStatementParam == null || Boolean.parseBoolean(multiStatementParam));
+        param.setFormat(toLower(getParameter(request, Parameter.FORMAT)));
+        param.setPretty(Boolean.parseBoolean(getParameter(request, Parameter.PRETTY)));
+        param.setMode(toLower(getParameter(request, Parameter.MODE)));
+        param.setClientContextID(getParameter(request, Parameter.CLIENT_ID));
+        param.setTimeout(getParameter(request, Parameter.TIMEOUT));
+        param.setMaxResultReads(getParameter(request, Parameter.MAX_RESULT_READS));
+        param.setPlanFormat(getParameter(request, Parameter.PLAN_FORMAT));
+        param.setParseOnly(getOptBoolean(request, Parameter.PARSE_ONLY, false));
+        param.setMultiStatement(getOptBoolean(request, Parameter.MULTI_STATEMENT, true));
         try {
             param.setStatementParams(getOptStatementParameters(request, request.getParameterNames().iterator(),
                     IServletRequest::getParameter, OBJECT_MAPPER::readTree));
@@ -516,7 +532,7 @@
         Stats stats = new Stats();
         RequestExecutionState execution = new RequestExecutionState();
         List<ExecutionWarning> warnings = Collections.emptyList();
-        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request);
+        Charset resultCharset = HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request);
         PrintWriter httpWriter = response.writer();
         SessionOutput sessionOutput = createSessionOutput(httpWriter);
         QueryServiceRequestParameters param = new QueryServiceRequestParameters();
@@ -575,7 +591,7 @@
             execution.finish();
         }
         printMetrics(sessionOutput.out(), System.nanoTime() - elapsedStart, execution.duration(), stats.getCount(),
-                stats.getSize(), stats.getProcessedObjects(), errorCount, warnings.size());
+                stats.getSize(), stats.getProcessedObjects(), errorCount, warnings.size(), resultCharset);
         sessionOutput.out().print("}\n");
         sessionOutput.out().flush();
         if (sessionOutput.out().checkError()) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java
deleted file mode 100644
index 65fb357..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * 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.asterix.api.http.server;
-
-import static org.apache.asterix.api.http.server.ServletConstants.HYRACKS_CONNECTION_ATTR;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.ConcurrentMap;
-
-import org.apache.asterix.app.translator.QueryTranslator;
-import org.apache.asterix.app.translator.RequestParameters;
-import org.apache.asterix.common.api.IRequestReference;
-import org.apache.asterix.common.config.GlobalConfig;
-import org.apache.asterix.common.context.IStorageComponentProvider;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.compiler.provider.ILangCompilationProvider;
-import org.apache.asterix.lang.aql.parser.TokenMgrError;
-import org.apache.asterix.lang.common.base.IParser;
-import org.apache.asterix.lang.common.base.IParserFactory;
-import org.apache.asterix.lang.common.base.Statement;
-import org.apache.asterix.metadata.MetadataManager;
-import org.apache.asterix.translator.IRequestParameters;
-import org.apache.asterix.translator.IStatementExecutor;
-import org.apache.asterix.translator.IStatementExecutor.ResultDelivery;
-import org.apache.asterix.translator.IStatementExecutorFactory;
-import org.apache.asterix.translator.ResultProperties;
-import org.apache.asterix.translator.SessionConfig;
-import org.apache.asterix.translator.SessionConfig.OutputFormat;
-import org.apache.asterix.translator.SessionConfig.PlanFormat;
-import org.apache.asterix.translator.SessionOutput;
-import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.api.result.IResultSet;
-import org.apache.hyracks.http.api.IServletRequest;
-import org.apache.hyracks.http.api.IServletResponse;
-import org.apache.hyracks.http.server.AbstractServlet;
-import org.apache.hyracks.http.server.utils.HttpUtil;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import io.netty.handler.codec.http.HttpMethod;
-import io.netty.handler.codec.http.HttpResponseStatus;
-
-public abstract class RestApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = LogManager.getLogger();
-    private final ICcApplicationContext appCtx;
-    private final ILangCompilationProvider compilationProvider;
-    private final IParserFactory parserFactory;
-    private final IStatementExecutorFactory statementExecutorFactory;
-    private final IStorageComponentProvider componentProvider;
-
-    public RestApiServlet(ConcurrentMap<String, Object> ctx, String[] paths, ICcApplicationContext appCtx,
-            ILangCompilationProvider compilationProvider, IStatementExecutorFactory statementExecutorFactory,
-            IStorageComponentProvider componentProvider) {
-        super(ctx, paths);
-        this.appCtx = appCtx;
-        this.compilationProvider = compilationProvider;
-        this.parserFactory = compilationProvider.getParserFactory();
-        this.statementExecutorFactory = statementExecutorFactory;
-        this.componentProvider = componentProvider;
-    }
-
-    /**
-     * Initialize the Content-Type of the response, and construct a
-     * SessionConfig with the appropriate output writer and output-format
-     * based on the Accept: header and other servlet parameters.
-     */
-    static SessionOutput initResponse(IServletRequest request, IServletResponse response) throws IOException {
-        HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_PLAIN, request);
-        // CLEAN_JSON output is the default; most generally useful for a
-        // programmatic HTTP API
-        OutputFormat format = OutputFormat.CLEAN_JSON;
-        // First check the "output" servlet parameter.
-        String output = request.getParameter("output");
-        String accept = request.getHeader("Accept", "");
-        if (output != null) {
-            if ("CSV".equals(output)) {
-                format = OutputFormat.CSV;
-            } else if ("ADM".equals(output)) {
-                format = OutputFormat.ADM;
-            }
-        } else {
-            // Second check the Accept: HTTP header.
-            if (accept.contains("application/x-adm")) {
-                format = OutputFormat.ADM;
-            } else if (accept.contains("text/csv")) {
-                format = OutputFormat.CSV;
-            }
-        }
-        PlanFormat planFormat =
-                PlanFormat.get(request.getParameter("plan-format"), "plan format", PlanFormat.STRING, LOGGER);
-
-        // If it's JSON, check for the "lossless" flag
-
-        if (format == OutputFormat.CLEAN_JSON
-                && ("true".equals(request.getParameter("lossless")) || accept.contains("lossless=true"))) {
-            format = OutputFormat.LOSSLESS_JSON;
-        }
-
-        SessionOutput.ResultAppender appendHandle = (app, handle) -> app.append("{ \"").append("handle")
-                .append("\":" + " \"").append(handle).append("\" }");
-        SessionConfig sessionConfig = new SessionConfig(format, planFormat);
-
-        // If it's JSON or ADM, check for the "wrapper-array" flag. Default is
-        // "true" for JSON and "false" for ADM. (Not applicable for CSV.)
-        boolean wrapperArray = format == OutputFormat.CLEAN_JSON || format == OutputFormat.LOSSLESS_JSON;
-        String wrapperParam = request.getParameter("wrapper-array");
-        if (wrapperParam != null) {
-            wrapperArray = Boolean.valueOf(wrapperParam);
-        } else if (accept.contains("wrap-array=true")) {
-            wrapperArray = true;
-        } else if (accept.contains("wrap-array=false")) {
-            wrapperArray = false;
-        }
-        sessionConfig.set(SessionConfig.FORMAT_WRAPPER_ARRAY, wrapperArray);
-        // Now that format is set, output the content-type
-        switch (format) {
-            case ADM:
-                HttpUtil.setContentType(response, "application/x-adm");
-                break;
-            case CLEAN_JSON:
-                // No need to reflect "clean-ness" in output type; fall through
-            case LOSSLESS_JSON:
-                HttpUtil.setContentType(response, "application/json");
-                break;
-            case CSV:
-                // Check for header parameter or in Accept:.
-                if ("present".equals(request.getParameter("header")) || accept.contains("header=present")) {
-                    HttpUtil.setContentType(response, "text/csv; header=present");
-                    sessionConfig.set(SessionConfig.FORMAT_CSV_HEADER, true);
-                } else {
-                    HttpUtil.setContentType(response, "text/csv; header=absent");
-                }
-                break;
-            default:
-                throw new IOException("Unknown format " + format);
-        }
-        return new SessionOutput(sessionConfig, response.writer(), null, null, appendHandle, null);
-    }
-
-    @Override
-    protected void get(IServletRequest request, IServletResponse response) {
-        getOrPost(request, response);
-    }
-
-    @Override
-    protected void post(IServletRequest request, IServletResponse response) {
-        getOrPost(request, response);
-    }
-
-    private void getOrPost(IServletRequest request, IServletResponse response) {
-        try {
-            String query = query(request);
-            // enable cross-origin resource sharing
-            response.setHeader("Access-Control-Allow-Origin", "*");
-            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
-            SessionOutput sessionOutput = initResponse(request, response);
-            QueryTranslator.ResultDelivery resultDelivery = whichResultDelivery(request);
-            final IRequestReference requestReference = appCtx.getReceptionist().welcome(request);
-            doHandle(requestReference, response, query, sessionOutput, resultDelivery);
-        } catch (Exception e) {
-            response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
-            LOGGER.log(Level.WARN, "Failure handling request", e);
-        }
-    }
-
-    private void doHandle(IRequestReference requestReference, IServletResponse response, String query,
-            SessionOutput sessionOutput, ResultDelivery resultDelivery) throws JsonProcessingException {
-        try {
-            response.setStatus(HttpResponseStatus.OK);
-            IHyracksClientConnection hcc = (IHyracksClientConnection) ctx.get(HYRACKS_CONNECTION_ATTR);
-            IParser parser = parserFactory.createParser(query);
-            List<Statement> statements = parser.parse();
-            validate(statements);
-            MetadataManager.INSTANCE.init();
-            IStatementExecutor translator = statementExecutorFactory.create(appCtx, statements, sessionOutput,
-                    compilationProvider, componentProvider);
-            final IResultSet resultSet = ServletUtil.getResultSet(hcc, appCtx, ctx);
-            final IRequestParameters requestParameters = new RequestParameters(requestReference, query, resultSet,
-                    new ResultProperties(resultDelivery), new IStatementExecutor.Stats(), null, null, null, null, true);
-            translator.compileAndExecute(hcc, requestParameters);
-        } catch (AsterixException | TokenMgrError | org.apache.asterix.aqlplus.parser.TokenMgrError pe) {
-            response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
-            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, pe.getMessage(), pe);
-            String errorMessage = ResultUtil.buildParseExceptionMessage(pe, query);
-            ObjectNode errorResp =
-                    ResultUtil.getErrorResponse(2, errorMessage, "", ResultUtil.extractFullStackTrace(pe));
-            sessionOutput.out().write(OBJECT_MAPPER.writeValueAsString(errorResp));
-        } catch (Exception e) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
-            response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
-            ResultUtil.apiErrorHandler(sessionOutput.out(), e);
-        }
-    }
-
-    //TODO: Both Get and Post of this API must use the same parameter names
-    private String query(IServletRequest request) {
-        if (request.getHttpRequest().method() == HttpMethod.POST) {
-            return HttpUtil.getRequestBody(request);
-        } else {
-            return getQueryParameter(request);
-        }
-    }
-
-    private void validate(List<Statement> statements) throws AsterixException {
-        for (Statement st : statements) {
-            if ((st.getCategory() & getAllowedCategories()) == 0) {
-                throw new AsterixException(String.format(getErrorMessage(), st.getKind()));
-            }
-        }
-    }
-
-    protected QueryTranslator.ResultDelivery whichResultDelivery(IServletRequest request) {
-        String mode = request.getParameter("mode");
-        if (mode != null) {
-            if ("asynchronous".equals(mode) || "async".equals(mode)) {
-                return QueryTranslator.ResultDelivery.ASYNC;
-            } else if ("asynchronous-deferred".equals(mode) || "deferred".equals(mode)) {
-                return QueryTranslator.ResultDelivery.DEFERRED;
-            }
-        }
-        return QueryTranslator.ResultDelivery.IMMEDIATE;
-    }
-
-    protected abstract String getQueryParameter(IServletRequest request);
-
-    protected abstract byte getAllowedCategories();
-
-    protected abstract String getErrorMessage();
-}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
index 9c24821..6eac23b 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
@@ -117,6 +117,8 @@
     }
 
     public void init(boolean deleteOldInstanceData, String confFile) throws Exception { //NOSONAR
+        configureExternalLibDir();
+
         final ICCApplication ccApplication = createCCApplication();
         if (confFile == null) {
             configManager = new ConfigManager();
@@ -184,6 +186,16 @@
         setTestPersistedResourceRegistry();
     }
 
+    private void configureExternalLibDir() {
+        // hack to ensure we have a unique location for external libraries in our tests (asterix cluster has a shared
+        // home directory)-- TODO: rework this once the external lib dir can be configured explicitly
+        String appHome = joinPath(System.getProperty("app.home", System.getProperty("user.home")),
+                "appHome" + (int) (Math.random() * Integer.MAX_VALUE));
+        LOGGER.info("setting app.home to {}", appHome);
+        System.setProperty("app.home", appHome);
+        new File(appHome).deleteOnExit();
+    }
+
     public void init(boolean deleteOldInstanceData, String externalLibPath, String confDir) throws Exception {
         List<ILibraryManager> libraryManagers = new ArrayList<>();
         ExternalUDFLibrarian librarian = new ExternalUDFLibrarian(libraryManagers);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/result/ResultPrinterTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/result/ResultPrinterTest.java
index 7e851bf..3335cbf 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/result/ResultPrinterTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/result/ResultPrinterTest.java
@@ -28,7 +28,6 @@
 import org.apache.asterix.api.http.server.ResultUtil;
 import org.apache.asterix.common.api.IApplicationContext;
 import org.apache.asterix.common.config.CompilerProperties;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.test.common.ResultExtractor;
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.asterix.translator.SessionConfig;
@@ -75,7 +74,7 @@
         boolean exceptionThrown = false;
         try {
             // ensure result is valid json and error will be returned and not results.
-            ResultExtractor.extract(IOUtils.toInputStream(resultStr, StandardCharsets.UTF_8));
+            ResultExtractor.extract(IOUtils.toInputStream(resultStr, StandardCharsets.UTF_8), StandardCharsets.UTF_8);
         } catch (Exception e) {
             exceptionThrown = true;
             Assert.assertTrue(e.getMessage().contains(expectedException.getMessage()));
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
index ab8969e..37f471e 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.common;
 
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.rmi.RemoteException;
 import java.util.Arrays;
 import java.util.LinkedHashSet;
@@ -131,7 +132,7 @@
     public static long getDatasetCount(String datasetName) throws Exception {
         final String query = "SELECT VALUE COUNT(*) FROM `" + datasetName + "`;";
         final InputStream responseStream = TEST_EXECUTOR.executeQueryService(query,
-                TEST_EXECUTOR.getEndpoint(Servlets.QUERY_SERVICE), OUTPUT_FORMAT);
+                TEST_EXECUTOR.getEndpoint(Servlets.QUERY_SERVICE), OUTPUT_FORMAT, StandardCharsets.UTF_8);
         final ObjectNode response = OBJECT_MAPPER.readValue(responseStream, ObjectNode.class);
         final JsonNode result = response.get("results");
         // make sure there is a single value in result
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ParseDurationTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ParseDurationTest.java
index d20d72d..48488a4 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ParseDurationTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ParseDurationTest.java
@@ -142,6 +142,7 @@
         Assert.assertEquals("1.234567ms", Duration.formatNanos(1234567l));
         Assert.assertEquals("123.456µs", Duration.formatNanos(123456l));
         Assert.assertEquals("12.345µs", Duration.formatNanos(12345l));
+        Assert.assertEquals("12.345us", Duration.formatNanos(12345l, true));
         Assert.assertEquals("1.234µs", Duration.formatNanos(1234l));
         Assert.assertEquals("123ns", Duration.formatNanos(123l));
         Assert.assertEquals("12ns", Duration.formatNanos(12l));
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
index 242c0dd..564672a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
@@ -21,6 +21,7 @@
 
 import java.io.InputStream;
 import java.net.URI;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Iterator;
 import java.util.List;
@@ -49,7 +50,7 @@
 
     @Override
     public InputStream executeQueryService(String str, TestCaseContext.OutputFormat fmt, URI uri,
-            List<TestCase.CompilationUnit.Parameter> params, boolean jsonEncoded,
+            List<TestCase.CompilationUnit.Parameter> params, boolean jsonEncoded, Charset responseCharset,
             Predicate<Integer> responseCodeValidator, boolean cancellable) throws Exception {
         cancellable = cancellable && !containsClientContextID(str);
         String clientContextId = UUID.randomUUID().toString();
@@ -58,7 +59,7 @@
         Callable<InputStream> query = () -> {
             try {
                 return CancellationTestExecutor.super.executeQueryService(str, fmt, uri, newParams, jsonEncoded,
-                        responseCodeValidator, true);
+                        responseCharset, responseCodeValidator, true);
             } catch (Exception e) {
                 e.printStackTrace();
                 throw e;
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 705624a..c503579 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
@@ -19,7 +19,7 @@
 package org.apache.asterix.test.common;
 
 import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
+import java.nio.charset.Charset;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -82,16 +82,16 @@
     private static final Logger LOGGER = LogManager.getLogger();
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
-    public static InputStream extract(InputStream resultStream) throws Exception {
-        return extract(resultStream, EnumSet.of(ResultField.RESULTS));
+    public static InputStream extract(InputStream resultStream, Charset resultCharset) throws Exception {
+        return extract(resultStream, EnumSet.of(ResultField.RESULTS), resultCharset);
     }
 
-    public static InputStream extractMetrics(InputStream resultStream) throws Exception {
-        return extract(resultStream, EnumSet.of(ResultField.METRICS));
+    public static InputStream extractMetrics(InputStream resultStream, Charset resultCharset) throws Exception {
+        return extract(resultStream, EnumSet.of(ResultField.METRICS), resultCharset);
     }
 
-    public static String extractHandle(InputStream resultStream) throws Exception {
-        String result = IOUtils.toString(resultStream, StandardCharsets.UTF_8);
+    public static String extractHandle(InputStream resultStream, Charset responseCharset) throws Exception {
+        String result = IOUtils.toString(resultStream, responseCharset);
         ObjectNode resultJson = OBJECT_MAPPER.readValue(result, ObjectNode.class);
         final JsonNode handle = resultJson.get("handle");
         if (handle != null) {
@@ -106,8 +106,9 @@
         return null;
     }
 
-    private static InputStream extract(InputStream resultStream, EnumSet<ResultField> resultFields) throws Exception {
-        final String resultStr = IOUtils.toString(resultStream, StandardCharsets.UTF_8);
+    private static InputStream extract(InputStream resultStream, EnumSet<ResultField> resultFields,
+            Charset resultCharset) throws Exception {
+        final String resultStr = IOUtils.toString(resultStream, resultCharset);
         final ObjectNode result = OBJECT_MAPPER.readValue(resultStr, ObjectNode.class);
 
         LOGGER.debug("+++++++\n" + result + "\n+++++++\n");
@@ -170,7 +171,7 @@
                     throw new IllegalStateException("Unexpected result field: " + fieldKind);
             }
         }
-        return IOUtils.toInputStream(resultBuilder.toString(), StandardCharsets.UTF_8);
+        return IOUtils.toInputStream(resultBuilder, resultCharset);
     }
 
     private static void checkForErrors(ObjectNode result) throws Exception {
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 aed65e6..f621d34 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
@@ -18,6 +18,8 @@
  */
 package org.apache.asterix.test.common;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -36,12 +38,15 @@
 import java.net.Socket;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
@@ -57,6 +62,7 @@
 import java.util.function.Predicate;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.asterix.api.http.server.QueryServiceServlet;
@@ -143,11 +149,7 @@
     public static final Set<String> NON_CANCELLABLE =
             Collections.unmodifiableSet(new HashSet<>(Arrays.asList("store", "validate")));
 
-    private final IPollTask plainExecutor = (testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit,
-            queryCount, expectedResultFileCtxs, testFile, actualPath) -> {
-        executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit, queryCount,
-                expectedResultFileCtxs, testFile, actualPath);
-    };
+    private final IPollTask plainExecutor = this::executeTestFile;
 
     public static final String DELIVERY_ASYNC = "async";
     public static final String DELIVERY_DEFERRED = "deferred";
@@ -159,6 +161,9 @@
     private static Map<String, InetSocketAddress> ncEndPoints;
     private static Map<String, InetSocketAddress> replicationAddress;
 
+    private final List<Charset> allCharsets;
+    private final List<Charset> charsetsRemaining = new ArrayList<>();
+
     /*
      * Instance members
      */
@@ -182,6 +187,8 @@
 
     public TestExecutor(List<InetSocketAddress> endpoints) {
         this.endpoints = endpoints;
+        this.allCharsets = Charset.availableCharsets().values().stream()
+                .filter(c -> canEncodeDecode(c, "\n\t\\[]{}'\"")).collect(Collectors.toList());
     }
 
     public void setLibrarian(IExternalUDFLibrarian librarian) {
@@ -215,24 +222,23 @@
     }
 
     public void runScriptAndCompareWithResult(File scriptFile, File expectedFile, File actualFile,
-            ComparisonEnum compare) throws Exception {
+            ComparisonEnum compare, Charset actualEncoding) throws Exception {
         LOGGER.info("Expected results file: {} ", expectedFile);
-        BufferedReader readerExpected =
-                new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile), "UTF-8"));
-        BufferedReader readerActual =
-                new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
         boolean regex = false;
-        try {
+        try (BufferedReader readerExpected =
+                new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile), UTF_8));
+                BufferedReader readerActual =
+                        new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), actualEncoding))) {
             if (ComparisonEnum.BINARY.equals(compare)) {
                 if (!IOUtils.contentEquals(new FileInputStream(actualFile), new FileInputStream(expectedFile))) {
                     throw new Exception("Result for " + scriptFile + ": actual file did not match expected result");
                 }
                 return;
             } else if (actualFile.toString().endsWith(".regex")) {
-                runScriptAndCompareWithResultRegex(scriptFile, expectedFile, actualFile);
+                runScriptAndCompareWithResultRegex(scriptFile, readerExpected, readerActual);
                 return;
             } else if (actualFile.toString().endsWith(".regexadm")) {
-                runScriptAndCompareWithResultRegexAdm(scriptFile, expectedFile, actualFile);
+                runScriptAndCompareWithResultRegexAdm(scriptFile, readerExpected, readerActual);
                 return;
             } else if (actualFile.toString().endsWith(".regexjson")) {
                 ObjectMapper OM = new ObjectMapper();
@@ -293,11 +299,8 @@
                 throw createLineChangedException(scriptFile, "<EOF>", lineActual, num);
             }
         } catch (Exception e) {
-            LOGGER.info("Actual results file: {}", actualFile);
+            LOGGER.info("Actual results file: {} encoding: {}", actualFile, actualEncoding);
             throw e;
-        } finally {
-            readerExpected.close();
-            readerActual.close();
         }
 
     }
@@ -416,54 +419,48 @@
         return true;
     }
 
-    public void runScriptAndCompareWithResultRegex(File scriptFile, File expectedFile, File actualFile)
-            throws Exception {
+    public void runScriptAndCompareWithResultRegex(File scriptFile, BufferedReader readerExpected,
+            BufferedReader readerActual) throws Exception {
         String lineExpected, lineActual;
-        try (BufferedReader readerExpected =
-                new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile), "UTF-8"));
-                BufferedReader readerActual =
-                        new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-8"))) {
-            StringBuilder actual = new StringBuilder();
-            while ((lineActual = readerActual.readLine()) != null) {
-                actual.append(lineActual).append('\n');
+        StringBuilder actual = new StringBuilder();
+        while ((lineActual = readerActual.readLine()) != null) {
+            actual.append(lineActual).append('\n');
+        }
+        while ((lineExpected = readerExpected.readLine()) != null) {
+            if ("".equals(lineExpected.trim())) {
+                continue;
             }
-            while ((lineExpected = readerExpected.readLine()) != null) {
-                if ("".equals(lineExpected.trim())) {
-                    continue;
-                }
-                Matcher m = REGEX_LINES_PATTERN.matcher(lineExpected);
-                if (!m.matches()) {
-                    throw new IllegalArgumentException(
-                            "Each line of regex file must conform to: [-]/regex/[flags]: " + expectedFile);
-                }
-                String negateStr = m.group(1);
-                String expression = m.group(2);
-                String flagStr = m.group(3);
-                boolean negate = "-".equals(negateStr);
-                int flags = Pattern.MULTILINE;
-                if (flagStr.contains("m")) {
-                    flags |= Pattern.DOTALL;
-                }
-                if (flagStr.contains("i")) {
-                    flags |= Pattern.CASE_INSENSITIVE;
-                }
-                Pattern linePattern = Pattern.compile(expression, flags);
-                boolean match = linePattern.matcher(actual).find();
-                if (match && !negate || negate && !match) {
-                    continue;
-                }
-                throw new Exception("Result for " + scriptFile + ": expected pattern '" + expression
-                        + "' not found in result: " + actual);
+            Matcher m = REGEX_LINES_PATTERN.matcher(lineExpected);
+            if (!m.matches()) {
+                throw new IllegalArgumentException("Each line of regex file must conform to: [-]/regex/[flags]");
             }
+            String negateStr = m.group(1);
+            String expression = m.group(2);
+            String flagStr = m.group(3);
+            boolean negate = "-".equals(negateStr);
+            int flags = Pattern.MULTILINE;
+            if (flagStr.contains("m")) {
+                flags |= Pattern.DOTALL;
+            }
+            if (flagStr.contains("i")) {
+                flags |= Pattern.CASE_INSENSITIVE;
+            }
+            Pattern linePattern = Pattern.compile(expression, flags);
+            boolean match = linePattern.matcher(actual).find();
+            if (match && !negate || negate && !match) {
+                continue;
+            }
+            throw new Exception("Result for " + scriptFile + ": expected pattern '" + expression
+                    + "' not found in result: " + actual);
         }
     }
 
-    public void runScriptAndCompareWithResultRegexAdm(File scriptFile, File expectedFile, File actualFile)
-            throws Exception {
+    public void runScriptAndCompareWithResultRegexAdm(File scriptFile, BufferedReader expectedFile,
+            BufferedReader actualFile) throws Exception {
         StringWriter actual = new StringWriter();
         StringWriter expected = new StringWriter();
-        IOUtils.copy(new FileInputStream(actualFile), actual, StandardCharsets.UTF_8);
-        IOUtils.copy(new FileInputStream(expectedFile), expected, StandardCharsets.UTF_8);
+        IOUtils.copy(actualFile, actual);
+        IOUtils.copy(expectedFile, expected);
         Pattern pattern = Pattern.compile(expected.toString(), Pattern.DOTALL | Pattern.MULTILINE);
         if (!pattern.matcher(actual.toString()).matches()) {
             // figure out where the problem first occurs...
@@ -590,21 +587,27 @@
     }
 
     public InputStream executeQueryService(String str, URI uri, OutputFormat fmt) throws Exception {
-        return executeQueryService(str, fmt, uri, new ArrayList<>(), false);
+        return executeQueryService(str, fmt, uri, new ArrayList<>(), false, UTF_8);
+    }
+
+    public InputStream executeQueryService(String str, URI uri, OutputFormat fmt, Charset resultCharset)
+            throws Exception {
+        return executeQueryService(str, fmt, uri, new ArrayList<>(), false, resultCharset);
     }
 
     public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
-            boolean jsonEncoded) throws Exception {
-        return executeQueryService(str, fmt, uri, params, jsonEncoded, null, false);
+            boolean jsonEncoded, Charset responseCharset) throws Exception {
+        return executeQueryService(str, fmt, uri, params, jsonEncoded, responseCharset, null, false);
     }
 
     public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
             boolean jsonEncoded, Predicate<Integer> responseCodeValidator) throws Exception {
-        return executeQueryService(str, fmt, uri, params, jsonEncoded, responseCodeValidator, false);
+        return executeQueryService(str, fmt, uri, params, jsonEncoded, UTF_8, responseCodeValidator, false);
     }
 
     public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
-            boolean jsonEncoded, Predicate<Integer> responseCodeValidator, boolean cancellable) throws Exception {
+            boolean jsonEncoded, Charset responseCharset, Predicate<Integer> responseCodeValidator, boolean cancellable)
+            throws Exception {
         List<Parameter> newParams = upsertParam(params, "format", ParameterTypeEnum.STRING, fmt.mimeType());
         newParams = upsertParam(newParams, QueryServiceServlet.Parameter.PLAN_FORMAT.str(), ParameterTypeEnum.STRING,
                 DEFAULT_PLAN_FORMAT);
@@ -622,6 +625,10 @@
         // Set accepted output response type
         method.setHeader("Origin", uri.getScheme() + uri.getAuthority());
         method.setHeader("Accept", OutputFormat.CLEAN_JSON.mimeType());
+        method.setHeader("Accept-Charset", responseCharset.name());
+        if (!responseCharset.equals(UTF_8)) {
+            LOGGER.info("using Accept-Charset: {}", responseCharset.name());
+        }
         HttpResponse response = executeHttpRequest(method);
         if (responseCodeValidator != null) {
             checkResponse(response, responseCodeValidator);
@@ -629,6 +636,55 @@
         return response.getEntity().getContent();
     }
 
+    private Charset selectCharset(File result) throws IOException {
+        // choose an encoding that works for this input
+        return selectCharset(FileUtils.readFileToString(result, UTF_8));
+    }
+
+    private Charset selectCharset(String payload) {
+        // choose an encoding that works for this input
+        return nextCharset(charset -> canEncodeDecode(charset, payload));
+    }
+
+    public void setAvailableCharsets(Collection<Charset> charsets) {
+        synchronized (allCharsets) {
+            allCharsets.clear();
+            allCharsets.addAll(charsets);
+            charsetsRemaining.clear();
+        }
+    }
+
+    public Charset nextCharset(Predicate<Charset> test) {
+        synchronized (allCharsets) {
+            while (true) {
+                for (Iterator<Charset> iter = charsetsRemaining.iterator(); iter.hasNext();) {
+                    Charset next = iter.next();
+                    if (test.test(next)) {
+                        iter.remove();
+                        return next;
+                    }
+                }
+                Collections.shuffle(allCharsets);
+                charsetsRemaining.addAll(allCharsets);
+            }
+        }
+    }
+
+    // duplicated from hyracks-test-support as transitive dependencies on test-jars are not handled correctly
+    private static boolean canEncodeDecode(Charset charset, String input) {
+        try {
+            if (input.equals(new String(input.getBytes(charset), charset))) {
+                // workaround for https://bugs.openjdk.java.net/browse/JDK-6392670 and similar
+                if (input.equals(charset.decode(charset.encode(CharBuffer.wrap(input))).toString())) {
+                    return true;
+                }
+            }
+        } catch (Exception e) {
+            LOGGER.debug("cannot encode / decode {} with {} due to exception", input, charset.displayName(), e);
+        }
+        return false;
+    }
+
     protected List<Parameter> upsertParam(List<Parameter> params, String name, ParameterTypeEnum type, String value) {
         boolean replaced = false;
         List<Parameter> result = new ArrayList<>();
@@ -666,7 +722,6 @@
         for (Parameter param : params) {
             builder.addParameter(param.getName(), param.getValue());
         }
-        builder.setCharset(StandardCharsets.UTF_8);
         return builder.build();
     }
 
@@ -676,8 +731,8 @@
         for (Parameter param : params) {
             builder.addParameter(param.getName(), param.getValue());
         }
-        builder.setCharset(StandardCharsets.UTF_8);
-        body.ifPresent(s -> builder.setEntity(new StringEntity(s, StandardCharsets.UTF_8)));
+        builder.setCharset(UTF_8);
+        body.ifPresent(s -> builder.setEntity(new StringEntity(s, UTF_8)));
         return builder.build();
     }
 
@@ -701,7 +756,7 @@
         for (Parameter param : params) {
             builder.addParameter(param.getName(), param.getValue());
         }
-        builder.setCharset(StandardCharsets.UTF_8);
+        builder.setCharset(UTF_8);
         return builder.build();
     }
 
@@ -715,9 +770,9 @@
             builder.addParameter(stmtParam, statement);
         } else {
             // this seems pretty bad - we should probably fix the API and not the client
-            builder.setEntity(new StringEntity(statement, StandardCharsets.UTF_8));
+            builder.setEntity(new StringEntity(statement, UTF_8));
         }
-        builder.setCharset(StandardCharsets.UTF_8);
+        builder.setCharset(UTF_8);
         return builder.build();
     }
 
@@ -752,7 +807,7 @@
         } catch (JsonProcessingException e) {
             e.printStackTrace();
         }
-        builder.setCharset(StandardCharsets.UTF_8);
+        builder.setCharset(UTF_8);
         return builder.build();
     }
 
@@ -785,8 +840,7 @@
     // and returns the contents as a string
     // This string is later passed to REST API for execution.
     public String readTestFile(File testFile) throws Exception {
-        BufferedReader reader =
-                new BufferedReader(new InputStreamReader(new FileInputStream(testFile), StandardCharsets.UTF_8));
+        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(testFile), UTF_8));
         String line;
         StringBuilder stringBuilder = new StringBuilder();
         String ls = System.getProperty("line.separator");
@@ -840,9 +894,9 @@
         future.get();
         ByteArrayInputStream bisIn = new ByteArrayInputStream(baos.toByteArray());
         StringWriter writerIn = new StringWriter();
-        IOUtils.copy(bisIn, writerIn, StandardCharsets.UTF_8);
+        IOUtils.copy(bisIn, writerIn, UTF_8);
         StringWriter writerErr = new StringWriter();
-        IOUtils.copy(p.getErrorStream(), writerErr, StandardCharsets.UTF_8);
+        IOUtils.copy(p.getErrorStream(), writerErr, UTF_8);
 
         StringBuffer stdOut = writerIn.getBuffer();
         if (writerErr.getBuffer().length() > 0) {
@@ -939,18 +993,18 @@
                         expectedResultFileCtxs);
                 break;
             case "txnqbc": // qbc represents query before crash
-                resultStream = query(cUnit, testFile.getName(), statement);
+                resultStream = query(cUnit, testFile.getName(), statement, UTF_8);
                 qbcFile = getTestCaseQueryBeforeCrashFile(actualPath, testCaseCtx, cUnit);
                 writeOutputToFile(qbcFile, resultStream);
                 break;
             case "txnqar": // qar represents query after recovery
-                resultStream = query(cUnit, testFile.getName(), statement);
+                resultStream = query(cUnit, testFile.getName(), statement, UTF_8);
                 File qarFile = new File(actualPath + File.separator
                         + testCaseCtx.getTestCase().getFilePath().replace(File.separator, "_") + "_" + cUnit.getName()
                         + "_qar.adm");
                 writeOutputToFile(qarFile, resultStream);
                 qbcFile = getTestCaseQueryBeforeCrashFile(actualPath, testCaseCtx, cUnit);
-                runScriptAndCompareWithResult(testFile, qbcFile, qarFile, ComparisonEnum.TEXT);
+                runScriptAndCompareWithResult(testFile, qbcFile, qarFile, ComparisonEnum.TEXT, UTF_8);
                 break;
             case "txneu": // eu represents erroneous update
                 try {
@@ -1193,7 +1247,7 @@
             throw new IllegalArgumentException("Unexpected format for method " + reqType + ": " + extension);
         }
         if (handleVar != null) {
-            String handle = ResultExtractor.extractHandle(resultStream);
+            String handle = ResultExtractor.extractHandle(resultStream, UTF_8);
             if (handle != null) {
                 variableCtx.put(handleVar, handle);
             } else {
@@ -1202,15 +1256,15 @@
         } else {
             if (expectedResultFile == null) {
                 if (testFile.getName().startsWith(DIAGNOSE)) {
-                    LOGGER.info("Diagnostic output: {}", IOUtils.toString(resultStream, StandardCharsets.UTF_8));
+                    LOGGER.info("Diagnostic output: {}", IOUtils.toString(resultStream, UTF_8));
                 } else {
-                    LOGGER.info("Unexpected output: {}", IOUtils.toString(resultStream, StandardCharsets.UTF_8));
+                    LOGGER.info("Unexpected output: {}", IOUtils.toString(resultStream, UTF_8));
                     Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount
                             + ", filectxs.size: " + numResultFiles);
                 }
             } else {
                 writeOutputToFile(actualResultFile, resultStream);
-                runScriptAndCompareWithResult(testFile, expectedResultFile, actualResultFile, compare);
+                runScriptAndCompareWithResult(testFile, expectedResultFile, actualResultFile, compare, UTF_8);
             }
         }
         queryCount.increment();
@@ -1228,29 +1282,30 @@
         URI uri = testFile.getName().endsWith("aql") ? getEndpoint(Servlets.QUERY_AQL)
                 : getEndpoint(Servlets.QUERY_SERVICE);
         boolean isJsonEncoded = isJsonEncoded(extractHttpRequestType(statement));
+        Charset responseCharset = expectedResultFile == null ? UTF_8 : selectCharset(expectedResultFile);
         InputStream resultStream;
         if (DELIVERY_IMMEDIATE.equals(delivery)) {
-            resultStream =
-                    executeQueryService(statement, fmt, uri, params, isJsonEncoded, null, isCancellable(reqType));
+            resultStream = executeQueryService(statement, fmt, uri, params, isJsonEncoded, responseCharset, null,
+                    isCancellable(reqType));
             switch (reqType) {
                 case METRICS_QUERY_TYPE:
-                    resultStream = ResultExtractor.extractMetrics(resultStream);
+                    resultStream = ResultExtractor.extractMetrics(resultStream, responseCharset);
                     break;
                 default:
-                    resultStream = ResultExtractor.extract(resultStream);
+                    resultStream = ResultExtractor.extract(resultStream, responseCharset);
                     break;
             }
         } else {
             String handleVar = getHandleVariable(statement);
             resultStream = executeQueryService(statement, fmt, uri,
-                    upsertParam(params, "mode", ParameterTypeEnum.STRING, delivery), isJsonEncoded);
-            String handle = ResultExtractor.extractHandle(resultStream);
+                    upsertParam(params, "mode", ParameterTypeEnum.STRING, delivery), isJsonEncoded, responseCharset);
+            String handle = ResultExtractor.extractHandle(resultStream, responseCharset);
             Assert.assertNotNull("no handle for " + reqType + " test " + testFile.toString(), handleVar);
             variableCtx.put(handleVar, toQueryServiceHandle(handle));
         }
         if (actualResultFile == null) {
             if (testFile.getName().startsWith(DIAGNOSE)) {
-                LOGGER.info("Diagnostic output: {}", IOUtils.toString(resultStream, StandardCharsets.UTF_8));
+                LOGGER.info("Diagnostic output: {}", IOUtils.toString(resultStream, responseCharset));
             } else {
                 Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount
                         + ", filectxs.size: " + numResultFiles);
@@ -1265,7 +1320,7 @@
                         + ", filectxs.size: " + numResultFiles);
             }
         }
-        runScriptAndCompareWithResult(testFile, expectedResultFile, actualResultFile, compare);
+        runScriptAndCompareWithResult(testFile, expectedResultFile, actualResultFile, compare, responseCharset);
         if (!reqType.equals("validate")) {
             queryCount.increment();
         }
@@ -1293,8 +1348,7 @@
                             throw new Exception(
                                     "Failed to delete an existing result file: " + actualResultFile.getAbsolutePath());
                         }
-                        writeOutputToFile(actualResultFile,
-                                new ByteArrayInputStream(poller.poll().getBytes(StandardCharsets.UTF_8)));
+                        writeOutputToFile(actualResultFile, new ByteArrayInputStream(poller.poll().getBytes(UTF_8)));
                         variableCtx.put(key, actualResultFile);
                         validate(actualPath, testCaseCtx, cUnit, statement, variableCtx, testFile, ctx, queryCount,
                                 expectedResultFileCtxs);
@@ -1426,8 +1480,8 @@
 
     private InputStream executeUpdateOrDdl(String statement, OutputFormat outputFormat, URI serviceUri)
             throws Exception {
-        InputStream resultStream = executeQueryService(statement, serviceUri, outputFormat);
-        return ResultExtractor.extract(resultStream);
+        InputStream resultStream = executeQueryService(statement, serviceUri, outputFormat, UTF_8);
+        return ResultExtractor.extract(resultStream, UTF_8);
     }
 
     protected static boolean isExpected(Exception e, CompilationUnit cUnit) {
@@ -1581,7 +1635,7 @@
         String endpoint = "/admin/cluster/node/" + nodeId + "/config";
         InputStream executeJSONGet = executeJSONGet(fmt, createEndpointURI(endpoint, null));
         StringWriter actual = new StringWriter();
-        IOUtils.copy(executeJSONGet, actual, StandardCharsets.UTF_8);
+        IOUtils.copy(executeJSONGet, actual, UTF_8);
         String config = actual.toString();
         int nodePid = new ObjectMapper().readValue(config, ObjectNode.class).get("pid").asInt();
         if (nodePid <= 1) {
@@ -1611,7 +1665,7 @@
         String endpoint = "/admin/cluster/node/" + nodeId + "/config";
         InputStream executeJSONGet = executeJSONGet(fmt, createEndpointURI(endpoint, null));
         StringWriter actual = new StringWriter();
-        IOUtils.copy(executeJSONGet, actual, StandardCharsets.UTF_8);
+        IOUtils.copy(executeJSONGet, actual, UTF_8);
         String config = actual.toString();
         ObjectMapper om = new ObjectMapper();
         String logDir = om.readTree(config).findPath("txn.log.dir").asText();
@@ -1806,7 +1860,7 @@
             InputStream resultStream = executeQueryService(
                     "select dv.DataverseName from Metadata.`Dataverse` as dv order by dv.DataverseName;",
                     getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON);
-            JsonNode result = extractResult(IOUtils.toString(resultStream, StandardCharsets.UTF_8));
+            JsonNode result = extractResult(IOUtils.toString(resultStream, UTF_8));
             for (int i = 0; i < result.size(); i++) {
                 JsonNode json = result.get(i);
                 if (json != null) {
@@ -1826,8 +1880,8 @@
                     dropStatement.append(dv);
                     dropStatement.append(";\n");
                     resultStream = executeQueryService(dropStatement.toString(), getEndpoint(Servlets.QUERY_SERVICE),
-                            OutputFormat.CLEAN_JSON);
-                    ResultExtractor.extract(resultStream);
+                            OutputFormat.CLEAN_JSON, UTF_8);
+                    ResultExtractor.extract(resultStream, UTF_8);
                 }
             }
         } catch (Throwable th) {
@@ -2017,11 +2071,12 @@
         return !NON_CANCELLABLE.contains(type);
     }
 
-    private InputStream query(CompilationUnit cUnit, String testFile, String statement) throws Exception {
+    private InputStream query(CompilationUnit cUnit, String testFile, String statement, Charset responseCharset)
+            throws Exception {
         final URI uri = getQueryServiceUri(testFile);
         final InputStream inputStream = executeQueryService(statement, OutputFormat.forCompilationUnit(cUnit), uri,
-                cUnit.getParameter(), true, null, false);
-        return ResultExtractor.extract(inputStream);
+                cUnit.getParameter(), true, responseCharset, null, false);
+        return ResultExtractor.extract(inputStream, responseCharset);
     }
 
     private URI getQueryServiceUri(String extension) throws URISyntaxException {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java
index b4c5b26..05a301c 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java
@@ -43,15 +43,6 @@
 
     protected static final Logger LOGGER = LogManager.getLogger();
 
-    static {
-        // hack to ensure we have a unique location for external libraries in our tests (asterix cluster has a shared home directory)
-        String appHome = joinPath(System.getProperty("app.home", System.getProperty("user.home")),
-                "appHome" + (int) (Math.random() * Integer.MAX_VALUE));
-        LOGGER.info("setting app.home to {}", appHome);
-        System.setProperty("app.home", appHome);
-        new File(appHome).deleteOnExit();
-    }
-
     protected static final String PATH_ACTUAL = "rttest" + File.separator;
 
     public static TestGroup FailedGroup;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
index e929ef0..0b89981 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
@@ -25,6 +25,7 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -160,7 +161,8 @@
             }
             writer.close();
             // Compares the actual result and the expected result.
-            runScriptAndCompareWithResult(queryFile, expectedFile, actualResultFile, ComparisonEnum.TEXT);
+            runScriptAndCompareWithResult(queryFile, expectedFile, actualResultFile, ComparisonEnum.TEXT,
+                    StandardCharsets.UTF_8);
         } catch (Exception e) {
             GlobalConfig.ASTERIX_LOGGER.warn("Failed while testing file " + queryFile);
             throw e;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/Duration.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/Duration.java
index a8b43b7..905497e 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/Duration.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/Duration.java
@@ -47,13 +47,25 @@
         this.nanoDigits = nanoDigits;
     }
 
+    public String asciiSafeUnit() {
+        return this == MICRO ? "us" : unit;
+    }
+
     public static String formatNanos(long nanoTime) {
+        return formatNanos(nanoTime, false);
+    }
+
+    public static String formatNanos(long nanoTime, boolean asciiSafe) {
         StringBuilder sb = new StringBuilder();
-        formatNanos(nanoTime, sb);
+        formatNanos(nanoTime, sb, asciiSafe);
         return sb.toString();
     }
 
     public static void formatNanos(long nanoTime, StringBuilder out) {
+        formatNanos(nanoTime, out, false);
+    }
+
+    public static void formatNanos(long nanoTime, StringBuilder out, boolean asciiSafe) {
         final String strTime = String.valueOf(Math.abs(nanoTime));
         final int len = strTime.length();
         for (Duration tu : VALUES) {
@@ -67,7 +79,7 @@
                 if (k > 0) {
                     out.append('.').append(strTime, n, k + 1);
                 }
-                out.append(tu.unit);
+                out.append(asciiSafe ? tu.asciiSafeUnit() : tu.unit);
                 break;
             }
         }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java
index 639e036..17c98bc 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java
@@ -67,13 +67,12 @@
             String feedType = req.getParameter(FEED_TYPE);
             feedType = (feedType != null) ? feedType : defaultFeedType;
             feed.setFeedType(feedType);
-            HttpUtil.setContentType(res, MIME_TYPE);
+            HttpUtil.setContentType(res, MIME_TYPE, req);
             SyndFeedOutput output = new SyndFeedOutput();
             output.output(feed, res.writer());
         } catch (FeedException | ParseException ex) {
             GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, ex.getMessage(), ex);
-            String msg = COULD_NOT_GENERATE_FEED_ERROR;
-            res.writer().print(msg);
+            res.writer().print(COULD_NOT_GENERATE_FEED_ERROR);
             res.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
         }
     }
diff --git a/asterixdb/asterix-server/src/main/opt/local/bin/start-sample-cluster.sh b/asterixdb/asterix-server/src/main/opt/local/bin/start-sample-cluster.sh
index e337cb0..e0cff32 100755
--- a/asterixdb/asterix-server/src/main/opt/local/bin/start-sample-cluster.sh
+++ b/asterixdb/asterix-server/src/main/opt/local/bin/start-sample-cluster.sh
@@ -86,7 +86,7 @@
   fi
 fi
 
-export JAVA_VERSION=$(java -version 2>&1 | head -1 | awk '{ print $3 }' | tr -d '"')
+export JAVA_VERSION=$($JAVACMD -version 2>&1 | head -1 | awk '{ print $3 }' | tr -d '"')
 case $JAVA_VERSION in
   1.8*|1.9*|10*|11*)
     ;;
diff --git a/asterixdb/asterix-server/src/main/opt/local/bin/stop-sample-cluster.sh b/asterixdb/asterix-server/src/main/opt/local/bin/stop-sample-cluster.sh
index 522fb7c..80647d4 100755
--- a/asterixdb/asterix-server/src/main/opt/local/bin/stop-sample-cluster.sh
+++ b/asterixdb/asterix-server/src/main/opt/local/bin/stop-sample-cluster.sh
@@ -99,11 +99,14 @@
     JAVACMD=`which java`
   fi
 fi
-"$JAVACMD" -version 2>&1 | grep -q '1\.[89]' || {
-  echo "JAVA_HOME must be at version 1.8 or later:"
-  "$JAVACMD" -version
+export JAVA_VERSION=$($JAVACMD -version 2>&1 | head -1 | awk '{ print $3 }' | tr -d '"')
+case $JAVA_VERSION in
+  1.8*|1.9*|10*|11*)
+    ;;
+  *)
+  echo JAVA_HOME must be at version 1.8 or later, but is: $JAVA_VERSION
   exit 2
-}
+esac
 DIRNAME=$(dirname "$0")
 [ $(echo $DIRNAME | wc -l) -ne 1 ] && {
   echo "Paths with spaces are not supported"
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
index 0479bb2..cd72591 100644
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
@@ -24,6 +24,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -121,7 +122,7 @@
     public void test1_sanityQuery() throws Exception {
         TestExecutor testExecutor = new TestExecutor();
         InputStream resultStream = testExecutor.executeQueryService("1+1;",
-                testExecutor.getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.ADM);
+                testExecutor.getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.ADM, StandardCharsets.UTF_8);
         final ObjectMapper objectMapper = new ObjectMapper();
         final ObjectNode response = objectMapper.readValue(resultStream, ObjectNode.class);
         final JsonNode result = response.get("results");
diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml
index 12a6928..6591678 100644
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@ -1087,6 +1087,12 @@
       </dependency>
       <dependency>
         <groupId>org.apache.hyracks</groupId>
+        <artifactId>hyracks-util</artifactId>
+        <version>${hyracks.version}</version>
+        <type>test-jar</type>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.hyracks</groupId>
         <artifactId>hyracks-dataflow-std</artifactId>
         <version>${hyracks.version}</version>
       </dependency>
diff --git a/hyracks-fullstack/hyracks/hyracks-http/pom.xml b/hyracks-fullstack/hyracks/hyracks-http/pom.xml
index b6dee00..a0e426b 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-http/pom.xml
@@ -101,5 +101,11 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-test-support</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
index 2b2bdef..08e9ed8 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
@@ -108,7 +108,7 @@
     public synchronized PrintWriter writer() {
         if (writer == null) {
             Charset charset = io.netty.handler.codec.http.HttpUtil.getCharset(response, StandardCharsets.UTF_8);
-            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream, charset)));
+            writer = new PrintWriter(new OutputStreamWriter(outputStream, charset));
         }
         return writer;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
index f1ff92c..417d082 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
@@ -52,7 +52,7 @@
     public FullResponse(HttpServerHandler<?> handler, ChannelHandlerContext ctx, FullHttpRequest request) {
         this.handler = handler;
         this.ctx = ctx;
-        baos = new ByteArrayOutputStream();
+        baos = new ByteArrayOutputStream(4096);
         response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.INTERNAL_SERVER_ERROR);
         HttpUtil.setConnectionHeader(request, response);
     }
@@ -79,7 +79,7 @@
     public synchronized PrintWriter writer() {
         if (writer == null) {
             Charset charset = io.netty.handler.codec.http.HttpUtil.getCharset(response, StandardCharsets.UTF_8);
-            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(baos, charset)));
+            writer = new PrintWriter(new OutputStreamWriter(baos, charset));
         }
         return writer;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
index 1a51318..78b5096 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
@@ -49,7 +49,7 @@
 public class HttpUtil {
     private static final Logger LOGGER = LogManager.getLogger();
     private static final Pattern PARENT_DIR = Pattern.compile("/[^./]+/\\.\\./");
-    private static final String DEFAULT_RESPONSE_CHARSET = StandardCharsets.UTF_8.name();
+    private static final Charset DEFAULT_RESPONSE_CHARSET = StandardCharsets.UTF_8;
 
     private HttpUtil() {
     }
@@ -105,15 +105,20 @@
         return contentType == null ? null : contentType.split(";")[0];
     }
 
-    public static String getRequestBody(IServletRequest request) {
-        FullHttpRequest httpRequest = request.getHttpRequest();
-        Charset charset = io.netty.handler.codec.http.HttpUtil.getCharset(httpRequest, StandardCharsets.UTF_8);
-        return httpRequest.content().toString(charset);
+    public static Charset getRequestCharset(HttpRequest request) {
+        return io.netty.handler.codec.http.HttpUtil.getCharset(request, StandardCharsets.UTF_8);
     }
 
-    public static void setContentType(IServletResponse response, String type, IServletRequest fromRequest)
+    public static String getRequestBody(IServletRequest request) {
+        FullHttpRequest httpRequest = request.getHttpRequest();
+        return httpRequest.content().toString(getRequestCharset(httpRequest));
+    }
+
+    public static Charset setContentType(IServletResponse response, String type, IServletRequest fromRequest)
             throws IOException {
-        response.setHeader(HttpHeaderNames.CONTENT_TYPE, type + "; charset=" + getPreferredCharset(fromRequest));
+        Charset preferredCharset = getPreferredCharset(fromRequest);
+        response.setHeader(HttpHeaderNames.CONTENT_TYPE, type + "; charset=" + preferredCharset.name());
+        return preferredCharset;
     }
 
     public static void setContentType(IServletResponse response, String type, String charset) throws IOException {
@@ -180,25 +185,24 @@
         response.headers().set(HttpHeaderNames.CONNECTION, connectionHeaderValue);
     }
 
-    public static String getPreferredCharset(IServletRequest request) {
+    public static Charset getPreferredCharset(IServletRequest request) {
         return getPreferredCharset(request, DEFAULT_RESPONSE_CHARSET);
     }
 
-    public static String getPreferredCharset(IServletRequest request, String defaultCharset) {
+    public static Charset getPreferredCharset(IServletRequest request, Charset defaultCharset) {
         String acceptCharset = request.getHeader(HttpHeaderNames.ACCEPT_CHARSET);
         if (acceptCharset == null) {
             return defaultCharset;
         }
         // If no "q" parameter is present, the default weight is 1 [https://tools.ietf.org/html/rfc7231#section-5.3.1]
-        Optional<String> preferredCharset = Stream.of(StringUtils.split(acceptCharset, ","))
-                .map(WeightedHeaderValue::new).sorted().map(WeightedHeaderValue::getValue)
-                .map(a -> "*".equals(a) ? defaultCharset : a).filter(value -> {
+        Optional<Charset> preferredCharset = Stream.of(StringUtils.split(acceptCharset, ","))
+                .map(WeightedHeaderValue::new).sorted().map(WeightedHeaderValue::getValueDefaultStar).filter(value -> {
                     if (!Charset.isSupported(value)) {
                         LOGGER.info("disregarding unsupported charset '{}'", value);
                         return false;
                     }
                     return true;
-                }).findFirst();
+                }).map(Charset::forName).findFirst();
         return preferredCharset.orElse(defaultCharset);
     }
 
@@ -227,6 +231,10 @@
             return value;
         }
 
+        public String getValueDefaultStar() {
+            return "*".equals(value) ? DEFAULT_RESPONSE_CHARSET.name() : value;
+        }
+
         public double getWeight() {
             return weight;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpAcceptCharsetTest.java b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpAcceptCharsetTest.java
index a166e52..260da99 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpAcceptCharsetTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpAcceptCharsetTest.java
@@ -61,7 +61,7 @@
     @Test
     public void testAmbiguous() {
         IServletRequest request = withCharset("utf-8;q=.75,utf-16;q=.75,utf-32;q=.5");
-        String preferredCharset = HttpUtil.getPreferredCharset(request);
+        String preferredCharset = HttpUtil.getPreferredCharset(request).name();
         Assert.assertTrue("ambiguous by weight (got: " + preferredCharset + ")",
                 preferredCharset.toLowerCase().matches("utf-(8|16)"));
     }
@@ -83,7 +83,7 @@
         } else if (charsetObject instanceof String) {
             return ((String) charsetObject).toLowerCase();
         } else if (charsetObject instanceof IServletRequest) {
-            return HttpUtil.getPreferredCharset((IServletRequest) charsetObject).toLowerCase();
+            return HttpUtil.getPreferredCharset((IServletRequest) charsetObject).name().toLowerCase();
         }
         throw new IllegalArgumentException("unknown type: " + charsetObject.getClass());
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpServerEncodingTest.java b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpServerEncodingTest.java
index c71c5e4..b522122 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpServerEncodingTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/test/http/HttpServerEncodingTest.java
@@ -27,7 +27,6 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.http.HttpEntity;
@@ -44,8 +43,7 @@
 import org.apache.hyracks.http.server.HttpServerConfigBuilder;
 import org.apache.hyracks.http.server.WebManager;
 import org.apache.hyracks.test.http.servlet.CompliantEchoServlet;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import org.apache.hyracks.test.string.EncodingUtils;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -57,8 +55,6 @@
 
 @RunWith(Parameterized.class)
 public class HttpServerEncodingTest {
-    private static final Logger LOGGER = LogManager.getLogger();
-
     private static final int PORT = 9898;
     private static final String HOST = "localhost";
     private static final String PROTOCOL = "http";
@@ -72,7 +68,7 @@
         List<Object[]> tests = new ArrayList<>();
         Stream.of("encoding is hard", "中文字符", "لا يوجد ترجمة لكُ", STRING_NEEDS_2_JAVA_CHARS_1,
                 STRING_NEEDS_2_JAVA_CHARS_2).forEach(input -> {
-                    Set<Charset> legalCharsets = getLegalCharsetsFor(input);
+                    Set<Charset> legalCharsets = EncodingUtils.getLegalCharsetsFor(input);
                     legalCharsets.forEach(charsetIn -> legalCharsets.forEach(charsetOut -> tests
                             .add(new Object[] { input + ":" + charsetIn.displayName() + "->" + charsetOut.displayName(),
                                     input, charsetIn, charsetOut })));
@@ -80,19 +76,6 @@
         return tests;
     }
 
-    private static Set<Charset> getLegalCharsetsFor(String input) {
-        return Charset.availableCharsets().values().stream().filter(Charset::canEncode)
-                .filter(test -> canEncodeDecode(input, test)).collect(Collectors.toSet());
-    }
-
-    private static boolean canEncodeDecode(String input, Charset charset) {
-        if (input.equals(new String(input.getBytes(charset), charset))) {
-            return true;
-        }
-        LOGGER.info("cannot encode / decode {} with {}", input, charset.displayName());
-        return false;
-    }
-
     @Parameter(0)
     public String testName;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/string/EncodingUtils.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/string/EncodingUtils.java
new file mode 100644
index 0000000..9ba4817
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/string/EncodingUtils.java
@@ -0,0 +1,65 @@
+/*
+ * 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.hyracks.test.string;
+
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class EncodingUtils {
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private EncodingUtils() {
+    }
+
+    // duplicated in [asterix-app]TestExecutor.java as transitive dependencies on test-jars are not handled correctly
+    public static boolean canEncodeDecode(String input, Charset charset, boolean quiet) {
+        try {
+            if (input.equals(new String(input.getBytes(charset), charset))) {
+                if (!input.equals(charset.decode(charset.encode(CharBuffer.wrap(input))).toString())) {
+                    // workaround for https://bugs.openjdk.java.net/browse/JDK-6392670 and similar
+                    if (!quiet) {
+                        LOGGER.info("cannot encode / decode {} with {} using CharBuffer.wrap(<String>)", input,
+                                charset.displayName());
+                    }
+                } else {
+                    return true;
+                }
+            }
+            if (!quiet) {
+                LOGGER.info("cannot encode / decode {} with {}", input, charset.displayName());
+            }
+        } catch (Exception e) {
+            if (!quiet) {
+                LOGGER.info("cannot encode / decode {} with {}, got exception ({})", input, charset.displayName(),
+                        String.valueOf(e));
+            }
+        }
+        return false;
+    }
+
+    public static Set<Charset> getLegalCharsetsFor(String input) {
+        return Charset.availableCharsets().values().stream().filter(Charset::canEncode)
+                .filter(test -> canEncodeDecode(input, test, false)).collect(Collectors.toSet());
+    }
+}
