diff --git a/src/xmppc.c b/src/xmppc.c
new file mode 100644
index 0000000..e635c52
--- /dev/null
+++ b/src/xmppc.c
@@ -0,0 +1,142 @@
+/*
+ * @file xmppc.c
+ *
+ * vim: expandtab:ts=2:sts=2:sw=2
+ *
+ * @copyright
+ *
+ * Copyright (C) 2020 Anoxinon e.V.
+ *
+ * This file is part of xmppc.
+ *
+ * xmppc is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * xmppc is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see .
+ *
+ * German
+ *
+ * Diese Datei ist Teil von xmppc.
+ *
+ * xmppc ist Freie Software: Sie können es unter den Bedingungen
+ * der GNU General Public License, wie von der Free Software Foundation,
+ * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren
+ * veröffentlichten Version, weiter verteilen und/oder modifizieren.
+ *
+ * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber
+ * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite
+ * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
+ * Siehe die GNU General Public License für weitere Details.
+ *
+ * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
+ * Programm erhalten haben. Wenn nicht, siehe .
+ */
+
+#include "xmppc.h"
+#include
+#include
+#include
+
+/*! @file xmppc.c
+ *
+ * xmppc
+ *
+ */
+
+/*!
+ * Error logging
+ *
+ * \param xmppc the xmppc context structure
+ * \param fmt format of message
+ *
+ */
+void logError(xmppc_t *xmppc, const char *fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+
+void logWarn(xmppc_t *xmppc, const char *fmt, ...) {
+ if (xmppc->loglevel) {
+ va_list args;
+ va_start(args, fmt);
+ vprintf(fmt, args);
+ va_end(args);
+ }
+}
+
+void logInfo(xmppc_t *xmppc, const char *fmt, ...) {
+ if (xmppc->loglevel) {
+ va_list args;
+ va_start(args, fmt);
+ vprintf(fmt, args);
+ va_end(args);
+ }
+}
+
+void logDebug(xmppc_t *xmppc, const char *fmt, ...) {
+ if (xmppc->loglevel) {
+ va_list args;
+ va_start(args, fmt);
+ vprintf(fmt, args);
+ va_end(args);
+ }
+}
+
+/*!
+ * \brief Setup the application context.
+ *
+ * \param xmppc
+ * \return 0 - ok
+ *
+ **/
+int xmppc_context(xmppc_t *xmppc, int level) {
+ assert(xmppc != NULL);
+ assert(xmppc->ctx == NULL);
+ xmpp_log_t *log = NULL;
+
+ if (level > TRACE) {
+ logError(xmppc, "Log level %d not supported. Max: %d.\n", level, TRACE);
+ exit(-1);
+ }
+
+ xmppc->loglevel = level;
+
+ if (level == ERROR) {
+ log = xmpp_get_default_logger(XMPP_LEVEL_ERROR);
+ } else if (level == WARN) {
+ log = xmpp_get_default_logger(XMPP_LEVEL_WARN);
+ } else if (level == INFO) {
+ log = xmpp_get_default_logger(XMPP_LEVEL_INFO);
+ } else if (level == DEBUG) {
+ log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG);
+ } else if (level == TRACE) {
+ log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG);
+ }
+
+ xmpp_ctx_t *ctx = xmpp_ctx_new(NULL, log);
+ xmppc->ctx = ctx;
+ return 0;
+}
+
+int xmppc_connect(xmppc_t *xmppc, char *jid, char *password) {
+ assert(xmppc != NULL);
+ assert(jid != NULL);
+ assert(password != NULL);
+ xmpp_conn_t *conn = xmpp_conn_new(xmppc->ctx);
+ assert(conn != NULL);
+
+ xmpp_conn_set_jid(conn, jid);
+ xmpp_conn_set_pass(conn, password);
+ xmppc->conn = conn;
+ return 0;
+}
diff --git a/src/xmppc.h b/src/xmppc.h
new file mode 100644
index 0000000..b05cafd
--- /dev/null
+++ b/src/xmppc.h
@@ -0,0 +1,100 @@
+/*
+ * @file xmppc.h
+ *
+ * vim: expandtab:ts=2:sts=2:sw=2
+ *
+ * @copyright
+ *
+ * Copyright (C) 2020 Anoxinon e.V.
+ *
+ * This file is part of xmppc.
+ *
+ * xmppc is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * xmppc is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see .
+ *
+ * German
+ *
+ * Diese Datei ist Teil von xmppc.
+ *
+ * xmppc ist Freie Software: Sie können es unter den Bedingungen
+ * der GNU General Public License, wie von der Free Software Foundation,
+ * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren
+ * veröffentlichten Version, weiter verteilen und/oder modifizieren.
+ *
+ * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber
+ * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite
+ * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
+ * Siehe die GNU General Public License für weitere Details.
+ *
+ * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
+ * Programm erhalten haben. Wenn nicht, siehe .
+ */
+
+#ifndef XMPPC_XMPPC_H__
+#define XMPPC_XMPPC_H__
+
+#include "config.h"
+
+#include
+#include
+#include
+
+#define ANSI_COLOR_RED "\x1b[31m"
+#define ANSI_COLOR_GREEN "\x1b[32m"
+#define ANSI_COLOR_YELLOW "\x1b[33m"
+#define ANSI_COLOR_BLUE "\x1b[34m"
+#define ANSI_COLOR_MAGENTA "\x1b[35m"
+#define ANSI_COLOR_CYAN "\x1b[36m"
+
+#define ANSI_COLOR_B_RED "\x1b[91m"
+
+
+/**
+ * XMPPC Level of Logging
+ *
+ */
+typedef enum loglevel {
+ ERROR = 0,
+ WARN = 1,
+ INFO = 2,
+ DEBUG = 3,
+ TRACE = 4
+} loglevel_t;
+
+typedef enum mode { UNKOWN, ACCOUNT, ROSTER, MESSAGE, MUC, OMEMO, PGP, OPENPGP, MONITOR } xmppc_mode_t;
+
+typedef struct {
+ /** log level **/
+ loglevel_t loglevel;
+ xmpp_ctx_t *ctx;
+ xmpp_conn_t *conn;
+ xmppc_mode_t mode;
+} xmppc_t;
+
+#define INIT_XMPPC(X) xmppc_t X = {.loglevel = ERROR, .ctx = NULL, .conn = NULL, .mode = UNKOWN}
+
+typedef void (*ExecuteHandler)(xmppc_t *, int, char **);
+
+void logError(xmppc_t *xmppc_t, const char *fmt, ...);
+
+void logWarn(xmppc_t *xmppc, const char *fmt, ...);
+
+void logInfo(xmppc_t *xmppc, const char *fmt, ...);
+
+void logDebug(xmppc_t *xmppc, const char *fmt, ...);
+
+int xmppc_context(xmppc_t *xmppc, int level);
+
+int xmppc_connect(xmppc_t *_xmppc, char *jid, char *password);
+
+#endif // XMPPC_XMPPC_H__