diff --git a/aleksis/apps/tezor/models/base.py b/aleksis/apps/tezor/models/base.py
index e8feec9086097aa215fea9fdf5f865d7a3e51e9c..a7e9020105b8062a4933bf71f9a4e74543a74632 100644
--- a/aleksis/apps/tezor/models/base.py
+++ b/aleksis/apps/tezor/models/base.py
@@ -1,3 +1,5 @@
+from django.contrib.contenttypes.fields import GenericForeignKey
+from django.contrib.contenttypes.models import ContentType
 from django.db import models
 from django.utils.translation import gettext_lazy as _
 
@@ -11,3 +13,23 @@ class Client(ExtensibleModel):
         constraints = [
             models.UniqueConstraint(fields=["name", "site"], name="uniq_client_per_site")
         ]
+
+
+class Subject(ExtensibleModel):
+    content_type = models.ForeignKey(ContetType, on_delete=models.SET_NULL)
+    object_id = models.PositiveIntegerField()
+    related = GenericForeignKey("content_type", "object_id")
+
+    def get_address(self):
+        if hasattr(self.related, "get_address"):
+            return self.related.get_address()
+        elif hasattr(self.related, "addressing_name") and hasattr(self.related, "street") and hasattr(self.related, "housenumber") and hasattr(self.related, "postal_code") and hasattr(self.related, "place"):
+            # FIXME Use proper locale-based address generation
+            return f"{self.related.addressing_name}\n{self.related.street} {self.related.housenumber}\n{self.related.postal_code} {self.related.place}"
+
+    @classmethod
+    def from_person(cls, person):
+        ct = ContentType.objects.get_for_model(person)
+        subject, created = cls.objects.get_or_create(content_type=ct, object_id=person)
+
+        return subject
diff --git a/aleksis/apps/tezor/models/invoice.py b/aleksis/apps/tezor/models/invoice.py
index 4b4c6d0b73ddd1b0063c5c1840bea213744e5fe7..e18fb9a554bfd28f8faa7e371821f319a5bfcda3 100644
--- a/aleksis/apps/tezor/models/invoice.py
+++ b/aleksis/apps/tezor/models/invoice.py
@@ -5,7 +5,7 @@ from djmoney.models.fields import CurrencyField, MoneyField
 
 from aleksis.core.mixins import ExtensibleModel
 
-from .base import Client
+from .base import Client, Subject
 
 
 class InvoiceGroup(ExtensibleModel):
@@ -27,6 +27,7 @@ class Invoice(ExtensibleModel):
 
     number = models.CharField(verbose_name=_("Invoice number"))
     date = models.DateField(verbose_name=_("Invoice date"))
+    recipient = models.ForeignKey(Subject, verbose_name=_("Recipient"), on_delete=models.SET_NULL)
 
     @property
     def currency(self):