diff --git a/alembic/versions/cad797ffa042_add_request_to_update_model.py b/alembic/versions/cad797ffa042_add_request_to_update_model.py
new file mode 100644
--- /dev/null
+++ b/alembic/versions/cad797ffa042_add_request_to_update_model.py
@@ -0,0 +1,22 @@
+"""add request to update model
+
+Revision ID: cad797ffa042
+Revises: 230e79315bd
+Create Date: 2016-11-09 10:09:17.410474
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = 'cad797ffa042'
+down_revision = '230e79315bd'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+    op.add_column(u'update', sa.Column('request', sa.String(length=80), nullable=True))
+
+
+def downgrade():
+    op.drop_column(u'update', u'request')
diff --git a/blockerbugs/controllers/main.py b/blockerbugs/controllers/main.py
--- a/blockerbugs/controllers/main.py
+++ b/blockerbugs/controllers/main.py
@@ -118,6 +118,32 @@
                 Bug.proposed_fe == True, Bug.proposed_blocker == True))).all()
     return updates
 
+def get_milestone_all_nonstable_blocker_fixes(milestone):
+    """
+    return list of all non-stable, non-obsolete updates which are
+    marked as fixing any accepted blocker bug for milestone
+    """
+    m_alias = db.aliased(Milestone)
+    updates = Update.query.join(m_alias, Update.milestones).filter(
+        m_alias.id == milestone.id, ~Update.status.in_(['obsolete', 'deleted']),
+        or_(Update.status != 'stable', Update.pending == True),
+        Update.bugs.any(
+            or_(Bug.accepted_blocker == True, Bug.accepted_0day == True,
+                Bug.accepted_prevrel == True))).all()
+    return updates
+
+def get_milestone_all_nonstable_fe_fixes(milestone):
+    """
+    return list of all non-stable, non-obsolete updates which are
+    marked as fixing any accepted FE bug for milestone
+    """
+    m_alias = db.aliased(Milestone)
+    updates = Update.query.join(m_alias, Update.milestones).filter(
+        m_alias.id == milestone.id,  ~Update.status.in_(['obsolete', 'deleted']),
+        or_(Update.status != 'stable', Update.pending == True),
+        Update.bugs.any(Bug.accepted_fe == True)).all()
+    return updates
+
 
 def get_current_milestone():
     current_milestone = Milestone.query.filter_by(current=True).first()
@@ -214,6 +240,21 @@
                            updates=updates,
                            title="Fedora %s %s Blocker Bug Updates" % (milestone_info['number'], milestone_info['phase']))
 
+@main.route('/milestone/<int:num>/<release_name>/requests')
+def display_release_requests(num, release_name):
+    release = Release.query.filter_by(number=num).first()
+    milestone = Milestone.query.filter_by(release=release, version=release_name).first()
+    if not milestone:
+        abort(404)
+    milestone_info = get_milestone_info(milestone)
+    blockers = get_milestone_all_nonstable_blocker_fixes(milestone)
+    fes = get_milestone_all_nonstable_fe_fixes(milestone)
+    # if an update fixes both blockers and fes, drop it from fe list
+    fes = [fe for fe in fes if fe not in blockers]
+
+    response = make_response(render_template('requests.txt', blockers=blockers, fes=fes, info=milestone_info))
+    response.mimetype = 'text/plain'
+    return response
 
 @main.route('/milestone/<int:num>/<milestone_name>/need_testing')
 def display_updates_need_testing(num, milestone_name):
diff --git a/blockerbugs/models/update.py b/blockerbugs/models/update.py
--- a/blockerbugs/models/update.py
+++ b/blockerbugs/models/update.py
@@ -43,6 +43,7 @@
     karma = db.Column(db.Integer, unique=False)
     stable_karma = db.Column(db.Integer, unique=False)
     status = db.Column(db.String(80), unique=False)
+    request = db.Column(db.String(80), unique=False, nullable=True)
     pending = db.Column(db.Boolean, unique=False)
     date_submitted = db.Column(db.DateTime)
     date_pushed_testing = db.Column(db.DateTime, nullable=True)
@@ -65,6 +66,7 @@
         self.url = url
         self.karma = karma
         self.status = status
+        self.request = None
         self.bugs = bugs
         self.date_submitted = date_submitted
         self.release = release
@@ -83,6 +85,7 @@
         self.karma = updateinfo['karma']
         self.stable_karma = updateinfo['stable_karma']
         self.status = updateinfo['status']
+        self.request = updateinfo['request']
         self.date_submitted = updateinfo['date_submitted']
         if updateinfo['date_pushed_testing']:
             self.date_pushed_testing = updateinfo['date_pushed_testing']
diff --git a/blockerbugs/templates/milestone_base.html b/blockerbugs/templates/milestone_base.html
--- a/blockerbugs/templates/milestone_base.html
+++ b/blockerbugs/templates/milestone_base.html
@@ -16,6 +16,7 @@
                 <li><a {{ subnavactive('spins') }} href="./spins">Spins</a></li>
                 <li><a {{ subnavactive('stats') }} href="./stats">Stats</a></li>
                 <li><a {{ subnavactive('irc') }} href="./irc">IRC Format</a></li>
+                <li><a {{ subnavactive('irc') }} href="./requests">Requests</a></li>
             </ul>
     </div>
 </div>
diff --git a/blockerbugs/templates/requests.txt b/blockerbugs/templates/requests.txt
new file mode 100644
--- /dev/null
+++ b/blockerbugs/templates/requests.txt
@@ -0,0 +1,27 @@
+{% autoescape false -%}
+### CANDIDATE COMPOSE ###
+
+== Blockers ==
+{% for update in blockers %}
+* [{{ update.title }}]({{ update.url }}) for {%- for bug in update.bugs %} [#{{ bug.bugid }}](https://bugzilla.redhat.com/show_bug.cgi?id={{ bug.bugid }}){% if bug.accepted_fe and not bug.accepted_blocker and not bug.accepted_prevrel and not bug.accepted_0day %} (FE){% endif %}{% endfor %}
+{%- endfor %}
+
+== Freeze exceptions ==
+{% for update in fes %}
+* [{{ update.title }}]({{ update.url }}) for {%- for bug in update.bugs %} [#{{ bug.bugid }}](https://bugzilla.redhat.com/show_bug.cgi?id={{ bug.bugid }}){% endfor %}
+{%- endfor %}
+
+
+### FREEZE PUSH ###
+
+
+== Blockers ==
+{% for update in blockers if update.request == 'stable' %}
+* [{{ update.title }}]({{ update.url }}) for {%- for bug in update.bugs %} [#{{ bug.bugid }}](https://bugzilla.redhat.com/show_bug.cgi?id={{ bug.bugid }}){% if bug.accepted_fe and not bug.accepted_blocker and not bug.accepted_prevrel and not bug.accepted_0day %} (FE){% endif %}{% endfor %}
+{%- endfor %}
+
+== Freeze exceptions ==
+{% for update in fes if update.request == 'stable' %}
+* [{{ update.title }}]({{ update.url }}) for {%- for bug in update.bugs %} [#{{ bug.bugid }}](https://bugzilla.redhat.com/show_bug.cgi?id={{ bug.bugid }}){% endfor %}
+{%- endfor %}
+{% endautoescape %}
diff --git a/blockerbugs/util/update_sync.py b/blockerbugs/util/update_sync.py
--- a/blockerbugs/util/update_sync.py
+++ b/blockerbugs/util/update_sync.py
@@ -50,6 +50,8 @@
         updateinfo['date_pushed_testing'] = None
         updateinfo['date_pushed_stable'] = None
         updateinfo['pending'] = False
+        # this will be None if there is no request
+        updateinfo['request'] = update.request
         if update.status == 'pending':
             updateinfo['pending'] = True
 
diff --git a/testing/test_controllers.py b/testing/test_controllers.py
--- a/testing/test_controllers.py
+++ b/testing/test_controllers.py
@@ -200,29 +200,29 @@
         db.session.rollback()
         db.drop_all()
         db.create_all()
-        release = add_release(99)
+        cls.release = add_release(99)
         cls.milestone = add_milestone(release, 'final', 100, 101,
                                         '99-final', True)
-        add_milestone(release, 'beta', 200, 201, '99-beta')
+        add_milestone(cls.release, 'beta', 200, 201, '99-beta')
         add_spin('test-spin1', SpinType.TC, [], cls.milestone,
                  state=SpinState.built)
         bug1 = add_bug(9000, 'testbug1', cls.milestone)
         bug2 = add_bug(9001, 'testbug2', cls.milestone)
         bug2.accepted_blocker = False
         cls.update_pending_stable = add_update(u'test-pending-stable.fc99', u'stable', [bug1],
-                            release, [cls.milestone])
+                            cls.release, [cls.milestone])
         cls.update_pending_stable.pending = True
         cls.update_stable = add_update(u'test-stable1.fc99', u'stable', [bug1],
-                             release, [cls.milestone])
+                             cls.release, [cls.milestone])
         cls.update_stable = add_update(u'test-stable2.fc99', u'stable', [bug2],
-                                       release, [cls.milestone])
+                                       cls.release, [cls.milestone])
         cls.update_pending_testing = add_update(u'test-pending-testing.fc99', u'testing', [bug1],
-                            release, [cls.milestone])
+                            cls.release, [cls.milestone])
         cls.update_pending_testing.pending = True
         cls.update_testing1 = add_update(u'test-testing1.fc99', u'testing', [bug1],
-                                        release, [cls.milestone])
+                                        cls.release, [cls.milestone])
         cls.update_testing2 = add_update(u'test-testing2.fc99', u'testing', [bug2],
-                                         release, [cls.milestone])
+                                         cls.release, [cls.milestone])
         db.session.commit()
 
     @classmethod
@@ -242,3 +242,22 @@
         assert len(updates) == 1
         update = updates[0]
         assert self.update_testing1 == update
+
+    def test_get_milestone_all_nonstable_blocker_fixes(self):
+        updates = main.get_milestone_all_nonstable_blocker_fixes(self.milestone)
+        assert len(updates) == 3
+        expected = [self.update_pending_stable, self.update_pending_testing, self.update_testing1]
+        updates.sort(key=lambda x: x.title)
+        expected.sort(key=lambda x: x.title)
+        assert updates == expected
+
+    def test_get_milestone_all_nonstable_fe_fixes(self):
+        bug3 = add_bug(9002, 'testbug3', self.milestone)
+        bug3.accepted_blocker = False
+        bug3.accepted_fe = True
+        update_testing3 = add_update(u'test-testing3.fc99', u'testing', [bug3],
+                                     self.release, [self.milestone])
+        updates = main.get_milestone_all_nonstable_fe_fixes(self.milestone)
+        assert len(updates) == 1
+        update = updates[0]
+        assert update_testing3 == update

