METAMODEL-1166: Fixed caching of tenant and data source context

Closes #12
diff --git a/CHANGES.md b/CHANGES.md
index 78c1e34..0d5c6c6 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -3,5 +3,6 @@
 * [METAMODEL-1153] - Added endpoints for deleting data sources.
 * [METAMODEL-1147] - Implemented Swagger codegen to build model classes from swagger file.
 * [METAMODEL-1149] - File based registry for tenant and data source information.
+* [METAMODEL-1166] - Caching of tenant and data source context information
 * [METAMODEL-1154] - Added update and delete capabilities in POST call to table data endpoint.
 * Established project source control, structure and build.
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/DataSourceRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/DataSourceRegistry.java
similarity index 98%
rename from core/src/main/java/org/apache/metamodel/membrane/app/DataSourceRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/DataSourceRegistry.java
index 1c5db17..00ec8e0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/DataSourceRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/DataSourceRegistry.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry;
 
 import java.util.List;
 
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/TenantContext.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantContext.java
similarity index 95%
rename from core/src/main/java/org/apache/metamodel/membrane/app/TenantContext.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantContext.java
index 491859f..4d7b470 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/TenantContext.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantContext.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry;
 
 /**
  * Represents a context-object containing all the information and services
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/TenantRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantRegistry.java
similarity index 96%
rename from core/src/main/java/org/apache/metamodel/membrane/app/TenantRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantRegistry.java
index 6a32800..764fbc0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/TenantRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantRegistry.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry;
 
 import java.util.List;
 
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/CachedDataSourceRegistryWrapper.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedDataSourceRegistryWrapper.java
similarity index 97%
rename from core/src/main/java/org/apache/metamodel/membrane/app/CachedDataSourceRegistryWrapper.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedDataSourceRegistryWrapper.java
index b7b5b1e..3a3a478 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/CachedDataSourceRegistryWrapper.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedDataSourceRegistryWrapper.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.cache;
 
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -26,6 +26,7 @@
 import org.apache.metamodel.factory.DataContextProperties;
 import org.apache.metamodel.membrane.app.exceptions.DataSourceAlreadyExistException;
 import org.apache.metamodel.membrane.app.exceptions.NoSuchDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
 import org.apache.metamodel.util.FileHelper;
 
 import com.google.common.cache.CacheBuilder;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedTenantRegistryWrapper.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedTenantRegistryWrapper.java
new file mode 100644
index 0000000..6ba500f
--- /dev/null
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedTenantRegistryWrapper.java
@@ -0,0 +1,113 @@
+package org.apache.metamodel.membrane.app.registry.cache;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.membrane.app.exceptions.NoSuchTenantException;
+import org.apache.metamodel.membrane.app.exceptions.TenantAlreadyExistException;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
+import org.apache.metamodel.util.FileHelper;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.cache.RemovalListener;
+import com.google.common.cache.RemovalNotification;
+import com.google.common.util.concurrent.UncheckedExecutionException;
+
+public class CachedTenantRegistryWrapper implements TenantRegistry {
+
+    /**
+     * The default timeout (in seconds) before the cache evicts and closes the
+     * created {@link TenantContext}s.
+     */
+    public static final int DEFAULT_TIMEOUT_SECONDS = 10 * 60;
+
+    private final TenantRegistry delegate;
+    private final LoadingCache<String, TenantContext> loadingCache;
+
+    public CachedTenantRegistryWrapper(TenantRegistry delegate) {
+        this(delegate, DEFAULT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+    }
+
+    public CachedTenantRegistryWrapper(TenantRegistry delegate, final long cacheTimeout,
+            final TimeUnit cacheTimeoutUnit) {
+        this.delegate = delegate;
+        this.loadingCache = CacheBuilder.newBuilder().expireAfterAccess(cacheTimeout, cacheTimeoutUnit).removalListener(
+                createRemovalListener()).build(createCacheLoader());
+    }
+
+    private RemovalListener<String, TenantContext> createRemovalListener() {
+        return new RemovalListener<String, TenantContext>() {
+            @Override
+            public void onRemoval(final RemovalNotification<String, TenantContext> notification) {
+                final TenantContext tenantContext = notification.getValue();
+                // TenantContexts could be closeable - attempt closing it here
+                FileHelper.safeClose(tenantContext);
+            }
+        };
+    }
+
+    private CacheLoader<String, TenantContext> createCacheLoader() {
+        return new CacheLoader<String, TenantContext>() {
+            @Override
+            public TenantContext load(final String key) throws Exception {
+                return delegate.getTenantContext(key);
+            }
+        };
+    }
+
+    @Override
+    public List<String> getTenantIdentifiers() {
+        return delegate.getTenantIdentifiers();
+    }
+
+    @Override
+    public TenantContext getTenantContext(String tenantIdentifier) throws NoSuchTenantException {
+        try {
+            return loadingCache.getUnchecked(tenantIdentifier);
+        } catch (UncheckedExecutionException e) {
+            final Throwable cause = e.getCause();
+            if (cause instanceof RuntimeException) {
+                throw (RuntimeException) cause;
+            }
+            throw new MetaModelException("Unexpected error happened while getting TenantContext '" + tenantIdentifier
+                    + "' from cache", e);
+        }
+    }
+
+    @Override
+    public TenantContext createTenantContext(String tenantIdentifier) throws IllegalArgumentException,
+            TenantAlreadyExistException {
+        final TenantContext tenantContext = delegate.createTenantContext(tenantIdentifier);
+        loadingCache.put(tenantContext.getTenantName(), tenantContext);
+        return tenantContext;
+    }
+
+    @Override
+    public void deleteTenantContext(String tenantIdentifier) throws NoSuchTenantException {
+        delegate.deleteTenantContext(tenantIdentifier);
+        loadingCache.invalidate(tenantIdentifier);
+    }
+
+}
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java
index 1a7759d..60c77ae 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java
@@ -29,10 +29,10 @@
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.factory.DataContextProperties;
 import org.apache.metamodel.membrane.app.DataContextSupplier;
-import org.apache.metamodel.membrane.app.DataSourceRegistry;
 import org.apache.metamodel.membrane.app.config.JacksonConfig;
 import org.apache.metamodel.membrane.app.exceptions.DataSourceAlreadyExistException;
 import org.apache.metamodel.membrane.app.exceptions.NoSuchDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
 import org.apache.metamodel.membrane.controllers.model.RestDataSourceDefinition;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java
index b1bc48c..d830125 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java
@@ -20,9 +20,9 @@
 
 import java.io.File;
 
-import org.apache.metamodel.membrane.app.CachedDataSourceRegistryWrapper;
-import org.apache.metamodel.membrane.app.DataSourceRegistry;
-import org.apache.metamodel.membrane.app.TenantContext;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.cache.CachedDataSourceRegistryWrapper;
 
 class FileBasedTenantContext implements TenantContext {
 
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java
index 6242038..94acdcd 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java
@@ -30,10 +30,10 @@
 import java.util.stream.Collectors;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
 import org.apache.metamodel.membrane.app.exceptions.NoSuchTenantException;
 import org.apache.metamodel.membrane.app.exceptions.TenantAlreadyExistException;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 
 import com.google.common.base.Strings;
 
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryDataSourceRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryDataSourceRegistry.java
similarity index 93%
rename from core/src/main/java/org/apache/metamodel/membrane/app/InMemoryDataSourceRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryDataSourceRegistry.java
index 338ed86..a457ec0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryDataSourceRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryDataSourceRegistry.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.memory;
 
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -26,8 +26,10 @@
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.factory.DataContextProperties;
+import org.apache.metamodel.membrane.app.DataContextSupplier;
 import org.apache.metamodel.membrane.app.exceptions.DataSourceAlreadyExistException;
 import org.apache.metamodel.membrane.app.exceptions.NoSuchDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
 
 public class InMemoryDataSourceRegistry implements DataSourceRegistry {
 
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantContext.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantContext.java
similarity index 84%
rename from core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantContext.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantContext.java
index 3ecb7fe..08b2fa9 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantContext.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantContext.java
@@ -16,7 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.memory;
+
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.cache.CachedDataSourceRegistryWrapper;
 
 public class InMemoryTenantContext implements TenantContext {
 
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantRegistry.java
similarity index 93%
rename from core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantRegistry.java
index 8665819..37586b1 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantRegistry.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.memory;
 
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -25,6 +25,8 @@
 
 import org.apache.metamodel.membrane.app.exceptions.NoSuchTenantException;
 import org.apache.metamodel.membrane.app.exceptions.TenantAlreadyExistException;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
index 5e51a39..a0efb7b 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
@@ -20,8 +20,8 @@
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.apache.metamodel.membrane.swagger.model.GetColumnResponse;
 import org.apache.metamodel.membrane.swagger.model.GetColumnResponseMetadata;
 import org.apache.metamodel.schema.Column;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
index 0dea52e..21fe39f 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
@@ -30,10 +30,10 @@
 import org.apache.metamodel.UpdateableDataContext;
 import org.apache.metamodel.factory.DataContextProperties;
 import org.apache.metamodel.factory.DataContextPropertiesImpl;
-import org.apache.metamodel.membrane.app.DataSourceRegistry;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
 import org.apache.metamodel.membrane.app.exceptions.InvalidDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.apache.metamodel.membrane.controllers.model.RestDataSourceDefinition;
 import org.apache.metamodel.membrane.swagger.model.DeleteDatasourceResponse;
 import org.apache.metamodel.membrane.swagger.model.GetDatasourceResponse;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
index 33a0567..7c8a90c 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
@@ -25,8 +25,8 @@
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.data.DataSet;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.apache.metamodel.membrane.swagger.model.QueryResponse;
 import org.apache.metamodel.query.Query;
 import org.slf4j.Logger;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
index 04d55e1..7be34b9 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
@@ -25,8 +25,8 @@
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.apache.metamodel.membrane.swagger.model.GetSchemaResponse;
 import org.apache.metamodel.membrane.swagger.model.GetSchemaResponseTables;
 import org.apache.metamodel.schema.Schema;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
index af7decf..5da8bb0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
@@ -25,8 +25,8 @@
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.apache.metamodel.membrane.swagger.model.GetTableResponse;
 import org.apache.metamodel.membrane.swagger.model.GetTableResponseColumns;
 import org.apache.metamodel.schema.Table;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
index f31f690..42ed7ab 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
@@ -34,9 +34,9 @@
 import org.apache.metamodel.delete.RowDeletionBuilder;
 import org.apache.metamodel.insert.RowInsertionBuilder;
 import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
 import org.apache.metamodel.membrane.app.config.JacksonConfig;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.apache.metamodel.membrane.swagger.model.Operator;
 import org.apache.metamodel.membrane.swagger.model.PostDataRequest;
 import org.apache.metamodel.membrane.swagger.model.PostDataRequestDelete;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
index e94983b..d4c72e5 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
@@ -24,8 +24,8 @@
 
 import javax.ws.rs.core.UriBuilder;
 
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
 import org.apache.metamodel.membrane.swagger.model.DeleteTenantResponse;
 import org.apache.metamodel.membrane.swagger.model.GetTenantResponse;
 import org.apache.metamodel.membrane.swagger.model.GetTenantResponseDatasources;
diff --git a/core/src/main/resources/context/application-context.xml b/core/src/main/resources/context/application-context.xml
index b5219ce..542d44d 100644
--- a/core/src/main/resources/context/application-context.xml
+++ b/core/src/main/resources/context/application-context.xml
@@ -33,8 +33,14 @@
 	<context:component-scan base-package="org.apache.metamodel.membrane.app" />
 
 	<bean id="tenantRegistry"
-		class="org.apache.metamodel.membrane.app.registry.file.FileBasedTenantRegistry">
-		<constructor-arg name="directory" value="${DATA_DIRECTORY}" />
+		class="org.apache.metamodel.membrane.app.registry.cache.CachedTenantRegistryWrapper">
+		<constructor-arg name="delegate">
+			<bean
+				class="org.apache.metamodel.membrane.app.registry.file.FileBasedTenantRegistry">
+				<constructor-arg name="directory" value="${DATA_DIRECTORY}" />
+			</bean>
+		</constructor-arg>
 	</bean>
 
+
 </beans>
diff --git a/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java b/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java
index 2a7e240..99a16f8 100644
--- a/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java
+++ b/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java
@@ -20,9 +20,9 @@
 
 import static org.junit.Assert.assertEquals;
 
-import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
-import org.apache.metamodel.membrane.app.TenantRegistry;
 import org.apache.metamodel.membrane.app.exceptions.InvalidDataSourceException;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.memory.InMemoryTenantRegistry;
 import org.apache.metamodel.membrane.controllers.model.RestDataSourceDefinition;
 import org.apache.metamodel.membrane.swagger.model.GetDatasourceResponse;
 import org.junit.Assert;
diff --git a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
index 3e0575d..7071548 100644
--- a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
+++ b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
@@ -22,9 +22,9 @@
 
 import java.util.Map;
 
-import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
-import org.apache.metamodel.membrane.app.TenantRegistry;
 import org.apache.metamodel.membrane.app.config.JacksonConfig;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.memory.InMemoryTenantRegistry;
 import org.junit.Before;
 import org.junit.Test;
 import org.springframework.http.MediaType;
diff --git a/postman-tests/Membrane.postman_collection.json b/postman-tests/Membrane.postman_collection.json
index 62e816f..e249ead 100644
--- a/postman-tests/Membrane.postman_collection.json
+++ b/postman-tests/Membrane.postman_collection.json
@@ -2,7 +2,7 @@
 	"variables": [],
 	"info": {
 		"name": "Membrane",
-		"_postman_id": "1265d16a-b1fd-26a4-7ea5-d2e4015df97e",
+		"_postman_id": "fc875392-a36c-6ff7-46fb-53eab9cd3c3e",
 		"description": "",
 		"schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
 	},
@@ -27,7 +27,10 @@
 				"url": "{{baseUrl}}/swagger.json",
 				"method": "GET",
 				"header": [],
-				"body": {},
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
 				"description": ""
 			},
 			"response": []
@@ -43,9 +46,12 @@
 							"tests[\"Status code is 200\"] = responseCode.code === 200;",
 							"",
 							"var jsonData = JSON.parse(responseBody);",
-							"tests[\"type is tenant\"] = jsonData.type === \"tenant\";",
+							"var isTenant = jsonData.type === \"tenant\";",
+							"tests[\"type is tenant\"] = isTenant;",
 							"",
-							"postman.setGlobalVariable(\"membrane_tenant\", jsonData.name);",
+							"if (isTenant) {",
+							"    postman.setGlobalVariable(\"membrane_tenant\", jsonData.name);",
+							"}",
 							""
 						]
 					}
@@ -89,7 +95,10 @@
 				"url": "{{baseUrl}}/{{membrane_tenant}}",
 				"method": "GET",
 				"header": [],
-				"body": {},
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
 				"description": ""
 			},
 			"response": []
@@ -521,7 +530,10 @@
 				"url": "{{baseUrl}}/{{membrane_tenant}}/{{membrane_data_source}}",
 				"method": "DELETE",
 				"header": [],
-				"body": {},
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
 				"description": ""
 			},
 			"response": []