diff --git a/api.c b/api.c
index 77b443cb6f32204a333112837344e198a3a54fa8..39d2565a72a8f7fccfe741acaae0035256215843 100644
--- a/api.c
+++ b/api.c
@@ -155,12 +155,55 @@ int add_array(struct json_object *ptr, int idx, char *val, enum json_type type,
 	return 0;
 }
 
+int add_val(struct json_object *ptr, char *key, char *val, enum json_type type)
+{
+	struct json_object *j_val;
+	int idx;
+
+	idx = get_idx(key);
+	printf("%s %d key=%s\n", __func__, __LINE__, key);
+	j_val = dummy_val(val, type);
+	if (!j_val || !json_object_is_type(j_val, type)) {
+		fprintf(stderr, "Invalid input value!\n");
+		return -1;
+	}
+	printf("%s %d val=%s, j_val=%s\n", __func__, __LINE__, val, json_object_get_string(j_val));
+
+
+	if (json_type_object == type) {
+		/* TODO: does this actually work? what would be the test case for this? */
+		if (idx == -2) {
+			struct json_object *tmp = ptr;
+
+			if (key)
+				ptr = json_object_new_object();
+
+			json_object_object_foreach(j_val, key1, val1)
+				json_object_object_add(ptr, key1, val1);
+			if (key)
+				json_object_object_add(tmp, key, ptr);
+		} else {
+			add_array(ptr, idx, val, type, key);
+		}
+
+		return 0;
+	}
+
+
+	if (idx == -2 || type == json_type_array)
+		json_object_object_add(ptr, key, j_val);
+	else
+		add_array(ptr, idx, val, type, key);
+
+	return 0;
+}
+
 int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type type)
 {
 	struct json_object *ptr, *tmp, *tar;
 	const char *delimiter = ".";
-	char buffer[1024] = {0};
-	char *p, *prev = fmt;
+	char fmt_cpy[1024] = {0};
+	char *p, *key = fmt;
 	int idx;
 
 	if (!*src) {
@@ -174,25 +217,26 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type
 	ptr = tmp = *src;
 	if (!fmt)
 		goto add_key;
-	printf("%s %d\n", __func__, __LINE__);
-	strcpy(buffer, fmt);
-	printf("%s %d\n", __func__, __LINE__);
-	p = strtok(buffer,delimiter);
-	printf("%s %d\n", __func__, __LINE__);
+
+	strcpy(fmt_cpy, fmt);
+	p = strtok(fmt_cpy,delimiter);
+
 	while (p != NULL) {
-		prev = p;
+		key = p;
 		p = strtok(NULL, delimiter);
 
-		/* if next key exists, parse prev key, let switch-case add/alter last key */
+		/* if next key exists, parse key, let switch-case add/alter last key */
 		if (p) {
 			/* TODO: pretty wonky order with get idx first to overwrite braces?*/
-			idx = get_idx(prev);
-			json_object_object_get_ex(tmp, prev, &ptr);
+			idx = get_idx(key);
+
 			/* if we need to step further and currently marked value isnt an object, we need to overwrite it */
+			json_object_object_get_ex(tmp, key, &ptr);
 			if (!json_object_is_type(ptr, json_type_object) && !json_object_is_type(ptr, json_type_array)) {
 				ptr = json_object_new_object();
-				json_object_object_add(tmp, prev, ptr);
+				json_object_object_add(tmp, key, ptr);
 			}
+			printf("key=%s\n", key);
 			printf("p=%s\n", p);
 
 			/* TODO: make enums for rv of get_idx */
@@ -214,21 +258,21 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type
 					printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(tmp)), json_type_to_name(json_object_get_type(ptr)));
 					printf("tmp=%s\n", json_object_get_string(tmp));
 					printf("ptr=%s\n", json_object_get_string(ptr));
-					printf("prev=%s\n", prev);
-					json_object_object_add(tmp, prev, ptr);
+					printf("key=%s\n", key);
+					json_object_object_add(tmp, key, ptr);
 					json_object_array_add(ptr, json_object_new_object());
 					ptr = json_object_array_get_idx(ptr, json_object_array_length(ptr) - 1);
 					//json_object_array_add(tmp, ptr);
 				}
 			}
 
-			/* create prev object if it does not exist */
+			/* create key object if it does not exist */
 			if (!ptr) {
 				ptr = json_object_new_object();
 				if (json_object_get_type(tmp) == json_type_array)
 					json_object_array_add(tmp, ptr);
 				else if (json_object_get_type(tmp) == json_type_object)
-					json_object_object_add(tmp, prev, ptr);
+					json_object_object_add(tmp, key, ptr);
 				printf("%s %d: ptr=%s\n", __func__, __LINE__, json_object_get_string(ptr));
 				printf("%s %d: tmp=%s\n", __func__, __LINE__, json_object_get_string(tmp));
 			}
@@ -237,101 +281,13 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type
 		tmp = ptr;
 	}
 
-	printf("%s %d prev=%s\n", __func__, __LINE__, prev);
+	printf("%s %d key=%s\n", __func__, __LINE__, key);
 
-	json_object_object_get_ex(ptr, prev, &tar);
+	json_object_object_get_ex(ptr, key, &tar);
 
 add_key:
 printf("%s %d\n", __func__, __LINE__);
-	switch(type) {
-	case json_type_object:
-	{
-		struct json_object *parsed_val = json_tokener_parse(val);
-
-		printf("%s %d\n", __func__, __LINE__);
-		if (!parsed_val) {
-			fprintf(stderr, "Invalid object format\n");
-			return -1;
-		} else if (type != json_object_get_type(parsed_val)) {
-			fprintf(stderr, "Types don't match!\n");
-			return -1;
-		}
-
-		printf("%s %d\n", __func__, __LINE__);
-		/* TODO: does this actually work? what would be the test case for this? */
-		idx = get_idx(prev);
-		printf("%s %d\n", __func__, __LINE__);
-		if (idx == -2) {
-			if (prev)
-				ptr = json_object_new_object();
-			json_object_object_foreach(parsed_val, key1, val1)
-				json_object_object_add(ptr, key1, val1);
-			if (prev)
-				json_object_object_add(tmp, prev, ptr);
-		} else {
-			add_array(ptr, idx, val, type, prev);
-		}
-	}
-	break;
-	case json_type_string:
-		idx = get_idx(prev);
-		if (idx == -2)
-			json_object_object_add(ptr, prev, json_object_new_string(val));
-		else {
-			printf("%s %d\n", __func__, __LINE__);
-			add_array(ptr, idx, val, type, prev);
-		}
-	break;
-	case json_type_int:
-		printf("%s %d prev = %s\n", __func__, __LINE__, prev);
-		idx = get_idx(prev);
-		if (idx == -2) {
-			printf("%s %d ptr=%s, idx=%d\n", __func__, __LINE__, json_object_get_string(ptr), idx);
-			json_object_object_add(ptr, prev, json_object_new_int(atoi(val)));
-		} else {
-			printf("%s %d\n", __func__, __LINE__);
-			add_array(ptr, idx, val, type, prev);
-		}
-	break;
-	case json_type_array:
-	{
-		struct json_object *parsed_val = json_tokener_parse(val);
-
-		if (!parsed_val) {
-			fprintf(stderr, "Invalid array format\n");
-			return -1;
-		} else if (type != json_object_get_type(parsed_val)) {
-			fprintf(stderr, "Types don't match!\n");
-			return -1;
-		}
-
-		json_object_object_add(ptr, prev, parsed_val);
-	}
-	break;
-	case json_type_double:
-		idx = get_idx(prev);
-		if (idx == -2)
-			json_object_object_add(ptr, prev, json_object_new_double(atof(val)));
-		else {
-			printf("%s %d\n", __func__, __LINE__);
-			add_array(ptr, idx, val, type, prev);
-		}
-	break;
-	case json_type_boolean:
-	{
-		bool bool_val = false;
-
-		if (strncasecmp(val, "true", 4) || atoi(val) == 1)
-			bool_val = true;
-
-
-		json_object_object_add(ptr, prev, json_object_new_boolean(bool_val));
-	}
-	break;
-	default:
-		fprintf(stderr, "Not valid input type!\n");
-	break;
-	}
+	add_val(ptr, key, val, type);
 
 	return 0;
 }
@@ -339,7 +295,7 @@ printf("%s %d\n", __func__, __LINE__);
 int set(char *fmt, struct json_object *src, struct json_object *val)
 {
 	const char *delimiter = ".";
-	char buffer[1024] = {0};
+	char fmt_cpy[1024] = {0};
 	char *p;
 
 	if (json_object_get_type(val) != json_type_object) {
@@ -349,10 +305,10 @@ int set(char *fmt, struct json_object *src, struct json_object *val)
 
 	src = get(fmt, src);
 
-	strcpy(buffer, fmt);
+	strcpy(fmt_cpy, fmt);
 
 	/* TODO: put this in some separate function */
-	for (p = strtok(buffer,delimiter); p != NULL; p = strtok(NULL, delimiter)) {
+	for (p = strtok(fmt_cpy,delimiter); p != NULL; p = strtok(NULL, delimiter)) {
 		struct json_object *ptr, *tmp = src;
 
 		json_object_object_get_ex(tmp, p, &ptr);
@@ -374,11 +330,11 @@ struct json_object *get(char *fmt, struct json_object *src)
 {
 	struct json_object *ptr, *tmp = src;
 	const char *delimiter = ".";
-	char buffer[1024] = {0};
+	char fmt_cpy[1024] = {0};
 
-	strcpy(buffer, fmt);
+	strcpy(fmt_cpy, fmt);
 
-	for (char *p = strtok(buffer,delimiter); p != NULL; p = strtok(NULL, delimiter)) {
+	for (char *p = strtok(fmt_cpy,delimiter); p != NULL; p = strtok(NULL, delimiter)) {
 		json_object_object_get_ex(tmp, p, &ptr);
 		tmp = ptr;
 	}