=== modified file 'debian/control'
--- debian/control	2016-06-03 09:38:55 +0000
+++ debian/control	2016-08-23 20:20:33 +0000
@@ -3,6 +3,7 @@
 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
 Build-Depends: debhelper (>= 9),
                libatspi2.0-dev,
+               libcontent-hub-dev (>= 0.2),
                libegl1-mesa-dev,
                libfontconfig1-dev,
                libfreetype6-dev,

=== modified file 'src/ubuntumirclient/clipboard.cpp'
--- src/ubuntumirclient/clipboard.cpp	2015-12-04 16:19:33 +0000
+++ src/ubuntumirclient/clipboard.cpp	2016-08-23 20:20:33 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Canonical, Ltd.
+ * Copyright (C) 2014,2016 Canonical, Ltd.
  *
  * This program is free software: you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License version 3, as published by
@@ -16,41 +16,35 @@
 
 #include "clipboard.h"
 #include "logging.h"
+#include "window.h"
 
+#include <QDBusPendingCallWatcher>
+#include <QGuiApplication>
+#include <QSignalBlocker>
 #include <QtCore/QMimeData>
 #include <QtCore/QStringList>
-#include <QDBusInterface>
-#include <QDBusPendingCallWatcher>
-#include <QDBusPendingReply>
-
-// FIXME(loicm) The clipboard data format is not defined by Ubuntu Platform API
-//     which makes it impossible to have non-Qt applications communicate with Qt
-//     applications through the clipboard API. The solution would be to have
-//     Ubuntu Platform define the data format or propose an API that supports
-//     embedding different mime types in the clipboard.
-
-// Data format:
-//   number of mime types      (sizeof(int))
-//   data layout               ((4 * sizeof(int)) * number of mime types)
-//     mime type string offset (sizeof(int))
-//     mime type string size   (sizeof(int))
-//     data offset             (sizeof(int))
-//     data size               (sizeof(int))
-//   data                      (n bytes)
-
-namespace {
-
-const int maxFormatsCount = 16;
-const int maxBufferSize = 4 * 1024 * 1024;  // 4 Mb
-
-}
+
+// content-hub
+#include <com/ubuntu/content/hub.h>
+
+// get this cumbersome nested namespace out of the way
+using namespace com::ubuntu::content;
 
 UbuntuClipboard::UbuntuClipboard()
     : mMimeData(new QMimeData)
-    , mIsOutdated(true)
-    , mUpdatesDisabled(false)
-    , mDBusSetupDone(false)
+    , mContentHub(Hub::Client::instance())
 {
+    connect(mContentHub, &Hub::pasteboardChanged, this, [this]() {
+        if (mClipboardState == UbuntuClipboard::SyncedClipboard) {
+            mClipboardState = UbuntuClipboard::OutdatedClipboard;
+            emitChanged(QClipboard::Clipboard);
+        }
+    });
+
+    connect(qGuiApp, &QGuiApplication::applicationStateChanged,
+        this, &UbuntuClipboard::onApplicationStateChanged);
+
+    requestMimeData();
 }
 
 UbuntuClipboard::~UbuntuClipboard()
@@ -58,203 +52,39 @@
     delete mMimeData;
 }
 
-void UbuntuClipboard::requestDBusClipboardContents()
-{
-    if (!mDBusSetupDone) {
-        setupDBus();
-    }
-
-    if (!mPendingGetContentsCall.isNull())
-        return;
-
-    QDBusPendingCall pendingCall = mDBusClipboard->asyncCall(QStringLiteral("GetContents"));
-
-    mPendingGetContentsCall = new QDBusPendingCallWatcher(pendingCall, this);
-
-    QObject::connect(mPendingGetContentsCall.data(), &QDBusPendingCallWatcher::finished,
-                     this, &UbuntuClipboard::onDBusClipboardGetContentsFinished);
-}
-
-void UbuntuClipboard::onDBusClipboardGetContentsFinished(QDBusPendingCallWatcher* call)
-{
-    Q_ASSERT(call == mPendingGetContentsCall.data());
-
-    QDBusPendingReply<QByteArray> reply = *call;
-    if (reply.isError()) {
-        qCCritical(ubuntumirclient, "Failed to get system clipboard contents via D-Bus. %s, %s",
-                qPrintable(reply.error().name()), qPrintable(reply.error().message()));
-        // TODO: Might try again later a number of times...
-    } else {
-        QByteArray serializedMimeData = reply.argumentAt<0>();
-        updateMimeData(serializedMimeData);
-    }
-    call->deleteLater();
-}
-
-void UbuntuClipboard::onDBusClipboardSetContentsFinished(QDBusPendingCallWatcher *call)
-{
-    QDBusPendingReply<void> reply = *call;
-    if (reply.isError()) {
-        qCCritical(ubuntumirclient, "Failed to set the system clipboard contents via D-Bus. %s, %s",
-                qPrintable(reply.error().name()), qPrintable(reply.error().message()));
-        // TODO: Might try again later a number of times...
-    }
-    call->deleteLater();
-}
-
-void UbuntuClipboard::updateMimeData(const QByteArray &serializedMimeData)
-{
-    if (mUpdatesDisabled)
-        return;
-
-    QMimeData *newMimeData = deserializeMimeData(serializedMimeData);
-    if (newMimeData) {
-        delete mMimeData;
-        mMimeData = newMimeData;
-        mIsOutdated = false;
-        emitChanged(QClipboard::Clipboard);
-    } else {
-        qCWarning(ubuntumirclient) << "Got invalid serialized mime data. Ignoring it.";
-    }
-}
-
-void UbuntuClipboard::setupDBus()
-{
-    QDBusConnection dbusConnection = QDBusConnection::sessionBus();
-
-    bool ok = dbusConnection.connect(
-            QStringLiteral("com.canonical.QtMir"),
-            QStringLiteral("/com/canonical/QtMir/Clipboard"),
-            QStringLiteral("com.canonical.QtMir.Clipboard"),
-            QStringLiteral("ContentsChanged"),
-            this, SLOT(updateMimeData(QByteArray)));
-    if (!ok) {
-        qCCritical(ubuntumirclient) << "Failed to connect to ContentsChanged signal form the D-Bus system clipboard.";
-    }
-
-    mDBusClipboard = new QDBusInterface(QStringLiteral("com.canonical.QtMir"),
-            QStringLiteral("/com/canonical/QtMir/Clipboard"),
-            QStringLiteral("com.canonical.QtMir.Clipboard"),
-            dbusConnection);
-
-    mDBusSetupDone = true;
-}
-
-QByteArray UbuntuClipboard::serializeMimeData(QMimeData *mimeData) const
-{
-    Q_ASSERT(mimeData != nullptr);
-
-    const QStringList formats = mimeData->formats();
-    const int formatCount = qMin(formats.size(), maxFormatsCount);
-    const int headerSize = sizeof(int) + (formatCount * 4 * sizeof(int));
-    int bufferSize = headerSize;
-
-    for (int i = 0; i < formatCount; i++)
-        bufferSize += formats[i].size() + mimeData->data(formats[i]).size();
-
-    QByteArray serializedMimeData;
-    if (bufferSize <= maxBufferSize) {
-        // Serialize data.
-        serializedMimeData.resize(bufferSize);
-        {
-            char *buffer = serializedMimeData.data();
-            int* header = reinterpret_cast<int*>(serializedMimeData.data());
-            int offset = headerSize;
-            header[0] = formatCount;
-            for (int i = 0; i < formatCount; i++) {
-                const QByteArray data = mimeData->data(formats[i]);
-                const int formatOffset = offset;
-                const int formatSize = formats[i].size();
-                const int dataOffset = offset + formatSize;
-                const int dataSize = data.size();
-                memcpy(&buffer[formatOffset], formats[i].toLatin1().data(), formatSize);
-                memcpy(&buffer[dataOffset], data.data(), dataSize);
-                header[i*4+1] = formatOffset;
-                header[i*4+2] = formatSize;
-                header[i*4+3] = dataOffset;
-                header[i*4+4] = dataSize;
-                offset += formatSize + dataSize;
-            }
-        }
-    } else {
-        qCWarning(ubuntumirclient, "Not sending contents (%d bytes) to the global clipboard as it's"
-                " bigger than the maximum allowed size of %d bytes", bufferSize, maxBufferSize);
-    }
-
-    return serializedMimeData;
-}
-
-QMimeData *UbuntuClipboard::deserializeMimeData(const QByteArray &serializedMimeData) const
-{
-    if (static_cast<std::size_t>(serializedMimeData.size()) < sizeof(int)) {
-        // Data is invalid
-        return nullptr;
-    }
-
-    QMimeData *mimeData = new QMimeData;
-
-    const char* const buffer = serializedMimeData.constData();
-    const int* const header = reinterpret_cast<const int*>(serializedMimeData.constData());
-
-    const int count = qMin(header[0], maxFormatsCount);
-
-    for (int i = 0; i < count; i++) {
-        const int formatOffset = header[i*4+1];
-        const int formatSize = header[i*4+2];
-        const int dataOffset = header[i*4+3];
-        const int dataSize = header[i*4+4];
-
-        if (formatOffset + formatSize <= serializedMimeData.size()
-                && dataOffset + dataSize <= serializedMimeData.size()) {
-
-            QString mimeType = QString::fromLatin1(&buffer[formatOffset], formatSize);
-            QByteArray mimeDataBytes(&buffer[dataOffset], dataSize);
-
-            mimeData->setData(mimeType, mimeDataBytes);
-        }
-    }
-
-    return mimeData;
-}
-
 QMimeData* UbuntuClipboard::mimeData(QClipboard::Mode mode)
 {
     if (mode != QClipboard::Clipboard)
         return nullptr;
 
-    if (mIsOutdated && mPendingGetContentsCall.isNull()) {
-        requestDBusClipboardContents();
+    // Blocks dataChanged() signal from being emitted. Makes no sense to emit it from
+    // inside the data getter.
+    const QSignalBlocker blocker(this);
+
+    if (mClipboardState == OutdatedClipboard) {
+        updateMimeData();
+    } else if (mClipboardState == SyncingClipboard) {
+        mPasteReply->waitForFinished();
     }
 
-    // Return whatever we have at the moment instead of blocking until we have something.
-    //
-    // This might be called during app startup just for the sake of checking if some
-    // "Paste" UI control should be enabled or not.
-    // We will emit QClipboard::changed() once we finally have something.
     return mMimeData;
 }
 
 void UbuntuClipboard::setMimeData(QMimeData* mimeData, QClipboard::Mode mode)
 {
-    if (mode != QClipboard::Clipboard)
-        return;
-
-    if (!mPendingGetContentsCall.isNull()) {
-        // Ignore whatever comes from the system clipboard as we are going to change it anyway
-        QObject::disconnect(mPendingGetContentsCall.data(), 0, this, 0);
-        mUpdatesDisabled = true;
-        mPendingGetContentsCall->waitForFinished();
-        mUpdatesDisabled = false;
-        delete mPendingGetContentsCall.data();
-    }
-
-    if (mimeData != nullptr) {
-        QByteArray serializedMimeData = serializeMimeData(mimeData);
-        if (!serializedMimeData.isEmpty()) {
-            setDBusClipboardContents(serializedMimeData);
-        }
+    QWindow *focusWindow = QGuiApplication::focusWindow();
+    if (focusWindow && mode == QClipboard::Clipboard && mimeData != nullptr) {
+        QString surfaceId = static_cast<UbuntuWindow*>(focusWindow->handle())->persistentSurfaceId();
+
+        QDBusPendingCall reply = mContentHub->createPaste(surfaceId, *mimeData);
+
+        // Don't care whether it succeeded
+        QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
+        connect(watcher, &QDBusPendingCallWatcher::finished,
+                watcher, &QObject::deleteLater);
 
         mMimeData = mimeData;
+        mClipboardState = SyncedClipboard;
         emitChanged(QClipboard::Clipboard);
     }
 }
@@ -270,25 +100,58 @@
     return false;
 }
 
-void UbuntuClipboard::setDBusClipboardContents(const QByteArray &clipboardContents)
-{
-    if (!mDBusSetupDone) {
-        setupDBus();
-    }
-
-    if (!mPendingSetContentsCall.isNull()) {
-        // Ignore any previous set call as we are going to overwrite it anyway
-        QObject::disconnect(mPendingSetContentsCall.data(), 0, this, 0);
-        mUpdatesDisabled = true;
-        mPendingSetContentsCall->waitForFinished();
-        mUpdatesDisabled = false;
-        delete mPendingSetContentsCall.data();
-    }
-
-    QDBusPendingCall pendingCall = mDBusClipboard->asyncCall(QStringLiteral("SetContents"), clipboardContents);
-
-    mPendingSetContentsCall = new QDBusPendingCallWatcher(pendingCall, this);
-
-    QObject::connect(mPendingSetContentsCall.data(), &QDBusPendingCallWatcher::finished,
-                     this, &UbuntuClipboard::onDBusClipboardSetContentsFinished);
+void UbuntuClipboard::onApplicationStateChanged(Qt::ApplicationState state)
+{
+    if (state == Qt::ApplicationActive) {
+        // Only focused or active applications might be allowed to paste, so we probably
+        // missed changes in the clipboard while we were hidden, inactive or, more importantly,
+        // suspended.
+        requestMimeData();
+    }
+}
+
+void UbuntuClipboard::updateMimeData()
+{
+    if (qGuiApp->applicationState() != Qt::ApplicationActive) {
+        // Don't even bother asking as content-hub would probably ignore our request (and should).
+        return;
+    }
+
+    delete mMimeData;
+
+    QWindow *focusWindow = QGuiApplication::focusWindow();
+    if (focusWindow) {
+        QString surfaceId = static_cast<UbuntuWindow*>(focusWindow->handle())->persistentSurfaceId();
+        mMimeData = mContentHub->latestPaste(surfaceId);
+        mClipboardState = SyncedClipboard;
+        emitChanged(QClipboard::Clipboard);
+    }
+}
+
+void UbuntuClipboard::requestMimeData()
+{
+    if (qGuiApp->applicationState() != Qt::ApplicationActive) {
+        // Don't even bother asking as content-hub would probably ignore our request (and should).
+        return;
+    }
+
+    QWindow *focusWindow = QGuiApplication::focusWindow();
+    if (!focusWindow) {
+        return;
+    }
+
+    QString surfaceId = static_cast<UbuntuWindow*>(focusWindow->handle())->persistentSurfaceId();
+    QDBusPendingCall reply = mContentHub->requestLatestPaste(surfaceId);
+    mClipboardState = SyncingClipboard;
+
+    mPasteReply = new QDBusPendingCallWatcher(reply, this);
+    connect(mPasteReply, &QDBusPendingCallWatcher::finished,
+            this, [this]() {
+        delete mMimeData;
+        mMimeData = mContentHub->paste(*mPasteReply);
+        mClipboardState = SyncedClipboard;
+        mPasteReply->deleteLater();
+        mPasteReply = nullptr;
+        emitChanged(QClipboard::Clipboard);
+    });
 }

=== modified file 'src/ubuntumirclient/clipboard.h'
--- src/ubuntumirclient/clipboard.h	2014-09-22 17:29:40 +0000
+++ src/ubuntumirclient/clipboard.h	2016-08-23 20:20:33 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Canonical, Ltd.
+ * Copyright (C) 2014,2016 Canonical, Ltd.
  *
  * This program is free software: you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License version 3, as published by
@@ -21,7 +21,15 @@
 
 #include <QMimeData>
 #include <QPointer>
-class QDBusInterface;
+
+namespace com {
+    namespace ubuntu {
+        namespace content {
+            class Hub;
+        }
+    }
+}
+
 class QDBusPendingCallWatcher;
 
 class UbuntuClipboard : public QObject, public QPlatformClipboard
@@ -37,31 +45,24 @@
     bool supportsMode(QClipboard::Mode mode) const override;
     bool ownsMode(QClipboard::Mode mode) const override;
 
-    void requestDBusClipboardContents();
-
 private Q_SLOTS:
-    void onDBusClipboardGetContentsFinished(QDBusPendingCallWatcher*);
-    void onDBusClipboardSetContentsFinished(QDBusPendingCallWatcher*);
-    void updateMimeData(const QByteArray &serializedMimeData);
+    void onApplicationStateChanged(Qt::ApplicationState state);
 
 private:
-    void setupDBus();
-
-    QByteArray serializeMimeData(QMimeData *mimeData) const;
-    QMimeData *deserializeMimeData(const QByteArray &serializedMimeData) const;
-
-    void setDBusClipboardContents(const QByteArray &clipboardContents);
+    void updateMimeData();
+    void requestMimeData();
 
     QMimeData *mMimeData;
-    bool mIsOutdated;
-
-    QPointer<QDBusInterface> mDBusClipboard;
-
-    QPointer<QDBusPendingCallWatcher> mPendingGetContentsCall;
-    QPointer<QDBusPendingCallWatcher> mPendingSetContentsCall;
-
-    bool mUpdatesDisabled;
-    bool mDBusSetupDone;
+
+    enum {
+        OutdatedClipboard, // Our mimeData is outdated, need to fetch latest from ContentHub
+        SyncingClipboard, // Our mimeData is outdated and we are waiting for ContentHub to reply with the latest paste
+        SyncedClipboard // Our mimeData is in sync with what ContentHub has
+    } mClipboardState{OutdatedClipboard};
+
+    com::ubuntu::content::Hub *mContentHub;
+
+    QDBusPendingCallWatcher *mPasteReply{nullptr};
 };
 
 #endif // UBUNTU_CLIPBOARD_H

=== modified file 'src/ubuntumirclient/input.cpp'
--- src/ubuntumirclient/input.cpp	2016-08-09 23:00:49 +0000
+++ src/ubuntumirclient/input.cpp	2016-08-23 20:20:33 +0000
@@ -610,7 +610,6 @@
         // so that we don't deactivate windows prematurely.
         if (focused) {
             mPendingFocusGainedEvents--;
-            window->handleSurfaceFocused();
             QWindowSystemInterface::handleWindowActivated(window->window(), Qt::ActiveWindowFocusReason);
 
             // NB: Since processing of system events is queued, never check qGuiApp->applicationState()

=== modified file 'src/ubuntumirclient/integration.cpp'
--- src/ubuntumirclient/integration.cpp	2016-06-22 17:07:57 +0000
+++ src/ubuntumirclient/integration.cpp	2016-08-23 20:20:33 +0000
@@ -74,7 +74,6 @@
     , mNativeInterface(new UbuntuNativeInterface(this))
     , mFontDb(new QGenericUnixFontDatabase)
     , mServices(new UbuntuPlatformServices)
-    , mClipboard(new UbuntuClipboard)
     , mScaleFactor(1.0)
 {
     {
@@ -211,7 +210,11 @@
 
 QPlatformWindow* UbuntuClientIntegration::createPlatformWindow(QWindow* window) const
 {
+<<<<<<< TREE
     return new UbuntuWindow(window, mClipboard, mInput, mNativeInterface, mEglDisplay, mMirConnection);
+=======
+    return new UbuntuWindow(window, mInput, mNativeInterface, mEglDisplay, mEglConfig, mMirConnection);
+>>>>>>> MERGE-SOURCE
 }
 
 bool UbuntuClientIntegration::hasCapability(QPlatformIntegration::Capability cap) const
@@ -305,7 +308,11 @@
 
 QPlatformClipboard* UbuntuClientIntegration::clipboard() const
 {
-    return mClipboard.data();
+    static QPlatformClipboard *clipboard = nullptr;
+    if (!clipboard) {
+        clipboard = new UbuntuClipboard;
+    }
+    return clipboard;
 }
 
 QPlatformNativeInterface* UbuntuClientIntegration::nativeInterface() const

=== modified file 'src/ubuntumirclient/integration.h'
--- src/ubuntumirclient/integration.h	2016-06-22 12:30:09 +0000
+++ src/ubuntumirclient/integration.h	2016-08-23 20:20:33 +0000
@@ -29,7 +29,6 @@
 
 #include <EGL/egl.h>
 
-class UbuntuClipboard;
 class UbuntuInput;
 class UbuntuNativeInterface;
 class UbuntuScreen;
@@ -82,7 +81,6 @@
 
     UbuntuInput* mInput;
     QPlatformInputContext* mInputContext;
-    QSharedPointer<UbuntuClipboard> mClipboard;
     QScopedPointer<UbuntuScreenObserver> mScreenObserver;
     qreal mScaleFactor;
 

=== modified file 'src/ubuntumirclient/ubuntumirclient.pro'
--- src/ubuntumirclient/ubuntumirclient.pro	2016-05-30 17:14:14 +0000
+++ src/ubuntumirclient/ubuntumirclient.pro	2016-08-23 20:20:33 +0000
@@ -12,7 +12,7 @@
 QMAKE_LFLAGS += -std=c++11 -Wl,-no-undefined
 
 CONFIG += link_pkgconfig
-PKGCONFIG += egl mirclient ubuntu-platform-api xkbcommon
+PKGCONFIG += egl mirclient ubuntu-platform-api xkbcommon libcontent-hub
 
 SOURCES = \
     backingstore.cpp \

=== modified file 'src/ubuntumirclient/window.cpp'
--- src/ubuntumirclient/window.cpp	2016-08-09 23:00:32 +0000
+++ src/ubuntumirclient/window.cpp	2016-08-23 20:20:33 +0000
@@ -16,7 +16,6 @@
 
 // Local
 #include "window.h"
-#include "clipboard.h"
 #include "nativeinterface.h"
 #include "input.h"
 #include "screen.h"
@@ -397,10 +396,15 @@
     void setSurfaceParent(MirSurface*);
     bool hasParent() const { return mParented; }
 
+<<<<<<< TREE
     QSurfaceFormat format() const { return mFormat; }
 
     bool mNeedsExposeCatchup;
 
+=======
+    QString persistentSurfaceId();
+
+>>>>>>> MERGE-SOURCE
 private:
     static void surfaceEventCallback(MirSurface* surface, const MirEvent *event, void* context);
     void postEvent(const MirEvent *event);
@@ -422,6 +426,7 @@
     QMutex mTargetSizeMutex;
     QSize mTargetSize;
     MirShellChrome mShellChrome;
+    QString mPersistentIdStr;
 };
 
 void UbuntuSurface::resize(const QSize& size)
@@ -575,12 +580,26 @@
     mir_surface_apply_spec(mMirSurface, spec.get());
 }
 
+<<<<<<< TREE
 UbuntuWindow::UbuntuWindow(QWindow *w, const QSharedPointer<UbuntuClipboard> &clipboard,
                            UbuntuInput *input, UbuntuNativeInterface *native, EGLDisplay eglDisplay, MirConnection *mirConnection)
+=======
+QString UbuntuSurface::persistentSurfaceId()
+{
+    if (mPersistentIdStr.isEmpty()) {
+        MirPersistentId* mirPermaId = mir_surface_request_persistent_id_sync(mMirSurface);
+        mPersistentIdStr = mir_persistent_id_as_string(mirPermaId);
+        mir_persistent_id_release(mirPermaId);
+    }
+    return mPersistentIdStr;
+}
+
+UbuntuWindow::UbuntuWindow(QWindow *w, UbuntuInput *input, UbuntuNativeInterface *native,
+                           EGLDisplay eglDisplay, EGLConfig eglConfig, MirConnection *mirConnection)
+>>>>>>> MERGE-SOURCE
     : QObject(nullptr)
     , QPlatformWindow(w)
     , mId(makeId())
-    , mClipboard(clipboard)
     , mWindowState(w->windowState())
     , mWindowFlags(w->flags())
     , mWindowVisible(false)
@@ -639,13 +658,6 @@
 {
     qCDebug(ubuntumirclient, "handleSurfaceFocused(window=%p)", window());
 
-    // System clipboard contents might have changed while this window was unfocused and without
-    // this process getting notified about it because it might have been suspended (due to
-    // application lifecycle policies), thus unable to listen to any changes notified through
-    // D-Bus.
-    // Therefore let's ensure we are up to date with the system clipboard now that we are getting
-    // focused again.
-    mClipboard->requestDBusClipboardContents();
 }
 
 void UbuntuWindow::handleSurfaceVisibilityChanged(bool visible)
@@ -840,3 +852,8 @@
         updatePanelHeightHack(newState != mir_surface_state_fullscreen);
     }
 }
+
+QString UbuntuWindow::persistentSurfaceId()
+{
+    return mSurface->persistentSurfaceId();
+}

=== modified file 'src/ubuntumirclient/window.h'
--- src/ubuntumirclient/window.h	2016-06-22 12:30:09 +0000
+++ src/ubuntumirclient/window.h	2016-08-23 20:20:33 +0000
@@ -27,7 +27,6 @@
 
 #include <EGL/egl.h>
 
-class UbuntuClipboard;
 class UbuntuNativeInterface;
 class UbuntuInput;
 class UbuntuScreen;
@@ -39,9 +38,14 @@
 {
     Q_OBJECT
 public:
+<<<<<<< TREE
     UbuntuWindow(QWindow *w, const QSharedPointer<UbuntuClipboard> &clipboard,
                  UbuntuInput *input, UbuntuNativeInterface* native, EGLDisplay eglDisplay,
                  MirConnection *mirConnection);
+=======
+    UbuntuWindow(QWindow *w, UbuntuInput *input, UbuntuNativeInterface* native,
+                 EGLDisplay eglDisplay, EGLConfig eglConfig, MirConnection *mirConnection);
+>>>>>>> MERGE-SOURCE
     virtual ~UbuntuWindow();
 
     // QPlatformWindow methods.
@@ -70,13 +74,13 @@
     void handleSurfaceStateChanged(Qt::WindowState state);
     void onSwapBuffersDone();
     void handleScreenPropertiesChange(MirFormFactor formFactor, float scale);
+    QString persistentSurfaceId();
 
 private:
     void updatePanelHeightHack(bool enable);
     void updateSurfaceState();
     mutable QMutex mMutex;
     const WId mId;
-    const QSharedPointer<UbuntuClipboard> mClipboard;
     Qt::WindowState mWindowState;
     Qt::WindowFlags mWindowFlags;
     bool mWindowVisible;

