diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py
index 373754b24b8036fa9f5879aa90125865e5d94ad4..2123a9983f1d5dc745667670b85c4f89b2cbe24a 100644
--- a/lib/rapi/rlib2.py
+++ b/lib/rapi/rlib2.py
@@ -1002,40 +1002,22 @@ class R_2_instances_name_prepare_export(baserlib.OpcodeResource):
       })
 
 
-def _ParseExportInstanceRequest(name, data):
-  """Parses a request for an instance export.
-
-  @rtype: L{opcodes.OpBackupExport}
-  @return: Instance export opcode
-
-  """
-  # Rename "destination" to "target_node"
-  try:
-    data["target_node"] = data.pop("destination")
-  except KeyError:
-    pass
-
-  return baserlib.FillOpcode(opcodes.OpBackupExport, data, {
-    "instance_name": name,
-    })
-
-
-class R_2_instances_name_export(baserlib.ResourceBase):
+class R_2_instances_name_export(baserlib.OpcodeResource):
   """/2/instances/[instance_name]/export resource.
 
   """
-  def PUT(self):
-    """Exports an instance.
+  PUT_OPCODE = opcodes.OpBackupExport
+  PUT_RENAME = {
+    "destination": "target_node",
+    }
 
-    @return: a job id
+  def GetPutOpInput(self):
+    """Exports an instance.
 
     """
-    if not isinstance(self.request_body, dict):
-      raise http.HttpBadRequest("Invalid body contents, not a dictionary")
-
-    op = _ParseExportInstanceRequest(self.items[0], self.request_body)
-
-    return self.SubmitJob([op])
+    return (self.request_body, {
+      "instance_name": self.items[0],
+      })
 
 
 def _ParseMigrateInstanceRequest(name, data):
diff --git a/test/ganeti.rapi.rlib2_unittest.py b/test/ganeti.rapi.rlib2_unittest.py
index 9801bb34a2dc0c28da56875fc5a8df819418c5ed..034efe200d624f74c783f6ea4e0fcaf2a2c32337 100755
--- a/test/ganeti.rapi.rlib2_unittest.py
+++ b/test/ganeti.rapi.rlib2_unittest.py
@@ -653,13 +653,10 @@ class TestParseInstanceCreateRequestVersion1(testutils.GanetiTestCase):
         self.assertRaises(http.HttpBadRequest, self.Parse, data, False)
 
 
-class TestParseExportInstanceRequest(testutils.GanetiTestCase):
-  def setUp(self):
-    testutils.GanetiTestCase.setUp(self)
-
-    self.Parse = rlib2._ParseExportInstanceRequest
-
+class TestBackupExport(unittest.TestCase):
   def test(self):
+    clfactory = _FakeClientFactory(_FakeClient)
+
     name = "instmoo"
     data = {
       "mode": constants.EXPORT_MODE_REMOTE,
@@ -669,34 +666,66 @@ class TestParseExportInstanceRequest(testutils.GanetiTestCase):
       "x509_key_name": ["name", "hash"],
       "destination_x509_ca": "---cert---"
       }
-    op = self.Parse(name, data)
-    self.assert_(isinstance(op, opcodes.OpBackupExport))
+
+    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
+                             data, clfactory)
+    job_id = handler.PUT()
+
+    cl = clfactory.GetNextClient()
+    self.assertRaises(IndexError, clfactory.GetNextClient)
+
+    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
+    self.assertEqual(job_id, exp_job_id)
+    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
     self.assertEqual(op.instance_name, name)
     self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
+    self.assertEqual(op.target_node, [(1, 2, 3), (99, 99, 99)])
     self.assertEqual(op.shutdown, True)
     self.assertEqual(op.remove_instance, True)
-    self.assertEqualValues(op.x509_key_name, ("name", "hash"))
+    self.assertEqual(op.x509_key_name, ["name", "hash"])
     self.assertEqual(op.destination_x509_ca, "---cert---")
+    self.assertFalse(hasattr(op, "dry_run"))
+    self.assertFalse(hasattr(op, "force"))
+
+    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
 
   def testDefaults(self):
+    clfactory = _FakeClientFactory(_FakeClient)
+
     name = "inst1"
     data = {
       "destination": "node2",
       "shutdown": False,
       }
-    op = self.Parse(name, data)
-    self.assert_(isinstance(op, opcodes.OpBackupExport))
+
+    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
+                             data, clfactory)
+    job_id = handler.PUT()
+
+    cl = clfactory.GetNextClient()
+    self.assertRaises(IndexError, clfactory.GetNextClient)
+
+    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
+    self.assertEqual(job_id, exp_job_id)
+    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
     self.assertEqual(op.instance_name, name)
     self.assertEqual(op.target_node, "node2")
     self.assertFalse(hasattr(op, "mode"))
     self.assertFalse(hasattr(op, "remove_instance"))
     self.assertFalse(hasattr(op, "destination"))
+    self.assertFalse(hasattr(op, "dry_run"))
+    self.assertFalse(hasattr(op, "force"))
+
+    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
 
   def testErrors(self):
-    self.assertRaises(http.HttpBadRequest, self.Parse, "err1",
-                      { "remove_instance": "True", })
-    self.assertRaises(http.HttpBadRequest, self.Parse, "err1",
-                      { "remove_instance": "False", })
+    clfactory = _FakeClientFactory(_FakeClient)
+
+    for value in ["True", "False"]:
+      handler = _CreateHandler(rlib2.R_2_instances_name_export, ["err1"], {}, {
+        "remove_instance": value,
+        }, clfactory)
+      self.assertRaises(http.HttpBadRequest, handler.PUT)
 
 
 class TestParseMigrateInstanceRequest(testutils.GanetiTestCase):