diff --git a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_bios.py b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_bios.py
index be92c16..ca63292 100644
--- a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_bios.py
+++ b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_bios.py
@@ -1,6 +1,8 @@
 #
 # Copyright 2018 Red Hat Inc.
 #
+# Copyright (c) 2022 Dell Inc. or its subsidiaries.
+#
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
 # a copy of the License at
@@ -49,3 +51,82 @@
         ]
 
         self.check_bios_apply_and_reset_configuration(self.node, settings)
+
+
+class BaremetalIdracBiosCleaning(
+        bsm.BaremetalStandaloneScenarioTest):
+
+    mandatory_attr = ['driver', 'bios_interface']
+
+    credentials = ['primary', 'admin']
+    driver = 'idrac'
+    delete_node = False
+    api_microversion = '1.40'
+
+    def _get_bios_setting_to_update(self):
+        _, bios_settings = self.baremetal_client.\
+            list_node_bios_settings(self.node['uuid'])
+
+        for attr_name in bios_settings['bios']:
+            if attr_name['name'] == "ProcVirtualization":
+                if attr_name['value'] == 'Disabled':
+                    new_attr_value = "Enabled"
+                else:
+                    new_attr_value = "Disabled"
+        setting_to_update = [
+            {
+                "name": "ProcVirtualization",
+                "value": new_attr_value
+            }
+        ]
+
+        return setting_to_update
+
+    def _verify_bios_settings(self, bios_settings_to_verify):
+        _, current_bios_settings = self.baremetal_client.\
+            list_node_bios_settings(self.node['uuid'])
+
+        for setting in bios_settings_to_verify:
+            found_setting = None
+            for i in current_bios_settings['bios']:
+                if i['name'] == setting['name']:
+                    found_setting = i
+                    break
+            self.assertIsNotNone(found_setting)
+            self.assertEqual(setting['value'], found_setting['value'])
+
+    @decorators.idempotent_id('6ded82ab-b444-436b-bb78-06fa5957d6c3')
+    def test_bios_apply_configuration(self):
+        setting = self._get_bios_setting_to_update()
+        clean_steps = [
+            {
+                "interface": "bios",
+                "step": "apply_configuration",
+                "args": {"settings": setting}
+            }
+        ]
+
+        self.manual_cleaning(self.node, clean_steps=clean_steps)
+        self._verify_bios_settings(setting)
+
+        restore_setting = self._get_bios_setting_to_update()
+        clean_steps_restore = [
+            {
+                "interface": "bios",
+                "step": "apply_configuration",
+                "args": {"settings": restore_setting}
+            }
+        ]
+
+        self.manual_cleaning(self.node, clean_steps=clean_steps_restore)
+        self._verify_bios_settings(restore_setting)
+
+
+class BaremetalIdracRedfishBios(
+        BaremetalIdracBiosCleaning):
+    bios_interface = 'idrac-redfish'
+
+
+class BaremetalIdracWSManBios(
+        BaremetalIdracBiosCleaning):
+    bios_interface = 'idrac-wsman'
