diff --git a/src/ColorCoutG3Sink.hpp b/src/ColorCoutG3Sink.hpp
deleted file mode 100644
index cd98fac..0000000
--- a/src/ColorCoutG3Sink.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#pragma once
-namespace crow
-{
-  struct ColorCoutSink {
-
-  // Linux xterm color
-  // http://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal
-    enum FG_Color {YELLOW = 33, RED = 31, GREEN=32, WHITE = 97};
-
-    FG_Color GetColor(const LEVELS level) const {
-      if (level.value == WARNING.value) { return YELLOW; }
-      if (level.value == DEBUG.value) { return GREEN; }
-      if (g3::internal::wasFatal(level)) { return RED; }
-
-      return WHITE;
-    }
-    
-    void ReceiveLogMessage(g3::LogMessageMover logEntry) {
-      auto level = logEntry.get()._level;
-      auto color = GetColor(level);
-
-      std::cout << "\033[" << color << "m" 
-        << logEntry.get().toString() << "\033[m";
-    }
-  };
-}
\ No newline at end of file
diff --git a/src/example.cpp b/src/example.cpp
index c75ad61..91fdb7f 100644
--- a/src/example.cpp
+++ b/src/example.cpp
@@ -21,7 +21,7 @@
 #include "crow/http_server.h"
 #include "crow/app.h"
 
-#include "ColorCoutG3Sink.hpp"
+#include "color_cout_g3_sink.hpp"
 
 #include "ssl_key_handler.hpp"
 #include <iostream>
diff --git a/src/ssl_key_handler.hpp b/src/ssl_key_handler.hpp
deleted file mode 100644
index a658d9c..0000000
--- a/src/ssl_key_handler.hpp
+++ /dev/null
@@ -1,182 +0,0 @@
-#pragma once
-
-#include <openssl/bio.h>
-#include <openssl/dh.h>
-#include <openssl/dsa.h>
-#include <openssl/dsa.h>
-#include <openssl/err.h>
-#include <openssl/evp.h>
-#include <openssl/pem.h>
-#include <openssl/rand.h>
-#include <openssl/rsa.h>
-#include <openssl/ssl.h>
-
-namespace ensuressl
-{
-static void init_openssl(void);
-static void cleanup_openssl(void);
-static EVP_PKEY *create_rsa_key(void);
-static void handle_openssl_error(void);
-
-inline bool verify_openssl_key_cert(const std::string &filepath)
-{
-    bool private_key_valid = false;
-    bool cert_valid = false;
-    FILE *file = fopen(filepath.c_str(), "r");
-    if (file != NULL){   
-        EVP_PKEY *pkey = PEM_read_PrivateKey(file, NULL, NULL, NULL);
-        int rc;
-        if (pkey) {
-            int type = EVP_PKEY_type(pkey->type);
-            switch (type) {
-                case EVP_PKEY_RSA:
-                case EVP_PKEY_RSA2: {
-                    RSA *rsa = EVP_PKEY_get1_RSA(pkey);
-                    rc = RSA_check_key(rsa);
-                    if (rc == 1) {
-                        private_key_valid = true;
-                    }
-
-                    //RSA_free(rsa);
-
-                    break;
-                }
-                default:
-                    break;
-            }
-
-            if (private_key_valid) {
-                X509 *x509 = PEM_read_X509(file, NULL, NULL, NULL);
-                unsigned long err = ERR_get_error();
-
-                rc = X509_verify(x509, pkey);
-                err = ERR_get_error();
-                if (err == 0 && rc == 1) {
-                    cert_valid = true;
-                }
-            }
-
-            EVP_PKEY_free(pkey);
-        }
-        fclose(file);
-    }
-    return cert_valid;
-}
-
-inline void generate_ssl_certificate(const std::string &filepath)
-{
-    EVP_PKEY *pPrivKey = NULL;
-    FILE *pFile = NULL;
-    init_openssl();
-
-    pPrivKey = create_rsa_key();
-
-    // Use this code to directly generate a certificate
-    X509 *x509;
-    x509 = X509_new();
-    if (x509) {
-        // TODO get actually random int
-        ASN1_INTEGER_set(X509_get_serialNumber(x509), 1584);
-
-        // not before this moment
-        X509_gmtime_adj(X509_get_notBefore(x509), 0);
-        // Cert is valid for 10 years
-        X509_gmtime_adj(X509_get_notAfter(x509), 60L * 60L * 24L * 365L * 10L);
-
-        // set the public key to the key we just generated
-        X509_set_pubkey(x509, pPrivKey);
-
-        // Get the subject name
-        X509_NAME *name;
-        name = X509_get_subject_name(x509);
-
-        X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (unsigned char *)"US", -1,
-                                   -1, 0);
-        X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC,
-                                   (unsigned char *)"Intel BMC", -1, -1, 0);
-        X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
-                                   (unsigned char *)"testhost", -1, -1, 0);
-        // set the CSR options
-        X509_set_issuer_name(x509, name);
-
-        // Sign the certificate with our private key
-        X509_sign(x509, pPrivKey, EVP_sha256());
-
-        pFile = fopen(filepath.c_str(), "wt");
-
-        if (pFile) {
-            PEM_write_PrivateKey(pFile, pPrivKey, NULL, NULL, 0, 0, NULL);
-            PEM_write_X509(pFile, x509);
-            fclose(pFile);
-            pFile = NULL;
-        }
-
-        X509_free(x509);
-    }
-
-    if (pPrivKey) {
-        EVP_PKEY_free(pPrivKey);
-        pPrivKey = NULL;
-    }
-
-    //cleanup_openssl();
-}
-
-EVP_PKEY *create_rsa_key(void)
-{
-    RSA *pRSA = NULL;
-    EVP_PKEY *pKey = NULL;
-    pRSA = RSA_generate_key(2048, RSA_3, NULL, NULL);
-    pKey = EVP_PKEY_new();
-    if (pRSA && pKey && EVP_PKEY_assign_RSA(pKey, pRSA)) {
-        /* pKey owns pRSA from now */
-        if (RSA_check_key(pRSA) <= 0) {
-            fprintf(stderr, "RSA_check_key failed.\n");
-            handle_openssl_error();
-            EVP_PKEY_free(pKey);
-            pKey = NULL;
-        }
-    } else {
-        handle_openssl_error();
-        if (pRSA) {
-            RSA_free(pRSA);
-            pRSA = NULL;
-        }
-        if (pKey) {
-            EVP_PKEY_free(pKey);
-            pKey = NULL;
-        }
-    }
-    return pKey;
-}
-
-void init_openssl(void)
-{
-    if (SSL_library_init()) {
-        SSL_load_error_strings();
-        OpenSSL_add_all_algorithms();
-        RAND_load_file("/dev/urandom", 1024);
-    } else
-        exit(EXIT_FAILURE);
-}
-
-void cleanup_openssl(void)
-{
-    CRYPTO_cleanup_all_ex_data();
-    ERR_free_strings();
-    ERR_remove_thread_state(0);
-    EVP_cleanup();
-}
-
-void handle_openssl_error(void) { ERR_print_errors_fp(stderr); }
-inline void ensure_openssl_key_present_and_valid(const std::string &filepath)
-{
-    bool pem_file_valid = false;
-
-    pem_file_valid = verify_openssl_key_cert(filepath);
-
-    if (!pem_file_valid) {
-        generate_ssl_certificate(filepath);
-    }
-}
-}
\ No newline at end of file
