diff --git a/tracker/test/attachment_helpers_test.py b/tracker/test/attachment_helpers_test.py
index 18e0efc..cbc7458 100644
--- a/tracker/test/attachment_helpers_test.py
+++ b/tracker/test/attachment_helpers_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittest for the tracker helpers module."""
 from __future__ import print_function
@@ -11,7 +10,7 @@
 from mock import Mock, patch
 import unittest
 
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from tracker import attachment_helpers
 
 
@@ -146,4 +145,3 @@
     # Anything that is not a video.
     attach.mimetype = 'audio/mp3'
     self.assertIsNone(attachment_helpers.GetVideoURL(attach, download_url))
-
diff --git a/tracker/test/component_helpers_test.py b/tracker/test/component_helpers_test.py
index ee7f56c..3603583 100644
--- a/tracker/test/component_helpers_test.py
+++ b/tracker/test/component_helpers_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for the component_helpers module."""
 from __future__ import print_function
@@ -10,7 +9,7 @@
 
 import unittest
 
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from tracker import component_helpers
diff --git a/tracker/test/componentcreate_test.py b/tracker/test/componentcreate_test.py
index 1325d9b..2a14874 100644
--- a/tracker/test/componentcreate_test.py
+++ b/tracker/test/componentcreate_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for the componentcreate servlet."""
 from __future__ import print_function
@@ -17,8 +16,6 @@
 from tracker import componentcreate
 from tracker import tracker_bizobj
 
-import webapp2
-
 
 class ComponentCreateTest(unittest.TestCase):
 
@@ -27,8 +24,7 @@
         user=fake.UserService(),
         config=fake.ConfigService(),
         project=fake.ProjectService())
-    self.servlet = componentcreate.ComponentCreate(
-        'req', 'res', services=self.services)
+    self.servlet = componentcreate.ComponentCreate(services=self.services)
     self.project = self.services.project.TestAddProject('proj')
     self.mr = testing_helpers.MakeMonorailRequest(
         project=self.project, perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
@@ -87,8 +83,7 @@
         cc=[''],
         labels=[''])
     self.assertRaises(
-        webapp2.HTTPException,
-        self.servlet.ProcessFormData, self.mr, post_data)
+        Exception, self.servlet.ProcessFormData, self.mr, post_data)
 
   def testProcessFormData_Normal(self):
     post_data = fake.PostData(
diff --git a/tracker/test/componentdetail_test.py b/tracker/test/componentdetail_test.py
index 6186582..0dcff92 100644
--- a/tracker/test/componentdetail_test.py
+++ b/tracker/test/componentdetail_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for the componentdetail servlet."""
 from __future__ import print_function
@@ -10,7 +9,7 @@
 
 import unittest
 
-from mock import Mock, patch
+from mock import Mock
 
 try:
   from mox3 import mox
@@ -19,7 +18,7 @@
 
 from features import filterrules_helpers
 from framework import permissions
-from proto import project_pb2
+from mrproto import project_pb2
 from services import service_manager
 from services import template_svc
 from testing import fake
@@ -27,8 +26,6 @@
 from tracker import componentdetail
 from tracker import tracker_bizobj
 
-import webapp2
-
 
 class ComponentDetailTest(unittest.TestCase):
 
@@ -39,8 +36,7 @@
         config=fake.ConfigService(),
         template=Mock(spec=template_svc.TemplateService),
         project=fake.ProjectService())
-    self.servlet = componentdetail.ComponentDetail(
-        'req', 'res', services=self.services)
+    self.servlet = componentdetail.ComponentDetail(services=self.services)
     self.project = self.services.project.TestAddProject('proj')
     self.mr = testing_helpers.MakeMonorailRequest(
         project=self.project, perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
@@ -65,9 +61,7 @@
 
   def testGetComponentDef_NotFound(self):
     self.mr.component_path = 'NeverHeardOfIt'
-    self.assertRaises(
-        webapp2.HTTPException,
-        self.servlet._GetComponentDef, self.mr)
+    self.assertRaises(Exception, self.servlet._GetComponentDef, self.mr)
 
   def testGetComponentDef_Normal(self):
     actual_config, actual_cd = self.servlet._GetComponentDef(self.mr)
@@ -215,7 +209,7 @@
       self.servlet.ProcessFormData(self.mr, post_data)
     self.assertEqual(
         'User tried to delete component that had subcomponents',
-        cm.exception.message)
+        str(cm.exception))
 
   def testProcessFormData_Edit(self):
     post_data = fake.PostData(
diff --git a/tracker/test/field_helpers_test.py b/tracker/test/field_helpers_test.py
index f49a147..5d46586 100644
--- a/tracker/test/field_helpers_test.py
+++ b/tracker/test/field_helpers_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for the field_helpers module."""
 from __future__ import print_function
@@ -15,8 +14,8 @@
 from framework import exceptions
 from framework import permissions
 from framework import template_helpers
-from proto import project_pb2
-from proto import tracker_pb2
+from mrproto import project_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from services import config_svc
 from testing import fake
@@ -1274,3 +1273,43 @@
     self.assertEqual(
         self.mr.errors.min_value, 'Minimum value must be less than maximum.')
     self.assertEqual(self.mr.errors.regex, 'Invalid regular expression.')
+
+  def testValidateLabels_NoLabels(self):
+    err_msg = field_helpers.ValidateLabels(
+        self.mr.cnxn,
+        self.services,
+        self.mr.project_id, [''],
+        ezt_errors=self.errors)
+    self.assertFalse(self.errors.AnyErrors())
+    self.assertEqual(err_msg, None)
+
+  def testValidateLabels_ExistingLabel(self):
+    err_msg = field_helpers.ValidateLabels(
+        self.mr.cnxn,
+        self.services,
+        self.mr.project_id, ['old_label'],
+        ezt_errors=self.errors)
+    self.assertFalse(self.errors.AnyErrors())
+    self.assertEqual(err_msg, None)
+
+  def testValidateLabels_AllowlistedLabel(self):
+    err_msg = field_helpers.ValidateLabels(
+        self.mr.cnxn,
+        self.services,
+        self.mr.project_id, ['old_label', 'CVE-test'],
+        ezt_errors=self.errors)
+    self.assertFalse(self.errors.AnyErrors())
+    self.assertEqual(err_msg, None)
+
+  def testValidateLabels_Error(self):
+    err_msg = field_helpers.ValidateLabels(
+        self.mr.cnxn,
+        self.services,
+        self.mr.project_id, ['freeze_new_label'],
+        ezt_errors=self.errors)
+    self.assertTrue(self.errors.AnyErrors())
+    self.assertEqual(
+        err_msg, (
+            'The creation of new labels is blocked for the Chromium project'
+            ' in Monorail. To continue with editing your issue, please'
+            ' remove: freeze_new_label label(s).'))
diff --git a/tracker/test/fieldcreate_test.py b/tracker/test/fieldcreate_test.py
index 4a8c919..c1b9729 100644
--- a/tracker/test/fieldcreate_test.py
+++ b/tracker/test/fieldcreate_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for the fieldcreate servlet."""
 from __future__ import print_function
@@ -13,13 +12,14 @@
 except ImportError:
   import mox
 import mock
+import six
 import unittest
 import logging
 
 import ezt
 
 from framework import permissions
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -35,8 +35,7 @@
         user=fake.UserService(),
         config=fake.ConfigService(),
         project=fake.ProjectService())
-    self.servlet = fieldcreate.FieldCreate(
-        'req', 'res', services=self.services)
+    self.servlet = fieldcreate.FieldCreate(services=self.services)
     self.project = self.services.project.TestAddProject('proj')
     self.mr = testing_helpers.MakeMonorailRequest(
         project=self.project, perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
@@ -84,8 +83,8 @@
     page_data = self.servlet.GatherPageData(self.mr)
     self.assertEqual(self.servlet.PROCESS_TAB_LABELS,
                      page_data['admin_tab_mode'])
-    self.assertItemsEqual(
-        ['Defect', 'Enhancement', 'Task', 'Other'],
+    six.assertCountEqual(
+        self, ['Defect', 'Enhancement', 'Task', 'Other'],
         page_data['well_known_issue_types'])
     self.assertEqual(['LaunchApproval'], page_data['approval_names'])
     self.assertEqual('', page_data['initial_admins'])
diff --git a/tracker/test/fielddetail_test.py b/tracker/test/fielddetail_test.py
index 5b31fa3..ecd096b 100644
--- a/tracker/test/fielddetail_test.py
+++ b/tracker/test/fielddetail_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for the fielddetail servlet."""
 from __future__ import print_function
@@ -15,19 +14,14 @@
 import unittest
 import logging
 
-import webapp2
-
-import ezt
-
 from framework import permissions
-from proto import project_pb2
-from proto import tracker_pb2
+from mrproto import project_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
 from tracker import fielddetail
 from tracker import tracker_bizobj
-from tracker import tracker_views
 
 
 class FieldDetailTest(unittest.TestCase):
@@ -37,8 +31,7 @@
         user=fake.UserService(),
         config=fake.ConfigService(),
         project=fake.ProjectService())
-    self.servlet = fielddetail.FieldDetail(
-        'req', 'res', services=self.services)
+    self.servlet = fielddetail.FieldDetail(services=self.services)
     self.project = self.services.project.TestAddProject('proj')
     self.mr = testing_helpers.MakeMonorailRequest(
         project=self.project, perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
@@ -80,9 +73,7 @@
 
   def testGetFieldDef_NotFound(self):
     self.mr.field_name = 'NeverHeardOfIt'
-    self.assertRaises(
-        webapp2.HTTPException,
-        self.servlet._GetFieldDef, self.mr)
+    self.assertRaises(Exception, self.servlet._GetFieldDef, self.mr)
 
   def testGetFieldDef_Normal(self):
     actual_config, actual_fd = self.servlet._GetFieldDef(self.mr)
diff --git a/tracker/test/fltconversion_test.py b/tracker/test/fltconversion_test.py
index be66ad2..2526fdc 100644
--- a/tracker/test/fltconversion_test.py
+++ b/tracker/test/fltconversion_test.py
@@ -1,7 +1,6 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for the flt launch issues conversion task."""
 from __future__ import print_function
@@ -21,7 +20,7 @@
 from tracker import tracker_bizobj
 from testing import fake
 from testing import testing_helpers
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 
 class FLTConvertTask(unittest.TestCase):
 
@@ -411,13 +410,13 @@
   def testFetchAndAssertProjectInfo(self):
 
     # test no 'launch' in request
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, r'bad launch type:',
         self.task.FetchAndAssertProjectInfo, self.mr)
 
     # test bad 'launch' in request
     mr = testing_helpers.MakeMonorailRequest(path='url/url?launch=bad')
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, r'bad launch type: bad',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -429,7 +428,7 @@
     # test no template
     self.task.services.template.GetTemplateByName = mock.Mock(
         return_value=None)
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, r'not found in chromium project',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -438,14 +437,14 @@
         'template', 'sum', 'New', 111, 'content', [], [], [], [])
     self.task.services.template.GetTemplateByName = mock.Mock(
         return_value=template)
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'no approvals or phases in',
         self.task.FetchAndAssertProjectInfo, mr)
 
     # test phases not recognized
     template.phases = [tracker_pb2.Phase(name='WeirdPhase')]
     template.approval_values = [tracker_pb2.ApprovalValue()]
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'one or more phases not recognized',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -457,7 +456,7 @@
         tracker_pb2.ApprovalValue(approval_id=3)]
 
     # test approvals not recognized
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'one or more approvals not recognized',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -471,7 +470,7 @@
     ]
 
     # test approvals not in config's approval_defs
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'one or more approvals not in config.approval_defs',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -481,7 +480,7 @@
         tracker_pb2.ApprovalDef(approval_id=3)]
 
     # test no pm field exists in project
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'project has no FieldDef %s' % fltconversion.PM_FIELD,
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -496,7 +495,7 @@
     ])
 
     # test no USER_TYPE te field exists in project
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'project has no FieldDef %s' % fltconversion.TE_FIELD,
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -510,7 +509,7 @@
         ])
 
     # test no M-Target INT_TYPE multivalued Phase FieldDefs
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError,
         'project has no FieldDef %s' % fltconversion.MTARGET_FIELD,
         self.task.FetchAndAssertProjectInfo, mr)
@@ -519,7 +518,7 @@
     self.config.field_defs[-2].is_multivalued = True
 
     # test no M-Approved INT_TYPE multivalued Phase FieldDefs
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError,
         'project has no FieldDef %s' % fltconversion.MAPPROVED_FIELD,
         self.task.FetchAndAssertProjectInfo, mr)
@@ -538,7 +537,7 @@
     # FINCH special case
     # test approvals for Finch not required
     mr = testing_helpers.MakeMonorailRequest(path='url/url?launch=finch')
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'finch template not set up correctly',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -568,7 +567,7 @@
     # test phases not recognized
     template.phases = [tracker_pb2.Phase(name='Chrome-Test')]
     template.approval_values = [tracker_pb2.ApprovalValue()]
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'one or more phases not recognized',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -580,7 +579,7 @@
         tracker_pb2.ApprovalValue(approval_id=1),
         tracker_pb2.ApprovalValue(approval_id=2),
         tracker_pb2.ApprovalValue(approval_id=3)]
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'os template not set up correctly',
         self.task.FetchAndAssertProjectInfo, mr)
 
@@ -588,7 +587,7 @@
       av.status = tracker_pb2.ApprovalStatus.NEEDS_REVIEW
 
     # test approvals not recognized
-    self.assertRaisesRegexp(
+    self.assertRaisesRegex(
         AssertionError, 'one or more approvals not recognized',
         self.task.FetchAndAssertProjectInfo, mr)
 
diff --git a/tracker/test/issueadmin_test.py b/tracker/test/issueadmin_test.py
index c36a495..c19a21d 100644
--- a/tracker/test/issueadmin_test.py
+++ b/tracker/test/issueadmin_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for the issue admin pages."""
 from __future__ import print_function
@@ -12,13 +11,15 @@
   from mox3 import mox
 except ImportError:
   import mox
+import six
 import unittest
 
+import settings
 from mock import Mock, patch
 
 from framework import permissions
 from framework import urls
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from services import template_svc
 from testing import fake
@@ -39,7 +40,7 @@
         issue=fake.IssueService(),
         template=Mock(spec=template_svc.TemplateService),
         features=fake.FeaturesService())
-    self.servlet = servlet_factory('req', 'res', services=self.services)
+    self.servlet = servlet_factory(services=self.services)
     self.project = self.services.project.TestAddProject(
         'proj', project_id=789, contrib_ids=[333])
     self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
@@ -47,6 +48,8 @@
     self.cnxn = fake.MonorailConnection()
     self.mr = testing_helpers.MakeMonorailRequest(
         path='/p/proj/admin', project=self.project)
+    # Default to admin perms given that most tests assume the user can edit.
+    self.mr.perms = permissions.ADMIN_PERMISSIONSET
     self.mox = mox.Mox()
     self.test_template = tracker_bizobj.MakeIssueTemplate(
         'Test Template', 'sum', 'New', 111, 'content', [], [], [], [])
@@ -58,6 +61,8 @@
     self.services.template.GetTemplateSetForProject\
         .return_value = [(12345, 'Test template', 0)]
 
+    settings.config_freeze_project_ids = {}
+
   def tearDown(self):
     self.mox.UnsetStubs()
     self.mox.ResetAll()
@@ -80,9 +85,11 @@
     page_data = self.servlet.GatherPageData(self.mr)
     self.mox.VerifyAll()
 
-    self.assertItemsEqual(
-        ['admin_tab_mode', 'config', 'open_text', 'closed_text', 'labels_text'],
-        list(page_data.keys()))
+    six.assertCountEqual(
+        self, [
+            'admin_tab_mode', 'config', 'open_text', 'closed_text',
+            'labels_text', 'can_edit_project'
+        ], list(page_data.keys()))
     config_view = page_data['config']
     self.assertEqual(789, config_view.project_id)
 
@@ -91,6 +98,7 @@
 
   def setUp(self):
     super(AdminStatusesTest, self).setUpServlet(issueadmin.AdminStatuses)
+    self.servlet.mr = self.mr
 
   @patch('framework.servlet.Servlet.PleaseCorrect')
   def testProcessSubtabForm_MissingInput(self, mock_pc):
@@ -143,10 +151,11 @@
     page_data = self.servlet.GatherPageData(self.mr)
     self.mox.VerifyAll()
 
-    self.assertItemsEqual(
-        ['admin_tab_mode', 'config', 'field_defs',
-         'open_text', 'closed_text', 'labels_text'],
-        list(page_data.keys()))
+    six.assertCountEqual(
+        self, [
+            'admin_tab_mode', 'config', 'field_defs', 'open_text',
+            'closed_text', 'labels_text', 'can_edit_project'
+        ], list(page_data.keys()))
     config_view = page_data['config']
     self.assertEqual(789, config_view.project_id)
     self.assertEqual([], page_data['field_defs'])
@@ -300,11 +309,12 @@
     self.mox.ReplayAll()
     page_data = self.servlet.GatherPageData(self.mr)
     self.mox.VerifyAll()
-    self.assertItemsEqual(
-        ['admin_tab_mode', 'failed_templ', 'component_defs', 'failed_perm',
-         'config', 'failed_subcomp',
-         'open_text', 'closed_text', 'labels_text'],
-        list(page_data.keys()))
+    six.assertCountEqual(
+        self, [
+            'admin_tab_mode', 'failed_templ', 'component_defs', 'failed_perm',
+            'config', 'failed_subcomp', 'open_text', 'closed_text',
+            'labels_text', 'can_edit_project'
+        ], list(page_data.keys()))
     config_view = page_data['config']
     self.assertEqual(789, config_view.project_id)
     self.assertEqual([], page_data['component_defs'])
@@ -367,11 +377,12 @@
     page_data = self.servlet.GatherPageData(self.mr)
     self.mox.VerifyAll()
 
-    self.assertItemsEqual(
-        ['canned_queries', 'admin_tab_mode', 'config', 'issue_notify',
-         'new_query_indexes', 'max_queries',
-         'open_text', 'closed_text', 'labels_text'],
-        list(page_data.keys()))
+    six.assertCountEqual(
+        self, [
+            'canned_queries', 'admin_tab_mode', 'config', 'issue_notify',
+            'new_query_indexes', 'max_queries', 'open_text', 'closed_text',
+            'labels_text', 'can_edit_project'
+        ], list(page_data.keys()))
     config_view = page_data['config']
     self.assertEqual(789, config_view.project_id)
 
@@ -424,8 +435,9 @@
     self.assertEqual('label1-sub1', y_attr)
 
     # Test that multibyte strings are not mangled.
-    spec = ('\xe7\xaa\xbf\xe8\x8b\xa5-\xe7\xb9\xb9 '
-            '\xe5\x9c\xb0\xe3\x81\xa6-\xe5\xbd\x93-\xe3\x81\xbe\xe3\x81\x99')
+    spec = (
+        b'\xe7\xaa\xbf\xe8\x8b\xa5-\xe7\xb9\xb9 '
+        b'\xe5\x9c\xb0\xe3\x81\xa6-\xe5\xbd\x93-\xe3\x81\xbe\xe3\x81\x99')
     spec = spec.decode('utf-8')
     (col_spec, sort_spec, x_attr, y_attr, member_default_query,
      ) = issueadmin._ParseListPreferences(
@@ -437,10 +449,10 @@
         )
     self.assertEqual(spec, col_spec)
     self.assertEqual(' '.join(spec.split()), sort_spec)
-    self.assertEqual('\xe7\xaa\xbf\xe8\x8b\xa5-\xe7\xb9\xb9'.decode('utf-8'),
-                     x_attr)
-    self.assertEqual('\xe7\xaa\xbf\xe8\x8b\xa5-\xe7\xb9\xb9'.decode('utf-8'),
-                     y_attr)
+    self.assertEqual(
+        b'\xe7\xaa\xbf\xe8\x8b\xa5-\xe7\xb9\xb9'.decode('utf-8'), x_attr)
+    self.assertEqual(
+        b'\xe7\xaa\xbf\xe8\x8b\xa5-\xe7\xb9\xb9'.decode('utf-8'), y_attr)
     self.assertEqual(spec, member_default_query)
 
 
@@ -455,10 +467,12 @@
     page_data = self.servlet.GatherPageData(self.mr)
     self.mox.VerifyAll()
 
-    self.assertItemsEqual(
-        ['admin_tab_mode', 'config', 'rules', 'new_rule_indexes',
-         'max_rules', 'open_text', 'closed_text', 'labels_text'],
-        list(page_data.keys()))
+    six.assertCountEqual(
+        self, [
+            'admin_tab_mode', 'config', 'rules', 'new_rule_indexes',
+            'max_rules', 'open_text', 'closed_text', 'labels_text',
+            'can_edit_project'
+        ], list(page_data.keys()))
     config_view = page_data['config']
     self.assertEqual(789, config_view.project_id)
     self.assertEqual([], page_data['rules'])
diff --git a/tracker/test/issueadvsearch_test.py b/tracker/test/issueadvsearch_test.py
index fd1ee2e..a84e4e1 100644
--- a/tracker/test/issueadvsearch_test.py
+++ b/tracker/test/issueadvsearch_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for monorail.tracker.issueadvsearch."""
 from __future__ import print_function
@@ -25,8 +24,7 @@
         user=fake.UserService(),
         project=fake.ProjectService())
     self.project = self.services.project.TestAddProject('proj', project_id=987)
-    self.servlet = issueadvsearch.IssueAdvancedSearch(
-        'req', 'res', services=self.services)
+    self.servlet = issueadvsearch.IssueAdvancedSearch(services=self.services)
 
   def testGatherData(self):
     mr = testing_helpers.MakeMonorailRequest(
diff --git a/tracker/test/issueattachment_test.py b/tracker/test/issueattachment_test.py
index f782f22..0330e19 100644
--- a/tracker/test/issueattachment_test.py
+++ b/tracker/test/issueattachment_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for monorail.tracker.issueattachment."""
 from __future__ import print_function
@@ -16,11 +15,10 @@
   from mox3 import mox
 except ImportError:
   import mox
-import webapp2
 
-from framework import gcs_helpers
+from framework import exceptions, gcs_helpers
 from framework import permissions
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -45,8 +43,7 @@
         issue=fake.IssueService(),
         user=fake.UserService())
     self.project = services.project.TestAddProject('proj')
-    self.servlet = issueattachment.AttachmentPage(
-        'req', webapp2.Response(), services=services)
+    self.servlet = issueattachment.AttachmentPage(services=services)
     services.user.TestAddUser('commenter@example.com', 111)
     self.issue = fake.MakeTestIssue(
         self.project.project_id, 1, 'summary', 'New', 111)
@@ -79,7 +76,7 @@
     _request, mr = testing_helpers.GetRequestObjects(
         project=self.project, path=path,
         perms=permissions.EMPTY_PERMISSIONSET)
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet.GatherPageData(mr)
     self.assertEqual(404, cm.exception.code)
 
@@ -125,18 +122,17 @@
         'app_default_bucket',
         '/pid/attachments/object_id-download'
         ).AndReturn('googleusercontent.com/...-download...')
-    self.mox.StubOutWithMock(self.servlet, 'redirect')
     path = '/p/proj/issues/attachment?aid=%s&signed_aid=signed_%d' % (
         aid, aid)
     _request, mr = testing_helpers.GetRequestObjects(
         project=self.project, path=path,
         perms=permissions.READ_ONLY_PERMISSIONSET)  # includes VIEW
-    self.servlet.redirect(
-      mox.And(mox.StrContains('googleusercontent.com'),
-              mox.StrContains('-download')), abort=True)
     self.mox.ReplayAll()
-    self.servlet.GatherPageData(mr)
+    with self.assertRaises(exceptions.RedirectException) as e:
+      self.servlet.GatherPageData(mr)
     self.mox.VerifyAll()
+    self.assertIn('googleusercontent.com', str(e.exception))
+    self.assertIn('-download', str(e.exception))
 
   def testGatherPageData_Download_WithoutDisposition(self):
     aid = self.attachment.attachment_id
@@ -152,16 +148,15 @@
         'app_default_bucket',
         '/pid/attachments/object_id'
         ).AndReturn('googleusercontent.com/...')
-    self.mox.StubOutWithMock(self.servlet, 'redirect')
     _request, mr = testing_helpers.GetRequestObjects(
         project=self.project, path=path,
         perms=permissions.READ_ONLY_PERMISSIONSET)  # includes VIEW
-    self.servlet.redirect(
-      mox.And(mox.StrContains('googleusercontent.com'),
-              mox.Not(mox.StrContains('-download'))), abort=True)
     self.mox.ReplayAll()
-    self.servlet.GatherPageData(mr)
+    with self.assertRaises(exceptions.RedirectException) as e:
+      self.servlet.GatherPageData(mr)
     self.mox.VerifyAll()
+    self.assertIn('googleusercontent.com', str(e.exception))
+    self.assertNotIn('-download', str(e.exception))
 
   def testGatherPageData_DownloadBadFilename(self):
     aid = self.attachment.attachment_id
@@ -179,14 +174,12 @@
         'app_default_bucket',
         '/pid/attachments/object_id-download'
         ).AndReturn('googleusercontent.com/...-download...')
-    self.mox.StubOutWithMock(self.servlet, 'redirect')
     _request, mr = testing_helpers.GetRequestObjects(
         project=self.project,
         path=path,
         perms=permissions.READ_ONLY_PERMISSIONSET)  # includes VIEW
-    self.servlet.redirect(mox.And(
-        mox.Not(mox.StrContains(self.attachment.filename)),
-        mox.StrContains('googleusercontent.com')), abort=True)
     self.mox.ReplayAll()
-    self.servlet.GatherPageData(mr)
+    with self.assertRaises(exceptions.RedirectException) as e:
+      self.servlet.GatherPageData(mr)
     self.mox.VerifyAll()
+    self.assertIn('googleusercontent.com', str(e.exception))
diff --git a/tracker/test/issueattachmenttext_test.py b/tracker/test/issueattachmenttext_test.py
index f7dda8d..f6a2447 100644
--- a/tracker/test/issueattachmenttext_test.py
+++ b/tracker/test/issueattachmenttext_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for issueattachmenttext."""
 from __future__ import print_function
@@ -15,10 +14,8 @@
 from google.appengine.ext import testbed
 from google.cloud import storage
 
-import webapp2
-
 from framework import permissions
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -38,8 +35,7 @@
         issue=fake.IssueService(),
         user=fake.UserService())
     self.project = services.project.TestAddProject('proj')
-    self.servlet = issueattachmenttext.AttachmentText(
-        'req', 'res', services=services)
+    self.servlet = issueattachmenttext.AttachmentText(services=services)
 
     services.user.TestAddUser('commenter@example.com', 111)
 
@@ -88,7 +84,7 @@
     self.blob = mock.MagicMock()
     self.client.get_bucket = mock.MagicMock(return_value=self.bucket)
     self.bucket.get_blob = mock.MagicMock(return_value=self.blob)
-    self.blob.download_as_bytes = mock.MagicMock()
+    self.blob.download_as_bytes = mock.MagicMock(return_value=b'')
     mock.patch.object(storage, 'Client', return_value=self.client).start()
 
   def tearDown(self):
@@ -142,7 +138,7 @@
         project=self.project,
         path='/p/proj/issues/attachmentText?aid=9999',
         perms=permissions.READ_ONLY_PERMISSIONSET)
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet.GatherPageData(mr)
     self.assertEqual(404, cm.exception.code)
 
@@ -153,13 +149,13 @@
         path='/p/proj/issues/attachmentText?aid=1234',
         perms=permissions.READ_ONLY_PERMISSIONSET)
     self.attach1.deleted = True
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet.GatherPageData(mr)
-    self.assertEqual(404, cm.exception.code)
+      self.assertEqual(404, cm.exception.code)
 
   def testGatherPageData_Normal(self):
     self.blob.download_as_bytes = mock.MagicMock(
-        return_value='/app_default_bucket/pid/attachments/abcdefg')
+        return_value=b'/app_default_bucket/pid/attachments/abcdefg')
 
     _request, mr = testing_helpers.GetRequestObjects(
         project=self.project,
@@ -176,8 +172,8 @@
     file_lines = page_data['file_lines']
     self.assertEqual(1, len(file_lines))
     self.assertEqual(1, file_lines[0].num)
-    self.assertEqual('/app_default_bucket/pid/attachments/abcdefg',
-                     file_lines[0].line)
+    self.assertEqual(
+        '/app_default_bucket/pid/attachments/abcdefg', file_lines[0].line)
 
     self.assertEqual(None, page_data['code_reviews'])
 
diff --git a/tracker/test/issuebulkedit_test.py b/tracker/test/issuebulkedit_test.py
index 89d9bc3..c7bd1ca 100644
--- a/tracker/test/issuebulkedit_test.py
+++ b/tracker/test/issuebulkedit_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for monorail.tracker.issuebulkedit."""
 from __future__ import print_function
@@ -11,14 +10,15 @@
 import mock
 import os
 import unittest
-import webapp2
+import flask
 
 from google.appengine.api import memcache
 from google.appengine.ext import testbed
 
 from framework import exceptions
 from framework import permissions
-from proto import tracker_pb2
+from mrproto import project_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from services import tracker_fulltext
 from testing import fake
@@ -45,8 +45,7 @@
         issue_star=fake.IssueStarService(),
         user=fake.UserService(),
         usergroup=fake.UserGroupService())
-    self.servlet = issuebulkedit.IssueBulkEdit(
-        'req', 'res', services=self.services)
+    self.servlet = issuebulkedit.IssueBulkEdit(services=self.services)
     self.mr = testing_helpers.MakeMonorailRequest(
         perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
     self.project = self.services.project.TestAddProject(
@@ -177,8 +176,7 @@
         project=self.project)
     mr.local_id_list = [local_id_1]
 
-    self.assertRaises(webapp2.HTTPException,
-                      self.servlet.GatherPageData, mr)
+    self.assertRaises(Exception, self.servlet.GatherPageData, mr)
 
   def testGatherPageData_TypeLabels(self):
     """Test that GPD displays a custom field for appropriate issues."""
@@ -226,6 +224,38 @@
     url = self.servlet.ProcessFormData(mr, post_data)
     self.assertTrue('list?can=1&q=&saved=1' in url)
 
+  def testProcessFormData_FreezeLabels(self):
+    """Test that PFD works in a normal no-corner-cases case."""
+    created_issue_1 = fake.MakeTestIssue(
+        789, 1, 'issue summary', 'New', 111, reporter_id=111)
+    self.services.issue.TestAddIssue(created_issue_1)
+    local_id_1 = created_issue_1.local_id
+
+    mr = testing_helpers.MakeMonorailRequest(
+        project=self.project,
+        perms=permissions.OWNER_ACTIVE_PERMISSIONSET,
+        user_info={'user_id': 111})
+    mr.local_id_list = [local_id_1]
+
+    post_data = fake.PostData(
+        owner=['owner@example.com'],
+        can=[1],
+        q=[''],
+        colspec=[''],
+        sort=[''],
+        groupby=[''],
+        start=[0],
+        num=[100],
+        label=['freeze_new_label'])
+    self._MockMethods()
+    self.servlet.response = flask.Response()
+    self.servlet.ProcessFormData(mr, post_data)
+    self.assertEqual(
+        (
+            "The creation of new labels is blocked for the Chromium project"
+            " in Monorail. To continue with editing your issue, please"
+            " remove: freeze_new_label label(s)."), mr.errors.labels)
+
   def testProcessFormData_NoIssues(self):
     """Test PFD when no issues are specified."""
     mr = testing_helpers.MakeMonorailRequest(
@@ -233,10 +263,10 @@
         perms=permissions.OWNER_ACTIVE_PERMISSIONSET,
         user_info={'user_id': 111})
     post_data = fake.PostData()
-    self.servlet.response = Response()
+    self.servlet.response = flask.Response()
     self.servlet.ProcessFormData(mr, post_data)
     # 400 == bad request
-    self.assertEqual(400, self.servlet.response.status)
+    self.assertEqual(400, self.servlet.response.status_code)
 
   def testProcessFormData_NoUser(self):
     """Test PFD when the user is not logged in."""
@@ -244,10 +274,10 @@
         project=self.project)
     mr.local_id_list = [99999]
     post_data = fake.PostData()
-    self.servlet.response = Response()
+    self.servlet.response = flask.Response()
     self.servlet.ProcessFormData(mr, post_data)
     # 400 == bad request
-    self.assertEqual(400, self.servlet.response.status)
+    self.assertEqual(400, self.servlet.response.status_code)
 
   def testProcessFormData_CantComment(self):
     """Test PFD when the user can't comment on any of the issues."""
@@ -257,10 +287,10 @@
         user_info={'user_id': 111})
     mr.local_id_list = [99999]
     post_data = fake.PostData()
-    self.servlet.response = Response()
+    self.servlet.response = flask.Response()
     self.servlet.ProcessFormData(mr, post_data)
     # 400 == bad request
-    self.assertEqual(400, self.servlet.response.status)
+    self.assertEqual(400, self.servlet.response.status_code)
 
   def testProcessFormData_CantEdit(self):
     """Test PFD when the user can't edit any issue metadata."""
@@ -270,10 +300,10 @@
         user_info={'user_id': 111})
     mr.local_id_list = [99999]
     post_data = fake.PostData()
-    self.servlet.response = Response()
+    self.servlet.response = flask.Response()
     self.servlet.ProcessFormData(mr, post_data)
     # 400 == bad request
-    self.assertEqual(400, self.servlet.response.status)
+    self.assertEqual(400, self.servlet.response.status_code)
 
   def testProcessFormData_CantMove(self):
     """Test PFD when the user can't move issues."""
@@ -283,10 +313,10 @@
         user_info={'user_id': 111})
     mr.local_id_list = [99999]
     post_data = fake.PostData(move_to=['proj'])
-    self.servlet.response = Response()
+    self.servlet.response = flask.Response()
     self.servlet.ProcessFormData(mr, post_data)
     # 400 == bad request
-    self.assertEqual(400, self.servlet.response.status)
+    self.assertEqual(400, self.servlet.response.status_code)
 
     created_issue_1 = fake.MakeTestIssue(
         789, 1, 'issue summary', 'New', 111, reporter_id=111)
@@ -699,7 +729,7 @@
 
     # Verify CC lists and owner were merged to the merge_into issue.
     self.assertEqual(
-            [113, 120, 114, 115, 118, 111], merge_into_issue.cc_ids)
+            [113, 120, 111, 114, 115, 118], merge_into_issue.cc_ids)
     # Verify new starrers were added to the merge_into issue.
     self.assertEqual(4,
                       self.services.issue_star.CountItemStars(
@@ -801,7 +831,7 @@
     self.assertEqual('Invalid issue ID 54321', mr.errors.blocking)
 
   def testProcessFormData_BlockIssuesOnItself(self):
-    """Test PFD processes invalid blocked_on and blocking values."""
+    """Test PFD processes same issue blocked_on and blocking values."""
     created_issue_1 = fake.MakeTestIssue(
         789, 1, 'issue summary', 'New', 111, reporter_id=111)
     self.services.issue.TestAddIssue(created_issue_1)
@@ -828,6 +858,49 @@
     self.assertEqual('Cannot block an issue on itself.', mr.errors.blocked_on)
     self.assertEqual('Cannot block an issue on itself.', mr.errors.blocking)
 
+  def testProcessFormData_BlockIssuesOnArchivedProject(self):
+    """Test PFD processes blocked_on and blocking issues without permissions."""
+    created_issue_1 = fake.MakeTestIssue(
+        789, 1, 'issue summary', 'New', 111, reporter_id=111)
+    self.services.issue.TestAddIssue(created_issue_1)
+    local_id_1 = created_issue_1.local_id
+    # Add issue to archived project.
+    archived_proj = self.services.project.TestAddProject(
+        name='archived-proj', project_id=789987, owner_ids=[111])
+    archived_proj.state = project_pb2.ProjectState.ARCHIVED
+    archived_iid = 2
+    created_issue_2 = fake.MakeTestIssue(
+        789987, archived_iid, 'issue summary', 'New', 111, reporter_id=111)
+    self.services.issue.TestAddIssue(created_issue_2)
+    mr = testing_helpers.MakeMonorailRequest(
+        project=self.project,
+        perms=permissions.OWNER_ACTIVE_PERMISSIONSET,
+        user_info={'user_id': 111})
+    mr.project_name = 'proj'
+    mr.local_id_list = [local_id_1]
+
+    global_id = 'archived-proj:2'
+    self._MockMethods()
+    post_data = fake.PostData(
+        op_blockedonenter=['append'],
+        blocked_on=[global_id],
+        op_blockingenter=['append'],
+        blocking=[global_id],
+        can=[1],
+        q=[''],
+        colspec=[''],
+        sort=[''],
+        groupby=[''],
+        start=[0],
+        num=[100])
+    self.servlet.ProcessFormData(mr, post_data)
+
+    self.assertEqual(
+        'Target issue %s cannot be modified' % archived_iid,
+        mr.errors.blocked_on)
+    self.assertEqual(
+        'Target issue %s cannot be modified' % archived_iid, mr.errors.blocking)
+
   @mock.patch('framework.cloud_tasks_helpers.create_task')
   def testProcessFormData_NormalBlockIssues(self, _create_task_mock):
     """Test PFD processes blocked_on and blocking values."""
diff --git a/tracker/test/issuedetailezt_test.py b/tracker/test/issuedetailezt_test.py
index fe3d22f..fe51ddf 100644
--- a/tracker/test/issuedetailezt_test.py
+++ b/tracker/test/issuedetailezt_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for monorail.tracker.issuedetailezt."""
 from __future__ import print_function
@@ -19,7 +18,7 @@
 
 import settings
 from businesslogic import work_env
-from proto import features_pb2
+from mrproto import features_pb2
 from features import hotlist_views
 from features import send_notifications
 from framework import authdata
@@ -31,9 +30,9 @@
 from framework import profiler
 from framework import sorting
 from framework import template_helpers
-from proto import project_pb2
-from proto import tracker_pb2
-from proto import user_pb2
+from mrproto import project_pb2
+from mrproto import tracker_pb2
+from mrproto import user_pb2
 from services import service_manager
 from services import issue_svc
 from services import tracker_fulltext
@@ -144,12 +143,9 @@
         project=fake.ProjectService())
     self.project = self.services.project.TestAddProject(
       'proj', project_id=987, committer_ids=[111])
-    self.next_servlet = issuedetailezt.FlipperNext(
-        'req', 'res', services=self.services)
-    self.prev_servlet = issuedetailezt.FlipperPrev(
-        'req', 'res', services=self.services)
-    self.list_servlet = issuedetailezt.FlipperList(
-        'req', 'res', services=self.services)
+    self.next_servlet = issuedetailezt.FlipperNext(services=self.services)
+    self.prev_servlet = issuedetailezt.FlipperPrev(services=self.services)
+    self.list_servlet = issuedetailezt.FlipperList(services=self.services)
     mr = testing_helpers.MakeMonorailRequest(project=self.project)
     mr.local_id = 123
     mr.me_user_id = 111
@@ -177,7 +173,7 @@
     patchGetAdjacentIssue.return_value = self.fake_issue_2
     self.next_servlet.mr.GetIntParam = mock.Mock(return_value=None)
 
-    self.next_servlet.get(project_name='proj', viewed_username=None)
+    self.next_servlet.get()
     self.next_servlet.mr.GetIntParam.assert_called_once_with('hotlist_id')
     patchGetAdjacentIssue.assert_called_once()
     self.next_servlet.redirect.assert_called_once_with(
@@ -189,7 +185,7 @@
     self.next_servlet.mr.GetIntParam = mock.Mock(return_value=123)
     # TODO(jeffcarp): Mock hotlist_id param on path here.
 
-    self.next_servlet.get(project_name='proj', viewed_username=None)
+    self.next_servlet.get()
     self.next_servlet.mr.GetIntParam.assert_called_with('hotlist_id')
     self.next_servlet.redirect.assert_called_once_with(
       '/p/potato/issues/detail?id=789')
@@ -199,7 +195,7 @@
     patchGetAdjacentIssue.return_value = self.fake_issue_2
     self.next_servlet.mr.GetIntParam = mock.Mock(return_value=None)
 
-    self.prev_servlet.get(project_name='proj', viewed_username=None)
+    self.prev_servlet.get()
     self.prev_servlet.mr.GetIntParam.assert_called_with('hotlist_id')
     patchGetAdjacentIssue.assert_called_once()
     self.prev_servlet.redirect.assert_called_once_with(
@@ -211,7 +207,7 @@
     self.prev_servlet.mr.GetIntParam = mock.Mock(return_value=123)
     # TODO(jeffcarp): Mock hotlist_id param on path here.
 
-    self.prev_servlet.get(project_name='proj', viewed_username=None)
+    self.prev_servlet.get()
     self.prev_servlet.mr.GetIntParam.assert_called_with('hotlist_id')
     self.prev_servlet.redirect.assert_called_once_with(
       '/p/potato/issues/detail?id=789')
diff --git a/tracker/test/issueentry_test.py b/tracker/test/issueentry_test.py
index b7461ae..b18f70b 100644
--- a/tracker/test/issueentry_test.py
+++ b/tracker/test/issueentry_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for the issueentry servlet."""
 from __future__ import print_function
@@ -19,7 +18,6 @@
 
 from google.appengine.ext import testbed
 from mock import Mock, patch
-import webapp2
 
 from framework import framework_bizobj
 from framework import framework_views
@@ -30,8 +28,8 @@
 from testing import testing_helpers
 from tracker import issueentry
 from tracker import tracker_bizobj
-from proto import tracker_pb2
-from proto import user_pb2
+from mrproto import tracker_pb2
+from mrproto import user_pb2
 
 
 class IssueEntryTest(unittest.TestCase):
@@ -51,10 +49,7 @@
         template=Mock(spec=template_svc.TemplateService),
         features=fake.FeaturesService())
     self.project = self.services.project.TestAddProject('proj', project_id=987)
-    request = webapp2.Request.blank('/p/proj/issues/entry')
-    response = webapp2.Response()
-    self.servlet = issueentry.IssueEntry(
-        request, response, services=self.services)
+    self.servlet = issueentry.IssueEntry(services=self.services)
     self.user = self.services.user.TestAddUser('to_pass_tests', 0)
     self.services.features.TestAddHotlist(
         name='dontcare', summary='', owner_ids=[0])
@@ -752,6 +747,46 @@
     self.assertEqual(field_values[0].int_value, 3)
     self.assertEqual(field_values[1].int_value, 3737)
 
+  def testProcessFormData_RejectNewLabels(self):
+    """We raise an AssertionError when new labels are added."""
+    mr = testing_helpers.MakeMonorailRequest(path='/p/proj/issues/entry')
+    mr.perms = permissions.USER_PERMISSIONSET
+    mr.auth.user_view = framework_views.StuffUserView(100, 'user@invalid', True)
+    post_data = fake.PostData(
+        template_name=['rutabaga'],
+        summary=['Nya nya I modified the summary'],
+        comment=[self.template.content],
+        status=['New'],
+        label=['freeze_new_label'])
+
+    self.mox.StubOutWithMock(self.servlet, 'PleaseCorrect')
+    self.servlet.PleaseCorrect(
+        mr,
+        component_required=None,
+        fields=[],
+        initial_blocked_on='',
+        initial_blocking='',
+        initial_cc='',
+        initial_comment=self.template.content,
+        initial_components='',
+        initial_owner='',
+        initial_status='New',
+        initial_summary='Nya nya I modified the summary',
+        initial_hotlists='',
+        labels=['freeze_new_label'],
+        template_name='rutabaga')
+    self.mox.ReplayAll()
+    url = self.servlet.ProcessFormData(mr, post_data)
+    self.mox.VerifyAll()
+    self.assertEqual(
+        (
+            "The creation of new labels is blocked for the Chromium project"
+            " in Monorail. To continue with editing your issue, please"
+            " remove: freeze_new_label label(s)."),
+        mr.errors.labels,
+    )
+    self.assertIsNone(url)
+
   def testProcessFormData_RejectRestrictedFields(self):
     """We raise an AssertionError when restricted fields are set w/o perms."""
     mr = testing_helpers.MakeMonorailRequest(
diff --git a/tracker/test/issueexport_test.py b/tracker/test/issueexport_test.py
index 4e70ab7..7d51c84 100644
--- a/tracker/test/issueexport_test.py
+++ b/tracker/test/issueexport_test.py
@@ -1,19 +1,19 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for the issueexport servlet."""
 from __future__ import print_function
 from __future__ import division
 from __future__ import absolute_import
 
+import six
 import unittest
 
 from mock import Mock, patch
 
 from framework import permissions
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import testing_helpers
 from testing import fake
@@ -32,10 +32,8 @@
     )
     self.cnxn = 'fake connection'
     self.project = self.services.project.TestAddProject('proj', project_id=789)
-    self.servlet = issueexport.IssueExport(
-        'req', 'res', services=self.services)
-    self.jsonfeed = issueexport.IssueExportJSON(
-        'req', 'res', services=self.services)
+    self.servlet = issueexport.IssueExport(services=self.services)
+    self.jsonfeed = issueexport.IssueExportJSON(services=self.services)
     self.mr = testing_helpers.MakeMonorailRequest(
         project=self.project, perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
     self.mr.can = 1
@@ -62,8 +60,8 @@
                      {'version': 1, 'who': None, 'when': 1234,
                       'project': 'proj', 'start': 0, 'num': 100})
     self.assertEqual(json_data['issues'], [])
-    self.assertItemsEqual(
-        json_data['emails'], ['user1@test.com', 'user2@test.com'])
+    six.assertCountEqual(
+        self, json_data['emails'], ['user1@test.com', 'user2@test.com'])
 
   # TODO(jojwang): test attachments, amendments, comment details
   def testMakeIssueJSON(self):
diff --git a/tracker/test/issueimport_test.py b/tracker/test/issueimport_test.py
index c0e38af..05c7526 100644
--- a/tracker/test/issueimport_test.py
+++ b/tracker/test/issueimport_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for the issueimport servlet."""
 from __future__ import print_function
@@ -14,15 +13,14 @@
 from services import service_manager
 from testing import testing_helpers
 from tracker import issueimport
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 
 
 class IssueExportTest(unittest.TestCase):
 
   def setUp(self):
     self.services = service_manager.Services()
-    self.servlet = issueimport.IssueImport(
-        'req', 'res', services=self.services)
+    self.servlet = issueimport.IssueImport(services=self.services)
     self.event_log = None
 
   def testAssertBasePermission(self):
@@ -37,6 +35,12 @@
   def testParseComment(self):
     """Test a Comment JSON is correctly parsed."""
     users_id_dict = {'adam@test.com': 111}
+    config = {
+        'component_defs': [{
+            'path': 'comp1',
+            'component_id': 1,
+        }],
+    }
     json = {
         'timestamp': 123,
         'commenter': 'adam@test.com',
@@ -46,7 +50,12 @@
         'description_num': None,
         }
     comment = self.servlet._ParseComment(
-        12, users_id_dict, json, self.event_log)
+        12,
+        users_id_dict,
+        json,
+        self.event_log,
+        config,
+    )
     self.assertEqual(
         comment, tracker_pb2.IssueComment(
             project_id=12, timestamp=123, user_id=111,
@@ -61,7 +70,7 @@
         'attachments': [],
     }
     desc_comment = self.servlet._ParseComment(
-        12, users_id_dict, json_desc, self.event_log)
+        12, users_id_dict, json_desc, self.event_log, config)
     self.assertEqual(
         desc_comment, tracker_pb2.IssueComment(
             project_id=12, timestamp=223, user_id=111,
diff --git a/tracker/test/issueoriginal_test.py b/tracker/test/issueoriginal_test.py
index 1b2b7d6..ff4e44e 100644
--- a/tracker/test/issueoriginal_test.py
+++ b/tracker/test/issueoriginal_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for the issueoriginal module."""
 from __future__ import print_function
@@ -11,13 +10,9 @@
 import mock
 import unittest
 
-import webapp2
-
 from framework import exceptions
-from framework import framework_helpers
-from framework import monorailrequest
 from framework import permissions
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -45,8 +40,7 @@
         config=fake.ConfigService(),
         issue=fake.IssueService(),
         user=fake.UserService())
-    self.servlet = issueoriginal.IssueOriginal(
-        'req', 'res', services=self.services)
+    self.servlet = issueoriginal.IssueOriginal(services=self.services)
 
     self.proj = self.services.project.TestAddProject('proj', project_id=789)
     summary = 'System wont boot'
@@ -171,14 +165,14 @@
     _request, mr = testing_helpers.GetRequestObjects(
         path='/p/proj/issues/original',
         project=self.proj)
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet.GatherPageData(mr)
     self.assertEqual(404, cm.exception.code)
 
     _request, mr = testing_helpers.GetRequestObjects(
         path='/p/proj/issues/original?id=1&seq=999',
         project=self.proj)
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet.GatherPageData(mr)
     self.assertEqual(404, cm.exception.code)
 
@@ -200,7 +194,7 @@
     _request, mr = testing_helpers.GetRequestObjects(
         path='/p/proj/issues/original?id=1&seq=99',
         project=self.proj)
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet._GetIssueAndComment(mr)
     self.assertEqual(404, cm.exception.code)
 
@@ -208,14 +202,14 @@
     _request, mr = testing_helpers.GetRequestObjects(
         path='/p/proj/issues/original',
         project=self.proj)
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet._GetIssueAndComment(mr)
     self.assertEqual(404, cm.exception.code)
 
     _request, mr = testing_helpers.GetRequestObjects(
         path='/p/proj/issues/original?id=1',
         project=self.proj)
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet._GetIssueAndComment(mr)
     self.assertEqual(404, cm.exception.code)
 
diff --git a/tracker/test/issuereindex_test.py b/tracker/test/issuereindex_test.py
index 715da9a..9929076 100644
--- a/tracker/test/issuereindex_test.py
+++ b/tracker/test/issuereindex_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for monorail.tracker.issuereindex."""
 from __future__ import print_function
@@ -17,7 +16,6 @@
 
 import settings
 from framework import permissions
-from framework import template_helpers
 from services import service_manager
 from services import tracker_fulltext
 from testing import fake
@@ -45,27 +43,25 @@
     # Non-members and contributors do not have permission to view this page.
     for permission in (permissions.USER_PERMISSIONSET,
                        permissions.COMMITTER_ACTIVE_PERMISSIONSET):
-      request, mr = testing_helpers.GetRequestObjects(
+      _, mr = testing_helpers.GetRequestObjects(
           project=self.project, perms=permission)
-      servlet = issuereindex.IssueReindex(
-          request, 'res', services=self.services)
+      servlet = issuereindex.IssueReindex(services=self.services)
     with self.assertRaises(permissions.PermissionException) as cm:
       servlet.AssertBasePermission(mr)
-    self.assertEqual('You are not allowed to administer this project',
-                     cm.exception.message)
+    self.assertEqual(
+        'You are not allowed to administer this project', str(cm.exception))
 
   def testAssertBasePermission_WithAccess(self):
     # Owners and admins have permission to view this page.
     for permission in (permissions.OWNER_ACTIVE_PERMISSIONSET,
                        permissions.ADMIN_PERMISSIONSET):
-      request, mr = testing_helpers.GetRequestObjects(
+      _, mr = testing_helpers.GetRequestObjects(
           project=self.project, perms=permission)
-      servlet = issuereindex.IssueReindex(
-          request, 'res', services=self.services)
+      servlet = issuereindex.IssueReindex(services=self.services)
       servlet.AssertBasePermission(mr)
 
   def testGatherPageData(self):
-    servlet = issuereindex.IssueReindex('req', 'res', services=self.services)
+    servlet = issuereindex.IssueReindex(services=self.services)
 
     mr = testing_helpers.MakeMonorailRequest()
     mr.auto_submit = True
@@ -76,7 +72,7 @@
     self.assertTrue(ret['page_perms'].CreateIssue)
 
   def _callProcessFormData(self, post_data, index_issue_1=True):
-    servlet = issuereindex.IssueReindex('req', 'res', services=self.services)
+    servlet = issuereindex.IssueReindex(services=self.services)
 
     mr = testing_helpers.MakeMonorailRequest(project=self.project)
     mr.cnxn = self.cnxn
@@ -103,13 +99,13 @@
     post_data = {'start': 1, 'num': 5}
     ret = self._callProcessFormData(post_data)
     self.assertEqual(
-        '/p/None/issues/reindex?start=6&auto_submit=False&num=5', ret)
+        '/p/None/issues/reindex?start=6&num=5&auto_submit=False', ret)
 
   def testProcessFormData_LargeInputs(self):
     post_data = {'start': 0, 'num': 10000000}
     ret = self._callProcessFormData(post_data)
     self.assertEqual(
-        '/p/None/issues/reindex?start=%s&auto_submit=False&num=%s' % (
+        '/p/None/issues/reindex?start=%s&num=%s&auto_submit=False' % (
             settings.max_artifact_search_results_per_page,
             settings.max_artifact_search_results_per_page), ret)
 
@@ -117,11 +113,11 @@
     post_data = {'start': 1, 'num': 5, 'auto_submit': 1}
     ret = self._callProcessFormData(post_data)
     self.assertEqual(
-        '/p/None/issues/reindex?start=6&auto_submit=True&num=5', ret)
+        '/p/None/issues/reindex?start=6&num=5&auto_submit=True', ret)
 
   def testProcessFormData_WithAutoSubmitButNoMoreIssues(self):
     """This project has no issues 6-10, so stop autosubmitting."""
     post_data = {'start': 6, 'num': 5, 'auto_submit': 1}
     ret = self._callProcessFormData(post_data, index_issue_1=False)
     self.assertEqual(
-        '/p/None/issues/reindex?start=11&auto_submit=False&num=5', ret)
+        '/p/None/issues/reindex?start=11&num=5&auto_submit=False', ret)
diff --git a/tracker/test/issuetips_test.py b/tracker/test/issuetips_test.py
index 44f5f70..9734b92 100644
--- a/tracker/test/issuetips_test.py
+++ b/tracker/test/issuetips_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for issuetips module."""
 from __future__ import print_function
@@ -24,8 +23,7 @@
         issue=fake.IssueService(),
         user=fake.UserService(),
         project=fake.ProjectService())
-    self.servlet = issuetips.IssueSearchTips(
-        'req', 'res', services=self.services)
+    self.servlet = issuetips.IssueSearchTips(services=self.services)
 
   def testGatherPageData(self):
     mr = testing_helpers.MakeMonorailRequest(path='/p/proj/issues/tips')
diff --git a/tracker/test/rerank_helpers_test.py b/tracker/test/rerank_helpers_test.py
index 47ddd47..d550f53 100644
--- a/tracker/test/rerank_helpers_test.py
+++ b/tracker/test/rerank_helpers_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for monorail.tracker.rerank_helpers."""
 from __future__ import print_function
diff --git a/tracker/test/tablecell_test.py b/tracker/test/tablecell_test.py
index c8b7292..e50efd2 100644
--- a/tracker/test/tablecell_test.py
+++ b/tracker/test/tablecell_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for issuelist module."""
 from __future__ import print_function
@@ -14,7 +13,7 @@
 from framework import framework_constants
 from framework import table_view_helpers
 from framework import template_helpers
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from testing import fake
 from testing import testing_helpers
 from tracker import tablecell
diff --git a/tracker/test/template_helpers_test.py b/tracker/test/template_helpers_test.py
index 6c4a034..982e8bd 100644
--- a/tracker/test/template_helpers_test.py
+++ b/tracker/test/template_helpers_test.py
@@ -1,7 +1,6 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittest for the template helpers module."""
 from __future__ import print_function
@@ -9,6 +8,7 @@
 from __future__ import absolute_import
 
 import logging
+import six
 import unittest
 
 import settings
@@ -18,7 +18,7 @@
 from testing import testing_helpers
 from tracker import template_helpers
 from tracker import tracker_bizobj
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 
 
 class TemplateHelpers(unittest.TestCase):
@@ -87,7 +87,7 @@
     self.assertFalse(parsed.component_required)
     self.assertFalse(parsed.owner_defaults_to_member)
     self.assertFalse(parsed.add_approvals)
-    self.assertItemsEqual(parsed.phase_names, ['', '', '', '', '', ''])
+    six.assertCountEqual(self, parsed.phase_names, ['', '', '', '', '', ''])
     self.assertEqual(parsed.approvals_to_phase_idx, {})
     self.assertEqual(parsed.required_approval_ids, [])
 
@@ -139,10 +139,11 @@
     self.assertFalse(parsed.owner_defaults_to_member)
     self.assertTrue(parsed.add_approvals)
     self.assertEqual(parsed.admin_str, 'jojwang@test.com, annajo@test.com')
-    self.assertItemsEqual(parsed.phase_names,
-                          ['Canary', 'Stable-Exp', 'Stable', '', '', 'Oops'])
+    six.assertCountEqual(
+        self, parsed.phase_names,
+        ['Canary', 'Stable-Exp', 'Stable', '', '', 'Oops'])
     self.assertEqual(parsed.approvals_to_phase_idx, {3: 2, 4: None})
-    self.assertItemsEqual(parsed.required_approval_ids, [3, 4])
+    six.assertCountEqual(self, parsed.required_approval_ids, [3, 4])
 
   def testGetTemplateInfoFromParsed_Normal(self):
     self.config.field_defs.extend([self.fd_1, self.fd_2])
@@ -269,8 +270,7 @@
     (prechecked_approvals, required_approval_ids,
      phases) = template_helpers.GatherApprovalsPageData(
          approval_values, tmpl_phases, self.config)
-    self.assertItemsEqual(prechecked_approvals,
-                          ['4_phase_0', '5'])
+    six.assertCountEqual(self, prechecked_approvals, ['4_phase_0', '5'])
     self.assertEqual(required_approval_ids, [4])
     self.assertEqual(phases[0], tmpl_phases[1])
     self.assertIsNone(phases[1].name)
@@ -280,8 +280,7 @@
     approvals_to_phase_idx = {23: 0, 25: 1, 26: None}
     checked = template_helpers.GetCheckedApprovalsFromParsed(
         approvals_to_phase_idx)
-    self.assertItemsEqual(checked,
-                          ['23_phase_0', '25_phase_1', '26'])
+    six.assertCountEqual(self, checked, ['23_phase_0', '25_phase_1', '26'])
 
   def testGetIssueFromTemplate(self):
     """Can fill and return the templated issue"""
diff --git a/tracker/test/templatecreate_test.py b/tracker/test/templatecreate_test.py
index 78664c0..442bf8b 100644
--- a/tracker/test/templatecreate_test.py
+++ b/tracker/test/templatecreate_test.py
@@ -1,7 +1,6 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit test for Template creation servlet."""
 from __future__ import print_function
@@ -27,7 +26,7 @@
 from tracker import templatecreate
 from tracker import tracker_bizobj
 from tracker import tracker_views
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 
 
 class TemplateCreateTest(unittest.TestCase):
@@ -40,8 +39,7 @@
         config=fake.ConfigService(),
         template=Mock(spec=template_svc.TemplateService),
         user=fake.UserService())
-    self.servlet = templatecreate.TemplateCreate('req', 'res',
-        services=self.services)
+    self.servlet = templatecreate.TemplateCreate(services=self.services)
     self.project = self.services.project.TestAddProject('proj')
 
     self.fd_1 = tracker_bizobj.MakeFieldDef(
@@ -372,6 +370,16 @@
                 tracker_pb2.ApprovalStatus.NEEDS_REVIEW), phase_id=1)
         ]
     self.services.template.CreateIssueTemplateDef.assert_called_once_with(
-        self.mr.cnxn, 47925, 'secondtemplate', 'HEY WHY', 'TLDR', True,
-        'Accepted', True, False, True, 0, ['label-One', 'label-Two'], [], [],
-        [fv], phases=phases, approval_values=approval_values)
+        self.mr.cnxn,
+        self.mr.project_id,
+        'secondtemplate',
+        'HEY WHY',
+        'TLDR',
+        True,
+        'Accepted',
+        True,
+        False,
+        True,
+        0, ['label-One', 'label-Two'], [], [], [fv],
+        phases=phases,
+        approval_values=approval_values)
diff --git a/tracker/test/templatedetail_test.py b/tracker/test/templatedetail_test.py
index 42fc46b..3968554 100644
--- a/tracker/test/templatedetail_test.py
+++ b/tracker/test/templatedetail_test.py
@@ -1,7 +1,6 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for Template editing/viewing servlet."""
 from __future__ import print_function
@@ -13,6 +12,7 @@
 except ImportError:
   import mox
 import logging
+import six
 import unittest
 import settings
 
@@ -27,7 +27,7 @@
 from testing import testing_helpers
 from tracker import templatedetail
 from tracker import tracker_bizobj
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 
 
 class TemplateDetailTest(unittest.TestCase):
@@ -41,8 +41,7 @@
                                              template=mock_template_service,
                                              usergroup=fake.UserGroupService(),
                                              user=fake.UserService())
-    self.servlet = templatedetail.TemplateDetail('req', 'res',
-                                               services=self.services)
+    self.servlet = templatedetail.TemplateDetail(services=self.services)
 
     self.services.user.TestAddUser('gatsby@example.com', 111)
     self.services.user.TestAddUser('sport@example.com', 222)
@@ -271,8 +270,8 @@
     self.assertTrue(page_data['initial_owner_defaults_to_member'])
     self.assertEqual(page_data['initial_components'], 'BackEnd')
     self.assertFalse(page_data['initial_component_required'])
-    self.assertItemsEqual(
-        page_data['labels'],
+    six.assertCountEqual(
+        self, page_data['labels'],
         ['label1', 'label2', 'GateTarget-Should-Not', 'GateTarget-Be-Masked'])
     self.assertEqual(page_data['initial_admins'], 'sport@example.com')
     self.assertTrue(page_data['initial_add_approvals'])
@@ -280,8 +279,8 @@
     phases = [phase for phase in page_data['initial_phases'] if phase.name]
     self.assertEqual(len(phases), 2)
     self.assertEqual(len(page_data['approvals']), 2)
-    self.assertItemsEqual(page_data['prechecked_approvals'],
-                          ['3_phase_0', '4_phase_1'])
+    six.assertCountEqual(
+        self, page_data['prechecked_approvals'], ['3_phase_0', '4_phase_1'])
     self.assertTrue(page_data['fields'][3].is_editable)  #nonRestrictedField
     self.assertIsNone(page_data['fields'][4].is_editable)  #restrictedField
 
@@ -439,7 +438,7 @@
 
     self.services.template.UpdateIssueTemplateDef.assert_called_once_with(
         self.mr.cnxn,
-        47925,
+        self.mr.project_id,
         12345,
         status='Accepted',
         component_required=True,
@@ -496,19 +495,32 @@
     self.assertTrue('/templates/detail?saved=1&template=TestTemplate&' in url)
 
     self.services.template.UpdateIssueTemplateDef.assert_called_once_with(
-        self.mr.cnxn, 47925, 12345, status='Accepted', component_required=True,
+        self.mr.cnxn,
+        self.mr.project_id,
+        12345,
+        status='Accepted',
+        component_required=True,
         phases=[
             tracker_pb2.Phase(name='Canary', rank=0, phase_id=0),
-            tracker_pb2.Phase(name='Stable', rank=1, phase_id=1)],
-        approval_values=[tracker_pb2.ApprovalValue(approval_id=3, phase_id=0),
-                         tracker_pb2.ApprovalValue(approval_id=4, phase_id=1)],
-        name='TestTemplate', field_values=[
+            tracker_pb2.Phase(name='Stable', rank=1, phase_id=1)
+        ],
+        approval_values=[
+            tracker_pb2.ApprovalValue(approval_id=3, phase_id=0),
+            tracker_pb2.ApprovalValue(approval_id=4, phase_id=1)
+        ],
+        name='TestTemplate',
+        field_values=[
             tracker_pb2.FieldValue(field_id=1, str_value='NO', derived=False),
-            tracker_pb2.FieldValue(
-                field_id=2, str_value='MOOD', derived=False)],
-        labels=['label-One', 'label-Two'], owner_defaults_to_member=True,
-        admin_ids=[], content='HEY WHY', component_ids=[1],
-        summary_must_be_edited=False, summary='TLDR', members_only=True,
+            tracker_pb2.FieldValue(field_id=2, str_value='MOOD', derived=False)
+        ],
+        labels=['label-One', 'label-Two'],
+        owner_defaults_to_member=True,
+        admin_ids=[],
+        content='HEY WHY',
+        component_ids=[1],
+        summary_must_be_edited=False,
+        summary='TLDR',
+        members_only=True,
         owner_id=333)
 
   def testProcessFormData_Delete(self):
@@ -521,4 +533,4 @@
 
     self.assertTrue('/p/None/adminTemplates?deleted=1' in url)
     self.services.template.DeleteIssueTemplateDef\
-        .assert_called_once_with(self.mr.cnxn, 47925, 12345)
+        .assert_called_once_with(self.mr.cnxn, self.mr.project_id, 12345)
diff --git a/tracker/test/tracker_bizobj_test.py b/tracker/test/tracker_bizobj_test.py
index 29351b0..603b7c5 100644
--- a/tracker/test/tracker_bizobj_test.py
+++ b/tracker/test/tracker_bizobj_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for issue  bizobj functions."""
 from __future__ import print_function
@@ -10,10 +9,11 @@
 
 import unittest
 import logging
+import six
 
 from framework import framework_constants
 from framework import framework_views
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -77,8 +77,8 @@
     av_2 = tracker_pb2.ApprovalValue()
     av_3 = tracker_pb2.ApprovalValue(approver_ids=[222, 333])
     issue.approval_values = [av_1, av_2, av_3]
-    self.assertItemsEqual(
-        tracker_bizobj.GetApproverIds(issue), [111, 222, 333])
+    six.assertCountEqual(
+        self, tracker_bizobj.GetApproverIds(issue), [111, 222, 333])
 
   def testGetLabels(self):
     issue = tracker_pb2.Issue()
@@ -179,9 +179,9 @@
     config.field_defs = [subfd_1, subfd_2, subfd_3, subfd_4]
 
     subfields_dict = tracker_bizobj.FindApprovalsSubfields([1, 2], config)
-    self.assertItemsEqual(subfields_dict[1], [subfd_1, subfd_3])
-    self.assertItemsEqual(subfields_dict[2], [subfd_2])
-    self.assertItemsEqual(subfields_dict[3], [])
+    six.assertCountEqual(self, subfields_dict[1], [subfd_1, subfd_3])
+    six.assertCountEqual(self, subfields_dict[2], [subfd_2])
+    six.assertCountEqual(self, subfields_dict[3], [])
 
   def testFindPhaseByID_Normal(self):
     canary_phase = tracker_pb2.Phase(phase_id=2, name='Canary')
@@ -758,7 +758,7 @@
 
   def CheckDefaultConfig(self, config):
     self.assertTrue(len(config.well_known_statuses) > 0)
-    self.assertTrue(config.statuses_offer_merge > 0)
+    self.assertTrue(len(config.statuses_offer_merge) > 0)
     self.assertTrue(len(config.well_known_labels) > 0)
     self.assertTrue(len(config.exclusive_label_prefixes) > 0)
     # TODO(jrobbins): test actual values from default config
@@ -839,10 +839,10 @@
          'Pri-4'],
         result_labels[:result_labels.index('OpSys-All')])
     self.assertEqual('Pri -status', harmonized.default_sort_spec.strip())
-    self.assertItemsEqual(c1.field_defs + c2.field_defs,
-                          harmonized.field_defs)
-    self.assertItemsEqual(c1.approval_defs + c2.approval_defs,
-                          harmonized.approval_defs)
+    six.assertCountEqual(
+        self, c1.field_defs + c2.field_defs, harmonized.field_defs)
+    six.assertCountEqual(
+        self, c1.approval_defs + c2.approval_defs, harmonized.approval_defs)
 
   def testHarmonizeConfigsMeansOpen(self):
     c1 = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
@@ -1778,8 +1778,8 @@
             default_project_name=issue.project_name)
     ]
     self.assertEqual(actual_amendments, expected_amendments)
-    self.assertItemsEqual(
-        actual_impacted_iids, [
+    six.assertCountEqual(
+        self, actual_impacted_iids, [
             blocked_on_add.issue_id, blocking_add.issue_id, blocked_on.issue_id,
             blocking.issue_id
         ])
@@ -1868,46 +1868,46 @@
 
   def testDiffValueLists(self):
     added, removed = tracker_bizobj.DiffValueLists([], [])
-    self.assertItemsEqual([], added)
-    self.assertItemsEqual([], removed)
+    six.assertCountEqual(self, [], added)
+    six.assertCountEqual(self, [], removed)
 
     added, removed = tracker_bizobj.DiffValueLists([], None)
-    self.assertItemsEqual([], added)
-    self.assertItemsEqual([], removed)
+    six.assertCountEqual(self, [], added)
+    six.assertCountEqual(self, [], removed)
 
     added, removed = tracker_bizobj.DiffValueLists([1, 2], [])
-    self.assertItemsEqual([1, 2], added)
-    self.assertItemsEqual([], removed)
+    six.assertCountEqual(self, [1, 2], added)
+    six.assertCountEqual(self, [], removed)
 
     added, removed = tracker_bizobj.DiffValueLists([], [8, 9])
-    self.assertItemsEqual([], added)
-    self.assertItemsEqual([8, 9], removed)
+    six.assertCountEqual(self, [], added)
+    six.assertCountEqual(self, [8, 9], removed)
 
     added, removed = tracker_bizobj.DiffValueLists([1, 2], [8, 9])
-    self.assertItemsEqual([1, 2], added)
-    self.assertItemsEqual([8, 9], removed)
+    six.assertCountEqual(self, [1, 2], added)
+    six.assertCountEqual(self, [8, 9], removed)
 
     added, removed = tracker_bizobj.DiffValueLists([1, 2, 5, 6], [5, 6, 8, 9])
-    self.assertItemsEqual([1, 2], added)
-    self.assertItemsEqual([8, 9], removed)
+    six.assertCountEqual(self, [1, 2], added)
+    six.assertCountEqual(self, [8, 9], removed)
 
     added, removed = tracker_bizobj.DiffValueLists([5, 6], [5, 6, 8, 9])
-    self.assertItemsEqual([], added)
-    self.assertItemsEqual([8, 9], removed)
+    six.assertCountEqual(self, [], added)
+    six.assertCountEqual(self, [8, 9], removed)
 
     added, removed = tracker_bizobj.DiffValueLists([1, 2, 5, 6], [5, 6])
-    self.assertItemsEqual([1, 2], added)
-    self.assertItemsEqual([], removed)
+    six.assertCountEqual(self, [1, 2], added)
+    six.assertCountEqual(self, [], removed)
 
     added, removed = tracker_bizobj.DiffValueLists(
         [1, 2, 2, 5, 6], [5, 6, 8, 9])
-    self.assertItemsEqual([1, 2, 2], added)
-    self.assertItemsEqual([8, 9], removed)
+    six.assertCountEqual(self, [1, 2, 2], added)
+    six.assertCountEqual(self, [8, 9], removed)
 
     added, removed = tracker_bizobj.DiffValueLists(
         [1, 2, 5, 6], [5, 6, 8, 8, 9])
-    self.assertItemsEqual([1, 2], added)
-    self.assertItemsEqual([8, 8, 9], removed)
+    six.assertCountEqual(self, [1, 2], added)
+    six.assertCountEqual(self, [8, 8, 9], removed)
 
   def testMakeFieldAmendment_NoSuchFieldDef(self):
     config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
@@ -2053,7 +2053,10 @@
         tracker_pb2.ComponentDef(component_id=2, path='DB')]
     self.assertEqual(
         tracker_bizobj.MakeAmendment(
-            tracker_pb2.FieldID.COMPONENTS, '-UI DB', [], []),
+            tracker_pb2.FieldID.COMPONENTS,
+            '-UI DB', [], [],
+            added_component_ids=[2],
+            removed_component_ids=[1]),
         tracker_bizobj.MakeComponentsAmendment([2], [1], config))
 
   def testMakeBlockedOnAmendment(self):
diff --git a/tracker/test/tracker_helpers_test.py b/tracker/test/tracker_helpers_test.py
index 4f89cc9..b7e930b 100644
--- a/tracker/test/tracker_helpers_test.py
+++ b/tracker/test/tracker_helpers_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2022 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittest for the tracker helpers module."""
 from __future__ import print_function
@@ -11,6 +10,8 @@
 import copy
 import mock
 import unittest
+import io
+import six
 
 import settings
 
@@ -21,15 +22,16 @@
 from framework import permissions
 from framework import template_helpers
 from framework import urls
-from proto import project_pb2
-from proto import tracker_pb2
-from proto import user_pb2
+from mrproto import project_pb2
+from mrproto import tracker_pb2
+from mrproto import user_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
 from tracker import tracker_bizobj
 from tracker import tracker_constants
 from tracker import tracker_helpers
+from werkzeug.datastructures import FileStorage
 
 TEST_ID_MAP = {
     'a@example.com': 1,
@@ -166,39 +168,39 @@
 
     add, remove = tracker_helpers._ClassifyPlusMinusItems(
         ['', ' ', '  \t', '-'])
-    self.assertItemsEqual([], add)
-    self.assertItemsEqual([], remove)
+    six.assertCountEqual(self, [], add)
+    six.assertCountEqual(self, [], remove)
 
     add, remove = tracker_helpers._ClassifyPlusMinusItems(
         ['a', 'b', 'c'])
-    self.assertItemsEqual(['a', 'b', 'c'], add)
-    self.assertItemsEqual([], remove)
+    six.assertCountEqual(self, ['a', 'b', 'c'], add)
+    six.assertCountEqual(self, [], remove)
 
     add, remove = tracker_helpers._ClassifyPlusMinusItems(
         ['a-a-a', 'b-b', 'c-'])
-    self.assertItemsEqual(['a-a-a', 'b-b', 'c-'], add)
-    self.assertItemsEqual([], remove)
+    six.assertCountEqual(self, ['a-a-a', 'b-b', 'c-'], add)
+    six.assertCountEqual(self, [], remove)
 
     add, remove = tracker_helpers._ClassifyPlusMinusItems(
         ['-a'])
-    self.assertItemsEqual([], add)
-    self.assertItemsEqual(['a'], remove)
+    six.assertCountEqual(self, [], add)
+    six.assertCountEqual(self, ['a'], remove)
 
     add, remove = tracker_helpers._ClassifyPlusMinusItems(
         ['-a', 'b', 'c-c'])
-    self.assertItemsEqual(['b', 'c-c'], add)
-    self.assertItemsEqual(['a'], remove)
+    six.assertCountEqual(self, ['b', 'c-c'], add)
+    six.assertCountEqual(self, ['a'], remove)
 
     add, remove = tracker_helpers._ClassifyPlusMinusItems(
         ['-a', '-b-b', '-c-'])
-    self.assertItemsEqual([], add)
-    self.assertItemsEqual(['a', 'b-b', 'c-'], remove)
+    six.assertCountEqual(self, [], add)
+    six.assertCountEqual(self, ['a', 'b-b', 'c-'], remove)
 
     # We dedup, but we don't cancel out items that are both added and removed.
     add, remove = tracker_helpers._ClassifyPlusMinusItems(
         ['a', 'a', '-a'])
-    self.assertItemsEqual(['a'], add)
-    self.assertItemsEqual(['a'], remove)
+    six.assertCountEqual(self, ['a'], add)
+    six.assertCountEqual(self, ['a'], remove)
 
   def testParseIssueRequestFields(self):
     parsed_fields = tracker_helpers._ParseIssueRequestFields(fake.PostData({
@@ -227,22 +229,25 @@
             }}))
 
   def testParseIssueRequestAttachments(self):
-    file1 = testing_helpers.Blank(
+    file1 = FileStorage(
+        stream=io.BytesIO(b'hello world'),
         filename='hello.c',
-        value='hello world')
-
-    file2 = testing_helpers.Blank(
+    )
+    file2 = FileStorage(
+        stream=io.BytesIO(b'Welcome to our project'),
         filename='README',
-        value='Welcome to our project')
+    )
 
-    file3 = testing_helpers.Blank(
+    file3 = FileStorage(
+        stream=io.BytesIO(b'Abort, Retry, or Fail?'),
         filename='c:\\dir\\subdir\\FILENAME.EXT',
-        value='Abort, Retry, or Fail?')
+    )
 
     # Browsers send this if FILE field was not filled in.
-    file4 = testing_helpers.Blank(
+    file4 = FileStorage(
+        stream=io.BytesIO(b''),
         filename='',
-        value='')
+    )
 
     attachments = tracker_helpers._ParseIssueRequestAttachments({})
     self.assertEqual([], attachments)
@@ -250,26 +255,31 @@
     attachments = tracker_helpers._ParseIssueRequestAttachments(fake.PostData({
         'file1': [file1],
         }))
-    self.assertEqual(
-        [('hello.c', 'hello world', 'text/plain')],
-        attachments)
+    self.assertEqual([('hello.c', b'hello world', 'text/plain')], attachments)
+    file1.seek(0)
 
     attachments = tracker_helpers._ParseIssueRequestAttachments(fake.PostData({
         'file1': [file1],
         'file2': [file2],
         }))
     self.assertEqual(
-        [('hello.c', 'hello world', 'text/plain'),
-         ('README', 'Welcome to our project', 'text/plain')],
-        attachments)
+        [
+            ('hello.c', b'hello world', 'text/plain'),
+            ('README', b'Welcome to our project', 'text/plain')
+        ], attachments)
+    file1.seek(0)
+    file2.seek(0)
 
     attachments = tracker_helpers._ParseIssueRequestAttachments(fake.PostData({
         'file3': [file3],
         }))
     self.assertEqual(
-        [('FILENAME.EXT', 'Abort, Retry, or Fail?',
-          'application/octet-stream')],
-        attachments)
+        [
+            (
+                'FILENAME.EXT', b'Abort, Retry, or Fail?',
+                'application/octet-stream')
+        ], attachments)
+    file3.seek(0)
 
     attachments = tracker_helpers._ParseIssueRequestAttachments(fake.PostData({
         'file1': [file4],  # Does not appear in result
@@ -277,9 +287,12 @@
         'file4': [file4],  # Does not appear in result
         }))
     self.assertEqual(
-        [('FILENAME.EXT', 'Abort, Retry, or Fail?',
-          'application/octet-stream')],
-        attachments)
+        [
+            (
+                'FILENAME.EXT', b'Abort, Retry, or Fail?',
+                'application/octet-stream')
+        ], attachments)
+    file3.seek(0)
 
   def testParseIssueRequestKeptAttachments(self):
     pass  # TODO(jrobbins): Write this test.
@@ -368,12 +381,12 @@
     self.assertEqual('', parsed_users.owner_username)
     self.assertEqual(
         framework_constants.NO_USER_SPECIFIED, parsed_users.owner_id)
-    self.assertItemsEqual(['c@example.com', 'a@example.com'],
-                          parsed_users.cc_usernames)
+    six.assertCountEqual(
+        self, ['c@example.com', 'a@example.com'], parsed_users.cc_usernames)
     self.assertEqual(['b@example.com'], parsed_users.cc_usernames_remove)
-    self.assertItemsEqual([TEST_ID_MAP['c@example.com'],
-                           TEST_ID_MAP['a@example.com']],
-                          parsed_users.cc_ids)
+    six.assertCountEqual(
+        self, [TEST_ID_MAP['c@example.com'], TEST_ID_MAP['a@example.com']],
+        parsed_users.cc_ids)
     self.assertEqual([TEST_ID_MAP['b@example.com']],
                       parsed_users.cc_ids_remove)
 
@@ -386,11 +399,12 @@
     self.assertEqual('fuhqwhgads@example.com', parsed_users.owner_username)
     gen_uid = framework_helpers.MurmurHash3_x86_32(parsed_users.owner_username)
     self.assertEqual(gen_uid, parsed_users.owner_id)  # autocreated user
-    self.assertItemsEqual(
-        ['c@example.com', 'fuhqwhgads@example.com'], parsed_users.cc_usernames)
+    six.assertCountEqual(
+        self, ['c@example.com', 'fuhqwhgads@example.com'],
+        parsed_users.cc_usernames)
     self.assertEqual([], parsed_users.cc_usernames_remove)
-    self.assertItemsEqual(
-       [TEST_ID_MAP['c@example.com'], gen_uid], parsed_users.cc_ids)
+    six.assertCountEqual(
+        self, [TEST_ID_MAP['c@example.com'], gen_uid], parsed_users.cc_ids)
     self.assertEqual([], parsed_users.cc_ids_remove)
 
     post_data = fake.PostData({
@@ -398,12 +412,12 @@
         })
     parsed_users = tracker_helpers._ParseIssueRequestUsers(
         'fake connection', post_data, self.services)
-    self.assertItemsEqual(
-        ['c@example.com', 'b@example.com'], parsed_users.cc_usernames)
+    six.assertCountEqual(
+        self, ['c@example.com', 'b@example.com'], parsed_users.cc_usernames)
     self.assertEqual([], parsed_users.cc_usernames_remove)
-    self.assertItemsEqual(
-       [TEST_ID_MAP['c@example.com'], TEST_ID_MAP['b@example.com']],
-       parsed_users.cc_ids)
+    six.assertCountEqual(
+        self, [TEST_ID_MAP['c@example.com'], TEST_ID_MAP['b@example.com']],
+        parsed_users.cc_ids)
     self.assertEqual([], parsed_users.cc_ids_remove)
 
   def testParseBlockers_BlockedOnNothing(self):
@@ -698,9 +712,9 @@
   @mock.patch('tracker.tracker_constants.ISSUE_ATTACHMENTS_QUOTA_HARD', 1)
   def testComputeNewQuotaBytesUsed_ProjectQuota(self):
     upload_1 = framework_helpers.AttachmentUpload(
-        'matter not', 'three men make a tiger', 'matter not')
+        'matter not', b'three men make a tiger', 'matter not')
     upload_2 = framework_helpers.AttachmentUpload(
-        'matter not', 'chicken', 'matter not')
+        'matter not', b'chicken', 'matter not')
     attachments = [upload_1, upload_2]
 
     project = fake.Project()
@@ -713,7 +727,7 @@
     self.assertEqual(actual_new, expected_new)
 
     upload_3 = framework_helpers.AttachmentUpload(
-        'matter not', 'donut', 'matter not')
+        'matter not', b'donut', 'matter not')
     attachments.append(upload_3)
     with self.assertRaises(exceptions.OverAttachmentQuota):
       tracker_helpers.ComputeNewQuotaBytesUsed(project, attachments)
@@ -722,7 +736,7 @@
       'tracker.tracker_constants.ISSUE_ATTACHMENTS_QUOTA_HARD', len('tiger'))
   def testComputeNewQuotaBytesUsed_GeneralQuota(self):
     upload_1 = framework_helpers.AttachmentUpload(
-        'matter not', 'tiger', 'matter not')
+        'matter not', b'tiger', 'matter not')
     attachments = [upload_1]
 
     project = fake.Project()
@@ -732,13 +746,13 @@
     self.assertEqual(actual_new, expected_new)
 
     upload_2 = framework_helpers.AttachmentUpload(
-        'matter not', 'donut', 'matter not')
+        'matter not', b'donut', 'matter not')
     attachments.append(upload_2)
     with self.assertRaises(exceptions.OverAttachmentQuota):
       tracker_helpers.ComputeNewQuotaBytesUsed(project, attachments)
 
     upload_3 = framework_helpers.AttachmentUpload(
-        'matter not', 'donut', 'matter not')
+        'matter not', b'donut', 'matter not')
     attachments.append(upload_3)
     with self.assertRaises(exceptions.OverAttachmentQuota):
       tracker_helpers.ComputeNewQuotaBytesUsed(project, attachments)
@@ -901,7 +915,7 @@
 
   # ParseMergeFields is tested in IssueMergeTest.
   # AddIssueStarrers is tested in IssueMergeTest.testMergeIssueStars().
-  # IsMergeAllowed is tested in IssueMergeTest.
+  # CanEditProjectIssue is tested in IssueMergeTest.
 
   def testPairDerivedValuesWithRuleExplanations_Nothing(self):
     """Test we return nothing for an issue with no derived values."""
@@ -990,8 +1004,9 @@
     issue_list = [self.issue1, self.issue2, self.issue3]
     users_by_id = tracker_helpers.MakeViewsForUsersInIssues(
         'fake cnxn', issue_list, self.user)
-    self.assertItemsEqual([0, 1, 1001, 1002, 1003, 2001, 2002, 3002],
-                          list(users_by_id.keys()))
+    six.assertCountEqual(
+        self, [0, 1, 1001, 1002, 1003, 2001, 2002, 3002],
+        list(users_by_id.keys()))
     for user_id in [1001, 1002, 1003, 2001]:
       self.assertEqual(users_by_id[user_id].user_id, user_id)
 
@@ -999,8 +1014,8 @@
     issue_list = [self.issue1, self.issue2, self.issue3]
     users_by_id = tracker_helpers.MakeViewsForUsersInIssues(
         'fake cnxn', issue_list, self.user, omit_ids=[1001, 1003])
-    self.assertItemsEqual([0, 1, 1002, 2001, 2002, 3002],
-        list(users_by_id.keys()))
+    six.assertCountEqual(
+        self, [0, 1, 1002, 2001, 2002, 3002], list(users_by_id.keys()))
     for user_id in [1002, 2001, 2002, 3002]:
       self.assertEqual(users_by_id[user_id].user_id, user_id)
 
@@ -1008,7 +1023,7 @@
     issue_list = []
     users_by_id = tracker_helpers.MakeViewsForUsersInIssues(
         'fake cnxn', issue_list, self.user)
-    self.assertItemsEqual([], list(users_by_id.keys()))
+    six.assertCountEqual(self, [], list(users_by_id.keys()))
 
 
 class GetAllIssueProjectsTest(unittest.TestCase):
@@ -1236,19 +1251,34 @@
     self.assertEqual(str(mergee_issue.local_id), text)
     self.assertEqual(mergee_issue, merge_into_issue)
 
-  def testIsMergeAllowed(self):
+  def testCanEditProjectIssue(self):
     mr = testing_helpers.MakeMonorailRequest()
-    issue = fake.MakeTestIssue(987, 1, 'summary', 'New', 111)
+    issue = fake.MakeTestIssue(
+        self.project.project_id, 1, 'summary', 'New', 111)
     issue.project_name = self.project.project_name
 
-    for (perm_set, expected_merge_allowed) in (
-            (permissions.READ_ONLY_PERMISSIONSET, False),
-            (permissions.COMMITTER_INACTIVE_PERMISSIONSET, False),
-            (permissions.COMMITTER_ACTIVE_PERMISSIONSET, True),
-            (permissions.OWNER_ACTIVE_PERMISSIONSET, True)):
-      mr.perms = perm_set
-      merge_allowed = tracker_helpers.IsMergeAllowed(issue, mr, self.services)
-      self.assertEqual(expected_merge_allowed, merge_allowed)
+    non_member_not_allowed = tracker_helpers.CanEditProjectIssue(
+        mr, self.project, issue, None)
+    self.assertEqual(False, non_member_not_allowed)
+
+    committer_id = 3
+    self.project.committer_ids.extend([committer_id])
+    mr.auth.effective_ids.add(committer_id)
+    committer_allowed = tracker_helpers.CanEditProjectIssue(
+        mr, self.project, issue, None)
+    self.assertEqual(True, committer_allowed)
+
+    self.project.state = project_pb2.ProjectState.ARCHIVED
+    committer_read_only_not_allowed = tracker_helpers.CanEditProjectIssue(
+        mr, self.project, issue, None)
+    self.assertEqual(False, committer_read_only_not_allowed)
+
+    owner_id = 1
+    self.project.owner_ids.extend([owner_id])
+    mr.auth.effective_ids.add(owner_id)
+    owner_read_only_not_allowed = tracker_helpers.CanEditProjectIssue(
+        mr, self.project, issue, None)
+    self.assertEqual(False, owner_read_only_not_allowed)
 
   def testMergeIssueStars(self):
     mr = testing_helpers.MakeMonorailRequest()
@@ -1276,13 +1306,13 @@
 
     new_starrers = tracker_helpers.GetNewIssueStarrers(
         self.cnxn, self.services, [1, 3], 2)
-    self.assertItemsEqual(new_starrers, [1, 2, 6])
+    six.assertCountEqual(self, new_starrers, [1, 2, 6])
     tracker_helpers.AddIssueStarrers(
         self.cnxn, self.services, mr, 2, self.project, new_starrers)
     issue_2_starrers = self.services.issue_star.LookupItemStarrers(
         self.cnxn, 2)
     # XXX(jrobbins): these tests incorrectly mix local IDs with IIDs.
-    self.assertItemsEqual([1, 2, 3, 4, 5, 6], issue_2_starrers)
+    six.assertCountEqual(self, [1, 2, 3, 4, 5, 6], issue_2_starrers)
 
 
 class MergeLinkedMembersTest(unittest.TestCase):
@@ -1345,58 +1375,61 @@
   def testUnsignedUser_NormalProject(self):
     visible_members = self.DoFiltering(
         permissions.READ_ONLY_PERMISSIONSET, unsigned_user=True)
-    self.assertItemsEqual(
-        [self.owner_email, self.committer_email, self.contributor_email,
-         self.indirect_member_email],
-        visible_members)
+    six.assertCountEqual(
+        self, [
+            self.owner_email, self.committer_email, self.contributor_email,
+            self.indirect_member_email
+        ], visible_members)
 
   def testUnsignedUser_RestrictedProject(self):
     self.project.only_owners_see_contributors = True
     visible_members = self.DoFiltering(
         permissions.READ_ONLY_PERMISSIONSET, unsigned_user=True)
-    self.assertItemsEqual(
+    six.assertCountEqual(
+        self,
         [self.owner_email, self.committer_email, self.indirect_member_email],
         visible_members)
 
   def testOwnersAndAdminsCanSeeAll_NormalProject(self):
     visible_members = self.DoFiltering(
         permissions.OWNER_ACTIVE_PERMISSIONSET)
-    self.assertItemsEqual(self.all_emails, visible_members)
+    six.assertCountEqual(self, self.all_emails, visible_members)
 
     visible_members = self.DoFiltering(
         permissions.ADMIN_PERMISSIONSET)
-    self.assertItemsEqual(self.all_emails, visible_members)
+    six.assertCountEqual(self, self.all_emails, visible_members)
 
   def testOwnersAndAdminsCanSeeAll_HubAndSpoke(self):
     self.project.only_owners_see_contributors = True
 
     visible_members = self.DoFiltering(
         permissions.OWNER_ACTIVE_PERMISSIONSET)
-    self.assertItemsEqual(self.all_emails, visible_members)
+    six.assertCountEqual(self, self.all_emails, visible_members)
 
     visible_members = self.DoFiltering(
         permissions.ADMIN_PERMISSIONSET)
-    self.assertItemsEqual(self.all_emails, visible_members)
+    six.assertCountEqual(self, self.all_emails, visible_members)
 
     visible_members = self.DoFiltering(
         permissions.COMMITTER_ACTIVE_PERMISSIONSET)
-    self.assertItemsEqual(self.all_emails, visible_members)
+    six.assertCountEqual(self, self.all_emails, visible_members)
 
   def testNonOwnersCanSeeAll_NormalProject(self):
     visible_members = self.DoFiltering(
         permissions.COMMITTER_ACTIVE_PERMISSIONSET)
-    self.assertItemsEqual(self.all_emails, visible_members)
+    six.assertCountEqual(self, self.all_emails, visible_members)
 
     visible_members = self.DoFiltering(
         permissions.CONTRIBUTOR_ACTIVE_PERMISSIONSET)
-    self.assertItemsEqual(self.all_emails, visible_members)
+    six.assertCountEqual(self, self.all_emails, visible_members)
 
   def testCommittersSeeOnlySameDomain_HubAndSpoke(self):
     self.project.only_owners_see_contributors = True
 
     visible_members = self.DoFiltering(
         permissions.CONTRIBUTOR_ACTIVE_PERMISSIONSET)
-    self.assertItemsEqual(
+    six.assertCountEqual(
+        self,
         [self.owner_email, self.committer_email, self.indirect_member_email],
         visible_members)
 
@@ -1618,29 +1651,44 @@
     tracker_helpers.AssertValidIssueForCreate(
         self.cnxn, self.services, input_issue, 'nonempty description')
 
+  def testAssertValidIssueForCreate_ValidatesLabels(self):
+    input_issue = tracker_pb2.Issue(
+        summary='sum',
+        labels=['freeze_new_label'],
+        status='New',
+        owner_id=111,
+        project_id=789)
+    with self.assertRaisesRegex(
+        exceptions.InputException,
+        ("The creation of new labels is blocked for the Chromium project"
+         " in Monorail. To continue with editing your issue, please"
+         " remove: freeze_new_label label\\(s\\)")):
+      tracker_helpers.AssertValidIssueForCreate(
+          self.cnxn, self.services, input_issue, 'nonempty description')
+
   def testAssertValidIssueForCreate_ValidatesOwner(self):
     input_issue = tracker_pb2.Issue(
         summary='sum', status='New', owner_id=222, project_id=789)
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 'Issue owner must be a project member'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Issue owner must be a project member'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
     input_issue.owner_id = 333
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 'Issue owner user ID not found'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Issue owner user ID not found'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
     input_issue.owner_id = 999
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 'Issue owner cannot be a user group'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Issue owner cannot be a user group'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
 
   def testAssertValidIssueForCreate_ValidatesSummary(self):
     input_issue = tracker_pb2.Issue(
         summary='', status='New', owner_id=111, project_id=789)
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 'Summary is required'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Summary is required'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
       input_issue.summary = '   '
@@ -1650,8 +1698,8 @@
   def testAssertValidIssueForCreate_ValidatesDescription(self):
     input_issue = tracker_pb2.Issue(
         summary='sum', status='New', owner_id=111, project_id=789)
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 'Description is required'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Description is required'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, '')
       tracker_helpers.AssertValidIssueForCreate(
@@ -1678,8 +1726,8 @@
       return None
 
     self.services.config.LookupStatusID = mock_status_lookup
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 'Undefined status: DNE_status'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Undefined status: DNE_status'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
 
@@ -1691,9 +1739,8 @@
         owner_id=111,
         project_id=789,
         component_ids=[3])
-    with self.assertRaisesRegexp(
-        exceptions.InputException,
-        'Undefined or deprecated component with id: 3'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Undefined or deprecated component with id: 3'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
 
@@ -1704,9 +1751,8 @@
         owner_id=111,
         project_id=789,
         component_ids=[self.component_def_2.component_id])
-    with self.assertRaisesRegexp(
-        exceptions.InputException,
-        'Undefined or deprecated component with id: 2'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                'Undefined or deprecated component with id: 2'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
 
@@ -1728,8 +1774,8 @@
                 user_fd.field_id, None, None, 124, None, None, False)
         ])
     copied_issue = copy.deepcopy(input_issue)
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 r'users/123: .+\nusers/124: .+'):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                r'users/123: .+\nusers/124: .+'):
       tracker_helpers.AssertValidIssueForCreate(
           self.cnxn, self.services, input_issue, 'nonempty description')
     self.assertEqual(input_issue, copied_issue)
@@ -1894,7 +1940,7 @@
     expected_merge_add = copy.deepcopy(merge_add)
     expected_merge_add.assume_stale = False
     # We are adding 333 and removing 222 in issue_main with delta_main.
-    expected_merge_add.cc_ids = [expected_main.owner_id, 333, 111]
+    expected_merge_add.cc_ids = sorted([expected_main.owner_id, 111, 333])
     expected_merged_from_add[expected_merge_add.issue_id] = [
         issue_main.issue_id
     ]
@@ -2086,9 +2132,9 @@
     ]
 
     upload_1 = framework_helpers.AttachmentUpload(
-        'dragon', 'OOOOOO\n', 'text/plain')
+        'dragon', b'OOOOOO\n', 'text/plain')
     upload_2 = framework_helpers.AttachmentUpload(
-        'snake', 'ooooo\n', 'text/plain')
+        'snake', b'ooooo\n', 'text/plain')
     attachment_uploads = [upload_1, upload_2]
 
     actual = tracker_helpers._EnforceAttachmentQuotaLimits(
@@ -2118,13 +2164,13 @@
     ]
 
     upload_1 = framework_helpers.AttachmentUpload(
-        'dragon', 'OOOOOO\n', 'text/plain')
+        'dragon', b'OOOOOO\n', 'text/plain')
     upload_2 = framework_helpers.AttachmentUpload(
-        'snake', 'ooooo\n', 'text/plain')
+        'snake', b'ooooo\n', 'text/plain')
     attachment_uploads = [upload_1, upload_2]
 
-    with self.assertRaisesRegexp(exceptions.OverAttachmentQuota,
-                                 r'.+ project Patroclus\n.+ project Circe'):
+    with self.assertRaisesRegex(exceptions.OverAttachmentQuota,
+                                r'.+ project Patroclus\n.+ project Circe'):
       tracker_helpers._EnforceAttachmentQuotaLimits(
           self.cnxn, issue_delta_pairs, self.services, attachment_uploads)
 
@@ -2225,6 +2271,21 @@
             delta_8, delta_9, delta_10, delta_11
         ])
 
+  def testAssertIssueChangesValid_ValidatesLabels(self):
+    """Asserts labels."""
+    issue_1 = _Issue('chicken', 1)
+    self.services.issue.TestAddIssue(issue_1)
+    delta_1 = tracker_pb2.IssueDelta(labels_add=['freeze_new_label'])
+    issue_delta_pairs = [(issue_1, delta_1)]
+    comment = 'just a plain comment'
+    with self.assertRaisesRegex(
+        exceptions.InputException,
+        ("The creation of new labels is blocked for the Chromium project"
+         " in Monorail. To continue with editing your issue, please"
+         " remove: freeze_new_label label\\(s\\).")):
+      tracker_helpers._AssertIssueChangesValid(
+          self.cnxn, issue_delta_pairs, self.services, comment_content=comment)
+
   def testAssertIssueChangesValid_RequiredField(self):
     """Asserts fields and requried fields.."""
     issue_1 = _Issue('chicken', 1)
@@ -2323,8 +2384,8 @@
         '%s: MERGED type statuses must accompany mergedInto values.' %
         issue_3_ref)
 
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 '\n'.join(expected_err_msgs)):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                '\n'.join(expected_err_msgs)):
       tracker_helpers._AssertIssueChangesValid(
           self.cnxn, issue_delta_pairs, self.services, comment_content=comment)
 
@@ -2390,8 +2451,8 @@
         (issue_7, delta_7),
     ]
 
-    with self.assertRaisesRegexp(exceptions.InputException,
-                                 '\n'.join(expected_err_msgs)):
+    with self.assertRaisesRegex(exceptions.InputException,
+                                '\n'.join(expected_err_msgs)):
       tracker_helpers._AssertIssueChangesValid(
           self.cnxn, issue_delta_pairs, self.services)
 
@@ -2426,13 +2487,13 @@
 
     new_cc_ids = tracker_helpers._ComputeNewCcsFromIssueMerge(
         target_issue, [source_issue_1, source_issue_2, source_issue_3])
-    self.assertItemsEqual(new_cc_ids, [444, 555, 222])
+    six.assertCountEqual(self, new_cc_ids, [444, 555, 222])
 
   def testComputeNewCcsFromIssueMerge_Empty(self):
     target_issue = fake.MakeTestIssue(789, 10, 'Target issue', 'New', 111)
     self.services.issue.TestAddIssue(target_issue)
     new_cc_ids = tracker_helpers._ComputeNewCcsFromIssueMerge(target_issue, [])
-    self.assertItemsEqual(new_cc_ids, [])
+    six.assertCountEqual(self, new_cc_ids, [])
 
   def testEnforceNonMergeStatusDeltas(self):
     # No updates: user is setting to a non-MERGED status with no
@@ -2692,7 +2753,7 @@
             [('proj', m_remove.local_id)], default_project_name='proj')
         ]
     self.assertEqual(actual_amendments, expected_amendments)
-    self.assertItemsEqual(actual_new_starrers, [333, 444])
+    six.assertCountEqual(self, actual_new_starrers, [333, 444])
 
     expected_issue.cc_ids.append(777)
     expected_issue.blocked_on_iids = [78404, bo_add.issue_id]
@@ -2767,7 +2828,7 @@
     dne_users = [2, 3]
     existing = [1, 1001, 1002, 1003, 2001, 2002, 3002]
     all_users = existing + dne_users
-    with self.assertRaisesRegexp(
+    with self.assertRaisesRegex(
         exceptions.InputException,
         'users/2: User does not exist.\nusers/3: User does not exist.'):
       with exceptions.ErrorAggregator(exceptions.InputException) as err_agg:
diff --git a/tracker/test/tracker_views_test.py b/tracker/test/tracker_views_test.py
index ddc2a3e..db047c3 100644
--- a/tracker/test/tracker_views_test.py
+++ b/tracker/test/tracker_views_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittest for issue tracker views."""
 from __future__ import print_function
@@ -23,8 +22,8 @@
 from framework import gcs_helpers
 from framework import template_helpers
 from framework import urls
-from proto import project_pb2
-from proto import tracker_pb2
+from mrproto import project_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
diff --git a/tracker/test/webcomponentspage_test.py b/tracker/test/webcomponentspage_test.py
index 65cfc66..86d3606 100644
--- a/tracker/test/webcomponentspage_test.py
+++ b/tracker/test/webcomponentspage_test.py
@@ -1,7 +1,6 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2020 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 """Tests for the Monorail SPA pages, as served by EZT."""
 from __future__ import print_function
 from __future__ import division
@@ -10,12 +9,9 @@
 import mock
 import unittest
 
-import ezt
 
-import settings
-from framework import permissions
-from proto import project_pb2
-from proto import site_pb2
+from framework import exceptions
+from mrproto import project_pb2
 from services import service_manager
 from tracker import webcomponentspage
 from testing import fake
@@ -35,8 +31,7 @@
     self.hotlist = self.services.features.TestAddHotlist(
         'HotlistName', summary='summary', owner_ids=[111], hotlist_id=1236)
 
-    self.servlet = webcomponentspage.WebComponentsPage(
-        'req', 'res', services=self.services)
+    self.servlet = webcomponentspage.WebComponentsPage(services=self.services)
 
   def testHotlistPage_OldUiUrl(self):
     mr = testing_helpers.MakeMonorailRequest(
@@ -76,8 +71,7 @@
     self.project_a = self.services.project.TestAddProject('a', project_id=1)
     self.project_b = self.services.project.TestAddProject('b', project_id=2)
 
-    self.servlet = webcomponentspage.ProjectListPage(
-        'req', 'res', services=self.services)
+    self.servlet = webcomponentspage.ProjectListPage(services=self.services)
 
   @mock.patch('settings.domain_to_default_project', {})
   def testMaybeRedirectToDomainDefaultProject_NoMatch(self):
@@ -114,7 +108,6 @@
     mr = testing_helpers.MakeMonorailRequest()
     mr.request.host = 'example.com'
     self.servlet.redirect = mock.Mock()
-    msg = self.servlet._MaybeRedirectToDomainDefaultProject(mr)
-    print('msg: ' + msg)
-    self.assertTrue(msg.startswith('Redirected'))
-    self.servlet.redirect.assert_called_once()
+    with self.assertRaises(exceptions.RedirectException) as e:
+      self.servlet._MaybeRedirectToDomainDefaultProject(mr)
+    self.assertIn('/p/a', str(e.exception))
