diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/qrcode/InvalidQRCodeException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/qrcode/InvalidQRCodeException.kt
index 24dd420a35009d94e55b06ece7c80802cd6db8eb..30c3cf40d5d9e99b94ffb8946d5afbc4b8b8b0fc 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/qrcode/InvalidQRCodeException.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/qrcode/InvalidQRCodeException.kt
@@ -1,5 +1,6 @@
 package de.rki.coronawarnapp.coronatest.qrcode
 
 open class InvalidQRCodeException(
-    message: String = "An error occurred while parsing the qr code"
-) : Exception(message)
+    message: String = "An error occurred while parsing the qr code",
+    cause: Throwable? = null,
+) : Exception(message, cause)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
index 14110a6f27dea9b9fabf4becdca12ade72163147..544e82f9e783fbb75b7b6f2c096757a4de5ac11d 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
@@ -26,8 +26,9 @@ import de.rki.coronawarnapp.vaccination.core.certificate.InvalidHealthCertificat
 import de.rki.coronawarnapp.vaccination.core.certificate.InvalidHealthCertificateException.ErrorCode.VC_STORING_FAILED
 
 class InvalidHealthCertificateException(
-    val errorCode: ErrorCode
-) : HasHumanReadableError, InvalidQRCodeException(errorCode.message) {
+    val errorCode: ErrorCode,
+    cause: Throwable? = null,
+) : HasHumanReadableError, InvalidQRCodeException(errorCode.message, cause) {
     enum class ErrorCode(
         val message: String
     ) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1.kt
index e6273d554de417134e61fd986090b673e60cbd26..9e27cb0aeb2b642fd79fbf34a4fd6c224ba24609 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1.kt
@@ -1,7 +1,9 @@
 package de.rki.coronawarnapp.vaccination.core.certificate
 
 import com.google.gson.annotations.SerializedName
+import org.joda.time.DateTime
 import org.joda.time.LocalDate
+import timber.log.Timber
 
 data class VaccinationDGCV1(
     @SerializedName("ver") val version: String,
@@ -38,12 +40,29 @@ data class VaccinationDGCV1(
         // Unique Certificate Identifier, e.g.  "ci": "urn:uvci:01:NL:PlA8UWS60Z4RZXVALl6GAZ"
         @SerializedName("ci") val uniqueCertificateIdentifier: String
     ) {
+        // Can't use lazy because GSON will NULL it, as we have no no-args constructor
+        private var vaccinatedAtCache: LocalDate? = null
         val vaccinatedAt: LocalDate
-            get() = LocalDate.parse(dt.removeSuffix(DATE_SUFFIX))
+            get() = vaccinatedAtCache ?: dt.toLocalDateLeniently().also {
+                vaccinatedAtCache = it
+            }
     }
 
+    // Can't use lazy because GSON will NULL it, as we have no no-args constructor
+    private var dateOfBirthCache: LocalDate? = null
     val dateOfBirth: LocalDate
-        get() = LocalDate.parse(dob.removeSuffix(DATE_SUFFIX))
+        get() = dateOfBirthCache ?: dob.toLocalDateLeniently().also {
+            dateOfBirthCache = it
+        }
 }
 
-private const val DATE_SUFFIX = "T00:00:00"
+private fun String.toLocalDateLeniently(): LocalDate = try {
+    LocalDate.parse(this)
+} catch (e: Exception) {
+    Timber.w("Irregular date string: %s", this)
+    try {
+        DateTime.parse(this).toLocalDate()
+    } catch (giveUp: Exception) {
+        throw giveUp
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1Parser.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1Parser.kt
index be296d648c23287016daedb4ba60b168e5e36756..ea8f41d8d033af6704a37289bab9aa6a57de5b15 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1Parser.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/VaccinationDGCV1Parser.kt
@@ -30,7 +30,7 @@ class VaccinationDGCV1Parser @Inject constructor(
     } catch (e: InvalidHealthCertificateException) {
         throw e
     } catch (e: Throwable) {
-        throw InvalidHealthCertificateException(HC_CBOR_DECODING_FAILED)
+        throw InvalidHealthCertificateException(HC_CBOR_DECODING_FAILED, cause = e)
     }
 
     private fun VaccinationDGCV1.toValidated(lenient: Boolean): VaccinationDGCV1 = this
@@ -46,11 +46,12 @@ class VaccinationDGCV1Parser @Inject constructor(
                 throw InvalidHealthCertificateException(VC_MULTIPLE_VACCINATION_ENTRIES)
             }
         }
-        .also {
+        .apply {
+            // Apply otherwise we risk accidentally accessing the original obj in the outer scope
             // Force date parsing
             dateOfBirth
-            vaccinationDatas.forEach {
-                it.vaccinatedAt
+            vaccinationDatas.single().apply {
+                vaccinatedAt
             }
         }
 
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationQrCodeTestData.java b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationQrCodeTestData.java
index b850c4467f17e924601074bfc83aa72fb645b651..a1f964ce9e81afaed98fc97b1609f86f726d5c8f 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationQrCodeTestData.java
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationQrCodeTestData.java
@@ -8,6 +8,9 @@ public class VaccinationQrCodeTestData {
     static public String validVaccinationQrCode3 = "HC1:NCFOXN%TS3DH3ZSUZK+.V0ETD%65NL-AH%TAIOOW%I-1W0658WA/UAN9AAT4V22F/8X*G3M9JUPY0BX/KR96R/S09T./0LWTKD33236J3TA3M*4VV2 73-E3ND3DAJ-43%*48YIB73A*G3W19UEBY5:PI0EGSP4*2D$43B+2SEB7:I/2DY73CIBC:G 7376BXBJBAJ UNFMJCRN0H3PQN*E33H3OA70M3FMJIJN523S+0B/S7-SN2H N37J3JFTULJ5CB3ZCIATULV:SNS8F-67N%21Q21$48X2+36D-I/2DBAJDAJCNB-43SZ4RZ4E%5B/9OK53:UCT16DEZIE IE9.M CVCT1+9V*QERU1MK93P5 U02Y9.G9/G9F:QQ28R3U6/V.*NT*QM.SY$N-P1S29 34S0BYBRC.UYS1U%O6QKN*Q5-QFRMLNKNM8JI0EUGP$I/XK$M8-L9KDI:ZH2E4EVS6O0FVAQNJT:EZ6Q%D0*T1.XSDYV0.VI2OKSNODA.BOD:C.OTXS02:M5OGJIF4LHJW7FFJ2NLGFL/EE%CJF+KM%V$AUS:H+NARLK IBMMG";
     static public String validVaccinationQrCode4 = "HC1:6BFOXN*TS0BI$ZD.P9UOL97O4-2HH77HRM3DSPTLRR+%3KXH9M9ESIGUBA KWML%6S5B9-+P70Q5VC9:BPCNYKMXEE1JAA/CXGG0JK1WL260X638J3-E3ND3DAJ-43TTTO3HK1H3QBCWNZ83UQJ:T0/8F7V0HKN:Q8.HBV+0SZ4GH00T9UKP0T9WC5PF6846A$Q$76QW6%V98T5$FQMI5DN9QZ5Y0Q$UPE%5MZ5*T57ZA$O7T6LEJOA+MZ55EII-EB1EKC422JBBD0D2K.EJJ14B2MP41WTRZPQEC5L64HX6IAS 8S8FT/MAMXP6QS03L0QIRR97I2HOAXL92L0. KOKG8VG5SI:TU+MMPZ55%PBT1YEGEA7IB65C94JBQ2NLEE:NQ% GC3MXHFLF9OIFN0IZ95LJL80P1FDLW452I8941:HH3M41GTNP8EFUNT$.FTD852IWKP/HLIJL8JF8JF172IMAS EDAHMXFBFBQSKJE72KV$FHJ%3O%6:XM+1QD+T2/VKKER3L3%1THL7MGY.1S:T:GLOX6OCE7+RWYL3.C-L27WNV0G::M74O%K7C50AAEI4";
     static public String qrCodeWithNonsenseCountry = "HC1:NCF3Y28.P-O0PS3JPU7RBWBA2*9VTS/9VZ+PLUOVTJ$EB7W3R9B3VN/3A44E./EZ.6Y8C$.C.IK6MA$00J1TQZ9$9IU+S7HP%X9%*MW09:4WB/5SWB20V5VFBBREWO+GIIUF4+PBZR7MNX/N1JIIML/X3Z.Q67RMB6:BJYE26A5NNL:CIM-A*/UZTM+QO: ACV6212500GUC+KM-5AUYGUD1330PFBA855/SNDPCSOC3KMR9X$DB61.0AESG$:THFGP-M/VI2SG/ 22SS+V8OP3R8LDJ50HR6S94JMN-84Q0C+2/8FUV9HH6N91GB3/YCHN6ALFFZL3M116O/IBU6QKJK/3FMQ0TLK-.UQOO$%A $J%H0%*J:DE6/DOKTG*F605WRK8G7S96JG0 4IF:B9VM0CIBRF/XNBOH9 SGIFJ/2CX593I0GE7FFDEQ6+UO5D+HM/2IDBI.ET/L725IHPKB/T/Q9KRJ* NOWN$6K8VOZIHJ5R29KQWSPYKYSDZRJ+1IVBFGPMXEVY6JIYI/ CVBTJ-FY%MO%RUTF17S:1OL8PVXHRPTUOTK/VF%U%:IR G";
+    // Multiple: Irregular date string: 1978-01-26T00:00:00
     static public String qrCodeBulgaria = "HC1:NCFOXN*TS0BI$ZDYSHIAL*ECH 8S02109+D3NDC3LE84DIJ99HE1:G4G5%ZVGZ7:ZH6I1%4J.$2TM9*OVHABVCNN95ZTM.KM7755QLQQ5%YQ+GOSSP8/R2$Q.DPVGOP/R  QH$R387-WR9KRN95U/3P+9TG90OARH97KM4HGZJK HGX2MR$CXGG0U2XW4UZ2 NVV5TN%2UP20J5/5LEBFD-48YI+T4D-4HRVUMNMD3323R13-Y6C-4A+2XEN QT QTHC31M3+E3CP456L X4CZKHKB-43.E3KD3OAJ5%IWZKRA38M7323Q05.$S3U2JKB%RBKD3ZQTVJJ$+LQ3QR$P*NIV1JHQE.7W.GLA$2ECJYGCB%GLF9$DF8PQ9Z2*HNA-5NINJ4A*PO5FKYYNJK1G%UJ441JA4JBDC9PAGYCHK4GBLEH-BB.BECH 9MD-HBO55*E12MWKP/HLIJL8JF8JF172V2I0XTWYLM$EJ%MMWB:GSTHS:DW3ZJ0MD$NRF1OS6UE4VO4PFWL:IN9$RR.535T+TCZVFGZVXJPI1EUO9VOF+XBNOSJ/E32V4 L:XMHB0WAWIUJ";
     static public String qrCodeSweden = "HC1:NCFOXN%TSMAHN-HVN8J7UQMJ4/3RZLH62V2G1PC9CMSRH+QKFNTAVD3B19*AJCBMF6.UCOMIN6R%E5BD7HG8CU6O8QGU68ORJSPAEQOIR+SPCVO.28DDQHQ1BW9XX7ZY7NTICZU1*8X/KQ96/-KKTCY73JC3KD3LWT HB3ZC64JX7JQ1LK$2965VMFD-48YI 3533LC4TZ0BR/S09T./0ZYTS P-$0R:67PPDFPVX1R270:6C$Q0R6EOMUF5LDCPF5RBQ746B46O1N646RM9AL5CBVW566LH 469/9-3AKI6%T6LEQ-P6UQK*%NH$RSC9FFFW+7H9N$W2JO2C6S3UJ92KEST.ZJ-8B ZJ83B 2TAAUZZ2LH2%EUBUJZ0KZPIR145%T0YIF0JEYI1DLNCK1627ACW-T%NSY18KT911GL.EHNTI+SB-5A-ARUQNFW$ 2:.NU6W/CU8WDTFVG:BG3JFCSAVH-4V:HP4$0/.D9OV-RM60R7Z3B8PXICK+L/S1P*O:FG";
+    // vaccinatedAt: Irregular date string: 2021-05-29T15:31:00+02:00
+    static public String qrCodePoland = "HC1:6BFOXN%TS3DH+M8.IAS0RTAN:2MCID:D42:O%CM9W48+5MOOP-I3Z58MJNC5FAPQHIZC4.OI1RM8ZA.A53XHMKN4NN3F85QNPZ0K8C$JCW0KK.A96UJBC.P2R9CZXIAHAPEDG8C5DL-9C.PDI9309D: C+8DV9CA$DPN0NTICZU80LZW4Z*AK.GNNVR*G0C7PHBO33/X086B QTVINMJJDG3AE3RK38FN:43JON$97*97:L32SJ.L78PJ/FJBINB/S7-SN2HOH03I31M3EG3J%4UZ2UI7Y6T4R2H4T8%K+-8*S2E6J1$48X2-36D-I/2DW9J0$9+Q6X46Q3QR$P2OIC0JBLI+USK3UBVTVIJM/I2OC8ALD-ILOVGKFWZ07Y4 CTZ/3+N0ZUIQJAZGA2:UG%UJMI:TU+MM0W5-R53W12XE2O14P3.2O55O:FA$VKN6HQK3OKPEON4QDN7T*.53%1/HVII9H2JS6VS%J*HBXUCY+TU5EBYL5%T3V79YG%Q90MURRHY5D6$NN6VAQI8OEH.5PQ2WJF";
 }
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt
index 0c7670d9aef4c687f1d56a9cf1190ae3cfd6f668..c2a6106434de91fd521f7ee13636b9e425937108 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt
@@ -187,4 +187,12 @@ class VaccinationQRCodeExtractorTest : BaseTest() {
             mode = Mode.CERT_VAC_STRICT
         )
     }
+
+    @Test
+    fun `Polish qr code passes`() {
+        extractor.extract(
+            VaccinationQrCodeTestData.qrCodePoland,
+            mode = Mode.CERT_VAC_STRICT
+        )
+    }
 }