diff --git a/.envrc b/.envrc
index 3381671..ec1a23e 100644
--- a/.envrc
+++ b/.envrc
@@ -34,27 +34,19 @@ use_guix()
     fi
 
     # Miscellaneous packages.
-    PACKAGES_MAINTENANCE=(
-        direnv
-        git
-        git:send-email
-        gnupg
-        guile-colorized
-        guile-readline
-        less
-        ncurses
-        openssh
-        xdot
+    ENVIRONMENTS=(
+        weechat
     )
 
     # Environment packages.
-    PACKAGES=(help2man guile-sqlite3 guile-gcrypt
-    autoconf autoconf-archive automake libtool
-    make cmake gcc-toolchain pkg-config
-    libressl libxml2 libstrophe json-c weechat)
+    PACKAGES=(
+        autoconf autoconf-archive automake libtool
+        make cmake gcc-toolchain pkg-config patchelf
+        weechat xz libxml2 libstrophe json-c
+    )
 
     # Thanks <https://lists.gnu.org/archive/html/guix-devel/2016-09/msg00859.html>
-    eval "$(guix environment --search-paths --root="$gcroot" --ad-hoc ${PACKAGES[@]} ${PACKAGES_MAINTENANCE[@]} "$@")"
+    eval "$(guix environment --search-paths --root="$gcroot" ${ENVIRONMENTS[@]} --ad-hoc ${PACKAGES[@]} "$@")"
 
     export CC=gcc
 }
diff --git a/.gitmodules b/.gitmodules
index 1c84e5a..fc93d6e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
 [submodule "json-c"]
 	path = json-c
 	url = https://github.com/json-c/json-c
-[submodule "libstrophe"]
-	path = libstrophe
-	url = https://github.com/strophe/libstrophe
diff --git a/Makefile b/Makefile
index dcc399f..3b28f64 100644
--- a/Makefile
+++ b/Makefile
@@ -4,67 +4,68 @@ ifdef DEBUG
 endif
 RM=rm -f
 FIND=find
-CFLAGS+=$(DBGCFLAGS) -fno-omit-frame-pointer -fPIC -std=gnu99 -g -Wall -Wextra -Werror-implicit-function-declaration -Wno-missing-field-initializers -Ilibstrophe -Ijson-c
+INCLUDES=-Ilibstrophe -Ijson-c
+CFLAGS+=$(DBGCFLAGS) -fno-omit-frame-pointer -fPIC -std=gnu99 -g -Wall -Wextra -Werror-implicit-function-declaration -Wno-missing-field-initializers $(INCLUDES)
 LDFLAGS+=-shared -g $(DBGCFLAGS) $(DBGLDFLAGS)
-LDLIBS=-lssl -lxml2
+LDLIBS=-lstrophe -lpthread
 
 PREFIX ?= /usr/local
 LIBDIR ?= $(PREFIX)/lib
 INSTALL ?= /usr/bin/install
 
 SRCS=xmpp.c \
+     xmpp-command.c \
      xmpp-config.c \
      xmpp-connection.c \
 
+DEPS=json-c/libjson-c.a
 OLDSRCS=slack.c \
-	 slack-api.c \
-	 slack-buffer.c \
-	 slack-channel.c \
-	 slack-config.c \
-	 slack-command.c \
-	 slack-completion.c \
-	 slack-emoji.c \
-	 slack-input.c \
-	 slack-message.c \
-	 slack-oauth.c \
-	 slack-request.c \
-	 slack-teaminfo.c \
-	 slack-user.c \
-	 slack-workspace.c \
-	 api/slack-api-hello.c \
-	 api/slack-api-error.c \
-	 api/slack-api-message.c \
-	 api/slack-api-user-typing.c \
-	 api/message/slack-api-message-bot-message.c \
-	 api/message/slack-api-message-slackbot-response.c \
-	 api/message/slack-api-message-me-message.c \
-	 api/message/slack-api-message-unimplemented.c \
-	 request/slack-request-chat-memessage.c \
-	 request/slack-request-chat-postmessage.c \
-	 request/slack-request-channels-list.c \
-	 request/slack-request-conversations-members.c \
-	 request/slack-request-emoji-list.c \
-	 request/slack-request-users-list.c
-OBJS=$(subst .c,.o,$(SRCS)) libstrophe/.libs/libstrophe.a json-c/libjson-c.a
-
-all: libstrophe/.libs/libstrophe.a json-c/libjson-c.a weechat-xmpp
+	slack-api.c \
+	slack-buffer.c \
+	slack-channel.c \
+	slack-config.c \
+	slack-command.c \
+	slack-completion.c \
+	slack-emoji.c \
+	slack-input.c \
+	slack-message.c \
+	slack-oauth.c \
+	slack-request.c \
+	slack-teaminfo.c \
+	slack-user.c \
+	slack-workspace.c \
+	api/slack-api-hello.c \
+	api/slack-api-error.c \
+	api/slack-api-message.c \
+	api/slack-api-user-typing.c \
+	api/message/slack-api-message-bot-message.c \
+	api/message/slack-api-message-slackbot-response.c \
+	api/message/slack-api-message-me-message.c \
+	api/message/slack-api-message-unimplemented.c \
+	request/slack-request-chat-memessage.c \
+	request/slack-request-chat-postmessage.c \
+	request/slack-request-channels-list.c \
+	request/slack-request-conversations-members.c \
+	request/slack-request-emoji-list.c \
+	request/slack-request-users-list.c
+OBJS=$(subst .c,.o,$(SRCS))
+
+all: $(DEPS) weechat-xmpp
 
 weechat-xmpp: $(OBJS)
 	$(CC) $(LDFLAGS) -o xmpp.so $(OBJS) $(LDLIBS)
-
-libstrophe/.libs/libstrophe.a:
-	cd libstrophe && ./bootstrap.sh && env CFLAGS=-fPIC LDFLAGS= ./configure
-	$(MAKE) -C libstrophe
-libstrophe: libstrophe/.libs/libstrophe.a
+	which patchelf >/dev/null && \
+		patchelf --set-rpath $(LIBRARY_PATH):$(shell patchelf --print-rpath xmpp.so) xmpp.so || true
 
 json-c/libjson-c.a:
-	cd json-c && env CFLAGS= LDFLAGS= cmake -DCMAKE_C_FLAGS=-fPIC .
+	cd json-c && env CFLAGS= LDFLAGS= \
+		cmake -DCMAKE_C_FLAGS=-fPIC .
 	$(MAKE) -C json-c json-c-static
 json-c: json-c/libjson-c.a
 
 depend: .depend
 
-.depend: libstrophe/.libs/libstrophe.a json-c/libjson-c.a $(SRCS)
+.depend: json-c/libjson-c.a $(SRCS)
 	$(RM) ./.depend
 	$(CC) $(CFLAGS) -MM $^>>./.depend
 
@@ -73,8 +74,6 @@ tidy:
 
 clean:
 	$(RM) $(OBJS)
-	$(MAKE) -C libstrophe clean || true
-	$(MAKE) -C libwebsockets clean || true
 	$(MAKE) -C json-c clean || true
 	git submodule foreach --recursive git clean -xfd || true
 	git submodule foreach --recursive git reset --hard || true
diff --git a/libstrophe b/libstrophe
deleted file mode 160000
index 2d5424b..0000000
--- a/libstrophe
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 2d5424bcff4e9d810b73444b02708f69743ff65d
diff --git a/slack-command.c b/xmpp-command.c
similarity index 51%
rename from slack-command.c
rename to xmpp-command.c
index 201ff4d..44ae73c 100644
--- a/slack-command.c
+++ b/xmpp-command.c
@@ -2,32 +2,33 @@
 // License, version 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-#include <libwebsockets.h>
+#include <strophe.h>
 #include <stdlib.h>
 #include <string.h>
-
-#include "weechat-plugin.h"
-#include "slack.h"
-#include "slack-oauth.h"
-#include "slack-teaminfo.h"
-#include "slack-workspace.h"
-#include "slack-channel.h"
-#include "slack-buffer.h"
-#include "slack-message.h"
-#include "slack-command.h"
-#include "request/slack-request-chat-memessage.h"
-
-void slack_command_display_workspace(struct t_slack_workspace *workspace)
+#include <weechat/weechat-plugin.h>
+
+#include "xmpp.h"
+//#include "xmpp-oauth.h"
+//#include "xmpp-teaminfo.h"
+//#include "xmpp-workspace.h"
+//#include "xmpp-channel.h"
+//#include "xmpp-buffer.h"
+//#include "xmpp-message.h"
+#include "xmpp-command.h"
+//#include "request/xmpp-request-chat-memessage.h"
+
+/*
+void xmpp_command_display_workspace(xmpp_conn_t *workspace)
 {
     int num_channels, num_pv;
 
     if (workspace->is_connected)
     {
-        num_channels = 0;//slack_workspace_get_channel_count(workspace);
-        num_pv = 0;//slack_workspace_get_pv_count(workspace);
+        num_channels = 0;//xmpp_workspace_get_channel_count(workspace);
+        num_pv = 0;//xmpp_workspace_get_pv_count(workspace);
         weechat_printf(
             NULL,
-            " %s %s%s%s.slack.com %s(%s%s%s) [%s%s%s]%s, %d %s, %d pv",
+            " %s %s%s%s.xmpp.com %s(%s%s%s) [%s%s%s]%s, %d %s, %d pv",
             (workspace->is_connected) ? "*" : " ",
             weechat_color("chat_server"),
             workspace->domain,
@@ -50,7 +51,7 @@ void slack_command_display_workspace(struct t_slack_workspace *workspace)
     {
         weechat_printf(
             NULL,
-            "   %s%s%s.slack.com %s(%s%s%s)%s",
+            "   %s%s%s.xmpp.com %s(%s%s%s)%s",
             weechat_color("chat_server"),
             workspace->domain,
             weechat_color("reset"),
@@ -63,10 +64,10 @@ void slack_command_display_workspace(struct t_slack_workspace *workspace)
     }
 }
 
-void slack_command_workspace_list(int argc, char **argv)
+void xmpp_command_workspace_list(int argc, char **argv)
 {
     int i, one_workspace_found;
-    struct t_slack_workspace *ptr_workspace2;
+    xmpp_conn_t *ptr_workspace2;
     char *workspace_name = NULL;
 
     for (i = 2; i < argc; i++)
@@ -76,14 +77,14 @@ void slack_command_workspace_list(int argc, char **argv)
     }
     if (!workspace_name)
     {
-        if (slack_workspaces)
+        if (xmpp_workspaces)
         {
             weechat_printf(NULL, "");
             weechat_printf(NULL, _("All workspaces:"));
-            for (ptr_workspace2 = slack_workspaces; ptr_workspace2;
+            for (ptr_workspace2 = xmpp_workspaces; ptr_workspace2;
                  ptr_workspace2 = ptr_workspace2->next_workspace)
             {
-                slack_command_display_workspace(ptr_workspace2);
+                xmpp_command_display_workspace(ptr_workspace2);
             }
         }
         else
@@ -92,7 +93,7 @@ void slack_command_workspace_list(int argc, char **argv)
     else
     {
         one_workspace_found = 0;
-        for (ptr_workspace2 = slack_workspaces; ptr_workspace2;
+        for (ptr_workspace2 = xmpp_workspaces; ptr_workspace2;
              ptr_workspace2 = ptr_workspace2->next_workspace)
         {
             if (weechat_strcasestr(ptr_workspace2->name, workspace_name))
@@ -105,7 +106,7 @@ void slack_command_workspace_list(int argc, char **argv)
                                    workspace_name);
                 }
                 one_workspace_found = 1;
-                slack_command_display_workspace(ptr_workspace2);
+                xmpp_command_display_workspace(ptr_workspace2);
             }
         }
         if (!one_workspace_found)
@@ -115,40 +116,40 @@ void slack_command_workspace_list(int argc, char **argv)
     }
 }
 
-void slack_command_add_workspace(struct t_slack_teaminfo *slack_teaminfo)
+void xmpp_command_add_workspace(struct t_xmpp_teaminfo *xmpp_teaminfo)
 {
-    struct t_slack_workspace *workspace;
+    xmpp_conn_t *workspace;
 
-    workspace = slack_workspace_casesearch(slack_teaminfo->domain);
+    workspace = xmpp_workspace_casesearch(xmpp_teaminfo->domain);
     if (workspace)
     {
         weechat_printf(
             NULL,
             _("%s%s: workspace \"%s\" already exists, can't add it!"),
-            weechat_prefix("error"), SLACK_PLUGIN_NAME,
-            slack_teaminfo->domain);
+            weechat_prefix("error"), XMPP_PLUGIN_NAME,
+            xmpp_teaminfo->domain);
         return;
     }
 
-    workspace = slack_workspace_alloc(slack_teaminfo->domain);
+    workspace = xmpp_workspace_alloc(xmpp_teaminfo->domain);
     if (!workspace)
     {
         weechat_printf(
             NULL,
             _("%s%s: unable to add workspace"),
-            weechat_prefix("error"), SLACK_PLUGIN_NAME);
+            weechat_prefix("error"), XMPP_PLUGIN_NAME);
         return;
     }
 
-    workspace->id = strdup(slack_teaminfo->id);
-    workspace->name = strdup(slack_teaminfo->name);
-    weechat_config_option_set(workspace->options[SLACK_WORKSPACE_OPTION_TOKEN],
-            slack_teaminfo->token, 1);
+    workspace->id = strdup(xmpp_teaminfo->id);
+    workspace->name = strdup(xmpp_teaminfo->name);
+    weechat_config_option_set(workspace->options[XMPP_WORKSPACE_OPTION_TOKEN],
+            xmpp_teaminfo->token, 1);
 
     weechat_printf (
         NULL,
-        _("%s: workspace %s%s%s.slack.com %s(%s%s%s)%s added"),
-        SLACK_PLUGIN_NAME,
+        _("%s: workspace %s%s%s.xmpp.com %s(%s%s%s)%s added"),
+        XMPP_PLUGIN_NAME,
         weechat_color("chat_server"),
         workspace->domain,
         weechat_color("reset"),
@@ -158,47 +159,47 @@ void slack_command_add_workspace(struct t_slack_teaminfo *slack_teaminfo)
         weechat_color("chat_delimiters"),
         weechat_color("reset"));
 
-    free_teaminfo(slack_teaminfo);
+    free_teaminfo(xmpp_teaminfo);
 }
 
-void slack_command_fetch_workspace(char *token)
+void xmpp_command_fetch_workspace(char *token)
 {
-    slack_teaminfo_fetch(token, &slack_command_add_workspace);
+    xmpp_teaminfo_fetch(token, &xmpp_command_add_workspace);
 
     free(token);
 }
 
-void slack_command_workspace_register(int argc, char **argv)
+void xmpp_command_workspace_register(int argc, char **argv)
 {
     char *code;
 
     if (argc > 2)
     {
         code = argv[2];
-        
+
         if (strncmp("xoxp", code, 4) == 0)
         {
-            slack_command_fetch_workspace(strdup(code));
+            xmpp_command_fetch_workspace(strdup(code));
         }
         else
         {
-            slack_oauth_request_token(code, &slack_command_fetch_workspace);
+            xmpp_oauth_request_token(code, &xmpp_command_fetch_workspace);
         }
     }
     else
     {
         weechat_printf(NULL,
-                       _("\n#### Retrieving a Slack token via OAUTH ####\n"
-                         "1) Paste this into a browser: https://slack.com/oauth/authorize?client_id=%s&scope=client\n"
+                       _("\n#### Retrieving a Xmpp token via OAUTH ####\n"
+                         "1) Paste this into a browser: https://xmpp.com/oauth/authorize?client_id=%s&scope=client\n"
                          "2) Select the team you wish to access from weechat in your browser.\n"
                          "3) Click \"Authorize\" in the browser **IMPORTANT: the redirect will fail, this is expected**\n"
                          "4) Copy the \"code\" portion of the URL to your clipboard\n"
-                         "5) Return to weechat and run `/slack register [code]`\n"),
-                       SLACK_CLIENT_ID);
+                         "5) Return to weechat and run `/xmpp register [code]`\n"),
+                       XMPP_CLIENT_ID);
     }
 }
 
-int slack_command_connect_workspace(struct t_slack_workspace *workspace)
+int xmpp_command_connect_workspace(xmpp_conn_t *workspace)
 {
     if (!workspace)
         return 0;
@@ -208,19 +209,19 @@ int slack_command_connect_workspace(struct t_slack_workspace *workspace)
         weechat_printf(
             NULL,
             _("%s%s: already connected to workspace \"%s\"!"),
-            weechat_prefix("error"), SLACK_PLUGIN_NAME,
+            weechat_prefix("error"), XMPP_PLUGIN_NAME,
             workspace->domain);
     }
 
-    slack_workspace_connect(workspace);
+    xmpp_workspace_connect(workspace);
 
     return 1;
 }
 
-int slack_command_workspace_connect(int argc, char **argv)
+int xmpp_command_workspace_connect(int argc, char **argv)
 {
     int i, nb_connect, connect_ok;
-    struct t_slack_workspace *ptr_workspace;
+    xmpp_conn_t *ptr_workspace;
 
     (void) argc;
     (void) argv;
@@ -231,10 +232,10 @@ int slack_command_workspace_connect(int argc, char **argv)
     for (i = 2; i < argc; i++)
     {
         nb_connect++;
-        ptr_workspace = slack_workspace_search(argv[i]);
+        ptr_workspace = xmpp_workspace_search(argv[i]);
         if (ptr_workspace)
         {
-            if (!slack_command_connect_workspace(ptr_workspace))
+            if (!xmpp_command_connect_workspace(ptr_workspace))
             {
                 connect_ok = 0;
             }
@@ -244,8 +245,8 @@ int slack_command_workspace_connect(int argc, char **argv)
             weechat_printf(
                 NULL,
                 _("%s%s: workspace not found \"%s\" "
-                  "(register first with: /slack register)"),
-                weechat_prefix("error"), SLACK_PLUGIN_NAME,
+                  "(register first with: /xmpp register)"),
+                weechat_prefix("error"), XMPP_PLUGIN_NAME,
                 argv[i]);
         }
     }
@@ -253,9 +254,9 @@ int slack_command_workspace_connect(int argc, char **argv)
     return (connect_ok) ? WEECHAT_RC_OK : WEECHAT_RC_ERROR;
 }
 
-void slack_command_workspace_delete(int argc, char **argv)
+void xmpp_command_workspace_delete(int argc, char **argv)
 {
-    struct t_slack_workspace *workspace;
+    xmpp_conn_t *workspace;
     char *workspace_domain;
 
     if (argc < 3)
@@ -269,14 +270,14 @@ void slack_command_workspace_delete(int argc, char **argv)
         return;
     }
 
-    workspace = slack_workspace_search(argv[2]);
+    workspace = xmpp_workspace_search(argv[2]);
     if (!workspace)
     {
         weechat_printf(
             NULL,
             _("%s%s: workspace \"%s\" not found for \"%s\" command"),
-            weechat_prefix("error"), SLACK_PLUGIN_NAME,
-            argv[2], "slack delete");
+            weechat_prefix("error"), XMPP_PLUGIN_NAME,
+            argv[2], "xmpp delete");
         return;
     }
     if (workspace->is_connected)
@@ -284,151 +285,151 @@ void slack_command_workspace_delete(int argc, char **argv)
         weechat_printf(
             NULL,
             _("%s%s: you cannot delete workspace \"%s\" because you"
-              "are connected. Try \"/slack disconnect %s\" first."),
-            weechat_prefix("error"), SLACK_PLUGIN_NAME,
+              "are connected. Try \"/xmpp disconnect %s\" first."),
+            weechat_prefix("error"), XMPP_PLUGIN_NAME,
             argv[2], argv[2]);
         return;
     }
 
     workspace_domain = strdup(workspace->domain);
-    slack_workspace_free(workspace);
+    xmpp_workspace_free(workspace);
     weechat_printf (
         NULL,
         _("%s: workspace %s%s%s has been deleted"),
-        SLACK_PLUGIN_NAME,
+        XMPP_PLUGIN_NAME,
         weechat_color("chat_server"),
         (workspace_domain) ? workspace_domain : "???",
         weechat_color("reset"));
     if (workspace_domain)
         free(workspace_domain);
 }
+*/
 
-int slack_command_slack(const void *pointer, void *data,
+int xmpp_command_xmpp(const void *pointer, void *data,
                         struct t_gui_buffer *buffer, int argc,
                         char **argv, char **argv_eol)
 {
-    
+
     (void) pointer;
     (void) data;
     (void) buffer;
 
-    if (argc <= 1 || weechat_strcasecmp(argv[1], "list") == 0)
-    {
-        slack_command_workspace_list(argc, argv);
-        return WEECHAT_RC_OK;
-    }
-
-    if (argc > 1)
-    {
-        if (weechat_strcasecmp(argv[1], "register") == 0)
-        {
-            slack_command_workspace_register(argc, argv);
-            return WEECHAT_RC_OK;
-        }
-
-        if (weechat_strcasecmp(argv[1], "connect") == 0)
-        {
-            slack_command_workspace_connect(argc, argv);
-            return WEECHAT_RC_OK;
-        }
-
-        if (weechat_strcasecmp(argv[1], "delete") == 0)
-        {
-            slack_command_workspace_delete(argc, argv);
-            return WEECHAT_RC_OK;
-        }
-
-        WEECHAT_COMMAND_ERROR;
-    }
+  //if (argc <= 1 || weechat_strcasecmp(argv[1], "list") == 0)
+  //{
+  //    xmpp_command_workspace_list(argc, argv);
+  //    return WEECHAT_RC_OK;
+  //}
+
+  //if (argc > 1)
+  //{
+  //    if (weechat_strcasecmp(argv[1], "register") == 0)
+  //    {
+  //        xmpp_command_workspace_register(argc, argv);
+  //        return WEECHAT_RC_OK;
+  //    }
+
+  //    if (weechat_strcasecmp(argv[1], "connect") == 0)
+  //    {
+  //        xmpp_command_workspace_connect(argc, argv);
+  //        return WEECHAT_RC_OK;
+  //    }
+
+  //    if (weechat_strcasecmp(argv[1], "delete") == 0)
+  //    {
+  //        xmpp_command_workspace_delete(argc, argv);
+  //        return WEECHAT_RC_OK;
+  //    }
+
+  //    WEECHAT_COMMAND_ERROR;
+  //}
 
     return WEECHAT_RC_OK;
 }
 
-int slack_command_me(const void *pointer, void *data,
+int xmpp_command_me(const void *pointer, void *data,
                      struct t_gui_buffer *buffer, int argc,
                      char **argv, char **argv_eol)
 {
-    struct t_slack_workspace *ptr_workspace = NULL;
-    struct t_slack_channel *ptr_channel = NULL;
-    struct t_slack_request *request;
+    xmpp_conn_t *ptr_workspace = NULL;
+  //struct t_xmpp_channel *ptr_channel = NULL;
+  //struct t_xmpp_request *request;
     char *text;
-    
-    
+
     (void) pointer;
     (void) data;
     (void) buffer;
     (void) argv;
 
-    slack_buffer_get_workspace_and_channel(buffer, &ptr_workspace, &ptr_channel);
-    
-    if (!ptr_workspace)
-        return WEECHAT_RC_ERROR;
-
-    if (!ptr_channel)
-    {
-        weechat_printf (
-            ptr_workspace->buffer,
-            _("%s%s: \"%s\" command can not be executed on a workspace buffer"),
-            weechat_prefix("error"), SLACK_PLUGIN_NAME, "me");
-        return WEECHAT_RC_OK;
-    }
-
-    if (!ptr_workspace->is_connected)
-    {
-        weechat_printf(buffer,
-                        _("%s%s: you are not connected to server"),
-                        weechat_prefix("error"), SLACK_PLUGIN_NAME);
-        return WEECHAT_RC_OK;
-    }
-
-    if (argc > 1)
-    {
-        text = malloc(SLACK_MESSAGE_MAX_LENGTH);
-        if (!text)
-        {
-            weechat_printf(buffer,
-                            _("%s%s: error allocating string"),
-                            weechat_prefix("error"), SLACK_PLUGIN_NAME);
-            return WEECHAT_RC_ERROR;
-        }
-        lws_urlencode(text, argv_eol[1], SLACK_MESSAGE_MAX_LENGTH);
-
-        request = slack_request_chat_memessage(ptr_workspace,
-                    weechat_config_string(
-                        ptr_workspace->options[SLACK_WORKSPACE_OPTION_TOKEN]),
-                    ptr_channel->id, text);
-        if (request)
-            slack_workspace_register_request(ptr_workspace, request);
-
-        free(text);
-    }
+  //xmpp_buffer_get_workspace_and_channel(buffer, &ptr_workspace, &ptr_channel);
+
+  //if (!ptr_workspace)
+  //    return WEECHAT_RC_ERROR;
+
+  //if (!ptr_channel)
+  //{
+  //    weechat_printf (
+  //        ptr_workspace->buffer,
+  //        _("%s%s: \"%s\" command can not be executed on a workspace buffer"),
+  //        weechat_prefix("error"), XMPP_PLUGIN_NAME, "me");
+  //    return WEECHAT_RC_OK;
+  //}
+
+  //if (!ptr_workspace->is_connected)
+  //{
+  //    weechat_printf(buffer,
+  //                    _("%s%s: you are not connected to server"),
+  //                    weechat_prefix("error"), XMPP_PLUGIN_NAME);
+  //    return WEECHAT_RC_OK;
+  //}
+
+  //if (argc > 1)
+  //{
+  //    text = malloc(XMPP_MESSAGE_MAX_LENGTH);
+  //    if (!text)
+  //    {
+  //        weechat_printf(buffer,
+  //                        _("%s%s: error allocating string"),
+  //                        weechat_prefix("error"), XMPP_PLUGIN_NAME);
+  //        return WEECHAT_RC_ERROR;
+  //    }
+  //    lws_urlencode(text, argv_eol[1], XMPP_MESSAGE_MAX_LENGTH);
+
+  //    request = xmpp_request_chat_memessage(ptr_workspace,
+  //                weechat_config_string(
+  //                    ptr_workspace->options[XMPP_WORKSPACE_OPTION_TOKEN]),
+  //                ptr_channel->id, text);
+  //    if (request)
+  //        xmpp_workspace_register_request(ptr_workspace, request);
+
+  //    free(text);
+  //}
 
     return WEECHAT_RC_OK;
 }
 
-void slack_command_init()
+void xmpp_command_init()
 {
     weechat_hook_command(
-        "slack",
-        N_("slack control"),
+        "xmpp",
+        N_("xmpp control"),
         N_("list"
            " || register [token]"
            " || connect <workspace>"
            " || delete <workspace>"),
         N_("    list: list workspaces\n"
-           "register: add a slack workspace\n"
-           " connect: connect to a slack workspace\n"
-           "  delete: delete a slack workspace\n"),
+           "register: add a xmpp workspace\n"
+           " connect: connect to a xmpp workspace\n"
+           "  delete: delete a xmpp workspace\n"),
         "list"
-        " || register %(slack_token)"
-        " || connect %(slack_workspace)"
-        " || delete %(slack_workspace)",
-        &slack_command_slack, NULL, NULL);
+        " || register %(xmpp_token)"
+        " || connect %(xmpp_workspace)"
+        " || delete %(xmpp_workspace)",
+        &xmpp_command_xmpp, NULL, NULL);
 
     weechat_hook_command(
         "me",
-        N_("send a slack action to the current channel"),
+        N_("send a xmpp action to the current channel"),
         N_("<message>"),
         N_("message: message to send"),
-        NULL, &slack_command_me, NULL, NULL);
+        NULL, &xmpp_command_me, NULL, NULL);
 }
diff --git a/slack-command.h b/xmpp-command.h
similarity index 65%
rename from slack-command.h
rename to xmpp-command.h
index 9d27194..62be0e5 100644
--- a/slack-command.h
+++ b/xmpp-command.h
@@ -2,9 +2,9 @@
 // License, version 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-#ifndef _SLACK_COMMAND_H_
-#define _SLACK_COMMAND_H_
+#ifndef _XMPP_COMMAND_H_
+#define _XMPP_COMMAND_H_
 
-extern void slack_command_init();
+extern void xmpp_command_init();
 
-#endif /*SLACK_COMMAND_H*/
+#endif /*XMPP_COMMAND_H*/
diff --git a/xmpp-connection.c b/xmpp-connection.c
index 47152f1..993996d 100644
--- a/xmpp-connection.c
+++ b/xmpp-connection.c
@@ -16,13 +16,12 @@
 //#include "api/xmpp-api-message.h"
 //#include "api/xmpp-api-user-typing.h"
 
-xmpp_ctx_t *xmpp_context = NULL;
-
-xmpp_conn_t *xmpp_connection = NULL;
+xmpp_conn_t *xmpp_connection;
 
 void xmpp_log_emit_weechat(void *const userdata, const xmpp_log_level_t level, const char *const area, const char *const msg)
 {
     (void) userdata;
+
     time_t date = time(NULL);
     const char *timestamp = weechat_util_get_time_string(&date);
 
@@ -40,22 +39,27 @@ xmpp_log_t xmpp_logger = {
 
 void xmpp_connection_init()
 {
-
     xmpp_initialize();
-    xmpp_context = xmpp_ctx_new(NULL, &xmpp_logger);
-    xmpp_connection = xmpp_conn_new(xmpp_context);
-    xmpp_conn_set_jid(xmpp_connection,
-                      weechat_config_string(xmpp_config_serverdef_jid));
-    xmpp_conn_set_pass(xmpp_connection,
-                       weechat_config_string(xmpp_config_serverdef_password));
-  //size_t case_count = sizeof(cases) / sizeof(cases[0]);
-  //qsort(cases, case_count, sizeof(struct stringcase), stringcase_cmp);
+}
 
-  //xmpp_api_message_init();
+void xmpp_connection_autoconnect()
+{
+    xmpp_connection_connect(weechat_config_string(xmpp_config_serverdef_jid),
+                            weechat_config_string(xmpp_config_serverdef_password));
+    weechat_printf(NULL, _("xmpp: %s # %s"),
+                   weechat_config_string(xmpp_config_serverdef_jid),
+                   weechat_config_string(xmpp_config_serverdef_password));
 }
 
-void xmpp_connection_connect(xmpp_conn_t *connection)
+void xmpp_connection_connect(const char* jid, const char* password)
 {
+    xmpp_ctx_t *xmpp_context = xmpp_ctx_new(NULL, &xmpp_logger);
+
+    xmpp_conn_t *xmpp_connection = xmpp_conn_new(xmpp_context);
+
+    xmpp_connection = xmpp_conn_new(xmpp_context);
+    xmpp_conn_set_jid(xmpp_connection, jid);
+    xmpp_conn_set_pass(xmpp_connection, password);
   //struct lws_context_creation_info ctxinfo;
   //struct lws_client_connect_info ccinfo;
   //const char *url_protocol, *url_path;
@@ -117,6 +121,7 @@ void xmpp_connection_connect(xmpp_conn_t *connection)
   //ccinfo.userdata = workspace;
 
   //lws_client_connect_via_info(&ccinfo);
+    return xmpp_connection;
 }
 
 int xmpp_connection_route_message(xmpp_conn_t *workspace,
diff --git a/xmpp-connection.h b/xmpp-connection.h
index f6e7979..339b6db 100644
--- a/xmpp-connection.h
+++ b/xmpp-connection.h
@@ -5,13 +5,13 @@
 #ifndef _XMPP_CONNECTION_H_
 #define _XMPP_CONNECTION_H_
 
-extern xmpp_ctx_t *xmpp_context;
-
 extern xmpp_conn_t *xmpp_connection;
 
 void xmpp_connection_init();
 
-void xmpp_connection_connect(xmpp_conn_t *connection);
+void xmpp_connection_autoconnect();
+
+void xmpp_connection_connect(const char* jid, const char* password);
 
 int xmpp_connection_route_message(xmpp_conn_t *connection,
                                   const char *type, json_object *message);
diff --git a/xmpp.c b/xmpp.c
index c489c66..788f573 100644
--- a/xmpp.c
+++ b/xmpp.c
@@ -12,10 +12,10 @@
 #include "xmpp.h"
 #include "xmpp-config.h"
 #include "xmpp-connection.h"
-//#include "slack-command.h"
-//#include "slack-workspace.h"
-//#include "slack-buffer.h"
-//#include "slack-completion.h"
+#include "xmpp-command.h"
+//#include "xmpp-workspace.h"
+//#include "xmpp-buffer.h"
+//#include "xmpp-completion.h"
 
 
 WEECHAT_PLUGIN_NAME(XMPP_PLUGIN_NAME);
@@ -31,6 +31,15 @@ struct t_hook *xmpp_hook_timer = NULL;
 
 struct t_gui_bar_item *xmpp_typing_bar_item = NULL;
 
+/*
+void connection_check_events(void)
+{
+    conn.xmpp_in_event_loop = TRUE;
+    xmpp_run_once(conn.xmpp_ctx, 10);
+    conn.xmpp_in_event_loop = FALSE;
+}
+*/
+
 int weechat_plugin_init(struct t_weechat_plugin *plugin, int argc, char *argv[])
 {
     (void) argc;
@@ -45,7 +54,9 @@ int weechat_plugin_init(struct t_weechat_plugin *plugin, int argc, char *argv[])
 
     xmpp_connection_init();
 
-  //xmpp_command_init();
+    xmpp_command_init();
+
+    xmpp_connection_autoconnect();
 
   //xmpp_completion_init();
 
@@ -81,9 +92,17 @@ int weechat_plugin_end(struct t_weechat_plugin *plugin)
 
     xmpp_config_write();
 
-    xmpp_conn_release(xmpp_connection);
+    if (xmpp_connection)
+    {
+      xmpp_ctx_t *xmpp_context = xmpp_conn_get_context(xmpp_connection);
+
+      if (xmpp_conn_is_connected(xmpp_connection))
+        xmpp_disconnect(xmpp_connection);
 
-    xmpp_ctx_free(xmpp_context);
+      xmpp_conn_release(xmpp_connection);
+
+      xmpp_ctx_free(xmpp_context);
+    }
 
     xmpp_shutdown();