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 95eb6fb..395365a 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
@@ -53,11 +53,12 @@
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
 import org.apache.hyracks.client.dataset.HyracksDataset;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.hyracks.http.server.utils.HttpUtil.ContentType;
+import org.apache.hyracks.http.server.utils.HttpUtil.Encoding;
 
 import io.netty.handler.codec.http.HttpMethod;
 import io.netty.handler.codec.http.HttpResponseStatus;
@@ -111,7 +112,7 @@
         String printJob = request.getParameter("print-job");
         String executeQuery = request.getParameter("execute-query");
         try {
-            ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, ContentType.TEXT_HTML, Encoding.UTF8);
         } catch (IOException e) {
             LOGGER.log(Level.WARNING, "Failure setting content type", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
@@ -162,7 +163,7 @@
 
         if ("/".equals(requestURI)) {
             try {
-                ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML, IServlet.Encoding.UTF8);
+                HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
             } catch (IOException e) {
                 LOGGER.log(Level.WARNING, "Failure setting content type", e);
                 response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
@@ -181,16 +182,16 @@
             // Special handler for font files and .png resources
             if (resourcePath.endsWith(".png")) {
                 BufferedImage img = ImageIO.read(is);
-                ServletUtils.setContentType(response, IServlet.ContentType.IMG_PNG);
+                HttpUtil.setContentType(response, HttpUtil.ContentType.IMG_PNG);
                 OutputStream outputStream = response.outputStream();
                 String formatName = "png";
                 ImageIO.write(img, formatName, outputStream);
                 outputStream.close();
                 return;
             }
-            String type = IServlet.ContentType.mime(QueryWebInterfaceServlet.extension(resourcePath));
-            ServletUtils.setContentType(response, "".equals(type) ? IServlet.ContentType.TEXT_PLAIN : type,
-                    IServlet.Encoding.UTF8);
+            String type = HttpUtil.mime(QueryWebInterfaceServlet.extension(resourcePath));
+            HttpUtil.setContentType(response, "".equals(type) ? HttpUtil.ContentType.TEXT_PLAIN : type,
+                    HttpUtil.Encoding.UTF8);
             writeOutput(response, is, resourcePath);
         } catch (IOException e) {
             LOGGER.log(Level.WARNING, "Failure handling request", e);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java
index e93108d..71559b1 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java
@@ -32,11 +32,10 @@
 import org.apache.asterix.common.config.ReplicationProperties;
 import org.apache.asterix.common.utils.JSONUtil;
 import org.apache.asterix.runtime.utils.ClusterStateManager;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -67,7 +66,7 @@
     }
 
     protected void getUnsafe(IServletRequest request, IServletResponse response) throws IOException {
-        ServletUtils.setContentType(response, IServlet.ContentType.APPLICATION_JSON, IServlet.Encoding.UTF8);
+        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
         PrintWriter responseWriter = response.writer();
         try {
             ObjectNode json;
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java
index 3d9167e..69f5db4 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java
@@ -27,10 +27,9 @@
 import java.util.logging.Logger;
 
 import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
-import org.apache.hyracks.http.server.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -58,7 +57,7 @@
             } else {
                 json = processNode(request, hcc);
             }
-            ServletUtils.setContentType(response, IServlet.ContentType.APPLICATION_JSON, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
             responseWriter.write(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(json));
         } catch (IllegalArgumentException e) { // NOSONAR - exception not logged or rethrown
             response.setStatus(HttpResponseStatus.NOT_FOUND);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
index 66064aa..a6c0783 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
@@ -39,11 +39,10 @@
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.client.NodeControllerInfo;
 import org.apache.hyracks.api.io.FileSplit;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -73,7 +72,7 @@
         }
         response.setStatus(HttpResponseStatus.OK);
         try {
-            ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
             LOGGER.log(Level.WARNING, "Failure setting content type", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java
index 709db4b..4d6f641 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java
@@ -37,10 +37,9 @@
 import org.apache.asterix.api.http.servlet.ServletConstants;
 import org.apache.asterix.runtime.utils.AppContextInfo;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
-import org.apache.hyracks.http.server.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
@@ -57,7 +56,7 @@
 
     @Override
     protected void getUnsafe(IServletRequest request, IServletResponse response) throws IOException {
-        ServletUtils.setContentType(response, IServlet.ContentType.APPLICATION_JSON, IServlet.Encoding.UTF8);
+        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
         PrintWriter responseWriter = response.writer();
         ObjectNode json;
         ObjectMapper om = new ObjectMapper();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/FeedServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/FeedServlet.java
index 7fe7370..7831674 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/FeedServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/FeedServlet.java
@@ -31,11 +31,10 @@
 
 import javax.imageio.ImageIO;
 
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
@@ -54,7 +53,7 @@
             String requestURI = request.getHttpRequest().uri();
 
             if ("/".equals(requestURI)) {
-                ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML);
+                HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML);
                 resourcePath = "/feed/home.html";
             } else {
                 resourcePath = requestURI;
@@ -72,12 +71,12 @@
                 BufferedImage img = ImageIO.read(is);
                 OutputStream outputStream = response.outputStream();
                 String formatName = "png";
-                ServletUtils.setContentType(response, IServlet.ContentType.IMG_PNG);
+                HttpUtil.setContentType(response, HttpUtil.ContentType.IMG_PNG);
                 ImageIO.write(img, formatName, outputStream);
                 return;
             }
 
-            ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
             InputStreamReader isr = new InputStreamReader(is);
             StringBuilder sb = new StringBuilder();
             BufferedReader br = new BufferedReader(isr);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java
index f6b80fc4..30718cf 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java
@@ -31,10 +31,9 @@
 
 import org.apache.asterix.runtime.utils.ClusterStateManager;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
-import org.apache.hyracks.http.server.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -67,7 +66,7 @@
             } else {
                 json = processNode(request, hcc);
             }
-            ServletUtils.setContentType(response, IServlet.ContentType.APPLICATION_JSON, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
             responseWriter.write(om.writerWithDefaultPrettyPrinter().writeValueAsString(json));
         } catch (IllegalStateException e) { // NOSONAR - exception not logged or rethrown
             response.setStatus(HttpResponseStatus.SERVICE_UNAVAILABLE);
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 06ddf44..522fd29 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
@@ -39,11 +39,10 @@
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.client.dataset.HyracksDataset;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -68,7 +67,7 @@
         response.setStatus(HttpResponseStatus.OK);
         // TODO this seems wrong ...
         try {
-            ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
             LOGGER.log(Level.WARNING, "Failure setting content type", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
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 7cb492b..3c7a1a1 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
@@ -54,11 +54,10 @@
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
 import org.apache.hyracks.client.dataset.HyracksDataset;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -284,13 +283,13 @@
 
     private static SessionConfig.OutputFormat getFormat(String format) {
         if (format != null) {
-            if (format.startsWith(IServlet.ContentType.CSV)) {
+            if (format.startsWith(HttpUtil.ContentType.CSV)) {
                 return SessionConfig.OutputFormat.CSV;
             }
-            if (format.equals(IServlet.ContentType.APPLICATION_ADM)) {
+            if (format.equals(HttpUtil.ContentType.APPLICATION_ADM)) {
                 return SessionConfig.OutputFormat.ADM;
             }
-            if (format.startsWith(IServlet.ContentType.APPLICATION_JSON)) {
+            if (format.startsWith(HttpUtil.ContentType.APPLICATION_JSON)) {
                 return Boolean.parseBoolean(getParameterValue(format, Attribute.LOSSLESS.str()))
                         ? SessionConfig.OutputFormat.LOSSLESS_JSON : SessionConfig.OutputFormat.CLEAN_JSON;
             }
@@ -374,10 +373,10 @@
     private static void printType(PrintWriter pw, SessionConfig sessionConfig) {
         switch (sessionConfig.fmt()) {
             case ADM:
-                printField(pw, ResultFields.TYPE.str(), IServlet.ContentType.APPLICATION_ADM);
+                printField(pw, ResultFields.TYPE.str(), HttpUtil.ContentType.APPLICATION_ADM);
                 break;
             case CSV:
-                String contentType = IServlet.ContentType.CSV + "; header="
+                String contentType = HttpUtil.ContentType.CSV + "; header="
                         + (sessionConfig.is(SessionConfig.FORMAT_CSV_HEADER) ? "present" : "absent");
                 printField(pw, ResultFields.TYPE.str(), contentType);
                 break;
@@ -437,7 +436,7 @@
         int sep = contentTypeParam.indexOf(';');
         final String contentType = sep < 0 ? contentTypeParam.trim() : contentTypeParam.substring(0, sep).trim();
         RequestParameters param = new RequestParameters();
-        if (IServlet.ContentType.APPLICATION_JSON.equals(contentType)) {
+        if (HttpUtil.ContentType.APPLICATION_JSON.equals(contentType)) {
             try {
                 JsonNode jsonRequest = new ObjectMapper().readTree(getRequestBody(request));
                 param.statement = jsonRequest.get(Parameter.STATEMENT.str()).asText();
@@ -485,7 +484,7 @@
         ResultDelivery delivery = parseResultDelivery(param.mode);
 
         SessionConfig sessionConfig = createSessionConfig(param, resultWriter);
-        ServletUtils.setContentType(response, IServlet.ContentType.APPLICATION_JSON, IServlet.Encoding.UTF8);
+        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
 
         HttpResponseStatus status = HttpResponseStatus.OK;
         Stats stats = new Stats();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
index 3d31616..075615e 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
@@ -33,11 +33,10 @@
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.client.dataset.HyracksDataset;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -61,7 +60,7 @@
         }
         response.setStatus(HttpResponseStatus.OK);
         try {
-            ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
             LOGGER.log(Level.WARNING, "Failure setting content type", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
index 96df30f..8a41fc1 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
@@ -29,11 +29,10 @@
 import org.apache.asterix.common.config.ExternalProperties;
 import org.apache.asterix.runtime.utils.AppContextInfo;
 import org.apache.commons.io.IOUtils;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -71,7 +70,7 @@
         response.setStatus(HttpResponseStatus.OK);
 
         if ("/".equals(requestURI)) {
-            ServletUtils.setContentType(response, IServlet.ContentType.TEXT_HTML);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML);
             resourcePath = "/queryui/queryui.html";
         } else {
             resourcePath = requestURI;
@@ -85,10 +84,10 @@
             int i = resourcePath.lastIndexOf('.');
             if (i >= 0) {
                 String extension = resourcePath.substring(i);
-                String mime = IServlet.ContentType.mime(extension);
+                String mime = HttpUtil.mime(extension);
                 if (mime != null) {
                     OutputStream out = response.outputStream();
-                    ServletUtils.setContentType(response, mime);
+                    HttpUtil.setContentType(response, mime);
                     try {
                         IOUtils.copy(is, out);
                     } catch (Exception e) {
@@ -107,7 +106,7 @@
     }
 
     private void doPost(IServletResponse response) throws IOException {
-        ServletUtils.setContentType(response, IServlet.ContentType.APPLICATION_JSON, IServlet.Encoding.UTF8);
+        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
         ExternalProperties externalProperties = AppContextInfo.INSTANCE.getExternalProperties();
         response.setStatus(HttpResponseStatus.OK);
         ObjectMapper om = new ObjectMapper();
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
index b069efe..d1ae95d 100644
--- 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
@@ -49,11 +49,10 @@
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
 import org.apache.hyracks.client.dataset.HyracksDataset;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -85,7 +84,7 @@
      * based on the Accept: header and other servlet parameters.
      */
     static SessionConfig initResponse(IServletRequest request, IServletResponse response) throws IOException {
-        ServletUtils.setContentType(response, IServlet.ContentType.TEXT_PLAIN, IServlet.Encoding.UTF8);
+        HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_PLAIN, HttpUtil.Encoding.UTF8);
         // CLEAN_JSON output is the default; most generally useful for a
         // programmatic HTTP API
         OutputFormat format = OutputFormat.CLEAN_JSON;
@@ -135,20 +134,20 @@
         // Now that format is set, output the content-type
         switch (format) {
             case ADM:
-                ServletUtils.setContentType(response, "application/x-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:
-                ServletUtils.setContentType(response, "application/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")) {
-                    ServletUtils.setContentType(response, "text/csv; header=present");
+                    HttpUtil.setContentType(response, "text/csv; header=present");
                     sessionConfig.set(SessionConfig.FORMAT_CSV_HEADER, true);
                 } else {
-                    ServletUtils.setContentType(response, "text/csv; header=absent");
+                    HttpUtil.setContentType(response, "text/csv; header=absent");
                 }
                 break;
             default:
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java
index 5c569ed..d9dc424 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java
@@ -30,11 +30,10 @@
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.runtime.utils.ClusterStateManager;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -71,7 +70,7 @@
         }, "Shutdown Servlet Worker");
 
         try {
-            ServletUtils.setContentType(response, IServlet.ContentType.APPLICATION_JSON, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
             LOGGER.log(Level.WARNING, "Failure handling request", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java
index 1b2c2e6..62b85cd 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java
@@ -28,11 +28,10 @@
 import java.util.logging.Logger;
 
 import org.apache.asterix.runtime.utils.AppContextInfo;
-import org.apache.hyracks.http.api.IServlet;
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -62,7 +61,7 @@
             responseObject.put(e.getKey(), e.getValue());
         }
         try {
-            ServletUtils.setContentType(response, IServlet.ContentType.TEXT_PLAIN, IServlet.Encoding.UTF8);
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_PLAIN, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
             LOGGER.log(Level.WARNING, "Failure handling request", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
index 8ea4193..62eb250 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
@@ -53,7 +53,7 @@
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.library.ILibraryManager;
-import org.apache.asterix.common.utils.LetUtil.Lets;
+import org.apache.asterix.common.utils.Servlets;
 import org.apache.asterix.external.library.ExternalLibraryManager;
 import org.apache.asterix.file.StorageComponentProvider;
 import org.apache.asterix.messaging.CCMessageBroker;
@@ -163,7 +163,7 @@
                 externalProperties.getWebInterfacePort());
         IHyracksClientConnection hcc = getNewHyracksClientConnection();
         webServer.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
-        webServer.addLet(new ApiServlet(webServer.ctx(), new String[] { "/*" },
+        webServer.addServlet(new ApiServlet(webServer.ctx(), new String[] { "/*" },
                 ccExtensionManager.getAqlCompilationProvider(), ccExtensionManager.getSqlppCompilationProvider(),
                 getStatementExecutorFactory(), componentProvider));
         return webServer;
@@ -179,33 +179,33 @@
                 ((ClusterControllerService) appCtx.getControllerService()).getExecutor());
 
         // AQL rest APIs.
-        addLet(jsonAPIServer, Lets.AQL_QUERY);
-        addLet(jsonAPIServer, Lets.AQL_UPDATE);
-        addLet(jsonAPIServer, Lets.AQL_DDL);
-        addLet(jsonAPIServer, Lets.AQL);
+        addServlet(jsonAPIServer, Servlets.AQL_QUERY);
+        addServlet(jsonAPIServer, Servlets.AQL_UPDATE);
+        addServlet(jsonAPIServer, Servlets.AQL_DDL);
+        addServlet(jsonAPIServer, Servlets.AQL);
 
         // SQL+x+ rest APIs.
-        addLet(jsonAPIServer, Lets.SQLPP_QUERY);
-        addLet(jsonAPIServer, Lets.SQLPP_UPDATE);
-        addLet(jsonAPIServer, Lets.SQLPP_DDL);
-        addLet(jsonAPIServer, Lets.SQLPP);
+        addServlet(jsonAPIServer, Servlets.SQLPP_QUERY);
+        addServlet(jsonAPIServer, Servlets.SQLPP_UPDATE);
+        addServlet(jsonAPIServer, Servlets.SQLPP_DDL);
+        addServlet(jsonAPIServer, Servlets.SQLPP);
 
         // Other APIs.
-        addLet(jsonAPIServer, Lets.QUERY_STATUS);
-        addLet(jsonAPIServer, Lets.QUERY_RESULT);
-        addLet(jsonAPIServer, Lets.QUERY_SERVICE);
-        addLet(jsonAPIServer, Lets.CONNECTOR);
-        addLet(jsonAPIServer, Lets.SHUTDOWN);
-        addLet(jsonAPIServer, Lets.VERSION);
-        addLet(jsonAPIServer, Lets.CLUSTER_STATE);
-        addLet(jsonAPIServer, Lets.CLUSTER_STATE_NODE_DETAIL); // this must not precede add of CLUSTER_STATE
-        addLet(jsonAPIServer, Lets.CLUSTER_STATE_CC_DETAIL); // this must not precede add of CLUSTER_STATE
-        addLet(jsonAPIServer, Lets.DIAGNOSTICS);
+        addServlet(jsonAPIServer, Servlets.QUERY_STATUS);
+        addServlet(jsonAPIServer, Servlets.QUERY_RESULT);
+        addServlet(jsonAPIServer, Servlets.QUERY_SERVICE);
+        addServlet(jsonAPIServer, Servlets.CONNECTOR);
+        addServlet(jsonAPIServer, Servlets.SHUTDOWN);
+        addServlet(jsonAPIServer, Servlets.VERSION);
+        addServlet(jsonAPIServer, Servlets.CLUSTER_STATE);
+        addServlet(jsonAPIServer, Servlets.CLUSTER_STATE_NODE_DETAIL); // must not precede add of CLUSTER_STATE
+        addServlet(jsonAPIServer, Servlets.CLUSTER_STATE_CC_DETAIL); // must not precede add of CLUSTER_STATE
+        addServlet(jsonAPIServer, Servlets.DIAGNOSTICS);
         return jsonAPIServer;
     }
 
-    protected void addLet(HttpServer server, Lets let) {
-        server.addLet(createServlet(server, let, let.getPath()));
+    protected void addServlet(HttpServer server, String path) {
+        server.addServlet(createServlet(server, path, path));
     }
 
     protected HttpServer setupQueryWebServer(ExternalProperties externalProperties) throws Exception {
@@ -213,7 +213,7 @@
                 externalProperties.getQueryWebInterfacePort());
         IHyracksClientConnection hcc = getNewHyracksClientConnection();
         queryWebServer.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
-        queryWebServer.addLet(new QueryWebInterfaceServlet(queryWebServer.ctx(), new String[] { "/*" }));
+        queryWebServer.addServlet(new QueryWebInterfaceServlet(queryWebServer.ctx(), new String[] { "/*" }));
         return queryWebServer;
     }
 
@@ -221,56 +221,56 @@
         HttpServer feedServer = new HttpServer(webManager.getBosses(), webManager.getWorkers(),
                 externalProperties.getFeedServerPort());
         feedServer.setAttribute(HYRACKS_CONNECTION_ATTR, getNewHyracksClientConnection());
-        feedServer.addLet(new FeedServlet(feedServer.ctx(), new String[] { "/" }));
+        feedServer.addServlet(new FeedServlet(feedServer.ctx(), new String[] { "/" }));
         return feedServer;
     }
 
-    protected IServlet createServlet(HttpServer server, Lets key, String... paths) {
+    protected IServlet createServlet(HttpServer server, String key, String... paths) {
         switch (key) {
-            case AQL:
+            case Servlets.AQL:
                 return new FullApiServlet(server.ctx(), paths, ccExtensionManager.getAqlCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case AQL_QUERY:
+            case Servlets.AQL_QUERY:
                 return new QueryApiServlet(server.ctx(), paths, ccExtensionManager.getAqlCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case AQL_UPDATE:
+            case Servlets.AQL_UPDATE:
                 return new UpdateApiServlet(server.ctx(), paths, ccExtensionManager.getAqlCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case AQL_DDL:
+            case Servlets.AQL_DDL:
                 return new DdlApiServlet(server.ctx(), paths, ccExtensionManager.getAqlCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case SQLPP:
+            case Servlets.SQLPP:
                 return new FullApiServlet(server.ctx(), paths, ccExtensionManager.getSqlppCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case SQLPP_QUERY:
+            case Servlets.SQLPP_QUERY:
                 return new QueryApiServlet(server.ctx(), paths, ccExtensionManager.getSqlppCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case SQLPP_UPDATE:
+            case Servlets.SQLPP_UPDATE:
                 return new UpdateApiServlet(server.ctx(), paths, ccExtensionManager.getSqlppCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case SQLPP_DDL:
+            case Servlets.SQLPP_DDL:
                 return new DdlApiServlet(server.ctx(), paths, ccExtensionManager.getSqlppCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case QUERY_STATUS:
+            case Servlets.QUERY_STATUS:
                 return new QueryStatusApiServlet(server.ctx(), paths);
-            case QUERY_RESULT:
+            case Servlets.QUERY_RESULT:
                 return new QueryResultApiServlet(server.ctx(), paths);
-            case QUERY_SERVICE:
+            case Servlets.QUERY_SERVICE:
                 return new QueryServiceServlet(server.ctx(), paths, ccExtensionManager.getSqlppCompilationProvider(),
                         getStatementExecutorFactory(), componentProvider);
-            case CONNECTOR:
+            case Servlets.CONNECTOR:
                 return new ConnectorApiServlet(server.ctx(), paths);
-            case SHUTDOWN:
+            case Servlets.SHUTDOWN:
                 return new ShutdownApiServlet(server.ctx(), paths);
-            case VERSION:
+            case Servlets.VERSION:
                 return new VersionApiServlet(server.ctx(), paths);
-            case CLUSTER_STATE:
+            case Servlets.CLUSTER_STATE:
                 return new ClusterApiServlet(server.ctx(), paths);
-            case CLUSTER_STATE_NODE_DETAIL:
+            case Servlets.CLUSTER_STATE_NODE_DETAIL:
                 return new NodeControllerDetailsApiServlet(server.ctx(), paths);
-            case CLUSTER_STATE_CC_DETAIL:
+            case Servlets.CLUSTER_STATE_CC_DETAIL:
                 return new ClusterControllerDetailsApiServlet(server.ctx(), paths);
-            case DIAGNOSTICS:
+            case Servlets.DIAGNOSTICS:
                 return new DiagnosticsApiServlet(server.ctx(), paths);
             default:
                 throw new IllegalStateException(String.valueOf(key));
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/LetUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/LetUtil.java
deleted file mode 100644
index 2fe9380..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/LetUtil.java
+++ /dev/null
@@ -1,58 +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.common.utils;
-
-public class LetUtil {
-
-    public enum Lets {
-        AQL("/aql"),
-        AQL_QUERY("/query"),
-        AQL_UPDATE("/update"),
-        AQL_DDL("/ddl"),
-        SQLPP("/sqlpp"),
-        SQLPP_QUERY("/query/sqlpp"),
-        SQLPP_UPDATE("/update/sqlpp"),
-        SQLPP_DDL("/ddl/sqlpp"),
-        QUERY_STATUS("/query/status"),
-        QUERY_RESULT("/query/result"),
-        QUERY_SERVICE("/query/service"),
-        CONNECTOR("/connector"),
-        SHUTDOWN("/admin/shutdown"),
-        VERSION("/admin/version"),
-        CLUSTER_STATE("/admin/cluster/*"),
-        CLUSTER_STATE_NODE_DETAIL("/admin/cluster/node/*"),
-        CLUSTER_STATE_CC_DETAIL("/admin/cluster/cc/*"),
-        DIAGNOSTICS("/admin/diagnostics");
-
-        private final String path;
-
-        Lets(String path) {
-            this.path = path;
-        }
-
-        public String getPath() {
-            return path;
-        }
-
-    }
-
-    private LetUtil() {
-        throw new AssertionError("No objects of this class should be created.");
-    }
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/Servlets.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/Servlets.java
new file mode 100644
index 0000000..5ffb334
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/Servlets.java
@@ -0,0 +1,44 @@
+/*
+ * 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.common.utils;
+
+public class Servlets {
+
+    public static final String AQL = "/aql";
+    public static final String AQL_QUERY = "/query";
+    public static final String AQL_UPDATE = "/update";
+    public static final String AQL_DDL = "/ddl";
+    public static final String SQLPP = "/sqlpp";
+    public static final String SQLPP_QUERY = "/query/sqlpp";
+    public static final String SQLPP_UPDATE = "/update/sqlpp";
+    public static final String SQLPP_DDL = "/ddl/sqlpp";
+    public static final String QUERY_STATUS = "/query/status";
+    public static final String QUERY_RESULT = "/query/result";
+    public static final String QUERY_SERVICE = "/query/service";
+    public static final String CONNECTOR = "/connector";
+    public static final String SHUTDOWN = "/admin/shutdown";
+    public static final String VERSION = "/admin/version";
+    public static final String CLUSTER_STATE = "/admin/cluster/*";
+    public static final String CLUSTER_STATE_NODE_DETAIL = "/admin/cluster/node/*";
+    public static final String CLUSTER_STATE_CC_DETAIL = "/admin/cluster/cc/*";
+    public static final String DIAGNOSTICS = "/admin/diagnostics";
+
+    private Servlets() {
+    }
+}
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java
index b5fbcf5..288a739 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java
@@ -51,7 +51,7 @@
 import java.util.regex.Pattern;
 
 import org.apache.asterix.common.config.GlobalConfig;
-import org.apache.asterix.common.utils.LetUtil.Lets;
+import org.apache.asterix.common.utils.Servlets;
 import org.apache.asterix.test.base.ComparisonException;
 import org.apache.asterix.test.server.ITestServer;
 import org.apache.asterix.test.server.TestServerProvider;
@@ -93,14 +93,15 @@
     // see
     // https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers/417184
     private static final long MAX_URL_LENGTH = 2000l;
-    private static final Pattern JAVA_BLOCK_COMMENT_PATTERN = Pattern.compile("/\\*.*\\*/",
-            Pattern.MULTILINE | Pattern.DOTALL);
+    private static final Pattern JAVA_BLOCK_COMMENT_PATTERN =
+            Pattern.compile("/\\*.*\\*/", Pattern.MULTILINE | Pattern.DOTALL);
     private static final Pattern JAVA_LINE_COMMENT_PATTERN = Pattern.compile("//.*$", Pattern.MULTILINE);
     private static final Pattern SHELL_LINE_COMMENT_PATTERN = Pattern.compile("#.*$", Pattern.MULTILINE);
     private static final Pattern REGEX_LINES_PATTERN = Pattern.compile("^(-)?/(.*)/([im]*)$");
-    private static final Pattern POLL_TIMEOUT_PATTERN = Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)",
-            Pattern.MULTILINE);
-    private static final Pattern POLL_DELAY_PATTERN = Pattern.compile("polldelaysecs=(\\d+)(\\D|$)", Pattern.MULTILINE);
+    private static final Pattern POLL_TIMEOUT_PATTERN =
+            Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)", Pattern.MULTILINE);
+    private static final Pattern POLL_DELAY_PATTERN =
+            Pattern.compile("polldelaysecs=(\\d+)(\\D|$)", Pattern.MULTILINE);
     private static final Pattern HANDLE_VARIABLE_PATTERN = Pattern.compile("handlevariable=(\\w+)");
     private static final Pattern VARIABLE_REF_PATTERN = Pattern.compile("\\$(\\w+)");
 
@@ -150,10 +151,10 @@
     public void runScriptAndCompareWithResult(File scriptFile, PrintWriter print, File expectedFile, File actualFile)
             throws Exception {
         System.err.println("Expected results file: " + expectedFile.toString());
-        BufferedReader readerExpected = new BufferedReader(
-                new InputStreamReader(new FileInputStream(expectedFile), "UTF-8"));
-        BufferedReader readerActual = new BufferedReader(
-                new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
+        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 {
             if (actualFile.toString().endsWith(".regex")) {
@@ -332,10 +333,10 @@
             throws Exception {
         System.err.println("Expected results file: " + expectedFile.toString());
         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"))) {
+        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');
@@ -489,8 +490,8 @@
         return params;
     }
 
-    private HttpUriRequest constructHttpMethod(String statement, URI uri, String stmtParam,
-            boolean postStmtAsParam, List<CompilationUnit.Parameter> otherParams) throws URISyntaxException {
+    private HttpUriRequest constructHttpMethod(String statement, URI uri, String stmtParam, boolean postStmtAsParam,
+            List<CompilationUnit.Parameter> otherParams) throws URISyntaxException {
         if (statement.length() + uri.toString().length() < MAX_URL_LENGTH) {
             // Use GET for small-ish queries
             return constructGetMethod(uri, injectStatement(statement, stmtParam, otherParams));
@@ -510,8 +511,7 @@
         return builder.build();
     }
 
-    private HttpUriRequest constructGetMethod(URI endpoint, OutputFormat fmt,
-            List<CompilationUnit.Parameter> params) {
+    private HttpUriRequest constructGetMethod(URI endpoint, OutputFormat fmt, List<CompilationUnit.Parameter> params) {
         HttpUriRequest method = constructGetMethod(endpoint, params);
         // Set accepted output response type
         method.setHeader("Accept", fmt.mimeType());
@@ -527,8 +527,7 @@
         return builder.build();
     }
 
-    private HttpUriRequest constructPostMethod(URI uri, OutputFormat fmt,
-            List<CompilationUnit.Parameter> params) {
+    private HttpUriRequest constructPostMethod(URI uri, OutputFormat fmt, List<CompilationUnit.Parameter> params) {
         HttpUriRequest method = constructPostMethod(uri, params);
         // Set accepted output response type
         method.setHeader("Accept", fmt.mimeType());
@@ -587,8 +586,8 @@
     // Insert and Delete statements are executed here
     public void executeUpdate(String str, URI uri) throws Exception {
         // Create a method instance.
-        HttpUriRequest request = RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8))
-                .build();
+        HttpUriRequest request =
+                RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8)).build();
 
         // Execute the method.
         executeAndCheckHttpRequest(request);
@@ -598,10 +597,10 @@
     public InputStream executeAnyAQLAsync(String statement, boolean defer, OutputFormat fmt, URI uri,
             Map<String, Object> variableCtx) throws Exception {
         // Create a method instance.
-        HttpUriRequest request = RequestBuilder.post(uri)
-                .addParameter("mode", defer ? "asynchronous-deferred" : "asynchronous")
-                .setEntity(new StringEntity(statement, StandardCharsets.UTF_8)).setHeader("Accept", fmt.mimeType())
-                .build();
+        HttpUriRequest request =
+                RequestBuilder.post(uri).addParameter("mode", defer ? "asynchronous-deferred" : "asynchronous")
+                        .setEntity(new StringEntity(statement, StandardCharsets.UTF_8))
+                        .setHeader("Accept", fmt.mimeType()).build();
 
         String handleVar = getHandleVariable(statement);
 
@@ -624,8 +623,8 @@
     // create function statement
     public void executeDDL(String str, URI uri) throws Exception {
         // Create a method instance.
-        HttpUriRequest request = RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8))
-                .build();
+        HttpUriRequest request =
+                RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8)).build();
 
         // Execute the method.
         executeAndCheckHttpRequest(request);
@@ -635,8 +634,8 @@
     // 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), StandardCharsets.UTF_8));
         String line;
         StringBuilder stringBuilder = new StringBuilder();
         String ls = System.getProperty("line.separator");
@@ -691,26 +690,26 @@
 
     private static String getProcessOutput(Process p) throws Exception {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Future<Integer> future = Executors.newSingleThreadExecutor().submit(() -> IOUtils.copy(p.getInputStream(),
-                new OutputStream() {
-            @Override
-            public void write(int b) throws IOException {
-                baos.write(b);
-                System.out.write(b);
-            }
+        Future<Integer> future =
+                Executors.newSingleThreadExecutor().submit(() -> IOUtils.copy(p.getInputStream(), new OutputStream() {
+                    @Override
+                    public void write(int b) throws IOException {
+                        baos.write(b);
+                        System.out.write(b);
+                    }
 
-            @Override
-            public void flush() throws IOException {
-                baos.flush();
-                System.out.flush();
-            }
+                    @Override
+                    public void flush() throws IOException {
+                        baos.flush();
+                        System.out.flush();
+                    }
 
-            @Override
-            public void close() throws IOException {
-                baos.close();
-                System.out.close();
-            }
-        }));
+                    @Override
+                    public void close() throws IOException {
+                        baos.close();
+                        System.out.close();
+                    }
+                }));
         p.waitFor();
         future.get();
         ByteArrayInputStream bisIn = new ByteArrayInputStream(baos.toByteArray());
@@ -722,10 +721,8 @@
         StringBuffer stdOut = writerIn.getBuffer();
         if (writerErr.getBuffer().length() > 0) {
             StringBuilder sbErr = new StringBuilder();
-            sbErr.append("script execution failed - error message:\n" +
-                    "-------------------------------------------\n" +
-                    "stdout: ").append(stdOut)
-                    .append("\nstderr: ").append(writerErr.getBuffer())
+            sbErr.append("script execution failed - error message:\n" + "-------------------------------------------\n"
+                    + "stdout: ").append(stdOut).append("\nstderr: ").append(writerErr.getBuffer())
                     .append("-------------------------------------------");
             LOGGER.info(sbErr.toString());
             throw new Exception(sbErr.toString());
@@ -748,9 +745,10 @@
         switch (ctx.getType()) {
             case "ddl":
                 if (ctx.getFile().getName().endsWith("aql")) {
-                    executeDDL(statement, getEndpoint(Lets.AQL_DDL));
+                    executeDDL(statement, getEndpoint(Servlets.AQL_DDL));
                 } else {
-                    InputStream resultStream = executeQueryService(statement, getEndpoint(Lets.QUERY_SERVICE));
+                    InputStream resultStream =
+                            executeQueryService(statement, getEndpoint(Servlets.QUERY_SERVICE));
                     ResultExtractor.extract(resultStream);
                 }
                 break;
@@ -760,9 +758,10 @@
                     statement = statement.replaceAll("nc1://", "127.0.0.1://../../../../../../asterix-app/");
                 }
                 if (ctx.getFile().getName().endsWith("aql")) {
-                    executeUpdate(statement, getEndpoint(Lets.AQL_UPDATE));
+                    executeUpdate(statement, getEndpoint(Servlets.AQL_UPDATE));
                 } else {
-                    InputStream resultStream = executeQueryService(statement, getEndpoint(Lets.QUERY_SERVICE));
+                    InputStream resultStream =
+                            executeQueryService(statement, getEndpoint(Servlets.QUERY_SERVICE));
                     ResultExtractor.extract(resultStream);
                 }
                 break;
@@ -778,8 +777,8 @@
                 LOGGER.fine("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay");
                 while (true) {
                     try {
-                        executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit, queryCount,
-                                expectedResultFileCtxs, testFile, actualPath);
+                        executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit,
+                                queryCount, expectedResultFileCtxs, testFile, actualPath);
                         finalException = null;
                         break;
                     } catch (Exception e) {
@@ -812,15 +811,16 @@
                 final List<CompilationUnit.Parameter> params = cUnit.getParameter();
                 if (ctx.getFile().getName().endsWith("aql")) {
                     if (reqType.equalsIgnoreCase("query")) {
-                        resultStream = executeQuery(statement, fmt, getEndpoint(Lets.AQL_QUERY), params);
+                        resultStream = executeQuery(statement, fmt, getEndpoint(Servlets.AQL_QUERY), params);
                     } else {
-                        final URI endpoint = getEndpoint(Lets.AQL);
+                        final URI endpoint = getEndpoint(Servlets.AQL);
                         if (reqType.equalsIgnoreCase("async")) {
                             resultStream = executeAnyAQLAsync(statement, false, fmt, endpoint, variableCtx);
                         } else if (reqType.equalsIgnoreCase("deferred")) {
                             resultStream = executeAnyAQLAsync(statement, true, fmt, endpoint, variableCtx);
                         }
-                        Assert.assertNotNull("no handle for " + reqType + " test " + testFile.toString(), resultStream);
+                        Assert.assertNotNull("no handle for " + reqType + " test " + testFile.toString(),
+                                resultStream);
                     }
                 } else {
                     String delivery = DELIVERY_IMMEDIATE;
@@ -829,7 +829,7 @@
                     } else if (reqType.equalsIgnoreCase("deferred")) {
                         delivery = DELIVERY_DEFERRED;
                     }
-                    final URI uri = getEndpoint(Lets.QUERY_SERVICE);
+                    final URI uri = getEndpoint(Servlets.QUERY_SERVICE);
                     if (DELIVERY_IMMEDIATE.equals(delivery)) {
                         resultStream = executeQueryService(statement, fmt, uri, params, true);
                         resultStream = ResultExtractor.extract(resultStream);
@@ -848,8 +848,8 @@
                 }
                 expectedResultFile = expectedResultFileCtxs.get(queryCount.intValue()).getFile();
 
-                File actualResultFile = testCaseCtx.getActualResultFile(cUnit, expectedResultFile,
-                        new File(actualPath));
+                File actualResultFile =
+                        testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath));
                 writeOutputToFile(actualResultFile, resultStream);
 
                 runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), expectedResultFile,
@@ -864,13 +864,13 @@
                 break;
             case "txnqbc": // qbc represents query before crash
                 resultStream = executeQuery(statement, OutputFormat.forCompilationUnit(cUnit),
-                        getEndpoint(Lets.AQL_QUERY), cUnit.getParameter());
+                        getEndpoint(Servlets.AQL_QUERY), cUnit.getParameter());
                 qbcFile = getTestCaseQueryBeforeCrashFile(actualPath, testCaseCtx, cUnit);
                 writeOutputToFile(qbcFile, resultStream);
                 break;
             case "txnqar": // qar represents query after recovery
                 resultStream = executeQuery(statement, OutputFormat.forCompilationUnit(cUnit),
-                        getEndpoint(Lets.AQL_QUERY), cUnit.getParameter());
+                        getEndpoint(Servlets.AQL_QUERY), cUnit.getParameter());
                 File qarFile = new File(actualPath + File.separator
                         + testCaseCtx.getTestCase().getFilePath().replace(File.separator, "_") + "_" + cUnit.getName()
                         + "_qar.adm");
@@ -880,7 +880,7 @@
                 break;
             case "txneu": // eu represents erroneous update
                 try {
-                    executeUpdate(statement, getEndpoint(Lets.AQL_UPDATE));
+                    executeUpdate(statement, getEndpoint(Servlets.AQL_UPDATE));
                 } catch (Exception e) {
                     // An exception is expected.
                     failed = true;
@@ -908,7 +908,7 @@
                 break;
             case "errddl": // a ddlquery that expects error
                 try {
-                    executeDDL(statement, getEndpoint(Lets.AQL_DDL));
+                    executeDDL(statement, getEndpoint(Servlets.AQL_DDL));
                 } catch (Exception e) {
                     // expected error happens
                     failed = true;
@@ -1007,7 +1007,7 @@
                 }
                 break;
             case "lib": // expected format <dataverse-name> <library-name>
-                        // <library-directory>
+                            // <library-directory>
                         // TODO: make this case work well with entity names containing spaces by
                         // looking for \"
                 lines = statement.split("\n");
@@ -1176,15 +1176,11 @@
     private static File getTestCaseQueryBeforeCrashFile(String actualPath, TestCaseContext testCaseCtx,
             CompilationUnit cUnit) {
         return new File(
-                actualPath + File.separator + testCaseCtx.getTestCase().getFilePath().replace(File.separator, "_") + "_"
-                        + cUnit.getName() + "_qbc.adm");
+                actualPath + File.separator + testCaseCtx.getTestCase().getFilePath().replace(File.separator, "_")
+                        + "_" + cUnit.getName() + "_qbc.adm");
     }
 
-    protected String getPath(Lets servlet) {
-        return servlet.getPath();
-    }
-
-    protected URI getEndpoint(Lets servlet) throws URISyntaxException {
+    protected URI getEndpoint(String servlet) throws URISyntaxException {
         return new URI("http", null, host, port, getPath(servlet).replaceAll("/\\*$", ""), null, null);
     }
 
@@ -1201,10 +1197,11 @@
         try {
             ArrayList<String> toBeDropped = new ArrayList<>();
             InputStream resultStream = executeQueryService("select dv.DataverseName from Metadata.`Dataverse` as dv;",
-                    getEndpoint(Lets.QUERY_SERVICE));
+                    getEndpoint(Servlets.QUERY_SERVICE));
             String out = IOUtils.toString(resultStream);
             ObjectMapper om = new ObjectMapper();
-            om.setConfig(om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT));
+            om.setConfig(
+                    om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT));
             JsonNode result;
             try {
                 result = om.readValue(out, ObjectNode.class).get("results");
@@ -1230,7 +1227,8 @@
                     dropStatement.append(dv);
                     dropStatement.append(";\n");
                 }
-                resultStream = executeQueryService(dropStatement.toString(), getEndpoint(Lets.QUERY_SERVICE));
+                resultStream =
+                        executeQueryService(dropStatement.toString(), getEndpoint(Servlets.QUERY_SERVICE));
                 ResultExtractor.extract(resultStream);
             }
         } catch (Throwable th) {
@@ -1239,4 +1237,9 @@
         }
     }
 
+    //This method is here to enable extension
+    protected String getPath(String servlet) {
+        return servlet;
+    }
+
 }
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 6d8e2f2..2cf47f9 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
@@ -31,7 +31,7 @@
 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.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import com.rometools.rome.feed.synd.SyndContent;
 import com.rometools.rome.feed.synd.SyndContentImpl;
@@ -67,7 +67,7 @@
             String feedType = req.getParameter(FEED_TYPE);
             feedType = (feedType != null) ? feedType : defaultFeedType;
             feed.setFeedType(feedType);
-            ServletUtils.setContentType(res, MIME_TYPE);
+            HttpUtil.setContentType(res, MIME_TYPE);
             SyndFeedOutput output = new SyndFeedOutput();
             output.output(feed, res.writer());
         } catch (FeedException | ParseException ex) {
@@ -99,7 +99,7 @@
         feed.setLink("http://rome.dev.java.net");
         feed.setDescription("This feed has been created using ROME (Java syndication utilities");
 
-        List<SyndEntry> entries = new ArrayList<SyndEntry>();
+        List<SyndEntry> entries = new ArrayList<>();
         SyndEntry entry;
         SyndContent description;
 
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java
index f40999b..6db7d6e 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSTestServer.java
@@ -28,7 +28,7 @@
     public RSSTestServer(int port) {
         webManager = new WebManager();
         HttpServer rssServer = new HttpServer(webManager.getBosses(), webManager.getWorkers(), port);
-        rssServer.addLet(new RSSFeedServlet(null, new String[] { "/" }));
+        rssServer.addServlet(new RSSFeedServlet(null, new String[] { "/" }));
         webManager.add(rssServer);
     }
 
diff --git a/asterixdb/asterix-server/pom.xml b/asterixdb/asterix-server/pom.xml
index 7d74903..1e1e47b 100644
--- a/asterixdb/asterix-server/pom.xml
+++ b/asterixdb/asterix-server/pom.xml
@@ -535,11 +535,6 @@
       <artifactId>commons-io</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
index 175ecc4..7ac4669 100644
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
@@ -28,7 +28,7 @@
 import java.net.URL;
 import java.util.Collections;
 
-import org.apache.asterix.common.utils.LetUtil.Lets;
+import org.apache.asterix.common.utils.Servlets;
 import org.apache.asterix.test.aql.TestExecutor;
 import org.apache.asterix.test.base.TestMethodTracer;
 import org.apache.asterix.test.common.TestHelper;
@@ -90,7 +90,7 @@
     public void test1_sanityQuery() throws Exception {
         TestExecutor testExecutor = new TestExecutor();
         InputStream resultStream = testExecutor.executeQuery("1+1", OutputFormat.ADM,
-                new URI("http", null, "127.0.0.1", 19002, Lets.AQL_QUERY.getPath(), null, null),
+                new URI("http", null, "127.0.0.1", 19002, Servlets.AQL_QUERY, null, null),
                 Collections.emptyList());
         StringWriter sw = new StringWriter();
         IOUtils.copy(resultStream, sw);
@@ -99,8 +99,8 @@
 
     @Test
     public void test2_stopCluster() throws Exception {
-        Process process = new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh"))
-                .inheritIO().start();
+        Process process =
+                new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh")).inheritIO().start();
         Assert.assertEquals(0, process.waitFor());
         try {
             new URL("http://127.0.0.1:19002").openConnection().connect();
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServlet.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServlet.java
index b079d36..157eef5 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServlet.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServlet.java
@@ -21,60 +21,12 @@
 import java.util.concurrent.ConcurrentMap;
 
 /**
- * Represents a component that handles IServLet requests
+ * Represents a component that handles IServlet requests
  */
 public interface IServlet {
 
-    public class Encoding {
-        public static final String UTF8 = "utf-8";
-
-        private Encoding() {
-        }
-    }
-
-    public class ContentType {
-        public static final String APPLICATION_ADM = "application/x-adm";
-        public static final String APPLICATION_JSON = "application/json";
-        public static final String CSV = "text/csv";
-        public static final String IMG_PNG = "image/png";
-        public static final String TEXT_HTML = "text/html";
-        public static final String TEXT_PLAIN = "text/plain";
-
-        private ContentType() {
-        }
-
-        /**
-         * Get the mime string representation from the extension
-         * @param extension
-         * @return
-         */
-        public static String mime(String extension) {
-            switch (extension) {
-                case ".png":
-                    return "image/png";
-                case ".eot":
-                    return "application/vnd.ms-fontobject";
-                case ".svg":
-                    return "image/svg+xml\t";
-                case ".ttf":
-                    return "application/x-font-ttf";
-                case ".woff":
-                case ".woff2":
-                    return "application/x-font-woff";
-                case ".html":
-                    return "text/html";
-                case ".css":
-                    return "text/css";
-                case ".js":
-                    return "application/javascript";
-                default:
-                    return null;
-            }
-        }
-    }
-
     /**
-     * @return an array of paths associated with this IServLet
+     * @return an array of paths associated with this IServlet
      */
     String[] getPaths();
 
@@ -84,7 +36,8 @@
     ConcurrentMap<String, Object> ctx();
 
     /**
-     * handle the IServLetRequest writing the response in the passed IServLetResponse
+     * handle the IServletRequest writing the response in the passed IServletResponse
+     *
      * @param request
      * @param response
      */
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/GetRequest.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/GetRequest.java
index 8d308d3..e666c0a 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/GetRequest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/GetRequest.java
@@ -22,7 +22,7 @@
 import java.util.Map;
 
 import org.apache.hyracks.http.api.IServletRequest;
-import org.apache.hyracks.http.server.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import io.netty.handler.codec.http.FullHttpRequest;
 
@@ -42,7 +42,7 @@
 
     @Override
     public String getParameter(CharSequence name) {
-        return ServletUtils.getParameter(parameters, name);
+        return HttpUtil.getParameter(parameters, name);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
index 302e5f3..ad8ff41 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
@@ -55,7 +55,7 @@
     private final Object lock = new Object();
     private final AtomicInteger threadId = new AtomicInteger();
     private final ConcurrentMap<String, Object> ctx;
-    private final List<IServlet> lets;
+    private final List<IServlet> servlets;
     private final EventLoopGroup bossGroup;
     private final EventLoopGroup workerGroup;
     private final int port;
@@ -70,7 +70,7 @@
         this.workerGroup = workerGroup;
         this.port = port;
         ctx = new ConcurrentHashMap<>();
-        lets = new ArrayList<>();
+        servlets = new ArrayList<>();
         executor = Executors.newFixedThreadPool(16,
                 runnable -> new Thread(runnable, "HttpExecutor(port:" + port + ")-" + threadId.getAndIncrement()));
     }
@@ -166,22 +166,22 @@
         return ctx;
     }
 
-    public void addLet(IServlet let) {
-        lets.add(let);
+    public void addServlet(IServlet let) {
+        servlets.add(let);
     }
 
     protected void doStart() throws InterruptedException {
         /*
-         * This is a hacky way to ensure that ILets with more specific paths are checked first.
+         * This is a hacky way to ensure that IServlets with more specific paths are checked first.
          * For example:
          * "/path/to/resource/"
          * is checked before
          * "/path/to/"
          * which in turn is checked before
          * "/path/"
-         * Note that it doesn't work for the case where multiple paths map to a single ILet
+         * Note that it doesn't work for the case where multiple paths map to a single IServlet
          */
-        Collections.sort(lets, (l1, l2) -> l2.getPaths()[0].length() - l1.getPaths()[0].length());
+        Collections.sort(servlets, (l1, l2) -> l2.getPaths()[0].length() - l1.getPaths()[0].length());
         ServerBootstrap b = new ServerBootstrap();
         b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
                 .childOption(ChannelOption.WRITE_BUFFER_WATER_MARK,
@@ -201,7 +201,7 @@
         if (i >= 0) {
             uri = uri.substring(0, i);
         }
-        for (IServlet let : lets) {
+        for (IServlet let : servlets) {
             for (String path : let.getPaths()) {
                 if (match(path, uri)) {
                     return let;
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
index 2268c2c..e23ede4 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
@@ -22,7 +22,7 @@
 import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServlet;
-import org.apache.hyracks.http.server.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import io.netty.channel.ChannelFutureListener;
 import io.netty.channel.ChannelHandlerContext;
@@ -71,7 +71,7 @@
                         new DefaultHttpResponse(request.protocolVersion(), HttpResponseStatus.METHOD_NOT_ALLOWED);
                 ctx.write(notAllowed).addListener(ChannelFutureListener.CLOSE);
             } else {
-                handler = new HttpRequestHandler(ctx, servlet, ServletUtils.toServletRequest(request), chunkSize);
+                handler = new HttpRequestHandler(ctx, servlet, HttpUtil.toServletRequest(request), chunkSize);
                 server.getExecutor().submit(handler);
             }
         } catch (Exception e) {
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/PostRequest.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/PostRequest.java
index 338ef40..29cfd89 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/PostRequest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/PostRequest.java
@@ -22,7 +22,7 @@
 import java.util.Map;
 
 import org.apache.hyracks.http.api.IServletRequest;
-import org.apache.hyracks.http.server.util.ServletUtils;
+import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import io.netty.handler.codec.http.FullHttpRequest;
 
@@ -52,7 +52,7 @@
                 return values.get(i);
             }
         }
-        return ServletUtils.getParameter(parameters, name);
+        return HttpUtil.getParameter(parameters, name);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/util/ServletUtils.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
similarity index 70%
rename from hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/util/ServletUtils.java
rename to hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
index 1ffab6d..aa9ebc5 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/util/ServletUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.hyracks.http.server.util;
+package org.apache.hyracks.http.server.utils;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -40,10 +40,29 @@
 import io.netty.handler.codec.http.multipart.InterfaceHttpData.HttpDataType;
 import io.netty.handler.codec.http.multipart.MixedAttribute;
 
-public class ServletUtils {
-    private static final Logger LOGGER = Logger.getLogger(ServletUtils.class.getName());
+public class HttpUtil {
+    private static final Logger LOGGER = Logger.getLogger(HttpUtil.class.getName());
 
-    private ServletUtils() {
+    private HttpUtil() {
+    }
+
+    public static class Encoding {
+        public static final String UTF8 = "utf-8";
+
+        private Encoding() {
+        }
+    }
+
+    public static class ContentType {
+        public static final String APPLICATION_ADM = "application/x-adm";
+        public static final String APPLICATION_JSON = "application/json";
+        public static final String CSV = "text/csv";
+        public static final String IMG_PNG = "image/png";
+        public static final String TEXT_HTML = "text/html";
+        public static final String TEXT_PLAIN = "text/plain";
+
+        private ContentType() {
+        }
     }
 
     public static String getParameter(Map<String, List<String>> parameters, CharSequence name) {
@@ -94,7 +113,7 @@
     }
 
     public static IServletRequest toServletRequest(FullHttpRequest request) throws IOException {
-        return request.method() == HttpMethod.GET ? ServletUtils.get(request) : ServletUtils.post(request);
+        return request.method() == HttpMethod.GET ? HttpUtil.get(request) : HttpUtil.post(request);
     }
 
     public static void setContentType(IServletResponse response, String type, String charset) throws IOException {
@@ -104,4 +123,34 @@
     public static void setContentType(IServletResponse response, String type) throws IOException {
         response.setHeader(HttpHeaderNames.CONTENT_TYPE, type);
     }
+
+    /**
+     * Get the mime string representation from the extension
+     *
+     * @param extension
+     * @return
+     */
+    public static String mime(String extension) {
+        switch (extension) {
+            case ".png":
+                return "image/png";
+            case ".eot":
+                return "application/vnd.ms-fontobject";
+            case ".svg":
+                return "image/svg+xml\t";
+            case ".ttf":
+                return "application/x-font-ttf";
+            case ".woff":
+            case ".woff2":
+                return "application/x-font-woff";
+            case ".html":
+                return "text/html";
+            case ".css":
+                return "text/css";
+            case ".js":
+                return "application/javascript";
+            default:
+                return null;
+        }
+    }
 }
