diff --git a/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java b/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java
index 3a31677b883f02cac2764d1d7ff72624b7722101..0de6b453198832acd89d821d10c523cdf5576428 100644
--- a/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java
+++ b/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java
@@ -98,17 +98,22 @@ public class UserLifecycleManagerImpl implements UserLifecycleManager {
 	
 	@Override
 	public long getDaysUntilDeactivation(IdentityLifecycle identity, Date referenceDate) {
-		long days;
+		Date lastLogin = identity.getLastLogin();
+		if(lastLogin == null) {
+			lastLogin = identity.getCreationDate();
+		}
+		long days = userModule.getNumberOfInactiveDayBeforeDeactivation() - CalendarUtils.numOfDays(referenceDate, lastLogin);
+		if(days < 0l) {
+			days = 0l;
+		}
 		Date reactivationDate = identity.getReactivationDate();
 		if(reactivationDate != null ) {
-			days = userModule.getNumberOfDayReactivationPeriod() - CalendarUtils.numOfDays(referenceDate, reactivationDate);
-		} else {
-			Date lastLogin = identity.getLastLogin();
-			if(lastLogin == null) {
-				lastLogin = identity.getCreationDate();
+			long reactivationDays = userModule.getNumberOfDayReactivationPeriod() - CalendarUtils.numOfDays(referenceDate, reactivationDate);
+			if(reactivationDays > days) {
+				days = reactivationDays;
 			}
-			days = userModule.getNumberOfInactiveDayBeforeDeactivation() - CalendarUtils.numOfDays(referenceDate, lastLogin);
 		}
+		
 		return days > 0l ? days : 1l;
 	}
 
diff --git a/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java b/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java
index a5f09d0d70dcc5c0fe792a2763aff1b24dffa54c..247a4796b346b5bf0093c33681689aa76cd3e14d 100644
--- a/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java
+++ b/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java
@@ -208,6 +208,72 @@ public class UserLifecycleManagerTest extends OlatTestCase {
 		}
 	}
 	
+	@Test
+	public void untilDeactivation() {
+		Assert.assertTrue(userModule.isUserAutomaticDeactivation());
+		userModule.setNumberOfInactiveDayBeforeDeactivation(720);
+		
+		Date now = new Date();
+		// inactivation long due
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-41");
+		identityDao.setIdentityLastLogin(id1, DateUtils.addDays(new Date(), -910));
+		dbInstance.commitAndCloseSession();
+		// last login within limit
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-42");
+		identityDao.setIdentityLastLogin(id2, DateUtils.addDays(new Date(), -510));
+		dbInstance.commitAndCloseSession();
+		
+		id1 = securityManager.loadIdentityByKey(id1.getKey());
+		long daysUntilId1 = lifecycleManager.getDaysUntilDeactivation(id1, now);
+		Assert.assertEquals(1, daysUntilId1);
+		
+		id2 = securityManager.loadIdentityByKey(id2.getKey());
+		long daysUntilId2 = lifecycleManager.getDaysUntilDeactivation(id2, now);
+		Assert.assertEquals(210, daysUntilId2);
+	}
+	
+	/**
+	 * Check the grace period after reactivation
+	 */
+	@Test
+	public void untilDeactivationWithReactivation() {
+		Assert.assertTrue(userModule.isUserAutomaticDeactivation());
+		userModule.setNumberOfInactiveDayBeforeDeactivation(720);
+		
+		// someone play
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-43");
+		identityDao.setIdentityLastLogin(id, DateUtils.addDays(new Date(), -910));
+		dbInstance.commitAndCloseSession();
+		id = securityManager.saveIdentityStatus(id, Identity.STATUS_INACTIVE, null);
+		id = securityManager.saveIdentityStatus(id, Identity.STATUS_ACTIV, null);
+		
+		// grace period after reactivation
+		id = securityManager.loadIdentityByKey(id.getKey());
+		long daysUntil = lifecycleManager.getDaysUntilDeactivation(id, new Date());
+		Assert.assertEquals(30, daysUntil);
+	}
+	
+	/**
+	 * Check the login date has a high priority than the reactivation date.
+	 */
+	@Test
+	public void untilDeactivationWithManualInactivationReactivation() {
+		Assert.assertTrue(userModule.isUserAutomaticDeactivation());
+		userModule.setNumberOfInactiveDayBeforeDeactivation(720);
+		
+		// someone play
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-44");
+		identityDao.setIdentityLastLogin(id, DateUtils.addDays(new Date(), -410));
+		dbInstance.commitAndCloseSession();
+		id = securityManager.saveIdentityStatus(id, Identity.STATUS_INACTIVE, null);
+		id = securityManager.saveIdentityStatus(id, Identity.STATUS_ACTIV, null);
+		
+		// grace period after reactivation
+		id = securityManager.loadIdentityByKey(id.getKey());
+		long daysUntil = lifecycleManager.getDaysUntilDeactivation(id, new Date());
+		Assert.assertEquals(310, daysUntil);
+	}
+	
 	@Test
 	public void inactivateASingleInformedIdentity() {
 		Assert.assertTrue(userModule.isUserAutomaticDeactivation());
@@ -414,6 +480,41 @@ public class UserLifecycleManagerTest extends OlatTestCase {
 		getSmtpServer().reset();	
 	}
 	
+	/**
+	 * Test the case of an administrator which play activate/inactivate. The
+	 * login date has a higher priority and win against the reactivation grace
+	 * period of 30 days.
+	 */
+	@Test
+	public void manuallyReactivatedIdentity() {
+		Assert.assertTrue(userModule.isUserAutomaticDeactivation());
+		userModule.setMailBeforeDeactivation(true);
+		userModule.setNumberOfInactiveDayBeforeDeactivation(720);
+		userModule.setNumberOfDayBeforeDeactivationMail(30);
+		
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-31");
+		identityDao.setIdentityLastLogin(id, DateUtils.addDays(new Date(), -180));
+		id = securityManager.saveIdentityStatus(id, Identity.STATUS_INACTIVE, null);
+		id = securityManager.saveIdentityStatus(id, Identity.STATUS_ACTIV, null);
+		dbInstance.commitAndCloseSession();
+		
+		Assert.assertNotNull(id.getLastLogin());
+		Assert.assertNotNull(id.getReactivationDate());
+		// set reactivation date before the limit of 30 days
+		((IdentityImpl)id).setReactivationDate(DateUtils.addDays(new Date(), -40));
+		id = identityDao.saveIdentity(id);
+		
+		Set<Identity> vetoed = new HashSet<>();
+		lifecycleManager.inactivateIdentities(vetoed);
+		dbInstance.commitAndCloseSession();
+
+		// the login date has a higher priority, the identity will not be inactivated again
+		Identity reloadedId = securityManager.loadIdentityByKey(id.getKey());
+		Assert.assertEquals(Identity.STATUS_ACTIV, reloadedId.getStatus());
+		Assert.assertNotNull(reloadedId.getLastLogin());
+		Assert.assertNotNull(reloadedId.getReactivationDate());	
+	}
+	
 	@Test
 	public void deleteIdentities() {
 		Assert.assertTrue(userModule.isUserAutomaticDeletion());