diff --git a/gw/smsc/smsc_smpp.c b/gw/smsc/smsc_smpp.c
index 7024b63..c8e4fd3 100644
--- a/gw/smsc/smsc_smpp.c
+++ b/gw/smsc/smsc_smpp.c
@@ -79,6 +79,7 @@
 #include "dlr.h"
 #include "bearerbox.h"
 #include "meta_data.h"
+#include "load.h"
 
 #define SMPP_DEFAULT_CHARSET "UTF-8"
 
@@ -111,7 +112,7 @@
 #define SMPP_MAX_PENDING_SUBMITS    10
 #define SMPP_DEFAULT_VERSION        0x34
 #define SMPP_DEFAULT_PRIORITY       0
-#define SMPP_THROTTLING_SLEEP_TIME  15
+#define SMPP_THROTTLING_SLEEP_TIME  1
 #define SMPP_DEFAULT_CONNECTION_TIMEOUT  10 * SMPP_ENQUIRE_LINK_INTERVAL
 #define SMPP_DEFAULT_WAITACK        60
 #define SMPP_DEFAULT_SHUTDOWN_TIMEOUT 30
@@ -166,6 +167,7 @@ typedef struct {
     long connection_timeout;
     long wait_ack;
     int wait_ack_action;
+    Load *load;
     SMSCConn *conn; 
 } SMPP; 
  
@@ -261,6 +263,8 @@ static SMPP *smpp_create(SMSCConn *conn, Octstr *host, int transmit_port,
     smpp->wait_ack_action = wait_ack_action;
     smpp->bind_addr_ton = 0;
     smpp->bind_addr_npi = 0;
+    smpp->load = load_create_real(0);
+    load_add_interval(smpp->load, 1);
  
     return smpp; 
 } 
@@ -282,6 +286,7 @@ static void smpp_destroy(SMPP *smpp)
         octstr_destroy(smpp->my_number);
         octstr_destroy(smpp->alt_charset);
         octstr_destroy(smpp->alt_addr_charset);
+        load_destroy(smpp->load);
         gw_free(smpp); 
     } 
 } 
@@ -998,16 +1003,20 @@ static void send_messages(SMPP *smpp, Connection *conn, long *pending_submits)
     Msg *msg;
     SMPP_PDU *pdu;
     Octstr *os;
-    double delay = 0;
 
     if (*pending_submits == -1)
         return;
 
-    if (smpp->conn->throughput > 0) {
-        delay = 1.0 / smpp->conn->throughput;
-    }
-
     while (*pending_submits < smpp->max_pending_submits) {
+        /* check our throughput */
+        if (smpp->conn->throughput > 0 && load_get(smpp->load, 0) >= smpp->conn->throughput) {
+            debug("bb.sms.smpp", 0, "SMPP[%s]: throughput limit exceeded (%.02f,%d)",
+                  octstr_get_cstr(smpp->conn->id), load_get(smpp->load, 0), smpp->conn->throughput);
+            break;
+        }
+        debug("bb.sms.smpp", 0, "SMPP[%s]: throughput (%.02f,%d)",
+              octstr_get_cstr(smpp->conn->id), load_get(smpp->load, 0), smpp->conn->throughput);
+
     	/* Get next message, quit if none to be sent */
     	msg = gw_prioqueue_remove(smpp->msgs_to_send);
         if (msg == NULL)
@@ -1027,11 +1036,7 @@ static void send_messages(SMPP *smpp, Connection *conn, long *pending_submits)
             smpp_pdu_destroy(pdu);
             octstr_destroy(os);
             ++(*pending_submits);
-            /*
-             * obey throughput speed limit, if any.
-             */
-            if (smpp->conn->throughput > 0)
-                gwthread_sleep(delay);
+            load_increase(smpp->load);
         }
         else { /* write error occurs */
             smpp_pdu_destroy(pdu);
