diff --git a/gajim/chat_control.py b/gajim/chat_control.py
index 3dcae5d71951cf1873bebf731f42b5ec823124ef..8841a89be54d33816d600971ef16930b6608fd9d 100644
--- a/gajim/chat_control.py
+++ b/gajim/chat_control.py
@@ -60,6 +60,8 @@ from gajim.gtk.util import get_icon_name
 from gajim.gtk.util import get_cursor
 from gajim.gtk.util import ensure_proper_control
 from gajim.gtk.util import format_mood
+from gajim.gtk.util import format_activity
+from gajim.gtk.util import get_activity_icon_name
 
 from gajim.command_system.implementation.hosts import ChatCommands
 from gajim.command_system.framework import CommandHost  # pylint: disable=unused-import
@@ -131,7 +133,6 @@ class ChatControl(ChatControlBase):
         self.update_toolbar()
 
         self._pep_images = {}
-        self._pep_images['activity'] = self.xml.get_object('activity_image')
         self._pep_images['tune'] = self.xml.get_object('tune_image')
         self._pep_images['geoloc'] = self.xml.get_object('location_image')
         self.update_all_pep_types()
@@ -233,6 +234,8 @@ class ChatControl(ChatControlBase):
             self._on_nickname_received)
         app.ged.register_event_handler('mood-received', ged.GUI1,
             self._on_mood_received)
+        app.ged.register_event_handler('activity-received', ged.GUI1,
+            self._on_activity_received)
         if self.TYPE_ID == message_control.TYPE_CHAT:
             # Dont connect this when PrivateChatControl is used
             app.ged.register_event_handler('update-roster-avatar', ged.GUI1,
@@ -416,6 +419,7 @@ class ChatControl(ChatControlBase):
         for pep_type in self._pep_images:
             self.update_pep(pep_type)
         self._update_pep(PEPEventType.MOOD)
+        self._update_pep(PEPEventType.ACTIVITY)
 
     def update_pep(self, pep_type):
         if isinstance(self.contact, GC_Contact):
@@ -453,6 +457,9 @@ class ChatControl(ChatControlBase):
         if type_ == PEPEventType.MOOD:
             icon = 'mood-%s' % data.mood
             formated_text = format_mood(*data)
+        elif type_ == PEPEventType.ACTIVITY:
+            icon = get_activity_icon_name(data.activity, data.subactivity)
+            formated_text = format_activity(*data)
 
         image.set_from_icon_name(icon, Gtk.IconSize.MENU)
         image.set_tooltip_markup(formated_text)
@@ -461,11 +468,17 @@ class ChatControl(ChatControlBase):
     def _get_pep_widget(self, type_):
         if type_ == PEPEventType.MOOD:
             return self.xml.get_object('mood_image')
+        if type_ == PEPEventType.ACTIVITY:
+            return self.xml.get_object('activity_image')
 
     @ensure_proper_control
     def _on_mood_received(self, _event):
         self._update_pep(PEPEventType.MOOD)
 
+    @ensure_proper_control
+    def _on_activity_received(self, _event):
+        self._update_pep(PEPEventType.ACTIVITY)
+
     @ensure_proper_control
     def _on_nickname_received(self, _event):
         self.update_ui()
@@ -1086,6 +1099,8 @@ class ChatControl(ChatControlBase):
             self._on_nickname_received)
         app.ged.remove_event_handler('mood-received', ged.GUI1,
             self._on_mood_received)
+        app.ged.remove_event_handler('activity-received', ged.GUI1,
+            self._on_activity_received)
         if self.TYPE_ID == message_control.TYPE_CHAT:
             app.ged.remove_event_handler('update-roster-avatar', ged.GUI1,
                 self._nec_update_avatar)
diff --git a/gajim/common/config.py b/gajim/common/config.py
index 63576da968dbb7b577b3a7b1b37829473957a281..d4c0a0612343745d21c61cff73ac4d5b0973a300 100644
--- a/gajim/common/config.py
+++ b/gajim/common/config.py
@@ -93,8 +93,6 @@ class Config:
         'trayicon': [opt_str, 'always', _("When to show notification area icon. Can be 'never', 'on_event', 'always'."), False],
         'allow_hide_roster': [opt_bool, False, _("Allow to hide the roster window even if the tray icon is not shown."), False],
         'iconset': [opt_str, DEFAULT_ICONSET, '', True],
-        'mood_iconset': [opt_str, DEFAULT_MOOD_ICONSET, '', True],
-        'activity_iconset': [opt_str, DEFAULT_ACTIVITY_ICONSET, '', True],
         'use_transports_iconsets': [opt_bool, True, '', True],
         'notif_signin_color': [opt_color, '#32CD32', _('Contact signed in notification color.')], # limegreen
         'notif_signout_color': [opt_color, '#FF0000', _('Contact signout notification color')], # red
diff --git a/gajim/common/configpaths.py b/gajim/common/configpaths.py
index 908a13c385c184bc00e2ee0f1c01f7aa0a5847ad..13b267108743989b73bc8ba9d3fd8debbafb1556 100644
--- a/gajim/common/configpaths.py
+++ b/gajim/common/configpaths.py
@@ -221,8 +221,6 @@ class ConfigPaths:
              'emoticons', PathLocation.DATA, PathType.FOLDER_OPTIONAL),
             ('MY_ICONSETS',
              'iconsets', PathLocation.DATA, PathType.FOLDER_OPTIONAL),
-            ('MY_ACTIVITY_ICONSETS',
-             'activities', PathLocation.DATA, PathType.FOLDER_OPTIONAL),
 
             # Cache paths
             ('CACHE_DB', 'cache.db', PathLocation.CACHE, PathType.FILE),
diff --git a/gajim/common/helpers.py b/gajim/common/helpers.py
index 2ef42e57e3ecc7fc786b126d5379d56817de9693..4144488f7747b5a7cce8da26f23dd291b78fa16b 100644
--- a/gajim/common/helpers.py
+++ b/gajim/common/helpers.py
@@ -1098,13 +1098,6 @@ def get_current_show(account):
     status = app.connections[account].connected
     return app.SHOW_LIST[status]
 
-def get_activity_iconset_path(iconset):
-    if os.path.isdir(os.path.join(configpaths.get('DATA'), 'activities', iconset)):
-        return os.path.join(configpaths.get('DATA'), 'activities', iconset)
-    if os.path.isdir(os.path.join(configpaths.get('MY_ACTIVITY_ICONSETS'),
-    iconset)):
-        return os.path.join(configpaths.get('MY_ACTIVITY_ICONSETS'), iconset)
-
 def prepare_and_validate_gpg_keyID(account, jid, keyID):
     """
     Return an eight char long keyID that can be used with for GPG encryption
diff --git a/gajim/common/modules/__init__.py b/gajim/common/modules/__init__.py
index 280c0e65f87083ce2a8b42c4697b135dbfbbe107..5fd8381c12391a5e779ac3bcbf6889326a199bca 100644
--- a/gajim/common/modules/__init__.py
+++ b/gajim/common/modules/__init__.py
@@ -35,7 +35,9 @@ ZEROCONF_MODULES = ['iq',
 _imported_modules = []  # type: List[tuple]
 _modules = {}  # type: Dict[str, Dict[str, Any]]
 _store_publish_modules = [
-    'UserMood']  # type: List[str]
+    'UserMood',
+    'UserActivity',
+]  # type: List[str]
 
 for file in Path(__file__).parent.iterdir():
     if file.stem == '__init__':
diff --git a/gajim/common/modules/message.py b/gajim/common/modules/message.py
index 0cbe990aa93ee7538fb24ff5df0fefbdd0e992ba..0a30211e2ffaeddde57c184b2e47b78be207385f 100644
--- a/gajim/common/modules/message.py
+++ b/gajim/common/modules/message.py
@@ -59,7 +59,7 @@ class Message:
                                         nbxmpp.NS_IBB])
 
     def _message_received(self, _con, stanza, properties):
-        if properties.is_mam_message or properties.is_pubsub_event:
+        if properties.is_mam_message or properties.is_pubsub:
             return
         # Check if a child of the message contains any
         # namespaces that we handle in other modules.
diff --git a/gajim/common/modules/user_activity.py b/gajim/common/modules/user_activity.py
index 574027f226bed36e8520bf2cfcf4c6e6f3d35600..e23179ac040b4e71d324fb6ac591ae8d76759e96 100644
--- a/gajim/common/modules/user_activity.py
+++ b/gajim/common/modules/user_activity.py
@@ -14,92 +14,62 @@
 
 # XEP-0108: User Activity
 
+from typing import Any
+from typing import Tuple
+
 import logging
 
 import nbxmpp
-from gi.repository import GLib
 
-from gajim.common.const import PEPEventType, ACTIVITIES
-from gajim.common.exceptions import StanzaMalformed
-from gajim.common.modules.pep import AbstractPEPModule, AbstractPEPData
+from gajim.common import app
+from gajim.common.nec import NetworkEvent
+from gajim.common.modules.base import BaseModule
+from gajim.common.modules.util import event_node
+from gajim.common.modules.util import store_publish
+from gajim.common.const import PEPEventType
 
 log = logging.getLogger('gajim.c.m.user_activity')
 
 
-class UserActivityData(AbstractPEPData):
-
-    type_ = PEPEventType.ACTIVITY
-
-    def as_markup_text(self):
-        pep = self.data
-        activity = pep['activity']
-        subactivity = pep['subactivity'] if 'subactivity' in pep else None
-        text = pep['text'] if 'text' in pep else None
+class UserActivity(BaseModule):
 
-        if activity in ACTIVITIES:
-            # Translate standard activities
-            if subactivity in ACTIVITIES[activity]:
-                subactivity = ACTIVITIES[activity][subactivity]
-            activity = ACTIVITIES[activity]['category']
+    _nbxmpp_extends = 'Activity'
+    _nbxmpp_methods = [
+        'set_activity',
+    ]
 
-        markuptext = '<b>' + GLib.markup_escape_text(activity)
-        if subactivity:
-            markuptext += ': ' + GLib.markup_escape_text(subactivity)
-        markuptext += '</b>'
-        if text:
-            markuptext += ' (%s)' % GLib.markup_escape_text(text)
-        return markuptext
+    def __init__(self, con):
+        BaseModule.__init__(self, con)
+        self._register_pubsub_handler(self._activity_received)
 
+    @event_node(nbxmpp.NS_ACTIVITY)
+    def _activity_received(self, _con, _stanza, properties):
+        data = properties.pubsub_event.data
+        for contact in app.contacts.get_contacts(self._account,
+                                                 str(properties.jid)):
+            if data.activity is not None:
+                contact.pep[PEPEventType.ACTIVITY] = data
+            else:
+                contact.pep.pop(PEPEventType.ACTIVITY, None)
 
-class UserActivity(AbstractPEPModule):
+        if properties.is_self_message:
+            if data.activity is not None:
+                self._con.pep[PEPEventType.ACTIVITY] = data
+            else:
+                self._con.pep.pop(PEPEventType.ACTIVITY, None)
 
-    name = 'activity'
-    namespace = nbxmpp.NS_ACTIVITY
-    pep_class = UserActivityData
-    store_publish = True
-    _log = log
+        app.nec.push_incoming_event(
+            NetworkEvent('activity-received',
+                         account=self._account,
+                         jid=properties.jid.getBare(),
+                         activity=data,
+                         is_self_message=properties.is_self_message))
 
-    def _extract_info(self, item):
-        activity_dict = {}
-        activity_tag = item.getTag('activity', namespace=self.namespace)
-        if activity_tag is None:
-            raise StanzaMalformed('No activity node')
+    @store_publish
+    def set_activity(self, activity):
+        log.info('Send %s', activity)
+        self._nbxmpp('Activity').set_activity(activity)
 
-        if not activity_tag.getChildren():
-            return None
 
-        for child in activity_tag.getChildren():
-            name = child.getName().strip()
-            data = child.getData().strip()
-            if name == 'text':
-                activity_dict['text'] = data
-            else:
-                activity_dict['activity'] = name
-                for subactivity in child.getChildren():
-                    subactivity_name = subactivity.getName().strip()
-                    activity_dict['subactivity'] = subactivity_name
-
-        if 'activity' not in activity_dict:
-            raise StanzaMalformed('No activity value found')
-        return activity_dict
-
-    def _build_node(self, data):
-        item = nbxmpp.Node('activity', {'xmlns': self.namespace})
-        if data is None:
-            return item
-
-        activity, subactivity, message = data
-        if not activity:
-            return item
-
-        i = item.addChild(activity)
-        if subactivity:
-            i.addChild(subactivity)
-        if message:
-            i = item.addChild('text')
-            i.addData(message)
-        return item
-
-
-def get_instance(*args, **kwargs):
+def get_instance(*args: Any, **kwargs: Any) -> Tuple[UserActivity, str]:
     return UserActivity(*args, **kwargs), 'UserActivity'
diff --git a/gajim/data/activities/default/unknown/category.png b/gajim/data/activities/default/unknown/category.png
deleted file mode 100644
index 63d9034cb4f041e8c4f820ae64bef3974485f164..0000000000000000000000000000000000000000
Binary files a/gajim/data/activities/default/unknown/category.png and /dev/null differ
diff --git a/gajim/data/activities/default/doing_chores/buying_groceries.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-buying-groceries.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/buying_groceries.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-buying-groceries.png
diff --git a/gajim/data/activities/default/doing_chores/cleaning.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-cleaning.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/cleaning.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-cleaning.png
diff --git a/gajim/data/activities/default/doing_chores/cooking.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-cooking.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/cooking.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-cooking.png
diff --git a/gajim/data/activities/default/doing_chores/doing_maintenance.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-doing-maintenance.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/doing_maintenance.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-doing-maintenance.png
diff --git a/gajim/data/activities/default/doing_chores/doing_the_dishes.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-doing-the-dishes.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/doing_the_dishes.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-doing-the-dishes.png
diff --git a/gajim/data/activities/default/doing_chores/doing_the_laundry.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-doing-the-laundry.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/doing_the_laundry.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-doing-the-laundry.png
diff --git a/gajim/data/activities/default/doing_chores/gardening.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-gardening.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/gardening.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-gardening.png
diff --git a/gajim/data/activities/default/doing_chores/running_an_errand.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-running-an-errand.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/running_an_errand.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-running-an-errand.png
diff --git a/gajim/data/activities/default/doing_chores/walking_the_dog.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores-walking-the-dog.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/walking_the_dog.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores-walking-the-dog.png
diff --git a/gajim/data/activities/default/doing_chores/category.png b/gajim/data/icons/hicolor/16x16/status/activity-doing-chores.png
similarity index 100%
rename from gajim/data/activities/default/doing_chores/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-doing-chores.png
diff --git a/gajim/data/activities/default/drinking/having_a_beer.png b/gajim/data/icons/hicolor/16x16/status/activity-drinking-having-a-beer.png
similarity index 100%
rename from gajim/data/activities/default/drinking/having_a_beer.png
rename to gajim/data/icons/hicolor/16x16/status/activity-drinking-having-a-beer.png
diff --git a/gajim/data/activities/default/drinking/having_coffee.png b/gajim/data/icons/hicolor/16x16/status/activity-drinking-having-coffee.png
similarity index 100%
rename from gajim/data/activities/default/drinking/having_coffee.png
rename to gajim/data/icons/hicolor/16x16/status/activity-drinking-having-coffee.png
diff --git a/gajim/data/activities/default/drinking/having_tea.png b/gajim/data/icons/hicolor/16x16/status/activity-drinking-having-tea.png
similarity index 100%
rename from gajim/data/activities/default/drinking/having_tea.png
rename to gajim/data/icons/hicolor/16x16/status/activity-drinking-having-tea.png
diff --git a/gajim/data/activities/default/drinking/category.png b/gajim/data/icons/hicolor/16x16/status/activity-drinking.png
similarity index 100%
rename from gajim/data/activities/default/drinking/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-drinking.png
diff --git a/gajim/data/activities/default/eating/having_a_snack.png b/gajim/data/icons/hicolor/16x16/status/activity-eating-having-a-snack.png
similarity index 100%
rename from gajim/data/activities/default/eating/having_a_snack.png
rename to gajim/data/icons/hicolor/16x16/status/activity-eating-having-a-snack.png
diff --git a/gajim/data/activities/default/eating/having_breakfast.png b/gajim/data/icons/hicolor/16x16/status/activity-eating-having-breakfast.png
similarity index 100%
rename from gajim/data/activities/default/eating/having_breakfast.png
rename to gajim/data/icons/hicolor/16x16/status/activity-eating-having-breakfast.png
diff --git a/gajim/data/activities/default/eating/having_dinner.png b/gajim/data/icons/hicolor/16x16/status/activity-eating-having-dinner.png
similarity index 100%
rename from gajim/data/activities/default/eating/having_dinner.png
rename to gajim/data/icons/hicolor/16x16/status/activity-eating-having-dinner.png
diff --git a/gajim/data/activities/default/eating/having_lunch.png b/gajim/data/icons/hicolor/16x16/status/activity-eating-having-lunch.png
similarity index 100%
rename from gajim/data/activities/default/eating/having_lunch.png
rename to gajim/data/icons/hicolor/16x16/status/activity-eating-having-lunch.png
diff --git a/gajim/data/activities/default/eating/category.png b/gajim/data/icons/hicolor/16x16/status/activity-eating.png
similarity index 100%
rename from gajim/data/activities/default/eating/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-eating.png
diff --git a/gajim/data/activities/default/exercising/cycling.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-cycling.png
similarity index 100%
rename from gajim/data/activities/default/exercising/cycling.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-cycling.png
diff --git a/gajim/data/activities/default/exercising/dancing.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-dancing.png
similarity index 100%
rename from gajim/data/activities/default/exercising/dancing.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-dancing.png
diff --git a/gajim/data/activities/default/exercising/hiking.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-hiking.png
similarity index 100%
rename from gajim/data/activities/default/exercising/hiking.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-hiking.png
diff --git a/gajim/data/activities/default/exercising/jogging.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-jogging.png
similarity index 100%
rename from gajim/data/activities/default/exercising/jogging.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-jogging.png
diff --git a/gajim/data/activities/default/exercising/playing_sports.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-playing-sports.png
similarity index 100%
rename from gajim/data/activities/default/exercising/playing_sports.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-playing-sports.png
diff --git a/gajim/data/activities/default/exercising/running.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-running.png
similarity index 100%
rename from gajim/data/activities/default/exercising/running.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-running.png
diff --git a/gajim/data/activities/default/exercising/skiing.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-skiing.png
similarity index 100%
rename from gajim/data/activities/default/exercising/skiing.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-skiing.png
diff --git a/gajim/data/activities/default/exercising/swimming.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-swimming.png
similarity index 100%
rename from gajim/data/activities/default/exercising/swimming.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-swimming.png
diff --git a/gajim/data/activities/default/exercising/working_out.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising-working-out.png
similarity index 100%
rename from gajim/data/activities/default/exercising/working_out.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising-working-out.png
diff --git a/gajim/data/activities/default/exercising/category.png b/gajim/data/icons/hicolor/16x16/status/activity-exercising.png
similarity index 100%
rename from gajim/data/activities/default/exercising/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-exercising.png
diff --git a/gajim/data/activities/default/grooming/at_the_spa.png b/gajim/data/icons/hicolor/16x16/status/activity-grooming-at-the-spa.png
similarity index 100%
rename from gajim/data/activities/default/grooming/at_the_spa.png
rename to gajim/data/icons/hicolor/16x16/status/activity-grooming-at-the-spa.png
diff --git a/gajim/data/activities/default/grooming/brushing_teeth.png b/gajim/data/icons/hicolor/16x16/status/activity-grooming-brushing-teeth.png
similarity index 100%
rename from gajim/data/activities/default/grooming/brushing_teeth.png
rename to gajim/data/icons/hicolor/16x16/status/activity-grooming-brushing-teeth.png
diff --git a/gajim/data/activities/default/grooming/getting_a_haircut.png b/gajim/data/icons/hicolor/16x16/status/activity-grooming-getting-a-haircut.png
similarity index 100%
rename from gajim/data/activities/default/grooming/getting_a_haircut.png
rename to gajim/data/icons/hicolor/16x16/status/activity-grooming-getting-a-haircut.png
diff --git a/gajim/data/activities/default/grooming/shaving.png b/gajim/data/icons/hicolor/16x16/status/activity-grooming-shaving.png
similarity index 100%
rename from gajim/data/activities/default/grooming/shaving.png
rename to gajim/data/icons/hicolor/16x16/status/activity-grooming-shaving.png
diff --git a/gajim/data/activities/default/grooming/taking_a_bath.png b/gajim/data/icons/hicolor/16x16/status/activity-grooming-taking-a-bath.png
similarity index 100%
rename from gajim/data/activities/default/grooming/taking_a_bath.png
rename to gajim/data/icons/hicolor/16x16/status/activity-grooming-taking-a-bath.png
diff --git a/gajim/data/activities/default/grooming/taking_a_shower.png b/gajim/data/icons/hicolor/16x16/status/activity-grooming-taking-a-shower.png
similarity index 100%
rename from gajim/data/activities/default/grooming/taking_a_shower.png
rename to gajim/data/icons/hicolor/16x16/status/activity-grooming-taking-a-shower.png
diff --git a/gajim/data/activities/default/grooming/category.png b/gajim/data/icons/hicolor/16x16/status/activity-grooming.png
similarity index 100%
rename from gajim/data/activities/default/grooming/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-grooming.png
diff --git a/gajim/data/activities/default/having_appointment/category.png b/gajim/data/icons/hicolor/16x16/status/activity-having-appointment.png
similarity index 100%
rename from gajim/data/activities/default/having_appointment/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-having-appointment.png
diff --git a/gajim/data/activities/default/inactive/day_off.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-day-off.png
similarity index 100%
rename from gajim/data/activities/default/inactive/day_off.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-day-off.png
diff --git a/gajim/data/activities/default/inactive/hanging_out.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-hanging-out.png
similarity index 100%
rename from gajim/data/activities/default/inactive/hanging_out.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-hanging-out.png
diff --git a/gajim/data/activities/default/inactive/hiding.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-hiding.png
similarity index 100%
rename from gajim/data/activities/default/inactive/hiding.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-hiding.png
diff --git a/gajim/data/activities/default/inactive/on_vacation.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-on-vacation.png
similarity index 100%
rename from gajim/data/activities/default/inactive/on_vacation.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-on-vacation.png
diff --git a/gajim/data/activities/default/inactive/praying.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-praying.png
similarity index 100%
rename from gajim/data/activities/default/inactive/praying.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-praying.png
diff --git a/gajim/data/activities/default/inactive/scheduled_holiday.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-scheduled-holiday.png
similarity index 100%
rename from gajim/data/activities/default/inactive/scheduled_holiday.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-scheduled-holiday.png
diff --git a/gajim/data/activities/default/inactive/sleeping.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-sleeping.png
similarity index 100%
rename from gajim/data/activities/default/inactive/sleeping.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-sleeping.png
diff --git a/gajim/data/activities/default/inactive/thinking.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive-thinking.png
similarity index 100%
rename from gajim/data/activities/default/inactive/thinking.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive-thinking.png
diff --git a/gajim/data/activities/default/inactive/category.png b/gajim/data/icons/hicolor/16x16/status/activity-inactive.png
similarity index 100%
rename from gajim/data/activities/default/inactive/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-inactive.png
diff --git a/gajim/data/activities/default/relaxing/fishing.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-fishing.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/fishing.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-fishing.png
diff --git a/gajim/data/activities/default/relaxing/gaming.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-gaming.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/gaming.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-gaming.png
diff --git a/gajim/data/activities/default/relaxing/going_out.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-going-out.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/going_out.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-going-out.png
diff --git a/gajim/data/activities/default/relaxing/partying.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-partying.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/partying.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-partying.png
diff --git a/gajim/data/activities/default/relaxing/reading.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-reading.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/reading.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-reading.png
diff --git a/gajim/data/activities/default/relaxing/rehearsing.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-rehearsing.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/rehearsing.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-rehearsing.png
diff --git a/gajim/data/activities/default/relaxing/shopping.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-shopping.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/shopping.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-shopping.png
diff --git a/gajim/data/activities/default/relaxing/smoking.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-smoking.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/smoking.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-smoking.png
diff --git a/gajim/data/activities/default/relaxing/socializing.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-socializing.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/socializing.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-socializing.png
diff --git a/gajim/data/activities/default/relaxing/sunbathing.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-sunbathing.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/sunbathing.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-sunbathing.png
diff --git a/gajim/data/activities/default/relaxing/watching_a_movie.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-watching-a-movie.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/watching_a_movie.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-watching-a-movie.png
diff --git a/gajim/data/activities/default/relaxing/watching_tv.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing-watching-tv.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/watching_tv.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing-watching-tv.png
diff --git a/gajim/data/activities/default/relaxing/category.png b/gajim/data/icons/hicolor/16x16/status/activity-relaxing.png
similarity index 100%
rename from gajim/data/activities/default/relaxing/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-relaxing.png
diff --git a/gajim/data/activities/default/talking/in_real_life.png b/gajim/data/icons/hicolor/16x16/status/activity-talking-in-real-life.png
similarity index 100%
rename from gajim/data/activities/default/talking/in_real_life.png
rename to gajim/data/icons/hicolor/16x16/status/activity-talking-in-real-life.png
diff --git a/gajim/data/activities/default/talking/on_the_phone.png b/gajim/data/icons/hicolor/16x16/status/activity-talking-on-the-phone.png
similarity index 100%
rename from gajim/data/activities/default/talking/on_the_phone.png
rename to gajim/data/icons/hicolor/16x16/status/activity-talking-on-the-phone.png
diff --git a/gajim/data/activities/default/talking/on_video_phone.png b/gajim/data/icons/hicolor/16x16/status/activity-talking-on-video-phone.png
similarity index 100%
rename from gajim/data/activities/default/talking/on_video_phone.png
rename to gajim/data/icons/hicolor/16x16/status/activity-talking-on-video-phone.png
diff --git a/gajim/data/activities/default/talking/category.png b/gajim/data/icons/hicolor/16x16/status/activity-talking.png
similarity index 100%
rename from gajim/data/activities/default/talking/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-talking.png
diff --git a/gajim/data/activities/default/traveling/commuting.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-commuting.png
similarity index 100%
rename from gajim/data/activities/default/traveling/commuting.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-commuting.png
diff --git a/gajim/data/activities/default/traveling/cycling.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-cycling.png
similarity index 100%
rename from gajim/data/activities/default/traveling/cycling.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-cycling.png
diff --git a/gajim/data/activities/default/traveling/driving.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-driving.png
similarity index 100%
rename from gajim/data/activities/default/traveling/driving.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-driving.png
diff --git a/gajim/data/activities/default/traveling/in_a_car.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-in-a-car.png
similarity index 100%
rename from gajim/data/activities/default/traveling/in_a_car.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-in-a-car.png
diff --git a/gajim/data/activities/default/traveling/on_a_bus.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-bus.png
similarity index 100%
rename from gajim/data/activities/default/traveling/on_a_bus.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-bus.png
diff --git a/gajim/data/activities/default/traveling/on_a_plane.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-plane.png
similarity index 100%
rename from gajim/data/activities/default/traveling/on_a_plane.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-plane.png
diff --git a/gajim/data/activities/default/traveling/on_a_train.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-train.png
similarity index 100%
rename from gajim/data/activities/default/traveling/on_a_train.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-train.png
diff --git a/gajim/data/activities/default/traveling/on_a_trip.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-trip.png
similarity index 100%
rename from gajim/data/activities/default/traveling/on_a_trip.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-on-a-trip.png
diff --git a/gajim/data/activities/default/traveling/walking.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling-walking.png
similarity index 100%
rename from gajim/data/activities/default/traveling/walking.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling-walking.png
diff --git a/gajim/data/activities/default/traveling/category.png b/gajim/data/icons/hicolor/16x16/status/activity-traveling.png
similarity index 100%
rename from gajim/data/activities/default/traveling/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-traveling.png
diff --git a/gajim/data/activities/default/working/coding.png b/gajim/data/icons/hicolor/16x16/status/activity-working-coding.png
similarity index 100%
rename from gajim/data/activities/default/working/coding.png
rename to gajim/data/icons/hicolor/16x16/status/activity-working-coding.png
diff --git a/gajim/data/activities/default/working/in_a_meeting.png b/gajim/data/icons/hicolor/16x16/status/activity-working-in-a-meeting.png
similarity index 100%
rename from gajim/data/activities/default/working/in_a_meeting.png
rename to gajim/data/icons/hicolor/16x16/status/activity-working-in-a-meeting.png
diff --git a/gajim/data/activities/default/working/studying.png b/gajim/data/icons/hicolor/16x16/status/activity-working-studying.png
similarity index 100%
rename from gajim/data/activities/default/working/studying.png
rename to gajim/data/icons/hicolor/16x16/status/activity-working-studying.png
diff --git a/gajim/data/activities/default/working/writing.png b/gajim/data/icons/hicolor/16x16/status/activity-working-writing.png
similarity index 100%
rename from gajim/data/activities/default/working/writing.png
rename to gajim/data/icons/hicolor/16x16/status/activity-working-writing.png
diff --git a/gajim/data/activities/default/working/category.png b/gajim/data/icons/hicolor/16x16/status/activity-working.png
similarity index 100%
rename from gajim/data/activities/default/working/category.png
rename to gajim/data/icons/hicolor/16x16/status/activity-working.png
diff --git a/gajim/dialogs.py b/gajim/dialogs.py
index 56389ef01e9bc78c0a27e998a7f60d8d122d50d3..4f9da8f4b3cc45491aafab7a24fa942d405c3ff5 100644
--- a/gajim/dialogs.py
+++ b/gajim/dialogs.py
@@ -37,7 +37,6 @@ from gi.repository import Gtk
 from gi.repository import Gdk
 from gi.repository import GLib
 
-from gajim import gtkgui_helpers
 from gajim import vcard
 from gajim import dataforms_widget
 
@@ -58,6 +57,7 @@ from gajim.gtk.add_contact import AddNewContactWindow
 from gajim.gtk.util import get_icon_name
 from gajim.gtk.util import resize_window
 from gajim.gtk.util import get_builder
+from gajim.gtk.util import get_activity_icon_name
 
 
 log = logging.getLogger('gajim.dialogs')
@@ -369,9 +369,9 @@ class ChangeActivityDialog:
         group = None
 
         for category in ACTIVITIES:
+            icon_name = get_activity_icon_name(category)
             item = self.xml.get_object(category + '_image')
-            item.set_from_pixbuf(
-                gtkgui_helpers.load_activity_icon(category).get_pixbuf())
+            item.set_from_icon_name(icon_name, Gtk.IconSize.MENU)
             item.set_tooltip_text(ACTIVITIES[category]['category'])
 
             vbox = self.xml.get_object(category + '_vbox')
@@ -386,7 +386,7 @@ class ChangeActivityDialog:
             else:
                 rbtns[act] = group = Gtk.RadioButton()
 
-            icon = gtkgui_helpers.load_activity_icon(category, self.activity)
+            icon = Gtk.Image.new_from_icon_name(icon_name, Gtk.IconSize.MENU)
             hbox = Gtk.HBox(homogeneous=False, spacing=5)
             hbox.pack_start(icon, False, False, 0)
             lbl = Gtk.Label(
@@ -412,7 +412,8 @@ class ChangeActivityDialog:
                 else:
                     rbtns[act] = group = Gtk.RadioButton()
 
-                icon = gtkgui_helpers.load_activity_icon(category, activity)
+                icon_name = get_activity_icon_name(category, activity)
+                icon = Gtk.Image.new_from_icon_name(icon_name, Gtk.IconSize.MENU)
                 label = Gtk.Label(label=ACTIVITIES[category][activity])
                 hbox = Gtk.HBox(homogeneous=False, spacing=5)
                 hbox.pack_start(icon, False, False, 0)
@@ -681,12 +682,12 @@ class ChangeStatusMessageDialog(TimeoutDialog):
            ACTIVITIES:
             if 'subactivity' in self.pep_dict and self.pep_dict['subactivity'] \
             in ACTIVITIES[self.pep_dict['activity']]:
-                img.set_from_pixbuf(gtkgui_helpers.load_activity_icon(
-                    self.pep_dict['activity'], self.pep_dict['subactivity']).\
-                        get_pixbuf())
+                icon_name = get_activity_icon_name(self.pep_dict['activity'],
+                                                   self.pep_dict['subactivity'])
+                img.set_from_icon_name(icon_name, Gtk.IconSize.MENU)
             else:
-                img.set_from_pixbuf(gtkgui_helpers.load_activity_icon(
-                    self.pep_dict['activity']).get_pixbuf())
+                icon_name = get_activity_icon_name(self.pep_dict['activity'])
+                img.set_from_icon_name(icon_name, Gtk.IconSize.MENU)
             if self.pep_dict['activity_text']:
                 label.set_text(self.pep_dict['activity_text'])
             else:
diff --git a/gajim/gtk/tooltips.py b/gajim/gtk/tooltips.py
index ad79d5f6141c44851e35d38ae634b64a4ee7041c..74b1d3ac20d3f8cdb8ff23f4124978a32f12b0e1 100644
--- a/gajim/gtk/tooltips.py
+++ b/gajim/gtk/tooltips.py
@@ -43,6 +43,8 @@ from gajim.common.i18n import _
 from gajim.gtk.util import get_builder
 from gajim.gtk.util import get_icon_name
 from gajim.gtk.util import format_mood
+from gajim.gtk.util import format_activity
+
 
 log = logging.getLogger('gajim.gtk.tooltips')
 
@@ -479,8 +481,8 @@ class RosterTooltip(StatusTable):
             self._ui.mood.show()
             self._ui.mood_label.show()
 
-        if 'activity' in contact.pep:
-            activity = contact.pep['activity'].as_markup_text()
+        if PEPEventType.ACTIVITY in contact.pep:
+            activity = format_activity(*contact.pep[PEPEventType.ACTIVITY])
             self._ui.activity.set_markup(activity)
             self._ui.activity.show()
             self._ui.activity_label.show()
diff --git a/gajim/gtk/util.py b/gajim/gtk/util.py
index f74f0ee1d7cf633c9b2a7d8625e9778db2a652b8..1cd18b868963364cb5961fdf9740f7f9786d9237 100644
--- a/gajim/gtk/util.py
+++ b/gajim/gtk/util.py
@@ -37,6 +37,7 @@ from gajim.common import configpaths
 from gajim.common import i18n
 from gajim.common.i18n import _
 from gajim.common.const import MOODS
+from gajim.common.const import ACTIVITIES
 
 from gajim.gtk.const import GajimIconSet
 
@@ -521,3 +522,27 @@ def format_mood(mood, text):
     if text is not None:
         markuptext += ' (%s)' % GLib.markup_escape_text(text)
     return markuptext
+
+
+def format_activity(activity, subactivity, text):
+    if activity is None:
+        return
+
+    if subactivity in ACTIVITIES[activity]:
+        subactivity = ACTIVITIES[activity][subactivity]
+    activity = ACTIVITIES[activity]['category']
+
+    markuptext = '<b>' + GLib.markup_escape_text(activity)
+    if subactivity:
+        markuptext += ': ' + GLib.markup_escape_text(subactivity)
+    markuptext += '</b>'
+    if text:
+        markuptext += ' (%s)' % GLib.markup_escape_text(text)
+    return markuptext
+
+
+def get_activity_icon_name(activity, subactivity=None):
+    icon_name = 'activity-%s' % activity.replace('_', '-')
+    if subactivity is not None:
+        icon_name += '-%s' % subactivity.replace('_', '-')
+    return icon_name
diff --git a/gajim/gtkgui_helpers.py b/gajim/gtkgui_helpers.py
index 8b063bfe43e028f842a0de8fa9dd418ea2bbdfef..a14aaec0402b87b7ea721e1bfee30a609d2d0e42 100644
--- a/gajim/gtkgui_helpers.py
+++ b/gajim/gtkgui_helpers.py
@@ -41,10 +41,7 @@ except Exception:
 
 from gajim.common.i18n import _
 from gajim.common import app
-from gajim.common import helpers
 from gajim.common.const import PEPEventType
-from gajim.common.const import ACTIVITIES
-from gajim.common.const import MOODS
 
 HAS_PYWIN32 = True
 if os.name == 'nt':
@@ -267,72 +264,15 @@ def create_list_multi(value_list, selected_values=None):
     treeview.show_all()
     return treeview
 
-def load_activity_icon(category, activity=None):
-    """
-    Load an icon from the activity iconset in 16x16
-    """
-    iconset = app.config.get('activity_iconset')
-    path = os.path.join(helpers.get_activity_iconset_path(iconset),
-            category, '')
-    if activity is None:
-        activity = 'category'
-    icon_list = _load_icon_list([activity], path)
-    return icon_list[activity]
-
 def get_pep_icon(pep_class):
     if pep_class == PEPEventType.TUNE:
         return 'audio-x-generic'
 
-    if pep_class == PEPEventType.ACTIVITY:
-        pep_ = pep_class.data
-        activity = pep_['activity']
-
-        has_known_activity = activity in ACTIVITIES
-        has_known_subactivity = (has_known_activity and
-                                 'subactivity' in pep_ and
-                                 pep_['subactivity'] in ACTIVITIES[activity])
-
-        if has_known_activity:
-            if has_known_subactivity:
-                subactivity = pep_['subactivity']
-                return load_activity_icon(activity, subactivity).get_pixbuf()
-            return load_activity_icon(activity).get_pixbuf()
-        return load_activity_icon('unknown').get_pixbuf()
-
     if pep_class == PEPEventType.LOCATION:
         return 'applications-internet'
 
     return None
 
-def _load_icon_list(icons_list, path, pixbuf2=None):
-    """
-    Load icons in icons_list from the given path, and add pixbuf2 on top left of
-    each static images
-    """
-    imgs = {}
-    for icon in icons_list:
-        # try to open a pixfile with the correct method
-        icon_file = icon.replace(' ', '_')
-        files = []
-        files.append(path + icon_file + '.gif')
-        files.append(path + icon_file + '.png')
-        image = Gtk.Image()
-        image.show()
-        imgs[icon] = image
-        for file_ in files: # loop seeking for either gif or png
-            if os.path.exists(file_):
-                image.set_from_file(file_)
-                if pixbuf2 and image.get_storage_type() == Gtk.ImageType.PIXBUF:
-                    # add pixbuf2 on top-left corner of image
-                    pixbuf1 = image.get_pixbuf()
-                    pixbuf2.composite(pixbuf1, 0, 0,
-                            pixbuf2.get_property('width'),
-                            pixbuf2.get_property('height'), 0, 0, 1.0, 1.0,
-                            GdkPixbuf.InterpType.NEAREST, 255)
-                    image.set_from_pixbuf(pixbuf1)
-                break
-    return imgs
-
 def label_set_autowrap(widget):
     """
     Make labels automatically re-wrap if their containers are resized.
diff --git a/gajim/roster_window.py b/gajim/roster_window.py
index 99b1cdb5c0c318eb2b28324bff23a77899998ceb..edc461b8a41be3e04d1208b8c925c2840086ce14 100644
--- a/gajim/roster_window.py
+++ b/gajim/roster_window.py
@@ -37,13 +37,13 @@ from enum import IntEnum, unique
 
 from gi.repository import Gtk
 from gi.repository import Gdk
-from gi.repository import GdkPixbuf
 from gi.repository import Pango
 from gi.repository import GObject
 from gi.repository import GLib
 from gi.repository import Gio
 from nbxmpp.protocol import NS_FILE, NS_ROSTERX, NS_CONFERENCE
 from nbxmpp.structs import MoodData
+from nbxmpp.structs import ActivityData
 
 from gajim import dialogs
 from gajim import vcard
@@ -87,6 +87,7 @@ from gajim.gtk.util import move_window
 from gajim.gtk.util import get_metacontact_surface
 from gajim.gtk.util import get_builder
 from gajim.gtk.util import set_urgency_hint
+from gajim.gtk.util import get_activity_icon_name
 
 
 log = logging.getLogger('gajim.roster')
@@ -1049,10 +1050,11 @@ class RosterWindow:
         else:
             self.model[child_iter][Column.MOOD_PIXBUF] = None
 
-        if app.config.get('show_activity_in_roster') and 'activity' in \
-        pep_dict:
-            self.model[child_iter][Column.ACTIVITY_PIXBUF] = \
-                gtkgui_helpers.get_pep_icon(pep_dict['activity'])
+        if app.config.get('show_activity_in_roster') and PEPEventType.ACTIVITY in pep_dict:
+            activity = pep_dict[PEPEventType.ACTIVITY].activity
+            subactivity = pep_dict[PEPEventType.ACTIVITY].subactivity
+            icon_name = get_activity_icon_name(activity, subactivity)
+            self.model[child_iter][Column.ACTIVITY_PIXBUF] = icon_name
         else:
             self.model[child_iter][Column.ACTIVITY_PIXBUF] = None
 
@@ -1314,7 +1316,7 @@ class RosterWindow:
         if pep_type == PEPEventType.MOOD:
             return app.config.get('show_mood_in_roster')
 
-        if pep_type == 'activity':
+        if pep_type == PEPEventType.ACTIVITY:
             return app.config.get('show_activity_in_roster')
 
         if pep_type == 'tune':
@@ -1329,6 +1331,7 @@ class RosterWindow:
         for pep_type in self._pep_type_to_model_column:
             self.draw_pep(jid, account, pep_type, contact=contact)
         self._draw_pep(account, jid, PEPEventType.MOOD)
+        self._draw_pep(account, jid, PEPEventType.ACTIVITY)
 
     def draw_pep(self, jid, account, pep_type, contact=None):
         if pep_type not in self._pep_type_to_model_column:
@@ -1366,6 +1369,10 @@ class RosterWindow:
             column = Column.MOOD_PIXBUF
             if data is not None:
                 icon = 'mood-%s' % data.mood
+        elif type_ == PEPEventType.ACTIVITY:
+            column = Column.ACTIVITY_PIXBUF
+            if data is not None:
+                icon = get_activity_icon_name(data.activity, data.subactivity)
 
         for child_iter in iters:
             self.model[child_iter][column] = icon
@@ -2094,15 +2101,14 @@ class RosterWindow:
 
     def send_pep(self, account, pep_dict):
         connection = app.connections[account]
-
         if 'activity' in pep_dict:
             activity = pep_dict['activity']
             subactivity = pep_dict.get('subactivity', None)
             activity_text = pep_dict.get('activity_text', None)
-            connection.get_module('UserActivity').send(
-                (activity, subactivity, activity_text))
+            connection.get_module('UserActivity').set_activity(ActivityData(
+                activity, subactivity, activity_text))
         else:
-            connection.get_module('UserActivity').send(None)
+            connection.get_module('UserActivity').set_activity(None)
 
         if 'mood' in pep_dict:
             mood = pep_dict['mood']
@@ -2630,8 +2636,7 @@ class RosterWindow:
             self.remove_contact(jid, obj.conn.name, backend=True)
 
     def _nec_pep_received(self, obj):
-        if obj.user_pep.type_ not in (PEPEventType.ACTIVITY,
-                                      PEPEventType.TUNE,
+        if obj.user_pep.type_ not in (PEPEventType.TUNE,
                                       PEPEventType.LOCATION):
             return
 
@@ -2645,6 +2650,11 @@ class RosterWindow:
             self.draw_account(event.account)
         self._draw_pep(event.account, event.jid, PEPEventType.MOOD)
 
+    def _on_activity_received(self, event):
+        if event.is_self_message:
+            self.draw_account(event.account)
+        self._draw_pep(event.account, event.jid, PEPEventType.ACTIVITY)
+
     def _on_nickname_received(self, event):
         self.draw_contact(event.jid, event.account)
 
@@ -5582,7 +5592,7 @@ class RosterWindow:
         # activity_pixbuf, TUNE_ICON, LOCATION_ICON, avatar_img,
         # padlock_pixbuf, visible]
         self.columns = [str, str, str, str, str,
-            str, GdkPixbuf.Pixbuf, str, str,
+            str, str, str, str,
             Gtk.Image, str, bool]
 
         self.xml = get_builder('roster_window.ui')
@@ -5682,8 +5692,7 @@ class RosterWindow:
         # cell_data_func, func_arg)
         self.renderers_list = []
         self.renderers_propertys = {}
-        self._pep_type_to_model_column = {
-            'activity': Column.ACTIVITY_PIXBUF, 'tune': Column.TUNE_ICON,
+        self._pep_type_to_model_column = {'tune': Column.TUNE_ICON,
             'geoloc': Column.LOCATION_ICON}
 
         renderer_text = Gtk.CellRendererText()
@@ -5710,7 +5719,7 @@ class RosterWindow:
                 self._fill_pep_pixbuf_renderer, Column.MOOD_PIXBUF),
 
                 ('activity', Gtk.CellRendererPixbuf(), False,
-                'pixbuf', Column.ACTIVITY_PIXBUF,
+                'icon_name', Column.ACTIVITY_PIXBUF,
                 self._fill_pep_pixbuf_renderer, Column.ACTIVITY_PIXBUF),
 
                 ('tune', Gtk.CellRendererPixbuf(), False,
@@ -5836,6 +5845,8 @@ class RosterWindow:
             self._on_nickname_received)
         app.ged.register_event_handler('mood-received', ged.GUI1,
             self._on_mood_received)
+        app.ged.register_event_handler('activity-received', ged.GUI1,
+            self._on_activity_received)
         app.ged.register_event_handler('update-roster-avatar', ged.GUI1,
             self._nec_update_avatar)
         app.ged.register_event_handler('update-room-avatar', ged.GUI1,