diff --git a/aclocal.m4 b/aclocal.m4
index 14f6054..5a35f95 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+# generated automatically by aclocal 1.10.2 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005  Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -224,8 +224,8 @@ test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
 AC_LIB_PROG_LD_GNU
 ])
 
-# lib-link.m4 serial 8 (gettext-0.15)
-dnl Copyright (C) 2001-2006 Free Software Foundation, Inc.
+# lib-link.m4 serial 6 (gettext-0.14.3)
+dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -352,7 +352,6 @@ dnl the libraries corresponding to explicit and implicit dependencies.
 dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
 AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
 [
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
   define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
   dnl By default, look in $includedir and $libdir.
@@ -375,7 +374,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
         ])
       else
         additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
+        additional_libdir="$withval/lib"
       fi
     fi
 ])
@@ -475,7 +474,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
               dnl Linking with a shared library. We attempt to hardcode its
               dnl directory into the executable's runpath, unless it's the
               dnl standard /usr/lib.
-              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
+              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
                 dnl No hardcoding is needed.
                 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
               else
@@ -561,8 +560,8 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
             dnl Assume the include files are nearby.
             additional_includedir=
             case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
                 additional_includedir="$basedir/include"
                 ;;
             esac
@@ -623,9 +622,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
                     dnl   3. if it's already present in $LDFLAGS or the already
                     dnl      constructed $LIBNAME,
                     dnl   4. if it doesn't exist as a directory.
-                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+                    if test "X$additional_libdir" != "X/usr/lib"; then
                       haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
                         if test -n "$GCC"; then
                           case $host_os in
                             linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -779,83 +778,7 @@ AC_DEFUN([AC_LIB_APPENDTOVAR],
   done
 ])
 
-dnl For those cases where a variable contains several -L and -l options
-dnl referring to unknown libraries and directories, this macro determines the
-dnl necessary additional linker options for the runtime path.
-dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
-dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
-dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
-dnl otherwise linking without libtool is assumed.
-AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
-[
-  AC_REQUIRE([AC_LIB_RPATH])
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
-  $1=
-  if test "$enable_rpath" != no; then
-    if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
-      dnl Use an explicit option to hardcode directories into the resulting
-      dnl binary.
-      rpathdirs=
-      next=
-      for opt in $2; do
-        if test -n "$next"; then
-          dir="$next"
-          dnl No need to hardcode the standard /usr/lib.
-          if test "X$dir" != "X/usr/$acl_libdirstem"; then
-            rpathdirs="$rpathdirs $dir"
-          fi
-          next=
-        else
-          case $opt in
-            -L) next=yes ;;
-            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
-                 dnl No need to hardcode the standard /usr/lib.
-                 if test "X$dir" != "X/usr/$acl_libdirstem"; then
-                   rpathdirs="$rpathdirs $dir"
-                 fi
-                 next= ;;
-            *) next= ;;
-          esac
-        fi
-      done
-      if test "X$rpathdirs" != "X"; then
-        if test -n ""$3""; then
-          dnl libtool is used for linking. Use -R options.
-          for dir in $rpathdirs; do
-            $1="${$1}${$1:+ }-R$dir"
-          done
-        else
-          dnl The linker is used for linking directly.
-          if test -n "$hardcode_libdir_separator"; then
-            dnl Weird platform: only the last -rpath option counts, the user
-            dnl must pass all path elements in one option.
-            alldirs=
-            for dir in $rpathdirs; do
-              alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$dir"
-            done
-            acl_save_libdir="$libdir"
-            libdir="$alldirs"
-            eval flag=\"$hardcode_libdir_flag_spec\"
-            libdir="$acl_save_libdir"
-            $1="$flag"
-          else
-            dnl The -rpath options are cumulative.
-            for dir in $rpathdirs; do
-              acl_save_libdir="$libdir"
-              libdir="$dir"
-              eval flag=\"$hardcode_libdir_flag_spec\"
-              libdir="$acl_save_libdir"
-              $1="${$1}${$1:+ }$flag"
-            done
-          fi
-        fi
-      fi
-    fi
-  fi
-  AC_SUBST([$1])
-])
-
-# lib-prefix.m4 serial 5 (gettext-0.15)
+# lib-prefix.m4 serial 4 (gettext-0.14.2)
 dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -881,7 +804,6 @@ AC_DEFUN([AC_LIB_PREFIX],
   AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
   AC_REQUIRE([AC_PROG_CC])
   AC_REQUIRE([AC_CANONICAL_HOST])
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
   AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
   dnl By default, look in $includedir and $libdir.
   use_additional=yes
@@ -903,7 +825,7 @@ AC_DEFUN([AC_LIB_PREFIX],
         ])
       else
         additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
+        additional_libdir="$withval/lib"
       fi
     fi
 ])
@@ -945,7 +867,7 @@ AC_DEFUN([AC_LIB_PREFIX],
     dnl   2. if it's already present in $LDFLAGS,
     dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
     dnl   4. if it doesn't exist as a directory.
-    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+    if test "X$additional_libdir" != "X/usr/lib"; then
       haveit=
       for x in $LDFLAGS; do
         AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
@@ -955,7 +877,7 @@ AC_DEFUN([AC_LIB_PREFIX],
         fi
       done
       if test -z "$haveit"; then
-        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+        if test "X$additional_libdir" = "X/usr/local/lib"; then
           if test -n "$GCC"; then
             case $host_os in
               linux*) haveit=yes;;
@@ -1010,35 +932,4 @@ AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
   prefix="$acl_save_prefix"
 ])
 
-dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing
-dnl the basename of the libdir, either "lib" or "lib64".
-AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
-[
-  dnl There is no formal standard regarding lib and lib64. The current
-  dnl practice is that on a system supporting 32-bit and 64-bit instruction
-  dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit
-  dnl libraries go under $prefix/lib. We determine the compiler's default
-  dnl mode by looking at the compiler's library search path. If at least
-  dnl of its elements ends in /lib64 or points to a directory whose absolute
-  dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the
-  dnl default, namely "lib".
-  acl_libdirstem=lib
-  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
-  if test -n "$searchpath"; then
-    acl_save_IFS="${IFS= 	}"; IFS=":"
-    for searchdir in $searchpath; do
-      if test -d "$searchdir"; then
-        case "$searchdir" in
-          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
-          *) searchdir=`cd "$searchdir" && pwd`
-             case "$searchdir" in
-               */lib64 ) acl_libdirstem=lib64 ;;
-             esac ;;
-        esac
-      fi
-    done
-    IFS="$acl_save_IFS"
-  fi
-])
-
 m4_include([acinclude.m4])
diff --git a/configure b/configure
index ba67e8e..9a7ca62 100755
--- a/configure
+++ b/configure
@@ -8008,26 +8008,6 @@ fi
 
 
 
-                  acl_libdirstem=lib
-  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
-  if test -n "$searchpath"; then
-    acl_save_IFS="${IFS= 	}"; IFS=":"
-    for searchdir in $searchpath; do
-      if test -d "$searchdir"; then
-        case "$searchdir" in
-          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
-          *) searchdir=`cd "$searchdir" && pwd`
-             case "$searchdir" in
-               */lib64 ) acl_libdirstem=lib64 ;;
-             esac ;;
-        esac
-      fi
-    done
-    IFS="$acl_save_IFS"
-  fi
-
-
-
 
 
 
@@ -8068,7 +8048,7 @@ if test "${with_libiconv_prefix+set}" = set; then
 
       else
         additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
+        additional_libdir="$withval/lib"
       fi
     fi
 
@@ -8166,7 +8146,7 @@ fi
           if test "X$found_dir" != "X"; then
                         LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
             if test "X$found_so" != "X"; then
-                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
                                 LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
               else
                                                                                 haveit=
@@ -8231,8 +8211,8 @@ fi
             fi
                         additional_includedir=
             case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
                 additional_includedir="$basedir/include"
                 ;;
             esac
@@ -8281,9 +8261,9 @@ fi
                 case "$dep" in
                   -L*)
                     additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
                       haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
                         if test -n "$GCC"; then
                           case $host_os in
                             linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -12749,6 +12729,162 @@ fi
 
 done
 
+
+{ $as_echo "$as_me:$LINENO: checking for mysql_stmt_init in -lmysqlclient_r" >&5
+$as_echo_n "checking for mysql_stmt_init in -lmysqlclient_r... " >&6; }
+if test "${ac_cv_lib_mysqlclient_r_mysql_stmt_init+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmysqlclient_r  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char mysql_stmt_init ();
+int
+main ()
+{
+return mysql_stmt_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_mysqlclient_r_mysql_stmt_init=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_mysqlclient_r_mysql_stmt_init=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_mysqlclient_r_mysql_stmt_init" >&5
+$as_echo "$ac_cv_lib_mysqlclient_r_mysql_stmt_init" >&6; }
+if test "x$ac_cv_lib_mysqlclient_r_mysql_stmt_init" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBMYSQLCLIENT_R 1
+_ACEOF
+
+  LIBS="-lmysqlclient_r $LIBS"
+
+else
+
+{ $as_echo "$as_me:$LINENO: checking for mysql_stmt_init in -lmysqlclient" >&5
+$as_echo_n "checking for mysql_stmt_init in -lmysqlclient... " >&6; }
+if test "${ac_cv_lib_mysqlclient_mysql_stmt_init+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmysqlclient  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char mysql_stmt_init ();
+int
+main ()
+{
+return mysql_stmt_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_mysqlclient_mysql_stmt_init=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_mysqlclient_mysql_stmt_init=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_mysqlclient_mysql_stmt_init" >&5
+$as_echo "$ac_cv_lib_mysqlclient_mysql_stmt_init" >&6; }
+if test "x$ac_cv_lib_mysqlclient_mysql_stmt_init" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBMYSQLCLIENT 1
+_ACEOF
+
+  LIBS="-lmysqlclient $LIBS"
+
+else
+  { { $as_echo "$as_me:$LINENO: error: Unable to find MySQL client libraries version >= 4.1" >&5
+$as_echo "$as_me: error: Unable to find MySQL client libraries version >= 4.1" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+fi
+
     cat >>confdefs.h <<\_ACEOF
 #define HAVE_MYSQL 1
 _ACEOF
diff --git a/configure.in b/configure.in
index 0e3950a..592e74d 100644
--- a/configure.in
+++ b/configure.in
@@ -966,6 +966,9 @@ else
         AC_MSG_RESULT([$MYSQL_CFLAGS])
     fi
     AC_CHECK_HEADERS(mysql/mysql.h mysql/mysql_version.h)
+    AC_CHECK_LIB(mysqlclient_r, mysql_stmt_init, [],
+		AC_CHECK_LIB(mysqlclient, mysql_stmt_init, [], [AC_MSG_ERROR([Unable to find MySQL client libraries version >= 4.1])])
+    )
     AC_DEFINE(HAVE_MYSQL)
     AC_MSG_CHECKING([whether to compile with MySQL support])
     AC_MSG_RESULT(yes)
diff --git a/gw/dlr_mysql.c b/gw/dlr_mysql.c
index e2bd3f0..4799191 100644
--- a/gw/dlr_mysql.c
+++ b/gw/dlr_mysql.c
@@ -71,7 +71,6 @@
 
 
 #ifdef HAVE_MYSQL
-#include <mysql/mysql.h>
 
 /*
  * Our connection pool to mysql.
@@ -84,56 +83,6 @@ static DBPool *pool = NULL;
 static struct dlr_db_fields *fields = NULL;
 
 
-static void mysql_update(const Octstr *sql)
-{
-    int	state;
-    DBPoolConn *pc;
-
-#if defined(DLR_TRACE)
-     debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
-#endif
-
-    pc = dbpool_conn_consume(pool);
-    if (pc == NULL) {
-        error(0, "MYSQL: Database pool got no connection! DB update failed!");
-        return;
-    }
-
-    state = mysql_query(pc->conn, octstr_get_cstr(sql));
-    if (state != 0)
-        error(0, "MYSQL: %s", mysql_error(pc->conn));
-
-    dbpool_conn_produce(pc);
-}
-
-static MYSQL_RES* mysql_select(const Octstr *sql)
-{
-    int	state;
-    MYSQL_RES *result = NULL;
-    DBPoolConn *pc;
-
-#if defined(DLR_TRACE)
-    debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
-#endif
-
-    pc = dbpool_conn_consume(pool);
-    if (pc == NULL) {
-        error(0, "MYSQL: Database pool got no connection! DB update failed!");
-        return NULL;
-    }
-
-    state = mysql_query(pc->conn, octstr_get_cstr(sql));
-    if (state != 0) {
-        error(0, "MYSQL: %s", mysql_error(pc->conn));
-    } else {
-        result = mysql_store_result(pc->conn);
-    }
-
-    dbpool_conn_produce(pc);
-
-    return result;
-}
-
 static void dlr_mysql_shutdown()
 {
     dbpool_destroy(pool);
@@ -142,74 +91,100 @@ static void dlr_mysql_shutdown()
 
 static void dlr_mysql_add(struct dlr_entry *entry)
 {
-    Octstr *sql;
-
-    sql = octstr_format("INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES "
-                        "('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%d');",
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(fields->field_ts),
-                        octstr_get_cstr(fields->field_src), octstr_get_cstr(fields->field_dst),
-                        octstr_get_cstr(fields->field_serv), octstr_get_cstr(fields->field_url),
-                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_boxc),
-                        octstr_get_cstr(fields->field_status),
-                        octstr_get_cstr(entry->smsc), octstr_get_cstr(entry->timestamp), octstr_get_cstr(entry->source),
-                        octstr_get_cstr(entry->destination), octstr_get_cstr(entry->service), octstr_get_cstr(entry->url),
-                        entry->mask, octstr_get_cstr(entry->boxc_id), 0);
+    Octstr *sql, *os_mask;
+    DBPoolConn *pconn;
+    List *binds = gwlist_create();
+    debug("dlr.mysql", 0, "adding DLR entry into database");
+
+    pconn = dbpool_conn_consume(pool);
+    /* just for sure */
+    if (pconn == NULL) {
+        dlr_entry_destroy(entry);
+        return;
+    }
 
+    sql = octstr_format("INSERT INTO %S (%S, %S, %S, %S, %S, %S, %S, %S, %S) VALUES "
+                        "(?, ?, ?, ?, ?, ?, ?, ?, 0)",
+                        fields->table, fields->field_smsc, fields->field_ts,
+                        fields->field_src, fields->field_dst, fields->field_serv,
+                        fields->field_url, fields->field_mask, fields->field_boxc,
+                        fields->field_status);
+    os_mask = octstr_format("%d", entry->mask);
+    gwlist_append(binds, entry->smsc);
+    gwlist_append(binds, entry->timestamp);
+    gwlist_append(binds, entry->source);
+    gwlist_append(binds, entry->destination);
+    gwlist_append(binds, entry->service);
+    gwlist_append(binds, entry->url);
+    gwlist_append(binds, os_mask);
+    gwlist_append(binds, entry->boxc_id);
 
-    mysql_update(sql);
+#if defined(DLR_TRACE)
+    debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
+#endif
+    if (dbpool_conn_update(pconn, sql, binds) == -1)
+        error(0, "DLR: MYSQL: Error while adding dlr entry for DST<%s>", octstr_get_cstr(entry->destination));
 
+    dbpool_conn_produce(pconn);
     octstr_destroy(sql);
+    gwlist_destroy(binds, NULL);
+    octstr_destroy(os_mask);
     dlr_entry_destroy(entry);
 }
 
 static struct dlr_entry* dlr_mysql_get(const Octstr *smsc, const Octstr *ts, const Octstr *dst)
 {
-    struct dlr_entry *res = NULL;
     Octstr *sql;
-    MYSQL_RES *result;
-    MYSQL_ROW row;
+    DBPoolConn *pconn;
+    List *result = NULL, *row;
+    struct dlr_entry *res = NULL;
+    List *binds = gwlist_create();
 
-    sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %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));
+    pconn = dbpool_conn_consume(pool);
+    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",
+                        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);
 
-    result = mysql_select(sql);
-    octstr_destroy(sql);
+    gwlist_append(binds, (Octstr *)smsc);
+    gwlist_append(binds, (Octstr *)ts);
 
-    if (result == NULL) {
-        return NULL;
-    }
-    if (mysql_num_rows(result) < 1) {
-        debug("dlr.mysql", 0, "no rows found");
-        mysql_free_result(result);
+#if defined(DLR_TRACE)
+    debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
+#endif
+
+    if (dbpool_conn_select(pconn, sql, binds, &result) != 0) {
+        octstr_destroy(sql);
+        dbpool_conn_produce(pconn);
         return NULL;
     }
-    row = mysql_fetch_row(result);
-    if (!row) {
-        debug("dlr.mysql", 0, "rows found but could not load them");
-        mysql_free_result(result);
-        return NULL;
+    octstr_destroy(sql);
+    gwlist_destroy(binds, NULL);
+    dbpool_conn_produce(pconn);
+
+#define LO2CSTR(r, i) octstr_get_cstr(gwlist_get(r, i))
+
+    if (gwlist_len(result) > 0) {
+        row = gwlist_extract_first(result);
+        res = dlr_entry_create();
+        gw_assert(res != NULL);
+        res->mask = atoi(LO2CSTR(row,0));
+        res->service = octstr_create(LO2CSTR(row, 1));
+        res->url = octstr_create(LO2CSTR(row,2));
+        res->source = octstr_create(LO2CSTR(row, 3));
+        res->destination = octstr_create(LO2CSTR(row, 4));
+        res->boxc_id = octstr_create(LO2CSTR(row, 5));
+        gwlist_destroy(row, octstr_destroy_item);
+        res->smsc = octstr_duplicate(smsc);
     }
+    gwlist_destroy(result, NULL);
 
-    debug("dlr.mysql", 0, "Found entry, row[0]=%s, row[1]=%s, row[2]=%s, row[3]=%s, row[4]=%s row[5]=%s",
-          row[0], row[1], row[2], (row[3] ? row[3] : "NULL"), (row[4] ? row[4] : "NULL"), (row[5] ? row[5] : "NULL"));
-
-    res = dlr_entry_create();
-    gw_assert(res != NULL);
-    res->mask = atoi(row[0]);
-    res->service = octstr_create(row[1]);
-    res->url = octstr_create(row[2]);
-    res->source = row[3] ? octstr_create(row[3]) : octstr_create("");
-    res->destination = row[4] ? octstr_create(row[4]) : octstr_create("");
-    res->boxc_id = row[5] ? octstr_create(row[5]) : octstr_create("");
-    res->smsc = octstr_duplicate(smsc);
-
-    mysql_free_result(result);
+#undef LO2CSTR
 
     return res;
 }
@@ -217,74 +192,125 @@ static struct dlr_entry* dlr_mysql_get(const Octstr *smsc, const Octstr *ts, con
 static void dlr_mysql_remove(const Octstr *smsc, const Octstr *ts, const Octstr *dst)
 {
     Octstr *sql;
+    DBPoolConn *pconn;
+    List *binds = gwlist_create();
 
     debug("dlr.mysql", 0, "removing DLR from database");
-    sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1;",
-                        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));
 
+    pconn = dbpool_conn_consume(pool);
+    /* just for sure */
+    if (pconn == NULL)
+        return;
 
-    mysql_update(sql);
+    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 defined(DLR_TRACE)
+    debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
+#endif
+
+    if (dbpool_conn_update(pconn, sql, binds) == -1)
+        error(0, "DLR: MYSQL: Error while removing dlr entry for DST<%s>", octstr_get_cstr(dst));
+
+    dbpool_conn_produce(pconn);
+    gwlist_destroy(binds, NULL);
     octstr_destroy(sql);
 }
 
 static void dlr_mysql_update(const Octstr *smsc, const Octstr *ts, const Octstr *dst, int status)
 {
-    Octstr *sql;
+    Octstr *sql, *os_status;
+    DBPoolConn *pconn;
+    List *binds = gwlist_create();
 
     debug("dlr.mysql", 0, "updating DLR status in database");
-    sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' LIMIT 1;",
-                        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));
 
-    mysql_update(sql);
+    pconn = dbpool_conn_consume(pool);
+    /* just for sure */
+    if (pconn == NULL)
+        return;
+
+    sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 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 defined(DLR_TRACE)
+    debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
+#endif
+    if (dbpool_conn_update(pconn, sql, binds) == -1)
+        error(0, "DLR: MYSQL: Error while updating dlr entry for DST<%s>", octstr_get_cstr(dst));
+
+    dbpool_conn_produce(pconn);
+    gwlist_destroy(binds, NULL);
+    octstr_destroy(os_status);
     octstr_destroy(sql);
 }
 
 
 static long dlr_mysql_messages(void)
 {
+    List *result, *row;
     Octstr *sql;
-    long res;
-    MYSQL_RES *result;
-    MYSQL_ROW row;
+    DBPoolConn *conn;
+    long msgs = -1;
 
-    sql = octstr_format("SELECT count(*) FROM %s;", octstr_get_cstr(fields->table));
+    conn = dbpool_conn_consume(pool);
+    if (conn == NULL)
+        return -1;
 
-    result = mysql_select(sql);
-    octstr_destroy(sql);
+    sql = octstr_format("SELECT count(*) FROM %S", fields->table);
+#if defined(DLR_TRACE)
+    debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
+#endif
 
-    if (result == NULL) {
+    if (dbpool_conn_select(conn, sql, NULL, &result) != 0) {
+        octstr_destroy(sql);
+        dbpool_conn_produce(conn);
         return -1;
     }
-    if (mysql_num_rows(result) < 1) {
-        debug("dlr.mysql", 0, "Could not get count of DLR table");
-        mysql_free_result(result);
-        return 0;
-    }
-    row = mysql_fetch_row(result);
-    if (row == NULL) {
-        debug("dlr.mysql", 0, "rows found but could not load them");
-        mysql_free_result(result);
-        return 0;
+    dbpool_conn_produce(conn);
+    octstr_destroy(sql);
+
+    if (gwlist_len(result) > 0) {
+        row = gwlist_extract_first(result);
+        msgs = strtol(octstr_get_cstr(gwlist_get(row,0)), NULL, 10);
+        gwlist_destroy(row, octstr_destroy_item);
     }
-    res = atol(row[0]);
-    mysql_free_result(result);
+    gwlist_destroy(result, NULL);
 
-    return res;
+    return msgs;
 }
 
 static void dlr_mysql_flush(void)
 {
     Octstr *sql;
+    DBPoolConn *pconn;
+    int rows;
 
-    sql = octstr_format("DELETE FROM %s;", octstr_get_cstr(fields->table));
+    pconn = dbpool_conn_consume(pool);
+    /* just for sure */
+    if (pconn == NULL)
+        return;
 
-    mysql_update(sql);
+    sql = octstr_format("DELETE FROM %S", fields->table);
+#if defined(DLR_TRACE)
+    debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
+#endif
+    rows = dbpool_conn_update(pconn, sql, NULL);
+    if (rows == -1)
+        error(0, "DLR: MYSQL: Error while flushing dlr entries from database");
+    else
+        debug("dlr.mysql", 0, "Flushing %d DLR entries from database", rows);
+    dbpool_conn_produce(pconn);
     octstr_destroy(sql);
 }
 
diff --git a/gwlib/dbpool_mysql.c b/gwlib/dbpool_mysql.c
index 7dd1a31..70fc057 100644
--- a/gwlib/dbpool_mysql.c
+++ b/gwlib/dbpool_mysql.c
@@ -135,6 +135,223 @@ static int mysql_check_conn(void *conn)
 }
 
 
+static int mysql_select(void *conn, const Octstr *sql, List *binds, List **res)
+{
+    MYSQL_STMT *stmt;
+    MYSQL_RES *result;
+    MYSQL_BIND *bind = NULL;
+    long i, binds_len;
+    int ret;
+
+    *res = NULL;
+
+    /* allocate statement handle */
+    stmt = mysql_stmt_init((MYSQL*) conn);
+    if (stmt == NULL) {
+        error(0, "MYSQL: mysql_stmt_init(), out of memory.");
+        return -1;
+    }
+    if (mysql_stmt_prepare(stmt, octstr_get_cstr(sql), octstr_len(sql))) {
+        error(0, "MYSQL: Unable to prepare statement: %s", mysql_stmt_error(stmt));
+        mysql_stmt_close(stmt);
+        return -1;
+    }
+    /* bind params if any */
+    binds_len = gwlist_len(binds);
+    if (binds_len > 0) {
+        bind = gw_malloc(sizeof(MYSQL_BIND) * binds_len);
+        memset(bind, 0, sizeof(MYSQL_BIND) * binds_len);
+        for (i = 0; i < binds_len; i++) {
+            Octstr *str = gwlist_get(binds, i);
+
+            bind[i].buffer_type = MYSQL_TYPE_STRING;
+            bind[i].buffer = octstr_get_cstr(str);
+            bind[i].buffer_length = octstr_len(str);
+        }
+        /* Bind the buffers */
+        if (mysql_stmt_bind_param(stmt, bind)) {
+          error(0, "MYSQL: mysql_stmt_bind_param() failed: `%s'", mysql_stmt_error(stmt));
+          gw_free(bind);
+          mysql_stmt_close(stmt);
+          return -1;
+        }
+    }
+
+    /* execute statement */
+    if (mysql_stmt_execute(stmt)) {
+        error(0, "MYSQL: mysql_stmt_execute() failed: `%s'", mysql_stmt_error(stmt));
+        gw_free(bind);
+        mysql_stmt_close(stmt);
+        return -1;
+    }
+    gw_free(bind);
+
+#define DESTROY_BIND(bind, binds_len)           \
+    do {                                        \
+        long i;                                 \
+        for (i = 0; i < binds_len; i++) {       \
+            gw_free(bind[i].buffer);            \
+            gw_free(bind[i].length);            \
+            gw_free(bind[i].is_null);           \
+        }                                       \
+        gw_free(bind);                          \
+    } while(0)
+
+    /* Fetch result set meta information */
+    result = mysql_stmt_result_metadata(stmt);
+    if (res == NULL) {
+        error(0, "MYSQL: mysql_stmt_result_metadata() failed: `%s'", mysql_stmt_error(stmt));
+        mysql_stmt_close(stmt);
+        return -1;
+    }
+    /* Get total columns in the query */
+    binds_len = mysql_num_fields(result);
+    bind = gw_malloc(sizeof(MYSQL_BIND) * binds_len);
+    memset(bind, 0, sizeof(MYSQL_BIND) * binds_len);
+    /* bind result bind */
+    for (i = 0; i < binds_len; i++) {
+        MYSQL_FIELD *field = mysql_fetch_field(result); /* retrieve field metadata */
+
+        debug("gwlib.dbpool_mysql", 0, "column=%s buffer_type=%d max_length=%ld length=%ld", field->name, field->type, field->max_length, field->length);
+
+        switch(field->type) {
+        case MYSQL_TYPE_TIME:
+        case MYSQL_TYPE_DATE:
+        case MYSQL_TYPE_DATETIME:
+        case MYSQL_TYPE_TIMESTAMP:
+            bind[i].buffer_type = field->type;
+            bind[i].buffer = (char*)gw_malloc(sizeof(MYSQL_TIME));
+            bind[i].is_null = gw_malloc(sizeof(my_bool));
+            bind[i].length = gw_malloc(sizeof(unsigned long));
+            break;
+        default:
+            bind[i].buffer_type = MYSQL_TYPE_STRING;
+            bind[i].buffer = gw_malloc(field->length);
+            bind[i].buffer_length = field->length;
+            bind[i].length = gw_malloc(sizeof(unsigned long));
+            bind[i].is_null = gw_malloc(sizeof(my_bool));
+            break;
+        }
+    }
+    mysql_free_result(result);
+
+    if (mysql_stmt_bind_result(stmt, bind)) {
+        error(0, "MYSQL: mysql_stmt_bind_result() failed: `%s'", mysql_stmt_error(stmt));
+        DESTROY_BIND(bind, binds_len);
+        mysql_stmt_close(stmt);
+        return -1;
+    }
+
+    *res = gwlist_create();
+    while(!(ret = mysql_stmt_fetch(stmt))) {
+        List *row = gwlist_create();
+        for (i = 0; i < binds_len; i++) {
+            Octstr *str = NULL;
+            MYSQL_TIME *ts;
+
+            if (*bind[i].is_null) {
+                gwlist_produce(row, octstr_create(""));
+                continue;
+            }
+
+            switch(bind[i].buffer_type) {
+            case MYSQL_TYPE_DATE:
+                ts = bind[i].buffer;
+                str = octstr_format("%04d-%02d-%02d", ts->year, ts->month, ts->day);
+                break;
+            case MYSQL_TYPE_TIME:
+            case MYSQL_TYPE_DATETIME:
+            case MYSQL_TYPE_TIMESTAMP:
+                ts = bind[i].buffer;
+                str = octstr_format("%04d-%02d-%02d %02d:%02d:%02d", ts->year, ts->month, ts->day, ts->hour, ts->minute, ts->second);
+                break;
+            default:
+                if (bind[i].length == 0)
+                    str= octstr_create("");
+                else
+                    str = octstr_create_from_data(bind[i].buffer, *bind[i].length);
+                break;
+            }
+            gwlist_produce(row, str);
+        }
+        gwlist_produce(*res, row);
+    }
+    DESTROY_BIND(bind, binds_len);
+#undef DESTROY_BIND
+
+    /* any errors by fetch? */
+    if (ret != MYSQL_NO_DATA) {
+        List *row;
+        error(0, "MYSQL: mysql_stmt_bind_result() failed: `%s'", mysql_stmt_error(stmt));
+        mysql_stmt_close(stmt);
+        while((row = gwlist_extract_first(*res)) != NULL)
+            gwlist_destroy(row, octstr_destroy_item);
+        gwlist_destroy(*res, NULL);
+        *res = NULL;
+        return -1;
+    }
+
+    mysql_stmt_close(stmt);
+
+    return 0;
+}
+
+
+static int mysql_update(void *conn, const Octstr *sql, List *binds)
+{
+    MYSQL_STMT *stmt;
+    MYSQL_BIND *bind = NULL;
+    long i, binds_len;
+    int ret;
+
+    /* allocate statement handle */
+    stmt = mysql_stmt_init((MYSQL*) conn);
+    if (stmt == NULL) {
+        error(0, "MYSQL: mysql_stmt_init(), out of memory.");
+        return -1;
+    }
+    if (mysql_stmt_prepare(stmt, octstr_get_cstr(sql), octstr_len(sql))) {
+        error(0, "MYSQL: Unable to prepare statement: %s", mysql_stmt_error(stmt));
+        mysql_stmt_close(stmt);
+        return -1;
+    }
+    /* bind params if any */
+    binds_len = gwlist_len(binds);
+    if (binds_len > 0) {
+        bind = gw_malloc(sizeof(MYSQL_BIND) * binds_len);
+        memset(bind, 0, sizeof(MYSQL_BIND) * binds_len);
+        for (i = 0; i < binds_len; i++) {
+            Octstr *str = gwlist_get(binds, i);
+
+            bind[i].buffer_type = MYSQL_TYPE_STRING;
+            bind[i].buffer = octstr_get_cstr(str);
+            bind[i].buffer_length = octstr_len(str);
+        }
+        /* Bind the buffers */
+        if (mysql_stmt_bind_param(stmt, bind)) {
+          error(0, "MYSQL: mysql_stmt_bind_param() failed: `%s'", mysql_stmt_error(stmt));
+          gw_free(bind);
+          mysql_stmt_close(stmt);
+          return -1;
+        }
+    }
+
+    /* execute statement */
+    if (mysql_stmt_execute(stmt)) {
+        error(0, "MYSQL: mysql_stmt_execute() failed: `%s'", mysql_stmt_error(stmt));
+        gw_free(bind);
+        mysql_stmt_close(stmt);
+        return -1;
+    }
+    gw_free(bind);
+
+    ret = mysql_stmt_affected_rows(stmt);
+    mysql_stmt_close(stmt);
+
+    return ret;
+}
+
+
 static void mysql_conf_destroy(DBConf *db_conf)
 {
     MySQLConf *conf = db_conf->mysql;
@@ -153,6 +370,8 @@ static struct db_ops mysql_ops = {
     .open = mysql_open_conn,
     .close = mysql_close_conn,
     .check = mysql_check_conn,
+    .select = mysql_select,
+    .update = mysql_update,
     .conf_destroy = mysql_conf_destroy
 };
 
diff --git a/test/test_dbpool.c b/test/test_dbpool.c
index d032852..d390d72 100644
--- a/test/test_dbpool.c
+++ b/test/test_dbpool.c
@@ -58,7 +58,7 @@
  * test_dbpool.c - test DBPool objects
  *
  * Stipe Tolj <stolj@wapme.de>
- * Alexander Malysh <a.malysh@centrium.de>
+ * Alexander Malysh <amalysh@kannel.org>
  */
              
 #include "gwlib/gwlib.h"
@@ -104,40 +104,42 @@ static enum db_type database_type = DBPOOL_MYSQL;
 static void (*client_thread)(void*) = NULL;
 
 #ifdef HAVE_MYSQL
-#include <mysql.h>
 
 static void mysql_client_thread(void *arg)
 {
     unsigned long i, succeeded, failed;
     DBPool *pool = arg;
+    List *result;
+    DBPoolConn *pconn;
 
     succeeded = failed = 0;
 
     info(0,"Client thread started with %ld queries to perform on pool", queries);
 
-    /* perform random queries on the pool */
     for (i = 1; i <= queries; i++) {
-        DBPoolConn *pconn;
-        int state;
-        MYSQL_RES *result;
-
-        /* provide us with a connection from the pool */
         pconn = dbpool_conn_consume(pool);
-        debug("",0,"Query %ld/%ld: mysql thread id %ld obj at %p",
-              i, queries, mysql_thread_id(pconn->conn), (void*) pconn->conn);
 
-        state = mysql_query(pconn->conn, octstr_get_cstr(sql));
-        if (state != 0) {
-            error(0, "MYSQL: %s", mysql_error(pconn->conn));
-            failed++;
-        } else {
+        if (pconn == NULL)
+            continue;
+#if 1 /* selects */
+        if (dbpool_conn_select(pconn, sql, NULL, &result) == 0) {
+            long i,j;
+            for (i=0; i < gwlist_len(result); i++) {
+                List *row = gwlist_get(result, i);
+                for (j=0; j < gwlist_len(row); j++)
+                    debug("", 0, "col = %ld   value = '%s'", j, octstr_get_cstr(gwlist_get(row,j)));
+                gwlist_destroy(row, octstr_destroy_item);
+            }
             succeeded++;
+        } else {
+            failed++;
         }
-        result = mysql_store_result(pconn->conn);
-        mysql_free_result(result);
-
-        /* return the connection to the pool */
+        gwlist_destroy(result, NULL);
         dbpool_conn_produce(pconn);
+#else /* only updates */
+        debug("", 0, "rows processed = %d ", dbpool_conn_update(pconn, sql, NULL));
+        dbpool_conn_produce(pconn);
+#endif
     }
     info(0, "This thread: %ld succeeded, %ld failed.", succeeded, failed);
 }
@@ -152,6 +154,7 @@ static DBConf *mysql_create_conf(Octstr *user, Octstr *pass, Octstr *db, Octstr
     conf->mysql->password = octstr_duplicate(pass);
     conf->mysql->database = octstr_duplicate(db);
     conf->mysql->host = octstr_duplicate(host);
+    conf->mysql->port = 3306;
 
     return conf;
 }
@@ -504,6 +507,10 @@ int main(int argc, char **argv)
           (host ? octstr_get_cstr(host) : octstr_get_cstr(db)), pool_size, octstr_get_cstr(db_type));
     pool = dbpool_create(database_type, conf, pool_size);
     debug("",0,"Connections within pool: %ld", dbpool_conn_count(pool));
+    if (dbpool_conn_count(pool) == 0) {
+        panic(0, "Unable to start without DBConns...");
+        exit(1);
+    }
 
     for (i = 0; i < num_threads; ++i) {
         if (gwthread_create(inc_dec_thread, pool) == -1)
