diff --git a/tracker/tracker_bizobj.py b/tracker/tracker_bizobj.py
index f3f2594..f90b24f 100644
--- a/tracker/tracker_bizobj.py
+++ b/tracker/tracker_bizobj.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.
 
 """Business objects for the Monorail issue tracker.
 
@@ -26,7 +25,7 @@
 from framework import framework_helpers
 from framework import timestr
 from framework import urls
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from tracker import tracker_constants
 
 
@@ -435,15 +434,15 @@
 
 def GetIssueComponentsAndAncestors(issue, config):
   """Return a list of all the components that an issue is in."""
-  result = set()
+  result = []
   for component_id in issue.component_ids:
     cd = FindComponentDefByID(component_id, config)
     if cd is None:
       logging.error('Tried to look up non-existent component %r' % component_id)
       continue
     ancestors = FindAncestorComponents(config, cd)
-    result.add(cd)
-    result.update(ancestors)
+    result.append(cd)
+    result.extend(ancestors)
 
   return sorted(result, key=lambda cd: cd.path)
 
@@ -854,8 +853,8 @@
 
 
 def UsersInvolvedInApprovalDefs(approval_defs, matching_fds):
-  # type: (Sequence[proto.tracker_pb2.ApprovalDef],
-  #     Sequence[proto.tracker_pb2.FieldDef]) -> Collection[int]
+  # type: (Sequence[mrproto.tracker_pb2.ApprovalDef],
+  #     Sequence[mrproto.tracker_pb2.FieldDef]) -> Collection[int]
   """Return a set of user IDs referenced in the approval_defs and field defs"""
   result = set()
   for ad in approval_defs:
@@ -986,8 +985,8 @@
         fd_removed_values_by_phase[fv.phase_id].append(fv)
       # Use all_fv_phase_ids to create Amendments, so no empty amendments
       # are created for issue phases that had no field value changes.
-      all_fv_phase_ids = set(
-          fd_removed_values_by_phase.keys() + fd_added_values_by_phase.keys())
+      all_fv_phase_ids = set(fd_removed_values_by_phase.keys()) | set(
+          fd_added_values_by_phase.keys())
       for phase_id in all_fv_phase_ids:
         new_values = [GetFieldValue(fv, {}) for fv
                       in fd_added_values_by_phase.get(phase_id, [])]
@@ -1226,8 +1225,12 @@
   impacted_iids = set()
 
   def addAmendment(add_iids, remove_iids, amendment_func):
-    add_refs = issue_service.LookupIssueRefs(cnxn, add_iids).values()
-    remove_refs = issue_service.LookupIssueRefs(cnxn, remove_iids).values()
+    add_refs_dict = issue_service.LookupIssueRefs(cnxn, add_iids)
+    add_refs = [add_refs_dict[iid] for iid in add_iids if iid in add_refs_dict]
+    remove_refs_dict = issue_service.LookupIssueRefs(cnxn, remove_iids)
+    remove_refs = [
+        remove_refs_dict[iid] for iid in remove_iids if iid in remove_refs_dict
+    ]
     new_am = amendment_func(
         add_refs, remove_refs, default_project_name=issue.project_name)
     amendments.append(new_am)
@@ -1269,8 +1272,14 @@
 
 
 def MakeAmendment(
-    field, new_value, added_ids, removed_ids, custom_field_name=None,
-    old_value=None):
+    field,
+    new_value,
+    added_ids,
+    removed_ids,
+    custom_field_name=None,
+    old_value=None,
+    added_component_ids=None,
+    removed_component_ids=None):
   """Utility function to populate an Amendment PB.
 
   Args:
@@ -1296,6 +1305,12 @@
   if custom_field_name is not None:
     amendment.custom_field_name = custom_field_name
 
+  if added_component_ids is not None:
+    amendment.added_component_ids.extend(added_component_ids)
+
+  if removed_component_ids is not None:
+    amendment.removed_component_ids.extend(removed_component_ids)
+
   return amendment
 
 
@@ -1505,20 +1520,26 @@
   # lookups (and maybe permission checks in the future).  But, what
   # about history that references deleleted components?
   added_comp_paths = []
+  valid_added_comp_ids = []
   for comp_id in added_comp_ids:
     cd = FindComponentDefByID(comp_id, config)
     if cd:
       added_comp_paths.append(cd.path)
+      valid_added_comp_ids.append(comp_id)
 
   removed_comp_paths = []
+  valid_removed_comp_ids = []
   for comp_id in removed_comp_ids:
     cd = FindComponentDefByID(comp_id, config)
     if cd:
       removed_comp_paths.append(cd.path)
-
-  return _PlusMinusAmendment(
+      valid_removed_comp_ids.append(comp_id)
+  values = _PlusMinusString(added_comp_paths, removed_comp_paths)
+  return MakeAmendment(
       tracker_pb2.FieldID.COMPONENTS,
-      added_comp_paths, removed_comp_paths)
+      values, [], [],
+      added_component_ids=valid_added_comp_ids,
+      removed_component_ids=valid_removed_comp_ids)
 
 
 def MakeBlockedOnAmendment(
