diff --git a/program/models.py b/program/models.py
index cb5991e06d0e241d180eb5b86ef33de5dd62092f..bf5abb47227681fc8df615b1103635c4e3a24da5 100644
--- a/program/models.py
+++ b/program/models.py
@@ -151,14 +151,20 @@ class Host(models.Model):
 
 
 class Link(models.Model):
-    host = models.ForeignKey(Host, on_delete=models.CASCADE, related_name="links")
-    description = models.CharField(max_length=8)
+    description = models.CharField(max_length=16)
     url = models.URLField()
 
+    class Meta:
+        abstract = True
+
     def __str__(self):
         return self.url
 
 
+class HostLink(Link):
+    host = models.ForeignKey(Host, on_delete=models.CASCADE, related_name="links")
+
+
 class Show(models.Model):
     predecessor = models.ForeignKey(
         "self",
@@ -1133,7 +1139,6 @@ class Note(models.Model):
         Show, on_delete=models.CASCADE, related_name="notes", editable=True
     )
     cba_id = models.IntegerField(blank=True, null=True)
-    audio_url = models.TextField(blank=True, editable=False)
     user = models.ForeignKey(
         User, editable=False, on_delete=models.CASCADE, related_name="users", default=1
     )
@@ -1161,3 +1166,7 @@ class Note(models.Model):
         if self.image.name and THUMBNAIL_SIZES:
             for size in THUMBNAIL_SIZES:
                 self.image.thumbnail = self.image.crop[size].name
+
+
+class NoteLink(Link):
+    note = models.ForeignKey(Note, on_delete=models.CASCADE, related_name="links")
diff --git a/program/serializers.py b/program/serializers.py
index 76a903cb11f29e09e4197458805371a47ca2dc36..5305eaf7639892954dd0e89d90bbd149d3faf75a 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -31,10 +31,11 @@ from program.models import (
     Category,
     FundingCategory,
     Host,
+    HostLink,
     Language,
-    Link,
     MusicFocus,
     Note,
+    NoteLink,
     RRule,
     Schedule,
     Show,
@@ -163,14 +164,14 @@ class CategorySerializer(serializers.ModelSerializer):
         fields = ("category", "abbrev", "slug", "is_active", "description")
 
 
-class LinkSerializer(serializers.ModelSerializer):
+class HostLinkSerializer(serializers.ModelSerializer):
     class Meta:
-        model = Link
+        model = HostLink
         fields = ("description", "url")
 
 
 class HostSerializer(serializers.ModelSerializer):
-    links = LinkSerializer(many=True, required=False)
+    links = HostLinkSerializer(many=True, required=False)
     thumbnails = serializers.SerializerMethodField()
 
     @staticmethod
@@ -193,7 +194,7 @@ class HostSerializer(serializers.ModelSerializer):
         host = Host.objects.create(**validated_data)
 
         for link_data in links_data:
-            Link.objects.create(host=host, **link_data)
+            HostLink.objects.create(host=host, **link_data)
         host.save()
         return host
 
@@ -214,9 +215,9 @@ class HostSerializer(serializers.ModelSerializer):
             for link in instance.links.all():
                 link.delete(keep_parents=True)
 
-        if links := validated_data.get("links"):
-            for link_data in links:
-                Link.objects.create(host=instance, **link_data)
+        if links_data := validated_data.get("links"):
+            for link_data in links_data:
+                HostLink.objects.create(host=instance, **link_data)
 
         instance.save()
 
@@ -592,7 +593,14 @@ class TimeSlotSerializer(serializers.ModelSerializer):
         return instance
 
 
+class NoteLinkSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = NoteLink
+        fields = ("description", "url")
+
+
 class NoteSerializer(serializers.ModelSerializer):
+    links = NoteLinkSerializer(many=True, required=False)
     show = serializers.PrimaryKeyRelatedField(queryset=Show.objects.all())
     timeslot = serializers.PrimaryKeyRelatedField(queryset=TimeSlot.objects.all())
     host = serializers.PrimaryKeyRelatedField(queryset=Host.objects.all())
@@ -615,15 +623,22 @@ class NoteSerializer(serializers.ModelSerializer):
 
     def create(self, validated_data):
         """Create and return a new Note instance, given the validated data."""
+        links_data = validated_data.pop("links", [])
 
         # Save the creator
         validated_data["user_id"] = self.context["user_id"]
 
-        # Try to retrieve audio URL from CBA
-        validated_data["audio_url"] = get_audio_url(validated_data.get("cba_id", None))
-
         note = Note.objects.create(**validated_data)
 
+        if cba_id := validated_data.get("cba_id"):
+            if audio_url := get_audio_url(cba_id):
+                NoteLink.objects.create(note=note, description="CBA", url=audio_url)
+
+        for link_data in links_data:
+            NoteLink.objects.create(note=note, **link_data)
+
+        note.save()
+
         # Assign note to timeslot
         if note.timeslot_id is not None:
             try:
@@ -649,7 +664,18 @@ class NoteSerializer(serializers.ModelSerializer):
         instance.status = validated_data.get("status", instance.status)
         instance.host = validated_data.get("host", instance.host)
         instance.cba_id = validated_data.get("cba_id", instance.cba_id)
-        instance.audio_url = get_audio_url(instance.cba_id)
+
+        if instance.links.count() > 0:
+            for link in instance.links.all():
+                link.delete(keep_parents=True)
+
+        if cba_id := validated_data.get("cba_id"):
+            if audio_url := get_audio_url(cba_id):
+                NoteLink.objects.create(note=instance, description="CBA", url=audio_url)
+
+        if links_data := validated_data.get("links"):
+            for link_data in links_data:
+                NoteLink.objects.create(note=instance, **link_data)
 
         instance.save()