diff --git a/src/configure.in b/src/configure.in
index d73bbe1..0de1eb2 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -165,6 +165,22 @@ dnl Set recommended default flags for compiler and linker
 dnl --------------------------------------------------------------------
 CXXFLAGS="${CXXFLAGS} -Wall -pedantic -Wno-long-long"
 
+dnl --------------------------------------------------------------------
+dnl Detect ABI suffix mode: add or not
+dnl --------------------------------------------------------------------
+
+AC_ARG_ENABLE([abi-suffix],
+    AC_HELP_STRING([--enable-abi-suffix=@<:@yes|no@:>@],
+        [enable abi suffix @<:@default=no@:>@]
+    ),
+	[
+    case "${enableval}" in
+		yes) SOCI_ABI_SUFFIX="yes" ;;
+		no)  SOCI_ABI_SUFFIX="no" ;;
+		*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug);;
+	esac
+    ],
+	[SOCI_ABI_SUFFIX="no"])
 
 dnl --------------------------------------------------------------------
 dnl Detect compilation mode: debug or release
@@ -239,14 +255,27 @@ else
     SOCI_LIBRARY_SUFFIX="${SOCI_LIBRARY_TOOLSET}-${SOCI_LIBRARY_RUNTIME}-${SOCI_LIBRARY_VERSION}"
 fi
 
-SOCI_CORE_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_core-${SOCI_LIBRARY_SUFFIX}"
-SOCI_EMPTY_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_empty-${SOCI_LIBRARY_SUFFIX}"
-SOCI_FIREBIRD_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_firebird-${SOCI_LIBRARY_SUFFIX}"
-SOCI_MYSQL_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_mysql-${SOCI_LIBRARY_SUFFIX}"
-SOCI_ORACLE_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_oracle-${SOCI_LIBRARY_SUFFIX}"
-SOCI_ODBC_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_odbc-${SOCI_LIBRARY_SUFFIX}"
-SOCI_POSTGRESQL_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_postgresql-${SOCI_LIBRARY_SUFFIX}"
-SOCI_SQLITE3_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_sqlite3-${SOCI_LIBRARY_SUFFIX}"
+if test "$SOCI_ABI_SUFFIX" = "yes" ; then
+    SOCI_CORE_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_core-${SOCI_LIBRARY_SUFFIX}"
+    SOCI_EMPTY_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_empty-${SOCI_LIBRARY_SUFFIX}"
+    SOCI_FIREBIRD_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_firebird-${SOCI_LIBRARY_SUFFIX}"
+    SOCI_MYSQL_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_mysql-${SOCI_LIBRARY_SUFFIX}"
+    SOCI_ORACLE_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_oracle-${SOCI_LIBRARY_SUFFIX}"
+    SOCI_ODBC_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_odbc-${SOCI_LIBRARY_SUFFIX}"
+    SOCI_POSTGRESQL_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_postgresql-${SOCI_LIBRARY_SUFFIX}"
+    SOCI_SQLITE3_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_sqlite3-${SOCI_LIBRARY_SUFFIX}"
+    CXXFLAGS="-DSOCI_BACKEND_SUFFIX=\\\"-${SOCI_LIBRARY_SUFFIX}\\\" -DSOCI_BACKEND_PREFIX=\\\"${SOCI_LIBRARY_PREFIX}_\\\" ${CXXFLAGS}"
+else
+    SOCI_CORE_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_core"
+    SOCI_EMPTY_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_empty"
+    SOCI_FIREBIRD_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_firebird"
+    SOCI_MYSQL_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_mysql"
+    SOCI_ORACLE_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_oracle"
+    SOCI_ODBC_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_odbc"
+    SOCI_POSTGRESQL_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_postgresql"
+    SOCI_SQLITE3_LIBRARY_NAME="${SOCI_LIBRARY_PREFIX}_sqlite3"
+    CXXFLAGS="-DSOCI_BACKEND_SUFFIX=\\\"\\\" -DSOCI_BACKEND_PREFIX=\\\"${SOCI_LIBRARY_PREFIX}_\\\" ${CXXFLAGS}"
+fi
 
 AC_SUBST([SOCI_CORE_LIBRARY_NAME])
 AC_SUBST([SOCI_EMPTY_LIBRARY_NAME])
diff --git a/src/core/backend-loader.cpp b/src/core/backend-loader.cpp
index 2855f08..38c6e2d 100644
--- a/src/core/backend-loader.cpp
+++ b/src/core/backend-loader.cpp
@@ -11,6 +11,7 @@
 #include <map>
 #include <cassert>
 #include <cstdlib>
+#include <algorithm>
 #ifndef _MSC_VER
 #include <stdint.h>
 #endif
@@ -32,7 +33,8 @@ typedef HMODULE soci_handler_t;
 #define DLOPEN(x) LoadLibrary(x)
 #define DLCLOSE(x) FreeLibrary(x)
 #define DLSYM(x, y) GetProcAddress(x, y)
-#define LIBNAME(x) ("libsoci_" + x + ".dll")
+#define LIBNAME(x) ("lib" SOCI_BACKEND_PREFIX + x + SOCI_BACKEND_SUFFIX ".dll")
+
 
 #else
 
@@ -49,8 +51,23 @@ typedef void * soci_handler_t;
 #define DLOPEN(x) dlopen(x, RTLD_LAZY)
 #define DLCLOSE(x) dlclose(x)
 #define DLSYM(x, y) dlsym(x, y)
-#define LIBNAME(x) ("libsoci_" + x + ".so")
 
+#ifndef __CYGWIN__
+# define LIBNAME(x) ("lib" SOCI_BACKEND_PREFIX + x + SOCI_BACKEND_SUFFIX ".so")
+#else
+  namespace {
+    std::string LIBNAME(std::string const &name) 
+    {
+      std::string dll_name = "cyg" SOCI_BACKEND_PREFIX + name + SOCI_BACKEND_SUFFIX;
+      std::string version = VERSION;
+      std::replace(version.begin(),version.end(),'.','-');
+      dll_name+="-";
+      dll_name+=version;
+      dll_name+=".dll";
+      return dll_name;
+    }
+  }
+#endif // CYGWIN
 #endif // _WIN32
 
 
@@ -76,16 +93,12 @@ std::vector<std::string> get_default_paths()
     std::vector<std::string> paths;
 
     char const * const penv = std::getenv("SOCI_BACKENDS_PATH");
-    if (penv == NULL)
-    {
-        paths.push_back(".");
-        return paths;
-    }
-
-    std::string const env = penv;
+    std::string const env = penv ? penv : "";
     if (env.empty())
     {
-        paths.push_back(".");
+        // First check local paths and then system gloabl paths
+	paths.push_back("./");
+	paths.push_back("");
         return paths;
     }
 
@@ -100,14 +113,14 @@ std::vector<std::string> get_default_paths()
         else if (found != std::string::npos)
         {
             std::string const path = env.substr(searchFrom, found - searchFrom);
-            paths.push_back(path);
+            paths.push_back(path + "/");
 
             searchFrom = found + 1;
         }
         else // found == npos
         {
             std::string const path = env.substr(searchFrom);
-            paths.push_back(path);
+            paths.push_back(path + "/");
 
             searchFrom = env.size();
         }
@@ -180,7 +193,7 @@ void do_register_backend(
         // try all search paths
         for (std::size_t i = 0; i != search_paths_.size(); ++i)
         {
-            std::string const fullFileName = search_paths_[i] + "/" + LIBNAME(name);
+            std::string const fullFileName = search_paths_[i] + LIBNAME(name);
             h = DLOPEN(fullFileName.c_str());
             if (h != NULL)
             {
