diff --git a/package/gluon-mesh-batman-adv-core/src/respondd.c b/package/gluon-mesh-batman-adv-core/src/respondd.c
index f00854577ce56c75c62d64d42af8493e672f5c27..7c2ac6c773ea7b42323a36168bedc23c166d7b91 100644
--- a/package/gluon-mesh-batman-adv-core/src/respondd.c
+++ b/package/gluon-mesh-batman-adv-core/src/respondd.c
@@ -501,7 +501,9 @@ static struct json_object * get_batadv(void) {
 
 		struct json_object *obj = json_object_new_object();
 		json_object_object_add(obj, "tq", json_object_new_int(tq));
-		json_object_object_add(obj, "lastseen", json_object_new_double(lastseen));
+		struct json_object *jso = json_object_new_double(lastseen);
+		json_object_set_serializer(jso, json_object_double_to_json_string, "%.3f", NULL);
+		json_object_object_add(obj, "lastseen", jso);
 		json_object_object_add(interface, mac1, obj);
 	}
 
diff --git a/package/gluon-mesh-vpn-fastd/src/respondd.c b/package/gluon-mesh-vpn-fastd/src/respondd.c
index 3045c77afa59b96adc7a3b956fe7404a4462b124..7354783a305f4fac597c0347fe917e24bfa8ef2d 100644
--- a/package/gluon-mesh-vpn-fastd/src/respondd.c
+++ b/package/gluon-mesh-vpn-fastd/src/respondd.c
@@ -192,7 +192,9 @@ static bool get_peer_connection(struct json_object **ret, struct json_object *co
 		int64_t established_time = json_object_get_int64(established);
 
 		*ret = json_object_new_object();
-		json_object_object_add(*ret, "established", json_object_new_double(established_time/1000.0));
+		struct json_object *jso = json_object_new_double(established_time/1000.0);
+		json_object_set_serializer(jso, json_object_double_to_json_string, "%.3f", NULL);
+		json_object_object_add(*ret, "established", jso);
 	}
 	else {
 		*ret = NULL;
diff --git a/package/gluon-node-info/src/respondd.c b/package/gluon-node-info/src/respondd.c
index dfbfd3f8d21282d00e0d51cb355d314727935768..d74c69e6cb7bdd1f3f2bafb97e9a10ca99862265 100644
--- a/package/gluon-node-info/src/respondd.c
+++ b/package/gluon-node-info/src/respondd.c
@@ -64,7 +64,9 @@ static struct json_object * get_number(struct uci_context *ctx, struct uci_secti
 	if (*end)
 		return NULL;
 
-	return json_object_new_double(d);
+	struct json_object *jso = json_object_new_double(d);
+	json_object_set_serializer(jso, json_object_double_to_json_string, "%.8f", NULL);
+	return jso;
 }
 
 static struct json_object * get_location(struct uci_context *ctx, struct uci_package *p) {
diff --git a/package/gluon-respondd/src/respondd.c b/package/gluon-respondd/src/respondd.c
index 85006d6f934e44a392d78340649a2688a8a37bd9..be3c9a7a0a68638ee58322892f56574dc4a47d6e 100644
--- a/package/gluon-respondd/src/respondd.c
+++ b/package/gluon-respondd/src/respondd.c
@@ -107,13 +107,18 @@ static struct json_object * respondd_provider_nodeinfo(void) {
 
 static void add_uptime(struct json_object *obj) {
 	FILE *f = fopen("/proc/uptime", "r");
+	struct json_object* jso;
 	if (!f)
 		return;
 
 	double uptime, idletime;
 	if (fscanf(f, "%lf %lf", &uptime, &idletime) == 2) {
-		json_object_object_add(obj, "uptime", json_object_new_double(uptime));
-		json_object_object_add(obj, "idletime", json_object_new_double(idletime));
+		jso = json_object_new_double(uptime);
+		json_object_set_serializer(jso, json_object_double_to_json_string, "%.2f", NULL);
+		json_object_object_add(obj, "uptime", jso);
+		jso = json_object_new_double(idletime);
+		json_object_set_serializer(jso, json_object_double_to_json_string, "%.2f", NULL);
+		json_object_object_add(obj, "idletime", jso);
 	}
 
 	fclose(f);
@@ -127,7 +132,9 @@ static void add_loadavg(struct json_object *obj) {
 	double loadavg;
 	unsigned proc_running, proc_total;
 	if (fscanf(f, "%lf %*f %*f %u/%u", &loadavg, &proc_running, &proc_total) == 3) {
-		json_object_object_add(obj, "loadavg", json_object_new_double(loadavg));
+		struct json_object *jso = json_object_new_double(loadavg);
+		json_object_set_serializer(jso, json_object_double_to_json_string, "%.2f", NULL);
+		json_object_object_add(obj, "loadavg", jso);
 
 		struct json_object *processes = json_object_new_object();
 		json_object_object_add(processes, "running", json_object_new_int(proc_running));
@@ -176,7 +183,9 @@ static struct json_object * get_rootfs_usage(void) {
 	if (statfs("/", &s))
 		return NULL;
 
-	return json_object_new_double(1 - (double)s.f_bfree / s.f_blocks);
+	struct json_object *jso = json_object_new_double(1 - (double)s.f_bfree / s.f_blocks);
+	json_object_set_serializer(jso, json_object_double_to_json_string, "%.4f", NULL);
+	return jso;
 }
 
 static struct json_object * respondd_provider_statistics(void) {
diff --git a/patches/openwrt/0080-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch b/patches/openwrt/0080-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch
new file mode 100644
index 0000000000000000000000000000000000000000..690d3ebb9b870b8e86c61dc2edace3fb39ff7e7a
--- /dev/null
+++ b/patches/openwrt/0080-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch
@@ -0,0 +1,108 @@
+From: Jan-Philipp Litza <janphilipp@litza.de>
+Date: Fri, 6 May 2016 16:44:29 +0200
+Subject: libjson-c: Add support for custom format strings for doubles
+
+diff --git a/package/libs/libjson-c/patches/002-custom-format-string.patch b/package/libs/libjson-c/patches/002-custom-format-string.patch
+new file mode 100644
+index 0000000..2f454c5
+--- /dev/null
++++ b/package/libs/libjson-c/patches/002-custom-format-string.patch
+@@ -0,0 +1,98 @@
++From 21dc5dc92bd56f5f4dc2c90b9ea6bf1e1407714e Mon Sep 17 00:00:00 2001
++From: Jan-Philipp Litza <janphilipp@litza.de>
++Date: Fri, 6 May 2016 16:12:44 +0200
++Subject: [PATCH] Export json_object_double_to_json_string() and use custom
++ format string
++BCC: janphilipp@litza.de
++
++---
++ json_object.c | 12 ++++++------
++ json_object.h | 28 ++++++++++++++++++++++++++++
++ 2 files changed, 34 insertions(+), 6 deletions(-)
++
++diff --git a/json_object.c b/json_object.c
++index 7d60884..46701e7 100644
++--- a/json_object.c
+++++ b/json_object.c
++@@ -55,7 +55,6 @@ static struct json_object* json_object_new(enum json_type o_type);
++ static json_object_to_json_string_fn json_object_object_to_json_string;
++ static json_object_to_json_string_fn json_object_boolean_to_json_string;
++ static json_object_to_json_string_fn json_object_int_to_json_string;
++-static json_object_to_json_string_fn json_object_double_to_json_string;
++ static json_object_to_json_string_fn json_object_string_to_json_string;
++ static json_object_to_json_string_fn json_object_array_to_json_string;
++ 
++@@ -644,10 +643,10 @@ int64_t json_object_get_int64(const struct json_object *jso)
++ 
++ /* json_object_double */
++ 
++-static int json_object_double_to_json_string(struct json_object* jso,
++-					     struct printbuf *pb,
++-					     int level,
++-						 int flags)
+++int json_object_double_to_json_string(struct json_object* jso,
+++				      struct printbuf *pb,
+++				      int level,
+++				      int flags)
++ {
++   char buf[128], *p, *q;
++   int size;
++@@ -663,7 +662,8 @@ static int json_object_double_to_json_string(struct json_object* jso,
++     else
++       size = snprintf(buf, sizeof(buf), "-Infinity");
++   else
++-    size = snprintf(buf, sizeof(buf), "%.17g", jso->o.c_double);
+++    size = snprintf(buf, sizeof(buf),
+++        jso->_userdata ? (const char*) jso->_userdata : "%.17g", jso->o.c_double);
++ 
++   p = strchr(buf, ',');
++   if (p) {
++diff --git a/json_object.h b/json_object.h
++index 2bce454..a89de44 100644
++--- a/json_object.h
+++++ b/json_object.h
++@@ -614,6 +614,9 @@ extern int64_t json_object_get_int64(const struct json_object *obj);
++ /* double type methods */
++ 
++ /** Create a new empty json_object of type json_type_double
+++ *
+++ * @see json_object_double_to_json_string() for how to set a custom format string.
+++ *
++  * @param d the double
++  * @returns a json_object of type json_type_double
++  */
++@@ -642,6 +645,31 @@ extern struct json_object* json_object_new_double(double d);
++  */
++ extern struct json_object* json_object_new_double_s(double d, const char *ds);
++ 
+++
+++/** Serialize a json_object of type json_type_double to a string.
+++ *
+++ * This function isn't meant to be called directly. Instead, you can set a
+++ * custom format string for the serialization of this double using the
+++ * following call (where "%.17g" actually is the default):
+++ *
+++ * @code
+++ *   jso = json_object_new_double(d);
+++ *   json_object_set_serializer(jso, json_object_double_to_json_string,
+++ *       "%.17g", NULL);
+++ * @endcode
+++ *
+++ * @see printf(3) man page for format strings
+++ *
+++ * @param jso The json_type_double object that is serialized.
+++ * @param pb The destination buffer.
+++ * @param level Ignored.
+++ * @param flags Ignored.
+++ */
+++extern int json_object_double_to_json_string(struct json_object* jso,
+++					     struct printbuf *pb,
+++					     int level,
+++					     int flags);
+++
++ /** Get the double floating point value of a json_object
++  *
++  * The type is coerced to a double if the passed object is not a double.
++-- 
++2.7.4
++