diff --git a/src/modules/Mysql/acconfig.h b/src/modules/Mysql/acconfig.h
index 2b1b313e57912d547db69816ca08324ad8d2d3db..6515bb04745ec0a9490b5add01c6ff2987df6471 100644
--- a/src/modules/Mysql/acconfig.h
+++ b/src/modules/Mysql/acconfig.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: acconfig.h,v 1.9 2002/10/11 01:39:47 nilsson Exp $
+|| $Id: acconfig.h,v 1.10 2003/02/07 11:28:30 agehall Exp $
 */
 
 /*
@@ -20,6 +20,9 @@
 /* Define if you have mySQL */
 #undef HAVE_MYSQL
 
+/* Define if you have SSL support in MySQL */
+#undef HAVE_MYSQL_SSL
+
 /* Return type of mysql_fetch_lengths(). Usually unsigned long. */
 #undef FETCH_LENGTHS_TYPE
 
diff --git a/src/modules/Mysql/configure.in b/src/modules/Mysql/configure.in
index 6feb8eac0ec653f49c0ab269ce4657d669f98e41..f3b2ee1ea955cd69c03811d3ea0a62c2793082db 100644
--- a/src/modules/Mysql/configure.in
+++ b/src/modules/Mysql/configure.in
@@ -1,5 +1,5 @@
 #
-# $Id: configure.in,v 1.32 2002/07/16 19:46:28 per Exp $
+# $Id: configure.in,v 1.33 2003/02/07 11:28:30 agehall Exp $
 #
 # Configure script for the mysql-module
 #
@@ -307,6 +307,8 @@ fi
     PIKE_CHECK_MYSQL_FUNC(mysql_fetch_lengths)
     PIKE_CHECK_MYSQL_FUNC(mysql_options)
 
+    AC_CHECK_LIB(mysqlclient, mysql_ssl_set, [ AC_DEFINE(HAVE_MYSQL_SSL) ])
+
     # Note: The following two are variables:
     PIKE_CHECK_MYSQL_FUNC(mysql_port)
     PIKE_CHECK_MYSQL_FUNC(mysql_unix_port)
diff --git a/src/modules/Mysql/mysql.c b/src/modules/Mysql/mysql.c
index 581183326b6bbb3ca0d8ca5a960521b1f593deca..70b244f5d8469253e110d37acfea7f80941a7955 100644
--- a/src/modules/Mysql/mysql.c
+++ b/src/modules/Mysql/mysql.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: mysql.c,v 1.63 2002/11/26 21:31:14 grubba Exp $
+|| $Id: mysql.c,v 1.64 2003/02/07 11:28:30 agehall Exp $
 */
 
 /*
@@ -73,6 +73,7 @@
 #include "operators.h"
 #include "builtin_functions.h"
 #include "fd_control.h"
+#include "mapping.h"
 
 /* System includes */
 #ifdef HAVE_STRING_H
@@ -82,6 +83,9 @@
 #include <memory.h>
 #endif
 
+#ifdef HAVE_MYSQL_SSL
+#include <openssl/ssl.h>
+#endif
 
 #define sp Pike_sp
 
@@ -94,7 +98,7 @@
  * Globals
  */
 
-RCSID("$Id: mysql.c,v 1.63 2002/11/26 21:31:14 grubba Exp $");
+RCSID("$Id: mysql.c,v 1.64 2003/02/07 11:28:30 agehall Exp $");
 
 /*! @module Mysql
  *!
@@ -212,13 +216,63 @@ static void exit_mysql_struct(struct object *o)
 
   DESTROY_MYSQL_LOCK();
 }
+void pike_mysql_set_ssl(struct mapping *options) {
+
+#ifdef HAVE_MYSQL_SSL
+    char *ssl_key = NULL;
+    char *ssl_cert = NULL;
+    char *ssl_ca = NULL;
+    char *ssl_capath = NULL;
+    char *ssl_cipher = NULL;
+    struct svalue *val = NULL;
+
+    if ((val = simple_mapping_string_lookup(options, "ssl-key")) &&
+	(val->type == T_STRING) &&
+	(!val->u.string->size_shift))
+      ssl_key = val->u.string->str;
+
+    if ((val = simple_mapping_string_lookup(options, "ssl-cert")) &&
+	(val->type == T_STRING) &&
+	(!val->u.string->size_shift))
+      ssl_cert = val->u.string->str;
+
+    if ((val = simple_mapping_string_lookup(options, "ssl_ca")) &&
+	(val->type == T_STRING) &&
+	(!val->u.string->size_shift))
+      ssl_ca = val->u.string->str;
+
+    if ((val = simple_mapping_string_lookup(options, "ssl-capath")) &&
+	(val->type == T_STRING) &&
+	(!val->u.string->size_shift))
+      ssl_capath = val->u.string->str;
+
+    if ((val = simple_mapping_string_lookup(options, "ssl-cipher")) &&
+	(val->type == T_STRING) &&
+	(!val->u.string->size_shift))
+      ssl_cipher = val->u.string->str;
+
+    if (ssl_key || ssl_cert || ssl_ca || ssl_capath || ssl_cipher)
+      mysql_ssl_set(PIKE_MYSQL->mysql,
+		    ssl_key,
+		    ssl_cert,
+		    ssl_ca,
+		    ssl_capath,
+		    ssl_cipher);
+#endif /* HAVE_MYSQL_SSL */
+}
 
 static void pike_mysql_set_options(struct mapping *options)
 {
   struct svalue *val;
 
+  if ((val = simple_mapping_string_lookup(options, "mysql_group")) &&
+      (val->type == T_STRING) && (!val->u.string->size_shift)) {
+    mysql_options(PIKE_MYSQL->mysql, MYSQL_READ_DEFAULT_GROUP,
+		  val->u.string->str);
+  }
 #ifdef HAVE_MYSQL_OPTIONS
 #ifdef MYSQL_READ_DEFAULT_FILE
+  printf("\n\n\nREADING MYSQL DEFAULTS FILE\n\n\n");
   if ((val = simple_mapping_string_lookup(options, "mysql_config_file")) &&
       (val->type == T_STRING) && (!val->u.string->size_shift)) {
     mysql_options(PIKE_MYSQL->mysql, MYSQL_READ_DEFAULT_FILE,
@@ -226,11 +280,6 @@ static void pike_mysql_set_options(struct mapping *options)
   }
 #endif /* MYSQL_READ_DEFAULT_FILE */
 #ifdef MYSQL_READ_DEFAULT_GROUP
-  if ((val = simple_mapping_string_lookup(options, "mysql_group")) &&
-      (val->type == T_STRING) && (!val->u.string->size_shift)) {
-    mysql_options(PIKE_MYSQL->mysql, MYSQL_READ_DEFAULT_GROUP,
-		  val->u.string->str);
-  }
 #endif /* MYSQL_READ_DEFAULT_GROUP */
 #ifdef MYSQL_INIT_COMMAND
   if ((val = simple_mapping_string_lookup(options, "init_command")) &&
@@ -302,6 +351,8 @@ static void pike_mysql_reconnect(void)
   char *saved_unix_port = NULL;
   unsigned int port = 0;
   unsigned int saved_port = 0;
+  unsigned int options = 0;
+  struct svalue *val;
 
   if (PIKE_MYSQL->host) {
     hostptr = strdup(PIKE_MYSQL->host->str);
@@ -355,8 +406,13 @@ static void pike_mysql_reconnect(void)
 #endif /* HAVE_MYSQL_UNIX_PORT */
 
 #ifdef HAVE_MYSQL_REAL_CONNECT
+  if ((val = simple_mapping_string_lookup((struct mapping *)PIKE_MYSQL->options, "connect_options")) &&
+      (val->type == T_INT) && (val->u.integer)) {
+    options = (unsigned int)val->u.integer;
+  }
+
   socket = mysql_real_connect(mysql, host, user, password,
-                              NULL, port, portptr, 0);
+                              NULL, port, portptr, options);
 #else
   socket = mysql_connect(mysql, host, user, password);
 #endif /* HAVE_MYSQL_REAL_CONNECT */
@@ -471,11 +527,35 @@ static void pike_mysql_reconnect(void)
  *!
  *!     @member string "mysql_charset_name"
  *!       Change charset name.
+ *!
+ *!     @member string "ssl-key"
+ *!       Path to SSL-key for use in SSL-communication.
+ *!
+ *!     @member string "ssl-cert"
+ *!       Path to SSL-cert for use in SSL-communication.
+ *!
+ *!     @member string "ssl-ca"
+ *!       Path to SSL-CA for use in SSL-communication.
+ *!
+ *!     @member string "ssl-capath"
+ *!       Path to SSL-CAPATH for use in SSL-communication.
+ *!
+ *!     @member int "connect_options"
+ *!       Options used when connecting to the server. See mysql documentation
+ *!       for more information.
+ *!
  *!   @endmapping
  *!
  *! @note
  *!   Some options may not be implemented. Unimplemented options are
  *!   silently ignored.
+ *!
+ *!   To use SSL-connections, set the SSL-parameters correctly. They corespond to
+ *!   the parameters given to the mysql-client with the same name so make sure that
+ *!   the mysql-client works with SSL and set these parameters to the same values and
+ *!   everything should work.
+ *!   If SSL-options are loaded from a config-file, one may set the connect_options to
+ *!   include CLIENT_SSL.
  */
 static void f_create(INT32 args)
 {
@@ -521,6 +601,7 @@ static void f_create(INT32 args)
 	    if (sp[4-args].type != T_MAPPING) {
 	      Pike_error("Bad argument 5 to mysql()\n");
 	    }
+	    add_ref(PIKE_MYSQL->options = sp[4-args].u.mapping);
 	    pike_mysql_set_options(sp[4-args].u.mapping);
 	  }
 	}
@@ -530,6 +611,8 @@ static void f_create(INT32 args)
 
   pop_n_elems(args);
 
+  pike_mysql_set_ssl(PIKE_MYSQL->options);
+
   pike_mysql_reconnect();
 }
 
@@ -563,9 +646,18 @@ static void mysql__sprintf(INT32 args)
       info = mysql_get_host_info(socket);
       MYSQL_DISALLOW();
 
-      push_text("mysql(/* %s */)");
+      push_text("mysql(/* %s %s*/)");
       push_text(info);
-      f_sprintf(2);
+#ifdef HAVE_MYSQL_SSL
+      if (PIKE_MYSQL->mysql->options.use_ssl) {
+	push_text("using SSL");
+      }
+      else push_text("");
+#else
+      push_text("");
+#endif /* HAVE_MYSQL_SSL */
+
+      f_sprintf(3);
 
       res = Pike_sp[-1].u.string;
       Pike_sp--;
@@ -1677,6 +1769,17 @@ PIKE_MODULE_INIT
   /* function(void:int) */
   ADD_FUNCTION("binary_data", f_binary_data,tFunc(tVoid,tInt), ID_PUBLIC);
 
+  add_integer_constant( "CLIENT_COMPRESS", CLIENT_COMPRESS, 0);
+  add_integer_constant( "CLIENT_FOUND_ROWS", CLIENT_FOUND_ROWS, 0);
+  add_integer_constant( "CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, 0);
+  add_integer_constant( "CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, 0);
+  add_integer_constant( "CLIENT_NO_SCHEMA", CLIENT_NO_SCHEMA, 0);
+  add_integer_constant( "CLIENT_ODBC", CLIENT_ODBC, 0);
+
+#ifdef HAVE_MYSQL_SSL
+  add_integer_constant( "CLIENT_SSL", CLIENT_SSL, 0);
+#endif
+
   set_init_callback(init_mysql_struct);
   set_exit_callback(exit_mysql_struct);
 
diff --git a/src/modules/Mysql/precompiled_mysql.h b/src/modules/Mysql/precompiled_mysql.h
index 6a8c11f00f076667f71e649858af27bf9acec337..9964c6e19c0ec2bfdcacd97e307b29c17b578fae 100644
--- a/src/modules/Mysql/precompiled_mysql.h
+++ b/src/modules/Mysql/precompiled_mysql.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: precompiled_mysql.h,v 1.15 2002/10/11 01:39:47 nilsson Exp $
+|| $Id: precompiled_mysql.h,v 1.16 2003/02/07 11:28:30 agehall Exp $
 */
 
 /*
@@ -58,6 +58,7 @@ struct precompiled_mysql {
 
   MYSQL		*mysql, *socket;
   struct pike_string	*host, *database, *user, *password;	/* Reconnect */
+  struct mapping   *options;
 };
 
 struct precompiled_mysql_result {