diff --git a/flaskregisterpages.py b/flaskregisterpages.py
index 1f0a949..af73a7f 100644
--- a/flaskregisterpages.py
+++ b/flaskregisterpages.py
@@ -5,11 +5,82 @@
 """This file sets up all the urls for monorail pages."""
 
 import logging
-from framework import excessiveactivity
 import settings
-from flask import Flask
 
+import flask
+
+from features import banspammer
+from features import inboundemail
+from features import hotlistcreate
+from features import savedqueries
+from features import userhotlists
+from framework import banned
+from framework import clientmon
+from framework import warmup
+from framework import reap
+from framework import deleteusers
+from framework import excessiveactivity
+from framework import ts_mon_js
+from framework import trimvisitedpages
+from project import peopledetail
+from project import peoplelist
+from project import projectadmin
+from project import projectadminadvanced
+from project import projectexport
+from project import projectsummary
+from project import projectupdates
 from project import project_constants
+from project import redirects
+from services import cachemanager_svc
+from services import client_config_svc
+from sitewide import custom_404
+from sitewide import hostinghome
+from sitewide import moved
+from sitewide import userclearbouncing
+from sitewide import userupdates
+from sitewide import userprofile
+from sitewide import projectcreate
+from sitewide import usersettings
+from sitewide import groupadmin
+from sitewide import groupcreate
+from sitewide import groupdetail
+from sitewide import grouplist
+from features import rerankhotlist
+from features import hotlistdetails
+from features import hotlistissues
+from features import hotlistissuescsv
+from features import hotlistpeople
+from features import dateaction
+from features import filterrules
+from features import pubsub
+from features import notify
+from features import hotlistcreate
+from features import savedqueries
+from features import userhotlists
+from features import banspammer
+from search import backendnonviewable
+from search import backendsearch
+from tracker import componentcreate
+from tracker import fltconversion
+from tracker import fieldcreate
+from tracker import fielddetail
+from tracker import templatecreate
+from tracker import templatedetail
+from tracker import issueadmin
+from tracker import issueadvsearch
+from tracker import issueattachment
+from tracker import issueattachmenttext
+from tracker import issuebulkedit
+from tracker import issuedetailezt
+from tracker import issueentry
+from tracker import issueentryafterlogin
+from tracker import issueexport
+from tracker import issueoriginal
+from tracker import issuereindex
+from tracker import issuetips
+from tracker import issueimport
+
+from tracker import webcomponentspage
 
 
 class ServletRegistry(object):
@@ -50,10 +121,796 @@
     """Register all the monorail request handlers."""
     return self.routes
 
-  def RegisterExcesiveActivity(self, service):
-    flaskapp_excessive_activity = Flask(__name__)
-    flaskapp_excessive_activity.add_url_rule(
-        '/',
-        view_func=excessiveactivity.ExcessiveActivity(services=service).handler,
-        methods=['GET'])
-    return flaskapp_excessive_activity
+  def _AddFlaskUrlRules(self, flask_instance, rule_tuple):
+    """Add url rules to a given Flask instance.
+
+    Args:
+      flask_instance: The Flask app to add URLs to.
+      rule_tuple: List of tuple of path, module and method to call, HTTP method
+
+    Returns:
+      The Flask instance.
+    """
+    for rule in rule_tuple:
+      flask_instance.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+    return flask_instance
+
+  # pylint: disable=unused-argument
+  def RegisterGroupUrls(self, services):
+    flaskapp_group = flask.Flask(__name__)
+    _GROUP_URL = [
+        # ('/', grouplist.GroupList(services=services).GetGroupList, ['GET']),
+        # (
+        #     '/<string:viewed_username>/',
+        #     groupdetail.GroupDetail(services=services).GetGroupDetail,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/edit.do',
+        #     groupdetail.GroupDetail(services=services).PostGroupDetail,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/groupadmin',
+        #     groupadmin.GroupAdmin(services=services).GetGroupAdmin, ['GET']),
+        # (
+        #     '/<string:viewed_username>/groupadmin.do',
+        #     groupadmin.GroupAdmin(services=services).PostGroupAdmin,
+        #     ['POST']),
+    ]
+
+    return self._AddFlaskUrlRules(flaskapp_group, _GROUP_URL)
+
+  # pylint: disable=unused-argument
+  def RegisterHostingUrl(self, service):
+    flaskapp_hosting = flask.Flask(__name__)
+    _HOSTING_URL = [
+        # (
+        #     '/excessiveActivity',
+        #     excessiveactivity.ExcessiveActivity(
+        #         services=service).GetExcessiveActivity, ['GET']),
+        # (
+        #     '/settings',
+        #     usersettings.UserSettings(services=service).GetUserSetting, ['GET'
+        #                                                                 ]),
+        # (
+        #     '/settings.do',
+        #     usersettings.UserSettings(services=service).PostUserSetting,
+        #     ['POST']),
+        # ('/noAccess', banned.Banned(services=service).GetNoAccessPage,
+        #   ['GET']),
+        # (
+        #     '/moved', moved.ProjectMoved(services=service).GetProjectMoved,
+        #     ['GET']),
+        # (
+        #     '/createProject',
+        #     projectcreate.ProjectCreate(services=service).GetCreateProject,
+        #     ['GET']),
+        # (
+        #     '/createProject.do',
+        #     projectcreate.ProjectCreate(services=service).PostCreateProject,
+        #     ['POST']),
+        # (
+        #     '/createHotlist',
+        #     hotlistcreate.HotlistCreate(services=service).GetCreateHotlist,
+        #     ['GET']),
+        # (
+        #     '/createHotlist.do',
+        #     hotlistcreate.HotlistCreate(services=service).PostCreateHotlist,
+        #     ['POST']),
+        # (
+        #     '/createGroup',
+        #     groupcreate.GroupCreate(services=service).GetGroupCreate,
+        #     ['GET']),
+        # (
+        #     '/createGroup.do',
+        #     groupcreate.GroupCreate(services=service).PostGroupCreate,
+        #     ['POST']),
+        # (
+        #     '/deleteGroup',
+        #     grouplist.GroupDelete(services=service).GetGroupDelete,
+        #     ['GET']),
+        # (
+        #     '/deleteGroup.do',
+        #     grouplist.GroupDelete(services=service).PostGroupDelete,
+        #     ['POST']),
+    ]
+
+    flaskapp_hosting = self._AddFlaskUrlRules(flaskapp_hosting, _HOSTING_URL)
+
+    # pylint: disable=unused-variable
+    # for url /hosting/
+    @flaskapp_hosting.route('/')
+    def DefaultToMainPage():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    return flaskapp_hosting
+
+  def RegisterOldHostUrl(self, service):
+    flaskapp_hosting_old = flask.Flask(__name__)
+
+    # pylint: disable=unused-variable
+    @flaskapp_hosting_old.route('/')
+    def GetHostingOld():
+      return hostinghome.HostingHome(services=service).GetOldHostingHome()
+
+    return flaskapp_hosting_old
+
+  def RegisterRedirectProjectUrl(self):
+    flaskapp_project_redirect = flask.Flask(__name__)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project_redirect.route('/')
+    def GetRedirectProject():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    return flaskapp_project_redirect
+
+  def RegisterProjectUrls(self, service):
+    flaskapp_project = flask.Flask(__name__)
+    _PROJECT_URLS = [
+        # (
+        #     '/<string:project_name>/<string:unrecognized>',
+        #     custom_404.ErrorPage(services=service).Get404Page,
+        #     ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/adminComponents',
+        #     issueadmin.AdminComponents(
+        #         services=service).GetAdminComponentsPage, ['GET']),
+        # (
+        #     '/<string:project_name>/adminComponents.do',
+        #     issueadmin.AdminComponents(
+        #         services=service).PostAdminComponentsPage, ['POST']),
+        # (
+        #     '/<string:project_name>/adminIntro',
+        #     projectsummary.ProjectSummary(
+        #         services=service).GetProjectSummaryPage, ['GET']),
+        # (
+        #     '/<string:project_name>/adminLabels',
+        #     issueadmin.AdminLabels(services=service).GetAdminLabelsPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminLabels.do',
+        #     issueadmin.AdminLabels(services=service).PostAdminLabelsPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminRules',
+        #     issueadmin.AdminRules(services=service).GetAdminRulesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminRules.do',
+        #     issueadmin.AdminRules(services=service).PostAdminRulesPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminStatuses',
+        #     issueadmin.AdminStatuses(services=service).GetAdminStatusesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminStatuses.do',
+        #     issueadmin.AdminStatuses(services=service).PostAdminStatusesPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminTemplates',
+        #     issueadmin.AdminTemplates(services=service).GetAdminTemplatesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminTemplates.do',
+        #     issueadmin.AdminTemplates(
+        #         services=service).PostAdminTemplatesPage, ['POST']),
+        # (
+        #     '/<string:project_name>/adminViews',
+        #     issueadmin.AdminViews(services=service).GetAdminViewsPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminViews.do',
+        #     issueadmin.AdminViews(services=service).PostAdminViewsPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/admin',
+        #     projectadmin.ProjectAdmin(services=service).GetProjectAdminPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/admin.do',
+        #     projectadmin.ProjectAdmin(services=service).PostProjectAdminPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminAdvanced',
+        #     projectadminadvanced.ProjectAdminAdvanced(
+        #         services=service).GetProjectAdminAdvancedPage, ['GET']),
+        # (
+        #     '/<string:project_name>/adminAdvanced.do',
+        #     projectadminadvanced.ProjectAdminAdvanced(
+        #         services=service).PostProjectAdminAdvancedPage, ['POST']),
+        # (
+        #     '/<string:project_name>/components/create',
+        #     componentcreate.ComponentCreate(
+        #         services=service).GetComponentCreatePage, ['GET']),
+        # (
+        #     '/<string:project_name>/components/create.do',
+        #     componentcreate.ComponentCreate(
+        #         services=service).PostComponentCreatePage, ['POST']),
+        # (
+        #     '/<string:project_name>/fields/create',
+        #     fieldcreate.FieldCreate(
+        #         services=service).GetFieldCreate, ['GET']),
+        # (
+        #     '/<string:project_name>/fields/create.do',
+        #     fieldcreate.FieldCreate(
+        #         services=service).PostFieldCreate, ['POST']),
+        # (
+        #     '/<string:project_name>/fields/detail',
+        #     fielddetail.FieldDetail(
+        #         services=service).GetFieldDetail, ['GET']),
+        # (
+        #     '/<string:project_name>/fields/detail.do',
+        #     fielddetail.FieldDetail(
+        #         services=service).PostFieldDetail, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/advsearch',
+        #     issueadvsearch.IssueAdvancedSearch(
+        #         services=service).GetIssueAdvSearchPage, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/advsearch.do',
+        #     issueadvsearch.IssueAdvancedSearch(
+        #         services=service).PostIssueAdvSearchPage, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/detail',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueDetail, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/export',
+        #     issueexport.IssueExport(services=service).GetIssueExport,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/export/json',
+        #     issueexport.IssueExportJSON(services=service).GetIssueExportJSON,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/export/json.do',
+        #     issueexport.IssueExportJSON(services=service).PostIssueExportJSON,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/issues/import',
+        #     issueimport.IssueImport(services=service).GetIssueImport,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/import.do',
+        #     issueimport.IssueImport(services=service).PostIssueImport, ['POST'
+        #                                                                ]),
+        # (
+        #     '/<string:project_name>/issues/original',
+        #     issueoriginal.IssueOriginal(services=service).GetIssueOriginal,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/entry',
+        #     issueentry.IssueEntry(
+        #         services=service).GetIssueEntry, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/entry.do',
+        #     issueentry.IssueEntry(
+        #         services=service).PostIssueEntry, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/entry_new',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueNewEntry, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/list',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueList, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/reindex',
+        #     issuereindex.IssueReindex(
+        #         services=service).GetIssueReindex, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/reindex.do',
+        #     issuereindex.IssueReindex(
+        #         services=service).PostIssueReindex, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/detail/list',
+        #     issuedetailezt.FlipperList(
+        #         services=service).GetFlipperList, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/detail/flipper',
+        #     issuedetailezt.FlipperIndex(
+        #         services=service).GetFlipperIndex, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/detail/flipper.do',
+        #     issuedetailezt.FlipperIndex(
+        #         services=service).PostFlipperIndex, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/wizard',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueWizard, ['GET']),
+        # (
+        #     '/<string:project_name>/templates/create',
+        #     templatecreate.TemplateCreate(
+        #         services=service).GetTemplateCreate, ['GET']),
+        # (
+        #     '/<string:project_name>/templates/create.do',
+        #     templatecreate.TemplateCreate(
+        #         services=service).PostTemplateCreate, ['POST']),
+        # (
+        #     '/<string:project_name>/templates/detail',
+        #     templatedetail.TemplateDetail(
+        #         services=service).GetTemplateDetail, ['GET']),
+        # (
+        #     '/<string:project_name>/templates/detail.do',
+        #     templatedetail.TemplateDetail(
+        #         services=service).PostTemplateDetail, ['POST']),
+        # (
+        #     '/<string:project_name>/people/list',
+        #     peoplelist.PeopleList(services=service).GetPeopleListPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/people/list.do',
+        #     peoplelist.PeopleList(services=service).PostPeopleListPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/people/detail',
+        #     peopledetail.PeopleDetail(services=service).GetPeopleDetailPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/people/detail.do',
+        #     peopledetail.PeopleDetail(services=service).PostPeopleDetailPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/projectExport',
+        #     projectexport.ProjectExport(
+        #         services=service).GetProjectExportPage, ['GET']),
+        # (
+        #     '/<string:project_name>/projectExport/json',
+        #     projectexport.ProjectExportJSON(
+        #         services=service).GetProjectExportJSONPage, ['GET']),
+        # (
+        #     '/<string:project_name>/projectExport/json.do',
+        #     projectexport.ProjectExportJSON(
+        #         services=service).PostProjectExportJSONPage, ['POST']),
+        # (
+        #     '/<string:project_name>/updates/list',
+        #     projectupdates.ProjectUpdates(
+        #         services=service).GetProjectUpdatesPage, ['GET']),
+        # (
+        #     '/<string:project_name>/w/list',
+        #     redirects.WikiRedirect(
+        #         services=service).GetWikiListRedirect, ['GET']),
+        # (
+        #     '/<string:project_name>/wiki/<string:wiki_page>',
+        #     redirects.WikiRedirect(
+        #         services=service).GetWikiRedirect, ['GET']),
+        # (
+        #     '/<string:project_name>/source/<string:source_page>',
+        #     redirects.SourceRedirect(
+        #         services=service).GetSourceRedirect, ['GET']),
+        #     '/<string:project_name>/issues/entryafterlogin',
+        #     issueentryafterlogin.IssueEntryAfterLogin(
+        #         services=service).GetIssueEntryAfterLogin,
+        #     ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/issues/searchtips',
+        #     issuetips.IssueSearchTips(services=service).GetIssueSearchTips,
+        #     ['GET'],
+        # ),
+        # (
+        #    '/<string:project_name>/issues/attachment',
+        #    issueattachment.AttachmentPage(services=service).GetAttachmentPage,
+        #    ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/issues/attachmentText',
+        #     issueattachmenttext.AttachmentText(
+        #         services=service).GetAttachmentText,
+        #     ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/issues/bulkedit',
+        #     issuebulkedit.IssueBulkEdit(
+        #         services=service).GetIssueBulkEdit, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/bulkedit.do',
+        #     issuebulkedit.IssueBulkEdit(
+        #         services=service).PostIssueBulkEdit, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/detail/next',
+        #     issuedetailezt.FlipperNext(
+        #         services=service).GetFlipperNextRedirectPage, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/detail/previous',
+        #     issuedetailezt.FlipperPrev(
+        #         services=service).GetFlipperPrevRedirectPage, ['GET']),
+    ]
+    flaskapp_project = self._AddFlaskUrlRules(flaskapp_project, _PROJECT_URLS)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/<string:project_name>/issues/approval')
+    @flaskapp_project.route('/<string:project_name>/issues/detail_ezt')
+    def ProjectRedirectToIssueDetail(project_name):
+      host_url = flask.request.host_url
+      url = host_url + 'p/' + project_name + '/issues/detail'
+      query_string = flask.request.query_string
+      if query_string:
+        url = '%s?%s' % (url, query_string)
+      return flask.redirect(url)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/<string:project_name>/issues/list_new')
+    @flaskapp_project.route('/<string:project_name>/')
+    @flaskapp_project.route('/<string:project_name>/issues/')
+    def ProjectRedirectToIssueList(project_name):
+      host_url = flask.request.host_url
+      url = host_url + 'p/' + project_name + '/issues/list'
+      query_string = flask.request.query_string
+      if query_string:
+        url = '%s?%s' % (url, query_string)
+      return flask.redirect(url)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/')
+    def ProjectRedirectToMainPage():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/<string:project_name>/people/')
+    def ProjectRedirectToPeopleList(project_name):
+      host_url = flask.request.host_url
+      url = host_url + 'p/' + project_name + '/people/list'
+      return flask.redirect(url)
+
+    return flaskapp_project
+
+  def RegisterUserUrls(self, service):
+    flaskapp_user = flask.Flask(__name__)
+    _USER_URLS = [
+        # (
+        #     '/<string:viewed_username>/queries',
+        #     savedqueries.SavedQueries(services=service).GetSavedQueriesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/queries.do',
+        #     savedqueries.SavedQueries(services=service).PostSavedQueriesPage,
+        #     ['Post']),
+        # (
+        #     '/<string:viewed_username>/hotlists',
+        #     userhotlists.UserHotlists(services=service).GetUserHotlistsPage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists.do',
+        #     userhotlists.UserHotlists(services=service).PostUserHotlistsPage,
+        #     ['Post']),
+        # (
+        #     '/<string:viewed_username>/',
+        #     userprofile.UserProfile(services=service).GetUserProfilePage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/edit.do',
+        #     userprofile.UserProfile(services=service).PostUserProfilePage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/ban.do',
+        #     userprofile.BanUser(services=service).PostBanUserPage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/banSpammer.do',
+        #     banspammer.BanSpammer(services=service).PostBanSpammerPage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/clearBouncing',
+        #     userclearbouncing.UserClearBouncing(
+        #         services=service).GetUserClearBouncingPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/clearBouncing.do',
+        #     userclearbouncing.UserClearBouncing(
+        #         services=service).PostUserClearBouncingPage, ['Post']),
+        # (
+        #     '/<string:viewed_username>/updates/projects',
+        #     userupdates.UserUpdatesProjects(
+        #         services=service).GetUserUpdatesProjectsPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/updates/developers',
+        #     userupdates.UserUpdatesDevelopers(
+        #         services=service).GetUserUpdatesDevelopersPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/updates',
+        #     userupdates.UserUpdatesIndividual(
+        #         services=service).GetUserUpdatesPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>',
+        #    hotlistissues.HotlistIssues(services=service).GetHotlistIssuesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>.do',
+        #   hotlistissues.HotlistIssues(services=service).PostHotlistIssuesPage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/csv',
+        #     hotlistissuescsv.HotlistIssuesCsv(
+        #         services=service).GetHotlistIssuesCsvPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/people',
+        #     hotlistpeople.HotlistPeopleList(
+        #         services=service).GetHotlistPeoplePage, ['GET']),
+        # (
+        #    '/<string:viewed_username>/hotlists/<string:hotlist_id>/people.do',
+        #     hotlistpeople.HotlistPeopleList(
+        #         services=service).PostHotlistPeoplePage, ['POST']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/details',
+        #     hotlistdetails.HotlistDetails(
+        #         services=service).GetHotlistDetailsPage, ['GET']),
+        # (
+        #   '/<string:viewed_username>/hotlists/<string:hotlist_id>/details.do',
+        #     hotlistdetails.HotlistDetails(
+        #         services=service).PostHotlistDetailsPage, ['POST']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank',
+        #     rerankhotlist.RerankHotlistIssue(
+        #         services=service).GetRerankHotlistIssuePage, ['GET']),
+        # (
+        #   '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank.do',
+        #     rerankhotlist.RerankHotlistIssue(
+        #         services=service).PostRerankHotlistIssuePage, ['POST']),
+    ]
+
+    flaskapp_user = self._AddFlaskUrlRules(flaskapp_user, _USER_URLS)
+
+    # pylint: disable=unused-variable
+    # for url /u/
+    @flaskapp_user.route('/')
+    def UserRedirectToMainPage():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    return flaskapp_user
+
+  # pylint: disable=unused-argument
+  def RegisterTaskUrl(self, service):
+    flaskapp_task = flask.Flask(__name__)
+    _TASK_URL = [
+        # (
+        #     '/banSpammer',
+        #     banspammer.BanSpammerTask(services=service).GetBanSpammer,
+        #     ['GET']),
+        # (
+        #     '/banSpammer.do',
+        #     banspammer.BanSpammerTask(services=service).PostBanSpammer,
+        #     ['POST']),
+        # (
+        #     '/sendWipeoutUserListsTask',
+        #     deleteusers.SendWipeoutUserListsTask(
+        #         services=service).GetSendWipeoutUserListsTask, ['GET']),
+        # (
+        #     '/sendWipeoutUserListsTask.do',
+        #     deleteusers.SendWipeoutUserListsTask(
+        #         services=service).PostSendWipeoutUserListsTask, ['POST']),
+        # (
+        #     '/deleteWipeoutUsersTask',
+        #     deleteusers.DeleteWipeoutUsersTask(
+        #         services=service).GetDeleteWipeoutUsersTask, ['GET']),
+        # (
+        #     '/deleteWipeoutUsersTask.do',
+        #     deleteusers.DeleteWipeoutUsersTask(
+        #         services=service).PostDeleteWipeoutUsersTask, ['POST']),
+        # (
+        #     '/deleteUsersTask',
+        #     deleteusers.DeleteUsersTask(services=service).GetDeleteUsersTask,
+        #     ['GET']),
+        # (
+        #     '/deleteUsersTask.do',
+        #     deleteusers.DeleteUsersTask(services=service).PostDeleteUsersTask,
+        #     ['POST']),
+        # (
+        #     '/notifyRulesDeleted',
+        #     notify.NotifyRulesDeletedTask(
+        #         services=service).GetNotifyRulesDeletedTask, ['GET']),
+        # (
+        #     '/notifyRulesDeleted.do',
+        #     notify.NotifyRulesDeletedTask(
+        #         services=service).PostNotifyRulesDeletedTask, ['POST']),
+        # (
+        #     '/notifyIssueChange', notify.NotifyIssueChangeTask(
+        #         services=service).GetNotifyIssueChangeTask, ['GET']),
+        # (
+        #     '/notifyIssueChange.do',
+        #     notify.NotifyIssueChangeTask(
+        #         services=service).PostNotifyIssueChangeTask, ['POST']),
+        # (
+        #     '/notifyBlockingChange',
+        #     notify.NotifyBlockingChangeTask(
+        #         services=service).GetNotifyBlockingChangeTask, ['GET']),
+        # (
+        #     '/notifyBlockingChange.do',
+        #     notify.NotifyBlockingChangeTask(
+        #         services=service).PostNotifyBlockingChangeTask, ['POST']),
+        # (
+        #     '/notifyBulkEdit', notify.NotifyBulkChangeTask(
+        #         services=service).GetNotifyBulkChangeTask, ['GET']),
+        # (
+        #     '/notifyBulkEdit.do', notify.NotifyBulkChangeTask(
+        #         services=service).PostNotifyBulkChangeTask, ['POST']),
+        # (
+        #     '/notifyApprovalChange',
+        #     notify.NotifyApprovalChangeTask(
+        #         services=service).GetNotifyApprovalChangeTask, ['GET']),
+        # (
+        #     '/notifyApprovalChange.do',
+        #     notify.NotifyApprovalChangeTask(
+        #         services=service).PostNotifyApprovalChangeTask, ['POST']),
+        # (
+        #     '/publishPubsubIssueChange',
+        #     pubsub.PublishPubsubIssueChangeTask(
+        #         services=service).GetPublishPubsubIssueChangeTask, ['GET']),
+        # (
+        #     '/publishPubsubIssueChange.do',
+        #     pubsub.PublishPubsubIssueChangeTask(
+        #         services=service).PostPublishPubsubIssueChangeTask, ['POST']),
+        # (
+        #     '/issueDateAction', dateaction.IssueDateActionTask(
+        #         services=service).GetIssueDateActionTask, ['GET']),
+        # (
+        #     '/issueDateAction.do',
+        #     dateaction.IssueDateActionTask(
+        #         services=service).PostIssueDateActionTask, ['POST']),
+        # (
+        #     '/fltConversionTask',
+        #     fltconversion.FLTConvertTask(services=service).GetFLTConvertTask,
+        #     ['GET']),
+        # (
+        #     '/fltConversionTask.do',
+        #     fltconversion.FLTConvertTask(services=service).PostFLTConvertTask,
+        #     ['POST']),
+        # (
+        #     '/outboundEmail',
+        #     notify.OutboundEmailTask(services=service).GetOutboundEmailTask,
+        #     ['GET']),
+        # (
+        #     '/outboundEmail.do',
+        #     notify.OutboundEmailTask(services=service).PostOutboundEmailTask,
+        #     ['POST']),
+        # (
+        #     '/recomputeDerivedFields',
+        #     filterrules.RecomputeDerivedFieldsTask(
+        #         services=service).GetRecomputeDerivedFieldsTask, ['GET']),
+        # (
+        #     '/recomputeDerivedFields.do',
+        #     filterrules.RecomputeDerivedFieldsTask(
+        #         services=service).PostRecomputeDerivedFieldsTask, ['POST']),
+    ]
+
+    for rule in _TASK_URL:
+      flaskapp_task.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+
+    return flaskapp_task
+
+  # pylint: disable=unused-argument
+  def RegisterCronUrl(self, service):
+    flaskapp_cron = flask.Flask(__name__)
+    _CRON_URL = [
+        # (
+        #     '/wipeoutSync',
+        #     deleteusers.WipeoutSyncCron(services=service).GetWipeoutSyncCron,
+        #     ['GET']),
+        # (
+        #     '/wipeoutSync.do',
+        #     deleteusers.WipeoutSyncCron(services=service).PostWipeoutSyncCron,
+        #     ['POST']),
+        # (
+        #     '/reindexQueue',
+        #     filterrules.ReindexQueueCron(
+        #       services=service).GetReindexQueueCron,
+        #     ['GET']),
+        # (
+        #     '/reindexQueue.do',
+        #     filterrules.ReindexQueueCron(
+        #       services=service).PostReindexQueueCron,
+        #     ['POST']),
+        # (
+        #     '/dateAction',
+        #     dateaction.DateActionCron(services=service).GetDateActionCron,
+        #     ['GET']),
+        # (
+        #     '/dateAction.do',
+        #     dateaction.DateActionCron(services=service).PostDateActionCron,
+        #     ['POST']),
+        # (
+        #     '/ramCacheConsolidate',
+        #     cachemanager_svc.RamCacheConsolidate(
+        #         services=service).GetRamCacheConsolidate, ['GET']),
+        # (
+        #     '/ramCacheConsolidate.do',
+        #     cachemanager_svc.RamCacheConsolidate(
+        #         services=service).PostRamCacheConsolidate, ['POST']),
+        # ('/reap', reap.Reap(services=service).GetReap, ['GET']),
+        # ('/reap.do', reap.Reap(services=service).PostReap, ['POST']),
+        # (
+        #     '/loadApiClientConfigs',
+        #     client_config_svc.LoadApiClientConfigs().GetLoadApiClientConfigs,
+        #     ['GET']),
+        # (
+        #     '/trimVisitedPages',
+        #     trimvisitedpages.TrimVisitedPages(
+        #         services=service).GetTrimVisitedPages, ['GET']),
+        # (
+        #     '/trimVisitedPages.do',
+        #     trimvisitedpages.TrimVisitedPages(
+        #         services=service).PostTrimVisitedPages, ['POST']),
+    ]
+
+    for rule in _CRON_URL:
+      flaskapp_cron.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+
+    return flaskapp_cron
+
+  # pylint: disable=unused-argument
+  def RegisterBackendUrl(self, service):
+    flaskapp_backend = flask.Flask(__name__)
+    _BACKEND_URL = [
+        # (
+        #     '/search',
+        #     backendsearch.BackendSearch(services=service).GetBackendSearch,
+        #     ['GET']),
+        # (
+        #     '/search.do',
+        #     backendsearch.BackendSearch(services=service).PostBackendSearch,
+        #     ['POST']),
+        # (
+        #     '/nonviewable',
+        #     backendnonviewable.BackendNonviewable(
+        #         services=service).GetBackendNonviewable,
+        #     ['GET']),
+        # (
+        #     '/nonviewable.do',
+        #     backendnonviewable.BackendNonviewable(
+        #        services=service).PostBackendNonviewable,
+        #     ['POST']),
+    ]
+
+    for rule in _BACKEND_URL:
+      flaskapp_backend.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+
+    return flaskapp_backend
+
+  # pylint: disable=unused-argument
+  def RegisterMONSetUrl(self, service):
+    flaskapp_mon = flask.Flask(__name__)
+    _MON_URL = [
+        # (
+        #     '/clientmon',
+        #     clientmon.ClientMonitor(services=service).GetClientMonitor, ['GET'
+        #                                                                 ]),
+        # (
+        #     '/clientmon.do',
+        #     clientmon.ClientMonitor(services=service).PostClientMonitor,
+        #     ['POST']),
+        # (
+        #     '/jstsmon.do',
+        #     ts_mon_js.FlaskMonorailTSMonJSHandler(
+        #         services=service).PostMonorailTSMonJSHandler,
+        #     ['POST'],
+        # )
+    ]
+
+    flaskapp_mon = self._AddFlaskUrlRules(flaskapp_mon, _MON_URL)
+    return flaskapp_mon
+
+  # pylint: disable=unused-argument
+  def RegisterAHUrl(self, service):
+    flaskapp_ah = flask.Flask(__name__)
+    _AH_URL = [
+        # ('/warmup', warmup.Warmup(services=service).GetWarmup, ['GET']),
+        # ('/start', warmup.Start(services=service).GetStart, ['GET']),
+        # ('/stop', warmup.Stop(services=service).GetStop, ['GET']),
+        # (
+        #     '/bounce',
+        #     inboundemail.BouncedEmail(services=service).postBouncedEmail,
+        #     ['POST']),
+        # (
+        #     '/mail/<string:project_addr>',
+        #     inboundemail.InboundEmail(services=service).HandleInboundEmail,
+        #     ['GET', 'POST'])
+    ]
+
+    flaskapp_ah = self._AddFlaskUrlRules(flaskapp_ah, _AH_URL)
+
+    return flaskapp_ah
