diff --git a/DSView/pv/view/cursor.cpp b/DSView/pv/view/cursor.cpp
index 62ec0861c4c3668c3801c0d1b75982752ad5b04b..7c136567254ab235d5adca337197ccd159c2fee1 100755
--- a/DSView/pv/view/cursor.cpp
+++ b/DSView/pv/view/cursor.cpp
@@ -85,7 +85,7 @@ QRect Cursor::get_close_rect(const QRect &rect) const
 }
 
 void Cursor::paint_label(QPainter &p, const QRect &rect,
-    unsigned int prefix, int index)
+    unsigned int prefix, int index, bool has_hoff)
 {
     assert(index > 0);
 
@@ -93,7 +93,7 @@ void Cursor::paint_label(QPainter &p, const QRect &rect,
     bool visible;
 
     compute_text_size(p, prefix);
-    const QRect r(get_label_rect(rect, visible));
+    const QRect r(get_label_rect(rect, visible, has_hoff));
     if (!visible)
         return;
     const QRect close(get_close_rect(r));
@@ -153,8 +153,9 @@ void Cursor::paint_fix_label(QPainter &p, const QRect &rect,
     p.drawPolygon(points, countof(points));
 
     p.setPen(Qt::white);
-    p.drawText(r, Qt::AlignCenter | Qt::AlignVCenter,
-        Ruler::format_real_time(_index, _view.session().cur_snap_samplerate()));
+    if (has_hoff)
+        p.drawText(r, Qt::AlignCenter | Qt::AlignVCenter,
+            Ruler::format_real_time(_index, _view.session().cur_snap_samplerate()));
 
     const QRect arrowRect = QRect(r.bottomLeft().x(), r.bottomLeft().y(), r.width(), ArrowSize);
     p.drawText(arrowRect, Qt::AlignCenter | Qt::AlignVCenter, label);
diff --git a/DSView/pv/view/cursor.h b/DSView/pv/view/cursor.h
index 87a3e2cadf19757c069c064ae825da25d06800ee..0248c9ce97af7b8df20d14bb4bf81ff14170d774 100755
--- a/DSView/pv/view/cursor.h
+++ b/DSView/pv/view/cursor.h
@@ -74,8 +74,8 @@ public:
 	 * @param rect The rectangle of the ruler client area.
 	 * @param prefix The index of the SI prefix to use.
 	 */
-	void paint_label(QPainter &p, const QRect &rect,
-        unsigned int prefix, int index);
+    void paint_label(QPainter &p, const QRect &rect,
+        unsigned int prefix, int index, bool has_hoff);
 
     void paint_fix_label(QPainter &p, const QRect &rect,
         unsigned int prefix, QChar label, QColor color, bool has_hoff);
diff --git a/DSView/pv/view/ruler.cpp b/DSView/pv/view/ruler.cpp
index bce27f35d1e0208811828fcc9964772580ee891b..3e38bac32d5282d466c23cff614872d393c8a6f9 100755
--- a/DSView/pv/view/ruler.cpp
+++ b/DSView/pv/view/ruler.cpp
@@ -175,7 +175,10 @@ void Ruler::paintEvent(QPaintEvent*)
     style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this);
 
     // Draw tick mark
-    draw_logic_tick_mark(p);
+    if (_view.session().get_device()->dev_inst()->mode == DSO)
+        draw_osc_tick_mark(p);
+    else
+        draw_logic_tick_mark(p);
 
     p.setRenderHint(QPainter::Antialiasing, true);
 	// Draw the hover mark
@@ -340,11 +343,126 @@ void Ruler::draw_logic_tick_mark(QPainter &p)
 
     // Find tick spacing, and number formatting that does not cause
     // value to collide.
-    if (_view.session().get_device()->dev_inst()->mode == DSO) {
-        _min_period = _view.session().get_device()->get_time_base() * std::pow(10.0, -9.0);
-    } else {
-        _min_period = cur_period_scale * abs_min_period;
+    _min_period = cur_period_scale * abs_min_period;
+
+    const int order = (int)floorf(log10f(scale * _view.get_view_width()));
+    //const double order_decimal = pow(10, order);
+    const unsigned int prefix = (order - FirstSIPrefixPower) / 3;
+    _cur_prefix = prefix;
+    assert(prefix < countof(SIPrefixes));
+    typical_width = p.boundingRect(0, 0, INT_MAX, INT_MAX,
+        AlignLeft | AlignTop, format_time(offset * scale,
+        prefix)).width() + MinValueSpacing;
+    do
+    {
+        tick_period += _min_period;
+
+    } while(typical_width > tick_period / scale);
+
+    const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX,
+        AlignLeft | AlignTop, "8").height();
+
+    // Draw the tick marks
+    QColor fore(QWidget::palette().color(QWidget::foregroundRole()));
+    fore.setAlpha(View::ForeAlpha);
+    p.setPen(fore);
+
+    const double minor_tick_period = tick_period / MinPeriodScale;
+    const int minor_order = (int)floorf(log10f(minor_tick_period));
+    //const double minor_order_decimal = pow(10, minor_order);
+    const unsigned int minor_prefix = (minor_order - FirstSIPrefixPower) / 3;
+    assert(minor_prefix < countof(SIPrefixes));
+
+    const double first_major_division =
+        floor(offset * scale / tick_period);
+    const double first_minor_division =
+        floor(offset * scale / minor_tick_period + 1);
+    const double t0 = first_major_division * tick_period;
+
+    int division = (int)round(first_minor_division -
+        first_major_division * MinPeriodScale) - 1;
+
+    const int major_tick_y1 = text_height + ValueMargin * 3;
+    const int tick_y2 = height();
+    const int minor_tick_y1 = (major_tick_y1 + tick_y2) / 2;
+
+    int x;
+
+    const double inc_text_width = p.boundingRect(0, 0, INT_MAX, INT_MAX,
+                                                 AlignLeft | AlignTop,
+                                                 format_time(minor_tick_period,
+                                                             minor_prefix)).width() + MinValueSpacing;
+    do {
+        const double t = t0 + division * minor_tick_period;
+        const double major_t = t0 + floor(division / MinPeriodScale) * tick_period;
+
+        x = t / scale - offset;
+
+        if (division % MinPeriodScale == 0)
+        {
+            // Draw a major tick
+            p.drawText(x, 2 * ValueMargin, 0, text_height,
+                AlignCenter | AlignTop | TextDontClip,
+                format_time(t, prefix));
+            p.drawLine(QPoint(x, major_tick_y1),
+                QPoint(x, tick_y2));
+        }
+        else
+        {
+            // Draw a minor tick
+            if (minor_tick_period / scale > 2 * typical_width)
+                p.drawText(x, 2 * ValueMargin, 0, text_height,
+                    AlignCenter | AlignTop | TextDontClip,
+                    format_time(t, prefix));
+            //else if ((tick_period / scale > width() / 4) && (minor_tick_period / scale > inc_text_width))
+            else if (minor_tick_period / scale > 1.1 * inc_text_width ||
+                     tick_period / scale > _view.get_view_width())
+                p.drawText(x, 2 * ValueMargin, 0, minor_tick_y1 + ValueMargin,
+                    AlignCenter | AlignTop | TextDontClip,
+                    format_time(t - major_t, minor_prefix));
+            p.drawLine(QPoint(x, minor_tick_y1),
+                QPoint(x, tick_y2));
+        }
+
+        division++;
+
+    } while (x < rect().right());
+
+    // Draw the cursors
+    if (!_view.get_cursorList().empty()) {
+        list<Cursor*>::iterator i = _view.get_cursorList().begin();
+        int index = 1;
+        while (i != _view.get_cursorList().end()) {
+            (*i)->paint_label(p, rect(), prefix, index, _view.session().get_capture_state() == SigSession::Stopped);
+            index++;
+            i++;
+        }
     }
+    if (_view.trig_cursor_shown()) {
+        _view.get_trig_cursor()->paint_fix_label(p, rect(), prefix, 'T', _view.get_trig_cursor()->colour(), false);
+    }
+    if (_view.search_cursor_shown()) {
+        _view.get_search_cursor()->paint_fix_label(p, rect(), prefix, 'S', _view.get_search_cursor()->colour(), true);
+    }
+}
+
+void Ruler::draw_osc_tick_mark(QPainter &p)
+{
+    using namespace Qt;
+
+    const double MinValueSpacing = 16.0;
+    const int ValueMargin = 5;
+
+    double typical_width;
+    double tick_period = 0;
+    double scale = _view.scale();
+    //int64_t offset = _view.offset();
+    int64_t offset = 0;
+
+    // Find tick spacing, and number formatting that does not cause
+    // value to collide.
+    _min_period = _view.session().get_device()->get_time_base() * std::pow(10.0, -9.0);
+
     const int order = (int)floorf(log10f(scale * _view.get_view_width()));
     //const double order_decimal = pow(10, order);
     const unsigned int prefix = (order - FirstSIPrefixPower) / 3;
@@ -433,7 +551,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p)
         list<Cursor*>::iterator i = _view.get_cursorList().begin();
         int index = 1;
         while (i != _view.get_cursorList().end()) {
-            (*i)->paint_label(p, rect(), prefix, index);
+            (*i)->paint_label(p, rect(), prefix, index, _view.session().get_capture_state() == SigSession::Stopped);
             index++;
             i++;
         }
diff --git a/DSView/pv/view/ruler.h b/DSView/pv/view/ruler.h
index 63dff2318b600bbfb8ce0f4be1e98d97237d1e5f..f3cf204d9922aa221bab45c7c268272b115648c8 100755
--- a/DSView/pv/view/ruler.h
+++ b/DSView/pv/view/ruler.h
@@ -79,6 +79,7 @@ private:
 
 private:
     void draw_logic_tick_mark(QPainter &p);
+    void draw_osc_tick_mark(QPainter &p);
 	/**
 	 * Draw a hover arrow under the cursor position.
 	 */
diff --git a/DSView/pv/view/timemarker.h b/DSView/pv/view/timemarker.h
index 5e68f83b6847540ba5782f3305a88e6877a8b9cf..7a5425b8a01ebdebe74c0aa0de288febf2f10951 100755
--- a/DSView/pv/view/timemarker.h
+++ b/DSView/pv/view/timemarker.h
@@ -101,7 +101,7 @@ public:
 	 * @param prefix The SI prefix to paint time value with.
 	 */
 	virtual void paint_label(QPainter &p, const QRect &rect,
-        unsigned int prefix, int index) = 0;
+        unsigned int prefix, int index, bool has_hoff) = 0;
 
 signals:
 	void time_changed();
diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp
index a1d405c2ee9eabf8ac8aa31628ad32cd27033d4b..b83d96109dd5ee953cfaa4fefca79d34a53861be 100755
--- a/DSView/pv/view/viewport.cpp
+++ b/DSView/pv/view/viewport.cpp
@@ -245,9 +245,9 @@ void Viewport::paintSignals(QPainter &p, QColor fore, QColor back)
             const int64_t cursorX = _view.index2pixel((*i)->index());
             if (xrect.contains(_view.hover_point().x(), _view.hover_point().y()) &&
                     qAbs(cursorX - _view.hover_point().x()) <= HitCursorMargin)
-                (*i)->paint(p, xrect, 1, index);
+                (*i)->paint(p, xrect, 1, index, _view.session().get_capture_state() == SigSession::Stopped);
             else
-                (*i)->paint(p, xrect, 0, index);
+                (*i)->paint(p, xrect, 0, index, _view.session().get_capture_state() == SigSession::Stopped);
             i++;
             index++;
         }