diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py
index bcf99e2ec3..eac2c7b9fe 100644
--- a/ironic/conductor/manager.py
+++ b/ironic/conductor/manager.py
@@ -270,7 +270,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
                             pstate=node_obj['power_state'])
 
             # update any remaining parameters, then save
-            node_obj.save(context)
+            node_obj.save()
 
             return node_obj
 
@@ -380,7 +380,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
                                                     method=driver_method,
                                                     **info)
 
-    def _provisioning_error_handler(self, e, node, context, provision_state,
+    def _provisioning_error_handler(self, e, node, provision_state,
                                     target_provision_state):
         """Set the node's provisioning states if error occurs.
 
@@ -389,7 +389,6 @@ class ConductorManager(periodic_task.PeriodicTasks):
 
         :param e: the exception object that was raised.
         :param node: an Ironic node object.
-        :param context: security context.
         :param provision_state: the provision state to be set on
             the node.
         :param target_provision_state: the target provision state to be
@@ -400,7 +399,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
             node.provision_state = provision_state
             node.target_provision_state = target_provision_state
             node.last_error = (_("No free conductor workers available"))
-            node.save(context)
+            node.save()
             LOG.warning(_LW("No free conductor workers available to perform "
                             "an action on node %(node)s, setting node's "
                             "provision_state back to %(prov_state)s and "
@@ -481,10 +480,10 @@ class ConductorManager(periodic_task.PeriodicTasks):
             node.provision_state = states.DEPLOYING
             node.target_provision_state = states.DEPLOYDONE
             node.last_error = None
-            node.save(context)
+            node.save()
 
-            task.set_spawn_error_hook(self._provisioning_error_handler, node,
-                                      context, previous_prov_state,
+            task.set_spawn_error_hook(self._provisioning_error_handler,
+                                      node, previous_prov_state,
                                       previous_tgt_provision_state)
             task.spawn_after(self._spawn_worker, self._do_node_deploy,
                              context, task)
@@ -514,7 +513,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
             else:
                 node.provision_state = new_state
         finally:
-            node.save(context)
+            node.save()
 
     @messaging.expected_exceptions(exception.NoFreeConductorWorker,
                                    exception.NodeLocked,
@@ -569,10 +568,10 @@ class ConductorManager(periodic_task.PeriodicTasks):
             node.provision_state = states.DELETING
             node.target_provision_state = states.DELETED
             node.last_error = None
-            node.save(context)
+            node.save()
 
-            task.set_spawn_error_hook(self._provisioning_error_handler, node,
-                                      context, previous_prov_state,
+            task.set_spawn_error_hook(self._provisioning_error_handler,
+                                      node, previous_prov_state,
                                       previous_tgt_provision_state)
             task.spawn_after(self._spawn_worker, self._do_node_tear_down,
                              context, task)
@@ -605,7 +604,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
         finally:
             # Clean the instance_info
             node.instance_info = {}
-            node.save(context)
+            node.save()
 
     def _conductor_service_record_keepalive(self):
         while not self._keepalive_evt.is_set():
@@ -625,7 +624,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
         node.power_state = actual_power_state
         node.last_error = msg
         node.maintenance = True
-        node.save(task.context)
+        node.save()
         LOG.error(msg)
 
     def _do_sync_power_state(self, task):
@@ -666,7 +665,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
                          "'%(state)s'."),
                          {'node': node.uuid, 'state': power_state})
             node.power_state = power_state
-            node.save(task.context)
+            node.save()
 
         if power_state == node.power_state:
             if node.uuid in self.power_state_sync_count:
@@ -680,7 +679,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
                             {'node': node.uuid, 'actual': power_state,
                              'state': node.power_state})
             node.power_state = power_state
-            node.save(task.context)
+            node.save()
             return
 
         if (self.power_state_sync_count[node.uuid] >=
@@ -897,7 +896,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
             node = task.node
             if mode is not node.maintenance:
                 node.maintenance = mode
-                node.save(context)
+                node.save()
             else:
                 msg = _("The node is already in maintenance mode") if mode \
                         else _("The node is not in maintenance mode")
@@ -946,9 +945,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
                 msg = (_("Node %s can't be deleted because it's not "
                          "powered off") % node.uuid)
                 raise exception.NodeInWrongPowerState(msg)
-            # FIXME(comstud): Remove context argument after we ensure
-            # every instantiation of Node includes the context
-            node.destroy(context)
+            node.destroy()
             LOG.info(_LI('Successfully deleted node %(node)s.'),
                      {'node': node.uuid})
 
@@ -1023,7 +1020,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
                 task.release_resources()
             else:
                 node.last_error = None
-                node.save(context)
+                node.save()
                 task.spawn_after(self._spawn_worker,
                                  self._set_console_mode, task, enabled)
 
@@ -1047,7 +1044,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
             node.console_enabled = enabled
             node.last_error = None
         finally:
-            node.save(task.context)
+            node.save()
 
     @messaging.expected_exceptions(exception.NodeLocked,
                                    exception.FailedToUpdateMacOnPort,
@@ -1082,7 +1079,7 @@ class ConductorManager(periodic_task.PeriodicTasks):
                         "address."),
                         {'port': port_uuid, 'instance': node.instance_uuid})
 
-            port_obj.save(context)
+            port_obj.save()
 
             return port_obj
 
diff --git a/ironic/conductor/utils.py b/ironic/conductor/utils.py
index ed4886377a..c66a56292a 100644
--- a/ironic/conductor/utils.py
+++ b/ironic/conductor/utils.py
@@ -61,7 +61,6 @@ def node_power_action(task, state):
 
     """
     node = task.node
-    context = task.context
     new_state = states.POWER_ON if state == states.REBOOT else state
 
     if state != states.REBOOT:
@@ -73,7 +72,7 @@ def node_power_action(task, state):
                     _("Failed to change power state to '%(target)s'. "
                       "Error: %(error)s") % {
                       'target': new_state, 'error': e}
-                node.save(context)
+                node.save()
 
         if curr_state == new_state:
             # Neither the ironic service nor the hardware has erred. The
@@ -86,7 +85,7 @@ def node_power_action(task, state):
             # This isn't an error, so we'll clear last_error field
             # (from previous operation), log a warning, and return.
             node['last_error'] = None
-            node.save(context)
+            node.save()
             LOG.warn(_LW("Not going to change_node_power_state because "
                          "current state = requested state = '%(state)s'."),
                      {'state': curr_state})
@@ -102,7 +101,7 @@ def node_power_action(task, state):
     # and clients that work is in progress.
     node['target_power_state'] = new_state
     node['last_error'] = None
-    node.save(context)
+    node.save()
 
     # take power action
     try:
@@ -124,7 +123,7 @@ def node_power_action(task, state):
                  {'node': node.uuid, 'state': new_state})
     finally:
         node['target_power_state'] = states.NOSTATE
-        node.save(context)
+        node.save()
 
 
 @task_manager.require_exclusive_lock
@@ -134,14 +133,13 @@ def cleanup_after_timeout(task):
     :param task: a TaskManager instance.
     """
     node = task.node
-    context = task.context
     node.provision_state = states.DEPLOYFAIL
     node.target_provision_state = states.NOSTATE
     msg = (_('Timeout reached while waiting for callback for node %s')
              % node.uuid)
     node.last_error = msg
     LOG.error(msg)
-    node.save(context)
+    node.save()
 
     error_msg = _('Cleanup failed for node %(node)s after deploy timeout: '
                   ' %(error)s')
@@ -151,11 +149,11 @@ def cleanup_after_timeout(task):
         msg = error_msg % {'node': node.uuid, 'error': e}
         LOG.error(msg)
         node.last_error = msg
-        node.save(context)
+        node.save()
     except Exception as e:
         msg = error_msg % {'node': node.uuid, 'error': e}
         LOG.error(msg)
         node.last_error = _('Deploy timed out, but an unhandled exception was '
                             'encountered while aborting. More info may be '
                             'found in the log file.')
-        node.save(context)
+        node.save()
diff --git a/ironic/drivers/modules/agent.py b/ironic/drivers/modules/agent.py
index 5f330d7efa..cb1e263e12 100644
--- a/ironic/drivers/modules/agent.py
+++ b/ironic/drivers/modules/agent.py
@@ -122,7 +122,7 @@ def _set_failed_state(task, msg):
     node = task.node
     node.provision_state = states.DEPLOYFAIL
     node.target_provision_state = states.NOSTATE
-    node.save(task.context)
+    node.save()
     try:
         manager_utils.node_power_action(task, states.POWER_OFF)
     except Exception:
@@ -135,7 +135,7 @@ def _set_failed_state(task, msg):
         # NOTE(deva): node_power_action() erases node.last_error
         #             so we need to set it again here.
         node.last_error = msg
-        node.save(task.context)
+        node.save()
 
 
 @image_cache.cleanup(priority=25)
@@ -275,7 +275,7 @@ class AgentDeploy(base.DeployInterface):
         _cache_tftp_images(task.context, node, pxe_info)
 
         node.instance_info = build_instance_info_for_deploy(task)
-        node.save(task.context)
+        node.save()
 
     def clean_up(self, task):
         """Clean up the deployment environment for this node.
@@ -401,7 +401,7 @@ class AgentVendorInterface(base.VendorInterface):
         driver_info['agent_last_heartbeat'] = int(_time())
         driver_info['agent_url'] = kwargs['agent_url']
         node.driver_info = driver_info
-        node.save(task.context)
+        node.save()
 
         # Async call backs don't set error state on their own
         # TODO(jimrollenhagen) improve error messages here
@@ -440,7 +440,7 @@ class AgentVendorInterface(base.VendorInterface):
                   {'res': res, 'node': node.uuid})
 
         node.provision_state = states.DEPLOYING
-        node.save(task.context)
+        node.save()
 
     def _check_deploy_success(self, node):
         # should only ever be called after we've validated that
@@ -470,7 +470,7 @@ class AgentVendorInterface(base.VendorInterface):
 
         node.provision_state = states.ACTIVE
         node.target_provision_state = states.NOSTATE
-        node.save(task.context)
+        node.save()
 
     def _lookup(self, context, **kwargs):
         """Method to be called the first time a ramdisk agent checks in. This
diff --git a/ironic/drivers/modules/ilo/deploy.py b/ironic/drivers/modules/ilo/deploy.py
index 194422269e..d2bb717bff 100644
--- a/ironic/drivers/modules/ilo/deploy.py
+++ b/ironic/drivers/modules/ilo/deploy.py
@@ -266,16 +266,16 @@ class IloVirtualMediaIscsiDeploy(base.DeployInterface):
             image.
         :raises: IloOperationError, if some operation on iLO fails.
         """
+        node = task.node
         manager_utils.node_power_action(task, states.POWER_OFF)
 
-        iscsi_deploy.cache_instance_image(task.context, task.node)
+        iscsi_deploy.cache_instance_image(task.context, node)
         iscsi_deploy.check_image_size(task)
 
-        deploy_ramdisk_opts = iscsi_deploy.build_deploy_ramdisk_options(
-                task.node, task.context)
+        deploy_ramdisk_opts = iscsi_deploy.build_deploy_ramdisk_options(node)
         deploy_nic_mac = _get_single_nic_with_vif_port_id(task)
         deploy_ramdisk_opts['BOOTIF'] = deploy_nic_mac
-        deploy_iso_uuid = task.node.driver_info['ilo_deploy_iso']
+        deploy_iso_uuid = node.driver_info['ilo_deploy_iso']
         deploy_iso = 'glance:' + deploy_iso_uuid
 
         _reboot_into(task, deploy_iso, deploy_ramdisk_opts)
@@ -376,7 +376,7 @@ class IloVirtualMediaAgentDeploy(base.DeployInterface):
         """
         node = task.node
         node.instance_info = agent.build_instance_info_for_deploy(task)
-        node.save(task.context)
+        node.save()
 
     def clean_up(self, task):
         """Clean up the deployment environment for this node.
@@ -527,7 +527,7 @@ class VendorPassthru(base.VendorInterface):
             i_info = node.instance_info
             i_info['ilo_boot_iso'] = boot_iso
             node.instance_info = i_info
-            node.save(task.context)
+            node.save()
             LOG.info(_LI('Deployment to node %s done'), node.uuid)
         except Exception as e:
             LOG.error(_LE('Deploy failed for instance %(instance)s. '
diff --git a/ironic/drivers/modules/iscsi_deploy.py b/ironic/drivers/modules/iscsi_deploy.py
index cd126c7e37..aa914e27c3 100644
--- a/ironic/drivers/modules/iscsi_deploy.py
+++ b/ironic/drivers/modules/iscsi_deploy.py
@@ -255,7 +255,7 @@ def set_failed_state(task, msg):
     node = task.node
     node.provision_state = states.DEPLOYFAIL
     node.target_provision_state = states.NOSTATE
-    node.save(task.context)
+    node.save()
     try:
         manager_utils.node_power_action(task, states.POWER_OFF)
     except Exception:
@@ -268,7 +268,7 @@ def set_failed_state(task, msg):
         # NOTE(deva): node_power_action() erases node.last_error
         #             so we need to set it again here.
         node.last_error = msg
-        node.save(task.context)
+        node.save()
 
 
 def continue_deploy(task, **kwargs):
@@ -284,7 +284,7 @@ def continue_deploy(task, **kwargs):
     node = task.node
 
     node.provision_state = states.DEPLOYING
-    node.save(task.context)
+    node.save()
 
     params = get_deploy_info(node, **kwargs)
     ramdisk_error = kwargs.get('error')
@@ -312,14 +312,13 @@ def continue_deploy(task, **kwargs):
     return root_uuid
 
 
-def build_deploy_ramdisk_options(node, ctx):
+def build_deploy_ramdisk_options(node):
     """Build the ramdisk config options for a node
 
     This method builds the ramdisk options for a node,
     given all the required parameters for doing iscsi deploy.
 
     :param node: a single Node.
-    :param ctx: security context
     :returns: A dictionary of options to be passed to ramdisk for performing
         the deploy.
     """
@@ -332,7 +331,7 @@ def build_deploy_ramdisk_options(node, ctx):
     i_info = node.instance_info
     i_info['deploy_key'] = deploy_key
     node.instance_info = i_info
-    node.save(ctx)
+    node.save()
 
     deploy_options = {
         'deployment_id': node['uuid'],
diff --git a/ironic/drivers/modules/pxe.py b/ironic/drivers/modules/pxe.py
index de8a2b9a8d..2d3a2d499a 100644
--- a/ironic/drivers/modules/pxe.py
+++ b/ironic/drivers/modules/pxe.py
@@ -179,8 +179,7 @@ def _build_pxe_config_options(node, pxe_info, ctx):
         'tftp_server': CONF.pxe.tftp_server
     }
 
-    deploy_ramdisk_options = iscsi_deploy.build_deploy_ramdisk_options(node,
-            ctx)
+    deploy_ramdisk_options = iscsi_deploy.build_deploy_ramdisk_options(node)
     pxe_options.update(deploy_ramdisk_options)
     return pxe_options
 
@@ -234,7 +233,7 @@ def _get_image_info(node, ctx):
         for label in labels:
             i_info[label] = str(iproperties[label + '_id']).split('/')[-1]
         node.instance_info = i_info
-        node.save(ctx)
+        node.save()
 
     for label in labels:
         image_info[label] = (
@@ -479,7 +478,7 @@ class VendorPassthru(base.VendorInterface):
             LOG.info(_LI('Deployment to node %s done'), node.uuid)
             node.provision_state = states.ACTIVE
             node.target_provision_state = states.NOSTATE
-            node.save(task.context)
+            node.save()
         except Exception as e:
 
             LOG.error(_LE('Deploy failed for instance %(instance)s. '
diff --git a/ironic/drivers/modules/seamicro.py b/ironic/drivers/modules/seamicro.py
index b288ce0ae0..b894bce394 100644
--- a/ironic/drivers/modules/seamicro.py
+++ b/ironic/drivers/modules/seamicro.py
@@ -454,7 +454,7 @@ class VendorPassthru(base.VendorInterface):
         properties = node.properties
         properties['seamicro_vlan_id'] = vlan_id
         node.properties = properties
-        node.save(task.context)
+        node.save()
 
     def _attach_volume(self, task, **kwargs):
         """Attach volume from SeaMicro storage pools for ironic to node.
@@ -490,7 +490,7 @@ class VendorPassthru(base.VendorInterface):
             properties = node.properties
             properties['seamicro_volume_id'] = volume_id
             node.properties = properties
-            node.save(task.context)
+            node.save()
 
 
 class Management(base.ManagementInterface):
diff --git a/ironic/drivers/utils.py b/ironic/drivers/utils.py
index 47f17a4f07..edaa84b1e7 100644
--- a/ironic/drivers/utils.py
+++ b/ironic/drivers/utils.py
@@ -162,7 +162,7 @@ def rm_node_capability(task, capability):
     new_cap_str = ",".join(caps)
     properties['capabilities'] = new_cap_str if new_cap_str else None
     node.properties = properties
-    node.save(task.context)
+    node.save()
 
 
 def add_node_capability(task, capability, value):
@@ -189,7 +189,7 @@ def add_node_capability(task, capability, value):
 
     properties['capabilities'] = capabilities
     node.properties = properties
-    node.save(task.context)
+    node.save()
 
 
 def validate_boot_mode_capability(node):
diff --git a/ironic/objects/chassis.py b/ironic/objects/chassis.py
index aebebb44ee..98a560e735 100644
--- a/ironic/objects/chassis.py
+++ b/ironic/objects/chassis.py
@@ -122,7 +122,7 @@ class Chassis(base.IronicObject):
                         Unfortunately, RPC requires context as the first
                         argument, even though we don't use it.
                         A context should be set when instantiating the
-                        object, e.g.: Chassis(context=context)
+                        object, e.g.: Chassis(context)
 
         """
         values = self.obj_get_changes()
@@ -138,7 +138,7 @@ class Chassis(base.IronicObject):
                         Unfortunately, RPC requires context as the first
                         argument, even though we don't use it.
                         A context should be set when instantiating the
-                        object, e.g.: Chassis(context=context)
+                        object, e.g.: Chassis(context)
         """
         self.dbapi.destroy_chassis(self.id)
         self.obj_reset_changes()
@@ -150,8 +150,12 @@ class Chassis(base.IronicObject):
         Updates will be made column by column based on the result
         of self.what_changed().
 
-        :param context: Security context. NOTE: This is only used
-                        internally by the indirection_api.
+        :param context: Security context. NOTE: This should only
+                        be used internally by the indirection_api.
+                        Unfortunately, RPC requires context as the first
+                        argument, even though we don't use it.
+                        A context should be set when instantiating the
+                        object, e.g.: Chassis(context)
         """
         updates = self.obj_get_changes()
         self.dbapi.update_chassis(self.uuid, updates)
@@ -166,8 +170,12 @@ class Chassis(base.IronicObject):
         checks for updated attributes. Updates are applied from
         the loaded chassis column by column, if there are any updates.
 
-        :param context: Security context. NOTE: This is only used
-                        internally by the indirection_api.
+        :param context: Security context. NOTE: This should only
+                        be used internally by the indirection_api.
+                        Unfortunately, RPC requires context as the first
+                        argument, even though we don't use it.
+                        A context should be set when instantiating the
+                        object, e.g.: Chassis(context)
         """
         current = self.__class__.get_by_uuid(self._context, uuid=self.uuid)
         for field in self.fields:
diff --git a/ironic/objects/conductor.py b/ironic/objects/conductor.py
index 0315d1a0f2..c09acdf018 100644
--- a/ironic/objects/conductor.py
+++ b/ironic/objects/conductor.py
@@ -56,9 +56,22 @@ class Conductor(base.IronicObject):
                 _('Cannot update a conductor record directly.'))
 
     @base.remotable
-    def refresh(self, context):
-        current = self.__class__.get_by_hostname(context,
-                                               hostname=self.hostname)
+    def refresh(self, context=None):
+        """Loads and applies updates for this Conductor.
+
+        Loads a :class:`Conductor` with the same uuid from the database and
+        checks for updated attributes. Updates are applied from
+        the loaded chassis column by column, if there are any updates.
+
+        :param context: Security context. NOTE: This should only
+                        be used internally by the indirection_api.
+                        Unfortunately, RPC requires context as the first
+                        argument, even though we don't use it.
+                        A context should be set when instantiating the
+                        object, e.g.: Conductor(context)
+        """
+        current = self.__class__.get_by_hostname(self._context,
+                                                 hostname=self.hostname)
         for field in self.fields:
             if (hasattr(self, base.get_attrname(field)) and
                     self[field] != current[field]):
diff --git a/ironic/objects/node.py b/ironic/objects/node.py
index 39dba17e91..1730a96342 100644
--- a/ironic/objects/node.py
+++ b/ironic/objects/node.py
@@ -187,7 +187,7 @@ class Node(base.IronicObject):
                         Unfortunately, RPC requires context as the first
                         argument, even though we don't use it.
                         A context should be set when instantiating the
-                        object, e.g.: Node(context=context)
+                        object, e.g.: Node(context)
 
         """
         values = self.obj_get_changes()
@@ -203,7 +203,7 @@ class Node(base.IronicObject):
                         Unfortunately, RPC requires context as the first
                         argument, even though we don't use it.
                         A context should be set when instantiating the
-                        object, e.g.: Node(context=context)
+                        object, e.g.: Node(context)
         """
         self.dbapi.destroy_node(self.id)
         self.obj_reset_changes()
@@ -217,8 +217,12 @@ class Node(base.IronicObject):
         it will be checked against the in-database copy of the
         node before updates are made.
 
-        :param context: Security context. NOTE: This is only used
-                        internally by the indirection_api.
+        :param context: Security context. NOTE: This should only
+                        be used internally by the indirection_api.
+                        Unfortunately, RPC requires context as the first
+                        argument, even though we don't use it.
+                        A context should be set when instantiating the
+                        object, e.g.: Node(context)
         """
         updates = self.obj_get_changes()
         self.dbapi.update_node(self.uuid, updates)
@@ -228,8 +232,12 @@ class Node(base.IronicObject):
     def refresh(self, context=None):
         """Refresh the object by re-fetching from the DB.
 
-        :param context: Security context. NOTE: This is only used
-                        internally by the indirection_api.
+        :param context: Security context. NOTE: This should only
+                        be used internally by the indirection_api.
+                        Unfortunately, RPC requires context as the first
+                        argument, even though we don't use it.
+                        A context should be set when instantiating the
+                        object, e.g.: Node(context)
         """
         current = self.__class__.get_by_uuid(self._context, self.uuid)
         for field in self.fields:
diff --git a/ironic/objects/port.py b/ironic/objects/port.py
index fd5a3718dc..72b587e1c1 100644
--- a/ironic/objects/port.py
+++ b/ironic/objects/port.py
@@ -152,7 +152,7 @@ class Port(base.IronicObject):
                         Unfortunately, RPC requires context as the first
                         argument, even though we don't use it.
                         A context should be set when instantiating the
-                        object, e.g.: Port(context=context)
+                        object, e.g.: Port(context)
 
         """
         values = self.obj_get_changes()
@@ -168,7 +168,7 @@ class Port(base.IronicObject):
                         Unfortunately, RPC requires context as the first
                         argument, even though we don't use it.
                         A context should be set when instantiating the
-                        object, e.g.: Port(context=context)
+                        object, e.g.: Port(context)
         """
         self.dbapi.destroy_port(self.id)
         self.obj_reset_changes()
@@ -180,8 +180,12 @@ class Port(base.IronicObject):
         Updates will be made column by column based on the result
         of self.what_changed().
 
-        :param context: Security context. NOTE: This is only used
-                        internally by the indirection_api.
+        :param context: Security context. NOTE: This should only
+                        be used internally by the indirection_api.
+                        Unfortunately, RPC requires context as the first
+                        argument, even though we don't use it.
+                        A context should be set when instantiating the
+                        object, e.g.: Port(context)
         """
         updates = self.obj_get_changes()
         self.dbapi.update_port(self.uuid, updates)
@@ -196,10 +200,14 @@ class Port(base.IronicObject):
         checks for updated attributes. Updates are applied from
         the loaded port column by column, if there are any updates.
 
-        :param context: Security context. NOTE: This is only used
-                        internally by the indirection_api.
+        :param context: Security context. NOTE: This should only
+                        be used internally by the indirection_api.
+                        Unfortunately, RPC requires context as the first
+                        argument, even though we don't use it.
+                        A context should be set when instantiating the
+                        object, e.g.: Port(context)
         """
-        current = self.__class__.get_by_uuid(context, uuid=self.uuid)
+        current = self.__class__.get_by_uuid(self._context, uuid=self.uuid)
         for field in self.fields:
             if (hasattr(self, base.get_attrname(field)) and
                     self[field] != current[field]):
diff --git a/ironic/tests/api/v1/test_ports.py b/ironic/tests/api/v1/test_ports.py
index b289207183..882b8dd616 100644
--- a/ironic/tests/api/v1/test_ports.py
+++ b/ironic/tests/api/v1/test_ports.py
@@ -316,7 +316,7 @@ class TestPatch(base.FunctionalTest):
     def test_replace_multi(self, mock_upd):
         extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"}
         self.port.extra = extra
-        self.port.save(context.get_admin_context())
+        self.port.save()
 
         # mutate extra so we replace all of them
         extra = dict((k, extra[k] + 'x') for k in extra.keys())
@@ -339,7 +339,7 @@ class TestPatch(base.FunctionalTest):
     def test_remove_multi(self, mock_upd):
         extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"}
         self.port.extra = extra
-        self.port.save(context.get_admin_context())
+        self.port.save()
 
         # Removing one item from the collection
         extra.pop('foo1')
diff --git a/ironic/tests/conductor/test_conductor_utils.py b/ironic/tests/conductor/test_conductor_utils.py
index f36c3d1395..5f64ad3f81 100644
--- a/ironic/tests/conductor/test_conductor_utils.py
+++ b/ironic/tests/conductor/test_conductor_utils.py
@@ -284,7 +284,7 @@ class CleanupAfterTimeoutTestCase(tests_base.TestCase):
     def test_cleanup_after_timeout(self):
         conductor_utils.cleanup_after_timeout(self.task)
 
-        self.node.save.assert_called_once_with(self.task.context)
+        self.node.save.assert_called_once_with()
         self.task.driver.deploy.clean_up.assert_called_once_with(self.task)
         self.assertEqual(states.DEPLOYFAIL, self.node.provision_state)
         self.assertEqual(states.NOSTATE, self.node.target_provision_state)
@@ -304,8 +304,7 @@ class CleanupAfterTimeoutTestCase(tests_base.TestCase):
         conductor_utils.cleanup_after_timeout(self.task)
 
         self.task.driver.deploy.clean_up.assert_called_once_with(self.task)
-        self.assertEqual([mock.call(self.task.context)] * 2,
-                         self.node.save.call_args_list)
+        self.assertEqual([mock.call()] * 2, self.node.save.call_args_list)
         self.assertEqual(states.DEPLOYFAIL, self.node.provision_state)
         self.assertEqual(states.NOSTATE, self.node.target_provision_state)
         self.assertIn('moocow', self.node.last_error)
@@ -317,8 +316,7 @@ class CleanupAfterTimeoutTestCase(tests_base.TestCase):
         conductor_utils.cleanup_after_timeout(self.task)
 
         self.task.driver.deploy.clean_up.assert_called_once_with(self.task)
-        self.assertEqual([mock.call(self.task.context)] * 2,
-                         self.node.save.call_args_list)
+        self.assertEqual([mock.call()] * 2, self.node.save.call_args_list)
         self.assertEqual(states.DEPLOYFAIL, self.node.provision_state)
         self.assertEqual(states.NOSTATE, self.node.target_provision_state)
         self.assertIn('Deploy timed out', self.node.last_error)
diff --git a/ironic/tests/conductor/test_manager.py b/ironic/tests/conductor/test_manager.py
index 5fab3d2950..09fd672a52 100644
--- a/ironic/tests/conductor/test_manager.py
+++ b/ironic/tests/conductor/test_manager.py
@@ -996,7 +996,7 @@ class MiscTestCase(_ServiceSetUpMixin, tests_db_base.DbTestCase):
                                 self.context, node.uuid, True)
         # Compare true exception hidden by @messaging.expected_exceptions
         self.assertEqual(exception.NodeMaintenanceFailure, exc.exc_info[0])
-        node.refresh(self.context)
+        node.refresh()
         self.assertTrue(node.maintenance)
 
     def test_maintenance_mode_off_failed(self):
@@ -1006,7 +1006,7 @@ class MiscTestCase(_ServiceSetUpMixin, tests_db_base.DbTestCase):
                                 self.context, node.uuid, False)
         # Compare true exception hidden by @messaging.expected_exceptions
         self.assertEqual(exception.NodeMaintenanceFailure, exc.exc_info[0])
-        node.refresh(self.context)
+        node.refresh()
         self.assertFalse(node.maintenance)
 
 
@@ -1271,7 +1271,7 @@ class UpdatePortTestCase(_ServiceSetUpMixin, tests_db_base.DbTestCase):
                                 self.context, port)
         # Compare true exception hidden by @messaging.expected_exceptions
         self.assertEqual(exception.FailedToUpdateMacOnPort, exc.exc_info[0])
-        port.refresh(self.context)
+        port.refresh()
         self.assertEqual(old_address, port.address)
 
     @mock.patch('ironic.dhcp.neutron.NeutronDHCPApi.update_port_address')
@@ -1523,7 +1523,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
 
         self.power.validate.assert_called_once_with(self.task)
         self.power.get_power_state.assert_called_once_with(self.task)
-        self.node.save.assert_called_once_with(self.context)
+        self.node.save.assert_called_once_with()
         self.assertFalse(node_power_action.called)
         self.assertEqual(states.POWER_ON, self.node.power_state)
 
@@ -1564,7 +1564,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
 
         self.assertFalse(self.power.validate.called)
         self.power.get_power_state.assert_called_once_with(self.task)
-        self.node.save.assert_called_once_with(self.context)
+        self.node.save.assert_called_once_with()
         self.assertFalse(node_power_action.called)
         self.assertEqual(states.POWER_OFF, self.node.power_state)
 
@@ -1606,7 +1606,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
         power_exp_calls = [mock.call(self.task)] * 2
         self.assertEqual(power_exp_calls,
                          self.power.get_power_state.call_args_list)
-        self.node.save.assert_called_once_with(self.context)
+        self.node.save.assert_called_once_with()
         node_power_action.assert_called_once_with(self.task, states.POWER_ON)
         self.assertEqual(states.POWER_OFF, self.node.power_state)
         self.assertEqual(1,
@@ -1625,7 +1625,7 @@ class ManagerDoSyncPowerStateTestCase(tests_base.TestCase):
         power_exp_calls = [mock.call(self.task)] * 3
         self.assertEqual(power_exp_calls,
                          self.power.get_power_state.call_args_list)
-        self.node.save.assert_called_once_with(self.context)
+        self.node.save.assert_called_once_with()
         npa_exp_calls = [mock.call(self.task, states.POWER_ON)] * 2
         self.assertEqual(npa_exp_calls, node_power_action.call_args_list)
         self.assertEqual(states.POWER_OFF, self.node.power_state)
diff --git a/ironic/tests/drivers/ilo/test_deploy.py b/ironic/tests/drivers/ilo/test_deploy.py
index 98cd0ecde3..ff750f2b2e 100644
--- a/ironic/tests/drivers/ilo/test_deploy.py
+++ b/ironic/tests/drivers/ilo/test_deploy.py
@@ -246,7 +246,7 @@ class IloVirtualMediaIscsiDeployTestCase(base.TestCase):
                     task.node)
             check_image_size_mock.assert_called_once_with(task)
             expected_ramdisk_opts = {'a': 'b', 'BOOTIF': '12:34:56:78:90:ab'}
-            build_opts_mock.assert_called_once_with(task.node, task.context)
+            build_opts_mock.assert_called_once_with(task.node)
             get_nic_mock.assert_called_once_with(task)
             reboot_into_mock.assert_called_once_with(task, 'glance:deploy-iso',
                                                      expected_ramdisk_opts)
diff --git a/ironic/tests/drivers/test_pxe.py b/ironic/tests/drivers/test_pxe.py
index 7945b2e3f6..f174693863 100644
--- a/ironic/tests/drivers/test_pxe.py
+++ b/ironic/tests/drivers/test_pxe.py
@@ -586,7 +586,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
             task.driver.vendor.vendor_passthru(
                     task, method='pass_deploy_info', address='123456',
                     iqn='aaa-bbb', key='fake-56789')
-        self.node.refresh(self.context)
+        self.node.refresh()
         self.assertEqual(states.ACTIVE, self.node.provision_state)
         self.assertEqual(states.POWER_ON, self.node.power_state)
         self.assertIsNone(self.node.last_error)
@@ -616,7 +616,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
             task.driver.vendor.vendor_passthru(
                     task, method='pass_deploy_info', address='123456',
                     iqn='aaa-bbb', key='fake-56789')
-        self.node.refresh(self.context)
+        self.node.refresh()
         self.assertEqual(states.DEPLOYFAIL, self.node.provision_state)
         self.assertEqual(states.POWER_OFF, self.node.power_state)
         self.assertIsNotNone(self.node.last_error)
@@ -643,7 +643,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
                     task, method='pass_deploy_info', address='123456',
                     iqn='aaa-bbb', key='fake-56789',
                     error='test ramdisk error')
-        self.node.refresh(self.context)
+        self.node.refresh()
         self.assertEqual(states.DEPLOYFAIL, self.node.provision_state)
         self.assertEqual(states.POWER_OFF, self.node.power_state)
         self.assertIsNotNone(self.node.last_error)
@@ -661,7 +661,7 @@ class PXEDriverTestCase(db_base.DbTestCase):
                     task, method='pass_deploy_info', address='123456',
                     iqn='aaa-bbb', key='fake-56789',
                     error='test ramdisk error')
-        self.node.refresh(self.context)
+        self.node.refresh()
         self.assertEqual('FAKE', self.node.provision_state)
         self.assertEqual(states.POWER_ON, self.node.power_state)
 
diff --git a/ironic/tests/objects/test_objects.py b/ironic/tests/objects/test_objects.py
index d3c991f62f..b483ad36aa 100644
--- a/ironic/tests/objects/test_objects.py
+++ b/ironic/tests/objects/test_objects.py
@@ -380,7 +380,7 @@ class _TestObject(object):
         obj = MyObj.query(self.context)
         obj.foo = 123
         self.assertEqual(set(['foo']), obj.obj_what_changed())
-        obj.save(self.context)
+        obj.save()
         self.assertEqual(set([]), obj.obj_what_changed())
         self.assertEqual(123, obj.foo)
         self.assertRemotes()
@@ -389,7 +389,7 @@ class _TestObject(object):
         obj = MyObj.query(self.context)
         obj.foo = 123
         self.assertEqual(set(['foo']), obj.obj_what_changed())
-        obj.refresh(self.context)
+        obj.refresh()
         self.assertEqual(set([]), obj.obj_what_changed())
         self.assertEqual(321, obj.foo)
         self.assertEqual('refreshed', obj.bar)