diff --git a/ietf/doc/admin.py b/ietf/doc/admin.py
index 203f77c09..cc45d05f1 100644
--- a/ietf/doc/admin.py
+++ b/ietf/doc/admin.py
@@ -105,7 +105,7 @@ class DocHistoryAdmin(admin.ModelAdmin):
     list_display = ['doc', 'rev', 'state', 'group', 'pages', 'intended_std_level', 'author_list', 'time']
     search_fields = ['doc__name']
     ordering = ['time', 'doc', 'rev']
-    raw_id_fields = ['doc', 'authors', 'related', 'group', 'shepherd', 'ad']
+    raw_id_fields = ['doc', 'authors', 'group', 'shepherd', 'ad']
 
     def state(self, instance):
         return instance.get_state()
diff --git a/ietf/doc/migrations/0006_auto_20150929_0828.py b/ietf/doc/migrations/0006_auto_20150929_0828.py
new file mode 100644
index 000000000..d2e29eb67
--- /dev/null
+++ b/ietf/doc/migrations/0006_auto_20150929_0828.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('doc', '0005_auto_20150721_0230'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='dochistory',
+            name='related',
+        ),
+        migrations.AddField(
+            model_name='relateddochistory',
+            name='target_name',
+            field=models.CharField(default=b'', max_length=255),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='relateddocument',
+            name='target_name',
+            field=models.CharField(default=b'', max_length=255),
+            preserve_default=True,
+        ),
+    ]
diff --git a/ietf/doc/migrations/0007_auto_20150929_0840.py b/ietf/doc/migrations/0007_auto_20150929_0840.py
new file mode 100644
index 000000000..0320d0917
--- /dev/null
+++ b/ietf/doc/migrations/0007_auto_20150929_0840.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations
+import django.db
+
+def fill_in_docalias_relationship_names(apps, schema_editor):
+    with django.db.connection.cursor() as cursor:
+        cursor.execute("update doc_relateddocument join doc_docalias on doc_docalias.id = doc_relateddocument.target_id set doc_relateddocument.target_name = doc_docalias.name;")
+        cursor.execute("update doc_relateddochistory join doc_docalias on doc_docalias.id = doc_relateddochistory.target_id set doc_relateddochistory.target_name = doc_docalias.name;")
+
+def noop(apps, schema_editor):
+    pass
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('doc', '0006_auto_20150929_0828'),
+    ]
+
+    operations = [
+        migrations.RunPython(fill_in_docalias_relationship_names, noop)
+    ]
diff --git a/ietf/doc/migrations/0008_auto_20150930_0242.py b/ietf/doc/migrations/0008_auto_20150930_0242.py
new file mode 100644
index 000000000..b3ff2f593
--- /dev/null
+++ b/ietf/doc/migrations/0008_auto_20150930_0242.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('doc', '0007_auto_20150929_0840'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='relateddochistory',
+            name='target',
+        ),
+        migrations.RenameField(
+            model_name='relateddochistory',
+            old_name='target_name',
+            new_name='target',
+        ),
+        migrations.RemoveField(
+            model_name='relateddocument',
+            name='target',
+        ),
+        migrations.RenameField(
+            model_name='relateddocument',
+            old_name='target_name',
+            new_name='target',
+        ),
+    ]
diff --git a/ietf/doc/migrations/0009_auto_20150930_0248.py b/ietf/doc/migrations/0009_auto_20150930_0248.py
new file mode 100644
index 000000000..879ae7c88
--- /dev/null
+++ b/ietf/doc/migrations/0009_auto_20150930_0248.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('doc', '0008_auto_20150930_0242'),
+        ('ipr', '0006_auto_20150930_0235'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='docalias',
+            name='id',
+        ),
+        migrations.AlterField(
+            model_name='docalias',
+            name='name',
+            field=models.CharField(max_length=255, serialize=False, primary_key=True),
+            preserve_default=True,
+        ),
+    ]
diff --git a/ietf/doc/migrations/0010_auto_20150930_0251.py b/ietf/doc/migrations/0010_auto_20150930_0251.py
new file mode 100644
index 000000000..f68b9d84f
--- /dev/null
+++ b/ietf/doc/migrations/0010_auto_20150930_0251.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('doc', '0009_auto_20150930_0248'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='relateddochistory',
+            name='target',
+            field=models.ForeignKey(related_name='reversely_related_document_history_set', to='doc.DocAlias'),
+            preserve_default=True,
+        ),
+        migrations.AlterField(
+            model_name='relateddocument',
+            name='target',
+            field=models.ForeignKey(to='doc.DocAlias'),
+            preserve_default=True,
+        ),
+    ]
diff --git a/ietf/doc/models.py b/ietf/doc/models.py
index 70bbe2142..ddc20b297 100644
--- a/ietf/doc/models.py
+++ b/ietf/doc/models.py
@@ -367,7 +367,6 @@ class DocumentAuthor(models.Model):
     
 class Document(DocumentInfo):
     name = models.CharField(max_length=255, primary_key=True)           # immutable
-    #related = models.ManyToManyField('DocAlias', through=RelatedDocument, blank=True, related_name="reversely_related_document_set")
     authors = models.ManyToManyField(Email, through=DocumentAuthor, blank=True)
 
     def __unicode__(self):
@@ -540,7 +539,6 @@ class DocHistory(DocumentInfo):
     # canonical_name and replace the function on Document with a
     # property
     name = models.CharField(max_length=255)
-    related = models.ManyToManyField('DocAlias', through=RelatedDocHistory, blank=True)
     authors = models.ManyToManyField(Email, through=DocHistoryAuthor, blank=True)
     def __unicode__(self):
         return unicode(self.doc.name)
@@ -620,8 +618,8 @@ class DocAlias(models.Model):
     same immutable Document.name, in the tables, but will be referred
     to by RFC number, primarily, after achieving RFC status.
     """
+    name = models.CharField(max_length=255, primary_key=True)
     document = models.ForeignKey(Document)
-    name = models.CharField(max_length=255, db_index=True)
     def __unicode__(self):
         return "%s-->%s" % (self.name, self.document.name)
     document_link = admin_link("document")
diff --git a/ietf/doc/resources.py b/ietf/doc/resources.py
index 96641e8b4..93ecea04d 100644
--- a/ietf/doc/resources.py
+++ b/ietf/doc/resources.py
@@ -1,11 +1,11 @@
-# Autogenerated by the mkresources management command 2014-12-14 19:50
+# Autogenerated by the makeresources management command 2015-10-19 12:29 PDT
 from tastypie.resources import ModelResource
-from tastypie.fields import ToOneField, ToManyField, CharField
-from tastypie.constants import ALL, ALL_WITH_RELATIONS
+from tastypie.fields import ToOneField, ToManyField, CharField # pyflakes:ignore
+from tastypie.constants import ALL, ALL_WITH_RELATIONS # pyflakes:ignore
 
 from ietf import api
 
-from ietf.doc.models import *           # pyflakes:ignore
+from ietf.doc.models import *                            # pyflakes:ignore
 
 
 from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource
@@ -179,6 +179,53 @@ class StateDocEventResource(ModelResource):
         }
 api.doc.register(StateDocEventResource())
 
+from ietf.person.resources import PersonResource, EmailResource
+from ietf.group.resources import GroupResource
+from ietf.name.resources import StdLevelNameResource, StreamNameResource, DocTypeNameResource, DocTagNameResource, IntendedStdLevelNameResource
+class DocHistoryResource(ModelResource):
+    type             = ToOneField(DocTypeNameResource, 'type', null=True)
+    stream           = ToOneField(StreamNameResource, 'stream', null=True)
+    group            = ToOneField(GroupResource, 'group', null=True)
+    intended_std_level = ToOneField(IntendedStdLevelNameResource, 'intended_std_level', null=True)
+    std_level        = ToOneField(StdLevelNameResource, 'std_level', null=True)
+    ad               = ToOneField(PersonResource, 'ad', null=True)
+    shepherd         = ToOneField(EmailResource, 'shepherd', null=True)
+    doc              = ToOneField(DocumentResource, 'doc')
+    states           = ToManyField(StateResource, 'states', null=True)
+    tags             = ToManyField(DocTagNameResource, 'tags', null=True)
+    authors          = ToManyField(EmailResource, 'authors', null=True)
+    class Meta:
+        queryset = DocHistory.objects.all()
+        serializer = api.Serializer()
+        #resource_name = 'dochistory'
+        filtering = { 
+            "id": ALL,
+            "time": ALL,
+            "title": ALL,
+            "abstract": ALL,
+            "rev": ALL,
+            "pages": ALL,
+            "order": ALL,
+            "expires": ALL,
+            "notify": ALL,
+            "external_url": ALL,
+            "note": ALL,
+            "internal_comments": ALL,
+            "name": ALL,
+            "type": ALL_WITH_RELATIONS,
+            "stream": ALL_WITH_RELATIONS,
+            "group": ALL_WITH_RELATIONS,
+            "intended_std_level": ALL_WITH_RELATIONS,
+            "std_level": ALL_WITH_RELATIONS,
+            "ad": ALL_WITH_RELATIONS,
+            "shepherd": ALL_WITH_RELATIONS,
+            "doc": ALL_WITH_RELATIONS,
+            "states": ALL_WITH_RELATIONS,
+            "tags": ALL_WITH_RELATIONS,
+            "authors": ALL_WITH_RELATIONS,
+        }
+api.doc.register(DocHistoryResource())
+
 from ietf.person.resources import PersonResource
 class ConsensusDocEventResource(ModelResource):
     by               = ToOneField(PersonResource, 'by')
@@ -207,7 +254,6 @@ class DocAliasResource(ModelResource):
         serializer = api.Serializer()
         #resource_name = 'docalias'
         filtering = { 
-            "id": ALL,
             "name": ALL,
             "document": ALL_WITH_RELATIONS,
         }
@@ -336,6 +382,22 @@ class InitialReviewDocEventResource(ModelResource):
         }
 api.doc.register(InitialReviewDocEventResource())
 
+from ietf.person.resources import EmailResource
+class DocHistoryAuthorResource(ModelResource):
+    document         = ToOneField(DocHistoryResource, 'document')
+    author           = ToOneField(EmailResource, 'author')
+    class Meta:
+        queryset = DocHistoryAuthor.objects.all()
+        serializer = api.Serializer()
+        #resource_name = 'dochistoryauthor'
+        filtering = { 
+            "id": ALL,
+            "order": ALL,
+            "document": ALL_WITH_RELATIONS,
+            "author": ALL_WITH_RELATIONS,
+        }
+api.doc.register(DocHistoryAuthorResource())
+
 from ietf.person.resources import PersonResource
 class BallotDocEventResource(ModelResource):
     by               = ToOneField(PersonResource, 'by')
@@ -375,54 +437,22 @@ class RelatedDocumentResource(ModelResource):
         }
 api.doc.register(RelatedDocumentResource())
 
-from ietf.person.resources import PersonResource, EmailResource
-from ietf.group.resources import GroupResource
-from ietf.name.resources import StdLevelNameResource, StreamNameResource, DocTypeNameResource, DocTagNameResource, IntendedStdLevelNameResource
-class DocHistoryResource(ModelResource):
-    type             = ToOneField(DocTypeNameResource, 'type', null=True)
-    stream           = ToOneField(StreamNameResource, 'stream', null=True)
-    group            = ToOneField(GroupResource, 'group', null=True)
-    intended_std_level = ToOneField(IntendedStdLevelNameResource, 'intended_std_level', null=True)
-    std_level        = ToOneField(StdLevelNameResource, 'std_level', null=True)
-    ad               = ToOneField(PersonResource, 'ad', null=True)
-    shepherd         = ToOneField(EmailResource, 'shepherd', null=True)
-    doc              = ToOneField(DocumentResource, 'doc')
-    states           = ToManyField(StateResource, 'states', null=True)
-    tags             = ToManyField(DocTagNameResource, 'tags', null=True)
-    related          = ToManyField(DocAliasResource, 'related', null=True)
-    authors          = ToManyField(EmailResource, 'authors', null=True)
+from ietf.name.resources import DocRelationshipNameResource
+class RelatedDocHistoryResource(ModelResource):
+    source           = ToOneField(DocHistoryResource, 'source')
+    target           = ToOneField(DocAliasResource, 'target')
+    relationship     = ToOneField(DocRelationshipNameResource, 'relationship')
     class Meta:
-        queryset = DocHistory.objects.all()
+        queryset = RelatedDocHistory.objects.all()
         serializer = api.Serializer()
-        #resource_name = 'dochistory'
+        #resource_name = 'relateddochistory'
         filtering = { 
             "id": ALL,
-            "time": ALL,
-            "title": ALL,
-            "abstract": ALL,
-            "rev": ALL,
-            "pages": ALL,
-            "order": ALL,
-            "expires": ALL,
-            "notify": ALL,
-            "external_url": ALL,
-            "note": ALL,
-            "internal_comments": ALL,
-            "name": ALL,
-            "type": ALL_WITH_RELATIONS,
-            "stream": ALL_WITH_RELATIONS,
-            "group": ALL_WITH_RELATIONS,
-            "intended_std_level": ALL_WITH_RELATIONS,
-            "std_level": ALL_WITH_RELATIONS,
-            "ad": ALL_WITH_RELATIONS,
-            "shepherd": ALL_WITH_RELATIONS,
-            "doc": ALL_WITH_RELATIONS,
-            "states": ALL_WITH_RELATIONS,
-            "tags": ALL_WITH_RELATIONS,
-            "related": ALL_WITH_RELATIONS,
-            "authors": ALL_WITH_RELATIONS,
+            "source": ALL_WITH_RELATIONS,
+            "target": ALL_WITH_RELATIONS,
+            "relationship": ALL_WITH_RELATIONS,
         }
-api.doc.register(DocHistoryResource())
+api.doc.register(RelatedDocHistoryResource())
 
 from ietf.person.resources import PersonResource
 from ietf.name.resources import BallotPositionNameResource
@@ -455,36 +485,3 @@ class BallotPositionDocEventResource(ModelResource):
         }
 api.doc.register(BallotPositionDocEventResource())
 
-from ietf.person.resources import EmailResource
-class DocHistoryAuthorResource(ModelResource):
-    document         = ToOneField(DocHistoryResource, 'document')
-    author           = ToOneField(EmailResource, 'author')
-    class Meta:
-        queryset = DocHistoryAuthor.objects.all()
-        serializer = api.Serializer()
-        #resource_name = 'dochistoryauthor'
-        filtering = { 
-            "id": ALL,
-            "order": ALL,
-            "document": ALL_WITH_RELATIONS,
-            "author": ALL_WITH_RELATIONS,
-        }
-api.doc.register(DocHistoryAuthorResource())
-
-from ietf.name.resources import DocRelationshipNameResource
-class RelatedDocHistoryResource(ModelResource):
-    source           = ToOneField(DocHistoryResource, 'source')
-    target           = ToOneField(DocAliasResource, 'target')
-    relationship     = ToOneField(DocRelationshipNameResource, 'relationship')
-    class Meta:
-        queryset = RelatedDocHistory.objects.all()
-        serializer = api.Serializer()
-        #resource_name = 'relateddochistory'
-        filtering = { 
-            "id": ALL,
-            "source": ALL_WITH_RELATIONS,
-            "target": ALL_WITH_RELATIONS,
-            "relationship": ALL_WITH_RELATIONS,
-        }
-api.doc.register(RelatedDocHistoryResource())
-
diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py
index ff342a605..12094d341 100644
--- a/ietf/doc/tests_draft.py
+++ b/ietf/doc/tests_draft.py
@@ -1304,7 +1304,7 @@ class ChangeReplacesTests(TestCase):
         RelatedDocument.objects.create(source=self.replacea, target=self.basea.docalias_set.first(),
                                        relationship=DocRelationshipName.objects.get(slug="possibly-replaces"))
         self.assertEqual(self.basea.get_state().slug,'active')
-        r = self.client.post(url, dict(replaces=str(DocAlias.objects.get(name=self.basea.name).id)))
+        r = self.client.post(url, dict(replaces=self.basea.name))
         self.assertEqual(r.status_code, 302)
         self.assertEqual(RelatedDocument.objects.filter(relationship__slug='replaces',source=self.replacea).count(),1) 
         self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
@@ -1318,7 +1318,7 @@ class ChangeReplacesTests(TestCase):
         # Post that says replaceboth replaces both base a and base b
         url = urlreverse('doc_change_replaces', kwargs=dict(name=self.replaceboth.name))
         self.assertEqual(self.baseb.get_state().slug,'expired')
-        r = self.client.post(url, dict(replaces=str(DocAlias.objects.get(name=self.basea.name).id) + "," + str(DocAlias.objects.get(name=self.baseb.name).id)))
+        r = self.client.post(url, dict(replaces=self.basea.name + "," + self.baseb.name))
         self.assertEqual(r.status_code, 302)
         self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
         self.assertEqual(Document.objects.get(name='draft-test-base-b').get_state().slug,'repl')
diff --git a/ietf/idindex/tests.py b/ietf/idindex/tests.py
index c60c4cbad..556eff881 100644
--- a/ietf/idindex/tests.py
+++ b/ietf/idindex/tests.py
@@ -124,7 +124,6 @@ class IndexTests(TestCase):
 
         e = LastCallDocEvent.objects.create(doc=draft, type="sent_last_call", expires=datetime.datetime.now() + datetime.timedelta(days=14), by=draft.ad)
 
-        DocAlias.objects.create(name="rfc1234", document=draft)
         t = get_fields(all_id2_txt())
         self.assertEqual(t[11], e.expires.strftime("%Y-%m-%d"))
 
diff --git a/ietf/ipr/migrations/0004_iprdocrel_document_name.py b/ietf/ipr/migrations/0004_iprdocrel_document_name.py
new file mode 100644
index 000000000..933a8972f
--- /dev/null
+++ b/ietf/ipr/migrations/0004_iprdocrel_document_name.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ipr', '0003_auto_20150430_0847'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='iprdocrel',
+            name='document_name',
+            field=models.CharField(default=b'', max_length=255),
+            preserve_default=True,
+        ),
+    ]
diff --git a/ietf/ipr/migrations/0005_auto_20150930_0227.py b/ietf/ipr/migrations/0005_auto_20150930_0227.py
new file mode 100644
index 000000000..61bfd0194
--- /dev/null
+++ b/ietf/ipr/migrations/0005_auto_20150930_0227.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations
+import django.db
+
+def fill_in_docalias_relationship_names(apps, schema_editor):
+    with django.db.connection.cursor() as cursor:
+        cursor.execute("update ipr_iprdocrel join doc_docalias on doc_docalias.id = ipr_iprdocrel.document_id set ipr_iprdocrel.document_name = doc_docalias.name;")
+
+def noop(apps, schema_editor):
+    pass
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ipr', '0004_iprdocrel_document_name'),
+    ]
+
+    operations = [
+        migrations.RunPython(fill_in_docalias_relationship_names, noop)
+    ]
diff --git a/ietf/ipr/migrations/0006_auto_20150930_0235.py b/ietf/ipr/migrations/0006_auto_20150930_0235.py
new file mode 100644
index 000000000..2fd48b013
--- /dev/null
+++ b/ietf/ipr/migrations/0006_auto_20150930_0235.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ipr', '0005_auto_20150930_0227'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='iprdisclosurebase',
+            name='docs',
+        ),
+        migrations.RemoveField(
+            model_name='iprdocrel',
+            name='document',
+        ),
+        migrations.RenameField(
+            model_name='iprdocrel',
+            old_name='document_name',
+            new_name='document',
+        ),
+    ]
diff --git a/ietf/ipr/migrations/0007_auto_20150930_0258.py b/ietf/ipr/migrations/0007_auto_20150930_0258.py
new file mode 100644
index 000000000..045866ada
--- /dev/null
+++ b/ietf/ipr/migrations/0007_auto_20150930_0258.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('doc', '0010_auto_20150930_0251'),
+        ('ipr', '0006_auto_20150930_0235'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='iprdisclosurebase',
+            name='docs',
+            field=models.ManyToManyField(to='doc.DocAlias', through='ipr.IprDocRel'),
+            preserve_default=True,
+        ),
+        migrations.AlterField(
+            model_name='iprdocrel',
+            name='document',
+            field=models.ForeignKey(to='doc.DocAlias'),
+            preserve_default=True,
+        ),
+    ]