diff --git a/apps/dav/lib/CalDAV/BirthdayService.php b/apps/dav/lib/CalDAV/BirthdayService.php
index e9f4787a328b01b07f6574163ff867a49fd59636..fc525934f15237465493e7accf6e2de85eba94fa 100644
--- a/apps/dav/lib/CalDAV/BirthdayService.php
+++ b/apps/dav/lib/CalDAV/BirthdayService.php
@@ -381,12 +381,26 @@ class BirthdayService {
 		$objectUri = $book['uri'] . '-' . $cardUri . $type['postfix'] . '.ics';
 		$calendarData = $this->buildDateFromContact($cardData, $type['field'], $type['postfix']);
 		$existing = $this->calDavBackEnd->getCalendarObject($calendarId, $objectUri);
-		if (is_null($calendarData)) {
-			if (!is_null($existing)) {
+		if ($calendarData === null) {
+			if ($existing !== null) {
 				$this->calDavBackEnd->deleteCalendarObject($calendarId, $objectUri);
 			}
 		} else {
-			if (is_null($existing)) {
+			if ($existing === null) {
+				// not found by URI, but maybe by UID
+				// happens when a contact with birthday is moved to a different address book
+				$calendarInfo = $this->calDavBackEnd->getCalendarById($calendarId);
+				$extraData = $this->calDavBackEnd->getDenormalizedData($calendarData->serialize());
+
+				if ($calendarInfo && array_key_exists('principaluri', $calendarInfo)) {
+					$existing2path = $this->calDavBackEnd->getCalendarObjectByUID($calendarInfo['principaluri'], $extraData['uid']);
+					if ($existing2path !== null && array_key_exists('uri', $calendarInfo)) {
+						// delete the old birthday entry first so that we do not get duplicate UIDs
+						$existing2objectUri = substr($existing2path, strlen($calendarInfo['uri']) + 1);
+						$this->calDavBackEnd->deleteCalendarObject($calendarId, $existing2objectUri);
+					}
+				}
+
 				$this->calDavBackEnd->createCalendarObject($calendarId, $objectUri, $calendarData->serialize());
 			} else {
 				if ($this->birthdayEvenChanged($existing['calendardata'], $calendarData)) {