1 diff --git a/src/core/servers.c b/src/core/servers.c
 
   2 index 30fc684..83733d0 100644
 
   3 --- a/src/core/servers.c
 
   4 +++ b/src/core/servers.c
 
   5 @@ -783,3 +783,53 @@ void servers_deinit(void)
 
   6         module_uniq_destroy("SERVER");
 
   7         module_uniq_destroy("SERVER CONNECT");
 
  10 +int server_connection_set_key(SERVER_REC *server, char *key, char *value)
 
  12 +       if (strcmp(key, "password") == 0) {
 
  13 +               g_free_not_null(server->connrec->password);
 
  14 +               server->connrec->password = g_strdup(value);
 
  16 +       if (strcmp(key, "nick") == 0) {
 
  17 +               g_free_not_null(server->connrec->nick);
 
  18 +               server->connrec->nick = g_strdup(value);
 
  20 +       else if (strcmp(key, "username") == 0) {
 
  21 +               g_free_not_null(server->connrec->username);
 
  22 +               server->connrec->username = g_strdup(value);
 
  24 +       else if (strcmp(key, "realname") == 0) {
 
  25 +               g_free_not_null(server->connrec->realname);
 
  26 +               server->connrec->realname = g_strdup(value);
 
  28 +       else if (strcmp(key, "tls_cert") == 0) {
 
  29 +               g_free_not_null(server->connrec->tls_cert);
 
  30 +               server->connrec->tls_cert = g_strdup(value);
 
  32 +       else if (strcmp(key, "tls_pkey") == 0) {
 
  33 +               g_free_not_null(server->connrec->tls_pkey);
 
  34 +               server->connrec->tls_pkey = g_strdup(value);
 
  36 +       else if (strcmp(key, "tls_cafile") == 0) {
 
  37 +               g_free_not_null(server->connrec->tls_cafile);
 
  38 +               server->connrec->tls_cafile = g_strdup(value);
 
  40 +       else if (strcmp(key, "tls_capath") == 0) {
 
  41 +               g_free_not_null(server->connrec->tls_capath);
 
  42 +               server->connrec->tls_capath = g_strdup(value);
 
  44 +       else if (strcmp(key, "use_tls") == 0) {
 
  45 +               server->connrec->use_tls = (strcmp(value, "no") != 0);
 
  47 +       else if (strcmp(key, "tls_verify") == 0) {
 
  48 +               server->connrec->tls_verify = (strcmp(value, "no") != 0);
 
  50 +       else if (strcmp(key, "resolve_prefer_ipv6") == 0) {
 
  51 +               server->connrec->family = (strcmp(value, "no") != 0);
 
  59 diff --git i/src/core/servers.h w/src/core/servers.h
 
  60 index d52603e..05fb2e5 100644
 
  61 --- i/src/core/servers.h
 
  62 +++ w/src/core/servers.h
 
  63 @@ -66,6 +66,9 @@ void server_connect_failed(SERVER_REC *server, const char *msg);
 
  64  /* Change your nick */
 
  65  void server_change_nick(SERVER_REC *server, const char *nick);
 
  67 +/* Set a key via passwd.pl */
 
  68 +int server_connection_set_key(SERVER_REC *server, char *key, char *value);
 
  70  /* Push meta data onto the server stash */
 
  71  void server_meta_stash(SERVER_REC *server, const char *meta_key, const char *meta_value);
 
  72  /* Get a value from the stash */
 
  73 diff --git a/src/perl/common/Server.xs b/src/perl/common/Server.xs
 
  74 index 60878a6..1b6d6d1 100644
 
  75 --- a/src/perl/common/Server.xs
 
  76 +++ b/src/perl/common/Server.xs
 
  77 @@ -103,6 +103,12 @@ send_message(server, target, msg, target_type)
 
  79         server->send_message(server, target, msg, target_type);
 
  82 +server_connection_set_key(server, key, value)
 
  83 +       Irssi::Server server
 
  88  server_meta_stash(server, meta_key, meta_value)