diff --git a/gajim/common/connection.py b/gajim/common/connection.py
index e14ebb642..209c91eee 100644
--- a/gajim/common/connection.py
+++ b/gajim/common/connection.py
@@ -69,6 +69,7 @@ from gajim.common.modules.ping import Ping
 from gajim.common.modules.search import Search
 from gajim.common.modules.annotations import Annotations
 from gajim.common.modules.roster_item_exchange import RosterItemExchange
+from gajim.common.modules.last_activity import LastActivity
 from gajim.common.connection_handlers import *
 from gajim.common.contacts import GC_Contact
 from gajim.gtkgui_helpers import get_action
@@ -662,6 +663,7 @@ class Connection(CommonConnection, ConnectionHandlers):
         self.register_module('Search', Search, self)
         self.register_module('Annotations', Annotations, self)
         self.register_module('RosterItemExchange', RosterItemExchange, self)
+        self.register_module('LastActivity', LastActivity, self)
 
         app.ged.register_event_handler('privacy-list-received', ged.CORE,
             self._nec_privacy_list_received)
diff --git a/gajim/common/connection_handlers.py b/gajim/common/connection_handlers.py
index 5033b8d25..f9fce117a 100644
--- a/gajim/common/connection_handlers.py
+++ b/gajim/common/connection_handlers.py
@@ -48,7 +48,6 @@ from gajim.common import app
 from gajim.common import dataforms
 from gajim.common import jingle_xtls
 from gajim.common import configpaths
-from gajim.common import idle
 from gajim.common.caps_cache import muc_caps_cache
 from gajim.common.commands import ConnectionCommands
 from gajim.common.pubsub import ConnectionPubSub
@@ -1345,8 +1344,6 @@ ConnectionHTTPUpload):
 
         app.ged.register_event_handler('http-auth-received', ged.CORE,
             self._nec_http_auth_received)
-        app.ged.register_event_handler('last-request-received', ged.CORE,
-            self._nec_last_request_received)
         app.ged.register_event_handler('roster-set-received',
             ged.CORE, self._nec_roster_set_received)
         app.ged.register_event_handler('private-storage-bookmarks-received',
@@ -1380,8 +1377,6 @@ ConnectionHTTPUpload):
         ConnectionHTTPUpload.cleanup(self)
         app.ged.remove_event_handler('http-auth-received', ged.CORE,
             self._nec_http_auth_received)
-        app.ged.remove_event_handler('last-request-received', ged.CORE,
-            self._nec_last_request_received)
         app.ged.remove_event_handler('roster-set-received',
             ged.CORE, self._nec_roster_set_received)
         app.ged.remove_event_handler('private-storage-bookmarks-received',
@@ -1640,29 +1635,6 @@ ConnectionHTTPUpload):
             app.config.set_per('accounts', self.name, 'roster_version',
                 obj.version)
 
-    def _LastCB(self, con, iq_obj):
-        log.debug('LastCB')
-        if not self.connection or self.connected < 2:
-            return
-        app.nec.push_incoming_event(LastRequestEvent(None, conn=self,
-            stanza=iq_obj))
-        raise nbxmpp.NodeProcessed
-
-    def _nec_last_request_received(self, obj):
-        if obj.conn.name != self.name:
-            return
-        if app.is_installed('IDLE') and app.config.get_per('accounts', self.name,
-        'send_idle_time'):
-            iq_obj = obj.stanza.buildReply('result')
-            qp = iq_obj.setQuery()
-            qp.attrs['seconds'] = idle.Monitor.get_idle_sec()
-        else:
-            iq_obj = obj.stanza.buildReply('error')
-            err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \
-                ' service-unavailable')
-            iq_obj.addChild(node=err)
-        self.connection.send(iq_obj)
-
     def _messageCB(self, con, msg):
         """
         Called when we receive a message
@@ -2086,7 +2058,6 @@ ConnectionHTTPUpload):
             nbxmpp.NS_DISCO_INFO)
         con.RegisterHandler('iq', self._DiscoverInfoErrorCB, 'error',
             nbxmpp.NS_DISCO_INFO)
-        con.RegisterHandler('iq', self._LastCB, 'get', nbxmpp.NS_LAST)
         con.RegisterHandler('iq', self._MucOwnerCB, 'result',
             nbxmpp.NS_MUC_OWNER)
         con.RegisterHandler('iq', self._MucAdminCB, 'result',
diff --git a/gajim/common/connection_handlers_events.py b/gajim/common/connection_handlers_events.py
index 46e75b4b8..0319dc5fe 100644
--- a/gajim/common/connection_handlers_events.py
+++ b/gajim/common/connection_handlers_events.py
@@ -193,10 +193,6 @@ class HttpAuthReceivedEvent(nec.NetworkIncomingEvent):
         self.msg = self.stanza.getTagData('body')
         return True
 
-class LastRequestEvent(nec.NetworkIncomingEvent):
-    name = 'last-request-received'
-    base_network_events = []
-
 class RosterReceivedEvent(nec.NetworkIncomingEvent):
     name = 'roster-received'
     base_network_events = []
diff --git a/gajim/common/modules/last_activity.py b/gajim/common/modules/last_activity.py
new file mode 100644
index 000000000..71e6b596e
--- /dev/null
+++ b/gajim/common/modules/last_activity.py
@@ -0,0 +1,52 @@
+# This file is part of Gajim.
+#
+# Gajim is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; version 3 only.
+#
+# Gajim is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Gajim.  If not, see <http://www.gnu.org/licenses/>.
+
+# XEP-0012: Last Activity
+
+import logging
+
+import nbxmpp
+
+from gajim.common import app
+from gajim.common import idle
+
+log = logging.getLogger('gajim.c.m.last_activity')
+
+
+class LastActivity:
+    def __init__(self, con):
+        self._con = con
+        self._account = con.name
+
+        self.handlers = [('iq', self._answer_request, 'get', nbxmpp.NS_LAST)]
+
+    def _answer_request(self, con, stanza):
+        log.info('Request from %s', stanza.getFrom())
+        if not app.account_is_connected(self._account):
+            return
+
+        allow_send = app.config.get_per(
+            'accounts', self._account, 'send_idle_time')
+        if app.is_installed('IDLE') and allow_send:
+            iq = stanza.buildReply('result')
+            query = iq.setQuery()
+            query.attrs['seconds'] = idle.Monitor.get_idle_sec()
+        else:
+            iq = stanza.buildReply('error')
+            err = nbxmpp.ErrorNode(nbxmpp.ERR_SERVICE_UNAVAILABLE)
+            iq.addChild(node=err)
+
+        self._con.connection.send(iq)
+
+        raise nbxmpp.NodeProcessed