diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py
index a27cf8acf658072675c9178e4d7b05f15def1ba9..1a93e9790eb1f7a7785350aaf99781d2b6285387 100755
--- a/qa/ganeti-qa.py
+++ b/qa/ganeti-qa.py
@@ -189,9 +189,9 @@ def RunClusterTests():
      qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
     (["cluster-oob", qa_config.NoVirtualCluster],
      qa_cluster.TestClusterOob),
-    ("rapi", qa_rapi.TestVersion),
-    ("rapi", qa_rapi.TestEmptyCluster),
-    ("rapi", qa_rapi.TestRapiQuery),
+    (qa_rapi.Enabled, qa_rapi.TestVersion),
+    (qa_rapi.Enabled, qa_rapi.TestEmptyCluster),
+    (qa_rapi.Enabled, qa_rapi.TestRapiQuery),
     ]:
     RunTestIf(test, fn)
 
@@ -209,7 +209,7 @@ def RunOsTests():
   """
   os_enabled = ["os", qa_config.NoVirtualCluster]
 
-  if qa_config.TestEnabled("rapi"):
+  if qa_config.TestEnabled(qa_rapi.Enabled):
     rapi_getos = qa_rapi.GetOperatingSystems
   else:
     rapi_getos = None
@@ -240,16 +240,16 @@ def RunCommonInstanceTests(instance):
 
   """
   RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
-  RunTestIf(["instance-shutdown", "instance-console", "rapi"],
+  RunTestIf(["instance-shutdown", "instance-console", qa_rapi.Enabled],
             qa_rapi.TestRapiStoppedInstanceConsole, instance)
   RunTestIf(["instance-shutdown", "instance-modify"],
             qa_instance.TestInstanceStoppedModify, instance)
   RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
 
   # Test shutdown/start via RAPI
-  RunTestIf(["instance-shutdown", "rapi"],
+  RunTestIf(["instance-shutdown", qa_rapi.Enabled],
             qa_rapi.TestRapiInstanceShutdown, instance)
-  RunTestIf(["instance-shutdown", "rapi"],
+  RunTestIf(["instance-shutdown", qa_rapi.Enabled],
             qa_rapi.TestRapiInstanceStartup, instance)
 
   RunTestIf("instance-list", qa_instance.TestInstanceList)
@@ -257,11 +257,11 @@ def RunCommonInstanceTests(instance):
   RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
 
   RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
-  RunTestIf(["instance-modify", "rapi"],
+  RunTestIf(["instance-modify", qa_rapi.Enabled],
             qa_rapi.TestRapiInstanceModify, instance)
 
   RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
-  RunTestIf(["instance-console", "rapi"],
+  RunTestIf(["instance-console", qa_rapi.Enabled],
             qa_rapi.TestRapiInstanceConsole, instance)
 
   DOWN_TESTS = qa_config.Either([
@@ -275,7 +275,7 @@ def RunCommonInstanceTests(instance):
 
   # now run the 'down' state tests
   RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
-  RunTestIf(["instance-reinstall", "rapi"],
+  RunTestIf(["instance-reinstall", qa_rapi.Enabled],
             qa_rapi.TestRapiInstanceReinstall, instance)
 
   if qa_config.TestEnabled("instance-rename"):
@@ -286,13 +286,13 @@ def RunCommonInstanceTests(instance):
       # perform instance rename to the same name
       RunTest(qa_instance.TestInstanceRenameAndBack,
               rename_source, rename_source)
-      RunTestIf("rapi", qa_rapi.TestRapiInstanceRenameAndBack,
+      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceRenameAndBack,
                 rename_source, rename_source)
       if rename_target is not None:
         # perform instance rename to a different name, if we have one configured
         RunTest(qa_instance.TestInstanceRenameAndBack,
                 rename_source, rename_target)
-        RunTestIf("rapi", qa_rapi.TestRapiInstanceRenameAndBack,
+        RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceRenameAndBack,
                   rename_source, rename_target)
     finally:
       tgt_instance.Release()
@@ -308,7 +308,7 @@ def RunCommonInstanceTests(instance):
 
   RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
 
-  RunTestIf("rapi", qa_rapi.TestInstance, instance)
+  RunTestIf(qa_rapi.Enabled, qa_rapi.TestInstance, instance)
 
   # Lists instances, too
   RunTestIf("node-list", qa_node.TestNodeList)
@@ -349,7 +349,7 @@ def RunGroupRwTests():
   RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
   RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
   RunTestIf("group-rwops", qa_group.TestGroupModify)
-  RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups)
+  RunTestIf(["group-rwops", qa_rapi.Enabled], qa_rapi.TestRapiNodeGroups)
   RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
             qa_group.GetDefaultGroup())
 
@@ -384,7 +384,7 @@ def RunExportImportTests(instance, inodes):
     finally:
       expnode.Release()
 
-  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
+  if qa_config.TestEnabled([qa_rapi.Enabled, "inter-cluster-instance-move"]):
     newinst = qa_config.AcquireInstance()
     try:
       tnode = qa_config.AcquireNode(exclude=inodes)
@@ -416,18 +416,18 @@ def RunHardwareFailureTests(instance, inodes):
 
   """
   RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
-  RunTestIf(["instance-failover", "rapi"],
+  RunTestIf(["instance-failover", qa_rapi.Enabled],
             qa_rapi.TestRapiInstanceFailover, instance)
 
   RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
-  RunTestIf(["instance-migrate", "rapi"],
+  RunTestIf(["instance-migrate", qa_rapi.Enabled],
             qa_rapi.TestRapiInstanceMigrate, instance)
 
   if qa_config.TestEnabled("instance-replace-disks"):
     # We just need alternative secondary nodes, hence "- 1"
     othernodes = qa_config.AcquireManyNodes(len(inodes) - 1, exclude=inodes)
     try:
-      RunTestIf("rapi", qa_rapi.TestRapiInstanceReplaceDisks, instance)
+      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceReplaceDisks, instance)
       RunTest(qa_instance.TestReplaceDisks,
               instance, inodes, othernodes)
     finally:
diff --git a/qa/qa_rapi.py b/qa/qa_rapi.py
index 39b6e4bc7aa90ead1cb1952a5266833d4dd14c8b..02b62ad80a9385dd84406ad9399e5720c0962724 100644
--- a/qa/qa_rapi.py
+++ b/qa/qa_rapi.py
@@ -88,12 +88,19 @@ def Setup(username, password):
   cfg_curl = rapi.client.GenericCurlConfig(cafile=_rapi_ca.name,
                                            proxy="")
 
-  _rapi_client = rapi.client.GanetiRapiClient(master.primary, port=port,
-                                              username=username,
-                                              password=password,
-                                              curl_config_fn=cfg_curl)
+  if qa_config.UseVirtualCluster():
+    # TODO: Implement full support for RAPI on virtual clusters
+    print qa_utils.FormatWarning("RAPI tests are not yet supported on"
+                                 " virtual clusters and will be disabled")
 
-  print "RAPI protocol version: %s" % _rapi_client.GetVersion()
+    assert _rapi_client is None
+  else:
+    _rapi_client = rapi.client.GanetiRapiClient(master.primary, port=port,
+                                                username=username,
+                                                password=password,
+                                                curl_config_fn=cfg_curl)
+
+    print "RAPI protocol version: %s" % _rapi_client.GetVersion()
 
 
 INSTANCE_FIELDS = ("name", "os", "pnode", "snodes",
@@ -126,7 +133,9 @@ def Enabled():
   """Return whether remote API tests should be run.
 
   """
-  return qa_config.TestEnabled("rapi")
+  # TODO: Implement RAPI tests for virtual clusters
+  return (qa_config.TestEnabled("rapi") and
+          not qa_config.UseVirtualCluster())
 
 
 def _DoTests(uris):