diff --git a/src/plugins/cpaster/codepasterprotocol.cpp b/src/plugins/cpaster/codepasterprotocol.cpp
index dcf2159bb108032b991851e51c18dcd494053461..bc8137abfd8423d4e76d310a166837fb6a30ccc8 100644
--- a/src/plugins/cpaster/codepasterprotocol.cpp
+++ b/src/plugins/cpaster/codepasterprotocol.cpp
@@ -71,9 +71,10 @@ unsigned CodePasterProtocol::capabilities() const
     return ListCapability|PostCommentCapability|PostDescriptionCapability;
 }
 
-bool CodePasterProtocol::checkConfiguration(QString *errorMessage) const
+bool CodePasterProtocol::checkConfiguration(QString *errorMessage)
 {
-    if (m_page->hostName().isEmpty()) {
+    const QString hostName = m_page->hostName();
+    if (hostName.isEmpty()) {
         if (errorMessage) {
             *errorMessage =
 #ifdef Q_OS_MAC
@@ -84,7 +85,13 @@ bool CodePasterProtocol::checkConfiguration(QString *errorMessage) const
         }
         return false;
     }
-    return true;
+    // Check the host once. Note that it can be modified in the settings page.
+    if (m_hostChecked == hostName)
+        return true;
+    const bool ok = httpStatus(m_page->hostName(), errorMessage);
+    if (ok)
+        m_hostChecked = hostName;
+    return ok;
 }
 
 void CodePasterProtocol::fetch(const QString &id)
diff --git a/src/plugins/cpaster/codepasterprotocol.h b/src/plugins/cpaster/codepasterprotocol.h
index e899248ad07c93bbe8566c52d60122195dd5b705..e47481d03f82015980c526256cbb794baaee8947 100644
--- a/src/plugins/cpaster/codepasterprotocol.h
+++ b/src/plugins/cpaster/codepasterprotocol.h
@@ -53,7 +53,7 @@ public:
     bool hasSettings() const;
     Core::IOptionsPage *settingsPage() const;
 
-    virtual bool checkConfiguration(QString *errorMessage = 0) const;
+    virtual bool checkConfiguration(QString *errorMessage = 0);
     void fetch(const QString &id);
     void list();
     void paste(const QString &text,
@@ -72,6 +72,7 @@ private:
     QNetworkReply *m_fetchReply;
     QNetworkReply *m_listReply;
     QString m_fetchId;
+    QString m_hostChecked;
 };
 
 } // namespace CodePaster
diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp
index 0756b1b77dc7676de26488db4927f19e32a38eef..cb73abfeebf4cebc9e5f1388151e359f686ac158 100644
--- a/src/plugins/cpaster/cpasterplugin.cpp
+++ b/src/plugins/cpaster/cpasterplugin.cpp
@@ -208,25 +208,10 @@ void CodepasterPlugin::post(QString data, const QString &mimeType)
     QString comment;
     QString protocolName;
 
-    PasteView view(m_protocols, 0);
+    PasteView view(m_protocols, mimeType, 0);
     view.setProtocol(m_settings->protocol);
 
-    if (!view.show(username, description, comment, lst))
-        return; // User canceled post
-
-    username = view.user();
-    description = view.description();
-    comment = view.comment();
-    data = view.content();
-    protocolName = view.protocol();
-    foreach(Protocol *protocol, m_protocols) {
-        if (protocol->name() == protocolName) {
-            const Protocol::ContentType ct = Protocol::contentType(mimeType);
-            if (Protocol::ensureConfiguration(protocol))
-                protocol->paste(data, ct, username, comment, description);
-            break;
-        }
-    }
+    view.show(username, description, comment, lst);
 }
 
 void CodepasterPlugin::fetch()
diff --git a/src/plugins/cpaster/pastebindotcaprotocol.cpp b/src/plugins/cpaster/pastebindotcaprotocol.cpp
index 76bad682df75c73f7388b7d117f19898b0d52e35..00f70c88c8f2adff4f99e1bab359df64be7f11c0 100644
--- a/src/plugins/cpaster/pastebindotcaprotocol.cpp
+++ b/src/plugins/cpaster/pastebindotcaprotocol.cpp
@@ -43,7 +43,8 @@ PasteBinDotCaProtocol::PasteBinDotCaProtocol(const NetworkAccessManagerProxyPtr
     NetworkProtocol(nw),
     m_fetchReply(0),
     m_listReply(0),
-    m_pasteReply(0)
+    m_pasteReply(0),
+    m_hostChecked(false)
 {
 }
 
@@ -131,6 +132,16 @@ void PasteBinDotCaProtocol::list()
     connect(m_listReply, SIGNAL(finished()), this, SLOT(listFinished()));
 }
 
+bool PasteBinDotCaProtocol::checkConfiguration(QString *errorMessage)
+{
+    if (m_hostChecked) // Check the host once.
+        return true;
+    const bool ok = httpStatus(QLatin1String(urlC), errorMessage);
+    if (ok)
+        m_hostChecked = true;
+    return ok;
+}
+
 /* Quick & dirty: Parse the <div>-elements with the "Recent Posts" listing
  * out of the page.
 \code
diff --git a/src/plugins/cpaster/pastebindotcaprotocol.h b/src/plugins/cpaster/pastebindotcaprotocol.h
index 38e1e12abe2a8b6229e815698cfdc5620dcd4316..9e08b544d1535ea5705d04c3733297bc471c0190 100644
--- a/src/plugins/cpaster/pastebindotcaprotocol.h
+++ b/src/plugins/cpaster/pastebindotcaprotocol.h
@@ -56,11 +56,15 @@ public slots:
     void listFinished();
     void pasteFinished();
 
+protected:
+    virtual bool checkConfiguration(QString *errorMessage);
+
 private:
     QNetworkReply *m_fetchReply;
     QNetworkReply *m_listReply;
     QNetworkReply *m_pasteReply;
     QString m_fetchId;
+    bool m_hostChecked;
 };
 
 } // namespace CodePaster
diff --git a/src/plugins/cpaster/pastebindotcomprotocol.cpp b/src/plugins/cpaster/pastebindotcomprotocol.cpp
index 2e7876b9eb004d4aac925b09c59b5d074e4aa417..3c2349fbdfd377365be270169eee0427db159efa 100644
--- a/src/plugins/cpaster/pastebindotcomprotocol.cpp
+++ b/src/plugins/cpaster/pastebindotcomprotocol.cpp
@@ -55,7 +55,8 @@ PasteBinDotComProtocol::PasteBinDotComProtocol(const NetworkAccessManagerProxyPt
     m_pasteReply(0),
     m_listReply(0),
     m_fetchId(-1),
-    m_postId(-1)
+    m_postId(-1),
+    m_hostChecked(false)
 {
 }
 
@@ -69,6 +70,16 @@ unsigned PasteBinDotComProtocol::capabilities() const
     return ListCapability;
 }
 
+bool PasteBinDotComProtocol::checkConfiguration(QString *errorMessage)
+{
+    if (m_hostChecked)  // Check the host once.
+        return true;
+    const bool ok = httpStatus(hostName(false), errorMessage);
+    if (ok)
+        m_hostChecked = true;
+    return ok;
+}
+
 QString PasteBinDotComProtocol::hostName(bool withSubDomain) const
 {
 
diff --git a/src/plugins/cpaster/pastebindotcomprotocol.h b/src/plugins/cpaster/pastebindotcomprotocol.h
index e137bc14b2a65f9182e506014424413f380c5d54..b42b5b16d0f5f902cbca8ee49507f241805c2d6e 100644
--- a/src/plugins/cpaster/pastebindotcomprotocol.h
+++ b/src/plugins/cpaster/pastebindotcomprotocol.h
@@ -61,6 +61,9 @@ public slots:
     void pasteFinished();
     void listFinished();
 
+protected:
+    virtual bool checkConfiguration(QString *errorMessage = 0);
+
 private:
     QString hostName(bool withSubDomain) const;
 
@@ -71,6 +74,7 @@ private:
 
     QString m_fetchId;
     int m_postId;
+    bool m_hostChecked;
 };
 } // namespace CodePaster
 #endif // PASTEBINDOTCOMPROTOCOL_H
diff --git a/src/plugins/cpaster/pasteview.cpp b/src/plugins/cpaster/pasteview.cpp
index 35ed030f1c44b6a5fae05541d9181575f3fadd90..67c4904669496478956bee82ea76e6291d68753c 100644
--- a/src/plugins/cpaster/pasteview.cpp
+++ b/src/plugins/cpaster/pasteview.cpp
@@ -46,9 +46,12 @@ static const char widthKeyC[] = "PasteViewWidth";
 namespace CodePaster {
 // -------------------------------------------------------------------------------------------------
 PasteView::PasteView(const QList<Protocol *> protocols,
-                     QWidget *parent)
-    : QDialog(parent), m_protocols(protocols),
-    m_commentPlaceHolder(tr("<Comment>"))
+                     const QString &mt,
+                     QWidget *parent) :
+    QDialog(parent),
+    m_protocols(protocols),
+    m_commentPlaceHolder(tr("<Comment>")),
+    m_mimeType(mt)
 {
     m_ui.setupUi(this);
 
@@ -140,7 +143,7 @@ int PasteView::show(const QString &user, const QString &description, const QStri
     m_ui.uiDescription->selectAll();
 
     // (Re)store dialog size
-    QSettings *settings = Core::ICore::instance()->settings();
+    const QSettings *settings = Core::ICore::instance()->settings();
     const QString rootKey = QLatin1String(groupC) + QLatin1Char('/');
     const int h = settings->value(rootKey + QLatin1String(heightKeyC), height()).toInt();
     const int defaultWidth = m_ui.uiPatchView->columnIndicator() + 50;
@@ -149,16 +152,31 @@ int PasteView::show(const QString &user, const QString &description, const QStri
     resize(w, h);
 
     const int ret = QDialog::exec();
-
-    if (ret == QDialog::Accepted) {
-        settings->beginGroup(QLatin1String(groupC));
-        settings->setValue(QLatin1String(heightKeyC), height());
-        settings->setValue(QLatin1String(widthKeyC), width());
-        settings->endGroup();
-    }
     return ret;
 }
 
+void PasteView::accept()
+{
+    const int index = m_ui.protocolBox->currentIndex();
+    if (index == -1)
+        return;
+
+    Protocol *protocol = m_protocols.at(index);
+
+    if (!Protocol::ensureConfiguration(protocol, this))
+        return;
+
+    const Protocol::ContentType ct = Protocol::contentType(m_mimeType);
+    protocol->paste(content(), ct, user(), comment(), description());
+    // Store settings and close
+    QSettings *settings = Core::ICore::instance()->settings();
+    settings->beginGroup(QLatin1String(groupC));
+    settings->setValue(QLatin1String(heightKeyC), height());
+    settings->setValue(QLatin1String(widthKeyC), width());
+    settings->endGroup();
+    QDialog::accept();
+}
+
 void PasteView::setProtocol(const QString &protocol)
 {
      const int index = m_ui.protocolBox->findText(protocol);
diff --git a/src/plugins/cpaster/pasteview.h b/src/plugins/cpaster/pasteview.h
index 9ccd10051d7b1d6c06f4f847cd56f95474119bb4..be3659b62fa6218f8aa4feeed4eb0824d5e9ee1b 100644
--- a/src/plugins/cpaster/pasteview.h
+++ b/src/plugins/cpaster/pasteview.h
@@ -42,6 +42,7 @@ class PasteView : public QDialog
     Q_OBJECT
 public:
     explicit PasteView(const QList<Protocol *> protocols,
+                       const QString &mimeType,
                        QWidget *parent);
     ~PasteView();
 
@@ -56,6 +57,8 @@ public:
     QByteArray content() const;
     QString protocol() const;
 
+    virtual void accept();
+
 private slots:
     void contentChanged();
     void protocolChanged(int);
@@ -63,6 +66,7 @@ private slots:
 private:
     const QList<Protocol *> m_protocols;
     const QString m_commentPlaceHolder;
+    const QString m_mimeType;
 
     Ui::ViewDialog m_ui;
     FileDataList m_parts;
diff --git a/src/plugins/cpaster/protocol.cpp b/src/plugins/cpaster/protocol.cpp
index 68aca2f58c714d7f999e07f7128bd0e0226fb9d0..00ea7bca153b532585bbb05241bf00c915bc9152 100644
--- a/src/plugins/cpaster/protocol.cpp
+++ b/src/plugins/cpaster/protocol.cpp
@@ -35,9 +35,13 @@
 
 #include <QtNetwork/QNetworkAccessManager>
 #include <QtNetwork/QNetworkRequest>
+#include <QtNetwork/QNetworkReply>
 
 #include <QtCore/QUrl>
+#include <QtCore/QDebug>
+
 #include <QtGui/QMessageBox>
+#include <QtGui/QApplication>
 #include <QtGui/QMainWindow>
 #include <QtGui/QPushButton>
 
@@ -57,7 +61,7 @@ bool Protocol::hasSettings() const
     return false;
 }
 
-bool Protocol::checkConfiguration(QString *) const
+bool Protocol::checkConfiguration(QString *)
 {
     return true;
 }
@@ -115,7 +119,7 @@ QString Protocol::textFromHtml(QString data)
     return data;
 }
 
-bool Protocol::ensureConfiguration(const Protocol *p, QWidget *parent)
+bool Protocol::ensureConfiguration(Protocol *p, QWidget *parent)
 {
     QString errorMessage;
     bool ok = false;
@@ -196,4 +200,36 @@ NetworkProtocol::~NetworkProtocol()
 {
 }
 
+bool NetworkProtocol::httpStatus(QString url, QString *errorMessage)
+{
+    // Connect to host and display a message box, using its event loop.
+    errorMessage->clear();
+    const QString httpPrefix = QLatin1String("http://");
+    if (!url.startsWith(httpPrefix)) {
+        url.prepend(httpPrefix);
+        url.append(QLatin1Char('/'));
+    }
+    QNetworkReply *reply = httpGet(url);
+    QMessageBox box(QMessageBox::Information,
+                    tr("Checking connection"),
+                    tr("Connecting to %1...").arg(url),
+                    QMessageBox::Cancel,
+                    Core::ICore::instance()->mainWindow());
+    connect(reply, SIGNAL(finished()), &box, SLOT(close()));
+    QApplication::setOverrideCursor(Qt::WaitCursor);
+    box.exec();
+    QApplication::restoreOverrideCursor();
+    // User canceled, discard and be happy.
+    if (!reply->isFinished()) {
+        connect(reply, SIGNAL(finished()), reply, SLOT(deleteLater()));
+        return false;
+    }
+    // Passed
+    if (reply->error() == QNetworkReply::NoError)
+        return true;
+    // Error.
+    *errorMessage = reply->errorString();
+    return false;
+}
+
 } //namespace CodePaster
diff --git a/src/plugins/cpaster/protocol.h b/src/plugins/cpaster/protocol.h
index 43ecc6a823c17609912ddefbf9315d41f7491620..40066270ae7def52c68e229ccd22a1a52643fda9 100644
--- a/src/plugins/cpaster/protocol.h
+++ b/src/plugins/cpaster/protocol.h
@@ -67,7 +67,7 @@ public:
     virtual bool hasSettings() const;
     virtual Core::IOptionsPage *settingsPage() const;
 
-    virtual bool checkConfiguration(QString *errorMessage = 0) const;
+    virtual bool checkConfiguration(QString *errorMessage = 0);
     virtual void fetch(const QString &id) = 0;
     virtual void list();
     virtual void paste(const QString &text,
@@ -86,7 +86,7 @@ public:
                                        QWidget *parent = 0,
                                        bool showConfig = true);
     // Ensure configuration is correct
-    static bool ensureConfiguration(const Protocol *p,
+    static bool ensureConfiguration(Protocol *p,
                                     QWidget *parent = 0);
 
 signals:
@@ -143,6 +143,9 @@ protected:
     inline QNetworkAccessManager *networkAccessManager()
     { return m_networkAccessManager->networkAccessManager(); }
 
+    // Check connectivity of host, displaying a message box.
+    bool httpStatus(QString url, QString *errorMessage);
+
 private:
     const NetworkAccessManagerProxyPtr m_networkAccessManager;
 };