diff --git a/src/delegates/ImageManipulationDelegate.h b/src/delegates/ImageManipulationDelegate.h
index 2f711ae..4a2e5d8 100644
--- a/src/delegates/ImageManipulationDelegate.h
+++ b/src/delegates/ImageManipulationDelegate.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2015 Savoir-Faire Linux Inc.
+ *  Copyright (C) 2015 Savoir-faire Linux Inc.
  *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -27,31 +27,42 @@
  *  shall include the source code for the parts of OpenSSL used as well
  *  as that of the covered work.
  */
-#ifndef IMAGEMANIPULATION_H
-#define IMAGEMANIPULATION_H
 
 #import <QuartzCore/QuartzCore.h>
 
-#import <delegates/pixmapmanipulationdelegate.h>
+#import <interfaces/pixmapmanipulatori.h>
 #import <call.h>
 
 class Person;
 class QPixmap;
 
-class ImageManipulationDelegate : public PixmapManipulationDelegate {
+namespace Interfaces {
 
-public:
-    ImageManipulationDelegate();
-    QVariant contactPhoto(Person* c, const QSize& size, bool displayPresence = true) override;
-    virtual QByteArray toByteArray(const QVariant& pxm) override;
-    virtual QVariant personPhoto(const QByteArray& data, const QString& type = "PNG") override;
+    class ImageManipulationDelegate : public PixmapManipulatorI {
 
-private:
-    //Helper
-    QPixmap drawDefaultUserPixmap(const QSize& size, bool displayPresence, bool isPresent);
-    CGImageRef resizeCGImage(CGImageRef image, const QSize& size);
+    public:
+        ImageManipulationDelegate();
+        QVariant contactPhoto(Person* c, const QSize& size, bool displayPresence = true) override;
+        virtual QByteArray toByteArray(const QVariant& pxm) override;
+        virtual QVariant personPhoto(const QByteArray& data, const QString& type = "PNG") override;
 
+        QVariant callPhoto(Call* c, const QSize& size, bool displayPresence = true) override;
+        QVariant callPhoto(const ContactMethod* n, const QSize& size, bool displayPresence = true) override;
 
-};
+        /* TODO: the following methods return an empty QVariant/QByteArray */
+        QVariant   numberCategoryIcon(const QVariant& p, const QSize& size, bool displayPresence = false, bool isPresent = false) override;
+        QVariant   securityIssueIcon(const QModelIndex& index) override;
+        QVariant   collectionIcon(const CollectionInterface* interface, PixmapManipulatorI::CollectionIconHint hint = PixmapManipulatorI::CollectionIconHint::NONE) const override;
+        QVariant   securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const override;
+        QVariant   historySortingCategoryIcon(const CategorizedHistoryModel::SortedProxy::Categories cat) const override;
+        QVariant   contactSortingCategoryIcon(const CategorizedContactModel::SortedProxy::Categories cat) const override;
+        QVariant   userActionIcon(const UserActionElement& state) const override;
 
-#endif // IMAGEMANIPULATION_H
+    private:
+        //Helper
+        QPixmap drawDefaultUserPixmap(const QSize& size, bool displayPresence, bool isPresent);
+        CGImageRef resizeCGImage(CGImageRef image, const QSize& size);
+    };
+    
+} // namespace Interfaces
+
diff --git a/src/delegates/ImageManipulationDelegate.mm b/src/delegates/ImageManipulationDelegate.mm
index 40f7a0a..3fdd8bd 100644
--- a/src/delegates/ImageManipulationDelegate.mm
+++ b/src/delegates/ImageManipulationDelegate.mm
@@ -47,114 +47,183 @@
 #import <person.h>
 #import <contactmethod.h>
 
-ImageManipulationDelegate::ImageManipulationDelegate() : PixmapManipulationDelegate()
-{
+namespace Interfaces {
 
-}
+    ImageManipulationDelegate::ImageManipulationDelegate()
+    {
 
-QVariant ImageManipulationDelegate::contactPhoto(Person* c, const QSize& size, bool displayPresence) {
-    const int radius = (size.height() > 35) ? 7 : 5;
+    }
 
-    QPixmap pxm;
-    if (c->photo().isValid()) {
-        QPixmap contactPhoto((qvariant_cast<QPixmap>(c->photo())).scaledToWidth(size.height()-6));
-        pxm = QPixmap(size);
+    QVariant ImageManipulationDelegate::contactPhoto(Person* c, const QSize& size, bool displayPresence) {
+        const int radius = (size.height() > 35) ? 7 : 5;
+
+        QPixmap pxm;
+        if (c->photo().isValid()) {
+            QPixmap contactPhoto((qvariant_cast<QPixmap>(c->photo())).scaledToWidth(size.height()-6));
+            pxm = QPixmap(size);
+            pxm.fill(Qt::transparent);
+            QPainter painter(&pxm);
+
+            //Clear the pixmap
+            painter.setCompositionMode(QPainter::CompositionMode_Clear);
+            painter.fillRect(0,0,size.width(),size.height(),QBrush(Qt::white));
+            painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+
+            //Add corner radius to the Pixmap
+            QRect pxRect = contactPhoto.rect();
+            QBitmap mask(pxRect.size());
+            QPainter customPainter(&mask);
+            customPainter.setRenderHint  (QPainter::Antialiasing, true      );
+            customPainter.fillRect       (pxRect                , Qt::white );
+            customPainter.setBackground  (Qt::black                         );
+            customPainter.setBrush       (Qt::black                         );
+            customPainter.drawRoundedRect(pxRect,radius,radius);
+            contactPhoto.setMask(mask);
+            painter.drawPixmap(3,3,contactPhoto);
+            painter.setBrush(Qt::NoBrush);
+            painter.setPen(Qt::white);
+            painter.setRenderHint  (QPainter::Antialiasing, true   );
+            painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
+            painter.drawRoundedRect(3,3,pxm.height()-6,pxm.height()-6,radius,radius);
+            painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+
+        }
+        else {
+            pxm = drawDefaultUserPixmap(size, false, false);
+        }
+
+        return pxm;
+    }
+
+    QVariant
+    ImageManipulationDelegate::callPhoto(Call* c, const QSize& size, bool displayPresence)
+    {
+        return callPhoto(c->peerContactMethod(), size, displayPresence);
+    }
+
+    QVariant
+    ImageManipulationDelegate::callPhoto(const ContactMethod* n, const QSize& size, bool displayPresence)
+    {
+        if (n->contact()) {
+            return contactPhoto(n->contact(), size, displayPresence);
+        } else {
+            return drawDefaultUserPixmap(size, false, false);
+        }
+    }
+
+    QVariant ImageManipulationDelegate::personPhoto(const QByteArray& data, const QString& type)
+    {
+        QImage image;
+        //For now, ENCODING is only base64 and image type PNG or JPG
+        const bool ret = image.loadFromData(QByteArray::fromBase64(data),type.toLatin1());
+        if (!ret)
+            qDebug() << "vCard image loading failed";
+
+        return QPixmap::fromImage(image);
+    }
+
+    QByteArray ImageManipulationDelegate::toByteArray(const QVariant& pxm)
+    {
+        //Preparation of our QPixmap
+        QByteArray bArray;
+        QBuffer buffer(&bArray);
+        buffer.open(QIODevice::WriteOnly);
+
+        //PNG ?
+        (qvariant_cast<QPixmap>(pxm)).save(&buffer, "PNG");
+        buffer.close();
+
+        return bArray;
+    }
+
+    QPixmap ImageManipulationDelegate::drawDefaultUserPixmap(const QSize& size, bool displayPresence, bool isPresent) {
+
+        QPixmap pxm(size);
         pxm.fill(Qt::transparent);
         QPainter painter(&pxm);
 
-        //Clear the pixmap
-        painter.setCompositionMode(QPainter::CompositionMode_Clear);
-        painter.fillRect(0,0,size.width(),size.height(),QBrush(Qt::white));
-        painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+        // create the image somehow, load from file, draw into it...
+        auto sourceImgRef = CGImageSourceCreateWithData((CFDataRef)[[NSImage imageNamed:@"NSUser"] TIFFRepresentation], NULL);
+        auto imgRef = CGImageSourceCreateImageAtIndex(sourceImgRef, 0, NULL);
+        auto finalImgRef =  resizeCGImage(imgRef, size);
+        painter.drawPixmap(3,3,QtMac::fromCGImageRef(finalImgRef));
 
-        //Add corner radius to the Pixmap
-        QRect pxRect = contactPhoto.rect();
-        QBitmap mask(pxRect.size());
-        QPainter customPainter(&mask);
-        customPainter.setRenderHint  (QPainter::Antialiasing, true      );
-        customPainter.fillRect       (pxRect                , Qt::white );
-        customPainter.setBackground  (Qt::black                         );
-        customPainter.setBrush       (Qt::black                         );
-        customPainter.drawRoundedRect(pxRect,radius,radius);
-        contactPhoto.setMask(mask);
-        painter.drawPixmap(3,3,contactPhoto);
-        painter.setBrush(Qt::NoBrush);
-        painter.setPen(Qt::white);
-        painter.setRenderHint  (QPainter::Antialiasing, true   );
-        painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
-        painter.drawRoundedRect(3,3,pxm.height()-6,pxm.height()-6,radius,radius);
-        painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+        CFRelease(sourceImgRef);
+        CFRelease(imgRef);
+        CFRelease(finalImgRef);
 
+        return pxm;
     }
-    else {
-        pxm = drawDefaultUserPixmap(size, false, false);
+
+    CGImageRef ImageManipulationDelegate::resizeCGImage(CGImageRef image, const QSize& size) {
+        // create context, keeping original image properties
+        CGColorSpaceRef colorspace = CGImageGetColorSpace(image);
+
+        CGContextRef context = CGBitmapContextCreate(NULL, size.width(), size.height(),
+                                                     CGImageGetBitsPerComponent(image),
+                                                     size.width() * CGImageGetBitsPerComponent(image),
+                                                     colorspace,
+                                                     CGImageGetAlphaInfo(image));
+
+        if(context == NULL)
+            return nil;
+
+        // draw image to context (resizing it)
+        CGContextDrawImage(context, CGRectMake(0, 0, size.width(), size.height()), image);
+        // extract resulting image from context
+        CGImageRef imgRef = CGBitmapContextCreateImage(context);
+        CGContextRelease(context);
+
+        return imgRef;
+    }
+
+    QVariant
+    ImageManipulationDelegate::numberCategoryIcon(const QVariant& p, const QSize& size, bool displayPresence, bool isPresent)
+    {
+        Q_UNUSED(p)
+        Q_UNUSED(size)
+        Q_UNUSED(displayPresence)
+        Q_UNUSED(isPresent)
+        return QVariant();
+    }
+
+    QVariant
+    ImageManipulationDelegate::securityIssueIcon(const QModelIndex& index)
+    {
+        Q_UNUSED(index)
+        return QVariant();
+    }
+
+    QVariant
+    ImageManipulationDelegate::collectionIcon(const CollectionInterface* interface, PixmapManipulatorI::CollectionIconHint hint) const
+    {
+        Q_UNUSED(interface)
+        Q_UNUSED(hint)
+        return QVariant();
+    }
+    QVariant
+    ImageManipulationDelegate::securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const
+    {
+        Q_UNUSED(level)
+        return QVariant();
+    }
+    QVariant
+    ImageManipulationDelegate::historySortingCategoryIcon(const CategorizedHistoryModel::SortedProxy::Categories cat) const
+    {
+        Q_UNUSED(cat)
+        return QVariant();
+    }
+    QVariant
+    ImageManipulationDelegate::contactSortingCategoryIcon(const CategorizedContactModel::SortedProxy::Categories cat) const
+    {
+        Q_UNUSED(cat)
+        return QVariant();
+    }
+    QVariant
+    ImageManipulationDelegate::userActionIcon(const UserActionElement& state) const
+    {
+        Q_UNUSED(state)
+        return QVariant();
     }
     
-    return pxm;
-}
-
-QVariant ImageManipulationDelegate::personPhoto(const QByteArray& data, const QString& type)
-{
-    QImage image;
-    //For now, ENCODING is only base64 and image type PNG or JPG
-    const bool ret = image.loadFromData(QByteArray::fromBase64(data),type.toLatin1());
-    if (!ret)
-        qDebug() << "vCard image loading failed";
-
-    return QPixmap::fromImage(image);
-}
-
-QByteArray ImageManipulationDelegate::toByteArray(const QVariant& pxm)
-{
-    //Preparation of our QPixmap
-    QByteArray bArray;
-    QBuffer buffer(&bArray);
-    buffer.open(QIODevice::WriteOnly);
-
-    //PNG ?
-    (qvariant_cast<QPixmap>(pxm)).save(&buffer, "PNG");
-    buffer.close();
-
-    return bArray;
-}
-
-QPixmap ImageManipulationDelegate::drawDefaultUserPixmap(const QSize& size, bool displayPresence, bool isPresent) {
-
-    QPixmap pxm(size);
-    pxm.fill(Qt::transparent);
-    QPainter painter(&pxm);
-
-    // create the image somehow, load from file, draw into it...
-    auto sourceImgRef = CGImageSourceCreateWithData((CFDataRef)[[NSImage imageNamed:@"NSUser"] TIFFRepresentation], NULL);
-    auto imgRef = CGImageSourceCreateImageAtIndex(sourceImgRef, 0, NULL);
-    auto finalImgRef =  resizeCGImage(imgRef, size);
-    painter.drawPixmap(3,3,QtMac::fromCGImageRef(finalImgRef));
-
-    CFRelease(sourceImgRef);
-    CFRelease(imgRef);
-    CFRelease(finalImgRef);
-
-    return pxm;
-}
-
-CGImageRef ImageManipulationDelegate::resizeCGImage(CGImageRef image, const QSize& size) {
-    // create context, keeping original image properties
-    CGColorSpaceRef colorspace = CGImageGetColorSpace(image);
-
-    CGContextRef context = CGBitmapContextCreate(NULL, size.width(), size.height(),
-                                                 CGImageGetBitsPerComponent(image),
-                                                 size.width() * CGImageGetBitsPerComponent(image),
-                                                 colorspace,
-                                                 CGImageGetAlphaInfo(image));
-
-    if(context == NULL)
-        return nil;
-
-    // draw image to context (resizing it)
-    CGContextDrawImage(context, CGRectMake(0, 0, size.width(), size.height()), image);
-    // extract resulting image from context
-    CGImageRef imgRef = CGBitmapContextCreateImage(context);
-    CGContextRelease(context);
-
-    return imgRef;
-}
+} // namespace Interfaces
