diff -ru gateway-orig/gw/smsc/smsc_smpp.c gateway/gw/smsc/smsc_smpp.c
--- gateway-orig/gw/smsc/smsc_smpp.c	2008-07-31 15:09:06.000000000 +0100
+++ gateway/gw/smsc/smsc_smpp.c	2008-07-31 15:22:04.000000000 +0100
@@ -164,6 +164,7 @@
     long connection_timeout;
     long wait_ack;
     int wait_ack_action;
+    long esm_class_submit;
     SMSCConn *conn; 
 } SMPP; 
  
@@ -216,7 +217,7 @@
                          Octstr *my_number, int smpp_msg_id_type, 
                          int autodetect_addr, Octstr *alt_charset, Octstr *alt_addr_charset,
                          Octstr *service_type, long connection_timeout,
-                         long wait_ack, int wait_ack_action) 
+                         long wait_ack, int wait_ack_action, long esm_class_submit) 
 { 
     SMPP *smpp; 
      
@@ -259,6 +260,7 @@
     smpp->wait_ack_action = wait_ack_action;
     smpp->bind_addr_ton = 0;
     smpp->bind_addr_npi = 0;
+    smpp->esm_class_submit = esm_class_submit;
  
     return smpp; 
 } 
@@ -858,7 +860,7 @@
      * set the esm_class field
      * default is store and forward, plus udh and rpi if requested
      */
-    pdu->u.submit_sm.esm_class = ESM_CLASS_SUBMIT_STORE_AND_FORWARD_MODE;
+    pdu->u.submit_sm.esm_class = smpp->esm_class_submit;
     if (octstr_len(msg->sms.udhdata))
         pdu->u.submit_sm.esm_class = pdu->u.submit_sm.esm_class |
             ESM_CLASS_SUBMIT_UDH_INDICATOR;
@@ -2008,6 +2010,7 @@
     Octstr *alt_charset;
     Octstr *alt_addr_charset;
     long connection_timeout, wait_ack, wait_ack_action;
+    long esm_class_submit;
 
     my_number = alt_addr_charset = alt_charset = NULL;
     transceiver_mode = 0;
@@ -2098,6 +2101,10 @@
     else
         /* convert decimal to BCD */
         version = ((version / 10) << 4) + (version % 10);
+        
+    /* use store-and-forward if not defined in config */
+    if (cfg_get_integer(&esm_class_submit, grp, octstr_imm("esm-class-submit")) == -1)
+        esm_class_submit = ESM_CLASS_SUBMIT_STORE_AND_FORWARD_MODE;
 
     /* check for any specified priority value in range [0-5] */
     if (cfg_get_integer(&priority, grp, octstr_imm("priority")) == -1)
@@ -2146,7 +2153,7 @@
                        dest_addr_npi, enquire_link_interval, 
                        max_pending_submits, version, priority, validity, my_number, 
                        smpp_msg_id_type, autodetect_addr, alt_charset, alt_addr_charset,
-                       service_type, connection_timeout, wait_ack, wait_ack_action); 
+                       service_type, connection_timeout, wait_ack, wait_ack_action, esm_class_submit); 
  
     cfg_get_integer(&smpp->bind_addr_ton, grp, octstr_imm("bind-addr-ton"));
     cfg_get_integer(&smpp->bind_addr_npi, grp, octstr_imm("bind-addr-npi"));
diff -ru gateway-orig/gwlib/cfg.def gateway/gwlib/cfg.def
--- gateway-orig/gwlib/cfg.def	2008-07-31 15:09:07.000000000 +0100
+++ gateway/gwlib/cfg.def	2008-07-31 13:09:19.000000000 +0100
@@ -372,6 +372,7 @@
     OCTSTR(preferred-prefix-regex)
     OCTSTR(max-error-count)
     OCTSTR(alt-addr-charset)
+    OCTSTR(esm-class-submit)
 )
 
 
