diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/cryptography/AesCryptography.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/cryptography/AesCryptography.kt
new file mode 100644
index 0000000000000000000000000000000000000000..80ad40d4c48bd224b6cf62eef0dbce49b9ac0379
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/cryptography/AesCryptography.kt
@@ -0,0 +1,16 @@
+package de.rki.coronawarnapp.covidcertificate.cryptography
+
+import dagger.Reusable
+import okio.ByteString
+import javax.inject.Inject
+
+@Reusable
+class AesCryptography @Inject constructor() {
+
+    fun decrypt(
+        decryptionKey: ByteArray,
+        encryptedData: ByteString
+    ): ByteArray {
+        throw NotImplementedError()
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateData.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateData.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8858296812f1cd3fe089cf7ac88f8c599a3c8e00
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateData.kt
@@ -0,0 +1,8 @@
+package de.rki.coronawarnapp.covidcertificate.test
+
+import de.rki.coronawarnapp.vaccination.core.certificate.CoseCertificateHeader
+
+data class TestCertificateData(
+    val header: CoseCertificateHeader,
+    val certificate: TestCertificateDccV1,
+)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateDccV1.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateDccV1.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d66086dfe7b5fb8b64b64ee9fba7362cc5a8006b
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateDccV1.kt
@@ -0,0 +1,48 @@
+package de.rki.coronawarnapp.covidcertificate.test
+
+import com.google.gson.annotations.SerializedName
+import org.joda.time.Instant
+import org.joda.time.LocalDate
+
+data class TestCertificateDccV1(
+    @SerializedName("ver") val version: String,
+    @SerializedName("nam") val nameData: NameData,
+    @SerializedName("dob") val dob: String,
+    @SerializedName("v") val testCertificateData: List<TestCertificateData>,
+) {
+    data class NameData(
+        @SerializedName("fn") val familyName: String?,
+        @SerializedName("fnt") val familyNameStandardized: String,
+        @SerializedName("gn") val givenName: String?,
+        @SerializedName("gnt") val givenNameStandardized: String?,
+    )
+
+    data class TestCertificateData(
+        // Disease or agent targeted, e.g. "tg": "840539006"
+        @SerializedName("tg") val targetId: String,
+        // Vaccine or prophylaxis, e.g. "vp": "1119349007"
+        @SerializedName("vp") val vaccineId: String,
+        // Vaccine medicinal product,e.g. "mp": "EU/1/20/1528",
+        @SerializedName("mp") val medicalProductId: String,
+        // Marketing Authorization Holder, e.g. "ma": "ORG-100030215",
+        @SerializedName("ma") val marketAuthorizationHolderId: String,
+        // Date/Time of Sample Collection (required)
+        // "sc": "2021-04-13T14:20:00+00:00",
+        @SerializedName("sc") val sampleCollectedAt: Instant,
+        // Date/Time of Test Result
+        // "dr": "2021-04-13T14:40:01+00:00",
+        @SerializedName("dr") val testResultAt: Instant,
+        // Testing Center (required)
+        // "tc": "GGD Fryslân, L-Heliconweg",
+        @SerializedName("tc") val testCenter: String,
+        // Country of Vaccination, e.g. "co": "NL"
+        @SerializedName("co") val countryOfVaccination: String,
+        // Certificate Issuer, e.g. "is": "Ministry of Public Health, Welfare and Sport",
+        @SerializedName("is") val certificateIssuer: String,
+        // Unique Certificate Identifier, e.g.  "ci": "urn:uvci:01:NL:PlA8UWS60Z4RZXVALl6GAZ"
+        @SerializedName("ci") val uniqueCertificateIdentifier: String
+    )
+
+    val dateOfBirth: LocalDate
+        get() = LocalDate.parse(dob)
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateQRCode.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateQRCode.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6cc65a07b63d365aed9841ef0618609961f02c0c
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateQRCode.kt
@@ -0,0 +1,6 @@
+package de.rki.coronawarnapp.covidcertificate.test
+
+data class TestCertificateQRCode(
+    val qrCode: String,
+    val testCertificateData: TestCertificateData,
+)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateQRCodeExtractor.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateQRCodeExtractor.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e5c34fc642af841c670cdb405349fb6201a439b1
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/TestCertificateQRCodeExtractor.kt
@@ -0,0 +1,26 @@
+package de.rki.coronawarnapp.covidcertificate.test
+
+import dagger.Reusable
+import okio.ByteString
+import javax.inject.Inject
+
+@Reusable
+class TestCertificateQRCodeExtractor @Inject constructor() {
+
+    /**
+     * May throw an **[InvalidHealthCertificateException]**
+     */
+    fun extract(
+        decryptionKey: ByteArray,
+        encryptedCoseComponents: ByteString,
+    ): TestCertificateData {
+        throw NotImplementedError()
+    }
+
+    /**
+     * May throw an **[InvalidHealthCertificateException]**
+     */
+    fun extract(qrCode: String): TestCertificateQRCode {
+        throw NotImplementedError()
+    }
+}