diff --git a/goofy-client/apps/goofy-e2e/cypress.json b/goofy-client/apps/goofy-e2e/cypress.json
index 07f1d7d07edade45d610d2dbd5074abc8bb44cd6..a96b1ba8aca296ff98b385809c9009dbf41e9e81 100644
--- a/goofy-client/apps/goofy-e2e/cypress.json
+++ b/goofy-client/apps/goofy-e2e/cypress.json
@@ -7,12 +7,12 @@
 		"keycloakUrl": "https://sso.dev.ozg-sh.de/",
 		"keycloakClient": "sh-e2e-dev-goofy",
 		"sabineUuid": "203002d1-c25f-4722-a9aa-a4291e0184bc",
-		"elasticsearch": {
+		"search": {
 			"url": "http://localhost:9200",
 			"index": "e2e-test-index",
 			"user": "elastic",
 			"password": "password"
-		} 
+		}
 	},
 	"fileServerFolder": ".",
 	"fixturesFolder": "./src/fixtures",
diff --git a/goofy-client/apps/goofy-e2e/docker-compose.yml b/goofy-client/apps/goofy-e2e/docker-compose.yml
index 2e7b73b248ae668ea96caa8d754fd94fe75e03c2..9aeed9381150be568b7b6077a9f582fe1e78c501 100644
--- a/goofy-client/apps/goofy-e2e/docker-compose.yml
+++ b/goofy-client/apps/goofy-e2e/docker-compose.yml
@@ -13,7 +13,7 @@ services:
     platform: linux/amd64
     environment:
       - SPRING_DATA_MONGODB_HOST=ozg-mongodb
-      - SPRING_PROFILES_ACTIVE=${SPRING_PROFILE}
+      - SPRING_PROFILES_ACTIVE=${SPRING_PROFILE:-dev,e2e}
       - logging_level_org_springframework_security=${LOGGING_LEVEL:-WARN}
       - SPRING_ELASTICSEARCH_URIS=http://ozg-elastic:9200
       - SPRING_ELASTICSEARCH_USERNAME=elastic
diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts
index 445732dcb64927c9a50a7ec43bf3b4d31cb05ab7..a1e37f16e7b8ddb729aa8ed3a659df9c962d671a 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts
@@ -6,7 +6,7 @@ import { VorgangPage } from '../../../page-objects/vorgang.po';
 import { dropCollections, reload } from '../../../support/cypress-helper';
 import { CypressKeyboardActions, exist, notExist } from '../../../support/cypress.util';
 import { loginAsEmil, UserRoleE2E } from '../../../support/user-util';
-import { buildVorgang, createVorgang, initElasticsearch, initVorgaenge, objectIds } from '../../../support/vorgang-util';
+import { buildVorgang, createVorgang, initSearchIndex, initVorgaenge, objectIds } from '../../../support/vorgang-util';
 
 describe('VorgangList Suche for EA User', () => {
 	const mainPage: MainPage = new MainPage();
@@ -29,7 +29,7 @@ describe('VorgangList Suche for EA User', () => {
 		before(() => {
 			initVorgaenge([vorgangToStay, vorgangToDisappear])
 
-			initElasticsearch([vorgangToStay, vorgangToDisappear])
+			initSearchIndex([vorgangToStay, vorgangToDisappear])
 
 			loginAsEmil();
 
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts
index 417da36ef95e80ce999ff6a93d5b40b8b4368187..714751cdb1e5415f00616cbffd53f5e7c1a95e15 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts
@@ -5,7 +5,7 @@ import { MainPage, waitForSpinnerToDisappear } from 'apps/goofy-e2e/src/page-obj
 import { dropCollections } from 'apps/goofy-e2e/src/support/cypress-helper';
 import { CypressKeyboardActions, exist, notExist } from 'apps/goofy-e2e/src/support/cypress.util';
 import { getUserSabineUuid, loginAsSabine } from 'apps/goofy-e2e/src/support/user-util';
-import { buildVorgang, createVorgang, initVorgaenge, objectIds } from 'apps/goofy-e2e/src/support/vorgang-util';
+import { buildVorgang, createVorgang, initSearchIndex, initVorgaenge, objectIds } from 'apps/goofy-e2e/src/support/vorgang-util';
 
 describe('Navigation', () => {
 	const mainPage: MainPage = new MainPage();
@@ -22,6 +22,7 @@ describe('Navigation', () => {
 
 	before(() => {
 		initVorgaenge([vorgang, vorgangNotBeFiltered, vorgangAssigned, vorgangAssignedNotBeFiltered]);
+		initSearchIndex([vorgang, vorgangNotBeFiltered, vorgangAssigned, vorgangAssignedNotBeFiltered]);
 
 		loginAsSabine();
 
@@ -62,8 +63,7 @@ describe('Navigation', () => {
 			exist(vorgangList.getListItem(vorgangAssignedNotBeFiltered.name).getRoot());
 		})
 
-		// Skipped wegen OZG-2964 E2E Tests funktionieren nicht mit Ansible+ElasticSearch
-		it.skip('should hide not matching vorgaenge after do search', () => {
+		it('should hide not matching vorgaenge after do search', () => {
 			doSearch(searchString);
 			waitForSpinnerToDisappear();
 
@@ -86,8 +86,7 @@ describe('Navigation', () => {
 			exist(vorgangList.getListItem(vorgangAssignedNotBeFiltered.name).getRoot());
 		})
 
-		// Skipped wegen OZG-2964 E2E Tests funktionieren nicht mit Ansible+ElasticSearch
-		it.skip('should hide not matching vorgaenge after do search', () => {
+		it('should hide not matching vorgaenge after do search', () => {
 			doSearch(searchString);
 			waitForSpinnerToDisappear();
 
diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
index a44e788e4e1e0de42edf4a1f7d124ad665a4ec1c..4c12baf8657cec86779e628707f53071cbb90962 100644
--- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
+++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts
@@ -6,13 +6,12 @@ import { EingangE2E, VorgangE2E, VorgangStatusE2E } from 'apps/goofy-e2e/src/mod
 import { VorgangPage } from 'apps/goofy-e2e/src/page-objects/vorgang.po';
 import { dropCollections, reload } from 'apps/goofy-e2e/src/support/cypress-helper';
 import { generate12ByteId } from 'apps/goofy-e2e/src/support/tech.util';
-import { AntragstellerE2ETestData, buildVorgang, createVorgang, EingangE2ETestData, EingangHeaderE2ETestData, initVorgaenge } from 'apps/goofy-e2e/src/support/vorgang-util';
+import { AntragstellerE2ETestData, buildVorgang, createVorgang, EingangE2ETestData, EingangHeaderE2ETestData, initSearchIndex, initVorgaenge, objectIds } from 'apps/goofy-e2e/src/support/vorgang-util';
 import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
 import { CypressKeyboardActions, exist, haveText, haveValue, notExist } from '../../../support/cypress.util';
 import { loginAsSabine, UserRoleE2E } from '../../../support/user-util';
 
-// Skipped wegen OZG-2964 E2E Tests funktionieren nicht mit Ansible+ElasticSearch
-describe.skip('VorgangList Suche', () => {
+describe('VorgangList Suche', () => {
 	const mainPage: MainPage = new MainPage();
 	const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
 
@@ -35,6 +34,7 @@ describe.skip('VorgangList Suche', () => {
 
 		before(() => {
 			initVorgaenge([vorgangToStay, vorgangToDisappear])
+			initSearchIndex([vorgangToStay, vorgangToDisappear])
 
 			loginAsSabine();
 
@@ -47,7 +47,7 @@ describe.skip('VorgangList Suche', () => {
 		})
 
 		it('should filter list', () => {
-			doSearchWith(requestId);
+			doSearchWith(vorgangToStay.name);
 			waitForSpinnerToDisappear();
 
 			exist(vorgangStayInList.getRoot());
@@ -57,7 +57,7 @@ describe.skip('VorgangList Suche', () => {
 		describe('on reload', () => {
 
 			beforeEach(() => {
-				doSearchWith(requestId);
+				doSearchWith(vorgangToStay.name);
 			})
 
 			it('should filter list and keep criteria on reload', () => {
@@ -74,14 +74,14 @@ describe.skip('VorgangList Suche', () => {
 				waitForSpinnerToDisappear();
 
 				exist(mainPage.getVorgangSearch().getRoot())
-				haveValue(mainPage.getVorgangSearch().getInput(), requestId);
+				haveValue(mainPage.getVorgangSearch().getInput(), vorgangToStay.name);
 			})
 		})
 
 		describe('navigate with filtered list to vorgang detail', () => {
 
 			beforeEach(() => {
-				doSearchWith(requestId);
+				doSearchWith(vorgangToStay.name);
 				waitForSpinnerToDisappear();
 
 				exist(vorgangList.getRoot());
@@ -105,7 +105,7 @@ describe.skip('VorgangList Suche', () => {
 		describe('on clear search button', () => {
 
 			it('should show unfiltered list', () => {
-				doSearchWith(requestId);
+				doSearchWith(vorgangToStay.name);
 				waitForSpinnerToDisappear();
 
 				mainPage.getVorgangSearch().getClearButton().click();
@@ -125,13 +125,14 @@ describe.skip('VorgangList Suche', () => {
 		const vorgang: VorgangE2E = { ...createVorgang(), name: vorgangName };
 
 		const vorgangOtherName: string = 'VorgangOther';
-		const vorgangOther: VorgangE2E = { ...buildVorgang(generate12ByteId(), vorgangOtherName), status: VorgangStatusE2E.NEU };
+		const vorgangOther: VorgangE2E = { ...buildVorgang(objectIds[0], vorgangOtherName), status: VorgangStatusE2E.NEU };
 
 		const previewListItemVorgang: VorgangSearchPreviewListItemE2EComponent = mainPage.getVorgangSearch().getVorgangSearchPreviewListItem(vorgang.name);
 		const previewListItemVorgangOther: VorgangSearchPreviewListItemE2EComponent = mainPage.getVorgangSearch().getVorgangSearchPreviewListItem(vorgangOther.name);
 
 		before(() => {
 			initVorgaenge([vorgang, vorgangOther])
+			initSearchIndex([vorgang, vorgangOther])
 
 			loginAsSabine();
 
@@ -221,7 +222,7 @@ describe.skip('VorgangList Suche', () => {
 			antragsteller: { ...AntragstellerE2ETestData, vorname: NO_MATCH, nachname: NO_MATCH },
 			header: { ...EingangHeaderE2ETestData, requestId: NO_MATCH }
 		}
-		const vorgangStayByVorgangName: VorgangE2E = { ...buildVorgang(generate12ByteId(), vorgangNameToMatch), aktenzeichen: NO_MATCH, eingangs: [eingangByVorgangName] };
+		const vorgangStayByVorgangName: VorgangE2E = { ...buildVorgang(objectIds[0], vorgangNameToMatch), aktenzeichen: NO_MATCH, eingangs: [eingangByVorgangName] };
 
 
 		const aktenzeichenToMatch: string = 'Ein Aktenzeichen';
@@ -239,7 +240,7 @@ describe.skip('VorgangList Suche', () => {
 			antragsteller: { ...AntragstellerE2ETestData, vorname: antragstellerVornameToMatch, nachname: NO_MATCH },
 			header: { ...EingangHeaderE2ETestData, requestId: NO_MATCH }
 		}
-		const vorgangStayByAntragstellerVorname: VorgangE2E = { ...buildVorgang(generate12ByteId(), 'VorgangStayByAntragstellerVorname'), aktenzeichen: NO_MATCH, eingangs: [eingangByAntragstellerVorname] };
+		const vorgangStayByAntragstellerVorname: VorgangE2E = { ...buildVorgang(objectIds[1], 'VorgangStayByAntragstellerVorname'), aktenzeichen: NO_MATCH, eingangs: [eingangByAntragstellerVorname] };
 
 
 		const antragstellerNachnameToMatch: string = 'Nachname vom Antragsteller';
@@ -248,7 +249,7 @@ describe.skip('VorgangList Suche', () => {
 			antragsteller: { ...AntragstellerE2ETestData, vorname: NO_MATCH, nachname: antragstellerNachnameToMatch },
 			header: { ...EingangHeaderE2ETestData, requestId: NO_MATCH }
 		}
-		const vorgangStayByAntragstellerNachname: VorgangE2E = { ...buildVorgang(generate12ByteId(), 'VorgangStayByAntragstellerNachname'), aktenzeichen: NO_MATCH, eingangs: [eingangByAntragstellerNachname] };
+		const vorgangStayByAntragstellerNachname: VorgangE2E = { ...buildVorgang(objectIds[2], 'VorgangStayByAntragstellerNachname'), aktenzeichen: NO_MATCH, eingangs: [eingangByAntragstellerNachname] };
 
 
 		const requestIdToMatch: string = "EINNE_TOLLE_REQUEST_ID";
@@ -257,11 +258,12 @@ describe.skip('VorgangList Suche', () => {
 			antragsteller: { ...AntragstellerE2ETestData, vorname: NO_MATCH, nachname: NO_MATCH },
 			header: { ...EingangHeaderE2ETestData, requestId: requestIdToMatch }
 		}
-		const vorgangStayByRequestId: VorgangE2E = { ...buildVorgang(generate12ByteId(), 'VorgangStayByRequestId'), aktenzeichen: NO_MATCH, eingangs: [eingangByRequestId] };
+		const vorgangStayByRequestId: VorgangE2E = { ...buildVorgang(objectIds[3], 'VorgangStayByRequestId'), aktenzeichen: NO_MATCH, eingangs: [eingangByRequestId] };
 
 
 		before(() => {
 			initVorgaenge([vorgangStayByVorgangName, vorgangStayByAktenzeichen, vorgangStayByAntragstellerVorname, vorgangStayByAntragstellerNachname, vorgangStayByRequestId])
+			initSearchIndex([vorgangStayByVorgangName, vorgangStayByAktenzeichen, vorgangStayByAntragstellerVorname, vorgangStayByAntragstellerNachname, vorgangStayByRequestId])
 
 			loginAsSabine();;
 
diff --git a/goofy-client/apps/goofy-e2e/src/support/commands.ts b/goofy-client/apps/goofy-e2e/src/support/commands.ts
index 3d4589b8821f61eb474aec2e3403e137d79445fd..458e9453440a0a98d2dea09d1c240eccef8151fe 100644
--- a/goofy-client/apps/goofy-e2e/src/support/commands.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/commands.ts
@@ -7,7 +7,8 @@ declare namespace Cypress {
 		login(user, password);
 		logout();
 		getUserInfo();
-		addVorgangToElasticsearchIndex(vorgang);
+		addVorgangToSearchIndex(vorgang);
+		removeAllDocumentsFromSearchIndex();
 	}
 }
 
@@ -86,26 +87,44 @@ Cypress.Commands.add('logout', () => {
 	});
 })
 
-Cypress.Commands.add('addVorgangToElasticsearchIndex', (vorgang) => {
-	const elasticsearchEnv = Cypress.env("elasticsearch") 
-	const token = btoa(`${elasticsearchEnv["user"]}:${elasticsearchEnv["password"]}`)
+Cypress.Commands.add('addVorgangToSearchIndex', (vorgang) => {
+	const searchEnv = Cypress.env("search")
+	const token = btoa(`${searchEnv["user"]}:${searchEnv["password"]}`)
 
 	cy.request({
 		method: 'POST',
-		url: `${elasticsearchEnv["url"]}/${elasticsearchEnv["index"]}/_doc/${vorgang._id.$oid}`,
+		url: `${searchEnv["url"]}/${searchEnv["index"]}/_doc/${vorgang._id.$oid}`,
 		headers: {
 			'Authorization': `Basic ${token}`
 		},
-		body: { 
+		body: {
 			"_class" : "de.itvsh.ozg.pluto.common.search.IndexedVorgang",
 			"vorgangId" : vorgang._id.$oid,
 			"vorgangName" : vorgang.name,
 			"vorgangNummer" : vorgang.nummer,
 			"createdAt" : vorgang.createdAt.$date,
-			"antragstellerName" : "Testermann",
-			"antragstellerVorname" : "Max",
+			"antragstellerName" : vorgang.eingangs[0]?.antragsteller.nachname,
+			"antragstellerVorname" : vorgang.eingangs[0]?.antragsteller.vorname,
 			"status" : vorgang.status,
-			"organisationseinheitenId" : "12345678"
+			"organisationseinheitenId" : vorgang.eingangs[0]?.zustaendigeStelle.organisationseinheitenId
+		}
+	});
+})
+
+Cypress.Commands.add('removeAllDocumentsFromSearchIndex', () => {
+	const searchEnv = Cypress.env("search")
+	const token = btoa(`${searchEnv["user"]}:${searchEnv["password"]}`)
+
+	cy.request({
+		method: 'POST',
+		url: `${searchEnv["url"]}/${searchEnv["index"]}/_delete_by_query`,
+		headers: {
+			'Authorization': `Basic ${token}`
+		},
+		body: {
+			"query": {
+				"match_all": {}
+			}
 		}
 	});
 })
diff --git a/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts b/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts
index c29bb7aeca7192d1fc575d9ef4eeae58e5c24f12..975ba502c96101ea83c25ca6549820c5f602d61e 100644
--- a/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts
@@ -65,9 +65,10 @@ export function initVorgangData(data: VorgangE2E[]): void {
 	cy.task(CypressTasks.INIT_VORGANG_DATA, { collection: MongoCollections.VORGANG, data });
 }
 
-export function initElasticsearchData(vorgaenge: VorgangE2E[]): void {
+export function initSearchIndexData(vorgaenge: VorgangE2E[]): void {
+	cy.removeAllDocumentsFromSearchIndex();
 	vorgaenge.forEach(vorgang => {
-		cy.addVorgangToElasticsearchIndex(vorgang)
+		cy.addVorgangToSearchIndex(vorgang)
 	})
 }
 
diff --git a/goofy-client/apps/goofy-e2e/src/support/vorgang-util.ts b/goofy-client/apps/goofy-e2e/src/support/vorgang-util.ts
index fa4c922ac78967d51d2adb40753d41e192c50556..ba2a5d5e69e61fed2358ef9091098e02f14e15f6 100644
--- a/goofy-client/apps/goofy-e2e/src/support/vorgang-util.ts
+++ b/goofy-client/apps/goofy-e2e/src/support/vorgang-util.ts
@@ -1,6 +1,6 @@
 import { AccessPermissionE2E, AntragstellerE2E, ClientAttributeE2E, ClientAttributesE2E, EingangE2E, EingangHeaderE2E, VorgangE2E } from '../model/vorgang';
 import { VorgangAttachedItemClientE2E } from '../model/vorgang-attached-item';
-import { initVorgangData, initElasticsearchData } from './cypress-helper';
+import { initSearchIndexData, initVorgangData } from './cypress-helper';
 import { buildUrl, encodeUrl } from './tech.util';
 
 export const objectIds: string[] = require('../fixtures/util/object_id_collection.json');
@@ -18,8 +18,8 @@ export function buildVorgang($oid: string, uiIdentifier: string): VorgangE2E {
 	};
 }
 
-export function initElasticsearch(vorgaenge: VorgangE2E[]): void {
-	initElasticsearchData(vorgaenge);
+export function initSearchIndex(vorgaenge: VorgangE2E[]): void {
+	initSearchIndexData(vorgaenge);
 }
 
 export function initVorgang(vorgang: VorgangE2E): void {
diff --git a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh
index b1897a85c30516d9b437551eb328c32af2a4c522..d24d6f7dd5861e977d41b4f3429e4747ee305317 100755
--- a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh
+++ b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh
@@ -1,10 +1,33 @@
-docker-compose up -d ozg-mongodb ozg-elastic
+#!/bin/bash
 
-while [[ $(curl -w '%{http_code}' "http://localhost:9200" | grep -c 200) != 1 ]]
+SCRIPT_DIR=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+if nc -z localhost 9091 &> /dev/null
+then
+	echo "Pluto already running. Exiting."
+	exit
+fi
+
+echo "Using docker-compose -f ${SCRIPT_DIR}/docker-compose.yml ..."
+echo
+
+docker-compose -f ${SCRIPT_DIR}/docker-compose.yml up -d ozg-mongodb ozg-elastic
+
+echo
+while [[ $(curl -sw '%{http_code}' "http://localhost:9200" | grep -c 200) != 1 ]]
 do
-    sleep 1
+	echo "Waiting for search service coming up..."
+    sleep 3
 done
 
-SPRING_PROFILE=dev,e2e,initSearchIndex docker-compose up ozg-pluto
+echo
+echo "Starting Pluto to init search index..."
+SPRING_PROFILE=dev,e2e,initSearchIndex docker-compose -f ${SCRIPT_DIR}/docker-compose.yml up ozg-pluto
+
+echo
+echo "Starting Pluto and Goofy for normal operations..."
+SPRING_PROFILE=dev,e2e docker-compose -f ${SCRIPT_DIR}/docker-compose.yml up -d ozg-pluto ozg-goofy
 
-SPRING_PROFILE=dev,e2e docker-compose up ozg-pluto ozg-goofy
\ No newline at end of file
+echo
+echo "Check for \"Started\" lines:"
+docker-compose -f ${SCRIPT_DIR}/docker-compose.yml logs -f | egrep "(Starting|Started)"
diff --git a/goofy-client/apps/goofy-e2e/stop-e2e-environment.sh b/goofy-client/apps/goofy-e2e/stop-e2e-environment.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9dae589d6852b6e7d5d379b0fe2d176ac965522b
--- /dev/null
+++ b/goofy-client/apps/goofy-e2e/stop-e2e-environment.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+SCRIPT_DIR=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+echo "Using docker-compose -f ${SCRIPT_DIR}/docker-compose.yml ..."
+echo
+
+docker-compose -f ${SCRIPT_DIR}/docker-compose.yml down