diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/EditProjectMembersBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/EditProjectMembersBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..eea618bccfa31647c518bde4fb4d8b57810cd64c
--- /dev/null
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/EditProjectMembersBean.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Michael Simon.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Public License v3.0
+ * which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/gpl.html
+ * 
+ * Contributors:
+ *     Haykuhi Musheghyan - initial
+ ******************************************************************************/
+package edu.kit.scc.webreg.bean.admin.project;
+
+import static edu.kit.scc.webreg.dao.ops.RqlExpressions.equal;
+import static edu.kit.scc.webreg.entity.UserEntity_.userStatus;
+import static edu.kit.scc.webreg.entity.UserStatus.ACTIVE;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import org.primefaces.model.LazyDataModel;
+
+import edu.kit.scc.webreg.entity.UserEntity;
+import edu.kit.scc.webreg.entity.project.ExternalOidcProjectEntity;
+import edu.kit.scc.webreg.entity.project.LocalProjectEntity;
+import edu.kit.scc.webreg.entity.project.ProjectEntity;
+import edu.kit.scc.webreg.entity.project.ProjectMembershipEntity;
+import edu.kit.scc.webreg.entity.project.ProjectMembershipType;
+import edu.kit.scc.webreg.model.GenericLazyDataModelImpl;
+import edu.kit.scc.webreg.service.UserService;
+import edu.kit.scc.webreg.service.project.ProjectService;
+import edu.kit.scc.webreg.session.SessionManager;
+import edu.kit.scc.webreg.util.LoadFromAppConfig;
+import jakarta.faces.event.ComponentSystemEvent;
+import jakarta.faces.view.ViewScoped;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import lombok.Getter;
+import lombok.Setter;
+
+@Named
+@ViewScoped
+public class EditProjectMembersBean implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@Inject
+	private SessionManager session;
+
+	@Inject
+	private ProjectService projectService;
+
+	@Inject
+	private UserService userService;
+
+	@Inject
+	private LoadFromAppConfig config;
+
+	@Getter
+	@Setter
+	private ProjectEntity entity;
+
+	private List<ProjectMembershipEntity> membersList;
+
+	private LazyDataModel<UserEntity> allUserList;
+
+	@Getter
+	@Setter
+	private Long projectId;
+
+	public void preRenderView(ComponentSystemEvent ev) {
+		if (entity == null) {
+			entity = projectService.fetch(projectId);
+		}
+	}
+
+	public void addMember(UserEntity user) {
+
+		ProjectMembershipEntity isMember = projectService.findByIdentityAndProject(user.getIdentity(), getEntity());
+
+		if (isMember == null) {
+
+			ProjectMembershipEntity pme = new ProjectMembershipEntity();
+			pme.setMembershipType(ProjectMembershipType.MEMBER);
+
+			config.getMemberShipValdity().ifPresent(validity -> pme
+					.setMembershipValidity(new Date(System.currentTimeMillis() + validity)));
+
+			projectService.addProjectMember(getEntity(), user.getIdentity(), pme, "idty-" + user.getIdentity().getId());
+
+		}
+
+		membersList = null;
+	}
+
+	public String cancel() {
+		if (entity instanceof ExternalOidcProjectEntity)
+			return "show-external-oidc-project.xhtml?faces-redirect=true&id=" + entity.getId();
+		else if (entity instanceof LocalProjectEntity)
+			return "show-local-project.xhtml?faces-redirect=true&id=" + entity.getId();
+		else
+			return "";
+	}
+
+	public List<ProjectMembershipEntity> getMembersList() {
+		if (membersList == null) {
+			membersList = projectService.findMembersForProject(getEntity());
+		}
+		return membersList;
+	}
+
+	public LazyDataModel<UserEntity> getAllUserList() {
+		if (allUserList == null) {
+			allUserList = new GenericLazyDataModelImpl<UserEntity, UserService>(userService, equal(userStatus, ACTIVE));
+		}
+		return allUserList;
+	}
+
+	public void deleteProjectMembership(ProjectMembershipEntity pme) {
+		projectService.removeProjectMember(pme, "idty-" + pme.getIdentity().getId());
+	}
+
+}
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java
index 0119dbfca29e2419747abad51a089a312639ffe2..c0dc95c7d3179c7ea404bc67682050cde9681634 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/project/ShowLocalProjectBean.java
@@ -24,6 +24,8 @@ import jakarta.faces.event.ComponentSystemEvent;
 import jakarta.faces.view.ViewScoped;
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
+import lombok.Getter;
+import lombok.Setter;
 
 @Named("admin.showLocalProjectBean")
 @ViewScoped
@@ -40,23 +42,20 @@ public class ShowLocalProjectBean implements Serializable {
 	@Inject
 	private SessionManager session;
 	
+	@Setter
 	private LocalProjectEntity entity;
+	
 	private List<ProjectMembershipEntity> memberList;
+	
 	private List<ProjectIdentityAdminEntity> adminList;
 
+	@Getter
+	@Setter
 	private Long id;
 
 	public void preRenderView(ComponentSystemEvent ev) {
 	}
 
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
 	public void syncAllMembersToGroup() {
 		projectService.syncAllMembersToGroup(getEntity(), "idty-" + session.getIdentityId());
 	}
@@ -73,10 +72,6 @@ public class ShowLocalProjectBean implements Serializable {
 		return entity;
 	}
 
-	public void setEntity(LocalProjectEntity entity) {
-		this.entity = entity;
-	}
-
 	public List<ProjectMembershipEntity> getMemberList() {
 		if (memberList == null) {
 			memberList = projectService.findMembersForProject(getEntity());
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java
index b7db8a5b05d9ee20299e93215de00b14fd46a430..ff8ad89520715283e4ceb968461f6f29d416b419 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserProjectCreateNewBean.java
@@ -107,10 +107,8 @@ public class UserProjectCreateNewBean implements Serializable {
 
 		}
 
-		if (config.getProjectValdity() != 0L)
-			entity.setProjectValidity(new Date(System.currentTimeMillis() + config.getProjectValdity()));
-		else
-			entity.setProjectValidity(null);
+		config.getProjectValdity()
+				.ifPresent(validity -> entity.setProjectValidity(new Date(System.currentTimeMillis() + validity)));
 
 		entity = localProjectService.save(entity, getIdentity().getId());
 
@@ -124,10 +122,8 @@ public class UserProjectCreateNewBean implements Serializable {
 			ProjectMembershipEntity pme = new ProjectMembershipEntity();
 			pme.setMembershipType(ProjectMembershipType.MEMBER);
 
-			if (config.getMemberShipValdity() != 0L)
-				pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity()));
-			else
-				pme.setMembershipValidity(null);
+			config.getMemberShipValdity()
+					.ifPresent(validity -> pme.setMembershipValidity(new Date(System.currentTimeMillis() + validity)));
 
 			projectService.addProjectMember(entity, getIdentity(), pme, "idty-" + getIdentity().getId());
 			messageGenerator.addResolvedInfoMessage("success", "project.local_project.create_edit_name_add_member",
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java
index 080b6b1b3cfd9d46a0ac426a886694c131a34c7a..fea6084f4de1a001b3ebebb5983fe20d3ab2ecdc 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowLocalProjectBean.java
@@ -119,10 +119,8 @@ public class UserShowLocalProjectBean implements Serializable {
 			pme.setReasonToApproveDenyMembership(getApplyReason());
 			pme.setMembershipType(ProjectMembershipType.MEMBER);
 			
-			if (config.getMemberShipValdity() != 0L)
-				pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity()));
-			else
-				pme.setMembershipValidity(null);			
+			config.getMemberShipValdity().ifPresent(validity -> pme
+					.setMembershipValidity(new Date(System.currentTimeMillis() + validity)));
 			
 			projectService.updateProjectMemberStatus(pme, "idty-" + session.getIdentityId());					
 		}
@@ -147,10 +145,8 @@ public class UserShowLocalProjectBean implements Serializable {
 			pme.setReasonToApproveDenyMembership(declineReason);
 			pme.setMembershipType(ProjectMembershipType.NOTMEMBER);
 			
-			if (config.getMemberShipValdity() != 0L)
-				pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity()));
-			else
-				pme.setMembershipValidity(null);
+			config.getMemberShipValdity().ifPresent(validity -> pme
+					.setMembershipValidity(new Date(System.currentTimeMillis() + validity)));
 			
 			projectService.updateProjectMemberStatus(pme, "idty-" + session.getIdentityId());
 		}
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java
index 1010927f0fc21bce2fc07a2ad187ae30158061cb..57b3d02c2584a235d929364054d74c063f260de1 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserShowPublicProjectBean.java
@@ -114,10 +114,8 @@ public class UserShowPublicProjectBean implements Serializable {
 			pme.setReasonToApplyForMembership(reason);
 			pme.setMembershipType(ProjectMembershipType.APPLICANT);
 			
-			if (config.getMemberShipValdity() != 0L)
-				pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity()));
-			else
-				pme.setMembershipValidity(null);
+			config.getMemberShipValdity().ifPresent(validity -> pme
+					.setMembershipValidity(new Date(System.currentTimeMillis() + validity)));
 			
 			projectService.addProjectMember(entity, identity, pme, "idty-" + session.getIdentityId());
 			messageGenerator.addResolvedInfoMessage("project.public_project.apply",
@@ -129,10 +127,8 @@ public class UserShowPublicProjectBean implements Serializable {
 			isMember.setReasonToApplyForMembership(reason);
 			isMember.setMembershipType(ProjectMembershipType.APPLICANT);
 			
-			if (config.getMemberShipValdity() != 0L)
-				isMember.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity()));
-			else
-				isMember.setMembershipValidity(null);	
+			config.getMemberShipValdity().ifPresent(validity -> isMember
+					.setMembershipValidity(new Date(System.currentTimeMillis() + validity)));
 			
 			projectService.updateProjectMemberStatus(isMember, "idty-" + session.getIdentityId());
 			messageGenerator.addResolvedInfoMessage("project.public_project.apply",
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java
index f6e77afc463c658b5ec031943f380003f36b8357..15bc1c38f0b42b9ad778b3e5ed176c4fc67de75f 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/UserSubprojectCreateNewBean.java
@@ -39,8 +39,8 @@ import jakarta.faces.view.ViewScoped;
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
 import jakarta.persistence.Column;
-import edu.kit.scc.webreg.util.LoadFromAppConfig;
-
+import lombok.Getter;
+import lombok.Setter;
 
 @Named
 @ViewScoped
@@ -56,13 +56,13 @@ public class UserSubprojectCreateNewBean implements Serializable {
 
 	@Inject
 	private ProjectService projectService;
-	
+
 	@Inject
 	private IdentityService identityService;
-	
+
 	@Inject
 	private LoadFromAppConfig config;
-	
+
 	@Inject
 	private FacesMessageGenerator messageGenerator;
 
@@ -70,17 +70,20 @@ public class UserSubprojectCreateNewBean implements Serializable {
 	private LocalProjectEntity entity;
 
 	private Boolean selfMember;
+	
+	@Getter
+	@Setter
 	private Long parentId;
 	private LocalProjectEntity parentProject;
-	
+
 	private ProjectIdentityAdminEntity adminIdentity;
 	private List<ProjectIdentityAdminEntity> adminList;
-	
+
 	public void preRenderView(ComponentSystemEvent ev) {
-		if (! getParentProject().getSubProjectsAllowed()) {
+		if (!getParentProject().getSubProjectsAllowed()) {
 			throw new NotAuthorizedException("Subpropjects are not allowed for this project");
 		}
-		
+
 		for (ProjectIdentityAdminEntity a : getAdminList()) {
 			if (a.getIdentity().getId().equals(session.getIdentityId())) {
 				adminIdentity = a;
@@ -91,7 +94,7 @@ public class UserSubprojectCreateNewBean implements Serializable {
 		if (adminIdentity == null) {
 			throw new NotAuthorizedException("Not authorized");
 		} else {
-			if (! adminIdentity.getType().equals(ProjectAdminType.OWNER)) {
+			if (!adminIdentity.getType().equals(ProjectAdminType.OWNER)) {
 				throw new NotAuthorizedException("Not authorized. You need Owner rights on the parent project.");
 			}
 		}
@@ -116,16 +119,19 @@ public class UserSubprojectCreateNewBean implements Serializable {
 			messageGenerator.addErrorMessage("Ein Fehler ist aufgetreten", e.toString());
 			return;
 		}
-	
+
 		if (entity.getName().length() > projectEntityDbColumnAnnotation.length()) {
-			messageGenerator.addResolvedErrorMessage("failure", "project.local_project.create_edit_name_length_details", true);
+			messageGenerator.addResolvedErrorMessage("failure", "project.local_project.create_edit_name_length_details",
+					true);
 			return;
 		}
-		
-		Number existingProjectShortNames = localProjectService.countAll(equal(LocalProjectEntity_.shortName, entity.getShortName()));
-		Number existingProjectGroupNames = localProjectService.countAll(equal(LocalProjectEntity_.groupName, entity.getGroupName()));
-		
-		if (existingProjectShortNames.intValue() > 0 || existingProjectGroupNames.intValue() > 0 ) {
+
+		Number existingProjectShortNames = localProjectService
+				.countAll(equal(LocalProjectEntity_.shortName, entity.getShortName()));
+		Number existingProjectGroupNames = localProjectService
+				.countAll(equal(LocalProjectEntity_.groupName, entity.getGroupName()));
+
+		if (existingProjectShortNames.intValue() > 0 || existingProjectGroupNames.intValue() > 0) {
 			messageGenerator.addResolvedErrorMessage("failure", "project.local_project.create_edit_name_unique_details",
 					true);
 			return;
@@ -133,12 +139,10 @@ public class UserSubprojectCreateNewBean implements Serializable {
 		}
 
 		entity.setParentProject(getParentProject());
-		
-		if (config.getProjectValdity() != 0L)
-			entity.setProjectValidity(new Date(System.currentTimeMillis() + config.getProjectValdity()));
-		else 
-			entity.setProjectValidity(null);
-				
+
+		config.getProjectValdity()
+				.ifPresent(validity -> entity.setProjectValidity(new Date(System.currentTimeMillis() + validity)));
+
 		entity = localProjectService.save(entity, getIdentity().getId());
 
 		if (entity != null) {
@@ -147,28 +151,26 @@ public class UserSubprojectCreateNewBean implements Serializable {
 		}
 
 		if (getSelfMember()) {
-			
+
 			ProjectMembershipEntity pme = new ProjectMembershipEntity();
 			pme.setMembershipType(ProjectMembershipType.MEMBER);
-			
-			if (config.getMemberShipValdity() != 0L)
-				pme.setMembershipValidity(new Date(System.currentTimeMillis() + config.getMemberShipValdity()));
-			else
-				pme.setMembershipValidity(null);
-			
+
+			config.getMemberShipValdity()
+					.ifPresent(validity -> pme.setMembershipValidity(new Date(System.currentTimeMillis() + validity)));
+
 			projectService.addProjectMember(entity, getIdentity(), pme, "idty-" + getIdentity().getId());
 			messageGenerator.addResolvedInfoMessage("success", "project.local_project.create_edit_name_add_member",
 					true);
 		}
 
 		try {
-			FacesContext.getCurrentInstance().getExternalContext().redirect(ViewIds.PROJECT_LOCAL_SHOW + "?id=" + entity.getId());
+			FacesContext.getCurrentInstance().getExternalContext()
+					.redirect(ViewIds.PROJECT_LOCAL_SHOW + "?id=" + entity.getId());
 		} catch (IOException e) {
 			messageGenerator.addErrorMessage("Ein Fehler ist aufgetreten", e.toString());
 		}
 	}
 
-	
 	public void cancel() {
 		try {
 			FacesContext.getCurrentInstance().getExternalContext().redirect(ViewIds.PROJECT_LOCAL_INDEX);
@@ -200,21 +202,13 @@ public class UserSubprojectCreateNewBean implements Serializable {
 		this.selfMember = selfMember;
 	}
 
-	public Long getParentId() {
-		return parentId;
-	}
-
-	public void setParentId(Long parentId) {
-		this.parentId = parentId;
-	}
-
 	public LocalProjectEntity getParentProject() {
 		if (parentProject == null) {
 			parentProject = localProjectService.fetch(getParentId());
 		}
 		return parentProject;
 	}
-	
+
 	public List<ProjectIdentityAdminEntity> getAdminList() {
 		if (adminList == null) {
 			adminList = projectService.findAdminsForProject(getParentProject());
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java
index 116539e6f3765ea0470102c44fd604426c0c38ba..9f06595616235522080cfe37af37633736406e3e 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/util/LoadFromAppConfig.java
@@ -1,6 +1,7 @@
 package edu.kit.scc.webreg.util;
 
 import java.io.Serializable;
+import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -19,9 +20,13 @@ public class LoadFromAppConfig  implements Serializable {
 	@Inject
 	private ApplicationConfig appConfig;
 	
-	public long getMemberShipValdity() {
+	public Optional<Long> getMemberShipValdity() {
 
 		String membershipValidityFromAppConfig = appConfig.getConfigValue("membership_validity");
+		
+		if (membershipValidityFromAppConfig == null)
+			return Optional.empty();
+		
 		String regex = "^\\d{11}$";
 
 		Pattern pattern = Pattern.compile(regex);
@@ -31,20 +36,24 @@ public class LoadFromAppConfig  implements Serializable {
 			long membershipValidityMs;
 			try {
 				membershipValidityMs = Long.parseLong(membershipValidityFromAppConfig);
-				return membershipValidityMs;
+				return Optional.of(membershipValidityMs);
 
 			} catch (NumberFormatException e) {
 				throw new IllegalArgumentException(
 						"Invalid format for membership_validity in config: " + membershipValidityFromAppConfig, e);
 			}
-		} else
-			return 0L;
-
+		}
+		
+		return Optional.empty();
 	}
 	
-	public long getProjectValdity() {
+	public Optional<Long> getProjectValdity() {
 
 		String projectValidityFromAppConfig = appConfig.getConfigValue("project_validity");
+		
+		if (projectValidityFromAppConfig == null)
+			return Optional.empty();
+		
 		String regex = "^\\d{11}$";
 
 		Pattern pattern = Pattern.compile(regex);
@@ -54,14 +63,14 @@ public class LoadFromAppConfig  implements Serializable {
 			long projectValidityMs;
 			try {
 				projectValidityMs = Long.parseLong(projectValidityFromAppConfig);
-				return projectValidityMs;
+				return Optional.of(projectValidityMs);
 
 			} catch (NumberFormatException e) {
 				throw new IllegalArgumentException(
 						"Invalid format for project_validity in config: " + projectValidityFromAppConfig, e);
 			}
 		} else
-			return 0L;
+			return Optional.empty();
 
 	}
 	
diff --git a/bwreg-webapp/src/main/webapp/admin/project/edit-project-members.xhtml b/bwreg-webapp/src/main/webapp/admin/project/edit-project-members.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..4ba1157575ce5d0c82adc1c2c5002f262d81fee2
--- /dev/null
+++ b/bwreg-webapp/src/main/webapp/admin/project/edit-project-members.xhtml
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="jakarta.faces.core"
+	xmlns:h="jakarta.faces.html" xmlns:ui="jakarta.faces.facelets"
+	xmlns:bw="http://www.scc.kit.edu/bwfacelets"
+	xmlns:p="http://primefaces.org/ui"
+	xmlns:of="http://omnifaces.org/functions">
+<head>
+<title></title>
+</head>
+<body>
+	<f:view>
+		<f:metadata>
+			<f:viewParam name="projectId"
+				value="#{editProjectMembersBean.projectId}" />
+			<f:event type="jakarta.faces.event.PreRenderViewEvent"
+				listener="#{editProjectMembersBean.preRenderView}" />
+		</f:metadata>
+
+		<ui:composition template="/template/default-admin.xhtml">
+			<ui:param name="title" value="#{messages.title}" />
+
+			<ui:define name="content">
+				<h:form id="form" styleClass="form full fancy">
+
+					<h2>
+						<h:outputText
+							value="#{messages.edit_admins}: #{editProjectMembersBean.entity.name}" />
+					</h2>
+
+					<p:panelGrid id="baseData" columns="2" layout="flex"
+						columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9">
+
+						<h:outputText value="#{messages.id}:" />
+						<h:outputText value="#{editProjectMembersBean.entity.id}" />
+
+						<h:outputText value="#{messages.name}:" />
+						<h:outputText value="#{editProjectMembersBean.entity.name}" />
+
+					</p:panelGrid>
+
+					<p:outputPanel id="btnPanel">
+						<p:commandButton id="cancel"
+							action="#{editProjectMembersBean.cancel}"
+							value="#{messages.back}" immediate="true" icon="ui-icon-close" />
+					</p:outputPanel>
+
+
+					<p:dataTable id="allUsers" var="user"
+						value="#{projectAdminEditProjectMembersBean.allUserList}"
+						paginator="true" lazy="true" rows="15">
+						<p:column sortBy="#{user.id}" style="width:128px;">
+							<f:facet name="header">
+								<h:outputText value="#{messages.id}" />
+							</f:facet>
+							<h:outputText value="#{user.id}" />
+						</p:column>
+						<p:column sortBy="#{user.surName}" filterBy="#{user.surName}"
+							filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.sur_name}" />
+							</f:facet>
+							<h:outputText value="#{user.surName}" />
+						</p:column>
+						<p:column sortBy="#{user.givenName}" filterBy="#{user.givenName}"
+							filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.given_name}" />
+							</f:facet>
+							<h:outputText value="#{user.givenName}" />
+						</p:column>
+						<p:column sortBy="#{user.eppn}" filterBy="#{user.eppn}"
+							filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.eppn}" />
+							</f:facet>
+							<h:outputText
+								value="#{user.eppn != null ? user.eppn : 'nicht gesetzt'}" />
+						</p:column>
+						<p:column sortBy="#{user.userStatus}" style="width:96px;">
+							<f:facet name="header">
+								<h:outputText value="#{messages.status}" />
+							</f:facet>
+							<h:outputText value="#{user.userStatus}" />
+						</p:column>
+						<p:column>
+							<p:commandLink action="#{editProjectMembersBean.addMember(user)}"
+								value="#{messages.add}"
+								oncomplete="setTimeout(function(){window.location.reload();}, 200);" />
+						</p:column>
+					</p:dataTable>
+
+					<p:dataTable id="membersId" var="a"
+						value="#{editProjectMembersBean.membersList}" paginator="true"
+						rows="15">
+						<p:column>
+							<f:facet name="header">
+								<h:outputText value="#{messages.id}" />
+							</f:facet>
+							<h:outputText value="#{a.identity.id}" />
+						</p:column>
+
+						<p:column sortBy="#{a.identity.generatedLocalUsername}"
+							filterBy="#{a.identity.generatedLocalUsername}"
+							filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.local_username}" />
+							</f:facet>
+							<h:outputText value="#{a.identity.generatedLocalUsername}" />
+						</p:column>
+
+						<p:column sortBy="#{a.identity.prefUser.email}"
+							filterBy="#{a.identity.prefUser.email}"
+							filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.email_address}" />
+							</f:facet>
+							<h:outputText value="#{a.identity.prefUser.email}" />
+						</p:column>
+
+						<p:column sortBy="#{a.identity.prefUser.eppn}"
+							filterBy="#{a.identity.prefUser.eppn}" filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.eppn}" />
+							</f:facet>
+							<h:outputText value="#{a.identity.prefUser.eppn}" />
+						</p:column>
+
+
+						<p:column sortBy="#{a.membershipType}"
+							filterBy="#{a.membershipType}" filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.type}" />
+							</f:facet>
+							<h:outputText value="#{a.membershipType}" />
+						</p:column>
+
+
+						<p:column sortBy="#{a.membershipValidity}"
+							filterBy="#{a.membershipValidity}" filterMatchMode="contains">
+							<f:facet name="header">
+								<h:outputText value="#{messages.membership_validity}" />
+							</f:facet>
+							<h:outputText value="#{a.membershipValidity}" />
+						</p:column>
+
+						<p:column>
+							<p:commandLink
+								action="#{editProjectMembersBean.deleteProjectMembership(a)}"
+								value="#{messages.remove}"
+								oncomplete="setTimeout(function(){window.location.reload();}, 200);" />
+						</p:column>
+					</p:dataTable>
+
+				</h:form>
+
+			</ui:define>
+		</ui:composition>
+	</f:view>
+</body>
+</html>
diff --git a/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml b/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml
index 71e65dc1725ae6d34e66876439b37510edd22d3e..fa721fed9dc7c689242452e70220b0c070d5fda2 100644
--- a/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml
+++ b/bwreg-webapp/src/main/webapp/admin/project/show-local-project.xhtml
@@ -147,6 +147,11 @@
 					<h:outputText value="#{m.identity.prefUser.eppn}" />
 				</p:column>
 			</p:dataTable>
+			
+			<h:link outcome="edit-project-members.xhtml" value="#{messages.edit_members}">
+				<f:param name="projectId" value="#{admin.showLocalProjectBean.entity.id}"/>
+			</h:link>
+		
 		</p:panel>
 
 		<p:panel header="#{messages.tools}">
diff --git a/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java b/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java
index ddedb6e228f58a162d83059d1ef99cd7f8bac5a2..31bc001845bd0b3a226da066542a3899a7e52b81 100644
--- a/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java
+++ b/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/ExternalOidcProjectUpdater.java
@@ -1,6 +1,7 @@
 package edu.kit.scc.webreg.service.project;
 
 import java.util.Date;
+import java.util.Optional;
 import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -61,8 +62,9 @@ public class ExternalOidcProjectUpdater extends AbstractProjectUpdater<ExternalO
 			
 			ProjectMembershipEntity pme = new ProjectMembershipEntity();
 			pme.setMembershipType(ProjectMembershipType.MEMBER);
-			pme.setMembershipValidity(getMemberShipValdity());
 			
+			getMemberShipValdity().ifPresent(validity -> pme.setMembershipValidity(validity));
+						
 			dao.addMemberToProject(project, user.getIdentity(), pme);
 		}
 		
@@ -71,9 +73,13 @@ public class ExternalOidcProjectUpdater extends AbstractProjectUpdater<ExternalO
 	}
 	
 	
-	public Date getMemberShipValdity() {
+	public Optional<Date> getMemberShipValdity() {
 
 		String membershipValidityFromAppConfig = appConfig.getConfigValue("membership_validity");
+		
+		if (membershipValidityFromAppConfig == null)
+			return Optional.empty();
+		
 		String regex = "^\\d{11}$";
 
 		Pattern pattern = Pattern.compile(regex);
@@ -83,14 +89,14 @@ public class ExternalOidcProjectUpdater extends AbstractProjectUpdater<ExternalO
 			long membershipValidityMs;
 			try {
 				membershipValidityMs = Long.parseLong(membershipValidityFromAppConfig);
-				return (new Date(System.currentTimeMillis() + membershipValidityMs));
+				return Optional.of(new Date(System.currentTimeMillis() + membershipValidityMs));
 
 			} catch (NumberFormatException e) {
 				throw new IllegalArgumentException(
 						"Invalid format for membership_validity in config: " + membershipValidityFromAppConfig, e);
 			}
 		} else
-			return null;
+			return Optional.empty();
 
 	}