diff --git a/src/core/servers.c b/src/core/servers.c
index 30fc684..83733d0 100644
--- a/src/core/servers.c
+++ b/src/core/servers.c
@@ -783,3 +783,53 @@ void servers_deinit(void)
 	module_uniq_destroy("SERVER");
 	module_uniq_destroy("SERVER CONNECT");
 }
+
+int server_connection_set_key(SERVER_REC *server, char *key, char *value)
+{
+	if (strcmp(key, "password") == 0) {
+		g_free_not_null(server->connrec->password);
+		server->connrec->password = g_strdup(value);
+	}
+	if (strcmp(key, "nick") == 0) {
+		g_free_not_null(server->connrec->nick);
+		server->connrec->nick = g_strdup(value);
+	}
+	else if (strcmp(key, "username") == 0) {
+		g_free_not_null(server->connrec->username);
+		server->connrec->username = g_strdup(value);
+	}
+	else if (strcmp(key, "realname") == 0) {
+		g_free_not_null(server->connrec->realname);
+		server->connrec->realname = g_strdup(value);
+	}
+	else if (strcmp(key, "tls_cert") == 0) {
+		g_free_not_null(server->connrec->tls_cert);
+		server->connrec->tls_cert = g_strdup(value);
+	}
+	else if (strcmp(key, "tls_pkey") == 0) {
+		g_free_not_null(server->connrec->tls_pkey);
+		server->connrec->tls_pkey = g_strdup(value);
+	}
+	else if (strcmp(key, "tls_cafile") == 0) {
+		g_free_not_null(server->connrec->tls_cafile);
+		server->connrec->tls_cafile = g_strdup(value);
+	}
+	else if (strcmp(key, "tls_capath") == 0) {
+		g_free_not_null(server->connrec->tls_capath);
+		server->connrec->tls_capath = g_strdup(value);
+	}
+	else if (strcmp(key, "use_tls") == 0) {
+		server->connrec->use_tls = (strcmp(value, "no") != 0);
+	}
+	else if (strcmp(key, "tls_verify") == 0) {
+		server->connrec->tls_verify = (strcmp(value, "no") != 0);
+	}
+	else if (strcmp(key, "resolve_prefer_ipv6") == 0) {
+		server->connrec->family = (strcmp(value, "no") != 0);
+	}
+	else {
+		return FALSE;
+	}
+	return TRUE;
+}
+
diff --git a/src/perl/common/Server.xs b/src/perl/common/Server.xs
index 60878a6..1b6d6d1 100644
--- a/src/perl/common/Server.xs
+++ b/src/perl/common/Server.xs
@@ -103,6 +103,12 @@ send_message(server, target, msg, target_type)
 CODE:
 	server->send_message(server, target, msg, target_type);
 
+int
+server_connection_set_key(server, key, value)
+	Irssi::Server server
+	char *key
+	char *value
+
 void
 server_meta_stash(server, meta_key, meta_value)
 	Irssi::Server server