diff --git a/lib/build/rpc_definitions.py b/lib/build/rpc_definitions.py
index 79644b42e576b4baba3dd0170d6a0ff4f755dda9..1e22549573507ff30932100345314c57128254d1 100644
--- a/lib/build/rpc_definitions.py
+++ b/lib/build/rpc_definitions.py
@@ -146,6 +146,9 @@ _INSTANCE_CALLS = [
     ("success", None, "Whether the migration succeeded or not"),
     ("live", None, "Whether the user requested a live migration or not"),
     ], None, "Finalize the instance migration on the source node"),
+  ("instance_get_migration_status", SINGLE, TMO_SLOW, [
+    ("instance", INST_TO_DICT, "Instance object"),
+    ], "self._MigrationStatusPostProc", "Report migration status"),
   ("instance_start", SINGLE, TMO_NORMAL, [
     ("instance_hvp_bep", "self._InstDictHvpBep(%s)", None),
     ("startup_paused", None, None),
diff --git a/lib/rpc.py b/lib/rpc.py
index c4efad8072be6bcd3fd3e371281b0216808c9df9..fcead58f94baa8ebe8775916ca60530eeebefb56 100644
--- a/lib/rpc.py
+++ b/lib/rpc.py
@@ -493,6 +493,12 @@ class RpcRunner(_generated_rpc.RpcClientDefault,
 
     return self._proc(node_list, procedure, body, read_timeout=timeout)
 
+  @staticmethod
+  def _MigrationStatusPostProc(result):
+    if not result.fail_msg and result.payload is not None:
+      result.payload = objects.MigrationStatus.FromDict(result.payload)
+    return result
+
   @staticmethod
   def _BlockdevFindPostProc(result):
     if not result.fail_msg and result.payload is not None: