--- a/client/scripts/bsdos
+++ b/client/scripts/bsdos
@@ -1,27 +1,25 @@
 #!/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
@@ -31,10 +29,18 @@
 	  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
   # If we're making confs, may as well make an ntp.conf too
   make_ntp_conf
--- a/client/scripts/freebsd
+++ b/client/scripts/freebsd
@@ -11,54 +11,23 @@
 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
@@ -66,18 +35,21 @@
 	    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
   # If we're making confs, may as well make an ntp.conf too
--- a/client/scripts/linux
+++ b/client/scripts/linux
@@ -35,16 +35,16 @@
 # update /etc/resolv.conf based on received values
 # This updated version mostly follows Debian script by Andrew Pollock et al.
 make_resolv_conf() {
-    local new_resolv_conf
+    if [ x"$PEER_DNS" != x ] && [ x"$PEER_DNS" != xyes ]; then
+	return 0
+    fi
+    local conf
 
     # DHCPv4
     if [ -n "$new_domain_search" ] || [ -n "$new_domain_name" ] ||
        [ -n "$new_domain_name_servers" ]; then
-        new_resolv_conf=/etc/resolv.conf.dhclient-new
-        rm -f $new_resolv_conf
-
         if [ -n "$new_domain_name" ]; then
-            echo domain ${new_domain_name%% *} >>$new_resolv_conf
+            conf="${conf}domain ${new_domain_name%% *}\n"
         fi
 
         if [ -n "$new_domain_search" ]; then
@@ -60,31 +60,23 @@
                     new_domain_search="$new_domain_name $new_domain_search"
                 fi
             fi
-            echo "search ${new_domain_search}" >> $new_resolv_conf
+            conf="${conf}search ${new_domain_search}\n"
         elif [ -n "$new_domain_name" ]; then
-            echo "search ${new_domain_name}" >> $new_resolv_conf
+            conf="${conf}search ${new_domain_name}\n"
         fi
 
         if [ -n "$new_domain_name_servers" ]; then
             for nameserver in $new_domain_name_servers; do
-                echo nameserver $nameserver >>$new_resolv_conf
+                conf="${conf}nameserver $nameserver\n"
             done
         else # keep 'old' nameservers
-            sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf >>$new_resolv_conf
+            conf="${conf}$(sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf)\n"
         fi
 
-	if [ -f /etc/resolv.conf ]; then
-	    chown --reference=/etc/resolv.conf $new_resolv_conf
-	    chmod --reference=/etc/resolv.conf $new_resolv_conf
-	fi
-        mv -f $new_resolv_conf /etc/resolv.conf
     # DHCPv6
     elif [ -n "$new_dhcp6_domain_search" ] || [ -n "$new_dhcp6_name_servers" ]; then
-        new_resolv_conf=/etc/resolv.conf.dhclient-new
-        rm -f $new_resolv_conf
-
         if [ -n "$new_dhcp6_domain_search" ]; then
-            echo "search ${new_dhcp6_domain_search}" >> $new_resolv_conf
+            conf="${conf}search ${new_dhcp6_domain_search}\n"
         fi
 
         if [ -n "$new_dhcp6_name_servers" ]; then
@@ -94,17 +86,21 @@
                    [ "${nameserver##FE80::}" != "$nameserver" ]; then
                     nameserver="${nameserver}%${interface}"
                 fi
-                echo nameserver $nameserver >>$new_resolv_conf
+                conf="${conf}nameserver $nameserver\n"
             done
         else # keep 'old' nameservers
-            sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf >>$new_resolv_conf
+            conf="${conf}$(sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf)\n"
         fi
+    fi
 
-	if [ -f /etc/resolv.conf ]; then
-            chown --reference=/etc/resolv.conf $new_resolv_conf
-            chmod --reference=/etc/resolv.conf $new_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
-        mv -f $new_resolv_conf /etc/resolv.conf
     fi
 
     # If we're making confs, may as well make an ntp.conf too
--- a/client/scripts/netbsd
+++ b/client/scripts/netbsd
@@ -1,27 +1,25 @@
 #!/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"$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
-      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
@@ -31,10 +29,18 @@
 	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
   # If we're making confs, may as well make an ntp.conf too
   make_ntp_conf
--- a/client/scripts/openbsd
+++ b/client/scripts/openbsd
@@ -1,27 +1,25 @@
 #!/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
-
-    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
@@ -31,10 +29,18 @@
 	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
   # If we're making confs, may as well make an ntp.conf too
   make_ntp_conf
--- 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
   # If we're making confs, may as well make an ntp.conf too
   make_ntp_conf
