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 eafe312..c2b44c9 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
@@ -136,7 +136,7 @@
     }
 
     protected Predicate<IOption> getConfigSelector() {
-        return option -> option != ControllerConfig.Option.CONFIG_FILE
+        return option -> !option.hidden() && option != ControllerConfig.Option.CONFIG_FILE
                 && option != ControllerConfig.Option.CONFIG_FILE_URL;
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
index 5eba31d..aacad8e 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
@@ -33,12 +33,12 @@
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.api.ThreadExecutor;
 import org.apache.asterix.common.cluster.ClusterPartition;
+import org.apache.asterix.common.config.ActiveProperties;
 import org.apache.asterix.common.config.AsterixExtension;
 import org.apache.asterix.common.config.BuildProperties;
 import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.asterix.common.config.ExtensionProperties;
 import org.apache.asterix.common.config.ExternalProperties;
-import org.apache.asterix.common.config.FeedProperties;
 import org.apache.asterix.common.config.MessagingProperties;
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.config.NodeProperties;
@@ -110,7 +110,7 @@
     private MetadataProperties metadataProperties;
     private StorageProperties storageProperties;
     private TransactionProperties txnProperties;
-    private FeedProperties feedProperties;
+    private ActiveProperties activeProperties;
     private BuildProperties buildProperties;
     private ReplicationProperties replicationProperties;
     private MessagingProperties messagingProperties;
@@ -148,7 +148,7 @@
         metadataProperties = new MetadataProperties(propertiesAccessor);
         storageProperties = new StorageProperties(propertiesAccessor);
         txnProperties = new TransactionProperties(propertiesAccessor);
-        feedProperties = new FeedProperties(propertiesAccessor);
+        activeProperties = new ActiveProperties(propertiesAccessor);
         buildProperties = new BuildProperties(propertiesAccessor);
         replicationProperties = new ReplicationProperties(propertiesAccessor);
         messagingProperties = new MessagingProperties(propertiesAccessor);
@@ -206,7 +206,7 @@
         isShuttingdown = false;
 
         activeManager = new ActiveManager(threadExecutor, ncApplicationContext.getNodeId(),
-                feedProperties.getMemoryComponentGlobalBudget(), compilerProperties.getFrameSize());
+                activeProperties.getMemoryComponentGlobalBudget(), compilerProperties.getFrameSize());
 
         if (replicationProperties.isParticipant(ncApplicationContext.getNodeId())) {
             String nodeId = ncApplicationContext.getNodeId();
@@ -364,8 +364,8 @@
     }
 
     @Override
-    public FeedProperties getFeedProperties() {
-        return feedProperties;
+    public ActiveProperties getActiveProperties() {
+        return activeProperties;
     }
 
     @Override
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ApplicationEntryPointHelper.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ApplicationEntryPointHelper.java
new file mode 100644
index 0000000..8c3861a
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ApplicationEntryPointHelper.java
@@ -0,0 +1,39 @@
+/*
+ * 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.hyracks.bootstrap;
+
+import org.apache.asterix.common.config.AsterixProperties;
+import org.apache.hyracks.api.config.IConfigManager;
+import org.apache.hyracks.control.common.controllers.CCConfig;
+import org.apache.hyracks.control.common.controllers.ControllerConfig;
+import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.util.file.FileUtil;
+
+class ApplicationEntryPointHelper {
+    private ApplicationEntryPointHelper() {
+    }
+
+    static void registerConfigOptions(IConfigManager configManager) {
+        AsterixProperties.registerConfigOptions(configManager);
+
+        ControllerConfig.defaultDir = FileUtil.joinPath(System.getProperty("java.io.tmpdir"), "asterixdb");
+        NCConfig.defaultAppClass = NCApplicationEntryPoint.class.getName();
+        CCConfig.defaultAppClass = CCApplicationEntryPoint.class.getName();
+    }
+}
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 54f2c06..b63bb31 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
@@ -52,7 +52,6 @@
 import org.apache.asterix.app.replication.FaultToleranceStrategyFactory;
 import org.apache.asterix.common.api.AsterixThreadFactory;
 import org.apache.asterix.common.config.AsterixExtension;
-import org.apache.asterix.common.config.AsterixProperties;
 import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.ExternalProperties;
 import org.apache.asterix.common.config.MetadataProperties;
@@ -83,7 +82,6 @@
 import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.server.HttpServer;
 import org.apache.hyracks.http.server.WebManager;
-import org.apache.hyracks.util.file.FileUtil;
 
 public class CCApplicationEntryPoint extends org.apache.hyracks.control.cc.CCApplicationEntryPoint {
 
@@ -95,10 +93,6 @@
     private IJobCapacityController jobCapacityController;
     protected WebManager webManager;
 
-    public CCApplicationEntryPoint() {
-        CCConfig.defaultDir = FileUtil.joinPath(System.getProperty("java.io.tmpdir"), "asterixdb");
-    }
-
     @Override
     public void start(ICCApplicationContext ccAppCtx, String[] args) throws Exception {
         if (args.length > 0) {
@@ -237,7 +231,7 @@
 
     protected HttpServer setupFeedServer(ExternalProperties externalProperties) throws Exception {
         HttpServer feedServer = new HttpServer(webManager.getBosses(), webManager.getWorkers(),
-                externalProperties.getFeedServerPort());
+                externalProperties.getActiveServerPort());
         feedServer.setAttribute(HYRACKS_CONNECTION_ATTR, getNewHyracksClientConnection());
         feedServer.addServlet(new FeedServlet(feedServer.ctx(), new String[] { "/" }));
         return feedServer;
@@ -313,7 +307,7 @@
     @Override
     public void registerConfig(IConfigManager configManager) {
         super.registerConfig(configManager);
-        AsterixProperties.registerConfigOptions(configManager);
+        ApplicationEntryPointHelper.registerConfigOptions(configManager);
     }
 
     public static synchronized void setAsterixStateProxy(IAsterixStateProxy proxy) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplicationEntryPoint.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplicationEntryPoint.java
index 238e93c..07a9a61 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplicationEntryPoint.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplicationEntryPoint.java
@@ -30,7 +30,6 @@
 import org.apache.asterix.common.api.AsterixThreadFactory;
 import org.apache.asterix.common.api.IAppRuntimeContext;
 import org.apache.asterix.common.config.AsterixExtension;
-import org.apache.asterix.common.config.AsterixProperties;
 import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.IPropertiesProvider;
 import org.apache.asterix.common.config.MessagingProperties;
@@ -54,7 +53,6 @@
 import org.apache.hyracks.api.messages.IMessageBroker;
 import org.apache.hyracks.control.common.controllers.NCConfig;
 import org.apache.hyracks.control.nc.NodeControllerService;
-import org.apache.hyracks.util.file.FileUtil;
 
 public class NCApplicationEntryPoint extends org.apache.hyracks.control.nc.NCApplicationEntryPoint {
     private static final Logger LOGGER = Logger.getLogger(NCApplicationEntryPoint.class.getName());
@@ -65,15 +63,10 @@
     private boolean stopInitiated = false;
     private SystemState systemState;
 
-    public NCApplicationEntryPoint() {
-        NCConfig.defaultDir = FileUtil.joinPath(System.getProperty("java.io.tmpdir"), "asterixdb");
-        NCConfig.defaultAppClass = "org.apache.asterix.hyracks.bootstrap.NCApplicationEntryPoint";
-    }
-
     @Override
     public void registerConfigOptions(IConfigManager configManager) {
         super.registerConfigOptions(configManager);
-        AsterixProperties.registerConfigOptions(configManager);
+        ApplicationEntryPointHelper.registerConfigOptions(configManager);
     }
 
     @Override
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
index b96b7fe..9cd961a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
@@ -24,102 +24,167 @@
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.EnumMap;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 import org.apache.asterix.hyracks.bootstrap.CCApplicationEntryPoint;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.control.common.config.ConfigManager;
+import org.apache.hyracks.control.common.controllers.ControllerConfig;
 import org.apache.hyracks.util.file.FileUtil;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
 @RunWith(JUnit4.class)
 public class ConfigUsageTest {
+    private ConfigManager configManager;
+    final EnumMap<Column, Integer> maxWidths = new EnumMap<>(Column.class);
+
+    enum Column {
+        SECTION,
+        PARAMETER,
+        MEANING,
+        DEFAULT
+    }
 
     private static final String CSV_FILE = FileUtil.joinPath("target", "surefire-reports", "config-options.csv");
 
+    @Before
+    public void setup() {
+        configManager = getConfigManager();
+    }
+
     @Test
     public void generateUsage() {
-        generateUsage("| ", " | ", " |", true, System.err);
+        final EnumMap<Column, Boolean> align = new EnumMap<>(Column.class);
+        align.put(Column.SECTION, true);
+        align.put(Column.PARAMETER, true);
+        System.err.println();
+        generateUsage("| ", " | ", " |", align, System.err);
     }
 
     @Test
     public void generateUsageCSV() throws IOException {
         new File(CSV_FILE).getParentFile().mkdirs();
         try (final PrintStream output = new PrintStream(new FileOutputStream(CSV_FILE))) {
-            generateUsage("\"", "\",\"", "\"", false, output);
+            generateUsage("\"", "\",\"", "\"", new EnumMap<>(Column.class), output);
             // TODO(mblow): add some validation (in addition to just ensuring no exceptions...)
         }
     }
 
-    public void generateUsage(String startDelim, String midDelim, String endDelim, boolean align, PrintStream output) {
+    protected ConfigManager getConfigManager() {
         ConfigManager configManager = new ConfigManager();
         CCApplicationEntryPoint aep = new CCApplicationEntryPoint();
         aep.registerConfig(configManager);
+        ControllerConfig.defaultDir = ControllerConfig.defaultDir.replace(System.getProperty("java.io.tmpdir"),
+                "${java.io.tmpdir}/");
+        return configManager;
+    }
+
+    protected Set<Section> getSections(ConfigManager configManager) {
+        TreeSet<Section> sections = new TreeSet<>(Comparator.comparing(Section::sectionName));
+        sections.addAll(configManager.getSections());
+        sections.remove(Section.LOCALNC);
+        return sections;
+    }
+
+    protected Predicate<IOption> optionSelector() {
+        return o -> !o.hidden() && o != ControllerConfig.Option.CONFIG_FILE
+                && o != ControllerConfig.Option.CONFIG_FILE_URL;
+    }
+
+    protected Set<IOption> getSectionOptions(ConfigManager configManager, Section section) {
+        return configManager.getOptions(section).stream().filter(optionSelector()).collect(Collectors.toSet());
+    }
+
+    public void generateUsage(String startDelim, String midDelim, String endDelim, EnumMap<Column, Boolean> align,
+            PrintStream output) {
+        ConfigManager configManager = getConfigManager();
         StringBuilder buf = new StringBuilder();
-        int maxSectionWidth = 0;
-        int maxNameWidth = 0;
-        int maxDescriptionWidth = 0;
-        int maxDefaultWidth = 0;
-        if (align) {
-            for (Section section : configManager.getSections()) {
-                maxSectionWidth = Math.max(maxSectionWidth, section.sectionName().length());
-                for (IOption option : configManager.getOptions(section)) {
-                    if (option.hidden()) {
-                        continue;
+
+        final Column[] columns = Column.values();
+        for (Section section : getSections(configManager)) {
+            for (IOption option : getSectionOptions(configManager, section)) {
+                for (Column column : columns) {
+                    if (align.computeIfAbsent(column, c -> false)) {
+                        calculateMaxWidth(option, column);
                     }
-                    maxNameWidth = Math.max(maxNameWidth, option.ini().length());
-                    maxDescriptionWidth = Math.max(maxDescriptionWidth,
-                            option.description() == null ? 0 : option.description().length());
-                    maxDefaultWidth = Math.max(maxDefaultWidth, configManager.defaultTextForUsage(option, IOption::ini)
-                            .length());
                 }
             }
         }
-        maxDescriptionWidth = Math.min(80, maxDescriptionWidth);
-        for (Section section : configManager.getSections()) {
-            List<IOption> options = new ArrayList<>(configManager.getOptions(section));
+        // output header
+        for (Column column : columns) {
+            buf.append(column.ordinal() == 0 ? startDelim : midDelim);
+            pad(buf, StringUtils.capitalize(column.name().toLowerCase()), calculateMaxWidth(column, column.name()));
+        }
+        buf.append(endDelim).append('\n');
+
+        StringBuilder sepLine = new StringBuilder();
+        for (Column column : columns) {
+            sepLine.append(column.ordinal() == 0 ? startDelim : midDelim);
+            pad(sepLine, "", maxWidths.get(column), '-');
+        }
+        sepLine.append(endDelim).append('\n');
+        buf.append(sepLine.toString().replace(' ', '-'));
+
+        for (Section section : getSections(configManager)) {
+            List<IOption> options = new ArrayList<>(getSectionOptions(configManager, section));
             options.sort(Comparator.comparing(IOption::ini));
             for (IOption option : options) {
-                if (option.hidden()) {
-                    continue;
+                for (Column column : columns) {
+                    buf.append(column.ordinal() == 0 ? startDelim : midDelim);
+                    if (column == Column.SECTION) {
+                        center(buf, extractValue(column, option), maxWidths.get(column));
+                    } else {
+                        pad(buf, extractValue(column, option), maxWidths.get(column));
+                    }
                 }
-                buf.append(startDelim);
-                center(buf, section.sectionName(), maxSectionWidth).append(midDelim);
-                pad(buf, option.ini(), maxNameWidth).append(midDelim);
-                String description = option.description() == null ? "" : option.description();
-                String defaultText = configManager.defaultTextForUsage(option, IOption::ini);
-                boolean extra = false;
-                while (align && description.length() > maxDescriptionWidth) {
-                    int cut = description.lastIndexOf(' ', maxDescriptionWidth);
-                    pad(buf, description.substring(0, cut), maxDescriptionWidth).append(midDelim);
-                    pad(buf, defaultText, maxDefaultWidth).append(endDelim).append('\n');
-                    defaultText = "";
-                    description = description.substring(cut + 1);
-                    buf.append(startDelim);
-                    pad(buf, "", maxSectionWidth).append(midDelim);
-                    pad(buf, "", maxNameWidth).append(midDelim);
-                }
-                pad(buf, description, maxDescriptionWidth).append(midDelim);
-                pad(buf, defaultText, maxDefaultWidth).append(endDelim).append('\n');
-                if (extra) {
-                    buf.append(startDelim);
-                    pad(buf, "", maxSectionWidth).append(midDelim);
-                    pad(buf, "", maxNameWidth).append(midDelim);
-                    pad(buf, "", maxDescriptionWidth).append(midDelim);
-                    pad(buf, "", maxDefaultWidth).append(endDelim).append('\n');
-                }
+                buf.append(endDelim).append('\n');
             }
         }
         output.println(buf);
     }
 
+    protected int calculateMaxWidth(IOption option, Column column) {
+        final String string = extractValue(column, option);
+        return calculateMaxWidth(column, string);
+    }
+
+    private int calculateMaxWidth(Column column, String string) {
+        final int maxWidth = Math.max(maxWidths.computeIfAbsent(column, c -> 0), string.length());
+        maxWidths.put(column, maxWidth);
+        return maxWidth;
+    }
+
+    private String extractValue(Column column, IOption option) {
+        switch (column) {
+            case SECTION:
+                return option.section().sectionName();
+            case PARAMETER:
+                return option.ini();
+            case MEANING:
+                return option.description() == null ? "N/A" : option.description();
+            case DEFAULT:
+                return configManager.defaultTextForUsage(option, IOption::ini);
+            default:
+                throw new IllegalStateException(String.valueOf(column));
+        }
+    }
+
     private StringBuilder center(StringBuilder buf, String string, int width) {
         if (string == null) {
             string = "";
         }
+        string = StringEscapeUtils.escapeHtml4(string);
         int pad = width - string.length();
         int leftPad = pad / 2;
         for (int i = leftPad; i > 0; i--) {
@@ -133,12 +198,17 @@
     }
 
     private StringBuilder pad(StringBuilder buf, String string, int width) {
+        return pad(buf, string, width, ' ');
+    }
+
+    private StringBuilder pad(StringBuilder buf, String string, int width, char padChar) {
         if (string == null) {
             string = "";
         }
+        string = StringEscapeUtils.escapeHtml4(string);
         buf.append(string);
         for (int i = width - string.length(); i > 0; i--) {
-            buf.append(' ');
+            buf.append(padChar);
         }
         return buf;
     }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm
index 03884bd..bb241ba 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.adm
@@ -5,17 +5,12 @@
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/cc/threaddump"
   },
   "config" : {
+    "active.memory.global.budget" : 67108864,
     "compiler.framesize" : 32768,
     "compiler.groupmemory" : 163840,
     "compiler.joinmemory" : 262144,
     "compiler.parallelism" : 0,
-    "compiler.pregelix.home" : "~/pregelix",
     "compiler.sortmemory" : 327680,
-    "feed.central.manager.port" : 4500,
-    "feed.max.threshold.period" : 5,
-    "feed.memory.available.wait.timeout" : 10,
-    "feed.memory.global.budget" : 67108864,
-    "feed.pending.work.threshold" : 50,
     "instance.name" : "DEFAULT_INSTANCE",
     "log.level" : "INFO",
     "max.wait.active.cluster" : 60,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm
index 372ac00..3ee13c9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.adm
@@ -5,17 +5,12 @@
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/cc/threaddump"
   },
   "config" : {
+    "active.memory.global.budget" : 67108864,
     "compiler.framesize" : 32768,
     "compiler.groupmemory" : 163840,
     "compiler.joinmemory" : 262144,
     "compiler.parallelism" : -1,
-    "compiler.pregelix.home" : "~/pregelix",
     "compiler.sortmemory" : 327680,
-    "feed.central.manager.port" : 4500,
-    "feed.max.threshold.period" : 5,
-    "feed.memory.available.wait.timeout" : 10,
-    "feed.memory.global.budget" : 67108864,
-    "feed.pending.work.threshold" : 50,
     "instance.name" : "DEFAULT_INSTANCE",
     "log.level" : "WARNING",
     "max.wait.active.cluster" : 60,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm
index 9d1ba6e..64d2f94 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.adm
@@ -5,17 +5,12 @@
     "threadDumpUri" : "http://127.0.0.1:19002/admin/cluster/cc/threaddump"
   },
   "config" : {
+    "active.memory.global.budget" : 67108864,
     "compiler.framesize" : 32768,
     "compiler.groupmemory" : 163840,
     "compiler.joinmemory" : 262144,
     "compiler.parallelism" : 3,
-    "compiler.pregelix.home" : "~/pregelix",
     "compiler.sortmemory" : 327680,
-    "feed.central.manager.port" : 4500,
-    "feed.max.threshold.period" : 5,
-    "feed.memory.available.wait.timeout" : 10,
-    "feed.memory.global.budget" : 67108864,
-    "feed.pending.work.threshold" : 50,
     "instance.name" : "DEFAULT_INSTANCE",
     "log.level" : "WARNING",
     "max.wait.active.cluster" : 60,
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ActiveProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ActiveProperties.java
new file mode 100644
index 0000000..8455a6f
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ActiveProperties.java
@@ -0,0 +1,75 @@
+/*
+ * 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.config;
+
+import static org.apache.hyracks.control.common.config.OptionTypes.LONG_BYTE_UNIT;
+import static org.apache.hyracks.util.StorageUtil.StorageUnit.MEGABYTE;
+
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.IOptionType;
+import org.apache.hyracks.api.config.Section;
+import org.apache.hyracks.util.StorageUtil;
+
+public class ActiveProperties extends AbstractProperties {
+
+    public enum Option implements IOption {
+        ACTIVE_MEMORY_GLOBAL_BUDGET(
+                LONG_BYTE_UNIT,
+                StorageUtil.getLongSizeInBytes(64L, MEGABYTE),
+                "The memory budget (in bytes) for the active runtime");
+
+        private final IOptionType type;
+        private final Object defaultValue;
+        private final String description;
+
+        Option(IOptionType type, Object defaultValue, String description) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+            this.description = description;
+        }
+
+        @Override
+        public Section section() {
+            return Section.COMMON;
+        }
+
+        @Override
+        public String description() {
+            return description;
+        }
+
+        @Override
+        public IOptionType type() {
+            return type;
+        }
+
+        @Override
+        public Object defaultValue() {
+            return defaultValue;
+        }
+    }
+
+    public ActiveProperties(PropertiesAccessor accessor) {
+        super(accessor);
+    }
+
+    public long getMemoryComponentGlobalBudget() {
+        return accessor.getLong(Option.ACTIVE_MEMORY_GLOBAL_BUDGET);
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
index 5f3a1aa..690d326 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
@@ -39,14 +39,14 @@
                 CompilerProperties.Option.class,
                 MetadataProperties.Option.class,
                 ExternalProperties.Option.class,
-                FeedProperties.Option.class,
+                ActiveProperties.Option.class,
                 MessagingProperties.Option.class,
                 ReplicationProperties.Option.class,
                 StorageProperties.Option.class,
                 TransactionProperties.Option.class);
 
         // we need to process the old-style asterix config before we apply defaults!
-        configManager.addConfigurator(IConfigManager.APPLY_DEFAULTS_METRIC - 1, () -> {
+        configManager.addConfigurator(IConfigManager.ConfiguratorMetric.APPLY_DEFAULTS.metric() - 1, () -> {
             try {
                 PropertiesAccessor.getInstance(configManager.getAppConfig());
             } catch (AsterixException e) {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
index f97c5a5..5ccff4f 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
@@ -33,19 +33,29 @@
 public class CompilerProperties extends AbstractProperties {
 
     public enum Option implements IOption {
-        COMPILER_SORTMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE)),
-        COMPILER_JOINMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE)),
-        COMPILER_GROUPMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE)),
-        COMPILER_FRAMESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(32, KILOBYTE)),
-        COMPILER_PARALLELISM(INTEGER, COMPILER_PARALLELISM_AS_STORAGE),
-        COMPILER_PREGELIX_HOME(STRING, "~/pregelix");
+        COMPILER_SORTMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
+                "The memory budget (in bytes) for a sort operator instance in a partition"),
+        COMPILER_JOINMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
+                "The memory budget (in bytes) for a join operator instance in a partition"),
+        COMPILER_GROUPMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
+                "The memory budget (in bytes) for a group by operator instance in a partition"),
+        COMPILER_FRAMESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(32, KILOBYTE),
+                "The page size (in bytes) for computation"),
+        COMPILER_PARALLELISM(INTEGER, COMPILER_PARALLELISM_AS_STORAGE, "The degree of parallelism for query " +
+                "execution. Zero means to use the storage parallelism as the query execution parallelism, while " +
+                "other integer values dictate the number of query execution parallel partitions. The system will " +
+                "fall back to use the number of all available CPU cores in the cluster as the degree of parallelism " +
+                "if the number set by a user is too large or too small"),
+        COMPILER_PREGELIX_HOME(STRING, "~/pregelix", "Pregelix installation root directory");
 
         private final IOptionType type;
         private final Object defaultValue;
+        private final String description;
 
-        Option(IOptionType type, Object defaultValue) {
+        Option(IOptionType type, Object defaultValue, String description) {
             this.type = type;
             this.defaultValue = defaultValue;
+            this.description = description;
         }
 
         @Override
@@ -55,7 +65,7 @@
 
         @Override
         public String description() {
-            return "";
+            return description;
         }
 
         @Override
@@ -67,6 +77,11 @@
         public Object defaultValue() {
             return defaultValue;
         }
+
+        @Override
+        public boolean hidden() {
+            return this == COMPILER_PREGELIX_HOME;
+        }
     }
     public static final String COMPILER_SORTMEMORY_KEY = Option.COMPILER_SORTMEMORY.ini();
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
index 2f85221..4ab1d97 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
@@ -27,22 +27,25 @@
 public class ExternalProperties extends AbstractProperties {
 
     public enum Option implements IOption {
-        WEB_PORT(INTEGER, 19001),
-        WEB_QUERYINTERFACE_PORT(INTEGER, 19006),
-        API_PORT(INTEGER, 19002),
-        FEED_PORT(INTEGER, 19003),
-        LOG_LEVEL(LEVEL, java.util.logging.Level.WARNING),
-        MAX_WAIT_ACTIVE_CLUSTER(INTEGER, 60),
-        PLOT_ACTIVATE(BOOLEAN, false),
-        CC_JAVA_OPTS(STRING, "-Xmx1024m"),
-        NC_JAVA_OPTS(STRING, "-Xmx1024m");
+        WEB_PORT(INTEGER, 19001, "The listen port of the legacy query interface"),
+        WEB_QUERYINTERFACE_PORT(INTEGER, 19006, "The listen port of the query web interface"),
+        API_PORT(INTEGER, 19002, "The listen port of the API server"),
+        ACTIVE_PORT(INTEGER, 19003, "The listen port of the active server"),
+        LOG_LEVEL(LEVEL, java.util.logging.Level.WARNING, "The logging level for master and slave processes"),
+        MAX_WAIT_ACTIVE_CLUSTER(INTEGER, 60, "The max pending time (in seconds) for cluster startup. After the " +
+                "threshold, if the cluster still is not up and running, it is considered unavailable"),
+        PLOT_ACTIVATE(BOOLEAN, false, null),
+        CC_JAVA_OPTS(STRING, "-Xmx1024m", "The JVM options passed to the cluster controller process by managix"),
+        NC_JAVA_OPTS(STRING, "-Xmx1024m", "The JVM options passed to the node controller process(es) by managix");
 
         private final IOptionType type;
         private final Object defaultValue;
+        private final String description;
 
-        Option(IOptionType type, Object defaultValue) {
+        Option(IOptionType type, Object defaultValue, String description) {
             this.type = type;
             this.defaultValue = defaultValue;
+            this.description = description;
         }
 
         @Override
@@ -51,7 +54,7 @@
                 case WEB_PORT:
                 case WEB_QUERYINTERFACE_PORT:
                 case API_PORT:
-                case FEED_PORT:
+                case ACTIVE_PORT:
                     return Section.CC;
                 case LOG_LEVEL:
                 case MAX_WAIT_ACTIVE_CLUSTER:
@@ -67,8 +70,7 @@
 
         @Override
         public String description() {
-            // TODO(mblow): add descriptions
-            return null;
+            return description;
         }
 
         @Override
@@ -98,8 +100,8 @@
         return accessor.getInt(Option.API_PORT);
     }
 
-    public int getFeedServerPort() {
-        return accessor.getInt(Option.FEED_PORT);
+    public int getActiveServerPort() {
+        return accessor.getInt(Option.ACTIVE_PORT);
     }
 
     public java.util.logging.Level getLogLevel() {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java
deleted file mode 100644
index a96d746..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/FeedProperties.java
+++ /dev/null
@@ -1,101 +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.config;
-
-import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
-import static org.apache.hyracks.control.common.config.OptionTypes.LONG;
-import static org.apache.hyracks.control.common.config.OptionTypes.LONG_BYTE_UNIT;
-import static org.apache.hyracks.util.StorageUtil.StorageUnit.MEGABYTE;
-
-import org.apache.hyracks.api.config.IOption;
-import org.apache.hyracks.api.config.IOptionType;
-import org.apache.hyracks.api.config.Section;
-import org.apache.hyracks.util.StorageUtil;
-
-public class FeedProperties extends AbstractProperties {
-
-    public enum Option implements IOption {
-        FEED_PENDING_WORK_THRESHOLD(INTEGER, 50),
-        FEED_MEMORY_GLOBAL_BUDGET(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(64L, MEGABYTE)),
-        FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT(LONG, 10L),
-        FEED_CENTRAL_MANAGER_PORT(INTEGER, 4500),
-        FEED_MAX_THRESHOLD_PERIOD(INTEGER, 5);
-
-        private final IOptionType type;
-        private final Object defaultValue;
-
-        Option(IOptionType type, Object defaultValue) {
-            this.type = type;
-            this.defaultValue = defaultValue;
-        }
-
-        @Override
-        public Section section() {
-            return Section.COMMON;
-        }
-
-        @Override
-        public String description() {
-            // TODO(mblow): add missing descriptions
-            switch (this) {
-                case FEED_CENTRAL_MANAGER_PORT:
-                    return "port at which the Central Feed Manager listens for control messages from local Feed " +
-                            "Managers";
-                case FEED_MAX_THRESHOLD_PERIOD:
-                    return "maximum length of input queue before triggering corrective action";
-                default:
-                    return null;
-            }
-        }
-
-        @Override
-        public IOptionType type() {
-            return type;
-        }
-
-        @Override
-        public Object defaultValue() {
-            return defaultValue;
-        }
-    }
-
-    public FeedProperties(PropertiesAccessor accessor) {
-        super(accessor);
-    }
-
-    public int getPendingWorkThreshold() {
-        return accessor.getInt(Option.FEED_PENDING_WORK_THRESHOLD);
-    }
-
-    public long getMemoryComponentGlobalBudget() {
-        return accessor.getLong(Option.FEED_MEMORY_GLOBAL_BUDGET);
-    }
-
-    public long getMemoryAvailableWaitTimeout() {
-        return accessor.getLong(Option.FEED_MEMORY_AVAILABLE_WAIT_TIMEOUT);
-    }
-
-    public int getFeedCentralManagerPort() {
-        return accessor.getInt(Option.FEED_CENTRAL_MANAGER_PORT);
-    }
-
-    public int getMaxSuccessiveThresholdPeriod() {
-        return accessor.getInt(Option.FEED_MAX_THRESHOLD_PERIOD);
-    }
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java
index 4637437..c1264a9 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/IPropertiesProvider.java
@@ -29,7 +29,7 @@
 
     ExternalProperties getExternalProperties();
 
-    FeedProperties getFeedProperties();
+    ActiveProperties getActiveProperties();
 
     BuildProperties getBuildProperties();
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java
index 4175873..e3a5fb9 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java
@@ -18,6 +18,8 @@
  */
 package org.apache.asterix.common.config;
 
+import java.util.function.Supplier;
+
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.IOptionType;
 import org.apache.hyracks.api.config.Section;
@@ -28,18 +30,32 @@
 public class NodeProperties extends AbstractProperties {
 
     public enum Option implements IOption {
-        INITIAL_RUN(OptionTypes.BOOLEAN, false),
-        CORE_DUMP_DIR(OptionTypes.STRING, FileUtil.joinPath(NCConfig.defaultDir, "coredump")),
-        TXN_LOG_DIR(OptionTypes.STRING, FileUtil.joinPath(NCConfig.defaultDir, "txn-log")),
-        STORAGE_SUBDIR(OptionTypes.STRING, "storage"),
+        INITIAL_RUN(OptionTypes.BOOLEAN, false, "A flag indicating if it's the first time the NC is started"),
+        CORE_DUMP_DIR(
+                OptionTypes.STRING,
+                (Supplier<String>) () -> FileUtil.joinPath(NCConfig.defaultDir, "coredump"),
+                "The directory where node core dumps should be written"),
+        TXN_LOG_DIR(
+                OptionTypes.STRING,
+                (Supplier<String>) () -> FileUtil.joinPath(NCConfig.defaultDir, "txn-log"),
+                "The directory where transaction logs should be stored"),
+        STORAGE_SUBDIR(OptionTypes.STRING, "storage", "The subdirectory name under each iodevice used for storage"),
         ;
 
         private final IOptionType type;
         private final Object defaultValue;
+        private final String description;
 
-        <T> Option(IOptionType<T> type, T defaultValue) {
+        <T> Option(IOptionType<T> type, T defaultValue, String description) {
             this.type = type;
             this.defaultValue = defaultValue;
+            this.description = description;
+        }
+
+        <T> Option(IOptionType<T> type, Supplier<T> defaultValue, String description) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+            this.description = description;
         }
 
         @Override
@@ -49,12 +65,7 @@
 
         @Override
         public String description() {
-            switch (this) {
-                case INITIAL_RUN:
-                    return "A flag indicating if it's the first time the NC is started";
-                default:
-                    return null;
-            }
+            return description;
         }
 
         @Override
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java
index 73e8c4a..97ad6be 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java
@@ -18,8 +18,11 @@
  */
 package org.apache.asterix.common.config;
 
-import static org.apache.hyracks.control.common.config.OptionTypes.*;
-import static org.apache.hyracks.util.StorageUtil.StorageUnit.*;
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER_BYTE_UNIT;
+import static org.apache.hyracks.control.common.config.OptionTypes.LONG_BYTE_UNIT;
+import static org.apache.hyracks.util.StorageUtil.StorageUnit.KILOBYTE;
+import static org.apache.hyracks.util.StorageUtil.StorageUnit.MEGABYTE;
 
 import java.util.Map;
 
@@ -31,25 +34,31 @@
 public class TransactionProperties extends AbstractProperties {
 
     public enum Option implements IOption {
-        TXN_LOG_BUFFER_NUMPAGES(INTEGER, 8),
-        TXN_LOG_BUFFER_PAGESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(128, KILOBYTE)),
-        TXN_LOG_PARTITIONSIZE(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(256L, MEGABYTE)),
-        TXN_LOG_CHECKPOINT_LSNTHRESHOLD(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(64, MEGABYTE)),
-        TXN_LOG_CHECKPOINT_POLLFREQUENCY(INTEGER, 120),
-        TXN_LOG_CHECKPOINT_HISTORY(INTEGER, 0),
-        TXN_LOCK_ESCALATIONTHRESHOLD(INTEGER, 1000),
-        TXN_LOCK_SHRINKTIMER(INTEGER, 5000),
-        TXN_LOCK_TIMEOUT_WAITTHRESHOLD(INTEGER, 60000),
-        TXN_LOCK_TIMEOUT_SWEEPTHRESHOLD(INTEGER, 10000),
-        TXN_COMMITPROFILER_REPORTINTERVAL(INTEGER, 5),
-        TXN_JOB_RECOVERY_MEMORYSIZE(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(64L, MEGABYTE));
+        TXN_LOG_BUFFER_NUMPAGES(INTEGER, 8, "The number of pages in the transaction log tail"),
+        TXN_LOG_BUFFER_PAGESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(128, KILOBYTE),
+                "The page size (in bytes) for transaction log buffer"),
+        TXN_LOG_PARTITIONSIZE(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(256L, MEGABYTE), null),
+        TXN_LOG_CHECKPOINT_LSNTHRESHOLD(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(64, MEGABYTE),
+                "The checkpoint threshold (in terms of LSNs (log sequence numbers) that have been written to the " +
+                        "transaction log, i.e., the length of the transaction log) for transaction logs"),
+        TXN_LOG_CHECKPOINT_POLLFREQUENCY(INTEGER, 120, null),
+        TXN_LOG_CHECKPOINT_HISTORY(INTEGER, 0, "The number of checkpoints to keep in the transaction log"),
+        TXN_LOCK_ESCALATIONTHRESHOLD(INTEGER, 1000, null),
+        TXN_LOCK_SHRINKTIMER(INTEGER, 5000, null),
+        TXN_LOCK_TIMEOUT_WAITTHRESHOLD(INTEGER, 60000, "Time out (in milliseconds) of waiting for a lock"),
+        TXN_LOCK_TIMEOUT_SWEEPTHRESHOLD(INTEGER, 10000, "Interval (in milliseconds) for checking lock timeout"),
+        TXN_COMMITPROFILER_REPORTINTERVAL(INTEGER, 5, null),
+        TXN_JOB_RECOVERY_MEMORYSIZE(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(64L, MEGABYTE),
+                "The memory budget (in bytes) used for recovery");
 
         private final IOptionType type;
         private final Object defaultValue;
+        private final String description;
 
-        Option(IOptionType type, Object defaultValue) {
+        Option(IOptionType type, Object defaultValue, String description) {
             this.type = type;
             this.defaultValue = defaultValue;
+            this.description = description;
         }
 
         @Override
@@ -59,8 +68,7 @@
 
         @Override
         public String description() {
-            // TODO(mblow): add missing descriptions
-            return null;
+            return description;
         }
 
         @Override
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java
index 17e1c5a..9be5837 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java
@@ -24,7 +24,7 @@
 import java.util.Random;
 import java.util.concurrent.LinkedBlockingDeque;
 
-import org.apache.asterix.common.config.FeedProperties;
+import org.apache.asterix.common.config.ActiveProperties;
 import org.apache.asterix.common.memory.ConcurrentFramePool;
 import org.apache.asterix.common.memory.FrameAction;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -58,7 +58,7 @@
 
     @org.junit.Test
     public void testMemoryManager() {
-        FeedProperties afp = Mockito.mock(FeedProperties.class);
+        ActiveProperties afp = Mockito.mock(ActiveProperties.class);
         Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
         ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                 DEFAULT_FRAME_SIZE);
@@ -73,7 +73,7 @@
     @org.junit.Test
     public void testConcurrentMemoryManager() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
@@ -104,7 +104,7 @@
     @org.junit.Test
     public void testVarSizeMemoryManager() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
@@ -139,7 +139,7 @@
     @org.junit.Test
     public void testConcurrentVarSizeMemoryManager() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
@@ -178,7 +178,7 @@
 
     @org.junit.Test
     public void testAcquireReleaseMemoryManager() throws HyracksDataException {
-        FeedProperties afp = Mockito.mock(FeedProperties.class);
+        ActiveProperties afp = Mockito.mock(ActiveProperties.class);
         Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
         ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                 DEFAULT_FRAME_SIZE);
@@ -211,7 +211,7 @@
     @org.junit.Test
     public void testConcurrentAcquireReleaseMemoryManager() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
@@ -242,7 +242,7 @@
     @org.junit.Test
     public void testAcquireReleaseVarSizeMemoryManager() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
@@ -295,7 +295,7 @@
     @org.junit.Test
     public void testConcurrentAcquireReleaseVarSizeMemoryManager() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
@@ -331,7 +331,7 @@
     @org.junit.Test
     public void testFixedSizeSubscribtion() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
@@ -397,7 +397,7 @@
     @org.junit.Test
     public void testgetWhileSubscribersExist() {
         try {
-            FeedProperties afp = Mockito.mock(FeedProperties.class);
+            ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
             ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
                     DEFAULT_FRAME_SIZE);
diff --git a/asterixdb/asterix-doc/src/site/markdown/ncservice.md b/asterixdb/asterix-doc/src/site/markdown/ncservice.md
index 67b1970..243d908 100644
--- a/asterixdb/asterix-doc/src/site/markdown/ncservice.md
+++ b/asterixdb/asterix-doc/src/site/markdown/ncservice.md
@@ -208,14 +208,14 @@
 `cc.conf`:
 
     [nc/red]
-    txnlogdir=/lv_scratch/asterix/red/txnlog
-    coredumpdir=/lv_scratch/asterix/red/coredump
+    txn.log.dir=/lv_scratch/asterix/red/txnlog
+    core.dump.dir=/lv_scratch/asterix/red/coredump
     iodevices=/lv_scratch/asterix/red
     address=cacofonix-2
 
     [nc/blue]
-    txnlogdir=/lv_scratch/asterix/blue/txnlog
-    coredumpdir=/lv_scratch/asterix/blue/coredump
+    txn.log.dir=/lv_scratch/asterix/blue/txnlog
+    core.dump.dir=/lv_scratch/asterix/blue/coredump
     iodevices=/lv_scratch/asterix/blue
     address=cacofonix-3
 
@@ -225,7 +225,7 @@
     command=asterixnc
 
     [cc]
-    cluster.address = cacofonix-1
+    address = cacofonix-1
 
 To deploy, first the `asterix-server` binary must be present on each machine. Any method to transfer
 the archive to each machine will work, but here `scp` will be used for simplicity's sake.
@@ -255,57 +255,123 @@
 
 The following parameters are for the master process, under the "[cc]" section.
 
-| Parameter | Meaning |  Default |
-|----------|--------|-------|
-| max.wait.active.cluster | The max pending time (in seconds) for cluster startup. After the threshold, if the cluster still is not up and running, it is considered unavailable.    | 60 |
-| address | The binding IP address for the AsterixDB instance | N/A |
+| Section | Parameter                                 | Meaning | Default |
+|---------|-------------------------------------------|---|---|
+|   cc    | active.port                               | The listen port of the active server | 19003   |
+|   cc    | address                                   | Default bind address for all services on this cluster controller | 127.0.0.1 |
+|   cc    | api.port                                  | The listen port of the API server | 19002   |
+|   cc    | app.class                                 | Application CC main class | org.apache.asterix.hyracks.bootstrap.CCApplicationEntryPoint |
+|   cc    | client.listen.address                     | Sets the IP Address to listen for connections from clients | same as address |
+|   cc    | client.listen.port                        | Sets the port to listen for connections from clients | 1098    |
+|   cc    | cluster.listen.address                    | Sets the IP Address to listen for connections from NCs | same as address |
+|   cc    | cluster.listen.port                       | Sets the port to listen for connections from node controllers | 1099    |
+|   cc    | cluster.public.address                    | Address that NCs should use to contact this CC | same as cluster.listen.address |
+|   cc    | cluster.public.port                       | Port that NCs should use to contact this CC | same as cluster.listen.port |
+|   cc    | cluster.topology                          | Sets the XML file that defines the cluster topology | &lt;undefined&gt; |
+|   cc    | console.listen.address                    | Sets the listen address for the Cluster Controller | same as address |
+|   cc    | console.listen.port                       | Sets the http port for the Cluster Controller) | 16001   |
+|   cc    | heartbeat.max.misses                      | Sets the maximum number of missed heartbeats before a node is marked as dead | 5       |
+|   cc    | heartbeat.period                          | Sets the time duration between two heartbeats from each node controller in milliseconds | 10000   |
+|   cc    | job.history.size                          | Limits the number of historical jobs remembered by the system to the specified value | 10      |
+|   cc    | job.manager.class                         | Specify the implementation class name for the job manager | org.apache.hyracks.control.cc.job.JobManager |
+|   cc    | job.queue.capacity                        | The maximum number of jobs to queue before rejecting new jobs | 4096    |
+|   cc    | job.queue.class                           | Specify the implementation class name for the job queue | org.apache.hyracks.control.cc.scheduler.FIFOJobQueue |
+|   cc    | profile.dump.period                       | Sets the time duration between two profile dumps from each node controller in milliseconds; 0 to disable | 0       |
+|   cc    | result.sweep.threshold                    | The duration within which an instance of the result cleanup should be invoked in milliseconds | 60000   |
+|   cc    | result.ttl                                | Limits the amount of time results for asynchronous jobs should be retained by the system in milliseconds | 86400000 |
+|   cc    | root.dir                                  | Sets the root folder used for file operations | ${java.io.tmpdir}/asterixdb/ClusterControllerService |
+|   cc    | web.port                                  | The listen port of the legacy query interface | 19001   |
+|   cc    | web.queryinterface.port                   | The listen port of the query web interface | 19006   |
 
 
 The following parameters for slave processes, under "[nc]" sections.
 
-| Parameter | Meaning |  Default |
-|----------|--------|-------|
-| address | The binding IP address for the slave process |  N/A   |
-| command | The command for the slave process | N/A (for AsterixDB, it should be "asterixnc") |
-| core.dump.dir | The path for core dump | N/A |
-| iodevices | Comma separated directory paths for both storage files and temporary files | N/A |
-| jvm.args | The JVM arguments | -Xmx1536m |
-| ncservice.port | The port on which the NCService for this NC is listening | 9090 |
-| txn.log.dir  | The directory for transaction logs | N/A |
+| Section | Parameter                                 | Meaning | Default |
+|---------|-------------------------------------------|---|---|
+|   nc    | address                                   | Default IP Address to bind listeners on this NC.  All services will bind on this address unless a service-specific listen address is supplied. | 127.0.0.1 |
+|   nc    | app.class                                 | Application NC Main Class | org.apache.asterix.hyracks.bootstrap.NCApplicationEntryPoint |
+|   nc    | cluster.address                           | Cluster Controller address (required unless specified in config file) | &lt;undefined&gt; |
+|   nc    | cluster.connect.retries                   | Number of attempts to contact CC before giving up | 5       |
+|   nc    | cluster.listen.address                    | IP Address to bind cluster listener on this NC | same as address |
+|   nc    | cluster.listen.port                       | IP port to bind cluster listener | 0       |
+|   nc    | cluster.port                              | Cluster Controller port | 1099    |
+|   nc    | cluster.public.address                    | Public IP Address to announce cluster listener | same as public.address |
+|   nc    | cluster.public.port                       | Public IP port to announce cluster listener | same as cluster.listen.port |
+|   nc    | command                                   | Command NCService should invoke to start the NCDriver | hyracksnc |
+|   nc    | core.dump.dir                             | The directory where node core dumps should be written | ${java.io.tmpdir}/asterixdb/coredump |
+|   nc    | data.listen.address                       | IP Address to bind data listener | same as address |
+|   nc    | data.listen.port                          | IP port to bind data listener | 0       |
+|   nc    | data.public.address                       | Public IP Address to announce data listener | same as public.address |
+|   nc    | data.public.port                          | Public IP port to announce data listener | same as data.listen.port |
+|   nc    | iodevices                                 | Comma separated list of IO Device mount points | ${java.io.tmpdir}/asterixdb/iodevice |
+|   nc    | jvm.args                                  | JVM args to pass to the NCDriver | &lt;undefined&gt; |
+|   nc    | messaging.listen.address                  | IP Address to bind messaging listener | same as address |
+|   nc    | messaging.listen.port                     | IP port to bind messaging listener | 0       |
+|   nc    | messaging.public.address                  | Public IP Address to announce messaging listener | same as public.address |
+|   nc    | messaging.public.port                     | Public IP port to announce messaging listener | same as messaging.listen.port |
+|   nc    | ncservice.address                         | Address the CC should use to contact the NCService associated with this NC | same as public.address |
+|   nc    | ncservice.pid                             | PID of the NCService which launched this NCDriver | -1      |
+|   nc    | ncservice.port                            | Port the CC should use to contact the NCService associated with this NC | 9090    |
+|   nc    | net.buffer.count                          | Number of network buffers per input/output channel | 1       |
+|   nc    | net.thread.count                          | Number of threads to use for Network I/O | 1       |
+|   nc    | public.address                            | Default public address that other processes should use to contact this NC.  All services will advertise this address unless a service-specific public address is supplied. | same as address |
+|   nc    | result.listen.address                     | IP Address to bind dataset result distribution listener | same as address |
+|   nc    | result.listen.port                        | IP port to bind dataset result distribution listener | 0       |
+|   nc    | result.manager.memory                     | Memory usable for result caching at this Node Controller in bytes | -1 (-1 B) |
+|   nc    | result.public.address                     | Public IP Address to announce dataset result distribution listener | same as public.address |
+|   nc    | result.public.port                        | Public IP port to announce dataset result distribution listener | same as result.listen.port |
+|   nc    | result.sweep.threshold                    | The duration within which an instance of the result cleanup should be invoked in milliseconds | 60000   |
+|   nc    | result.ttl                                | Limits the amount of time results for asynchronous jobs should be retained by the system in milliseconds | 86400000 |
+|   nc    | storage.buffercache.maxopenfiles          | The maximum number of open files in the buffer cache | 2147483647 |
+|   nc    | storage.buffercache.pagesize              | The page size in bytes for pages in the buffer cache | 131072 (128 kB) |
+|   nc    | storage.buffercache.size                  | The size of memory allocated to the disk buffer cache.  The value should be a multiple of the buffer cache page size. | 715915264 (682.75 MB) |
+|   nc    | storage.lsm.bloomfilter.falsepositiverate | The maximum acceptable false positive rate for bloom filters associated with LSM indexes | 0.01    |
+|   nc    | storage.memorycomponent.globalbudget      | The size of memory allocated to the memory components.  The value should be a multiple of the memory component page size | 715915264 (682.75 MB) |
+|   nc    | storage.memorycomponent.numcomponents     | The number of memory components to be used per lsm index | 2       |
+|   nc    | storage.memorycomponent.numpages          | The number of pages to allocate for a memory component.  This budget is shared by all the memory components of the primary index and all its secondary indexes across all I/O devices on a node.  Note: in-memory components usually has fill factor of 75% since the pages are 75% full and the remaining 25% is un-utilized | 1/16th of the storage.memorycomponent.globalbudget value |
+|   nc    | storage.memorycomponent.pagesize          | The page size in bytes for pages allocated to memory components | 131072 (128 kB) |
+|   nc    | storage.metadata.memorycomponent.numpages | The number of pages to allocate for a metadata memory component | 1/64th of the storage.memorycomponent.globalbudget value or 256, whichever is larger |
+|   nc    | storage.subdir                            | The subdirectory name under each iodevice used for storage | storage |
+|   nc    | txn.log.dir                               | The directory where transaction logs should be stored | ${java.io.tmpdir}/asterixdb/txn-log |
 
 
 The following parameters are configured under the "[common]" section.
 
-| Parameter | Meaning |  Default |
-|----------|--------|-------|
-| instance.name  |  The name of the AsterixDB instance   | "DEFAULT_INSTANCE" |
-| log.level | The logging level for master and slave processes | "INFO" |
-| compiler.framesize |  The page size (in bytes) for computation  | 32768 |
-| compiler.groupmemory |  The memory budget (in bytes) for a group by operator instance in a partition | 33554432 |
-| compiler.joinmemory | The memory budget (in bytes) for a join operator instance in a partition | 33554432 |
-| compiler.sortmemory | The memory budget (in bytes) for a sort operator instance in a partition | 33554432 |
-| compiler.parallelism | The degree of parallelism for query execution. Zero means to use the storage parallelism as the query execution parallelism, while other integer values dictate the number of query execution parallel partitions. The system will fall back to use the number of all available CPU cores in the cluster as the degree of parallelism if the number set by a user is too large or too small.  | 0 |
-| metadata.callback.port | The port for metadata communication | 0 |
-| metadata.listen.port | The metadata communication port on the metadata node. This parameter should only be present in the section of the metadata NC | 0 |
-| metadata.registration.timeout.secs | The time out threshold (in seconds) for metadata node registration | 60 |
-| storage.subdir | The directory for storage files  |  N/A |
-| storage.buffercache.maxopenfiles | The maximum number of open files for the buffer cache.  Note that this is the parameter for the AsterixDB and setting the operating system parameter is still required. | 2147483647 |
-| storage.buffercache.pagesize |  The page size (in bytes) for the disk buffer cache (for reads) | 131072 |
-| storage.buffercache.size | The overall budget (in bytes) of the disk buffer cache (for reads) | 536870912 |
-| storage.lsm.bloomfilter.falsepositiverate | The false positive rate for the bloom filter for each memory/disk components | 0.01 |
-| storage.memorycomponent.globalbudget | The global budget (in bytes) for all memory components of all datasets and indexes (for writes) |  536870912 |
-| storage.memorycomponent.numcomponents | The number of memory components per data partition per index  | 2 |
-| storage.memorycomponent.numpages | The number of pages for all memory components of a dataset, including those for secondary indexes | 256 |
-| storage.memorycomponent.pagesize | The page size (in bytes) of memory components | 131072 |
-| storage.metadata.memorycomponent.numpages | The number of pages for all memory components of a metadata dataset | 256 |
-| txn.commitprofiler.reportinterval |  The interval for reporting commit statistics | 5 |
-| txn.job.recovery.memorysize  | The memory budget (in bytes) used for recovery | 67108864 |
-| txn.lock.timeout.sweepthreshold | Interval (in milliseconds) for checking lock timeout | 10000 |
-| txn.lock.timeout.waitthreshold | Time out (in milliseconds) of waiting for a lock | 60000 |
-| txn.log.buffer.numpages | The number of pages in the transaction log tail | 8 |
-| txn.log.buffer.pagesize | The page size (in bytes) for transaction log buffer. | 131072 |
-| txn.log.checkpoint.history |  The number of checkpoints to keep in the transaction log | 0 |
-| txn.log.checkpoint.lsnthreshold | The checkpoint threshold (in terms of LSNs (log sequence numbers) that have been written to the transaction log, i.e., the length of the transaction log) for transection logs | 67108864 |
+| Section | Parameter                                 | Meaning | Default |
+|---------|-------------------------------------------|---|---|
+| common  | active.memory.global.budget               | The memory budget (in bytes) for the active runtime | 67108864 (64 MB) |
+| common  | compiler.framesize                        | The page size (in bytes) for computation | 32768 (32 kB) |
+| common  | compiler.groupmemory                      | The memory budget (in bytes) for a group by operator instance in a partition | 33554432 (32 MB) |
+| common  | compiler.joinmemory                       | The memory budget (in bytes) for a join operator instance in a partition | 33554432 (32 MB) |
+| common  | compiler.parallelism                      | The degree of parallelism for query execution. Zero means to use the storage parallelism as the query execution parallelism, while other integer values dictate the number of query execution parallel partitions. The system will fall back to use the number of all available CPU cores in the cluster as the degree of parallelism if the number set by a user is too large or too small | 0       |
+| common  | compiler.sortmemory                       | The memory budget (in bytes) for a sort operator instance in a partition | 33554432 (32 MB) |
+| common  | instance.name                             | The name of this cluster instance | DEFAULT_INSTANCE |
+| common  | log.level                                 | The logging level for master and slave processes | WARNING |
+| common  | max.wait.active.cluster                   | The max pending time (in seconds) for cluster startup. After the threshold, if the cluster still is not up and running, it is considered unavailable | 60      |
+| common  | messaging.frame.count                     | N/A     | 512     |
+| common  | messaging.frame.size                      | N/A     | 4096 (4 kB) |
+| common  | metadata.callback.port                    | IP port to bind metadata callback listener (0 = random port) | 0       |
+| common  | metadata.listen.port                      | IP port to bind metadata listener (0 = random port) | 0       |
+| common  | metadata.node                             | the node which should serve as the metadata node | &lt;undefined&gt; |
+| common  | metadata.registration.timeout.secs        | how long in seconds to wait for the metadata node to register with the CC | 60      |
+| common  | plot.activate                             | N/A     | false   |
+| common  | replication.log.batchsize                 | N/A     | 4096 (4 kB) |
+| common  | replication.log.buffer.numpages           | N/A     | 8       |
+| common  | replication.log.buffer.pagesize           | N/A     | 131072 (128 kB) |
+| common  | replication.max.remote.recovery.attempts  | N/A     | 5       |
+| common  | replication.timeout                       | N/A     | 15      |
+| common  | txn.commitprofiler.reportinterval         | N/A     | 5       |
+| common  | txn.job.recovery.memorysize               | The memory budget (in bytes) used for recovery | 67108864 (64 MB) |
+| common  | txn.lock.escalationthreshold              | N/A     | 1000    |
+| common  | txn.lock.shrinktimer                      | N/A     | 5000    |
+| common  | txn.lock.timeout.sweepthreshold           | Interval (in milliseconds) for checking lock timeout | 10000   |
+| common  | txn.lock.timeout.waitthreshold            | Time out (in milliseconds) of waiting for a lock | 60000   |
+| common  | txn.log.buffer.numpages                   | The number of pages in the transaction log tail | 8       |
+| common  | txn.log.buffer.pagesize                   | The page size (in bytes) for transaction log buffer | 131072 (128 kB) |
+| common  | txn.log.checkpoint.history                | The number of checkpoints to keep in the transaction log | 0       |
+| common  | txn.log.checkpoint.lsnthreshold           | The checkpoint threshold (in terms of LSNs (log sequence numbers) that have been written to the transaction log, i.e., the length of the transaction log) for transaction logs | 67108864 (64 MB) |
+| common  | txn.log.checkpoint.pollfrequency          | N/A     | 120     |
+| common  | txn.log.partitionsize                     | N/A     | 268435456 (256 MB) |
 
 
 # For the optional NCService process configuration file, the following parameters, under "[ncservice]" section.
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-configuration.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-configuration.xml
index f4bb47a..d6f0968 100644
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-configuration.xml
+++ b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-configuration.xml
@@ -242,24 +242,12 @@
     <description>The minimum log level to be displayed. (Default = INFO)
     </description>
   </property>
+
   <property>
-    <name>feed.memory.global.budget</name>
+    <name>active.memory.global.budget</name>
     <value>1073741824</value>
     <description>Feed memory budget (1 GB = 1073741824 Bytes)
     </description>
   </property>
 
-  <property>
-    <name>feed.pending.work.threshold</name>
-    <value>1000</value>
-    <description>Feed pending work threshold
-    </description>
-  </property>
-
-  <property>
-    <name>feed.max.threshold.period</name>
-    <value>100</value>
-    <description>Feed max threshold period
-    </description>
-  </property>
 </asterixConfiguration>
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/AppContextInfo.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/AppContextInfo.java
index 9bcfea2..400bb5a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/AppContextInfo.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/AppContextInfo.java
@@ -23,11 +23,11 @@
 import java.util.logging.Logger;
 
 import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
+import org.apache.asterix.common.config.ActiveProperties;
 import org.apache.asterix.common.config.BuildProperties;
 import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.asterix.common.config.ExtensionProperties;
 import org.apache.asterix.common.config.ExternalProperties;
-import org.apache.asterix.common.config.FeedProperties;
 import org.apache.asterix.common.config.IPropertiesProvider;
 import org.apache.asterix.common.config.MessagingProperties;
 import org.apache.asterix.common.config.MetadataProperties;
@@ -64,7 +64,7 @@
     private MetadataProperties metadataProperties;
     private StorageProperties storageProperties;
     private TransactionProperties txnProperties;
-    private FeedProperties feedProperties;
+    private ActiveProperties activeProperties;
     private BuildProperties buildProperties;
     private ReplicationProperties replicationProperties;
     private ExtensionProperties extensionProperties;
@@ -100,7 +100,7 @@
         INSTANCE.metadataProperties = new MetadataProperties(propertiesAccessor);
         INSTANCE.storageProperties = new StorageProperties(propertiesAccessor);
         INSTANCE.txnProperties = new TransactionProperties(propertiesAccessor);
-        INSTANCE.feedProperties = new FeedProperties(propertiesAccessor);
+        INSTANCE.activeProperties = new ActiveProperties(propertiesAccessor);
         INSTANCE.extensionProperties = new ExtensionProperties(propertiesAccessor);
         INSTANCE.replicationProperties = new ReplicationProperties(propertiesAccessor);
         INSTANCE.ftStrategy = ftStrategy;
@@ -150,8 +150,8 @@
     }
 
     @Override
-    public FeedProperties getFeedProperties() {
-        return feedProperties;
+    public ActiveProperties getActiveProperties() {
+        return activeProperties;
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IConfigManager.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IConfigManager.java
index fb1332b..3944820 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IConfigManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IConfigManager.java
@@ -24,10 +24,23 @@
 import org.kohsuke.args4j.OptionHandlerFilter;
 
 public interface IConfigManager {
-    int PARSE_INI_POINTERS_METRIC = 100;
-    int PARSE_INI_METRIC = 200;
-    int PARSE_COMMAND_LINE_METRIC = 300;
-    int APPLY_DEFAULTS_METRIC = 400;
+
+    enum ConfiguratorMetric {
+        PARSE_INI_POINTERS(100),
+        PARSE_INI(200),
+        PARSE_COMMAND_LINE(300),
+        APPLY_DEFAULTS(400);
+
+        private final int metric;
+
+        ConfiguratorMetric(int metric) {
+            this.metric = metric;
+        }
+
+        public int metric() {
+            return metric;
+        }
+    }
 
     void register(IOption... options);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java
index 2a98fdc..1bd6097 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java
@@ -26,15 +26,24 @@
 
     Class<T> targetType();
 
+    /**
+     * @return the value in a format suitable for serialized JSON
+     */
     default Object serializeToJSON(Object value) {
         return value;
     }
 
+    /**
+     * @return the value in a format suitable for serialized ini file
+     */
     default String serializeToIni(Object value) {
         return String.valueOf(value);
     }
 
-    default String serializeToString(Object value) {
+    /**
+     * @return the value in human-readable form (e.g. for usage)
+     */
+    default String serializeToHumanReadable(Object value) {
         return serializeToIni(value);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
index bfe759e..04cf704 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
@@ -92,10 +92,10 @@
         for (Section section : Section.values()) {
             allSections.add(section.sectionName());
         }
-        addConfigurator(PARSE_INI_POINTERS_METRIC, this::extractIniPointersFromCommandLine);
-        addConfigurator(PARSE_INI_METRIC, this::parseIni);
-        addConfigurator(PARSE_COMMAND_LINE_METRIC, this::processCommandLine);
-        addConfigurator(APPLY_DEFAULTS_METRIC, this::applyDefaults);
+        addConfigurator(ConfiguratorMetric.PARSE_INI_POINTERS, this::extractIniPointersFromCommandLine);
+        addConfigurator(ConfiguratorMetric.PARSE_INI, this::parseIni);
+        addConfigurator(ConfiguratorMetric.PARSE_COMMAND_LINE, this::processCommandLine);
+        addConfigurator(ConfiguratorMetric.APPLY_DEFAULTS, this::applyDefaults);
     }
 
     @Override
@@ -103,6 +103,10 @@
         configurators.computeIfAbsent(metric, metric1 -> new ArrayList<>()).add(configurator);
     }
 
+    private void addConfigurator(ConfiguratorMetric metric, IConfigurator configurator) {
+        addConfigurator(metric.metric(), configurator);
+    }
+
     @Override
     public void addIniParamOptions(IOption... options) {
         Stream.of(options).forEach(iniPointerOptions::add);
@@ -340,10 +344,9 @@
                                     new CompositeMap<>(nodeMap.getValue(), definedMap, new NoOpMapMutator()), option,
                                     nodeMap.getKey()));
                 }
-                // also push the defaults to the shared map, if the CC requests NC properties, they should receive the
-                // defaults -- TODO (mblow): seems lame, should log warning on access
+            } else {
+                entry.getValue().values().forEach(option -> getOrDefault(configurationMap, option, null));
             }
-            entry.getValue().values().forEach(option -> getOrDefault(configurationMap, option, null));
         }
     }
 
@@ -514,10 +517,11 @@
             } else if (value instanceof Function) {
                 // TODO(mblow): defer usage calculation to enable evaluation of function
                 buf.append("<function>");
+            } else if (value == null) {
+                buf.append("<undefined>");
             } else {
-                buf.append(option.type().serializeToString(resolveDefault(option, appConfig)));
+                buf.append(option.type().serializeToHumanReadable(resolveDefault(option, appConfig)));
             }
-            // TODO(mblow): defer usage calculation to enable inclusion of evaluated actual default
         }
         return buf.toString();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java
index fc26b5e..02b9325 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java
@@ -41,6 +41,11 @@
         public Class<Integer> targetType() {
             return Integer.class;
         }
+
+        @Override
+        public String serializeToHumanReadable(Object value) {
+            return value + " (" + StorageUtil.toHumanReadableSize((int)value) + ")";
+        }
     };
 
     public static final IOptionType<Long> LONG_BYTE_UNIT = new IOptionType<Long>() {
@@ -53,6 +58,11 @@
         public Class<Long> targetType() {
             return Long.class;
         }
+
+        @Override
+        public String serializeToHumanReadable(Object value) {
+            return value + " (" + StorageUtil.toHumanReadableSize((long)value) + ")";
+        }
     };
 
     public static final IOptionType<Integer> INTEGER = new IOptionType<Integer>() {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
index 97438c7..51451ce 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
@@ -38,10 +38,10 @@
 @SuppressWarnings("SameParameterValue")
 public class CCConfig extends ControllerConfig {
 
-    public static String defaultDir = System.getProperty("java.io.tmpdir");
+    public static String defaultAppClass;
 
     public enum Option implements IOption {
-        APP_CLASS(STRING),
+        APP_CLASS(STRING, (Supplier<String>)() -> defaultAppClass),
         ADDRESS(STRING, InetAddress.getLoopbackAddress().getHostAddress()),
         CLUSTER_LISTEN_ADDRESS(STRING, ADDRESS),
         CLUSTER_LISTEN_PORT(INTEGER, 1099),
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java
index 4aae6df..fdc0963 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java
@@ -30,6 +30,8 @@
 
 public class ControllerConfig implements Serializable {
 
+    public static String defaultDir = System.getProperty("java.io.tmpdir");
+
     public enum Option implements IOption {
         CONFIG_FILE(OptionTypes.STRING, "Specify path to master configuration file"),
         CONFIG_FILE_URL(OptionTypes.URL, "Specify URL to master configuration file");
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
index a65719e..9cf4da3 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
@@ -40,8 +40,7 @@
 public class NCConfig extends ControllerConfig {
     private static final long serialVersionUID = 3L;
 
-    public static String defaultDir = System.getProperty("java.io.tmpdir");
-    public static String defaultAppClass = null;
+    public static String defaultAppClass;
 
     public enum Option implements IOption {
         ADDRESS(STRING, InetAddress.getLoopbackAddress().getHostAddress()),
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
index a9a529ca..9001e1b 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
@@ -160,6 +160,12 @@
             return bytes + " B";
         }
         final int baseValue = (63 - Long.numberOfLeadingZeros(bytes)) / 10;
-        return String.format("%.2f %sB", (double) bytes / (1L << (baseValue * 10)), " kMGTPE".charAt(baseValue));
+        final char bytePrefix = " kMGTPE" .charAt(baseValue);
+        final long divisor = 1L << (baseValue * 10);
+        if (bytes % divisor == 0) {
+            return String.format("%d %sB", bytes / divisor, bytePrefix);
+        } else {
+            return String.format("%.2f %sB", (double) bytes / divisor, bytePrefix);
+        }
     }
 }
