diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py
index eaba1fe6537caeda045b92618c5901dd314a1520..87d5fddf715e3f4488c67b1c93b6f941887af7ee 100755
--- a/qa/ganeti-qa.py
+++ b/qa/ganeti-qa.py
@@ -469,21 +469,35 @@ def RunExclusiveStorageTests():
     if qa_config.TestEnabled("instance-add-plain-disk"):
       # Make sure that the cluster doesn't have any pre-existing problem
       qa_cluster.AssertClusterVerify()
+
+      # Create and allocate instances
       instance1 = qa_instance.TestInstanceAddWithPlainDisk([node])
-      instance2 = qa_instance.TestInstanceAddWithPlainDisk([node])
-      # cluster-verify checks that disks are allocated correctly
-      qa_cluster.AssertClusterVerify()
-      qa_instance.TestInstanceRemove(instance1)
-      qa_instance.TestInstanceRemove(instance2)
+      try:
+        instance2 = qa_instance.TestInstanceAddWithPlainDisk([node])
+        try:
+          # cluster-verify checks that disks are allocated correctly
+          qa_cluster.AssertClusterVerify()
+
+          # Remove instances
+          qa_instance.TestInstanceRemove(instance2)
+          qa_instance.TestInstanceRemove(instance1)
+        finally:
+          qa_config.ReleaseInstance(instance2)
+      finally:
+        qa_config.ReleaseInstance(instance1)
+
     if qa_config.TestEnabled("instance-add-drbd-disk"):
       snode = qa_config.AcquireNode()
       try:
         qa_cluster.TestSetExclStorCluster(False)
         instance = qa_instance.TestInstanceAddWithDrbdDisk([node, snode])
-        qa_cluster.TestSetExclStorCluster(True)
-        exp_err = [constants.CV_EINSTANCEUNSUITABLENODE]
-        qa_cluster.AssertClusterVerify(fail=True, errors=exp_err)
-        qa_instance.TestInstanceRemove(instance)
+        try:
+          qa_cluster.TestSetExclStorCluster(True)
+          exp_err = [constants.CV_EINSTANCEUNSUITABLENODE]
+          qa_cluster.AssertClusterVerify(fail=True, errors=exp_err)
+          qa_instance.TestInstanceRemove(instance)
+        finally:
+          qa_config.ReleaseInstance(instance)
       finally:
         qa_config.ReleaseNode(snode)
     qa_cluster.TestSetExclStorCluster(old_es)
@@ -506,25 +520,29 @@ def RunInstanceTests():
       inodes = qa_config.AcquireManyNodes(num_nodes)
       try:
         instance = RunTest(create_fun, inodes)
+        try:
+          RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
+          RunDaemonTests(instance)
+          for node in inodes:
+            RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, node)
+          if len(inodes) > 1:
+            RunTestIf("group-rwops", qa_group.TestAssignNodesIncludingSplit,
+                      constants.INITIAL_NODE_GROUP_NAME,
+                      inodes[0]["primary"], inodes[1]["primary"])
+          if qa_config.TestEnabled("instance-convert-disk"):
+            RunTest(qa_instance.TestInstanceShutdown, instance)
+            RunTest(qa_instance.TestInstanceConvertDiskToPlain,
+                    instance, inodes)
+            RunTest(qa_instance.TestInstanceStartup, instance)
+          RunCommonInstanceTests(instance)
+          RunGroupListTests()
+          RunExportImportTests(instance, inodes)
+          RunHardwareFailureTests(instance, inodes)
+          RunRepairDiskSizes()
+          RunTest(qa_instance.TestInstanceRemove, instance)
+        finally:
+          qa_config.ReleaseInstance(instance)
 
-        RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
-        RunDaemonTests(instance)
-        for node in inodes:
-          RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, node)
-        if len(inodes) > 1:
-          RunTestIf("group-rwops", qa_group.TestAssignNodesIncludingSplit,
-                    constants.INITIAL_NODE_GROUP_NAME,
-                    inodes[0]["primary"], inodes[1]["primary"])
-        if qa_config.TestEnabled("instance-convert-disk"):
-          RunTest(qa_instance.TestInstanceShutdown, instance)
-          RunTest(qa_instance.TestInstanceConvertDiskToPlain, instance, inodes)
-          RunTest(qa_instance.TestInstanceStartup, instance)
-        RunCommonInstanceTests(instance)
-        RunGroupListTests()
-        RunExportImportTests(instance, inodes)
-        RunHardwareFailureTests(instance, inodes)
-        RunRepairDiskSizes()
-        RunTest(qa_instance.TestInstanceRemove, instance)
         del instance
       finally:
         qa_config.ReleaseManyNodes(inodes)
@@ -578,9 +596,12 @@ def RunQa():
         for use_client in [True, False]:
           rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
                                   use_client)
-          if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
-            RunCommonInstanceTests(rapi_instance)
-          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
+          try:
+            if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
+              RunCommonInstanceTests(rapi_instance)
+            RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
+          finally:
+            qa_config.ReleaseInstance(rapi_instance)
           del rapi_instance
 
   finally:
@@ -603,15 +624,18 @@ def RunQa():
     if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
       for shutdown in [False, True]:
         instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, [pnode])
-        expnode = qa_config.AcquireNode(exclude=pnode)
         try:
-          if shutdown:
-            # Stop instance before exporting and removing it
-            RunTest(qa_instance.TestInstanceShutdown, instance)
-          RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
-          RunTest(qa_instance.TestBackupList, expnode)
+          expnode = qa_config.AcquireNode(exclude=pnode)
+          try:
+            if shutdown:
+              # Stop instance before exporting and removing it
+              RunTest(qa_instance.TestInstanceShutdown, instance)
+            RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
+            RunTest(qa_instance.TestBackupList, expnode)
+          finally:
+            qa_config.ReleaseNode(expnode)
         finally:
-          qa_config.ReleaseNode(expnode)
+          qa_config.ReleaseInstance(instance)
         del expnode
         del instance
       qa_cluster.AssertClusterVerify()
diff --git a/qa/qa_instance.py b/qa/qa_instance.py
index bcc464a07b5f42ad94a062c57f06f0a6faa6b583..349ef5cbce3dc5a23ad1debfa50523383e1e849e 100644
--- a/qa/qa_instance.py
+++ b/qa/qa_instance.py
@@ -210,8 +210,6 @@ def TestInstanceRemove(instance):
   """gnt-instance remove"""
   AssertCommand(["gnt-instance", "remove", "-f", instance["name"]])
 
-  qa_config.ReleaseInstance(instance)
-
 
 @InstanceCheck(INST_DOWN, INST_UP, FIRST_ARG)
 def TestInstanceStartup(instance):
@@ -675,7 +673,6 @@ def TestInstanceExportWithRemove(instance, node):
   """gnt-backup export --remove-instance"""
   AssertCommand(["gnt-backup", "export", "-n", node["primary"],
                  "--remove-instance", instance["name"]])
-  qa_config.ReleaseInstance(instance)
 
 
 @InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
diff --git a/qa/qa_rapi.py b/qa/qa_rapi.py
index 4ffa9163ed979d75f8d2d80893e2cb9dbf958e5d..c9af6cb52a2e13d33f6cd019bbbc91c159e7a9f2 100644
--- a/qa/qa_rapi.py
+++ b/qa/qa_rapi.py
@@ -614,8 +614,6 @@ def TestRapiInstanceRemove(instance, use_client):
 
   _WaitForRapiJob(job_id)
 
-  qa_config.ReleaseInstance(instance)
-
 
 @InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
 def TestRapiInstanceMigrate(instance):