diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorage.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorage.kt
index 0fc19f03bbef50d2fd228b96103ece548998c863..a0417a6414a2ffdf9dcbc36bd4fa2c0efa5e20e0 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorage.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorage.kt
@@ -47,14 +47,16 @@ class CoronaTestStorage @Inject constructor(
                 gson.fromJson<Set<PCRCoronaTest>>(raw, typeTokenPCR).onEach {
                     Timber.tag(TAG).v("PCR loaded: %s", it)
                     requireNotNull(it.identifier)
+                    requireNotNull(it.type) { "PCR type should not be null, GSON footgun." }
                 }
             }
 
             val raTests: Set<RACoronaTest> = run {
                 val raw = prefs.getString(PKEY_DATA_RA, null) ?: return@run emptySet()
                 gson.fromJson<Set<RACoronaTest>>(raw, typeTokenRA).onEach {
-                    Timber.tag(TAG).v("PCR loaded: %s", it)
+                    Timber.tag(TAG).v("RA loaded: %s", it)
                     requireNotNull(it.identifier)
+                    requireNotNull(it.type) { "RA type should not be null, GSON footgun." }
                 }
             }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRCoronaTest.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRCoronaTest.kt
index 0f260941b4ef3aaeb0d857b98da5d9cf98ba00a0..6c03147679533ab7bbc0740d85ab20c5aa0aa01a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRCoronaTest.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRCoronaTest.kt
@@ -42,27 +42,27 @@ data class PCRCoronaTest(
     @Transient override val lastError: Throwable? = null,
 ) : CoronaTest {
 
-    @Transient
-    override val type: CoronaTest.Type = CoronaTest.Type.PCR
-
-    @Transient
-    override val isPositive: Boolean = testResult == CoronaTestResult.PCR_POSITIVE
-
-    @Transient
-    override val isPending: Boolean = testResult == CoronaTestResult.PCR_OR_RAT_PENDING
-
-    @Transient
-    override val isSubmissionAllowed: Boolean = isPositive && !isSubmitted
-
-    @Transient
-    val state: State = when (testResult) {
-        CoronaTestResult.PCR_OR_RAT_PENDING -> State.PENDING
-        CoronaTestResult.PCR_NEGATIVE -> State.NEGATIVE
-        CoronaTestResult.PCR_POSITIVE -> State.POSITIVE
-        CoronaTestResult.PCR_INVALID -> State.INVALID
-        CoronaTestResult.PCR_REDEEMED -> State.REDEEMED
-        else -> throw IllegalArgumentException("Invalid PCR test state $testResult")
-    }
+    override val type: CoronaTest.Type
+        get() = CoronaTest.Type.PCR
+
+    override val isPositive: Boolean
+        get() = testResult == CoronaTestResult.PCR_POSITIVE
+
+    override val isPending: Boolean
+        get() = testResult == CoronaTestResult.PCR_OR_RAT_PENDING
+
+    override val isSubmissionAllowed: Boolean
+        get() = isPositive && !isSubmitted
+
+    val state: State
+        get() = when (testResult) {
+            CoronaTestResult.PCR_OR_RAT_PENDING -> State.PENDING
+            CoronaTestResult.PCR_NEGATIVE -> State.NEGATIVE
+            CoronaTestResult.PCR_POSITIVE -> State.POSITIVE
+            CoronaTestResult.PCR_INVALID -> State.INVALID
+            CoronaTestResult.PCR_REDEEMED -> State.REDEEMED
+            else -> throw IllegalArgumentException("Invalid PCR test state $testResult")
+        }
 
     enum class State {
         PENDING,
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RACoronaTest.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RACoronaTest.kt
index ca4c97568717588adcc54b5a34adca1abba2e5d4..a8f6b3f5d69b43eab99c8870439332fa32972990 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RACoronaTest.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RACoronaTest.kt
@@ -2,6 +2,12 @@ package de.rki.coronawarnapp.coronatest.type.rapidantigen
 
 import com.google.gson.annotations.SerializedName
 import de.rki.coronawarnapp.coronatest.server.CoronaTestResult
+import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.PCR_OR_RAT_PENDING
+import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_INVALID
+import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_NEGATIVE
+import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_PENDING
+import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_POSITIVE
+import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_REDEEMED
 import de.rki.coronawarnapp.coronatest.type.CoronaTest
 import de.rki.coronawarnapp.coronatest.type.RegistrationToken
 import de.rki.coronawarnapp.coronatest.type.TestIdentifier
@@ -55,27 +61,26 @@ data class RACoronaTest(
     @Transient override val lastError: Throwable? = null,
 ) : CoronaTest {
 
-    @Transient
-    override val type: CoronaTest.Type = CoronaTest.Type.RAPID_ANTIGEN
+    override val type: CoronaTest.Type
+        get() = CoronaTest.Type.RAPID_ANTIGEN
 
     fun getState(nowUTC: Instant) = when (testResult) {
-        CoronaTestResult.PCR_OR_RAT_PENDING -> State.PENDING
-        CoronaTestResult.RAT_NEGATIVE -> State.NEGATIVE
-        CoronaTestResult.RAT_POSITIVE -> State.POSITIVE
-        CoronaTestResult.RAT_INVALID -> State.INVALID
-        CoronaTestResult.RAT_REDEEMED -> State.REDEEMED
+        PCR_OR_RAT_PENDING -> State.PENDING
+        RAT_NEGATIVE -> State.NEGATIVE
+        RAT_POSITIVE -> State.POSITIVE
+        RAT_INVALID -> State.INVALID
+        RAT_REDEEMED -> State.REDEEMED
         else -> throw IllegalArgumentException("Invalid RAT test state $testResult")
     }
 
-    @Transient
-    override val isPositive: Boolean = testResult == CoronaTestResult.RAT_POSITIVE
+    override val isPositive: Boolean
+        get() = testResult == RAT_POSITIVE
 
-    @Transient
-    override val isPending: Boolean =
-        testResult == CoronaTestResult.PCR_OR_RAT_PENDING || testResult == CoronaTestResult.RAT_PENDING
+    override val isPending: Boolean
+        get() = setOf(PCR_OR_RAT_PENDING, RAT_PENDING).contains(testResult)
 
-    @Transient
-    override val isSubmissionAllowed: Boolean = isPositive && !isSubmitted
+    override val isSubmissionAllowed: Boolean
+        get() = isPositive && !isSubmitted
 
     enum class State {
         PENDING,
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OneTimePassword.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OneTimePassword.kt
index 8bf382bdc68a73c396037fd39004d87c93451e11..1692cb7d4a680fcef89c60b3123be6a0a2ab8869 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OneTimePassword.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OneTimePassword.kt
@@ -14,11 +14,11 @@ data class OneTimePassword(
     val time: Instant = Instant.now()
 ) {
 
-    @Transient
-    val edusOneTimePassword: EdusOtp.EDUSOneTimePassword = EdusOtp.EDUSOneTimePassword.newBuilder()
-        .setOtp(uuid.toString())
-        .build()
+    val edusOneTimePassword: EdusOtp.EDUSOneTimePassword
+        get() = EdusOtp.EDUSOneTimePassword.newBuilder()
+            .setOtp(uuid.toString())
+            .build()
 
-    @Transient
-    val payloadForRequest: ByteArray = edusOneTimePassword.toByteArray()
+    val payloadForRequest: ByteArray
+        get() = edusOneTimePassword.toByteArray()
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/LocationCode.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/LocationCode.kt
index 8201571a46b14ca53b35d2146dae940a663014e0..2a3404e55dfc56cdb2b9f590dff3da8e50cfb142 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/LocationCode.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/LocationCode.kt
@@ -5,6 +5,6 @@ import java.util.Locale
 data class LocationCode(
     private val rawIdentifier: String
 ) {
-    @Transient
-    val identifier: String = rawIdentifier.toUpperCase(Locale.ROOT)
+    val identifier: String
+        get() = rawIdentifier.toUpperCase(Locale.ROOT)
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyInfo.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyInfo.kt
index 9dd0b8ada11abec14be3e1a2f7740e5bc7715aca..ada80369ada5f758a9748016f9439df216402f35 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyInfo.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyInfo.kt
@@ -41,8 +41,8 @@ data class CachedKeyInfo(
         isDownloadComplete = false
     )
 
-    @Transient
-    val fileName: String = "$id.zip"
+    val fileName: String
+        get() = "$id.zip"
 
     fun toDownloadUpdate(etag: String): DownloadUpdate = DownloadUpdate(
         id = id,
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/storage/TraceWarningPackageMetadata.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/storage/TraceWarningPackageMetadata.kt
index 54725874a1c3c8931c8f9f9196786d861076456b..6fa72600bc045fc1ad928c412b26b425f40504d2 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/storage/TraceWarningPackageMetadata.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/storage/TraceWarningPackageMetadata.kt
@@ -31,8 +31,8 @@ data class TraceWarningPackageMetadata(
         createdAt = createdAt,
     )
 
-    @Transient
-    val fileName: String = "$packageId.bin"
+    val fileName: String
+        get() = "$packageId.bin"
 
     companion object {
         fun calcluateId(
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorageTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorageTest.kt
index fd88abd78b86a4810c405563e3a0492c276c8077..4f026681cd45b9b91c5b1359b3d18228f29ea08f 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorageTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/storage/CoronaTestStorageTest.kt
@@ -3,6 +3,7 @@ package de.rki.coronawarnapp.coronatest.storage
 import android.content.Context
 import androidx.core.content.edit
 import de.rki.coronawarnapp.coronatest.server.CoronaTestResult
+import de.rki.coronawarnapp.coronatest.type.CoronaTest
 import de.rki.coronawarnapp.coronatest.type.pcr.PCRCoronaTest
 import de.rki.coronawarnapp.coronatest.type.rapidantigen.RACoronaTest
 import de.rki.coronawarnapp.util.serialization.SerializationModule
@@ -114,10 +115,13 @@ class CoronaTestStorageTest : BaseTest() {
             ]
         """.toComparableJsonPretty()
 
-        instance.coronaTests.single() shouldBe pcrTest.copy(
-            lastError = null,
-            isProcessing = false
-        )
+        instance.coronaTests.single().apply {
+            this shouldBe pcrTest.copy(
+                lastError = null,
+                isProcessing = false
+            )
+            type shouldBe CoronaTest.Type.PCR
+        }
     }
 
     @Test
@@ -153,10 +157,13 @@ class CoronaTestStorageTest : BaseTest() {
             ]
         """.toComparableJsonPretty()
 
-        instance.coronaTests.single() shouldBe raTest.copy(
-            lastError = null,
-            isProcessing = false
-        )
+        instance.coronaTests.single().apply {
+            this shouldBe raTest.copy(
+                lastError = null,
+                isProcessing = false
+            )
+            type shouldBe CoronaTest.Type.RAPID_ANTIGEN
+        }
     }
 
     @Test