diff -Naur tapioca-qt-0.14.1/config.h tapioca-qt/config.h
--- tapioca-qt-0.14.1/config.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/config.h	1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-#define DATADIR "/usr/local/share"
diff -Naur tapioca-qt-0.14.1/include/QtTapioca/channel.h tapioca-qt/include/QtTapioca/channel.h
--- tapioca-qt-0.14.1/include/QtTapioca/channel.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/include/QtTapioca/channel.h	2007-11-20 21:25:06.000000000 +0100
@@ -57,9 +57,13 @@
 
     void close();
     virtual void join();
-    ContactGroup *contactGroup() const;
+    ContactGroup * contactGroup();
     bool hasGroupSupport() const;
 
+    bool hasSupportFor(const QString &) const;
+
+    Connection * connection() const;
+
 Q_SIGNALS:
     void closed();
 
diff -Naur tapioca-qt-0.14.1/include/QtTapioca/CMakeLists.txt tapioca-qt/include/QtTapioca/CMakeLists.txt
--- tapioca-qt-0.14.1/include/QtTapioca/CMakeLists.txt	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/include/QtTapioca/CMakeLists.txt	2007-11-20 21:25:06.000000000 +0100
@@ -18,6 +18,8 @@
     contact.h
     ContactBase
     contactbase.h
+    ContactGroup
+    contactgroup.h
     ContactList
     contactlist.h
     DBusProxyObject
@@ -31,7 +33,9 @@
     TextChannel
     textchannel.h
     StreamChannel
+    streamchannel.h
     Stream
+    stream.h
 )
 
 install(FILES ${library_HDRS} DESTINATION include/QtTapioca)
diff -Naur tapioca-qt-0.14.1/include/QtTapioca/connection.h tapioca-qt/include/QtTapioca/connection.h
--- tapioca-qt-0.14.1/include/QtTapioca/connection.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/include/QtTapioca/connection.h	2007-11-20 21:25:06.000000000 +0100
@@ -107,7 +107,7 @@
      *
      *  @return User's own contact.
      */
-    UserContact *userContact() const;
+    UserContact *userContact();
 
     /** Check for Avatar interface support.
      *
diff -Naur tapioca-qt-0.14.1/include/QtTapioca/contactgroup.h tapioca-qt/include/QtTapioca/contactgroup.h
--- tapioca-qt-0.14.1/include/QtTapioca/contactgroup.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/include/QtTapioca/contactgroup.h	2007-11-20 21:25:06.000000000 +0100
@@ -30,6 +30,7 @@
 
 namespace QtTapioca {
 
+class Channel;
 class Conatct;
 class Connection;
 class ContactGroupPrivate;
@@ -63,10 +64,12 @@
     QList<Contact *> contacts() const;
     QList<Contact *> pendingContacts() const;
 
+    Channel * channel() const;
+
 Q_SIGNALS:
-    void contactEntered(Contact *contact);
-    void contactLeft(Contact *contact);
-    void newPendingContact(Contact *contact);
+    void contactEntered(QtTapioca::Contact *contact);
+    void contactLeft(QtTapioca::Contact *contact);
+    void newPendingContact(QtTapioca::Contact *contact);
 
 private Q_SLOTS:
     void onGroupFlagsChanged(uint added, uint removed);
@@ -75,10 +78,12 @@
                           const QList<uint> &remote_pending, uint actor, uint reason);
 
 private:
-    ContactGroup(Connection *connection, const QString &serviceName, const QString &objPath, QObject *parent = 0);
+    ContactGroup(Connection *connection, const QString &serviceName, const QString &objPath, Channel *channel);
     QList<Contact *> contactsFromContactList(QList<uint> ids) const;
 
     ContactGroupPrivate *d;
+
+    friend class Channel;
 };
 
 } // namespace
diff -Naur tapioca-qt-0.14.1/include/QtTapioca/contactlist.h tapioca-qt/include/QtTapioca/contactlist.h
--- tapioca-qt-0.14.1/include/QtTapioca/contactlist.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/include/QtTapioca/contactlist.h	2007-11-20 21:25:06.000000000 +0100
@@ -105,6 +105,7 @@
     Contact *contact(Handle *handle) const;
     Contact *contact(uint id) const;
     Contact *addContact(const Handle *handle);
+    Contact *addContact(const uint id);
 
     ContactListPrivate *d;
 };
diff -Naur tapioca-qt-0.14.1/include/QtTapioca/stream.h tapioca-qt/include/QtTapioca/stream.h
--- tapioca-qt-0.14.1/include/QtTapioca/stream.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/include/QtTapioca/stream.h	2007-11-20 21:25:06.000000000 +0100
@@ -47,8 +47,8 @@
     };
 
     enum StreamState {
-        Connecting = 0,
-        Paused = 1,
+        Paused = 0,
+        Connecting = 1,
         Playing = 2
     };
 
@@ -59,8 +59,8 @@
     StreamState state() const { return m_state; }
 
 Q_SIGNALS:
-    void streamError(Stream *stream, int code, const QString &message);
-    void stateChanged(Stream *stream, Stream::StreamState newState);
+    void streamError(QtTapioca::Stream *stream, int code, const QString &message);
+    void stateChanged(QtTapioca::Stream *stream, QtTapioca::Stream::StreamState newState);
 
 private Q_SLOTS:
     void onStreamError(uint id, uint error, const QString &msg);
diff -Naur tapioca-qt-0.14.1/include/QtTapioca/textchannel.h tapioca-qt/include/QtTapioca/textchannel.h
--- tapioca-qt-0.14.1/include/QtTapioca/textchannel.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/include/QtTapioca/textchannel.h	2007-11-20 21:25:06.000000000 +0100
@@ -97,7 +97,7 @@
     TextChannel::ChatState localChatState() const;
 
 Q_SIGNALS:
-    void messageReceived(const QtTapioca::TextChannel::Message &message);
+    void messageReceived(const QtTapioca::TextChannel *tch, const QtTapioca::TextChannel::Message &message);
     void messageDeliveryError(const QtTapioca::TextChannel::Message &message,
                               QtTapioca::TextChannel::Message::DeliveryError error);
     void messageSent(const QtTapioca::TextChannel::Message &message);
diff -Naur tapioca-qt-0.14.1/QtTapioca.pc tapioca-qt/QtTapioca.pc
--- tapioca-qt-0.14.1/QtTapioca.pc	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/QtTapioca.pc	1970-01-01 01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-prefix=/usr/local
-exec_prefix=/usr/local
-libdir=/usr/local/lib
-includedir=/usr/local/include
-
-Name: QtTapioca
-Description: Qt Tapioca binding library
-Version: 0.14.1
-Requires: QtCore QtDBus QtTelepathyClient
-Libs: -L/usr/local/lib -lQtTapioca
-Cflags: -I/usr/local/include/QtTapioca -I/usr/local/include/
diff -Naur tapioca-qt-0.14.1/RELEASE tapioca-qt/RELEASE
--- tapioca-qt-0.14.1/RELEASE	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/RELEASE	1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-This api is compliant with version 0.4.4 of Tapioca's spec.
-You can find detailed documentation at: http://tapioca-voip.sf.net
diff -Naur tapioca-qt-0.14.1/src/channel.cpp tapioca-qt/src/channel.cpp
--- tapioca-qt-0.14.1/src/channel.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/src/channel.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -25,6 +25,7 @@
 
 #include "QtTapioca/Channel"
 #include "QtTapioca/ChannelTarget"
+#include "QtTapioca/ContactGroup"
 
 #include <QtDBus/QDBusConnection>
 #include <QtDBus/QDBusConnectionInterface>
@@ -39,7 +40,9 @@
                    const QString &objPath,
                    ChannelTarget *channelTarget)
         : conn(connection),
+          ch(0),
           target(channelTarget),
+          cg(0),
           join(false)
     {
         ch = new org::freedesktop::Telepathy::Channel(serviceName, objPath, QDBusConnection::sessionBus());
@@ -52,7 +55,7 @@
     Connection *conn;
     org::freedesktop::Telepathy::Channel *ch;
     ChannelTarget* target;
-    ContactGroup *cg;
+    ContactGroup * cg;
     bool join;
 };
 
@@ -97,17 +100,35 @@
     return d->target;
 }
 
-ContactGroup *Channel::contactGroup() const
+ContactGroup *Channel::contactGroup()
 {
+    if (!hasGroupSupport()) { return 0; }
+    if (0 == d->cg)
+    {
+        d->cg = new ContactGroup(d->conn, serviceName(), objectPath(), this);
+        Q_ASSERT(0 != d->cg);
+    }
     return d->cg;
 }
 
 bool Channel::hasGroupSupport() const
 {
-    return (d->cg);
+    return hasSupportFor("org.freedesktop.Telepathy.Channel.Interface.Group");
+}
+
+bool Channel::hasSupportFor(const QString & interface) const
+{
+    QStringList interfaces = d->ch->GetInterfaces();
+    return interfaces.contains(interface);
 }
 
 void Channel::join()
 {
     d->join = true;
 }
+
+Connection * Channel::connection() const
+{
+    return d->conn;
+}
+
diff -Naur tapioca-qt-0.14.1/src/connection.cpp tapioca-qt/src/connection.cpp
--- tapioca-qt-0.14.1/src/connection.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/src/connection.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -139,6 +139,8 @@
     QObject::connect(d->conn, SIGNAL(StatusChanged(uint,uint)), this, SLOT(onStatusChanged(uint,uint)));
 
     updateOpenChannels();
+
+    if (d->status == Connected) { d->loadInterfaces(); }
 }
 
 /*
@@ -196,16 +198,14 @@
     Channel *channel = 0;
     QString objPath;
 
-    d->mutex.lock();
+    QMutexLocker lock(&(d->mutex));
     if (type == Channel::Text) {
-        qDebug() << "Creating a text channel.";
         objPath = requestChannel("org.freedesktop.Telepathy.Channel.Type.Text", contact->handle(),
              suppress_handler);
         if (!objPath.isEmpty())
             channel = new TextChannel(this, serviceName(), objPath, contact, this);
     }
     else if (type == Channel::Stream) {
-        qDebug() << "Creating a stream channel.";
         objPath = requestChannel("org.freedesktop.Telepathy.Channel.Type.StreamedMedia", contact->handle(),
              suppress_handler);
         if (!objPath.isEmpty())
@@ -218,8 +218,6 @@
                          this, SLOT(onChannelDestroyed()));
     }
 
-    d->mutex.unlock();
-
     return channel;
 }
 
@@ -251,7 +249,7 @@
 ContactList *Connection::contactList()
 {
     if (d->status == Connection::Disconnected)
-        return 0;
+    { return 0; }
 
     if (!d->cl) {
         d->cl = new ContactList(d->conn,
@@ -273,7 +271,8 @@
     if (!d->uContact) {
         if (!d->selfHandle) {
             /* Updated selfHandle */
-            d->selfHandle = d->handleFactory->createHandle(Handle::Contact, d->conn->GetSelfHandle());
+            uint my_handle = d->conn->GetSelfHandle();
+            d->selfHandle = d->handleFactory->createHandle(Handle::Contact, my_handle);
             Q_ASSERT (d->selfHandle != 0);
         }
 
@@ -286,8 +285,9 @@
 /*
  * Get User Contact
  */
-UserContact *Connection::userContact() const
+UserContact *Connection::userContact()
 {
+    if (d->uContact == 0 && d->status == Connected) { initUserContact(); }
     return d->uContact;
 }
 
@@ -309,19 +309,20 @@
 void Connection::updateOpenChannels()
 {
     if (d->status != Connection::Connected)
-        return;
+    { return; }
 
     org::freedesktop::Telepathy::ChannelInfo channelInfo;
     org::freedesktop::Telepathy::ChannelInfoList channelInfoList;
 
     channelInfoList = d->conn->ListChannels();
 
-    foreach (channelInfo, channelInfoList)
+    foreach (channelInfo, channelInfoList) {
         incomingChannel(channelInfo.objectPath,
                         channelInfo.interfaceName,
                         channelInfo.handleType,
                         channelInfo.handle,
                         true);
+    }
 }
 
 Channel * Connection::incomingChannel(const QDBusObjectPath &objPath,
@@ -332,14 +333,12 @@
 {
     Channel *channel = 0;
 
-    d->mutex.lock();
+    QMutexLocker lock(&(d->mutex));
 
     if ((d->channels.contains(objPath.path())) ||
         ((channelType != "org.freedesktop.Telepathy.Channel.Type.Text") &&
-        (channelType != "org.freedesktop.Telepathy.Channel.Type.StreamedMedia"))) {
-        d->mutex.unlock();
-        return NULL;
-    }
+        (channelType != "org.freedesktop.Telepathy.Channel.Type.StreamedMedia")))
+    { return NULL; }
 
     Contact *contact = contactList()->contact(handleId);
 
@@ -348,7 +347,6 @@
         contact = d->cl->addContact(handle);
         if (!contact) {
             qDebug() << "error creating a contact.";
-            d->mutex.unlock();
             return NULL;
         }
     }
@@ -364,8 +362,6 @@
                          this, SLOT(onChannelDestroyed()));
     }
 
-    d->mutex.unlock();
-
     return channel;
 }
 
@@ -397,7 +393,6 @@
 
     if (status == Connected) {
         d->loadInterfaces();
-        initUserContact();
     }
 
     emit statusChanged(this,
diff -Naur tapioca-qt-0.14.1/src/contactbase.cpp tapioca-qt/src/contactbase.cpp
--- tapioca-qt-0.14.1/src/contactbase.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/src/contactbase.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -308,3 +308,9 @@
         if (cap.contactHandle == id)
             updateCapabilities(cap.channelType, cap.newTypeSpecificFlags);
 }
+
+bool ContactBase::operator==(const ContactBase &info) const
+{
+    return (*(info.handle()) == *handle());
+}
+
diff -Naur tapioca-qt-0.14.1/src/contactgroup.cpp tapioca-qt/src/contactgroup.cpp
--- tapioca-qt-0.14.1/src/contactgroup.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/src/contactgroup.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -35,8 +35,9 @@
 public:
     ContactGroupPrivate(Connection *connection,
                         const QString &serviceName,
-                        const QString &objPath)
-        : conn(connection)
+                        const QString &objPath,
+                        Channel * chan)
+        : conn(connection), channel(chan)
     {
         telepathyIChannelGroup = new org::freedesktop::Telepathy::ChannelGroupInterface(serviceName, objPath, QDBusConnection::sessionBus());
 
@@ -50,6 +51,7 @@
 
     uint flags;
     Connection *conn;
+    Channel * channel;
     org::freedesktop::Telepathy::ChannelGroupInterface *telepathyIChannelGroup;
 };
 
@@ -57,19 +59,19 @@
 
 using namespace QtTapioca;
 
-ContactGroup::ContactGroup(Connection *connection, const QString &serviceName, const QString &objPath, QObject *parent)
-    : d(new ContactGroupPrivate(connection, serviceName, objPath))
+ContactGroup::ContactGroup(Connection *connection, const QString &serviceName, const QString &objPath, Channel *channel)
+    : d(new ContactGroupPrivate(connection, serviceName, objPath, channel))
 {
     Q_ASSERT(d);
 
-    QObject::connect(d->telepathyIChannelGroup, SIGNAL(GroupFlagsChanged(uint added, uint removed)), this, SLOT(onGroupFlagsChanged(uint added, uint removed)));
-    QObject::connect(d->telepathyIChannelGroup, SIGNAL(MembersChanged(const QString &message, const QList<uint> &added,
-                                                                      const QList<uint> &removed, const QList<uint> &local_pending,
-                                                                      const QList<uint> &remote_pending, uint actor, uint reason)),
+    QObject::connect(d->telepathyIChannelGroup, SIGNAL(GroupFlagsChanged(uint, uint)), this, SLOT(onGroupFlagsChanged(uint, uint)));
+    QObject::connect(d->telepathyIChannelGroup, SIGNAL(MembersChanged(const QString&, const QList<uint>&,
+                                                                      const QList<uint>&, const QList<uint> &,
+                                                                      const QList<uint>&, uint, uint)),
                      this,
-                     SLOT(onMembersChanged(const QString &message, const QList<uint> &added,
-                                           const QList<uint> &removed, const QList<uint> &local_pending,
-                                           const QList<uint> &remote_pending, uint actor, uint reason)));
+                     SLOT(onMembersChanged(const QString&, const QList<uint>&,
+                                           const QList<uint>&, const QList<uint>&,
+                                           const QList<uint>&, uint, uint)));
 }
 
 ContactGroup::~ContactGroup()
@@ -154,6 +156,8 @@
     return lc;
 }
 
+Channel * ContactGroup::channel() const { return d->channel; }
+
 QList<Contact *> ContactGroup::contactsFromContactList(QList<uint> ids) const
 {
     uint i;
@@ -162,10 +166,18 @@
 
     foreach (i, ids) {
         contact = d->conn->contactList()->contact(i);
-        if (contact)
-            lc << contact;
-        else
-            qDebug() << "Contact id:" << i << "not found.";
+        if (!contact) {
+            contact = d->conn->contactList()->addContact(i);
+        }
+        Q_ASSERT(0 != contact);
+        lc << contact;
+        // FIXME: Check if this function should always add a new contact
+        // in the contactlist when it's not there.
+        //if (contact)
+        //    lc << contact;
+        //else
+        //    qDebug() << "Contact id:" << i << "not found.";
+
     }
 
     return lc;
@@ -173,6 +185,7 @@
 
 void ContactGroup::onGroupFlagsChanged(uint added, uint removed)
 {
+    //TODO
 }
 
 void ContactGroup::onMembersChanged(const QString &message, const QList<uint> &added,
diff -Naur tapioca-qt-0.14.1/src/contactlist.cpp tapioca-qt/src/contactlist.cpp
--- tapioca-qt-0.14.1/src/contactlist.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/src/contactlist.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -29,6 +29,7 @@
 
 #include <QDebug>
 #include <QtCore/QMutex>
+#include <QtCore/QMutexLocker>
 #include <QtDBus/QDBusConnection>
 #include <QtDBus/QDBusConnectionInterface>
 #include <QtTelepathy/Client/Channel>
@@ -250,6 +251,16 @@
     d->mutex.unlock();
     return contact;
 }
+
+Contact *ContactList::addContact(const uint id)
+{
+    Handle * handle(d->handleFactory->createHandle(Handle::Contact, id));
+
+    if (handle == 0) { return 0; }
+
+    return addContact(handle);
+}
+
 /*
  * Remove Contact
  */
@@ -284,6 +295,8 @@
 Contact *ContactList::contact(const QString &uri) const
 {
     Contact *contact;
+
+    QMutexLocker lock(&(d->mutex));
     foreach (contact, d->contacts) {
         if (contact->uri() == uri)
             return contact;
@@ -294,9 +307,15 @@
 /*
  * Get Contact from id
  */
-Contact *ContactList::contact(uint id) const
+Contact * ContactList::contact(const uint id) const
 {
-    return d->contacts.value(id);
+    Contact *c = NULL;
+
+    QMutexLocker lock(&(d->mutex));
+    if (d->contacts.contains(id))
+        c = d->contacts.value(id);
+
+    return c;
 }
 
 /*
diff -Naur tapioca-qt-0.14.1/src/streamchannel.cpp tapioca-qt/src/streamchannel.cpp
--- tapioca-qt-0.14.1/src/streamchannel.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/src/streamchannel.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -45,19 +45,23 @@
 class StreamChannelPrivate {
 public:
     StreamChannelPrivate(Connection *conn, const QString &serviceName, const QString &objPath)
-        : m_conn(conn)
+        : m_conn(conn),
+          telepathyChannelHandler(NULL)
     {
         telepathyStreamedMedia = new org::freedesktop::Telepathy::ChannelStreamedMedia(serviceName, objPath, QDBusConnection::sessionBus());
         telepathyIChannelGroup = new org::freedesktop::Telepathy::ChannelGroupInterface(serviceName, objPath, QDBusConnection::sessionBus());
-        telepathyChannelHandler = new org::freedesktop::Telepathy::ChannelHandler(STREAM_ENGINE_IFACE, STREAM_ENGINE_PATH, QDBusConnection::sessionBus());
         telepathyStreamEngine = new org::freedesktop::Telepathy::StreamEngine(STREAM_ENGINE_IFACE, STREAM_ENGINE_PATH, QDBusConnection::sessionBus());
     }
     ~StreamChannelPrivate()
     {
         delete telepathyStreamedMedia;
         delete telepathyIChannelGroup;
-        delete telepathyStreamEngine;
-        delete telepathyChannelHandler;
+
+        if (telepathyStreamEngine)
+            delete telepathyStreamEngine;
+
+        if (telepathyChannelHandler)
+            delete telepathyChannelHandler;
     }
 
     QMutex mutex;
@@ -84,15 +88,19 @@
     QObject::connect(d->telepathyStreamedMedia, SIGNAL(StreamRemoved(uint)),
                      this, SLOT(onStreamRemoved(uint)));
 
+    if (hasSupportFor("org.freedesktop.Telepathy.Channel.Interface.MediaSignalling"))
+        d->telepathyChannelHandler = new org::freedesktop::Telepathy::ChannelHandler(STREAM_ENGINE_IFACE, STREAM_ENGINE_PATH, QDBusConnection::sessionBus());
 
-    QDBusReply<void> ret = d->telepathyChannelHandler->HandleChannel(d->m_conn->serviceName(),
-                                                                     QDBusObjectPath(d->m_conn->objectPath()),
-                                                                     "org.freedesktop.Telepathy.Channel.Type.StreamedMedia",
-                                                                     QDBusObjectPath(objectPath()),
-                                                                     0,
-                                                                     0);
-    if (!ret.isValid())
-        qDebug() << "error calling HandleChannel:" << ret.error().message();
+    if (d->telepathyChannelHandler) {
+        QDBusReply<void> ret = d->telepathyChannelHandler->HandleChannel(d->m_conn->serviceName(),
+                                                                         QDBusObjectPath(d->m_conn->objectPath()),
+                                                                         "org.freedesktop.Telepathy.Channel.Type.StreamedMedia",
+                                                                         QDBusObjectPath(objectPath()),
+                                                                         0,
+                                                                         0);
+        if (!ret.isValid())
+            qDebug() << "error calling HandleChannel:" << ret.error().message();
+    }
 
     updateStreamList();
 
diff -Naur tapioca-qt-0.14.1/src/textchannel.cpp tapioca-qt/src/textchannel.cpp
--- tapioca-qt-0.14.1/src/textchannel.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/src/textchannel.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -39,7 +39,8 @@
 public:
     TextChannelPrivate(Connection *_conn, const QString &serviceName, const QString &objPath)
         :conn(_conn),
-         currentChatState(TextChannel::Inactive)
+         currentChatState(TextChannel::Inactive),
+         iChatState(NULL)
     {
         ch = new org::freedesktop::Telepathy::ChannelText(serviceName, objPath, QDBusConnection::sessionBus());
 
@@ -172,7 +173,7 @@
 void TextChannel::onMessageReceived(uint id, uint timestamp, uint sender, uint type, uint flags, const QString &text)
 {
     Message msg(text, timestamp, static_cast<TextChannel::Message::Type>(type), id, true);
-    emit messageReceived(msg);
+    emit messageReceived(this, msg);
 }
 
 void TextChannel::onSendError(uint error, uint timestamp, uint type, const QString &text)
diff -Naur tapioca-qt-0.14.1/tests/test.cpp tapioca-qt/tests/test.cpp
--- tapioca-qt-0.14.1/tests/test.cpp	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/tests/test.cpp	2007-11-20 21:25:07.000000000 +0100
@@ -104,8 +104,8 @@
     MessageFilter messageFilter;
     QObject::connect(conn, SIGNAL(statusChanged(QtTapioca::Connection *, QtTapioca::Connection::Status, QtTapioca::Connection::Reason)),
                      &messageFilter, SLOT(onStatusChanged(QtTapioca::Connection *, QtTapioca::Connection::Status, QtTapioca::Connection::Reason)));
-    QObject::connect(conn, SIGNAL(channelCreated(QtTapioca::Connection *, QtTapioca::Channel *)),
-                     &messageFilter, SLOT(onChannelCreated(QtTapioca::Connection *, QtTapioca::Channel *)));
+    QObject::connect(conn, SIGNAL(channelCreated(QtTapioca::Connection *, QtTapioca::Channel *, bool)),
+                     &messageFilter, SLOT(onChannelCreated(QtTapioca::Connection *, QtTapioca::Channel *, bool)));
     conn->connect(ContactBase::Available);
 
     return app.exec();
@@ -135,9 +135,30 @@
     }
 }
 
-void MessageFilter::onChannelCreated(Connection *connection, Channel *channel)
+void MessageFilter::onChannelCreated(Connection *connection, Channel *channel, bool suppress)
 {
-    if (channel->type() == Channel::Text)
-        dynamic_cast<TextChannel*>(channel)->sendMessage("reply");
+    if (channel->type() == Channel::Text) {
+        TextChannel *tch =  dynamic_cast<TextChannel*>(channel);
+
+        QList<TextChannel::Message> msgList = tch->pendingMessages();
+        foreach (TextChannel::Message m, msgList) {
+            qDebug() << m.contents();
+            tch->acknowledge(m);
+        }
+
+        QObject::connect(tch, SIGNAL(messageReceived(const QtTapioca::TextChannel *,
+                                                     const QtTapioca::TextChannel::Message &)),
+                         this,
+                         SLOT(onMessageReceived(const QtTapioca::TextChannel *, const QtTapioca::TextChannel::Message &)));
+    }
 }
 
+void MessageFilter::onMessageReceived(const TextChannel *tch, const TextChannel::Message &msg)
+{
+    TextChannel *t =  const_cast<TextChannel*>(tch);
+
+    qDebug() << msg.contents();
+
+    t->sendMessage("reply");
+    t->acknowledge(msg);
+}
diff -Naur tapioca-qt-0.14.1/tests/test.h tapioca-qt/tests/test.h
--- tapioca-qt-0.14.1/tests/test.h	2007-05-23 20:20:42.000000000 +0200
+++ tapioca-qt/tests/test.h	2007-11-20 21:25:07.000000000 +0100
@@ -23,6 +23,7 @@
 
 #include <QtCore/QObject>
 #include <QtTapioca/Connection>
+#include <QtTapioca/TextChannel>
 
 using namespace QtTapioca;
 
@@ -36,7 +37,8 @@
 
 public Q_SLOTS:
     void onStatusChanged(QtTapioca::Connection *connection, QtTapioca::Connection::Status status, QtTapioca::Connection::Reason reason);
-    void onChannelCreated(QtTapioca::Connection *connection, QtTapioca::Channel *channel);
+    void onChannelCreated(QtTapioca::Connection *connection, QtTapioca::Channel *channel, bool suppress);
+    void onMessageReceived(const QtTapioca::TextChannel *tch, const QtTapioca::TextChannel::Message &);
 };
 
 #endif
