diff --git a/ippisite/db.sqlite3 b/ippisite/db.sqlite3
index 585c05bac9b5bb713a7f404b36981aaa02f2ba17..8222fa0613fb7defe327ce8452ea41e836d26eeb 100644
Binary files a/ippisite/db.sqlite3 and b/ippisite/db.sqlite3 differ
diff --git a/ippisite/ippidb/management/commands/import_v1_data.py b/ippisite/ippidb/management/commands/import_v1_data.py
index 67b83282921858fab32d01476f8e4dbd584c8eb4..69948d26554c89e2545dd9f22523133075f2fc94 100644
--- a/ippisite/ippidb/management/commands/import_v1_data.py
+++ b/ippisite/ippidb/management/commands/import_v1_data.py
@@ -2,7 +2,7 @@ from django.core.management import BaseCommand, CommandError
 import mysql.connector
 
 from ippidb.models import Bibliography, Protein, Taxonomy, MolecularFunction, \
-    Domain, ProteinDomainBoundComplex, ProteinDomainPartnerComplex, Symmetry, Ppi
+    Domain, ProteinDomainBoundComplex, ProteinDomainPartnerComplex, Symmetry, Ppi, PpiComplex
 
 class Command(BaseCommand):
 
@@ -31,18 +31,18 @@ class Command(BaseCommand):
             help='Flush and migrate domains',
         )
         parser.add_argument(
-            '--complexes',
+            '--symmetries',
             action='store_true',
-            dest='complexes',
+            dest='symmetries',
             default=False,
-            help='Flush and migrate complexes',
+            help='Flush and create symmetries',
         )
         parser.add_argument(
-            '--symmetries',
+            '--ppi',
             action='store_true',
-            dest='symmetries',
+            dest='ppi',
             default=False,
-            help='Flush and create symmetries',
+            help='Flush and migrate ppis and complexes',
         )
         parser.add_argument(
             '--stoponfail',
@@ -117,39 +117,6 @@ class Command(BaseCommand):
                         self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[1], row[2])))
                 else:
                     self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[1], row[2])))
-        if options['complexes']:
-            sql_request_string = '''
-                select distinct protein.NumUniprot, domain.PfamNumAccession  , complexe.NbCopy, cmpdAction.IDComplexeBound, bindingSiteEvidence.CodePDB  from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite1) inner join complexe on (ppi.IDComplexe1=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain) union select distinct protein.NumUniprot, domain.PfamNumAccession  , complexe.NbCopy, cmpdAction.IDComplexeBound  from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite2) inner join complexe on (ppi.IDComplexe2=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain) left outer join bindingSiteEvidence on (ppi.IDPPI=bindingSiteEvidence.IDPPI)'''
-            cursor.execute(sql_request_string)
-            rows = cursor.fetchall()
-            ProteinDomainBoundComplex.objects.all().delete()
-            ProteinDomainPartnerComplex.objects.all().delete()
-            Ppi.objects.all().delete()
-            self.stdout.write(self.style.SUCCESS('Successfully flushed protein domain complex tables and Ppi'))
-            for row in rows:
-                try:
-                    if row[3]=="null":
-                        c = ProteinDomainPartnerComplex()
-                    else:
-                        c = ProteinDomainBoundComplex()
-                    protein = Protein.objects.get(uniprot_id=row[0])
-                    c.protein_id = protein
-                    domain = Domain.objects.get(pfam_acc=row[1])
-                    c.domain_id = domain
-                    c.ppc_copy_nb = row[2]
-                    if isinstance(c, ProteinDomainBoundComplex):
-                        c.ppp_copy_nb_per_p = 1
-                        c.pockets_nb = 1
-                    c.save()
-                except Exception as e:
-                    if options['stoponfail']:
-                        import traceback
-                        self.stderr.write(traceback.format_exc())
-                        raise CommandError('Failed inserting {} {}'.format(row[0], row[1]))
-                    else:
-                        self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[0], row[1])))
-                else:
-                    self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[0], row[1])))
         if options['symmetries']:
             Symmetry.objects.all().delete()
             self.stdout.write(self.style.SUCCESS('Successfully flushed symmetries table'))
@@ -179,4 +146,57 @@ class Command(BaseCommand):
                         self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[0], row[1])))
                 else:
                     self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[0], row[1])))
+        if options['ppi']:
+            sql_request_string = '''
+select distinct protein.NumUniprot, domain.PfamNumAccession, complexe.NbCopy, cmpdAction.IDComplexeBound, bindingSiteEvidence.CodePDB, 'part1', ppi.IDPPI  from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite1) inner join complexe on (ppi.IDComplexe1=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain) left outer join bindingSiteEvidence on (ppi.IDPPI=bindingSiteEvidence.IDPPI)
+union 
+select distinct protein.NumUniprot, domain.PfamNumAccession  , complexe.NbCopy, cmpdAction.IDComplexeBound, null, 'part2', ppi.IDPPI  from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite2) inner join complexe on (ppi.IDComplexe2=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain)'''
+            cursor.execute(sql_request_string)
+            rows = cursor.fetchall()
+            ProteinDomainBoundComplex.objects.all().delete()
+            ProteinDomainPartnerComplex.objects.all().delete()
+            Ppi.objects.all().delete()
+            PpiComplex.objects.all().delete()
+            self.stdout.write(self.style.SUCCESS('Successfully flushed protein domain complex tables and Ppi'))
+            ppi_ids_mapping = {}
+            for row in rows:
+                try:
+                    # create or retrieve Ppi object
+                    if row[5]=='part1':
+                        ppi = Ppi()
+                        ppi.pdb_id = row[4]
+                        ppi.symmetry = Symmetry.objects.get(code='AS')
+                        ppi.save()
+                        ppi_ids_mapping[row[6]]=ppi.id
+                    else:
+                        ppi = Ppi.objects.get(id=ppi_ids_mapping[row[6]])
+                    # create a complex
+                    if row[3]=="null":
+                        c = ProteinDomainPartnerComplex()
+                    else:
+                        c = ProteinDomainBoundComplex()
+                    protein = Protein.objects.get(uniprot_id=row[0])
+                    c.protein = protein
+                    domain = Domain.objects.get(pfam_acc=row[1])
+                    c.domain = domain
+                    c.ppc_copy_nb = row[2]
+                    if isinstance(c, ProteinDomainBoundComplex):
+                        c.ppp_copy_nb_per_p = 1
+                        c.pockets_nb = 1
+                    c.save()
+                    # create the PpiComplex object
+                    ppi_complex = PpiComplex()
+                    ppi_complex.ppi = ppi
+                    ppi_complex.complex = c
+                    ppi_complex.cc_nb = 1
+                    ppi_complex.save()
+                except Exception as e:
+                    if options['stoponfail']:
+                        import traceback
+                        self.stderr.write(traceback.format_exc())
+                        raise CommandError('Failed inserting {} {}'.format(row[0], row[1]))
+                    else:
+                        self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[0], row[1])))
+                else:
+                    self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[0], row[1])))
             
diff --git a/ippisite/ippidb/migrations/0011_auto_20170518_1404.py b/ippisite/ippidb/migrations/0011_auto_20170518_1404.py
new file mode 100644
index 0000000000000000000000000000000000000000..9abe3d730559d93e1f8dfbcf9b6caa7543b582dd
--- /dev/null
+++ b/ippisite/ippidb/migrations/0011_auto_20170518_1404.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.1 on 2017-05-18 14:04
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ippidb', '0010_auto_20170518_1142'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='ppi',
+            name='pdb_id',
+            field=models.CharField(max_length=4, null=True, verbose_name='PDB ID'),
+        ),
+    ]
diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py
index 50288a93986113f872b57728b47c61ec364e5ebe..4e4f0901e8ea3f2242df1e458ea2bad1f55a8622 100644
--- a/ippisite/ippidb/models.py
+++ b/ippisite/ippidb/models.py
@@ -150,7 +150,7 @@ class Symmetry(models.Model):
         return '{} ({})'.format(self.code, self.description)
 
 class Ppi(models.Model):
-    pdb_id = models.CharField('PDB ID', max_length=4)
+    pdb_id = models.CharField('PDB ID', max_length=4, null=True)
     symmetry = models.ForeignKey(Symmetry)
 
 class PpiComplex(models.Model):