diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp
index 60b028f5e682931bfbe11506661a7b34e9413720..271df34bcd76bdb192f433a21ebd12a75416cac2 100644
--- a/GUI/coregui/Models/BeamItems.cpp
+++ b/GUI/coregui/Models/BeamItems.cpp
@@ -157,15 +157,14 @@ SpecularBeamItem::SpecularBeamItem() : BeamItem(Constants::SpecularBeamType)
                     axis_item->updateIndicators();
             },
             this);
+
+    inclinationAxisGroup()->mapper()->setOnValueChange([this]() { updateWavelength(); }, this);
 }
 
 SpecularBeamItem::~SpecularBeamItem() = default;
 
 double SpecularBeamItem::getInclinationAngle() const
 {
-    Q_ASSERT(
-        dynamic_cast<BeamDistributionItem*>(getItem(P_INCLINATION_ANGLE))->meanValue()
-        == 0.0);
     return 0.0;
 }
 
@@ -203,19 +202,27 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units)
         inclinationAxisGroup()->setCurrentType(Constants::BasicAxisType);
         auto axis_item = currentInclinationAxisItem();
         axis_item->setItemValue(BasicAxisItem::P_NBINS, static_cast<int>(axis.size()));
-        auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
-        wl_item->setToRange(RealLimits::positive());
         return;
     }
 
     auto axis_group = inclinationAxisGroup();
-    axis_group->setCurrentType(Constants::PointwiseAxisType);
-    auto axis_item = static_cast<PointwiseAxisItem*>(axis_group->currentItem());
-    if (units == Constants::UnitsQyQz) {
-        auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
-        wl_item->setToRange(getLimits(axis.getMax()));
-    }
+    auto axis_item =
+        static_cast<PointwiseAxisItem*>(axis_group->getChildOfType(Constants::PointwiseAxisType));
     axis_item->init(axis, units);
+    axis_group->setCurrentType(Constants::PointwiseAxisType); // calls updateWavelength()
+    axis_item->updateIndicators();
+}
+
+void SpecularBeamItem::updateWavelength()
+{
+    auto item = inclinationAxisGroup()->currentItem();
+    auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
+    if (auto axis_item = dynamic_cast<PointwiseAxisItem*>(item)) {
+        auto axis = axis_item->getAxis();
+        if (axis && axis_item->getUnitsLabel() == Constants::UnitsQyQz)
+            wl_item->setToRange(getLimits(axis->getMax()));
+    } else
+        wl_item->setToRange(RealLimits::positive());
 }
 
 // GISAS beam item
diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h
index 73435a2e40974e4b9aa0fa22861fd87b75e5932f..e3605f487354770568318c49932a74a3d4b1e531 100644
--- a/GUI/coregui/Models/BeamItems.h
+++ b/GUI/coregui/Models/BeamItems.h
@@ -72,6 +72,9 @@ public:
 
     void updateFileName(const QString& filename);
     void updateToData(const IAxis& axis, QString units);
+
+private:
+    void updateWavelength();
 };
 
 class BA_CORE_API_ GISASBeamItem : public BeamItem
diff --git a/GUI/coregui/Models/BeamWavelengthItem.cpp b/GUI/coregui/Models/BeamWavelengthItem.cpp
index bd9d8567bd8e84f0a9d9ed0b1c1aed841adf60c4..cb0ce9614205028e9eedb33921a9262cd8f77026 100644
--- a/GUI/coregui/Models/BeamWavelengthItem.cpp
+++ b/GUI/coregui/Models/BeamWavelengthItem.cpp
@@ -48,7 +48,11 @@ void SpecularBeamWavelengthItem::setToRange(const RealLimits& limits)
 {
     SessionItem* valueItem =
         getGroupItem(P_DISTRIBUTION)->getItem(SymmetricDistributionItem::P_MEAN);
-    if (!limits.isInRange(wavelength()))
-        valueItem->setValue(limits.hasUpperLimit() ? limits.upperLimit() : limits.lowerLimit());
+    if (!limits.isInRange(wavelength())) {
+        const double new_value = limits.isLimited()
+                ? (limits.upperLimit() - limits.lowerLimit()) / 2.
+                : default_wl;
+        valueItem->setValue(new_value);
+    }
     valueItem->setLimits(limits);
 }
diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp
index e8211bfe01269cfde55ac4ba59c3fbe961bc50d2..725b6070586066376c56078f63f961a31d8aa095 100644
--- a/GUI/coregui/Models/JobModelFunctions.cpp
+++ b/GUI/coregui/Models/JobModelFunctions.cpp
@@ -56,7 +56,7 @@ void cropRealData(JobItem* jobItem);
 //! Creates necessary fit containers for jobItem intended for fitting.
 void createFitContainers(JobItem* jobItem);
 
-PointwiseAxisItem* getPointwiseAxisItem(const InstrumentItem* instrument);
+PointwiseAxisItem* getPointwiseAxisItem(const SpecularInstrumentItem* instrument);
 } // namespace
 
 void JobModelFunctions::initDataView(JobItem* job_item)
@@ -113,23 +113,30 @@ void JobModelFunctions::setupJobItemSampleData(JobItem* jobItem, const MultiLaye
 }
 
 void JobModelFunctions::setupJobItemInstrument(JobItem* jobItem,
-                                               const InstrumentItem* instrumentItem)
+                                               const InstrumentItem* from)
 {
     auto model = jobItem->model();
-    SessionItem* instrument = model->copyItem(instrumentItem, jobItem, JobItem::T_INSTRUMENT);
-    instrument->setItemName(instrumentItem->modelType());
-    jobItem->getItem(JobItem::P_INSTRUMENT_NAME)->setValue(instrumentItem->itemName());
-    if (auto spec_instrument = dynamic_cast<SpecularInstrumentItem*>(instrument)) {
-        // updating filename
-        const auto filename = ItemFileNameUtils::instrumentDataFileName(*spec_instrument);
-        spec_instrument->beamItem()->updateFileName(filename);
-
-        // copying axis data
-        auto origin = getPointwiseAxisItem(instrumentItem);
-        if (origin->containsNonXMLData())
-            getPointwiseAxisItem(spec_instrument)
-                ->init(*origin->getAxis(), origin->getUnitsLabel());
-    }
+    SessionItem* to = model->copyItem(from, jobItem, JobItem::T_INSTRUMENT);
+    to->setItemName(from->modelType());
+    to->setItemValue(InstrumentItem::P_IDENTIFIER, GUIHelpers::createUuid());
+    jobItem->getItem(JobItem::P_INSTRUMENT_NAME)->setValue(from->itemName());
+
+    auto spec_to = dynamic_cast<SpecularInstrumentItem*>(to);
+    if (!spec_to)
+        return;
+
+    // updating filename
+    const auto filename = ItemFileNameUtils::instrumentDataFileName(*spec_to);
+    spec_to->beamItem()->updateFileName(filename);
+
+    // copying axis data
+    auto spec_from = static_cast<const SpecularInstrumentItem*>(from);
+    auto axis_origin = getPointwiseAxisItem(spec_from);
+    const QString current_axis_type= spec_from->beamItem()->inclinationAxisGroup()->currentType();
+    if (current_axis_type == Constants::PointwiseAxisType)
+        spec_to->beamItem()->updateToData(*axis_origin->getAxis(), axis_origin->getUnitsLabel());
+    else if(axis_origin->containsNonXMLData())
+        getPointwiseAxisItem(spec_to)->init(*axis_origin->getAxis(), axis_origin->getUnitsLabel());
 }
 
 //! Setup items intended for storing results of the job.
@@ -281,14 +288,10 @@ void createFitContainers(JobItem* jobItem)
         Constants::MinimizerContainerType, fitSuiteItem->index(), -1, FitSuiteItem::T_MINIMIZER);
 }
 
-PointwiseAxisItem* getPointwiseAxisItem(const InstrumentItem* instrument)
+PointwiseAxisItem* getPointwiseAxisItem(const SpecularInstrumentItem* instrument)
 {
-    auto spec_instrument = dynamic_cast<const SpecularInstrumentItem*>(instrument);
-    if (!spec_instrument)
-        return nullptr;
-
     return dynamic_cast<PointwiseAxisItem*>(
-        spec_instrument->beamItem()->inclinationAxisGroup()->getChildOfType(
+        instrument->beamItem()->inclinationAxisGroup()->getChildOfType(
             Constants::PointwiseAxisType));
 }
 } // namespace
diff --git a/GUI/coregui/Models/JobModelFunctions.h b/GUI/coregui/Models/JobModelFunctions.h
index 3e6213e1534814ebfa1cf4c2189802268d392ac7..6a3b9f9ded39b007ca2e78e6c067a414a0501c0a 100644
--- a/GUI/coregui/Models/JobModelFunctions.h
+++ b/GUI/coregui/Models/JobModelFunctions.h
@@ -35,7 +35,7 @@ BA_CORE_API_ void initDataView(JobItem* jobItem);
 BA_CORE_API_ void setupJobItemSampleData(JobItem* jobItem, const MultiLayerItem* sampleItem);
 
 //! Properly copies instrument into job item
-BA_CORE_API_ void setupJobItemInstrument(JobItem* jobItem, const InstrumentItem* instrumentItem);
+BA_CORE_API_ void setupJobItemInstrument(JobItem* jobItem, const InstrumentItem* from);
 
 BA_CORE_API_ void setupJobItemOutput(JobItem* jobItem);
 
diff --git a/GUI/coregui/Models/PointwiseAxisItem.cpp b/GUI/coregui/Models/PointwiseAxisItem.cpp
index 49fe97d0147f77675d332e056d38c8cd784f6b33..907e7459daa82865073a86c27c473dd3c6d19576 100644
--- a/GUI/coregui/Models/PointwiseAxisItem.cpp
+++ b/GUI/coregui/Models/PointwiseAxisItem.cpp
@@ -51,7 +51,6 @@ void PointwiseAxisItem::init(const IAxis& axis, const QString& units_label)
     m_axis = std::unique_ptr<IAxis>(axis.clone());
     setItemValue(P_NATIVE_UNITS, units_label);
     findInstrument();
-    updateIndicators();
 }
 
 const IAxis* PointwiseAxisItem::getAxis() const
diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
index cfa7191aa109b9ab8ebdb9ebcc6dab371316407b..9bbbfe81074d2d1daf9f55b3d7bf44030ad54a83 100644
--- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
@@ -108,11 +108,10 @@ bool LinkInstrumentManager::canLinkDataToInstrument(const RealDataItem* realData
     if (!ImportDataUtils::Compatible(*instrumentItem, *realDataItem)) {
         QMessageBox::warning(nullptr, "Can't link to instrument",
                              "Can't link, data is incompatible with the instrument.");
-
         return false;
     }
 
-    if (!realDataItem->holdsDimensionalData() && instrumentItem->shape() == realDataItem->shape())
+    if (instrumentItem->alignedWith(realDataItem))
         return true;
 
     QString message =
@@ -156,11 +155,7 @@ void LinkInstrumentManager::onInstrumentChildChange(InstrumentItem* instrument,
     if (child == nullptr)
         return;
 
-    if (child->itemName() == BasicAxisItem::P_NBINS
-        || child->parent()->modelType() == Constants::GroupItemType)
-        onInstrumentBinningChange(instrument);
-    else
-        onInstrumentLayoutChange(instrument);
+    onInstrumentLayoutChange(instrument);
 }
 
 //! Updates map of instruments on insert/remove InstrumentItem event.
@@ -249,22 +244,16 @@ void LinkInstrumentManager::updateRealDataMap()
     }
 }
 
-//! Runs through all RealDataItem and break the link, if instrument binning doesn't match the data.
-
-void LinkInstrumentManager::onInstrumentBinningChange(InstrumentItem* changedInstrument)
-{
-    for(auto realDataItem : linkedItems(changedInstrument))
-        if (!changedInstrument->alignedWith(realDataItem))
-            realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString());
-}
-
 //! Runs through all RealDataItem and refresh linking to match possible change in detector
 //! axes definition.
 
 void LinkInstrumentManager::onInstrumentLayoutChange(InstrumentItem* changedInstrument)
 {
     for (auto realDataItem : linkedItems(changedInstrument))
-        realDataItem->linkToInstrument(changedInstrument);
+        if (!changedInstrument->alignedWith(realDataItem))
+            realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString());
+        else
+            realDataItem->linkToInstrument(changedInstrument);
 }
 
 //! Returns list of RealDataItem's linked to given instrument.
diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h
index 1a5f5c5369c5e751a4cb2ad8a2c857b3efde3f9e..0ab1b5ef36416e4f7f95257b433fb5f80fb691a6 100644
--- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h
+++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h
@@ -46,7 +46,7 @@ public:
         InstrumentItem* m_instrument;
     };
 
-    explicit LinkInstrumentManager(QObject* parent = 0);
+    explicit LinkInstrumentManager(QObject* parent = nullptr);
 
     void setModels(InstrumentModel* instrumentModel, RealDataModel* realDataModel);
 
@@ -71,7 +71,6 @@ private slots:
     void updateLinks();
     void updateInstrumentMap();
     void updateRealDataMap();
-    void onInstrumentBinningChange(InstrumentItem* changedInstrument);
     void onInstrumentLayoutChange(InstrumentItem* changedInstrument);
 
 private:
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp
index c3732e7b3007a551272502c60bfed58f59df6fe2..084637ec2740ebd50892bf8c118312268154fae1 100644
--- a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp
@@ -77,7 +77,7 @@ void SimulationSetupAssistant::checkInstrumentItem(const InstrumentItem* instrum
 void SimulationSetupAssistant::checkFittingSetup(const InstrumentItem* instrumentItem,
                                                  const RealDataItem* realData)
 {
-    if (!realData || instrumentItem->alignedWith(realData))
+    if (!realData || !instrumentItem || instrumentItem->alignedWith(realData))
         return;
 
     m_isValid = false;
diff --git a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
index c84f0cc9a0229e9b385fd9ec6513e919d97c353e..e346d61c82dc5c4c238302a63869e668f005285d 100644
--- a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
+++ b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
@@ -292,6 +292,7 @@ TEST_F(TestSavingSpecularData, test_CopyInstrumentToJobItem)
     // Checking existance of data on disk
     QString fname1 = "./" + projectDir + "/" + pointwise_axis_item->fileName();
     QString fname2 = "./" + projectDir + "/" + job_axis_item->fileName();
+    EXPECT_FALSE(fname1 == fname2);
     EXPECT_TRUE(ProjectUtils::exists(fname1));
     EXPECT_TRUE(ProjectUtils::exists(fname2));