diff --git a/lib/include/btdevice.h b/lib/include/btdevice.h
index 260c5a7845ca3b95180988755076fa87822a751a..83acdd89915ec66a28eaefceb4d9b85e086c3765 100644
--- a/lib/include/btdevice.h
+++ b/lib/include/btdevice.h
@@ -21,6 +21,7 @@ namespace statemachine
 {
 	struct btdevice_sm;
 	struct idle;
+	struct pairing_connecting;
 	struct pairing_done;
 	struct pairing_failed;
 	struct connecting;
@@ -108,6 +109,7 @@ public:
 	 */
 	friend struct statemachine::btdevice_sm;
 	friend struct statemachine::idle;
+	friend struct statemachine::pairing_connecting;
 	friend struct statemachine::pairing_done;
 	friend struct statemachine::pairing_failed;
 	friend struct statemachine::connecting;
diff --git a/lib/src/btdevice_statemachine.h b/lib/src/btdevice_statemachine.h
index 53975f441532570ea914b26904a3cc114c007129..d5dba92d0ddeb9a04aee3538216b10d535853e87 100644
--- a/lib/src/btdevice_statemachine.h
+++ b/lib/src/btdevice_statemachine.h
@@ -66,6 +66,7 @@ struct event_secure_simple_pairing_successful :
 	sc::event<event_secure_simple_pairing_successful> {};
 struct event_secure_simple_pairing_failed :
 	sc::event<event_secure_simple_pairing_failed> {};
+struct event_pairing_done : sc::event<event_pairing_done> {};
 struct event_done : sc::event<event_done> {};
 struct event_auth_successful : sc::event<event_auth_successful> {};
 
@@ -73,9 +74,9 @@ struct event_auth_successful : sc::event<event_auth_successful> {};
  * State machine definition
  */
 
-struct idle;
+struct normal;
 
-struct btdevice_sm : sc::state_machine<btdevice_sm, idle>
+struct btdevice_sm : sc::state_machine<btdevice_sm, normal>
 {
 	btdevice_sm(btdevice &device) : device(device)
 	{
@@ -114,6 +115,9 @@ private:
  * States
  */
 
+struct normal;
+struct pairing;
+
 struct init;
 struct idle;
 struct start_pairing;
@@ -127,10 +131,30 @@ struct pairing_failed;
 struct enable_encryption;
 struct connecting;
 
-struct idle : sc::state<idle, btdevice_sm>, state_logger
+struct normal : sc::state<normal, btdevice_sm, idle>, state_logger
+{
+	typedef mpl::list<
+		sc::transition<event_start_pairing, pairing>> reactions;
+
+	normal(my_context ctx) : my_base(ctx), state_logger(ctx_device(), "normal")
+	{
+	}
+};
+
+struct pairing : sc::state<pairing, btdevice_sm, start_pairing>, state_logger
+{
+	typedef mpl::list<
+		sc::transition<event_pairing_done, normal>> reactions;
+
+	pairing(my_context ctx) : my_base(ctx),
+		state_logger(ctx_device(), "pairing")
+	{
+	}
+};
+
+struct idle : sc::state<idle, normal>, state_logger
 {
 	typedef mpl::list<
-		sc::transition<event_start_pairing, start_pairing>,
 		sc::transition<event_auth_successful, enable_encryption>,
 		sc::transition<event_connect, connecting>> reactions;
 
@@ -145,7 +169,7 @@ struct idle : sc::state<idle, btdevice_sm>, state_logger
 	}
 };
 
-struct start_pairing : sc::state<start_pairing, btdevice_sm>, state_logger
+struct start_pairing : sc::state<start_pairing, pairing>, state_logger
 {
 	typedef mpl::list<
 		sc::transition<event_connect, pairing_connecting>,
@@ -161,7 +185,7 @@ struct start_pairing : sc::state<start_pairing, btdevice_sm>, state_logger
 	}
 };
 
-struct pairing_connecting : sc::state<pairing_connecting, btdevice_sm>, state_logger
+struct pairing_connecting : sc::state<pairing_connecting, pairing>, state_logger
 {
 	typedef mpl::list<
 		sc::transition<event_connect_failed, pairing_failed>,
@@ -171,11 +195,12 @@ struct pairing_connecting : sc::state<pairing_connecting, btdevice_sm>, state_lo
 	pairing_connecting(my_context ctx) : my_base(ctx),
 		state_logger(ctx_device(), "pairing_connecting")
 	{
-		ctx_device().connect();
+		ctx_device().socket->connect_device(&ctx_device(),
+		                                    ctx_device().get_addr());
 	}
 };
 
-struct requesting_auth : sc::state<requesting_auth, btdevice_sm>, state_logger
+struct requesting_auth : sc::state<requesting_auth, pairing>, state_logger
 {
 	typedef mpl::list<
 		sc::transition<event_auth_request_failed, pairing_failed>,
@@ -188,7 +213,7 @@ struct requesting_auth : sc::state<requesting_auth, btdevice_sm>, state_logger
 	}
 };
 
-struct link_key_request : sc::state<link_key_request, btdevice_sm>,
+struct link_key_request : sc::state<link_key_request, pairing>,
 	state_logger
 {
 	typedef mpl::list<
@@ -203,7 +228,7 @@ struct link_key_request : sc::state<link_key_request, btdevice_sm>,
 	}
 };
 
-struct io_capability_request : sc::state<io_capability_request, btdevice_sm>,
+struct io_capability_request : sc::state<io_capability_request, pairing>,
 	state_logger
 {
 	typedef mpl::list<
@@ -219,7 +244,7 @@ struct io_capability_request : sc::state<io_capability_request, btdevice_sm>,
 };
 
 struct user_confirmation_request :
-	sc::state<user_confirmation_request, btdevice_sm>,
+	sc::state<user_confirmation_request, pairing>,
 	state_logger
 {
 	typedef mpl::list<
@@ -237,36 +262,32 @@ struct user_confirmation_request :
 };
 
 struct pairing_done :
-	sc::state<pairing_done, btdevice_sm>,
+	sc::state<pairing_done, pairing>,
 	state_logger
 {
-	typedef sc::transition<event_done, idle> reactions;
-
 	pairing_done(my_context ctx) : my_base(ctx),
 		state_logger(ctx_device(), "pairing_done")
 	{
 		ctx_device().pairing_finished(true);
 
-		post_event(event_done());
+		post_event(event_pairing_done());
 	}
 };
 
 struct pairing_failed :
-	sc::state<pairing_failed, btdevice_sm>,
+	sc::state<pairing_failed, pairing>,
 	state_logger
 {
-	typedef sc::transition<event_done, idle> reactions;
-
 	pairing_failed(my_context ctx) : my_base(ctx),
 		state_logger(ctx_device(), "pairing_failed")
 	{
 		ctx_device().pairing_finished(false);
 
-		post_event(event_done());
+		post_event(event_pairing_done());
 	}
 };
 
-struct enable_encryption : sc::state<enable_encryption, btdevice_sm>,
+struct enable_encryption : sc::state<enable_encryption, normal>,
 	state_logger
 {
 	typedef sc::transition<event_done, idle> reactions;
@@ -280,7 +301,7 @@ struct enable_encryption : sc::state<enable_encryption, btdevice_sm>,
 	}
 };
 
-struct connecting : sc::state<connecting, btdevice_sm>,
+struct connecting : sc::state<connecting, normal>,
 	state_logger
 {
 	typedef mpl::list<