diff --git a/dongle_apn.c b/dongle_apn.c
index ae6327dbe9eda24fd0f2781f84c2940530fbe708..b9e2d00d1ee207284ca3936c5bf996ce46519a94 100644
--- a/dongle_apn.c
+++ b/dongle_apn.c
@@ -30,10 +30,23 @@ int list_apn_profiles(struct ubus_context *ctx, struct ubus_object *obj,
 			   struct blob_attr *msg)
 {
 	char *response = mobile_get_apn_profiles();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *apn_profiles = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(apn_profiles, ctx, req);
+
 	json_object_put(apn_profiles);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
@@ -48,11 +61,23 @@ int delete_apn_profile(struct ubus_context *ctx, struct ubus_object *obj,
 	strncpy(name, (char *)blobmsg_data(tb[APN]), 1023);
 
 	char *response = mobile_delete_apn(name);
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
 	free(response);
+fail:
 	return 0;
 }
 
@@ -67,11 +92,23 @@ int set_apn_profile(struct ubus_context *ctx, struct ubus_object *obj,
 	strncpy(name, (char *)blobmsg_data(tb[APN]), 1023);
 
 	char *response = mobile_set_apn_profile(name);
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
 	free(response);
+fail:
 	return 0;
 }
 
@@ -86,12 +123,23 @@ int create_apn_profile(struct ubus_context *ctx, struct ubus_object *obj,
 
 	strncpy(name, (char *)blobmsg_data(tb[APN]), 1023);
 	char *response = mobile_create_apn_profile(name);
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
 	free(response);
-
+fail:
 	return 0;
 }
 
@@ -100,12 +148,24 @@ int show_current_apn(struct ubus_context *ctx, struct ubus_object *obj,
 				 struct blob_attr *msg)
 {
 	//char *wan_apn = mobile_get_request("wan_apn");
-	char *wan_apn = mobile_get_wan_apn();
+	char *response = mobile_get_wan_apn();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(wan_apn);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
-	free(wan_apn);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
diff --git a/dongle_network.c b/dongle_network.c
index fb1ce47cc399faf9b3ea0c49b8a116e7913b310f..c51ca86eab913c71ca48e28e8ad987dc065d638a 100644
--- a/dongle_network.c
+++ b/dongle_network.c
@@ -22,11 +22,23 @@ int get_signal_strength(struct ubus_context *ctx, struct ubus_object *obj,
 			struct blob_attr *msg)
 {
 	char *response = mobile_get_request("rssi");
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
 	free(response);
+fail:
 	return 0;
 }
 int connect_network(struct ubus_context *ctx, struct ubus_object *obj,
@@ -34,10 +46,23 @@ int connect_network(struct ubus_context *ctx, struct ubus_object *obj,
 			struct blob_attr *msg)
 {
 	char *response = mobile_connect_network();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
@@ -46,10 +71,23 @@ int disconnect(struct ubus_context *ctx, struct ubus_object *obj,
 			struct blob_attr *msg)
 {
 	char *response = mobile_disconnect_network();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
@@ -57,12 +95,24 @@ int modem_state(struct ubus_context *ctx, struct ubus_object *obj,
 			   struct ubus_request_data *req, const char *method,
 			   struct blob_attr *msg)
 {
-	//char *response = mobile_get_request("&sms_received_flag_flag=0&sts_received_flag_flag=0&cmd=modem_main_state%2Cpin_status%2Cloginfo%2Cnew_version_state%2Ccurrent_upgrade_state%2Cis_mandatory%2Csms_received_flag%2Csts_received_flag%2Csignalbar%2Cnetwork_type%2Cnetwork_provider%2Cppp_status%2CEX_SSID1%2Cex_wifi_status%2CEX_wifi_profile%2Cm_ssid_enable%2Csms_unread_num%2CRadioOff%2Csimcard_roam%2Clan_ipaddr%2Cstation_mac%2Cbattery_charging%2Cbattery_vol_percent%2Cbattery_pers%2Cspn_display_flag%2Cplmn_display_flag%2Cspn_name_data%2Cspn_b1_flag%2Cspn_b2_flag%2Crealtime_tx_bytes%2Crealtime_rx_bytes%2Crealtime_time%2Crealtime_tx_thrpt%2Crealtime_rx_thrpt%2Cmonthly_rx_bytes%2Cmonthly_tx_bytes%2Cmonthly_time%2Cdate_month%2Cdata_volume_limit_switch%2Cdata_volume_limit_size%2Cdata_volume_alert_percent%2Cdata_volume_limit_unit%2Croam_setting_option%2Cupg_roam_switch%2Chplmn");
 	char *response = mobile_get_modem_state();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
@@ -70,12 +120,24 @@ int enable_roaming(struct ubus_context *ctx, struct ubus_object *obj,
 			   struct ubus_request_data *req, const char *method,
 			   struct blob_attr *msg)
 {
-	//char *response = mobile_post_request("/goform/goform_set_cmd_process?isTest=false&notCallback=true&goformId=SET_CONNECTION_MODE&roam_setting_option=on");
 	char *response = mobile_enable_roaming();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
@@ -83,12 +145,24 @@ int disable_roaming(struct ubus_context *ctx, struct ubus_object *obj,
 				   struct ubus_request_data *req, const char *method,
 				   struct blob_attr *msg)
 {
-	//char *response = mobile_post_request("/goform/goform_set_cmd_process?isTest=false&notCallback=true&goformId=SET_CONNECTION_MODE&roam_setting_option=off");
 	char response = *mobile_disable_roaming();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
@@ -96,12 +170,32 @@ int roam_status(struct ubus_context *ctx, struct ubus_object *obj,
 					struct ubus_request_data *req, const char *method,
 					struct blob_attr *msg)
 {
-	//char *response = mobile_get_request("roam_setting_option");
 	char *response = mobile_get_roam_status();
+
+	if (!response) {
+		printf("no respose!\n");
+		goto fail;
+	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!response)
+	{
+		printf("no respose!\n");
+		goto fail;
+	}
+	struct json_object *parsed_response = json_tokener_parse(response);
+
+	if (!parsed_response)
+	{
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
+	free(response);
+fail:
 	return 0;
 }
 
diff --git a/dongle_pin.c b/dongle_pin.c
index 73a21de96119af07492a96f8ba09d7183a38bc84..4d922cda4535ae40cbc4aeb8a1a235e1473f34d3 100644
--- a/dongle_pin.c
+++ b/dongle_pin.c
@@ -99,6 +99,11 @@ int set_pin(struct ubus_context *ctx, struct ubus_object *obj,
 		goto fail;
 	}
 	struct json_object *parsed_response = json_tokener_parse(response);
+
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	struct json_object *rv_json;
 
 	json_object_object_get_ex(parsed_response, "pin_status", &rv_json);
@@ -139,10 +144,11 @@ int set_pin(struct ubus_context *ctx, struct ubus_object *obj,
 		printf("no result available from set_pin!");
 		goto free_all;
 	}
-
 	write_to_ubus(parsed_response, ctx, req);
+
 free_all:
 	json_object_put(parsed_response);
+free_response:
 	free(response);
 fail:
 	return 0;
@@ -174,6 +180,11 @@ int disable_pin(struct ubus_context *ctx, struct ubus_object *obj,
 		goto fail;
 	}
 	struct json_object *parsed_response = json_tokener_parse(response);
+
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	struct json_object *rv_json;
 
 	json_object_object_get_ex(parsed_response, "pin_status", &rv_json);
@@ -201,9 +212,12 @@ int disable_pin(struct ubus_context *ctx, struct ubus_object *obj,
 	} else {
 		printf("already disabled!\n");
 	}
-free_all:
+
 	write_to_ubus(parsed_response, ctx, req);
+
+free_all:
 	json_object_put(parsed_response);
+free_response:
 	free(response);
 fail:
 	return 0;
@@ -235,6 +249,11 @@ int enable_pin(struct ubus_context *ctx, struct ubus_object *obj,
 		goto fail;
 	}
 	struct json_object *parsed_response = json_tokener_parse(response);
+
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	struct json_object *rv_json;
 
 	json_object_object_get_ex(parsed_response, "pin_status", &rv_json);
@@ -263,11 +282,13 @@ int enable_pin(struct ubus_context *ctx, struct ubus_object *obj,
 		printf("already enabled!\n");
 	}
 
-free_all:
 	write_to_ubus(parsed_response, ctx, req);
+
+free_all:
 	json_object_put(parsed_response);
-fail:
+free_response:
 	free(response);
+fail:
 	return 0;
 }
 
@@ -297,10 +318,17 @@ int verify_pin(struct ubus_context *ctx, struct ubus_object *obj,
 	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
+free_all:
 	json_object_put(parsed_response);
-fail:
+free_response:
 	free(response);
+fail:
 	return 0;
 }
 
@@ -316,8 +344,14 @@ int remaining_tries(struct ubus_context *ctx, struct ubus_object *obj,
 	}
 	struct json_object *parsed_response = json_tokener_parse(response);
 
+	if (!parsed_response) {
+		printf("No valid JSON, failed parsing!\n");
+		goto free_response;
+	}
 	write_to_ubus(parsed_response, ctx, req);
+
 	json_object_put(parsed_response);
+free_response:
 	free(response);
 fail:
 	return 0;
diff --git a/libmobile.c b/libmobile.c
index b348cc591024fdf07bd89c5bcad76e8d5ac36845..b4d212635bbe45a7c76375a5b83d5fd1c3986e29 100644
--- a/libmobile.c
+++ b/libmobile.c
@@ -180,6 +180,10 @@ char *mobile_get_pin_status(void)
 	return mobile_get_request("pin_status");
 }
 
+char *mobile_get_rssi(void)
+{
+	return mobile_get_request("rssi");
+}
 
 char *mobile_get_modem_state(void)
 {
diff --git a/libmobile.h b/libmobile.h
index 7b3116f229cbdc9726db327fc49fb98b3fabd7e6..4178b5982bc42bcd9f12dcca95bbfe7917d28c74 100644
--- a/libmobile.h
+++ b/libmobile.h
@@ -231,6 +231,17 @@ char *mobile_get_pinnumber(void);
  */
 char *mobile_get_pin_status(void);
 
+/**
+ * Function: mobile_get_rssi
+ *
+ * Gets the rssi, indicating the signal strength.
+ *
+ * Returns:
+ *		A string containing the servers response in JSON format, {"rssi": {} } on success.
+ *		NULL on failure.
+ */
+char *mobile_get_rssi(void);
+
 /**
  * Function: mobile_get_modem_state
  *