--- a/src/qtgui/webcache.cpp
+++ b/src/qtgui/webcache.cpp
@@ -29,6 +29,11 @@
 #endif
 
 #include <QDebug>
+#include <QSettings>
+#include <QCloseEvent>
+#include <QShortcut>
+#include <QMenu>
+#include <QClipboard>
 
 #include "recoll.h"
 #include "webcache.h"
@@ -58,10 +63,17 @@
 WebcacheModel::WebcacheModel(QObject *parent)
     : QAbstractTableModel(parent), m(new WebcacheModelInternal())
 {
-    qDebug() << "WebcacheModel::WebcacheModel()";
+    //qDebug() << "WebcacheModel::WebcacheModel()";
+    reload();
+}
+
+void WebcacheModel::reload()
+{
     m->cache =
         STD_SHARED_PTR<BeagleQueueCache>(new BeagleQueueCache(theconfig));
-
+    m->all.clear();
+    m->disp.clear();
+    
     if (m->cache) {
         bool eof;
         m->cache->cc()->rewind(eof);
@@ -80,6 +92,21 @@
                 break;
         }
     }
+    emit dataChanged(createIndex(0,0,0), createIndex(1, m->all.size(),0));
+}
+
+bool WebcacheModel::deleteIdx(unsigned int idx)
+{
+    if (idx > m->disp.size() || !m->cache)
+        return false;
+    return m->cache->cc()->erase(m->disp[idx].udi, true);
+}
+
+string WebcacheModel::getURL(unsigned int idx)
+{
+    if (idx > m->disp.size() || !m->cache)
+        return string();
+    return m->disp[idx].url;
 }
 
 int WebcacheModel::rowCount(const QModelIndex&) const
@@ -181,15 +208,120 @@
     emit dataChanged(createIndex(0,0,0), createIndex(1, m->all.size(),0));
 }
 
+static const int ROWHEIGHTPAD = 2;
+static const char *cwnm = "/Recoll/prefs/webcachecolw";
+static const char *wwnm = "/Recoll/prefs/webcachew";
+static const char *whnm = "/Recoll/prefs/webcacheh";
+static const QKeySequence closeKS(Qt::ControlModifier+Qt::Key_W);
 
 WebcacheEdit::WebcacheEdit(QWidget *parent)
     : QDialog(parent)
 {
-    qDebug() << "WebcacheEdit::WebcacheEdit()";
+    //qDebug() << "WebcacheEdit::WebcacheEdit()";
     setupUi(this);
     m_model = new WebcacheModel(this);
-    webcacheTV->setModel(m_model);
+    tableview->setModel(m_model);
+    tableview->setSelectionBehavior(QAbstractItemView::SelectRows);
+    tableview->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    tableview->setContextMenuPolicy(Qt::CustomContextMenu);
+    tableview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    
+    QSettings settings;
+    QStringList wl;
+    wl = settings.value(cwnm).toStringList();
+    QHeaderView *header = tableview->horizontalHeader();
+    if (header) {
+	if (int(wl.size()) == header->count()) {
+	    for (int i = 0; i < header->count(); i++) {
+		header->resizeSection(i, wl[i].toInt());
+	    }
+	}
+    }
+    connect(header, SIGNAL(sectionResized(int,int,int)),
+            this, SLOT(saveColState()));
+
+    header = tableview->verticalHeader();
+    if (header) {
+	header->setDefaultSectionSize(QApplication::fontMetrics().height() + 
+				      ROWHEIGHTPAD);
+    }
+
+    int width = settings.value(wwnm, 0).toInt();
+    int height = settings.value(whnm, 0).toInt();
+    if (width && height) {
+        resize(QSize(width, height));
+    }
+
     connect(searchLE, SIGNAL(textEdited(const QString&)),
             m_model, SLOT(setSearchFilter(const QString&)));
-}
-
+    connect(new QShortcut(closeKS, this), SIGNAL (activated()), 
+            this, SLOT (close()));
+    connect(tableview, SIGNAL(customContextMenuRequested(const QPoint&)),
+	    this, SLOT(createPopupMenu(const QPoint&)));
+
+}
+
+void WebcacheEdit::createPopupMenu(const QPoint& pos)
+{
+    int selsz = tableview->selectionModel()->selectedRows().size();
+    if (selsz <= 0) {
+        return;
+    }
+    QMenu *popup = new QMenu(this);
+    if (selsz == 1) {
+        popup->addAction(tr("Copy URL"), this, SLOT(copyURL()));
+    }
+    popup->addAction(tr("Delete selection"), this, SLOT(deleteSelected()));
+        
+    popup->popup(tableview->mapToGlobal(pos));
+}
+
+void WebcacheEdit::deleteSelected()
+{
+    QModelIndexList selection = tableview->selectionModel()->selectedRows();
+    for (int i = 0; i < selection.size(); i++) {
+        m_model->deleteIdx(selection[i].row());
+    }
+    m_model->reload();
+    m_model->setSearchFilter(searchLE->text());
+    tableview->clearSelection();
+}
+
+void WebcacheEdit::copyURL()
+{
+    QModelIndexList selection = tableview->selectionModel()->selectedRows();
+    if (selection.size() != 1)
+        return;
+    string url = m_model->getURL(selection[0].row());
+    if (!url.empty()) {
+        url =  url_encode(url, 7);
+        QApplication::clipboard()->setText(url.c_str(), 
+                                           QClipboard::Selection);
+        QApplication::clipboard()->setText(url.c_str(), 
+                                           QClipboard::Clipboard);
+    }
+}
+
+void WebcacheEdit::saveColState()
+{
+    //qDebug() << "void WebcacheEdit::saveColState()";
+    QHeaderView *header = tableview->horizontalHeader();
+    QStringList newwidths;
+    for (int vi = 0; vi < header->count(); vi++) {
+	int li = header->logicalIndex(vi);
+	newwidths.push_back(lltodecstr(header->sectionSize(li)).c_str());
+    }
+    
+    QSettings settings;
+    settings.setValue(cwnm, newwidths);
+}
+
+void WebcacheEdit::closeEvent(QCloseEvent *event)
+{
+    if (!isFullScreen()) {
+        QSettings settings;
+        settings.setValue(wwnm, width());
+        settings.setValue(whnm, height());
+    }
+    event->accept();
+}