diff --git a/src/com/mirantis/mk/Galera.groovy b/src/com/mirantis/mk/Galera.groovy
index 351e16a..09b9f1a 100644
--- a/src/com/mirantis/mk/Galera.groovy
+++ b/src/com/mirantis/mk/Galera.groovy
@@ -68,6 +68,7 @@
             testNode = "I@galera:master"
         } catch (Exception e) {
             common.errorMsg('Galera master is not reachable.')
+            common.errorMsg(e.getMessage())
             return 128
         }
     } else {
@@ -76,6 +77,7 @@
             common.infoMsg("Testing Galera slave minions: ${galeraSlaves}")
         } catch (Exception e) {
             common.errorMsg("Cannot obtain Galera slave minions list.")
+            common.errorMsg(e.getMessage())
             return 129
         }
         for (minion in galeraSlaves) {
@@ -116,6 +118,7 @@
         out = salt.runSaltProcessStep(env, "${testNode}", "mysql.status", [], null, false)
     } catch (Exception e) {
         common.errorMsg('Could not determine mysql status.')
+        common.errorMsg(e.getMessage())
         return 256
     }
     if (out) {
@@ -123,6 +126,7 @@
             status = validateAndPrintGaleraStatusReport(env, out, testNode)
         } catch (Exception e) {
             common.errorMsg('Could not parse the mysql status output. Check it manually.')
+            common.errorMsg(e.getMessage())
             return 1
         }
     } else {
@@ -256,8 +260,9 @@
         } else {
             members = salt.getReturnValues(salt.getPillar(env, "I@galera:master", "galera:master:members"))
         }
-    } catch (Exception er) {
+    } catch (Exception e) {
         common.errorMsg('Could not retrieve members list')
+        common.errorMsg(e.getMessage())
         return 'I@galera:master'
     }
     if (members) {
@@ -275,8 +280,9 @@
                 if (seqno > highestSeqno) {
                     lastNode << [ip: "${member.host}", seqno: seqno]
                 }
-            } catch (Exception er) {
+            } catch (Exception e) {
                 common.warningMsg("Could not determine 'seqno' value for node ${member.host} ")
+                common.warningMsg(e.getMessage())
             }
         }
     }
diff --git a/src/com/mirantis/mk/Salt.groovy b/src/com/mirantis/mk/Salt.groovy
index ca4587e..db2c570 100644
--- a/src/com/mirantis/mk/Salt.groovy
+++ b/src/com/mirantis/mk/Salt.groovy
@@ -1225,4 +1225,67 @@
         }
     }
     return result
+}
+
+/**
+* Checks if required package is installed and returns averaged IO stats for selected disks.
+* Allows getting averaged values of specific parameter for all disks or a specified disk.
+* Interval between checks and its number is parametrized and configurable.
+*
+* @param saltId         Salt Connection object or pepperEnv (the command will be sent using the selected method)
+* @param target         Node to be targeted (Should only match 1 node)
+* @param parameterName  Name of parameter from 'iostat' output (default = '' -- returns all variables)
+* @param interval       Interval between checks (default = 1)
+* @param count          Number of checks (default = 5)
+* @param disks          Disks to be checked (default = '' -- returns all disks)
+* @param output         Print Salt command return (default = true)
+* @return Map           Map containing desired values in format ['disk':'value']
+*/
+
+def getIostatValues(Map params) {
+    def common = new com.mirantis.mk.Common()
+    def ret = [:]
+    if (isPackageInstalled(params.saltId, params.target, 'sysstat', false)) {
+        def arg = [params.get('interval', 1), params.get('count', 5), params.get('disks', '')]
+        def res = getReturnValues(runSaltProcessStep(params.saltId, params.target, 'disk.iostat', arg, null, params.output))
+        if (res instanceof Map) {
+            for (int i = 0; i < res.size(); i++) {
+                def key = res.keySet()[i]
+                if (params.containsKey('parameterName')) {
+                    if (res[key].containsKey(params.parameterName)){
+                        ret[key] = res[key][params.parameterName]
+                    } else {
+                        common.errorMsg("Parameter '${params.parameterName}' not found for disk '${key}'. Valid parameter for this disk are: '${res[key].keySet()}'")
+                    }
+                } else {
+                    return res      // If no parameterName is defined, return all of them.
+                }
+            }
+        }
+    } else {
+        common.errorMsg("Package 'sysstat' seems not to be installed on at least one of tageted nodes: ${params.target}. Please fix this to be able to check 'iostat' values. Find more in the docs TODO:<Add docs link>")
+    }
+    return ret
+}
+
+/**
+* Checks if defined package is installed on all nodes defined by target parameter.
+*
+* @param saltId         Salt Connection object or pepperEnv (the command will be sent using the selected method)
+* @param target         Node or nodes to be targeted
+* @param packageName    Name of package to be checked
+* @param output         Print Salt command return (default = true)
+* @return boolean       True if package is installed on all defined nodes. False if not found on at least one of defined nodes.
+*/
+
+def isPackageInstalled(Map params) {
+    def output = params.get('output', true)
+    def res = runSaltProcessStep(params.saltId, params.target, "pkg.info_installed", params.packageName, null, output)['return'][0]
+    for (int i = 0; i < res.size(); i++) {
+        def key = res.keySet()[i]
+        if (!(res[key] instanceof Map && res[key].containsKey(params.packageName))) {
+            return false
+        }
+    }
+    return true
 }
\ No newline at end of file
