diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp
index eafd9731ae59929a0125017f9c4a7c4c55f6457d..ee059d21bde0b4f362788ba51c4baea8abe9ab2e 100644
--- a/GUI/coregui/Models/JobItem.cpp
+++ b/GUI/coregui/Models/JobItem.cpp
@@ -20,6 +20,7 @@
 #include "InstrumentModel.h"
 #include "MultiLayerItem.h"
 #include "InstrumentItem.h"
+#include <QDebug>
 
 
 namespace
@@ -253,30 +254,38 @@ bool JobItem::runInBackground() const
     return combo_property.getValue() == Constants::JOB_RUN_IN_BACKGROUND;
 }
 
-MultiLayerItem *JobItem::getMultiLayerItem()
+//! Returns MultiLayerItem of this JobItem, if from_backup=true, then backup'ed version of
+//! multilayer will be used
+MultiLayerItem *JobItem::getMultiLayerItem(bool from_backup)
 {
     foreach(ParameterizedItem *item, childItems()) {
-        if(MultiLayerItem *multilayer = dynamic_cast<MultiLayerItem *>(item))
-            return multilayer;
+        qDebug() << "XXX" << item->itemName();
+        if(MultiLayerItem *multilayer = dynamic_cast<MultiLayerItem *>(item)) {
+            if(from_backup && multilayer->itemName().endsWith(Constants::JOB_BACKUP)) {
+                return multilayer;
+            }
+            if(!from_backup && !multilayer->itemName().endsWith(Constants::JOB_BACKUP)) {
+                return multilayer;
+            }
+        }
     }
     return 0;
-//    MultiLayerItem *result(0);
-//    if(m_sampleModel) {
-//        result = m_sampleModel->getMultiLayerItem();
-//    }
-//    return result;
 }
 
-InstrumentItem *JobItem::getInstrumentItem()
+//! Returns InstrumentItem of this JobItem, if from_backup=true, then backup'ed version of
+//! the instruyment will be used
+InstrumentItem *JobItem::getInstrumentItem(bool from_backup)
 {
     foreach(ParameterizedItem *item, childItems()) {
-        if(InstrumentItem *instrument = dynamic_cast<InstrumentItem *>(item))
-            return instrument;
+        if(InstrumentItem *instrument = dynamic_cast<InstrumentItem *>(item)) {
+            if(from_backup && instrument->itemName().endsWith(Constants::JOB_BACKUP)) {
+                return instrument;
+            }
+            if(!from_backup && !instrument->itemName().endsWith(Constants::JOB_BACKUP)) {
+                return instrument;
+            }
+        }
     }
     return 0;
-//    InstrumentItem *result(0);
-//    if(m_instrumentModel) {
-//        result = m_instrumentModel->getInstrumentItem();
-//    }
-//    return result;
 }
+
diff --git a/GUI/coregui/Models/JobItem.h b/GUI/coregui/Models/JobItem.h
index 6c15fe028c7f4a6cb874c38bed7c81686f2b9fc0..9de769ac284ef28d5939a7945603d5014b31370d 100644
--- a/GUI/coregui/Models/JobItem.h
+++ b/GUI/coregui/Models/JobItem.h
@@ -81,9 +81,9 @@ public:
     bool runImmediately() const;
     bool runInBackground() const;
 
-    MultiLayerItem *getMultiLayerItem();
+    MultiLayerItem *getMultiLayerItem(bool from_backup = false);
 
-    InstrumentItem *getInstrumentItem();
+    InstrumentItem *getInstrumentItem(bool from_backup = false);
 
 private:
 //    SampleModel *m_sampleModel;
diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp
index 12a36730cc7e3ac31e03b40989b1a141df48f9c1..663424276ad8b0bb63fc7bd0e8874f248ec8658e 100644
--- a/GUI/coregui/Models/JobModel.cpp
+++ b/GUI/coregui/Models/JobModel.cpp
@@ -89,22 +89,22 @@ JobItem *JobModel::getJobItemForIdentifier(const QString &identifier)
 //    return jobItem;
 //}
 
-JobItem *JobModel::addJob(const QString &sample_name, const QString &instrument_name, const QString &run_policy, int numberOfThreads)
-{
-    JobItem *jobItem = dynamic_cast<JobItem *>(insertNewItem(Constants::JobItemType));
-    jobItem->setItemName(generateJobName());
-    jobItem->setIdentifier(generateJobIdentifier());
-    jobItem->setNumberOfThreads(numberOfThreads);
-    jobItem->setRunPolicy(run_policy);
+//JobItem *JobModel::addJob(const QString &sample_name, const QString &instrument_name, const QString &run_policy, int numberOfThreads)
+//{
+//    JobItem *jobItem = dynamic_cast<JobItem *>(insertNewItem(Constants::JobItemType));
+//    jobItem->setItemName(generateJobName());
+//    jobItem->setIdentifier(generateJobIdentifier());
+//    jobItem->setNumberOfThreads(numberOfThreads);
+//    jobItem->setRunPolicy(run_policy);
 
-    setSampleForJobItem(jobItem, sample_name);
-    setInstrumentForJobItem(jobItem, instrument_name);
+//    setSampleForJobItem(jobItem, sample_name);
+//    setInstrumentForJobItem(jobItem, instrument_name);
 
-    if(jobItem->runImmediately() || jobItem->runInBackground())
-        m_queue_data->runJob(jobItem);
+//    if(jobItem->runImmediately() || jobItem->runInBackground())
+//        m_queue_data->runJob(jobItem);
 
-    return jobItem;
-}
+//    return jobItem;
+//}
 
 JobItem *JobModel::addJob(MultiLayerItem *multiLayerItem, InstrumentItem *instrumentItem, const QString &run_policy, int numberOfThreads)
 {
@@ -134,79 +134,145 @@ void JobModel::setInstrumentModel(InstrumentModel *instrumentModel)
 }
 
 //! The copy of sample with 'sample_name' from m_sampleModel will become a child of given job item
-void JobModel::setSampleForJobItem(JobItem *jobItem, const QString &sample_name)
-{
-    Q_ASSERT(m_sampleModel);
-    Q_ASSERT(jobItem);
+//void JobModel::setSampleForJobItem(JobItem *jobItem, const QString &sample_name)
+//{
+//    Q_ASSERT(m_sampleModel);
+//    Q_ASSERT(jobItem);
 
-    // removing old multilayer from children of given jobItem
-    MultiLayerItem *old_sample = jobItem->getMultiLayerItem();
-    if(old_sample) {
-        removeRows(indexOfItem(old_sample).row(), 1, indexOfItem(old_sample->parent()));
-    }
+//    // removing old multilayer from children of given jobItem
+//    MultiLayerItem *old_sample = jobItem->getMultiLayerItem();
+//    if(old_sample) {
+//        removeRows(indexOfItem(old_sample).row(), 1, indexOfItem(old_sample->parent()));
+//    }
 
-    // copying multilayer to jobItem
-    MultiLayerItem *multilayer = m_sampleModel->getMultiLayerItem(sample_name);
-    Q_ASSERT(multilayer);
+//    // copying multilayer to jobItem
+//    MultiLayerItem *multilayer = m_sampleModel->getMultiLayerItem(sample_name);
+//    Q_ASSERT(multilayer);
 
-    copyParameterizedItem(multilayer, jobItem);
+//    copyParameterizedItem(multilayer, jobItem);
+
+//    jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, multilayer->itemName());
+//}
 
-    jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, multilayer->itemName());
-}
 
-void JobModel::setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem)
+//! Adds a multilayer to children of given JobItem. If backup=true then multilayer will be added
+//! as a backup.
+void JobModel::setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem, bool backup)
 {
+    qDebug() << "WWW 1.1";
     Q_ASSERT(m_sampleModel);
     Q_ASSERT(jobItem);
     Q_ASSERT(multiLayerItem);
 
-    // removing old multilayer from children of given jobItem
-    MultiLayerItem *old_sample = jobItem->getMultiLayerItem();
+    // removing old multilayer (or its backup version) from children of given jobItem
+    qDebug() << "WWW 1.2";
+    MultiLayerItem *old_sample = jobItem->getMultiLayerItem(backup);
     if(old_sample) {
         removeRows(indexOfItem(old_sample).row(), 1, indexOfItem(old_sample->parent()));
     }
 
-    copyParameterizedItem(multiLayerItem, jobItem);
+    qDebug() << "WWW 1.3";
+    ParameterizedItem *new_item = copyParameterizedItem(multiLayerItem, jobItem);
+    QString name = new_item->itemName();
+    qDebug() << "WWW 1.4";
+    qDebug() << "OOO ";
+    qDebug() << "000 " << backup << name << name.remove(Constants::JOB_BACKUP);
+    name.remove(Constants::JOB_BACKUP);
+    jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, name);
+
+    if(backup) {
+        name.append(Constants::JOB_BACKUP);
+    }
+
+    new_item->setItemName(name);
+
 
-    jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, multiLayerItem->itemName());
 }
 
 //! The copy of instrument with 'instrument_name' from m_instrumentModel will become a child of
 //! given job item
-void JobModel::setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name)
+//void JobModel::setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name)
+//{
+//    Q_ASSERT(m_instrumentModel);
+//    Q_ASSERT(jobItem);
+
+//    // removing old instrument from children of given jobItem
+//    InstrumentItem *old = jobItem->getInstrumentItem();
+//    if (old) {
+//        removeRows(indexOfItem(old).row(), 1, indexOfItem(old->parent()));
+//    }
+
+//    // copying instrument to jobItem
+//    InstrumentItem *instrument = m_instrumentModel->getInstrumentItem(instrument_name);
+//    Q_ASSERT(instrument);
+//    copyParameterizedItem(instrument, jobItem);
+
+//    jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, instrument->itemName());
+//}
+
+void JobModel::setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem, bool backup)
 {
     Q_ASSERT(m_instrumentModel);
     Q_ASSERT(jobItem);
+    Q_ASSERT(instrumentItem);
 
     // removing old instrument from children of given jobItem
-    InstrumentItem *old = jobItem->getInstrumentItem();
+    InstrumentItem *old = jobItem->getInstrumentItem(backup);
     if (old) {
         removeRows(indexOfItem(old).row(), 1, indexOfItem(old->parent()));
     }
 
-    // copying instrument to jobItem
-    InstrumentItem *instrument = m_instrumentModel->getInstrumentItem(instrument_name);
-    Q_ASSERT(instrument);
-    copyParameterizedItem(instrument, jobItem);
+    ParameterizedItem *new_item = copyParameterizedItem(instrumentItem, jobItem);
+    QString name = new_item->itemName();
+    name.remove(Constants::JOB_BACKUP);
+    jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, name);
+
+    if(backup) {
+        name.append(Constants::JOB_BACKUP);
+    }
+
+    new_item->setItemName(name);
 
-    jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, instrument->itemName());
 }
 
-void JobModel::setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem)
+//! Backup instrument and sample model for given JobItem. If backup already exists, do nothing.
+void JobModel::backup(JobItem *jobItem)
 {
-    Q_ASSERT(m_instrumentModel);
-    Q_ASSERT(jobItem);
-    Q_ASSERT(instrumentItem);
+    if(!jobItem->getMultiLayerItem(true)) {
+        MultiLayerItem *multilayer = jobItem->getMultiLayerItem();
+        Q_ASSERT(multilayer);
 
-    // removing old instrument from children of given jobItem
-    InstrumentItem *old = jobItem->getInstrumentItem();
-    if (old) {
-        removeRows(indexOfItem(old).row(), 1, indexOfItem(old->parent()));
+        setSampleForJobItem(jobItem, multilayer, true);
     }
 
-    copyParameterizedItem(instrumentItem, jobItem);
+    if(!jobItem->getInstrumentItem(true)) {
+        InstrumentItem *instrument = jobItem->getInstrumentItem();
+        Q_ASSERT(instrument);
+
+        setInstrumentForJobItem(jobItem, instrument, true);
+    }
+}
+
+//! restore instrument and sample model from backup for given JobItem
+void JobModel::restore(JobItem *jobItem)
+{
+    jobItem->blockSignals(true);
+    qDebug() << " ";
+    qDebug() << " ";
+    qDebug() << " ";
+
+    MultiLayerItem *multilayer = jobItem->getMultiLayerItem(true);
+    qDebug() << "QQQ" << multilayer->itemName();
+    Q_ASSERT(multilayer);
+
+    setSampleForJobItem(jobItem, multilayer);
+
+    InstrumentItem *instrument = jobItem->getInstrumentItem(true);
+    Q_ASSERT(instrument);
+
+    setInstrumentForJobItem(jobItem, instrument);
 
-    jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, instrumentItem->itemName());
+    jobItem->blockSignals(false);
 }
 
 void JobModel::runJob(const QModelIndex &index)
diff --git a/GUI/coregui/Models/JobModel.h b/GUI/coregui/Models/JobModel.h
index 6380244fc299623fef2933ee84bbe1a3f1f29a19..9fe4f93e28ebc7ad501698ed658eb546a4ff74d4 100644
--- a/GUI/coregui/Models/JobModel.h
+++ b/GUI/coregui/Models/JobModel.h
@@ -42,8 +42,8 @@ public:
 //    JobItem *addJob(SampleModel *sampleModel, InstrumentModel *instrumentModel,
 //            const QString &run_policy = QString(), int numberOfThreads=-1);
 
-    JobItem *addJob(const QString &sample_name, const QString &instrument_name,
-            const QString &run_policy = QString(), int numberOfThreads=-1);
+//    JobItem *addJob(const QString &sample_name, const QString &instrument_name,
+//            const QString &run_policy = QString(), int numberOfThreads=-1);
 
     JobItem *addJob(MultiLayerItem *multiLayerItem, InstrumentItem *instrumentItem,
             const QString &run_policy = QString(), int numberOfThreads=-1);
@@ -52,13 +52,17 @@ public:
 
     void setInstrumentModel(InstrumentModel *instrumentModel);
 
-    void setSampleForJobItem(JobItem *jobItem, const QString &sample_name);
+//    void setSampleForJobItem(JobItem *jobItem, const QString &sample_name);
+
+    void setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem, bool backup = false);
+
 
-    void setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem);
+//    void setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name);
+    void setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem, bool backup=false);
 
+    void backup(JobItem *jobItem);
 
-    void setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name);
-    void setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem);
+    void restore(JobItem *jobItem);
 
 signals:
     void selectionChanged(JobItem *item);
diff --git a/GUI/coregui/Models/ParameterizedItem.cpp b/GUI/coregui/Models/ParameterizedItem.cpp
index 7f9001c2b8c1538b75a81020a84fd4cf54cde155..38914961e24f529b4cabba561a647544a2ea6c2b 100644
--- a/GUI/coregui/Models/ParameterizedItem.cpp
+++ b/GUI/coregui/Models/ParameterizedItem.cpp
@@ -255,16 +255,18 @@ QVariant ParameterizedItem::getRegisteredProperty(const QString &name) const
 
 void ParameterizedItem::removeRegisteredProperty(const QString &name)
 {
-    qDebug() << "ParameterizedItem::removeRegisteredProperty()" << name;
-    if (m_sub_items.contains(name)) {
-        qDebug()
-            << "       ParameterizedItem::removeRegisteredProperty() -> Removing property iteme";
-        delete m_sub_items[name];
-        m_sub_items.remove(name);
+    if(isRegisteredProperty(name)) {
+        qDebug() << "ParameterizedItem::removeRegisteredProperty()" << name;
+        if (m_sub_items.contains(name)) {
+            qDebug()
+                << "       ParameterizedItem::removeRegisteredProperty() -> Removing property iteme";
+            delete m_sub_items[name];
+            m_sub_items.remove(name);
+        }
+        m_registered_properties.removeOne(name);
+        m_property_attribute.remove(name);
+        setProperty(name.toUtf8().constData(), QVariant());
     }
-    m_registered_properties.removeOne(name);
-    m_property_attribute.remove(name);
-    setProperty(name.toUtf8().constData(), QVariant());
 }
 
 void ParameterizedItem::setPropertyAttribute(const QString &name,
diff --git a/GUI/coregui/Models/SessionModel.cpp b/GUI/coregui/Models/SessionModel.cpp
index 28ef8132b0fb07ef46178614a6db9cd47b40150d..de7481a35f79eeceea934b6382982e38f4de42ad 100644
--- a/GUI/coregui/Models/SessionModel.cpp
+++ b/GUI/coregui/Models/SessionModel.cpp
@@ -405,12 +405,12 @@ void SessionModel::moveParameterizedItem(ParameterizedItem *item, ParameterizedI
 }
 
 //! Copy given item to the new_parent at given raw. Item indended for copying can belong to
-//! another model and it will remains intact.
-void SessionModel::copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent, int row)
+//! another model and it will remains intact. Returns pointer to the new child.
+ParameterizedItem *SessionModel::copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent, int row)
 {
     if (new_parent) {
         if (!new_parent->acceptsAsChild(item_to_copy->modelType()))
-            return;
+            return 0;
     } else {
         new_parent = m_root_item;
     }
@@ -426,6 +426,8 @@ void SessionModel::copyParameterizedItem(ParameterizedItem *item_to_copy, Parame
     beginInsertRows(indexOfItem(new_parent), row, row);
     readItems(&reader, new_parent, row);
     endInsertRows();
+
+    return new_parent->childAt(row);
 }
 
 SessionModel *SessionModel::createCopy(ParameterizedItem *parent)
diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h
index de2864bfd61c2736c778d49a109f0b3d170b9f8a..410e4f25076c370836da7208ffb5f4aa3768cf29 100644
--- a/GUI/coregui/Models/SessionModel.h
+++ b/GUI/coregui/Models/SessionModel.h
@@ -117,7 +117,7 @@ public:
 
     void moveParameterizedItem(ParameterizedItem *item, ParameterizedItem *new_parent = 0, int row = -1);
 
-    void copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent = 0, int row = -1);
+    ParameterizedItem *copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent = 0, int row = -1);
 
 
     void setIconProvider(IconProvider *icon_provider) { m_iconProvider = icon_provider; }
diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h
index d5afadaca633243a800ac83f73bb9f2026e2a1ef..b351efd41b68f366e10d50b1bf432e01cff2326a 100644
--- a/GUI/coregui/Models/item_constants.h
+++ b/GUI/coregui/Models/item_constants.h
@@ -163,6 +163,7 @@ const ModelType AXIS_CONSTK_BINNING = "Const KBin";
 const ModelType JOB_RUN_IMMEDIATELY = "Immediately";
 const ModelType JOB_RUN_IN_BACKGROUND = "In background";
 const ModelType JOB_RUN_SUBMIT_ONLY = "Submit only";
+const ModelType JOB_BACKUP = "_backup";
 
 }
 
diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp
index 81f955cf679926178c32b9c22bba7a8e3a780fac..204922ad213db511e0f1426219fa5ac94216e1e6 100644
--- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp
+++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp
@@ -187,6 +187,8 @@ void ModelTuningWidget::backupModels()
     qDebug() << "ModelTuningWidget::backupModels()";
     if(!m_currentJobItem) return;
 
+    m_jobModel->backup(m_currentJobItem);
+
 //    if(!m_sampleModelBackup)
 //        m_sampleModelBackup = m_currentJobItem->getSampleModel()->createCopy();
 
@@ -200,15 +202,16 @@ void ModelTuningWidget::restoreModelsOfCurrentJobItem()
         return;
 
 //    qDebug() << "ModelTuningWidget::restoreModelsOfCurrentJobItem()";
-    Q_ASSERT(m_sampleModelBackup);
-    Q_ASSERT(m_instrumentModelBackup);
+//    Q_ASSERT(m_sampleModelBackup);
+//    Q_ASSERT(m_instrumentModelBackup);
     Q_ASSERT(m_currentJobItem);
 
+    m_jobModel->restore(m_currentJobItem);
+
 //    qDebug() << "ModelTuningWidget::restoreModelsOfCurrentJobItem() current"
 //             << m_currentJobItem->getSampleModel() << m_currentJobItem->getInstrumentModel()
 //             << " backup" << m_sampleModelBackup << m_instrumentModelBackup;
 
-    Q_ASSERT(0);
 //    m_currentJobItem->setSampleModel(m_sampleModelBackup->createCopy());
 //    m_currentJobItem->setInstrumentModel(m_instrumentModelBackup->createCopy());