diff --git a/Makefile b/Makefile
index f38c1cead4eec51bfc5403eee26af12a7a90ee53..b8c7caf35b1a3beb2676c37a4531c508d26e4147 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,9 @@
-CC			= gcc
+CC		= gcc
 CWFLAGS		= -g -Wall
 CFLAGS	       += "-I$(STAGING_DIR)/usr/include/libxml2/"
-LIBS		= -ljson-c -lubox -lubus -lcurl -lmobile_zte -lmobile_hilink -lblobmsg_json
-
-all: libmobile1_zte libmobile2_zte  libmobile1_hilink libmobile2_hilink common_hilink common_zte stack dongle_infrastructure dongle
+LIBS		= -ljson-c -lubox -lubus -lcurl -lblobmsg_json -lxml2
+# -lmobile_zte -lmobile_hilink
+all: libmobile1_zte libmobile2_zte libmobile1_hilink libmobile2_hilink common stack_operations dongle_infrastructure dongle
 
 ZOBJS		= libmobile_zte.o
 ZSRCS		= libmobile_zte.c
@@ -24,27 +24,26 @@ libmobile2_hilink: ${HLOBJS}
 COBJS		= common.o
 CSRCS		= common.c
 common: ${COBJS}
-	${CC} -c ${CFLAGS} ${CSRCS} -o ${COBJS}
+	${CC} -c ${CFLAGS} ${CSRCS} -o ${COBJS} -lmobile_zte
 
 STOBJS		= stack_operations.o
 STSRCS		= stack_operations.c
 stack_operations: ${STOBJS}
-	${CC} -c ${STSRCS} -o ${STOBJS}
+	${CC} -c ${CFLAGS} ${STSRCS} -o ${STOBJS}
 
 DIOBJS		= dongle_infrastructure.o
 DISRCS		= dongle_infrastructure.c
 dongle_infrastructure: ${DIOBJS}
-	${CC} -c ${CWFLAGS} ${DISRCS} ${STOBJS} ${COBJS} -o ${DIOBJS} -L . ${LIBS}
+	${CC} -c ${CWFLAGS} ${CFLAGS} ${DISRCS} ${STOBJS} ${COBJS} -o ${DIOBJS} -L . ${LIBS} -lmobile_zte
 
 dongle: dongle.o
-	${CC} ${CWFLAGS} dongle.o ${ZCOBJS} ${DIOBJS} ${STOBJS} -o dongle -L . ${LIBS}
+	${CC} ${CWFLAGS} ${CFLAGS} dongle.o ${DIOBJS} ${STOBJS} ${COBJS} -o dongle -L . ${LIBS} -lmobile_zte
 
 clean:
-	rm -f dongle *.o *.so
+	rm -f dongle_apn dongle_pin dongle_network *.o *.so
 
 codingstyle:
 	checkpatch.pl --no-tree -f *.c --terse
 
 cppcheck:
 	cppcheck --enable=all *.c
-
diff --git a/common.h b/common.h
index f9bc760b01b7d18e648ff8a35637a91efd3dfe61..9d447c7a9c191c2d6e0bed8c6b321d54b8a77294 100644
--- a/common.h
+++ b/common.h
@@ -23,7 +23,7 @@
 #include <libxml/xpath.h>
 #include <libxml/xpathInternals.h>
 
-#include "libmobile_hilink.h"
+//#include "libmobile_hilink.h"
 #include "libmobile_zte.h"
 
 extern int debug;
@@ -36,6 +36,14 @@ extern struct ubus_context *global_ctx;
 			fprintf(stderr, __VA_ARGS__); \
 	} while (0)
 
+#define TAG_CONTENT_SIZE 100
+
+struct write_result
+{
+	char *data;
+	int pos;
+};
+
 char *get_ip(char *if_name);
 /**
  * Function: print_to_ubus
diff --git a/dongle.c b/dongle.c
index cb7ab4d2c46a18ec21ba676bd6cd5112ee448810..3ed2e8acc6919a17cf87f7e09c1197e04811a4c9 100644
--- a/dongle.c
+++ b/dongle.c
@@ -25,10 +25,10 @@ static struct option long_options[] = {
 	{0,	0,	0,	0}
 };
 
-enum {
+/*enum {
 	DEV,
 	__DEV_MAX
-};
+};*/
 
 const struct blobmsg_policy dev_policy[__DEV_MAX] = {
 	[DEV] = {.name = "dev", .type = BLOBMSG_TYPE_STRING},
diff --git a/dongle_apn.h b/dongle_apn.h
new file mode 100644
index 0000000000000000000000000000000000000000..1a4fb650b6425c95a3d636159cc49a04d16dd0b6
--- /dev/null
+++ b/dongle_apn.h
@@ -0,0 +1,6 @@
+#ifndef DONGLE_APN_H
+#define DONGLE_APN_H
+#include "common.h"
+
+int expose_apn_object(struct ubus_context *ctx);
+#endif
diff --git a/dongle_infrastructure.c b/dongle_infrastructure.c
index 9ac76160620f7575fad49906493397c7c62eaff1..deb7e9ca336bc59b473c0c859df9f4927012aedd 100644
--- a/dongle_infrastructure.c
+++ b/dongle_infrastructure.c
@@ -18,38 +18,6 @@
 #include "dongle.h"
 #include "stack_operations.h"
 
-struct ubus_object *dongle_create_dynamic_object(struct device *dev_instance);
-int publish_ubus_object(struct ubus_context *ctx, struct ubus_object *obj);
-int unpublish_ubus_object(struct ubus_context *ctx, struct ubus_object *obj);
-void dongle_destroy_dynamic_object(struct ubus_object *obj);
-int get_devices(void);
-char *get_device_ip(char *device_name);
-char *get_device_ip_alt(char *device_name);
-int tag_missing_devices(void);
-int add_device(struct device *node);
-int delete_device_all_devices(void);
-int delete_device_by_name(char *name);
-int delete_device(struct device *dev);
-void free_device(struct device *dev);
-void free_usb(struct USB *usb);
-struct device *search_list(char *name);
-
-
-
-
-int expose_infrastructure_object(struct ubus_context *ctx)
-{
-	int rv;
-
-	rv = ubus_add_object(ctx, &infrastructure_object);
-	if (rv) {
-		debug_print("failed to add dongle.pin to ubus!\n");
-		return -1;
-	}
-
-	return 0;
-}
-
 //dynamic object policies..
 const struct blobmsg_policy set_pin_policy[__SET_PIN_MAX] = {
 	[NEW_PIN] = {.name = "new_pin", .type = BLOBMSG_TYPE_STRING},
@@ -460,6 +428,9 @@ int unlock_sim(struct ubus_context *ctx, struct ubus_object *obj,
 	if (json_object_get_int(rv_json) > 0)
 		goto fail_unknown;
 */
+
+	blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
+
 	if (!tb[PUK] || !tb[UNLOCK_PIN]) {
 		debug_print("Please enter both a pin and a puk code!\n");
 		goto fail_input;
diff --git a/dongle_infrastructure.h b/dongle_infrastructure.h
index 3fb0282c32b8645f4499a23438a42f2dd5700a86..22b32cd3ee34d7019e01ff15e73d1fb2f183869d 100644
--- a/dongle_infrastructure.h
+++ b/dongle_infrastructure.h
@@ -46,14 +46,6 @@ enum {
 };
 
 
-struct USB {
-	char *product;
-	char *product_id;
-	char *vendor_id;
-	char *if_name;
-};
-
-
 int devices_status(struct uloop_timeout *t);
 struct ubus_object *dongle_create_dynamic_object(struct device *dev_instance);
 int publish_ubus_object(struct ubus_context *ctx, struct ubus_object *obj);
diff --git a/dongle_network.h b/dongle_network.h
new file mode 100644
index 0000000000000000000000000000000000000000..8fd12aff7e69ed43405286e68816effd065f471a
--- /dev/null
+++ b/dongle_network.h
@@ -0,0 +1,28 @@
+#ifndef NETWORK_H
+#define NETWORK_H
+#include "common.h"
+
+int expose_network_object(struct ubus_context *ctx);
+
+int get_signal_strength(struct ubus_context *ctx, struct ubus_object *obj,
+						struct ubus_request_data *req, const char *method,
+						struct blob_attr *msg);
+int connect_network(struct ubus_context *ctx, struct ubus_object *obj,
+					struct ubus_request_data *req, const char *method,
+					struct blob_attr *msg);
+int disconnect(struct ubus_context *ctx, struct ubus_object *obj,
+				struct ubus_request_data *req, const char *method,
+				struct blob_attr *msg);
+int modem_state(struct ubus_context *ctx, struct ubus_object *obj,
+				struct ubus_request_data *req, const char *method,
+				struct blob_attr *msg);
+int enable_roaming(struct ubus_context *ctx, struct ubus_object *obj,
+					struct ubus_request_data *req, const char *method,
+					struct blob_attr *msg);
+int disable_roaming(struct ubus_context *ctx, struct ubus_object *obj,
+					struct ubus_request_data *req, const char *method,
+					struct blob_attr *msg);
+int roam_status(struct ubus_context *ctx, struct ubus_object *obj,
+					struct ubus_request_data *req, const char *method,
+					struct blob_attr *msg);
+#endif
diff --git a/stack_operations.c b/stack_operations.c
index 3116d1c04b43da8b4b508bbe046cf1bdc9496434..25add585e55abc29c1a6a2b54db9da095b6c067b 100644
--- a/stack_operations.c
+++ b/stack_operations.c
@@ -1,4 +1,4 @@
-#include "stack.h"
+#include "stack_operations.h"
 
 void push(struct directory *dr, struct list_head *list)
 {