diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
index 0ab5c7b..83c374f 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
@@ -181,7 +181,7 @@
     @Override
     public void dropDataverse(MetadataTransactionContext ctx, DataverseName dataverseName) throws AlgebricksException {
         try {
-            metadataNode.dropDataverse(ctx.getTxnId(), dataverseName);
+            metadataNode.dropDataverse(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -192,7 +192,7 @@
     public boolean isDataverseNotEmpty(MetadataTransactionContext ctx, DataverseName dataverseName)
             throws AlgebricksException {
         try {
-            return metadataNode.isDataverseNotEmpty(ctx.getTxnId(), dataverseName);
+            return metadataNode.isDataverseNotEmpty(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -229,7 +229,7 @@
             return dataverse;
         }
         try {
-            dataverse = metadataNode.getDataverse(ctx.getTxnId(), dataverseName);
+            dataverse = metadataNode.getDataverse(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -247,7 +247,7 @@
         List<Dataset> dataverseDatasets;
         try {
             // Assuming that the transaction can read its own writes on the metadata node.
-            dataverseDatasets = metadataNode.getDataverseDatasets(ctx.getTxnId(), dataverseName);
+            dataverseDatasets = metadataNode.getDataverseDatasets(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -272,7 +272,7 @@
     public void dropDataset(MetadataTransactionContext ctx, DataverseName dataverseName, String datasetName,
             boolean force) throws AlgebricksException {
         try {
-            metadataNode.dropDataset(ctx.getTxnId(), dataverseName, datasetName, force);
+            metadataNode.dropDataset(ctx.getTxnId(), null, dataverseName, datasetName, force);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -304,7 +304,7 @@
             return dataset;
         }
         try {
-            dataset = metadataNode.getDataset(ctx.getTxnId(), dataverseName, datasetName);
+            dataset = metadataNode.getDataset(ctx.getTxnId(), null, dataverseName, datasetName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -325,7 +325,7 @@
         }
         List<Index> datasetIndexes;
         try {
-            datasetIndexes = metadataNode.getDatasetIndexes(ctx.getTxnId(), dataverseName, datasetName);
+            datasetIndexes = metadataNode.getDatasetIndexes(ctx.getTxnId(), null, dataverseName, datasetName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -348,7 +348,7 @@
             String policyName) throws AlgebricksException {
         CompactionPolicy compactionPolicy;
         try {
-            compactionPolicy = metadataNode.getCompactionPolicy(ctx.getTxnId(), dataverse, policyName);
+            compactionPolicy = metadataNode.getCompactionPolicy(ctx.getTxnId(), null, dataverse, policyName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -363,8 +363,8 @@
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
         try {
-            ctx.addDatatype(
-                    metadataNode.getDatatype(ctx.getTxnId(), datatype.getDataverseName(), datatype.getDatatypeName()));
+            ctx.addDatatype(metadataNode.getDatatype(ctx.getTxnId(), datatype.getDatabaseName(),
+                    datatype.getDataverseName(), datatype.getDatatypeName()));
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -374,7 +374,7 @@
     public void dropDatatype(MetadataTransactionContext ctx, DataverseName dataverseName, String datatypeName)
             throws AlgebricksException {
         try {
-            metadataNode.dropDatatype(ctx.getTxnId(), dataverseName, datatypeName);
+            metadataNode.dropDatatype(ctx.getTxnId(), null, dataverseName, datatypeName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -404,7 +404,7 @@
             return datatype;
         }
         try {
-            datatype = metadataNode.getDatatype(ctx.getTxnId(), dataverseName, datatypeName);
+            datatype = metadataNode.getDatatype(ctx.getTxnId(), null, dataverseName, datatypeName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -440,7 +440,7 @@
     public void dropIndex(MetadataTransactionContext ctx, DataverseName dataverseName, String datasetName,
             String indexName) throws AlgebricksException {
         try {
-            metadataNode.dropIndex(ctx.getTxnId(), dataverseName, datasetName, indexName);
+            metadataNode.dropIndex(ctx.getTxnId(), null, dataverseName, datasetName, indexName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -472,7 +472,7 @@
             return index;
         }
         try {
-            index = metadataNode.getIndex(ctx.getTxnId(), dataverseName, datasetName, indexName);
+            index = metadataNode.getIndex(ctx.getTxnId(), null, dataverseName, datasetName, indexName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -624,7 +624,7 @@
     public List<Function> getDataverseFunctions(MetadataTransactionContext ctx, DataverseName dataverseName)
             throws AlgebricksException {
         try {
-            return metadataNode.getDataverseFunctions(ctx.getTxnId(), dataverseName);
+            return metadataNode.getDataverseFunctions(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -645,7 +645,7 @@
     public void dropFullTextFilter(MetadataTransactionContext mdTxnCtx, DataverseName dataverseName, String filterName)
             throws AlgebricksException {
         try {
-            metadataNode.dropFullTextFilter(mdTxnCtx.getTxnId(), dataverseName, filterName);
+            metadataNode.dropFullTextFilter(mdTxnCtx.getTxnId(), null, dataverseName, filterName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -683,7 +683,7 @@
         }
 
         try {
-            filter = metadataNode.getFullTextFilter(ctx.getTxnId(), dataverseName, filterName);
+            filter = metadataNode.getFullTextFilter(ctx.getTxnId(), null, dataverseName, filterName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -741,7 +741,7 @@
         }
 
         try {
-            configMetadataEntity = metadataNode.getFullTextConfig(ctx.getTxnId(), dataverseName, configName);
+            configMetadataEntity = metadataNode.getFullTextConfig(ctx.getTxnId(), null, dataverseName, configName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -758,7 +758,7 @@
     public void dropFullTextConfig(MetadataTransactionContext mdTxnCtx, DataverseName dataverseName, String configName)
             throws AlgebricksException {
         try {
-            metadataNode.dropFullTextConfig(mdTxnCtx.getTxnId(), dataverseName, configName);
+            metadataNode.dropFullTextConfig(mdTxnCtx.getTxnId(), null, dataverseName, configName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -798,7 +798,7 @@
     public void dropAdapter(MetadataTransactionContext ctx, DataverseName dataverseName, String name)
             throws AlgebricksException {
         try {
-            metadataNode.dropAdapter(ctx.getTxnId(), dataverseName, name);
+            metadataNode.dropAdapter(ctx.getTxnId(), null, dataverseName, name);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -810,7 +810,7 @@
             throws AlgebricksException {
         DatasourceAdapter adapter;
         try {
-            adapter = metadataNode.getAdapter(ctx.getTxnId(), dataverseName, name);
+            adapter = metadataNode.getAdapter(ctx.getTxnId(), null, dataverseName, name);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -821,7 +821,7 @@
     public void dropLibrary(MetadataTransactionContext ctx, DataverseName dataverseName, String libraryName)
             throws AlgebricksException {
         try {
-            metadataNode.dropLibrary(ctx.getTxnId(), dataverseName, libraryName);
+            metadataNode.dropLibrary(ctx.getTxnId(), null, dataverseName, libraryName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -835,7 +835,7 @@
         try {
             // Assuming that the transaction can read its own writes on the
             // metadata node.
-            dataverseLibaries = metadataNode.getDataverseLibraries(ctx.getTxnId(), dataverseName);
+            dataverseLibaries = metadataNode.getDataverseLibraries(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -859,7 +859,7 @@
             throws AlgebricksException {
         Library library;
         try {
-            library = metadataNode.getLibrary(ctx.getTxnId(), dataverseName, libraryName);
+            library = metadataNode.getLibrary(ctx.getTxnId(), null, dataverseName, libraryName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -871,7 +871,7 @@
             String policyName) throws AlgebricksException {
         FeedPolicyEntity feedPolicy;
         try {
-            feedPolicy = metadataNode.getFeedPolicy(ctx.getTxnId(), dataverseName, policyName);
+            feedPolicy = metadataNode.getFeedPolicy(ctx.getTxnId(), null, dataverseName, policyName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -883,7 +883,7 @@
             throws AlgebricksException {
         Feed feed;
         try {
-            feed = metadataNode.getFeed(ctx.getTxnId(), dataverseName, feedName);
+            feed = metadataNode.getFeed(ctx.getTxnId(), null, dataverseName, feedName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -894,7 +894,7 @@
     public List<Feed> getFeeds(MetadataTransactionContext ctx, DataverseName dataverseName) throws AlgebricksException {
         List<Feed> feeds;
         try {
-            feeds = metadataNode.getFeeds(ctx.getTxnId(), dataverseName);
+            feeds = metadataNode.getFeeds(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -907,11 +907,11 @@
         Feed feed;
         List<FeedConnection> feedConnections;
         try {
-            feed = metadataNode.getFeed(ctx.getTxnId(), dataverseName, feedName);
-            feedConnections = metadataNode.getFeedConnections(ctx.getTxnId(), dataverseName, feedName);
-            metadataNode.dropFeed(ctx.getTxnId(), dataverseName, feedName);
+            feed = metadataNode.getFeed(ctx.getTxnId(), null, dataverseName, feedName);
+            feedConnections = metadataNode.getFeedConnections(ctx.getTxnId(), null, dataverseName, feedName);
+            metadataNode.dropFeed(ctx.getTxnId(), null, dataverseName, feedName);
             for (FeedConnection feedConnection : feedConnections) {
-                metadataNode.dropFeedConnection(ctx.getTxnId(), dataverseName, feedName,
+                metadataNode.dropFeedConnection(ctx.getTxnId(), null, dataverseName, feedName,
                         feedConnection.getDatasetName());
                 ctx.dropFeedConnection(dataverseName, feedName, feedConnection.getDatasetName());
             }
@@ -946,7 +946,7 @@
     public void dropFeedConnection(MetadataTransactionContext ctx, DataverseName dataverseName, String feedName,
             String datasetName) throws AlgebricksException {
         try {
-            metadataNode.dropFeedConnection(ctx.getTxnId(), dataverseName, feedName, datasetName);
+            metadataNode.dropFeedConnection(ctx.getTxnId(), null, dataverseName, feedName, datasetName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -957,7 +957,7 @@
     public FeedConnection getFeedConnection(MetadataTransactionContext ctx, DataverseName dataverseName,
             String feedName, String datasetName) throws AlgebricksException {
         try {
-            return metadataNode.getFeedConnection(ctx.getTxnId(), dataverseName, feedName, datasetName);
+            return metadataNode.getFeedConnection(ctx.getTxnId(), null, dataverseName, feedName, datasetName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -967,7 +967,7 @@
     public List<FeedConnection> getFeedConections(MetadataTransactionContext ctx, DataverseName dataverseName,
             String feedName) throws AlgebricksException {
         try {
-            return metadataNode.getFeedConnections(ctx.getTxnId(), dataverseName, feedName);
+            return metadataNode.getFeedConnections(ctx.getTxnId(), null, dataverseName, feedName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -978,7 +978,7 @@
             DataverseName dataverseName) throws AlgebricksException {
         List<DatasourceAdapter> dataverseAdapters;
         try {
-            dataverseAdapters = metadataNode.getDataverseAdapters(mdTxnCtx.getTxnId(), dataverseName);
+            dataverseAdapters = metadataNode.getDataverseAdapters(mdTxnCtx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -990,8 +990,8 @@
             throws AlgebricksException {
         FeedPolicyEntity feedPolicy;
         try {
-            feedPolicy = metadataNode.getFeedPolicy(mdTxnCtx.getTxnId(), dataverseName, policyName);
-            metadataNode.dropFeedPolicy(mdTxnCtx.getTxnId(), dataverseName, policyName);
+            feedPolicy = metadataNode.getFeedPolicy(mdTxnCtx.getTxnId(), null, dataverseName, policyName);
+            metadataNode.dropFeedPolicy(mdTxnCtx.getTxnId(), null, dataverseName, policyName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1003,7 +1003,7 @@
             DataverseName dataverseName) throws AlgebricksException {
         List<FeedPolicyEntity> dataverseFeedPolicies;
         try {
-            dataverseFeedPolicies = metadataNode.getDataverseFeedPolicies(mdTxnCtx.getTxnId(), dataverseName);
+            dataverseFeedPolicies = metadataNode.getDataverseFeedPolicies(mdTxnCtx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1034,7 +1034,7 @@
     @Override
     public void dropExternalFile(MetadataTransactionContext ctx, ExternalFile externalFile) throws AlgebricksException {
         try {
-            metadataNode.dropExternalFile(ctx.getTxnId(), externalFile.getDataverseName(),
+            metadataNode.dropExternalFile(ctx.getTxnId(), null, externalFile.getDataverseName(),
                     externalFile.getDatasetName(), externalFile.getFileNumber());
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
@@ -1046,7 +1046,7 @@
             Integer fileNumber) throws AlgebricksException {
         ExternalFile file;
         try {
-            file = metadataNode.getExternalFile(ctx.getTxnId(), dataverseName, datasetName, fileNumber);
+            file = metadataNode.getExternalFile(ctx.getTxnId(), null, dataverseName, datasetName, fileNumber);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1066,7 +1066,7 @@
     public void dropSynonym(MetadataTransactionContext ctx, DataverseName dataverseName, String synonymName)
             throws AlgebricksException {
         try {
-            metadataNode.dropSynonym(ctx.getTxnId(), dataverseName, synonymName);
+            metadataNode.dropSynonym(ctx.getTxnId(), null, dataverseName, synonymName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1076,7 +1076,7 @@
     public Synonym getSynonym(MetadataTransactionContext ctx, DataverseName dataverseName, String synonymName)
             throws AlgebricksException {
         try {
-            return metadataNode.getSynonym(ctx.getTxnId(), dataverseName, synonymName);
+            return metadataNode.getSynonym(ctx.getTxnId(), null, dataverseName, synonymName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1086,7 +1086,7 @@
     public List<Synonym> getDataverseSynonyms(MetadataTransactionContext ctx, DataverseName dataverseName)
             throws AlgebricksException {
         try {
-            return metadataNode.getDataverseSynonyms(ctx.getTxnId(), dataverseName);
+            return metadataNode.getDataverseSynonyms(ctx.getTxnId(), null, dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index c0075ec..519a29d 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -477,16 +477,15 @@
     public void addFullTextFilter(TxnId txnId, FullTextFilterMetadataEntity filterMetadataEntity)
             throws RemoteException, AlgebricksException {
         insertFullTextFilterMetadataEntityToCatalog(txnId, filterMetadataEntity);
-        return;
     }
 
     @Override
-    public FullTextFilterMetadataEntity getFullTextFilter(TxnId txnId, DataverseName dataverseName, String filterName)
-            throws AlgebricksException {
+    public FullTextFilterMetadataEntity getFullTextFilter(TxnId txnId, String database, DataverseName dataverseName,
+            String filterName) throws AlgebricksException {
         try {
             FullTextFilterMetadataEntityTupleTranslator translator =
                     tupleTranslatorProvider.getFullTextFilterTupleTranslator(true);
-            ITupleReference searchKey = createTuple(dataverseName.getCanonicalForm(), filterName);
+            ITupleReference searchKey = createTuple(database, dataverseName, filterName);
             IValueExtractor<FullTextFilterMetadataEntity> valueExtractor =
                     new MetadataEntityValueExtractor<>(translator);
             List<FullTextFilterMetadataEntity> results = new ArrayList<>();
@@ -502,18 +501,18 @@
     }
 
     @Override
-    public void dropFullTextFilter(TxnId txnId, DataverseName dataverseName, String filterName)
+    public void dropFullTextFilter(TxnId txnId, String database, DataverseName dataverseName, String filterName)
             throws AlgebricksException {
-        dropFullTextFilterDescriptor(txnId, dataverseName, filterName, false);
+        dropFullTextFilterDescriptor(txnId, database, dataverseName, filterName, false);
     }
 
-    private void dropFullTextFilterDescriptor(TxnId txnId, DataverseName dataverseName, String filterName,
-            boolean force) throws AlgebricksException {
+    private void dropFullTextFilterDescriptor(TxnId txnId, String database, DataverseName dataverseName,
+            String filterName, boolean force) throws AlgebricksException {
         if (!force) {
-            confirmFullTextFilterCanBeDeleted(txnId, dataverseName, filterName);
+            confirmFullTextFilterCanBeDeleted(txnId, database, dataverseName, filterName);
         }
         try {
-            ITupleReference key = createTuple(dataverseName.getCanonicalForm(), filterName);
+            ITupleReference key = createTuple(database, dataverseName, filterName);
             deleteTupleFromIndex(txnId, mdIndexesProvider.getFullTextFilterEntity().getIndex(), key);
         } catch (HyracksDataException e) {
             throw new AlgebricksException(e);
@@ -555,15 +554,15 @@
     }
 
     @Override
-    public FullTextConfigMetadataEntity getFullTextConfig(TxnId txnId, DataverseName dataverseName, String configName)
-            throws AlgebricksException {
+    public FullTextConfigMetadataEntity getFullTextConfig(TxnId txnId, String database, DataverseName dataverseName,
+            String configName) throws AlgebricksException {
         FullTextConfigMetadataEntityTupleTranslator translator =
                 tupleTranslatorProvider.getFullTextConfigTupleTranslator(true);
 
         ITupleReference searchKey;
         List<FullTextConfigMetadataEntity> results = new ArrayList<>();
         try {
-            searchKey = createTuple(dataverseName.getCanonicalForm(), configName);
+            searchKey = createTuple(database, dataverseName, configName);
             IValueExtractor<FullTextConfigMetadataEntity> valueExtractor =
                     new MetadataEntityValueExtractor<>(translator);
             searchIndex(txnId, mdIndexesProvider.getFullTextConfigEntity().getIndex(), searchKey, valueExtractor,
@@ -576,24 +575,23 @@
             return null;
         }
 
-        FullTextConfigMetadataEntity result = results.get(0);
-        return result;
+        return results.get(0);
     }
 
     @Override
-    public void dropFullTextConfig(TxnId txnId, DataverseName dataverseName, String configName)
+    public void dropFullTextConfig(TxnId txnId, String database, DataverseName dataverseName, String configName)
             throws AlgebricksException {
-        dropFullTextConfigDescriptor(txnId, dataverseName, configName, false);
+        dropFullTextConfigDescriptor(txnId, database, dataverseName, configName, false);
     }
 
-    private void dropFullTextConfigDescriptor(TxnId txnId, DataverseName dataverseName, String configName,
-            boolean force) throws AlgebricksException {
+    private void dropFullTextConfigDescriptor(TxnId txnId, String database, DataverseName dataverseName,
+            String configName, boolean force) throws AlgebricksException {
         if (!force) {
-            confirmFullTextConfigCanBeDeleted(txnId, dataverseName, configName);
+            confirmFullTextConfigCanBeDeleted(txnId, database, dataverseName, configName);
         }
 
         try {
-            ITupleReference key = createTuple(dataverseName.getCanonicalForm(), configName);
+            ITupleReference key = createTuple(database, dataverseName, configName);
             deleteTupleFromIndex(txnId, mdIndexesProvider.getFullTextConfigEntity().getIndex(), key);
         } catch (HyracksDataException e) {
             throw new AlgebricksException(e);
@@ -679,31 +677,33 @@
     }
 
     @Override
-    public void dropDataverse(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    public void dropDataverse(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException {
         try {
-            confirmDataverseCanBeDeleted(txnId, dataverseName);
+            confirmDataverseCanBeDeleted(txnId, database, dataverseName);
 
             // Drop all feeds and connections in this dataverse.
             // Feeds may depend on datatypes and adapters
-            List<Feed> dataverseFeeds = getDataverseFeeds(txnId, dataverseName);
+            List<Feed> dataverseFeeds = getDataverseFeeds(txnId, database, dataverseName);
             for (Feed feed : dataverseFeeds) {
-                List<FeedConnection> feedConnections = getFeedConnections(txnId, dataverseName, feed.getFeedName());
+                List<FeedConnection> feedConnections =
+                        getFeedConnections(txnId, database, dataverseName, feed.getFeedName());
                 for (FeedConnection feedConnection : feedConnections) {
-                    dropFeedConnection(txnId, dataverseName, feed.getFeedName(), feedConnection.getDatasetName());
+                    dropFeedConnection(txnId, database, dataverseName, feed.getFeedName(),
+                            feedConnection.getDatasetName());
                 }
-                dropFeed(txnId, dataverseName, feed.getFeedName());
+                dropFeed(txnId, database, dataverseName, feed.getFeedName());
             }
 
             // Drop all feed ingestion policies in this dataverse.
-            List<FeedPolicyEntity> feedPolicies = getDataverseFeedPolicies(txnId, dataverseName);
+            List<FeedPolicyEntity> feedPolicies = getDataverseFeedPolicies(txnId, database, dataverseName);
             for (FeedPolicyEntity feedPolicy : feedPolicies) {
-                dropFeedPolicy(txnId, dataverseName, feedPolicy.getPolicyName());
+                dropFeedPolicy(txnId, database, dataverseName, feedPolicy.getPolicyName());
             }
 
             // Drop all functions in this dataverse.
             // Functions may depend on libraries, datasets, functions, datatypes, synonyms
             // As a side effect, acquires an S lock on the 'Function' dataset on behalf of txnId.
-            List<Function> dataverseFunctions = getDataverseFunctions(txnId, dataverseName);
+            List<Function> dataverseFunctions = getDataverseFunctions(txnId, database, dataverseName);
             for (Function function : dataverseFunctions) {
                 dropFunction(txnId, function.getSignature(), true);
             }
@@ -711,59 +711,60 @@
             // Drop all adapters in this dataverse.
             // Adapters depend on libraries.
             // As a side effect, acquires an S lock on the 'Adapter' dataset on behalf of txnId.
-            List<DatasourceAdapter> dataverseAdapters = getDataverseAdapters(txnId, dataverseName);
+            List<DatasourceAdapter> dataverseAdapters = getDataverseAdapters(txnId, database, dataverseName);
             for (DatasourceAdapter adapter : dataverseAdapters) {
-                dropAdapter(txnId, dataverseName, adapter.getAdapterIdentifier().getName());
+                dropAdapter(txnId, database, dataverseName, adapter.getAdapterIdentifier().getName());
             }
 
             // Drop all libraries in this dataverse.
-            List<Library> dataverseLibraries = getDataverseLibraries(txnId, dataverseName);
+            List<Library> dataverseLibraries = getDataverseLibraries(txnId, database, dataverseName);
             for (Library lib : dataverseLibraries) {
-                dropLibrary(txnId, lib.getDataverseName(), lib.getName());
+                dropLibrary(txnId, lib.getDatabaseName(), lib.getDataverseName(), lib.getName());
             }
 
             // Drop all synonyms in this dataverse.
-            List<Synonym> dataverseSynonyms = getDataverseSynonyms(txnId, dataverseName);
+            List<Synonym> dataverseSynonyms = getDataverseSynonyms(txnId, database, dataverseName);
             for (Synonym synonym : dataverseSynonyms) {
-                dropSynonym(txnId, dataverseName, synonym.getSynonymName(), true);
+                dropSynonym(txnId, database, dataverseName, synonym.getSynonymName(), true);
             }
 
             // Drop all datasets and indexes in this dataverse.
             // Datasets depend on datatypes
-            List<Dataset> dataverseDatasets = getDataverseDatasets(txnId, dataverseName);
+            List<Dataset> dataverseDatasets = getDataverseDatasets(txnId, database, dataverseName);
             for (Dataset ds : dataverseDatasets) {
-                dropDataset(txnId, dataverseName, ds.getDatasetName(), true);
+                dropDataset(txnId, database, dataverseName, ds.getDatasetName(), true);
             }
 
             // Drop full-text configs in this dataverse.
             // Note that full-text configs are utilized by the index, and we need to always drop index first
             // and then full-text config
             List<FullTextConfigMetadataEntity> configMetadataEntities =
-                    getDataverseFullTextConfigs(txnId, dataverseName);
+                    getDataverseFullTextConfigs(txnId, database, dataverseName);
             for (FullTextConfigMetadataEntity configMetadataEntity : configMetadataEntities) {
-                dropFullTextConfigDescriptor(txnId, dataverseName, configMetadataEntity.getFullTextConfig().getName(),
-                        true);
+                dropFullTextConfigDescriptor(txnId, database, dataverseName,
+                        configMetadataEntity.getFullTextConfig().getName(), true);
             }
 
             // Drop full-text filters in this dataverse.
             // Note that full-text filters are utilized by the full-text configs,
             // and we need to always drop full-text configs first
             // and then full-text filter
-            List<FullTextFilterMetadataEntity> filters = getDataverseFullTextFilters(txnId, dataverseName);
+            List<FullTextFilterMetadataEntity> filters = getDataverseFullTextFilters(txnId, database, dataverseName);
             for (FullTextFilterMetadataEntity filter : filters) {
-                dropFullTextFilterDescriptor(txnId, dataverseName, filter.getFullTextFilter().getName(), true);
+                dropFullTextFilterDescriptor(txnId, database, dataverseName, filter.getFullTextFilter().getName(),
+                        true);
             }
 
             // Drop all types in this dataverse.
             // As a side effect, acquires an S lock on the 'datatype' dataset on behalf of txnId.
-            List<Datatype> dataverseDatatypes = getDataverseDatatypes(txnId, dataverseName);
+            List<Datatype> dataverseDatatypes = getDataverseDatatypes(txnId, database, dataverseName);
             for (Datatype dataverseDatatype : dataverseDatatypes) {
-                forceDropDatatype(txnId, dataverseName, dataverseDatatype.getDatatypeName());
+                forceDropDatatype(txnId, database, dataverseName, dataverseDatatype.getDatatypeName());
             }
 
             // Delete the dataverse entry from the 'dataverse' dataset.
             // As a side effect, acquires an S lock on the 'dataverse' dataset on behalf of txnId.
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             ITupleReference tuple =
                     getTupleToBeDeleted(txnId, mdIndexesProvider.getDataverseEntity().getIndex(), searchKey);
             deleteTupleFromIndex(txnId, mdIndexesProvider.getDataverseEntity().getIndex(), tuple);
@@ -778,35 +779,36 @@
     }
 
     @Override
-    public boolean isDataverseNotEmpty(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
-        return !getDataverseDatatypes(txnId, dataverseName).isEmpty()
-                || !getDataverseDatasets(txnId, dataverseName).isEmpty()
-                || !getDataverseLibraries(txnId, dataverseName).isEmpty()
-                || !getDataverseAdapters(txnId, dataverseName).isEmpty()
-                || !getDataverseFunctions(txnId, dataverseName).isEmpty()
-                || !getDataverseFeedPolicies(txnId, dataverseName).isEmpty()
-                || !getDataverseFeeds(txnId, dataverseName).isEmpty()
-                || !getDataverseSynonyms(txnId, dataverseName).isEmpty()
-                || !getDataverseFullTextConfigs(txnId, dataverseName).isEmpty()
-                || !getDataverseFullTextFilters(txnId, dataverseName).isEmpty();
+    public boolean isDataverseNotEmpty(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
+        return !getDataverseDatatypes(txnId, database, dataverseName).isEmpty()
+                || !getDataverseDatasets(txnId, database, dataverseName).isEmpty()
+                || !getDataverseLibraries(txnId, database, dataverseName).isEmpty()
+                || !getDataverseAdapters(txnId, database, dataverseName).isEmpty()
+                || !getDataverseFunctions(txnId, database, dataverseName).isEmpty()
+                || !getDataverseFeedPolicies(txnId, database, dataverseName).isEmpty()
+                || !getDataverseFeeds(txnId, database, dataverseName).isEmpty()
+                || !getDataverseSynonyms(txnId, database, dataverseName).isEmpty()
+                || !getDataverseFullTextConfigs(txnId, database, dataverseName).isEmpty()
+                || !getDataverseFullTextFilters(txnId, database, dataverseName).isEmpty();
     }
 
     @Override
-    public void dropDataset(TxnId txnId, DataverseName dataverseName, String datasetName, boolean force)
-            throws AlgebricksException {
-        Dataset dataset = getDataset(txnId, dataverseName, datasetName);
+    public void dropDataset(TxnId txnId, String database, DataverseName dataverseName, String datasetName,
+            boolean force) throws AlgebricksException {
+        Dataset dataset = getDataset(txnId, database, dataverseName, datasetName);
         if (dataset == null) {
             throw new AsterixException(org.apache.asterix.common.exceptions.ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE,
                     datasetName, dataverseName);
         }
         if (!force) {
             String datasetTypeDisplayName = DatasetUtil.getDatasetTypeDisplayName(dataset.getDatasetType());
-            confirmDatasetCanBeDeleted(txnId, datasetTypeDisplayName, dataverseName, datasetName);
+            confirmDatasetCanBeDeleted(txnId, datasetTypeDisplayName, database, dataverseName, datasetName);
         }
 
         try {
             // Delete entry from the 'datasets' dataset.
-            ITupleReference searchKey = createTuple(dataverseName, datasetName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datasetName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'dataset' dataset.
             ITupleReference datasetTuple = null;
@@ -816,19 +818,19 @@
                 switch (dataset.getDatasetType()) {
                     case INTERNAL:
                         // Delete entry(s) from the 'indexes' dataset.
-                        List<Index> datasetIndexes = getDatasetIndexes(txnId, dataverseName, datasetName);
+                        List<Index> datasetIndexes = getDatasetIndexes(txnId, database, dataverseName, datasetName);
                         if (datasetIndexes != null) {
                             for (Index index : datasetIndexes) {
-                                dropIndex(txnId, dataverseName, datasetName, index.getIndexName());
+                                dropIndex(txnId, database, dataverseName, datasetName, index.getIndexName());
                             }
                         }
                         break;
                     case EXTERNAL:
                         // Delete entry(s) from the 'indexes' dataset.
-                        datasetIndexes = getDatasetIndexes(txnId, dataverseName, datasetName);
+                        datasetIndexes = getDatasetIndexes(txnId, database, dataverseName, datasetName);
                         if (datasetIndexes != null) {
                             for (Index index : datasetIndexes) {
-                                dropIndex(txnId, dataverseName, datasetName, index.getIndexName());
+                                dropIndex(txnId, database, dataverseName, datasetName, index.getIndexName());
                             }
                         }
                         // Delete External Files
@@ -838,7 +840,8 @@
                         if (datasetFiles != null && !datasetFiles.isEmpty()) {
                             // Drop all external files in this dataset.
                             for (ExternalFile file : datasetFiles) {
-                                dropExternalFile(txnId, dataverseName, file.getDatasetName(), file.getFileNumber());
+                                dropExternalFile(txnId, database, dataverseName, file.getDatasetName(),
+                                        file.getFileNumber());
                             }
                         }
                         break;
@@ -860,10 +863,10 @@
     }
 
     @Override
-    public void dropIndex(TxnId txnId, DataverseName dataverseName, String datasetName, String indexName)
-            throws AlgebricksException {
+    public void dropIndex(TxnId txnId, String database, DataverseName dataverseName, String datasetName,
+            String indexName) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, datasetName, indexName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datasetName, indexName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'index' dataset.
             ITupleReference tuple =
@@ -909,29 +912,31 @@
     }
 
     @Override
-    public void dropDatatype(TxnId txnId, DataverseName dataverseName, String datatypeName) throws AlgebricksException {
-        dropDatatype(txnId, dataverseName, datatypeName, false);
+    public void dropDatatype(TxnId txnId, String database, DataverseName dataverseName, String datatypeName)
+            throws AlgebricksException {
+        dropDatatype(txnId, database, dataverseName, datatypeName, false);
     }
 
-    private void dropDatatype(TxnId txnId, DataverseName dataverseName, String datatypeName, boolean force)
-            throws AlgebricksException {
+    private void dropDatatype(TxnId txnId, String database, DataverseName dataverseName, String datatypeName,
+            boolean force) throws AlgebricksException {
         if (!force) {
-            confirmDatatypeIsUnused(txnId, dataverseName, datatypeName);
+            confirmDatatypeIsUnused(txnId, database, dataverseName, datatypeName);
         }
         // Delete the datatype entry, including all it's nested anonymous types.
         try {
-            ITupleReference searchKey = createTuple(dataverseName, datatypeName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datatypeName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'datatype' dataset.
             ITupleReference tuple =
                     getTupleToBeDeleted(txnId, mdIndexesProvider.getDatatypeEntity().getIndex(), searchKey);
             // Get nested types
-            List<String> nestedTypes = getNestedComplexDatatypeNamesForThisDatatype(txnId, dataverseName, datatypeName);
+            List<String> nestedTypes =
+                    getNestedComplexDatatypeNamesForThisDatatype(txnId, database, dataverseName, datatypeName);
             deleteTupleFromIndex(txnId, mdIndexesProvider.getDatatypeEntity().getIndex(), tuple);
             for (String nestedType : nestedTypes) {
-                Datatype dt = getDatatype(txnId, dataverseName, nestedType);
+                Datatype dt = getDatatype(txnId, database, dataverseName, nestedType);
                 if (dt != null && dt.getIsAnonymous()) {
-                    dropDatatype(txnId, dataverseName, dt.getDatatypeName());
+                    dropDatatype(txnId, database, dataverseName, dt.getDatatypeName());
                 }
             }
         } catch (HyracksDataException e) {
@@ -944,10 +949,10 @@
         }
     }
 
-    private void forceDropDatatype(TxnId txnId, DataverseName dataverseName, String datatypeName)
+    private void forceDropDatatype(TxnId txnId, String database, DataverseName dataverseName, String datatypeName)
             throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, datatypeName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datatypeName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'datatype' dataset.
             ITupleReference tuple =
@@ -982,9 +987,10 @@
     }
 
     @Override
-    public Dataverse getDataverse(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    public Dataverse getDataverse(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             DataverseTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDataverseTupleTranslator(false);
             IValueExtractor<Dataverse> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Dataverse> results = new ArrayList<>();
@@ -999,9 +1005,10 @@
     }
 
     @Override
-    public List<Dataset> getDataverseDatasets(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    public List<Dataset> getDataverseDatasets(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(false);
             IValueExtractor<Dataset> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Dataset> results = new ArrayList<>();
@@ -1013,9 +1020,10 @@
     }
 
     @Override
-    public List<Feed> getDataverseFeeds(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    public List<Feed> getDataverseFeeds(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(false);
             IValueExtractor<Feed> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Feed> results = new ArrayList<>();
@@ -1027,9 +1035,10 @@
     }
 
     @Override
-    public List<Library> getDataverseLibraries(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    public List<Library> getDataverseLibraries(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             LibraryTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getLibraryTupleTranslator(false);
             IValueExtractor<Library> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Library> results = new ArrayList<>();
@@ -1040,9 +1049,10 @@
         }
     }
 
-    private List<Datatype> getDataverseDatatypes(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    private List<Datatype> getDataverseDatatypes(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             DatatypeTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getDataTypeTupleTranslator(txnId, this, false);
             IValueExtractor<Datatype> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -1054,9 +1064,9 @@
         }
     }
 
-    private List<FullTextConfigMetadataEntity> getDataverseFullTextConfigs(TxnId txnId, DataverseName dataverseName)
-            throws AlgebricksException {
-        ITupleReference searchKey = createTuple(dataverseName);
+    private List<FullTextConfigMetadataEntity> getDataverseFullTextConfigs(TxnId txnId, String database,
+            DataverseName dataverseName) throws AlgebricksException {
+        ITupleReference searchKey = createTuple(database, dataverseName);
         FullTextConfigMetadataEntityTupleTranslator tupleReaderWriter =
                 tupleTranslatorProvider.getFullTextConfigTupleTranslator(true);
         IValueExtractor<FullTextConfigMetadataEntity> valueExtractor =
@@ -1071,9 +1081,9 @@
         return results;
     }
 
-    private List<FullTextFilterMetadataEntity> getDataverseFullTextFilters(TxnId txnId, DataverseName dataverseName)
-            throws AlgebricksException {
-        ITupleReference searchKey = createTuple(dataverseName);
+    private List<FullTextFilterMetadataEntity> getDataverseFullTextFilters(TxnId txnId, String database,
+            DataverseName dataverseName) throws AlgebricksException {
+        ITupleReference searchKey = createTuple(database, dataverseName);
         FullTextFilterMetadataEntityTupleTranslator tupleReaderWriter =
                 tupleTranslatorProvider.getFullTextFilterTupleTranslator(true);
         IValueExtractor<FullTextFilterMetadataEntity> valueExtractor =
@@ -1089,9 +1099,10 @@
     }
 
     @Override
-    public Dataset getDataset(TxnId txnId, DataverseName dataverseName, String datasetName) throws AlgebricksException {
+    public Dataset getDataset(TxnId txnId, String database, DataverseName dataverseName, String datasetName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, datasetName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datasetName);
             DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(false);
             List<Dataset> results = new ArrayList<>();
             IValueExtractor<Dataset> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -1161,7 +1172,8 @@
         }
     }
 
-    private void confirmDataverseCanBeDeleted(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    private void confirmDataverseCanBeDeleted(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
         // If a dataset from a DIFFERENT dataverse
         // uses a type from this dataverse
         // throw an error
@@ -1260,28 +1272,28 @@
     }
 
     private void confirmFunctionIsUnusedByViews(TxnId txnId, FunctionSignature signature) throws AlgebricksException {
-        confirmObjectIsUnusedByViews(txnId, "function", DependencyKind.FUNCTION, signature.getDataverseName(),
+        confirmObjectIsUnusedByViews(txnId, "function", DependencyKind.FUNCTION, null, signature.getDataverseName(),
                 signature.getName(), Integer.toString(signature.getArity()));
     }
 
     private void confirmFunctionIsUnusedByFunctions(TxnId txnId, FunctionSignature signature)
             throws AlgebricksException {
-        confirmObjectIsUnusedByFunctions(txnId, "function", DependencyKind.FUNCTION, signature.getDataverseName(),
+        confirmObjectIsUnusedByFunctions(txnId, "function", DependencyKind.FUNCTION, null, signature.getDataverseName(),
                 signature.getName(), Integer.toString(signature.getArity()));
     }
 
     private void confirmObjectIsUnusedByFunctions(TxnId txnId, String objectKindDisplayName,
-            DependencyKind dependencyKind, DataverseName dataverseName, String objectName, String objectArg)
-            throws AlgebricksException {
+            DependencyKind dependencyKind, String database, DataverseName dataverseName, String objectName,
+            String objectArg) throws AlgebricksException {
         // If any function uses this object, throw an error
         List<Function> functions = getAllFunctions(txnId);
-        confirmObjectIsUnusedByFunctionsImpl(functions, objectKindDisplayName, dependencyKind, dataverseName,
+        confirmObjectIsUnusedByFunctionsImpl(functions, objectKindDisplayName, dependencyKind, database, dataverseName,
                 objectName, objectArg);
     }
 
     private void confirmObjectIsUnusedByFunctionsImpl(List<Function> allFunctions, String objectKindDisplayName,
-            DependencyKind dependencyKind, DataverseName dataverseName, String objectName, String objectArg)
-            throws AlgebricksException {
+            DependencyKind dependencyKind, String database, DataverseName dataverseName, String objectName,
+            String objectArg) throws AlgebricksException {
         int functionDependencyIdx = Function.DEPENDENCIES_SCHEMA.indexOf(dependencyKind);
         if (functionDependencyIdx < 0) {
             throw new AlgebricksException(ErrorCode.ILLEGAL_STATE);
@@ -1307,16 +1319,17 @@
     }
 
     private void confirmObjectIsUnusedByViews(TxnId txnId, String objectKindDisplayName, DependencyKind dependencyKind,
-            DataverseName dataverseName, String objectName, String objectArg) throws AlgebricksException {
+            String database, DataverseName dataverseName, String objectName, String objectArg)
+            throws AlgebricksException {
         // If any function uses this object, throw an error
         List<Dataset> datasets = getAllDatasets(txnId);
-        confirmObjectIsUnusedByViewsImpl(datasets, objectKindDisplayName, dependencyKind, dataverseName, objectName,
-                objectArg);
+        confirmObjectIsUnusedByViewsImpl(datasets, objectKindDisplayName, dependencyKind, database, dataverseName,
+                objectName, objectArg);
     }
 
     private void confirmObjectIsUnusedByViewsImpl(List<Dataset> allDatasets, String objectKindDisplayName,
-            DependencyKind dependencyKind, DataverseName dataverseName, String objectName, String objectArg)
-            throws AlgebricksException {
+            DependencyKind dependencyKind, String database, DataverseName dataverseName, String objectName,
+            String objectArg) throws AlgebricksException {
         int viewDependencyIdx = ViewDetails.DEPENDENCIES_SCHEMA.indexOf(dependencyKind);
         if (viewDependencyIdx < 0) {
             throw new AlgebricksException(ErrorCode.ILLEGAL_STATE);
@@ -1344,8 +1357,8 @@
         }
     }
 
-    private void confirmFullTextConfigCanBeDeleted(TxnId txnId, DataverseName dataverseNameFullTextConfig,
-            String configName) throws AlgebricksException {
+    private void confirmFullTextConfigCanBeDeleted(TxnId txnId, String database,
+            DataverseName dataverseNameFullTextConfig, String configName) throws AlgebricksException {
         if (Strings.isNullOrEmpty(configName)) {
             throw new MetadataException(
                     org.apache.asterix.common.exceptions.ErrorCode.FULL_TEXT_DEFAULT_CONFIG_CANNOT_BE_DELETED_OR_CREATED);
@@ -1354,7 +1367,8 @@
         // If any index uses this full-text config, throw an error
         List<Dataset> datasets = getAllDatasets(txnId);
         for (Dataset dataset : datasets) {
-            List<Index> indexes = getDatasetIndexes(txnId, dataset.getDataverseName(), dataset.getDatasetName());
+            List<Index> indexes = getDatasetIndexes(txnId, dataset.getDatabaseName(), dataset.getDataverseName(),
+                    dataset.getDatasetName());
             for (Index index : indexes) {
                 // ToDo: to support index to access full-text config in another dataverse,
                 //   we may need to include the dataverse of the full-text config in the index.getFullTextConfigDataverse()
@@ -1376,32 +1390,32 @@
         }
     }
 
-    private void confirmDatasetCanBeDeleted(TxnId txnId, String datasetTypeDisplayName, DataverseName dataverseName,
-            String datasetName) throws AlgebricksException {
-        confirmDatasetIsUnusedByFunctions(txnId, datasetTypeDisplayName, dataverseName, datasetName);
-        confirmDatasetIsUnusedByViews(txnId, datasetTypeDisplayName, dataverseName, datasetName);
+    private void confirmDatasetCanBeDeleted(TxnId txnId, String datasetTypeDisplayName, String database,
+            DataverseName dataverseName, String datasetName) throws AlgebricksException {
+        confirmDatasetIsUnusedByFunctions(txnId, datasetTypeDisplayName, database, dataverseName, datasetName);
+        confirmDatasetIsUnusedByViews(txnId, datasetTypeDisplayName, database, dataverseName, datasetName);
     }
 
-    private void confirmDatasetIsUnusedByFunctions(TxnId txnId, String datasetKindDisplayName,
+    private void confirmDatasetIsUnusedByFunctions(TxnId txnId, String datasetKindDisplayName, String database,
             DataverseName dataverseName, String datasetName) throws AlgebricksException {
-        confirmObjectIsUnusedByFunctions(txnId, datasetKindDisplayName, DependencyKind.DATASET, dataverseName,
+        confirmObjectIsUnusedByFunctions(txnId, datasetKindDisplayName, DependencyKind.DATASET, database, dataverseName,
                 datasetName, null);
     }
 
-    private void confirmDatasetIsUnusedByViews(TxnId txnId, String datasetKindDisplayName, DataverseName dataverseName,
-            String datasetName) throws AlgebricksException {
-        confirmObjectIsUnusedByViews(txnId, datasetKindDisplayName, DependencyKind.DATASET, dataverseName, datasetName,
-                null);
+    private void confirmDatasetIsUnusedByViews(TxnId txnId, String datasetKindDisplayName, String database,
+            DataverseName dataverseName, String datasetName) throws AlgebricksException {
+        confirmObjectIsUnusedByViews(txnId, datasetKindDisplayName, DependencyKind.DATASET, database, dataverseName,
+                datasetName, null);
     }
 
-    private void confirmLibraryCanBeDeleted(TxnId txnId, DataverseName dataverseName, String libraryName)
-            throws AlgebricksException {
-        confirmLibraryIsUnusedByFunctions(txnId, dataverseName, libraryName);
-        confirmLibraryIsUnusedByAdapters(txnId, dataverseName, libraryName);
+    private void confirmLibraryCanBeDeleted(TxnId txnId, String database, DataverseName dataverseName,
+            String libraryName) throws AlgebricksException {
+        confirmLibraryIsUnusedByFunctions(txnId, database, dataverseName, libraryName);
+        confirmLibraryIsUnusedByAdapters(txnId, database, dataverseName, libraryName);
     }
 
-    private void confirmLibraryIsUnusedByFunctions(TxnId txnId, DataverseName dataverseName, String libraryName)
-            throws AlgebricksException {
+    private void confirmLibraryIsUnusedByFunctions(TxnId txnId, String database, DataverseName dataverseName,
+            String libraryName) throws AlgebricksException {
         List<Function> functions = getAllFunctions(txnId);
         for (Function function : functions) {
             if (libraryName.equals(function.getLibraryName())
@@ -1414,8 +1428,8 @@
         }
     }
 
-    private void confirmLibraryIsUnusedByAdapters(TxnId txnId, DataverseName dataverseName, String libraryName)
-            throws AlgebricksException {
+    private void confirmLibraryIsUnusedByAdapters(TxnId txnId, String database, DataverseName dataverseName,
+            String libraryName) throws AlgebricksException {
         List<DatasourceAdapter> adapters = getAllAdapters(txnId);
         for (DatasourceAdapter adapter : adapters) {
             if (libraryName.equals(adapter.getLibraryName())
@@ -1429,15 +1443,15 @@
         }
     }
 
-    private void confirmDatatypeIsUnused(TxnId txnId, DataverseName dataverseName, String datatypeName)
+    private void confirmDatatypeIsUnused(TxnId txnId, String database, DataverseName dataverseName, String datatypeName)
             throws AlgebricksException {
-        confirmDatatypeIsUnusedByDatatypes(txnId, dataverseName, datatypeName);
-        confirmDatatypeIsUnusedByDatasets(txnId, dataverseName, datatypeName);
-        confirmDatatypeIsUnusedByFunctions(txnId, dataverseName, datatypeName);
+        confirmDatatypeIsUnusedByDatatypes(txnId, database, dataverseName, datatypeName);
+        confirmDatatypeIsUnusedByDatasets(txnId, database, dataverseName, datatypeName);
+        confirmDatatypeIsUnusedByFunctions(txnId, database, dataverseName, datatypeName);
     }
 
-    private void confirmDatatypeIsUnusedByDatasets(TxnId txnId, DataverseName dataverseName, String datatypeName)
-            throws AlgebricksException {
+    private void confirmDatatypeIsUnusedByDatasets(TxnId txnId, String database, DataverseName dataverseName,
+            String datatypeName) throws AlgebricksException {
         // If any dataset uses this type, throw an error
         List<Dataset> datasets = getAllDatasets(txnId);
         for (Dataset dataset : datasets) {
@@ -1454,15 +1468,16 @@
 
         // additionally, if a view uses this type, throw an error
         // Note: for future use. currently views don't have any type dependencies
-        confirmObjectIsUnusedByViewsImpl(datasets, null, DependencyKind.TYPE, dataverseName, datatypeName, null);
+        confirmObjectIsUnusedByViewsImpl(datasets, null, DependencyKind.TYPE, database, dataverseName, datatypeName,
+                null);
     }
 
-    private void confirmDatatypeIsUnusedByDatatypes(TxnId txnId, DataverseName dataverseName, String datatypeName)
-            throws AlgebricksException {
+    private void confirmDatatypeIsUnusedByDatatypes(TxnId txnId, String database, DataverseName dataverseName,
+            String datatypeName) throws AlgebricksException {
         // If any datatype uses this type, throw an error
         // TODO: Currently this loads all types into memory. This will need to be fixed
         // for large numbers of types
-        Datatype dataTypeToBeDropped = getDatatype(txnId, dataverseName, datatypeName);
+        Datatype dataTypeToBeDropped = getDatatype(txnId, database, dataverseName, datatypeName);
         assert dataTypeToBeDropped != null;
         IAType typeToBeDropped = dataTypeToBeDropped.getDatatype();
         List<Datatype> datatypes = getAllDatatypes(txnId);
@@ -1482,14 +1497,16 @@
         }
     }
 
-    private void confirmDatatypeIsUnusedByFunctions(TxnId txnId, DataverseName dataverseName, String dataTypeName)
-            throws AlgebricksException {
-        confirmObjectIsUnusedByFunctions(txnId, "datatype", DependencyKind.TYPE, dataverseName, dataTypeName, null);
+    private void confirmDatatypeIsUnusedByFunctions(TxnId txnId, String database, DataverseName dataverseName,
+            String dataTypeName) throws AlgebricksException {
+        confirmObjectIsUnusedByFunctions(txnId, "datatype", DependencyKind.TYPE, database, dataverseName, dataTypeName,
+                null);
     }
 
-    private void confirmFullTextFilterCanBeDeleted(TxnId txnId, DataverseName dataverseName, String fullTextFilterName)
-            throws AlgebricksException {
-        List<FullTextConfigMetadataEntity> configMetadataEntities = getDataverseFullTextConfigs(txnId, dataverseName);
+    private void confirmFullTextFilterCanBeDeleted(TxnId txnId, String database, DataverseName dataverseName,
+            String fullTextFilterName) throws AlgebricksException {
+        List<FullTextConfigMetadataEntity> configMetadataEntities =
+                getDataverseFullTextConfigs(txnId, database, dataverseName);
         for (FullTextConfigMetadataEntity configMetadataEntity : configMetadataEntities) {
             FullTextConfigDescriptor config = configMetadataEntity.getFullTextConfig();
             for (String filterName : config.getFilterNames()) {
@@ -1503,10 +1520,10 @@
         }
     }
 
-    private List<String> getNestedComplexDatatypeNamesForThisDatatype(TxnId txnId, DataverseName dataverseName,
-            String datatypeName) throws AlgebricksException {
+    private List<String> getNestedComplexDatatypeNamesForThisDatatype(TxnId txnId, String database,
+            DataverseName dataverseName, String datatypeName) throws AlgebricksException {
         // Return all field types that aren't builtin types
-        Datatype parentType = getDatatype(txnId, dataverseName, datatypeName);
+        Datatype parentType = getDatatype(txnId, database, dataverseName, datatypeName);
 
         List<IAType> subTypes = null;
         if (parentType.getDatatype().getTypeTag() == ATypeTag.OBJECT) {
@@ -1547,10 +1564,10 @@
     }
 
     @Override
-    public Index getIndex(TxnId txnId, DataverseName dataverseName, String datasetName, String indexName)
-            throws AlgebricksException {
+    public Index getIndex(TxnId txnId, String database, DataverseName dataverseName, String datasetName,
+            String indexName) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, datasetName, indexName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datasetName, indexName);
             IndexTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getIndexTupleTranslator(txnId, this, false);
             IValueExtractor<Index> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -1566,10 +1583,10 @@
     }
 
     @Override
-    public List<Index> getDatasetIndexes(TxnId txnId, DataverseName dataverseName, String datasetName)
+    public List<Index> getDatasetIndexes(TxnId txnId, String database, DataverseName dataverseName, String datasetName)
             throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, datasetName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datasetName);
             IndexTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getIndexTupleTranslator(txnId, this, false);
             IValueExtractor<Index> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -1582,10 +1599,10 @@
     }
 
     @Override
-    public Datatype getDatatype(TxnId txnId, DataverseName dataverseName, String datatypeName)
+    public Datatype getDatatype(TxnId txnId, String database, DataverseName dataverseName, String datatypeName)
             throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, datatypeName);
+            ITupleReference searchKey = createTuple(database, dataverseName, datatypeName);
             DatatypeTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getDataTypeTupleTranslator(txnId, this, false);
             IValueExtractor<Datatype> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -1619,14 +1636,15 @@
 
     @Override
     public Function getFunction(TxnId txnId, FunctionSignature functionSignature) throws AlgebricksException {
-        List<Function> functions = getFunctionsImpl(txnId, createTuple(functionSignature.getDataverseName(),
+        List<Function> functions = getFunctionsImpl(txnId, createTuple(null, functionSignature.getDataverseName(),
                 functionSignature.getName(), Integer.toString(functionSignature.getArity())));
         return functions.isEmpty() ? null : functions.get(0);
     }
 
     @Override
-    public List<Function> getDataverseFunctions(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
-        return getFunctionsImpl(txnId, createTuple(dataverseName));
+    public List<Function> getDataverseFunctions(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
+        return getFunctionsImpl(txnId, createTuple(database, dataverseName));
     }
 
     private List<Function> getFunctionsImpl(TxnId txnId, ITupleReference searchKey) throws AlgebricksException {
@@ -1654,8 +1672,8 @@
         }
         try {
             // Delete entry from the 'function' dataset.
-            ITupleReference searchKey = createTuple(functionSignature.getDataverseName(), functionSignature.getName(),
-                    Integer.toString(functionSignature.getArity()));
+            ITupleReference searchKey = createTuple(null, functionSignature.getDataverseName(),
+                    functionSignature.getName(), Integer.toString(functionSignature.getArity()));
             // Searches the index for the tuple to be deleted. Acquires an S lock on the 'function' dataset.
             ITupleReference functionTuple =
                     getTupleToBeDeleted(txnId, mdIndexesProvider.getFunctionEntity().getIndex(), searchKey);
@@ -1868,21 +1886,52 @@
     }
 
     public static ITupleReference createTuple(DataverseName dataverseName, String... rest) {
+        //TODO(DB): remove this method after
         return createTuple(dataverseName.getCanonicalForm(), rest);
     }
 
+    private static ITupleReference createTuple(String databaseName, DataverseName dataverseName, String... rest) {
+        //TODO(DB): pass mdIndexesProvider and use it instead of checking for null
+        if (databaseName == null) {
+            return createTuple(dataverseName.getCanonicalForm(), rest);
+        } else {
+            return createDatabaseTuple(databaseName, dataverseName, rest);
+        }
+    }
+
+    private static ITupleReference createDatabaseTuple(String databaseName, DataverseName dataverseName,
+            String... rest) {
+        try {
+            ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(2 + rest.length);
+            ISerializerDeserializer<AString> stringSerde =
+                    SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
+            AMutableString aString = new AMutableString(databaseName);
+            tupleBuilder.addField(stringSerde, aString);
+            aString.setValue(dataverseName.getCanonicalForm());
+            tupleBuilder.addField(stringSerde, aString);
+            for (String s : rest) {
+                aString.setValue(s);
+                tupleBuilder.addField(stringSerde, aString);
+            }
+            ArrayTupleReference tuple = new ArrayTupleReference();
+            tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
+            return tuple;
+        } catch (HyracksDataException e) {
+            // This should never happen
+            throw new IllegalStateException("Failed to create search tuple", e);
+        }
+    }
+
     public static ITupleReference createTuple(String first, String... rest) {
         try {
             ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(1 + rest.length);
             ISerializerDeserializer<AString> stringSerde =
                     SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
             AMutableString aString = new AMutableString(first);
-            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
-            tupleBuilder.addFieldEndOffset();
+            tupleBuilder.addField(stringSerde, aString);
             for (String s : rest) {
                 aString.setValue(s);
-                stringSerde.serialize(aString, tupleBuilder.getDataOutput());
-                tupleBuilder.addFieldEndOffset();
+                tupleBuilder.addField(stringSerde, aString);
             }
             ArrayTupleReference tuple = new ArrayTupleReference();
             tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
@@ -1919,10 +1968,11 @@
     }
 
     @Override
-    public void dropAdapter(TxnId txnId, DataverseName dataverseName, String adapterName) throws AlgebricksException {
+    public void dropAdapter(TxnId txnId, String database, DataverseName dataverseName, String adapterName)
+            throws AlgebricksException {
         try {
             // Delete entry from the 'Adapter' dataset.
-            ITupleReference searchKey = createTuple(dataverseName, adapterName);
+            ITupleReference searchKey = createTuple(database, dataverseName, adapterName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'Adapter' dataset.
             ITupleReference datasetTuple =
@@ -1939,10 +1989,10 @@
     }
 
     @Override
-    public DatasourceAdapter getAdapter(TxnId txnId, DataverseName dataverseName, String adapterName)
+    public DatasourceAdapter getAdapter(TxnId txnId, String database, DataverseName dataverseName, String adapterName)
             throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, adapterName);
+            ITupleReference searchKey = createTuple(database, dataverseName, adapterName);
             DatasourceAdapterTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getAdapterTupleTranslator(false);
             List<DatasourceAdapter> results = new ArrayList<>();
@@ -1978,10 +2028,10 @@
     }
 
     @Override
-    public CompactionPolicy getCompactionPolicy(TxnId txnId, DataverseName dataverseName, String policyName)
-            throws AlgebricksException {
+    public CompactionPolicy getCompactionPolicy(TxnId txnId, String database, DataverseName dataverseName,
+            String policyName) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, policyName);
+            ITupleReference searchKey = createTuple(database, dataverseName, policyName);
             CompactionPolicyTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getCompactionPolicyTupleTranslator(false);
             List<CompactionPolicy> results = new ArrayList<>();
@@ -1998,10 +2048,10 @@
     }
 
     @Override
-    public List<DatasourceAdapter> getDataverseAdapters(TxnId txnId, DataverseName dataverseName)
+    public List<DatasourceAdapter> getDataverseAdapters(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             DatasourceAdapterTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getAdapterTupleTranslator(false);
             IValueExtractor<DatasourceAdapter> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2032,18 +2082,19 @@
     }
 
     @Override
-    public void dropLibrary(TxnId txnId, DataverseName dataverseName, String libraryName) throws AlgebricksException {
-        dropLibrary(txnId, dataverseName, libraryName, false);
+    public void dropLibrary(TxnId txnId, String database, DataverseName dataverseName, String libraryName)
+            throws AlgebricksException {
+        dropLibrary(txnId, database, dataverseName, libraryName, false);
     }
 
-    private void dropLibrary(TxnId txnId, DataverseName dataverseName, String libraryName, boolean force)
-            throws AlgebricksException {
+    private void dropLibrary(TxnId txnId, String database, DataverseName dataverseName, String libraryName,
+            boolean force) throws AlgebricksException {
         if (!force) {
-            confirmLibraryCanBeDeleted(txnId, dataverseName, libraryName);
+            confirmLibraryCanBeDeleted(txnId, database, dataverseName, libraryName);
         }
         try {
             // Delete entry from the 'Library' dataset.
-            ITupleReference searchKey = createTuple(dataverseName, libraryName);
+            ITupleReference searchKey = createTuple(database, dataverseName, libraryName);
             // Searches the index for the tuple to be deleted. Acquires an S lock on the 'Library' dataset.
             ITupleReference datasetTuple =
                     getTupleToBeDeleted(txnId, mdIndexesProvider.getLibraryEntity().getIndex(), searchKey);
@@ -2059,9 +2110,10 @@
     }
 
     @Override
-    public Library getLibrary(TxnId txnId, DataverseName dataverseName, String libraryName) throws AlgebricksException {
+    public Library getLibrary(TxnId txnId, String database, DataverseName dataverseName, String libraryName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, libraryName);
+            ITupleReference searchKey = createTuple(database, dataverseName, libraryName);
             LibraryTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getLibraryTupleTranslator(false);
             List<Library> results = new ArrayList<>();
             IValueExtractor<Library> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2098,10 +2150,10 @@
     }
 
     @Override
-    public FeedPolicyEntity getFeedPolicy(TxnId txnId, DataverseName dataverseName, String policyName)
+    public FeedPolicyEntity getFeedPolicy(TxnId txnId, String database, DataverseName dataverseName, String policyName)
             throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, policyName);
+            ITupleReference searchKey = createTuple(database, dataverseName, policyName);
             FeedPolicyTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedPolicyTupleTranslator(false);
             List<FeedPolicyEntity> results = new ArrayList<>();
             IValueExtractor<FeedPolicyEntity> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2133,10 +2185,10 @@
     }
 
     @Override
-    public List<FeedConnection> getFeedConnections(TxnId txnId, DataverseName dataverseName, String feedName)
-            throws AlgebricksException {
+    public List<FeedConnection> getFeedConnections(TxnId txnId, String database, DataverseName dataverseName,
+            String feedName) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, feedName);
+            ITupleReference searchKey = createTuple(database, dataverseName, feedName);
             FeedConnectionTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getFeedConnectionTupleTranslator(false);
             List<FeedConnection> results = new ArrayList<>();
@@ -2150,10 +2202,10 @@
     }
 
     @Override
-    public FeedConnection getFeedConnection(TxnId txnId, DataverseName dataverseName, String feedName,
+    public FeedConnection getFeedConnection(TxnId txnId, String database, DataverseName dataverseName, String feedName,
             String datasetName) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, feedName, datasetName);
+            ITupleReference searchKey = createTuple(database, dataverseName, feedName, datasetName);
             FeedConnectionTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getFeedConnectionTupleTranslator(false);
             List<FeedConnection> results = new ArrayList<>();
@@ -2170,10 +2222,10 @@
     }
 
     @Override
-    public void dropFeedConnection(TxnId txnId, DataverseName dataverseName, String feedName, String datasetName)
-            throws AlgebricksException {
+    public void dropFeedConnection(TxnId txnId, String database, DataverseName dataverseName, String feedName,
+            String datasetName) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, feedName, datasetName);
+            ITupleReference searchKey = createTuple(database, dataverseName, feedName, datasetName);
             ITupleReference tuple =
                     getTupleToBeDeleted(txnId, mdIndexesProvider.getFeedConnectionEntity().getIndex(), searchKey);
             deleteTupleFromIndex(txnId, mdIndexesProvider.getFeedConnectionEntity().getIndex(), tuple);
@@ -2205,9 +2257,10 @@
     }
 
     @Override
-    public Feed getFeed(TxnId txnId, DataverseName dataverseName, String feedName) throws AlgebricksException {
+    public Feed getFeed(TxnId txnId, String database, DataverseName dataverseName, String feedName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, feedName);
+            ITupleReference searchKey = createTuple(database, dataverseName, feedName);
             FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(false);
             List<Feed> results = new ArrayList<>();
             IValueExtractor<Feed> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2222,9 +2275,9 @@
     }
 
     @Override
-    public List<Feed> getFeeds(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    public List<Feed> getFeeds(TxnId txnId, String database, DataverseName dataverseName) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(false);
             List<Feed> results = new ArrayList<>();
             IValueExtractor<Feed> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2236,9 +2289,10 @@
     }
 
     @Override
-    public void dropFeed(TxnId txnId, DataverseName dataverseName, String feedName) throws AlgebricksException {
+    public void dropFeed(TxnId txnId, String database, DataverseName dataverseName, String feedName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, feedName);
+            ITupleReference searchKey = createTuple(database, dataverseName, feedName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'nodegroup' dataset.
             ITupleReference tuple = getTupleToBeDeleted(txnId, mdIndexesProvider.getFeedEntity().getIndex(), searchKey);
@@ -2253,9 +2307,10 @@
     }
 
     @Override
-    public void dropFeedPolicy(TxnId txnId, DataverseName dataverseName, String policyName) throws AlgebricksException {
+    public void dropFeedPolicy(TxnId txnId, String database, DataverseName dataverseName, String policyName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, policyName);
+            ITupleReference searchKey = createTuple(database, dataverseName, policyName);
             ITupleReference tuple =
                     getTupleToBeDeleted(txnId, mdIndexesProvider.getFeedPolicyEntity().getIndex(), searchKey);
             deleteTupleFromIndex(txnId, mdIndexesProvider.getFeedPolicyEntity().getIndex(), tuple);
@@ -2270,10 +2325,10 @@
     }
 
     @Override
-    public List<FeedPolicyEntity> getDataverseFeedPolicies(TxnId txnId, DataverseName dataverseName)
+    public List<FeedPolicyEntity> getDataverseFeedPolicies(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             FeedPolicyTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedPolicyTupleTranslator(false);
             IValueExtractor<FeedPolicyEntity> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<FeedPolicyEntity> results = new ArrayList<>();
@@ -2305,7 +2360,8 @@
     @Override
     public List<ExternalFile> getExternalFiles(TxnId txnId, Dataset dataset) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataset.getDataverseName(), dataset.getDatasetName());
+            ITupleReference searchKey =
+                    createTuple(dataset.getDatabaseName(), dataset.getDataverseName(), dataset.getDatasetName());
             ExternalFileTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getExternalFileTupleTranslator(false);
             IValueExtractor<ExternalFile> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2319,11 +2375,11 @@
     }
 
     @Override
-    public void dropExternalFile(TxnId txnId, DataverseName dataverseName, String datasetName, int fileNumber)
-            throws AlgebricksException {
+    public void dropExternalFile(TxnId txnId, String database, DataverseName dataverseName, String datasetName,
+            int fileNumber) throws AlgebricksException {
         try {
             // Delete entry from the 'ExternalFile' dataset.
-            ITupleReference searchKey = createExternalFileSearchTuple(dataverseName, datasetName, fileNumber);
+            ITupleReference searchKey = createExternalFileSearchTuple(database, dataverseName, datasetName, fileNumber);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'ExternalFile' dataset.
             ITupleReference datasetTuple =
@@ -2344,15 +2400,15 @@
         List<ExternalFile> files = getExternalFiles(txnId, dataset);
         // loop through files and delete them
         for (int i = 0; i < files.size(); i++) {
-            dropExternalFile(txnId, files.get(i).getDataverseName(), files.get(i).getDatasetName(),
-                    files.get(i).getFileNumber());
+            dropExternalFile(txnId, files.get(i).getDatabaseName(), files.get(i).getDataverseName(),
+                    files.get(i).getDatasetName(), files.get(i).getFileNumber());
         }
     }
 
     // This method is used to create a search tuple for external data file since the
     // search tuple has an int value
-    public ITupleReference createExternalFileSearchTuple(DataverseName dataverseName, String datasetName,
-            int fileNumber) throws HyracksDataException {
+    private ITupleReference createExternalFileSearchTuple(String database, DataverseName dataverseName,
+            String datasetName, int fileNumber) throws HyracksDataException {
         ISerializerDeserializer<AString> stringSerde =
                 SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
         ISerializerDeserializer<AInt32> intSerde =
@@ -2361,6 +2417,12 @@
         AMutableString aString = new AMutableString("");
         ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(3);
 
+        // database field
+        if (mdIndexesProvider.isUsingDatabase()) {
+            aString.setValue(database);
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         // dataverse field
         aString.setValue(dataverseName.getCanonicalForm());
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
@@ -2381,10 +2443,10 @@
     }
 
     @Override
-    public ExternalFile getExternalFile(TxnId txnId, DataverseName dataverseName, String datasetName,
+    public ExternalFile getExternalFile(TxnId txnId, String database, DataverseName dataverseName, String datasetName,
             Integer fileNumber) throws AlgebricksException {
         try {
-            ITupleReference searchKey = createExternalFileSearchTuple(dataverseName, datasetName, fileNumber);
+            ITupleReference searchKey = createExternalFileSearchTuple(database, dataverseName, datasetName, fileNumber);
             ExternalFileTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getExternalFileTupleTranslator(false);
             IValueExtractor<ExternalFile> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2418,19 +2480,20 @@
     }
 
     @Override
-    public void dropSynonym(TxnId txnId, DataverseName dataverseName, String synonymName) throws AlgebricksException {
-        dropSynonym(txnId, dataverseName, synonymName, false);
+    public void dropSynonym(TxnId txnId, String database, DataverseName dataverseName, String synonymName)
+            throws AlgebricksException {
+        dropSynonym(txnId, database, dataverseName, synonymName, false);
     }
 
-    private void dropSynonym(TxnId txnId, DataverseName dataverseName, String synonymName, boolean force)
-            throws AlgebricksException {
+    private void dropSynonym(TxnId txnId, String database, DataverseName dataverseName, String synonymName,
+            boolean force) throws AlgebricksException {
         if (!force) {
-            confirmSynonymCanBeDeleted(txnId, dataverseName, synonymName);
+            confirmSynonymCanBeDeleted(txnId, database, dataverseName, synonymName);
         }
 
         try {
             // Delete entry from the 'Synonym' dataset.
-            ITupleReference searchKey = createTuple(dataverseName, synonymName);
+            ITupleReference searchKey = createTuple(database, dataverseName, synonymName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'Synonym' dataset.
             ITupleReference synonymTuple =
@@ -2446,26 +2509,29 @@
         }
     }
 
-    private void confirmSynonymCanBeDeleted(TxnId txnId, DataverseName dataverseName, String synonymName)
-            throws AlgebricksException {
-        confirmSynonymIsUnusedByFunctions(txnId, dataverseName, synonymName);
-        confirmSynonymIsUnusedByViews(txnId, dataverseName, synonymName);
+    private void confirmSynonymCanBeDeleted(TxnId txnId, String database, DataverseName dataverseName,
+            String synonymName) throws AlgebricksException {
+        confirmSynonymIsUnusedByFunctions(txnId, database, dataverseName, synonymName);
+        confirmSynonymIsUnusedByViews(txnId, database, dataverseName, synonymName);
     }
 
-    private void confirmSynonymIsUnusedByFunctions(TxnId txnId, DataverseName dataverseName, String synonymName)
-            throws AlgebricksException {
-        confirmObjectIsUnusedByFunctions(txnId, "synonym", DependencyKind.SYNONYM, dataverseName, synonymName, null);
+    private void confirmSynonymIsUnusedByFunctions(TxnId txnId, String database, DataverseName dataverseName,
+            String synonymName) throws AlgebricksException {
+        confirmObjectIsUnusedByFunctions(txnId, "synonym", DependencyKind.SYNONYM, database, dataverseName, synonymName,
+                null);
     }
 
-    private void confirmSynonymIsUnusedByViews(TxnId txnId, DataverseName dataverseName, String synonymName)
-            throws AlgebricksException {
-        confirmObjectIsUnusedByViews(txnId, "synonym", DependencyKind.SYNONYM, dataverseName, synonymName, null);
+    private void confirmSynonymIsUnusedByViews(TxnId txnId, String database, DataverseName dataverseName,
+            String synonymName) throws AlgebricksException {
+        confirmObjectIsUnusedByViews(txnId, "synonym", DependencyKind.SYNONYM, database, dataverseName, synonymName,
+                null);
     }
 
     @Override
-    public Synonym getSynonym(TxnId txnId, DataverseName dataverseName, String synonymName) throws AlgebricksException {
+    public Synonym getSynonym(TxnId txnId, String database, DataverseName dataverseName, String synonymName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName, synonymName);
+            ITupleReference searchKey = createTuple(database, dataverseName, synonymName);
             SynonymTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getSynonymTupleTranslator(false);
             List<Synonym> results = new ArrayList<>();
             IValueExtractor<Synonym> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
@@ -2480,9 +2546,10 @@
     }
 
     @Override
-    public List<Synonym> getDataverseSynonyms(TxnId txnId, DataverseName dataverseName) throws AlgebricksException {
+    public List<Synonym> getDataverseSynonyms(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException {
         try {
-            ITupleReference searchKey = createTuple(dataverseName);
+            ITupleReference searchKey = createTuple(database, dataverseName);
             SynonymTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getSynonymTupleTranslator(false);
             IValueExtractor<Synonym> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Synonym> results = new ArrayList<>();
@@ -2498,7 +2565,8 @@
         try {
             // This method will delete previous entry of the dataset and insert the new one
             // Delete entry from the 'datasets' dataset.
-            ITupleReference searchKey = createTuple(dataset.getDataverseName(), dataset.getDatasetName());
+            ITupleReference searchKey =
+                    createTuple(dataset.getDatabaseName(), dataset.getDataverseName(), dataset.getDatasetName());
             // Searches the index for the tuple to be deleted. Acquires an S lock on the 'dataset' dataset.
             ITupleReference datasetTuple =
                     getTupleToBeDeleted(txnId, mdIndexesProvider.getDatasetEntity().getIndex(), searchKey);
@@ -2519,7 +2587,7 @@
 
     @Override
     public void updateLibrary(TxnId txnId, Library library) throws AlgebricksException {
-        dropLibrary(txnId, library.getDataverseName(), library.getName(), true);
+        dropLibrary(txnId, library.getDatabaseName(), library.getDataverseName(), library.getName(), true);
         addLibrary(txnId, library);
     }
 
@@ -2531,7 +2599,7 @@
 
     @Override
     public void updateDatatype(TxnId txnId, Datatype datatype) throws AlgebricksException {
-        dropDatatype(txnId, datatype.getDataverseName(), datatype.getDatatypeName(), true);
+        dropDatatype(txnId, datatype.getDatabaseName(), datatype.getDataverseName(), datatype.getDatatypeName(), true);
         addDatatype(txnId, datatype);
     }
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
index 561a4fa..60f457f 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
@@ -60,21 +60,21 @@
     /**
      * Begins a local transaction against the metadata.
      *
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void beginTransaction(TxnId txnId) throws RemoteException;
 
     /**
      * Commits a local transaction against the metadata.
      *
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void commitTransaction(TxnId txnId) throws RemoteException;
 
     /**
      * Aborts a local transaction against the metadata.
      *
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void abortTransaction(TxnId txnId) throws RemoteException;
 
@@ -88,7 +88,7 @@
      *            Dataverse instance to be inserted.
      * @throws AlgebricksException
      *             For example, if the dataverse already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addDataverse(TxnId txnId, Dataverse dataverse) throws AlgebricksException, RemoteException;
 
@@ -101,7 +101,7 @@
      * @return A list of dataverse instances.
      * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     List<Dataverse> getDataverses(TxnId txnId) throws AlgebricksException, RemoteException;
 
@@ -116,9 +116,10 @@
      * @return A dataverse instance.
      * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    Dataverse getDataverse(TxnId txnId, DataverseName dataverseName) throws AlgebricksException, RemoteException;
+    Dataverse getDataverse(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Retrieves all datasets belonging to the given dataverse, acquiring local
@@ -132,7 +133,7 @@
      * @throws AlgebricksException
      *             For example, if the dataverse does not exist. RemoteException
      */
-    List<Dataset> getDataverseDatasets(TxnId txnId, DataverseName dataverseName)
+    List<Dataset> getDataverseDatasets(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -147,7 +148,8 @@
      * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
      */
-    void dropDataverse(TxnId txnId, DataverseName dataverseName) throws AlgebricksException, RemoteException;
+    void dropDataverse(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Returns {@code true} if given dataverse is not empty
@@ -157,7 +159,8 @@
      * @param dataverseName
      *            Name of the dataverse
      */
-    boolean isDataverseNotEmpty(TxnId txnId, DataverseName dataverseName) throws AlgebricksException, RemoteException;
+    boolean isDataverseNotEmpty(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Inserts a new dataset into the metadata, acquiring local locks on behalf of
@@ -169,7 +172,7 @@
      *            Dataset instance to be inserted.
      * @throws AlgebricksException
      *             For example, if the dataset already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addDataset(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
@@ -186,9 +189,9 @@
      * @return A dataset instance.
      * @throws AlgebricksException
      *             For example, if the dataset does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    Dataset getDataset(TxnId txnId, DataverseName dataverseName, String datasetName)
+    Dataset getDataset(TxnId txnId, String database, DataverseName dataverseName, String datasetName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -204,9 +207,9 @@
      * @return A list of Index instances.
      * @throws AlgebricksException
      *             For example, if the dataset and/or dataverse does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    List<Index> getDatasetIndexes(TxnId txnId, DataverseName dataverseName, String datasetName)
+    List<Index> getDatasetIndexes(TxnId txnId, String database, DataverseName dataverseName, String datasetName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -223,9 +226,9 @@
      *            If true, forces drop the dataset. Setting it to true could make the metadata inconsistent.
      * @throws AlgebricksException
      *             For example, if the dataset and/or dataverse does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropDataset(TxnId txnId, DataverseName dataverseName, String datasetName, boolean force)
+    void dropDataset(TxnId txnId, String database, DataverseName dataverseName, String datasetName, boolean force)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -239,7 +242,7 @@
      *            Index instance to be inserted.
      * @throws AlgebricksException
      *             For example, if the index already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addIndex(TxnId txnId, Index index) throws AlgebricksException, RemoteException;
 
@@ -253,13 +256,14 @@
      *            Name of the datavers holding the given dataset.
      * @param datasetName
      *            Name of the dataset holding the index.
-     * @indexName Name of the index to retrieve.
+     * @param indexName
+     *            Name of the index to retrieve.
      * @return An Index instance.
      * @throws AlgebricksException
      *             For example, if the index does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    Index getIndex(TxnId txnId, DataverseName dataverseName, String datasetName, String indexName)
+    Index getIndex(TxnId txnId, String database, DataverseName dataverseName, String datasetName, String indexName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -272,12 +276,13 @@
      *            Name of the datavers holding the given dataset.
      * @param datasetName
      *            Name of the dataset holding the index.
-     * @indexName Name of the index to retrieve.
+     * @param indexName
+     *            Name of the index to retrieve.
      * @throws AlgebricksException
      *             For example, if the index does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropIndex(TxnId txnId, DataverseName dataverseName, String datasetName, String indexName)
+    void dropIndex(TxnId txnId, String database, DataverseName dataverseName, String datasetName, String indexName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -290,7 +295,7 @@
      *            Datatype instance to be inserted.
      * @throws AlgebricksException
      *             For example, if the datatype already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addDatatype(TxnId txnId, Datatype datatype) throws AlgebricksException, RemoteException;
 
@@ -307,9 +312,9 @@
      * @return A datatype instance.
      * @throws AlgebricksException
      *             For example, if the datatype does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    Datatype getDatatype(TxnId txnId, DataverseName dataverseName, String datatypeName)
+    Datatype getDatatype(TxnId txnId, String database, DataverseName dataverseName, String datatypeName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -325,9 +330,9 @@
      * @throws AlgebricksException
      *             For example, if there are still datasets using the type to be
      *             deleted.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropDatatype(TxnId txnId, DataverseName dataverseName, String datatypeName)
+    void dropDatatype(TxnId txnId, String database, DataverseName dataverseName, String datatypeName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -341,7 +346,7 @@
      * @param modificationOp
      * @throws AlgebricksException
      *             For example, if the node group already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void modifyNodeGroup(TxnId txnId, NodeGroup nodeGroup,
             AbstractIndexModificationOperationCallback.Operation modificationOp)
@@ -357,7 +362,7 @@
      *            Name of node group to be retrieved.
      * @throws AlgebricksException
      *             For example, if the node group does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     NodeGroup getNodeGroup(TxnId txnId, String nodeGroupName) throws AlgebricksException, RemoteException;
 
@@ -376,7 +381,7 @@
      * @throws AlgebricksException
      *             For example, there are still datasets partitioned on the node
      *             group to be deleted.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     boolean dropNodegroup(TxnId txnId, String nodeGroupName, boolean failSilently)
             throws AlgebricksException, RemoteException;
@@ -391,7 +396,7 @@
      *            Node instance to be inserted.
      * @throws AlgebricksException
      *             For example, if the node already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addNode(TxnId txnId, Node node) throws AlgebricksException, RemoteException;
 
@@ -402,7 +407,7 @@
      *            An instance of functionSignature representing the function
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     Function getFunction(TxnId txnId, FunctionSignature functionSignature) throws AlgebricksException, RemoteException;
 
@@ -417,9 +422,9 @@
      * @return A list of function instances.
      * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    List<Function> getDataverseFunctions(TxnId txnId, DataverseName dataverseName)
+    List<Function> getDataverseFunctions(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -433,7 +438,7 @@
      * @throws AlgebricksException
      *             For example, there are still datasets partitioned on the node
      *             group to be deleted.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void dropFunction(TxnId txnId, FunctionSignature functionSignature) throws AlgebricksException, RemoteException;
 
@@ -445,7 +450,7 @@
      * @throws AlgebricksException
      *             for example, if the function already exists or refers to an
      *             unknown function
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addFunction(TxnId txnId, Function function) throws AlgebricksException, RemoteException;
 
@@ -470,8 +475,8 @@
      * @throws AlgebricksException
      *              For example, if the filter doesn't exist
      */
-    FullTextFilterMetadataEntity getFullTextFilter(TxnId txnId, DataverseName dataverseName, String filterName)
-            throws RemoteException, AlgebricksException;
+    FullTextFilterMetadataEntity getFullTextFilter(TxnId txnId, String database, DataverseName dataverseName,
+            String filterName) throws RemoteException, AlgebricksException;
 
     /**
      * @param txnId
@@ -483,7 +488,7 @@
      * @throws AlgebricksException
      *              For example, if ifExists is set to false and the filter doesn't exist
      */
-    void dropFullTextFilter(TxnId txnId, DataverseName dataverseName, String filterName)
+    void dropFullTextFilter(TxnId txnId, String database, DataverseName dataverseName, String filterName)
             throws RemoteException, AlgebricksException;
 
     /**
@@ -507,8 +512,8 @@
      * @throws AlgebricksException
      *              For example, if the full-text config doesn't exist
      */
-    FullTextConfigMetadataEntity getFullTextConfig(TxnId txnId, DataverseName dataverseName, String configName)
-            throws AlgebricksException, RemoteException;
+    FullTextConfigMetadataEntity getFullTextConfig(TxnId txnId, String database, DataverseName dataverseName,
+            String configName) throws AlgebricksException, RemoteException;
 
     /**
      * @param txnId
@@ -520,7 +525,7 @@
      * @throws AlgebricksException
      *              For example, if ifExists is set to false and the config doesn't exist
      */
-    void dropFullTextConfig(TxnId txnId, DataverseName dataverseName, String configName)
+    void dropFullTextConfig(TxnId txnId, String database, DataverseName dataverseName, String configName)
             throws RemoteException, AlgebricksException;
 
     /**
@@ -529,9 +534,9 @@
      * @return List<Adapter> A list containing the adapters in the specified
      *         dataverse
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    List<DatasourceAdapter> getDataverseAdapters(TxnId txnId, DataverseName dataverseName)
+    List<DatasourceAdapter> getDataverseAdapters(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -540,9 +545,9 @@
      * @param adapterName
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    DatasourceAdapter getAdapter(TxnId txnId, DataverseName dataverseName, String adapterName)
+    DatasourceAdapter getAdapter(TxnId txnId, String database, DataverseName dataverseName, String adapterName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -557,9 +562,9 @@
      *            Name of adapter to be deleted. AlgebricksException for example, if
      *            the adapter does not exists.
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropAdapter(TxnId txnId, DataverseName dataverseName, String adapterName)
+    void dropAdapter(TxnId txnId, String database, DataverseName dataverseName, String adapterName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -569,7 +574,7 @@
      *            Adapter to be inserted
      * @throws AlgebricksException
      *             for example, if the adapter already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addAdapter(TxnId txnId, DatasourceAdapter adapter) throws AlgebricksException, RemoteException;
 
@@ -577,7 +582,7 @@
      * @param txnId
      * @param compactionPolicy
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addCompactionPolicy(TxnId txnId, CompactionPolicy compactionPolicy)
             throws AlgebricksException, RemoteException;
@@ -588,22 +593,22 @@
      * @param policy
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    CompactionPolicy getCompactionPolicy(TxnId txnId, DataverseName dataverseName, String policy)
+    CompactionPolicy getCompactionPolicy(TxnId txnId, String database, DataverseName dataverseName, String policy)
             throws AlgebricksException, RemoteException;
 
     /**
      * @param txnId
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void initializeDatasetIdFactory(TxnId txnId) throws AlgebricksException, RemoteException;
 
     /**
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     int getMostRecentDatasetId() throws AlgebricksException, RemoteException;
 
@@ -611,7 +616,7 @@
      * @param txnId
      * @param feed
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addFeed(TxnId txnId, Feed feed) throws AlgebricksException, RemoteException;
 
@@ -621,27 +626,29 @@
      * @param feedName
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    Feed getFeed(TxnId txnId, DataverseName dataverseName, String feedName) throws AlgebricksException, RemoteException;
+    Feed getFeed(TxnId txnId, String database, DataverseName dataverseName, String feedName)
+            throws AlgebricksException, RemoteException;
 
-    List<Feed> getFeeds(TxnId txnId, DataverseName dataverseName) throws AlgebricksException, RemoteException;
+    List<Feed> getFeeds(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * @param txnId
      * @param dataverseName
      * @param feedName
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropFeed(TxnId txnId, DataverseName dataverseName, String feedName)
+    void dropFeed(TxnId txnId, String database, DataverseName dataverseName, String feedName)
             throws AlgebricksException, RemoteException;
 
     /**
      * @param txnId
      * @param feedPolicy
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addFeedPolicy(TxnId txnId, FeedPolicyEntity feedPolicy) throws AlgebricksException, RemoteException;
 
@@ -651,9 +658,9 @@
      * @param policy
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    FeedPolicyEntity getFeedPolicy(TxnId txnId, DataverseName dataverseName, String policy)
+    FeedPolicyEntity getFeedPolicy(TxnId txnId, String database, DataverseName dataverseName, String policy)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -668,9 +675,9 @@
      *            Name of library to be deleted. AlgebricksException for example, if
      *            the library does not exists.
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropLibrary(TxnId txnId, DataverseName dataverseName, String libraryName)
+    void dropLibrary(TxnId txnId, String database, DataverseName dataverseName, String libraryName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -682,7 +689,7 @@
      *            Library to be added
      * @throws AlgebricksException
      *             for example, if the library is already added.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addLibrary(TxnId txnId, Library library) throws AlgebricksException, RemoteException;
 
@@ -695,9 +702,9 @@
      *            name of the library that is to be retrieved
      * @return Library
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    Library getLibrary(TxnId txnId, DataverseName dataverseName, String libraryName)
+    Library getLibrary(TxnId txnId, String database, DataverseName dataverseName, String libraryName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -709,9 +716,9 @@
      *            dataverse asociated with the library that is to be retrieved.
      * @return Library
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    List<Library> getDataverseLibraries(TxnId txnId, DataverseName dataverseName)
+    List<Library> getDataverseLibraries(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -719,9 +726,10 @@
      * @param dataverseName
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    List<Feed> getDataverseFeeds(TxnId txnId, DataverseName dataverseName) throws AlgebricksException, RemoteException;
+    List<Feed> getDataverseFeeds(TxnId txnId, String database, DataverseName dataverseName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * delete a give feed (ingestion) policy
@@ -730,10 +738,10 @@
      * @param dataverseName
      * @param policyName
      * @return
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      * @throws AlgebricksException
      */
-    void dropFeedPolicy(TxnId txnId, DataverseName dataverseName, String policyName)
+    void dropFeedPolicy(TxnId txnId, String database, DataverseName dataverseName, String policyName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -741,9 +749,9 @@
      * @param dataverseName
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    List<FeedPolicyEntity> getDataverseFeedPolicies(TxnId txnId, DataverseName dataverseName)
+    List<FeedPolicyEntity> getDataverseFeedPolicies(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -753,7 +761,7 @@
      *            An object representing the external file entity
      * @throws AlgebricksException
      *             for example, if the file already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addExternalFile(TxnId txnId, ExternalFile externalFile) throws AlgebricksException, RemoteException;
 
@@ -763,7 +771,7 @@
      * @param dataset
      *            A dataset the files belongs to.
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     List<ExternalFile> getExternalFiles(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
@@ -781,9 +789,9 @@
      * @param fileNumber
      *            the id number for the file to be deleted
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropExternalFile(TxnId txnId, DataverseName dataverseName, String datasetName, int fileNumber)
+    void dropExternalFile(TxnId txnId, String database, DataverseName dataverseName, String datasetName, int fileNumber)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -795,7 +803,7 @@
      * @param dataset
      *            An external dataset the files belong to.
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void dropExternalFiles(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
@@ -814,10 +822,10 @@
      * @return An ExternalFile instance.
      * @throws AlgebricksException
      *             For example, if the index does not exist.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    ExternalFile getExternalFile(TxnId txnId, DataverseName dataverseName, String datasetName, Integer fileNumber)
-            throws AlgebricksException, RemoteException;
+    ExternalFile getExternalFile(TxnId txnId, String database, DataverseName dataverseName, String datasetName,
+            Integer fileNumber) throws AlgebricksException, RemoteException;
 
     /**
      * Adds a synonym, acquiring local locks on behalf of the given transaction id.
@@ -828,7 +836,7 @@
      *            Synonym to be added
      * @throws AlgebricksException
      *             for example, if the synonym is already added.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void addSynonym(TxnId txnId, Synonym synonym) throws AlgebricksException, RemoteException;
 
@@ -843,9 +851,9 @@
      *            Name of synonym to be deleted. AlgebricksException for example, if
      *            the synonym does not exists.
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    void dropSynonym(TxnId txnId, DataverseName dataverseName, String synonymName)
+    void dropSynonym(TxnId txnId, String database, DataverseName dataverseName, String synonymName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -857,9 +865,9 @@
      *            name of the synonym that is to be retrieved
      * @return Synonym
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    Synonym getSynonym(TxnId txnId, DataverseName dataverseName, String synonymName)
+    Synonym getSynonym(TxnId txnId, String database, DataverseName dataverseName, String synonymName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -871,9 +879,9 @@
      *            dataverse associated with synonyms that are to be retrieved.
      * @return list of synonyms
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
-    List<Synonym> getDataverseSynonyms(TxnId txnId, DataverseName dataverseName)
+    List<Synonym> getDataverseSynonyms(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
     /**
@@ -886,7 +894,7 @@
      *            updated Dataset instance.
      * @throws AlgebricksException
      *             For example, if the dataset already exists.
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     void updateDataset(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
@@ -929,7 +937,7 @@
      * @param txnId
      * @param entity
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     <T extends IExtensionMetadataEntity> void addEntity(TxnId txnId, T entity)
             throws AlgebricksException, RemoteException;
@@ -940,7 +948,7 @@
      * @param txnId
      * @param entity
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     <T extends IExtensionMetadataEntity> void upsertEntity(TxnId txnId, T entity)
             throws AlgebricksException, RemoteException;
@@ -951,7 +959,7 @@
      * @param txnId
      * @param entity
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     <T extends IExtensionMetadataEntity> void deleteEntity(TxnId txnId, T entity)
             throws AlgebricksException, RemoteException;
@@ -964,19 +972,19 @@
      * @param searchKey
      * @return
      * @throws AlgebricksException
-     * @throws RemoteException
+     * @throws RemoteException remote exception
      */
     <T extends IExtensionMetadataEntity> List<T> getEntities(TxnId txnId, IExtensionMetadataSearchKey searchKey)
             throws AlgebricksException, RemoteException;
 
     void addFeedConnection(TxnId txnId, FeedConnection feedConnection) throws AlgebricksException, RemoteException;
 
-    FeedConnection getFeedConnection(TxnId txnId, DataverseName dataverseName, String feedName, String datasetName)
-            throws AlgebricksException, RemoteException;
+    FeedConnection getFeedConnection(TxnId txnId, String database, DataverseName dataverseName, String feedName,
+            String datasetName) throws AlgebricksException, RemoteException;
 
-    void dropFeedConnection(TxnId txnId, DataverseName dataverseName, String feedName, String datasetName)
-            throws AlgebricksException, RemoteException;
+    void dropFeedConnection(TxnId txnId, String database, DataverseName dataverseName, String feedName,
+            String datasetName) throws AlgebricksException, RemoteException;
 
-    List<FeedConnection> getFeedConnections(TxnId txnId, DataverseName dataverseName, String feedName)
+    List<FeedConnection> getFeedConnections(TxnId txnId, String database, DataverseName dataverseName, String feedName)
             throws AlgebricksException, RemoteException;
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java
index 63b6abf..f7bf610 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataIndexesProvider.java
@@ -108,4 +108,8 @@
                 getExternalFileEntity().getIndex(), getFeedConnectionEntity().getIndex(),
                 getFullTextConfigEntity().getIndex(), getFullTextFilterEntity().getIndex() };
     }
+
+    public boolean isUsingDatabase() {
+        return false;
+    }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java
index 3e637df..d3d1787 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java
@@ -78,11 +78,11 @@
         return cache.dropDatatype(this);
     }
 
-    public static IAType getTypeFromTypeName(MetadataNode metadataNode, TxnId txnId, DataverseName dataverseName,
-            String typeName) throws AlgebricksException {
+    public static IAType getTypeFromTypeName(MetadataNode metadataNode, TxnId txnId, String database,
+            DataverseName dataverseName, String typeName) throws AlgebricksException {
         IAType type = BuiltinTypeMap.getBuiltinType(typeName);
         if (type == null) {
-            Datatype dt = metadataNode.getDatatype(txnId, dataverseName, typeName);
+            Datatype dt = metadataNode.getDatatype(txnId, database, dataverseName, typeName);
             if (dt != null) {
                 type = dt.getDatatype();
             }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
index 1ad331a..e0a0db0 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
@@ -59,7 +59,7 @@
     @Override
     protected Datatype createMetadataEntityFromARecord(ARecord datatypeRecord) throws AlgebricksException {
         int databaseNameIndex = datatypeEntity.databaseNameIndex();
-        String databaseName;
+        String databaseName = null;
         if (databaseNameIndex >= 0) {
             databaseName = ((AString) datatypeRecord.getValueByPos(databaseNameIndex)).getStringValue();
         }
@@ -113,8 +113,8 @@
                             isMissable = isNullable;
                         }
 
-                        IAType fieldType =
-                                Datatype.getTypeFromTypeName(metadataNode, txnId, dataverseName, fieldTypeName);
+                        IAType fieldType = Datatype.getTypeFromTypeName(metadataNode, txnId, databaseName,
+                                dataverseName, fieldTypeName);
                         fieldTypes[fieldId] = TypeUtil.createQuantifiedType(fieldType, isNullable, isMissable);
                         fieldId++;
                     }
@@ -125,17 +125,19 @@
                     String unorderedlistTypeName = ((AString) derivedTypeRecord
                             .getValueByPos(MetadataRecordTypes.DERIVEDTYPE_ARECORD_UNORDEREDLIST_FIELD_INDEX))
                                     .getStringValue();
-                    return new Datatype(dataverseName, datatypeName, new AUnorderedListType(
-                            Datatype.getTypeFromTypeName(metadataNode, txnId, dataverseName, unorderedlistTypeName),
-                            datatypeName), isAnonymous);
+                    return new Datatype(dataverseName, datatypeName,
+                            new AUnorderedListType(Datatype.getTypeFromTypeName(metadataNode, txnId, databaseName,
+                                    dataverseName, unorderedlistTypeName), datatypeName),
+                            isAnonymous);
                 }
                 case ORDEREDLIST: {
                     String orderedlistTypeName = ((AString) derivedTypeRecord
                             .getValueByPos(MetadataRecordTypes.DERIVEDTYPE_ARECORD_ORDEREDLIST_FIELD_INDEX))
                                     .getStringValue();
-                    return new Datatype(dataverseName, datatypeName, new AOrderedListType(
-                            Datatype.getTypeFromTypeName(metadataNode, txnId, dataverseName, orderedlistTypeName),
-                            datatypeName), isAnonymous);
+                    return new Datatype(
+                            dataverseName, datatypeName, new AOrderedListType(Datatype.getTypeFromTypeName(metadataNode,
+                                    txnId, databaseName, dataverseName, orderedlistTypeName), datatypeName),
+                            isAnonymous);
                 }
                 default:
                     throw new UnsupportedOperationException("Unsupported derived type: " + tag);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
index 8373574..a178b1a 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
@@ -148,7 +148,7 @@
     @Override
     protected Index createMetadataEntityFromARecord(ARecord indexRecord) throws AlgebricksException {
         int databaseNameIndex = indexEntity.databaseNameIndex();
-        String databaseName;
+        String databaseName = null;
         if (databaseNameIndex >= 0) {
             databaseName = ((AString) indexRecord.getValueByPos(databaseNameIndex)).getStringValue();
         }
@@ -294,7 +294,8 @@
                 case STRING:
                     // This is a simple element, place in a single-element list.
                     String typeName = ((AString) fieldTypeItem).getStringValue();
-                    IAType fieldType = Datatype.getTypeFromTypeName(metadataNode, txnId, dataverseName, typeName);
+                    IAType fieldType =
+                            Datatype.getTypeFromTypeName(metadataNode, txnId, databaseName, dataverseName, typeName);
                     searchKeyType.add(Collections.singletonList(fieldType));
                     break;
                 case ARRAY:
@@ -304,7 +305,8 @@
                     IACursor fieldTypeListCursor = fieldTypeList.getCursor();
                     while (fieldTypeListCursor.next()) {
                         typeName = ((AString) fieldTypeListCursor.get()).getStringValue();
-                        fieldTypes.add(Datatype.getTypeFromTypeName(metadataNode, txnId, dataverseName, typeName));
+                        fieldTypes.add(Datatype.getTypeFromTypeName(metadataNode, txnId, databaseName, dataverseName,
+                                typeName));
                     }
                     searchKeyType.add(fieldTypes);
                     break;
@@ -316,16 +318,17 @@
         if (searchKeyType.isEmpty()) {
             // if index key type information is not persisted, then we extract type information
             // from the record metadata
-            Dataset dataset = metadataNode.getDataset(txnId, dataverseName, datasetName);
+            Dataset dataset = metadataNode.getDataset(txnId, databaseName, dataverseName, datasetName);
             String datatypeName = dataset.getItemTypeName();
+            //TODO(DB): get 'database' of item type and meta type
             DataverseName datatypeDataverseName = dataset.getItemTypeDataverseName();
-            ARecordType recordDt =
-                    (ARecordType) metadataNode.getDatatype(txnId, datatypeDataverseName, datatypeName).getDatatype();
+            ARecordType recordDt = (ARecordType) metadataNode
+                    .getDatatype(txnId, null, datatypeDataverseName, datatypeName).getDatatype();
             String metatypeName = dataset.getMetaItemTypeName();
             DataverseName metatypeDataverseName = dataset.getMetaItemTypeDataverseName();
             ARecordType metaDt = null;
             if (metatypeName != null && metatypeDataverseName != null) {
-                metaDt = (ARecordType) metadataNode.getDatatype(txnId, metatypeDataverseName, metatypeName)
+                metaDt = (ARecordType) metadataNode.getDatatype(txnId, null, metatypeDataverseName, metatypeName)
                         .getDatatype();
             }
             recordDt = (ARecordType) MetadataManagerUtil.findTypeForDatasetWithoutType(recordDt, metaDt, dataset);
diff --git a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
index 07a7e33..9ab3e66 100644
--- a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
+++ b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.metadata.entitytupletranslators;
 
+import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
@@ -79,10 +80,12 @@
                     Collections.singletonList(BuiltinType.AINT64), false, false, false, 0, OptionalBoolean.of(false));
 
             MetadataNode mockMetadataNode = mock(MetadataNode.class);
-            when(mockMetadataNode.getDatatype(any(), any(DataverseName.class), anyString())).thenReturn(new Datatype(
-                    dvTest, "d1",
-                    new ARecordType("", new String[] { "row_id" }, new IAType[] { BuiltinType.AINT64 }, true), true));
-            when(mockMetadataNode.getDataset(any(), any(DataverseName.class), anyString())).thenReturn(dataset);
+            when(mockMetadataNode.getDatatype(any(), isNull(), any(DataverseName.class), anyString()))
+                    .thenReturn(new Datatype(dvTest, "d1",
+                            new ARecordType("", new String[] { "row_id" }, new IAType[] { BuiltinType.AINT64 }, true),
+                            true));
+            when(mockMetadataNode.getDataset(any(), isNull(), any(DataverseName.class), anyString()))
+                    .thenReturn(dataset);
 
             IndexTupleTranslator idxTranslator =
                     new IndexTupleTranslator(null, mockMetadataNode, true, IndexEntity.of(false));
