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;
