diff --git a/extensions/kDBDatasets/Datasets.cpp b/extensions/kDBDatasets/Datasets.cpp
index cd3f668fefc2b3a15fe949e2a53ce295abebf47b..7354461b3bcd185e4b5d1e370520836aa265eff2 100644
--- a/extensions/kDBDatasets/Datasets.cpp
+++ b/extensions/kDBDatasets/Datasets.cpp
@@ -53,8 +53,7 @@ struct Datasets::Private : public QSharedData
 
   QSharedPointer<Dataset::Private::Definition> createDefinition(const knowCore::Uri& _datasetUri, const knowCore::Uri& _typeUri, const knowGIS::GeometryObject& _geometry);
 
-
-  struct Static
+  struct Cache
   {
     QMutex mutex;
     DatasetsPrivateT datasets_private;
@@ -62,7 +61,18 @@ struct Datasets::Private : public QSharedData
     QList<QUuid> handledConnection;
     void handleConnection(const kDB::Repository::Connection& _connection);
   };
-  static Static s_static;
+  QSharedPointer<Cache> cache = getCache();
+  static QWeakPointer<Cache> s_cache;
+  static QSharedPointer<Cache> getCache()
+  {
+    QSharedPointer<Cache> cache = s_cache;
+    if(not cache)
+    {
+      cache = QSharedPointer<Cache>(new Cache());
+      s_cache = cache;
+    }
+    return cache;
+  }
 };
 
 QSharedPointer<Dataset::Private::Definition> Datasets::Private::createDefinition(const knowCore::Uri& _datasetUri, const knowCore::Uri& _typeUri, const knowGIS::GeometryObject& _geometry)
@@ -74,15 +84,15 @@ QSharedPointer<Dataset::Private::Definition> Datasets::Private::createDefinition
   ds_def->serverUuid  = connection.serverUuid();
 
   {
-    QMutexLocker l(&Private::s_static.mutex);
-    Private::s_static.definitions[connection.connectionUuid()][_datasetUri] = ds_def;
+    QMutexLocker l(&cache->mutex);
+    cache->definitions[connection.connectionUuid()][_datasetUri] = ds_def;
   }
   return ds_def;
 }
 
-Datasets::Private::Static Datasets::Private::s_static;
+QWeakPointer<Datasets::Private::Cache> Datasets::Private::s_cache;
 
-void Datasets::Private::Static::handleConnection(const kDB::Repository::Connection& _connection)
+void Datasets::Private::Cache::handleConnection(const kDB::Repository::Connection& _connection)
 {
   QUuid cuuid = _connection.connectionUuid();
   if(not handledConnection.contains(cuuid))
@@ -90,23 +100,30 @@ void Datasets::Private::Static::handleConnection(const kDB::Repository::Connecti
     handledConnection.append(cuuid);
     _connection.executeDisconnection([cuuid]()
     {
-      s_static.definitions.remove(cuuid);
+      QSharedPointer<Private::Cache> cache = Private::getCache();
+      QMutexLocker l(&cache->mutex);
+      cache->definitions.remove(cuuid);
     });
   }
 }
 
 void Datasets::clearCache()
 {
-  QMutexLocker l(&Private::s_static.mutex);
-  Private::s_static.datasets_private.clear();
-  Private::s_static.definitions.clear();
+  QSharedPointer<Private::Cache> cache = Private::getCache();
+  if(cache)
+  {
+    QMutexLocker l(&cache->mutex);
+    cache->datasets_private.clear();
+    cache->definitions.clear();
+  }
 }
 
 knowCore::ReturnValue<Datasets> Datasets::get(const kDB::Repository::Connection& _connection, const knowCore::Uri& _graph)
 {
-  QMutexLocker l(&Private::s_static.mutex);
-  Private::s_static.handleConnection(_connection);
-  Private::Uri2Private& u2p = Private::s_static.datasets_private[_connection.connectionUuid()];
+  QSharedPointer<Private::Cache> cache = Private::getCache();
+  QMutexLocker l(&cache->mutex);
+  cache->handleConnection(_connection);
+  Private::Uri2Private& u2p = cache->datasets_private[_connection.connectionUuid()];
   if(u2p.contains(_graph))
   {
     QExplicitlySharedDataPointer<Private> d(new Private);
@@ -143,8 +160,9 @@ knowCore::ReturnValue<Datasets> Datasets::get(const kDB::Repository::Connection&
 knowCore::ReturnValue<Datasets> Datasets::create(const kDB::Repository::Connection& _connection, const knowCore::Uri& _graph)
 {
   if(get(_connection, _graph).success()) return kCrvError("Cannot create datasets with name {}, it already exits.", _graph);
-  QMutexLocker l(&Private::s_static.mutex);
-  Private::s_static.handleConnection(_connection);
+  QSharedPointer<Private::Cache> cache = Private::getCache();
+  QMutexLocker l(&cache->mutex);
+  cache->handleConnection(_connection);
   if(_connection.graphsManager()->hasTripleStore(_graph))
   {
     return kCrvLogError("Cannot create triple store for datasets '{0}', '{0}' is already used for a different purpose", _graph);
@@ -158,7 +176,7 @@ knowCore::ReturnValue<Datasets> Datasets::create(const kDB::Repository::Connecti
   QExplicitlySharedDataPointer<Private> d(new Private);
   d->definition = def;
   d->connection = _connection;
-  Private::s_static.datasets_private[_connection.connectionUuid()][_graph] = def;
+  cache->datasets_private[_connection.connectionUuid()][_graph] = def;
   return kCrvSuccess(Datasets(d));
 }
 
@@ -171,11 +189,12 @@ knowCore::ReturnValue<Datasets> Datasets::getOrCreate(const kDB::Repository::Con
 
 Datasets Datasets::allDatasets(const kDB::Repository::Connection& _connection)
 {
-  QMutexLocker l(&Private::s_static.mutex);
+  QSharedPointer<Private::Cache> cache = Private::getCache();
+  QMutexLocker l(&cache->mutex);
   // Make sure the union is created
-  Private::s_static.handleConnection(_connection);
+  cache->handleConnection(_connection);
   _connection.graphsManager()->getUnion(knowCore::Uris::askcore_graphs::all_datasets);
-  Private::Uri2Private& u2p = Private::s_static.datasets_private[_connection.connectionUuid()];
+  Private::Uri2Private& u2p = cache->datasets_private[_connection.connectionUuid()];
   if(u2p.contains(knowCore::Uris::askcore_graphs::all_datasets))
   {
     QExplicitlySharedDataPointer<Private> d(new Private);
@@ -271,8 +290,8 @@ knowCore::ReturnValue<Dataset> Datasets::dataset(const knowCore::Uri& _datasetUr
 {
   QSharedPointer<Dataset::Private::Definition> ds_def;
   {
-    QMutexLocker l(&Private::s_static.mutex);
-    ds_def = Private::s_static.definitions.value(d->connection.connectionUuid()).value(_datasetUri);
+    QMutexLocker l(&d->cache->mutex);
+    ds_def = d->cache->definitions.value(d->connection.connectionUuid()).value(_datasetUri);
   }
   // If the definition is not available, check in the database
   if(not ds_def)
@@ -330,11 +349,11 @@ QList<Dataset> Datasets::all() const
   {
     for(const Queries::DatasetsSelectAll::Result& result : r.data)
     {
-      QMutexLocker l(&Private::s_static.mutex);
+      QMutexLocker l(&d->cache->mutex);
       Dataset ds;
       ds.d = new Dataset::Private;
       ds.d->connection  = d->connection;
-      QSharedPointer<Dataset::Private::Definition> ds_def = Private::s_static.definitions.value(d->connection.connectionUuid()).value(result.uri());
+      QSharedPointer<Dataset::Private::Definition> ds_def = d->cache->definitions.value(d->connection.connectionUuid()).value(result.uri());
       if(not ds_def)
       {
         l.unlock();
@@ -424,8 +443,8 @@ knowCore::ReturnValue<QList<Dataset>> Datasets::datasets(const QList<QPair<knowC
 
       QSharedPointer<Dataset::Private::Definition> ds_def;
       {
-        QMutexLocker l(&Private::s_static.mutex);
-        ds_def = Private::s_static.definitions.value(d->connection.connectionUuid()).value(ds_uri);
+        QMutexLocker l(&d->cache->mutex);
+        ds_def = d->cache->definitions.value(d->connection.connectionUuid()).value(ds_uri);
       }
       if(not ds_def)
       {
@@ -443,8 +462,8 @@ knowCore::ReturnValue<QList<Dataset>> Datasets::datasets(const QList<QPair<knowC
         ds_def->serverUuid  = d->connection.serverUuid();
 
         {
-          QMutexLocker l(&Private::s_static.mutex);
-          Private::s_static.definitions[d->connection.connectionUuid()][ds_uri] = ds_def;
+          QMutexLocker l(&d->cache->mutex);
+          d->cache->definitions[d->connection.connectionUuid()][ds_uri] = ds_def;
         }
       } else {
         // If the definition is available, make sure the graphs list is up to date