diff --git init.d/network.in init.d/network.in
index 7c406c5..135e5d8 100644
--- init.d/network.in
+++ init.d/network.in
@@ -64,16 +64,8 @@ tentative()
 	case "$RC_UNAME" in
 	Linux)
 		[ -x /sbin/ip ] || return 1
-		LC_ALL=C ip addr show | while read inet address rest; do
-	 		case "${inet}" in
-			inet6)
-				case "${rest}" in
-				*" "tentative*) return 2;;
-				esac
-				;;
-			esac
-		done
-		[ $? = 2 ]
+		[ -n "$(ip -f inet6 addr show tentative)" ]
+		;;
 	*)
 		local inet= address= rest=
 		LC_ALL=C ifconfig -a | while read inet address rest; do
@@ -232,8 +224,6 @@ start()
 	if [ "$RC_UNAME" = "Linux" ]; then
 		ifconfig lo 127.0.0.1 netmask 255.0.0.0 || cr=1 
 		route add -net 127.0.0.0 netmask 255.0.0.0 \
-			gw 127.0.0.1 2>/dev/null
-		route add -net 127.0.0.0 netmask 255.0.0.0 \
 			gw 127.0.0.1 reject 2>/dev/null
 	else
 		ifconfig lo0 127.0.0.1 netmask 255.0.0.0 || cr=1
@@ -289,9 +279,14 @@ start()
 	r=5
 	while [ $r -gt 0 ]; do
 		tentative || break
+		[ $r = 5 ] && vebegin "Waiting for tentative addresses"
 		sleep 1
 		r=$(($r - 1))
 	done
+	if [ $r != 5 ]; then
+		[ $r != 0 ]
+		veend $?
+	fi
 	
 	if [ -n "$defaultroute" ]; then
 		ebegin "Setting default route $defaultroute"
diff --git net/bonding.sh net/bonding.sh
index 793280b..559c9a1 100644
--- net/bonding.sh
+++ net/bonding.sh
@@ -15,7 +15,7 @@ _is_bond()
 
 bonding_pre_start()
 {
-	local x= s= slaves="$(_get_array "slaves_${IFVAR}")" 
+	local x= s= n= slaves="$(_get_array "slaves_${IFVAR}")"
 
 	[ -z "${slaves}" ] && return 0
 
@@ -43,9 +43,11 @@ bonding_pre_start()
 	# Nice and dynamic :)
 	for x in /sys/class/net/"${IFACE}"/bonding/*; do
 		[ -f "${x}" ] || continue
-		eval s=\$${x##*/}_${IFVAR}
+		n=${x##*/}
+		eval s=\$${n}_${IFVAR}
 		if [ -n "${s}" ]; then
-			echo "${s}" >"${x}"
+			echo "${s}" >"${x}" || \
+			eerror "Failed to configure $n (${n}_${IFVAR})"
 		fi
 	done
 
diff --git net/dhclient.sh net/dhclient.sh
index 6c92c1f..65cacd3 100644
--- net/dhclient.sh
+++ net/dhclient.sh
@@ -17,6 +17,7 @@ dhclient_start()
 
 	# Get our options
 	# These options only work in Gentoo, and maybe RedHat
+	eval args=\$dhclient_${IFVAR}
 	eval opts=\$dhcp_${IFVAR}
 	[ -z "${opts}" ] && opts=${dhcp}
 
diff --git net/iproute2.sh net/iproute2.sh
index 0df8eef..906a45e 100644
--- net/iproute2.sh
+++ net/iproute2.sh
@@ -160,7 +160,8 @@ _add_route()
 
 	# We cannot use a metric if we're using a nexthop
 	if ! ${have_metric} && \
-		[ -n "${metric}" -a -z "${cmd##* nexthop }" ]
+		[ -n "${metric}" -a \
+			"${cmd##* nexthop }" = "$cmd" ]
 	then
 		cmd="${cmd} metric ${metric}"
 	fi
diff --git scripts/on_ac_power scripts/on_ac_power
index 0804952..9ef1df4 100755
--- scripts/on_ac_power
+++ scripts/on_ac_power
@@ -9,6 +9,10 @@ if [ -f /proc/acpi/ac_adapter/AC*/state ]; then
 		"state:"*"off-line") return 128;;
 		esac
 	done
+elif [ -f /sys/class/power_supply/AC*/online ]; then
+	cat /sys/class/power_supply/AC*/online | while read line; do
+		[ "${line}" = 0 ] && return 128
+	done
 elif [ -f /proc/pmu/info ]; then
 	cat /proc/pmu/info | while read line; do
 		case "$line" in
diff --git src/rc/rc.c src/rc/rc.c
index 6d04b3d..ccafbe3 100644
--- src/rc/rc.c
+++ src/rc/rc.c
@@ -773,7 +773,7 @@ handle_bad_signal(int sig)
 #endif
 
 #include "_usage.h"
-#define getoptstring "o:" getoptstring_COMMON
+#define getoptstring "o:s:S" getoptstring_COMMON
 static const struct option longopts[] = {
 	{ "override", 1, NULL, 'o' },
 	{ "service",  1, NULL, 's' },
