You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2024/06/27 19:06:41 UTC

(streampipes) branch cleanup-persistence-layer-2 created (now be771e6c56)

This is an automated email from the ASF dual-hosted git repository.

riemer pushed a change to branch cleanup-persistence-layer-2
in repository https://gitbox.apache.org/repos/asf/streampipes.git


      at be771e6c56 chore: Cleanup persistence layer

This branch includes the following new commits:

     new be771e6c56 chore: Cleanup persistence layer

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(streampipes) 01/01: chore: Cleanup persistence layer

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch cleanup-persistence-layer-2
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit be771e6c5600f226ce359bd12eaa9985a25e1e0a
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Thu Jun 27 21:06:26 2024 +0200

    chore: Cleanup persistence layer
---
 .../dataexplorer/DataExplorerSchemaManagement.java |  4 +-
 .../DataExplorerSchemaManagementTest.java          |  2 +-
 .../streampipes/export/resolver/FileResolver.java  |  4 +-
 .../assetdashboard/AssetDashboardConfig.java       | 14 +++-
 .../model/client/user/AbstractMailToken.java       | 14 +++-
 .../streampipes/model/client/user/Group.java       | 13 +++-
 .../model/client/user/PasswordRecoveryToken.java   | 14 ++--
 .../model/client/user/UserActivationToken.java     | 14 ++--
 .../streampipes/model/shared}/api/Storable.java    |  2 +-
 .../model/base/NamedStreamPipesEntity.java         |  2 +-
 .../model/dashboard/DashboardEntity.java           |  2 +-
 .../model/dashboard/DashboardModel.java            |  2 +-
 .../model/datalake/DataLakeMeasure.java            |  2 +-
 .../configuration/SpServiceConfiguration.java      | 13 +++-
 .../svcdiscovery/SpServiceRegistration.java        | 13 +++-
 .../streampipes/model/file/FileMetadata.java       | 13 +++-
 .../model/template/PipelineElementTemplate.java    |  2 +-
 .../streampipes/manager/file/FileManager.java      | 14 ++--
 .../manager/health/ServiceRegistrationManager.java |  4 +-
 .../streampipes/manager/file/TestFileManager.java  | 22 +++---
 .../AbstractDashboardResourceManager.java          |  4 +-
 .../AbstractPipelineElementResourceManager.java    |  2 +-
 .../resource/management/UserResourceManager.java   |  9 ++-
 .../rest/impl/AccountActivationResource.java       |  1 -
 .../rest/impl/AssetDashboardResource.java          | 16 ++---
 .../rest/impl/admin/MigrationResource.java         |  2 +-
 .../impl/admin/ServiceConfigurationResource.java   |  2 +-
 .../impl/admin/ServiceRegistrationResource.java    |  2 +-
 .../rest/impl/admin/UserGroupResource.java         |  4 +-
 .../rest/impl/dashboard/DashboardWidget.java       |  2 +-
 .../rest/impl/datalake/DataLakeWidgetResource.java |  2 +-
 ...MergeFilenamesAndRenameDuplicatesMigration.java | 18 ++---
 .../svcdiscovery/SpServiceDiscoveryCore.java       |  2 +-
 .../streampipes/storage/api/CRUDStorage.java       | 14 ++--
 .../streampipes/storage/api/IAdapterStorage.java   |  2 +-
 .../storage/api/IAssetDashboardStorage.java        | 35 ---------
 .../storage/api/IDataProcessorStorage.java         |  2 +-
 .../streampipes/storage/api/IDataSinkStorage.java  |  2 +-
 .../storage/api/IDataStreamStorage.java            |  2 +-
 .../streampipes/storage/api/INoSqlStorage.java     | 29 ++++----
 .../storage/api/IPasswordRecoveryTokenStorage.java | 25 -------
 .../api/IPipelineCanvasMetadataStorage.java        |  2 +-
 .../api/IPipelineElementTemplateStorage.java       |  2 +-
 .../storage/api/IUserActivationTokenStorage.java   | 23 ------
 .../streampipes/storage/api/IUserGroupStorage.java | 23 ------
 .../storage/couchdb/CouchDbStorageManager.java     | 82 +++++++++++++---------
 .../couchdb/impl/AssetDashboardStorageImpl.java    | 57 ---------------
 .../storage/couchdb/impl/DefaultCrudStorage.java   |  6 +-
 .../couchdb/impl/DefaultViewCrudStorage.java       | 27 ++++---
 .../impl/ExtensionsServiceConfigStorageImpl.java   | 48 -------------
 .../couchdb/impl/ExtensionsServiceStorageImpl.java | 48 -------------
 .../couchdb/impl/FileMetadataStorageImpl.java      | 68 ------------------
 .../couchdb/impl/PasswordRecoveryTokenImpl.java    | 57 ---------------
 .../couchdb/impl/UserActivationTokenImpl.java      | 55 ---------------
 .../storage/couchdb/impl/UserGroupStorageImpl.java | 55 ---------------
 .../streampipes/storage/couchdb/utils/Utils.java   |  8 ---
 56 files changed, 254 insertions(+), 654 deletions(-)

diff --git a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java
index d6cac01c7d..ef3db4c7d3 100644
--- a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java
+++ b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagement.java
@@ -34,9 +34,9 @@ import java.util.stream.Stream;
 
 public class DataExplorerSchemaManagement implements IDataExplorerSchemaManagement {
 
-  CRUDStorage<String, DataLakeMeasure> dataLakeStorage;
+  CRUDStorage<DataLakeMeasure> dataLakeStorage;
 
-  public DataExplorerSchemaManagement(CRUDStorage<String, DataLakeMeasure> dataLakeStorage) {
+  public DataExplorerSchemaManagement(CRUDStorage<DataLakeMeasure> dataLakeStorage) {
     this.dataLakeStorage = dataLakeStorage;
   }
 
diff --git a/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java b/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java
index 6c76d31c40..4dc34531ce 100644
--- a/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java
+++ b/streampipes-data-explorer/src/test/java/org/apache/streampipes/dataexplorer/DataExplorerSchemaManagementTest.java
@@ -46,7 +46,7 @@ public class DataExplorerSchemaManagementTest {
   public static final String NEW_PROPERTY = "newProperty";
   public static final String OLD_PROPERTY = "oldProperty";
 
-  private CRUDStorage<String, DataLakeMeasure> dataLakeStorageMock;
+  private CRUDStorage<DataLakeMeasure> dataLakeStorageMock;
 
   @BeforeEach
   public void setUp() {
diff --git a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/FileResolver.java b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/FileResolver.java
index d30d66936a..ab0179d8f1 100644
--- a/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/FileResolver.java
+++ b/streampipes-data-export/src/main/java/org/apache/streampipes/export/resolver/FileResolver.java
@@ -28,7 +28,7 @@ public class FileResolver extends AbstractResolver<FileMetadata> {
 
   @Override
   public FileMetadata findDocument(String resourceId) {
-    return getNoSqlStore().getFileMetadataStorage().getMetadataById(resourceId);
+    return getNoSqlStore().getFileMetadataStorage().getElementById(resourceId);
   }
 
   @Override
@@ -49,7 +49,7 @@ public class FileResolver extends AbstractResolver<FileMetadata> {
 
   @Override
   public void writeDocument(String document) throws JsonProcessingException {
-    getNoSqlStore().getFileMetadataStorage().addFileMetadata(deserializeDocument(document));
+    getNoSqlStore().getFileMetadataStorage().persist(deserializeDocument(document));
   }
 
   @Override
diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/assetdashboard/AssetDashboardConfig.java b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/assetdashboard/AssetDashboardConfig.java
index d8956e577c..9d162c9595 100644
--- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/assetdashboard/AssetDashboardConfig.java
+++ b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/assetdashboard/AssetDashboardConfig.java
@@ -17,12 +17,14 @@
  */
 package org.apache.streampipes.model.client.assetdashboard;
 
+import org.apache.streampipes.model.shared.api.Storable;
+
 import com.google.gson.annotations.SerializedName;
 
 import java.util.List;
 import java.util.Map;
 
-public class AssetDashboardConfig {
+public class AssetDashboardConfig implements Storable {
 
   private @SerializedName("_id") String dashboardId;
   private @SerializedName("_rev") String rev;
@@ -100,4 +102,14 @@ public class AssetDashboardConfig {
   public void setRev(String rev) {
     this.rev = rev;
   }
+
+  @Override
+  public String getElementId() {
+    return this.dashboardId;
+  }
+
+  @Override
+  public void setElementId(String elementId) {
+    this.dashboardId = elementId;
+  }
 }
diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/AbstractMailToken.java b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/AbstractMailToken.java
index 372ad5de98..0434031dc0 100644
--- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/AbstractMailToken.java
+++ b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/AbstractMailToken.java
@@ -17,9 +17,11 @@
  */
 package org.apache.streampipes.model.client.user;
 
+import org.apache.streampipes.model.shared.api.Storable;
+
 import com.google.gson.annotations.SerializedName;
 
-public abstract class AbstractMailToken {
+public abstract class AbstractMailToken implements Storable {
 
   protected @SerializedName("_id") String token;
   protected @SerializedName("_rev") String rev;
@@ -49,4 +51,14 @@ public abstract class AbstractMailToken {
   public void setUsername(String username) {
     this.username = username;
   }
+
+  @Override
+  public String getElementId() {
+    return this.token;
+  }
+
+  @Override
+  public void setElementId(String elementId) {
+    this.token = elementId;
+  }
 }
diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/Group.java b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/Group.java
index 8829add8a3..3737c1490e 100644
--- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/Group.java
+++ b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/Group.java
@@ -18,6 +18,7 @@
 package org.apache.streampipes.model.client.user;
 
 import org.apache.streampipes.model.shared.annotation.TsModel;
+import org.apache.streampipes.model.shared.api.Storable;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.gson.annotations.SerializedName;
@@ -26,7 +27,7 @@ import java.util.HashSet;
 import java.util.Set;
 
 @TsModel
-public class Group {
+public class Group implements Storable {
 
   protected @SerializedName("_id") String groupId;
   protected @SerializedName("_rev") String rev;
@@ -60,6 +61,16 @@ public class Group {
     this.rev = rev;
   }
 
+  @Override
+  public String getElementId() {
+    return this.groupId;
+  }
+
+  @Override
+  public void setElementId(String elementId) {
+    this.groupId = elementId;
+  }
+
   public String getGroupName() {
     return groupName;
   }
diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PasswordRecoveryToken.java b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PasswordRecoveryToken.java
index cb8ae692ea..785f0fb550 100644
--- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PasswordRecoveryToken.java
+++ b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/PasswordRecoveryToken.java
@@ -21,8 +21,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 
 public class PasswordRecoveryToken extends AbstractMailToken {
 
+  // This field should be called $type since this is the identifier used in the CouchDB view
+  @SuppressWarnings("checkstyle:MemberName")
   @JsonIgnore
-  private String type = "password-recovery";
+  private String $type = "password-recovery";
 
   public PasswordRecoveryToken() {
 
@@ -36,11 +38,13 @@ public class PasswordRecoveryToken extends AbstractMailToken {
     return passwordRecoveryToken;
   }
 
-  public String getType() {
-    return type;
+  @SuppressWarnings("checkstyle:MethodName")
+  public String get$type() {
+    return $type;
   }
 
-  public void setType(String type) {
-    this.type = type;
+  @SuppressWarnings({"checkstyle:MethodName", "checkstyle:ParameterName"})
+  public void set$type(String $type) {
+    this.$type = $type;
   }
 }
diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/UserActivationToken.java b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/UserActivationToken.java
index 1fe6ab0288..9d41f01a8e 100644
--- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/UserActivationToken.java
+++ b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/UserActivationToken.java
@@ -21,8 +21,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 
 public class UserActivationToken extends AbstractMailToken {
 
+  // This field should be called $type since this is the identifier used in the CouchDB view
+  @SuppressWarnings("checkstyle:MemberName")
   @JsonIgnore
-  private String type = "user-activation";
+  private String $type = "user-activation";
 
   public UserActivationToken() {
   }
@@ -35,11 +37,13 @@ public class UserActivationToken extends AbstractMailToken {
     return userActivationToken;
   }
 
-  public String getType() {
-    return type;
+  @SuppressWarnings("checkstyle:MethodName")
+  public String get$type() {
+    return $type;
   }
 
-  public void setType(String type) {
-    this.type = type;
+  @SuppressWarnings({"checkstyle:MethodName", "checkstyle:ParameterName"})
+  public void set$type(String $type) {
+    this.$type = $type;
   }
 }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/api/Storable.java b/streampipes-model-shared/src/main/java/org/apache/streampipes/model/shared/api/Storable.java
similarity index 95%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/api/Storable.java
rename to streampipes-model-shared/src/main/java/org/apache/streampipes/model/shared/api/Storable.java
index a9081f000d..1e7e4d4af1 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/api/Storable.java
+++ b/streampipes-model-shared/src/main/java/org/apache/streampipes/model/shared/api/Storable.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.model.api;
+package org.apache.streampipes.model.shared.api;
 
 public interface Storable {
 
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java
index 46806a68a8..a49700845a 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java
@@ -20,7 +20,7 @@ package org.apache.streampipes.model.base;
 
 
 import org.apache.streampipes.model.SpDataStream;
-import org.apache.streampipes.model.api.Storable;
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.model.extensions.ExtensionAssetType;
 import org.apache.streampipes.model.extensions.ExtensionItemDescription;
 import org.apache.streampipes.model.shared.annotation.TsModel;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java
index 0b53f974a5..f69631ccfb 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java
@@ -18,7 +18,7 @@
 
 package org.apache.streampipes.model.dashboard;
 
-import org.apache.streampipes.model.api.Storable;
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
 
 import com.fasterxml.jackson.annotation.JsonAlias;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java
index 9cd6e11365..478fbafcef 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardModel.java
@@ -18,7 +18,7 @@
 
 package org.apache.streampipes.model.dashboard;
 
-import org.apache.streampipes.model.api.Storable;
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.model.shared.annotation.TsModel;
 
 import com.fasterxml.jackson.annotation.JsonAlias;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataLakeMeasure.java b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataLakeMeasure.java
index 92a3c881df..5026631654 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataLakeMeasure.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataLakeMeasure.java
@@ -18,7 +18,7 @@
 
 package org.apache.streampipes.model.datalake;
 
-import org.apache.streampipes.model.api.Storable;
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.model.schema.EventSchema;
 import org.apache.streampipes.model.shared.annotation.TsIgnore;
 import org.apache.streampipes.model.shared.annotation.TsModel;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/configuration/SpServiceConfiguration.java b/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/configuration/SpServiceConfiguration.java
index 9cc4319d9a..268eb04cd9 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/configuration/SpServiceConfiguration.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/configuration/SpServiceConfiguration.java
@@ -19,13 +19,14 @@
 package org.apache.streampipes.model.extensions.configuration;
 
 import org.apache.streampipes.model.shared.annotation.TsModel;
+import org.apache.streampipes.model.shared.api.Storable;
 
 import com.google.gson.annotations.SerializedName;
 
 import java.util.List;
 
 @TsModel
-public class SpServiceConfiguration {
+public class SpServiceConfiguration implements Storable {
 
   protected @SerializedName("_rev") String rev;
   private @SerializedName("_id") String serviceGroup;
@@ -75,4 +76,14 @@ public class SpServiceConfiguration {
   public void setRev(String rev) {
     this.rev = rev;
   }
+
+  @Override
+  public String getElementId() {
+    return this.serviceGroup;
+  }
+
+  @Override
+  public void setElementId(String elementId) {
+    this.serviceGroup = elementId;
+  }
 }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/svcdiscovery/SpServiceRegistration.java b/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/svcdiscovery/SpServiceRegistration.java
index fc01712a8c..f3fdf01db5 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/svcdiscovery/SpServiceRegistration.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/extensions/svcdiscovery/SpServiceRegistration.java
@@ -17,6 +17,7 @@
  */
 package org.apache.streampipes.model.extensions.svcdiscovery;
 
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.model.extensions.ExtensionItemDescription;
 import org.apache.streampipes.model.shared.annotation.TsModel;
 
@@ -25,7 +26,7 @@ import com.google.gson.annotations.SerializedName;
 import java.util.Set;
 
 @TsModel
-public class SpServiceRegistration {
+public class SpServiceRegistration implements Storable {
 
   private String svcType;
   private String svcGroup;
@@ -130,6 +131,16 @@ public class SpServiceRegistration {
     this.rev = rev;
   }
 
+  @Override
+  public String getElementId() {
+    return this.svcId;
+  }
+
+  @Override
+  public void setElementId(String elementId) {
+    this.svcId = elementId;
+  }
+
   public String getScheme() {
     return scheme;
   }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/file/FileMetadata.java b/streampipes-model/src/main/java/org/apache/streampipes/model/file/FileMetadata.java
index 4696179903..703722b98a 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/file/FileMetadata.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/file/FileMetadata.java
@@ -17,12 +17,13 @@
  */
 package org.apache.streampipes.model.file;
 
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.model.shared.annotation.TsModel;
 
 import com.google.gson.annotations.SerializedName;
 
 @TsModel
-public class FileMetadata {
+public class FileMetadata implements Storable {
 
   private @SerializedName("_id") String fileId;
 
@@ -52,6 +53,16 @@ public class FileMetadata {
     this.rev = rev;
   }
 
+  @Override
+  public String getElementId() {
+    return this.fileId;
+  }
+
+  @Override
+  public void setElementId(String elementId) {
+    this.fileId = elementId;
+  }
+
   public String getFilename() {
     return filename;
   }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplate.java b/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplate.java
index f7ce37808c..a17a0b0351 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplate.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplate.java
@@ -17,7 +17,7 @@
  */
 package org.apache.streampipes.model.template;
 
-import org.apache.streampipes.model.api.Storable;
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.model.shared.annotation.TsModel;
 
 import com.fasterxml.jackson.annotation.JsonAlias;
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileManager.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileManager.java
index 84bb7f47b7..a5a515669c 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileManager.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/file/FileManager.java
@@ -20,7 +20,7 @@ package org.apache.streampipes.manager.file;
 import org.apache.streampipes.commons.file.FileHasher;
 import org.apache.streampipes.model.file.FileMetadata;
 import org.apache.streampipes.sdk.helpers.Filetypes;
-import org.apache.streampipes.storage.api.IFileMetadataStorage;
+import org.apache.streampipes.storage.api.CRUDStorage;
 import org.apache.streampipes.storage.management.StorageDispatcher;
 
 import org.apache.commons.io.input.BOMInputStream;
@@ -34,11 +34,11 @@ import java.util.stream.Collectors;
 
 public class FileManager {
 
-  private final IFileMetadataStorage fileMetadataStorage;
+  private final CRUDStorage<FileMetadata> fileMetadataStorage;
   private final FileHandler fileHandler;
   private final FileHasher fileHasher;
 
-  public FileManager(IFileMetadataStorage fileMetadataStorage,
+  public FileManager(CRUDStorage<FileMetadata> fileMetadataStorage,
                      FileHandler fileHandler,
                      FileHasher fileHasher) {
     this.fileMetadataStorage = fileMetadataStorage;
@@ -60,7 +60,7 @@ public class FileManager {
   }
 
   public List<FileMetadata> getAllFiles(String filetypes) {
-    List<FileMetadata> allFiles = fileMetadataStorage.getAllFileMetadataDescriptions();
+    List<FileMetadata> allFiles = fileMetadataStorage.findAll();
     return filetypes != null ? filterFiletypes(allFiles, filetypes) : allFiles;
   }
 
@@ -94,10 +94,10 @@ public class FileManager {
 
 
   public void deleteFile(String id) {
-    var fileMetadata = fileMetadataStorage.getMetadataById(id);
+    var fileMetadata = fileMetadataStorage.getElementById(id);
     if (fileMetadata != null) {
       fileHandler.deleteFile(fileMetadata.getFilename());
-      fileMetadataStorage.deleteFileMetadata(id);
+      fileMetadataStorage.deleteElementById(id);
     }
   }
 
@@ -168,7 +168,7 @@ public class FileManager {
   }
 
   private void storeFileMetadata(FileMetadata fileMetadata) {
-    fileMetadataStorage.addFileMetadata(fileMetadata);
+    fileMetadataStorage.persist(fileMetadata);
   }
 
 
diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/health/ServiceRegistrationManager.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/health/ServiceRegistrationManager.java
index e4654c3710..b12cefa6d0 100644
--- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/health/ServiceRegistrationManager.java
+++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/health/ServiceRegistrationManager.java
@@ -31,9 +31,9 @@ public class ServiceRegistrationManager {
 
   private static final Logger LOG = LoggerFactory.getLogger(ServiceRegistrationManager.class);
 
-  private final CRUDStorage<String, SpServiceRegistration> storage;
+  private final CRUDStorage<SpServiceRegistration> storage;
 
-  public ServiceRegistrationManager(CRUDStorage<String, SpServiceRegistration> storage) {
+  public ServiceRegistrationManager(CRUDStorage<SpServiceRegistration> storage) {
     this.storage = storage;
   }
 
diff --git a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/file/TestFileManager.java b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/file/TestFileManager.java
index da62437bc6..b551fd8b80 100644
--- a/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/file/TestFileManager.java
+++ b/streampipes-pipeline-management/src/test/java/org/apache/streampipes/manager/file/TestFileManager.java
@@ -19,7 +19,7 @@ package org.apache.streampipes.manager.file;
 
 import org.apache.streampipes.commons.file.FileHasher;
 import org.apache.streampipes.model.file.FileMetadata;
-import org.apache.streampipes.storage.api.IFileMetadataStorage;
+import org.apache.streampipes.storage.api.CRUDStorage;
 
 import org.apache.commons.io.IOUtils;
 import org.junit.jupiter.api.BeforeEach;
@@ -50,7 +50,7 @@ import static org.mockito.Mockito.when;
 public class TestFileManager {
 
   private FileManager fileManager;
-  private IFileMetadataStorage fileMetadataStorage;
+  private CRUDStorage<String, FileMetadata> fileMetadataStorage;
   private FileHandler fileHandler;
   private FileHasher fileHasher;
 
@@ -59,7 +59,7 @@ public class TestFileManager {
 
   @BeforeEach
   public void setup() {
-    fileMetadataStorage = mock(IFileMetadataStorage.class);
+    fileMetadataStorage = mock(CRUDStorage.class);
     fileHandler = mock(FileHandler.class);
     fileHasher = mock(FileHasher.class);
     fileManager = new FileManager(fileMetadataStorage, fileHandler, fileHasher);
@@ -104,7 +104,7 @@ public class TestFileManager {
 
   private List<FileMetadata> prepareFileMetadataStorageWithTwoSampleFiles() {
     List<FileMetadata> allFiles = Arrays.asList(createFileMetadata("csv"), createFileMetadata("json"));
-    when(fileMetadataStorage.getAllFileMetadataDescriptions()).thenReturn(allFiles);
+    when(fileMetadataStorage.findAll()).thenReturn(allFiles);
 
     return allFiles;
   }
@@ -152,7 +152,7 @@ public class TestFileManager {
     assertEquals(filename, fileMetadata.getFilename());
     assertEquals("csv", fileMetadata.getFiletype());
     verify(fileHandler, times(1)).storeFile(eq(filename), any(InputStream.class));
-    verify(fileMetadataStorage, times(1)).addFileMetadata(any(FileMetadata.class));
+    verify(fileMetadataStorage, times(1)).persist(any(FileMetadata.class));
   }
 
   @Test
@@ -164,7 +164,7 @@ public class TestFileManager {
 
     assertEquals(expectedSanitizedFilename, fileMetadata.getFilename());
     verify(fileHandler, times(1)).storeFile(eq(expectedSanitizedFilename), any(InputStream.class));
-    verify(fileMetadataStorage, times(1)).addFileMetadata(any(FileMetadata.class));
+    verify(fileMetadataStorage, times(1)).persist(any(FileMetadata.class));
   }
 
   /**
@@ -197,24 +197,24 @@ public class TestFileManager {
     var fileMetadata = new FileMetadata();
     fileMetadata.setFilename("existingFile.txt");
 
-    when(fileMetadataStorage.getMetadataById(id)).thenReturn(fileMetadata);
+    when(fileMetadataStorage.getElementById(id)).thenReturn(fileMetadata);
 
     fileManager.deleteFile(id);
 
     verify(fileHandler, times(1)).deleteFile(fileMetadata.getFilename());
-    verify(fileMetadataStorage, times(1)).deleteFileMetadata(id);
+    verify(fileMetadataStorage, times(1)).deleteElementById(id);
   }
 
   @Test
   public void deleteFile_doesNothingForNonExistingFile() {
     var id = "nonExistingFileId";
 
-    when(fileMetadataStorage.getMetadataById(id)).thenReturn(null);
+    when(fileMetadataStorage.getElementById(id)).thenReturn(null);
 
     fileManager.deleteFile(id);
 
     verify(fileHandler, times(0)).deleteFile(anyString());
-    verify(fileMetadataStorage, times(0)).deleteFileMetadata(id);
+    verify(fileMetadataStorage, times(0)).deleteElementById(id);
   }
 
   @Test
@@ -335,4 +335,4 @@ public class TestFileManager {
     assertFalse(result);
   }
 
-}
\ No newline at end of file
+}
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractDashboardResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractDashboardResourceManager.java
index 67a0b479ee..3c1a125b7d 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractDashboardResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractDashboardResourceManager.java
@@ -25,9 +25,9 @@ import org.apache.streampipes.storage.api.CRUDStorage;
 import java.util.List;
 
 public abstract class AbstractDashboardResourceManager
-    extends AbstractResourceManager<CRUDStorage<String, DashboardModel>> {
+    extends AbstractResourceManager<CRUDStorage<DashboardModel>> {
 
-  public AbstractDashboardResourceManager(CRUDStorage<String, DashboardModel> db) {
+  public AbstractDashboardResourceManager(CRUDStorage<DashboardModel> db) {
     super(db);
   }
 
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
index a36c00e4ce..a241230237 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/AbstractPipelineElementResourceManager.java
@@ -26,7 +26,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-public abstract class AbstractPipelineElementResourceManager<T extends CRUDStorage<String, W>,
+public abstract class AbstractPipelineElementResourceManager<T extends CRUDStorage<W>,
     W extends NamedStreamPipesEntity, X> extends AbstractResourceManager<T> {
 
   public AbstractPipelineElementResourceManager(T db) {
diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java
index 9c9661247b..e9e1630be9 100644
--- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java
+++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java
@@ -30,8 +30,7 @@ import org.apache.streampipes.model.client.user.Role;
 import org.apache.streampipes.model.client.user.UserAccount;
 import org.apache.streampipes.model.client.user.UserActivationToken;
 import org.apache.streampipes.model.client.user.UserRegistrationData;
-import org.apache.streampipes.storage.api.IPasswordRecoveryTokenStorage;
-import org.apache.streampipes.storage.api.IUserActivationTokenStorage;
+import org.apache.streampipes.storage.api.CRUDStorage;
 import org.apache.streampipes.storage.api.IUserStorage;
 import org.apache.streampipes.storage.couchdb.CouchDbStorageManager;
 import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -157,7 +156,7 @@ public class UserResourceManager extends AbstractResourceManager<IUserStorage> {
   }
 
   public void checkPasswordRecoveryCode(String recoveryCode) {
-    IPasswordRecoveryTokenStorage tokenStorage = getPasswordRecoveryTokenStorage();
+    var tokenStorage = getPasswordRecoveryTokenStorage();
     PasswordRecoveryToken token = tokenStorage.getElementById(recoveryCode);
     if (token == null) {
       throw new IllegalArgumentException("Invalid recovery code");
@@ -182,11 +181,11 @@ public class UserResourceManager extends AbstractResourceManager<IUserStorage> {
     getPasswordRecoveryTokenStorage().persist(PasswordRecoveryToken.create(recoveryCode, username));
   }
 
-  private IPasswordRecoveryTokenStorage getPasswordRecoveryTokenStorage() {
+  private CRUDStorage<PasswordRecoveryToken> getPasswordRecoveryTokenStorage() {
     return StorageDispatcher.INSTANCE.getNoSqlStore().getPasswordRecoveryTokenStorage();
   }
 
-  private IUserActivationTokenStorage getUserActivationTokenStorage() {
+  private CRUDStorage<UserActivationToken> getUserActivationTokenStorage() {
     return StorageDispatcher.INSTANCE.getNoSqlStore().getUserActivationTokenStorage();
   }
 
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java
index ee54e7bcc6..d53a4d662d 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AccountActivationResource.java
@@ -35,7 +35,6 @@ public class AccountActivationResource extends AbstractAuthGuardedRestResource {
 
   @GetMapping(
       path = "{recoveryCode}",
-      consumes = MediaType.APPLICATION_JSON_VALUE,
       produces = MediaType.APPLICATION_JSON_VALUE)
   public ResponseEntity<Void> activateUserAccount(@PathVariable("recoveryCode") String recoveryCode) {
     try {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboardResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboardResource.java
index 4687f7c962..ed64308423 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboardResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboardResource.java
@@ -21,7 +21,7 @@ import org.apache.streampipes.manager.file.FileManager;
 import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
 import org.apache.streampipes.rest.core.base.impl.AbstractRestResource;
 import org.apache.streampipes.rest.shared.exception.SpMessageException;
-import org.apache.streampipes.storage.api.IAssetDashboardStorage;
+import org.apache.streampipes.storage.api.CRUDStorage;
 import org.apache.streampipes.storage.management.StorageDispatcher;
 
 import org.apache.commons.io.FileUtils;
@@ -63,7 +63,7 @@ public class AssetDashboardResource extends AbstractRestResource {
   @GetMapping(path = "/{dashboardId}", produces = MediaType.APPLICATION_JSON_VALUE)
   public ResponseEntity<AssetDashboardConfig> getAssetDashboard(@PathVariable("dashboardId") String dashboardId) {
     return ok(getNoSqlStorage().getAssetDashboardStorage()
-                               .getAssetDashboard(dashboardId));
+                               .getElementById(dashboardId));
   }
 
   @PutMapping(
@@ -74,17 +74,17 @@ public class AssetDashboardResource extends AbstractRestResource {
       @PathVariable("dashboardId") String dashboardId,
       @RequestBody AssetDashboardConfig dashboardConfig
   ) {
-    AssetDashboardConfig dashboard = getAssetDashboardStorage().getAssetDashboard(dashboardId);
+    AssetDashboardConfig dashboard = getAssetDashboardStorage().getElementById(dashboardId);
     dashboardConfig.setRev(dashboard.getRev());
     getNoSqlStorage().getAssetDashboardStorage()
-                     .updateAssetDashboard(dashboardConfig);
+                     .updateElement(dashboardConfig);
     return ok();
   }
 
   @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
   public ResponseEntity<List<AssetDashboardConfig>> getAllDashboards() {
     return ok(getNoSqlStorage().getAssetDashboardStorage()
-                               .getAllAssetDashboards());
+                               .findAll());
   }
 
   @PostMapping(
@@ -92,14 +92,14 @@ public class AssetDashboardResource extends AbstractRestResource {
       consumes = MediaType.APPLICATION_JSON_VALUE)
   public ResponseEntity<Void> storeAssetDashboard(@RequestBody AssetDashboardConfig dashboardConfig) {
     getNoSqlStorage().getAssetDashboardStorage()
-                     .storeAssetDashboard(dashboardConfig);
+                     .persist(dashboardConfig);
     return ok();
   }
 
   @DeleteMapping(path = "/{dashboardId}")
   public ResponseEntity<Void> deleteAssetDashboard(@PathVariable("dashboardId") String dashboardId) {
     getNoSqlStorage().getAssetDashboardStorage()
-                     .deleteAssetDashboard(dashboardId);
+                     .deleteElementById(dashboardId);
     return ok();
   }
 
@@ -169,7 +169,7 @@ public class AssetDashboardResource extends AbstractRestResource {
     return getTargetDirectory() + File.separator + filename;
   }
 
-  private IAssetDashboardStorage getAssetDashboardStorage() {
+  private CRUDStorage<AssetDashboardConfig> getAssetDashboardStorage() {
     return StorageDispatcher.INSTANCE.getNoSqlStore()
                                      .getAssetDashboardStorage();
   }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java
index aa3a509b80..a940e9d9b0 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/MigrationResource.java
@@ -61,7 +61,7 @@ public class MigrationResource extends AbstractAuthGuardedRestResource {
 
   private static final Logger LOG = LoggerFactory.getLogger(MigrationResource.class);
 
-  private final CRUDStorage<String, SpServiceRegistration> extensionsServiceStorage =
+  private final CRUDStorage<SpServiceRegistration> extensionsServiceStorage =
       getNoSqlStorage().getExtensionsServiceStorage();
   private final IAdapterStorage adapterStorage = getNoSqlStorage().getAdapterInstanceStorage();
 
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceConfigurationResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceConfigurationResource.java
index 6a15de5476..378bc4e668 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceConfigurationResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceConfigurationResource.java
@@ -44,7 +44,7 @@ import java.util.List;
 @PreAuthorize(AuthConstants.IS_ADMIN_ROLE)
 public class ServiceConfigurationResource extends AbstractAuthGuardedRestResource {
 
-  private final CRUDStorage<String, SpServiceConfiguration> extensionsServicesConfigStorage =
+  private final CRUDStorage<SpServiceConfiguration> extensionsServicesConfigStorage =
       getNoSqlStorage().getExtensionsServiceConfigurationStorage();
 
 
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceRegistrationResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceRegistrationResource.java
index c8cd157aa2..7b73776682 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceRegistrationResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/ServiceRegistrationResource.java
@@ -45,7 +45,7 @@ import java.util.List;
 @PreAuthorize(AuthConstants.IS_ADMIN_ROLE)
 public class ServiceRegistrationResource extends AbstractAuthGuardedRestResource {
 
-  private final CRUDStorage<String, SpServiceRegistration> extensionsServiceStorage =
+  private final CRUDStorage<SpServiceRegistration> extensionsServiceStorage =
       getNoSqlStorage().getExtensionsServiceStorage();
 
   @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/UserGroupResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/UserGroupResource.java
index b5f1ad0bc5..3ceab35c1e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/UserGroupResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/UserGroupResource.java
@@ -22,7 +22,7 @@ import org.apache.streampipes.model.message.Notifications;
 import org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
 import org.apache.streampipes.rest.security.AuthConstants;
 import org.apache.streampipes.rest.shared.exception.SpMessageException;
-import org.apache.streampipes.storage.api.IUserGroupStorage;
+import org.apache.streampipes.storage.api.CRUDStorage;
 
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -89,7 +89,7 @@ public class UserGroupResource extends AbstractAuthGuardedRestResource {
     }
   }
 
-  private IUserGroupStorage getUserGroupStorage() {
+  private CRUDStorage<Group> getUserGroupStorage() {
     return getNoSqlStorage().getUserGroupStorage();
   }
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java
index 78eed04375..91687ee4d5 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java
@@ -77,7 +77,7 @@ public class DashboardWidget extends AbstractRestResource {
     return ok(getDashboardWidgetStorage().getElementById(elementId));
   }
 
-  private CRUDStorage<String, DashboardWidgetModel> getDashboardWidgetStorage() {
+  private CRUDStorage<DashboardWidgetModel> getDashboardWidgetStorage() {
     return getNoSqlStorage().getDashboardWidgetStorage();
   }
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
index 9324ff117c..ced1771899 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
@@ -79,7 +79,7 @@ public class DataLakeWidgetResource extends AbstractRestResource {
     return ok(getDataExplorerWidgetStorage().getElementById(elementId));
   }
 
-  private CRUDStorage<String, DataExplorerWidgetModel> getDataExplorerWidgetStorage() {
+  private CRUDStorage<DataExplorerWidgetModel> getDataExplorerWidgetStorage() {
     return getNoSqlStorage().getDataExplorerWidgetStorage();
   }
 
diff --git a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigration.java b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigration.java
index 1330a109ce..d8d2eed10c 100644
--- a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigration.java
+++ b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigration.java
@@ -21,7 +21,7 @@ package org.apache.streampipes.service.core.migrations.v095;
 import org.apache.streampipes.manager.file.FileHandler;
 import org.apache.streampipes.model.file.FileMetadata;
 import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.api.IFileMetadataStorage;
+import org.apache.streampipes.storage.api.CRUDStorage;
 import org.apache.streampipes.storage.couchdb.utils.Utils;
 import org.apache.streampipes.storage.management.StorageDispatcher;
 
@@ -46,12 +46,12 @@ public class MergeFilenamesAndRenameDuplicatesMigration implements Migration {
 
   private CouchDbClient couchDbClient;
 
-  private ObjectMapper mapper = new ObjectMapper();
+  private final ObjectMapper mapper = new ObjectMapper();
 
-  private IFileMetadataStorage fileMetadataStorage =
+  private final CRUDStorage<FileMetadata> fileMetadataStorage =
       StorageDispatcher.INSTANCE.getNoSqlStore().getFileMetadataStorage();
 
-  private FileHandler fileHandler = new FileHandler();
+  private final FileHandler fileHandler = new FileHandler();
 
   Logger logger = LoggerFactory.getLogger(MergeFilenamesAndRenameDuplicatesMigration.class);
 
@@ -89,14 +89,14 @@ public class MergeFilenamesAndRenameDuplicatesMigration implements Migration {
    */
   protected void getFileMetadataToUpdate(List<Map<String, Object>> couchDbRawFileMetadata) {
     couchDbRawFileMetadata.forEach(
-        rawFileMetadata -> checkDuplicateOriginalFilename(rawFileMetadata));
+        this::checkDuplicateOriginalFilename);
   }
 
   /**
    * Fetches all fileIds stored in CouchDB
    */
-  private List<String> getAllFileIds(IFileMetadataStorage fileMetadataStorage) {
-    return fileMetadataStorage.getAllFileMetadataDescriptions().stream().map(fileMetadata -> fileMetadata.getFileId())
+  private List<String> getAllFileIds(CRUDStorage<FileMetadata> fileMetadataStorage) {
+    return fileMetadataStorage.findAll().stream().map(FileMetadata::getFileId)
         .toList();
   }
 
@@ -143,7 +143,7 @@ public class MergeFilenamesAndRenameDuplicatesMigration implements Migration {
         fileMetadata.setFileId(rawFileMetadata.get(ID).toString());
         fileMetadata.setFiletype(rawFileMetadata.get(FILETYPE).toString());
       } else {
-        fileMetadata = fileMetadataStorage.getMetadataById(rawFileMetadata.get(ID).toString());
+        fileMetadata = fileMetadataStorage.getElementById(rawFileMetadata.get(ID).toString());
       }
       fileMetadataGroupedByOriginalName.get(originalFilename).add(fileMetadata);
     }
@@ -177,7 +177,7 @@ public class MergeFilenamesAndRenameDuplicatesMigration implements Migration {
   private void updateFileMetadata(FileMetadata fileMetadata, String filename, boolean isTesting) {
     fileMetadata.setFilename(filename);
     if (!isTesting) {
-      fileMetadataStorage.updateFileMetadata(fileMetadata);
+      fileMetadataStorage.updateElement(fileMetadata);
     }
   }
 
diff --git a/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java b/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java
index c096267c5f..f0823b4830 100644
--- a/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java
+++ b/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java
@@ -40,7 +40,7 @@ public class SpServiceDiscoveryCore implements ISpServiceDiscovery {
   private static final Logger LOG = LoggerFactory.getLogger(SpServiceDiscoveryCore.class);
   private static final int MAX_RETRIES = 3;
 
-  private final CRUDStorage<String, SpServiceRegistration> serviceStorage;
+  private final CRUDStorage<SpServiceRegistration> serviceStorage;
 
   public SpServiceDiscoveryCore() {
     this.serviceStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getExtensionsServiceStorage();
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/CRUDStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/CRUDStorage.java
index a5539aa1e4..32e57df0af 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/CRUDStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/CRUDStorage.java
@@ -21,19 +21,19 @@ import org.apache.streampipes.model.Tuple2;
 
 import java.util.List;
 
-public interface CRUDStorage<K, V> {
+public interface CRUDStorage<T> {
 
-  List<V> findAll();
+  List<T> findAll();
 
-  Tuple2<Boolean, String> persist(V element);
+  Tuple2<Boolean, String> persist(T element);
 
-  V getElementById(K id);
+  T getElementById(String id);
 
-  V updateElement(V element);
+  T updateElement(T element);
 
-  void deleteElement(V element);
+  void deleteElement(T element);
 
-  default void deleteElementById(K id) {
+  default void deleteElementById(String id) {
     var element = getElementById(id);
     deleteElement(element);
   }
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IAdapterStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IAdapterStorage.java
index 651d7274ba..f2011bbc0c 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IAdapterStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IAdapterStorage.java
@@ -22,7 +22,7 @@ import org.apache.streampipes.model.connect.adapter.AdapterDescription;
 
 import java.util.List;
 
-public interface IAdapterStorage extends CRUDStorage<String, AdapterDescription>{
+public interface IAdapterStorage extends CRUDStorage<AdapterDescription>{
 
   List<AdapterDescription> getAllAdapters();
 
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IAssetDashboardStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IAssetDashboardStorage.java
deleted file mode 100644
index 69d66271f6..0000000000
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IAssetDashboardStorage.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.api;
-
-import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
-
-import java.util.List;
-
-public interface IAssetDashboardStorage {
-
-  List<AssetDashboardConfig> getAllAssetDashboards();
-
-  AssetDashboardConfig getAssetDashboard(String dashboardId);
-
-  void storeAssetDashboard(AssetDashboardConfig assetDashboardConfig);
-
-  void updateAssetDashboard(AssetDashboardConfig assetDashboardConfig);
-
-  void deleteAssetDashboard(String dashboardId);
-}
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataProcessorStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataProcessorStorage.java
index c9f4d6630c..e0b055f978 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataProcessorStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataProcessorStorage.java
@@ -21,7 +21,7 @@ import org.apache.streampipes.model.graph.DataProcessorDescription;
 
 import java.util.List;
 
-public interface IDataProcessorStorage extends CRUDStorage<String, DataProcessorDescription> {
+public interface IDataProcessorStorage extends CRUDStorage<DataProcessorDescription> {
 
   DataProcessorDescription getFirstDataProcessorByAppId(String appId);
 
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataSinkStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataSinkStorage.java
index e740816d70..d82c02ba6c 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataSinkStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataSinkStorage.java
@@ -21,7 +21,7 @@ import org.apache.streampipes.model.graph.DataSinkDescription;
 
 import java.util.List;
 
-public interface IDataSinkStorage extends CRUDStorage<String, DataSinkDescription> {
+public interface IDataSinkStorage extends CRUDStorage<DataSinkDescription> {
 
   DataSinkDescription getFirstDataSinkByAppId(String appId);
 
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataStreamStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataStreamStorage.java
index 651584b24e..f08bc6233b 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataStreamStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataStreamStorage.java
@@ -19,7 +19,7 @@ package org.apache.streampipes.storage.api;
 
 import org.apache.streampipes.model.SpDataStream;
 
-public interface IDataStreamStorage extends CRUDStorage<String, SpDataStream> {
+public interface IDataStreamStorage extends CRUDStorage<SpDataStream> {
 
   SpDataStream getDataStreamByAppId(String appId);
 }
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java
index 3169a61c69..2b8c0203d7 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java
@@ -17,12 +17,17 @@
  */
 package org.apache.streampipes.storage.api;
 
+import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
+import org.apache.streampipes.model.client.user.Group;
+import org.apache.streampipes.model.client.user.PasswordRecoveryToken;
+import org.apache.streampipes.model.client.user.UserActivationToken;
 import org.apache.streampipes.model.dashboard.DashboardModel;
 import org.apache.streampipes.model.dashboard.DashboardWidgetModel;
 import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
 import org.apache.streampipes.model.datalake.DataLakeMeasure;
 import org.apache.streampipes.model.extensions.configuration.SpServiceConfiguration;
 import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
+import org.apache.streampipes.model.file.FileMetadata;
 
 public interface INoSqlStorage {
 
@@ -34,7 +39,7 @@ public interface INoSqlStorage {
 
   IImageStorage getImageStorage();
 
-  IUserGroupStorage getUserGroupStorage();
+  CRUDStorage<Group> getUserGroupStorage();
 
   IPipelineStorage getPipelineStorageAPI();
 
@@ -44,19 +49,19 @@ public interface INoSqlStorage {
 
   INotificationStorage getNotificationStorageApi();
 
-  IAssetDashboardStorage getAssetDashboardStorage();
+  CRUDStorage<AssetDashboardConfig> getAssetDashboardStorage();
 
-  CRUDStorage<String, DataLakeMeasure> getDataLakeStorage();
+  CRUDStorage<DataLakeMeasure> getDataLakeStorage();
 
-  IFileMetadataStorage getFileMetadataStorage();
+  CRUDStorage<FileMetadata> getFileMetadataStorage();
 
-  CRUDStorage<String, DashboardModel> getDashboardStorage();
+  CRUDStorage<DashboardModel> getDashboardStorage();
 
-  CRUDStorage<String, DashboardModel> getDataExplorerDashboardStorage();
+  CRUDStorage<DashboardModel> getDataExplorerDashboardStorage();
 
-  CRUDStorage<String, DashboardWidgetModel> getDashboardWidgetStorage();
+  CRUDStorage<DashboardWidgetModel> getDashboardWidgetStorage();
 
-  CRUDStorage<String, DataExplorerWidgetModel> getDataExplorerWidgetStorage();
+  CRUDStorage<DataExplorerWidgetModel> getDataExplorerWidgetStorage();
 
   IPipelineElementTemplateStorage getPipelineElementTemplateStorage();
 
@@ -72,13 +77,13 @@ public interface INoSqlStorage {
 
   IDataStreamStorage getDataStreamStorage();
 
-  IPasswordRecoveryTokenStorage getPasswordRecoveryTokenStorage();
+  CRUDStorage<PasswordRecoveryToken> getPasswordRecoveryTokenStorage();
 
-  IUserActivationTokenStorage getUserActivationTokenStorage();
+  CRUDStorage<UserActivationToken> getUserActivationTokenStorage();
 
-  CRUDStorage<String, SpServiceRegistration> getExtensionsServiceStorage();
+  CRUDStorage<SpServiceRegistration> getExtensionsServiceStorage();
 
-  CRUDStorage<String, SpServiceConfiguration> getExtensionsServiceConfigurationStorage();
+  CRUDStorage<SpServiceConfiguration> getExtensionsServiceConfigurationStorage();
 
   ISpCoreConfigurationStorage getSpCoreConfigurationStorage();
 }
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPasswordRecoveryTokenStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPasswordRecoveryTokenStorage.java
deleted file mode 100644
index 43259e5edf..0000000000
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPasswordRecoveryTokenStorage.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.api;
-
-import org.apache.streampipes.model.client.user.PasswordRecoveryToken;
-
-public interface IPasswordRecoveryTokenStorage extends CRUDStorage<String, PasswordRecoveryToken> {
-
-
-}
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineCanvasMetadataStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineCanvasMetadataStorage.java
index fa7c64736a..57701ac23e 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineCanvasMetadataStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineCanvasMetadataStorage.java
@@ -19,7 +19,7 @@ package org.apache.streampipes.storage.api;
 
 import org.apache.streampipes.model.canvas.PipelineCanvasMetadata;
 
-public interface IPipelineCanvasMetadataStorage extends CRUDStorage<String, PipelineCanvasMetadata> {
+public interface IPipelineCanvasMetadataStorage extends CRUDStorage<PipelineCanvasMetadata> {
 
   PipelineCanvasMetadata getPipelineCanvasMetadataForPipeline(String pipelineId);
 }
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineElementTemplateStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineElementTemplateStorage.java
index 7f3a326557..e8d8fe6684 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineElementTemplateStorage.java
+++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IPipelineElementTemplateStorage.java
@@ -21,7 +21,7 @@ import org.apache.streampipes.model.template.PipelineElementTemplate;
 
 import java.util.List;
 
-public interface IPipelineElementTemplateStorage extends CRUDStorage<String, PipelineElementTemplate> {
+public interface IPipelineElementTemplateStorage extends CRUDStorage<PipelineElementTemplate> {
 
   List<PipelineElementTemplate> getPipelineElementTemplatesforAppId(String appId);
 }
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IUserActivationTokenStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IUserActivationTokenStorage.java
deleted file mode 100644
index a2311dc485..0000000000
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IUserActivationTokenStorage.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.api;
-
-import org.apache.streampipes.model.client.user.UserActivationToken;
-
-public interface IUserActivationTokenStorage extends CRUDStorage<String, UserActivationToken> {
-}
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IUserGroupStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IUserGroupStorage.java
deleted file mode 100644
index accd125c4f..0000000000
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IUserGroupStorage.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.api;
-
-import org.apache.streampipes.model.client.user.Group;
-
-public interface IUserGroupStorage extends CRUDStorage<String, Group> {
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
index dca2e03294..64e873a8aa 100644
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
@@ -17,24 +17,26 @@
  */
 package org.apache.streampipes.storage.couchdb;
 
+import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
+import org.apache.streampipes.model.client.user.Group;
+import org.apache.streampipes.model.client.user.PasswordRecoveryToken;
+import org.apache.streampipes.model.client.user.UserActivationToken;
 import org.apache.streampipes.model.dashboard.DashboardModel;
 import org.apache.streampipes.model.dashboard.DashboardWidgetModel;
 import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
 import org.apache.streampipes.model.datalake.DataLakeMeasure;
 import org.apache.streampipes.model.extensions.configuration.SpServiceConfiguration;
 import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
+import org.apache.streampipes.model.file.FileMetadata;
 import org.apache.streampipes.storage.api.CRUDStorage;
 import org.apache.streampipes.storage.api.IAdapterStorage;
-import org.apache.streampipes.storage.api.IAssetDashboardStorage;
 import org.apache.streampipes.storage.api.IDataProcessorStorage;
 import org.apache.streampipes.storage.api.IDataSinkStorage;
 import org.apache.streampipes.storage.api.IDataStreamStorage;
-import org.apache.streampipes.storage.api.IFileMetadataStorage;
 import org.apache.streampipes.storage.api.IGenericStorage;
 import org.apache.streampipes.storage.api.IImageStorage;
 import org.apache.streampipes.storage.api.INoSqlStorage;
 import org.apache.streampipes.storage.api.INotificationStorage;
-import org.apache.streampipes.storage.api.IPasswordRecoveryTokenStorage;
 import org.apache.streampipes.storage.api.IPermissionStorage;
 import org.apache.streampipes.storage.api.IPipelineCanvasMetadataStorage;
 import org.apache.streampipes.storage.api.IPipelineElementConnectionStorage;
@@ -42,32 +44,24 @@ import org.apache.streampipes.storage.api.IPipelineElementDescriptionStorage;
 import org.apache.streampipes.storage.api.IPipelineElementTemplateStorage;
 import org.apache.streampipes.storage.api.IPipelineStorage;
 import org.apache.streampipes.storage.api.ISpCoreConfigurationStorage;
-import org.apache.streampipes.storage.api.IUserActivationTokenStorage;
-import org.apache.streampipes.storage.api.IUserGroupStorage;
 import org.apache.streampipes.storage.api.IUserStorage;
 import org.apache.streampipes.storage.couchdb.impl.AdapterDescriptionStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.AdapterInstanceStorageImpl;
-import org.apache.streampipes.storage.couchdb.impl.AssetDashboardStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.ConnectionStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.CoreConfigurationStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.DataProcessorStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.DataSinkStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.DataStreamStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.DefaultCrudStorage;
-import org.apache.streampipes.storage.couchdb.impl.ExtensionsServiceConfigStorageImpl;
-import org.apache.streampipes.storage.couchdb.impl.ExtensionsServiceStorageImpl;
-import org.apache.streampipes.storage.couchdb.impl.FileMetadataStorageImpl;
+import org.apache.streampipes.storage.couchdb.impl.DefaultViewCrudStorage;
 import org.apache.streampipes.storage.couchdb.impl.GenericStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.ImageStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.NotificationStorageImpl;
-import org.apache.streampipes.storage.couchdb.impl.PasswordRecoveryTokenImpl;
 import org.apache.streampipes.storage.couchdb.impl.PermissionStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.PipelineCanvasMetadataStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.PipelineElementDescriptionStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.PipelineElementTemplateStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.PipelineStorageImpl;
-import org.apache.streampipes.storage.couchdb.impl.UserActivationTokenImpl;
-import org.apache.streampipes.storage.couchdb.impl.UserGroupStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.UserStorage;
 import org.apache.streampipes.storage.couchdb.utils.Utils;
 
@@ -96,8 +90,12 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public IUserGroupStorage getUserGroupStorage() {
-    return new UserGroupStorageImpl();
+  public CRUDStorage<Group> getUserGroupStorage() {
+    return new DefaultViewCrudStorage<>(
+        Utils::getCouchDbUserClient,
+        Group.class,
+        "users/groups"
+    );
   }
 
   @Override
@@ -121,12 +119,15 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public IAssetDashboardStorage getAssetDashboardStorage() {
-    return new AssetDashboardStorageImpl();
+  public CRUDStorage<AssetDashboardConfig> getAssetDashboardStorage() {
+    return new DefaultCrudStorage<>(
+        () -> Utils.getCouchDbGsonClient("assetdashboard"),
+        AssetDashboardConfig.class
+    );
   }
 
   @Override
-  public CRUDStorage<String, DataLakeMeasure> getDataLakeStorage() {
+  public CRUDStorage<DataLakeMeasure> getDataLakeStorage() {
     return new DefaultCrudStorage<>(
         () -> Utils.getCouchDbGsonClient("data-lake"),
         DataLakeMeasure.class
@@ -134,12 +135,15 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public IFileMetadataStorage getFileMetadataStorage() {
-    return new FileMetadataStorageImpl();
+  public CRUDStorage<FileMetadata> getFileMetadataStorage() {
+    return new DefaultCrudStorage<>(
+        () -> Utils.getCouchDbGsonClient("filemetadata"),
+        FileMetadata.class
+    );
   }
 
   @Override
-  public CRUDStorage<String, DashboardModel> getDashboardStorage() {
+  public CRUDStorage<DashboardModel> getDashboardStorage() {
     return new DefaultCrudStorage<>(
         () -> Utils.getCouchDbGsonClient("dashboard"),
         DashboardModel.class
@@ -147,7 +151,7 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public CRUDStorage<String, DashboardModel> getDataExplorerDashboardStorage() {
+  public CRUDStorage<DashboardModel> getDataExplorerDashboardStorage() {
     return new DefaultCrudStorage<>(
         () -> Utils.getCouchDbGsonClient("dataexplorerdashboard"),
         DashboardModel.class
@@ -155,7 +159,7 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public CRUDStorage<String, DashboardWidgetModel> getDashboardWidgetStorage() {
+  public CRUDStorage<DashboardWidgetModel> getDashboardWidgetStorage() {
     return new DefaultCrudStorage<>(
         () -> Utils.getCouchDbGsonClient("dashboardwidget"),
         DashboardWidgetModel.class
@@ -163,7 +167,7 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public CRUDStorage<String, DataExplorerWidgetModel> getDataExplorerWidgetStorage() {
+  public CRUDStorage<DataExplorerWidgetModel> getDataExplorerWidgetStorage() {
     return new DefaultCrudStorage<>(
         () -> Utils.getCouchDbGsonClient("dataexplorerwidget"),
         DataExplorerWidgetModel.class
@@ -206,29 +210,41 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public IPasswordRecoveryTokenStorage getPasswordRecoveryTokenStorage() {
-    return new PasswordRecoveryTokenImpl();
+  public CRUDStorage<PasswordRecoveryToken> getPasswordRecoveryTokenStorage() {
+    return new DefaultViewCrudStorage<>(
+        Utils::getCouchDbUserClient,
+        PasswordRecoveryToken.class,
+        "users/password-recovery"
+    );
   }
 
   @Override
-  public IUserActivationTokenStorage getUserActivationTokenStorage() {
-    return new UserActivationTokenImpl();
+  public CRUDStorage<UserActivationToken> getUserActivationTokenStorage() {
+    return new DefaultViewCrudStorage<>(
+        Utils::getCouchDbUserClient,
+        UserActivationToken.class,
+        "users/user-activation"
+    );
   }
 
   @Override
-  public CRUDStorage<String, SpServiceRegistration> getExtensionsServiceStorage() {
-    return new ExtensionsServiceStorageImpl();
+  public CRUDStorage<SpServiceRegistration> getExtensionsServiceStorage() {
+    return new DefaultCrudStorage<>(
+        () -> Utils.getCouchDbGsonClient("extensions-services"),
+        SpServiceRegistration.class
+    );
   }
 
   @Override
-  public CRUDStorage<String, SpServiceConfiguration> getExtensionsServiceConfigurationStorage() {
-    return new ExtensionsServiceConfigStorageImpl();
+  public CRUDStorage<SpServiceConfiguration> getExtensionsServiceConfigurationStorage() {
+    return new DefaultCrudStorage<>(
+        () -> Utils.getCouchDbGsonClient("extensions-services-configurations"),
+        SpServiceConfiguration.class
+    );
   }
 
   @Override
   public ISpCoreConfigurationStorage getSpCoreConfigurationStorage() {
     return new CoreConfigurationStorageImpl();
   }
-
-
 }
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/AssetDashboardStorageImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/AssetDashboardStorageImpl.java
deleted file mode 100644
index 665259c0bf..0000000000
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/AssetDashboardStorageImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.couchdb.impl;
-
-import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
-import org.apache.streampipes.storage.api.IAssetDashboardStorage;
-import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-import java.util.List;
-
-public class AssetDashboardStorageImpl extends AbstractDao<AssetDashboardConfig> implements IAssetDashboardStorage {
-
-  public AssetDashboardStorageImpl() {
-    super(Utils::getCouchDbAssetDashboardClient, AssetDashboardConfig.class);
-  }
-
-  @Override
-  public List<AssetDashboardConfig> getAllAssetDashboards() {
-    return findAll();
-  }
-
-  @Override
-  public AssetDashboardConfig getAssetDashboard(String dashboardId) {
-    return findWithNullIfEmpty(dashboardId);
-  }
-
-  @Override
-  public void storeAssetDashboard(AssetDashboardConfig assetDashboardConfig) {
-    persist(assetDashboardConfig);
-  }
-
-  @Override
-  public void updateAssetDashboard(AssetDashboardConfig assetDashboardConfig) {
-    update(assetDashboardConfig);
-  }
-
-  @Override
-  public void deleteAssetDashboard(String dashboardId) {
-    delete(dashboardId);
-  }
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DefaultCrudStorage.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DefaultCrudStorage.java
index 88e9f275a6..84c6b80dc8 100644
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DefaultCrudStorage.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DefaultCrudStorage.java
@@ -18,7 +18,7 @@
 
 package org.apache.streampipes.storage.couchdb.impl;
 
-import org.apache.streampipes.model.api.Storable;
+import org.apache.streampipes.model.shared.api.Storable;
 import org.apache.streampipes.storage.api.CRUDStorage;
 import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
 
@@ -26,7 +26,7 @@ import org.lightcouch.CouchDbClient;
 
 import java.util.function.Supplier;
 
-public class DefaultCrudStorage<T extends Storable> extends AbstractDao<T> implements CRUDStorage<String, T> {
+public class DefaultCrudStorage<T extends Storable> extends AbstractDao<T> implements CRUDStorage<T> {
 
   public DefaultCrudStorage(Supplier<CouchDbClient> couchDbClientSupplier,
                             Class<T> clazz) {
@@ -35,7 +35,7 @@ public class DefaultCrudStorage<T extends Storable> extends AbstractDao<T> imple
 
   @Override
   public T getElementById(String id) {
-    return find(id).orElseThrow(IllegalArgumentException::new);
+    return findWithNullIfEmpty(id);
   }
 
   @Override
diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IFileMetadataStorage.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DefaultViewCrudStorage.java
similarity index 56%
rename from streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IFileMetadataStorage.java
rename to streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DefaultViewCrudStorage.java
index 13eae66ed7..a28c70147f 100644
--- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IFileMetadataStorage.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DefaultViewCrudStorage.java
@@ -15,23 +15,30 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.storage.api;
 
-import org.apache.streampipes.model.file.FileMetadata;
+package org.apache.streampipes.storage.couchdb.impl;
 
-import java.util.List;
+import org.apache.streampipes.model.shared.api.Storable;
 
-public interface IFileMetadataStorage {
+import org.lightcouch.CouchDbClient;
 
-  FileMetadata getMetadataById(String id);
+import java.util.List;
+import java.util.function.Supplier;
 
-  List<FileMetadata> getAllFileMetadataDescriptions();
+public class DefaultViewCrudStorage<T extends Storable> extends DefaultCrudStorage<T> {
 
-  List<FileMetadata> getFilteredFileMetadataDescriptions(String filetype);
+  private final String viewName;
 
-  void deleteFileMetadata(String id);
+  public DefaultViewCrudStorage(Supplier<CouchDbClient> couchDbClientSupplier,
+                                Class<T> clazz,
+                                String viewName) {
+    super(couchDbClientSupplier, clazz);
+    this.viewName = viewName;
+  }
 
-  void addFileMetadata(FileMetadata fileMetadata);
+  @Override
+  public List<T> findAll() {
+    return findAll(viewName, clazz);
+  }
 
-  void updateFileMetadata(FileMetadata fileMetadata);
 }
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/ExtensionsServiceConfigStorageImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/ExtensionsServiceConfigStorageImpl.java
deleted file mode 100644
index 554632ca80..0000000000
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/ExtensionsServiceConfigStorageImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.
- *
- */
-
-package org.apache.streampipes.storage.couchdb.impl;
-
-import org.apache.streampipes.model.extensions.configuration.SpServiceConfiguration;
-import org.apache.streampipes.storage.api.CRUDStorage;
-import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-public class ExtensionsServiceConfigStorageImpl extends AbstractDao<SpServiceConfiguration>
-    implements CRUDStorage<String, SpServiceConfiguration> {
-
-  public ExtensionsServiceConfigStorageImpl() {
-    super(Utils::getCouchDbServiceConfigStorage, SpServiceConfiguration.class);
-  }
-
-  @Override
-  public SpServiceConfiguration getElementById(String id) {
-    return findWithNullIfEmpty(id);
-  }
-
-  @Override
-  public SpServiceConfiguration updateElement(SpServiceConfiguration element) {
-    update(element);
-    return getElementById(element.getServiceName());
-  }
-
-  @Override
-  public void deleteElement(SpServiceConfiguration element) {
-    delete(element.getServiceName());
-  }
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/ExtensionsServiceStorageImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/ExtensionsServiceStorageImpl.java
deleted file mode 100644
index 230c7a3393..0000000000
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/ExtensionsServiceStorageImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.
- *
- */
-
-package org.apache.streampipes.storage.couchdb.impl;
-
-import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
-import org.apache.streampipes.storage.api.CRUDStorage;
-import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-public class ExtensionsServiceStorageImpl extends AbstractDao<SpServiceRegistration>
-    implements CRUDStorage<String, SpServiceRegistration> {
-
-  public ExtensionsServiceStorageImpl() {
-    super(Utils::getCouchDbExtensionsStorage, SpServiceRegistration.class);
-  }
-
-  @Override
-  public SpServiceRegistration getElementById(String id) {
-    return findWithNullIfEmpty(id);
-  }
-
-  @Override
-  public SpServiceRegistration updateElement(SpServiceRegistration element) {
-    update(element);
-    return getElementById(element.getSvcId());
-  }
-
-  @Override
-  public void deleteElement(SpServiceRegistration element) {
-    delete(element.getSvcId());
-  }
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/FileMetadataStorageImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/FileMetadataStorageImpl.java
deleted file mode 100644
index 2f65f09912..0000000000
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/FileMetadataStorageImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.couchdb.impl;
-
-import org.apache.streampipes.model.file.FileMetadata;
-import org.apache.streampipes.storage.api.IFileMetadataStorage;
-import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class FileMetadataStorageImpl extends AbstractDao<FileMetadata> implements
-    IFileMetadataStorage {
-
-  public FileMetadataStorageImpl() {
-    super(Utils::getCouchDbFileMetadataClient, FileMetadata.class);
-  }
-
-  @Override
-  public FileMetadata getMetadataById(String id) {
-    return findWithNullIfEmpty(id);
-  }
-
-  @Override
-  public List<FileMetadata> getAllFileMetadataDescriptions() {
-    return findAll();
-  }
-
-  @Override
-  public List<FileMetadata> getFilteredFileMetadataDescriptions(String filetype) {
-    List<FileMetadata> allFiles = getAllFileMetadataDescriptions();
-    return allFiles
-        .stream()
-        .filter(f -> f.getFiletype().equals(filetype))
-        .collect(Collectors.toList());
-  }
-
-  @Override
-  public void deleteFileMetadata(String id) {
-    delete(id);
-  }
-
-  @Override
-  public void addFileMetadata(FileMetadata fileMetadata) {
-    persist(fileMetadata);
-  }
-
-  @Override
-  public void updateFileMetadata(FileMetadata fileMetadata) {
-    update(fileMetadata);
-  }
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/PasswordRecoveryTokenImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/PasswordRecoveryTokenImpl.java
deleted file mode 100644
index 4a8b687658..0000000000
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/PasswordRecoveryTokenImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.couchdb.impl;
-
-import org.apache.streampipes.model.client.user.PasswordRecoveryToken;
-import org.apache.streampipes.storage.api.IPasswordRecoveryTokenStorage;
-import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-import java.util.List;
-
-public class PasswordRecoveryTokenImpl extends AbstractDao<PasswordRecoveryToken>
-    implements IPasswordRecoveryTokenStorage {
-
-  private static final String viewName = "users/password-recovery";
-
-  public PasswordRecoveryTokenImpl() {
-    super(Utils::getCouchDbUserClient, PasswordRecoveryToken.class);
-  }
-
-
-  @Override
-  public List<PasswordRecoveryToken> findAll() {
-    return findAll(viewName, PasswordRecoveryToken.class);
-  }
-
-  @Override
-  public PasswordRecoveryToken getElementById(String s) {
-    return findWithNullIfEmpty(s, PasswordRecoveryToken.class);
-  }
-
-  @Override
-  public PasswordRecoveryToken updateElement(PasswordRecoveryToken element) {
-    update(element, PasswordRecoveryToken.class);
-    return getElementById(element.getToken());
-  }
-
-  @Override
-  public void deleteElement(PasswordRecoveryToken element) {
-    delete(element.getToken(), PasswordRecoveryToken.class);
-  }
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/UserActivationTokenImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/UserActivationTokenImpl.java
deleted file mode 100644
index 79d5f93509..0000000000
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/UserActivationTokenImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.couchdb.impl;
-
-import org.apache.streampipes.model.client.user.UserActivationToken;
-import org.apache.streampipes.storage.api.IUserActivationTokenStorage;
-import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-import java.util.List;
-
-public class UserActivationTokenImpl extends AbstractDao<UserActivationToken> implements IUserActivationTokenStorage {
-
-  private static final String viewName = "users/user-activation";
-
-  public UserActivationTokenImpl() {
-    super(Utils::getCouchDbUserClient, UserActivationToken.class);
-  }
-
-  @Override
-  public List<UserActivationToken> findAll() {
-    return findAll(viewName, UserActivationToken.class);
-  }
-
-  @Override
-  public UserActivationToken getElementById(String s) {
-    return findWithNullIfEmpty(s, UserActivationToken.class);
-  }
-
-  @Override
-  public UserActivationToken updateElement(UserActivationToken element) {
-    update(element, UserActivationToken.class);
-    return getElementById(element.getToken());
-  }
-
-  @Override
-  public void deleteElement(UserActivationToken element) {
-    delete(element.getToken(), UserActivationToken.class);
-  }
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/UserGroupStorageImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/UserGroupStorageImpl.java
deleted file mode 100644
index e657e960a2..0000000000
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/UserGroupStorageImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.
- *
- */
-package org.apache.streampipes.storage.couchdb.impl;
-
-import org.apache.streampipes.model.client.user.Group;
-import org.apache.streampipes.storage.api.IUserGroupStorage;
-import org.apache.streampipes.storage.couchdb.dao.AbstractDao;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-import java.util.List;
-
-public class UserGroupStorageImpl extends AbstractDao<Group> implements IUserGroupStorage {
-
-  private static final String viewName = "users/groups";
-
-  public UserGroupStorageImpl() {
-    super(Utils::getCouchDbUserClient, Group.class);
-  }
-
-  @Override
-  public List<Group> findAll() {
-    return findAll(viewName, Group.class);
-  }
-
-  @Override
-  public Group getElementById(String s) {
-    return findWithNullIfEmpty(s, Group.class);
-  }
-
-  @Override
-  public Group updateElement(Group element) {
-    update(element, Group.class);
-    return getElementById(element.getGroupId());
-  }
-
-  @Override
-  public void deleteElement(Group element) {
-    delete(element.getGroupId(), Group.class);
-  }
-}
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java
index 7f9cfd15ff..a9e1be34f9 100644
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java
@@ -66,10 +66,6 @@ public class Utils {
     return getCouchDbGsonClient("general-configuration");
   }
 
-  public static CouchDbClient getCouchDbServiceConfigStorage() {
-    return getCouchDbGsonClient("extensions-services-configurations");
-  }
-
   public static CouchDbClient getCouchDbExtensionsStorage() {
     return getCouchDbGsonClient("extensions-services");
   }
@@ -82,10 +78,6 @@ public class Utils {
     return getCouchDbGsonClient("filemetadata");
   }
 
-  public static CouchDbClient getCouchDbAssetDashboardClient() {
-    return getCouchDbGsonClient("assetdashboard");
-  }
-
   public static CouchDbClient getCouchDbAdapterInstanceClient() {
     return getCouchDbAdapterClient("adapterinstance");
   }