diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java
index 9850d8535baef894d668e7725334796b761bf88a..fb0421f5c3c497cc8580748fcd111a0932218dec 100644
--- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java
@@ -1,6 +1,5 @@
 package de.ozgcloud.apilib.vorgang.grpc;
 
-import java.util.Collections;
 import java.util.List;
 
 import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
@@ -28,6 +27,7 @@ public class GrpcOzgCloudVorgangService implements OzgCloudVorgangService {
 
 	private final OzgCloudVorgangMapper mapper;
 	private final OzgCloudVorgangStubMapper stubMapper;
+	private final OzgCloudVorgangQueryMapper queryMapper;
 
 	private final OzgCloudCallContextProvider contextProvider;
 
@@ -66,13 +66,23 @@ public class GrpcOzgCloudVorgangService implements OzgCloudVorgangService {
 				.build();
 	}
 
-	VorgangServiceBlockingStub getVorgangServiceStub() {
-		return vorgangServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
-	}
-
 	@Override
 	public List<OzgCloudVorgangStub> find(OzgCloudVorgangQuery query, Page page) {
-		// TODO Auto-generated method stub
-		return Collections.emptyList();
+		var response = getVorgangServiceStub().findVorgang(buildFindRequest(query, page));
+
+		return response.getVorgangList().stream().map(stubMapper::fromGrpc).toList();
+	}
+
+	GrpcFindVorgangRequest buildFindRequest(OzgCloudVorgangQuery query, Page page) {
+		return GrpcFindVorgangRequest.newBuilder()
+				.setLimit(page.getLimit())
+				.setOffset(page.getOffset())
+				.setQuery(queryMapper.toGrpc(query))
+				.setOrderBy(GrpcOrderBy.CREATED_AT_DESC)
+				.build();
+	}
+
+	VorgangServiceBlockingStub getVorgangServiceStub() {
+		return vorgangServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
 	}
 }
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangRequestTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangRequestTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..3fdca504ed4743193ffe38dc66516c7b123a97d7
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangRequestTestFactory.java
@@ -0,0 +1,27 @@
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest.Builder;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest.GrpcOrderBy;
+import de.ozgcloud.vorgang.vorgang.GrpcQuery;
+
+public class GrpcFindVorgangRequestTestFactory {
+
+	public static final GrpcQuery QUERY = GrpcQueryTestFactory.create();
+	public static final int LIMIT = (int) (Math.random() * 100);
+	public static final int OFFSET = (int) (Math.random() * LIMIT);
+
+	public static GrpcFindVorgangRequest create() {
+		return createBuilder()
+				.build();
+	}
+
+	public static Builder createBuilder() {
+		return GrpcFindVorgangRequest.newBuilder()
+				.setLimit(LIMIT)
+				.setOffset(OFFSET)
+				.setQuery(QUERY)
+				.setOrderBy(GrpcOrderBy.CREATED_AT_DESC);
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangResponseTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..9bd3be8ffc2d771f0e3bf611a0b1d0375396edbc
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangResponseTestFactory.java
@@ -0,0 +1,22 @@
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangResponse;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangResponse.Builder;
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader;
+
+public class GrpcFindVorgangResponseTestFactory {
+
+	public static final GrpcVorgangHeader VORGANG_HEADER = GrpcVorgangHeaderTestFactory.create();
+	public static final long TOTAL = (long) (Math.random() * 100);
+
+	public static GrpcFindVorgangResponse create() {
+		return createBuilder().build();
+	}
+
+	public static Builder createBuilder() {
+		return GrpcFindVorgangResponse.newBuilder()
+				.setTotal(TOTAL)
+				.addVorgang(VORGANG_HEADER);
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java
index e93e6d54637aedffdbacb8ca12b010ceaa4253ab..f0c1f15a8f86933f369c8aece52900687a6536b2 100644
--- a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java
@@ -4,6 +4,8 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.List;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -11,7 +13,11 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Spy;
 
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQuery;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQueryTestFactory;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStubTestFactory;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory;
 import de.ozgcloud.apilib.vorgang.Page;
@@ -24,6 +30,7 @@ import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub
 class GrpcOzgCloudVorgangServiceTest {
 
 	@InjectMocks
+	@Spy
 	private GrpcOzgCloudVorgangService service;
 
 	@Mock
@@ -32,6 +39,8 @@ class GrpcOzgCloudVorgangServiceTest {
 	private OzgCloudVorgangMapper mapper;
 	@Mock
 	private OzgCloudVorgangStubMapper stubMapper;
+	@Mock
+	private OzgCloudVorgangQueryMapper queryMapper;
 
 	@Nested
 	class TestGetById {
@@ -150,4 +159,99 @@ class GrpcOzgCloudVorgangServiceTest {
 		}
 
 	}
+
+	@Nested
+	class TestFind {
+
+		private static final Page PAGE = Page.startPage();
+		private final OzgCloudVorgangQuery query = OzgCloudVorgangQueryTestFactory.create();
+		private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.create();
+		private final GrpcFindVorgangResponse response = GrpcFindVorgangResponseTestFactory.create();
+
+		@Mock
+		private VorgangServiceBlockingStub stubWithInterceptor;
+
+		@BeforeEach
+		void mock() {
+			doReturn(stubWithInterceptor).when(service).getVorgangServiceStub();
+			doReturn(request).when(service).buildFindRequest(query, PAGE);
+			when(stubWithInterceptor.findVorgang(request)).thenReturn(response);
+		}
+
+		@Test
+		void shouldGetVorgangServiceStub() {
+			callService();
+
+			verify(service).getVorgangServiceStub();
+		}
+
+		@Test
+		void shouldBuildFindRequest() {
+			callService();
+
+			verify(service).buildFindRequest(query, PAGE);
+		}
+
+		@Test
+		void shouldFindVorgang() {
+			callService();
+
+			verify(stubWithInterceptor).findVorgang(request);
+		}
+
+		@Test
+		void shouldMapResponse() {
+			callService();
+
+			verify(stubMapper).fromGrpc(GrpcFindVorgangResponseTestFactory.VORGANG_HEADER);
+		}
+
+		@Test
+		void shouldReturnMappedVorgangStubs() {
+			var mappedVorgangStub = OzgCloudVorgangStubTestFactory.create();
+			when(stubMapper.fromGrpc(GrpcFindVorgangResponseTestFactory.VORGANG_HEADER)).thenReturn(mappedVorgangStub);
+
+			var vorgangStubs = callService();
+
+			assertThat(vorgangStubs).containsExactly(mappedVorgangStub);
+		}
+
+		private List<OzgCloudVorgangStub> callService() {
+			return service.find(query, PAGE);
+		}
+	}
+
+	@Nested
+	class TestBuildFindRequest {
+
+		private final Page page = Page.builder()
+				.limit(GrpcFindVorgangRequestTestFactory.LIMIT)
+				.offset(GrpcFindVorgangRequestTestFactory.OFFSET)
+				.build();
+
+		private final OzgCloudVorgangQuery ozgCloudVorgangQuery = OzgCloudVorgangQueryTestFactory.create();
+
+		@BeforeEach
+		void mockMapper() {
+			when(queryMapper.toGrpc(ozgCloudVorgangQuery)).thenReturn(GrpcFindVorgangRequestTestFactory.QUERY);
+		}
+
+		@Test
+		void shouldMapToGrpcQuery() {
+			callService();
+
+			verify(queryMapper).toGrpc(ozgCloudVorgangQuery);
+		}
+
+		@Test
+		void shouldReturnRequest() {
+			var request = callService();
+
+			assertThat(request).usingRecursiveComparison().isEqualTo(GrpcFindVorgangRequestTestFactory.create());
+		}
+
+		private GrpcFindVorgangRequest callService() {
+			return service.buildFindRequest(ozgCloudVorgangQuery, page);
+		}
+	}
 }