diff --git a/package/base-files/default/bin/uci b/package/base-files/default/bin/uci
index d74b89762f73f742c3132a96bfc623e653bcd517..9b50380df2f831e00ecba44cef00f1c373cef7ae 100755
--- a/package/base-files/default/bin/uci
+++ b/package/base-files/default/bin/uci
@@ -21,33 +21,44 @@
 . /etc/functions.sh
 include /lib/config
 
+SEP="[^0-9A-Za-z_]"
+
 do_get() {
-	[ $# -ne 3 ] && {
+	local PACKAGE
+	local CONFIG
+	local OPTION
+	local DUMMY
+
+	strtok "$*" PACKAGE . CONFIG . OPTION $SEP DUMMY
+
+	[ $? -ne 3 ] && {
 		uci_usage get
 		exit 1
 	}
-	local PACKAGE="$1"
-	local CONFIG="$2"
-	local OPTION="$3"
 
 	uci_load "$PACKAGE"
 	config_get "$CONFIG" "$OPTION"
 }
 
 do_set() {
-	[ $# -ne 4 ] && {
-		uci_usage set
-		exit 1
-	}
-	uci_set "$@"
-}
+	local PACKAGE
+	local CONFIG
+	local OPTION
+	local VALUE
 
-do_add() {
-	[ $# -ne 3 ] && {
-		uci_usage add
+	strtok "$1" PACKAGE . CONFIG = VALUE
+	[ $? -ne 3 ] && {
+		uci_usage set
 		exit 1
 	}
-	uci_add "$@"
+	
+	strtok "$CONFIG" CONFIG . OPTION
+	
+	if [ $? -eq 1 ]; then
+		uci_add "$PACKAGE" "$VALUE" "$CONFIG"
+	else
+		uci_set "$PACKAGE" "$CONFIG" "$OPTION" "$VALUE"
+	fi
 }
 
 do_rename() {
@@ -59,78 +70,86 @@ do_rename() {
 }
 
 do_remove() {
-	[ $# -ne 3 -a $# -ne 2 ] && {
+	local PACKAGE
+	local CONFIG
+	local OPTION
+	local DUMMY
+
+	strtok "$*" PACKAGE . CONFIG . OPTION $SEP DUMMY
+	[ $? -ne 3 -a $? -ne 2 ] && {
 		uci_usage rename
 		exit 1
 	}
-	uci_remove "$@"
+	uci_remove "$PACKAGE" "$CONFIG" ${OPTION:+"$OPTION"}
 }
 
 do_commit() {
-	[ $# -ne 1 ] && {
-		uci_usage commit
-		exit 1
-	}
-	uci_commit "$1"
+	local PACKAGE="$1"
+	for package in ${PACKAGE:-$(cd /tmp/.uci; ls)}; do 
+		uci_commit "$package"
+	done
 }
 
 do_show() {
-	[ $# -gt 2 -o $# -lt 1 ] && {
+	local PACKAGE
+	local CONFIG
+	local DUMMY
+
+	strtok "$*" PACKAGE . CONFIG $SEP DUMMY
+	[ $? -gt 2 ] && {
 		uci_usage show
 		exit 1
 	}
 	
-	PACKAGE="$1"
-	CONFIG="$2"
-	SECTION=""
+	for package in ${PACKAGE:-$(cd /etc/config; ls)}; do
+		SECTION=""
 	
-	config_cb() {
-		if [ -z "$CONFIG" -o "$CONFIG" = "$2" ]; then
-			append SECTION "$2"
-			option_cb() {
-				append "${CONFIG_SECTION}_VARS" "$1"
-			}
-		else
-			option_cb() {
-				return 0
-			}
-		fi
-	}
+		config_cb() {
+			if [ -z "$CONFIG" -o "$CONFIG" = "$2" ]; then
+				append SECTION "$2"
+				option_cb() {
+					append "${CONFIG_SECTION}_VARS" "$1"
+				}
+			else
+				option_cb() {
+					return 0
+				}
+			fi
+		}
 			
-	uci_load "$PACKAGE"
+		uci_load "$package"
 	
-	for section in $SECTION; do
-		config_get type "$section" TYPE
-		[ -z "$type" ] && continue
-		echo "@$section=$type"
-		eval "VARS=\"\${${section}_VARS}\""
-		for var in $VARS; do
-			config_get val "$section" "$var"
-			[ -n "$val" ] && {
-				echo "${section}.${var}=${val}"
-				config_set "$section" "$var" ""
-			}
+		for section in $SECTION; do
+			config_get type "$section" TYPE
+			[ -z "$type" ] && continue
+			echo "$package.$section=$type"
+			eval "VARS=\"\${${section}_VARS}\""
+			for var in $VARS; do
+				config_get val "$section" "$var"
+				[ -n "$val" ] && {
+					echo "$package.$section.$var=$val"
+					config_set "$section" "$var" ""
+				}
+			done
+			config_set "$section" TYPE ""
 		done
-		config_set "$section" TYPE ""
 	done
 }
 
 uci_usage() {
 	case "$1" in
-		show) echo "$0 show <package> [<config>]";;
-		get) echo "$0 get <package> <config> <option>";;
-		set) echo "$0 set <package> <config> <option> <value>";;
-		add) echo "$0 add <package> <type> <config>";;
-		del) echo "$0 del <package> <config> [<option>]";;
+		show) echo "$0 show [<package>[.<config>]]";;
+		get) echo "$0 get <package>.<config>.<option>";;
+		set) echo "$0 set <package>.<config>[.<option>]=<value>";;
+		del) echo "$0 del <package>.<config>[.<option>]";;
 		rename) echo "$0 rename <package> <config> <name>";;
-		commit) echo "$0 commit <package>";;
+		commit) echo "$0 commit [<package> ... ]";;
 		*) 
 			echo "Syntax: $0 <command> <arguments...>"
 			echo
 			uci_usage show
 			uci_usage get
 			uci_usage set
-			uci_usage add
 			uci_usage del
 			uci_usage rename
 			uci_usage commit
@@ -144,11 +163,11 @@ if [ $# -eq 0 ] ; then
 	uci_usage
 	exit 0
 fi
-CMD="$1"
+
+local CMD="$1"
 shift
 case "$CMD" in
 	set) do_set "$@";;
-	add) do_add "$@";;
 	del) do_remove "$@";;
 	rename) do_rename "$@";;
 	get) do_get "$@";;
diff --git a/package/base-files/default/etc/functions.sh b/package/base-files/default/etc/functions.sh
index aa5b000644d8d0fcd5426116e8f3a46e5c0d6b1a..7d34f57a497521770462cf199be882eee9c221b3 100755
--- a/package/base-files/default/etc/functions.sh
+++ b/package/base-files/default/etc/functions.sh
@@ -18,48 +18,48 @@ append() {
 	local var="$1"
 	local value="$2"
 	local sep="${3:- }"
-	eval "export ${var}=\"\${${var}:+\${${var}}${value:+$sep}}\$value\""
+	
+	eval "$var=\"\${$var:+\${$var}${value:+$sep}}$value\""
 }
 
 reset_cb() {
-	config_cb() {
-		return 0
-	}
-	option_cb() {
-		return 0
-	}
+	config_cb() { return 0; }
+	option_cb() { return 0; }
 }
 reset_cb
 
 config () {
-    local cfgtype="$1"
-    local name="$2"
-    _C=$(($_C + 1))
-    name="${name:-cfg${_C}}"
-    config_cb "$cfgtype" "$name"
-    export CONFIG_SECTION="$name"
-    export CONFIG_${CONFIG_SECTION}_TYPE="$cfgtype"
+	local cfgtype="$1"
+	local name="$2"
+    
+	_C=$((_C + 1))
+	name="${name:-cfg${_C}}"
+	config_cb "$cfgtype" "$name"
+	CONFIG_SECTION="$name"
+	eval CONFIG_${CONFIG_SECTION}_TYPE="$cfgtype"
 }
 
 option () {
 	local varname="$1"; shift
-	export CONFIG_${CONFIG_SECTION}_${varname}="$*"
+	
+	eval CONFIG_${CONFIG_SECTION}_${varname}="$*"
 	option_cb "$varname" "$*"
 }
 
 config_rename() {
 	local OLD="$1"
 	local NEW="$2"
-	local oldsetting
+	local oldvar
 	local newvar
 	
-	[ -z "$OLD" -o -z "$NEW" ] && return
-	for oldsetting in `set | grep ^CONFIG_${OLD}_ | \
+	[ "$OLD" -a "$NEW" ] || return
+	for oldvar in `set | grep ^CONFIG_${OLD}_ | \
 		sed -e 's/\(.*\)=.*$/\1/'` ; do
-		newvar="CONFIG_${NEW}_${oldsetting##CONFIG_${OLD}_}"
-		eval "${newvar}=\${$oldsetting}"
-		unset "$oldsetting"
+		newvar="CONFIG_${NEW}_${oldvar##CONFIG_${OLD}_}"
+		eval "$newvar=\${$oldvar}"
+		unset "$oldvar"
 	done
+	
 	[ "$CONFIG_SECTION" = "$OLD" ] && CONFIG_SECTION="$NEW"
 }
 
@@ -68,38 +68,36 @@ config_unset() {
 }
 
 config_clear() {
-	[ -z "$CONFIG_SECTION" ] && return
-	for oldsetting in `set | grep ^CONFIG_${CONFIG_SECTION}_ | \
+	local SECTION="$1"
+	local oldvar
+	
+	for oldvar in `set | grep ^CONFIG_${SECTION}_ | \
 		sed -e 's/\(.*\)=.*$/\1/'` ; do 
-		unset $oldsetting 
+		unset $oldvar 
 	done
-	unset CONFIG_SECTION
 }
 
 config_load() {
-	CONFIG_SECTION=
-	local DIR="./"
+	local file="/etc/config/$1"
 	_C=0
-	[ \! -e "$1" -a -e "/etc/config/$1" ] && {
-		DIR="/etc/config/"
-	}
-	[ -e "$DIR$1" ] && {
-		CONFIG_FILENAME="$DIR$1"
-		. ${CONFIG_FILENAME}
+	CONFIG_SECTION=
+	
+	[ -e "$file" ] && {
+		. $file
 	} || return 1
-	${CD:+cd -} >/dev/null
+	
 	${CONFIG_SECTION:+config_cb}
 }
 
 config_get() {
 	case "$3" in
 		"") eval "echo \"\${CONFIG_${1}_${2}}\"";;
-		*) eval "$1=\"\${CONFIG_${2}_${3}}\"";;
+		*)  eval "$1=\"\${CONFIG_${2}_${3}}\"";;
 	esac
 }
 
 config_set() {
-	export CONFIG_${1}_${2}="${3}"
+	eval CONFIG_${1}_${2}="$3"
 }
 
 load_modules() {
@@ -107,6 +105,8 @@ load_modules() {
 }
 
 include() {
+	local file
+	
 	for file in $(ls $1/*.sh 2>/dev/null); do
 		. $file
 	done
@@ -114,30 +114,31 @@ include() {
 
 find_mtd_part() {
 	local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
+	
 	PART="${PART##mtd}"
 	echo "${PART:+/dev/mtdblock/$PART}"
 }
 
-strtok() { # <string> <variable> [<separator>] ...
-	local right
-	local left="$1"
+strtok() { # <string> { <variable> [<separator>] ... }
+	local tmp
+	local val="$1"
 	local count=0
 
 	shift
 
 	while [ $# -gt 1 ]; do
-		right="${left%%$2*}"
+		tmp="${val%%$2*}"
 
-		[ "$right" = "$left" ] && break
+		[ "$tmp" = "$val" ] && break
 
-		left="${left#$right$2}"
+		val="${val#$tmp$2}"
 
-		export $1="$right"; count=$((count+1))
+		eval $1="$tmp"; count=$((count+1))
 		shift 2
 	done
 
-	if [ $# -gt 0 -a "$left" ]; then
-		export $1="$left"; count=$((count+1))
+	if [ $# -gt 0 -a "$val" ]; then
+		eval $1="$val"; count=$((count+1))
 	fi
 
 	return $count