[ASTERIXDB-3259][MTD] Change SQLPP parser to parse multiparts into Namespace

- user model changes: no
- storage format changes: no
- interface changes: yes

Details:

- Change SQLPP parser to parse multiparts into Namespace
instead of DataverseName.
- Adapt all Statement implementation to SQLPP parser
change and make them use Namespace.
- Replace all usages of MetadataUtil.resolveDatabase()
with the passed in database name.

Change-Id: I458c690412c90ab16d81cca2d232ac566fcef39f
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17855
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
index 3b39d7c..256d481 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java
@@ -148,7 +148,7 @@
     private static final IOperatorSchema[] _emptySchemas = new IOperatorSchema[] {};
 
     public ConstantFoldingRule(ICcApplicationContext appCtx) {
-        MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         jobGenCtx = new JobGenContext(null, metadataProvider, appCtx, SerializerDeserializerProvider.INSTANCE,
                 BinaryHashFunctionFactoryProvider.INSTANCE, BinaryHashFunctionFamilyProvider.INSTANCE,
                 BinaryComparatorFactoryProvider.INSTANCE, TypeTraitProvider.INSTANCE, BinaryBooleanInspector.FACTORY,
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckAndSetRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckAndSetRule.java
index 91c15df..531bd8a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckAndSetRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckAndSetRule.java
@@ -24,8 +24,8 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.metadata.entities.Dataverse;
 import org.apache.asterix.metadata.utils.FullTextUtil;
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.AString;
@@ -186,9 +186,9 @@
                 }
 
                 MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
-                Dataverse defaultDataverse = metadataProvider.getDefaultDataverse();
-                String database = defaultDataverse.getDatabaseName();
-                DataverseName dataverseName = defaultDataverse.getDataverseName();
+                Namespace defaultNamespace = metadataProvider.getDefaultNamespace();
+                String database = defaultNamespace.getDatabaseName();
+                DataverseName dataverseName = defaultNamespace.getDataverseName();
                 funcExpr.setOpaqueParameters(
                         new Object[] { FullTextUtil.fetchFilterAndCreateConfigEvaluator(metadataProvider, database,
                                 dataverseName, ftConfigName) });
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
index 64b0a71..0a0685d 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
@@ -40,6 +40,7 @@
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.AnalyzeDropStatement;
 import org.apache.asterix.lang.common.statement.AnalyzeStatement;
@@ -64,7 +65,6 @@
 import org.apache.asterix.lang.common.statement.TypeDropStatement;
 import org.apache.asterix.lang.common.statement.UpsertStatement;
 import org.apache.asterix.metadata.dataset.hints.DatasetHints;
-import org.apache.asterix.metadata.entities.Dataverse;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
@@ -89,7 +89,7 @@
     protected static final String BAD_DATAVERSE_OBJECT_DDL_MESSAGE =
             "Cannot %s a %s belonging to the " + dataverse() + ": %s";
 
-    public void validateOperation(ICcApplicationContext appCtx, Dataverse defaultDataverse, Statement stmt)
+    public void validateOperation(ICcApplicationContext appCtx, Namespace namespace, Statement stmt)
             throws AlgebricksException {
 
         final IClusterStateManager clusterStateManager = appCtx.getClusterStateManager();
@@ -148,7 +148,7 @@
 
         boolean invalidOperation = false;
         String message = null;
-        DataverseName dataverseName = defaultDataverse != null ? defaultDataverse.getDataverseName() : null;
+        DataverseName dataverseName = namespace != null ? namespace.getDataverseName() : null;
         switch (stmt.getKind()) {
             case LOAD:
                 LoadStatement loadStmt = (LoadStatement) stmt;
@@ -227,6 +227,7 @@
                 break;
 
             case DATAVERSE_DROP:
+                //TODO(DB): check it's not System database for all cases
                 DataverseDropStatement dvDropStmt = (DataverseDropStatement) stmt;
                 dataverseName = dvDropStmt.getDataverseName();
                 invalidOperation = isMetadataDataverse(dataverseName) || isDefaultDataverse(dataverseName);
@@ -236,6 +237,7 @@
                 break;
 
             case DATASET_DECL:
+                //TODO(DB): check it's not System database for all cases
                 DatasetDecl dsCreateStmt = (DatasetDecl) stmt;
                 if (dsCreateStmt.getDataverse() != null) {
                     dataverseName = dsCreateStmt.getDataverse();
@@ -268,6 +270,7 @@
                 break;
 
             case DATASET_DROP:
+                //TODO(DB): check it's not System database for all cases
                 DropDatasetStatement dsDropStmt = (DropDatasetStatement) stmt;
                 if (dsDropStmt.getDataverseName() != null) {
                     dataverseName = dsDropStmt.getDataverseName();
@@ -279,6 +282,7 @@
                 break;
 
             case INDEX_DROP:
+                //TODO(DB): check it's not System database for all cases
                 IndexDropStatement idxDropStmt = (IndexDropStatement) stmt;
                 if (idxDropStmt.getDataverseName() != null) {
                     dataverseName = idxDropStmt.getDataverseName();
@@ -290,6 +294,7 @@
                 break;
 
             case TYPE_DECL:
+                //TODO(DB): check it's not System database for all cases
                 TypeDecl typeCreateStmt = (TypeDecl) stmt;
                 if (typeCreateStmt.getDataverseName() != null) {
                     dataverseName = typeCreateStmt.getDataverseName();
@@ -301,6 +306,7 @@
                 break;
 
             case TYPE_DROP:
+                //TODO(DB): check it's not System database for all cases
                 TypeDropStatement typeDropStmt = (TypeDropStatement) stmt;
                 if (typeDropStmt.getDataverseName() != null) {
                     dataverseName = typeDropStmt.getDataverseName();
@@ -312,6 +318,7 @@
                 break;
 
             case CREATE_SYNONYM:
+                //TODO(DB): check it's not System database for all cases
                 CreateSynonymStatement synCreateStmt = (CreateSynonymStatement) stmt;
                 if (synCreateStmt.getDataverseName() != null) {
                     dataverseName = synCreateStmt.getDataverseName();
@@ -323,6 +330,7 @@
                 break;
 
             case FUNCTION_DECL:
+                //TODO(DB): check it's not System database for all cases
                 FunctionDecl fnDeclStmt = (FunctionDecl) stmt;
                 FunctionSignature fnDeclSignature = fnDeclStmt.getSignature();
                 if (fnDeclSignature.getDataverseName() != null) {
@@ -335,6 +343,7 @@
                 break;
 
             case CREATE_FUNCTION:
+                //TODO(DB): check it's not System database for all cases
                 CreateFunctionStatement fnCreateStmt = (CreateFunctionStatement) stmt;
                 FunctionSignature fnCreateSignature = fnCreateStmt.getFunctionSignature();
                 if (fnCreateSignature.getDataverseName() != null) {
@@ -347,6 +356,7 @@
                 break;
 
             case CREATE_LIBRARY:
+                //TODO(DB): check it's not System database for all cases
                 CreateLibraryStatement libCreateStmt = (CreateLibraryStatement) stmt;
                 if (libCreateStmt.getDataverseName() != null) {
                     dataverseName = libCreateStmt.getDataverseName();
@@ -358,6 +368,7 @@
                 break;
 
             case CREATE_ADAPTER:
+                //TODO(DB): check it's not System database for all cases
                 CreateAdapterStatement adCreateStmt = (CreateAdapterStatement) stmt;
                 if (adCreateStmt.getDataverseName() != null) {
                     dataverseName = adCreateStmt.getDataverseName();
@@ -369,6 +380,7 @@
                 break;
 
             case CREATE_VIEW:
+                //TODO(DB): check it's not System database for all cases
                 CreateViewStatement viewCreateStmt = (CreateViewStatement) stmt;
                 if (viewCreateStmt.getDataverseName() != null) {
                     dataverseName = viewCreateStmt.getDataverseName();
@@ -380,6 +392,7 @@
                 break;
 
             case CREATE_FEED:
+                //TODO(DB): check it's not System database for all cases
                 CreateFeedStatement feedCreateStmt = (CreateFeedStatement) stmt;
                 if (feedCreateStmt.getDataverseName() != null) {
                     dataverseName = feedCreateStmt.getDataverseName();
@@ -391,6 +404,7 @@
                 break;
 
             case CREATE_FEED_POLICY:
+                //TODO(DB): check it's not System database for all cases
                 invalidOperation = isMetadataDataverse(dataverseName);
                 if (invalidOperation) {
                     message = String.format(BAD_DATAVERSE_OBJECT_DDL_MESSAGE, "create", "ingestion policy",
@@ -399,6 +413,7 @@
                 break;
 
             case ANALYZE:
+                //TODO(DB): check it's not System database for all cases
                 AnalyzeStatement analyzeStmt = (AnalyzeStatement) stmt;
                 if (analyzeStmt.getDataverseName() != null) {
                     dataverseName = analyzeStmt.getDataverseName();
@@ -409,6 +424,7 @@
                 }
                 break;
             case ANALYZE_DROP:
+                //TODO(DB): check it's not System database for all cases
                 AnalyzeDropStatement analyzeDropStmt = (AnalyzeDropStatement) stmt;
                 if (analyzeDropStmt.getDataverseName() != null) {
                     dataverseName = analyzeDropStmt.getDataverseName();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java
index 3733970..012df01 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java
@@ -191,6 +191,8 @@
 
     public interface ICompiledDmlStatement extends ICompiledStatement {
 
+        String getDatabaseName();
+
         DataverseName getDataverseName();
 
         String getDatasetName();
@@ -218,6 +220,11 @@
             return index.getDataverseName();
         }
 
+        @Override
+        public String getDatabaseName() {
+            return index.getDatabaseName();
+        }
+
         public Index getIndex() {
             return index;
         }
@@ -239,14 +246,17 @@
 
     public static class CompiledLoadFromFileStatement extends AbstractCompiledStatement
             implements ICompiledDmlStatement {
+
+        private final String databaseName;
         private final DataverseName dataverseName;
         private final String datasetName;
         private final boolean alreadySorted;
         private final String adapter;
         private final Map<String, String> properties;
 
-        public CompiledLoadFromFileStatement(DataverseName dataverseName, String datasetName, String adapter,
-                Map<String, String> properties, boolean alreadySorted) {
+        public CompiledLoadFromFileStatement(String databaseName, DataverseName dataverseName, String datasetName,
+                String adapter, Map<String, String> properties, boolean alreadySorted) {
+            this.databaseName = databaseName;
             this.dataverseName = dataverseName;
             this.datasetName = datasetName;
             this.alreadySorted = alreadySorted;
@@ -255,6 +265,11 @@
         }
 
         @Override
+        public String getDatabaseName() {
+            return databaseName;
+        }
+
+        @Override
         public DataverseName getDataverseName() {
             return dataverseName;
         }
@@ -289,14 +304,17 @@
 
     public static class CompiledCopyFromFileStatement extends AbstractCompiledStatement
             implements ICompiledDmlStatement {
+
+        private final String databaseName;
         private final DataverseName dataverseName;
         private final String datasetName;
         private final Datatype itemType;
         private final String adapter;
         private final Map<String, String> properties;
 
-        public CompiledCopyFromFileStatement(DataverseName dataverseName, String datasetName, Datatype itemType,
-                String adapter, Map<String, String> properties) {
+        public CompiledCopyFromFileStatement(String databaseName, DataverseName dataverseName, String datasetName,
+                Datatype itemType, String adapter, Map<String, String> properties) {
+            this.databaseName = databaseName;
             this.dataverseName = dataverseName;
             this.datasetName = datasetName;
             this.itemType = itemType;
@@ -305,6 +323,11 @@
         }
 
         @Override
+        public String getDatabaseName() {
+            return databaseName;
+        }
+
+        @Override
         public DataverseName getDataverseName() {
             return dataverseName;
         }
@@ -338,6 +361,8 @@
     }
 
     public static class CompiledInsertStatement extends AbstractCompiledStatement implements ICompiledDmlStatement {
+
+        private final String databaseName;
         private final DataverseName dataverseName;
         private final String datasetName;
         private final Query query;
@@ -345,8 +370,9 @@
         private final VariableExpr var;
         private final Expression returnExpression;
 
-        public CompiledInsertStatement(DataverseName dataverseName, String datasetName, Query query, int varCounter,
-                VariableExpr var, Expression returnExpression) {
+        public CompiledInsertStatement(String databaseName, DataverseName dataverseName, String datasetName,
+                Query query, int varCounter, VariableExpr var, Expression returnExpression) {
+            this.databaseName = databaseName;
             this.dataverseName = dataverseName;
             this.datasetName = datasetName;
             this.query = query;
@@ -356,6 +382,11 @@
         }
 
         @Override
+        public String getDatabaseName() {
+            return databaseName;
+        }
+
+        @Override
         public DataverseName getDataverseName() {
             return dataverseName;
         }
@@ -394,9 +425,9 @@
 
     public static class CompiledUpsertStatement extends CompiledInsertStatement {
 
-        public CompiledUpsertStatement(DataverseName dataverseName, String datasetName, Query query, int varCounter,
-                VariableExpr var, Expression returnExpression) {
-            super(dataverseName, datasetName, query, varCounter, var, returnExpression);
+        public CompiledUpsertStatement(String databaseName, DataverseName dataverseName, String datasetName,
+                Query query, int varCounter, VariableExpr var, Expression returnExpression) {
+            super(databaseName, dataverseName, datasetName, query, varCounter, var, returnExpression);
         }
 
         @Override
@@ -408,7 +439,7 @@
     public static class CompiledSubscribeFeedStatement extends AbstractCompiledStatement
             implements ICompiledDmlStatement {
 
-        private FeedConnectionRequest request;
+        private final FeedConnectionRequest request;
         private final int varCounter;
 
         public CompiledSubscribeFeedStatement(FeedConnectionRequest request, int varCounter) {
@@ -417,6 +448,11 @@
         }
 
         @Override
+        public String getDatabaseName() {
+            return request.getReceivingFeedId().getDatabaseName();
+        }
+
+        @Override
         public DataverseName getDataverseName() {
             return request.getReceivingFeedId().getDataverseName();
         }
@@ -446,14 +482,17 @@
     }
 
     public static class CompiledDeleteStatement extends AbstractCompiledStatement implements ICompiledDmlStatement {
+
+        private final String databaseName;
         private final DataverseName dataverseName;
         private final String datasetName;
         private final Expression condition;
         private final int varCounter;
         private final Query query;
 
-        public CompiledDeleteStatement(VariableExpr var, DataverseName dataverseName, String datasetName,
-                Expression condition, int varCounter, Query query) {
+        public CompiledDeleteStatement(VariableExpr var, String databaseName, DataverseName dataverseName,
+                String datasetName, Expression condition, int varCounter, Query query) {
+            this.databaseName = databaseName;
             this.dataverseName = dataverseName;
             this.datasetName = datasetName;
             this.condition = condition;
@@ -462,6 +501,11 @@
         }
 
         @Override
+        public String getDatabaseName() {
+            return databaseName;
+        }
+
+        @Override
         public String getDatasetName() {
             return datasetName;
         }
@@ -495,14 +539,21 @@
     }
 
     public static class CompiledCompactStatement extends AbstractCompiledStatement {
+
+        private final String databaseName;
         private final DataverseName dataverseName;
         private final String datasetName;
 
-        public CompiledCompactStatement(DataverseName dataverseName, String datasetName) {
+        public CompiledCompactStatement(String databaseName, DataverseName dataverseName, String datasetName) {
+            this.databaseName = databaseName;
             this.dataverseName = dataverseName;
             this.datasetName = datasetName;
         }
 
+        public String getDatabaseName() {
+            return databaseName;
+        }
+
         public DataverseName getDataverseName() {
             return dataverseName;
         }
@@ -518,11 +569,11 @@
     }
 
     public static class CompiledIndexCompactStatement extends CompiledCompactStatement {
-        private Dataset dataset;
-        private Index index;
+        private final Dataset dataset;
+        private final Index index;
 
         public CompiledIndexCompactStatement(Dataset dataset, Index index) {
-            super(dataset.getDataverseName(), dataset.getDatasetName());
+            super(dataset.getDatabaseName(), dataset.getDataverseName(), dataset.getDatasetName());
             this.dataset = dataset;
             this.index = index;
         }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
index b47d45d..0c9ce42 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
@@ -35,7 +35,7 @@
 import org.apache.asterix.common.api.IResponsePrinter;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.Query;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -290,15 +290,7 @@
             Query query, ICompiledDmlStatement dmlStatement, Map<String, IAObject> statementParameters,
             IRequestParameters requestParameters) throws RemoteException, AlgebricksException, ACIDException;
 
-    /**
-     * returns the active dataverse for an entity or a statement
-     *
-     * @param dataverseName:
-     *            the entity or statement dataverse
-     * @return
-     *         returns the passed dataverse if not null, the active dataverse otherwise
-     */
-    DataverseName getActiveDataverseName(DataverseName dataverseName);
+    Namespace getActiveNamespace(Namespace namespace);
 
     /**
      * Gets the execution plans that are generated during query compilation
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index f0dff9d..d156b25 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -40,7 +40,6 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Expression.Kind;
 import org.apache.asterix.lang.common.base.ILangExpression;
@@ -198,8 +197,8 @@
 
     public ILogicalPlan translateCopyOrLoad(ICompiledDmlStatement stmt) throws AlgebricksException {
         SourceLocation sourceLoc = stmt.getSourceLocation();
-        String database = MetadataUtil.resolveDatabase(null, stmt.getDataverseName());
-        Dataset dataset = metadataProvider.findDataset(database, stmt.getDataverseName(), stmt.getDatasetName());
+        Dataset dataset =
+                metadataProvider.findDataset(stmt.getDatabaseName(), stmt.getDataverseName(), stmt.getDatasetName());
         if (dataset == null) {
             // This would never happen since we check for this in AqlTranslator
             throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, stmt.getDatasetName(),
@@ -211,8 +210,8 @@
                 dataset.getMetaItemTypeDataverseName(), dataset.getMetaItemTypeName());
         itemType = metadataProvider.findTypeForDatasetWithoutType(itemType, metaItemType, dataset);
 
-        DatasetDataSource targetDatasource = validateDatasetInfo(metadataProvider, database, stmt.getDataverseName(),
-                stmt.getDatasetName(), sourceLoc);
+        DatasetDataSource targetDatasource = validateDatasetInfo(metadataProvider, stmt.getDatabaseName(),
+                stmt.getDataverseName(), stmt.getDatasetName(), sourceLoc);
         List<List<String>> partitionKeys = targetDatasource.getDataset().getPrimaryKeys();
         if (dataset.hasMetaPart()) {
             throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, sourceLoc, dataset.getDatasetName(),
@@ -415,8 +414,7 @@
             ProjectOperator projectOperator = (ProjectOperator) topOp;
             projectOperator.getVariables().set(0, seqVar);
 
-            String databaseName = MetadataUtil.resolveDatabase(null, stmt.getDataverseName());
-            DatasetDataSource targetDatasource = validateDatasetInfo(metadataProvider, databaseName,
+            DatasetDataSource targetDatasource = validateDatasetInfo(metadataProvider, stmt.getDatabaseName(),
                     stmt.getDataverseName(), stmt.getDatasetName(), sourceLoc);
             List<Integer> keySourceIndicator =
                     ((InternalDatasetDetails) targetDatasource.getDataset().getDatasetDetails())
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java
index c45013d..ce30325 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java
@@ -32,7 +32,7 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
-import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.RecordTypeDefinition;
 import org.apache.asterix.lang.common.expression.RecordTypeDefinition.RecordKind;
@@ -63,24 +63,25 @@
     private TypeTranslator() {
     }
 
-    public static Map<TypeSignature, IAType> computeTypes(DataverseName typeDataverse, String typeName,
-            TypeExpression typeExpr, DataverseName defaultDataverse, MetadataTransactionContext mdTxnCtx)
-            throws AlgebricksException {
+    public static Map<TypeSignature, IAType> computeTypes(String typeDatabase, DataverseName typeDataverse,
+            String typeName, TypeExpression typeExpr, String defaultDatabase, DataverseName defaultDataverse,
+            MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         Map<TypeSignature, IAType> typeMap = new HashMap<>();
-        computeTypes(typeDataverse, typeName, typeExpr, defaultDataverse, mdTxnCtx, typeMap);
+        computeTypes(typeDatabase, typeDataverse, typeName, typeExpr, defaultDatabase, defaultDataverse, mdTxnCtx,
+                typeMap);
         return typeMap;
     }
 
-    public static void computeTypes(DataverseName typeDataverse, String typeName, TypeExpression typeExpr,
-            DataverseName defaultDataverse, MetadataTransactionContext mdTxnCtx, Map<TypeSignature, IAType> outTypeMap)
-            throws AlgebricksException {
+    public static void computeTypes(String typeDatabase, DataverseName typeDataverse, String typeName,
+            TypeExpression typeExpr, String defaultDatabase, DataverseName defaultDataverse,
+            MetadataTransactionContext mdTxnCtx, Map<TypeSignature, IAType> outTypeMap) throws AlgebricksException {
         Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes = new HashMap<>();
         Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes = new HashMap<>();
         Map<TypeSignature, List<TypeSignature>> incompleteTopLevelTypeReferences = new HashMap<>();
-        firstPass(typeDataverse, typeName, typeExpr, outTypeMap, incompleteFieldTypes, incompleteItemTypes,
-                incompleteTopLevelTypeReferences, typeDataverse);
+        firstPass(typeDatabase, typeDataverse, typeName, typeExpr, outTypeMap, incompleteFieldTypes,
+                incompleteItemTypes, incompleteTopLevelTypeReferences, typeDatabase, typeDataverse);
         secondPass(mdTxnCtx, outTypeMap, incompleteFieldTypes, incompleteItemTypes, incompleteTopLevelTypeReferences,
-                typeDataverse, typeExpr.getSourceLocation());
+                typeDatabase, typeDataverse, typeExpr.getSourceLocation());
 
         for (IAType type : outTypeMap.values()) {
             if (type.getTypeTag().isDerivedType()) {
@@ -89,21 +90,22 @@
         }
     }
 
-    private static void firstPass(DataverseName typeDataverse, String typeName, TypeExpression typeExpr,
-            Map<TypeSignature, IAType> outTypeMap, Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes,
+    private static void firstPass(String typeDatabase, DataverseName typeDataverse, String typeName,
+            TypeExpression typeExpr, Map<TypeSignature, IAType> outTypeMap,
+            Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes,
             Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
-            Map<TypeSignature, List<TypeSignature>> incompleteTopLevelTypeReferences, DataverseName defaultDataverse)
-            throws AlgebricksException {
+            Map<TypeSignature, List<TypeSignature>> incompleteTopLevelTypeReferences, String defaultDatabase,
+            DataverseName defaultDataverse) throws AlgebricksException {
 
         if (BuiltinTypeMap.getBuiltinType(typeName) != null) {
             throw new CompilationException(ErrorCode.COMPILATION_ERROR, typeExpr.getSourceLocation(),
                     "Cannot redefine builtin type " + typeName);
         }
-        TypeSignature typeSignature = new TypeSignature(typeDataverse, typeName);
+        TypeSignature typeSignature = new TypeSignature(typeDatabase, typeDataverse, typeName);
         switch (typeExpr.getTypeKind()) {
             case TYPEREFERENCE: {
                 TypeReferenceExpression tre = (TypeReferenceExpression) typeExpr;
-                TypeSignature treSignature = createTypeSignature(tre, defaultDataverse);
+                TypeSignature treSignature = createTypeSignature(tre, defaultDatabase, defaultDataverse);
                 IAType t = solveTypeReference(treSignature, outTypeMap);
                 if (t != null) {
                     outTypeMap.put(typeSignature, t);
@@ -115,21 +117,21 @@
             case RECORD: {
                 RecordTypeDefinition rtd = (RecordTypeDefinition) typeExpr;
                 ARecordType recType = computeRecordType(typeSignature, rtd, outTypeMap, incompleteFieldTypes,
-                        incompleteItemTypes, typeDataverse);
+                        incompleteItemTypes, typeDatabase, typeDataverse);
                 outTypeMap.put(typeSignature, recType);
                 break;
             }
             case ORDEREDLIST: {
                 OrderedListTypeDefinition oltd = (OrderedListTypeDefinition) typeExpr;
                 AOrderedListType olType = computeOrderedListType(typeSignature, oltd, outTypeMap, incompleteItemTypes,
-                        incompleteFieldTypes, typeDataverse);
+                        incompleteFieldTypes, typeDatabase, typeDataverse);
                 outTypeMap.put(typeSignature, olType);
                 break;
             }
             case UNORDEREDLIST: {
                 UnorderedListTypeDefinition ultd = (UnorderedListTypeDefinition) typeExpr;
                 AUnorderedListType ulType = computeUnorderedListType(typeSignature, ultd, outTypeMap,
-                        incompleteItemTypes, incompleteFieldTypes, typeDataverse);
+                        incompleteItemTypes, incompleteFieldTypes, typeDatabase, typeDataverse);
                 outTypeMap.put(typeSignature, ulType);
                 break;
             }
@@ -142,8 +144,8 @@
     private static void secondPass(MetadataTransactionContext mdTxnCtx, Map<TypeSignature, IAType> typeMap,
             Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes,
             Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
-            Map<TypeSignature, List<TypeSignature>> incompleteTopLevelTypeReferences, DataverseName typeDataverse,
-            SourceLocation sourceLoc) throws AlgebricksException {
+            Map<TypeSignature, List<TypeSignature>> incompleteTopLevelTypeReferences, String typeDatabase,
+            DataverseName typeDataverse, SourceLocation sourceLoc) throws AlgebricksException {
         // solve remaining top level references
         for (TypeSignature typeSignature : incompleteTopLevelTypeReferences.keySet()) {
             IAType t;
@@ -161,7 +163,6 @@
         // solve remaining field type references
         for (String trefName : incompleteFieldTypes.keySet()) {
             IAType t;
-            String typeDatabase = MetadataUtil.resolveDatabase(null, typeDataverse);
             Datatype dt = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, typeDatabase, typeDataverse, trefName);
             if (dt == null) {
                 dt = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, MetadataConstants.SYSTEM_DATABASE,
@@ -209,61 +210,64 @@
 
     private static AOrderedListType computeOrderedListType(TypeSignature typeSignature, OrderedListTypeDefinition oltd,
             Map<TypeSignature, IAType> typeMap, Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
-            Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, DataverseName defaultDataverse)
-            throws AlgebricksException {
+            Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, String defaultDatabase,
+            DataverseName defaultDataverse) throws AlgebricksException {
         TypeExpression tExpr = oltd.getItemTypeExpression();
         String typeName = typeSignature != null ? typeSignature.getName() : null;
         AOrderedListType aolt = new AOrderedListType(ANY, typeName);
-        setCollectionItemType(tExpr, typeMap, incompleteItemTypes, incompleteFieldTypes, aolt, defaultDataverse);
+        setCollectionItemType(tExpr, typeMap, incompleteItemTypes, incompleteFieldTypes, aolt, defaultDatabase,
+                defaultDataverse);
         return aolt;
     }
 
     private static AUnorderedListType computeUnorderedListType(TypeSignature typeSignature,
             UnorderedListTypeDefinition ultd, Map<TypeSignature, IAType> typeMap,
             Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
-            Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, DataverseName defaulDataverse)
-            throws AlgebricksException {
+            Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, String defaultDatabase,
+            DataverseName defaultDataverse) throws AlgebricksException {
         TypeExpression tExpr = ultd.getItemTypeExpression();
         String typeName = typeSignature != null ? typeSignature.getName() : null;
         AUnorderedListType ault = new AUnorderedListType(ANY, typeName);
-        setCollectionItemType(tExpr, typeMap, incompleteItemTypes, incompleteFieldTypes, ault, defaulDataverse);
+        setCollectionItemType(tExpr, typeMap, incompleteItemTypes, incompleteFieldTypes, ault, defaultDatabase,
+                defaultDataverse);
         return ault;
     }
 
     private static void setCollectionItemType(TypeExpression tExpr, Map<TypeSignature, IAType> typeMap,
             Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
             Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, AbstractCollectionType act,
-            DataverseName defaultDataverse) throws AlgebricksException {
+            String defaultDatabase, DataverseName defaultDataverse) throws AlgebricksException {
         switch (tExpr.getTypeKind()) {
             case ORDEREDLIST: {
                 OrderedListTypeDefinition oltd = (OrderedListTypeDefinition) tExpr;
                 IAType t = computeOrderedListType(null, oltd, typeMap, incompleteItemTypes, incompleteFieldTypes,
-                        defaultDataverse);
+                        defaultDatabase, defaultDataverse);
                 act.setItemType(t);
                 break;
             }
             case UNORDEREDLIST: {
                 UnorderedListTypeDefinition ultd = (UnorderedListTypeDefinition) tExpr;
                 IAType t = computeUnorderedListType(null, ultd, typeMap, incompleteItemTypes, incompleteFieldTypes,
-                        defaultDataverse);
+                        defaultDatabase, defaultDataverse);
                 act.setItemType(t);
                 break;
             }
             case RECORD: {
                 RecordTypeDefinition rtd = (RecordTypeDefinition) tExpr;
                 IAType t = computeRecordType(null, rtd, typeMap, incompleteFieldTypes, incompleteItemTypes,
-                        defaultDataverse);
+                        defaultDatabase, defaultDataverse);
                 act.setItemType(t);
                 break;
             }
             case TYPEREFERENCE: {
                 TypeReferenceExpression tre = (TypeReferenceExpression) tExpr;
-                TypeSignature treSignature = createTypeSignature(tre, defaultDataverse);
+                TypeSignature treSignature = createTypeSignature(tre, defaultDatabase, defaultDataverse);
                 IAType tref = solveTypeReference(treSignature, typeMap);
                 if (tref != null) {
                     act.setItemType(tref);
                 } else {
-                    addIncompleteCollectionTypeReference(act, tre, incompleteItemTypes, defaultDataverse);
+                    addIncompleteCollectionTypeReference(act, tre, incompleteItemTypes, defaultDatabase,
+                            defaultDataverse);
                 }
                 break;
             }
@@ -275,8 +279,8 @@
 
     private static void addIncompleteCollectionTypeReference(AbstractCollectionType collType,
             TypeReferenceExpression tre, Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
-            DataverseName defaultDataverse) {
-        TypeSignature typeSignature = createTypeSignature(tre, defaultDataverse);
+            String defaultDatabase, DataverseName defaultDataverse) {
+        TypeSignature typeSignature = createTypeSignature(tre, defaultDatabase, defaultDataverse);
         List<AbstractCollectionType> typeList =
                 incompleteItemTypes.computeIfAbsent(typeSignature, k -> new ArrayList<>());
         typeList.add(collType);
@@ -308,8 +312,8 @@
 
     private static ARecordType computeRecordType(TypeSignature typeSignature, RecordTypeDefinition rtd,
             Map<TypeSignature, IAType> typeMap, Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes,
-            Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes, DataverseName defaultDataverse)
-            throws AlgebricksException {
+            Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes, String defaultDatabase,
+            DataverseName defaultDataverse) throws AlgebricksException {
         List<String> names = rtd.getFieldNames();
         int n = names.size();
         String[] fldNames = new String[n];
@@ -338,7 +342,7 @@
             switch (texpr.getTypeKind()) {
                 case TYPEREFERENCE: {
                     TypeReferenceExpression tre = (TypeReferenceExpression) texpr;
-                    TypeSignature signature = createTypeSignature(tre, defaultDataverse);
+                    TypeSignature signature = createTypeSignature(tre, defaultDatabase, defaultDataverse);
                     type = solveTypeReference(signature, typeMap);
                     if (type == null) {
                         addIncompleteFieldTypeReference(recType, j, tre, incompleteFieldTypes);
@@ -348,19 +352,19 @@
                 case RECORD: {
                     RecordTypeDefinition recTypeDef2 = (RecordTypeDefinition) texpr;
                     type = computeRecordType(null, recTypeDef2, typeMap, incompleteFieldTypes, incompleteItemTypes,
-                            defaultDataverse);
+                            defaultDatabase, defaultDataverse);
                     break;
                 }
                 case ORDEREDLIST: {
                     OrderedListTypeDefinition oltd = (OrderedListTypeDefinition) texpr;
                     type = computeOrderedListType(null, oltd, typeMap, incompleteItemTypes, incompleteFieldTypes,
-                            defaultDataverse);
+                            defaultDatabase, defaultDataverse);
                     break;
                 }
                 case UNORDEREDLIST: {
                     UnorderedListTypeDefinition ultd = (UnorderedListTypeDefinition) texpr;
                     type = computeUnorderedListType(null, ultd, typeMap, incompleteItemTypes, incompleteFieldTypes,
-                            defaultDataverse);
+                            defaultDatabase, defaultDataverse);
                     break;
                 }
                 default: {
@@ -376,9 +380,18 @@
         return recType;
     }
 
-    private static TypeSignature createTypeSignature(TypeReferenceExpression tre, DataverseName defaultDataverse) {
-        Pair<DataverseName, Identifier> treTypeName = tre.getIdent();
-        DataverseName activeDataverse = treTypeName.first == null ? defaultDataverse : treTypeName.first;
-        return new TypeSignature(activeDataverse, treTypeName.second.getValue());
+    private static TypeSignature createTypeSignature(TypeReferenceExpression tre, String defaultDatabase,
+            DataverseName defaultDataverse) {
+        Pair<Namespace, Identifier> treTypeName = tre.getIdent();
+        DataverseName activeDataverse;
+        String activeDatabase;
+        if (treTypeName.first == null) {
+            activeDataverse = defaultDataverse;
+            activeDatabase = defaultDatabase;
+        } else {
+            activeDataverse = treTypeName.first.getDataverseName();
+            activeDatabase = treTypeName.first.getDatabaseName();
+        }
+        return new TypeSignature(activeDatabase, activeDataverse, treTypeName.second.getValue());
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractNCUdfServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractNCUdfServlet.java
index 9c8cc5e..8c5a93b 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractNCUdfServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractNCUdfServlet.java
@@ -34,7 +34,7 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.common.functions.ExternalFunctionLanguage;
-import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -142,16 +142,17 @@
         return field == null || !field.getHttpDataType().equals(InterfaceHttpData.HttpDataType.Attribute);
     }
 
-    protected Pair<DataverseName, String> decodeDvAndLibFromLocalPath(String localPath)
+    protected Pair<Namespace, String> decodeDvAndLibFromLocalPath(String localPath)
             throws RuntimeDataException, AlgebricksException {
         String[] pathSegments = StringUtils.split(localPath, '/');
         if (pathSegments.length != 2) {
             throw RuntimeDataException.create(ErrorCode.PARAMETERS_REQUIRED,
                     "The URL-encoded " + getDataverseKey() + " name and library name in the request path");
         }
-        DataverseName dvName = DataverseName.createFromCanonicalForm(ServletUtil.decodeUriSegment(pathSegments[0]));
+        String namespaceStr = ServletUtil.decodeUriSegment(pathSegments[0]);
+        Namespace namespace = plainAppCtx.getNamespaceResolver().resolve(namespaceStr);
         String libName = ServletUtil.decodeUriSegment(pathSegments[1]);
-        return new Pair<>(dvName, libName);
+        return new Pair<>(namespace, libName);
     }
 
     protected LibraryUploadData decodeMultiPartLibraryOptions(HttpPostRequestDecoder requestDecoder)
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
index 1163716..df27ff4 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
@@ -30,7 +30,7 @@
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -63,7 +63,7 @@
  */
 public class ConnectorApiServlet extends AbstractServlet {
     private static final Logger LOGGER = LogManager.getLogger();
-    private ICcApplicationContext appCtx;
+    private final ICcApplicationContext appCtx;
 
     public ConnectorApiServlet(ConcurrentMap<String, Object> ctx, String[] paths, ICcApplicationContext appCtx) {
         super(ctx, paths);
@@ -84,24 +84,25 @@
         PrintWriter out = response.writer();
         try {
             ObjectNode jsonResponse = OBJECT_MAPPER.createObjectNode();
-            DataverseName dataverseName = ServletUtil.getDataverseName(request, "dataverseName");
+            Namespace namespace = ServletUtil.getNamespace(appCtx, request, "dataverseName");
             String datasetName = request.getParameter("datasetName");
-            if (dataverseName == null || datasetName == null) {
+            if (namespace == null || datasetName == null) {
                 jsonResponse.put("error", "Parameter dataverseName or datasetName is null,");
                 out.write(jsonResponse.toString());
                 return;
             }
 
-            String database = MetadataUtil.resolveDatabase(null, dataverseName);
+            String databaseName = namespace.getDatabaseName();
+            DataverseName dataverseName = namespace.getDataverseName();
             IHyracksClientConnection hcc = (IHyracksClientConnection) ctx.get(HYRACKS_CONNECTION_ATTR);
             // Metadata transaction begins.
             MetadataManager.INSTANCE.init();
             MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
             // Retrieves file splits of the dataset.
-            MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+            MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
             try {
                 metadataProvider.setMetadataTxnContext(mdTxnCtx);
-                Dataset dataset = metadataProvider.findDataset(database, dataverseName, datasetName);
+                Dataset dataset = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
                 if (dataset == null) {
                     jsonResponse.put("error", StringUtils.capitalize(dataset()) + " " + datasetName
                             + " does not exist in " + dataverse() + " " + dataverseName);
@@ -126,7 +127,7 @@
                         hcc.getNodeControllerInfos());
 
                 // Flush the cached contents of the dataset to file system.
-                FlushDatasetUtil.flushDataset(hcc, metadataProvider, database, dataverseName, datasetName);
+                FlushDatasetUtil.flushDataset(hcc, metadataProvider, databaseName, dataverseName, datasetName);
 
                 // Metadata transaction commits.
                 MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java
index 47685d8..9698f3b 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java
@@ -54,6 +54,7 @@
 import org.apache.asterix.common.messaging.api.INCMessageBroker;
 import org.apache.asterix.common.messaging.api.MessageFuture;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.external.util.ExternalLibraryUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
@@ -131,24 +132,23 @@
         return Collections.emptyMap();
     }
 
-    private void doCreate(DataverseName dataverseName, String libraryName, ExternalFunctionLanguage language,
-            String hash, URI downloadURI, boolean replaceIfExists, String sysAuthHeader,
-            IRequestReference requestReference, IServletRequest request) throws Exception {
+    private void doCreate(Namespace libNamespace, String libraryName, ExternalFunctionLanguage language, String hash,
+            URI downloadURI, boolean replaceIfExists, String sysAuthHeader, IRequestReference requestReference,
+            IServletRequest request) throws Exception {
         INCMessageBroker ncMb = (INCMessageBroker) srvCtx.getMessageBroker();
         MessageFuture responseFuture = ncMb.registerMessageFuture();
         CreateLibraryRequestMessage req = new CreateLibraryRequestMessage(srvCtx.getNodeId(),
-                responseFuture.getFutureId(), dataverseName, libraryName, language, hash, downloadURI, replaceIfExists,
+                responseFuture.getFutureId(), libNamespace, libraryName, language, hash, downloadURI, replaceIfExists,
                 sysAuthHeader, requestReference, additionalHttpHeadersFromRequest(request));
         sendMessage(req, responseFuture);
     }
 
-    private void doDrop(DataverseName dataverseName, String libraryName, boolean replaceIfExists,
+    private void doDrop(Namespace namespace, String libraryName, boolean replaceIfExists,
             IRequestReference requestReference, IServletRequest request) throws Exception {
         INCMessageBroker ncMb = (INCMessageBroker) srvCtx.getMessageBroker();
         MessageFuture responseFuture = ncMb.registerMessageFuture();
-        DropLibraryRequestMessage req =
-                new DropLibraryRequestMessage(srvCtx.getNodeId(), responseFuture.getFutureId(), dataverseName,
-                        libraryName, replaceIfExists, requestReference, additionalHttpHeadersFromRequest(request));
+        DropLibraryRequestMessage req = new DropLibraryRequestMessage(srvCtx.getNodeId(), responseFuture.getFutureId(),
+                namespace, libraryName, replaceIfExists, requestReference, additionalHttpHeadersFromRequest(request));
         sendMessage(req, responseFuture);
     }
 
@@ -230,7 +230,10 @@
         HttpPostRequestDecoder requestDecoder = null;
         String localPath = localPath(request);
         try {
-            Pair<DataverseName, String> dvAndName = decodeDvAndLibFromLocalPath(localPath);
+            Pair<Namespace, String> namespaceAndName = decodeDvAndLibFromLocalPath(localPath);
+            String libName = namespaceAndName.second;
+            Namespace libNamespace = namespaceAndName.first;
+            DataverseName libDv = libNamespace.getDataverseName();
             IRequestReference requestReference = receptionist.welcome(request);
             if (op == LibraryOperation.UPSERT) {
                 requestDecoder = new HttpPostRequestDecoder(httpRequest);
@@ -240,7 +243,7 @@
                 libraryTempFile = Files.createTempFile(workingDir, "lib_", '.' + fileExt);
                 if (LOGGER.isDebugEnabled()) {
                     LOGGER.debug("Created temporary file " + libraryTempFile + " for library "
-                            + dvAndName.getFirst().getCanonicalForm() + "." + dvAndName.getSecond());
+                            + libDv.getCanonicalForm() + "." + libName);
                 }
                 MessageDigest digest = MessageDigest.getInstance("MD5");
                 libTmpOut = new FileOutputStream(libraryTempFile.toFile());
@@ -249,12 +252,11 @@
                     IOUtils.copyLarge(ui, os);
                 }
                 URI downloadURI = createDownloadURI(libraryTempFile);
-                doCreate(dvAndName.getFirst(), dvAndName.getSecond(), language,
-                        ExternalLibraryUtils.digestToHexString(digest), downloadURI, true, getSysAuthHeader(),
-                        requestReference, request);
+                doCreate(libNamespace, libName, language, ExternalLibraryUtils.digestToHexString(digest), downloadURI,
+                        true, getSysAuthHeader(), requestReference, request);
             } else if (op == LibraryOperation.DELETE) {
                 //DELETE semantics imply ifExists
-                doDrop(dvAndName.getFirst(), dvAndName.getSecond(), false, requestReference, request);
+                doDrop(libNamespace, libName, false, requestReference, request);
             }
             response.setStatus(HttpResponseStatus.OK);
             PrintWriter responseWriter = response.writer();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
index bfc8208..c730dd0 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
@@ -41,7 +41,7 @@
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
-import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -110,9 +110,9 @@
     protected void post(IServletRequest request, IServletResponse response) {
         try {
             // Gets dataverse, dataset, and target nodes for rebalance.
-            DataverseName dataverseName;
+            Namespace namespace;
             try {
-                dataverseName = ServletUtil.getDataverseName(request, "dataverseName");
+                namespace = ServletUtil.getNamespace(appCtx, request, "dataverseName");
             } catch (AlgebricksException e) {
                 sendResponse(response, HttpResponseStatus.BAD_REQUEST, e.getMessage());
                 return;
@@ -131,21 +131,27 @@
             }
 
             // If a user gives parameter datasetName, she should give dataverseName as well.
-            if (dataverseName == null && datasetName != null) {
+            if (namespace == null && datasetName != null) {
                 sendResponse(response, HttpResponseStatus.BAD_REQUEST,
                         "to rebalance a particular " + dataset() + ", the parameter dataverseName must be given");
                 return;
             }
 
+            DataverseName dataverseName = null;
+            String databaseName = null;
+            if (namespace != null) {
+                dataverseName = namespace.getDataverseName();
+                databaseName = namespace.getDatabaseName();
+            }
+            //TODO(DB): also check System database
             // Does not allow rebalancing a metadata dataset.
             if (MetadataConstants.METADATA_DATAVERSE_NAME.equals(dataverseName)) {
                 sendResponse(response, HttpResponseStatus.BAD_REQUEST, "cannot rebalance a metadata " + dataset());
                 return;
             }
             // Schedules a rebalance task and wait for its completion.
-            String database = MetadataUtil.resolveDatabase(null, dataverseName);
             CountDownLatch terminated =
-                    scheduleRebalance(database, dataverseName, datasetName, targetNodes, response, forceRebalance);
+                    scheduleRebalance(databaseName, dataverseName, datasetName, targetNodes, response, forceRebalance);
             terminated.await();
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
@@ -263,7 +269,7 @@
     private void rebalanceDataset(String database, DataverseName dataverseName, String datasetName,
             Set<String> targetNodes, boolean force) throws Exception {
         IHyracksClientConnection hcc = (IHyracksClientConnection) ctx.get(HYRACKS_CONNECTION_ATTR);
-        MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         try {
             ActiveNotificationHandler activeNotificationHandler =
                     (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ServletUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ServletUtil.java
index 8d5e4db..a272fbd 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ServletUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ServletUtil.java
@@ -26,6 +26,7 @@
 
 import org.apache.asterix.common.api.IApplicationContext;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.commons.codec.DecoderException;
 import org.apache.commons.codec.net.URLCodec;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -53,6 +54,12 @@
         return !values.isEmpty() ? DataverseName.create(values) : null;
     }
 
+    public static Namespace getNamespace(IApplicationContext appCtx, IServletRequest request,
+            String dataverseParameterName) throws AlgebricksException {
+        List<String> values = request.getParameterValues(dataverseParameterName);
+        return !values.isEmpty() ? appCtx.getNamespaceResolver().resolve(values) : null;
+    }
+
     public static String decodeUriSegment(String uriSegment) {
         try {
             return new String(URLCodec.decodeUrl(uriSegment.getBytes(StandardCharsets.US_ASCII)),
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
index 9b87fc9..8ef756f 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
@@ -119,7 +119,7 @@
         this.statementExecutor = statementExecutor;
         this.appCtx = appCtx;
         this.clusterStateManager = appCtx.getClusterStateManager();
-        this.metadataProvider = MetadataProvider.create(appCtx, null);
+        this.metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         this.hcc = hcc;
         this.entityId = entityId;
         this.datasets = new HashSet<>(datasets);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java
index a18cd45..3a81c09 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java
@@ -67,7 +67,8 @@
     @Override
     public synchronized boolean remove(Dataset dataset) throws HyracksDataException {
         super.remove(dataset);
-        feedConnections.removeIf(o -> o.getDataverseName().equals(dataset.getDataverseName())
+        feedConnections.removeIf(o -> o.getDatabaseName().equals(dataset.getDatabaseName())
+                && o.getDataverseName().equals(dataset.getDataverseName())
                 && o.getDatasetName().equals(dataset.getDatasetName()));
         return false;
     }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
index f63cc9f..d0a2e74 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
@@ -55,7 +55,7 @@
             IRetryPolicyFactory retryPolicyFactory) {
         this.listener = listener;
         this.retryPolicyFactory = retryPolicyFactory;
-        this.metadataProvider = MetadataProvider.create(appCtx, null);
+        this.metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         this.clusterStateManager = appCtx.getClusterStateManager();
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CreateLibraryRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CreateLibraryRequestMessage.java
index f23b6e4..1556b86 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CreateLibraryRequestMessage.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CreateLibraryRequestMessage.java
@@ -23,26 +23,26 @@
 
 import org.apache.asterix.common.api.IRequestReference;
 import org.apache.asterix.common.functions.ExternalFunctionLanguage;
-import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.CreateLibraryStatement;
 
 public final class CreateLibraryRequestMessage extends AbstractInternalRequestMessage {
 
-    final DataverseName dataverseName;
+    final Namespace namespace;
     final String libraryName;
     final ExternalFunctionLanguage lang;
     final String hash;
     final URI location;
     final boolean replaceIfExists;
     final String authToken;
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
 
-    public CreateLibraryRequestMessage(String nodeRequestId, long requestMessageId, DataverseName dataverseName,
+    public CreateLibraryRequestMessage(String nodeRequestId, long requestMessageId, Namespace namespace,
             String libraryName, ExternalFunctionLanguage lang, String hash, URI location, boolean replaceIfExists,
             String authToken, IRequestReference requestReference, Map<String, String> additionalParams) {
         super(nodeRequestId, requestMessageId, requestReference, additionalParams);
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.libraryName = libraryName;
         this.lang = lang;
         this.hash = hash;
@@ -52,6 +52,6 @@
     }
 
     protected Statement produceStatement() {
-        return new CreateLibraryStatement(dataverseName, libraryName, lang, hash, location, replaceIfExists, authToken);
+        return new CreateLibraryStatement(namespace, libraryName, lang, hash, location, replaceIfExists, authToken);
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/DropLibraryRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/DropLibraryRequestMessage.java
index e7e8931..4fb81c3 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/DropLibraryRequestMessage.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/DropLibraryRequestMessage.java
@@ -21,28 +21,28 @@
 import java.util.Map;
 
 import org.apache.asterix.common.api.IRequestReference;
-import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.LibraryDropStatement;
 
 public final class DropLibraryRequestMessage extends AbstractInternalRequestMessage {
 
-    final DataverseName dataverseName;
+    final Namespace namespace;
     final String libraryName;
     final boolean ifExists;
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
 
-    public DropLibraryRequestMessage(String nodeRequestId, long requestMessageId, DataverseName dataverseName,
+    public DropLibraryRequestMessage(String nodeRequestId, long requestMessageId, Namespace namespace,
             String libraryName, boolean ifExists, IRequestReference requestReference,
             Map<String, String> additionalParams) {
         super(nodeRequestId, requestMessageId, requestReference, additionalParams);
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.libraryName = libraryName;
         this.ifExists = ifExists;
     }
 
     @Override
     protected Statement produceStatement() {
-        return new LibraryDropStatement(dataverseName, libraryName, ifExists);
+        return new LibraryDropStatement(namespace, libraryName, ifExists);
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 455567d..4b19200 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -289,7 +289,7 @@
     protected final ICcApplicationContext appCtx;
     protected final SessionOutput sessionOutput;
     protected final SessionConfig sessionConfig;
-    protected Dataverse activeDataverse;
+    protected Namespace activeNamespace;
     protected final List<FunctionDecl> declaredFunctions;
     protected final ILangCompilationProvider compilationProvider;
     protected final APIFramework apiFramework;
@@ -317,7 +317,7 @@
         declaredFunctions = new ArrayList<>();
         apiFramework = new APIFramework(compilationProvider);
         rewriterFactory = compilationProvider.getRewriterFactory();
-        activeDataverse = MetadataBuiltinEntities.DEFAULT_DATAVERSE;
+        activeNamespace = MetadataBuiltinEntities.DEFAULT_NAMESPACE;
         this.executorService = executorService;
         this.responsePrinter = responsePrinter;
         this.warningCollector = new WarningCollector();
@@ -360,8 +360,8 @@
                 if (sessionConfig.is(SessionConfig.FORMAT_HTML)) {
                     sessionOutput.out().println(ApiServlet.HTML_STATEMENT_SEPARATOR);
                 }
-                validateOperation(appCtx, activeDataverse, stmt);
-                MetadataProvider metadataProvider = MetadataProvider.create(appCtx, activeDataverse);
+                validateOperation(appCtx, activeNamespace, stmt);
+                MetadataProvider metadataProvider = MetadataProvider.create(appCtx, activeNamespace);
                 configureMetadataProvider(metadataProvider, config, resultSetIdCounter, outputFile, requestParameters,
                         stmt);
                 IStatementRewriter stmtRewriter = rewriterFactory.createStatementRewriter();
@@ -373,7 +373,7 @@
                         handleSetStatement(stmt, config);
                         break;
                     case DATAVERSE_DECL:
-                        activeDataverse = handleUseDataverseStatement(metadataProvider, stmt);
+                        activeNamespace = handleUseDataverseStatement(metadataProvider, stmt);
                         break;
                     case CREATE_DATABASE:
                         handleCreateDatabaseStatement(metadataProvider, stmt, requestParameters);
@@ -588,7 +588,7 @@
                 varCounter);
     }
 
-    protected Dataverse handleUseDataverseStatement(MetadataProvider metadataProvider, Statement stmt)
+    protected Namespace handleUseDataverseStatement(MetadataProvider metadataProvider, Statement stmt)
             throws Exception {
         DataverseDecl dvd = (DataverseDecl) stmt;
         DataverseName dvName = dvd.getDataverseName();
@@ -603,15 +603,15 @@
         }
     }
 
-    protected Dataverse doUseDataverseStatement(MetadataProvider metadataProvider, DataverseDecl stmtUseDataverse)
+    protected Namespace doUseDataverseStatement(MetadataProvider metadataProvider, DataverseDecl stmtUseDataverse)
             throws Exception {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
             DataverseName dvName = stmtUseDataverse.getDataverseName();
-            String database = stmtUseDataverse.getDatabaseName();
+            String dbName = stmtUseDataverse.getDatabaseName();
             Dataverse dv =
-                    MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), database, dvName);
+                    MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), dbName, dvName);
             if (dv == null) {
                 if (stmtUseDataverse.getIfExists()) {
                     if (warningCollector.shouldWarn()) {
@@ -619,14 +619,15 @@
                                 Warning.of(stmtUseDataverse.getSourceLocation(), ErrorCode.UNKNOWN_DATAVERSE, dvName));
                     }
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-                    return activeDataverse;
+                    return activeNamespace;
                 } else {
                     throw new MetadataException(ErrorCode.UNKNOWN_DATAVERSE, stmtUseDataverse.getSourceLocation(),
                             dvName);
                 }
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-            return dv;
+            //TODO(DB): should the stmt namespace be used?
+            return new Namespace(dv.getDatabaseName(), dv.getDataverseName());
         } catch (Exception e) {
             abort(e, e, mdTxnCtx);
             throw e;
@@ -681,12 +682,12 @@
             IRequestParameters requestParameters) throws Exception {
         CreateDataverseStatement stmtCreateDataverse = (CreateDataverseStatement) stmt;
         DataverseName dvName = stmtCreateDataverse.getDataverseName();
-        String database = MetadataUtil.resolveDatabase(null, dvName);
+        String dbName = stmtCreateDataverse.getDatabaseName();
         metadataProvider.validateDataverseName(dvName, stmtCreateDataverse.getSourceLocation());
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createDataverseBegin(lockManager, metadataProvider.getLocks(), database, dvName);
+        lockUtil.createDataverseBegin(lockManager, metadataProvider.getLocks(), dbName, dvName);
         try {
             doCreateDataverseStatement(metadataProvider, stmtCreateDataverse, requestParameters);
         } finally {
@@ -701,9 +702,9 @@
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
             DataverseName dvName = stmtCreateDataverse.getDataverseName();
-            String database = MetadataUtil.resolveDatabase(null, dvName);
+            String dbName = stmtCreateDataverse.getDatabaseName();
             Dataverse dv =
-                    MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), database, dvName);
+                    MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(), dbName, dvName);
             if (dv != null) {
                 if (stmtCreateDataverse.getIfNotExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -714,7 +715,7 @@
                 }
             }
             MetadataManager.INSTANCE.addDataverse(metadataProvider.getMetadataTxnContext(),
-                    new Dataverse(database, dvName, stmtCreateDataverse.getFormat(), MetadataUtil.PENDING_NO_OP));
+                    new Dataverse(dbName, dvName, stmtCreateDataverse.getFormat(), MetadataUtil.PENDING_NO_OP));
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             return true;
         } catch (Exception e) {
@@ -765,22 +766,31 @@
         DatasetDecl dd = (DatasetDecl) stmt;
         String datasetName = dd.getName().getValue();
         metadataProvider.validateDatabaseObjectName(dd.getDataverse(), datasetName, stmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(dd.getDataverse());
+        Namespace stmtActiveNamespace = getActiveNamespace(dd.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         TypeExpression itemTypeExpr = dd.getItemType();
-        Triple<DataverseName, String, Boolean> itemTypeQualifiedName =
-                extractDatasetItemTypeName(dataverseName, datasetName, itemTypeExpr, false, stmt.getSourceLocation());
-        DataverseName itemTypeDataverseName = itemTypeQualifiedName.first;
+        Triple<Namespace, String, Boolean> itemTypeQualifiedName = extractDatasetItemTypeName(stmtActiveNamespace,
+                datasetName, itemTypeExpr, false, stmt.getSourceLocation());
+        Namespace itemTypeNamespace = itemTypeQualifiedName.first;
+        DataverseName itemTypeDataverseName = itemTypeNamespace.getDataverseName();
+        String itemTypeDatabase = itemTypeNamespace.getDatabaseName();
+
         String itemTypeName = itemTypeQualifiedName.second;
         boolean itemTypeAnonymous = itemTypeQualifiedName.third;
 
         TypeExpression metaItemTypeExpr = dd.getMetaItemType();
+        Namespace metaItemTypeNamespace = null;
         DataverseName metaItemTypeDataverseName = null;
+        String metaItemTypeDatabase = null;
         String metaItemTypeName = null;
         boolean metaItemTypeAnonymous;
         if (metaItemTypeExpr != null) {
-            Triple<DataverseName, String, Boolean> metaItemTypeQualifiedName = extractDatasetItemTypeName(dataverseName,
-                    datasetName, metaItemTypeExpr, true, stmt.getSourceLocation());
-            metaItemTypeDataverseName = metaItemTypeQualifiedName.first;
+            Triple<Namespace, String, Boolean> metaItemTypeQualifiedName = extractDatasetItemTypeName(
+                    stmtActiveNamespace, datasetName, metaItemTypeExpr, true, stmt.getSourceLocation());
+            metaItemTypeNamespace = metaItemTypeQualifiedName.first;
+            metaItemTypeDataverseName = metaItemTypeNamespace.getDataverseName();
+            metaItemTypeDatabase = metaItemTypeNamespace.getDatabaseName();
             metaItemTypeName = metaItemTypeQualifiedName.second;
             metaItemTypeAnonymous = metaItemTypeQualifiedName.third;
         } else {
@@ -794,16 +804,14 @@
         if (isCompileOnly()) {
             return;
         }
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
-        String itemTypeDatabase = MetadataUtil.resolveDatabase(null, itemTypeDataverseName);
-        String metaItemTypeDatabase = MetadataUtil.resolveDatabase(null, metaItemTypeDataverseName);
-        lockUtil.createDatasetBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName,
+
+        lockUtil.createDatasetBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName,
                 itemTypeDatabase, itemTypeDataverseName, itemTypeName, itemTypeAnonymous, metaItemTypeDatabase,
                 metaItemTypeDataverseName, metaItemTypeName, metaItemTypeAnonymous, nodegroupName, compactionPolicy,
                 defaultCompactionPolicy, dd.getDatasetType(), dd.getDatasetDetailsDecl());
         try {
-            doCreateDatasetStatement(metadataProvider, dd, dataverseName, datasetName, itemTypeDataverseName,
-                    itemTypeExpr, itemTypeName, metaItemTypeExpr, metaItemTypeDataverseName, metaItemTypeName, hcc,
+            doCreateDatasetStatement(metadataProvider, dd, stmtActiveNamespace, datasetName, itemTypeNamespace,
+                    itemTypeExpr, itemTypeName, metaItemTypeExpr, metaItemTypeNamespace, metaItemTypeName, hcc,
                     requestParameters);
             if (dd.getQuery() != null) {
                 final IResultSet resultSet = requestParameters.getResultSet();
@@ -813,7 +821,7 @@
                 final ResultMetadata outMetadata = requestParameters.getOutMetadata();
                 final Map<String, IAObject> stmtParams = requestParameters.getStatementParameters();
                 UpsertStatement upsertStmt =
-                        new UpsertStatement(dataverseName, datasetName, dd.getQuery(), -1, null, null);
+                        new UpsertStatement(stmtActiveNamespace, datasetName, dd.getQuery(), -1, null, null);
                 handleInsertUpsertStatement(metadataProvider, upsertStmt, hcc, resultSet, resultDelivery, outMetadata,
                         stats, requestParameters, stmtParams, stmtRewriter);
             }
@@ -824,13 +832,27 @@
     }
 
     protected Optional<? extends Dataset> doCreateDatasetStatement(MetadataProvider metadataProvider, DatasetDecl dd,
-            DataverseName dataverseName, String datasetName, DataverseName itemTypeDataverseName,
-            TypeExpression itemTypeExpr, String itemTypeName, TypeExpression metaItemTypeExpr,
-            DataverseName metaItemTypeDataverseName, String metaItemTypeName, IHyracksClientConnection hcc,
-            IRequestParameters requestParameters) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
-        String itemTypeDatabase = MetadataUtil.resolveDatabase(null, itemTypeDataverseName);
-        String metaItemDatabase = MetadataUtil.resolveDatabase(null, metaItemTypeDataverseName);
+            Namespace namespace, String datasetName, Namespace itemTypeNamespace, TypeExpression itemTypeExpr,
+            String itemTypeName, TypeExpression metaItemTypeExpr, Namespace metaItemTypeNamespace,
+            String metaItemTypeName, IHyracksClientConnection hcc, IRequestParameters requestParameters)
+            throws Exception {
+        DataverseName dataverseName = namespace.getDataverseName();
+        String databaseName = namespace.getDatabaseName();
+
+        DataverseName itemTypeDataverseName = null;
+        String itemTypeDatabaseName = null;
+        if (itemTypeNamespace != null) {
+            itemTypeDataverseName = itemTypeNamespace.getDataverseName();
+            itemTypeDatabaseName = itemTypeNamespace.getDatabaseName();
+        }
+
+        DataverseName metaItemTypeDataverseName = null;
+        String metaItemTypeDatabaseName = null;
+        if (metaItemTypeNamespace != null) {
+            metaItemTypeDataverseName = metaItemTypeNamespace.getDataverseName();
+            metaItemTypeDatabaseName = metaItemTypeNamespace.getDatabaseName();
+        }
+
         MutableObject<ProgressState> progress = new MutableObject<>(ProgressState.NO_PROGRESS);
         SourceLocation sourceLoc = dd.getSourceLocation();
         DatasetType dsType = dd.getDatasetType();
@@ -851,13 +873,13 @@
                 storageProperties.getColumnMaxTupleCount(), storageProperties.getColumnFreeSpaceTolerance());
         try {
             // Check if the dataverse exists
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
             }
 
             IDatasetDetails datasetDetails;
-            Dataset ds = metadataProvider.findDataset(database, dataverseName, datasetName, true);
+            Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName, true);
             if (ds != null) {
                 if (ds.getDatasetType() == DatasetType.VIEW) {
                     throw new CompilationException(ErrorCode.VIEW_EXISTS, sourceLoc,
@@ -871,15 +893,15 @@
                 }
             }
 
-            Pair<Datatype, Boolean> itemTypePair = fetchDatasetItemType(mdTxnCtx, dsType, itemTypeDataverseName,
-                    itemTypeName, itemTypeExpr, false, metadataProvider, sourceLoc);
+            Pair<Datatype, Boolean> itemTypePair = fetchDatasetItemType(mdTxnCtx, dsType, itemTypeDatabaseName,
+                    itemTypeDataverseName, itemTypeName, itemTypeExpr, false, metadataProvider, sourceLoc);
             itemTypeEntity = itemTypePair.first;
             IAType itemType = itemTypeEntity.getDatatype();
             boolean itemTypeIsInline = itemTypePair.second;
 
             String ngName = ngNameId != null ? ngNameId
-                    : configureNodegroupForDataset(appCtx, dd.getHints(), dataverseName, datasetName, metadataProvider,
-                            sourceLoc);
+                    : configureNodegroupForDataset(appCtx, dd.getHints(), databaseName, dataverseName, datasetName,
+                            metadataProvider, sourceLoc);
 
             if (compactionPolicy == null) {
                 compactionPolicy = StorageConstants.DEFAULT_COMPACTION_POLICY_NAME;
@@ -893,9 +915,9 @@
             switch (dsType) {
                 case INTERNAL:
                     if (metaItemTypeExpr != null) {
-                        Pair<Datatype, Boolean> metaItemTypePair =
-                                fetchDatasetItemType(mdTxnCtx, dsType, metaItemTypeDataverseName, metaItemTypeName,
-                                        metaItemTypeExpr, true, metadataProvider, sourceLoc);
+                        Pair<Datatype, Boolean> metaItemTypePair = fetchDatasetItemType(mdTxnCtx, dsType,
+                                metaItemTypeDatabaseName, metaItemTypeDataverseName, metaItemTypeName, metaItemTypeExpr,
+                                true, metadataProvider, sourceLoc);
                         metaItemTypeEntity = metaItemTypePair.first;
                         metaItemType = metaItemTypeEntity.getDatatype();
                         metaItemTypeIsInline = metaItemTypePair.second;
@@ -938,8 +960,8 @@
                     break;
                 case EXTERNAL:
                     ExternalDetailsDecl externalDetails = (ExternalDetailsDecl) dd.getDatasetDetailsDecl();
-                    Map<String, String> properties = createExternalDatasetProperties(dataverseName, dd, itemTypeEntity,
-                            metadataProvider, mdTxnCtx);
+                    Map<String, String> properties = createExternalDatasetProperties(databaseName, dataverseName, dd,
+                            itemTypeEntity, metadataProvider, mdTxnCtx);
                     ExternalDataUtils.normalize(properties);
                     ExternalDataUtils.validate(properties);
                     validateExternalDatasetProperties(externalDetails, properties, dd.getSourceLocation(), mdTxnCtx,
@@ -958,10 +980,10 @@
             }
 
             // #. add a new dataset with PendingAddOp
-            dataset = (Dataset) createDataset(dd, database, dataverseName, datasetName, itemTypeDatabase,
-                    itemTypeDataverseName, itemTypeName, metaItemDatabase, metaItemTypeDataverseName, metaItemTypeName,
-                    dsType, compactionPolicy, compactionPolicyProperties, compressionScheme, datasetFormatInfo,
-                    datasetDetails, ngName);
+            dataset = (Dataset) createDataset(dd, databaseName, dataverseName, datasetName, itemTypeDatabaseName,
+                    itemTypeDataverseName, itemTypeName, metaItemTypeDatabaseName, metaItemTypeDataverseName,
+                    metaItemTypeName, dsType, compactionPolicy, compactionPolicyProperties, compressionScheme,
+                    datasetFormatInfo, datasetDetails, ngName);
             MetadataManager.INSTANCE.addDataset(metadataProvider.getMetadataTxnContext(), dataset);
 
             if (itemTypeIsInline) {
@@ -992,7 +1014,7 @@
 
             // #. add a new dataset with PendingNoOp after deleting the dataset with
             // PendingAddOp
-            MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), database, dataverseName,
+            MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), databaseName, dataverseName,
                     datasetName, requestParameters.isForceDropDataset());
             dataset.setPendingOp(MetadataUtil.PENDING_NO_OP);
             MetadataManager.INSTANCE.addDataset(metadataProvider.getMetadataTxnContext(), dataset);
@@ -1030,7 +1052,7 @@
                 mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                 metadataProvider.setMetadataTxnContext(mdTxnCtx);
                 try {
-                    MetadataManager.INSTANCE.dropDataset(mdTxnCtx, database, dataverseName, datasetName,
+                    MetadataManager.INSTANCE.dropDataset(mdTxnCtx, databaseName, dataverseName, datasetName,
                             requestParameters.isForceDropDataset());
                     if (itemTypeAdded) {
                         MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, itemTypeEntity.getDatabaseName(),
@@ -1065,20 +1087,19 @@
                 MetadataUtil.PENDING_ADD_OP, compressionScheme, datasetFormatInfo);
     }
 
-    protected Triple<DataverseName, String, Boolean> extractDatasetItemTypeName(DataverseName datasetDataverseName,
+    protected Triple<Namespace, String, Boolean> extractDatasetItemTypeName(Namespace datasetNamespace,
             String datasetName, TypeExpression itemTypeExpr, boolean isMetaItemType, SourceLocation sourceLoc)
             throws CompilationException {
         switch (itemTypeExpr.getTypeKind()) {
             case TYPEREFERENCE:
                 TypeReferenceExpression itemTypeRefExpr = (TypeReferenceExpression) itemTypeExpr;
-                Pair<DataverseName, Identifier> itemTypeIdent = itemTypeRefExpr.getIdent();
-                DataverseName typeDataverseName =
-                        itemTypeIdent.first != null ? itemTypeIdent.first : datasetDataverseName;
+                Pair<Namespace, Identifier> itemTypeIdent = itemTypeRefExpr.getIdent();
+                Namespace typeNamespace = itemTypeIdent.first != null ? itemTypeIdent.first : datasetNamespace;
                 String typeName = itemTypeRefExpr.getIdent().second.getValue();
-                return new Triple<>(typeDataverseName, typeName, false);
+                return new Triple<>(typeNamespace, typeName, false);
             case RECORD:
                 String inlineTypeName = TypeUtil.createDatasetInlineTypeName(datasetName, isMetaItemType);
-                return new Triple<>(datasetDataverseName, inlineTypeName, true);
+                return new Triple<>(datasetNamespace, inlineTypeName, true);
             default:
                 throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, sourceLoc,
                         String.valueOf(itemTypeExpr.getTypeKind()));
@@ -1086,14 +1107,13 @@
     }
 
     protected Pair<Datatype, Boolean> fetchDatasetItemType(MetadataTransactionContext mdTxnCtx, DatasetType datasetType,
-            DataverseName itemTypeDataverseName, String itemTypeName, TypeExpression itemTypeExpr,
-            boolean isMetaItemType, MetadataProvider metadataProvider, SourceLocation sourceLoc)
-            throws AlgebricksException {
-        String itemTypeDatabase = MetadataUtil.resolveDatabase(null, itemTypeDataverseName);
+            String itemTypeDatabaseName, DataverseName itemTypeDataverseName, String itemTypeName,
+            TypeExpression itemTypeExpr, boolean isMetaItemType, MetadataProvider metadataProvider,
+            SourceLocation sourceLoc) throws AlgebricksException {
         switch (itemTypeExpr.getTypeKind()) {
             case TYPEREFERENCE:
                 Datatype itemTypeEntity =
-                        metadataProvider.findTypeEntity(itemTypeDatabase, itemTypeDataverseName, itemTypeName);
+                        metadataProvider.findTypeEntity(itemTypeDatabaseName, itemTypeDataverseName, itemTypeName);
                 if (itemTypeEntity == null || itemTypeEntity.getIsAnonymous()) {
                     // anonymous types cannot be referred from CREATE DATASET/VIEW
                     throw new AsterixException(ErrorCode.UNKNOWN_TYPE, sourceLoc,
@@ -1103,9 +1123,11 @@
                 validateDatasetItemType(datasetType, itemType, isMetaItemType, sourceLoc);
                 return new Pair<>(itemTypeEntity, false);
             case RECORD:
-                itemType = translateType(itemTypeDataverseName, itemTypeName, itemTypeExpr, mdTxnCtx);
+                itemType = translateType(itemTypeDatabaseName, itemTypeDataverseName, itemTypeName, itemTypeExpr,
+                        mdTxnCtx);
                 validateDatasetItemType(datasetType, itemType, isMetaItemType, sourceLoc);
-                itemTypeEntity = new Datatype(itemTypeDatabase, itemTypeDataverseName, itemTypeName, itemType, true);
+                itemTypeEntity =
+                        new Datatype(itemTypeDatabaseName, itemTypeDataverseName, itemTypeName, itemType, true);
                 return new Pair<>(itemTypeEntity, true);
             default:
                 throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, sourceLoc,
@@ -1126,8 +1148,8 @@
         }
     }
 
-    protected Map<String, String> createExternalDatasetProperties(DataverseName dataverseName, DatasetDecl dd,
-            Datatype itemType, MetadataProvider metadataProvider, MetadataTransactionContext mdTxnCtx)
+    protected Map<String, String> createExternalDatasetProperties(String databaseName, DataverseName dataverseName,
+            DatasetDecl dd, Datatype itemType, MetadataProvider metadataProvider, MetadataTransactionContext mdTxnCtx)
             throws AlgebricksException {
         ExternalDetailsDecl externalDetails = (ExternalDetailsDecl) dd.getDatasetDetailsDecl();
         Map<String, String> properties = externalDetails.getProperties();
@@ -1149,7 +1171,7 @@
     }
 
     protected static String configureNodegroupForDataset(ICcApplicationContext appCtx, Map<String, String> hints,
-            DataverseName dataverseName, String datasetName, MetadataProvider metadataProvider,
+            String databaseName, DataverseName dataverseName, String datasetName, MetadataProvider metadataProvider,
             SourceLocation sourceLoc) throws Exception {
         IClusterStateManager csm = appCtx.getClusterStateManager();
         Set<String> allNodes = csm.getParticipantNodes(true);
@@ -1172,6 +1194,7 @@
             Collections.shuffle(allNodeList);
             selectedNodes.addAll(allNodeList.subList(0, nodegroupCardinality));
         }
+        //TODO(DB): node groups with database
         // Creates the associated node group for the dataset.
         return DatasetUtil.createNodeGroupForNewDataset(dataverseName, datasetName, selectedNodes, metadataProvider);
     }
@@ -1184,36 +1207,37 @@
         String fullTextConfigName = stmtCreateIndex.getFullTextConfigName();
         metadataProvider.validateDatabaseObjectName(stmtCreateIndex.getDataverseName(), indexName,
                 stmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtCreateIndex.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtCreateIndex.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createIndexBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName,
+        lockUtil.createIndexBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName,
                 fullTextConfigName);
         try {
-            doCreateIndex(metadataProvider, stmtCreateIndex, dataverseName, datasetName, hcc, requestParameters);
+            doCreateIndex(metadataProvider, stmtCreateIndex, databaseName, dataverseName, datasetName, hcc,
+                    requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected void doCreateIndex(MetadataProvider metadataProvider, CreateIndexStatement stmtCreateIndex,
-            DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
+            String databaseName, DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
             IRequestParameters requestParameters) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         SourceLocation sourceLoc = stmtCreateIndex.getSourceLocation();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
             // Check if the dataverse exists
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
             }
 
-            Dataset ds = metadataProvider.findDataset(database, dataverseName, datasetName);
+            Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
             if (ds == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, datasetName,
                         dataverseName);
@@ -1227,7 +1251,7 @@
             validateIndexType(datasetType, indexType, isSecondaryPrimary, sourceLoc);
 
             String indexName = stmtCreateIndex.getIndexName().getValue();
-            Index index = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), database,
+            Index index = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), databaseName,
                     dataverseName, datasetName, indexName);
             if (index != null) {
                 if (stmtCreateIndex.getIfNotExists()) {
@@ -1238,9 +1262,8 @@
                 }
             }
 
-            String itemTypeDatabase = MetadataUtil.resolveDatabase(null, ds.getItemTypeDataverseName());
             Datatype dt = MetadataManager.INSTANCE.getDatatype(metadataProvider.getMetadataTxnContext(),
-                    itemTypeDatabase, ds.getItemTypeDataverseName(), ds.getItemTypeName());
+                    ds.getItemTypeDatabaseName(), ds.getItemTypeDataverseName(), ds.getItemTypeName());
             ARecordType aRecordType = (ARecordType) dt.getDatatype();
             /* TODO: unused for now becase indexes on meta are disabled -- see below
             ARecordType metaRecordType = null;
@@ -1396,9 +1419,9 @@
                             }
                         }
 
-                        Map<TypeSignature, IAType> typeMap = TypeTranslator.computeTypes(dataverseName, indexName,
-                                projectTypeExpr.getType(), dataverseName, mdTxnCtx);
-                        TypeSignature typeSignature = new TypeSignature(dataverseName, indexName);
+                        Map<TypeSignature, IAType> typeMap = TypeTranslator.computeTypes(databaseName, dataverseName,
+                                indexName, projectTypeExpr.getType(), databaseName, dataverseName, mdTxnCtx);
+                        TypeSignature typeSignature = new TypeSignature(databaseName, dataverseName, indexName);
                         fieldTypePrime = typeMap.get(typeSignature);
                         // BACK-COMPAT: keep prime type only if we're overriding field types
                         fieldTypeNullable = fieldTypeMissable = false;
@@ -1520,7 +1543,7 @@
                 }
             }
 
-            Index newIndex = new Index(database, dataverseName, datasetName, indexName, indexType, indexDetails,
+            Index newIndex = new Index(databaseName, dataverseName, datasetName, indexName, indexType, indexDetails,
                     stmtCreateIndex.isEnforced(), false, MetadataUtil.PENDING_ADD_OP);
 
             bActiveTxn = false; // doCreateIndexImpl() takes over the current transaction
@@ -1540,24 +1563,25 @@
         String fullTextFilterName = stmtCreateFilter.getFilterName();
         metadataProvider.validateDatabaseObjectName(stmtCreateFilter.getDataverseName(), fullTextFilterName,
                 stmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtCreateFilter.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtCreateFilter.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createFullTextFilterBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+        lockUtil.createFullTextFilterBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                 fullTextFilterName);
         try {
-            doCreateFullTextFilter(metadataProvider, stmtCreateFilter, dataverseName);
+            doCreateFullTextFilter(metadataProvider, stmtCreateFilter, databaseName, dataverseName);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected void doCreateFullTextFilter(MetadataProvider metadataProvider,
-            CreateFullTextFilterStatement stmtCreateFilter, DataverseName dataverseName) throws Exception {
+            CreateFullTextFilterStatement stmtCreateFilter, String databaseName, DataverseName dataverseName)
+            throws Exception {
         AbstractFullTextFilterDescriptor filterDescriptor;
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         String filterType = stmtCreateFilter.getFilterType();
         if (filterType == null) {
             throw new CompilationException(ErrorCode.PARSE_ERROR, stmtCreateFilter.getSourceLocation(),
@@ -1565,7 +1589,7 @@
         }
 
         if (FIELD_TYPE_STOPWORDS.equals(filterType)) {
-            filterDescriptor = new StopwordsFullTextFilterDescriptor(database, dataverseName,
+            filterDescriptor = new StopwordsFullTextFilterDescriptor(databaseName, dataverseName,
                     stmtCreateFilter.getFilterName(), stmtCreateFilter.getStopwordsList());
         } else {
             throw new CompilationException(ErrorCode.COMPILATION_ERROR, stmtCreateFilter.getSourceLocation(),
@@ -1575,7 +1599,7 @@
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, stmtCreateFilter.getSourceLocation(),
                         dataverseName);
@@ -1583,7 +1607,7 @@
 
             String filterName = stmtCreateFilter.getFilterName();
             FullTextFilterMetadataEntity existingFilter =
-                    MetadataManager.INSTANCE.getFullTextFilter(mdTxnCtx, database, dataverseName, filterName);
+                    MetadataManager.INSTANCE.getFullTextFilter(mdTxnCtx, databaseName, dataverseName, filterName);
             if (existingFilter != null) {
                 if (stmtCreateFilter.getIfNotExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -1608,32 +1632,33 @@
         String configName = stmtCreateConfig.getConfigName();
         metadataProvider.validateDatabaseObjectName(stmtCreateConfig.getDataverseName(), configName,
                 stmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtCreateConfig.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtCreateConfig.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         ImmutableList<String> filterNames = stmtCreateConfig.getFilterNames();
 
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createFullTextConfigBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+        lockUtil.createFullTextConfigBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                 configName, filterNames);
         try {
-            doCreateFullTextConfig(metadataProvider, stmtCreateConfig, dataverseName, configName, filterNames);
+            doCreateFullTextConfig(metadataProvider, stmtCreateConfig, databaseName, dataverseName, configName,
+                    filterNames);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected void doCreateFullTextConfig(MetadataProvider metadataProvider,
-            CreateFullTextConfigStatement stmtCreateConfig, DataverseName dataverseName, String configName,
-            ImmutableList<String> filterNames) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+            CreateFullTextConfigStatement stmtCreateConfig, String databaseName, DataverseName dataverseName,
+            String configName, ImmutableList<String> filterNames) throws Exception {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
 
         try {
             FullTextConfigMetadataEntity existingConfig =
-                    MetadataManager.INSTANCE.getFullTextConfig(mdTxnCtx, database, dataverseName, configName);
+                    MetadataManager.INSTANCE.getFullTextConfig(mdTxnCtx, databaseName, dataverseName, configName);
             if (existingConfig != null) {
                 if (stmtCreateConfig.getIfNotExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -1646,7 +1671,7 @@
 
             for (String filterName : filterNames) {
                 FullTextFilterMetadataEntity filterMetadataEntity =
-                        MetadataManager.INSTANCE.getFullTextFilter(mdTxnCtx, database, dataverseName, filterName);
+                        MetadataManager.INSTANCE.getFullTextFilter(mdTxnCtx, databaseName, dataverseName, filterName);
                 if (filterMetadataEntity == null) {
                     throw new CompilationException(ErrorCode.FULL_TEXT_FILTER_NOT_FOUND,
                             stmtCreateConfig.getSourceLocation(), filterName);
@@ -1654,8 +1679,8 @@
             }
 
             TokenizerCategory tokenizerCategory = stmtCreateConfig.getTokenizerCategory();
-            FullTextConfigDescriptor configDescriptor =
-                    new FullTextConfigDescriptor(database, dataverseName, configName, tokenizerCategory, filterNames);
+            FullTextConfigDescriptor configDescriptor = new FullTextConfigDescriptor(databaseName, dataverseName,
+                    configName, tokenizerCategory, filterNames);
             FullTextConfigMetadataEntity configMetadataEntity = new FullTextConfigMetadataEntity(configDescriptor);
 
             MetadataManager.INSTANCE.addFullTextConfig(mdTxnCtx, configMetadataEntity);
@@ -1851,20 +1876,21 @@
         SourceLocation sourceLoc = stmtCreateType.getSourceLocation();
         String typeName = stmtCreateType.getIdent().getValue();
         metadataProvider.validateDatabaseObjectName(stmtCreateType.getDataverseName(), typeName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(stmtCreateType.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtCreateType.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.createTypeBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, typeName);
+        lockUtil.createTypeBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, typeName);
         try {
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
             }
-            Datatype dt = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, database, dataverseName, typeName);
+            Datatype dt = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, databaseName, dataverseName, typeName);
             if (dt != null) {
                 if (!stmtCreateType.getIfNotExists()) {
                     throw new CompilationException(ErrorCode.TYPE_EXISTS, sourceLoc, typeName);
@@ -1877,9 +1903,10 @@
                     throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
                             "Reserved type name " + typeName + ".");
                 } else {
-                    IAType type = translateType(dataverseName, typeName, stmtCreateType.getTypeDef(), mdTxnCtx);
+                    IAType type =
+                            translateType(databaseName, dataverseName, typeName, stmtCreateType.getTypeDef(), mdTxnCtx);
                     MetadataManager.INSTANCE.addDatatype(mdTxnCtx,
-                            new Datatype(database, dataverseName, typeName, type, false));
+                            new Datatype(databaseName, dataverseName, typeName, type, false));
                 }
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -1891,11 +1918,11 @@
         }
     }
 
-    private IAType translateType(DataverseName dataverseName, String typeName, TypeExpression typeDef,
-            MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
-        Map<TypeSignature, IAType> typeMap =
-                TypeTranslator.computeTypes(dataverseName, typeName, typeDef, dataverseName, mdTxnCtx);
-        TypeSignature typeSignature = new TypeSignature(dataverseName, typeName);
+    private IAType translateType(String databaseName, DataverseName dataverseName, String typeName,
+            TypeExpression typeDef, MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
+        Map<TypeSignature, IAType> typeMap = TypeTranslator.computeTypes(databaseName, dataverseName, typeName, typeDef,
+                databaseName, dataverseName, mdTxnCtx);
+        TypeSignature typeSignature = new TypeSignature(databaseName, dataverseName, typeName);
         return typeMap.get(typeSignature);
     }
 
@@ -2030,8 +2057,8 @@
             }
 
             //TODO(DB): switch active database to the DEFAULT if the dropped database is the currently active one
-            if (activeDataverse.getDatabaseName().equals(databaseName)) {
-                activeDataverse = MetadataBuiltinEntities.DEFAULT_DATAVERSE;
+            if (activeNamespace.getDatabaseName().equals(databaseName)) {
+                activeNamespace = MetadataBuiltinEntities.DEFAULT_NAMESPACE;
             }
 
             validateDatasetsStateAfterNamespaceDrop(metadataProvider, mdTxnCtx, datasets);
@@ -2044,8 +2071,8 @@
             }
 
             if (progress == ProgressState.ADDED_PENDINGOP_RECORD_TO_METADATA) {
-                if (activeDataverse.getDatabaseName().equals(databaseName)) {
-                    activeDataverse = MetadataBuiltinEntities.DEFAULT_DATAVERSE;
+                if (activeNamespace.getDatabaseName().equals(databaseName)) {
+                    activeNamespace = MetadataBuiltinEntities.DEFAULT_NAMESPACE;
                 }
 
                 // #. execute compensation operations
@@ -2080,7 +2107,7 @@
         DataverseDropStatement stmtDropDataverse = (DataverseDropStatement) stmt;
         SourceLocation sourceLoc = stmtDropDataverse.getSourceLocation();
         DataverseName dataverseName = stmtDropDataverse.getDataverseName();
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        String databaseName = stmtDropDataverse.getDatabaseName();
         metadataProvider.validateDataverseName(dataverseName, sourceLoc);
         if (dataverseName.equals(MetadataConstants.DEFAULT_DATAVERSE_NAME)
                 || dataverseName.equals(MetadataConstants.METADATA_DATAVERSE_NAME)) {
@@ -2090,7 +2117,7 @@
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropDataverseBegin(lockManager, metadataProvider.getLocks(), database, dataverseName);
+        lockUtil.dropDataverseBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName);
         try {
             doDropDataverse(stmtDropDataverse, metadataProvider, hcc, requestParameters);
         } finally {
@@ -2102,7 +2129,7 @@
             IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception {
         SourceLocation sourceLoc = stmtDropDataverse.getSourceLocation();
         DataverseName dataverseName = stmtDropDataverse.getDataverseName();
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        String databaseName = stmtDropDataverse.getDatabaseName();
         ProgressState progress = ProgressState.NO_PROGRESS;
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
@@ -2110,7 +2137,7 @@
         List<FeedEventsListener> feedsToStop = new ArrayList<>();
         List<JobSpecification> jobsToExecute = new ArrayList<>();
         try {
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 if (stmtDropDataverse.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -2120,7 +2147,7 @@
                 }
             }
 
-            if (stmtDropDataverse.getIfEmpty() && isDataverseNotEmpty(database, dataverseName, mdTxnCtx)) {
+            if (stmtDropDataverse.getIfEmpty() && isDataverseNotEmpty(databaseName, dataverseName, mdTxnCtx)) {
                 MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                 return false;
             }
@@ -2134,6 +2161,7 @@
             for (IActiveEntityEventsListener listener : activeListeners) {
                 EntityId activeEntityId = listener.getEntityId();
                 if (activeEntityId.getExtensionName().equals(Feed.EXTENSION_NAME)
+                        && activeEntityId.getDatabaseName().equals(databaseName)
                         && activeEntityId.getDataverseName().equals(dataverseName)) {
                     FeedEventsListener feedListener = (FeedEventsListener) listener;
                     feedsToStop.add(feedListener);
@@ -2143,13 +2171,14 @@
             }
 
             // #. prepare jobs which will drop corresponding datasets with indexes.
-            List<Dataset> datasets = MetadataManager.INSTANCE.getDataverseDatasets(mdTxnCtx, database, dataverseName);
+            List<Dataset> datasets =
+                    MetadataManager.INSTANCE.getDataverseDatasets(mdTxnCtx, databaseName, dataverseName);
             for (Dataset dataset : datasets) {
                 String datasetName = dataset.getDatasetName();
                 DatasetType dsType = dataset.getDatasetType();
                 switch (dsType) {
                     case INTERNAL:
-                        List<Index> indexes = MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, database,
+                        List<Index> indexes = MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, databaseName,
                                 dataverseName, datasetName);
                         for (Index index : indexes) {
                             jobsToExecute
@@ -2163,8 +2192,10 @@
             }
 
             // #. prepare jobs which will drop corresponding libraries.
-            List<Library> libraries = MetadataManager.INSTANCE.getDataverseLibraries(mdTxnCtx, database, dataverseName);
+            List<Library> libraries =
+                    MetadataManager.INSTANCE.getDataverseLibraries(mdTxnCtx, databaseName, dataverseName);
             for (Library library : libraries) {
+                //TODO(DB):
                 jobsToExecute.add(ExternalLibraryJobUtils.buildDropLibraryJobSpec(dataverseName, library.getName(),
                         metadataProvider));
             }
@@ -2175,9 +2206,9 @@
             // first, deleting the dataverse record from the DATAVERSE_DATASET
             // second, inserting the dataverse record with the PendingDropOp value into the DATAVERSE_DATASET
             // Note: the delete operation fails if the dataverse cannot be deleted due to metadata dependencies
-            MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, database, dataverseName);
+            MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, databaseName, dataverseName);
             MetadataManager.INSTANCE.addDataverse(mdTxnCtx,
-                    new Dataverse(database, dataverseName, dv.getDataFormat(), MetadataUtil.PENDING_DROP_OP));
+                    new Dataverse(databaseName, dataverseName, dv.getDataFormat(), MetadataUtil.PENDING_DROP_OP));
 
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             bActiveTxn = false;
@@ -2199,7 +2230,7 @@
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
 
             // #. finally, delete the dataverse.
-            MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, database, dataverseName);
+            MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, databaseName, dataverseName);
 
             // Drops all node groups that no longer needed
             for (Dataset dataset : datasets) {
@@ -2210,8 +2241,8 @@
                 }
             }
 
-            if (activeDataverse.getDataverseName().equals(dataverseName)) {
-                activeDataverse = MetadataBuiltinEntities.DEFAULT_DATAVERSE;
+            if (activeNamespace.getDataverseName().equals(dataverseName)) {
+                activeNamespace = MetadataBuiltinEntities.DEFAULT_NAMESPACE;
             }
 
             validateDatasetsStateAfterNamespaceDrop(metadataProvider, mdTxnCtx, datasets);
@@ -2223,8 +2254,8 @@
             }
 
             if (progress == ProgressState.ADDED_PENDINGOP_RECORD_TO_METADATA) {
-                if (activeDataverse.getDataverseName().equals(dataverseName)) {
-                    activeDataverse = MetadataBuiltinEntities.DEFAULT_DATAVERSE;
+                if (activeNamespace.getDataverseName().equals(dataverseName)) {
+                    activeNamespace = MetadataBuiltinEntities.DEFAULT_NAMESPACE;
                 }
 
                 // #. execute compensation operations
@@ -2241,7 +2272,7 @@
                 // remove the record from the metadata.
                 mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                 try {
-                    MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, database, dataverseName);
+                    MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, databaseName, dataverseName);
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                 } catch (Exception e2) {
                     e.addSuppressed(e2);
@@ -2280,24 +2311,25 @@
         SourceLocation sourceLoc = stmtDelete.getSourceLocation();
         String datasetName = stmtDelete.getDatasetName().getValue();
         metadataProvider.validateDatabaseObjectName(stmtDelete.getDataverseName(), datasetName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(stmtDelete.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtDelete.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropDatasetBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName);
+        lockUtil.dropDatasetBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName);
         try {
-            doDropDataset(dataverseName, datasetName, metadataProvider, stmtDelete.getIfExists(), hcc,
+            doDropDataset(databaseName, dataverseName, datasetName, metadataProvider, stmtDelete.getIfExists(), hcc,
                     requestParameters, true, sourceLoc);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
-    protected boolean doDropDataset(DataverseName dataverseName, String datasetName, MetadataProvider metadataProvider,
-            boolean ifExists, IHyracksClientConnection hcc, IRequestParameters requestParameters,
-            boolean dropCorrespondingNodeGroup, SourceLocation sourceLoc) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+    protected boolean doDropDataset(String databaseName, DataverseName dataverseName, String datasetName,
+            MetadataProvider metadataProvider, boolean ifExists, IHyracksClientConnection hcc,
+            IRequestParameters requestParameters, boolean dropCorrespondingNodeGroup, SourceLocation sourceLoc)
+            throws Exception {
         MutableObject<ProgressState> progress = new MutableObject<>(ProgressState.NO_PROGRESS);
         MutableObject<MetadataTransactionContext> mdTxnCtx =
                 new MutableObject<>(MetadataManager.INSTANCE.beginTransaction());
@@ -2307,7 +2339,7 @@
         Dataset ds = null;
         try {
             // Check if the dataverse exists
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx.getValue(), database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx.getValue(), databaseName, dataverseName);
             if (dv == null) {
                 if (ifExists) {
                     if (warningCollector.shouldWarn()) {
@@ -2319,7 +2351,7 @@
                     throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
                 }
             }
-            ds = metadataProvider.findDataset(database, dataverseName, datasetName, true);
+            ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName, true);
             if (ds == null) {
                 if (ifExists) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx.getValue());
@@ -2371,7 +2403,7 @@
                 mdTxnCtx.setValue(MetadataManager.INSTANCE.beginTransaction());
                 metadataProvider.setMetadataTxnContext(mdTxnCtx.getValue());
                 try {
-                    MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), database,
+                    MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), databaseName,
                             dataverseName, datasetName, requestParameters.isForceDropDataset());
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx.getValue());
                 } catch (Exception e2) {
@@ -2390,24 +2422,25 @@
         IndexDropStatement stmtIndexDrop = (IndexDropStatement) stmt;
         metadataProvider.validateDatabaseObjectName(stmtIndexDrop.getDataverseName(),
                 stmtIndexDrop.getIndexName().getValue(), stmtIndexDrop.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtIndexDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtIndexDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String datasetName = stmtIndexDrop.getDatasetName().getValue();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropIndexBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName);
+        lockUtil.dropIndexBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName);
         try {
-            doDropIndex(metadataProvider, stmtIndexDrop, dataverseName, datasetName, hcc, requestParameters);
+            doDropIndex(metadataProvider, stmtIndexDrop, databaseName, dataverseName, datasetName, hcc,
+                    requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected boolean doDropIndex(MetadataProvider metadataProvider, IndexDropStatement stmtIndexDrop,
-            DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
+            String databaseName, DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
             IRequestParameters requestParameters) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         SourceLocation sourceLoc = stmtIndexDrop.getSourceLocation();
         String indexName = stmtIndexDrop.getIndexName().getValue();
         ProgressState progress = ProgressState.NO_PROGRESS;
@@ -2417,14 +2450,14 @@
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataset ds = metadataProvider.findDataset(database, dataverseName, datasetName);
+            Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
             if (ds == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, datasetName,
                         dataverseName);
             }
             if (ds.getDatasetType() == DatasetType.INTERNAL) {
-                Index index =
-                        MetadataManager.INSTANCE.getIndex(mdTxnCtx, database, dataverseName, datasetName, indexName);
+                Index index = MetadataManager.INSTANCE.getIndex(mdTxnCtx, databaseName, dataverseName, datasetName,
+                        indexName);
                 if (index == null) {
                     if (stmtIndexDrop.getIfExists()) {
                         MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -2435,8 +2468,8 @@
                 }
                 ensureNonPrimaryIndexDrop(index, sourceLoc);
                 validateDatasetState(metadataProvider, ds, sourceLoc);
-                prepareIndexDrop(metadataProvider, dataverseName, datasetName, sourceLoc, indexName, jobsToExecute,
-                        mdTxnCtx, ds, index);
+                prepareIndexDrop(metadataProvider, databaseName, dataverseName, datasetName, sourceLoc, indexName,
+                        jobsToExecute, mdTxnCtx, ds, index);
 
                 // #. commit the existing transaction before calling runJob.
                 MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -2453,7 +2486,7 @@
                 metadataProvider.setMetadataTxnContext(mdTxnCtx);
 
                 // #. finally, delete the existing index
-                MetadataManager.INSTANCE.dropIndex(mdTxnCtx, database, dataverseName, datasetName, indexName);
+                MetadataManager.INSTANCE.dropIndex(mdTxnCtx, databaseName, dataverseName, datasetName, indexName);
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             return true;
@@ -2478,7 +2511,7 @@
                 mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                 metadataProvider.setMetadataTxnContext(mdTxnCtx);
                 try {
-                    MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), database,
+                    MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), databaseName,
                             dataverseName, datasetName, indexName);
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                 } catch (Exception e2) {
@@ -2496,30 +2529,31 @@
     protected void handleFullTextFilterDrop(MetadataProvider metadataProvider, Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception {
         FullTextFilterDropStatement stmtFilterDrop = (FullTextFilterDropStatement) stmt;
-        DataverseName dataverseName = getActiveDataverseName(stmtFilterDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtFilterDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String fullTextFilterName = stmtFilterDrop.getFilterName();
 
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropFullTextFilterBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+        lockUtil.dropFullTextFilterBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                 fullTextFilterName);
         try {
-            doDropFullTextFilter(metadataProvider, stmtFilterDrop, dataverseName, fullTextFilterName);
+            doDropFullTextFilter(metadataProvider, stmtFilterDrop, databaseName, dataverseName, fullTextFilterName);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected void doDropFullTextFilter(MetadataProvider metadataProvider, FullTextFilterDropStatement stmtFilterDrop,
-            DataverseName dataverseName, String fullTextFilterName) throws AlgebricksException, RemoteException {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+            String databaseName, DataverseName dataverseName, String fullTextFilterName)
+            throws AlgebricksException, RemoteException {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            FullTextFilterMetadataEntity filter =
-                    MetadataManager.INSTANCE.getFullTextFilter(mdTxnCtx, database, dataverseName, fullTextFilterName);
+            FullTextFilterMetadataEntity filter = MetadataManager.INSTANCE.getFullTextFilter(mdTxnCtx, databaseName,
+                    dataverseName, fullTextFilterName);
             if (filter == null) {
                 if (stmtFilterDrop.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -2530,7 +2564,7 @@
                 }
             }
 
-            MetadataManager.INSTANCE.dropFullTextFilter(mdTxnCtx, database, dataverseName, fullTextFilterName);
+            MetadataManager.INSTANCE.dropFullTextFilter(mdTxnCtx, databaseName, dataverseName, fullTextFilterName);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         } catch (Exception e) {
             abort(e, e, mdTxnCtx);
@@ -2542,39 +2576,39 @@
             IHyracksClientConnection hcc, IRequestParameters requestParameters)
             throws AlgebricksException, RemoteException {
         FullTextConfigDropStatement stmtConfigDrop = (FullTextConfigDropStatement) stmt;
-        DataverseName dataverseName = getActiveDataverseName(stmtConfigDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtConfigDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String configName = stmtConfigDrop.getConfigName();
 
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropFullTextConfigBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, configName);
+        lockUtil.dropFullTextConfigBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
+                configName);
         try {
-            doDropFullTextConfig(metadataProvider, stmtConfigDrop, hcc, requestParameters);
+            doDropFullTextConfig(metadataProvider, stmtConfigDrop, databaseName, dataverseName, hcc, requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     private void doDropFullTextConfig(MetadataProvider metadataProvider, FullTextConfigDropStatement stmtConfigDrop,
-            IHyracksClientConnection hcc, IRequestParameters requestParameters)
-            throws RemoteException, AlgebricksException {
+            String databaseName, DataverseName dataverseName, IHyracksClientConnection hcc,
+            IRequestParameters requestParameters) throws RemoteException, AlgebricksException {
         // If the config name is null, then it means the default config
         if (Strings.isNullOrEmpty(stmtConfigDrop.getConfigName())) {
             throw new CompilationException(ErrorCode.FULL_TEXT_DEFAULT_CONFIG_CANNOT_BE_DELETED_OR_CREATED,
                     stmtConfigDrop.getSourceLocation());
         }
 
-        DataverseName dataverseName = getActiveDataverseName(stmtConfigDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         String fullTextConfigName = stmtConfigDrop.getConfigName();
 
         try {
-            FullTextConfigMetadataEntity configMetadataEntity =
-                    MetadataManager.INSTANCE.getFullTextConfig(mdTxnCtx, database, dataverseName, fullTextConfigName);
+            FullTextConfigMetadataEntity configMetadataEntity = MetadataManager.INSTANCE.getFullTextConfig(mdTxnCtx,
+                    databaseName, dataverseName, fullTextConfigName);
             if (configMetadataEntity == null) {
                 if (stmtConfigDrop.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -2585,7 +2619,7 @@
                 }
             }
 
-            MetadataManager.INSTANCE.dropFullTextConfig(mdTxnCtx, database, dataverseName, fullTextConfigName);
+            MetadataManager.INSTANCE.dropFullTextConfig(mdTxnCtx, databaseName, dataverseName, fullTextConfigName);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         } catch (Exception e) {
             abort(e, e, mdTxnCtx);
@@ -2598,17 +2632,18 @@
         SourceLocation sourceLoc = stmtTypeDrop.getSourceLocation();
         String typeName = stmtTypeDrop.getTypeName().getValue();
         metadataProvider.validateDatabaseObjectName(stmtTypeDrop.getDataverseName(), typeName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(stmtTypeDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtTypeDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.dropTypeBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, typeName);
+        lockUtil.dropTypeBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, typeName);
         try {
             // Check if the dataverse exists
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 if (stmtTypeDrop.getIfExists()) {
                     if (warningCollector.shouldWarn()) {
@@ -2621,13 +2656,13 @@
                 }
             }
 
-            Datatype dt = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, database, dataverseName, typeName);
+            Datatype dt = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, databaseName, dataverseName, typeName);
             if (dt == null) {
                 if (!stmtTypeDrop.getIfExists()) {
                     throw new CompilationException(ErrorCode.UNKNOWN_TYPE, sourceLoc, typeName);
                 }
             } else {
-                MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, database, dataverseName, typeName);
+                MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, databaseName, dataverseName, typeName);
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         } catch (Exception e) {
@@ -2673,54 +2708,58 @@
         CreateViewStatement cvs = (CreateViewStatement) stmt;
         String viewName = cvs.getViewName();
         metadataProvider.validateDatabaseObjectName(cvs.getDataverseName(), viewName, stmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(cvs.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(cvs.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
 
+        String itemTypeDatabaseName;
         DataverseName viewItemTypeDataverseName;
         String viewItemTypeName;
         boolean viewItemTypeAnonymous;
         if (cvs.hasItemType()) {
-            Triple<DataverseName, String, Boolean> viewTypeQualifiedName = extractDatasetItemTypeName(dataverseName,
+            Triple<Namespace, String, Boolean> viewTypeQualifiedName = extractDatasetItemTypeName(stmtActiveNamespace,
                     viewName, cvs.getItemType(), false, stmt.getSourceLocation());
-            viewItemTypeDataverseName = viewTypeQualifiedName.first;
+            itemTypeDatabaseName = viewTypeQualifiedName.first.getDatabaseName();
+            viewItemTypeDataverseName = viewTypeQualifiedName.first.getDataverseName();
             viewItemTypeName = viewTypeQualifiedName.second;
             viewItemTypeAnonymous = viewTypeQualifiedName.third;
         } else {
+            itemTypeDatabaseName = MetadataBuiltinEntities.ANY_OBJECT_DATATYPE.getDatabaseName();
             viewItemTypeDataverseName = MetadataBuiltinEntities.ANY_OBJECT_DATATYPE.getDataverseName();
             viewItemTypeName = MetadataBuiltinEntities.ANY_OBJECT_DATATYPE.getDatatypeName();
             viewItemTypeAnonymous = false;
         }
-        String itemTypeDatabase = MetadataUtil.resolveDatabase(null, viewItemTypeDataverseName);
 
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createDatasetBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, viewName,
-                itemTypeDatabase, viewItemTypeDataverseName, viewItemTypeName, viewItemTypeAnonymous, null, null, null,
-                false, null, null, true, DatasetType.VIEW, null);
+        lockUtil.createDatasetBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, viewName,
+                itemTypeDatabaseName, viewItemTypeDataverseName, viewItemTypeName, viewItemTypeAnonymous, null, null,
+                null, false, null, null, true, DatasetType.VIEW, null);
         try {
-            doCreateView(metadataProvider, cvs, dataverseName, viewName, viewItemTypeDataverseName, viewItemTypeName,
-                    stmtRewriter, requestParameters);
+            doCreateView(metadataProvider, cvs, databaseName, dataverseName, viewName, itemTypeDatabaseName,
+                    viewItemTypeDataverseName, viewItemTypeName, stmtRewriter, requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
-            metadataProvider.setDefaultDataverse(activeDataverse);
+            metadataProvider.setDefaultNamespace(activeNamespace);
         }
     }
 
-    protected CreateResult doCreateView(MetadataProvider metadataProvider, CreateViewStatement cvs,
-            DataverseName dataverseName, String viewName, DataverseName itemTypeDataverseName, String itemTypeName,
-            IStatementRewriter stmtRewriter, IRequestParameters requestParameters) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
-        String itemTypeDatabase = MetadataUtil.resolveDatabase(null, itemTypeDataverseName);
+    protected CreateResult doCreateView(MetadataProvider metadataProvider, CreateViewStatement cvs, String databaseName,
+            DataverseName dataverseName, String viewName, String itemTypeDatabaseName,
+            DataverseName itemTypeDataverseName, String itemTypeName, IStatementRewriter stmtRewriter,
+            IRequestParameters requestParameters) throws Exception {
         SourceLocation sourceLoc = cvs.getSourceLocation();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
             }
-            Dataset existingDataset = MetadataManager.INSTANCE.getDataset(mdTxnCtx, database, dataverseName, viewName);
+            Namespace ns = new Namespace(dv.getDatabaseName(), dv.getDataverseName());
+            Dataset existingDataset =
+                    MetadataManager.INSTANCE.getDataset(mdTxnCtx, databaseName, dataverseName, viewName);
             if (existingDataset != null) {
                 if (DatasetUtil.isNotView(existingDataset)) {
                     throw new CompilationException(ErrorCode.DATASET_EXISTS, sourceLoc,
@@ -2736,7 +2775,7 @@
             }
 
             DatasetFullyQualifiedName viewQualifiedName =
-                    new DatasetFullyQualifiedName(database, dataverseName, viewName);
+                    new DatasetFullyQualifiedName(databaseName, dataverseName, viewName);
 
             Datatype itemTypeEntity = null;
             boolean itemTypeIsInline = false;
@@ -2746,8 +2785,9 @@
             List<ViewDetails.ForeignKey> foreignKeys = null;
             String datetimeFormat = null, dateFormat = null, timeFormat = null;
             if (cvs.hasItemType()) {
-                Pair<Datatype, Boolean> itemTypePair = fetchDatasetItemType(mdTxnCtx, DatasetType.VIEW,
-                        itemTypeDataverseName, itemTypeName, cvs.getItemType(), false, metadataProvider, sourceLoc);
+                Pair<Datatype, Boolean> itemTypePair =
+                        fetchDatasetItemType(mdTxnCtx, DatasetType.VIEW, itemTypeDatabaseName, itemTypeDataverseName,
+                                itemTypeName, cvs.getItemType(), false, metadataProvider, sourceLoc);
                 itemTypeEntity = itemTypePair.first;
                 itemTypeIsInline = itemTypePair.second;
                 ARecordType itemType = (ARecordType) itemTypeEntity.getDatatype();
@@ -2760,20 +2800,21 @@
                         List<String> foreignKeyFields =
                                 ValidateUtil.validateViewKeyFields(foreignKeyDecl, itemType, true, sourceLoc);
                         DataverseName refDataverseName = foreignKeyDecl.getReferencedDataverseName();
-                        String refDatabase = MetadataUtil.resolveDatabase(null, refDataverseName);
+                        String refDatabaseName = foreignKeyDecl.getReferencedDatabaseName();
                         if (refDataverseName == null) {
                             refDataverseName = dataverseName;
-                            refDatabase = MetadataUtil.resolveDatabase(null, dataverseName);
+                            refDatabaseName = databaseName;
                         } else {
                             Dataverse refDataverse =
-                                    MetadataManager.INSTANCE.getDataverse(mdTxnCtx, refDatabase, refDataverseName);
+                                    MetadataManager.INSTANCE.getDataverse(mdTxnCtx, refDatabaseName, refDataverseName);
                             if (refDataverse == null) {
                                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc,
                                         refDataverseName);
                             }
                         }
                         String refDatasetName = foreignKeyDecl.getReferencedDatasetName().getValue();
-                        boolean isSelfRef = refDataverseName.equals(dataverseName) && refDatasetName.equals(viewName);
+                        boolean isSelfRef = refDatabaseName.equals(databaseName)
+                                && refDataverseName.equals(dataverseName) && refDatasetName.equals(viewName);
                         DatasetType refDatasetType;
                         DatasetFullyQualifiedName refQualifiedName;
                         List<String> refPrimaryKeyFields;
@@ -2783,8 +2824,8 @@
                             refPrimaryKeyFields = primaryKeyFields;
                         } else {
                             // findDataset() will acquire lock on referenced dataset (view)
-                            Dataset refDataset =
-                                    metadataProvider.findDataset(refDatabase, refDataverseName, refDatasetName, true);
+                            Dataset refDataset = metadataProvider.findDataset(refDatabaseName, refDataverseName,
+                                    refDatasetName, true);
                             if (refDataset == null || DatasetUtil.isNotView(refDataset)) {
                                 throw new CompilationException(ErrorCode.UNKNOWN_VIEW, sourceLoc,
                                         DatasetUtil.getFullyQualifiedDisplayName(refDataverseName, refDatasetName));
@@ -2792,7 +2833,7 @@
                             ViewDetails refViewDetails = (ViewDetails) refDataset.getDatasetDetails();
                             refDatasetType = refDataset.getDatasetType();
                             refQualifiedName =
-                                    new DatasetFullyQualifiedName(refDatabase, refDataverseName, refDatasetName);
+                                    new DatasetFullyQualifiedName(refDatabaseName, refDataverseName, refDatasetName);
                             refPrimaryKeyFields = refViewDetails.getPrimaryKeyFields();
                         }
 
@@ -2856,7 +2897,7 @@
             viewDecl.setSourceLocation(sourceLoc);
             IQueryRewriter queryRewriter = rewriterFactory.createQueryRewriter();
             Query wrappedQuery = queryRewriter.createViewAccessorQuery(viewDecl);
-            metadataProvider.setDefaultDataverse(dv);
+            metadataProvider.setDefaultNamespace(ns);
             LangRewritingContext langRewritingContext = createLangRewritingContext(metadataProvider, declaredFunctions,
                     Collections.singletonList(viewDecl), warningCollector, wrappedQuery.getVarCounter());
             apiFramework.reWriteQuery(langRewritingContext, wrappedQuery, sessionOutput, false, false,
@@ -2868,9 +2909,10 @@
             ViewDetails viewDetails = new ViewDetails(cvs.getViewBody(), dependencies, cvs.getDefaultNull(),
                     primaryKeyFields, foreignKeys, datetimeFormat, dateFormat, timeFormat);
 
-            Dataset view = new Dataset(database, dataverseName, viewName, itemTypeDatabase, itemTypeDataverseName,
-                    itemTypeName, MetadataConstants.METADATA_NODEGROUP_NAME, "", Collections.emptyMap(), viewDetails,
-                    Collections.emptyMap(), DatasetType.VIEW, 0, MetadataUtil.PENDING_NO_OP);
+            Dataset view =
+                    new Dataset(databaseName, dataverseName, viewName, itemTypeDatabaseName, itemTypeDataverseName,
+                            itemTypeName, MetadataConstants.METADATA_NODEGROUP_NAME, "", Collections.emptyMap(),
+                            viewDetails, Collections.emptyMap(), DatasetType.VIEW, 0, MetadataUtil.PENDING_NO_OP);
             if (existingDataset == null) {
                 if (itemTypeIsInline) {
                     MetadataManager.INSTANCE.addDatatype(mdTxnCtx, itemTypeEntity);
@@ -2895,28 +2937,28 @@
         SourceLocation sourceLoc = stmtDrop.getSourceLocation();
         String viewName = stmtDrop.getViewName().getValue();
         metadataProvider.validateDatabaseObjectName(stmtDrop.getDataverseName(), viewName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(stmtDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropDatasetBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, viewName);
+        lockUtil.dropDatasetBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, viewName);
         try {
-            doDropView(metadataProvider, stmtDrop, dataverseName, viewName);
+            doDropView(metadataProvider, stmtDrop, databaseName, dataverseName, viewName);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
-    protected boolean doDropView(MetadataProvider metadataProvider, ViewDropStatement stmtViewDrop,
+    protected boolean doDropView(MetadataProvider metadataProvider, ViewDropStatement stmtViewDrop, String databaseName,
             DataverseName dataverseName, String viewName) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         SourceLocation sourceLoc = stmtViewDrop.getSourceLocation();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
             // Check if the dataverse exists
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 if (stmtViewDrop.getIfExists()) {
                     if (warningCollector.shouldWarn()) {
@@ -2929,7 +2971,7 @@
                     throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
                 }
             }
-            Dataset dataset = metadataProvider.findDataset(database, dataverseName, viewName, true);
+            Dataset dataset = metadataProvider.findDataset(databaseName, dataverseName, viewName, true);
             if (dataset == null) {
                 if (stmtViewDrop.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -2942,7 +2984,7 @@
                 throw new CompilationException(ErrorCode.UNKNOWN_VIEW, sourceLoc,
                         DatasetUtil.getFullyQualifiedDisplayName(dataverseName, viewName));
             }
-            MetadataManager.INSTANCE.dropDataset(mdTxnCtx, database, dataverseName, viewName, false);
+            MetadataManager.INSTANCE.dropDataset(mdTxnCtx, databaseName, dataverseName, viewName, false);
             String itemTypeDatabaseName = dataset.getItemTypeDatabaseName();
             if (TypeUtil.isDatasetInlineTypeName(dataset, itemTypeDatabaseName, dataset.getItemTypeDataverseName(),
                     dataset.getItemTypeName())) {
@@ -2963,8 +3005,7 @@
         DataverseName funDataverse = signature.getDataverseName();
         metadataProvider.validateDatabaseObjectName(funDataverse, signature.getName(), stmt.getSourceLocation());
         if (funDataverse == null) {
-            Dataverse activeDv = getActiveDataverse();
-            signature.setDataverseName(activeDv.getDatabaseName(), activeDv.getDataverseName());
+            signature.setDataverseName(activeNamespace.getDatabaseName(), activeNamespace.getDataverseName());
         }
         declaredFunctions.add(fds);
     }
@@ -2976,35 +3017,36 @@
         DataverseName funDataverse = signature.getDataverseName();
         metadataProvider.validateDatabaseObjectName(funDataverse, signature.getName(), stmt.getSourceLocation());
         DataverseName dataverseName;
-        String database;
+        String databaseName;
         if (funDataverse == null) {
-            Dataverse activeDv = getActiveDataverse();
-            dataverseName = activeDv.getDataverseName();
-            database = activeDv.getDatabaseName();
-            signature.setDataverseName(database, dataverseName);
+            dataverseName = activeNamespace.getDataverseName();
+            databaseName = activeNamespace.getDatabaseName();
+            signature.setDataverseName(databaseName, dataverseName);
         } else {
             dataverseName = funDataverse;
-            database = signature.getDatabaseName();
+            databaseName = signature.getDatabaseName();
         }
         DataverseName libraryDataverseName = null;
+        String libraryDatabaseName = null;
         String libraryName = cfs.getLibraryName();
         if (libraryName != null) {
             libraryDataverseName = cfs.getLibraryDataverseName();
+            libraryDatabaseName = cfs.getLibraryDatabaseName();
             if (libraryDataverseName == null) {
                 libraryDataverseName = dataverseName;
+                libraryDatabaseName = databaseName;
             }
         }
-        String libraryDatabase = MetadataUtil.resolveDatabase(null, libraryDataverseName);
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createFunctionBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
-                signature.getName(), libraryDatabase, libraryDataverseName, libraryName);
+        lockUtil.createFunctionBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
+                signature.getName(), libraryDatabaseName, libraryDataverseName, libraryName);
         try {
             doCreateFunction(metadataProvider, cfs, signature, stmtRewriter, requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
-            metadataProvider.setDefaultDataverse(activeDataverse);
+            metadataProvider.setDefaultNamespace(activeNamespace);
         }
     }
 
@@ -3012,15 +3054,16 @@
             FunctionSignature functionSignature, IStatementRewriter stmtRewriter, IRequestParameters requestParameters)
             throws Exception {
         DataverseName dataverseName = functionSignature.getDataverseName();
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        String databaseName = functionSignature.getDatabaseName();
         SourceLocation sourceLoc = cfs.getSourceLocation();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
             }
+            Namespace ns = new Namespace(dv.getDatabaseName(), dv.getDataverseName());
             List<TypeSignature> existingInlineTypes;
             Function existingFunction = MetadataManager.INSTANCE.getFunction(mdTxnCtx, functionSignature);
             if (existingFunction != null) {
@@ -3102,13 +3145,14 @@
                 }
 
                 DataverseName libraryDataverseName = cfs.getLibraryDataverseName();
+                String libraryDatabaseName = cfs.getLibraryDatabaseName();
                 if (libraryDataverseName == null) {
                     libraryDataverseName = dataverseName;
+                    libraryDatabaseName = databaseName;
                 }
-                String libraryDatabase = MetadataUtil.resolveDatabase(null, libraryDataverseName);
                 String libraryName = cfs.getLibraryName();
-                Library library = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, libraryDatabase, libraryDataverseName,
-                        libraryName);
+                Library library = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, libraryDatabaseName,
+                        libraryDataverseName, libraryName);
                 if (library == null) {
                     throw new CompilationException(ErrorCode.UNKNOWN_LIBRARY, sourceLoc, libraryName);
                 }
@@ -3122,9 +3166,9 @@
                         FunctionUtil.getExternalFunctionDependencies(depTypes);
 
                 function = new Function(functionSignature, paramNames, paramTypes, returnTypeSignature, null,
-                        FunctionKind.SCALAR.toString(), library.getLanguage(), libraryDatabase, libraryDataverseName,
-                        libraryName, externalIdentifier, cfs.getNullCall(), cfs.getDeterministic(), cfs.getResources(),
-                        dependencies);
+                        FunctionKind.SCALAR.toString(), library.getLanguage(), libraryDatabaseName,
+                        libraryDataverseName, libraryName, externalIdentifier, cfs.getNullCall(),
+                        cfs.getDeterministic(), cfs.getResources(), dependencies);
             } else {
                 List<Pair<VarIdentifier, TypeExpression>> paramList = cfs.getParameters();
                 int paramCount = paramList.size();
@@ -3150,7 +3194,7 @@
                 List<FunctionDecl> fdList = new ArrayList<>(declaredFunctions.size() + 1);
                 fdList.addAll(declaredFunctions);
                 fdList.add(fd);
-                metadataProvider.setDefaultDataverse(dv);
+                metadataProvider.setDefaultNamespace(ns);
                 LangRewritingContext langRewritingContext = createLangRewritingContext(metadataProvider, fdList, null,
                         warningCollector, wrappedQuery.getVarCounter());
                 apiFramework.reWriteQuery(langRewritingContext, wrappedQuery, sessionOutput, false, false,
@@ -3177,8 +3221,7 @@
                     Datatype newInlineType =
                             newInlineTypes.isEmpty() ? null : newInlineTypes.remove(existingInlineType);
                     if (newInlineType == null) {
-                        String existingInlineTypeDatabase = existingInlineType.getDatabaseName();
-                        MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, existingInlineTypeDatabase,
+                        MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, existingInlineType.getDatabaseName(),
                                 existingInlineType.getDataverseName(), existingInlineType.getName());
                     } else {
                         MetadataManager.INSTANCE.updateDatatype(mdTxnCtx, newInlineType);
@@ -3216,30 +3259,39 @@
                     depTypeSignature = null;
                 } else {
                     // user-defined type
-                    DataverseName paramTypeDataverseName = paramTypeRefExpr.getIdent().first;
-                    if (paramTypeDataverseName == null) {
+                    Namespace paramTypeRefNamespace = paramTypeRefExpr.getIdent().first;
+                    DataverseName paramTypeDataverseName;
+                    String paramTypeDatabaseName;
+                    if (paramTypeRefNamespace == null) {
                         paramTypeDataverseName = functionSignature.getDataverseName();
+                        paramTypeDatabaseName = functionSignature.getDatabaseName();
+                    } else {
+                        paramTypeDataverseName = paramTypeRefNamespace.getDataverseName();
+                        paramTypeDatabaseName = paramTypeRefNamespace.getDatabaseName();
                     }
-                    String paramTypeDatabase = MetadataUtil.resolveDatabase(null, paramTypeDataverseName);
-                    Datatype paramTypeEntity =
-                            metadataProvider.findTypeEntity(paramTypeDatabase, paramTypeDataverseName, paramTypeName);
+
+                    Datatype paramTypeEntity = metadataProvider.findTypeEntity(paramTypeDatabaseName,
+                            paramTypeDataverseName, paramTypeName);
                     if (paramTypeEntity == null || paramTypeEntity.getIsAnonymous()) {
                         throw new CompilationException(ErrorCode.UNKNOWN_TYPE, sourceLoc, paramTypeName);
                     }
-                    paramTypeSignature = depTypeSignature = new TypeSignature(paramTypeDataverseName, paramTypeName);
+                    paramTypeSignature = depTypeSignature =
+                            new TypeSignature(paramTypeDatabaseName, paramTypeDataverseName, paramTypeName);
                 }
                 break;
             case ORDEREDLIST:
             case UNORDEREDLIST:
                 DataverseName paramTypeDataverseName = functionSignature.getDataverseName();
-                String database = MetadataUtil.resolveDatabase(null, paramTypeDataverseName);
+                String paramTypeDatabaseName = functionSignature.getDatabaseName();
                 paramTypeName = TypeUtil.createFunctionParameterTypeName(functionSignature.getName(),
                         functionSignature.getArity(), paramIdx);
-                IAType paramType = translateType(paramTypeDataverseName, paramTypeName, paramTypeExpr, mdTxnCtx);
-                paramTypeSignature = new TypeSignature(paramTypeDataverseName, paramTypeName);
-                depTypeSignature =
-                        FunctionUtil.getTypeDependencyFromFunctionParameter(paramTypeExpr, paramTypeDataverseName);
-                paramInlineTypeEntity = new Datatype(database, paramTypeDataverseName, paramTypeName, paramType, true);
+                IAType paramType = translateType(paramTypeDatabaseName, paramTypeDataverseName, paramTypeName,
+                        paramTypeExpr, mdTxnCtx);
+                paramTypeSignature = new TypeSignature(paramTypeDatabaseName, paramTypeDataverseName, paramTypeName);
+                depTypeSignature = FunctionUtil.getTypeDependencyFromFunctionParameter(paramTypeExpr,
+                        paramTypeDatabaseName, paramTypeDataverseName);
+                paramInlineTypeEntity =
+                        new Datatype(paramTypeDatabaseName, paramTypeDataverseName, paramTypeName, paramType, true);
                 break;
             default:
                 throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, sourceLoc);
@@ -3256,20 +3308,19 @@
         metadataProvider.validateDatabaseObjectName(funDataverse, signature.getName(),
                 stmtDropFunction.getSourceLocation());
         DataverseName dataverseName;
-        String database;
+        String databaseName;
         if (funDataverse == null) {
-            Dataverse activeDv = getActiveDataverse();
-            dataverseName = activeDv.getDataverseName();
-            database = activeDv.getDatabaseName();
-            signature.setDataverseName(database, dataverseName);
+            dataverseName = activeNamespace.getDataverseName();
+            databaseName = activeNamespace.getDatabaseName();
+            signature.setDataverseName(databaseName, dataverseName);
         } else {
             dataverseName = funDataverse;
-            database = signature.getDatabaseName();
+            databaseName = signature.getDatabaseName();
         }
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropFunctionBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+        lockUtil.dropFunctionBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                 signature.getName());
         try {
             doDropFunction(metadataProvider, stmtDropFunction, signature, requestParameters);
@@ -3281,12 +3332,12 @@
     protected boolean doDropFunction(MetadataProvider metadataProvider, FunctionDropStatement stmtDropFunction,
             FunctionSignature signature, IRequestParameters requestParameters) throws Exception {
         DataverseName dataverseName = signature.getDataverseName();
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        String databaseName = signature.getDatabaseName();
         SourceLocation sourceLoc = stmtDropFunction.getSourceLocation();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dataverse = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dataverse = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dataverse == null) {
                 if (stmtDropFunction.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3324,40 +3375,41 @@
         CreateAdapterStatement cas = (CreateAdapterStatement) stmt;
         String adapterName = cas.getAdapterName();
         metadataProvider.validateDatabaseObjectName(cas.getDataverseName(), adapterName, cas.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(cas.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(cas.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         DataverseName libraryDataverseName = cas.getLibraryDataverseName();
+        String libraryDatabaseName = cas.getLibraryDatabaseName();
         if (libraryDataverseName == null) {
             libraryDataverseName = dataverseName;
+            libraryDatabaseName = databaseName;
         }
-        String libraryDatabase = MetadataUtil.resolveDatabase(null, libraryDataverseName);
         String libraryName = cas.getLibraryName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createAdapterBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, adapterName,
-                libraryDatabase, libraryDataverseName, libraryName);
+        lockUtil.createAdapterBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, adapterName,
+                libraryDatabaseName, libraryDataverseName, libraryName);
         try {
-            doCreateAdapter(metadataProvider, cas);
+            doCreateAdapter(metadataProvider, databaseName, dataverseName, cas);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
-    protected void doCreateAdapter(MetadataProvider metadataProvider, CreateAdapterStatement cas) throws Exception {
+    protected void doCreateAdapter(MetadataProvider metadataProvider, String databaseName, DataverseName dataverseName,
+            CreateAdapterStatement cas) throws Exception {
         SourceLocation sourceLoc = cas.getSourceLocation();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            DataverseName dataverseName = getActiveDataverseName(cas.getDataverseName());
-            String database = MetadataUtil.resolveDatabase(null, dataverseName);
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
             }
             String adapterName = cas.getAdapterName();
             DatasourceAdapter adapter =
-                    MetadataManager.INSTANCE.getAdapter(mdTxnCtx, database, dataverseName, adapterName);
+                    MetadataManager.INSTANCE.getAdapter(mdTxnCtx, databaseName, dataverseName, adapterName);
             if (adapter != null) {
                 if (cas.getIfNotExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3367,13 +3419,14 @@
             }
 
             DataverseName libraryDataverseName = cas.getLibraryDataverseName();
+            String libraryDatabaseName = cas.getLibraryDatabaseName();
             if (libraryDataverseName == null) {
                 libraryDataverseName = dataverseName;
+                libraryDatabaseName = databaseName;
             }
-            String libraryDatabase = MetadataUtil.resolveDatabase(null, libraryDataverseName);
             String libraryName = cas.getLibraryName();
-            Library library =
-                    MetadataManager.INSTANCE.getLibrary(mdTxnCtx, libraryDatabase, libraryDataverseName, libraryName);
+            Library library = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, libraryDatabaseName, libraryDataverseName,
+                    libraryName);
             if (library == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_LIBRARY, sourceLoc, libraryName);
             }
@@ -3390,9 +3443,9 @@
             }
             String adapterFactoryClass = externalIdentifier.get(0);
 
-            adapter = new DatasourceAdapter(new AdapterIdentifier(database, dataverseName, adapterName),
-                    IDataSourceAdapter.AdapterType.EXTERNAL, adapterFactoryClass, libraryDatabase, libraryDataverseName,
-                    libraryName);
+            adapter = new DatasourceAdapter(new AdapterIdentifier(databaseName, dataverseName, adapterName),
+                    IDataSourceAdapter.AdapterType.EXTERNAL, adapterFactoryClass, libraryDatabaseName,
+                    libraryDataverseName, libraryName);
             MetadataManager.INSTANCE.addAdapter(mdTxnCtx, adapter);
             if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Installed adapter: " + adapterName);
@@ -3409,27 +3462,27 @@
         SourceLocation sourceLoc = stmtDropAdapter.getSourceLocation();
         String adapterName = stmtDropAdapter.getAdapterName();
         metadataProvider.validateDatabaseObjectName(stmtDropAdapter.getDataverseName(), adapterName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(stmtDropAdapter.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtDropAdapter.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropAdapterBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, adapterName);
+        lockUtil.dropAdapterBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, adapterName);
         try {
-            doDropAdapter(metadataProvider, stmtDropAdapter, dataverseName, adapterName);
+            doDropAdapter(metadataProvider, stmtDropAdapter, databaseName, dataverseName, adapterName);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected boolean doDropAdapter(MetadataProvider metadataProvider, AdapterDropStatement stmtDropAdapter,
-            DataverseName dataverseName, String adapterName) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+            String databaseName, DataverseName dataverseName, String adapterName) throws Exception {
         SourceLocation sourceLoc = stmtDropAdapter.getSourceLocation();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dataverse = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dataverse = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dataverse == null) {
                 if (stmtDropAdapter.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3439,7 +3492,7 @@
                 }
             }
             DatasourceAdapter adapter =
-                    MetadataManager.INSTANCE.getAdapter(mdTxnCtx, database, dataverseName, adapterName);
+                    MetadataManager.INSTANCE.getAdapter(mdTxnCtx, databaseName, dataverseName, adapterName);
             if (adapter == null) {
                 if (stmtDropAdapter.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3449,7 +3502,7 @@
                 }
             }
 
-            MetadataManager.INSTANCE.dropAdapter(mdTxnCtx, database, dataverseName, adapterName);
+            MetadataManager.INSTANCE.dropAdapter(mdTxnCtx, databaseName, dataverseName, adapterName);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             return true;
         } catch (Exception e) {
@@ -3463,25 +3516,26 @@
         CreateLibraryStatement cls = (CreateLibraryStatement) stmt;
         metadataProvider.validateDatabaseObjectName(cls.getDataverseName(), cls.getLibraryName(),
                 cls.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(cls.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(cls.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String libraryName = cls.getLibraryName();
         String libraryHash = cls.getHash();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createLibraryBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, libraryName);
+        lockUtil.createLibraryBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, libraryName);
         try {
-            doCreateLibrary(metadataProvider, dataverseName, libraryName, libraryHash, cls, hcc, requestParameters);
+            doCreateLibrary(metadataProvider, databaseName, dataverseName, libraryName, libraryHash, cls, hcc,
+                    requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
-    protected CreateResult doCreateLibrary(MetadataProvider metadataProvider, DataverseName dataverseName,
-            String libraryName, String libraryHash, CreateLibraryStatement cls, IHyracksClientConnection hcc,
-            IRequestParameters requestParameters) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+    protected CreateResult doCreateLibrary(MetadataProvider metadataProvider, String databaseName,
+            DataverseName dataverseName, String libraryName, String libraryHash, CreateLibraryStatement cls,
+            IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception {
         JobUtils.ProgressState progress = ProgressState.NO_PROGRESS;
         boolean prepareJobSuccessful = false;
         JobSpecification abortJobSpec = null;
@@ -3490,20 +3544,20 @@
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, dataverseName);
             }
             ExternalFunctionLanguage language = cls.getLang();
-            existingLibrary = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, database, dataverseName, libraryName);
+            existingLibrary = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, databaseName, dataverseName, libraryName);
             if (existingLibrary != null && !cls.getReplaceIfExists()) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR,
                         "A library with this name " + libraryName + " already exists.");
             }
 
             // #. add/update library with PendingAddOp
-            Library libraryPendingAdd = new Library(database, dataverseName, libraryName, language.name(), libraryHash,
-                    MetadataUtil.PENDING_ADD_OP);
+            Library libraryPendingAdd = new Library(databaseName, dataverseName, libraryName, language.name(),
+                    libraryHash, MetadataUtil.PENDING_ADD_OP);
             if (existingLibrary == null) {
                 MetadataManager.INSTANCE.addLibrary(mdTxnCtx, libraryPendingAdd);
             } else {
@@ -3511,6 +3565,7 @@
             }
 
             // #. prepare to create library artifacts in NC.
+            //TODO(DB):
             Triple<JobSpecification, JobSpecification, JobSpecification> jobSpecs =
                     ExternalLibraryJobUtils.buildCreateLibraryJobSpec(dataverseName, libraryName, language,
                             cls.getLocation(), cls.getAuthToken(), metadataProvider);
@@ -3532,7 +3587,7 @@
             bActiveTxn = true;
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
 
-            Library newLibrary = new Library(database, dataverseName, libraryName, language.name(), libraryHash,
+            Library newLibrary = new Library(databaseName, dataverseName, libraryName, language.name(), libraryHash,
                     MetadataUtil.PENDING_NO_OP);
             MetadataManager.INSTANCE.updateLibrary(mdTxnCtx, newLibrary);
 
@@ -3555,6 +3610,7 @@
                 } else if (existingLibrary == null) {
                     // 'commit' job failed for a new library -> try removing the library
                     try {
+                        //TODO(DB):
                         JobSpecification dropLibraryJobSpec = ExternalLibraryJobUtils
                                 .buildDropLibraryJobSpec(dataverseName, libraryName, metadataProvider);
                         runJob(hcc, dropLibraryJobSpec, jobFlags);
@@ -3571,7 +3627,7 @@
                 mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                 try {
                     if (existingLibrary == null) {
-                        MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, database, dataverseName, libraryName);
+                        MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, databaseName, dataverseName, libraryName);
                     } else {
                         MetadataManager.INSTANCE.updateLibrary(mdTxnCtx, existingLibrary);
                     }
@@ -3598,29 +3654,30 @@
         String libraryName = stmtDropLibrary.getLibraryName();
         metadataProvider.validateDatabaseObjectName(stmtDropLibrary.getDataverseName(), libraryName,
                 stmtDropLibrary.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtDropLibrary.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtDropLibrary.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropLibraryBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, libraryName);
+        lockUtil.dropLibraryBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, libraryName);
         try {
-            doDropLibrary(metadataProvider, stmtDropLibrary, dataverseName, libraryName, hcc, requestParameters);
+            doDropLibrary(metadataProvider, stmtDropLibrary, databaseName, dataverseName, libraryName, hcc,
+                    requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected boolean doDropLibrary(MetadataProvider metadataProvider, LibraryDropStatement stmtDropLibrary,
-            DataverseName dataverseName, String libraryName, IHyracksClientConnection hcc,
+            String databaseName, DataverseName dataverseName, String libraryName, IHyracksClientConnection hcc,
             IRequestParameters requestParameters) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         JobUtils.ProgressState progress = ProgressState.NO_PROGRESS;
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dataverse = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dataverse = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dataverse == null) {
                 if (stmtDropLibrary.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3630,7 +3687,7 @@
                             dataverseName);
                 }
             }
-            Library library = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, database, dataverseName, libraryName);
+            Library library = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, databaseName, dataverseName, libraryName);
             if (library == null) {
                 if (stmtDropLibrary.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3643,11 +3700,12 @@
 
             // #. mark the existing library as PendingDropOp
             // do drop instead of update because drop will fail if the library is used by functions/adapters
-            MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, database, dataverseName, libraryName);
-            MetadataManager.INSTANCE.addLibrary(mdTxnCtx, new Library(database, dataverseName, libraryName,
+            MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, databaseName, dataverseName, libraryName);
+            MetadataManager.INSTANCE.addLibrary(mdTxnCtx, new Library(databaseName, dataverseName, libraryName,
                     library.getLanguage(), library.getHash(), MetadataUtil.PENDING_DROP_OP));
 
             // #. drop library artifacts in NCs.
+            //TODO(DB):
             JobSpecification jobSpec =
                     ExternalLibraryJobUtils.buildDropLibraryJobSpec(dataverseName, libraryName, metadataProvider);
 
@@ -3664,7 +3722,7 @@
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
 
             // #. drop library
-            MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, database, dataverseName, libraryName);
+            MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, databaseName, dataverseName, libraryName);
 
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             return true;
@@ -3676,7 +3734,7 @@
                 // remove the record from the metadata.
                 mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                 try {
-                    MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, database, dataverseName, libraryName);
+                    MetadataManager.INSTANCE.dropLibrary(mdTxnCtx, databaseName, dataverseName, libraryName);
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                 } catch (Exception e2) {
                     e.addSuppressed(e2);
@@ -3693,36 +3751,36 @@
         CreateSynonymStatement css = (CreateSynonymStatement) stmt;
         metadataProvider.validateDatabaseObjectName(css.getDataverseName(), css.getSynonymName(),
                 css.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(css.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(css.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String synonymName = css.getSynonymName();
-        DataverseName objectDataverseName =
-                css.getObjectDataverseName() != null ? css.getObjectDataverseName() : dataverseName;
+        Namespace objectNamespace = css.getObjectNamespace() != null ? css.getObjectNamespace() : stmtActiveNamespace;
         String objectName = css.getObjectName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createSynonymBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, synonymName);
+        lockUtil.createSynonymBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, synonymName);
         try {
-            doCreateSynonym(metadataProvider, css, dataverseName, synonymName, objectDataverseName, objectName);
+            doCreateSynonym(metadataProvider, css, stmtActiveNamespace, synonymName, objectNamespace, objectName);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected CreateResult doCreateSynonym(MetadataProvider metadataProvider, CreateSynonymStatement css,
-            DataverseName dataverseName, String synonymName, DataverseName objectDataverseName, String objectName)
-            throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+            Namespace namespace, String synonymName, Namespace objectNamespace, String objectName) throws Exception {
+        String databaseName = namespace.getDatabaseName();
+        DataverseName dataverseName = namespace.getDataverseName();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, css.getSourceLocation(), dataverseName);
             }
-            Synonym synonym = MetadataManager.INSTANCE.getSynonym(metadataProvider.getMetadataTxnContext(), database,
-                    dataverseName, synonymName);
+            Synonym synonym = MetadataManager.INSTANCE.getSynonym(metadataProvider.getMetadataTxnContext(),
+                    databaseName, dataverseName, synonymName);
             if (synonym != null) {
                 if (css.getIfNotExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3734,9 +3792,8 @@
                 }
                 throw new CompilationException(ErrorCode.SYNONYM_EXISTS, css.getSourceLocation(), synonymName);
             }
-            String objectDatabaseName = MetadataUtil.resolveDatabase(null, objectDataverseName);
-            synonym = new Synonym(database, dataverseName, synonymName, objectDatabaseName, objectDataverseName,
-                    objectName);
+            synonym = new Synonym(databaseName, dataverseName, synonymName, objectNamespace.getDatabaseName(),
+                    objectNamespace.getDataverseName(), objectName);
             MetadataManager.INSTANCE.addSynonym(metadataProvider.getMetadataTxnContext(), synonym);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             return CreateResult.CREATED;
@@ -3751,26 +3808,26 @@
         String synonymName = stmtSynDrop.getSynonymName();
         metadataProvider.validateDatabaseObjectName(stmtSynDrop.getDataverseName(), synonymName,
                 stmtSynDrop.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtSynDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtSynDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.dropSynonymBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, synonymName);
+        lockUtil.dropSynonymBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, synonymName);
         try {
-            doDropSynonym(metadataProvider, stmtSynDrop, dataverseName, synonymName);
+            doDropSynonym(metadataProvider, stmtSynDrop, databaseName, dataverseName, synonymName);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected boolean doDropSynonym(MetadataProvider metadataProvider, SynonymDropStatement stmtSynDrop,
-            DataverseName dataverseName, String synonymName) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+            String databaseName, DataverseName dataverseName, String synonymName) throws Exception {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
-            Synonym synonym = MetadataManager.INSTANCE.getSynonym(mdTxnCtx, database, dataverseName, synonymName);
+            Synonym synonym = MetadataManager.INSTANCE.getSynonym(mdTxnCtx, databaseName, dataverseName, synonymName);
             if (synonym == null) {
                 if (stmtSynDrop.getIfExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -3778,7 +3835,7 @@
                 }
                 throw new CompilationException(ErrorCode.UNKNOWN_SYNONYM, stmtSynDrop.getSourceLocation(), synonymName);
             }
-            MetadataManager.INSTANCE.dropSynonym(mdTxnCtx, database, dataverseName, synonymName);
+            MetadataManager.INSTANCE.dropSynonym(mdTxnCtx, databaseName, dataverseName, synonymName);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             return true;
         } catch (Exception e) {
@@ -3793,17 +3850,18 @@
         String datasetName = loadStmt.getDatasetName();
         metadataProvider.validateDatabaseObjectName(loadStmt.getDataverseName(), datasetName,
                 loadStmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(loadStmt.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(loadStmt.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.modifyDatasetBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName);
+        lockUtil.modifyDatasetBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName);
         try {
             Map<String, String> properties = loadStmt.getProperties();
             ExternalDataUtils.normalize(properties);
             ExternalDataUtils.validate(properties);
-            CompiledLoadFromFileStatement cls = new CompiledLoadFromFileStatement(dataverseName,
+            CompiledLoadFromFileStatement cls = new CompiledLoadFromFileStatement(databaseName, dataverseName,
                     loadStmt.getDatasetName(), loadStmt.getAdapter(), properties, loadStmt.dataIsAlreadySorted());
             cls.setSourceLocation(stmt.getSourceLocation());
             JobSpecification spec = apiFramework.compileQuery(hcc, metadataProvider, null, 0, null, sessionOutput, cls,
@@ -3824,9 +3882,9 @@
         }
     }
 
-    protected Map<String, String> createExternalDataPropertiesForCopyStmt(DataverseName dataverseName,
-            CopyStatement copyStatement, Datatype itemType, MetadataTransactionContext mdTxnCtx)
-            throws AlgebricksException {
+    protected Map<String, String> createExternalDataPropertiesForCopyStmt(String databaseName,
+            DataverseName dataverseName, CopyStatement copyStatement, Datatype itemType,
+            MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         return copyStatement.getExternalDetails().getProperties();
     }
 
@@ -3836,44 +3894,47 @@
         String datasetName = copyStmt.getDatasetName();
         metadataProvider.validateDatabaseObjectName(copyStmt.getDataverseName(), datasetName,
                 copyStmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(copyStmt.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(copyStmt.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+        lockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                 datasetName);
         JobId jobId = null;
         boolean atomic = false;
         try {
             metadataProvider.setWriteTransaction(true);
-            Dataset dataset = metadataProvider.findDataset(database, dataverseName, copyStmt.getDatasetName());
+            Dataset dataset = metadataProvider.findDataset(databaseName, dataverseName, copyStmt.getDatasetName());
             if (dataset == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, stmt.getSourceLocation(),
                         datasetName, dataverseName);
             }
-            Datatype itemType = MetadataManager.INSTANCE.getDatatype(mdTxnCtx,
-                    MetadataUtil.resolveDatabase(null, dataset.getItemTypeDataverseName()),
+            Datatype itemType = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, dataset.getItemTypeDatabaseName(),
                     dataset.getItemTypeDataverseName(), dataset.getItemTypeName());
             // Copy statement with csv files will have a type expression
             if (copyStmt.getTypeExpr() != null) {
                 TypeExpression itemTypeExpr = copyStmt.getTypeExpr();
-                Triple<DataverseName, String, Boolean> itemTypeQualifiedName = extractDatasetItemTypeName(dataverseName,
-                        datasetName, itemTypeExpr, false, stmt.getSourceLocation());
-                DataverseName itemTypeDataverseName = itemTypeQualifiedName.first;
+                Triple<Namespace, String, Boolean> itemTypeQualifiedName = extractDatasetItemTypeName(
+                        stmtActiveNamespace, datasetName, itemTypeExpr, false, stmt.getSourceLocation());
+                Namespace itemTypeNamespace = itemTypeQualifiedName.first;
+                DataverseName itemTypeDataverseName = itemTypeNamespace.getDataverseName();
                 String itemTypeName = itemTypeQualifiedName.second;
-                String itemTypeDatabase = MetadataUtil.resolveDatabase(null, itemTypeDataverseName);
-                IAType itemTypeEntity = translateType(itemTypeDataverseName, itemTypeName, itemTypeExpr, mdTxnCtx);
-                itemType = new Datatype(itemTypeDatabase, itemTypeDataverseName, itemTypeName, itemTypeEntity, true);
+                String itemTypeDatabaseName = itemTypeNamespace.getDatabaseName();
+                IAType itemTypeEntity = translateType(itemTypeDatabaseName, itemTypeDataverseName, itemTypeName,
+                        itemTypeExpr, mdTxnCtx);
+                itemType =
+                        new Datatype(itemTypeDatabaseName, itemTypeDataverseName, itemTypeName, itemTypeEntity, true);
             }
             ExternalDetailsDecl externalDetails = copyStmt.getExternalDetails();
             Map<String, String> properties =
-                    createExternalDataPropertiesForCopyStmt(dataverseName, copyStmt, itemType, mdTxnCtx);
+                    createExternalDataPropertiesForCopyStmt(databaseName, dataverseName, copyStmt, itemType, mdTxnCtx);
             ExternalDataUtils.normalize(properties);
             ExternalDataUtils.validate(properties);
             validateExternalDatasetProperties(externalDetails, properties, copyStmt.getSourceLocation(), mdTxnCtx,
                     appCtx);
-            CompiledCopyFromFileStatement cls = new CompiledCopyFromFileStatement(dataverseName,
+            CompiledCopyFromFileStatement cls = new CompiledCopyFromFileStatement(databaseName, dataverseName,
                     copyStmt.getDatasetName(), itemType, externalDetails.getAdapter(), properties);
             cls.setSourceLocation(stmt.getSourceLocation());
             JobSpecification spec = apiFramework.compileQuery(hcc, metadataProvider, null, 0, null, sessionOutput, cls,
@@ -3928,13 +3989,14 @@
         String datasetName = stmtInsertUpsert.getDatasetName();
         metadataProvider.validateDatabaseObjectName(stmtInsertUpsert.getDataverseName(), datasetName,
                 stmtInsertUpsert.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtInsertUpsert.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtInsertUpsert.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         final IMetadataLocker locker = new IMetadataLocker() {
             @Override
             public void lock() throws AlgebricksException {
                 compilationLock.readLock().lock();
-                lockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+                lockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                         datasetName);
             }
 
@@ -3974,10 +4036,7 @@
                 if (jobSpec == null) {
                     return jobSpec;
                 }
-                String insertStmtDatabase =
-                        MetadataUtil.resolveDatabase(null, ((InsertStatement) stmt).getDataverseName());
-                Dataset ds = metadataProvider.findDataset(insertStmtDatabase,
-                        ((InsertStatement) stmt).getDataverseName(), ((InsertStatement) stmt).getDatasetName());
+                Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
                 atomic = ds.isAtomic();
                 if (atomic) {
                     int numParticipatingNodes = appCtx.getNodeJobTracker()
@@ -4020,19 +4079,21 @@
         String datasetName = stmtDelete.getDatasetName();
         metadataProvider.validateDatabaseObjectName(stmtDelete.getDataverseName(), datasetName,
                 stmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(stmtDelete.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtDelete.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+        lockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                 datasetName);
         boolean atomic = false;
         JobId jobId = null;
         try {
             metadataProvider.setWriteTransaction(true);
-            CompiledDeleteStatement clfrqs = new CompiledDeleteStatement(stmtDelete.getVariableExpr(), dataverseName,
-                    datasetName, stmtDelete.getCondition(), stmtDelete.getVarCounter(), stmtDelete.getQuery());
+            CompiledDeleteStatement clfrqs =
+                    new CompiledDeleteStatement(stmtDelete.getVariableExpr(), databaseName, dataverseName, datasetName,
+                            stmtDelete.getCondition(), stmtDelete.getVarCounter(), stmtDelete.getQuery());
             clfrqs.setSourceLocation(stmt.getSourceLocation());
             JobSpecification jobSpec =
                     rewriteCompileQuery(hcc, metadataProvider, clfrqs.getQuery(), clfrqs, stmtParams, null);
@@ -4041,7 +4102,7 @@
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             bActiveTxn = false;
             if (jobSpec != null && !isCompileOnly()) {
-                Dataset ds = metadataProvider.findDataset(database, dataverseName, datasetName);
+                Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
                 atomic = ds.isAtomic();
                 if (atomic) {
                     int numParticipatingNodes = appCtx.getNodeJobTracker()
@@ -4114,20 +4175,22 @@
                 insertUpsert, sessionOutput, true, true, externalVars.keySet());
 
         InsertStatement rewrittenInsertUpsert = (InsertStatement) rewrittenResult.first;
-        DataverseName dataverseName = getActiveDataverseName(rewrittenInsertUpsert.getDataverseName());
+        Namespace stmtActiveNamespace = getActiveNamespace(rewrittenInsertUpsert.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String datasetName = rewrittenInsertUpsert.getDatasetName();
         CompiledInsertStatement clfrqs;
         switch (insertUpsert.getKind()) {
             case INSERT:
-                clfrqs = new CompiledInsertStatement(dataverseName, datasetName, rewrittenInsertUpsert.getQuery(),
-                        rewrittenInsertUpsert.getVarCounter(), rewrittenInsertUpsert.getVar(),
-                        rewrittenInsertUpsert.getReturnExpression());
+                clfrqs = new CompiledInsertStatement(databaseName, dataverseName, datasetName,
+                        rewrittenInsertUpsert.getQuery(), rewrittenInsertUpsert.getVarCounter(),
+                        rewrittenInsertUpsert.getVar(), rewrittenInsertUpsert.getReturnExpression());
                 clfrqs.setSourceLocation(insertUpsert.getSourceLocation());
                 break;
             case UPSERT:
-                clfrqs = new CompiledUpsertStatement(dataverseName, datasetName, rewrittenInsertUpsert.getQuery(),
-                        rewrittenInsertUpsert.getVarCounter(), rewrittenInsertUpsert.getVar(),
-                        rewrittenInsertUpsert.getReturnExpression());
+                clfrqs = new CompiledUpsertStatement(databaseName, dataverseName, datasetName,
+                        rewrittenInsertUpsert.getQuery(), rewrittenInsertUpsert.getVarCounter(),
+                        rewrittenInsertUpsert.getVar(), rewrittenInsertUpsert.getReturnExpression());
                 clfrqs.setSourceLocation(insertUpsert.getSourceLocation());
                 break;
             default:
@@ -4146,16 +4209,17 @@
         SourceLocation sourceLoc = cfs.getSourceLocation();
         String feedName = cfs.getFeedName().getValue();
         metadataProvider.validateDatabaseObjectName(cfs.getDataverseName(), feedName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(cfs.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(cfs.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.createFeedBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, feedName);
+        lockUtil.createFeedBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, feedName);
         try {
-            Feed feed = MetadataManager.INSTANCE.getFeed(metadataProvider.getMetadataTxnContext(), database,
+            Feed feed = MetadataManager.INSTANCE.getFeed(metadataProvider.getMetadataTxnContext(), databaseName,
                     dataverseName, feedName);
             if (feed != null) {
                 if (cfs.getIfNotExists()) {
@@ -4169,7 +4233,7 @@
             Map<String, String> configuration = cfs.getConfiguration();
             ExternalDataUtils.normalize(configuration);
             ExternalDataUtils.validate(configuration);
-            feed = new Feed(database, dataverseName, feedName, configuration);
+            feed = new Feed(databaseName, dataverseName, feedName, configuration);
             FeedMetadataUtil.validateFeed(feed, mdTxnCtx, appCtx, warningCollector);
             MetadataManager.INSTANCE.addFeed(metadataProvider.getMetadataTxnContext(), feed);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -4189,17 +4253,18 @@
         SourceLocation sourceLoc = cfps.getSourceLocation();
         String policyName = cfps.getPolicyName();
         metadataProvider.validateDatabaseObjectName(null, policyName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(null);
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        DataverseName dataverseName = activeNamespace.getDataverseName();
+        String databaseName = activeNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.createFeedPolicyBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, policyName);
+        lockUtil.createFeedPolicyBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
+                policyName);
         try {
             mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
             FeedPolicyEntity feedPolicy = MetadataManager.INSTANCE
-                    .getFeedPolicy(metadataProvider.getMetadataTxnContext(), database, dataverseName, policyName);
+                    .getFeedPolicy(metadataProvider.getMetadataTxnContext(), databaseName, dataverseName, policyName);
             if (feedPolicy != null) {
                 if (cfps.getIfNotExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -4212,8 +4277,9 @@
             boolean extendingExisting = cfps.getSourcePolicyName() != null;
             String description = cfps.getDescription() == null ? "" : cfps.getDescription();
             if (extendingExisting) {
-                FeedPolicyEntity sourceFeedPolicy = MetadataManager.INSTANCE.getFeedPolicy(
-                        metadataProvider.getMetadataTxnContext(), database, dataverseName, cfps.getSourcePolicyName());
+                FeedPolicyEntity sourceFeedPolicy =
+                        MetadataManager.INSTANCE.getFeedPolicy(metadataProvider.getMetadataTxnContext(), databaseName,
+                                dataverseName, cfps.getSourcePolicyName());
                 if (sourceFeedPolicy == null) {
                     sourceFeedPolicy = MetadataManager.INSTANCE.getFeedPolicy(metadataProvider.getMetadataTxnContext(),
                             MetadataConstants.SYSTEM_DATABASE, MetadataConstants.METADATA_DATAVERSE_NAME,
@@ -4225,7 +4291,8 @@
                 }
                 Map<String, String> policyProperties = sourceFeedPolicy.getProperties();
                 policyProperties.putAll(cfps.getProperties());
-                newPolicy = new FeedPolicyEntity(database, dataverseName, policyName, description, policyProperties);
+                newPolicy =
+                        new FeedPolicyEntity(databaseName, dataverseName, policyName, description, policyProperties);
             } else {
                 Properties prop = new Properties();
                 try {
@@ -4237,7 +4304,8 @@
                 }
                 Map<String, String> policyProperties = new HashMap<>();
                 prop.forEach((key, value) -> policyProperties.put((String) key, (String) value));
-                newPolicy = new FeedPolicyEntity(database, dataverseName, policyName, description, policyProperties);
+                newPolicy =
+                        new FeedPolicyEntity(databaseName, dataverseName, policyName, description, policyProperties);
             }
             MetadataManager.INSTANCE.addFeedPolicy(mdTxnCtx, newPolicy);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -4255,16 +4323,17 @@
         SourceLocation sourceLoc = stmtFeedDrop.getSourceLocation();
         String feedName = stmtFeedDrop.getFeedName().getValue();
         metadataProvider.validateDatabaseObjectName(stmtFeedDrop.getDataverseName(), feedName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(stmtFeedDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtFeedDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.dropFeedBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, feedName);
+        lockUtil.dropFeedBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, feedName);
         try {
-            Feed feed = MetadataManager.INSTANCE.getFeed(mdTxnCtx, database, dataverseName, feedName);
+            Feed feed = MetadataManager.INSTANCE.getFeed(mdTxnCtx, databaseName, dataverseName, feedName);
             if (feed == null) {
                 if (!stmtFeedDrop.getIfExists()) {
                     throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
@@ -4297,11 +4366,11 @@
         } else if (listener != null) {
             listener.unregister();
         }
-        String feedDatabase = MetadataUtil.resolveDatabase(null, feedId.getDataverseName());
         JobSpecification spec = FeedOperations.buildRemoveFeedStorageJob(metadataProvider, MetadataManager.INSTANCE
-                .getFeed(mdTxnCtx, feedDatabase, feedId.getDataverseName(), feedId.getEntityName()));
+                .getFeed(mdTxnCtx, feedId.getDatabaseName(), feedId.getDataverseName(), feedId.getEntityName()));
         runJob(hcc, spec);
-        MetadataManager.INSTANCE.dropFeed(mdTxnCtx, feedDatabase, feed.getDataverseName(), feed.getFeedName());
+        MetadataManager.INSTANCE.dropFeed(mdTxnCtx, feed.getDatabaseName(), feed.getDataverseName(),
+                feed.getFeedName());
         if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Removed feed " + feedId);
         }
@@ -4312,17 +4381,18 @@
         SourceLocation sourceLoc = stmtFeedPolicyDrop.getSourceLocation();
         String policyName = stmtFeedPolicyDrop.getPolicyName().getValue();
         metadataProvider.validateDatabaseObjectName(stmtFeedPolicyDrop.getDataverseName(), policyName, sourceLoc);
-        DataverseName dataverseName = getActiveDataverseName(stmtFeedPolicyDrop.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(stmtFeedPolicyDrop.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         if (isCompileOnly()) {
             return;
         }
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.dropFeedPolicyBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, policyName);
+        lockUtil.dropFeedPolicyBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, policyName);
         try {
             FeedPolicyEntity feedPolicy =
-                    MetadataManager.INSTANCE.getFeedPolicy(mdTxnCtx, database, dataverseName, policyName);
+                    MetadataManager.INSTANCE.getFeedPolicy(mdTxnCtx, databaseName, dataverseName, policyName);
             if (feedPolicy == null) {
                 if (!stmtFeedPolicyDrop.getIfExists()) {
                     throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
@@ -4331,7 +4401,7 @@
                 MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                 return;
             }
-            MetadataManager.INSTANCE.dropFeedPolicy(mdTxnCtx, database, dataverseName, policyName);
+            MetadataManager.INSTANCE.dropFeedPolicy(mdTxnCtx, databaseName, dataverseName, policyName);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         } catch (Exception e) {
             abort(e, e, mdTxnCtx);
@@ -4345,24 +4415,25 @@
             IHyracksClientConnection hcc) throws Exception {
         StartFeedStatement sfs = (StartFeedStatement) stmt;
         SourceLocation sourceLoc = sfs.getSourceLocation();
-        DataverseName dataverseName = getActiveDataverseName(sfs.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(sfs.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String feedName = sfs.getFeedName().getValue();
         if (isCompileOnly()) {
             return;
         }
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean committed = false;
-        lockUtil.startFeedBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, feedName);
+        lockUtil.startFeedBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, feedName);
         try {
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
             // Runtime handler
-            EntityId entityId = new EntityId(Feed.EXTENSION_NAME, database, dataverseName, feedName);
+            EntityId entityId = new EntityId(Feed.EXTENSION_NAME, databaseName, dataverseName, feedName);
             // Feed & Feed Connections
-            Feed feed = FeedMetadataUtil.validateIfFeedExists(database, dataverseName, feedName,
+            Feed feed = FeedMetadataUtil.validateIfFeedExists(databaseName, dataverseName, feedName,
                     metadataProvider.getMetadataTxnContext());
             List<FeedConnection> feedConnections = MetadataManager.INSTANCE
-                    .getFeedConections(metadataProvider.getMetadataTxnContext(), database, dataverseName, feedName);
+                    .getFeedConections(metadataProvider.getMetadataTxnContext(), databaseName, dataverseName, feedName);
             if (feedConnections.isEmpty()) {
                 throw new CompilationException(ErrorCode.FEED_START_FEED_WITHOUT_CONNECTION, sourceLoc, feedName);
             }
@@ -4402,10 +4473,11 @@
     protected void handleStopFeedStatement(MetadataProvider metadataProvider, Statement stmt) throws Exception {
         StopFeedStatement sfst = (StopFeedStatement) stmt;
         SourceLocation sourceLoc = sfst.getSourceLocation();
-        DataverseName dataverseName = getActiveDataverseName(sfst.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(sfst.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String feedName = sfst.getFeedName().getValue();
-        EntityId entityId = new EntityId(Feed.EXTENSION_NAME, database, dataverseName, feedName);
+        EntityId entityId = new EntityId(Feed.EXTENSION_NAME, databaseName, dataverseName, feedName);
         ActiveNotificationHandler activeEventHandler =
                 (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
         // Obtain runtime info from ActiveListener
@@ -4417,7 +4489,7 @@
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.stopFeedBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, feedName);
+        lockUtil.stopFeedBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, feedName);
         try {
             listener.stop(metadataProvider);
         } finally {
@@ -4429,8 +4501,9 @@
         FeedConnection fc;
         ConnectFeedStatement cfs = (ConnectFeedStatement) stmt;
         SourceLocation sourceLoc = cfs.getSourceLocation();
-        DataverseName dataverseName = getActiveDataverseName(cfs.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(cfs.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String feedName = cfs.getFeedName();
         String datasetName = cfs.getDatasetName().getValue();
         String policyName = cfs.getPolicy();
@@ -4445,13 +4518,13 @@
         ActiveNotificationHandler activeEventHandler =
                 (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
         // Transaction handling
-        lockUtil.connectFeedBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName,
+        lockUtil.connectFeedBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName,
                 feedName);
         try {
             // validation
-            Dataset dataset =
-                    FeedMetadataUtil.validateIfDatasetExists(metadataProvider, database, dataverseName, datasetName);
-            Feed feed = FeedMetadataUtil.validateIfFeedExists(database, dataverseName, feedName,
+            Dataset dataset = FeedMetadataUtil.validateIfDatasetExists(metadataProvider, databaseName, dataverseName,
+                    datasetName);
+            Feed feed = FeedMetadataUtil.validateIfFeedExists(databaseName, dataverseName, feedName,
                     metadataProvider.getMetadataTxnContext());
             FeedEventsListener listener = (FeedEventsListener) activeEventHandler.getListener(feed.getFeedId());
             if (listener != null && listener.isActive()) {
@@ -4467,13 +4540,13 @@
                             func.getName());
                 }
             }
-            fc = MetadataManager.INSTANCE.getFeedConnection(metadataProvider.getMetadataTxnContext(), database,
+            fc = MetadataManager.INSTANCE.getFeedConnection(metadataProvider.getMetadataTxnContext(), databaseName,
                     dataverseName, feedName, datasetName);
             if (fc != null) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
                         "Feed" + feedName + " is already connected to " + dataset() + " " + datasetName);
             }
-            fc = new FeedConnection(database, dataverseName, feedName, datasetName, appliedFunctions, policyName,
+            fc = new FeedConnection(databaseName, dataverseName, feedName, datasetName, appliedFunctions, policyName,
                     whereClauseBody, outputType.getTypeName());
             MetadataManager.INSTANCE.addFeedConnection(metadataProvider.getMetadataTxnContext(), fc);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -4492,8 +4565,9 @@
     protected void handleDisconnectFeedStatement(MetadataProvider metadataProvider, Statement stmt) throws Exception {
         DisconnectFeedStatement cfs = (DisconnectFeedStatement) stmt;
         SourceLocation sourceLoc = cfs.getSourceLocation();
-        DataverseName dataverseName = getActiveDataverseName(cfs.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(cfs.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String datasetName = cfs.getDatasetName().getValue();
         String feedName = cfs.getFeedName().getValue();
         if (isCompileOnly()) {
@@ -4501,24 +4575,24 @@
         }
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        lockUtil.disconnectFeedBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName,
+        lockUtil.disconnectFeedBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName,
                 feedName);
         try {
             ActiveNotificationHandler activeEventHandler =
                     (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
             // Check whether feed is alive
             ActiveEntityEventsListener listener = (ActiveEntityEventsListener) activeEventHandler
-                    .getListener(new EntityId(Feed.EXTENSION_NAME, database, dataverseName, feedName));
+                    .getListener(new EntityId(Feed.EXTENSION_NAME, databaseName, dataverseName, feedName));
             if (listener != null && listener.isActive()) {
                 throw new CompilationException(ErrorCode.FEED_CHANGE_FEED_CONNECTIVITY_ON_ALIVE_FEED, sourceLoc,
                         feedName);
             }
-            FeedMetadataUtil.validateIfDatasetExists(metadataProvider, database, dataverseName,
+            FeedMetadataUtil.validateIfDatasetExists(metadataProvider, databaseName, dataverseName,
                     cfs.getDatasetName().getValue());
-            FeedMetadataUtil.validateIfFeedExists(database, dataverseName, cfs.getFeedName().getValue(), mdTxnCtx);
+            FeedMetadataUtil.validateIfFeedExists(databaseName, dataverseName, cfs.getFeedName().getValue(), mdTxnCtx);
             FeedConnection fc = MetadataManager.INSTANCE.getFeedConnection(metadataProvider.getMetadataTxnContext(),
-                    database, dataverseName, feedName, datasetName);
-            Dataset ds = metadataProvider.findDataset(database, dataverseName, datasetName);
+                    databaseName, dataverseName, feedName, datasetName);
+            Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
             if (ds == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, datasetName,
                         dataverseName);
@@ -4527,7 +4601,7 @@
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, "Feed " + feedName
                         + " is currently not connected to " + cfs.getDatasetName().getValue() + ". Invalid operation!");
             }
-            MetadataManager.INSTANCE.dropFeedConnection(mdTxnCtx, database, dataverseName, feedName, datasetName);
+            MetadataManager.INSTANCE.dropFeedConnection(mdTxnCtx, databaseName, dataverseName, feedName, datasetName);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             if (listener != null) {
                 listener.remove(ds);
@@ -4545,24 +4619,26 @@
         AnalyzeStatement analyzeStatement = (AnalyzeStatement) stmt;
         metadataProvider.validateDatabaseObjectName(analyzeStatement.getDataverseName(),
                 analyzeStatement.getDatasetName(), analyzeStatement.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(analyzeStatement.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(analyzeStatement.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String datasetName = analyzeStatement.getDatasetName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.analyzeDatasetBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName);
+        lockUtil.analyzeDatasetBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
+                datasetName);
         try {
-            doAnalyzeDataset(metadataProvider, analyzeStatement, dataverseName, datasetName, hcc, requestParameters);
+            doAnalyzeDataset(metadataProvider, analyzeStatement, databaseName, dataverseName, datasetName, hcc,
+                    requestParameters);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected void doAnalyzeDataset(MetadataProvider metadataProvider, AnalyzeStatement stmtAnalyze,
-            DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
+            String databaseName, DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
             IRequestParameters requestParameters) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         SourceLocation sourceLoc = stmtAnalyze.getSourceLocation();
         ProgressState progressNewIndexCreate = ProgressState.NO_PROGRESS;
         ProgressState progressExistingIndexDrop = ProgressState.NO_PROGRESS;
@@ -4574,12 +4650,12 @@
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
             // Check if the dataverse exists
-            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, database, dataverseName);
+            Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
             }
             // Check if the dataset exists
-            ds = metadataProvider.findDataset(database, dataverseName, datasetName);
+            ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
             if (ds == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, datasetName,
                         dataverseName);
@@ -4593,13 +4669,13 @@
             IndexType sampleIndexType = IndexType.SAMPLE;
             Pair<String, String> sampleIndexNames = IndexUtil.getSampleIndexNames(datasetName);
             String newIndexName;
-            existingIndex = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), database,
+            existingIndex = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), databaseName,
                     dataverseName, datasetName, sampleIndexNames.first);
             if (existingIndex != null) {
                 newIndexName = sampleIndexNames.second;
             } else {
-                existingIndex = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), database,
-                        dataverseName, datasetName, sampleIndexNames.second);
+                existingIndex = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(),
+                        databaseName, dataverseName, datasetName, sampleIndexNames.second);
                 newIndexName = sampleIndexNames.first;
             }
 
@@ -4610,7 +4686,7 @@
             Index.SampleIndexDetails newIndexDetailsPendingAdd = new Index.SampleIndexDetails(dsDetails.getPrimaryKey(),
                     dsDetails.getKeySourceIndicator(), dsDetails.getPrimaryKeyType(), sampleCardinalityTarget, 0, 0,
                     sampleSeed, Collections.emptyMap());
-            newIndexPendingAdd = new Index(database, dataverseName, datasetName, newIndexName, sampleIndexType,
+            newIndexPendingAdd = new Index(databaseName, dataverseName, datasetName, newIndexName, sampleIndexType,
                     newIndexDetailsPendingAdd, false, false, MetadataUtil.PENDING_ADD_OP);
 
             // #. add a new index with PendingAddOp
@@ -4631,7 +4707,7 @@
             runJob(hcc, spec);
 
             // #. flush dataset
-            FlushDatasetUtil.flushDataset(hcc, metadataProvider, database, dataverseName, datasetName);
+            FlushDatasetUtil.flushDataset(hcc, metadataProvider, databaseName, dataverseName, datasetName);
 
             mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
             bActiveTxn = true;
@@ -4652,7 +4728,7 @@
             Index.SampleIndexDetails newIndexDetailsFinal = new Index.SampleIndexDetails(dsDetails.getPrimaryKey(),
                     dsDetails.getKeySourceIndicator(), dsDetails.getPrimaryKeyType(), sampleCardinalityTarget,
                     stats.getCardinality(), stats.getAvgTupleSize(), sampleSeed, stats.getIndexesStats());
-            Index newIndexFinal = new Index(database, dataverseName, datasetName, newIndexName, sampleIndexType,
+            Index newIndexFinal = new Index(databaseName, dataverseName, datasetName, newIndexName, sampleIndexType,
                     newIndexDetailsFinal, false, false, MetadataUtil.PENDING_NO_OP);
 
             // #. begin new metadataTxn
@@ -4770,25 +4846,26 @@
         AnalyzeDropStatement analyzeDropStmt = (AnalyzeDropStatement) stmt;
         metadataProvider.validateDatabaseObjectName(analyzeDropStmt.getDataverseName(),
                 analyzeDropStmt.getDatasetName(), analyzeDropStmt.getSourceLocation());
-        DataverseName dataverseName = getActiveDataverseName(analyzeDropStmt.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(analyzeDropStmt.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String datasetName = analyzeDropStmt.getDatasetName();
         if (isCompileOnly()) {
             return;
         }
-        lockUtil.analyzeDatasetDropBegin(lockManager, metadataProvider.getLocks(), database, dataverseName,
+        lockUtil.analyzeDatasetDropBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName,
                 datasetName);
         try {
-            doAnalyzeDatasetDrop(metadataProvider, analyzeDropStmt, dataverseName, datasetName, hcc, requestParams);
+            doAnalyzeDatasetDrop(metadataProvider, analyzeDropStmt, databaseName, dataverseName, datasetName, hcc,
+                    requestParams);
         } finally {
             metadataProvider.getLocks().unlock();
         }
     }
 
     protected boolean doAnalyzeDatasetDrop(MetadataProvider metadataProvider, AnalyzeDropStatement stmtIndexDrop,
-            DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
+            String databaseName, DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc,
             IRequestParameters requestParams) throws Exception {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         SourceLocation sourceLoc = stmtIndexDrop.getSourceLocation();
         Pair<String, String> sampleIndexNames = IndexUtil.getSampleIndexNames(datasetName);
         String indexName1 = sampleIndexNames.first;
@@ -4801,7 +4878,7 @@
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         boolean index1Exists = false, index2Exists = false;
         try {
-            Dataset ds = metadataProvider.findDataset(database, dataverseName, datasetName);
+            Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
             if (ds == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, datasetName,
                         dataverseName);
@@ -4810,9 +4887,9 @@
                 throw new CompilationException(ErrorCode.OPERATION_NOT_SUPPORTED, sourceLoc);
             }
             Index index1 =
-                    MetadataManager.INSTANCE.getIndex(mdTxnCtx, database, dataverseName, datasetName, indexName1);
+                    MetadataManager.INSTANCE.getIndex(mdTxnCtx, databaseName, dataverseName, datasetName, indexName1);
             Index index2 =
-                    MetadataManager.INSTANCE.getIndex(mdTxnCtx, database, dataverseName, datasetName, indexName2);
+                    MetadataManager.INSTANCE.getIndex(mdTxnCtx, databaseName, dataverseName, datasetName, indexName2);
             index1Exists = index1 != null;
             index2Exists = index2 != null;
             if (!index1Exists && !index2Exists) {
@@ -4821,10 +4898,10 @@
             }
             ensureNonPrimaryIndexesDrop(index1, index2, sourceLoc);
             validateDatasetState(metadataProvider, ds, sourceLoc);
-            prepareIndexDrop(metadataProvider, dataverseName, datasetName, sourceLoc, indexName1, jobsToExecute,
-                    mdTxnCtx, ds, index1);
-            prepareIndexDrop(metadataProvider, dataverseName, datasetName, sourceLoc, indexName2, jobsToExecute,
-                    mdTxnCtx, ds, index2);
+            prepareIndexDrop(metadataProvider, databaseName, dataverseName, datasetName, sourceLoc, indexName1,
+                    jobsToExecute, mdTxnCtx, ds, index1);
+            prepareIndexDrop(metadataProvider, databaseName, dataverseName, datasetName, sourceLoc, indexName2,
+                    jobsToExecute, mdTxnCtx, ds, index2);
 
             // #. commit the existing transaction before calling runJob.
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -4842,10 +4919,10 @@
 
             // #. finally, delete the existing indexes
             if (index1Exists) {
-                MetadataManager.INSTANCE.dropIndex(mdTxnCtx, database, dataverseName, datasetName, indexName1);
+                MetadataManager.INSTANCE.dropIndex(mdTxnCtx, databaseName, dataverseName, datasetName, indexName1);
             }
             if (index2Exists) {
-                MetadataManager.INSTANCE.dropIndex(mdTxnCtx, database, dataverseName, datasetName, indexName2);
+                MetadataManager.INSTANCE.dropIndex(mdTxnCtx, databaseName, dataverseName, datasetName, indexName2);
             }
 
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -4871,11 +4948,11 @@
                 metadataProvider.setMetadataTxnContext(mdTxnCtx);
                 try {
                     if (index1Exists) {
-                        MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), database,
+                        MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), databaseName,
                                 dataverseName, datasetName, indexName1);
                     }
                     if (index2Exists) {
-                        MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), database,
+                        MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), databaseName,
                                 dataverseName, datasetName, indexName2);
                     }
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -4904,18 +4981,17 @@
         }
     }
 
-    private void prepareIndexDrop(MetadataProvider metadataProvider, DataverseName dataverseName, String datasetName,
-            SourceLocation sourceLoc, String indexName, List<JobSpecification> jobsToExecute,
+    private void prepareIndexDrop(MetadataProvider metadataProvider, String databaseName, DataverseName dataverseName,
+            String datasetName, SourceLocation sourceLoc, String indexName, List<JobSpecification> jobsToExecute,
             MetadataTransactionContext mdTxnCtx, Dataset ds, Index index) throws AlgebricksException {
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
         if (index != null) {
             // #. prepare a job to drop the index in NC.
             jobsToExecute.add(IndexUtil.buildDropIndexJobSpec(index, metadataProvider, ds, sourceLoc));
 
             // #. mark PendingDropOp on the existing index
-            MetadataManager.INSTANCE.dropIndex(mdTxnCtx, database, dataverseName, datasetName, indexName);
+            MetadataManager.INSTANCE.dropIndex(mdTxnCtx, databaseName, dataverseName, datasetName, indexName);
             MetadataManager.INSTANCE.addIndex(mdTxnCtx,
-                    new Index(database, dataverseName, datasetName, indexName, index.getIndexType(),
+                    new Index(databaseName, dataverseName, datasetName, indexName, index.getIndexType(),
                             index.getIndexDetails(), index.isEnforced(), index.isPrimaryIndex(),
                             MetadataUtil.PENDING_DROP_OP));
         }
@@ -4925,8 +5001,9 @@
             IHyracksClientConnection hcc) throws Exception {
         CompactStatement compactStatement = (CompactStatement) stmt;
         SourceLocation sourceLoc = compactStatement.getSourceLocation();
-        DataverseName dataverseName = getActiveDataverseName(compactStatement.getDataverseName());
-        String database = MetadataUtil.resolveDatabase(null, dataverseName);
+        Namespace stmtActiveNamespace = getActiveNamespace(compactStatement.getNamespace());
+        DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
+        String databaseName = stmtActiveNamespace.getDatabaseName();
         String datasetName = compactStatement.getDatasetName().getValue();
         if (isCompileOnly()) {
             return;
@@ -4935,22 +5012,22 @@
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         List<JobSpecification> jobsToExecute = new ArrayList<>();
-        lockUtil.compactBegin(lockManager, metadataProvider.getLocks(), database, dataverseName, datasetName);
+        lockUtil.compactBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, datasetName);
         try {
-            Dataset ds = metadataProvider.findDataset(database, dataverseName, datasetName);
+            Dataset ds = metadataProvider.findDataset(databaseName, dataverseName, datasetName);
             if (ds == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, datasetName,
                         dataverseName);
             }
             // Prepare jobs to compact the datatset and its indexes
             List<Index> indexes =
-                    MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, database, dataverseName, datasetName);
+                    MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, databaseName, dataverseName, datasetName);
             if (indexes.isEmpty()) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc,
                         "Cannot compact the external " + dataset() + " " + datasetName + " because it has no indexes");
             }
             Dataverse dataverse = MetadataManager.INSTANCE.getDataverse(metadataProvider.getMetadataTxnContext(),
-                    database, dataverseName);
+                    databaseName, dataverseName);
             jobsToExecute.add(DatasetUtil.compactDatasetJobSpec(dataverse, datasetName, metadataProvider));
 
             if (ds.getDatasetType() == DatasetType.INTERNAL) {
@@ -5191,11 +5268,9 @@
             // ensure request not cancelled before running job
             ensureNotCancelled(clientRequest);
             if (atomicStatement != null) {
-                String database =
-                        MetadataUtil.resolveDatabase(null, ((InsertStatement) atomicStatement).getDataverseName());
-                Dataset ds =
-                        metadataProvider.findDataset(database, ((InsertStatement) atomicStatement).getDataverseName(),
-                                ((InsertStatement) atomicStatement).getDatasetName());
+                Dataset ds = metadataProvider.findDataset(((InsertStatement) atomicStatement).getDatabaseName(),
+                        ((InsertStatement) atomicStatement).getDataverseName(),
+                        ((InsertStatement) atomicStatement).getDatasetName());
                 atomic = ds.isAtomic();
                 if (atomic) {
                     int numParticipatingNodes = appCtx.getNodeJobTracker()
@@ -5284,12 +5359,8 @@
     }
 
     @Override
-    public DataverseName getActiveDataverseName(DataverseName dataverseName) {
-        return dataverseName != null ? dataverseName : activeDataverse.getDataverseName();
-    }
-
-    public Dataverse getActiveDataverse() {
-        return activeDataverse;
+    public Namespace getActiveNamespace(Namespace namespace) {
+        return namespace != null ? namespace : activeNamespace;
     }
 
     @Override
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
index 11ca118..85014ab 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
@@ -34,6 +34,7 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.external.api.ITypedAdapterFactory;
 import org.apache.asterix.external.feed.management.FeedConnectionId;
@@ -222,15 +223,17 @@
         metadataProvider.getConfig().put(FeedActivityDetails.FEED_POLICY_NAME, feedConn.getPolicyName());
         Query feedConnQuery = makeConnectionQuery(feedConn, metadataProvider);
         CompiledStatements.ICompiledDmlStatement clfrqs;
+        String feedDatabaseName = feedConn.getDatabaseName();
+        DataverseName feedDataverseName = feedConn.getDataverseName();
         if (insertFeed) {
-            InsertStatement stmtUpsert = new InsertStatement(feedConn.getDataverseName(), feedConn.getDatasetName(),
-                    feedConnQuery, -1, null, null);
-            clfrqs = new CompiledStatements.CompiledInsertStatement(feedConn.getDataverseName(),
+            InsertStatement stmtUpsert = new InsertStatement(new Namespace(feedDatabaseName, feedDataverseName),
+                    feedConn.getDatasetName(), feedConnQuery, -1, null, null);
+            clfrqs = new CompiledStatements.CompiledInsertStatement(feedDatabaseName, feedDataverseName,
                     feedConn.getDatasetName(), feedConnQuery, stmtUpsert.getVarCounter(), null, null);
         } else {
-            UpsertStatement stmtUpsert = new UpsertStatement(feedConn.getDataverseName(), feedConn.getDatasetName(),
-                    feedConnQuery, -1, null, null);
-            clfrqs = new CompiledStatements.CompiledUpsertStatement(feedConn.getDataverseName(),
+            UpsertStatement stmtUpsert = new UpsertStatement(new Namespace(feedDatabaseName, feedDataverseName),
+                    feedConn.getDatasetName(), feedConnQuery, -1, null, null);
+            clfrqs = new CompiledStatements.CompiledUpsertStatement(feedDatabaseName, feedDataverseName,
                     feedConn.getDatasetName(), feedConnQuery, stmtUpsert.getVarCounter(), null, null);
         }
         return statementExecutor.rewriteCompileQuery(hcc, metadataProvider, feedConnQuery, clfrqs, null, null);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java
index 9d4f921..d8fb053 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java
@@ -182,8 +182,8 @@
             throws Exception {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         // Retrieves file splits of the dataset.
-        MetadataProvider metadataProvider = MetadataProvider
-                .create((ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), null);
+        MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(
+                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext());
         try {
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
             Dataset dataset = metadataProvider.findDataset(database, dataverseName, datasetName);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
index f929677..fc992e3 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
@@ -37,6 +37,7 @@
 import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.common.metadata.NamespacePathResolver;
 import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.TxnId;
@@ -47,7 +48,6 @@
 import org.apache.asterix.formats.nontagged.TypeTraitProvider;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
-import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Dataverse;
@@ -238,7 +238,7 @@
             throws AlgebricksException, HyracksDataException, RemoteException, ACIDException {
         CcApplicationContext appCtx =
                 (CcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
-        MetadataProvider mdProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider mdProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         try {
             MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
             org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy =
@@ -357,7 +357,7 @@
             throws AlgebricksException, HyracksDataException, RemoteException, ACIDException {
         CcApplicationContext appCtx =
                 (CcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
-        MetadataProvider mdProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider mdProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         try {
             MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
             org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy =
@@ -488,22 +488,6 @@
         return new JobId(jobCounter++);
     }
 
-    public IResourceFactory getPrimaryResourceFactory(IHyracksTaskContext ctx, PrimaryIndexInfo primaryIndexInfo,
-            IStorageComponentProvider storageComponentProvider, Dataset dataset) throws AlgebricksException {
-        Dataverse dataverse = new Dataverse(dataset.getDatabaseName(), dataset.getDataverseName(),
-                NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP);
-        Index index = primaryIndexInfo.getIndex();
-        CcApplicationContext appCtx =
-                (CcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
-        MetadataProvider mdProvider = MetadataProvider.create(appCtx, dataverse);
-        try {
-            return dataset.getResourceFactory(mdProvider, index, primaryIndexInfo.recordType, primaryIndexInfo.metaType,
-                    primaryIndexInfo.mergePolicyFactory, primaryIndexInfo.mergePolicyProperties);
-        } finally {
-            mdProvider.getLocks().unlock();
-        }
-    }
-
     public PrimaryIndexInfo createPrimaryIndex(Dataset dataset, IAType[] primaryKeyTypes, ARecordType recordType,
             ARecordType metaType, int[] filterFields, IStorageComponentProvider storageComponentProvider,
             int[] primaryKeyIndexes, List<Integer> primaryKeyIndicators, int partition)
@@ -516,8 +500,9 @@
                 mergePolicy.first, mergePolicy.second, filterFields, primaryKeyIndexes, primaryKeyIndicators);
         Dataverse dataverse = new Dataverse(dataset.getDatabaseName(), dataset.getDataverseName(),
                 NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP);
+        Namespace namespace = new Namespace(dataverse.getDatabaseName(), dataverse.getDataverseName());
         MetadataProvider mdProvider = MetadataProvider.create(
-                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), dataverse);
+                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), namespace);
         try {
             IResourceFactory resourceFactory = dataset.getResourceFactory(mdProvider, primaryIndexInfo.index,
                     recordType, metaType, mergePolicy.first, mergePolicy.second);
@@ -543,8 +528,9 @@
         Dataverse dataverse =
                 new Dataverse(primaryIndexInfo.dataset.getDatabaseName(), primaryIndexInfo.dataset.getDataverseName(),
                         NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP);
+        Namespace namespace = new Namespace(dataverse.getDatabaseName(), dataverse.getDataverseName());
         MetadataProvider mdProvider = MetadataProvider.create(
-                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), dataverse);
+                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), namespace);
         SecondaryIndexInfo secondaryIndexInfo = new SecondaryIndexInfo(primaryIndexInfo, secondaryIndex);
         try {
             IResourceFactory resourceFactory = primaryIndexInfo.dataset.getResourceFactory(mdProvider, secondaryIndex,
@@ -830,9 +816,8 @@
             int[] keyIndexes, List<Integer> keyIndicators, StorageComponentProvider storageComponentProvider,
             IFrameOperationCallbackFactory frameOpCallbackFactory, boolean hasSecondaries) throws Exception {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
-        MetadataProvider mdProvider = MetadataProvider.create(
-                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(),
-                MetadataBuiltinEntities.DEFAULT_DATAVERSE);
+        MetadataProvider mdProvider = MetadataProvider.createWithDefaultNamespace(
+                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext());
         org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy =
                 DatasetUtil.getMergePolicyFactory(dataset, mdTxnCtx);
         MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
index b58ad47..b213e9d 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
@@ -191,7 +191,7 @@
             DataverseName dataverseName, String datasetName, String[] targetNodes) throws Exception {
         ICcApplicationContext ccAppCtx =
                 (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
-        MetadataProvider metadataProvider = MetadataProvider.create(ccAppCtx, null);
+        MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(ccAppCtx);
         try {
             ActiveNotificationHandler activeNotificationHandler =
                     (ActiveNotificationHandler) ccAppCtx.getActiveNotificationHandler();
@@ -224,7 +224,7 @@
             throws AlgebricksException, RemoteException {
         final ICcApplicationContext appCtx =
                 (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
-        final MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        final MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         final MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         Dataset dataset;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
index 13dc4f9..841e81b 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
@@ -144,7 +144,7 @@
         Mockito.when(ccExtensionManager.getFunctionManager())
                 .thenReturn(new FunctionManager(FunctionCollection.createDefaultFunctionCollection()));
         Mockito.when(appCtx.getExtensionManager()).thenReturn(ccExtensionManager);
-        metadataProvider = MetadataProvider.create(appCtx, null);
+        metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         clusterController = new TestClusterControllerActor("CC", handler, allDatasets);
         nodeControllers = new TestNodeControllerActor[2];
         nodeControllers[0] = new TestNodeControllerActor(nodes[0], clusterController);
@@ -159,7 +159,7 @@
     }
 
     TestUserActor newUser(String name, CcApplicationContext appCtx) {
-        MetadataProvider actorMdProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider actorMdProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         return new TestUserActor("User: " + name, actorMdProvider, clusterController);
     }
 
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java
index 3baf5d0..59e0878 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java
@@ -107,7 +107,7 @@
                 .create(appCtx, Collections.emptyList(), sessionOutput,
                         extensionManager.getCompilationProvider(Language.SQLPP), appCtx.getStorageComponentProvider(),
                         new ResponsePrinter(sessionOutput));
-        MetadataProvider mdProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider mdProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         // Add event listener
         ActiveEntityEventsListener eventsListener = new DummyFeedEventsListener(statementExecutor, appCtx, null,
                 entityId, datasetList, partitionConstraint, FeedIntakeOperatorNodePushable.class.getSimpleName(),
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/ddl/SecondaryBTreeOperationsHelperTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/ddl/SecondaryBTreeOperationsHelperTest.java
index c8cccfa..135f7ab 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/ddl/SecondaryBTreeOperationsHelperTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/ddl/SecondaryBTreeOperationsHelperTest.java
@@ -63,7 +63,7 @@
     public void createPrimaryIndex() throws Exception {
         ICcApplicationContext appCtx =
                 (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
-        final MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        final MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxn);
         try {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
index 7583307..9e0683b 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
@@ -77,7 +77,7 @@
     public void abortMetadataTxn() throws Exception {
         ICcApplicationContext appCtx =
                 (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
-        final MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        final MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         final MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxn);
         final String nodeGroupName = "ng";
@@ -116,7 +116,7 @@
                 + "(KeyType) PRIMARY KEY id WITH {\"node-group\":{\"name\":\"" + nodeGroup + "\"}};", format);
         // find source dataset
         Dataset sourceDataset;
-        MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         final MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         try {
@@ -128,7 +128,7 @@
         }
 
         // create rebalance metadata provider and metadata txn
-        metadataProvider = MetadataProvider.create(appCtx, null);
+        metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         final MetadataTransactionContext rebalanceTxn = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(rebalanceTxn);
         try {
@@ -166,7 +166,7 @@
         // get created dataset
         ICcApplicationContext appCtx =
                 (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
-        MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         final MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         Dataset sourceDataset;
@@ -226,7 +226,7 @@
     public void surviveInterruptOnMetadataTxnCommit() throws Exception {
         ICcApplicationContext appCtx =
                 (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
-        final MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        final MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         final MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxn);
         final String nodeGroupName = "ng";
@@ -258,7 +258,7 @@
     public void failedFlushOnUncommittedMetadataTxn() throws Exception {
         ICcApplicationContext ccAppCtx =
                 (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
-        final MetadataProvider metadataProvider = MetadataProvider.create(ccAppCtx, null);
+        final MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(ccAppCtx);
         final MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxn);
         final String nodeGroupName = "ng";
@@ -325,7 +325,7 @@
                 source.getDatabaseName(), source.getDataverseName(), source.getDatasetType().name(),
                 source.getNodeGroupName(), NoMergePolicyFactory.NAME, null, source.getDatasetDetails(),
                 source.getHints(), DatasetConfig.DatasetType.INTERNAL, datasetPostfix, 0);
-        MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
+        MetadataProvider metadataProvider = MetadataProvider.createWithDefaultNamespace(appCtx);
         final MetadataTransactionContext writeTxn = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(writeTxn);
         try {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
index 3b0e977..ba2381b 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
@@ -42,7 +42,7 @@
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
-import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.common.metadata.NamespaceResolver;
 import org.apache.asterix.lang.common.base.IParser;
 import org.apache.asterix.lang.common.base.IParserFactory;
@@ -144,8 +144,9 @@
         try {
             List<Statement> statements = parser.parse();
             //TODO(DB): fix this properly so that metadataProvider.getDefaultDataverse() works when actually called
-            DataverseName dvName = getDefaultDataverse(statements);
-            String dbName = MetadataUtil.databaseFor(dvName);
+            Namespace namespace = getDefaultDataverse(statements);
+            DataverseName dvName = namespace.getDataverseName();
+            String dbName = namespace.getDatabaseName();
             List<FunctionDecl> functions = getDeclaredFunctions(statements, dbName, dvName);
             List<FunctionSignature> createdFunctionsList = getCreatedFunctions(statements, dbName, dvName);
             createdFunctions.addAll(createdFunctionsList);
@@ -154,8 +155,7 @@
 
             @SuppressWarnings("unchecked")
             Map<String, Object> config = mock(Map.class);
-            when(metadataProvider.getDefaultDataverseName()).thenReturn(dvName);
-            when(metadataProvider.getDefaultDatabase()).thenReturn(dbName);
+            when(metadataProvider.getDefaultNamespace()).thenReturn(namespace);
             when(metadataProvider.getConfig()).thenReturn(config);
             when(config.get(FunctionUtil.IMPORT_PRIVATE_FUNCTIONS)).thenReturn("true");
             when(metadataProvider.findDataverse(anyString(), Mockito.<DataverseName> any()))
@@ -271,14 +271,14 @@
     }
 
     // Gets the default dataverse for the input statements.
-    private DataverseName getDefaultDataverse(List<Statement> statements) {
+    private Namespace getDefaultDataverse(List<Statement> statements) {
         for (Statement st : statements) {
             if (st.getKind() == Statement.Kind.DATAVERSE_DECL) {
                 DataverseDecl dv = (DataverseDecl) st;
-                return dv.getDataverseName();
+                return dv.getNamespace();
             }
         }
-        return MetadataConstants.DEFAULT_DATAVERSE_NAME;
+        return MetadataConstants.DEFAULT_NAMESPACE;
     }
 
     // Rewrite queries.
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
index bdbdfab..8d9a5f5 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
@@ -153,7 +153,7 @@
             final MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
             ICcApplicationContext appCtx = (ICcApplicationContext) ExecutionTestUtil.integrationUtil
                     .getClusterControllerService().getApplicationContext();
-            MetadataProvider metadataProver = MetadataProvider.create(appCtx, null);
+            MetadataProvider metadataProver = MetadataProvider.createWithDefaultNamespace(appCtx);
             metadataProver.setMetadataTxnContext(mdTxn);
             final DataverseName defaultDv = MetadataBuiltinEntities.DEFAULT_DATAVERSE.getDataverseName();
             final Dataset dataset = MetadataManager.INSTANCE.getDataset(mdTxn, MetadataConstants.DEFAULT_DATABASE,
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java
index a552dfb..7f9bde6 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INamespaceResolver.java
@@ -27,6 +27,8 @@
 
     Namespace resolve(List<String> multiIdentifier) throws AsterixException;
 
+    Namespace resolve(List<String> multiIdentifier, int fromIndex, int toIndex) throws AsterixException;
+
     Namespace resolve(String namespace) throws AsterixException;
 
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
index 3ac7d9d..02cf6d6 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
@@ -43,6 +43,8 @@
     // Name of the pre-defined default dataverse
     public static final DataverseName DEFAULT_DATAVERSE_NAME = DataverseName.createBuiltinDataverseName("Default");
 
+    public static final Namespace DEFAULT_NAMESPACE = new Namespace(DEFAULT_DATABASE, DEFAULT_DATAVERSE_NAME);
+
     // Name of the node group where metadata is stored on.
     public static final String METADATA_NODEGROUP_NAME = "MetadataGroup";
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/Namespace.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/Namespace.java
index 26b549a..5b75c79 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/Namespace.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/Namespace.java
@@ -19,9 +19,12 @@
 
 package org.apache.asterix.common.metadata;
 
+import java.io.Serializable;
 import java.util.Objects;
 
-public final class Namespace {
+public final class Namespace implements Serializable {
+
+    private static final long serialVersionUID = 1L;
 
     private final String databaseName;
     private final DataverseName dataverseName;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java
index 011432b..b18562e 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/NamespaceResolver.java
@@ -34,10 +34,15 @@
 
     @Override
     public Namespace resolve(List<String> multiIdentifier) throws AsterixException {
+        return resolve(multiIdentifier, 0, multiIdentifier.size());
+    }
+
+    @Override
+    public Namespace resolve(List<String> multiIdentifier, int fromIndex, int toIndex) throws AsterixException {
         if (multiIdentifier == null) {
             return null;
         }
-        DataverseName dataverseName = DataverseName.create(multiIdentifier);
+        DataverseName dataverseName = DataverseName.create(multiIdentifier, fromIndex, toIndex);
         return new Namespace(MetadataUtil.databaseFor(dataverseName), dataverseName);
     }
 
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java
index d4c03b2..1bbc2a7 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OrderedListTypeDefinition.java
@@ -25,7 +25,7 @@
 
 public class OrderedListTypeDefinition extends AbstractTypeExpression {
 
-    private TypeExpression itemTypeExpression;
+    private final TypeExpression itemTypeExpression;
 
     public OrderedListTypeDefinition(TypeExpression itemTypeExpression) {
         this.itemTypeExpression = itemTypeExpression;
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java
index ea0b1b1..9c98ecd 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/TypeReferenceExpression.java
@@ -21,20 +21,20 @@
 import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 
 public class TypeReferenceExpression extends AbstractTypeExpression {
 
-    private final Pair<DataverseName, Identifier> ident;
+    private final Pair<Namespace, Identifier> ident;
 
-    public TypeReferenceExpression(Pair<DataverseName, Identifier> ident) {
+    public TypeReferenceExpression(Pair<Namespace, Identifier> ident) {
         this.ident = ident;
     }
 
-    public Pair<DataverseName, Identifier> getIdent() {
+    public Pair<Namespace, Identifier> getIdent() {
         return ident;
     }
 
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
index b55c910..b23a780 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
@@ -25,7 +25,7 @@
 
 public class UnorderedListTypeDefinition extends AbstractTypeExpression {
 
-    private TypeExpression itemTypeExpression;
+    private final TypeExpression itemTypeExpression;
 
     public UnorderedListTypeDefinition(TypeExpression itemTypeExpression) {
         this.itemTypeExpression = itemTypeExpression;
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AdapterDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AdapterDropStatement.java
index 481dbe4..8b2a8e1 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AdapterDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AdapterDropStatement.java
@@ -20,19 +20,20 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class AdapterDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
 
     private final String adapterName;
 
     private final boolean ifExists;
 
-    public AdapterDropStatement(DataverseName dataverseName, String adapterName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public AdapterDropStatement(Namespace namespace, String adapterName, boolean ifExists) {
+        this.namespace = namespace;
         this.adapterName = adapterName;
         this.ifExists = ifExists;
     }
@@ -42,8 +43,12 @@
         return Kind.ADAPTER_DROP;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getAdapterName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeDropStatement.java
index 67cfeec..ceefea3 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeDropStatement.java
@@ -20,16 +20,17 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class AnalyzeDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String datasetName;
 
-    public AnalyzeDropStatement(DataverseName dataverseName, String datasetName) {
-        this.dataverseName = dataverseName;
+    public AnalyzeDropStatement(Namespace namespace, String datasetName) {
+        this.namespace = namespace;
         this.datasetName = datasetName;
     }
 
@@ -38,8 +39,12 @@
         return Kind.ANALYZE_DROP;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeStatement.java
index a719c34..5afb85f 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeStatement.java
@@ -25,6 +25,7 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.FieldBinding;
@@ -53,13 +54,13 @@
 
     private static final String SAMPLE_SEED_FIELD_NAME = "sample-seed";
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String datasetName;
     private final AdmObjectNode options;
 
-    public AnalyzeStatement(DataverseName dataverseName, String datasetName, RecordConstructor options)
+    public AnalyzeStatement(Namespace namespace, String datasetName, RecordConstructor options)
             throws CompilationException {
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.datasetName = datasetName;
         this.options = options == null ? null : validateOptions(options);
     }
@@ -94,8 +95,12 @@
         return Kind.ANALYZE;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java
index 4c79029..581ce9d 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -27,11 +28,11 @@
 
 public class CompactStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier datasetName;
 
-    public CompactStatement(DataverseName dataverseName, Identifier datasetName) {
-        this.dataverseName = dataverseName;
+    public CompactStatement(Namespace namespace, Identifier datasetName) {
+        this.namespace = namespace;
         this.datasetName = datasetName;
     }
 
@@ -40,8 +41,12 @@
         return Statement.Kind.COMPACT;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java
index 90892d2..357b437 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java
@@ -23,6 +23,7 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -32,22 +33,21 @@
 
 public class ConnectFeedStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier datasetName;
     private final String feedName;
     private final String policy;
     private final String whereClauseBody;
-    private int varCounter;
+    private final int varCounter;
     private final List<FunctionSignature> appliedFunctions;
 
-    public ConnectFeedStatement(Pair<DataverseName, Identifier> feedNameCmp,
-            Pair<DataverseName, Identifier> datasetNameCmp, List<FunctionSignature> appliedFunctions, String policy,
-            String whereClauseBody, int varCounter) {
+    public ConnectFeedStatement(Pair<Namespace, Identifier> feedNameCmp, Pair<Namespace, Identifier> datasetNameCmp,
+            List<FunctionSignature> appliedFunctions, String policy, String whereClauseBody, int varCounter) {
         if (feedNameCmp.first != null && datasetNameCmp.first != null
                 && !feedNameCmp.first.equals(datasetNameCmp.first)) {
             throw new IllegalArgumentException("Dataverse for source feed and target dataset do not match");
         }
-        this.dataverseName = feedNameCmp.first != null ? feedNameCmp.first : datasetNameCmp.first;
+        this.namespace = feedNameCmp.first != null ? feedNameCmp.first : datasetNameCmp.first;
         this.datasetName = datasetNameCmp.second;
         this.feedName = feedNameCmp.second.getValue();
         this.policy = policy != null ? policy : BuiltinFeedPolicies.DEFAULT_POLICY.getPolicyName();
@@ -56,8 +56,12 @@
         this.appliedFunctions = appliedFunctions;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyStatement.java
index 2a1a51a..a07371d 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.TypeExpression;
@@ -29,27 +30,27 @@
 
 public class CopyStatement extends AbstractStatement {
 
-    private DataverseName dataverseName;
-    private String datasetName;
-    private TypeExpression typeExpr;
-    private ExternalDetailsDecl externalDetails;
-    private AdmObjectNode withObjectNode;
+    private final Namespace namespace;
+    private final String datasetName;
+    private final TypeExpression typeExpr;
+    private final ExternalDetailsDecl externalDetails;
+    private final AdmObjectNode withObjectNode;
 
-    public CopyStatement(DataverseName dataverseName, String datasetName, TypeExpression typeExpr,
+    public CopyStatement(Namespace namespace, String datasetName, TypeExpression typeExpr,
             ExternalDetailsDecl externalDetails, RecordConstructor withRecord) throws CompilationException {
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.datasetName = datasetName;
         this.typeExpr = typeExpr;
         this.externalDetails = externalDetails;
         this.withObjectNode = withRecord == null ? new AdmObjectNode() : ExpressionUtils.toNode(withRecord);
     }
 
-    public DataverseName getDataverseName() {
-        return dataverseName;
+    public Namespace getNamespace() {
+        return namespace;
     }
 
-    public void setDataverseName(DataverseName dataverseName) {
-        this.dataverseName = dataverseName;
+    public DataverseName getDataverseName() {
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     @Override
@@ -61,10 +62,6 @@
         return datasetName;
     }
 
-    public void setDatasetName(String datasetName) {
-        this.datasetName = datasetName;
-    }
-
     @Override
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
         return visitor.visit(this, arg);
@@ -74,18 +71,10 @@
         return externalDetails;
     }
 
-    public void setExternalDetails(ExternalDetailsDecl externalDetails) {
-        this.externalDetails = externalDetails;
-    }
-
     public AdmObjectNode getWithObjectNode() {
         return withObjectNode;
     }
 
-    public void setWithObjectNode(AdmObjectNode withObjectNode) {
-        this.withObjectNode = withObjectNode;
-    }
-
     @Override
     public byte getCategory() {
         return Category.UPDATE;
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateAdapterStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateAdapterStatement.java
index 6e5886c..4442f7a 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateAdapterStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateAdapterStatement.java
@@ -22,16 +22,17 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class CreateAdapterStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
 
     private final String adapterName;
 
-    private final DataverseName libraryDataverseName;
+    private final Namespace libraryNamespace;
 
     private final String libraryName;
 
@@ -39,11 +40,11 @@
 
     private final boolean ifNotExists;
 
-    public CreateAdapterStatement(DataverseName dataverseName, String adapterName, DataverseName libraryDataverseName,
+    public CreateAdapterStatement(Namespace namespace, String adapterName, Namespace libraryNamespace,
             String libraryName, List<String> externalIdentifier, boolean ifNotExists) {
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.adapterName = adapterName;
-        this.libraryDataverseName = libraryDataverseName;
+        this.libraryNamespace = libraryNamespace;
         this.libraryName = libraryName;
         this.externalIdentifier = externalIdentifier;
         this.ifNotExists = ifNotExists;
@@ -54,16 +55,24 @@
         return Kind.CREATE_ADAPTER;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getAdapterName() {
         return adapterName;
     }
 
+    public String getLibraryDatabaseName() {
+        return libraryNamespace == null ? null : libraryNamespace.getDatabaseName();
+    }
+
     public DataverseName getLibraryDataverseName() {
-        return libraryDataverseName;
+        return libraryNamespace == null ? null : libraryNamespace.getDataverseName();
     }
 
     public String getLibraryName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
index 2276755..9b437c2 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
@@ -18,8 +18,11 @@
  */
 package org.apache.asterix.lang.common.statement;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
@@ -27,18 +30,22 @@
 
 public class CreateDataverseStatement extends AbstractStatement {
 
-    private DataverseName dataverseName;
-    private String format;
-    private boolean ifNotExists;
+    private final Namespace namespace;
+    private final String format;
+    private final boolean ifNotExists;
 
-    public CreateDataverseStatement(DataverseName dataverseName, String format, boolean ifNotExists) {
-        this.dataverseName = dataverseName;
+    public CreateDataverseStatement(Namespace namespace, String format, boolean ifNotExists) {
+        this.namespace = Objects.requireNonNull(namespace);
         this.format = (format == null) ? NonTaggedDataFormat.class.getName() : format;
         this.ifNotExists = ifNotExists;
     }
 
+    public String getDatabaseName() {
+        return namespace.getDatabaseName();
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace.getDataverseName();
     }
 
     public String getFormat() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java
index f12dfce..3f68536 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java
@@ -22,6 +22,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -38,21 +39,25 @@
  */
 public class CreateFeedStatement extends AbstractStatement {
 
-    private final Pair<DataverseName, Identifier> qName;
+    private final Pair<Namespace, Identifier> qName;
     private final boolean ifNotExists;
     private final AdmObjectNode withObjectNode;
 
-    public CreateFeedStatement(Pair<DataverseName, Identifier> qName, RecordConstructor withRecord, boolean ifNotExists)
+    public CreateFeedStatement(Pair<Namespace, Identifier> qName, RecordConstructor withRecord, boolean ifNotExists)
             throws AlgebricksException {
         this.qName = qName;
         this.ifNotExists = ifNotExists;
         this.withObjectNode = withRecord == null ? null : ExpressionUtils.toNode(withRecord);
     }
 
-    public DataverseName getDataverseName() {
+    public Namespace getNamespace() {
         return qName.first;
     }
 
+    public DataverseName getDataverseName() {
+        return qName.first == null ? null : qName.first.getDataverseName();
+    }
+
     public Identifier getFeedName() {
         return qName.second;
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextConfigStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextConfigStatement.java
index 2d304be..5aa680a 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextConfigStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextConfigStatement.java
@@ -18,10 +18,9 @@
  */
 package org.apache.asterix.lang.common.statement;
 
-import java.util.Iterator;
-
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.util.FullTextUtil;
@@ -37,7 +36,7 @@
 
 public class CreateFullTextConfigStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String configName;
     private final boolean ifNotExists;
     private final AdmObjectNode configNode;
@@ -45,16 +44,20 @@
     public static final String FIELD_NAME_TOKENIZER = "tokenizer";
     public static final String FIELD_NAME_FILTER_PIPELINE = "filterPipeline";
 
-    public CreateFullTextConfigStatement(DataverseName dataverseName, String configName, boolean ifNotExists,
+    public CreateFullTextConfigStatement(Namespace namespace, String configName, boolean ifNotExists,
             RecordConstructor expr) throws CompilationException {
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.configName = configName;
         this.ifNotExists = ifNotExists;
         this.configNode = FullTextUtil.validateAndGetConfigNode(expr);
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getConfigName() {
@@ -82,18 +85,15 @@
 
     public TokenizerCategory getTokenizerCategory() throws HyracksDataException {
         String tokenizerCategoryStr = configNode.getString(FIELD_NAME_TOKENIZER);
-        TokenizerCategory tokenizerCategory = TokenizerCategory.getEnumIgnoreCase(tokenizerCategoryStr);
-
-        return tokenizerCategory;
+        return TokenizerCategory.getEnumIgnoreCase(tokenizerCategoryStr);
     }
 
     public ImmutableList<String> getFilterNames() {
         AdmArrayNode arrayNode = (AdmArrayNode) configNode.get(FIELD_NAME_FILTER_PIPELINE);
         ImmutableList.Builder<String> filterNamesBuilder = ImmutableList.builder();
 
-        Iterator<IAdmNode> iterator = arrayNode.iterator();
-        while (iterator.hasNext()) {
-            filterNamesBuilder.add(((AdmStringNode) iterator.next()).get());
+        for (IAdmNode iAdmNode : arrayNode) {
+            filterNamesBuilder.add(((AdmStringNode) iAdmNode).get());
         }
 
         return filterNamesBuilder.build();
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextFilterStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextFilterStatement.java
index 20427fd..2075178 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextFilterStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFullTextFilterStatement.java
@@ -18,11 +18,10 @@
  */
 package org.apache.asterix.lang.common.statement;
 
-import java.util.Iterator;
-
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.util.FullTextUtil;
@@ -37,7 +36,7 @@
 
 public class CreateFullTextFilterStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String filterName;
     private final boolean ifNotExists;
     private final AdmObjectNode filterNode;
@@ -46,16 +45,20 @@
     public static final String FIELD_NAME_STOPWORDS_LIST = "stopwordsList";
     public static final String FIELD_TYPE_STOPWORDS = "stopwords";
 
-    public CreateFullTextFilterStatement(DataverseName dataverseName, String filterName, boolean ifNotExists,
+    public CreateFullTextFilterStatement(Namespace namespace, String filterName, boolean ifNotExists,
             RecordConstructor expr) throws CompilationException {
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.filterName = filterName;
         this.ifNotExists = ifNotExists;
         this.filterNode = FullTextUtil.getFilterNode(expr);
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getFilterName() {
@@ -71,21 +74,19 @@
     }
 
     public ImmutableList<String> getStopwordsList() throws CompilationException {
-        ImmutableList.Builder listBuiler = ImmutableList.<String> builder();
+        ImmutableList.Builder<String> listBuilder = ImmutableList.builder();
         AdmArrayNode arrayNode = (AdmArrayNode) filterNode.get(FIELD_NAME_STOPWORDS_LIST);
 
-        Iterator<IAdmNode> iterator = arrayNode.iterator();
-        while (iterator.hasNext()) {
-            IAdmNode node = iterator.next();
+        for (IAdmNode node : arrayNode) {
             if (!(node instanceof AdmStringNode)) {
                 throw new CompilationException(ErrorCode.PARSE_ERROR, getSourceLocation(),
                         "error when parsing stopwords list");
             }
 
-            listBuiler.add(((AdmStringNode) node).get());
+            listBuilder.add(((AdmStringNode) node).get());
         }
 
-        return listBuiler.build();
+        return listBuilder.build();
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java
index baaa2c1..e0623a1 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java
@@ -25,6 +25,7 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
@@ -55,7 +56,7 @@
     private final List<Pair<VarIdentifier, TypeExpression>> paramList;
     private final TypeExpression returnType;
 
-    private final DataverseName libraryDataverseName;
+    private final Namespace libraryNamespace;
     private final String libraryName;
     private final List<String> externalIdentifier;
     private final AdmObjectNode options;
@@ -70,7 +71,7 @@
         this.functionBodyExpression = functionBodyExpression;
         this.paramList = requireNullTypes(paramList); // parameter type specification is not allowed for inline functions
         this.returnType = null; // return type specification is not allowed for inline functions
-        this.libraryDataverseName = null;
+        this.libraryNamespace = null;
         this.libraryName = null;
         this.externalIdentifier = null;
         this.options = null;
@@ -79,13 +80,12 @@
     }
 
     public CreateFunctionStatement(FunctionSignature signature, List<Pair<VarIdentifier, TypeExpression>> paramList,
-            TypeExpression returnType, DataverseName libraryDataverseName, String libraryName,
-            List<String> externalIdentifier, RecordConstructor options, boolean replaceIfExists, boolean ifNotExists)
-            throws CompilationException {
+            TypeExpression returnType, Namespace libraryNamespace, String libraryName, List<String> externalIdentifier,
+            RecordConstructor options, boolean replaceIfExists, boolean ifNotExists) throws CompilationException {
         this.signature = signature;
         this.paramList = paramList;
         this.returnType = returnType;
-        this.libraryDataverseName = libraryDataverseName;
+        this.libraryNamespace = libraryNamespace;
         this.libraryName = libraryName;
         this.externalIdentifier = externalIdentifier;
         this.options = options == null ? null : ExpressionUtils.toNode(options);
@@ -136,8 +136,12 @@
         return externalIdentifier;
     }
 
+    public String getLibraryDatabaseName() {
+        return libraryNamespace == null ? null : libraryNamespace.getDatabaseName();
+    }
+
     public DataverseName getLibraryDataverseName() {
-        return libraryDataverseName;
+        return libraryNamespace == null ? null : libraryNamespace.getDataverseName();
     }
 
     public String getLibraryName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java
index aabd76d..1d9e5ab 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java
@@ -27,6 +27,7 @@
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.IndexedTypeExpression;
@@ -39,7 +40,7 @@
 
 public class CreateIndexStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier datasetName;
     private final Identifier indexName;
     private final IndexType indexType;
@@ -54,11 +55,10 @@
     private final OptionalBoolean castDefaultNull;
     private final Map<String, String> castConfig;
 
-    public CreateIndexStatement(DataverseName dataverseName, Identifier datasetName, Identifier indexName,
-            IndexType indexType, List<IndexedElement> indexedElements, boolean enforced, int gramLength,
-            String fullTextConfigName, boolean ifNotExists, Boolean excludeUnknownKey, Boolean castDefaultNull,
-            Map<String, String> castConfig) {
-        this.dataverseName = dataverseName;
+    public CreateIndexStatement(Namespace namespace, Identifier datasetName, Identifier indexName, IndexType indexType,
+            List<IndexedElement> indexedElements, boolean enforced, int gramLength, String fullTextConfigName,
+            boolean ifNotExists, Boolean excludeUnknownKey, Boolean castDefaultNull, Map<String, String> castConfig) {
+        this.namespace = namespace;
         this.datasetName = Objects.requireNonNull(datasetName);
         this.indexName = Objects.requireNonNull(indexName);
         this.indexType = Objects.requireNonNull(indexType);
@@ -76,8 +76,12 @@
         return fullTextConfigName;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateLibraryStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateLibraryStatement.java
index e8f589d..5941ab2 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateLibraryStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateLibraryStatement.java
@@ -24,12 +24,13 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.functions.ExternalFunctionLanguage;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public final class CreateLibraryStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String libraryName;
     private final ExternalFunctionLanguage lang;
     private final String hash;
@@ -37,9 +38,9 @@
     private final boolean replaceIfExists;
     private final String authToken;
 
-    public CreateLibraryStatement(DataverseName dataverseName, String libraryName, ExternalFunctionLanguage lang,
-            String hash, URI location, boolean replaceIfExists, String authToken) {
-        this.dataverseName = dataverseName;
+    public CreateLibraryStatement(Namespace namespace, String libraryName, ExternalFunctionLanguage lang, String hash,
+            URI location, boolean replaceIfExists, String authToken) {
+        this.namespace = namespace;
         this.libraryName = libraryName;
         this.lang = lang;
         this.location = location;
@@ -48,8 +49,12 @@
         this.hash = hash;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getLibraryName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSynonymStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSynonymStatement.java
index afc58f4..a4f071b 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSynonymStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSynonymStatement.java
@@ -21,40 +21,49 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class CreateSynonymStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
 
     private final String synonymName;
 
-    private final DataverseName objectDataverseName;
+    private final Namespace objectNamespace;
 
     private final String objectName;
 
     private final boolean ifNotExists;
 
-    public CreateSynonymStatement(DataverseName dataverseName, String synonymName, DataverseName objectDataverseName,
-            String objectName, boolean ifNotExists) {
-        this.dataverseName = dataverseName;
+    public CreateSynonymStatement(Namespace namespace, String synonymName, Namespace objectNamespace, String objectName,
+            boolean ifNotExists) {
+        this.namespace = namespace;
         this.synonymName = synonymName;
-        this.objectDataverseName = objectDataverseName;
+        this.objectNamespace = objectNamespace;
         this.objectName = objectName;
         this.ifNotExists = ifNotExists;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getSynonymName() {
         return synonymName;
     }
 
+    public Namespace getObjectNamespace() {
+        return objectNamespace;
+    }
+
     public DataverseName getObjectDataverseName() {
-        return objectDataverseName;
+        return objectNamespace == null ? null : objectNamespace.getDataverseName();
     }
 
     public String getObjectName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateViewStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateViewStatement.java
index 7e4a0ef..9d30bba 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateViewStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateViewStatement.java
@@ -25,6 +25,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
@@ -34,7 +35,7 @@
 
 public final class CreateViewStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
 
     private final String viewName;
 
@@ -56,10 +57,10 @@
 
     private final boolean ifNotExists;
 
-    public CreateViewStatement(DataverseName dataverseName, String viewName, TypeExpression itemType, String viewBody,
+    public CreateViewStatement(Namespace namespace, String viewName, TypeExpression itemType, String viewBody,
             Expression viewBodyExpression, Boolean defaultNull, Map<String, String> viewConfig, KeyDecl primaryKeyDecl,
             List<ForeignKeyDecl> foreignKeyDecls, boolean replaceIfExists, boolean ifNotExists) {
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.viewName = Objects.requireNonNull(viewName);
         this.itemType = itemType;
         this.viewBody = Objects.requireNonNull(viewBody);
@@ -82,8 +83,12 @@
         return Category.DDL;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getViewName() {
@@ -159,19 +164,23 @@
 
     public static class ForeignKeyDecl extends KeyDecl {
 
-        private final DataverseName referencedDataverseName;
+        private final Namespace referencedNamespace;
 
         private final Identifier referencedDatasetName;
 
-        public ForeignKeyDecl(List<List<String>> fields, List<Integer> sourceIndicators,
-                DataverseName referencedDataverseName, Identifier referencedDatasetName) {
+        public ForeignKeyDecl(List<List<String>> fields, List<Integer> sourceIndicators, Namespace referencedNamespace,
+                Identifier referencedDatasetName) {
             super(fields, sourceIndicators);
-            this.referencedDataverseName = referencedDataverseName;
+            this.referencedNamespace = referencedNamespace;
             this.referencedDatasetName = referencedDatasetName;
         }
 
+        public String getReferencedDatabaseName() {
+            return referencedNamespace == null ? null : referencedNamespace.getDatabaseName();
+        }
+
         public DataverseName getReferencedDataverseName() {
-            return referencedDataverseName;
+            return referencedNamespace == null ? null : referencedNamespace.getDataverseName();
         }
 
         public Identifier getReferencedDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
index 22fd3a7..e4afd6b 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
@@ -24,6 +24,7 @@
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
@@ -38,8 +39,9 @@
 import org.apache.asterix.runtime.compression.CompressionManager;
 
 public class DatasetDecl extends AbstractStatement {
+
     protected final Identifier name;
-    protected final DataverseName dataverse;
+    protected final Namespace namespace;
     protected final TypeExpression itemType;
     protected final TypeExpression metaItemType;
     protected final DatasetType datasetType;
@@ -49,16 +51,16 @@
     protected final boolean ifNotExists;
     protected final Query query;
 
-    public DatasetDecl(DataverseName dataverse, Identifier name, TypeExpression itemType, TypeExpression metaItemType,
+    public DatasetDecl(Namespace namespace, Identifier name, TypeExpression itemType, TypeExpression metaItemType,
             Map<String, String> hints, DatasetType datasetType, IDatasetDetailsDecl idd, RecordConstructor withRecord,
             boolean ifNotExists) throws CompilationException {
-        this(dataverse, name, itemType, metaItemType, hints, datasetType, idd, withRecord, ifNotExists, null);
+        this(namespace, name, itemType, metaItemType, hints, datasetType, idd, withRecord, ifNotExists, null);
     }
 
-    public DatasetDecl(DataverseName dataverse, Identifier name, TypeExpression itemType, TypeExpression metaItemType,
+    public DatasetDecl(Namespace namespace, Identifier name, TypeExpression itemType, TypeExpression metaItemType,
             Map<String, String> hints, DatasetType datasetType, IDatasetDetailsDecl idd, RecordConstructor withRecord,
             boolean ifNotExists, Query query) throws CompilationException {
-        this.dataverse = dataverse;
+        this.namespace = namespace;
         this.name = name;
         this.itemType = itemType;
         this.metaItemType = metaItemType;
@@ -82,8 +84,12 @@
         return name;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverse() {
-        return dataverse;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public TypeExpression getItemType() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java
index dd22950..07395d2 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java
@@ -42,6 +42,10 @@
         this.ifExists = ifExists;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
         return namespace.getDataverseName();
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
index fa6bc4e..14ed0da 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
@@ -18,24 +18,27 @@
  */
 package org.apache.asterix.lang.common.statement;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class DataverseDropStatement extends AbstractStatement {
 
-    private DataverseName dataverseName;
-    private boolean ifExists;
-    private boolean ifEmpty;
+    private final Namespace namespace;
+    private final boolean ifExists;
+    private final boolean ifEmpty;
 
-    public DataverseDropStatement(DataverseName dataverseName, boolean ifExists) {
-        this(dataverseName, ifExists, false);
+    public DataverseDropStatement(Namespace namespace, boolean ifExists) {
+        this(namespace, ifExists, false);
     }
 
-    public DataverseDropStatement(DataverseName dataverseName, boolean ifExists, boolean ifEmpty) {
-        this.dataverseName = dataverseName;
+    public DataverseDropStatement(Namespace namespace, boolean ifExists, boolean ifEmpty) {
+        this.namespace = Objects.requireNonNull(namespace);
         this.ifExists = ifExists;
         this.ifEmpty = ifEmpty;
     }
@@ -45,8 +48,12 @@
         return Statement.Kind.DATAVERSE_DROP;
     }
 
+    public String getDatabaseName() {
+        return namespace.getDatabaseName();
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public boolean getIfExists() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
index 1ce2d55..6243149 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
@@ -22,6 +22,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
@@ -30,17 +31,17 @@
 
 public class DeleteStatement extends AbstractStatement {
 
-    private VariableExpr vars;
-    private DataverseName dataverseName;
+    private final VariableExpr vars;
+    private Namespace namespace;
     private String datasetName;
-    private Expression condition;
-    private int varCounter;
+    private final Expression condition;
+    private final int varCounter;
     private Query rewrittenQuery;
 
-    public DeleteStatement(VariableExpr vars, DataverseName dataverseName, String datasetName, Expression condition,
+    public DeleteStatement(VariableExpr vars, Namespace namespace, String datasetName, Expression condition,
             int varCounter) {
         this.vars = vars;
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.datasetName = datasetName;
         this.condition = condition;
         this.varCounter = varCounter;
@@ -55,12 +56,20 @@
         return vars;
     }
 
-    public DataverseName getDataverseName() {
-        return dataverseName;
+    public Namespace getNamespace() {
+        return namespace;
     }
 
-    public void setDataverseName(DataverseName dataverseName) {
-        this.dataverseName = dataverseName;
+    public String getDatabaseName() {
+        return namespace == null ? null : namespace.getDatabaseName();
+    }
+
+    public DataverseName getDataverseName() {
+        return namespace == null ? null : namespace.getDataverseName();
+    }
+
+    public void setNamespace(Namespace namespace) {
+        this.namespace = namespace;
     }
 
     public String getDatasetName() {
@@ -94,7 +103,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(condition, datasetName, dataverseName, rewrittenQuery, vars);
+        return Objects.hash(condition, datasetName, namespace, rewrittenQuery, vars);
     }
 
     @Override
@@ -108,9 +117,8 @@
         }
         DeleteStatement target = (DeleteStatement) object;
         return Objects.equals(condition, target.condition) && Objects.equals(datasetName, target.datasetName)
-                && Objects.equals(dataverseName, target.dataverseName)
-                && Objects.equals(rewrittenQuery, target.rewrittenQuery) && Objects.equals(vars, target.vars)
-                && varCounter == target.varCounter;
+                && Objects.equals(namespace, target.namespace) && Objects.equals(rewrittenQuery, target.rewrittenQuery)
+                && Objects.equals(vars, target.vars) && varCounter == target.varCounter;
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java
index 20306c5..eb2ae01 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -28,29 +29,27 @@
 
 public class DisconnectFeedStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier feedName;
     private final Identifier datasetName;
 
-    public DisconnectFeedStatement(DataverseName dataverseName, Identifier feedName, Identifier datasetName) {
-        this.feedName = feedName;
-        this.datasetName = datasetName;
-        this.dataverseName = dataverseName;
-    }
-
-    public DisconnectFeedStatement(Pair<DataverseName, Identifier> feedNameComponent,
-            Pair<DataverseName, Identifier> datasetNameComponent) {
+    public DisconnectFeedStatement(Pair<Namespace, Identifier> feedNameComponent,
+            Pair<Namespace, Identifier> datasetNameComponent) {
         if (feedNameComponent.first != null && datasetNameComponent.first != null
                 && !feedNameComponent.first.equals(datasetNameComponent.first)) {
             throw new IllegalArgumentException("Dataverse for source feed and target dataset do not match");
         }
-        this.dataverseName = feedNameComponent.first != null ? feedNameComponent.first : datasetNameComponent.first;
+        this.namespace = feedNameComponent.first != null ? feedNameComponent.first : datasetNameComponent.first;
         this.datasetName = datasetNameComponent.second;
         this.feedName = feedNameComponent.second;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getFeedName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropDatasetStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropDatasetStatement.java
index 557a647..b0ee41a 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropDatasetStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropDatasetStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -27,12 +28,12 @@
 
 public class DropDatasetStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier datasetName;
-    private boolean ifExists;
+    private final boolean ifExists;
 
-    public DropDatasetStatement(DataverseName dataverseName, Identifier datasetName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public DropDatasetStatement(Namespace namespace, Identifier datasetName, boolean ifExists) {
+        this.namespace = namespace;
         this.datasetName = datasetName;
         this.ifExists = ifExists;
     }
@@ -42,8 +43,12 @@
         return Statement.Kind.DATASET_DROP;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java
index c91d1a1..6147fe8 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -27,12 +28,12 @@
 
 public class FeedDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier feedName;
-    private boolean ifExists;
+    private final boolean ifExists;
 
-    public FeedDropStatement(DataverseName dataverseName, Identifier feedName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public FeedDropStatement(Namespace namespace, Identifier feedName, boolean ifExists) {
+        this.namespace = namespace;
         this.feedName = feedName;
         this.ifExists = ifExists;
     }
@@ -42,8 +43,12 @@
         return Statement.Kind.DROP_FEED;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getFeedName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java
index 21a6a39..4c3f52e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -27,12 +28,12 @@
 
 public class FeedPolicyDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier policyName;
-    private boolean ifExists;
+    private final boolean ifExists;
 
-    public FeedPolicyDropStatement(DataverseName dataverseName, Identifier policyName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public FeedPolicyDropStatement(Namespace namespace, Identifier policyName, boolean ifExists) {
+        this.namespace = namespace;
         this.policyName = policyName;
         this.ifExists = ifExists;
     }
@@ -42,8 +43,12 @@
         return Statement.Kind.DROP_FEED_POLICY;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getPolicyName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextConfigDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextConfigDropStatement.java
index ad84571..5ecd09c 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextConfigDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextConfigDropStatement.java
@@ -20,17 +20,18 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class FullTextConfigDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String configName;
     private final boolean ifExists;
 
-    public FullTextConfigDropStatement(DataverseName dataverseName, String configName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public FullTextConfigDropStatement(Namespace namespace, String configName, boolean ifExists) {
+        this.namespace = namespace;
         this.configName = configName;
         this.ifExists = ifExists;
     }
@@ -44,8 +45,12 @@
         return ifExists;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getConfigName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextFilterDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextFilterDropStatement.java
index 9debca0..5e42133 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextFilterDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FullTextFilterDropStatement.java
@@ -20,17 +20,18 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class FullTextFilterDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String filterName;
     private final boolean ifExists;
 
-    public FullTextFilterDropStatement(DataverseName dataverseName, String filterName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public FullTextFilterDropStatement(Namespace namespace, String filterName, boolean ifExists) {
+        this.namespace = namespace;
         this.filterName = filterName;
         this.ifExists = ifExists;
     }
@@ -40,8 +41,12 @@
         return Kind.FULL_TEXT_FILTER_DROP;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getFilterName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java
index d479626..0576326 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -27,14 +28,13 @@
 
 public class IndexDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier datasetName;
     private final Identifier indexName;
     private final boolean ifExists;
 
-    public IndexDropStatement(DataverseName dataverseName, Identifier datasetName, Identifier indexName,
-            boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public IndexDropStatement(Namespace namespace, Identifier datasetName, Identifier indexName, boolean ifExists) {
+        this.namespace = namespace;
         this.datasetName = datasetName;
         this.indexName = indexName;
         this.ifExists = ifExists;
@@ -45,8 +45,12 @@
         return Statement.Kind.INDEX_DROP;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getDatasetName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
index cf720ba..d4251c6 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
@@ -24,6 +24,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.IReturningStatement;
@@ -33,16 +34,16 @@
 
 public class InsertStatement extends AbstractStatement implements IReturningStatement {
 
-    private DataverseName dataverseName;
+    private Namespace namespace;
     private String datasetName;
     private final Query query;
     private final VariableExpr var;
     private Expression returnExpression;
     private int varCounter;
 
-    public InsertStatement(DataverseName dataverseName, String datasetName, Query query, int varCounter,
-            VariableExpr var, Expression returnExpression) {
-        this.dataverseName = dataverseName;
+    public InsertStatement(Namespace namespace, String datasetName, Query query, int varCounter, VariableExpr var,
+            Expression returnExpression) {
+        this.namespace = namespace;
         this.datasetName = datasetName;
         this.query = query;
         this.varCounter = varCounter;
@@ -55,12 +56,20 @@
         return Statement.Kind.INSERT;
     }
 
-    public DataverseName getDataverseName() {
-        return dataverseName;
+    public Namespace getNamespace() {
+        return namespace;
     }
 
-    public void setDataverseName(DataverseName dataverseName) {
-        this.dataverseName = dataverseName;
+    public DataverseName getDataverseName() {
+        return namespace == null ? null : namespace.getDataverseName();
+    }
+
+    public String getDatabaseName() {
+        return namespace == null ? null : namespace.getDatabaseName();
+    }
+
+    public void setNamespace(Namespace namespace) {
+        this.namespace = namespace;
     }
 
     public String getDatasetName() {
@@ -129,7 +138,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(datasetName, dataverseName, query, varCounter, var, returnExpression);
+        return Objects.hash(datasetName, namespace, query, varCounter, var, returnExpression);
     }
 
     @Override
@@ -142,7 +151,7 @@
             return false;
         }
         InsertStatement target = (InsertStatement) object;
-        return Objects.equals(datasetName, target.datasetName) && Objects.equals(dataverseName, target.dataverseName)
+        return Objects.equals(datasetName, target.datasetName) && Objects.equals(namespace, target.namespace)
                 && Objects.equals(query, target.query) && Objects.equals(returnExpression, target.returnExpression)
                 && varCounter == target.varCounter && Objects.equals(var, target.var);
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LibraryDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LibraryDropStatement.java
index 412b3ba..85d6389 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LibraryDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LibraryDropStatement.java
@@ -21,24 +21,29 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public final class LibraryDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final String libraryName;
 
     private final boolean ifExists;
 
-    public LibraryDropStatement(DataverseName dataverseName, String libraryName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public LibraryDropStatement(Namespace namespace, String libraryName, boolean ifExists) {
+        this.namespace = namespace;
         this.libraryName = libraryName;
         this.ifExists = ifExists;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getLibraryName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java
index e649e2a..38accc5 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java
@@ -22,24 +22,25 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class LoadStatement extends AbstractStatement {
 
-    private DataverseName dataverseName;
+    private Namespace namespace;
     private String datasetName;
     private String adapter;
     private Map<String, String> properties;
-    private boolean dataIsLocallySorted;
+    private final boolean dataIsLocallySorted;
 
-    public LoadStatement(DataverseName dataverseName, String datasetName, String adapter,
-            Map<String, String> propertiees, boolean dataIsLocallySorted) {
-        this.dataverseName = dataverseName;
+    public LoadStatement(Namespace namespace, String datasetName, String adapter, Map<String, String> properties,
+            boolean dataIsLocallySorted) {
+        this.namespace = namespace;
         this.datasetName = datasetName;
         this.adapter = adapter;
-        this.properties = propertiees;
+        this.properties = properties;
         this.dataIsLocallySorted = dataIsLocallySorted;
     }
 
@@ -59,12 +60,20 @@
         this.properties = properties;
     }
 
-    public DataverseName getDataverseName() {
-        return dataverseName;
+    public Namespace getNamespace() {
+        return namespace;
     }
 
-    public void setDataverseName(DataverseName dataverseName) {
-        this.dataverseName = dataverseName;
+    public DataverseName getDataverseName() {
+        return namespace == null ? null : namespace.getDataverseName();
+    }
+
+    public String getDatabaseName() {
+        return namespace == null ? null : namespace.getDatabaseName();
+    }
+
+    public void setNamespace(Namespace namespace) {
+        this.namespace = namespace;
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java
index 7bb0c69..8ca632e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java
@@ -26,8 +26,8 @@
 
 public class NodeGroupDropStatement extends AbstractStatement {
 
-    private Identifier nodeGroupName;
-    private boolean ifExists;
+    private final Identifier nodeGroupName;
+    private final boolean ifExists;
 
     public NodeGroupDropStatement(Identifier nodeGroupName, boolean ifExists) {
         this.nodeGroupName = nodeGroupName;
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java
index e4b3f5b..a01c841 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java
@@ -28,9 +28,9 @@
 
 public class NodegroupDecl extends AbstractStatement {
 
-    private Identifier nodegroupName;
-    private List<Identifier> nodeControllerNames;
-    private boolean ifNotExists;
+    private final Identifier nodegroupName;
+    private final List<Identifier> nodeControllerNames;
+    private final boolean ifNotExists;
 
     public NodegroupDecl(Identifier nodegroupName, List<Identifier> nodeControllerNames, boolean ifNotExists) {
         this.nodegroupName = nodegroupName;
@@ -46,10 +46,6 @@
         return nodeControllerNames;
     }
 
-    public void setNodeControllerNames(List<Identifier> nodeControllerNames) {
-        this.nodeControllerNames = nodeControllerNames;
-    }
-
     public boolean getIfNotExists() {
         return this.ifNotExists;
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java
index 8c52b45..6239655 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java
@@ -25,8 +25,8 @@
 
 public class SetStatement extends AbstractStatement {
 
-    private String propName;
-    private String propValue;
+    private final String propName;
+    private final String propValue;
 
     public SetStatement(String propName, String propValue) {
         this.propName = propName;
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StartFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StartFeedStatement.java
index 7dc652e..921b4b0 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StartFeedStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StartFeedStatement.java
@@ -21,6 +21,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
@@ -29,11 +30,11 @@
 public class StartFeedStatement extends AbstractStatement {
 
     public static final String WAIT_FOR_COMPLETION = "wait-for-completion-feed";
-    private DataverseName dataverseName;
-    private Identifier feedName;
+    private final Namespace namespace;
+    private final Identifier feedName;
 
-    public StartFeedStatement(Pair<DataverseName, Identifier> feedNameComp) {
-        dataverseName = feedNameComp.first;
+    public StartFeedStatement(Pair<Namespace, Identifier> feedNameComp) {
+        namespace = feedNameComp.first;
         feedName = feedNameComp.second;
     }
 
@@ -52,8 +53,12 @@
         return Category.UPDATE;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getFeedName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StopFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StopFeedStatement.java
index 4cfcc0a..e69519b 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StopFeedStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/StopFeedStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
@@ -27,11 +28,11 @@
 
 public class StopFeedStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier feedName;
 
-    public StopFeedStatement(Pair<DataverseName, Identifier> feedNameComp) {
-        this.dataverseName = feedNameComp.first;
+    public StopFeedStatement(Pair<Namespace, Identifier> feedNameComp) {
+        this.namespace = feedNameComp.first;
         this.feedName = feedNameComp.second;
     }
 
@@ -50,8 +51,12 @@
         return visitor.visit(this, arg);
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getFeedName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SynonymDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SynonymDropStatement.java
index 31c8337..d81b872 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SynonymDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SynonymDropStatement.java
@@ -21,25 +21,30 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class SynonymDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
 
     private final String synonymName;
 
     private final boolean ifExists;
 
-    public SynonymDropStatement(DataverseName dataverseName, String synonymName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public SynonymDropStatement(Namespace namespace, String synonymName, boolean ifExists) {
+        this.namespace = namespace;
         this.synonymName = synonymName;
         this.ifExists = ifExists;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public String getSynonymName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java
index a840fea..264a797 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java
@@ -21,6 +21,7 @@
 import org.apache.asterix.common.annotations.TypeDataGen;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.TypeExpression;
@@ -29,31 +30,31 @@
 
 public class TypeDecl extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
     private final Identifier ident;
     private final TypeExpression typeDef;
     private final TypeDataGen datagenAnnotation;
     private final boolean ifNotExists;
 
-    public TypeDecl(DataverseName dataverseName, Identifier ident, TypeExpression typeDef, TypeDataGen datagen,
+    public TypeDecl(Namespace namespace, Identifier ident, TypeExpression typeDef, TypeDataGen datagen,
             boolean ifNotExists) {
-        this.dataverseName = dataverseName;
+        this.namespace = namespace;
         this.ident = ident;
         this.typeDef = typeDef;
         this.datagenAnnotation = datagen;
         this.ifNotExists = ifNotExists;
     }
 
-    public TypeDecl(DataverseName dataverse, Identifier ident, TypeExpression typeDef) {
-        this(dataverse, ident, typeDef, null, false);
-    }
-
     public Identifier getIdent() {
         return ident;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public TypeExpression getTypeDef() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java
index 73aef54..2eb7ef1 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -27,12 +28,12 @@
 
 public class TypeDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
-    private Identifier typeName;
-    private boolean ifExists;
+    private final Namespace namespace;
+    private final Identifier typeName;
+    private final boolean ifExists;
 
-    public TypeDropStatement(DataverseName dataverseName, Identifier typeName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public TypeDropStatement(Namespace namespace, Identifier typeName, boolean ifExists) {
+        this.namespace = namespace;
         this.typeName = typeName;
         this.ifExists = ifExists;
     }
@@ -42,8 +43,12 @@
         return Statement.Kind.TYPE_DROP;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getTypeName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java
index 09ef2f2..b537cdf 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java
@@ -18,16 +18,16 @@
  */
 package org.apache.asterix.lang.common.statement;
 
-import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 
 public class UpsertStatement extends InsertStatement {
 
-    public UpsertStatement(DataverseName dataverseName, String datasetName, Query query, int varCounter,
-            VariableExpr var, Expression returnExpression) {
-        super(dataverseName, datasetName, query, varCounter, var, returnExpression);
+    public UpsertStatement(Namespace namespace, String datasetName, Query query, int varCounter, VariableExpr var,
+            Expression returnExpression) {
+        super(namespace, datasetName, query, varCounter, var, returnExpression);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ViewDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ViewDropStatement.java
index 9f8577c..d5a053a 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ViewDropStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ViewDropStatement.java
@@ -21,6 +21,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.Identifier;
@@ -28,20 +29,24 @@
 
 public class ViewDropStatement extends AbstractStatement {
 
-    private final DataverseName dataverseName;
+    private final Namespace namespace;
 
     private final Identifier viewName;
 
     private final boolean ifExists;
 
-    public ViewDropStatement(DataverseName dataverseName, Identifier viewName, boolean ifExists) {
-        this.dataverseName = dataverseName;
+    public ViewDropStatement(Namespace namespace, Identifier viewName, boolean ifExists) {
+        this.namespace = namespace;
         this.viewName = viewName;
         this.ifExists = ifExists;
     }
 
+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public DataverseName getDataverseName() {
-        return dataverseName;
+        return namespace == null ? null : namespace.getDataverseName();
     }
 
     public Identifier getViewName() {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
index b5757af..e1ba3ba 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
@@ -38,6 +38,7 @@
 import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.IParser;
 import org.apache.asterix.lang.common.base.IParserFactory;
@@ -90,15 +91,17 @@
         return BuiltinFunctions.getBuiltinFunctionInfo(fi);
     }
 
-    public static TypeSignature getTypeDependencyFromFunctionParameter(TypeExpression typeExpr,
+    public static TypeSignature getTypeDependencyFromFunctionParameter(TypeExpression typeExpr, String defaultDatabase,
             DataverseName defaultDataverse) {
         switch (typeExpr.getTypeKind()) {
             case ORDEREDLIST:
                 return getTypeDependencyFromFunctionParameter(
-                        ((OrderedListTypeDefinition) typeExpr).getItemTypeExpression(), defaultDataverse);
+                        ((OrderedListTypeDefinition) typeExpr).getItemTypeExpression(), defaultDatabase,
+                        defaultDataverse);
             case UNORDEREDLIST:
                 return getTypeDependencyFromFunctionParameter(
-                        ((UnorderedListTypeDefinition) typeExpr).getItemTypeExpression(), defaultDataverse);
+                        ((UnorderedListTypeDefinition) typeExpr).getItemTypeExpression(), defaultDatabase,
+                        defaultDataverse);
             case TYPEREFERENCE:
                 TypeReferenceExpression typeRef = ((TypeReferenceExpression) typeExpr);
                 String typeName = typeRef.getIdent().getSecond().toString();
@@ -106,9 +109,17 @@
                 if (builtinType != null) {
                     return null;
                 }
-                DataverseName typeDataverseName =
-                        typeRef.getIdent().getFirst() != null ? typeRef.getIdent().getFirst() : defaultDataverse;
-                return new TypeSignature(typeDataverseName, typeName);
+                Namespace typeRefNamespace = typeRef.getIdent().getFirst();
+                DataverseName typeDataverseName;
+                String typeDatabaseName;
+                if (typeRefNamespace == null) {
+                    typeDataverseName = defaultDataverse;
+                    typeDatabaseName = defaultDatabase;
+                } else {
+                    typeDataverseName = typeRefNamespace.getDataverseName();
+                    typeDatabaseName = typeRefNamespace.getDatabaseName();
+                }
+                return new TypeSignature(typeDatabaseName, typeDataverseName, typeName);
             case RECORD:
                 throw new IllegalArgumentException();
             default:
@@ -123,8 +134,9 @@
         DataverseName dataverse = fs.getDataverseName();
         String database = fs.getDatabaseName();
         if (dataverse == null) {
-            dataverse = metadataProvider.getDefaultDataverseName();
-            database = metadataProvider.getDefaultDatabase();
+            Namespace defaultNamespace = metadataProvider.getDefaultNamespace();
+            dataverse = defaultNamespace.getDataverseName();
+            database = defaultNamespace.getDatabaseName();
         }
         if (searchUdfs && !isBuiltinFunctionDataverse(dataverse)) {
             // attempt to resolve to a user-defined function
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
index c24ddef..8edff28 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
@@ -408,7 +408,8 @@
     @Override
     public Void visit(TypeReferenceExpression t, Integer arg) throws CompilationException {
         if (t.getIdent().first != null && t.getIdent().first != null) {
-            out.print(generateDataverseName(t.getIdent().first));
+            //TODO(DB): include database
+            out.print(generateDataverseName(t.getIdent().first.getDataverseName()));
             out.print('.');
         }
         out.print(normalize(t.getIdent().second.getValue()));
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
index aa875b4..3656e5e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
@@ -336,7 +336,8 @@
     @Override
     public Void visit(TypeReferenceExpression t, Integer arg) throws CompilationException {
         if (t.getIdent().first != null && t.getIdent().first != null) {
-            out.print(t.getIdent().first);
+            //TODO(DB): include database
+            out.print(t.getIdent().first.getDataverseName());
             out.print('.');
         }
         out.print(t.getIdent().second.getValue());
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index 34757a9..0ce09e5 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -33,6 +33,7 @@
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.IParserFactory;
@@ -552,20 +553,23 @@
     private Expression rewriteFunctionOrViewBody(String entityDatabaseName, DataverseName entityDataverseName,
             Object entityDisplayName, Expression bodyExpr, List<VarIdentifier> externalVars,
             boolean allowNonStoredUdfCalls, SourceLocation sourceLoc) throws CompilationException {
-        Dataverse defaultDataverse = metadataProvider.getDefaultDataverse();
-        Dataverse targetDataverse;
-        if (entityDataverseName == null || (entityDatabaseName.equals(defaultDataverse.getDatabaseName())
-                && entityDataverseName.equals(defaultDataverse.getDataverseName()))) {
-            targetDataverse = defaultDataverse;
+        Namespace defaultNamespace = metadataProvider.getDefaultNamespace();
+        Namespace targetNamespace = null;
+        if (entityDataverseName == null || (entityDatabaseName.equals(defaultNamespace.getDatabaseName())
+                && entityDataverseName.equals(defaultNamespace.getDataverseName()))) {
+            targetNamespace = defaultNamespace;
         } else {
             try {
-                targetDataverse = metadataProvider.findDataverse(entityDatabaseName, entityDataverseName);
+                Dataverse dv = metadataProvider.findDataverse(entityDatabaseName, entityDataverseName);
+                if (dv != null) {
+                    targetNamespace = new Namespace(dv.getDatabaseName(), dv.getDataverseName());
+                }
             } catch (AlgebricksException e) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e, sourceLoc, entityDataverseName);
             }
         }
 
-        metadataProvider.setDefaultDataverse(targetDataverse);
+        metadataProvider.setDefaultNamespace(targetNamespace);
         try {
             Query wrappedQuery = ExpressionUtils.createWrappedQuery(bodyExpr, sourceLoc);
             getFunctionAndViewBodyRewriter().rewrite(context, wrappedQuery, allowNonStoredUdfCalls, false,
@@ -575,7 +579,7 @@
             throw new CompilationException(ErrorCode.COMPILATION_BAD_FUNCTION_DEFINITION, e,
                     entityDisplayName.toString(), e.getMessage());
         } finally {
-            metadataProvider.setDefaultDataverse(defaultDataverse);
+            metadataProvider.setDefaultNamespace(defaultNamespace);
         }
     }
 
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
index 9c53a2b..27a63d2 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
@@ -33,6 +33,7 @@
 import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Expression.Kind;
 import org.apache.asterix.lang.common.base.ILangExpression;
@@ -78,8 +79,9 @@
         if (resolveAsVariableReference(varExpr)) {
             return varExpr;
         }
-        DataverseName dataverseName = metadataProvider.getDefaultDataverseName();
-        String databaseName = metadataProvider.getDefaultDatabase();
+        Namespace defaultNamespace = metadataProvider.getDefaultNamespace();
+        DataverseName dataverseName = defaultNamespace.getDataverseName();
+        String databaseName = defaultNamespace.getDatabaseName();
         String datasetName = SqlppVariableUtil.toUserDefinedVariableName(varExpr.getVar().getValue()).getValue();
         CallExpr datasetExpr = resolveAsDataset(databaseName, dataverseName, datasetName, parent, varExpr);
         return datasetExpr != null ? datasetExpr : resolveAsFieldAccessOverContextVar(varExpr);
@@ -260,7 +262,7 @@
 
     private CompilationException createUnresolvableError(DataverseName dataverseName, String datasetName,
             SourceLocation sourceLoc) {
-        DataverseName defaultDataverseName = metadataProvider.getDefaultDataverseName();
+        DataverseName defaultDataverseName = metadataProvider.getDefaultNamespace().getDataverseName();
         if (dataverseName == null && defaultDataverseName == null) {
             return new CompilationException(ErrorCode.NAME_RESOLVE_UNKNOWN_DATASET, sourceLoc, datasetName);
         }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
index 67596a9..62e4d23 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
@@ -21,7 +21,7 @@
 import java.util.Collections;
 
 import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.clause.WhereClause;
 import org.apache.asterix.lang.common.expression.CallExpr;
@@ -54,10 +54,11 @@
     @Override
     public Void visit(DeleteStatement deleteStmt, MetadataProvider metadataProvider) {
         DataverseName dataverseName = deleteStmt.getDataverseName();
-        String databaseName = MetadataUtil.resolveDatabase(null, deleteStmt.getDataverseName());
+        String databaseName = deleteStmt.getDatabaseName();
         if (dataverseName == null) {
-            dataverseName = metadataProvider.getDefaultDataverseName();
-            databaseName = metadataProvider.getDefaultDatabase();
+            Namespace defaultNamespace = metadataProvider.getDefaultNamespace();
+            dataverseName = defaultNamespace.getDataverseName();
+            databaseName = defaultNamespace.getDatabaseName();
         }
         String datasetName = deleteStmt.getDatasetName();
         CallExpr callExpression = FunctionUtil.makeDatasetCallExpr(databaseName, dataverseName, datasetName);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java
index f50a63b..7c1c112 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java
@@ -22,7 +22,7 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.statement.DeleteStatement;
 import org.apache.asterix.lang.common.statement.InsertStatement;
 import org.apache.asterix.lang.common.statement.LoadStatement;
@@ -44,11 +44,11 @@
 
     @Override
     public Void visit(LoadStatement loadStmt, MetadataProvider metadataProvider) throws CompilationException {
-        String database = MetadataUtil.resolveDatabase(null, loadStmt.getDataverseName());
-        Quadruple<DataverseName, String, Boolean, String> dsName = resolveDatasetNameUsingSynonyms(metadataProvider,
-                database, loadStmt.getDataverseName(), loadStmt.getDatasetName(), false, loadStmt.getSourceLocation());
+        Quadruple<DataverseName, String, Boolean, String> dsName =
+                resolveDatasetNameUsingSynonyms(metadataProvider, loadStmt.getDatabaseName(),
+                        loadStmt.getDataverseName(), loadStmt.getDatasetName(), false, loadStmt.getSourceLocation());
         if (dsName != null) {
-            loadStmt.setDataverseName(dsName.getFirst());
+            loadStmt.setNamespace(new Namespace(dsName.getFourth(), dsName.getFirst()));
             loadStmt.setDatasetName(dsName.getSecond());
         }
         return null;
@@ -56,12 +56,11 @@
 
     @Override
     public Void visit(InsertStatement insertStmt, MetadataProvider metadataProvider) throws CompilationException {
-        String database = MetadataUtil.resolveDatabase(null, insertStmt.getDataverseName());
-        Quadruple<DataverseName, String, Boolean, String> dsName =
-                resolveDatasetNameUsingSynonyms(metadataProvider, database, insertStmt.getDataverseName(),
-                        insertStmt.getDatasetName(), false, insertStmt.getSourceLocation());
+        Quadruple<DataverseName, String, Boolean, String> dsName = resolveDatasetNameUsingSynonyms(metadataProvider,
+                insertStmt.getDatabaseName(), insertStmt.getDataverseName(), insertStmt.getDatasetName(), false,
+                insertStmt.getSourceLocation());
         if (dsName != null) {
-            insertStmt.setDataverseName(dsName.getFirst());
+            insertStmt.setNamespace(new Namespace(dsName.getFourth(), dsName.getFirst()));
             insertStmt.setDatasetName(dsName.getSecond());
         }
         return null;
@@ -69,12 +68,11 @@
 
     @Override
     public Void visit(DeleteStatement deleteStmt, MetadataProvider metadataProvider) throws CompilationException {
-        String database = MetadataUtil.resolveDatabase(null, deleteStmt.getDataverseName());
-        Quadruple<DataverseName, String, Boolean, String> dsName =
-                resolveDatasetNameUsingSynonyms(metadataProvider, database, deleteStmt.getDataverseName(),
-                        deleteStmt.getDatasetName(), false, deleteStmt.getSourceLocation());
+        Quadruple<DataverseName, String, Boolean, String> dsName = resolveDatasetNameUsingSynonyms(metadataProvider,
+                deleteStmt.getDatabaseName(), deleteStmt.getDataverseName(), deleteStmt.getDatasetName(), false,
+                deleteStmt.getSourceLocation());
         if (dsName != null) {
-            deleteStmt.setDataverseName(dsName.getFirst());
+            deleteStmt.setNamespace(new Namespace(dsName.getFourth(), dsName.getFirst()));
             deleteStmt.setDatasetName(dsName.getSecond());
         }
         return null;
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index b5dd4c4..0eb09a9 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -283,6 +283,8 @@
 
     private int externalVarCounter;
 
+    private Namespace defaultNamespace;
+
     private String defaultDatabase;
 
     private DataverseName defaultDataverse;
@@ -308,6 +310,7 @@
     }
 
     private static class FunctionName {
+       public Namespace namespace;
        public String database;
        public DataverseName dataverse;
        public String library;
@@ -899,6 +902,17 @@
       }
     }
 
+    private Namespace createNamespace(List<String> parts, int fromIndex, int toIndex, Token startToken)
+      throws SqlppParseException {
+      try {
+        return namespaceResolver.resolve(parts, fromIndex, toIndex);
+      } catch (AsterixException e) {
+        SqlppParseException pe = new SqlppParseException(getSourceLocation(startToken), e.getMessage());
+        pe.initCause(e);
+        throw pe;
+      }
+    }
+
     private Namespace createNamespace(List<String> parts, Token startToken) throws SqlppParseException {
       try {
         return namespaceResolver.resolve(parts);
@@ -999,6 +1013,7 @@
       ns = createNamespace(ident.first, ident.second);
       defaultDataverse = ns.getDataverseName();
       defaultDatabase = ns.getDatabaseName();
+      defaultNamespace = ns;
       DataverseDecl dvDecl = new DataverseDecl(ns);
       return addSourceLocation(dvDecl, startToken);
     }
@@ -1063,7 +1078,7 @@
 
 TypeDecl TypeSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   boolean ifNotExists = false;
   TypeExpression typeExpr = null;
 }
@@ -1157,7 +1172,7 @@
 
 DatasetDecl DatasetSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   boolean ifNotExists = false;
   TypeExpression typeExpr = null;
   TypeExpression metaTypeExpr = null;
@@ -1208,7 +1223,8 @@
           primaryKeyFieldsWithTypes.first, autogenerated, filterField == null? null : filterField.first,
           filterField == null? null : filterField.second, primaryKeyFieldsWithTypes.third);
         final TypeReferenceExpression anyObjectReference = new TypeReferenceExpression(
-          new Pair(MetadataBuiltinEntities.ANY_OBJECT_DATATYPE.getDataverseName(),
+          new Pair(new Namespace(MetadataBuiltinEntities.ANY_OBJECT_DATATYPE.getDatabaseName(),
+            MetadataBuiltinEntities.ANY_OBJECT_DATATYPE.getDataverseName()),
             new Identifier(MetadataBuiltinEntities.ANY_OBJECT_DATATYPE.getDatatypeName())));
         stmt = new DatasetDecl(nameComponents.first, nameComponents.second, anyObjectReference, null, hints,
           DatasetType.INTERNAL, idd, withRecord, ifNotExists, query);
@@ -1234,7 +1250,7 @@
 
 DatasetDecl ExternalDatasetSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   TypeExpression typeExpr = null;
   boolean ifNotExists = false;
   String adapterName = null;
@@ -1350,7 +1366,7 @@
 
 CreateIndexStatement IndexSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   String indexName = null;
   IndexParams indexParams = null;
   CreateIndexStatement.IndexedElement indexedElement = null;
@@ -1532,7 +1548,7 @@
 
 CreateIndexStatement PrimaryIndexSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   String indexName = null;
   boolean ifNotExists = false;
 }
@@ -1640,13 +1656,13 @@
 
 CreateDataverseStatement DataverseSpecification(Token startStmtToken) throws ParseException :
 {
-  DataverseName dvName = null;
+  Namespace ns = null;
   boolean ifNotExists = false;
 }
 {
-  dvName = DataverseName() ifNotExists = IfNotExists()
+  ns = Namespace() ifNotExists = IfNotExists()
   {
-    CreateDataverseStatement stmt = new CreateDataverseStatement(dvName, null, ifNotExists);
+    CreateDataverseStatement stmt = new CreateDataverseStatement(ns, null, ifNotExists);
     return addSourceLocation(stmt, startStmtToken);
   }
 }
@@ -1664,8 +1680,8 @@
 
 CreateAdapterStatement AdapterSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> adapterName = null;
-  Pair<DataverseName,Identifier> libraryName = null;
+  Pair<Namespace,Identifier> adapterName = null;
+  Pair<Namespace,Identifier> libraryName = null;
   List<String> externalIdentifier = null;
   boolean ifNotExists = false;
 }
@@ -1694,7 +1710,7 @@
 
 CreateViewStatement ViewSpecification(Token startStmtToken, boolean orReplace) throws ParseException:
 {
-  Pair<DataverseName, Identifier> nameComponents = null;
+  Pair<Namespace, Identifier> nameComponents = null;
   TypeExpression typeExpr = null;
   boolean ifNotExists = false;
   Token beginPos = null, endPos = null;
@@ -1704,10 +1720,11 @@
   Map<String, String> viewConfig = null;
   Pair<List<Integer>, List<List<String>>> primaryKeyFields = null;
   Pair<List<Integer>, List<List<String>>> foreignKeyFields = null;
-  Pair<DataverseName, Identifier> refNameComponents = null;
+  Pair<Namespace, Identifier> refNameComponents = null;
   List<CreateViewStatement.ForeignKeyDecl> foreignKeyDecls = null;
   DataverseName currentDataverse = defaultDataverse;
   String currentDatabase = defaultDatabase;
+  Namespace currentNamespace = defaultNamespace;
 }
 {
   nameComponents = QualifiedName()
@@ -1750,8 +1767,9 @@
     beginPos = token;
     createNewScope();
     if (nameComponents.first != null) {
-      defaultDataverse = nameComponents.first;
-      defaultDatabase = MetadataUtil.databaseFor(nameComponents.first);
+      defaultNamespace = nameComponents.first;
+      defaultDataverse = nameComponents.first.getDataverseName();
+      defaultDatabase = nameComponents.first.getDatabaseName();
     }
   }
   viewBodyExpr = ViewBody()
@@ -1762,6 +1780,7 @@
     removeCurrentScope();
     defaultDataverse = currentDataverse;
     defaultDatabase = currentDatabase;
+    defaultNamespace = currentNamespace;
     if (typeExpr != null && primaryKeyFields != null) {
       DatasetDeclParametersUtil.adjustInlineTypeDecl(typeExpr, primaryKeyFields.second, primaryKeyFields.first, false);
     }
@@ -1831,19 +1850,21 @@
   TypeExpression returnType = null;
   Token beginPos = null, endPos = null;
   Expression functionBodyExpr = null;
-  Pair<DataverseName,Identifier> libraryName = null;
+  Pair<Namespace,Identifier> libraryName = null;
   List<String> externalIdentifier = null;
   RecordConstructor withOptions = null;
   boolean ifNotExists = false;
   CreateFunctionStatement stmt = null;
   DataverseName currentDataverse = defaultDataverse;
   String currentDatabase = defaultDatabase;
+  Namespace currentNamespace = defaultNamespace;
 }
 {
   fctName = FunctionName()
   {
      defaultDataverse = fctName.dataverse;
      defaultDatabase = fctName.database;
+     defaultNamespace = fctName.namespace;
   }
   paramsWithArity = FunctionParameters()
   {
@@ -1895,6 +1916,7 @@
   {
     defaultDataverse = currentDataverse;
     defaultDatabase = currentDatabase;
+    defaultNamespace = currentNamespace;
     return addSourceLocation(stmt, startStmtToken);
   }
 }
@@ -2012,7 +2034,7 @@
 
 CreateFeedStatement FeedSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   boolean ifNotExists = false;
   String adapterName = null;
   Map<String,String> properties = null;
@@ -2091,7 +2113,7 @@
 CreateFullTextFilterStatement CreateFullTextFilterSpec(Token startStmtToken) throws ParseException:
 {
   CreateFullTextFilterStatement stmt = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   boolean ifNotExists = false;
   RecordConstructor expr = null;
 }
@@ -2114,7 +2136,7 @@
 CreateFullTextConfigStatement CreateFullTextConfigSpec(Token startStmtToken) throws ParseException:
 {
   CreateFullTextConfigStatement stmt = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   boolean ifNotExists = false;
   RecordConstructor expr = null;
 }
@@ -2147,8 +2169,8 @@
 
 CreateSynonymStatement SynonymSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> nameComponents = null;
-  Pair<DataverseName,Identifier> objectNameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> objectNameComponents = null;
   boolean ifNotExists = false;
 }
 {
@@ -2357,7 +2379,7 @@
 
 DropDatasetStatement DropDatasetSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> pairId = null;
+  Pair<Namespace,Identifier> pairId = null;
   boolean ifExists = false;
 }
 {
@@ -2381,7 +2403,7 @@
 
 ViewDropStatement DropViewSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> pairId = null;
+  Pair<Namespace,Identifier> pairId = null;
   boolean ifExists = false;
 }
 {
@@ -2405,7 +2427,7 @@
 
 IndexDropStatement DropIndexSpecification(Token startStmtToken) throws ParseException:
 {
-  Triple<DataverseName,Identifier,Identifier> tripleId = null;
+  Triple<Namespace,Identifier,Identifier> tripleId = null;
   boolean ifExists = false;
 }
 {
@@ -2434,7 +2456,7 @@
 FullTextFilterDropStatement DropFullTextFilterSpec(Token startStmtToken) throws ParseException:
 {
   FullTextFilterDropStatement stmt = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   boolean ifExists = false;
 }
 {
@@ -2448,7 +2470,7 @@
 FullTextConfigDropStatement DropFullTextConfigSpec(Token startStmtToken) throws ParseException:
 {
   FullTextConfigDropStatement stmt = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   boolean ifExists = false;
 }
 {
@@ -2497,7 +2519,7 @@
 
 TypeDropStatement DropTypeSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> pairId = null;
+  Pair<Namespace,Identifier> pairId = null;
   boolean ifExists = false;
 }
 {
@@ -2545,13 +2567,13 @@
 
 DataverseDropStatement DropDataverseSpecification(Token startStmtToken) throws ParseException:
 {
-  DataverseName dvName = null;
+  Namespace ns = null;
   boolean ifExists = false;
 }
 {
-  dvName = DataverseName() ifExists = IfExists()
+  ns = Namespace() ifExists = IfExists()
   {
-    DataverseDropStatement stmt = new DataverseDropStatement(dvName, ifExists);
+    DataverseDropStatement stmt = new DataverseDropStatement(ns, ifExists);
     return addSourceLocation(stmt, startStmtToken);
   }
 }
@@ -2569,7 +2591,7 @@
 
 AdapterDropStatement DropAdapterSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> adapterName = null;
+  Pair<Namespace,Identifier> adapterName = null;
   boolean ifExists = false;
 }
 {
@@ -2617,7 +2639,7 @@
 
 FeedDropStatement DropFeedSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> pairId = null;
+  Pair<Namespace,Identifier> pairId = null;
   boolean ifExists = false;
 }
 {
@@ -2641,7 +2663,7 @@
 
 FeedPolicyDropStatement DropFeedPolicySpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> pairId = null;
+  Pair<Namespace,Identifier> pairId = null;
   boolean ifExists = false;
 }
 {
@@ -2665,7 +2687,7 @@
 
 SynonymDropStatement DropSynonymSpecification(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> pairId = null;
+  Pair<Namespace,Identifier> pairId = null;
   boolean ifExists = false;
 }
 {
@@ -2693,7 +2715,7 @@
 InsertStatement InsertStatement() throws ParseException:
 {
   Token startToken = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   VariableExpr var = null;
   Query query = null;
   Expression returnExpression = null;
@@ -2717,7 +2739,7 @@
 UpsertStatement UpsertStatement() throws ParseException:
 {
   Token startToken = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
   VariableExpr var = null;
   Query query = null;
   Expression returnExpression = null;
@@ -2743,7 +2765,7 @@
   Token startToken = null;
   VariableExpr var = null;
   Expression condition = null;
-  Pair<DataverseName, Identifier> nameComponents;
+  Pair<Namespace, Identifier> nameComponents;
 }
 {
   <DELETE> { startToken = token; }
@@ -2829,18 +2851,18 @@
 CopyStatement CopyStatement() throws ParseException:
 {
   Token startToken = null;
-  DataverseName dataverseName = null;
+  Namespace namespace = null;
   Identifier datasetName = null;
   TypeExpression typeExpr = null;
   boolean alreadySorted = false;
   String adapterName;
   Map<String,String> properties;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
 }
 {
   <COPY> (<INTO>)? { startToken = token; } nameComponents = QualifiedName()
     {
-      dataverseName = nameComponents.first;
+      namespace = nameComponents.first;
       datasetName = nameComponents.second;
     }
   (<AS> typeExpr = DatasetTypeSpecification())?
@@ -2850,7 +2872,7 @@
        edd.setAdapter(adapterName);
        edd.setProperties(properties);
        try {
-         CopyStatement stmt = new CopyStatement(dataverseName, datasetName.getValue(), typeExpr, edd, null);
+         CopyStatement stmt = new CopyStatement(namespace, datasetName.getValue(), typeExpr, edd, null);
          return addSourceLocation(stmt, startToken);
        } catch (CompilationException e){
            throw new SqlppParseException(getSourceLocation(startToken), e.getMessage());
@@ -2861,17 +2883,17 @@
 LoadStatement LoadStatement() throws ParseException:
 {
   Token startToken = null;
-  DataverseName dataverseName = null;
+  Namespace namespace = null;
   Identifier datasetName = null;
   boolean alreadySorted = false;
   String adapterName;
   Map<String,String> properties;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
 }
 {
   <LOAD> { startToken = token; } Dataset() nameComponents = QualifiedName()
     {
-      dataverseName = nameComponents.first;
+      namespace = nameComponents.first;
       datasetName = nameComponents.second;
     }
   <USING> adapterName = AdapterName() properties = Configuration()
@@ -2881,7 +2903,7 @@
     }
   )?
     {
-      LoadStatement stmt = new LoadStatement(dataverseName, datasetName.getValue(), adapterName, properties,
+      LoadStatement stmt = new LoadStatement(namespace, datasetName.getValue(), adapterName, properties,
         alreadySorted);
       return addSourceLocation(stmt, startToken);
     }
@@ -2902,7 +2924,7 @@
 {
   Token startToken = null;
   Statement stmt = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
 }
 {
   <ANALYZE> { startToken = token; } DatasetToken() nameComponents = QualifiedName()
@@ -2915,7 +2937,7 @@
   }
 }
 
-Statement AnalyzeDatasetStatement(Token startToken, DataverseName dvName, Identifier identifier) throws ParseException:
+Statement AnalyzeDatasetStatement(Token startToken, Namespace namespace, Identifier identifier) throws ParseException:
 {
   RecordConstructor withRecord = null;
 }
@@ -2923,7 +2945,7 @@
   ( <WITH> withRecord = RecordConstructor() )?
   {
     try {
-    AnalyzeStatement stmt = new AnalyzeStatement(dvName, identifier.getValue(), withRecord);
+    AnalyzeStatement stmt = new AnalyzeStatement(namespace, identifier.getValue(), withRecord);
     return addSourceLocation(stmt, startToken);
     } catch (CompilationException e) {
        throw new SqlppParseException(getSourceLocation(startToken), e.getMessage());
@@ -2931,13 +2953,13 @@
   }
 }
 
-Statement AnalyzeDatasetDropStatement(Token startToken, DataverseName dvName, Identifier identifier) throws ParseException:
+Statement AnalyzeDatasetDropStatement(Token startToken, Namespace namespace, Identifier identifier) throws ParseException:
 {
 }
 {
   <DROP> <IDENTIFIER> { expectToken(STATISTICS); }
   {
-    AnalyzeDropStatement stmt = new AnalyzeDropStatement(dvName, identifier.getValue());
+    AnalyzeDropStatement stmt = new AnalyzeDropStatement(namespace, identifier.getValue());
     return addSourceLocation(stmt, startToken);
   }
 }
@@ -2945,7 +2967,7 @@
 Statement CompactStatement() throws ParseException:
 {
   Token startToken = null;
-  Pair<DataverseName,Identifier> nameComponents = null;
+  Pair<Namespace,Identifier> nameComponents = null;
 }
 {
   <COMPACT> { startToken = token; } Dataset() nameComponents = QualifiedName()
@@ -2974,7 +2996,7 @@
 
 Statement StartStatement(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> feedNameComponents = null;
+  Pair<Namespace,Identifier> feedNameComponents = null;
   AbstractStatement stmt = null;
 }
 {
@@ -2987,7 +3009,7 @@
 
 AbstractStatement StopStatement(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> feedNameComponents = null;
+  Pair<Namespace,Identifier> feedNameComponents = null;
   AbstractStatement stmt = null;
 }
 {
@@ -3000,8 +3022,8 @@
 
 AbstractStatement DisconnectStatement(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> feedNameComponents = null;
-  Pair<DataverseName,Identifier> datasetNameComponents = null;
+  Pair<Namespace,Identifier> feedNameComponents = null;
+  Pair<Namespace,Identifier> datasetNameComponents = null;
 
   AbstractStatement stmt = null;
 }
@@ -3019,8 +3041,8 @@
 
 AbstractStatement ConnectStatement(Token startStmtToken) throws ParseException:
 {
-  Pair<DataverseName,Identifier> feedNameComponents = null;
-  Pair<DataverseName,Identifier> datasetNameComponents = null;
+  Pair<Namespace,Identifier> feedNameComponents = null;
+  Pair<Namespace,Identifier> datasetNameComponents = null;
 
   Map<String,String> configuration = null;
   List<FunctionSignature> appliedFunctions = new ArrayList<FunctionSignature>();
@@ -3255,7 +3277,7 @@
 
 TypeReferenceExpression TypeReference() throws ParseException:
 {
-  Pair<DataverseName,Identifier> id = null;
+  Pair<Namespace,Identifier> id = null;
 }
 {
   id = QualifiedName()
@@ -3331,11 +3353,12 @@
       result.function = suffix;
     }
     if (ln > 1) {
-      result.dataverse = createDataverseName(list, 0, ln - 1, startToken);
+      result.namespace = createNamespace(list, 0, ln - 1, startToken);
     } else {
-      result.dataverse = defaultDataverse;
+      result.namespace = defaultNamespace;
     }
-    result.database = MetadataUtil.databaseFor(result.dataverse);
+    result.dataverse = result.namespace == null ? null : result.namespace.getDataverseName();
+    result.database = result.namespace == null ? null : result.namespace.getDatabaseName();
 
     if (result.function.equalsIgnoreCase(INT_TYPE_NAME)) {
        result.function = BuiltinType.AINT64.getTypeName();
@@ -3344,15 +3367,15 @@
   }
 }
 
-Pair<DataverseName,Identifier> TypeName() throws ParseException:
+Pair<Namespace,Identifier> TypeName() throws ParseException:
 {
-  Pair<DataverseName,Identifier> name = null;
+  Pair<Namespace,Identifier> name = null;
 }
 {
   name = QualifiedName()
     {
       if (name.first == null) {
-        name.first = defaultDataverse;
+        name.first = defaultNamespace;
       }
       return name;
     }
@@ -3620,6 +3643,19 @@
   }
 }
 
+Namespace Namespace() throws ParseException:
+{
+  Triple<List<String>, Token, Token> ident = null;
+}
+{
+  ident = MultipartIdentifier()
+  {
+    List<String> list = ident.first;
+    Token startToken = ident.second;
+    return createNamespace(list, startToken);
+  }
+}
+
 DataverseName DataverseName() throws ParseException:
 {
   Triple<List<String>, Token, Token> ident = null;
@@ -3633,7 +3669,7 @@
   }
 }
 
-Pair<DataverseName,Identifier> QualifiedName() throws ParseException:
+Pair<Namespace,Identifier> QualifiedName() throws ParseException:
 {
   Triple<List<String>, Token, Token> ident = null;
 }
@@ -3643,13 +3679,13 @@
     List<String> list = ident.first;
     Token startToken = ident.second;
     int len = list.size();
-    DataverseName id1 = len > 1 ? createDataverseName(list, 0, len - 1, startToken) : null;
+    Namespace id1 = len > 1 ? createNamespace(list, 0, len - 1, startToken) : null;
     Identifier id2 = new Identifier(list.get(len - 1));
-    return new Pair<DataverseName,Identifier>(id1, id2);
+    return new Pair<Namespace,Identifier>(id1, id2);
   }
 }
 
-Triple<DataverseName, Identifier, Identifier> DoubleQualifiedName() throws ParseException:
+Triple<Namespace, Identifier, Identifier> DoubleQualifiedName() throws ParseException:
 {
   List<String> list = new ArrayList<String>();
   String item = null;
@@ -3660,10 +3696,10 @@
   (<DOT> item = Identifier() { list.add(item); } )+
   {
     int len = list.size();
-    DataverseName id1 = len > 2 ? createDataverseName(list, 0, len - 2, startToken) : null;
+    Namespace id1 = len > 2 ? createNamespace(list, 0, len - 2, startToken) : null;
     Identifier id2 = new Identifier(list.get(len - 2));
     Identifier id3 = new Identifier(list.get(len - 1));
-    return new Triple<DataverseName,Identifier,Identifier>(id1, id2, id3);
+    return new Triple<Namespace,Identifier,Identifier>(id1, id2, id3);
   }
 }
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
index 8f79f0c..7b33682 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.metadata.MetadataConstants;
 import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.metadata.entities.Database;
 import org.apache.asterix.metadata.entities.Datatype;
 import org.apache.asterix.metadata.entities.Dataverse;
@@ -48,6 +49,10 @@
             new Datatype(MetadataConstants.SYSTEM_DATABASE, MetadataConstants.METADATA_DATAVERSE_NAME,
                     RecordUtil.FULLY_OPEN_RECORD_TYPE.getTypeName(), RecordUtil.FULLY_OPEN_RECORD_TYPE, false);
 
+    public static final Namespace DEFAULT_NAMESPACE =
+            new Namespace(MetadataBuiltinEntities.DEFAULT_DATAVERSE.getDatabaseName(),
+                    MetadataBuiltinEntities.DEFAULT_DATAVERSE.getDataverseName());
+
     private MetadataBuiltinEntities() {
     }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
index f37e79e..a5e7f15 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
@@ -72,7 +72,6 @@
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.api.ICCExtensionManager;
-import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
 import org.apache.asterix.metadata.dataset.hints.DatasetHints.DatasetCardinalityHint;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.DatasourceAdapter;
@@ -180,7 +179,7 @@
     private final LockList locks;
     private final Map<String, Object> config;
 
-    private Dataverse defaultDataverse;
+    private Namespace defaultNamespace;
     private MetadataTransactionContext mdTxnCtx;
     private boolean isWriteTransaction;
     private FileSplit outputFile;
@@ -195,11 +194,19 @@
     private final INamespaceResolver namespaceResolver;
     private IDataFormat dataFormat = FormatUtils.getDefaultFormat();
 
-    public static MetadataProvider create(ICcApplicationContext appCtx, Dataverse defaultDataverse) {
+    public static MetadataProvider createWithDefaultNamespace(ICcApplicationContext appCtx) {
         java.util.function.Function<ICcApplicationContext, IMetadataProvider<?, ?>> factory =
                 ((ICCExtensionManager) appCtx.getExtensionManager()).getMetadataProviderFactory();
         MetadataProvider mp = factory != null ? (MetadataProvider) factory.apply(appCtx) : new MetadataProvider(appCtx);
-        mp.setDefaultDataverse(defaultDataverse);
+        mp.setDefaultNamespace(MetadataConstants.DEFAULT_NAMESPACE);
+        return mp;
+    }
+
+    public static MetadataProvider create(ICcApplicationContext appCtx, Namespace defaultNamespace) {
+        java.util.function.Function<ICcApplicationContext, IMetadataProvider<?, ?>> factory =
+                ((ICCExtensionManager) appCtx.getExtensionManager()).getMetadataProviderFactory();
+        MetadataProvider mp = factory != null ? (MetadataProvider) factory.apply(appCtx) : new MetadataProvider(appCtx);
+        mp.setDefaultNamespace(defaultNamespace);
         return mp;
     }
 
@@ -212,6 +219,7 @@
         dataPartitioningProvider = (DataPartitioningProvider) appCtx.getDataPartitioningProvider();
         locks = new LockList();
         config = new HashMap<>();
+        setDefaultNamespace(MetadataConstants.DEFAULT_NAMESPACE);
     }
 
     @SuppressWarnings("unchecked")
@@ -251,20 +259,12 @@
         this.txnId = txnId;
     }
 
-    public void setDefaultDataverse(Dataverse defaultDataverse) {
-        this.defaultDataverse = defaultDataverse == null ? MetadataBuiltinEntities.DEFAULT_DATAVERSE : defaultDataverse;
+    public void setDefaultNamespace(Namespace namespace) {
+        this.defaultNamespace = namespace == null ? MetadataConstants.DEFAULT_NAMESPACE : namespace;
     }
 
-    public Dataverse getDefaultDataverse() {
-        return defaultDataverse;
-    }
-
-    public String getDefaultDatabase() {
-        return defaultDataverse.getDatabaseName();
-    }
-
-    public DataverseName getDefaultDataverseName() {
-        return defaultDataverse.getDataverseName();
+    public Namespace getDefaultNamespace() {
+        return defaultNamespace;
     }
 
     public void setWriteTransaction(boolean writeTransaction) {
@@ -344,17 +344,16 @@
         return storageProperties;
     }
 
-    private DataverseName getActiveDataverseName(DataverseName dataverseName) {
-        return dataverseName != null ? dataverseName
-                : defaultDataverse != null ? defaultDataverse.getDataverseName() : null;
-    }
-
     /**
      * Retrieve the Output RecordType, as defined by "set output-record-type".
      */
     public ARecordType findOutputRecordType() throws AlgebricksException {
-        String database = defaultDataverse == null ? null : defaultDataverse.getDatabaseName();
-        DataverseName dataverseName = defaultDataverse == null ? null : defaultDataverse.getDataverseName();
+        String database = null;
+        DataverseName dataverseName = null;
+        if (defaultNamespace != null) {
+            database = defaultNamespace.getDatabaseName();
+            dataverseName = defaultNamespace.getDataverseName();
+        }
         return MetadataManagerUtil.findOutputRecordType(mdTxnCtx, database, dataverseName,
                 getProperty("output-record-type"));
     }
@@ -369,11 +368,11 @@
         String dbName = database;
         DataverseName dvName = dataverseName;
         if (dbName == null && dvName == null) {
-            if (defaultDataverse == null) {
+            if (defaultNamespace == null) {
                 return null;
             }
-            dbName = defaultDataverse.getDatabaseName();
-            dvName = defaultDataverse.getDataverseName();
+            dbName = defaultNamespace.getDatabaseName();
+            dvName = defaultNamespace.getDataverseName();
         } else if (dbName == null || dvName == null) {
             return null;
         }
@@ -477,11 +476,11 @@
         String dbName = databaseName;
         DataverseName dvName = dataverseName;
         if (dbName == null && dvName == null) {
-            if (defaultDataverse == null) {
+            if (defaultNamespace == null) {
                 return null;
             }
-            dbName = defaultDataverse.getDatabaseName();
-            dvName = defaultDataverse.getDataverseName();
+            dbName = defaultNamespace.getDatabaseName();
+            dvName = defaultNamespace.getDataverseName();
         } else if (dbName == null || dvName == null) {
             return null;
         }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
index 309decb..8191212 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
@@ -266,7 +266,7 @@
             }
         }
 
-        return new TypeSignature(typeDataverseName, typeName);
+        return new TypeSignature(typeDatabaseName, typeDataverseName, typeName);
     }
 
     private Map<String, String> getResources(ARecord functionRecord, String resourcesFieldName) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java
index e08eff5..a61136f 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java
@@ -22,22 +22,23 @@
 import java.util.Objects;
 
 import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.common.metadata.MetadataUtil;
 
 public class TypeSignature implements Serializable {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
 
+    private final String databaseName;
     private final DataverseName dataverseName;
     private final String name;
 
-    public TypeSignature(DataverseName dataverseName, String name) {
+    public TypeSignature(String databaseName, DataverseName dataverseName, String name) {
+        this.databaseName = databaseName;
         this.dataverseName = dataverseName;
         this.name = name;
     }
 
     public TypeSignature(BuiltinType builtinType) {
-        this(null, builtinType.getTypeName());
+        this(null, null, builtinType.getTypeName());
     }
 
     @Override
@@ -46,8 +47,8 @@
             return false;
         } else {
             TypeSignature f = ((TypeSignature) o);
-            return Objects.equals(getDatabaseName(), f.getDatabaseName())
-                    && Objects.equals(dataverseName, f.getDataverseName()) && name.equals(f.getName());
+            return Objects.equals(databaseName, f.databaseName) && Objects.equals(dataverseName, f.getDataverseName())
+                    && name.equals(f.getName());
         }
     }
 
@@ -58,11 +59,11 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(getDatabaseName(), dataverseName, name);
+        return Objects.hash(databaseName, dataverseName, name);
     }
 
     public String getDatabaseName() {
-        return MetadataUtil.databaseFor(dataverseName);
+        return databaseName;
     }
 
     public DataverseName getDataverseName() {
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java
index 07a7234..f155161 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java
@@ -24,6 +24,7 @@
 
 import org.apache.asterix.common.annotations.TypeDataGen;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.DataverseDecl;
 import org.apache.asterix.lang.common.statement.TypeDecl;
@@ -47,19 +48,27 @@
     }
 
     public void translate() throws AlgebricksException {
-        DataverseName defaultDataverse = getDefaultDataverse();
+        Namespace defaultNs = getDefaultDataverse();
+        DataverseName defaultDv = null;
+        String defaultDb = null;
+        if (defaultNs != null) {
+            defaultDv = defaultNs.getDataverseName();
+            defaultDb = defaultNs.getDatabaseName();
+        }
         types = new HashMap<>();
         typeDataGenMap = new HashMap<>();
 
         for (Statement stmt : statements) {
             if (stmt.getKind() == Statement.Kind.TYPE_DECL) {
                 TypeDecl td = (TypeDecl) stmt;
-                DataverseName typeDataverse = td.getDataverseName() == null ? defaultDataverse : td.getDataverseName();
+                DataverseName typeDataverse =
+                        td.getNamespace() == null ? defaultDv : td.getNamespace().getDataverseName();
+                String typeDatabaseName = td.getNamespace() == null ? defaultDb : td.getNamespace().getDatabaseName();
 
-                TypeTranslator.computeTypes(typeDataverse, td.getIdent().getValue(), td.getTypeDef(), defaultDataverse,
-                        mdTxnCtx, types);
+                TypeTranslator.computeTypes(typeDatabaseName, typeDataverse, td.getIdent().getValue(), td.getTypeDef(),
+                        defaultDb, defaultDv, mdTxnCtx, types);
 
-                TypeSignature signature = new TypeSignature(typeDataverse, td.getIdent().getValue());
+                TypeSignature signature = new TypeSignature(typeDatabaseName, typeDataverse, td.getIdent().getValue());
                 TypeDataGen tdg = td.getDatagenAnnotation();
                 if (tdg != null) {
                     typeDataGenMap.put(signature, tdg);
@@ -68,10 +77,10 @@
         }
     }
 
-    private DataverseName getDefaultDataverse() {
+    private Namespace getDefaultDataverse() {
         for (Statement stmt : statements) {
             if (stmt.getKind() == Statement.Kind.DATAVERSE_DECL) {
-                return ((DataverseDecl) stmt).getDataverseName();
+                return ((DataverseDecl) stmt).getNamespace();
             }
         }
         return null;