diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py
index 218255111..a025ae157 100644
--- a/ietf/doc/tests.py
+++ b/ietf/doc/tests.py
@@ -2377,3 +2377,15 @@ class MaterialsTests(TestCase):
         self.assertEqual(r.status_code,200)
         q = PyQuery(r.content)
         self.assertEqual(q('#materials-content .panel-body a').attr['href'],'https://unusual.example')
+
+class Idnits2SupportTests(TestCase):
+
+    def test_obsoleted(self):
+        for i in range(2):
+            rfc = WgRfcFactory()
+            WgRfcFactory(relations=[('obs',rfc)])
+
+        url = urlreverse('ietf.doc.views_doc.idnits2_rfcs_obsoleted')
+        r = self.client.get(url)
+        self.assertEqual(r.status_code, 200)
+        self.assertEqual(r.content,b'1001 1003\n1005 1007\n')
\ No newline at end of file
diff --git a/ietf/doc/urls.py b/ietf/doc/urls.py
index fba05121d..f1bb4f08a 100644
--- a/ietf/doc/urls.py
+++ b/ietf/doc/urls.py
@@ -69,6 +69,7 @@ urlpatterns = [
     url(r'^html/(?P<name>std[0-9]+?)(\.txt|\.html)?/?$', RedirectView.as_view(url=settings.RFC_EDITOR_INFO_BASE_URL+"%(name)s", permanent=False)), 
     url(r'^html/%(name)s(?:-%(rev)s)?(\.txt|\.html)?/?$' % settings.URL_REGEXPS, views_doc.document_html),
     url(r'^html/(?P<name>[Rr][Ff][Cc] [0-9]+?)(\.txt|\.html)?/?$', views_doc.document_html),
+    url(r'^idnits2-rfcs-obsoleted/?$', views_doc.idnits2_rfcs_obsoleted),
 
     url(r'^all/?$', views_search.index_all_drafts),
     url(r'^active/?$', views_search.index_active_drafts),
diff --git a/ietf/doc/views_doc.py b/ietf/doc/views_doc.py
index b16c0a89a..20385cf9d 100644
--- a/ietf/doc/views_doc.py
+++ b/ietf/doc/views_doc.py
@@ -42,6 +42,7 @@ import os
 import re
 import markdown
 
+from collections import defaultdict
 from urllib.parse import quote
 
 from django.http import HttpResponse, Http404
@@ -50,12 +51,14 @@ from django.template.loader import render_to_string
 from django.urls import reverse as urlreverse
 from django.conf import settings
 from django import forms
+from django.views.decorators.cache import cache_page
+
 
 import debug                            # pyflakes:ignore
 
 from ietf.doc.models import ( Document, DocAlias, DocHistory, DocEvent, BallotDocEvent, BallotType,
     ConsensusDocEvent, NewRevisionDocEvent, TelechatDocEvent, WriteupDocEvent, IanaExpertDocEvent,
-    IESG_BALLOT_ACTIVE_STATES, STATUSCHANGE_RELATIONS, DocumentActionHolder, DocumentAuthor)
+    IESG_BALLOT_ACTIVE_STATES, STATUSCHANGE_RELATIONS, DocumentActionHolder, DocumentAuthor, RelatedDocument)
 from ietf.doc.utils import (add_links_in_new_revision_events, augment_events_with_revision,
     can_adopt_draft, can_unadopt_draft, get_chartering_type, get_tags_for_stream_id,
     needed_ballot_positions, nice_consensus, prettify_std_name, update_telechat, has_same_ballot,
@@ -1714,3 +1717,16 @@ def all_presentations(request, name):
         'in_progress': in_progress,
         'past' : past+recent,
         })
+
+@cache_page ( 60 * 60, cache="slowpages" )
+def idnits2_rfcs_obsoleted(request):
+
+    obsdict = defaultdict(list)
+    for r in RelatedDocument.objects.filter(relationship_id='obs'):
+        obsdict[int(r.target.document.rfc_number())].append(int(r.source.rfc_number()))
+
+    for k in obsdict:
+        obsdict[k] = sorted(obsdict[k])
+
+    return render(request, 'doc/idnits2-rfcs-obsoleted.txt', context={'obsitems':sorted(obsdict.items())},content_type='text/plain;charset=utf-8')
+