diff --git a/tcp_tests/managers/backup_restore_manager.py b/tcp_tests/managers/backup_restore_manager.py
new file mode 100644
index 0000000..e3b8c23
--- /dev/null
+++ b/tcp_tests/managers/backup_restore_manager.py
@@ -0,0 +1,148 @@
+#    Copyright 2018 Mirantis, Inc.
+#
+#    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
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tcp_tests import logger
+
+
+LOG = logger.logger
+
+
+class BackupRestoreManager(object):
+    """Helper manager for execution backup restore"""
+
+    backup_cmd = 'backupninja -n --run /etc/backup.d/200.backup.rsync'
+
+    def __init__(self, underlay, salt_api, backup_cmd=None):
+        self.underlay = underlay
+        self.__salt_api = salt_api
+        self.backup_cmd = backup_cmd or self.backup_cmd
+
+    @property
+    def salt_api(self):
+        return self.__salt_api
+
+    def create_backup(self, tgt, backup_cmd=backup_cmd):
+        return self.salt_api.enforce_state(tgt, 'cmd.run', backup_cmd)
+
+    def restore_salt_master(self, tgt):
+        return self.salt_api.local(tgt, 'salt.master.restore')
+
+    def restore_salt_minion(self, tgt):
+        return self.salt_api.local(tgt, 'salt.minion.restore')
+
+    def create_mysql_backup_backupninja(self, tgt, ):
+        rets = []
+        res = self.salt_api.enforce_state(
+            tgt, 'cmd.run',
+            'backupninja -n --run /etc/backup.d/101.mysql')
+        rets.append(res)
+        res_rsync = self.salt_api.enforce_state(tgt, 'cmd.run')
+        rets.append(res_rsync)
+        return rets
+
+    def restore_mysql_backupninja(self, tgt):
+        # Running this state restores the databases and creates a file
+        # for every restored database in /root/mysql/flags.
+        return self.salt_api.local(tgt, 'mysql.client')
+
+    def create_mysql_xtrabackup(self, tgt, backup_cmd=backup_cmd):
+        # Should be run on mysql master node
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', '/usr/local/bin/innobackupex-runner.sh')
+
+    def check_mysql_xtrabackup_rsynced(self, tgt='I@xtrabackup:server'):
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', 'ls /var/backups/mysql/xtrabackup/full')
+
+    def stop_mysql_slave(self, tgt='I@galera:slave'):
+        return self.salt_api.enforce_state(tgt, 'service.stop mysql')
+
+    def remove_mysql_logs(self, tgt='I@galera:slave'):
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', 'rm /var/lib/mysql/ib_logfile*')
+
+    def stop_mysql_master(self, tgt='I@galera:master'):
+        return self.salt_api.enforce_state(tgt, 'service.stop mysql')
+
+    def disconnect_wresp_master(self, tgt='I@galera:master'):
+        # TODO fins the way updated wresp
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', 'wsrep_cluster_address=gcomm://')
+
+    def move_dbs_files_to_new_location(self, tgt='I@galera:master'):
+        cmds = ['mkdir -p /root/mysql/mysql.bak/',
+                'mv /var/lib/mysql/* /root/mysql/mysql.bak',
+                'rm /var/lib/mysql/.galera_bootstrap']
+        rest = []
+        for cmd in cmds:
+            res = self.salt_api.enforce_state(tgt, 'cmd.run', cmd)
+            rest.append(res)
+        return rest
+
+    def check_dbs_files_removed(self, tgt='I@galera:master'):
+        cmds = ['ls /var/lib/mysql/',
+                'ls -ld /var/lib/mysql/.?*']
+        rest = []
+        for cmd in cmds:
+            res = self.salt_api.enforce_state(tgt, 'cmd.run', cmd)
+            rest.append(res)
+        return rest
+
+    # run xtrabackup state on node where bacakup
+    def run_xtrabackup(self, tgt):
+        return self.salt_api.local(tgt, 'xtrabackup')
+
+    def start_mysql(self):
+        tgts = ['I@galera:master', 'I@galera:slave']
+        ret = []
+        for tgt in tgts:
+            res = self.salt_api.enforce_state(tgt, 'service.start mysql')
+            ret.append(res)
+        return ret
+
+    def check_galera_cluster(self, tgt='I@galera:master'):
+        return self.salt_api.enforce_state(
+            tgt, 'mysql.status | grep -A1 wsrep_cluster_size')
+
+    # #################Backup_Restore_Glance###################
+
+    def copy_glance_images_to_backup(self, path_to_backup,
+                                     tgt="I@glance:server and *01*"):
+        cmd = 'cp -a /var/lib/glance/images/. {}'.format(path_to_backup)
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', cmd)
+
+    def copy_glance_images_from_backup(self, path_to_backup,
+                                       tgt="I@glance:server and *01*"):
+        cmd = 'cp -a {}/. /var/lib/glance/images/'.format(path_to_backup)
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', cmd)
+
+    def check_images_after_backup(self, tgt="I@keystone:client"):
+        # TODO If the context of the Glance
+        # images files is lost, run the following commands:
+        # salt -C 'I@glance:server' cmd.run
+        # "chown glance:glance <IMAGE_FILE_NAME>"
+        # salt -C 'I@glance:server' cmd.run "chmod 640 <IMAGE_FILE_NAME>"
+        cmd = '. /root/keystonercv3; openstack image list'
+        return self.salt_api.enforce_state(tgt, 'cmd.run', cmd)
+
+    # #################Backup_Restore_cinder_volumes_and_snapshots###
+    # TODO Verify that a complete backup was created on
+    # the MySQL Galera Database Master node
+    # ls /var/backups/mysql/xtrabackup/full
+    # TODO(tleontovich): add method to check needed configs
+    # TODO (tleontovich): check pillars
+    # TODO (tleontovich): check  backup is created, and
+    # restore restores
