diff --git a/backupninja-backup-pipeline.groovy b/backupninja-backup-pipeline.groovy
index 9ed572d..6dbd540 100644
--- a/backupninja-backup-pipeline.groovy
+++ b/backupninja-backup-pipeline.groovy
@@ -44,32 +44,32 @@
         stage('Verify pillar for backups') {
             if (backupSaltMasterAndMaas) {
                 try {
-                    def masterPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:master:initial_data')
-                    if (masterPillar['return'].isEmpty()) {
+                    def masterPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:master:initial_data').get('return')[0].values()[0]
+                    if (masterPillar.isEmpty()) {
                         throw new Exception("Problem with salt-master pillar on 'I@salt:master' node.")
                     }
-                    def minionPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:minion:initial_data')
-                    if (minionPillar['return'].isEmpty()) {
+                    def minionPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:minion:initial_data').get('return')[0].values()[0]
+                    if (minionPillar.isEmpty()) {
                         throw new Exception("Problem with salt-minion pillar on I@salt:master node.")
                     }
                 }
                 catch (Exception e) {
                     common.errorMsg(e.getMessage())
                     common.errorMsg('Please fix your pillar. For more information check docs: https://docs.mirantis.com/mcp/latest/mcp-operations-guide/backup-restore/salt-master.html')
-                    return
+                    throw e
                 }
             }
             if (backupDogtag) {
                 try {
-                    def dogtagPillar = salt.getPillar(pepperEnv, "I@salt:master", "dogtag:server")
-                    if (dogtagPillar['return'].isEmpty()) {
+                    def dogtagPillar = salt.getPillar(pepperEnv, "I@dogtag:server", "dogtag:server").get('return')[0].values()[0]
+                    if (dogtagPillar.isEmpty()) {
                         throw new Exception("Problem with dogtag pillar on I@dogtag:server node.")
                     }
                 }
                 catch (Exception e) {
                     common.errorMsg(e.getMessage())
                     common.errorMsg("Looks like dogtag pillar is not defined. Fix your pillar or disable dogtag backup by setting the BACKUP_DOGTAG parameter to False if you're using different barbican backend.")
-                    return
+                    throw e
                 }
             }
         }
@@ -83,7 +83,7 @@
                     common.errorMsg(e.getMessage())
                     common.errorMsg("Pipeline wasn't able to detect backupninja:client pillar on Salt master node or the minion is not reachable")
                     currentBuild.result = "FAILURE"
-                    return
+                    throw e
                 }
 
                 def maasNodes = salt.getMinions(pepperEnv, 'I@maas:region')
@@ -124,7 +124,7 @@
                     common.errorMsg(e.getMessage())
                     common.errorMsg("Pipeline wasn't able to detect node with backupninja:client and dogtag:server pillars defined or the minion is not reachable")
                     currentBuild.result = "FAILURE"
-                    return
+                    throw e
                 }
             }
 
@@ -136,7 +136,7 @@
                 common.errorMsg(e.getMessage())
                 common.errorMsg("Pipeline wasn't able to detect backupninja:server pillar or the minion is not reachable")
                 currentBuild.result = "FAILURE"
-                return
+                throw e
             }
         }
         stage('Prepare for backup') {
diff --git a/backupninja-restore-pipeline.groovy b/backupninja-restore-pipeline.groovy
index 6deb919..f617f1b 100644
--- a/backupninja-restore-pipeline.groovy
+++ b/backupninja-restore-pipeline.groovy
@@ -18,48 +18,48 @@
         stage('Verify pillar for restore') {
             if (restoreSaltMasterAndMaas) {
                 try {
-                    def masterPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:master:initial_data')
-                    if(masterPillar['return'].isEmpty()) {
+                    def masterPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:master:initial_data').get('return')[0].values()[0]
+                    if(masterPillar.isEmpty()) {
                         throw new Exception("Problem with salt-master pillar on 'I@salt:master' node.")
                     }
-                    def minionPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:minion:initial_data')
-                    if(minionPillar['return'].isEmpty()) {
+                    def minionPillar = salt.getPillar(pepperEnv, "I@salt:master", 'salt:minion:initial_data').get('return')[0].values()[0]
+                    if(minionPillar.isEmpty()) {
                         throw new Exception("Problem with salt-minion pillar on 'I@salt:master' node.")
                     }
                 }
                 catch (Exception e){
                     common.errorMsg(e.getMessage())
                     common.errorMsg('Please fix your pillar. For more information check docs: https://docs.mirantis.com/mcp/latest/mcp-operations-guide/backup-restore/salt-master/salt-master-restore.html')
-                    return
+                    throw e
                 }
                 maasNodes = salt.getMinions(pepperEnv, 'I@maas:region')
             }
             if (!maasNodes.isEmpty()) {
                 try {
-                    def maaSPillar = salt.getPillar(pepperEnv, "I@maas:region", 'maas:region:database:initial_data')
-                    if (maaSPillar['return'].isEmpty()) {
+                    def maaSPillar = salt.getPillar(pepperEnv, "I@maas:region", 'maas:region:database:initial_data').get('return')[0].values()[0]
+                    if (maaSPillar.isEmpty()) {
                         throw new Exception("Problem with MaaS pillar on 'I@maas:region' node.")
                     }
                 }
                 catch (Exception e) {
                     common.errorMsg(e.getMessage())
                     common.errorMsg('Please fix your pillar. For more information check docs: https://docs.mirantis.com/mcp/latest/mcp-operations-guide/backup-restore/maas-postgresql/backupninja-postgresql-restore.html')
-                    return
+                    throw e
                 }
             } else {
                 common.warningMsg("No MaaS Pillar was found. You can ignore this if it's expected. Otherwise you should fix you pillar. Check: https://docs.mirantis.com/mcp/latest/mcp-operations-guide/backup-restore/maas-postgresql/backupninja-postgresql-restore.html")
             }
             if (restoreDogtag) {
                 try {
-                    def dogtagPillar = salt.getPillar(pepperEnv, "I@dogtag:server:role:master", 'dogtag:server:initial_data')
-                    if (dogtagPillar['return'].isEmpty()) {
+                    def dogtagPillar = salt.getPillar(pepperEnv, "I@dogtag:server:role:master", 'dogtag:server:initial_data').get('return')[0].values()[0]
+                    if (dogtagPillar.isEmpty()) {
                         throw new Exception("Problem with Dogtag pillar on 'I@dogtag:server:role:master' node.")
                     }
                 }
                 catch (Exception e) {
                     common.errorMsg(e.getMessage())
                     common.errorMsg('Please fix your pillar. For more information check docs: https://docs.mirantis.com/mcp/latest/mcp-operations-guide/backup-restore/dogtag/restore-dogtag.html')
-                    return
+                    throw e
                 }
             }
         }
