diff --git a/ippisite/ippidb/migrations/0064_proteindomaincomplex_polymorphic_ctype.py b/ippisite/ippidb/migrations/0064_proteindomaincomplex_polymorphic_ctype.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa4370a431bc0d4053425affe737d8e7846bbc2f
--- /dev/null
+++ b/ippisite/ippidb/migrations/0064_proteindomaincomplex_polymorphic_ctype.py
@@ -0,0 +1,34 @@
+# Generated by Django 2.2.1 on 2020-06-29 06:51
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+
+def forwards_func(apps, schema_editor):
+    # add the content type to the classes using django-polymorphic
+    # i.e. ProteinDomainBoundComplex and ProteinDomainPartnerComplex
+    # code is adapted from https://django-polymorphic.readthedocs.io/en/stable/migrating.html
+    ProteinDomainBoundComplex = apps.get_model('ippidb', 'ProteinDomainBoundComplex')
+    ProteinDomainPartnerComplex = apps.get_model('ippidb', 'ProteinDomainPartnerComplex')
+    ContentType = apps.get_model('contenttypes', 'ContentType')
+    pdbc_ct = ContentType.objects.get_for_model(ProteinDomainBoundComplex)
+    ProteinDomainBoundComplex.objects.filter(polymorphic_ctype__isnull=True).update(polymorphic_ctype=pdbc_ct)
+    pdpc_ct = ContentType.objects.get_for_model(ProteinDomainPartnerComplex)
+    ProteinDomainPartnerComplex.objects.filter(polymorphic_ctype__isnull=True).update(polymorphic_ctype=pdpc_ct)
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contenttypes', '0002_remove_content_type_name'),
+        ('ippidb', '0063_fill_drugbank_links'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='proteindomaincomplex',
+            name='polymorphic_ctype',
+            field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_ippidb.proteindomaincomplex_set+', to='contenttypes.ContentType'),
+        ),
+        migrations.RunPython(forwards_func, migrations.RunPython.noop),
+    ]
diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py
index fd6d9bde378e61d93b5d2a5d3c6f360e381fc10b..aa3ce3dea6359bf580cc518791bbeb3ca32104ea 100644
--- a/ippisite/ippidb/models.py
+++ b/ippisite/ippidb/models.py
@@ -20,6 +20,7 @@ from django.utils.translation import ugettext_lazy as _
 from django_celery_results.models import TaskResult
 from django.dispatch import receiver
 from django.db.models.signals import post_save
+from polymorphic.models import PolymorphicModel
 
 from .utils import FingerPrinter, smi2inchi, smi2inchikey
 from .ws import (
@@ -363,7 +364,7 @@ class ProteinDomainComplexGroup(models.Model):
         return str(self)
 
 
-class ProteinDomainComplex(models.Model):
+class ProteinDomainComplex(PolymorphicModel):
     """
     Protein-Domain association
     """
@@ -405,6 +406,10 @@ class ProteinDomainBoundComplex(ProteinDomainComplex):
 
     ppp_copy_nb_per_p = models.IntegerField(_("ppp_copy_nb_per_p"))
 
+    @property
+    def complex_type(self):
+        return "Bound"
+
     class Meta:
         verbose_name_plural = "bound complexes"
 
@@ -427,6 +432,10 @@ class ProteinDomainPartnerComplex(ProteinDomainComplex):
     Protein-Domain association with a "partner complex" role
     """
 
+    @property
+    def complex_type(self):
+        return "Partner"
+
     class Meta:
         verbose_name_plural = "partner complexes"
 
diff --git a/ippisite/ippisite/settings.py b/ippisite/ippisite/settings.py
index eae1293bfce34d82ee2c68e3b16c8720beba11dd..1cd64c663e6e2441525917a81d6e385d2f1fdb2b 100644
--- a/ippisite/ippisite/settings.py
+++ b/ippisite/ippisite/settings.py
@@ -57,6 +57,7 @@ INSTALLED_APPS = [
     "allauth.socialaccount",
     # "allauth.socialaccount.providers.github",
     "allauth.socialaccount.providers.orcid",
+    "polymorphic",
 ]
 
 MIDDLEWARE = [
diff --git a/ippisite/ippisite/settings.template.py b/ippisite/ippisite/settings.template.py
index cc7380331ae0fc0da893646062c37230ac094f0f..8991371af37b5479e2b38edd19edb196b7d2e0b3 100644
--- a/ippisite/ippisite/settings.template.py
+++ b/ippisite/ippisite/settings.template.py
@@ -60,6 +60,7 @@ INSTALLED_APPS = [
     "allauth.socialaccount",
     # "allauth.socialaccount.providers.github",
     "allauth.socialaccount.providers.orcid",
+    "polymorphic",
 ]
 
 MIDDLEWARE = [
diff --git a/ippisite/requirements-core.txt b/ippisite/requirements-core.txt
index f1744c72dccb44a88baa3b6501c13efb20f4476b..3cde9a193238df1e27034259bba4bc5b9aed0e72 100644
--- a/ippisite/requirements-core.txt
+++ b/ippisite/requirements-core.txt
@@ -28,3 +28,4 @@ git+https://gitlab.pasteur.fr/hmenager/django-diu.git#egg=django_diu
 #openbabel
 django-crispy-forms
 celery
+django-polymorphic
\ No newline at end of file