diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp
index 3debb650a1ee199eeb2ee17b191f9344f98a7fb3..2a56b4058bf65da66a6ba56ea25dbd0be08eff3f 100755
--- a/DSView/pv/sigsession.cpp
+++ b/DSView/pv/sigsession.cpp
@@ -116,6 +116,7 @@ SigSession::SigSession(DeviceManager &device_manager) :
     _math_trace = NULL;
     _saving = false;
     _dso_feed = false;
+    _stop_scale = 1;
 
     // Create snapshots & data containers
     _cur_logic_snapshot.reset(new data::LogicSnapshot());
@@ -351,6 +352,7 @@ void SigSession::capture_init()
 
     set_cur_snap_samplerate(_dev_inst->get_sample_rate());
     set_cur_samplelimits(_dev_inst->get_sample_limit());
+    set_stop_scale(1);
     _data_updated = false;
     _trigger_flag = false;
     _trigger_ch = 0;
@@ -1781,4 +1783,31 @@ void SigSession::set_saving(bool saving)
     _saving = saving;
 }
 
+void SigSession::exit_capture()
+{
+    set_repeating(false);
+    bool wait_upload = false;
+    if (get_run_mode() != SigSession::Repetitive) {
+        GVariant *gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_WAIT_UPLOAD);
+        if (gvar != NULL) {
+            wait_upload = g_variant_get_boolean(gvar);
+            g_variant_unref(gvar);
+        }
+    }
+    if (!wait_upload) {
+        stop_capture();
+        capture_state_changed(SigSession::Stopped);
+    }
+}
+
+float SigSession::stop_scale() const
+{
+    return _stop_scale;
+}
+
+void SigSession::set_stop_scale(float scale)
+{
+    _stop_scale = scale;
+}
+
 } // namespace pv
diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h
index 6d71c9cf9b8de31addd8e527df98f31c6e516182..96fd064959ce76f34cbfca2d094e9b251ed97ced 100755
--- a/DSView/pv/sigsession.h
+++ b/DSView/pv/sigsession.h
@@ -256,6 +256,10 @@ public:
     uint64_t get_save_end() const;
     bool get_saving() const;
     void set_saving(bool saving);
+    void set_stop_scale(float scale);
+    float stop_scale() const;
+
+    void exit_capture();
 
 private:
 	void set_capture_state(capture_state state);
@@ -367,6 +371,7 @@ private:
     bool _saving;
 
     bool _dso_feed;
+    float _stop_scale;
 
 signals:
 	void capture_state_changed(int state);
diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp
index bf60dbf7ab056f110a10c826e1333a473eb9bcc8..13505a07cec51df0dd6414abadaf1ca1e4cb6508 100755
--- a/DSView/pv/toolbars/samplingbar.cpp
+++ b/DSView/pv/toolbars/samplingbar.cpp
@@ -822,19 +822,7 @@ void SamplingBar::commit_settings()
 void SamplingBar::on_run_stop()
 {
     if (get_sampling() || _session.isRepeating()) {
-        _session.set_repeating(false);
-        bool wait_upload = false;
-        if (_session.get_run_mode() != SigSession::Repetitive) {
-            GVariant *gvar = get_selected_device()->get_config(NULL, NULL, SR_CONF_WAIT_UPLOAD);
-            if (gvar != NULL) {
-                wait_upload = g_variant_get_boolean(gvar);
-                g_variant_unref(gvar);
-            }
-        }
-        if (!wait_upload) {
-            _session.stop_capture();
-            _session.capture_state_changed(SigSession::Stopped);
-        }
+        _session.exit_capture();
     } else {
         enable_run_stop(false);
         enable_instant(false);
diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp
index 7999855bffd216ed5c864004a75823bbd026c7c7..ea510127aee50ce0f70d4b032f8b1a192a85d643 100755
--- a/DSView/pv/view/dsosignal.cpp
+++ b/DSView/pv/view/dsosignal.cpp
@@ -62,7 +62,6 @@ DsoSignal::DsoSignal(boost::shared_ptr<pv::device::DevInst> dev_inst,
     Signal(dev_inst, probe),
     _data(data),
     _scale(0),
-    _stop_scale(1),
     _en_lock(false),
     _show(true),
     _vDialActive(false),
@@ -121,7 +120,7 @@ boost::shared_ptr<pv::data::Dso> DsoSignal::dso_data() const
 
 void DsoSignal::set_scale(int height)
 {
-    _scale = height / (_ref_max - _ref_min) * _stop_scale;
+    _scale = height / (_ref_max - _ref_min) * _view->session().stop_scale();
 }
 
 float DsoSignal::get_scale()
@@ -218,7 +217,7 @@ bool DsoSignal::go_vDialPre(bool manul)
         _dev_inst->set_config(_probe, NULL, SR_CONF_PROBE_VDIV,
                               g_variant_new_uint64(_vDial->get_value()));
         if (_view->session().get_capture_state() == SigSession::Stopped) {
-            _stop_scale *= pre_vdiv/_vDial->get_value();
+            _view->session().set_stop_scale(_view->session().stop_scale() * (pre_vdiv/_vDial->get_value()));
             set_scale(get_view_rect().height());
         }
         _dev_inst->set_config(_probe, NULL, SR_CONF_PROBE_OFFSET,
@@ -248,7 +247,7 @@ bool DsoSignal::go_vDialNext(bool manul)
         _dev_inst->set_config(_probe, NULL, SR_CONF_PROBE_VDIV,
                               g_variant_new_uint64(_vDial->get_value()));
         if (_view->session().get_capture_state() == SigSession::Stopped) {
-            _stop_scale *= pre_vdiv/_vDial->get_value();
+            _view->session().set_stop_scale(_view->session().stop_scale() * (pre_vdiv/_vDial->get_value()));
             set_scale(get_view_rect().height());
         }
         _dev_inst->set_config(_probe, NULL, SR_CONF_PROBE_OFFSET,
@@ -839,9 +838,6 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right, QColor fore, QColor
     assert(_view);
     assert(right >= left);
 
-    if (_view->session().get_capture_state() == SigSession::Running)
-        _stop_scale = 1;
-
     if (enabled()) {
         const int index = get_index();
         const int width = right - left;
diff --git a/DSView/pv/view/dsosignal.h b/DSView/pv/view/dsosignal.h
index 586f1ae1daabf2bedac92af85b82bbf1f703d094..a1b040c4ae49f8466a58e9d9f24f326ade159518 100755
--- a/DSView/pv/view/dsosignal.h
+++ b/DSView/pv/view/dsosignal.h
@@ -232,7 +232,6 @@ private:
 private:
     boost::shared_ptr<pv::data::Dso> _data;
 	float _scale;
-    float _stop_scale;
     bool _en_lock;
     bool _show;