--- a/dirbrowser/cdbrowser.cpp
+++ b/dirbrowser/cdbrowser.cpp
@@ -122,7 +122,7 @@
 
 CDBrowser::~CDBrowser()
 {
-    deleteReaders();
+    deleteReaders("~CDBrowser");
 }
 
 void CDBrowser::mySetHtml(const QString& html)
@@ -139,6 +139,14 @@
     //pause.exec();
 }
 
+#ifndef USING_WEBENGINE
+void CDBrowser::onContentsSizeChanged(const QSize&)
+{
+    //qDebug() << "CDBrowser::onContentsSizeChanged: scrollpos " <<
+    // page()->mainFrame()->scrollPosition();
+    //qDebug() << "164 - m_savedscrollpos: " << m_savedscrollpos;
+    page()->mainFrame()->setScrollPosition(m_savedscrollpos);
+}
 void CDBrowser::mouseReleaseEvent(QMouseEvent *event)
 {
     //qDebug() << "CDBrowser::mouseReleaseEvent";
@@ -160,44 +168,42 @@
     }
     QWEBVIEW::keyPressEvent(e);
 }
+void CDBrowser::runJS(const QString& js)
+{
+    //qDebug() << "CDBrowser::runJS: " << js;
+    page()->mainFrame()->evaluateJavaScript(js);
+}
+
+#else // Webengine->
 
 void CDBrowser::onContentsSizeChanged(const QSize&)
 {
     //qDebug() << "CDBrowser::onContentsSizeChanged: scrollpos " <<
     // page()->mainFrame()->scrollPosition();
     //qDebug() << "164 - m_savedscrollpos: " << m_savedscrollpos;
-#ifdef USING_WEBENGINE
     QString js = "window.scrollBy(" + 
         QString::number(m_savedscrollpos.x())+ ", " +
         QString::number(m_savedscrollpos.y()) + ");";
     runJS(js);
-#else
-    page()->mainFrame()->setScrollPosition(m_savedscrollpos);
-#endif
-}
-
-#ifdef USING_WEBENGINE
+}
 static QString base64_encode(QString string)
 {
     QByteArray ba;
     ba.append(string);
     return ba.toBase64();
 }
+void CDBrowser::onJSRan(const QVariant&)
+{
+    m_somethingran = true;
+}
+void CDBrowser::runJS(const QString& js)
+{
+    //qDebug() << "CDBrowser::runJS: " << js;
+    page()->runJavaScript(js, [this](const QVariant &v) { onJSRan(v);});
+}
+
 #endif
 
-void CDBrowser::runJS(const QString& js)
-{
-    //qDebug() << "CDBrowser::runJS: " << js;
-
-#ifdef USING_WEBENGINE
-    page()->runJavaScript(js, [] (QVariant res) {
-            Q_UNUSED(res);
-        });
-#else
-    page()->mainFrame()->evaluateJavaScript(js);
-#endif
-
-}
 
 void CDBrowser::appendHtml(const QString& elt_id, const QString& html)
 {
@@ -335,6 +341,7 @@
 void CDBrowser::onLinkClicked(const QUrl &url)
 {
     m_autoclickcnt = 0;
+    deleteReaders("onLinkClicked event");
     processOnLinkClicked(url);
 }
 
@@ -439,6 +446,10 @@
 {
     LOGDEB1("CDBrowser::curpathClicked: " << i << " pathsize " << 
             m_curpath.size() << endl);
+    if (m_reader || m_reaper) {
+        LOGDEB("CDBrowser::curpathClicked: already active\n");
+        return;
+    }
     if (i >= m_curpath.size()) {
         LOGERR("CDBrowser::curPathClicked: bad curpath index: " << i 
                << " path count: " << m_curpath.size() << endl);
@@ -478,37 +489,26 @@
     return -1;
 }
 
-void CDBrowser::browseIn(QString UDN, vector<CtPathElt> path)
-{
-    //qDebug() << "CDBrowser::browsein: " << UDN;
+// This is called for browsing a specific container in a newly created
+// tab.  We let initialPage handle the hard work.
+void CDBrowser::browseInNewTab(QString UDN, vector<CtPathElt> path)
+{
+    //qDebug() << "CDBrowser::browseinnewtab: " << UDN;
 
     m_curpath = path;
-
-    if (m_msdescs.size() == 0) {
-        // If the servers list is not ready yet, just set m_initUDN to tell
-        // initialPage() to do the right thing later when it gets the servers
-        // qDebug() << "CDBrowser::browsein: no servers";
-        m_initUDN = UDN;
-        return;
-    } 
-
-    m_lastbutton = Qt::LeftButton;
-
-    // Find UDN in msdescs, create a MediaServer object, and read the
-    // specified container (last in input curpath)
-    int i = serverFromUDN(qs2utf8s(UDN));
-    if (i >= 0) {
-        newCds(i);
-        curpathClicked(path.size() - 1);
-        return;
-    }
-    qDebug() << "CDBrowser::browsein: " << UDN << " not found";
-}
-
-// Re-browse (because sort criteria changed probably)
+    m_initUDN = UDN;
+    m_timer.stop();
+    m_timer.start(0);
+    return;
+}
+
+// Re-browse (because sort criteria changed, or other prefs)
+// if m_cds is not set, let initialPage() do its thing
 void CDBrowser::refresh()
 {
-    if (m_curpath.size() >= 1) {
+    qDebug() << "CDBrowser::refresh";
+    if (m_cds && m_curpath.size() >= 1) {
+        setStyleSheet(CSettingsStorage::getInstance()->getPlayerStyle(), false);
         curpathClicked(m_curpath.size() - 1);
     }
 }
@@ -517,7 +517,10 @@
                                 QPoint scrollpos)
 {
     LOGDEB("CDBrowser::browseContainer: " << " ctid " << ctid << endl);
-    deleteReaders();
+    if (m_reader || m_reaper) {
+        LOGDEB("CDBrowser::browseContainer: already active\n");
+        return;
+    }
 
     emit sig_now_in(this, QString::fromUtf8(cttitle.c_str()));
 
@@ -547,7 +550,7 @@
 
 void CDBrowser::search(const string& objid, const string& iss, QPoint scrollpos)
 {
-    deleteReaders();
+    deleteReaders("search");
     if (iss.empty())
         return;
     if (!m_cds) {
@@ -568,9 +571,10 @@
 }
 
 
-void CDBrowser::deleteReaders() 
-{
-    //qDebug() << "deleteReaders()";
+void CDBrowser::deleteReaders(const QString& who)
+{
+    Q_UNUSED(who);
+//    qDebug() << "deleteReaders(): from " << who;
     if (m_reader) {
         m_reader->setCancel();
         m_reader->wait();
@@ -724,6 +728,7 @@
     }
     if (m_autoclickcnt++ < 3 && m_entries.size() == 1 &&
         m_entries[0].m_type == UPnPDirObject::container) {
+        deleteReaders("onBrowseDone");
         QUrl cturl(QString("http://h/C%1").arg(0));
         processOnLinkClicked(cturl);
         return;
@@ -791,7 +796,7 @@
 #else
     page()->mainFrame()->setScrollPosition(m_savedscrollpos);
 #endif
-    deleteReaders();
+    deleteReaders("onBrowseDone");
 
     //qDebug() << "CDBrowser::onBrowseDone done";
 }
@@ -799,6 +804,8 @@
 
 void CDBrowser::initialPage(bool redisplay)
 {
+    //qDebug() << "CDBrowser::initialPage. m_initUDN" << m_initUDN <<
+    //" curpath size " << m_curpath.size();
 #ifdef USING_WEBENGINE
     // No idea why this is necessary, but, only in the first tab, we
     // have to force a few redisplays with webengine before something
@@ -808,24 +815,24 @@
         redisplay = true;
     }
 #endif
-    deleteReaders();
+    deleteReaders("initialPage");
     emit sig_now_in(this, tr("Servers"));
     m_searchcaps.clear();
     emit sig_searchcaps_changed();
 
+    if (m_msdescs.size() == 0) {
+        mySetHtml(initialServersPage());
+    }
+
     vector<UPnPDeviceDesc> msdescs;
     if (!MediaServer::getDeviceDescs(msdescs)) {
         LOGERR("CDBrowser::initialPage: getDeviceDescs failed" << endl);
+        m_timer.start(1000);
         return;
     }
     //qDebug() << "CDBrowser::initialPage: " << msdescs.size() << " servers";
 
-    if (msdescs.size() == 0) {
-        mySetHtml(initialServersPage());
-        m_timer.start(1000);
-        return;
-    }
-
+    // Check if servers list changed
     bool same = msdescs.size() == m_msdescs.size();
     if (same) {
         for (unsigned i = 0; i < msdescs.size(); i++) {
@@ -835,29 +842,40 @@
             }
         }
     }
-    if (same && !redisplay) {
-        LOGDEB1("CDBrowser::initialPage: no change" << endl);
+    if (!same) {
+        m_msdescs = msdescs;
+    }
+    // If the list did not change and a redisplay was not requested,
+    // do nothing
+    if (same && !redisplay && m_initUDN.isEmpty()) {
+        //qDebug() << "CDBrowser::initialPage: no change";
         m_timer.start(1000);
         return;
     }
-    m_msdescs = msdescs;
-
-    if (!m_initUDN.isEmpty()) {
+
+    // Displaying stuff
+
+    if (!m_initUDN.isEmpty() && m_curpath.size() > 1
+#ifdef USING_WEBENGINE
+        && m_somethingran
+#endif
+        ) {
+        // Called from browseinnewtab, with specified server and path
+        // (either midclick or restoring from stored state): show
+        // appropriate container
         int i = serverFromUDN(qs2utf8s(m_initUDN));
+        //qDebug() << "initialPage: serverFromUDN returned " << i;
         if (i >= 0) {
-            // "Browse in new tab": show appropriate container
-            QString s = m_initUDN;
-            m_initUDN = "";
-            browseIn(s, m_curpath);
-            return;
+            if (newCds(i)) {
+                m_initUDN = "";
+                curpathClicked(m_curpath.size() - 1);
+                return;
+            }
         }
     }
 
     // No initUDN or not found: show servers list
-    QString html = emptyServersPage();
-    m_alphamap.clear();
-    mySetHtml(html);
-    //char curinitial = 0;
+    mySetHtml(emptyServersPage());
     for (unsigned i = 0; i < msdescs.size(); i++) {
         // Alphamap does not really work for servers, which are not in
         // alphabetic order at the moment
@@ -880,11 +898,7 @@
     PUP_COPY_URL,
 };
 
-void CDBrowser::onLoadFinished(bool)
-{
-    LOGDEB("CDBrowser::onLoadFinished\n");
-}
-
+#ifdef USING_WEBENGINE
 void CDBrowser::onPopupJsDone(const QVariant &jr)
 {
     QString qs(jr.toString());
@@ -916,6 +930,7 @@
            "] objidx [" << m_popupidx << "]\n");
     doCreatePopupMenu();
 }
+#endif
 
 void CDBrowser::createPopupMenu(const QPoint& pos)
 {
@@ -1145,7 +1160,7 @@
 {
     //qDebug() << "CDBrowser::recursiveAdd";
 
-    deleteReaders();
+    deleteReaders("recursiveAdd");
 
     if (popupOther(act)) {
         // Not for us
@@ -1264,7 +1279,7 @@
 {
     LOGDEB("CDBrowser::rreaperDone: status: " << status << ". Entries: " <<
            m_recwalkentries.size() << endl);
-    deleteReaders();
+    deleteReaders("rreaperDone");
     delete m_progressD;
     m_progressD = 0;
     if (m_popupmode == PUP_RAND_PLAY_TRACKS ||