diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/021-interface-roles b/package/gluon-core/luasrc/lib/gluon/upgrade/021-interface-roles
index 5d27fb708b3a8049e73fc1c05d8c17f8f6187767..6e39219a6948a81e60e258277c02fb4c4dbc220e 100755
--- a/package/gluon-core/luasrc/lib/gluon/upgrade/021-interface-roles
+++ b/package/gluon-core/luasrc/lib/gluon/upgrade/021-interface-roles
@@ -63,4 +63,19 @@ for iface in pairs(interfaces) do
 	end
 end
 
+-- Fix invalid role configurations
+
+uci:foreach('gluon', 'interface', function(interface)
+
+	local function has_role(role)
+		return util.contains(interface.role, role)
+	end
+
+	if has_role('client') and (has_role('mesh') or has_role('uplink')) then
+		-- remove 'client' role
+		util.remove_from_set(interface.role, 'client')
+		uci:set('gluon', interface['.name'], 'role', interface.role)
+	end
+end)
+
 uci:save('gluon')