diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
index afdcee4..10f118c0 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
@@ -214,8 +214,8 @@
         ICcApplicationContext ccAppContext = metadataProvider.getApplicationContext();
         CompilerProperties compilerProperties = ccAppContext.getCompilerProperties();
         Map<String, Object> querySpecificConfig = validateConfig(metadataProvider.getConfig(), sourceLoc);
-        final PhysicalOptimizationConfig physOptConf =
-                OptimizationConfUtil.createPhysicalOptimizationConf(compilerProperties, querySpecificConfig, sourceLoc);
+        final PhysicalOptimizationConfig physOptConf = OptimizationConfUtil.createPhysicalOptimizationConf(
+                compilerProperties, querySpecificConfig, configurableParameterNames, sourceLoc);
         boolean cboMode = physOptConf.getCBOMode() || physOptConf.getCBOTestMode();
         HeuristicCompilerFactoryBuilder builder =
                 new HeuristicCompilerFactoryBuilder(OptimizationContextFactory.INSTANCE);
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java
index c103b50..ad31281 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/OptimizationConfUtil.java
@@ -18,7 +18,11 @@
  */
 package org.apache.asterix.common.config;
 
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
@@ -28,6 +32,7 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.AbstractStableSortPOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.WindowPOperator;
 import org.apache.hyracks.algebricks.core.rewriter.base.PhysicalOptimizationConfig;
+import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.IOptionType;
 import org.apache.hyracks.api.exceptions.SourceLocation;
 import org.apache.hyracks.control.common.config.OptionTypes;
@@ -44,7 +49,8 @@
     }
 
     public static PhysicalOptimizationConfig createPhysicalOptimizationConf(CompilerProperties compilerProperties,
-            Map<String, Object> querySpecificConfig, SourceLocation sourceLoc) throws AlgebricksException {
+            Map<String, Object> querySpecificConfig, Set<String> parameterNames, SourceLocation sourceLoc)
+            throws AlgebricksException {
         int frameSize = compilerProperties.getFrameSize();
         int sortFrameLimit = getSortNumFrames(compilerProperties, querySpecificConfig, sourceLoc);
         int groupFrameLimit = getFrameLimit(CompilerProperties.COMPILER_GROUPMEMORY_KEY,
@@ -113,6 +119,17 @@
         physOptConf.setForceJoinOrderMode(forceJoinOrder);
         physOptConf.setQueryPlanShapeMode(queryPlanShape);
         physOptConf.setColumnFilter(columnFilter);
+
+        // We should have already validated the parameter names at this point...
+        Set<String> filteredParameterNames = new HashSet<>(parameterNames);
+        filteredParameterNames.removeAll(
+                Arrays.stream(CompilerProperties.Option.values()).map(IOption::ini).collect(Collectors.toSet()));
+        for (String parameterName : filteredParameterNames) {
+            Object parameterValue = querySpecificConfig.get(parameterName);
+            if (parameterValue != null) {
+                physOptConf.setExtensionProperty(parameterName, parameterValue);
+            }
+        }
         return physOptConf;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java
index 3e51a80..d167153 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/PhysicalOptimizationConfig.java
@@ -303,6 +303,24 @@
         return getBoolean(COLUMN_FILTER, AlgebricksConfig.COLUMN_FILTER_DEFAULT);
     }
 
+    public void setExtensionProperty(String property, Object value) {
+        if (value instanceof Integer) {
+            setInt(property, (Integer) value);
+        } else if (value instanceof Double) {
+            setDouble(property, (Double) value);
+        } else if (value instanceof Boolean) {
+            setBoolean(property, (Boolean) value);
+        } else if (value instanceof String) {
+            setString(property, (String) value);
+        } else {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    public Object getExtensionProperty(String property) {
+        return properties.getProperty(property);
+    }
+
     private void setInt(String property, int value) {
         properties.setProperty(property, Integer.toString(value));
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
index 44f57fa..f5f508a 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
@@ -72,11 +72,13 @@
 
     @Override
     public Set<String> getKeys(String section) {
-        return configManager.getOptionNames(section);
+        Set<String> keys = configManager.getOptionNames(section);
+        return keys.isEmpty() ? configManager.getExtensionKeys(section) : keys;
     }
 
     private Object get(String section, String key) {
-        return get(configManager.lookupOption(section, key));
+        IOption option = configManager.lookupOption(section, key);
+        return option != null ? get(option) : configManager.getExtensionValue(section, key);
     }
 
     @Override
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 85661fe..a2e43a2f 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
@@ -453,6 +453,23 @@
         return optionNames;
     }
 
+    public Set<String> getExtensionKeys(String sectionName) {
+        Set<String> extensionKeys = new HashSet<>();
+        for (Map.Entry<String, String> entry : extensionOptions.get(sectionName)) {
+            extensionKeys.add(entry.getKey());
+        }
+        return extensionKeys;
+    }
+
+    public Object getExtensionValue(String sectionName, String entryKey) {
+        for (Map.Entry<String, String> entry : extensionOptions.get(sectionName)) {
+            if (entry.getKey().equals(entryKey)) {
+                return entry.getValue();
+            }
+        }
+        return null;
+    }
+
     @Override
     public Set<IOption> getOptions(Section section) {
         return new HashSet<>(getSectionOptionMap(section).values());
