diff --git a/htest/Test/Ganeti/Luxi.hs b/htest/Test/Ganeti/Luxi.hs
index 8faf50ef3fb51ca93ffa818eb6e89a65868cffab..0dc39e96dca9509c5c8ff4edcf2ad5c05918a12e 100644
--- a/htest/Test/Ganeti/Luxi.hs
+++ b/htest/Test/Ganeti/Luxi.hs
@@ -82,6 +82,8 @@ instance Arbitrary Luxi.LuxiOp where
       Luxi.ReqAutoArchiveJobs -> Luxi.AutoArchiveJobs <$> arbitrary <*>
                                  arbitrary
       Luxi.ReqCancelJob -> Luxi.CancelJob <$> arbitrary
+      Luxi.ReqChangeJobPriority -> Luxi.ChangeJobPriority <$> arbitrary <*>
+                                   arbitrary
       Luxi.ReqSetDrainFlag -> Luxi.SetDrainFlag <$> arbitrary
       Luxi.ReqSetWatcherPause -> Luxi.SetWatcherPause <$> arbitrary
 
diff --git a/htools/Ganeti/Luxi.hs b/htools/Ganeti/Luxi.hs
index 8ad7f32b74bdf39d918567095a0ea5cf7c74d150..9b959fcd7adb682695aa277022bf5becf05dabf4 100644
--- a/htools/Ganeti/Luxi.hs
+++ b/htools/Ganeti/Luxi.hs
@@ -163,6 +163,10 @@ $(genLuxiOp "LuxiOp"
   , (luxiReqCancelJob,
      [ simpleField "job" [t| Int |] ]
     )
+  , (luxiReqChangeJobPriority,
+     [ simpleField "job" [t| Int |]
+     , simpleField "priority" [t| Int |] ]
+    )
   , (luxiReqSetDrainFlag,
      [ simpleField "flag" [t| Bool |] ]
     )
@@ -392,6 +396,10 @@ decodeCall (LuxiCall call args) =
               [job] <- fromJVal args
               rid <- parseJobId job
               return $ CancelJob rid
+    ReqChangeJobPriority -> do
+              (job, priority) <- fromJVal args
+              rid <- parseJobId job
+              return $ ChangeJobPriority rid priority
     ReqSetDrainFlag -> do
               [flag] <- fromJVal args
               return $ SetDrainFlag flag
diff --git a/lib/luxi.py b/lib/luxi.py
index 306952dead65412b7612c317dd48c0088b51d6ba..c32175361143ec58133d5e3e1e7547b95bdb50be 100644
--- a/lib/luxi.py
+++ b/lib/luxi.py
@@ -54,6 +54,7 @@ REQ_SUBMIT_MANY_JOBS = "SubmitManyJobs"
 REQ_WAIT_FOR_JOB_CHANGE = "WaitForJobChange"
 REQ_CANCEL_JOB = "CancelJob"
 REQ_ARCHIVE_JOB = "ArchiveJob"
+REQ_CHANGE_JOB_PRIORITY = "ChangeJobPriority"
 REQ_AUTO_ARCHIVE_JOBS = "AutoArchiveJobs"
 REQ_QUERY = "Query"
 REQ_QUERY_FIELDS = "QueryFields"
@@ -73,6 +74,7 @@ REQ_ALL = frozenset([
   REQ_ARCHIVE_JOB,
   REQ_AUTO_ARCHIVE_JOBS,
   REQ_CANCEL_JOB,
+  REQ_CHANGE_JOB_PRIORITY,
   REQ_QUERY,
   REQ_QUERY_CLUSTER_INFO,
   REQ_QUERY_CONFIG_VALUES,
@@ -488,6 +490,9 @@ class Client(object):
   def ArchiveJob(self, job_id):
     return self.CallMethod(REQ_ARCHIVE_JOB, (job_id, ))
 
+  def ChangeJobPriority(self, job_id, priority):
+    return self.CallMethod(REQ_CHANGE_JOB_PRIORITY, (job_id, priority))
+
   def AutoArchiveJobs(self, age):
     timeout = (DEF_RWTO - 1) / 2
     return self.CallMethod(REQ_AUTO_ARCHIVE_JOBS, (age, timeout))
diff --git a/lib/server/masterd.py b/lib/server/masterd.py
index 7cd7a80c79528076b0b11c1be37ecb8338cf6ef0..46be85efa9f44d8d103402e33dfac5fc920196b2 100644
--- a/lib/server/masterd.py
+++ b/lib/server/masterd.py
@@ -303,6 +303,12 @@ class ClientOps:
       logging.info("Received job cancel request for %s", job_id)
       return queue.CancelJob(job_id)
 
+    elif method == luxi.REQ_CHANGE_JOB_PRIORITY:
+      (job_id, priority) = args
+      logging.info("Received request to change priority for job %s to %s",
+                   job_id, priority)
+      return queue.ChangeJobPriority(job_id, priority)
+
     elif method == luxi.REQ_ARCHIVE_JOB:
       (job_id, ) = args
       logging.info("Received job archive request for %s", job_id)
diff --git a/test/ganeti.rapi.testutils_unittest.py b/test/ganeti.rapi.testutils_unittest.py
index 53dcaa74f802792598cb707618b70368a0e4dd9f..91ba27d66a3615da2c162d7d4e80f272b30927da 100755
--- a/test/ganeti.rapi.testutils_unittest.py
+++ b/test/ganeti.rapi.testutils_unittest.py
@@ -41,6 +41,7 @@ KNOWN_UNUSED_LUXI = frozenset([
   luxi.REQ_SUBMIT_MANY_JOBS,
   luxi.REQ_ARCHIVE_JOB,
   luxi.REQ_AUTO_ARCHIVE_JOBS,
+  luxi.REQ_CHANGE_JOB_PRIORITY,
   luxi.REQ_QUERY_EXPORTS,
   luxi.REQ_QUERY_CONFIG_VALUES,
   luxi.REQ_QUERY_TAGS,