diff -Naur luci-0.9.0.orig/applications/luci-qos/luasrc/model/cbi/qos/qos.lua luci-0.9.0/applications/luci-qos/luasrc/model/cbi/qos/qos.lua
--- luci-0.9.0.orig/applications/luci-qos/luasrc/model/cbi/qos/qos.lua	2010-03-27 04:02:56.000000000 +0100
+++ luci-0.9.0/applications/luci-qos/luasrc/model/cbi/qos/qos.lua	2011-04-21 23:04:12.000000000 +0200
@@ -19,7 +19,8 @@
 
 s = m:section(TypedSection, "interface", translate("interfaces"))
 s.addremove = true
-s.anonymous = true
+-- &&& need interface names...
+s.anonymous = false
 
 s:option(Flag, "enabled", translate("enable"))
 
@@ -31,6 +32,11 @@
 
 s:option(Flag, "halfduplex")
 
+s:option(Flag,  "dynamicbw")
+s:option(Value, "dynamicbwip")
+s:option(Value, "dynamicbwcycle", nil, "msec")
+s:option(Value, "dynamicbwrtt", nil, "msec")
+
 s:option(Value, "download", nil, "kb/s")
 
 s:option(Value, "upload", nil, "kb/s")
diff -Naur luci-0.9.0.orig/applications/luci-qos/root/lib/uci/schema/default/qos luci-0.9.0/applications/luci-qos/root/lib/uci/schema/default/qos
--- luci-0.9.0.orig/applications/luci-qos/root/lib/uci/schema/default/qos	2009-05-18 18:16:18.000000000 +0200
+++ luci-0.9.0/applications/luci-qos/root/lib/uci/schema/default/qos	2011-04-21 22:24:45.000000000 +0200
@@ -28,6 +28,29 @@
 	option datatype	'boolean'
 
 config variable
+	option name	'dynamicbw'
+	option title	'Dynamic QOS - Dynamically adapt to bandwidth'
+	option section	'qos.dynamicbw'
+	option datatype	'boolean'
+
+config variable
+	option name	'dynamicbwcycle'
+	option title	'Dynamic QOS - Cycle time (msec)'
+	option section	'qos.dynamicbwcycle'
+	option datatype	'integer'
+
+config variable
+	option name	'dynamicbwip'
+	option title	'Dynamic QOS - Remote Link IP'
+	option section	'qos.dynamicbwip'
+
+config variable
+	option name	'dynamicbwrtt'
+	option title	'Dynamic QOS - Max RTT on Link (msec)'
+	option section	'qos.dynamicbwrtt'
+	option datatype	'integer'
+
+config variable
 	option name	'classgroup'
 	option title	'QoS classification'
 	option section	'qos.interface'
diff -Naur luci-0.9.0.orig/libs/sys/luasrc/sys.lua luci-0.9.0/libs/sys/luasrc/sys.lua
--- luci-0.9.0.orig/libs/sys/luasrc/sys.lua	2010-04-05 19:48:51.000000000 +0200
+++ luci-0.9.0/libs/sys/luasrc/sys.lua	2011-01-05 14:51:32.000000000 +0100
@@ -249,6 +249,9 @@
 	local connt = {}
 	if fs.access("/proc/net/nf_conntrack", "r") then
 		for line in io.lines("/proc/net/nf_conntrack") do
+--&&&
+			status = line:match "%[(.*)%]"
+--&&&
 			line = line:match "^(.-( [^ =]+=).-)%2"
 			local entry, flags = _parse_mixed_record(line, " +")
 			entry.layer3 = flags[1]
@@ -256,6 +259,17 @@
 			for i=1, #entry do
 				entry[i] = nil
 			end
+--&&&
+			status = flags[6]:match "[A-Z_]+"
+			if status then
+				entry.status = status
+			elseif status2 then
+				entry.status = status2
+			else
+				entry.status = "-"
+			end
+			entry.status = entry.status .. " (".. flags[5] .. ")"
+--&&&
 
 			if callback then
 				callback(entry)
@@ -675,6 +689,7 @@
 -- @param iface	Wireless interface (optional)
 -- @return		Table of available channels
 function wifi.channels(iface)
+--[[	&&& "iwlist" does cut the list of channels (leaves an incomplete result)
 	local cmd = "iwlist " .. ( iface or "" ) .. " freq 2>/dev/null"
 	local cns = { }
 
@@ -691,6 +706,34 @@
 		end
 		fd:close()
 	end
+]]--
+--	use "iw" instead
+	local cmd = "iw " .. ( iface or "" ) .. " list 2>/dev/null"
+	local cns = { }
+	local pwr = { }
+
+	local fd = io.popen(cmd)
+	if fd then
+		local ln, c, f
+		while true do
+			ln = fd:read("*l")
+			if not ln then break end
+			-- * 5650 MHz [130] (disabled)
+			-- * 5660 MHz [132] (30.0 dBm)
+			f, c, p = ln:match("(%d+) MHz %[(%d+)%] +%((%d+).*dBm%)")
+			if c and f then
+				cns[tonumber(c)] = tonumber(f/1000)
+				-- also store max allowed TX Power
+				if p then
+					pwr[tonumber(c)] = tonumber(p)
+				else
+					pwr[tonumber(c)] = 0
+				end
+			end
+		end
+		fd:close()
+	end
+--
 
 	if not next(cns) then
 		cns = {
@@ -699,7 +742,7 @@
 		}
 	end
 
-	return cns
+	return cns,pwr
 end
 
 
diff -Naur luci-0.9.0.orig/libs/web/root/etc/config/luci luci-0.9.0/libs/web/root/etc/config/luci
--- luci-0.9.0.orig/libs/web/root/etc/config/luci	2009-07-26 23:28:44.000000000 +0200
+++ luci-0.9.0/libs/web/root/etc/config/luci	2011-01-03 10:51:47.000000000 +0100
@@ -11,7 +11,10 @@
 	option opkg		"/etc/opkg.conf"
 	option firewall	"/etc/firewall.user"
 	option uploads	"/lib/uci/upload/"
-	
+	option quagga	"/etc/quagga/"
+	option ntpd	"/etc/ntp.conf"
+	option rclocal	"/etc/rc.local"
+
 config internal languages
 	
 config internal sauth
diff -Naur luci-0.9.0.orig/modules/admin-core/luasrc/view/about.htm luci-0.9.0/modules/admin-core/luasrc/view/about.htm
--- luci-0.9.0.orig/modules/admin-core/luasrc/view/about.htm	2008-10-27 16:19:58.000000000 +0100
+++ luci-0.9.0/modules/admin-core/luasrc/view/about.htm	2011-01-03 17:11:37.000000000 +0100
@@ -42,4 +42,12 @@
 	<li><a href="mailto:tetzlav-at-leipzig.freifunk-dot-net">tetzlav</a> (Freifunk Leipzig)</li>
 	<li>Mickey Knox (Freifunk Hannover)</li>
 </ul>
+<br />
+
+<h2><%:c_hamnet%></h2>
+<ul style="font-weight: bold">
+	<li>Tim, DG7GT</li>
+	<li><a href="mailto:hb9xar-at-uska-dot-ch">Thomas, HB9XAR</a></li>
+</ul>
+<br />
 <%+footer%>
diff -Naur luci-0.9.0.orig/modules/admin-full/luasrc/controller/admin/system.lua luci-0.9.0/modules/admin-full/luasrc/controller/admin/system.lua
--- luci-0.9.0.orig/modules/admin-full/luasrc/controller/admin/system.lua	2010-03-27 03:02:51.000000000 +0100
+++ luci-0.9.0/modules/admin-full/luasrc/controller/admin/system.lua	2011-05-04 20:14:50.000000000 +0200
@@ -105,7 +105,8 @@
 end
 
 function action_backup()
-	local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
+--&&&hb9xar	local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
+	local reset_avail = false
 	local restore_cmd = "gunzip | tar -xC/ >/dev/null 2>&1"
 	local backup_cmd  = "tar -c %s | gzip 2>/dev/null"
 	
diff -Naur luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_network/network.lua luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_network/network.lua
--- luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_network/network.lua	2010-03-27 15:56:35.000000000 +0100
+++ luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_network/network.lua	2011-01-23 12:24:13.000000000 +0100
@@ -90,7 +90,11 @@
 
 hwaddr = s:option(DummyValue, "_hwaddr")
 function hwaddr.cfgvalue(self, section)
-	local ix = utl.trim(self.map:get(section, "ifname") or "")
+--&&& hb9xar: fetches list of devices (e.g. for a bridge)
+--&&&         and not the bridge device.
+--&&&	local ix = utl.trim(self.map:get(section, "ifname") or "")
+	local ix = utl.trim(netstate[section] and netstate[section].ifname or "")
+
 	local mac = fs.readfile("/sys/class/net/" .. ix .. "/address")
 
 	if not mac then
@@ -118,7 +122,9 @@
 txrx = s:option(DummyValue, "_txrx")
 
 function txrx.cfgvalue(self, section)
-	local ix = self.map:get(section, "ifname")
+--&&& hb9xar: not working, returns empty counters...
+--&&&	local ix = self.map:get(section, "ifname")
+	local ix = utl.trim(netstate[section] and netstate[section].ifname or "")
 
 	local rx = netstat and netstat[ix] and netstat[ix][1]
 	rx = rx and wa.byte_format(tonumber(rx)) or "-"
@@ -132,7 +138,9 @@
 errors = s:option(DummyValue, "_err")
 
 function errors.cfgvalue(self, section)
-	local ix = self.map:get(section, "ifname")
+--&&& hb9xar: not working, returns empty counters...
+--&&&	local ix = self.map:get(section, "ifname")
+	local ix = utl.trim(netstate[section] and netstate[section].ifname or "")
 
 	local rx = netstat and netstat[ix] and netstat[ix][3]
 	local tx = netstat and netstat[ix] and netstat[ix][11]
diff -Naur luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_network/network.lua~ luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_network/network.lua~
--- luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_network/network.lua~	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_network/network.lua~	2011-01-23 12:21:21.000000000 +0100
@@ -0,0 +1,146 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2008 Steven Barth <steven@midlink.org>
+Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+$Id: network.lua 5949 2010-03-27 14:56:35Z jow $
+]]--
+
+local utl = require "luci.util"
+local sys = require "luci.sys"
+local wa  = require "luci.tools.webadmin"
+local fs  = require "nixio.fs"
+
+local netstate = luci.model.uci.cursor_state():get_all("network")
+m = Map("network", translate("interfaces"))
+
+local created
+local netstat = sys.net.deviceinfo()
+
+s = m:section(TypedSection, "interface", "")
+s.addremove = true
+s.anonymous = false
+s.extedit   = luci.dispatcher.build_url("admin", "network", "network") .. "/%s"
+s.template  = "cbi/tblsection"
+s.override_scheme = true
+
+function s.filter(self, section)
+	return section ~= "loopback" and section
+end
+
+function s.create(self, section)
+	if TypedSection.create(self, section) then
+		created = section
+	else
+		self.invalid_cts = true
+	end
+end
+
+function s.parse(self, ...)
+	TypedSection.parse(self, ...)
+	if created then
+		m.uci:save("network")
+		luci.http.redirect(luci.dispatcher.build_url("admin", "network", "network")
+		 .. "/" .. created)
+	end
+end
+
+up = s:option(Flag, "up")
+function up.cfgvalue(self, section)
+	return netstate[section] and netstate[section].up or "0"
+end
+
+function up.write(self, section, value)
+	local call
+	if value == "1" then
+		call = "ifup"
+	elseif value == "0" then
+		call = "ifdown"
+	end
+	os.execute(call .. " " .. section .. " >/dev/null 2>&1")
+end
+
+ifname = s:option(DummyValue, "ifname", translate("device"))
+function ifname.cfgvalue(self, section)
+	local ix = utl.trim(netstate[section] and netstate[section].ifname or "")
+	if #ix > 0 then
+		return ix
+	end
+	return "?"
+end
+
+ifname.titleref = luci.dispatcher.build_url("admin", "network", "vlan")
+
+
+if luci.model.uci.cursor():load("firewall") then
+	zone = s:option(DummyValue, "_zone", translate("zone"))
+	zone.titleref = luci.dispatcher.build_url("admin", "network", "firewall", "zones")
+
+	function zone.cfgvalue(self, section)
+		return table.concat(wa.network_get_zones(section) or { "-" }, ", ")
+	end
+end
+
+hwaddr = s:option(DummyValue, "_hwaddr")
+function hwaddr.cfgvalue(self, section)
+	local ix = utl.trim(self.map:get(section, "ifname") or "")
+	local mac = fs.readfile("/sys/class/net/" .. ix .. "/address")
+
+	if not mac then
+		mac = luci.util.exec("ifconfig " .. ix)
+		mac = mac and mac:match(" ([A-F0-9:]+)%s*\n")
+	end
+
+	if mac and #mac > 0 then
+		return mac:upper()
+	end
+
+	return "?"
+end
+
+
+ipaddr = s:option(DummyValue, "ipaddr", translate("addresses"))
+function ipaddr.cfgvalue(self, section)
+	local addr = table.concat(wa.network_get_addresses(section), ", ")
+	if addr and #addr > 0 then
+		return addr
+	end
+	return "?"
+end
+
+txrx = s:option(DummyValue, "_txrx")
+
+function txrx.cfgvalue(self, section)
+	local ix = self.map:get(section, "ifname")
+
+	local rx = netstat and netstat[ix] and netstat[ix][1]
+	rx = rx and wa.byte_format(tonumber(rx)) or "-"
+
+	local tx = netstat and netstat[ix] and netstat[ix][9]
+	tx = tx and wa.byte_format(tonumber(tx)) or "-"
+
+	return string.format("%s / %s", tx, rx)
+end
+
+errors = s:option(DummyValue, "_err")
+
+function errors.cfgvalue(self, section)
+	local ix = self.map:get(section, "ifname")
+
+	local rx = netstat and netstat[ix] and netstat[ix][3]
+	local tx = netstat and netstat[ix] and netstat[ix][11]
+
+	rx = rx and tostring(rx) or "-"
+	tx = tx and tostring(tx) or "-"
+
+	return string.format("%s / %s", tx, rx)
+end
+
+return m
diff -Naur luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_network/wifi.lua luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_network/wifi.lua
--- luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_network/wifi.lua	2011-01-02 16:31:27.000000000 +0100
+++ luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_network/wifi.lua	2011-10-09 20:49:10.000000000 +0200
@@ -43,8 +43,11 @@
 
 ch = s:option(Value, "channel", translate("a_w_channel"))
 ch:value("auto", translate("wifi_auto"))
-for c, f in luci.util.kspairs(luci.sys.wifi.channels()) do
-	ch:value(c, "%i (%.3f GHz)" %{ c, f })
+--
+-- for c, f in luci.util.kspairs(luci.sys.wifi.channels()) do
+t_cns, t_pwr = luci.sys.wifi.channels()
+for c, f in luci.util.kspairs(t_cns) do
+	ch:value(c, "%i (%.3f GHz, %d dBm)" %{ c, f, t_pwr[c] })
 end
 
 
@@ -79,6 +82,69 @@
 		translate("wifi_distance_desc", "Distance to farthest network member in meters.")).optional = true
 end
 
+------------------- MAC80211_ath5k Device ------------------
+
+if hwtype == "mac80211_ath5k" then
+	s:option(Value, "txpower", translate("a_w_txpwr"), "dBm").rmempty = true
+
+	mode = s:option(ListValue, "hwmode", translate("mode"))
+	mode:value("", translate("auto"))
+	mode:value("11b", "802.11b")
+	mode:value("11g", "802.11g")
+	mode:value("11a", "802.11a")
+	mode:value("11ng", "802.11g+n")
+	mode:value("11na", "802.11a+n")
+
+	htmode = s:option(ListValue, "htmode", translate("wifi_htmode", "HT mode"))
+	htmode:depends("hwmode", "11na")
+	htmode:depends("hwmode", "11ng")
+	htmode:value("HT20", "20MHz")
+	htmode:value("HT40-", translate("wifi_ht40m", "40MHz - 2nd channel below"))
+	htmode:value("HT40+", translate("wifi_ht40p", "40MHz - 2nd channel above"))
+	
+	--htcapab = s:option(DynamicList, "ht_capab", translate("wifi_htcapab", "HT capabilities"))
+	--htcapab:depends("hwmode", "11na")
+	--htcapab:depends("hwmode", "11ng")
+
+	s:option(Value, "country", translate("wifi_country", "Country Code"),
+		translate("wifi_country_iso3166", "Use ISO/IEC 3166 alpha2 country codes.")).optional = true
+
+	s:option(Value, "distance", translate("wifi_distance", "Max. Coverage Distance"),
+		translate("wifi_distance_desc", "Distance to farthest network member in meters.")).optional = true
+		
+	channelbw = s:option(ListValue, "channelbw", translate("wifi_channelbw", "Channel Bandwidth"),
+	                translate("wifi_channelbw_desc", "Channel Bandwidth in MHz (used for Ham Radio links)"))
+	channelbw:value("5",  "5 MHz")
+	channelbw:value("10", "10 MHz")
+	channelbw:value("20", "20 MHz")
+
+	antmode = s:option(ListValue, "ant_mode", translate("wifi_ant_mode", "Antenna Mode"),
+	                translate("wifi_ant_mode_desc", "Antenna Mode (use mode 1)"))
+	antmode:value("0",  "0: Default antenna setup")
+	antmode:value("1",  "1: only antenna A (Main) present")
+	antmode:value("2",  "2: only antenna B (Aux) present")
+	antmode:value("3",  "3: STA locked on a single AP")
+	antmode:value("4",  "4: AP with tx antenna set on tx desc")
+	antmode:value("5",  "5: STA with tx antenna set on tx desc")
+	antmode:value("6",  "6: Debug mode: A->Rx, B->Tx")
+
+	noack = s:option(Flag, "use_no_ack", translate("wifi_use_no_ack", "Disable Packet Acknowledge"),
+		translate("wifi_use_no_ack_desc", "Don't use 802.11 ACK packets. Attention: This feature breaks 802.11. Use only for testing!"))
+	noack.optional = true
+	noack.enabled = "1"
+	noack.disabled = "0"
+	noack.rmempty = false
+
+	s:option(Value, "cts_timeout", translate("wifi_cts_timeout", "Clear to send timeout"),
+		translate("wifi_cts_timeout_desc", "CTS timeout in us. Will be calculated automatically by the distance option")).optional = true
+
+	s:option(Value, "ack_timeout", translate("wifi_ack_timeout", "Acknowledge timeout"),
+		translate("wifi_ack_timeout_desc", "ACK timeout in us. Will be calculated automatically by the distance option")).optional = true
+
+	s:option(Value, "slottime", translate("wifi_slottime", "Slot Time"),
+		translate("wifi_slottime_desc", "Slot time in us. Will be calculated automatically by the distance option")).optional = true
+end
+
 
 ------------------- Madwifi Device ------------------
 
@@ -248,6 +314,57 @@
 
 
 
+-------------------- MAC80211_ath5k Interface ----------------------
+
+if hwtype == "mac80211_ath5k" then
+	if fs.access("/usr/sbin/iw") then
+		mode:value("mesh", "802.11s")
+	end
+
+	mode:value("monitor", translate("a_w_monitor"))
+	bssid:depends({mode="adhoc"})
+
+	mode:value("ap-wds", "%s (WDS)" % translate("a_w_ap"))
+	mode:value("sta-wds", "%s (WDS)" % translate("a_w_client"))		
+
+	function mode.write(self, section, value)
+		if value == "ap-wds" then
+			ListValue.write(self, section, "ap")
+			m.uci:set("wireless", section, "wds", 1)
+		elseif value == "sta-wds" then
+			ListValue.write(self, section, "sta")
+			m.uci:set("wireless", section, "wds", 1)
+		else
+			ListValue.write(self, section, value)
+			m.uci:delete("wireless", section, "wds")
+		end
+	end
+
+	function mode.cfgvalue(self, section)
+		local mode = ListValue.cfgvalue(self, section)
+		local wds  = m.uci:get("wireless", section, "wds") == "1"
+
+		if mode == "ap" and wds then
+			return "ap-wds"
+		elseif mode == "sta" and wds then
+			return "sta-wds"
+		else
+			return mode
+		end
+	end
+		
+	hidden = s:option(Flag, "hidden", translate("wifi_hidden"))
+	hidden:depends({mode="ap"})
+	hidden:depends({mode="ap-wds"})
+	hidden.optional = true
+
+	s:option(Value, "frag", translate("wifi_frag")).optional = true
+	s:option(Value, "rts", translate("wifi_rts")).optional = true
+	s:option(Value, "callsign", translate("wifi_callsign","HAM Radio Callsign")).optional = true
+end
+
+
+
 -------------------- Madwifi Interface ----------------------
 
 if hwtype == "atheros" then
diff -Naur luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_system/fstab.lua luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_system/fstab.lua
--- luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_system/fstab.lua	2009-07-23 05:32:30.000000000 +0200
+++ luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_system/fstab.lua	2011-01-03 00:18:57.000000000 +0100
@@ -17,7 +17,7 @@
 local util = require "nixio.util"
 
 local devices = {}
-util.consume((fs.glob("/dev/sd*")), devices)
+util.consume((fs.glob("/dev/sd[b-z]*")), devices)
 util.consume((fs.glob("/dev/hd*")), devices)
 util.consume((fs.glob("/dev/scd*")), devices)
 util.consume((fs.glob("/dev/mmc*")), devices)
diff -Naur luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_system/system.lua luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_system/system.lua
--- luci-0.9.0.orig/modules/admin-full/luasrc/model/cbi/admin_system/system.lua	2010-03-28 00:52:06.000000000 +0100
+++ luci-0.9.0/modules/admin-full/luasrc/model/cbi/admin_system/system.lua	2011-01-03 17:28:05.000000000 +0100
@@ -28,10 +28,12 @@
 			return false
 		end)
 
+--[[ no rdate in HAMNET, we use ntpd
 	if not has_rdate then
 		m.uci:section("system", "rdate", nil, { })
 		m.uci:save("system")
 	end
+--]]
 end
 
 
@@ -99,10 +101,12 @@
 s:option(Value, "conloglevel").optional = true
 s:option(Value, "cronloglevel").optional = true
 
+--[[ no rdate in HAMNET, we use ntpd
 s2 = m:section(TypedSection, "rdate", translate("timesrv", "Time Server (rdate)"))
 s2.anonymous = true
 s2.addremove = false
 
 s2:option(DynamicList, "server", translate("server", "Server"))
+]]--
 
 return m
diff -Naur luci-0.9.0.orig/modules/admin-full/luasrc/view/admin_status/conntrack.htm luci-0.9.0/modules/admin-full/luasrc/view/admin_status/conntrack.htm
--- luci-0.9.0.orig/modules/admin-full/luasrc/view/admin_status/conntrack.htm	2009-07-23 05:32:30.000000000 +0200
+++ luci-0.9.0/modules/admin-full/luasrc/view/admin_status/conntrack.htm	2011-01-04 11:37:57.000000000 +0100
@@ -53,6 +53,7 @@
 				<tr class="cbi-section-table-titles">
 					<th class="cbi-section-table-cell"><%:network%></th>
 					<th class="cbi-section-table-cell"><%:protocol%></th>
+					<th class="cbi-section-table-cell"><%:status%></th>
 					<th class="cbi-section-table-cell"><%:source%></th>
 					<th class="cbi-section-table-cell"><%:destination%></th>
 				</tr>
@@ -61,8 +62,9 @@
 				<tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
 					<td class="cbi-value-field"><%=c.layer3:upper()%></td>
 					<td class="cbi-value-field"><%=c.layer4:upper()%></td>
-					<td class="cbi-value-field"><%=c.src%></td>
-					<td class="cbi-value-field"><%=c.dst%></td>
+					<td class="cbi-value-field"><%=c.status%></td>
+					<td class="cbi-value-field"><%=c.src%>:<%=c.sport%></td>
+					<td class="cbi-value-field"><%=c.dst%>:<%=c.dport%></td>
 				</tr>
 				<% style = not style; end) %>
 			</table>
diff -Naur luci-0.9.0.orig/modules/admin-mini/luasrc/controller/mini/system.lua luci-0.9.0/modules/admin-mini/luasrc/controller/mini/system.lua
--- luci-0.9.0.orig/modules/admin-mini/luasrc/controller/mini/system.lua	2010-04-05 19:48:51.000000000 +0200
+++ luci-0.9.0/modules/admin-mini/luasrc/controller/mini/system.lua	2011-05-04 20:14:48.000000000 +0200
@@ -28,7 +28,8 @@
 end
 
 function action_backup()
-	local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
+--&&&hb9xar	local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
+	local reset_avail = false
 	local restore_cmd = "gunzip | tar -xC/ >/dev/null 2>&1"
 	local backup_cmd  = "tar -c %s | gzip 2>/dev/null"
 	
diff -Naur luci-0.9.0.orig/po/de/wifi.po luci-0.9.0/po/de/wifi.po
--- luci-0.9.0.orig/po/de/wifi.po	2011-01-02 16:31:27.000000000 +0100
+++ luci-0.9.0/po/de/wifi.po	2011-10-09 20:50:36.000000000 +0200
@@ -39,7 +39,7 @@
 #. Distance Optimization
 #: i18n/english/luasrc/i18n/wifi.en.lua:6
 msgid "wifi_distance"
-msgstr "Distanzoptimierung"
+msgstr "Max. Distanz"
 
 #. Distance to farthest network member in meters.
 #: i18n/english/luasrc/i18n/wifi.en.lua:7
@@ -207,3 +207,68 @@
 msgstr ""
 "Für WPA-Verschlüsselung muss wpa_supplicant (für Clientmodus) oder hostapd "
 "(für AP und Ad-hoc-Modus) installiert sein."
+
+#. Antenna mode
+#: i18n/english/luasrc/i18n/wifi.en.lua:40
+msgid "wifi_ant_mode"
+msgstr "Antenneneinstellung"
+
+#. Antenna Mode (use '1' for Main antenna)
+#: i18n/english/luasrc/i18n/wifi.en.lua:41
+msgid "wifi_ant_mode_desc"
+msgstr "Antenneneinstellung (1, um die Hauptantenne zu benutzen)"
+
+#. Channel Bandwidth
+#: i18n/english/luasrc/i18n/wifi.en.lua:42
+msgid "wifi_channelbw"
+msgstr "Kanalbandbreite"
+
+#. Channel Bandwidth in MHz (used for Ham Radio links)
+#: i18n/english/luasrc/i18n/wifi.en.lua:43
+msgid "wifi_channelbw_desc"
+msgstr "Kanalbandbreite (5,10,20) in MHz (benutzt von HAMNET-Links)"
+
+#. Disable Packet Acknowledge
+#: i18n/english/luasrc/i18n/wifi.en.lua:44
+msgid "wifi_use_no_ack"
+msgstr "Paketbestätigung ausschalten"
+
+#. Don't use acknowledge packets. Attention: This feature breaks 802.11. Use only for testing!
+#: i18n/english/luasrc/i18n/wifi.en.lua:45
+msgid "wifi_use_no_ack_desc"
+msgstr "Benutze keine Bestätigungspakete. ACHTUNG: Dieses Feature verletzt 802.11. Nur zu Testzwecken benutzen!"
+
+#. Clear to send timeout
+#: i18n/english/luasrc/i18n/wifi.en.lua:46
+msgid "wifi_cts_timeout"
+msgstr "CTS timeout"
+
+#. CTS timeout. Will be calculated automatically by the 'distance' option
+#: i18n/english/luasrc/i18n/wifi.en.lua:47
+msgid "wifi_cts_timeout_desc"
+msgstr "CTS timeout. Wird automatisch durch die Distanz-Option berechnet."
+
+#. Acknowledge timeout
+#: i18n/english/luasrc/i18n/wifi.en.lua:48
+msgid "wifi_ack_timeout"
+msgstr "ACK timeout"
+
+#. ACK timeout. Will be calculated automatically by the 'distance' option
+#: i18n/english/luasrc/i18n/wifi.en.lua:49
+msgid "wifi_ack_timeout_desc"
+msgstr "ACK timeout. Wird automatisch durch die Distanz-Option berechnet."
+
+#. Slot Time
+#: i18n/english/luasrc/i18n/wifi.en.lua:50
+msgid "wifi_slottime"
+msgstr "Slot Time"
+
+#. ACK timeout. Will be calculated automatically by the 'distance' option
+#: i18n/english/luasrc/i18n/wifi.en.lua:51
+msgid "wifi_slottime_desc"
+msgstr "Slot Time. Wird automatisch durch die Distanz-Option berechnet."
+
+#. HAM Radio Callsign. Used to calculate MAC address.
+#: i18n/english/luasrc/i18n/wifi.en.lua:52
+msgid "wifi_callsign"
+msgstr "Amateur-Rufzeichen (damit wird die MAC Adresse berechnet)"
diff -Naur luci-0.9.0.orig/po/en/admin-core.po luci-0.9.0/po/en/admin-core.po
--- luci-0.9.0.orig/po/en/admin-core.po	2009-05-30 00:37:07.000000000 +0200
+++ luci-0.9.0/po/en/admin-core.po	2011-01-03 17:05:18.000000000 +0100
@@ -56,6 +56,11 @@
 msgid "c_thanksto"
 msgstr "Thanks To"
 
+#. HAMNET Extensions
+#: i18n/english/luasrc/i18n/admin-core.en.lua:8
+msgid "c_hamnet"
+msgstr "HAMNET Extensions"
+
 #. Hello!
 #: i18n/english/luasrc/i18n/admin-core.en.lua:9
 msgid "a_i_i_hello"
diff -Naur luci-0.9.0.orig/po/en/qos.po luci-0.9.0/po/en/qos.po
--- luci-0.9.0.orig/po/en/qos.po	2009-05-28 02:30:40.000000000 +0200
+++ luci-0.9.0/po/en/qos.po	2011-04-21 23:01:09.000000000 +0200
@@ -33,6 +33,21 @@
 msgid "qos_interface_halfduplex"
 msgstr "Half-Duplex"
 
+# Dynamic QOS
+msgid "qos_interface_dynamicbw"
+msgstr "Dynamic QOS - Dynamically adapt to bandwidth"
+
+msgid "qos_interface_dynamicbwcycle"
+msgstr "Dynamic QOS - Cycle time"
+
+msgid "qos_interface_dynamicbwip"
+msgstr "Dynamic QOS - Remote Link IP"
+
+msgid "qos_interface_dynamicbwrtt"
+msgstr "Dynamic QOS - Max RTT on Link"
+
+
+
 #. Downlink
 #: applications/luci-qos/luasrc/i18n/qos.en.lua:5
 msgid "qos_interface_download"
diff -Naur luci-0.9.0.orig/po/en/wifi.po luci-0.9.0/po/en/wifi.po
--- luci-0.9.0.orig/po/en/wifi.po	2009-05-28 02:30:40.000000000 +0200
+++ luci-0.9.0/po/en/wifi.po	2011-01-03 18:02:26.000000000 +0100
@@ -39,7 +39,7 @@
 #. Distance Optimization
 #: i18n/english/luasrc/i18n/wifi.en.lua:6
 msgid "wifi_distance"
-msgstr "Distance Optimization"
+msgstr "Max. Coverage Distance"
 
 #. Distance to farthest network member in meters.
 #: i18n/english/luasrc/i18n/wifi.en.lua:7
diff -Naur luci-0.9.0.orig/themes/hamnet/htdocs/luci-static/hamnet/cascade.css luci-0.9.0/themes/hamnet/htdocs/luci-static/hamnet/cascade.css
--- luci-0.9.0.orig/themes/hamnet/htdocs/luci-static/hamnet/cascade.css	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/htdocs/luci-static/hamnet/cascade.css	2011-01-05 14:33:35.000000000 +0100
@@ -0,0 +1,840 @@
+@charset "utf-8";
+
+@media all {
+
+html,
+body {
+	background-color: #404040;
+	color: #ffffff;
+}
+
+body {
+	font-family: Verdana, Arial, sans-serif;
+	font-size: 101%;
+	line-height: 100%;
+}
+
+* {
+	margin: 0;
+	padding: 0;
+}
+
+abbr,
+acronym {
+	font-style: normal;
+	font-variant: normal;
+}
+
+abbr[title],
+acronym[title] {
+	border-bottom: 1px dotted;
+	cursor: help;
+}
+
+a:link abbr[title],
+a:visited abbr[title],
+a:link acronym[title],
+a:visited acronym[title] {
+	cursor: pointer;
+}
+
+code {
+	font-family: monospace;
+	white-space: pre;
+}
+
+#maincontent ul {
+	margin-left: 2em;
+}
+
+.warning {
+	color: red;
+	background-color: white;
+	font-weight: bold;
+}
+
+.clear {
+	clear: both;
+}
+
+.skiplink,
+.navigation,
+.hidden {
+	position: absolute;
+	left: -1000px;
+	top: -1000px;
+	width: 0px;
+	height: 0px;
+	overflow: hidden;
+	display: inline;
+}
+
+.error {
+	color: #ff0000;
+	background-color: white;
+}
+
+#header {
+	background-color: #404040;
+	color: #ffffff;
+	text-align: right;
+	padding: 0.5em;
+}
+
+#header h1 {
+	display: inline;
+}
+
+#header p {
+	display: inline;
+}
+
+#header h1,
+#header p {
+	font-size: 70%;
+	font-weight: normal;
+	line-height: 160%;
+	text-align: right;
+}
+
+ul.dropdowns {
+	float: left;
+	margin: 0;
+	padding: 0;
+	width: auto;
+	list-style: none;
+}
+
+html>body ul.dropdowns {
+	position: relative;
+}
+
+ul.dropdowns li,
+ul.dropdowns ul {
+	margin: 0;
+	padding: 0;
+	list-style: none;
+}
+
+ul.dropdowns li {
+	float: left;
+	position: relative;
+	white-space: nowrap;
+}
+
+ul.dropdowns li ul {
+	position: absolute;
+	z-index: 1000;
+	top: auto;
+	min-width: 10em;
+}
+
+ul.dropdowns li li {
+	float: none;
+	position: relative;
+}
+
+ul.dropdowns li a {
+	display: block;
+}
+
+ul.dropdowns ul li ul {
+	top: 0;
+}
+
+ul.dropdowns li ul,
+ul.dropdowns li.over ul ul,
+ul.dropdowns li.focus ul ul,
+ul.dropdowns li:hover ul ul,
+ul.dropdowns li.over ul ul ul,
+ul.dropdowns li.focus ul ul ul,
+ul.dropdowns li:hover ul ul ul,
+ul.dropdowns li.over ul ul ul ul,
+ul.dropdowns li.focus ul ul ul ul,
+ul.dropdowns li:hover ul ul ul ul {
+	left: -3000px;
+}
+
+ul.dropdowns li.over ul,
+ul.dropdowns li.focus ul,
+ul.dropdowns li:hover ul {
+	left: 0;
+}
+
+ul.dropdowns ul li.over ul,
+ul.dropdowns ul li.focus ul,
+ul.dropdowns ul li:hover ul,
+ul.dropdowns ul ul li.over ul,
+ul.dropdowns ul ul li.focus ul,
+ul.dropdowns ul ul li:hover ul,
+ul.dropdowns ul ul ul li.over ul,
+ul.dropdowns ul ul ul li.focus ul,
+ul.dropdowns ul ul ul li:hover ul {
+	left: 100%;
+}
+
+#menubar {
+	position: relative;
+	width: 100%;
+	background: #000000;
+	color: #ffffff;
+}
+
+#menubar .warning {
+	color: red;
+	background-color: #404040;
+}
+
+#menubar ul.dropdowns {
+	min-height: 1.8em;
+	background: #000000;
+	color: #ffffff;
+}
+
+#menubar ul.dropdowns li ul {
+	background: #000000;
+	color: #ffffff;
+	border-width: 0 1px 1px 1px;
+	border-style: solid;
+	border-color: #444444;
+}
+
+#menubar ul.dropdowns ul li ul {
+	border-width: 1px;
+}
+
+html #menubar a:link,
+html #menubar a:visited {
+	position: relative;
+	display: block;
+	padding: 0.5em;
+	background: #000000;
+	color: #ffffff;
+	text-decoration: none;
+	font-size: 80%;
+	font-weight: normal;
+}
+
+
+html #menubar a:link:hover,
+html #menubar a:visited:hover,
+html #menubar a:link:active,
+html #menubar a:visited:active,
+#menubar a:link:focus,
+#menubar a:visited:focus {
+	background: #000000;
+	color: #ffff00;
+	font-weight: bold;
+}
+
+html #menubar a:link.active,
+html #menubar a:visited.active,
+html #menubar a:link.preactive,
+html #menubar a:visited.preactive {
+	background: #000000;
+	color: #ffff00;
+	font-weight: bold;
+}
+
+html #menubar a:link.warning,
+html #menubar a:visited.warning {
+	background: #000000;
+	color: red;
+	font-weight: bold;
+}
+
+#menubar ul.dropdowns li.over>a,
+#menubar ul.dropdowns li.focus>a,
+#menubar ul.dropdowns li:hover>a {
+	font-weight: bold;
+}
+
+.lang_de #submenu_mini_system { min-width: 13.3em; }
+* html .lang_de #submenu_mini_system { width: 13.3em; }
+
+.lang_pt-br #submenu_mini_network { min-width: 14em; }
+* html .lang_pt-br #submenu_mini_network { width: 14em; }
+
+.lang_pt-br #submenu_mini_system { min-width: 11.5em; }
+* html .lang_pt-br #submenu_mini_system { width: 11.5em; }
+
+.lang_ru #submenu_mini_system { min-width: 18em; }
+* html .lang_ru #submenu_mini_system { width: 18em; }
+
+.lang_pt-br #submenu_admin_index { min-width: 11em; }
+* html .lang_pt-br #submenu_admin_index { width: 11em; }
+
+.lang_ru #submenu_admin_index { min-width: 15.5em; }
+* html .lang_ru #submenu_admin_index { width: 15.5em; }
+
+.lang_ru #submenu_admin_status { min-width: 10.5em; }
+* html .lang_ru #submenu_admin_status { width: 10.5em; }
+
+.lang_de #submenu_admin_system { min-width: 13.3em; }
+* html .lang_de #submenu_admin_system { width: 13.3em; }
+
+.lang_fr #submenu_admin_system { min-width: 14.5em; }
+* html .lang_fr #submenu_admin_system { width: 14.5em; }
+
+.lang_pt-br #submenu_admin_system { min-width: 11.5em; }
+* html .lang_pt-br #submenu_admin_system { width: 11.5em; }
+
+.lang_ru #submenu_admin_system { min-width: 18em; }
+* html .lang_ru #submenu_admin_system { width: 18em; }
+
+#submenu_admin_services_chillispot { min-width: 15.5em; }
+* html #submenu_admin_services_chillispot { width: 15.5em; }
+
+#submenu_admin_services_coovachilli { min-width: 15em; }
+* html #submenu_admin_services_coovachilli { width: 15em; }
+
+.lang_ru #submenu_admin_network_routes { min-width: 15.3em; }
+* html .lang_ru #submenu_admin_network_routes { width: 15.3em; }
+
+#submenu_admin_network_firewall { min-width: 14em; }
+* html #submenu_admin_network_firewall { width: 14em; }
+
+.lang_de #submenu_admin_network_firewall { min-width: 16.5em; }
+* html .lang_de #submenu_admin_network_firewall { width: 16.5em; }
+
+.lang_pt-br #submenu_admin_network_firewall { min-width: 15em; }
+* html .lang_pt-br #submenu_admin_network_firewall { width: 15em; }
+
+#modemenu {
+	width: auto;
+	background: #000000;
+	color: #ffffff;
+	list-style: none;
+	margin-right: 1px;
+}
+
+#modemenu li {
+	float: right;
+	list-style: none;
+}
+
+#savemenu {
+	float: right;
+	margin-right: 2em;
+}
+
+.lang_de #submenu_admin_uci {
+	width: 12em;
+}
+
+.lang_ru #submenu_admin_uci {
+	width: 11.5em;
+}
+
+#maincontent {
+	clear: both;
+	width: 80%;
+	margin: 0 auto;
+	padding: 0.5em;
+	background: #dddddd;
+	color: #000000;
+	border-width: 0 1px 1px 1px;
+	border-style: solid;
+	border-color: #444444;
+	font-size: 80%;
+}
+
+#maincontent h2 {
+	margin: 0.25em 0 0.5em 0;
+	font-size: 150%;
+	font-weight: normal;
+}
+
+#maincontent h3 {
+	margin: 0.5em 0;
+	font-size: 120%;
+	font-weight: normal;
+	text-decoration: underline;
+}
+
+#maincontent p {
+	margin-bottom: 1em;
+}
+
+textarea#syslog {
+	width: 98%;
+	min-height: 500px;
+	border: 3px solid #cccccc;
+	padding: 5px;
+	font-family: monospace;
+}
+
+.cbi-section {
+	margin-bottom: 0.5em;
+	padding: 0.5em 1em;
+	border: 1px dotted #555555;
+	background-color: #ffffff;
+	color: #000000;
+}
+
+.cbi-section legend {
+	font-size: 110%;
+	font-weight: bold;
+	height: 1em;
+	padding: 0 0.25em;
+	background-color: transparent;
+	color: #555555;
+}
+
+.cbi-section h2 {
+	margin: 0em 0 0.5em -0.5em !important;
+}
+
+.cbi-section h3 {
+	text-decoration: none !important;
+	font-weight: bold !important;
+	color: #555555 !important;
+	margin: 0.25em !important;
+	font-size: 100% !important;
+}
+
+.cbi-section-descr {
+	margin-bottom: 0.5em;
+	font-size: 95%;
+}
+
+.cbi-title-ref {
+	color: inherit;
+	text-decoration: none;
+	padding-right: 18px;
+	background: url('../resources/cbi/link.gif') no-repeat scroll right center;
+	background-color: inherit;
+}
+
+ul.cbi-apply {
+	font-size: 90%;
+}
+
+input[type=submit],
+input[type=reset],
+input[type=image] {
+	cursor: pointer;
+}
+
+
+select,
+input,
+textarea {
+	background: #eeeeee;
+	color: #000000;
+	border-width: 1px;
+	border-color: #000000;
+}
+
+input[type=image] {
+	border: none;
+}
+
+input:focus,
+input:hover,
+select:focus,
+select:hover,
+textarea:focus,
+textarea:hover {
+	background-color: #ffffff;
+	color: #000000;
+}
+
+select,
+input[type=text],
+input[type=password] {
+	width: 20em;
+}
+
+td select,
+td input[type=text],
+td input[type=password] {
+	width: 99%;
+}
+
+input.cbi-input-user {
+	background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	text-indent: 17px;
+}
+
+input.cbi-input-password {
+	background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	text-indent: 17px;
+}
+
+input.cbi-input-find {
+	background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+}
+
+input.cbi-input-reload {
+	background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+}
+
+input.cbi-input-add,
+input.cbi-button-add {
+	background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+	padding-right: 1px;
+}
+
+input.cbi-input-fieldadd,
+input.cbi-button-fieldadd {
+	background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+	padding-right: 1px;
+}
+
+input.cbi-input-reset,
+input.cbi-button-reset {
+	background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+	padding-right: 1px;
+}
+
+input.cbi-input-save,
+input.cbi-button-save {
+	background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+	padding-right: 1px;
+}
+
+input.cbi-input-apply,
+input.cbi-button-apply {
+	background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+	padding-right: 1px;
+}
+
+input.cbi-input-remove,
+div.cbi-section-remove input {
+	background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
+	background-color: inherit;
+	color: #000000;
+	padding-left: 17px;
+	padding-right: 1px;
+}
+
+div.cbi-section-remove input {
+	border-bottom: none;
+}
+
+textarea {
+	margin-left: -1px;
+	margin-bottom: 0.5em;
+}
+
+form > div > input[type=submit],
+form > div > input[type=reset] {
+	float: right;
+	margin-left: 0.5em;
+}
+
+table td,
+table th {
+	color: #000000;
+}
+
+table.smalltext {
+	background: #ffffff;
+	color: #000000;
+	border-top: 1px solid #666666;
+	border-right: 1px solid #666666;
+	border-bottom: 1px solid #666666;
+	font-size: 90%;
+	width: 80%;
+	margin-left: auto;
+	margin-right: auto;
+	border-collapse: collapse;
+}
+
+table.smalltext tr:hover td {
+	background-color: #bbddee;
+	color: #000000;
+}
+
+table.smalltext tr th {
+	padding: 0 0.25em;
+	border-left: 1px solid #666666;
+	text-align: left;
+}
+
+table.smalltext tr td {
+	padding: 0 0.25em;
+	border-top: 1px solid #666666;
+	border-left: 1px solid #666666;
+}
+
+table.cbi-section-table .cbi-rowstyle-1,
+table.cbi-section-table .cbi-rowstyle-1 * {
+	background-color: #eeeeee;
+	color: #000000;
+}
+
+.cbi-section .cbi-rowstyle-1 h3 {
+	background-color: #eeeeee;
+	color: #555555;
+}
+
+.cbi-rowstyle-2 {
+	color: #000000;
+}
+
+div.cbi-value {
+	clear: left;
+	vertical-align: middle;
+	padding: 0.25em;
+	border-bottom: 1px dotted #bbbbbb;
+}
+
+div.cbi-value:hover {
+	background: #f8f8f8;
+	color: #000000;
+}
+
+.cbi-value-title {
+	float: left;
+	width: 40%;
+	line-height: 1.8em;
+}
+
+div.cbi-value-field {
+	width: 58%;
+	margin-left: 40%;
+	padding: 0.25em 0;
+}
+
+div.cbi-value-description {
+	font-size: 90%;
+	display: inline;
+}
+
+div.cbi-section-create {
+	clear: left;
+	white-space: nowrap;
+	vertical-align: top;
+}
+
+div.cbi-tblsection-create {
+	border-bottom: 1px dotted #bbbbbb;
+}
+
+div.cbi-section-create .cbi-button {
+	margin: 0.25em;
+}
+
+input.cbi-section-create-name {
+	margin-right: -0.25em;
+}
+
+div.cbi-map-descr {
+	margin-bottom: 1em;
+}
+
+div.cbi-optionals {
+	padding: 0.25em;
+	border-bottom: 1px dotted #bbbbbb;
+}
+
+div.cbi-section-remove {
+	float: right;
+}
+
+.cbi-section-node {
+	clear: both;
+	border-top: 1px dotted #bbbbbb;
+	border-left: 1px dotted #bbbbbb;
+	border-right: 1px dotted #bbbbbb;
+	border-bottom: none;
+	padding-bottom: 0;
+}
+
+.cbi-section-node table div {
+	padding-bottom: 0;
+	border-bottom: none;
+}
+
+.cbi-section-node div.cbi-section-table-row {
+	margin: 0.25em;
+}
+
+table.cbi-section-table {
+	width: 100%;
+	font-size: 95%;
+}
+
+table.cbi-section-table th,
+table.cbi-section-table td {
+	text-align: center;
+}
+
+tr.cbi-section-table-descr th {
+	font-weight: normal;
+	font-size: 90%;
+}
+
+td.cbi-section-table-optionals {
+	text-align: left !important;
+	padding-top: 1em;
+}
+
+.cbi-value-helpicon img {
+	vertical-align: bottom;
+}
+
+div.cbi-error {
+	font-size: 95%;
+	font-weight: bold;
+	color: #ff0000;
+	background-color: #ffffff;
+}
+
+td.cbi-value-error {
+	border-color: red;
+}
+
+.cbi-value-error input,
+.cbi-value-error select {
+	color: red;
+	background-color: #ffcccc;
+}
+
+.cbi-section-error {
+	color: red;
+	background-color: white;
+	font-size: 95%;
+	border: 1px dotted red;
+	margin: 3px;
+	padding: 3px;
+}
+
+ul.cbi-tabmenu {
+	padding: 3px 0;
+	margin-left: 0 !important;
+	margin-bottom: -1px;
+	list-style-type: none;
+}
+
+ul.cbi-tabmenu li.cbi-tab,
+ul.cbi-tabmenu li.cbi-tab-disabled {
+	display: inline;
+	margin: 0;
+}
+
+ul.cbi-tabmenu li.cbi-tab a,
+ul.cbi-tabmenu li.cbi-tab-disabled a {
+	text-decoration: none;
+	padding: 3px 7px;
+	margin-right: 3px;
+	border: 1px outset #000000;
+	border-bottom: none;
+	background-color: #EEEEEE;
+	color: #BBBBBB;
+}
+
+ul.cbi-tabmenu li.cbi-tab-highlighted a {
+	color: #000000;
+	background-color: #FFEEAA;
+}
+
+ul.cbi-tabmenu li a:hover {
+	color: #000000;
+}
+
+ul.cbi-tabmenu li.cbi-tab a {
+	position: relative;
+	top: 1px;
+	padding-top: 4px;
+	color: #000000;
+	background-color: #FFFFFF;
+}
+
+div.cbi-tab-descr {
+	background-image: url(/luci-static/resources/cbi/help.gif);
+	background-position: 0.25em 50%;
+	background-repeat: no-repeat;
+	border-bottom: 1px solid #CCCCCC;
+	margin: 0.25em 0.25em 2em;
+	padding: 0.5em 0.5em 0.5em 2em;
+}
+
+.right {
+	text-align: right;
+}
+
+.luci {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	text-align: right;
+}
+
+.luci a:link,
+.luci a:visited {
+	background-color: transparent;
+	color: #666666;
+	text-decoration: none;
+	font-size: 70%;
+}
+
+.inline {
+	display: inline;
+}
+
+.error500 {
+	white-space: normal;
+	border: 1px dotted #ff0000;
+	background-color: #ffffff;
+	color: #000000;
+	padding: 0.5em;
+}
+
+#memorybar {
+	width: 200px;
+	height: 8px;
+	border: 1px solid #bbb;
+	color: black;
+	background-color: red;
+}
+
+#memfree, #membuffers, #memcached {
+	float: right;
+	border: 1px solid #bbb;
+	height: 6px;
+}
+
+#memfree {
+	background-color: green;
+	color: black;
+}
+
+#membuffers {
+	background-color: yellow;
+	color: black;
+}
+
+#memcached {
+	background-color: #ffa500;
+	color: black;
+}
+
+}
diff -Naur luci-0.9.0.orig/themes/hamnet/htdocs/luci-static/hamnet/ie6.css luci-0.9.0/themes/hamnet/htdocs/luci-static/hamnet/ie6.css
--- luci-0.9.0.orig/themes/hamnet/htdocs/luci-static/hamnet/ie6.css	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/htdocs/luci-static/hamnet/ie6.css	2008-10-24 22:33:19.000000000 +0200
@@ -0,0 +1,77 @@
+/* obligatory IE6 Voodoo Code */
+
+* html body {
+	padding-left: 50% !important;
+}
+
+* html div#header {
+	margin-left: -100% !important;
+}
+
+* html div#menubar {
+	margin-left: -100% !important;
+	width: 200% !important;
+}
+
+* html ul.dropdowns li ul {
+	width: 10em;
+}
+
+* html ul.dropdowns li li {
+	clear: both;
+	float: left;
+}
+
+* html ul.dropdowns li li {
+	width: 100%;
+}
+
+* html ul.dropdowns li li a {
+	height: 1%;
+}
+
+* html div#maincontent {
+	margin-left: -80% !important;
+	width: 160% !important;
+}
+
+* html div.cbi-value-description {
+	width: auto !important;
+}
+
+* html div.cbi-value-field {
+	margin-left: 0 !important;
+	width: 100% !important;
+}
+
+* html .cbi-input-text,
+* html .cbi-input-user,
+* html .cbi-input-select,
+* html .cbi-input-password {
+	width: 50% !important;
+}
+
+* html .cbi-input-user,
+* html .cbi-input-password {
+	text-indent: 0 !important;
+	padding-left: 1.5em !important;
+}
+
+* html .cbi-section legend {
+	background-color: #ffffff;
+	color: #555555;
+}
+
+* html table.cbi-section-table td .cbi-input-text,
+* html table.cbi-section-table td .cbi-input-select {
+	width: 100% !important;
+}
+
+* html div.cbi-page-actions {
+	text-align: right !important;
+}
+
+* html div.cbi-value-field input,
+* html div.cbi-value-field select {
+	font-size: 90% !important;
+}
diff -Naur luci-0.9.0.orig/themes/hamnet/htdocs/luci-static/hamnet/ie7.css luci-0.9.0/themes/hamnet/htdocs/luci-static/hamnet/ie7.css
--- luci-0.9.0.orig/themes/hamnet/htdocs/luci-static/hamnet/ie7.css	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/htdocs/luci-static/hamnet/ie7.css	2008-10-24 22:33:19.000000000 +0200
@@ -0,0 +1,20 @@
+div.cbi-value-field {
+	margin-left: 0 !important;
+}
+
+.cbi-section legend {
+	background-color: #ffffff;
+	color: #555555;
+}
+
+table.cbi-section-table td .cbi-input-text,
+table.cbi-section-table td .cbi-input-select {
+	width: 95% !important;
+}
+
+.cbi-input-user,
+.cbi-input-password {
+	text-indent: 0 !important;
+	padding-left: 1.5em !important;
+	width: 18.5em !important;
+}
diff -Naur luci-0.9.0.orig/themes/hamnet/ipkg/postinst luci-0.9.0/themes/hamnet/ipkg/postinst
--- luci-0.9.0.orig/themes/hamnet/ipkg/postinst	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/ipkg/postinst	2011-01-05 11:55:58.000000000 +0100
@@ -0,0 +1,4 @@
+#!/bin/sh
+[ -n "${IPKG_INSTROOT}" ] || {
+	( . /etc/uci-defaults/luci-theme-hamnet ) &&	rm -f /etc/uci-defaults/luci-theme-hamnet
+}
diff -Naur luci-0.9.0.orig/themes/hamnet/luasrc/view/themes/hamnet/footer.htm luci-0.9.0/themes/hamnet/luasrc/view/themes/hamnet/footer.htm
--- luci-0.9.0.orig/themes/hamnet/luasrc/view/themes/hamnet/footer.htm	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/luasrc/view/themes/hamnet/footer.htm	2009-01-30 14:59:37.000000000 +0100
@@ -0,0 +1,21 @@
+<%#
+LuCI - Lua Configuration Interface
+Copyright 2008 Steven Barth <steven@midlink.org>
+Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+$Id: footer.htm 4184 2009-01-30 13:59:37Z jow $
+
+-%>
+<div class="clear"></div>
+</div>
+
+<p class="luci"><a href="<%=controller%>/about">Powered by <%= luci.__appname__ .. " (v" .. luci.__version__ .. ")" %></a></p>
+</body>
+</html>
+
diff -Naur luci-0.9.0.orig/themes/hamnet/luasrc/view/themes/hamnet/header.htm luci-0.9.0/themes/hamnet/luasrc/view/themes/hamnet/header.htm
--- luci-0.9.0.orig/themes/hamnet/luasrc/view/themes/hamnet/header.htm	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/luasrc/view/themes/hamnet/header.htm	2011-01-05 13:00:02.000000000 +0100
@@ -0,0 +1,177 @@
+<%#
+LuCI - Lua Configuration Interface
+Copyright 2008 Steven Barth <steven@midlink.org>
+Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+$Id: header.htm 4891 2009-06-22 10:23:21Z jow $
+
+-%>
+<%
+require("luci.sys")
+local load1, load5, load15 = luci.sys.loadavg()
+local request  = require("luci.dispatcher").context.path
+local category = request[1]
+local tree     = luci.dispatcher.node()
+local cattree  = category and luci.dispatcher.node(category)
+local node     = luci.dispatcher.context.dispatched
+local hostname = luci.sys.hostname()
+--&&&
+local uptime   = luci.sys.uptime()
+local pltfm, hwmodel, mem_tot, mem_cache, mem_buff, mem_free = luci.sys.sysinfo()
+
+local c = tree
+for i,r in ipairs(request) do
+	if c.nodes and c.nodes[r] then
+		c = c.nodes[r]
+		c._menu_selected = true
+	end
+end
+
+require("luci.i18n").loadc("default")
+require("luci.i18n").loadc("admin-core")
+require("luci.http").prepare_content("application/xhtml+xml")
+
+-%>
+
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Script-Type" content="text/javascript" />
+<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
+<!--[if lt IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie6.css" /><![endif]-->
+<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
+<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
+<% end -%>
+<script type="text/javascript" src="<%=resource%>/VarType.js"></script>
+<script type="text/javascript" src="<%=resource%>/XHTML1.js"></script>
+<script type="text/javascript" src="<%=resource%>/Dropdowns.js"></script>
+<title><%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI</title>
+</head>
+<body class="lang_<%=luci.i18n.context.lang%>">
+
+<p class="skiplink">
+<span id="skiplink1"><a href="#navigation"><%:skiplink1 Skip to navigation%></a></span>
+<span id="skiplink2"><a href="#content"><%:skiplink2 Skip to content%></a></span>
+</p>
+
+<div id="header">
+<!--
+<h1><%=luci.version.distname%></h1>
+<p>
+: <%=luci.version.distversion%> |
+<%:load%>: <%="%.2f" % load1%> <%="%.2f" % load5%> <%="%.2f" % load15%> |
+<%:hostname%>: <%=hostname%>
+-->
+<h4><%:hostname%>: <%=hostname%></h4>
+<p>
+<%:m_i_memory%>: <%="%.1f" % mem_tot/1024%> MB, 
+<%="%.1f" % mem_cache/1024%> MB <%:mem_cached%>,
+<%="%.1f" % mem_buff/1024%> MB <%:mem_buffered%>,
+<%="%.1f" % mem_free/1024%> MB <%:mem_free%> |
+<%:reboot%>: <%="%s" %  (os.date("%Y-%m-%d %H:%M:%S", os.time()-uptime))%> |
+<%:load%>: <%="%.2f" % load1%> <%="%.2f" % load5%> <%="%.2f" % load15%>
+</p>
+</div>
+
+<div id="menubar">
+<h2 class="navigation"><a id="navigation" name="navigation"><%:navigation Navigation%></a></h2>
+<ul id="mainmenu" class="dropdowns">
+<%-
+local function submenu(prefix, node)
+	if not node.nodes or node.hidden then
+		return false
+	end
+	local index = {}
+	local count = 0
+	for k, n in pairs(node.nodes) do
+		if n.title and n.target then
+			table.insert(index, {name=k, order=n.order or 100})
+			count = count + 1
+		end
+	end
+
+	table.sort(index, function(a, b) return a.order < b.order end)
+
+	if count > 0 then
+%>
+<ul id="submenu_<%=string.gsub(string.gsub(prefix, "/", "_"), "^_(.-)_$", "%1")%>">
+<%-
+		for j, v in pairs(index) do
+			if #v.name > 0 then
+				local nnode = node.nodes[v.name]
+				local href = controller .. prefix .. v.name .. "/"
+				href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
+%>
+<li><a<% if nnode._menu_selected then %> class="active"<%end%> href="<%=luci.util.pcdata(href)%>"><%=nnode.title%></a><%-
+submenu(prefix .. v.name .. "/", nnode)
+%></li>
+<%-
+			end
+		end
+%>
+</ul>
+<%
+	end
+end
+
+if cattree and cattree.nodes then
+	local index = {}
+	for k, node in pairs(cattree.nodes) do
+		table.insert(index, {name=k, order=node.order or 100})
+	end
+
+	table.sort(index, function(a, b) return a.order < b.order end)
+
+	for i, k in ipairs(index) do
+		node = cattree.nodes[k.name]
+		if node.title and node.target and not node.hidden then
+			local href = controller.."/"..category.."/"..k.name.."/"
+			href = (k.query) and href .. luci.http.build_querystring(k.query) or href
+%>
+<li><a<% if node._menu_selected then %> class="preactive"<%end%> href="<%=href%>"><%=node.title%></a><%
+submenu("/" .. category .. "/" .. k.name .. "/", node)
+%></li><% end
+	end
+end
+%>
+</ul>
+
+<ul id="modemenu"><%
+for k,node in pairs(tree.nodes) do
+	if node.title and not node.hidden then %>
+<li><a<% if request[1] == k then %> class="active"<%end%> href="<%=controller%>/<%=k%>/"><%=node.title%></a></li><%
+	end
+end
+%>
+</ul>
+
+<%
+if tree.nodes[category] and tree.nodes[category].ucidata then
+	local ucic = 0
+	for i, j in pairs(require("luci.model.uci").cursor():changes()) do
+		for k, l in pairs(j) do
+			for m, n in pairs(l) do
+				ucic = ucic + 1;
+			end
+		end
+	end
+-%>
+<ul id="savemenu" class="dropdowns">
+<li><% if ucic > 0 then %><a class="warning" href="<%=controller%>/<%=category%>/uci/changes/"><%:unsavedchanges%>: <%=ucic%></a><%
+submenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"])
+else -%>
+<a href="#"><%:changes%>: 0</a><% end -%>
+</li>
+</ul><% end %>
+
+<div class="clear"></div>
+</div>
+<div id="maincontent">
diff -Naur luci-0.9.0.orig/themes/hamnet/Makefile luci-0.9.0/themes/hamnet/Makefile
--- luci-0.9.0.orig/themes/hamnet/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/Makefile	2008-08-11 18:56:16.000000000 +0200
@@ -0,0 +1,2 @@
+include ../../build/config.mk
+include ../../build/module.mk
\ No newline at end of file
diff -Naur luci-0.9.0.orig/themes/hamnet/root/etc/uci-defaults/luci-theme-hamnet luci-0.9.0/themes/hamnet/root/etc/uci-defaults/luci-theme-hamnet
--- luci-0.9.0.orig/themes/hamnet/root/etc/uci-defaults/luci-theme-hamnet	1970-01-01 01:00:00.000000000 +0100
+++ luci-0.9.0/themes/hamnet/root/etc/uci-defaults/luci-theme-hamnet	2011-01-05 14:25:57.000000000 +0100
@@ -0,0 +1,6 @@
+#!/bin/sh
+uci batch <<-EOF
+	set luci.themes.HAMNET=/luci-static/hamnet
+	set luci.main.mediaurlbase=/luci-static/hamnet
+        commit luci
+EOF
