diff --git a/lti_consumer/lti_xblock.py b/lti_consumer/lti_xblock.py
index a3b1fef9605201a7506a7521cc7ca168f6b8ac2b..3f60d03c3a328e83cb76877eb27efeae6646d18c 100644
--- a/lti_consumer/lti_xblock.py
+++ b/lti_consumer/lti_xblock.py
@@ -161,6 +161,7 @@ class LaunchTarget:
 
 
 @XBlock.needs('i18n')
+@XBlock.needs('rebind_user')
 @XBlock.wants('user')
 @XBlock.wants('settings')
 @XBlock.wants('lti-configuration')
@@ -1332,7 +1333,7 @@ class LtiConsumerXBlock(StudioEditableXBlockMixin, XBlock):
         Returns:
             dict:  response to this request as dictated by the LtiConsumer
         """
-        self.runtime.rebind_noauth_module_to_user(self, user)
+        self.runtime.service(self, 'rebind_user').rebind_noauth_module_to_user(self, user)
         args = []
         if self.module_score:
             args.extend([self.module_score, self.score_comment])
@@ -1420,7 +1421,7 @@ class LtiConsumerXBlock(StudioEditableXBlockMixin, XBlock):
         else:
             scaled_score = None
 
-        self.runtime.rebind_noauth_module_to_user(self, user)
+        self.runtime.service(self, 'rebind_user').rebind_noauth_module_to_user(self, user)
 
         # have to publish for the progress page...
         self.runtime.publish(
diff --git a/lti_consumer/tests/unit/test_lti_xblock.py b/lti_consumer/tests/unit/test_lti_xblock.py
index 81178dfe379d3591632fcb27b651afea5c28ab22..604f3ab4c5933e3beed54fbb0d6508fb5085b761 100644
--- a/lti_consumer/tests/unit/test_lti_xblock.py
+++ b/lti_consumer/tests/unit/test_lti_xblock.py
@@ -1074,10 +1074,12 @@ class TestResultServiceHandler(TestLtiConsumerXBlock):
         mock_runtime = self.xblock.runtime = Mock()
         mock_lti_consumer = Mock()
         mock_user = Mock()
+        mock_rebind_user_service = Mock()
+        mock_runtime.service.return_value = mock_rebind_user_service
 
         self.xblock._result_service_get(mock_lti_consumer, mock_user)  # pylint: disable=protected-access
 
-        mock_runtime.rebind_noauth_module_to_user.assert_called_with(self.xblock, mock_user)
+        mock_rebind_user_service.rebind_noauth_module_to_user.assert_called_with(self.xblock, mock_user)
         mock_lti_consumer.get_result.assert_called_with()
 
     @patch('lti_consumer.lti_xblock.LtiConsumerXBlock.module_score', PropertyMock(return_value=0.5))
@@ -1210,12 +1212,15 @@ class TestSetScore(TestLtiConsumerXBlock):
 
     def test_rebind_called(self):
         """
-        Test that `runtime.rebind_noauth_module_to_user` is called
+        Test that `rebind_noauth_module_to_user` service is called
         """
+        mock_rebind_user_service = Mock()
+        self.xblock.runtime.service = Mock()
+        self.xblock.runtime.service.return_value = mock_rebind_user_service
         user = Mock(user_id=FAKE_USER_ID)
         self.xblock.set_user_module_score(user, 0.92, 1.0, 'Great Job!')
 
-        self.xblock.runtime.rebind_noauth_module_to_user.assert_called_with(self.xblock, user)
+        mock_rebind_user_service.rebind_noauth_module_to_user.assert_called_with(self.xblock, user)
 
     def test_publish_grade_event_called(self):
         """