diff --git a/bwreg-service/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressService.java b/bwreg-service/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressService.java
index 6c1dc4b844dce3287978b94bd61a747e88c228d7..798cdea14f8e2a04d2d23ec5a26ea7dabeb28d22 100644
--- a/bwreg-service/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressService.java
+++ b/bwreg-service/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressService.java
@@ -63,7 +63,7 @@ public class IdentityEmailAddressService extends BaseServiceImpl<IdentityEmailAd
 
 	public void expireEmailAddress(IdentityEmailAddressEntity entity, String executor) {
 		entity = dao.fetch(entity.getId());
-		handler.setPrimaryEmailAddress(entity, executor);
+		handler.expireEmailAddress(entity, executor);
 	}
 
 	public void sendExpiryEmailAddress(IdentityEmailAddressEntity entity, String executor) {
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/EmailAddressesBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/EmailAddressesBean.java
index 3e7d1dff38d568f060c5f79136f3ab0904aad52f..fa3bb290f5a70a06b48e7af7948917d122c27e2d 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/EmailAddressesBean.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/EmailAddressesBean.java
@@ -76,6 +76,13 @@ public class EmailAddressesBean implements Serializable {
 	public void deleteEmailAddress(IdentityEmailAddressEntity address) {
 		service.deleteEmailAddress(address, "idty-" + session.getIdentityId());
 		identity = null;
+		chosenPrimary = null;
+		primaryEmailList = null;
+	}
+
+	public void resendVerificationToken(IdentityEmailAddressEntity address) {
+		service.redoVerification(address, "idty-" + session.getIdentityId());
+		identity = null;
 	}
 
 	public void setPrimaryEmailAddress() {
@@ -91,6 +98,8 @@ public class EmailAddressesBean implements Serializable {
 			service.checkVerification(getIdentity(), getToken(), "idty-" + session.getIdentityId());
 			token = null;
 			identity = null;
+			chosenPrimary = null;
+			primaryEmailList = null;
 			messageGenerator.addResolvedInfoMessage("email_addresses.verification_success",
 					"email_addresses.verification_success_detail", true);
 		} catch (VerificationException e) {
diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/timer/WizardExpireEmailAddressesBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/timer/WizardExpireEmailAddressesBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..4bb922598a35f0efcac03d1cefb1090bb56dc089
--- /dev/null
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/admin/timer/WizardExpireEmailAddressesBean.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * 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:
+ *     Michael Simon - initial
+ ******************************************************************************/
+package edu.kit.scc.webreg.bean.admin.timer;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+
+import jakarta.faces.event.ComponentSystemEvent;
+import jakarta.faces.view.ViewScoped;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+
+import edu.kit.scc.webreg.entity.JobClassEntity;
+import edu.kit.scc.webreg.entity.JobScheduleEntity;
+import edu.kit.scc.webreg.service.JobClassService;
+import edu.kit.scc.webreg.service.JobScheduleService;
+
+@Named
+@ViewScoped
+public class WizardExpireEmailAddressesBean implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@Inject
+	private JobScheduleService jobScheduleService;
+	
+	@Inject
+	private JobClassService jobClassService;
+	
+	private JobClassEntity jobClass;
+	private JobScheduleEntity jobSchedule;
+	
+	private String jobName;
+	private String scheduleName;
+	private String scheduleTiming;
+	
+	private Long limit;
+	
+	private Boolean initialized = false;
+	
+	public void preRenderView(ComponentSystemEvent ev) {
+		if (! initialized) {
+			setJobName("wizard_ExpireEmailAddresses");
+			setScheduleName("wizard_ExpireEmailAddressesSchedule");
+			setLimit(1L);
+			setScheduleTiming("5m");
+
+			jobClass = jobClassService.findByAttr("jobClassName", "edu.kit.scc.webreg.job.ExpireVerifiedEmailAddresses");
+			if (jobClass != null) {
+				List<JobScheduleEntity> jsList = jobScheduleService.findAllByAttr("jobClass", jobClass);
+				if (jsList.size() > 0) {
+					jobSchedule = jsList.get(0);
+				}
+			}
+			initialized = true;
+		}
+	}
+
+	public void createJobClass() {
+		jobClass = jobClassService.createNew();
+		if (getJobName() != null)
+			jobClass.setName(getJobName());
+		else
+			jobClass.setName("wizard_ExpireEmailAddresses");
+		jobClass.setSingleton(true);
+		jobClass.setJobClassName("edu.kit.scc.webreg.job.ExpireVerifiedEmailAddresses");
+		jobClass.setJobStore(new HashMap<String, String>());
+		jobClass.getJobStore().put("limit", getLimit().toString());
+		jobClass = jobClassService.save(jobClass);
+	}
+	
+	public void createSchedule() {
+		jobSchedule = jobScheduleService.createNew();
+		if (getScheduleName() != null)
+			jobSchedule.setName(getScheduleName());
+		else
+			jobSchedule.setName("wizard_ExpireEmailAddressesSchedule");
+		jobSchedule.setJobClass(getJobClass());
+		jobSchedule.setYear("*");
+		jobSchedule.setMonth("*");
+		jobSchedule.setDayOfMonth("*");
+		jobSchedule.setDayOfWeek("*");
+		jobSchedule.setHour("*");
+		if (scheduleTiming.equals("1m")) {
+			jobSchedule.setMinute("0/1");
+			jobSchedule.setSecond("15");
+		}
+		else if (scheduleTiming.equals("10m")) {
+			jobSchedule.setMinute("0/10");
+			jobSchedule.setSecond("15");
+		}
+		else {
+			jobSchedule.setMinute("0/5");
+			jobSchedule.setSecond("15");
+		}
+		jobSchedule.setDisabled(false);
+		jobSchedule = jobScheduleService.save(jobSchedule);
+	}
+	
+	public JobClassEntity getJobClass() {
+		return jobClass;
+	}
+
+	public JobScheduleEntity getJobSchedule() {
+		return jobSchedule;
+	}
+
+	public String getJobName() {
+		return jobName;
+	}
+
+	public void setJobName(String jobName) {
+		this.jobName = jobName;
+	}
+
+	public String getScheduleName() {
+		return scheduleName;
+	}
+
+	public void setScheduleName(String scheduleName) {
+		this.scheduleName = scheduleName;
+	}
+
+	public String getScheduleTiming() {
+		return scheduleTiming;
+	}
+
+	public void setScheduleTiming(String scheduleTiming) {
+		this.scheduleTiming = scheduleTiming;
+	}
+
+	public Long getLimit() {
+		return limit;
+	}
+
+	public void setLimit(Long limit) {
+		this.limit = limit;
+	}
+}
diff --git a/bwreg-webapp/src/main/resources/msg/messages_de.properties b/bwreg-webapp/src/main/resources/msg/messages_de.properties
index 40ae7a38bddcf91d728b423a568171d8e8fa8417..f5721f55b8e7da12ff300d8924570341278c3880 100644
--- a/bwreg-webapp/src/main/resources/msg/messages_de.properties
+++ b/bwreg-webapp/src/main/resources/msg/messages_de.properties
@@ -547,6 +547,8 @@ imprint = Impressum
 
 index = \u00DCbersicht
 
+index.no_primaray_email_set = Es wurde keine prim\u00E4re E-Mail-Adresse festgelegt. Bitte legen Sie <a href="user/email-addresses.xhtml">hier</a> eine prim\u00E4re E-Mail-Adresse fest.
+
 index_text1 = Sie haben sich bereits bei den folgenden Diensten registriert:
 
 index_text2 = Details zu den Registrierungen k\u00F6nnen Sie unter "Registrierungsdetails" beim jeweiligen Dienst aufrufen.
@@ -1210,28 +1212,6 @@ timer_info = Timer Info
 
 timer_singleton_configured = Konfigupdate Singleton Timer
 
-timer_wizard_clear_expired_authn_requests = Einen Zeitplan zum L\u00F6schen von abgelaufenen SAML Authentication Requests erstellen.
-
-timer_wizard_clear_expired_authn_requests_header = Clear expired SAML authentication requests wizard
-
-timer_wizard_clear_expired_login_info = Einen Zeitplan zum L\u00F6schen von abgelaufenen Benutzer Login Informationen erstellen.
-
-timer_wizard_clear_expired_login_info_header = Clear expired login user information
-
-timer_wizard_clear_expired_oidc_tokens = Einen Zeitplan zum L\u00F6schen von abgelaufenen OIDC login Token erstellen.
-
-timer_wizard_clear_expired_oidc_tokens_header = Clear expired OIDC login token wizard
-
-timer_wizard_clear_old_audit_entries = Einen Zeitplan zum L\u00F6schen von alten Audit Eintr\u00E4gen erstellen.
-
-timer_wizard_clear_old_audit_entries_header = Clear old audit entries wizard
-
-timer_wizard_update_federation_metadata = Einen Zeitplan erstellen, um alle F\u00F6derationsmetadaten zu aktualisieren.
-
-timer_wizard_update_federation_metadata_header = Update all SAML federation metadata wizard
-
-timer_wizards = Scheduler wizards
-
 title = bwServices
 
 to = An
@@ -1334,8 +1314,6 @@ unknown-token = Das im Link gesetzte Token ist ung\u00FCltig
 
 update = Aktualisieren
 
-update_metadata = Metadaten updaten
-
 updated_at = Letztes Update am
 
 url = URL
@@ -1386,6 +1364,21 @@ welcome_register = Sie nutzen die f\u00F6derierten Dienste zum ersten Mal. Um fo
 
 welcome_sns_guest = Willkommen bei der Sync&Share Gast Registrierung. Bitte lesen und akzeptieren Sie die Nutzungsbedingungen und f\u00FCllen Sie das untenstehende Formular aus, um Ihren Account zu aktivieren.
 
+wizard.expire_email_addresses                           = E-Mail-Adressen ablaufen lassen
+wizard.expire_email_addresses_info                      = F\u00FCgen Sie einen Zeitplan f\u00FCr das Auslaufen von E-Mail-Adressen hinzu, bei denen das \u00DCberpr\u00FCfungsdatum f\u00E4llig ist.
+wizard.timer_wizard_clear_expired_authn_requests        = Einen Zeitplan zum L\u00F6schen von abgelaufenen SAML Authentication Requests erstellen.
+wizard.timer_wizard_clear_expired_authn_requests_header = Clear expired SAML authentication requests wizard
+wizard.timer_wizard_clear_expired_login_info            = Einen Zeitplan zum L\u00F6schen von abgelaufenen Benutzer Login Informationen erstellen.
+wizard.timer_wizard_clear_expired_login_info_header     = Clear expired login user information
+wizard.timer_wizard_clear_expired_oidc_tokens           = Einen Zeitplan zum L\u00F6schen von abgelaufenen OIDC login Token erstellen.
+wizard.timer_wizard_clear_expired_oidc_tokens_header    = Clear expired OIDC login token wizard
+wizard.timer_wizard_clear_old_audit_entries             = Einen Zeitplan zum L\u00F6schen von alten Audit Eintr\u00E4gen erstellen.
+wizard.timer_wizard_clear_old_audit_entries_header      = Clear old audit entries wizard
+wizard.timer_wizard_update_federation_metadata          = Einen Zeitplan erstellen, um alle F\u00F6derationsmetadaten zu aktualisieren.
+wizard.timer_wizard_update_federation_metadata_header   = Update all SAML federation metadata wizard
+wizard.timer_wizards                                    = Scheduler wizards
+wizard.update_metadata                                  = Metadaten updaten
+
 year = Jahr
 
 yes = Ja
diff --git a/bwreg-webapp/src/main/resources/msg/messages_en.properties b/bwreg-webapp/src/main/resources/msg/messages_en.properties
index 5a89177f6787cac7d2235ed62704f4b7d06833d3..16cff493f5a9c3f99ba699aeda372f22d3b2f975 100644
--- a/bwreg-webapp/src/main/resources/msg/messages_en.properties
+++ b/bwreg-webapp/src/main/resources/msg/messages_en.properties
@@ -547,6 +547,8 @@ imprint = Imprint
 
 index = Index
 
+index.no_primaray_email_set = No primary e-mail address has been set. Please specify a primary e-mail address <a href="user/email-addresses.xhtml">here</a>.
+
 index_text1 = You have already registered with the following services:
 
 index_text2 = In order to see details of the services you registered with, click on the link 'Registry info' under the service.
@@ -1210,28 +1212,6 @@ timer_info = Timer info
 
 timer_singleton_configured = Singleton timer configured
 
-timer_wizard_clear_expired_authn_requests = Add a schedule to delete expired SAML authentication requests.
-
-timer_wizard_clear_expired_authn_requests_header = Clear expired SAML authentication requests wizard
-
-timer_wizard_clear_expired_login_info = Add a schedule to delete expired user login information.
-
-timer_wizard_clear_expired_login_info_header = Clear expired login user information
-
-timer_wizard_clear_expired_oidc_tokens = Add a schedule to delete expired OIDC login token.
-
-timer_wizard_clear_expired_oidc_tokens_header = Clear expired OIDC login token wizard
-
-timer_wizard_clear_old_audit_entries = Add a schedule to delete old audit entries.
-
-timer_wizard_clear_old_audit_entries_header = Clear old audit entries wizard
-
-timer_wizard_update_federation_metadata = Add a schedule to update all SAML federation metadata.
-
-timer_wizard_update_federation_metadata_header = Update all SAML federation metadata wizard
-
-timer_wizards = Scheduler wizards
-
 title = bwServices
 
 to = To
@@ -1334,8 +1314,6 @@ unknown-token = Your account token is invalid.
 
 update = Update
 
-update_metadata = Update Metadata
-
 updated_at = Updated at
 
 url = URL
@@ -1386,6 +1364,21 @@ welcome_register = You are using the federated services for the first time. In o
 
 welcome_sns_guest = Welcome to the sync and share guest registration. Please read and accept the agreement and fill in the form to activate your account.
 
+wizard.expire_email_addresses                           = Expire Email-addresses
+wizard.expire_email_addresses_info                      = Add a schedule to expire e-mail-addresses where the verification date is due.
+wizard.timer_wizard_clear_expired_authn_requests        = Add a schedule to delete expired SAML authentication requests.
+wizard.timer_wizard_clear_expired_authn_requests_header = Clear expired SAML authentication requests wizard
+wizard.timer_wizard_clear_expired_login_info            = Add a schedule to delete expired user login information.
+wizard.timer_wizard_clear_expired_login_info_header     = Clear expired login user information
+wizard.timer_wizard_clear_expired_oidc_tokens           = Add a schedule to delete expired OIDC login token.
+wizard.timer_wizard_clear_expired_oidc_tokens_header    = Clear expired OIDC login token wizard
+wizard.timer_wizard_clear_old_audit_entries             = Add a schedule to delete old audit entries.
+wizard.timer_wizard_clear_old_audit_entries_header      = Clear old audit entries wizard
+wizard.timer_wizard_update_federation_metadata          = Add a schedule to update all SAML federation metadata.
+wizard.timer_wizard_update_federation_metadata_header   = Update all SAML federation metadata wizard
+wizard.timer_wizards                                    = Scheduler wizards
+wizard.update_metadata                                  = Update Metadata
+
 year = Year
 
 yes = Yes
diff --git a/bwreg-webapp/src/main/resources/msg/messages_fr.properties b/bwreg-webapp/src/main/resources/msg/messages_fr.properties
index 37db47dbd3451c64d730342e1b0a8474918ad1b6..6ecaee28d542671796a753b0945b4e3f66a7005a 100644
--- a/bwreg-webapp/src/main/resources/msg/messages_fr.properties
+++ b/bwreg-webapp/src/main/resources/msg/messages_fr.properties
@@ -547,6 +547,8 @@ imprint = Empreinte
 
 index = Index
 
+index.no_primaray_email_set = Aucune adresse e-mail principale n'a \u00E9t\u00E9 d\u00E9finie. Veuillez d\u00E9finir <a href="user/email-addresses.xhtml">ici</a> une adresse e-mail primaire.
+
 index_text1 = Vous vous \u00EAtes d\u00E9j\u00E0 enregistr\u00E9 aupr\u00E8s des services suivants :
 
 index_text2 = Pour voir les d\u00E9tails des services auxquels vous vous \u00EAtes inscrit, cliquez sur le lien 'Registry info' sous le service.
@@ -1210,28 +1212,6 @@ timer_info = Informations sur le minuteur
 
 timer_singleton_configured = Minuteur singleton configur\u00E9
 
-timer_wizard_clear_expired_authn_requests = Ajouter une planification pour supprimer SAML Authentication Requests expir\u00E9s.
-
-timer_wizard_clear_expired_authn_requests_header = Clear expired SAML authentication requests wizard
-
-timer_wizard_clear_expired_login_info = Ajouter une planification pour supprimer user login information expir\u00E9s.
-
-timer_wizard_clear_expired_login_info_header = Clear expired login user information
-
-timer_wizard_clear_expired_oidc_tokens = Ajouter une planification pour supprimer OIDC login token expir\u00E9s.
-
-timer_wizard_clear_expired_oidc_tokens_header = Clear expired OIDC login token wizard
-
-timer_wizard_clear_old_audit_entries = Ajouter une planification pour supprimer les anciennes entr\u00E9es d'audit.
-
-timer_wizard_clear_old_audit_entries_header = Clear old audit entries wizard
-
-timer_wizard_update_federation_metadata = Ajouter un calendrier pour mettre \u00E0 jour toutes les metadata de f\u00E9d\u00E9ration SAML.
-
-timer_wizard_update_federation_metadata_header = Update all SAML federation metadata wizard
-
-timer_wizards = Scheduler wizards
-
 title = bwServices
 
 to = To
@@ -1334,8 +1314,6 @@ unknown-token = Votre jeton de compte n'est pas valide.
 
 update = Mise \u00E0 jour
 
-update_metadata = Update Metadata
-
 updated_at = Mis \u00E0 jour \u00E0
 
 url = URL
@@ -1386,6 +1364,21 @@ welcome_register = Vous utilisez les services f\u00E9d\u00E9r\u00E9s pour la pre
 
 welcome_sns_guest = Bienvenue \u00E0 l'enregistrement des invit\u00E9s de sync and share. Veuillez lire et accepter l'accord et remplir le formulaire pour activer votre compte.
 
+wizard.expire_email_addresses                           = Expirer les adresses \u00E9lectroniques
+wizard.expire_email_addresses_info                      = Ajoutez un calendrier d'expiration des adresses \u00E9lectroniques dont la date de v\u00E9rification est d\u00E9pass\u00E9e.
+wizard.timer_wizard_clear_expired_authn_requests        = Ajouter une planification pour supprimer SAML Authentication Requests expir\u00E9s.
+wizard.timer_wizard_clear_expired_authn_requests_header = Clear expired SAML authentication requests wizard
+wizard.timer_wizard_clear_expired_login_info            = Ajouter une planification pour supprimer user login information expir\u00E9s.
+wizard.timer_wizard_clear_expired_login_info_header     = Clear expired login user information
+wizard.timer_wizard_clear_expired_oidc_tokens           = Ajouter une planification pour supprimer OIDC login token expir\u00E9s.
+wizard.timer_wizard_clear_expired_oidc_tokens_header    = Clear expired OIDC login token wizard
+wizard.timer_wizard_clear_old_audit_entries             = Ajouter une planification pour supprimer les anciennes entr\u00E9es d'audit.
+wizard.timer_wizard_clear_old_audit_entries_header      = Clear old audit entries wizard
+wizard.timer_wizard_update_federation_metadata          = Ajouter un calendrier pour mettre \u00E0 jour toutes les metadata de f\u00E9d\u00E9ration SAML.
+wizard.timer_wizard_update_federation_metadata_header   = Update all SAML federation metadata wizard
+wizard.timer_wizards                                    = Scheduler wizards
+wizard.update_metadata                                  = Update Metadata
+
 year = Ann\u00E9e
 
 yes = Oui
diff --git a/bwreg-webapp/src/main/webapp/admin/timer/list-wizards.xhtml b/bwreg-webapp/src/main/webapp/admin/timer/list-wizards.xhtml
index 6443e10620ece24b50bef0ffc8a293aaa969e42c..1cad4cd06d24f133c352e049f97c4123bec08e32 100644
--- a/bwreg-webapp/src/main/webapp/admin/timer/list-wizards.xhtml
+++ b/bwreg-webapp/src/main/webapp/admin/timer/list-wizards.xhtml
@@ -19,20 +19,23 @@
 	<h:form id="form">
 
 	<p:panelGrid columns="2">
-		<p:linkButton outcome="wizard-update-federation-metadata" value="#{messages.update_metadata}" />
-		<h:outputText value="#{messages.timer_wizard_update_federation_metadata}" />
+		<p:linkButton outcome="wizard-update-federation-metadata" value="#{messages['wizard.update_metadata']}" />
+		<h:outputText value="#{messages['wizard.timer_wizard_update_federation_metadata']}" />
 			
-		<p:linkButton outcome="wizard-clear-old-audit-entries" value="#{messages.clear_audit}" />
-		<h:outputText value="#{messages.timer_wizard_clear_old_audit_entries}" />
+		<p:linkButton outcome="wizard-clear-old-audit-entries" value="#{messages['wizard.clear_audit']}" />
+		<h:outputText value="#{messages['wizard.timer_wizard_clear_old_audit_entries']}" />
 			
-		<p:linkButton outcome="wizard-clear-expired-authn-requests" value="#{messages.clear_expired_authn_requests}" />
-		<h:outputText value="#{messages.timer_wizard_clear_expired_authn_requests}" />
+		<p:linkButton outcome="wizard-clear-expired-authn-requests" value="#{messages['wizard.clear_expired_authn_requests']}" />
+		<h:outputText value="#{messages['wizard.timer_wizard_clear_expired_authn_requests']}" />
 
-		<p:linkButton outcome="wizard-clear-expired-oidc-tokens" value="#{messages.clear_expired_oidc_tokens}" />
-		<h:outputText value="#{messages.timer_wizard_clear_expired_oidc_tokens}" />
+		<p:linkButton outcome="wizard-clear-expired-oidc-tokens" value="#{messages['wizard.clear_expired_oidc_tokens']}" />
+		<h:outputText value="#{messages['wizard.timer_wizard_clear_expired_oidc_tokens']}" />
 			
-		<p:linkButton outcome="wizard-clear-expired-login-info" value="#{messages.clear_expired_login_info}" />
-		<h:outputText value="#{messages.timer_wizard_clear_expired_login_info}" />
+		<p:linkButton outcome="wizard-clear-expired-login-info" value="#{messages['wizard.clear_expired_login_info']}" />
+		<h:outputText value="#{messages['wizard.timer_wizard_clear_expired_login_info']}" />
+			
+		<p:linkButton outcome="wizard-expire-email-addresses" value="#{messages['wizard.expire_email_addresses']}" />
+		<h:outputText value="#{messages['wizard.expire_email_addresses_info']}" />
 			
 	</p:panelGrid>	
 		
diff --git a/bwreg-webapp/src/main/webapp/admin/timer/wizard-expire-email-addresses.xhtml b/bwreg-webapp/src/main/webapp/admin/timer/wizard-expire-email-addresses.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..9dc7e6b944bebef4f176a7089836cabf5f168fe1
--- /dev/null
+++ b/bwreg-webapp/src/main/webapp/admin/timer/wizard-expire-email-addresses.xhtml
@@ -0,0 +1,110 @@
+<!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">
+<head>
+<title></title>
+</head>
+<body>
+<f:view>
+	<f:metadata>
+		<f:event type="jakarta.faces.event.PreRenderViewEvent"
+            listener="#{wizardExpireEmailAddressesBean.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">
+		<h2><h:outputText value="#{messages.timer_wizard_clear_expired_login_info_header}"/></h2>
+
+		<p:panel rendered="#{wizardExpireEmailAddressesBean.jobClass == null}">
+			<p:panelGrid columns="2" layout="flex" columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9">
+				<i class="pi pi-times" style="font-size: 2rem;"></i>
+				<p:outputPanel>
+					<div>
+						No job class yet. Create one here. You can choose a name, or use the predefined one. 
+						Set the days and hours to determine the age from which on login infos are deleted. 
+					</div>
+					<p:panelGrid columns="2" style="margin-top: 0.5em;" layout="flex" columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9">
+						<p:outputLabel value="Name:" for="@next"/>
+						<p:inputText value="#{wizardExpireEmailAddressesBean.scheduleName}" style="width: 320px;"/>
+
+						<p:outputLabel value="Limit:" for="@next"/>
+						<p:inputNumber value="#{wizardExpireEmailAddressesBean.limit}" decimalPlaces="0" required="true"/>
+					</p:panelGrid>
+					<p:commandButton action="#{wizardExpireEmailAddressesBean.createJobClass()}" update="@form" value="Create Job"
+						style="margin-top: 0.5em;"/>
+				</p:outputPanel>
+			</p:panelGrid>			
+		</p:panel>
+
+		<p:panel rendered="#{wizardExpireEmailAddressesBean.jobClass != null}">
+			<p:panelGrid columns="2" layout="flex" columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9">
+				<i class="pi pi-check" style="font-size: 2rem;"></i>
+				<p:outputPanel>
+					<div>
+						Job for clearing user login info is defined: <b>#{wizardExpireEmailAddressesBean.jobClass.name}</b>
+					</div>
+					<div style="margin-top: 1em;">
+						Items older than #{wizardExpireEmailAddressesBean.jobClass.jobStore.get('purge_millis')} milliseconds are deleted.
+					</div>
+				</p:outputPanel>
+			</p:panelGrid>
+		</p:panel>
+
+		<p:panel rendered="#{wizardExpireEmailAddressesBean.jobSchedule == null and wizardExpireEmailAddressesBean.jobClass != null}">
+			<p:panelGrid columns="2" layout="flex" columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9">
+				<i class="pi pi-times" style="font-size: 2rem;"></i>
+				<p:outputPanel>
+					No job schedule yet. Create one in order to execute the job on regular basis:
+					<p:panelGrid columns="2" style="margin-top: 0.5em;" layout="flex" columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9">
+						<p:outputLabel value="Name:" for="@next"/>
+						<p:inputText value="#{wizardExpireEmailAddressesBean.scheduleName}" style="width: 320px;"/>
+						
+						<p:outputLabel value="Schedule:" for="@next"/>
+			            <p:selectOneListbox id="basic" value="#{wizardExpireEmailAddressesBean.scheduleTiming}">
+			                <f:selectItem itemLabel="Every minute" itemValue="1m"/>
+			                <f:selectItem itemLabel="Every 5 minutes" itemValue="5m"/>
+			                <f:selectItem itemLabel="Every 10 minutes" itemValue="10m"/>
+			            </p:selectOneListbox>
+					</p:panelGrid>
+					<p:commandButton action="#{wizardExpireEmailAddressesBean.createSchedule()}" update="@form" value="Create Schedule"
+						style="margin-top: 0.5em;"/>
+				</p:outputPanel>
+			</p:panelGrid>			
+		</p:panel>
+
+		<p:panel rendered="#{wizardExpireEmailAddressesBean.jobSchedule != null}">
+			<p:panelGrid columns="2" layout="flex" columnClasses="col-12 md:col-3 xl:col-3, col-12 md:col-9 xl:col-9">
+				<h:panelGroup>
+					<p:outputPanel rendered="#{! wizardExpireEmailAddressesBean.jobSchedule.disabled}"><i class="pi pi-check" style="font-size: 2rem;"></i></p:outputPanel>
+					<p:outputPanel rendered="#{wizardExpireEmailAddressesBean.jobSchedule.disabled}"><i class="pi pi-pause" style="font-size: 2rem;"></i></p:outputPanel>
+				</h:panelGroup>
+				<p:outputPanel>
+					<div>
+						Job schedule is defined: <b>#{wizardExpireEmailAddressesBean.jobSchedule.name}</b>
+					</div>
+					<div style="margin-top: 1em;">
+						Cron pattern: 
+						<h:outputText value="#{wizardExpireEmailAddressesBean.jobSchedule.second} #{wizardExpireEmailAddressesBean.jobSchedule.minute} #{wizardExpireEmailAddressesBean.jobSchedule.hour} #{wizardExpireEmailAddressesBean.jobSchedule.dayOfWeek} #{wizardExpireEmailAddressesBean.jobSchedule.dayOfMonth} #{wizardExpireEmailAddressesBean.jobSchedule.month} #{wizardExpireEmailAddressesBean.jobSchedule.year}" />
+					</div>
+					<p:outputPanel rendered="#{wizardExpireEmailAddressesBean.jobSchedule.disabled}" style="margin-top: 0.5em;">
+						The schedule is currently disabled!
+					</p:outputPanel>
+				</p:outputPanel>
+			</p:panelGrid>
+		</p:panel>
+
+	</h:form>
+
+	</ui:define>
+</ui:composition>
+</f:view>		
+</body>
+</html>
diff --git a/bwreg-webapp/src/main/webapp/index.xhtml b/bwreg-webapp/src/main/webapp/index.xhtml
index 261fc3f109814b1cc8438986b28e1e03ffcd1d4b..bf5408a7e20e89d1e04d393d1550e7798ffa7821 100644
--- a/bwreg-webapp/src/main/webapp/index.xhtml
+++ b/bwreg-webapp/src/main/webapp/index.xhtml
@@ -21,9 +21,14 @@
 				style="margin-bottom: 8px;" styleClass="full">
 			<h:outputText value="#{messages.index_motd_text1}" escape="false" />
 		</p:panel>
+
+		<h:panelGroup layout="block" styleClass="full text" rendered="#{empty userIndexBean.identity.primaryEmail}">
+			<i class="pi pi-times-circle"></i>
+			<h:outputText value="#{messages['index.no_primaray_email_set']}" escape="false" style="margin-left: 1em;" />
+		</h:panelGroup>
 	
 		<h5 class="full"><h:outputText value="#{messages.index_text1}"/></h5>
-
+		
 		<h:panelGroup rendered="#{not empty userIndexBean.userRegistryList}">
 			<ui:repeat var="registry" value="#{userIndexBean.userRegistryList}">
 				<div class="news-element third">
diff --git a/bwreg-webapp/src/main/webapp/user/email-addresses.xhtml b/bwreg-webapp/src/main/webapp/user/email-addresses.xhtml
index 3a31c9b79adfd4fe464f5e359a43f8000b856e03..5a29913b41b244984d62d5bf16f78a5900b391c0 100644
--- a/bwreg-webapp/src/main/webapp/user/email-addresses.xhtml
+++ b/bwreg-webapp/src/main/webapp/user/email-addresses.xhtml
@@ -76,6 +76,8 @@
 					
 					<div class="form">
 						<p:commandButton action="#{emailAddressesBean.deleteEmailAddress(email)}" value="#{messages['delete']}" ajax="true" update="@all" />
+						<p:commandButton action="#{emailAddressesBean.resendVerificationToken(email)}" value="#{messages['email_addresses.resend_token']}" ajax="true" update="@all" 
+							style="margin-left: 1em;"/>
 					</div>
 				</h:panelGroup>
 				<h:panelGroup rendered="#{email.emailStatus == 'VERIFIED'}">
diff --git a/regapp-idty/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressHandler.java b/regapp-idty/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressHandler.java
index 481903c12bb6ecc49963bd6f0f4601aa8be2dfdf..cd0e39294c1981aca2897cf53ec3f0232c03ab0f 100644
--- a/regapp-idty/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressHandler.java
+++ b/regapp-idty/src/main/java/edu/kit/scc/webreg/service/identity/IdentityEmailAddressHandler.java
@@ -148,6 +148,7 @@ public class IdentityEmailAddressHandler implements Serializable {
 		
 		entity.setExpireWarningSent(null);
 		entity.setVerificationToken(null);
+		entity.setTokenValidUntil(null);
 		entity.setVerifiedOn(new Date());
 		entity.setValidUntil(generateValidity());
 		entity.setEmailStatus(EmailAddressStatus.VERIFIED);