diff --git a/c-mosquitto.cabal b/c-mosquitto.cabal
--- a/c-mosquitto.cabal
+++ b/c-mosquitto.cabal
@@ -1,7 +1,8 @@
 name:                c-mosquitto
-version:             0.1.4.1
+version:             0.1.5.0
 synopsis:            Simpe mosquito MQTT binding able to work with the Amazons IoT
--- description:
+description:         Simpe mosquito MQTT binding
+                     able to work with the Amazons IoT but it should work with other providers
 homepage:            https://github.com/tolysz/c-mosquitto#readme
 license:             BSD3
 license-file:        LICENSE
@@ -28,9 +29,9 @@
                      , bytestring
   default-language:    Haskell2010
 
-  cc-options:          -Wall -O2
-  if impl(ghc < 8.2)
-      c-sources:       src/Network/Mosquitto.c
+  cc-options:          -Wall
+--  if impl(ghc < 8.2)
+--      c-sources:       src/Network/Mosquitto.c
   extra-libraries:     mosquitto
 
 executable c-mosquitto
diff --git a/src/Network/Mosquitto.c b/src/Network/Mosquitto.c
deleted file mode 100644
--- a/src/Network/Mosquitto.c
+++ /dev/null
@@ -1,217 +0,0 @@
-
-#include <stdio.h>
-
-#include <mosquitto.h>
-
-int inline_c_Network_Mosquitto_0_af973a022b4e1bdc5e364f24abf1f96042f22074(struct mosquitto_message * ptr_inline_c_0) {
-return ( ptr_inline_c_0->mid);
-}
-
-
-char * inline_c_Network_Mosquitto_1_1ffdbc152633d765d9af8dc1a99fc84de7cdc43d(struct mosquitto_message * ptr_inline_c_0) {
-return (ptr_inline_c_0 -> topic );
-}
-
-
-char * inline_c_Network_Mosquitto_2_2a9eed77120139b9bb64a7f6606b06cf995c53d0(struct mosquitto_message * ptr_inline_c_0) {
-return (ptr_inline_c_0 -> payload );
-}
-
-
-int inline_c_Network_Mosquitto_3_a343e4f7dc55e7308355464e738a9402fb43c490(struct mosquitto_message * ptr_inline_c_0) {
-return (ptr_inline_c_0 -> payloadlen );
-}
-
-
-int inline_c_Network_Mosquitto_4_f085573633eba51cb044b22361e904fc48b4a9f3(struct mosquitto_message * ptr_inline_c_0) {
-return ( ptr_inline_c_0->qos);
-}
-
-
-bool inline_c_Network_Mosquitto_5_ceaf89a39d1e88cb7f623dfa0d464582f936ed4f(struct mosquitto_message * ptr_inline_c_0) {
-return ( ptr_inline_c_0->retain);
-}
-
-
-int inline_c_Network_Mosquitto_6_d5c23f7055ae67c09ff206dd6a9cc4f020e85c61() {
-return ( mosquitto_lib_init() );
-}
-
-
-int inline_c_Network_Mosquitto_7_f62c1e89d0a67f1afbdb4eb34ac4bfb9ad34dd96() {
-return ( mosquitto_lib_cleanup() );
-}
-
-
-void inline_c_Network_Mosquitto_8_7dea8f89bfffce831052393584adc3a08aa14253(int * a_inline_c_0, int * b_inline_c_1, int * c_inline_c_2) {
- mosquitto_lib_version(a_inline_c_0,b_inline_c_1,c_inline_c_2); 
-}
-
-
-struct mosquitto * inline_c_Network_Mosquitto_9_d9f94938a97be80fe91fbbdf0353d48a93b0f8eb(char * userId_inline_c_0, bool clearSession_inline_c_1) {
-
-        struct mosquitto * p =
-          mosquitto_new( userId_inline_c_0
-                       , clearSession_inline_c_1
-                       , 0 // (void * ptrUserData)
-                       );
-        mosquitto_threaded_set(p, true);
-        return p;
-      
-}
-
-
-void inline_c_Network_Mosquitto_10_403fc80492c1877303448c739bc735b61f91b41d(struct mosquitto * ptr_inline_c_0) {
-
-         mosquitto_destroy(ptr_inline_c_0)
-     ;
-}
-
-
-void inline_c_Network_Mosquitto_11_2e52b4e387ff964e8763e13931c04b69aff55430(struct mosquitto * pMosq_inline_c_0, char * caFile_inline_c_1, char * certFile_inline_c_2, char * keyFile_inline_c_3) {
-
-               mosquitto_tls_set( pMosq_inline_c_0
-                                , caFile_inline_c_1
-                                , 0
-                                , certFile_inline_c_2
-                                , keyFile_inline_c_3
-                                , 0
-                                )
-       ;
-}
-
-
-int inline_c_Network_Mosquitto_12_5df2159b027edc29e63231d331ce11cb9a71baa9(struct mosquitto * pMosq_inline_c_0, int reconnectDelay_inline_c_1, int reconnectDelayMax_inline_c_2, bool exponential_inline_c_3) {
-return (
-             mosquitto_reconnect_delay_set
-               ( pMosq_inline_c_0
-               , reconnectDelay_inline_c_1
-               , reconnectDelayMax_inline_c_2
-               , exponential_inline_c_3
-               )
-        );
-}
-
-
-int inline_c_Network_Mosquitto_13_98b22e49ca780ebc944cedb809c5a5097eea6100(struct mosquitto * pMosq_inline_c_0, char * hostname_inline_c_1, int port_inline_c_2, int keepAlive_inline_c_3) {
-return (
-               mosquitto_connect( pMosq_inline_c_0
-                                , hostname_inline_c_1
-                                , port_inline_c_2
-                                , keepAlive_inline_c_3
-                                )
-             );
-}
-
-
-void inline_c_Network_Mosquitto_14_9b2300d6db40d43ebb6d72e3b5a020f27089aa9f(struct mosquitto * pMosq_inline_c_0, void (* on_subscribe_inline_c_1)(struct mosquitto *, void *, int , int , const int *)) {
-
-        mosquitto_subscribe_callback_set
-            ( pMosq_inline_c_0
-            , on_subscribe_inline_c_1
-            );
-       
-}
-
-
-void inline_c_Network_Mosquitto_15_c37f43d389a2b1e4a300492e3a711a4a76e04f57(struct mosquitto * pMosq_inline_c_0, void (* on_connect_inline_c_1)(struct mosquitto *, void *, int )) {
-
-        mosquitto_connect_callback_set
-            ( pMosq_inline_c_0
-            , on_connect_inline_c_1
-            );
-       
-}
-
-
-void inline_c_Network_Mosquitto_16_73f1686f2c07e9747998ec5d1a023376b6401ac8(struct mosquitto * pMosq_inline_c_0, void (* on_disconnect_inline_c_1)(struct mosquitto *, void *, int )) {
-
-        mosquitto_disconnect_callback_set
-            ( pMosq_inline_c_0
-            , on_disconnect_inline_c_1
-            );
-       
-}
-
-
-void inline_c_Network_Mosquitto_17_374d617a6dd1e6b1b85395b1c3a2043f8a86cd2b(struct mosquitto * pMosq_inline_c_0, void (* on_log_inline_c_1)(struct mosquitto *, void *, int , const char *)) {
-
-        mosquitto_log_callback_set
-            ( pMosq_inline_c_0
-            , on_log_inline_c_1
-            );
-       
-}
-
-
-void inline_c_Network_Mosquitto_18_2dd27966a8764a1bdd083baf0f4690e8e2ef1475(struct mosquitto * pMosq_inline_c_0, void (* on_message_inline_c_1)(struct mosquitto *, void *, const struct mosquitto_message *)) {
-
-        mosquitto_message_callback_set
-            ( pMosq_inline_c_0
-            , on_message_inline_c_1
-            );
-       
-}
-
-
-void inline_c_Network_Mosquitto_19_4b8c8d8774deee8ab1d79ed9d536914d1ca65d06(struct mosquitto * pMosq_inline_c_0) {
-
-             mosquitto_loop_forever(pMosq_inline_c_0, -1, 1)
-        ;
-}
-
-
-void inline_c_Network_Mosquitto_20_969dca874ea20234f06362014c8097eab6c27f8f(struct mosquitto * pMosq_inline_c_0, bool isInsecure_inline_c_1) {
-
-             mosquitto_tls_insecure_set(pMosq_inline_c_0, isInsecure_inline_c_1)
-        ;
-}
-
-
-int inline_c_Network_Mosquitto_21_26af9a8807a3b025f22ffd1ecf26e974a708200b(struct mosquitto * pMosq_inline_c_0, char * topic_inline_c_1, long payload_inline_c_2, char * payload_inline_c_3, int qos_inline_c_4, bool retain_inline_c_5) {
-return (
-             mosquitto_will_set
-               ( pMosq_inline_c_0
-               , topic_inline_c_1
-               , payload_inline_c_2
-               , payload_inline_c_3
-               , qos_inline_c_4
-               , retain_inline_c_5
-               )
-        );
-}
-
-
-int inline_c_Network_Mosquitto_22_695260a2b677f2d71d3523f2e5330bb74a20055c(struct mosquitto * pMosq_inline_c_0) {
-return (
-             mosquitto_will_clear(pMosq_inline_c_0)
-        );
-}
-
-
-void inline_c_Network_Mosquitto_23_61ffbebe13cb650a9058a8b715732b7a82987f92(struct mosquitto * pMosq_inline_c_0, char * topic_inline_c_1, long payload_inline_c_2, char * payload_inline_c_3, int qos_inline_c_4, bool retain_inline_c_5) {
-
-             mosquitto_publish
-               ( pMosq_inline_c_0
-               , 0
-               , topic_inline_c_1
-               , payload_inline_c_2
-               , payload_inline_c_3
-               , qos_inline_c_4
-               , retain_inline_c_5
-               )
-        ;
-}
-
-
-void inline_c_Network_Mosquitto_24_491fe5e8a7e8888c30139bd3dcd275298b39e3a8(struct mosquitto * pMosq_inline_c_0, char * topic_inline_c_1, int qos_inline_c_2) {
-
-             mosquitto_subscribe
-               ( pMosq_inline_c_0
-               , 0
-               , topic_inline_c_1
-               , qos_inline_c_2
-               )
-        ;
-}
-
diff --git a/src/Network/Mosquitto.hs b/src/Network/Mosquitto.hs
--- a/src/Network/Mosquitto.hs
+++ b/src/Network/Mosquitto.hs
@@ -20,7 +20,6 @@
 
 import qualified Language.C.Inline as C
 import qualified Language.C.Inline.Unsafe as CU
-
 import           Language.C.Inline.TypeLevel
 
 import           System.IO.Unsafe (unsafePerformIO)
@@ -72,7 +71,7 @@
 newMosquitto clearSession (C8.pack -> userId) _userData = do
    fp <- newForeignPtr_ <$> [C.block|struct mosquitto *{
         struct mosquitto * p =
-          mosquitto_new( $bs-ptr:userId
+          mosquitto_new( $bs-cstr:userId
                        , $(bool clearSession)
                        , 0 // (void * ptrUserData)
                        );
@@ -93,14 +92,27 @@
   withPtr mosq $ \pMosq ->
        [C.exp|void{
                mosquitto_tls_set( $(struct mosquitto *pMosq)
-                                , $bs-ptr:caFile
+                                , $bs-cstr:caFile
                                 , 0
-                                , $bs-ptr:certFile
-                                , $bs-ptr:keyFile
+                                , $bs-cstr:certFile
+                                , $bs-cstr:keyFile
                                 , 0
                                 )
        }|]
 
+setTlsNoClientCert :: Mosquitto a -> String -> IO ()
+setTlsNoClientCert mosq (C8.pack -> caFile) =
+  withPtr mosq $ \pMosq ->
+       [C.exp|void{
+               mosquitto_tls_set( $(struct mosquitto *pMosq)
+                                , $bs-cstr:caFile
+                                , 0
+                                , 0
+                                , 0
+                                , 0
+                                )
+       }|]
+
 setReconnectDelay
   :: Mosquitto a -- ^ mosquitto instance
   -> Bool        -- ^ exponential backoff
@@ -118,12 +130,27 @@
                )
         }|]
 
+setUsernamePassword
+  :: Mosquitto a -- ^ mosquitto instance
+  -> String      -- ^ username
+  -> String      -- ^ password
+  -> IO Int
+setUsernamePassword mosq (C8.pack -> user) (C8.pack -> pwd) =
+  fmap fromIntegral <$> withPtr mosq $ \pMosq ->
+       [C.exp|int{
+              mosquitto_username_pw_set
+                ( $(struct mosquitto *pMosq)
+                , $bs-cstr:user
+                , $bs-cstr:pwd
+                )
+       }|]
+
 connect :: Mosquitto a -> String -> Int -> Int -> IO Int
 connect mosq (C8.pack -> hostname) (fromIntegral -> port) (fromIntegral -> keepAlive) =
   fmap fromIntegral <$> withPtr mosq $ \pMosq ->
        [C.exp|int{
                mosquitto_connect( $(struct mosquitto *pMosq)
-                                , $bs-ptr:hostname
+                                , $bs-cstr:hostname
                                 , $(int port)
                                 , $(int keepAlive)
                                 )
@@ -224,7 +251,7 @@
        [C.exp|int{
              mosquitto_will_set
                ( $(struct mosquitto *pMosq)
-               , $bs-ptr:topic
+               , $bs-cstr:topic
                , $bs-len:payload
                , $bs-ptr:payload
                , $(int qos)
@@ -245,7 +272,7 @@
              mosquitto_publish
                ( $(struct mosquitto *pMosq)
                , 0
-               , $bs-ptr:topic
+               , $bs-cstr:topic
                , $bs-len:payload
                , $bs-ptr:payload
                , $(int qos)
@@ -260,7 +287,7 @@
              mosquitto_subscribe
                ( $(struct mosquitto *pMosq)
                , 0
-               , $bs-ptr:topic
+               , $bs-cstr:topic
                , $(int qos)
                )
         }|]
diff --git a/src/Network/Mosquitto/Internal/Types.hs b/src/Network/Mosquitto/Internal/Types.hs
--- a/src/Network/Mosquitto/Internal/Types.hs
+++ b/src/Network/Mosquitto/Internal/Types.hs
@@ -18,7 +18,6 @@
 
 -- haskell types
 newtype Mosquitto a = Mosquitto { unMosquitto :: ForeignPtr (C (Mosquitto a))}
--- newtype Message = Message { unMessage :: Ptr (C Message)}
 newtype RawMessage = RawMessage { unRawMessage :: Ptr (C RawMessage)}
 
 data Message = Message
