Index: gw/dlr_mem.c
===================================================================
--- gw/dlr_mem.c	(revision 4833)
+++ gw/dlr_mem.c	(working copy)
@@ -125,7 +125,7 @@
     /* XXX: check destination addr too, because e.g. for UCP is not enough to check only
      *          smsc and timestamp (timestamp is even without milliseconds)
      */
-    if(octstr_compare(dlr->smsc,smsc) == 0 && octstr_compare(dlr->timestamp,ts) == 0)
+    if(octstr_compare(dlr->smsc,smsc) == 0 && octstr_compare(dlr->timestamp,ts) == 0 && (!dst || octstr_compare(dlr->destination,dst) == 0))
         return 0;
 
     return 1;
Index: gw/dlr_mssql.c
===================================================================
--- gw/dlr_mssql.c	(revision 4833)
+++ gw/dlr_mssql.c	(working copy)
@@ -172,7 +172,12 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("SET ROWCOUNT 1\n"
+    if (dst) sql = octstr_format("SET ROWCOUNT 1\n"
+            "DELETE FROM %S WHERE %S='%S' AND %S='%S' AND %S='%S'\n"
+            "SET ROWCOUNT 0",
+            fields->table, fields->field_smsc, smsc,
+            fields->field_ts, ts, fields->field_dst, dst);
+    else sql = octstr_format("SET ROWCOUNT 1\n"
             "DELETE FROM %S WHERE %S='%S' AND %S='%S'\n"
             "SET ROWCOUNT 0",
             fields->table, fields->field_smsc, smsc,
@@ -202,9 +207,14 @@
     if (pconn == NULL) /* should not happens, but sure is sure */
         return NULL;
 
-    sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %S='%S'",
+    if (dst) sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %S='%S' AND %S='%S'",
                 fields->field_mask, fields->field_serv, fields->field_url,
                 fields->field_src, fields->field_dst, fields->field_boxc,
+                fields->table, fields->field_smsc, smsc, fields->field_ts, ts,
+                fields->field_dst, dst);
+    else sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %S='%S'",
+                fields->field_mask, fields->field_serv, fields->field_url,
+                fields->field_src, fields->field_dst, fields->field_boxc,
                 fields->table, fields->field_smsc, smsc, fields->field_ts, ts);
 
 #if defined(DLR_TRACE)
@@ -253,7 +263,13 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("SET ROWCOUNT 1\n"
+    if (dst) sql = octstr_format("SET ROWCOUNT 1\n"
+            "UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S' AND %S='%S'\n"
+            "SET ROWCOUNT 0",
+            fields->table, fields->field_status, status,
+            fields->field_smsc, smsc, fields->field_ts, ts, fields->field_dst,
+            dst);
+    else sql = octstr_format("SET ROWCOUNT 1\n"
             "UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S'\n"
             "SET ROWCOUNT 0",
             fields->table, fields->field_status, status,
Index: gw/dlr_mysql.c
===================================================================
--- gw/dlr_mysql.c	(revision 4833)
+++ gw/dlr_mysql.c	(working copy)
@@ -148,15 +148,22 @@
     if (pconn == NULL) /* should not happens, but sure is sure */
         return NULL;
 
-    sql = octstr_format("SELECT `%S`, `%S`, `%S`, `%S`, `%S`, `%S` FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
+    if (dst) sql = octstr_format("SELECT `%S`, `%S`, `%S`, `%S`, `%S`, `%S` FROM `%S` WHERE `%S`=? AND `%S`=? AND `%S`=? LIMIT 1",
                         fields->field_mask, fields->field_serv,
                         fields->field_url, fields->field_src,
                         fields->field_dst, fields->field_boxc,
                         fields->table, fields->field_smsc,
+                        fields->field_ts, fields->field_dst);
+    else sql = octstr_format("SELECT `%S`, `%S`, `%S`, `%S`, `%S`, `%S` FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
+                        fields->field_mask, fields->field_serv,
+                        fields->field_url, fields->field_src,
+                        fields->field_dst, fields->field_boxc,
+                        fields->table, fields->field_smsc,
                         fields->field_ts);
 
     gwlist_append(binds, (Octstr *)smsc);
     gwlist_append(binds, (Octstr *)ts);
+    if (dst) gwlist_append(binds, (Octstr *)dst);
 
 #if defined(DLR_TRACE)
     debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
@@ -207,12 +214,17 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("DELETE FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
+    if (dst) sql = octstr_format("DELETE FROM `%S` WHERE `%S`=? AND `%S`=? AND "
+        "`%S`=? LIMIT 1",
                         fields->table, fields->field_smsc,
+                        fields->field_ts, fields->field_dst);
+    else sql = octstr_format("DELETE FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
+                        fields->table, fields->field_smsc,
                         fields->field_ts);
 
     gwlist_append(binds, (Octstr *)smsc);
     gwlist_append(binds, (Octstr *)ts);
+    if (dst) gwlist_append(binds, (Octstr *)dst);
 
 #if defined(DLR_TRACE)
     debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
@@ -242,14 +254,20 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("UPDATE `%S` SET `%S`=? WHERE `%S`=? AND `%S`=? LIMIT 1",
+    if (dst) sql = octstr_format("UPDATE `%S` SET `%S`=? WHERE `%S`=? AND "
+        "`%S`=? AND `%S`=? LIMIT 1",
                         fields->table, fields->field_status,
+                        fields->field_smsc, fields->field_ts,
+                        fields->field_dst);
+    else sql = octstr_format("UPDATE `%S` SET `%S`=? WHERE `%S`=? AND `%S`=? LIMIT 1",
+                        fields->table, fields->field_status,
                         fields->field_smsc, fields->field_ts);
 
     os_status = octstr_format("%d", status);
     gwlist_append(binds, (Octstr *)os_status);
     gwlist_append(binds, (Octstr *)smsc);
     gwlist_append(binds, (Octstr *)ts);
+    if (dst) gwlist_append(binds, (Octstr *)dst);
 
 #if defined(DLR_TRACE)
     debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
Index: gw/dlr_oracle.c
===================================================================
--- gw/dlr_oracle.c	(revision 4833)
+++ gw/dlr_oracle.c	(working copy)
@@ -183,13 +183,15 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("DELETE FROM %S WHERE %S=:1 AND %S=:2 AND %S=:3 AND ROWNUM < 2",
+    if (dst) sql = octstr_format("DELETE FROM %S WHERE %S=:1 AND %S=:2 AND %S=:3 AND ROWNUM < 2",
                         fields->table, fields->field_smsc,
                         fields->field_ts, fields->field_dst);
+    else sql = octstr_format("DELETE FROM %S WHERE %S=:1 AND %S=:2 AND ROWNUM < 2",
+                        fields->table, fields->field_smsc, fields->field_ts);
 
-    gwlist_append(binds, (Octstr *)smsc);      /* :1 */
-    gwlist_append(binds, (Octstr *)ts);        /* :2 */
-    gwlist_append(binds, (Octstr *)dst);       /* :3 */
+    gwlist_append(binds, (Octstr *)smsc);               /* :1 */
+    gwlist_append(binds, (Octstr *)ts);                 /* :2 */
+    if (dst) gwlist_append(binds, (Octstr *)dst);       /* :3 */
 
 #if defined(DLR_TRACE)
     debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql));
@@ -217,16 +219,22 @@
     if (pconn == NULL) /* should not happens, but sure is sure */
         return NULL;
 
-    sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S=:1 AND %S=:2 AND %S=:3 AND ROWNUM < 2",
+    if (dst) sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S=:1 AND %S=:2 AND %S=:3 AND ROWNUM < 2",
                         fields->field_mask, fields->field_serv,
                         fields->field_url, fields->field_src,
                         fields->field_dst, fields->field_boxc,
                         fields->table, fields->field_smsc,
                         fields->field_ts, fields->field_dst);
+    else sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S=:1 AND %S=:2 AND ROWNUM < 2",
+                        fields->field_mask, fields->field_serv,
+                        fields->field_url, fields->field_src,
+                        fields->field_dst, fields->field_boxc,
+                        fields->table, fields->field_smsc,
+                        fields->field_ts);
 
-    gwlist_append(binds, (Octstr *)smsc);      /* :1 */
-    gwlist_append(binds, (Octstr *)ts);        /* :2 */
-    gwlist_append(binds, (Octstr *)dst);       /* :3 */
+    gwlist_append(binds, (Octstr *)smsc);               /* :1 */
+    gwlist_append(binds, (Octstr *)ts);                 /* :2 */
+    if (dst) gwlist_append(binds, (Octstr *)dst);       /* :3 */
 
 #if defined(DLR_TRACE)
     debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql));
@@ -276,15 +284,18 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 AND %S=:4 AND ROWNUM < 2",
+    if (dst) sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 AND %S=:4 AND ROWNUM < 2",
                         fields->table, fields->field_status,
                         fields->field_smsc, fields->field_ts, fields->field_dst);
+    else sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 AND ROWNUM < 2",
+                        fields->table, fields->field_status,
+                        fields->field_smsc, fields->field_ts);
 
     os_status = octstr_format("%d", status);
-    gwlist_append(binds, (Octstr *)os_status); /* :1 */
-    gwlist_append(binds, (Octstr *)smsc);      /* :2 */
-    gwlist_append(binds, (Octstr *)ts);        /* :3 */
-    gwlist_append(binds, (Octstr *)dst);       /* :4 */
+    gwlist_append(binds, (Octstr *)os_status);          /* :1 */
+    gwlist_append(binds, (Octstr *)smsc);               /* :2 */
+    gwlist_append(binds, (Octstr *)ts);                 /* :3 */
+    if (dst) gwlist_append(binds, (Octstr *)dst);       /* :4 */
 #if defined(DLR_TRACE)
     debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql));
 #endif
Index: gw/dlr_pgsql.c
===================================================================
--- gw/dlr_pgsql.c	(revision 4833)
+++ gw/dlr_pgsql.c	(working copy)
@@ -168,11 +168,18 @@
     Octstr *sql;
     List *result, *row;
 
-    sql = octstr_format("SELECT \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\" FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1;",
+    if (dst) sql = octstr_format("SELECT \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\" FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' AND \"%s\"='%s' LIMIT 1;",
                         octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
                         octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
                         octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
                         octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
+                        octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+    else sql = octstr_format("SELECT \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\" FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1;",
+                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
+                        octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
+                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
                         octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
 
 
@@ -221,9 +228,14 @@
     Octstr *sql;
 
     debug("dlr.pgsql", 0, "removing DLR from database");
-    sql = octstr_format("DELETE FROM \"%s\" WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
+    if (dst) sql = octstr_format("DELETE FROM \"%s\" WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
                         octstr_get_cstr(fields->table), octstr_get_cstr(fields->table),
                         octstr_get_cstr(fields->field_smsc),
+                        octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+    else sql = octstr_format("DELETE FROM \"%s\" WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
+                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->table),
+                        octstr_get_cstr(fields->field_smsc),
                         octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
 
 
@@ -238,11 +250,18 @@
     Octstr *sql;
 
     debug("dlr.pgsql", 0, "updating DLR status in database");
-    sql = octstr_format("UPDATE \"%s\" SET \"%s\"=%d WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
+    if (dst) sql = octstr_format("UPDATE \"%s\" SET \"%s\"=%d WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
                         octstr_get_cstr(fields->table),
                         octstr_get_cstr(fields->field_status), status,
                         octstr_get_cstr(fields->table),
                         octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+                        octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+    else sql = octstr_format("UPDATE \"%s\" SET \"%s\"=%d WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
+                        octstr_get_cstr(fields->table),
+                        octstr_get_cstr(fields->field_status), status,
+                        octstr_get_cstr(fields->table),
+                        octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
                         octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
     if (!pgsql_update(sql))
        warning(0, "DLR: PGSQL: No dlr updated for DST<%s> (status: %d)", octstr_get_cstr(dst), status);
Index: gw/dlr_sdb.c
===================================================================
--- gw/dlr_sdb.c	(revision 4833)
+++ gw/dlr_sdb.c	(working copy)
@@ -218,12 +218,21 @@
 
     gw_assert(res != NULL);
 
-    sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' %s",
+    if (dst) sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s' %s",
                         octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
                         octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
                         octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
                         octstr_get_cstr(fields->table),
                         octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+                        octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+                        sdb_get_limit_str());
+    else sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' %s",
+                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
+                        octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
+                        octstr_get_cstr(fields->table),
+                        octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
                         octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
 
 #if defined(DLR_TRACE)
@@ -256,10 +265,19 @@
     int	state;
 
     debug("dlr.sdb", 0, "SDB: updating DLR status in database");
-    sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' %s",
+
+    if (dst) sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND "
+       "%s='%s' AND %s='%s' %s",
                         octstr_get_cstr(fields->table),
                         octstr_get_cstr(fields->field_status), status,
                         octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+                        octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+                        sdb_get_limit_str());
+    else sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' %s",
+                        octstr_get_cstr(fields->table),
+                        octstr_get_cstr(fields->field_status), status,
+                        octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
                         octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
 
 #if defined(DLR_TRACE)
@@ -288,16 +306,31 @@
          * to do vacuum regularly, even if it's virtually impossible
          * to hit duplicates since oid's are given in a row
          */
-        sql = octstr_format("DELETE FROM %s WHERE oid = \
+        if (dst) sql = octstr_format("DELETE FROM %s WHERE oid = \
+                            (SELECT oid FROM %s WHERE %s='%s' AND %s='%s' AND "
+                            "%s='%s' LIMIT 1)",
+                            octstr_get_cstr(fields->table),
+                            octstr_get_cstr(fields->table),
+                            octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+                            octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+                            octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+       else sql = octstr_format("DELETE FROM %s WHERE oid = \
                             (SELECT oid FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1)",
                             octstr_get_cstr(fields->table),
                             octstr_get_cstr(fields->table),
                             octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
                             octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
     } else {
-        sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' %s",
+        if (dst) sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' "
+                            "AND %s='%s' %s",
                             octstr_get_cstr(fields->table),
                             octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+                            octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+                            octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+                            sdb_get_limit_str());
+       else sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' %s",
+                            octstr_get_cstr(fields->table),
+                            octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
                             octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
     }
 
