diff --git a/src/common/xmpp/dispatcher_nb.py b/src/common/xmpp/dispatcher_nb.py
index 31fa86e3a361d20a5deecb493f33b1ecb778ba0b..f01f78a0a8719fff8fab2b9a5e7382a57bda9ae1 100644
--- a/src/common/xmpp/dispatcher_nb.py
+++ b/src/common/xmpp/dispatcher_nb.py
@@ -533,6 +533,13 @@ class XMPPDispatcher(PlugIn):
                     ID = stanza.getID()
                 if self._owner._registered_name and not stanza.getAttr('from'):
                     stanza.setAttr('from', self._owner._registered_name)
+                    
+        if self.supports_sm:
+            self.sm.uqueue.append(stanza)
+            self.sm.out_h = self.sm.out_h + 1
+            if len(self.sm.uqueue) > self.sm.max_queue:
+                self.sm.request_ack()
+                
         self._owner.Connection.send(stanza, now)
         return ID
 
diff --git a/src/common/xmpp/smacks.py b/src/common/xmpp/smacks.py
index 7c99ab5b805e45bad029796dca6e3b8eb6fac990..005f2e375b606df1f9f32b7efaed3bea39d50eb0 100644
--- a/src/common/xmpp/smacks.py
+++ b/src/common/xmpp/smacks.py
@@ -1,5 +1,7 @@
 from protocol import Acks
 from protocol import NS_STREAM_MGMT
+import logging
+log = logging.getLogger('gajim.c.x.smacks')
 
 class Smacks():
     '''
@@ -16,13 +18,16 @@ class Smacks():
         self.out_h = 0 # Outgoing stanzas handled
         self.in_h = 0  # Incoming stanzas handled
         self.uqueue = [] # Unhandled stanzas queue
-        
-        #Register handlers 
+        # Max number of stanzas in queue before making a request
+        self.max_queue = 5  
+        # Register handlers 
         owner.Dispatcher.RegisterNamespace(NS_STREAM_MGMT)
         owner.Dispatcher.RegisterHandler('enabled', self._neg_response
                                          ,xmlns=NS_STREAM_MGMT)
         owner.Dispatcher.RegisterHandler('r', self.send_ack
                                          ,xmlns=NS_STREAM_MGMT)
+        owner.Dispatcher.RegisterHandler('a', self.check_ack
+                                         ,xmlns=NS_STREAM_MGMT)
 
         
     def negociate(self):
@@ -41,4 +46,19 @@ class Smacks():
     def request_ack(self):
         r = Acks()
         r.buildRequest()
-        self._owner.Connection.send(r, False)
\ No newline at end of file
+        self._owner.Connection.send(r, False)
+        
+    def check_ack(self, disp, stanza):
+        h = int(stanza.getAttr('h'))
+        diff = self.out_h - h
+        
+
+        if len(self.uqueue) < diff or diff < 0:
+            log.error('Server and client number of stanzas handled mismatch ')
+            return
+        
+        while (len(self.uqueue) > diff):
+            self.uqueue.pop(0)
+        
+
+