diff --git a/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua b/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua
index 7f3f62e285f7e82541d4438acfa62e7f3aba4813..3c9b8601065dbae50d72060c17b6279b3e968488 100644
--- a/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua
+++ b/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua
@@ -3,6 +3,7 @@
 module('gluon.announce', package.seeall)
 
 fs = require 'luci.fs'
+json = require 'luci.json'
 uci = require('luci.model.uci').cursor()
 util = require 'luci.util'
 
@@ -15,7 +16,7 @@ local function collect_entry(entry)
 end
 
 function collect_dir(dir)
-	local ret = {}
+	local ret = { [json.null] = true }
 
 	for _, entry in ipairs(fs.dir(dir)) do
 		if entry:sub(1, 1) ~= '.' then
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv
index f93a11f9c1479cefd7b1d174b6433e715447f6a1..cfdd72dc69df8d9a0655d7f046ee5b2c6eefb46b 100644
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv
@@ -1,7 +1,3 @@
-local json = require 'luci.json'
-local util = require 'luci.util'
-local fs = require 'nixio.fs'
-
 local ifname_address_cache = {}
 
 function ifname2address(ifname)
@@ -26,7 +22,7 @@ function batadv()
     if mac1 ~= nil and mac1 == mac2 then
       ifaddress = ifname2address(ifname)
       if interfaces[ifaddress] == nil then
-        interfaces[ifaddress] = { neighbours = {} }
+        interfaces[ifaddress] = { neighbours = { [json.null] = true } }
       end
 
       interfaces[ifaddress].neighbours[mac1] = { tq = tonumber(tq)
@@ -35,7 +31,9 @@ function batadv()
     end
   end
 
-  return interfaces
+  if next(interfaces) then
+    return interfaces
+  end
 end
 
 return batadv()
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi
index d3754222352de70ce439f2df8c0382f4756c774b..26168003ab9b6e50324aec04cc1a4aabf650f89f 100644
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi
@@ -1,6 +1,3 @@
-local json = require 'luci.json'
-local util = require 'luci.util'
-local fs = require 'nixio.fs'
 local iwinfo = require 'iwinfo'
 
 function neighbours(iface)
@@ -12,7 +9,9 @@ function neighbours(iface)
                           }
   end
 
-  return stations
+  if next(stations) then
+    return stations
+  end
 end
 
 function interfaces()
@@ -38,4 +37,6 @@ for address, iface in pairs(interfaces()) do
   wifi[address] = { neighbours = neighbours(iface) }
 end
 
-return wifi
+if next(wifi) then
+  return wifi
+end
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces
index 97180b81b4e7324c6ce5d18dac77f7c7c4956f6e..e0c3c9acd24fefd4fa9196c086eb6ed8d67c753d 100644
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces
@@ -48,5 +48,6 @@ end
 return {
   wireless = nil_table(wireless),
   tunnel = nil_table(tunnel),
-  other = nil_table(other)
+  other = nil_table(other),
+  [json.null] = true
 }
diff --git a/patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch b/patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0f0a2cffe78698ca689f6b7917c7fcc31ee3caf5
--- /dev/null
+++ b/patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch
@@ -0,0 +1,36 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Thu, 4 Jun 2015 21:03:24 +0200
+Subject: luci-lib-json: ignore null keys to allow encoding empty objects
+
+There is currently no way to encode an empty object {}, as empty tables are
+encoded as empty lists [].
+
+With this patch, encode() will ignore table fields with the key json.null (which
+doesn't make sense anyways). This allows adding a field with key json.null to
+force encoding it as an object.
+
+Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
+
+diff --git a/libs/json/luasrc/json.lua b/libs/json/luasrc/json.lua
+index 8dbaf91..11a5608 100644
+--- a/libs/json/luasrc/json.lua
++++ b/libs/json/luasrc/json.lua
+@@ -205,11 +205,13 @@ function Encoder.parse_iter(self, obj)
+ 		local first = true
+ 
+ 		for key, entry in pairs(obj) do
+-			first = first or self:put(",")
+-			first = first and false
+-			self:parse_string(tostring(key))
+-			self:put(":")
+-			self:dispatch(entry)
++			if key ~= null then
++				first = first or self:put(",")
++				first = first and false
++				self:parse_string(tostring(key))
++				self:put(":")
++				self:dispatch(entry)
++			end
+ 		end
+ 
+ 		self:put("}")