diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/SearchServiceGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/SearchServiceGatewayUnitTest.java
index b1ce21d4e5e8315b08087dc0d85712509a07973e..0fbe9be24351f7ecb6e27cc2c2a0e5375cb5a3ee 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/SearchServiceGatewayUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/SearchServiceGatewayUnitTest.java
@@ -35,7 +35,7 @@ public class SearchServiceGatewayUnitTest extends AbstractUnitTest {
     private SearchServiceGateway searchServiceGateway;
 
     @Test
-    public void update_succeeds() throws DatabaseNotFoundException, SearchServiceException,
+    public void save_succeeds() throws DatabaseNotFoundException, SearchServiceException,
             SearchServiceConnectionException {
         final ResponseEntity<DatabaseDto> mock = ResponseEntity.accepted()
                 .build();
@@ -45,11 +45,11 @@ public class SearchServiceGatewayUnitTest extends AbstractUnitTest {
                 .thenReturn(mock);
 
         /* test */
-        searchServiceGateway.update(DATABASE_1);
+        searchServiceGateway.save(DATABASE_1);
     }
 
     @Test
-    public void update_badRequest_fails() {
+    public void save_badRequest_fails() {
         final ResponseEntity<DatabaseDto> mock = ResponseEntity.status(HttpStatus.BAD_REQUEST)
                 .build();
 
@@ -59,12 +59,12 @@ public class SearchServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(SearchServiceException.class, () -> {
-            searchServiceGateway.update(DATABASE_1);
+            searchServiceGateway.save(DATABASE_1);
         });
     }
 
     @Test
-    public void update_unexpectedResponse_fails() {
+    public void save_unexpectedResponse_fails() {
         final ResponseEntity<DatabaseDto> mock = ResponseEntity.status(HttpStatus.OK)
                 .build();
 
@@ -74,12 +74,12 @@ public class SearchServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(SearchServiceException.class, () -> {
-            searchServiceGateway.update(DATABASE_1);
+            searchServiceGateway.save(DATABASE_1);
         });
     }
 
     @Test
-    public void update_unavailable_fails() {
+    public void save_unavailable_fails() {
 
         /* mock */
         doThrow(HttpServerErrorException.ServiceUnavailable.class)
@@ -88,12 +88,12 @@ public class SearchServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
-            searchServiceGateway.update(DATABASE_1);
+            searchServiceGateway.save(DATABASE_1);
         });
     }
 
     @Test
-    public void update_notFound_fails() {
+    public void save_notFound_fails() {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
@@ -102,7 +102,7 @@ public class SearchServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
-            searchServiceGateway.update(DATABASE_1);
+            searchServiceGateway.save(DATABASE_1);
         });
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
index 182fe8e14ac5cd63ad1752fec07ee9b511ba8726..01a990cef3bec4ae4997f44d854ef6df2c9be22d 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
@@ -1,20 +1,19 @@
 package at.tuwien.service;
 
+import at.tuwien.api.datacite.DataCiteBody;
+import at.tuwien.api.datacite.doi.DataCiteDoi;
 import at.tuwien.api.identifier.BibliographyTypeDto;
+import at.tuwien.entities.database.Database;
 import at.tuwien.entities.identifier.Creator;
 import at.tuwien.entities.identifier.Identifier;
 import at.tuwien.entities.identifier.IdentifierStatusType;
 import at.tuwien.entities.identifier.NameIdentifierSchemeType;
+import at.tuwien.exception.*;
 import at.tuwien.repository.ContainerRepository;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.repository.LicenseRepository;
 import at.tuwien.repository.UserRepository;
 import at.tuwien.test.AbstractUnitTest;
-import at.tuwien.api.datacite.DataCiteBody;
-import at.tuwien.api.datacite.doi.DataCiteDoi;
-import at.tuwien.entities.database.Database;
-import at.tuwien.exception.*;
-import at.tuwien.gateway.SearchServiceGateway;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -48,7 +47,7 @@ import static org.mockito.Mockito.when;
 public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
 
     @MockBean
-    private SearchServiceGateway searchServiceGateway;
+    private SearchService searchService;
 
     @MockBean
     @Qualifier("dataCiteRestTemplate")
@@ -140,7 +139,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
         /* mock */
         when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(dataCiteBodyParameterizedTypeReference)))
                 .thenReturn(mock);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -155,7 +154,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
         doThrow(HttpClientErrorException.BadRequest.class)
                 .when(restTemplate)
                 .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(dataCiteBodyParameterizedTypeReference));
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -172,7 +171,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
         doThrow(RestClientException.class)
                 .when(restTemplate)
                 .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(dataCiteBodyParameterizedTypeReference));
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -331,7 +330,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
             IdentifierNotFoundException, SearchServiceException, SearchServiceConnectionException {
 
         /* mock */
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
index 1b6570abd821337fe032bead021cf9d5a4b9fc8c..6cf8fa05702560a1e5e799b78588591167ce11bf 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
@@ -8,7 +8,6 @@ import at.tuwien.entities.database.table.Table;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
@@ -33,7 +32,7 @@ import static org.mockito.Mockito.*;
 public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
     @MockBean
-    private SearchServiceGateway searchServiceGateway;
+    private SearchService searchService;
 
     @MockBean
     private DataServiceGateway dataServiceGateway;
@@ -109,7 +108,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         /* mock */
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -126,8 +125,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(DatabaseNotFoundException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
@@ -144,8 +143,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(SearchServiceConnectionException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
@@ -163,7 +162,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of());
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -182,8 +181,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(SearchServiceConnectionException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
@@ -202,8 +201,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(DatabaseNotFoundException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
@@ -221,7 +220,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO, VIEW_4_DTO)); /* <<< */
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -239,7 +238,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)); /* <<< */
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -257,7 +256,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of());
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -275,7 +274,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -293,7 +292,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO, TABLE_5_DTO));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -411,8 +410,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(SearchServiceException.class)
-                .when(searchServiceGateway)
-                .update(DATABASE_1);
+                .when(searchService)
+                .save(DATABASE_1);
 
         /* test */
         assertThrows(SearchServiceException.class, () -> {
@@ -426,8 +425,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(DatabaseNotFoundException.class)
-                .when(searchServiceGateway)
-                .update(DATABASE_1);
+                .when(searchService)
+                .save(DATABASE_1);
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
@@ -441,8 +440,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(SearchServiceConnectionException.class)
-                .when(searchServiceGateway)
-                .update(DATABASE_1);
+                .when(searchService)
+                .save(DATABASE_1);
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
@@ -468,8 +467,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(SearchServiceException.class)
-                .when(searchServiceGateway)
-                .update(DATABASE_1);
+                .when(searchService)
+                .save(DATABASE_1);
 
         /* test */
         assertThrows(SearchServiceException.class, () -> {
@@ -483,8 +482,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(DatabaseNotFoundException.class)
-                .when(searchServiceGateway)
-                .update(DATABASE_1);
+                .when(searchService)
+                .save(DATABASE_1);
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
@@ -498,8 +497,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(SearchServiceConnectionException.class)
-                .when(searchServiceGateway)
-                .update(DATABASE_1);
+                .when(searchService)
+                .save(DATABASE_1);
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
@@ -516,7 +515,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
             ContainerNotFoundException, SearchServiceException, SearchServiceConnectionException {
 
         /* mock */
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
index 0c87dcdd692533cd751401f9be37fee69b5186cc..fd9eab3516951a303e795646b375a5af3abf476b 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
@@ -12,10 +12,8 @@ import at.tuwien.entities.database.Database;
 import at.tuwien.entities.identifier.*;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,7 +45,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest {
     private DataServiceGateway dataServiceGateway;
 
     @MockBean
-    private SearchServiceGateway searchServiceGateway;
+    private SearchService searchService;
 
     @MockBean
     @Qualifier("restTemplate")
@@ -175,7 +173,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest {
         /* mock */
         when(dataServiceGateway.findQuery(IDENTIFIER_5_DATABASE_ID, IDENTIFIER_5_QUERY_ID))
                 .thenReturn(QUERY_2_DTO);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_2_DTO);
 
         /* test */
@@ -285,7 +283,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest {
             SearchServiceConnectionException {
 
         /* mock */
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
index 3126f9e9f42b36fb8dc09dfa3f8e60c88d851722..fe8ca04fe76519d4c970968ce4e4bfcedbfdb435 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
@@ -13,7 +13,6 @@ import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey;
 import at.tuwien.entities.database.table.constraints.unique.Unique;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.repository.ContainerRepository;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.repository.LicenseRepository;
@@ -45,7 +44,7 @@ import static org.mockito.Mockito.when;
 public class TableServicePersistenceTest extends AbstractUnitTest {
 
     @MockBean
-    private SearchServiceGateway searchServiceGateway;
+    private SearchService searchService;
 
     @MockBean
     private UserService userService;
@@ -111,7 +110,7 @@ public class TableServicePersistenceTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .createTable(DATABASE_1_ID, request);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
index d975e808e3dd03e3b4fd0f27d3af4b60f4fec7a1..83bdfa7e704dcc84e46f68879203993856ff489b 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
@@ -15,7 +15,6 @@ import at.tuwien.entities.database.table.columns.TableColumnType;
 import at.tuwien.entities.database.table.constraints.Constraints;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
@@ -45,7 +44,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
     private DatabaseRepository databaseRepository;
 
     @MockBean
-    private SearchServiceGateway searchServiceGateway;
+    private SearchService searchService;
 
     @MockBean
     private UserService userService;
@@ -134,7 +133,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(TABLE_8_STATISTIC_DTO);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -152,8 +151,8 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(DatabaseNotFoundException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
@@ -172,8 +171,8 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(SearchServiceConnectionException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
@@ -223,7 +222,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(CONCEPT_1);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -255,7 +254,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(CONCEPT_1_ENTITY_DTO);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -278,7 +277,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .createTable(eq(DATABASE_1_ID), any(TableCreateDto.class));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -315,7 +314,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .createTable(eq(DATABASE_1_ID), any(TableCreateDto.class));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -368,7 +367,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
                 .createTable(eq(DATABASE_1_ID), any(TableCreateDto.class));
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -391,7 +390,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .createTable(DATABASE_1_ID, TABLE_3_CREATE_DTO);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -412,7 +411,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doThrow(DataServiceException.class)
                 .when(dataServiceGateway)
                 .createTable(DATABASE_1_ID, TABLE_5_CREATE_DTO);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -510,7 +509,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .deleteTable(DATABASE_1_ID, TABLE_1_ID);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -526,7 +525,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .deleteTable(DATABASE_1_ID, TABLE_4_ID);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java
index 8ca002472a085a58ea5ee58fff8a2a0614c94fd9..a0b840b6218d769318dfc60cebd36fb329f0d637 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java
@@ -2,10 +2,8 @@ package at.tuwien.service;
 
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.View;
-import at.tuwien.entities.database.ViewColumn;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.repository.ContainerRepository;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.repository.LicenseRepository;
@@ -56,7 +54,7 @@ public class ViewServicePersistenceTest extends AbstractUnitTest {
     private DataServiceGateway dataServiceGateway;
 
     @MockBean
-    private SearchServiceGateway searchServiceGateway;
+    private SearchService searchService;
 
     @BeforeEach
     public void beforeEach() {
@@ -88,7 +86,7 @@ public class ViewServicePersistenceTest extends AbstractUnitTest {
         doNothing()
                 .when(dataServiceGateway)
                 .deleteView(DATABASE_1_ID, VIEW_1_ID);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java
index cd9fe03c655d33b014239af4f05f0f0ae9b6d1e9..1a4e9359f383a4f12da160a51430fc25f6b17881 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java
@@ -1,13 +1,12 @@
 package at.tuwien.service;
 
-import at.tuwien.repository.DatabaseRepository;
-import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.api.database.ViewCreateDto;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.View;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
+import at.tuwien.repository.DatabaseRepository;
+import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -18,7 +17,6 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.testcontainers.junit.jupiter.Testcontainers;
 
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
@@ -34,7 +32,7 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
     private DataServiceGateway dataServiceGateway;
 
     @MockBean
-    private SearchServiceGateway searchServiceGateway;
+    private SearchService searchService;
 
     @MockBean
     private DatabaseRepository databaseRepository;
@@ -61,7 +59,7 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
                 .thenReturn(VIEW_1_DTO);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -116,7 +114,7 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
                 .deleteView(DATABASE_1_ID, VIEW_1_ID);
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
-        when(searchServiceGateway.update(any(Database.class)))
+        when(searchService.save(any(Database.class)))
                 .thenReturn(DATABASE_1_DTO);
 
         /* test */
@@ -164,8 +162,8 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(SearchServiceException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(SearchServiceException.class, () -> {
@@ -184,8 +182,8 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(SearchServiceConnectionException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
@@ -204,8 +202,8 @@ public class ViewServiceUnitTest extends AbstractUnitTest {
         when(databaseRepository.save(any(Database.class)))
                 .thenReturn(DATABASE_1);
         doThrow(DatabaseNotFoundException.class)
-                .when(searchServiceGateway)
-                .update(any(Database.class));
+                .when(searchService)
+                .save(any(Database.class));
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java
index f5e2f49c02023fe9145f137089e4550c9ae5b769..08a106e545bff218acf88d68e7f75a5b6a3ca3c7 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/SearchServiceGateway.java
@@ -6,7 +6,7 @@ import at.tuwien.exception.*;
 
 public interface SearchServiceGateway {
 
-    DatabaseDto update(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException;
+    DatabaseDto save(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException;
 
     void delete(Long databaseId) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException;
 }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
index 0f14b8d34826fe94829146f53a0cc22fb9e97333..d44df25a9205085e0787cbce2c5dc437002fb082 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
@@ -35,7 +35,7 @@ public class SearchServiceGatewayImpl implements SearchServiceGateway {
     }
 
     @Override
-    public DatabaseDto update(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException {
+    public DatabaseDto save(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException {
         final ResponseEntity<DatabaseDto> response;
         final HttpHeaders headers = new HttpHeaders();
         headers.set("Accept", "application/json");
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/SearchService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/SearchService.java
new file mode 100644
index 0000000000000000000000000000000000000000..004df5d99da169a7edf718a6ee1aee546f8d8827
--- /dev/null
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/SearchService.java
@@ -0,0 +1,16 @@
+package at.tuwien.service;
+
+import at.tuwien.api.database.DatabaseDto;
+import at.tuwien.entities.database.Database;
+import at.tuwien.exception.DatabaseNotFoundException;
+import at.tuwien.exception.SearchServiceConnectionException;
+import at.tuwien.exception.SearchServiceException;
+
+public interface SearchService {
+
+    DatabaseDto save(Database database) throws SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException;
+
+    void delete(Long databaseId) throws SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException;
+}
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
index 1c302c206871234da50f2cc9de234d7c94a84d66..b4d36edf91630b652eda1c02d7cc748224a09668 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
@@ -6,11 +6,11 @@ import at.tuwien.entities.database.DatabaseAccess;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.service.AccessService;
 import at.tuwien.service.DatabaseService;
+import at.tuwien.service.SearchService;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -23,21 +23,21 @@ import java.util.Optional;
 @Service
 public class AccessServiceImpl implements AccessService {
 
+    private final SearchService searchService;
     private final MetadataMapper metadataMapper;
     private final DatabaseService databaseService;
     private final DatabaseRepository databaseRepository;
     private final DataServiceGateway dataServiceGateway;
-    private final SearchServiceGateway searchServiceGateway;
 
     @Autowired
-    public AccessServiceImpl(MetadataMapper metadataMapper, DatabaseService databaseService,
-                             DatabaseRepository databaseRepository, DataServiceGateway dataServiceGateway,
-                             SearchServiceGateway searchServiceGateway) {
+    public AccessServiceImpl(SearchService searchService, MetadataMapper metadataMapper,
+                             DatabaseService databaseService, DatabaseRepository databaseRepository,
+                             DataServiceGateway dataServiceGateway) {
+        this.searchService = searchService;
         this.metadataMapper = metadataMapper;
         this.databaseService = databaseService;
         this.databaseRepository = databaseRepository;
         this.dataServiceGateway = dataServiceGateway;
-        this.searchServiceGateway = searchServiceGateway;
     }
 
     @Override
@@ -79,7 +79,7 @@ public class AccessServiceImpl implements AccessService {
                 .add(access);
         database = databaseRepository.save(database);
         /* create in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Created access to database with id {}", database.getId());
         return access;
     }
@@ -104,7 +104,7 @@ public class AccessServiceImpl implements AccessService {
                 .setType(metadataMapper.accessTypeDtoToAccessType(access));
         database = databaseRepository.save(database);
         /* update in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated access to database with id {}", database.getId());
     }
 
@@ -120,7 +120,7 @@ public class AccessServiceImpl implements AccessService {
                 .remove(find(database, user));
         databaseRepository.save(database);
         /* update in search service */
-        searchServiceGateway.update(databaseService.findById(database.getId()));
+        searchService.save(databaseService.findById(database.getId()));
         log.info("Deleted access to database with id {}", database.getId());
     }
 
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
index 7415ded56a8a2a926742ef3b44b025f7fb535baa..d06c67b7b8ce837e254042728fd3d5c8056e97bf 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
@@ -20,10 +20,10 @@ import at.tuwien.entities.database.table.constraints.unique.Unique;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.service.DatabaseService;
+import at.tuwien.service.SearchService;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,18 +39,18 @@ import java.util.UUID;
 @Service
 public class DatabaseServiceImpl implements DatabaseService {
 
+    private final SearchService searchService;
     private final MetadataMapper metadataMapper;
     private final DatabaseRepository databaseRepository;
     private final DataServiceGateway dataServiceGateway;
-    private final SearchServiceGateway searchServiceGateway;
 
     @Autowired
-    public DatabaseServiceImpl(MetadataMapper metadataMapper, DatabaseRepository databaseRepository,
-                               DataServiceGateway dataServiceGateway, SearchServiceGateway searchServiceGateway) {
+    public DatabaseServiceImpl(SearchService searchService, MetadataMapper metadataMapper,
+                               DatabaseRepository databaseRepository, DataServiceGateway dataServiceGateway) {
+        this.searchService = searchService;
         this.metadataMapper = metadataMapper;
         this.databaseRepository = databaseRepository;
         this.dataServiceGateway = dataServiceGateway;
-        this.searchServiceGateway = searchServiceGateway;
     }
 
     @Override
@@ -137,7 +137,7 @@ public class DatabaseServiceImpl implements DatabaseService {
                         .toList());
         final Database database = databaseRepository.save(entity1);
         /* create in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Created database with id {}", database.getId());
         return database;
     }
@@ -171,7 +171,7 @@ public class DatabaseServiceImpl implements DatabaseService {
                 .forEach(table -> table.setIsSchemaPublic(data.getIsSchemaPublic()));
         database = databaseRepository.save(database);
         /* update in open search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated database visibility of database with id {}", database.getId());
         return database;
     }
@@ -187,7 +187,7 @@ public class DatabaseServiceImpl implements DatabaseService {
         database.setContactPerson(user.getId());
         database = databaseRepository.save(database);
         /* save in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated database owner of database with id {}", database);
         return database;
     }
@@ -200,7 +200,7 @@ public class DatabaseServiceImpl implements DatabaseService {
         database.setImage(image);
         database = databaseRepository.save(database);
         /* save in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated database owner of database with id {} & search database", database.getId());
         return database;
     }
@@ -317,7 +317,7 @@ public class DatabaseServiceImpl implements DatabaseService {
         /* update in metadata database */
         database = databaseRepository.save(database);
         /* save in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated table metadata of database with id {} & search database", database.getId());
         return database;
     }
@@ -344,7 +344,7 @@ public class DatabaseServiceImpl implements DatabaseService {
         /* update in metadata database */
         database = databaseRepository.save(database);
         /* save in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated view metadata of database with id {} & search database", database.getId());
         return database;
     }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java
index 39e4824706a6d89a3588c6748c46ee2c3935b63e..e482cfd3c64e81cda98d0dda1ed29279e384d975 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java
@@ -16,10 +16,10 @@ import at.tuwien.entities.identifier.IdentifierTitle;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.repository.IdentifierRepository;
 import at.tuwien.service.IdentifierService;
+import at.tuwien.service.SearchService;
 import at.tuwien.service.ViewService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
@@ -42,24 +42,24 @@ import java.util.stream.Stream;
 public class IdentifierServiceImpl implements IdentifierService {
 
     private final ViewService viewService;
+    private final SearchService searchService;
     private final MetadataConfig metadataConfig;
     private final MetadataMapper metadataMapper;
     private final TemplateEngine templateEngine;
     private final DataServiceGateway dataServiceGateway;
     private final IdentifierRepository identifierRepository;
-    private final SearchServiceGateway searchServiceGateway;
 
 
-    public IdentifierServiceImpl(ViewService viewService, TemplateEngine templateEngine, MetadataMapper metadataMapper,
-                                 MetadataConfig metadataConfig, DataServiceGateway dataServiceGateway,
-                                 IdentifierRepository identifierRepository, SearchServiceGateway searchServiceGateway) {
+    public IdentifierServiceImpl(ViewService viewService, SearchService searchService, TemplateEngine templateEngine,
+                                 MetadataMapper metadataMapper, MetadataConfig metadataConfig,
+                                 DataServiceGateway dataServiceGateway, IdentifierRepository identifierRepository) {
         this.viewService = viewService;
+        this.searchService = searchService;
         this.metadataConfig = metadataConfig;
         this.metadataMapper = metadataMapper;
         this.templateEngine = templateEngine;
         this.dataServiceGateway = dataServiceGateway;
         this.identifierRepository = identifierRepository;
-        this.searchServiceGateway = searchServiceGateway;
     }
 
     @Override
@@ -153,7 +153,7 @@ public class IdentifierServiceImpl implements IdentifierService {
         identifier.setStatus(IdentifierStatusType.PUBLISHED);
         identifier = identifierRepository.save(identifier);
         /* update in search service */
-        searchServiceGateway.update(identifier.getDatabase());
+        searchService.save(identifier.getDatabase());
         log.info("Published identifier with id {}", identifier.getId());
         return identifier;
     }
@@ -314,7 +314,7 @@ public class IdentifierServiceImpl implements IdentifierService {
         identifier.getDatabase()
                 .getIdentifiers()
                 .add(out);
-        searchServiceGateway.update(identifier.getDatabase());
+        searchService.save(identifier.getDatabase());
         return out;
     }
 
@@ -378,7 +378,7 @@ public class IdentifierServiceImpl implements IdentifierService {
         identifier.getDatabase()
                 .getIdentifiers()
                 .remove(identifier);
-        searchServiceGateway.update(identifier.getDatabase());
+        searchService.save(identifier.getDatabase());
         log.info("Deleted identifier with id {}", identifier.getId());
     }
 
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/SearchServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/SearchServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef9840cbbae8e38962a3b60a6249ffb73743054a
--- /dev/null
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/SearchServiceImpl.java
@@ -0,0 +1,49 @@
+package at.tuwien.service.impl;
+
+import at.tuwien.api.database.DatabaseDto;
+import at.tuwien.entities.database.Database;
+import at.tuwien.exception.DatabaseNotFoundException;
+import at.tuwien.exception.SearchServiceConnectionException;
+import at.tuwien.exception.SearchServiceException;
+import at.tuwien.gateway.SearchServiceGateway;
+import at.tuwien.service.SearchService;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Log4j2
+@Service
+public class SearchServiceImpl implements SearchService {
+
+    private final SearchServiceGateway searchServiceGateway;
+
+    @Autowired
+    public SearchServiceImpl(SearchServiceGateway searchServiceGateway) {
+        this.searchServiceGateway = searchServiceGateway;
+    }
+
+    @Override
+    public DatabaseDto save(Database database) throws SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException {
+        if (!database.getIsPublic() || !database.getIsSchemaPublic()) {
+            log.warn("Database with id {} cannot be saved to be visible in search", database.getId());
+            return null;
+        }
+        database.setTables(database.getTables()
+                .stream()
+                .filter(t -> t.getIsPublic() || t.getIsSchemaPublic())
+                .toList());
+        database.setViews(database.getViews()
+                .stream()
+                .filter(v -> v.getIsPublic() || v.getIsSchemaPublic())
+                .toList());
+        return searchServiceGateway.save(database);
+    }
+
+    @Override
+    public void delete(Long databaseId) throws SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException {
+        searchServiceGateway.delete(databaseId);
+    }
+
+}
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
index 52a9a63667c8faa22bdd142d5161f04e85d70513..6239d95c9e346f675e3c32395fd50c5ffe0e8b91 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
@@ -15,7 +15,6 @@ import at.tuwien.entities.database.table.columns.TableColumnUnit;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.service.*;
@@ -38,26 +37,26 @@ public class TableServiceImpl implements TableService {
     private final UnitService unitService;
     private final RabbitConfig rabbitConfig;
     private final EntityService entityService;
+    private final SearchService searchService;
     private final ConceptService conceptService;
     private final MetadataMapper metadataMapper;
     private final DataServiceGateway dataServiceGateway;
     private final DatabaseRepository databaseRepository;
-    private final SearchServiceGateway searchServiceGateway;
 
     @Autowired
     public TableServiceImpl(UserService userService, UnitService unitService, RabbitConfig rabbitConfig,
-                            EntityService entityService, ConceptService conceptService, MetadataMapper metadataMapper,
-                            DataServiceGateway dataServiceGateway, DatabaseRepository databaseRepository,
-                            SearchServiceGateway searchServiceGateway) {
+                            EntityService entityService, SearchService searchService, ConceptService conceptService,
+                            MetadataMapper metadataMapper, DataServiceGateway dataServiceGateway,
+                            DatabaseRepository databaseRepository) {
         this.userService = userService;
         this.unitService = unitService;
         this.rabbitConfig = rabbitConfig;
         this.entityService = entityService;
+        this.searchService = searchService;
         this.conceptService = conceptService;
         this.metadataMapper = metadataMapper;
         this.dataServiceGateway = dataServiceGateway;
         this.databaseRepository = databaseRepository;
-        this.searchServiceGateway = searchServiceGateway;
     }
 
     @Override
@@ -173,7 +172,7 @@ public class TableServiceImpl implements TableService {
             throw new TableNotFoundException("Failed to find created table");
         }
         /* update in search service */
-        searchServiceGateway.update(entity);
+        searchService.save(entity);
         log.info("Created table with id {}", optional.get().getId());
         return optional.get();
     }
@@ -191,7 +190,7 @@ public class TableServiceImpl implements TableService {
                 .remove(table);
         final Database database = databaseRepository.save(table.getDatabase());
         /* update in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Deleted table with id {}", table.getId());
     }
 
@@ -218,7 +217,7 @@ public class TableServiceImpl implements TableService {
         tableEntity.setDescription(data.getDescription());
         final Database database = databaseRepository.save(table.getDatabase());
         /* update in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated table with id {}", table.getId());
         return tableEntity;
     }
@@ -258,7 +257,7 @@ public class TableServiceImpl implements TableService {
                 .set(table.getColumns().indexOf(column), column);
         final Database database = databaseRepository.save(table.getDatabase());
         /* update in open search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated table column semantics");
         return column;
     }
@@ -310,7 +309,7 @@ public class TableServiceImpl implements TableService {
                 .set(database.getTables().indexOf(table), table);
         databaseRepository.save(database);
         /* update in open search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated statistics for the table and {} column(s)", table.getColumns().size());
         log.trace("updated statistics: {}", table);
     }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
index b0a8f017962ccc808d8f3d1a37ae584fb1106316..2f8e7671ed41667d4891aba73e6cf1b3ae6d0cea 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
@@ -8,9 +8,9 @@ import at.tuwien.entities.database.View;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
-import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.repository.DatabaseRepository;
+import at.tuwien.service.SearchService;
 import at.tuwien.service.ViewService;
 import com.google.common.hash.Hashing;
 import lombok.extern.log4j.Log4j2;
@@ -27,18 +27,18 @@ import java.util.Optional;
 @Service
 public class ViewServiceImpl implements ViewService {
 
+    private final SearchService searchService;
     private final MetadataMapper metadataMapper;
     private final DataServiceGateway dataServiceGateway;
     private final DatabaseRepository databaseRepository;
-    private final SearchServiceGateway searchServiceGateway;
 
     @Autowired
     public ViewServiceImpl(MetadataMapper metadataMapper, DataServiceGateway dataServiceGateway,
-                           DatabaseRepository databaseRepository, SearchServiceGateway searchServiceGateway) {
+                           DatabaseRepository databaseRepository, SearchService searchService) {
         this.metadataMapper = metadataMapper;
         this.dataServiceGateway = dataServiceGateway;
         this.databaseRepository = databaseRepository;
-        this.searchServiceGateway = searchServiceGateway;
+        this.searchService = searchService;
     }
 
     @Override
@@ -81,7 +81,7 @@ public class ViewServiceImpl implements ViewService {
                 .remove(view);
         final Database database = databaseRepository.save(view.getDatabase());
         /* update in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Deleted view with id {}", view.getId());
     }
 
@@ -129,7 +129,7 @@ public class ViewServiceImpl implements ViewService {
             throw new MalformedException("Failed to find created view");
         }
         /* update in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Created view with id {}", optional.get().getId());
         return optional.get();
     }
@@ -151,7 +151,7 @@ public class ViewServiceImpl implements ViewService {
         tmpView.setIsSchemaPublic(data.getIsSchemaPublic());
         database = databaseRepository.save(database);
         /* update in search service */
-        searchServiceGateway.update(database);
+        searchService.save(database);
         log.info("Updated view with id {}", tmpView.getId());
         return optional.get();
     }
diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py
index e4e8581a9ee484c198f5a00a76a58b5296dd4188..797b30f1b91d1b106fe7159de908d032faa6de60 100644
--- a/dbrepo-search-service/app.py
+++ b/dbrepo-search-service/app.py
@@ -5,8 +5,6 @@ from json import dumps
 from typing import List, Any
 
 import requests
-from clients.keycloak_client import User, KeycloakClient
-from clients.opensearch_client import OpenSearchClient
 from dbrepo.api.dto import Database, ApiError
 from flasgger import LazyJSONEncoder, Swagger, swag_from
 from flask import Flask, request
@@ -17,6 +15,9 @@ from opensearchpy import NotFoundError
 from prometheus_flask_exporter import PrometheusMetrics
 from pydantic import ValidationError
 
+from clients.keycloak_client import User, KeycloakClient
+from clients.opensearch_client import OpenSearchClient
+
 logging.addLevelName(level=logging.NOTSET, levelName='TRACE')
 logging.basicConfig(level=logging.DEBUG)
 
@@ -332,13 +333,13 @@ def get_fuzzy_search():
     :return:
     """
     search_term: str = request.args.get('q')
+    logging.debug(f'endpoint get fuzzy search, q={search_term}')
     if search_term is None or len(search_term) == 0:
         return ApiError(status='BAD_REQUEST', message='Provide a search term with ?q=term',
                         code='search.fuzzy.invalid').model_dump(), 400
     logging.debug(f"search request query: {search_term}")
-    results = OpenSearchClient().fuzzy_search(search_term)
-    if "hits" in results and "hits" in results["hits"]:
-        results = [hit["_source"] for hit in results["hits"]["hits"]]
+    results = OpenSearchClient().fuzzy_search(search_term,
+                                              KeycloakClient().userId(request.headers.get('Authorization')))
     return dict({"results": results}), 200
 
 
@@ -354,7 +355,8 @@ def post_general_search(field_type):
         return ApiError(status='UNSUPPORTED_MEDIA_TYPE', message='Content type needs to be application/json',
                         code='search.general.media').model_dump(), 415
     req_body = request.json
-    logging.info(f'Searching in index database for type: {field_type}')
+    logging.debug(f'endpoint get general search, field_type={field_type}')
+    logging.debug(f'=====> {request}')
     t1 = request.args.get("t1")
     if not str(t1).isdigit():
         t1 = None
@@ -362,9 +364,11 @@ def post_general_search(field_type):
     if not str(t2).isdigit():
         t2 = None
     if t1 is not None and t2 is not None and "unit.uri" in req_body and "concept.uri" in req_body:
-        response = OpenSearchClient().unit_independent_search(t1, t2, req_body)
+        response = OpenSearchClient().unit_independent_search(t1, t2, req_body, KeycloakClient().userId(
+            request.headers.get('Authorization')))
     else:
-        response = OpenSearchClient().general_search(field_type, req_body)
+        response = OpenSearchClient().general_search(field_type, req_body,
+                                                     KeycloakClient().userId(request.headers.get('Authorization')))
     # filter by type
     if field_type == 'table':
         tmp = []
diff --git a/dbrepo-search-service/init/clients/keycloak_client.py b/dbrepo-search-service/init/clients/keycloak_client.py
index afa36a1112ce41b5686641f5691df3f44075cf2f..b12c3779f5d8a8385440a99b20c2d5a021b25011 100644
--- a/dbrepo-search-service/init/clients/keycloak_client.py
+++ b/dbrepo-search-service/init/clients/keycloak_client.py
@@ -1,14 +1,15 @@
 import logging
 from dataclasses import dataclass
-import requests
-from flask import current_app
 from typing import List
 
+import requests
+from flask import current_app
 from jwt import jwk_from_pem, JWT
 
 
 @dataclass(init=True, eq=True)
 class User:
+    sub: str
     username: str
     roles: List[str]
 
@@ -33,5 +34,11 @@ class KeycloakClient:
     def verify_jwt(self, access_token: str) -> User:
         public_key = jwk_from_pem(str(current_app.config["JWT_PUBKEY"]).encode('utf-8'))
         payload = JWT().decode(message=access_token, key=public_key, do_time_check=True)
-        logging.debug(f"JWT token client_id={payload.get('client_id')} and realm_access={payload.get('realm_access')}")
         return User(username=payload.get('client_id'), roles=payload.get('realm_access')["roles"])
+
+    def userId(self, request) -> str | None:
+        # get the auth token
+        auth_header = request.headers.get('Authorization')
+        if auth_header:
+            return self.verify_jwt(auth_header.split(" ")[1]).sub
+        return None
diff --git a/dbrepo-search-service/init/clients/opensearch_client.py b/dbrepo-search-service/init/clients/opensearch_client.py
index bf782a7a7e8245c5cd57eea5a641b7f14c46df07..69f6ab7f4cd671fc816cfe0dab6fc777134f5271 100644
--- a/dbrepo-search-service/init/clients/opensearch_client.py
+++ b/dbrepo-search-service/init/clients/opensearch_client.py
@@ -43,18 +43,6 @@ class OpenSearchClient:
                                        http_auth=(self.username, self.password))
         return self.instance
 
-    def get_database(self, database_id: int) -> Database:
-        """
-        Gets a database by given id.
-
-        @param database_id: The database id.
-
-        @returns: The database, if successful.
-        @throws: opensearchpy.exceptions.NotFoundError If the database was not found in the Search Database.
-        """
-        response: dict = self._instance().get(index="database", id=database_id)
-        return Database.model_validate(response["_source"])
-
     def update_database(self, database_id: int, data: Database) -> Database:
         """
         Updates the database data with given id.
@@ -142,7 +130,7 @@ class OpenSearchClient:
                 fields_list.append(entry)
         return fields_list
 
-    def fuzzy_search(self, search_term=None):
+    def fuzzy_search(self, search_term: str = None, userId: str | None = None) -> [Database]:
         logging.info(f"Performing fuzzy search")
         fuzzy_body = {
             "query": {
@@ -159,10 +147,15 @@ class OpenSearchClient:
             index="database",
             body=fuzzy_body
         )
-        logging.info(f"Found {len(response['hits']['hits'])} result(s)")
-        return response
+        results: [Database] = []
+        if "hits" in results and "hits" in response["hits"]:
+            results = [Database.model_validate(hit["_source"]) for hit in response["hits"]["hits"]]
+        results = [database for database in results if database.is_public or database.is_schema_public or (
+                userId is not None and database.owner.id == userId)]
+        return results
 
-    def general_search(self, field_type: str = None, field_value_pairs: dict = None):
+    def general_search(self, field_type: str = None, field_value_pairs: dict = None, userId: str | None = None) -> [
+        Database]:
         """
         Main method for searching stuff in the opensearch db
 
@@ -203,10 +196,15 @@ class OpenSearchClient:
             index="database",
             body=dumps(body)
         )
-        results = [hit["_source"] for hit in response["hits"]["hits"]]
+        results: [Database] = []
+        if "hits" in results and "hits" in response["hits"]:
+            results = [Database.model_validate(hit["_source"]) for hit in response["hits"]["hits"]]
+        results = [database for database in results if database.is_public or database.is_schema_public or (
+                userId is not None and database.owner.id == userId)]
         return results
 
-    def unit_independent_search(self, t1: float, t2: float, field_value_pairs):
+    def unit_independent_search(self, t1: float, t2: float, field_value_pairs: dict, userId: str | None = None) -> [
+        Database]:
         """
         Main method for searching stuff in the opensearch db
 
@@ -287,16 +285,12 @@ class OpenSearchClient:
         body = ''
         for search in searches:
             body += '%s \n' % dumps(search)
-        responses = self._instance().msearch(
+        response = self._instance().msearch(
             body=dumps(body)
         )
-        response = {
-            "hits": {
-                "hits": flatten([hits["hits"]["hits"] for hits in responses["responses"]])
-            },
-            "took": responses["took"]
-        }
-        return response
+        results = flatten([hits["hits"]["hits"] for hits in response["responses"]])
+        return [database for database in results if
+                database.is_public or database.is_schema_public or (userId is not None and database.owner.id == userId)]
 
 
 def key_to_attr_name(key: str) -> str:
diff --git a/dbrepo-search-service/test/test_opensearch_client.py b/dbrepo-search-service/test/test_opensearch_client.py
index e37a96db10aaf44c9f588907295a2622c1fc0d38..c20ce9862408ea3d44a9b8932f0474b5246c3441 100644
--- a/dbrepo-search-service/test/test_opensearch_client.py
+++ b/dbrepo-search-service/test/test_opensearch_client.py
@@ -165,27 +165,6 @@ class OpenSearchClientTest(unittest.TestCase):
             # test
             OpenSearchClient().delete_database(database_id=req.id)
 
-    def test_get_database_succeeds(self):
-        with app.app_context():
-            # mock
-            OpenSearchClient().update_database(database_id=req.id, data=req)
-
-            # test
-            database = OpenSearchClient().get_database(database_id=req.id)
-            self.assertEqual(req.id, database.id)
-
-    def test_get_database_fails(self):
-        with app.app_context():
-
-            # mock
-            OpenSearchClient().update_database(database_id=req.id, data=req)
-
-            # test
-            try:
-                OpenSearchClient().get_database(database_id=req.id)
-            except opensearchpy.exceptions.NotFoundError:
-                pass
-
     def test_get_fields_for_index_database_succeeds(self):
         with app.app_context():
             # mock
diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts
index b8e55da8023daf790048ab9bfd5f48a0b82d2ba3..4bce6ec5c5b3dc7f025734d9bf15d8e914123f79 100644
--- a/dbrepo-ui/nuxt.config.ts
+++ b/dbrepo-ui/nuxt.config.ts
@@ -75,8 +75,8 @@ export default defineNuxtConfig({
         }
       },
       api: {
-        client: 'https://s155.datalab.tuwien.ac.at',
-        server: 'https://s155.datalab.tuwien.ac.at',
+        client: 'http://localhost',
+        server: 'http://gateway-service',
       },
       upload: {
         client: 'http://localhost/api/upload/files',