--- a/client/scripts/bsdos
+++ b/client/scripts/bsdos
@@ -1,40 +1,46 @@
 #!/bin/sh
 
 make_resolv_conf() {
+  if [ x"$PEER_DNS" != x ] && [ x$"PEER_DNS" != xyes ]; then
+    return 0
+  fi
+  local conf=
   if [ x"$new_domain_name_servers" != x ]; then
-    cat /dev/null > /etc/resolv.conf.dhclient
     if [ "x$new_domain_search" != x ]; then
-      echo search $new_domain_search >> /etc/resolv.conf.dhclient
+      conf="${conf}search ${new_domain_search}\n"
     elif [ "x$new_domain_name" != x ]; then
       # Note that the DHCP 'Domain Name Option' is really just a domain
       # name, and that this practice of using the domain name option as
       # a search path is both nonstandard and deprecated.
-      echo search $new_domain_name >> /etc/resolv.conf.dhclient
+      conf="${conf}search ${new_domain_name}\n"
     fi
     for nameserver in $new_domain_name_servers; do
-      echo nameserver $nameserver >> /etc/resolv.conf.dhclient
+      conf="${conf}nameserver ${nameserver}\n"
     done
-
-    mv /etc/resolv.conf.dhclient /etc/resolv.conf
   elif [ "x${new_dhcp6_name_servers}" != x ] ; then
-    cat /dev/null > /etc/resolv.conf.dhclient6
-    chmod 644 /etc/resolv.conf.dhclient6
-
     if [ "x${new_dhcp6_domain_search}" != x ] ; then
-      echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6
+      conf="${conf}search ${new_dhcp6_domain_search}\n"
     fi
     for nameserver in ${new_dhcp6_name_servers} ; do
       # If the nameserver has a link-local address
       # add a <zone_id> (interface name) to it.
       case $nameserver in
 	  fe80:*) zone_id="%$interface";;
 	  FE80:*) zone_id="%$interface";;
 	  *)      zone_id='';;
       esac
-      echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6
+      conf="${conf}nameserver ${nameserver}$zone_id\n"
     done
+  fi
 
-    mv /etc/resolv.conf.dhclient6 /etc/resolv.conf
+  if [ x"$conf" != x ]; then
+    conf="# Generated by dhclient or interface $interface\n${conf}"
+    if type resolvconf >/dev/null 2>&1; then
+      printf "${conf}" | resolvconf -a $interface
+    else
+      printf "${conf}" > /etc/resolv.conf
+      chmod 644 /etc/resolv.conf
+    fi
   fi
 }
 
--- a/client/scripts/freebsd
+++ b/client/scripts/freebsd
@@ -11,73 +11,45 @@
 fi
 
 make_resolv_conf() {
+  if [ x"$PEER_DNS" != x ] && [ x$"PEER_DNS" != xyes ]; then
+    return 0
+  fi
+  local conf=
   if [ x"$new_domain_name_servers" != x ]; then
-    ( cat /dev/null > /etc/resolv.conf.dhclient )
-    exit_status=$?
-    if [ $exit_status -ne 0 ]; then
-      $LOGGER "Unable to create /etc/resolv.conf.dhclient: Error $exit_status"
-    else
-      if [ "x$new_domain_search" != x ]; then
-	( echo search $new_domain_search >> /etc/resolv.conf.dhclient )
-	exit_status=$?
-      elif [ "x$new_domain_name" != x ]; then
-	# Note that the DHCP 'Domain Name Option' is really just a domain
-	# name, and that this practice of using the domain name option as
-	# a search path is both nonstandard and deprecated.
-	( echo search $new_domain_name >> /etc/resolv.conf.dhclient )
-	exit_status=$?
-      fi
-      for nameserver in $new_domain_name_servers; do
-	if [ $exit_status -ne 0 ]; then
-	  break
-	fi
-	( echo nameserver $nameserver >>/etc/resolv.conf.dhclient )
-	exit_status=$?
-      done
-
-      # If there were no errors, attempt to mv the new file into place.
-      if [ $exit_status -eq 0 ]; then
-	( mv /etc/resolv.conf.dhclient /etc/resolv.conf )
-	exit_status=$?
-      fi
-
-      if [ $exit_status -ne 0 ]; then
-	$LOGGER "Error while writing new /etc/resolv.conf."
-      fi
+    if [ "x$new_domain_search" != x ]; then
+      conf="${conf}search ${new_domain_search}\n"
+    elif [ "x$new_domain_name" != x ]; then
+      # Note that the DHCP 'Domain Name Option' is really just a domain
+      # name, and that this practice of using the domain name option as
+      # a search path is both nonstandard and deprecated.
+      conf="${conf}search ${new_domain_name}\n"
     fi
+    for nameserver in $new_domain_name_servers; do
+      conf="${conf}nameserver ${nameserver}\n"
+    done
   elif [ "x${new_dhcp6_name_servers}" != x ] ; then
-    ( cat /dev/null > /etc/resolv.conf.dhclient6 )
-    exit_status=$?
-    if [ $exit_status -ne 0 ] ; then
-      $LOGGER "Unable to create /etc/resolv.conf.dhclient6: Error $exit_status"
-    else
-      if [ "x${new_dhcp6_domain_search}" != x ] ; then
-	( echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6 )
-	exit_status=$?
-      fi
-      for nameserver in ${new_dhcp6_name_servers} ; do
-	if [ $exit_status -ne 0 ] ; then
-	  break
-	fi
 	# If the nameserver has a link-local address
 	# add a <zone_id> (interface name) to it.
 	case $nameserver in
 	    fe80:*) zone_id="%$interface";;
 	    FE80:*) zone_id="%$interface";;
 	    *)      zone_id='';;
 	esac
-	( echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6 )
-	exit_status=$?
-      done
-
-      if [ $exit_status -eq 0 ] ; then
-        ( mv /etc/resolv.conf.dhclient6 /etc/resolv.conf )
-	exit_status=$?
-      fi
+    if [ "x${new_dhcp6_domain_search}" != x ] ; then
+      conf="${conf}search ${new_dhcp6_domain_search}\n"
+    fi
+    for nameserver in ${new_dhcp6_name_servers} ; do
+      conf="${conf}nameserver ${nameserver}$zone_id\n"
+    done
+  fi
 
-      if [ $exit_status -ne 0 ] ; then
-	$LOGGER "Error while writing new /etc/resolv.conf."
-      fi
+  if [ x"$conf" != x ]; then
+    conf="# Generated by dhclient or interface $interface\n${conf}"
+    if type resolvconf >/dev/null 2>&1; then
+      printf "${conf}" | resolvconf -a $interface
+    else
+      printf "${conf}" > /etc/resolv.conf
+      chmod 644 /etc/resolv.conf
     fi
   fi
 }
--- a/client/scripts/linux
+++ b/client/scripts/linux
@@ -26,44 +26,49 @@
 ip=/sbin/ip
 
 make_resolv_conf() {
+  if [ x"$PEER_DNS" != x ] && [ x$"PEER_DNS" != xyes ]; then
+    return 0
+  fi
+  local conf=
   if [ x"$new_domain_name_servers" != x ]; then
-    cat /dev/null > /etc/resolv.conf.dhclient
-    chmod 644 /etc/resolv.conf.dhclient
-    if [ x"$new_domain_search" != x ]; then
-      echo search $new_domain_search >> /etc/resolv.conf.dhclient
-    elif [ x"$new_domain_name" != x ]; then
+    if [ "x$new_domain_search" != x ]; then
+      conf="${conf}search ${new_domain_search}\n"
+    elif [ "x$new_domain_name" != x ]; then
       # Note that the DHCP 'Domain Name Option' is really just a domain
       # name, and that this practice of using the domain name option as
       # a search path is both nonstandard and deprecated.
-      echo search $new_domain_name >> /etc/resolv.conf.dhclient
+      conf="${conf}search ${new_domain_name}\n"
     fi
     for nameserver in $new_domain_name_servers; do
-      echo nameserver $nameserver >>/etc/resolv.conf.dhclient
+      conf="${conf}nameserver ${nameserver}\n"
     done
-
-    mv /etc/resolv.conf.dhclient /etc/resolv.conf
   elif [ "x${new_dhcp6_name_servers}" != x ] ; then
-    cat /dev/null > /etc/resolv.conf.dhclient6
-    chmod 644 /etc/resolv.conf.dhclient6
-
     if [ "x${new_dhcp6_domain_search}" != x ] ; then
-      echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6
+      conf="${conf}search ${new_dhcp6_domain_search}\n"
     fi
     shopt -s nocasematch 
     for nameserver in ${new_dhcp6_name_servers} ; do
       # If the nameserver has a link-local address
       # add a <zone_id> (interface name) to it.
       if  [[ "$nameserver" =~ ^fe80:: ]]
       then
 	zone_id="%$interface"
       else
 	zone_id=
       fi
-      echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6
+      conf="${conf}nameserver ${nameserver}$zone_id\n"
     done
     shopt -u nocasematch 
+  fi
 
-    mv /etc/resolv.conf.dhclient6 /etc/resolv.conf
+  if [ x"$conf" != x ]; then
+    conf="# Generated by dhclient or interface $interface\n${conf}"
+    if type resolvconf >/dev/null 2>&1; then
+      printf "${conf}" | resolvconf -a $interface
+    else
+      printf "${conf}" > /etc/resolv.conf
+      chmod 644 /etc/resolv.conf
+    fi
   fi
 }
 
--- a/client/scripts/netbsd
+++ b/client/scripts/netbsd
@@ -1,40 +1,46 @@
 #!/bin/sh
 
 make_resolv_conf() {
-  if [ "x$new_domain_name" != x ] && [ x"$new_domain_name_servers" != x ]; then
-    cat /dev/null > /etc/resolv.conf.dhclient
-    if [ "x$new_domain_search" != x ]; then
-      echo search $new_domain_search >> /etc/resolv.conf.dhclient
-    elif [ "x$new_domain_name" != x ]; then
+  if [ x"$PEER_DNS" != x ] && [ x$"PEER_DNS" != xyes ]; then
+    return 0
+  fi
+  local conf=
+  if [ x"$new_domain_name_servers" != x ]; then
+    if [ "x$new_domain_search" != x ]; then
+      conf="${conf}search ${new_domain_search}\n"
+    elif [ "x$new_domain_name" != x ]; then
       # Note that the DHCP 'Domain Name Option' is really just a domain
       # name, and that this practice of using the domain name option as
       # a search path is both nonstandard and deprecated.
-      echo search $new_domain_name >> /etc/resolv.conf.dhclient
+      conf="${conf}search ${new_domain_name}\n"
     fi
     for nameserver in $new_domain_name_servers; do
-      echo nameserver $nameserver >>/etc/resolv.conf.dhclient
+      conf="${conf}nameserver ${nameserver}\n"
     done
-
-    mv /etc/resolv.conf.dhclient /etc/resolv.conf
   elif [ "x${new_dhcp6_name_servers}" != x ] ; then
-    cat /dev/null > /etc/resolv.conf.dhclient6
-    chmod 644 /etc/resolv.conf.dhclient6
-
     if [ "x${new_dhcp6_domain_search}" != x ] ; then
-      echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6
+      conf="${conf}search ${new_dhcp6_domain_search}\n"
     fi
     for nameserver in ${new_dhcp6_name_servers} ; do
       # If the nameserver has a link-local address
       # add a <zone_id> (interface name) to it.
       case $nameserver in
 	fe80:*) zone_id="%$interface";;
 	FE80:*) zone_id="%$interface";;
 	*)      zone_id='';;
       esac
-      echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6
+      conf="${conf}nameserver ${nameserver}$zone_id\n"
     done
+  fi
 
-    mv /etc/resolv.conf.dhclient6 /etc/resolv.conf
+  if [ x"$conf" != x ]; then
+    conf="# Generated by dhclient or interface $interface\n${conf}"
+    if type resolvconf >/dev/null 2>&1; then
+      printf "${conf}" | resolvconf -a $interface
+    else
+      printf "${conf}" > /etc/resolv.conf
+      chmod 644 /etc/resolv.conf
+    fi
   fi
 }
 
--- a/client/scripts/openbsd
+++ b/client/scripts/openbsd
@@ -1,40 +1,46 @@
 #!/bin/sh
 
 make_resolv_conf() {
-  if [ x"$new_domain_name_servers" != x ]; then
-    cat /dev/null > /etc/resolv.conf.dhclient
-    if [ x"$new_domain_search" != x ]; then
-      echo search $new_domain_search >> /etc/resolv.conf.dhclient
-    elif [ x"$new_domain_name" != x ]; then
+  if [ x"$PEER_DNS" != x ] && [ x$"PEER_DNS" != xyes ]; then
+    return 0
+  fi
+  local conf=
+  if [ x"$new_domain_name_servers" != x ]; then
+    if [ "x$new_domain_search" != x ]; then
+      conf="${conf}search ${new_domain_search}\n"
+    elif [ "x$new_domain_name" != x ]; then
       # Note that the DHCP 'Domain Name Option' is really just a domain
       # name, and that this practice of using the domain name option as
       # a search path is both nonstandard and deprecated.
-      echo search $new_domain_name >> /etc/resolv.conf.dhclient
+      conf="${conf}search ${new_domain_name}\n"
     fi
     for nameserver in $new_domain_name_servers; do
-      echo nameserver $nameserver >>/etc/resolv.conf.dhclient
+      conf="${conf}nameserver ${nameserver}\n"
     done
-
-    mv /etc/resolv.conf.dhclient /etc/resolv.conf
   elif [ "x${new_dhcp6_name_servers}" != x ] ; then
-    cat /dev/null > /etc/resolv.conf.dhclient6
-    chmod 644 /etc/resolv.conf.dhclient6
-
     if [ "x${new_dhcp6_domain_search}" != x ] ; then
-      echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6
+      conf="${conf}search ${new_dhcp6_domain_search}\n"
     fi
     for nameserver in ${new_dhcp6_name_servers} ; do
       # If the nameserver has a link-local address
       # add a <zone_id> (interface name) to it.
       case $nameserver in
 	fe80:*) zone_id="%$interface";;
 	FE80:*) zone_id="%$interface";;
 	*)      zone_id='';;
       esac
-      echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6
+      conf="${conf}nameserver ${nameserver}$zone_id\n"
     done
+  fi
 
-    mv /etc/resolv.conf.dhclient6 /etc/resolv.conf
+  if [ x"$conf" != x ]; then
+    conf="# Generated by dhclient or interface $interface\n${conf}"
+    if type resolvconf >/dev/null 2>&1; then
+      printf "${conf}" | resolvconf -a $interface
+    else
+      printf "${conf}" > /etc/resolv.conf
+      chmod 644 /etc/resolv.conf
+    fi
   fi
 }
 
--- a/client/scripts/solaris
+++ b/client/scripts/solaris
@@ -1,21 +1,39 @@
 #!/bin/sh  
 
 make_resolv_conf() {
+  if [ x"$PEER_DNS" != x ] && [ x$"PEER_DNS" != xyes ]; then
+    return 0
+  fi
+  local conf=
   if [ x"$new_domain_name_servers" != x ]; then
-    cat /dev/null > /etc/resolv.conf.dhclient
-    if [ x"$new_domain_search" != x ]; then
-      echo search $new_domain_search >> /etc/resolv.conf.dhclient
-    elif [ x"$new_domain_name" != x ]; then
+    if [ "x$new_domain_search" != x ]; then
+      conf="${conf}search ${new_domain_search}\n"
+    elif [ "x$new_domain_name" != x ]; then
       # Note that the DHCP 'Domain Name Option' is really just a domain
       # name, and that this practice of using the domain name option as
       # a search path is both nonstandard and deprecated.
-      echo search $new_domain_name >> /etc/resolv.conf.dhclient
+      conf="${conf}search ${new_domain_name}\n"
     fi
     for nameserver in $new_domain_name_servers; do
-      echo nameserver $nameserver >>/etc/resolv.conf.dhclient
+      conf="${conf}nameserver ${nameserver}\n"
+    done
+  elif [ "x${new_dhcp6_name_servers}" != x ] ; then
+    if [ "x${new_dhcp6_domain_search}" != x ] ; then
+      conf="${conf}search ${new_dhcp6_domain_search}\n"
+    fi
+    for nameserver in ${new_dhcp6_name_servers} ; do
+      conf="${conf}nameserver ${nameserver}\n"
     done
+  fi
 
-    mv /etc/resolv.conf.dhclient /etc/resolv.conf
+  if [ x"$conf" != x ]; then
+    conf="# Generated by dhclient or interface $interface\n${conf}"
+    if type resolvconf >/dev/null 2>&1; then
+      printf "${conf}" | resolvconf -a $interface
+    else
+      printf "${conf}" > /etc/resolv.conf
+      chmod 644 /etc/resolv.conf
+    fi
   fi
 }