From 6bb659645459a5a8b169b9554c8dfc459f435bc2 Mon Sep 17 00:00:00 2001
From: Apple <opensource@apple.com>
Date: Wed, 13 Jul 2011 00:06:38 +0000
Subject: [PATCH] configd-395.6.tar.gz

---
 Makefile                                      |   41 +
 Plugins/ATconfig/Info.plist                   |   32 -
 Plugins/ATconfig/atconfig.c                   | 1630 -----
 Plugins/ATconfig/cfManager.c                  |  260 -
 Plugins/IPMonitor/Info.plist                  |    6 +-
 Plugins/IPMonitor/Makefile                    |   73 +-
 Plugins/IPMonitor/dns-configuration.c         |  801 ++-
 Plugins/IPMonitor/ip_plugin.c                 |  623 +-
 Plugins/IPMonitor/proxy-configuration.c       |  886 +++
 .../IPMonitor/proxy-configuration.h           |   21 +-
 Plugins/IPMonitor/set-hostname.c              |   38 +-
 Plugins/IPMonitor/smb-configuration.c         |   26 +-
 Plugins/InterfaceNamer/Info.plist             |    4 +-
 Plugins/InterfaceNamer/Makefile               |   13 +
 Plugins/InterfaceNamer/ifnamer.c              |  608 +-
 Plugins/KernelEventMonitor/Info.plist         |    4 +-
 Plugins/KernelEventMonitor/ev_appletalk.c     |  404 --
 Plugins/KernelEventMonitor/eventmon.c         |  178 +-
 Plugins/Kicker/Info.plist                     |   32 -
 Plugins/Kicker/Kicker.xml                     |   18 -
 Plugins/Kicker/enable-network                 |   23 -
 Plugins/Kicker/kicker.c                       |  537 --
 Plugins/LinkConfiguration/Info.plist          |    4 +-
 Plugins/LinkConfiguration/Makefile            |   12 +
 Plugins/LinkConfiguration/linkconfig.c        |  194 +-
 Plugins/Logger/Info-Embedded.plist            |    6 +-
 Plugins/Logger/Info.plist                     |    4 +-
 Plugins/Logger/Makefile                       |    2 +-
 Plugins/Logger/logger.c                       |   93 +-
 Plugins/NetworkIdentification/Info.plist      |    4 +-
 Plugins/PreferencesMonitor/Info.plist         |    4 +-
 Plugins/PreferencesMonitor/prefsmon.c         |   12 +-
 SCMonitor/Info.plist                          |    4 +-
 SCMonitor/monitor.c                           |  120 +-
 SystemConfiguration.fproj/AppWorkaround.plist |   26 +
 SystemConfiguration.fproj/BondConfiguration.c |   74 +-
 .../BridgeConfiguration.c                     | 1221 ++++
 SystemConfiguration.fproj/CaptiveNetwork.c    |  116 +
 SystemConfiguration.fproj/CaptiveNetwork.h    |  144 +
 .../English.lproj/Localizable.strings         |  Bin 1298 -> 1492 bytes
 .../English.lproj/NetworkInterface.strings    |  Bin 4274 -> 4888 bytes
 SystemConfiguration.fproj/Info-Embedded.plist |    6 +-
 SystemConfiguration.fproj/Info.plist          |    6 +-
 SystemConfiguration.fproj/LinkConfiguration.c |  448 +-
 .../NetworkConfiguration.plist                |   64 +
 SystemConfiguration.fproj/SCD.c               |   99 +-
 SystemConfiguration.fproj/SCDAdd.c            |   42 +-
 SystemConfiguration.fproj/SCDGet.c            |   70 +-
 SystemConfiguration.fproj/SCDKeys.c           |   17 +-
 SystemConfiguration.fproj/SCDList.c           |   32 +-
 SystemConfiguration.fproj/SCDLock.c           |   14 +-
 SystemConfiguration.fproj/SCDNotifierAdd.c    |   38 +-
 SystemConfiguration.fproj/SCDNotifierCancel.c |   43 +-
 .../SCDNotifierGetChanges.c                   |   24 +-
 .../SCDNotifierInformViaCallback.c            |  244 +-
 .../SCDNotifierInformViaFD.c                  |   11 +-
 .../SCDNotifierInformViaMachPort.c            |   12 +-
 .../SCDNotifierInformViaSignal.c              |   11 +-
 SystemConfiguration.fproj/SCDNotifierRemove.c |   48 +-
 .../SCDNotifierSetKeys.c                      |   38 +-
 SystemConfiguration.fproj/SCDNotifierWait.c   |   34 +-
 SystemConfiguration.fproj/SCDNotify.c         |   20 +-
 SystemConfiguration.fproj/SCDOpen.c           |  385 +-
 SystemConfiguration.fproj/SCDPlugin.c         |    4 +-
 SystemConfiguration.fproj/SCDPrivate.c        |  261 +-
 SystemConfiguration.fproj/SCDRemove.c         |   20 +-
 SystemConfiguration.fproj/SCDSet.c            |   44 +-
 SystemConfiguration.fproj/SCDSnapshot.c       |   14 +-
 SystemConfiguration.fproj/SCDTouch.c          |   20 +-
 SystemConfiguration.fproj/SCDUnlock.c         |   12 +-
 SystemConfiguration.fproj/SCDynamicStore.h    |   19 +-
 .../SCDynamicStoreInternal.h                  |   26 +-
 .../SCDynamicStorePrivate.h                   |   95 +-
 SystemConfiguration.fproj/SCLocation.c        |    3 +-
 SystemConfiguration.fproj/SCNetwork.h         |    6 +-
 .../SCNetworkConfiguration.h                  |   71 +-
 .../SCNetworkConfigurationInternal.c          |   22 +-
 .../SCNetworkConfigurationInternal.h          |   53 +-
 .../SCNetworkConfigurationPrivate.h           |  359 +-
 .../SCNetworkConnection.c                     | 1116 ++-
 .../SCNetworkConnection.h                     |   19 +-
 .../SCNetworkConnectionPrivate.c              |  166 +-
 .../SCNetworkConnectionPrivate.h              |    8 +-
 .../SCNetworkInterface.c                      |  992 ++-
 .../SCNetworkReachability.c                   | 1679 +++--
 .../SCNetworkReachability.h                   |   12 +-
 SystemConfiguration.fproj/SCNetworkService.c  |  326 +-
 SystemConfiguration.fproj/SCNetworkSet.c      |  384 +-
 .../SCNetworkSignature.c                      |  152 +-
 .../SCNetworkSignature.h                      |   19 +-
 .../SCNetworkSignaturePrivate.h               |    4 +-
 SystemConfiguration.fproj/SCP.c               |    5 +-
 SystemConfiguration.fproj/SCPApply.c          |   19 +-
 SystemConfiguration.fproj/SCPCommit.c         |   87 +-
 SystemConfiguration.fproj/SCPLock.c           |  192 +-
 SystemConfiguration.fproj/SCPOpen.c           |  235 +-
 SystemConfiguration.fproj/SCPPath.c           |   51 +-
 SystemConfiguration.fproj/SCPRemove.c         |   21 +-
 SystemConfiguration.fproj/SCPUnlock.c         |   16 +-
 SystemConfiguration.fproj/SCPreferences.h     |   14 +-
 .../SCPreferencesInternal.h                   |   12 +-
 .../SCPreferencesKeychainPrivate.c            |  135 +-
 .../SCPreferencesPathKey.c                    |   17 +-
 .../SCPreferencesPrivate.h                    |   53 +-
 .../SCPreferencesSetSpecific.h                |    2 +-
 SystemConfiguration.fproj/SCPrivate.h         |  139 +-
 SystemConfiguration.fproj/SCProxies.c         |  200 +-
 .../SCSchemaDefinitions.c                     |   64 +-
 .../SCSchemaDefinitions.h                     |  631 +-
 .../SCSchemaDefinitionsPrivate.h              |  877 ++-
 .../SystemConfiguration.h                     |    8 +-
 SystemConfiguration.fproj/VLANConfiguration.c |   54 +-
 SystemConfiguration.fproj/VPNConfiguration.c  |    4 +
 SystemConfiguration.fproj/VPNConfiguration.h  |    4 +
 SystemConfiguration.fproj/VPNPrivate.c        |    5 +
 SystemConfiguration.fproj/VPNPrivate.h        |    4 +
 SystemConfiguration.fproj/VPNTunnel.c         |    4 +
 SystemConfiguration.fproj/VPNTunnel.h         |    4 +
 SystemConfiguration.fproj/VPNTunnelPrivate.h  |    4 +
 SystemConfiguration.fproj/dy_framework.c      |  107 +-
 SystemConfiguration.fproj/dy_framework.h      |   77 +-
 SystemConfiguration.fproj/genSCPreferences.c  |  264 +-
 .../helper/SCHelper_client.c                  |  212 +-
 .../helper/SCHelper_client.h                  |    9 +-
 .../helper/SCHelper_server.c                  | 1389 +++-
 .../helper/com.apple.SCHelper-embedded.plist  |   13 +-
 .../helper/com.apple.SCHelper.plist           |   13 +-
 SystemConfiguration.fproj/helper/helper.defs  |   65 +
 .../helper/helper_comm.c                      |  182 -
 .../helper/helper_types.h                     |   47 +-
 SystemConfiguration.fproj/update-headers      |   12 +-
 configd.tproj/_configclose.c                  |   16 +-
 configd.tproj/_notifyadd.c                    |   85 +-
 configd.tproj/_notifyremove.c                 |   51 +-
 configd.tproj/_notifyviafd.c                  |    8 +-
 configd.tproj/_snapshot.c                     |   36 +-
 configd.tproj/com.apple.configd.plist         |    2 -
 configd.tproj/configd.8                       |    4 +-
 configd.tproj/configd.m                       |   37 +-
 configd.tproj/configd_server.c                |   17 +-
 configd.tproj/entitlements.plist              |    1 +
 configd.tproj/pattern.c                       |   25 +-
 configd.tproj/plugin_support.c                |   37 +-
 configd.tproj/session.c                       |   99 +-
 configd.tproj/session.h                       |   11 +-
 configd.xcodeproj/project.pbxproj             | 5961 +++++++++++------
 dnsinfo/dnsinfo.h                             |   15 +-
 dnsinfo/dnsinfo_copy.c                        |   89 +-
 dnsinfo/dnsinfo_create.c                      |   80 +-
 dnsinfo/dnsinfo_create.h                      |   28 +-
 dnsinfo/dnsinfo_flatfile.c                    |  119 +-
 dnsinfo/dnsinfo_private.c                     |   13 +
 dnsinfo/dnsinfo_private.h                     |  108 +-
 get-mobility-info                             |  408 +-
 scselect.tproj/scselect.c                     |   15 +-
 scutil.tproj/commands.c                       |    7 +-
 scutil.tproj/dictionary.c                     |    4 +-
 scutil.tproj/nc.c                             |  772 +++
 .../ATconfig/cfManager.h => scutil.tproj/nc.h |   23 +-
 scutil.tproj/net.c                            |   21 +-
 scutil.tproj/net_interface.c                  |  502 +-
 scutil.tproj/net_protocol.c                   |  144 +-
 scutil.tproj/net_service.c                    |   37 +-
 scutil.tproj/net_service.h                    |    4 +-
 scutil.tproj/net_set.c                        |   10 +-
 scutil.tproj/notifications.c                  |   79 +-
 scutil.tproj/prefs.c                          |   61 +-
 scutil.tproj/scutil.c                         |   46 +-
 scutil.tproj/scutil.h                         |    3 +-
 scutil.tproj/session.c                        |   27 +-
 scutil.tproj/tests.c                          |  386 +-
 171 files changed, 20519 insertions(+), 10033 deletions(-)
 create mode 100644 Makefile
 delete mode 100644 Plugins/ATconfig/Info.plist
 delete mode 100644 Plugins/ATconfig/atconfig.c
 delete mode 100644 Plugins/ATconfig/cfManager.c
 create mode 100644 Plugins/IPMonitor/proxy-configuration.c
 rename SystemConfiguration.fproj/helper/helper_comm.h => Plugins/IPMonitor/proxy-configuration.h (72%)
 create mode 100644 Plugins/InterfaceNamer/Makefile
 delete mode 100644 Plugins/KernelEventMonitor/ev_appletalk.c
 delete mode 100644 Plugins/Kicker/Info.plist
 delete mode 100644 Plugins/Kicker/Kicker.xml
 delete mode 100755 Plugins/Kicker/enable-network
 delete mode 100644 Plugins/Kicker/kicker.c
 create mode 100644 Plugins/LinkConfiguration/Makefile
 create mode 100644 SystemConfiguration.fproj/AppWorkaround.plist
 create mode 100644 SystemConfiguration.fproj/BridgeConfiguration.c
 create mode 100644 SystemConfiguration.fproj/CaptiveNetwork.c
 create mode 100644 SystemConfiguration.fproj/CaptiveNetwork.h
 create mode 100644 SystemConfiguration.fproj/VPNConfiguration.c
 create mode 100644 SystemConfiguration.fproj/VPNConfiguration.h
 create mode 100644 SystemConfiguration.fproj/VPNPrivate.c
 create mode 100644 SystemConfiguration.fproj/VPNPrivate.h
 create mode 100644 SystemConfiguration.fproj/VPNTunnel.c
 create mode 100644 SystemConfiguration.fproj/VPNTunnel.h
 create mode 100644 SystemConfiguration.fproj/VPNTunnelPrivate.h
 create mode 100644 SystemConfiguration.fproj/helper/helper.defs
 delete mode 100644 SystemConfiguration.fproj/helper/helper_comm.c
 rename Plugins/KernelEventMonitor/ev_appletalk.h => SystemConfiguration.fproj/helper/helper_types.h (55%)
 create mode 100644 scutil.tproj/nc.c
 rename Plugins/ATconfig/cfManager.h => scutil.tproj/nc.h (64%)

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d65e129
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,41 @@
+#----------------------------------------------------------------------
+#
+# Build for [current] release
+#
+#----------------------------------------------------------------------
+
+all :
+	/usr/local/bin/buildit .				\
+	  -noinstallsrc -noinstallhdrs -noverify -nosum		\
+	  -arch i386 -arch x86_64 -arch ppc 			\
+	  -target All						\
+	  -project configd					\
+	  -configuration Debug					\
+	  -release $(shell cat /usr/share/buildit/.releaseName)	\
+
+#----------------------------------------------------------------------
+#
+# Build for SnowLeopard, SUSnowXXX, ...
+#
+# Note: assumes that the "pppcontroller_sendmsg" routine has been defined
+#       in pppcontroller.defs.
+#
+#----------------------------------------------------------------------
+
+PROJECT=$(shell basename `pwd -P`)
+
+SNOW_CFLAGS += -D__MAC_10_7=1060
+SNOW_CFLAGS += -D__AVAILABILITY_INTERNAL__MAC_10_7=__AVAILABILITY_INTERNAL__MAC_10_6
+SNOW_CFLAGS += -D__AVAILABILITY_INTERNAL__MAC_10_5_DEP__MAC_10_7=__AVAILABILITY_INTERNAL__MAC_10_5
+#SNOW_CFLAGS += -DHAVE_PPPCONTROLLER_SENDMSG=YES
+
+snow :
+	/usr/local/bin/buildit .				\
+	  -noinstallsrc -noinstallhdrs -noverify -nosum		\
+	  -arch i386 -arch x86_64 -arch ppc			\
+	  -target All						\
+	  -project ${PROJECT}					\
+	  -configuration Debug					\
+	  -release $(shell cat /usr/share/buildit/.releaseName)	\
+	  -othercflags "\"$(SNOW_CFLAGS)\""			\
+
diff --git a/Plugins/ATconfig/Info.plist b/Plugins/ATconfig/Info.plist
deleted file mode 100644
index e4ecc0a..0000000
--- a/Plugins/ATconfig/Info.plist
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>ATconfig</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.apple.SystemConfiguration.ATconfig</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>com.apple.SystemConfiguration.ATconfig</string>
-	<key>CFBundlePackageType</key>
-	<string>BNDL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
-	<key>Builtin</key>
-	<true/>
-	<key>Requires</key>
-	<array>
-		<string>com.apple.SystemConfiguration.InterfaceNamer</string>
-		<string>com.apple.SystemConfiguration.KernelEventMonitor</string>
-		<string>com.apple.SystemConfiguration.PreferencesMonitor</string>
-	</array>
-</dict>
-</plist>
diff --git a/Plugins/ATconfig/atconfig.c b/Plugins/ATconfig/atconfig.c
deleted file mode 100644
index 9f0d405..0000000
--- a/Plugins/ATconfig/atconfig.c
+++ /dev/null
@@ -1,1630 +0,0 @@
-/*
- * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-/*
- * Modification History
- *
- * March 15, 2003		Allan Nathanson <ajn@apple.com>
- * - startup/shutdown AT networking without Kicker's help and
- *   publish the state information after the configuration is
- *   active.
- *
- * April 29, 2002		Allan Nathanson <ajn@apple.com>
- * - add global state information (primary service, interface)
- *
- * June 24, 2001		Allan Nathanson <ajn@apple.com>
- * - update to public SystemConfiguration.framework APIs
- *
- * July 7, 2000			Allan Nathanson <ajn@apple.com>
- * - initial revision
- */
-
-
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/utsname.h>
-#include <sys/wait.h>
-#include <dlfcn.h>
-#include <net/if.h>
-#include <netat/appletalk.h>
-#include <netat/at_var.h>
-#include <AppleTalk/at_paths.h>
-#include <AppleTalk/at_proto.h>
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <SystemConfiguration/SystemConfiguration.h>
-#include <SystemConfiguration/SCPrivate.h>
-#include <SystemConfiguration/SCDPlugin.h>
-#include <SystemConfiguration/SCValidation.h>
-
-#include "cache.h"
-#include "cfManager.h"
-
-#define HOSTCONFIG	"/etc/hostconfig"
-
-static SCDynamicStoreRef	store		= NULL;
-static CFRunLoopSourceRef	storeRls	= NULL;
-
-static int			curState	= 0;	// abs(state) == sequence #, < 0 == stop, > 0 == start
-static CFMutableDictionaryRef	curGlobals	= NULL;
-static CFMutableArrayRef	curConfigFile	= NULL;
-static CFMutableDictionaryRef	curDefaults	= NULL;
-static CFMutableDictionaryRef	curStartup	= NULL;
-
-static Boolean			_verbose	= FALSE;
-
-
-#define	RETRY_DELAY	2.0	// seconds
-#define	RETRY_LIMIT	5	// # of startup/shutdown attempts
-
-static void	startAppleTalk(CFRunLoopTimerRef timer, void *info);
-static void	stopAppleTalk (CFRunLoopTimerRef timer, void *info);
-
-
-static void *
-__loadAppleTalk(void) {
-	static void *image = NULL;
-	if (NULL == image) {
-		const char	*framework		= "/System/Library/Frameworks/AppleTalk.framework/Versions/A/AppleTalk";
-		struct stat	statbuf;
-		const char	*suffix			= getenv("DYLD_IMAGE_SUFFIX");
-		char		path[MAXPATHLEN];
-
-		strlcpy(path, framework, sizeof(path));
-		if (suffix) strlcat(path, suffix, sizeof(path));
-		if (0 <= stat(path, &statbuf)) {
-			image = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
-		} else {
-			image = dlopen(framework, RTLD_LAZY | RTLD_LOCAL);
-		}
-	}
-	return (void *)image;
-}
-
-
-static int
-_at_setdefaultaddr(char *ifName, struct at_addr *init_address)
-{
-	#undef at_setdefaultaddr
-	static typeof (at_setdefaultaddr) *dyfunc = NULL;
-	if (!dyfunc) {
-		void *image = __loadAppleTalk();
-		if (image) dyfunc = dlsym(image, "at_setdefaultaddr");
-	}
-	return dyfunc ? dyfunc(ifName, init_address) : -1;
-}
-#define at_setdefaultaddr _at_setdefaultaddr
-
-
-static int
-_at_setdefaultzone(char *ifName, at_nvestr_t *zone)
-{
-	#undef at_setdefaultzone
-	static typeof (at_setdefaultzone) *dyfunc = NULL;
-	if (!dyfunc) {
-		void *image = __loadAppleTalk();
-		if (image) dyfunc = dlsym(image, "at_setdefaultzone");
-	}
-	return dyfunc ? dyfunc(ifName, zone) : -1;
-}
-#define at_setdefaultzone _at_setdefaultzone
-
-
-static void
-updateDefaults(const void *key, const void *val, void *context)
-{
-	CFStringRef		ifName		= (CFStringRef)key;
-	CFDictionaryRef		oldDict;
-	CFDictionaryRef		newDict		= (CFDictionaryRef)val;
-	CFNumberRef		defaultNode;
-	CFNumberRef		defaultNetwork;
-	CFStringRef		defaultZone;
-
-	if (!CFDictionaryGetValueIfPresent(curDefaults, ifName, (const void **)&oldDict) ||
-	    !CFEqual(oldDict, newDict)) {
-		char		ifr_name[IFNAMSIZ + 1];
-
-		bzero(&ifr_name, sizeof(ifr_name));
-		if (!_SC_cfstring_to_cstring(ifName, ifr_name, sizeof(ifr_name), kCFStringEncodingASCII)) {
-			SCLog(TRUE, LOG_ERR, CFSTR("could not convert interface name to C string"));
-			return;
-		}
-
-		/*
-		 * Set preferred Network and Node ID
-		 */
-		if (CFDictionaryGetValueIfPresent(newDict,
-						  kSCPropNetAppleTalkNetworkID,
-						  (const void **)&defaultNetwork) &&
-		    CFDictionaryGetValueIfPresent(newDict,
-						  kSCPropNetAppleTalkNodeID,
-						  (const void **)&defaultNode)
-		    ) {
-			struct at_addr	init_address;
-			int		status;
-
-			/*
-			 * set the default node and network
-			 */
-			CFNumberGetValue(defaultNetwork, kCFNumberShortType, &init_address.s_net);
-			CFNumberGetValue(defaultNode,    kCFNumberCharType,  &init_address.s_node);
-			status = at_setdefaultaddr(ifr_name, &init_address);
-			if (status == -1) {
-				SCLog(TRUE, LOG_ERR, CFSTR("at_setdefaultaddr() failed"));
-				return;
-			}
-		}
-
-		/*
-		 * Set default zone
-		 */
-		if (CFDictionaryGetValueIfPresent(newDict,
-						  kSCPropNetAppleTalkDefaultZone,
-						  (const void **)&defaultZone)
-		    ) {
-			int		status;
-			at_nvestr_t	zone;
-
-			/*
-			 * set the "default zone" for this interface
-			 */
-			bzero(&zone, sizeof(zone));
-			if (!_SC_cfstring_to_cstring(defaultZone,
-						     (char *)zone.str,
-						     sizeof(zone.str),
-						     kCFStringEncodingASCII)) {
-				SCLog(TRUE, LOG_ERR, CFSTR("could not convert default zone to C string"));
-				return;
-			}
-
-			zone.len = strlen((const char *)zone.str);
-			status = at_setdefaultzone(ifr_name, &zone);
-			if (status == -1) {
-				SCLog(TRUE, LOG_ERR, CFSTR("at_setdefaultzone() failed"));
-				return;
-			}
-		}
-	}
-
-	return;
-}
-
-
-static void
-addZoneToPorts(const void *key, const void *val, void *context)
-{
-	CFStringRef		zone		= (CFStringRef)key;
-	CFArrayRef		ifArray		= (CFArrayRef)val;
-	CFMutableArrayRef	zones		= (CFMutableArrayRef)context;
-	CFStringRef		ifList;
-	CFStringRef		configInfo;
-
-	ifList = CFStringCreateByCombiningStrings(NULL, ifArray, CFSTR(":"));
-	configInfo = CFStringCreateWithFormat(NULL, NULL, CFSTR(":%@:%@"), zone, ifList);
-	CFArrayAppendValue(zones, configInfo);
-	CFRelease(configInfo);
-	CFRelease(ifList);
-	return;
-}
-
-
-/*
- * Function: parse_component
- * Purpose:
- *   Given a string 'key' and a string prefix 'prefix',
- *   return the next component in the slash '/' separated
- *   key.
- *
- * Examples:
- * 1. key = "a/b/c" prefix = "a/"
- *    returns "b"
- * 2. key = "a/b/c" prefix = "a/b/"
- *    returns "c"
- */
-static CFStringRef
-parse_component(CFStringRef key, CFStringRef prefix)
-{
-	CFMutableStringRef	comp;
-	CFRange			range;
-
-	if (CFStringHasPrefix(key, prefix) == FALSE) {
-		return NULL;
-	}
-	comp = CFStringCreateMutableCopy(NULL, 0, key);
-	CFStringDelete(comp, CFRangeMake(0, CFStringGetLength(prefix)));
-	range = CFStringFind(comp, CFSTR("/"), 0);
-	if (range.location == kCFNotFound) {
-		return comp;
-	}
-	range.length = CFStringGetLength(comp) - range.location;
-	CFStringDelete(comp, range);
-	return comp;
-}
-
-
-static CFDictionaryRef
-entity_one(SCDynamicStoreRef store, CFStringRef key)
-{
-	CFDictionaryRef		ent_dict	= NULL;
-	CFDictionaryRef		if_dict		= NULL;
-	CFStringRef 		if_key		= NULL;
-	CFStringRef 		if_port;
-	CFMutableDictionaryRef	new_dict	= NULL;
-	static CFStringRef	pre		= NULL;
-	CFStringRef		serviceID	= NULL;
-	CFStringRef		serviceType;
-
-	if (!pre) {
-		pre = SCDynamicStoreKeyCreate(NULL,
-					      CFSTR("%@/%@/%@/"),
-					      kSCDynamicStoreDomainSetup,
-					      kSCCompNetwork,
-					      kSCCompService);
-	}
-
-	/*
-	 * get entity dictionary for service
-	 */
-	ent_dict = cache_SCDynamicStoreCopyValue(store, key);
-	if (!isA_CFDictionary(ent_dict)) {
-		goto done;
-	}
-
-	/*
-	 * get interface dictionary for service
-	 */
-	serviceID = parse_component(key, pre);
-	if (!serviceID) {
-		goto done;
-	}
-
-	if_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-							     kSCDynamicStoreDomainSetup,
-							     serviceID,
-							     kSCEntNetInterface);
-	if_dict = cache_SCDynamicStoreCopyValue(store, if_key);
-	CFRelease(if_key);
-	if (!isA_CFDictionary(if_dict)) {
-		goto done;
-	}
-
-	/* check the interface type */
-	serviceType = CFDictionaryGetValue(if_dict,
-					   kSCPropNetInterfaceType);
-	if (!isA_CFString(serviceType) ||
-	    !CFEqual(serviceType, kSCValNetInterfaceTypeEthernet)) {
-		/* sorry, no AT networking on this interface */
-		goto done;
-	}
-
-	/*
-	 * get port name (from interface dictionary).
-	 */
-	if_port = CFDictionaryGetValue(if_dict, kSCPropNetInterfaceDeviceName);
-	if (!isA_CFString(if_port)) {
-		goto done;
-	}
-
-	/*
-	 * add ServiceID and interface port name to entity dictionary.
-	 */
-	new_dict = CFDictionaryCreateMutableCopy(NULL, 0, ent_dict);
-	CFDictionarySetValue(new_dict, CFSTR("ServiceID"), serviceID);
-	CFDictionarySetValue(new_dict, kSCPropNetInterfaceDeviceName, if_port);
-
-    done:
-
-	if (ent_dict)	CFRelease(ent_dict);
-	if (if_dict)	CFRelease(if_dict);
-	if (serviceID)	CFRelease(serviceID);
-	return (CFDictionaryRef)new_dict;
-}
-
-
-static CFArrayRef
-entity_all(SCDynamicStoreRef store, CFStringRef entity, CFArrayRef order)
-{
-	CFMutableArrayRef	defined	= NULL;
-	CFIndex			i;
-	CFIndex			n;
-	CFMutableArrayRef	ordered	= NULL;
-	CFStringRef		pattern;
-
-	ordered = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-
-	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-							      kSCDynamicStoreDomainSetup,
-							      kSCCompAnyRegex,
-							      entity);
-	defined = (CFMutableArrayRef)SCDynamicStoreCopyKeyList(store, pattern);
-	CFRelease(pattern);
-	if (defined && (CFArrayGetCount(defined) > 0)) {
-		CFArrayRef	tmp;
-
-		tmp = defined;
-		defined = CFArrayCreateMutableCopy(NULL, 0, tmp);
-		CFRelease(tmp);
-	} else {
-		goto done;
-	}
-
-	n = order ? CFArrayGetCount(order) : 0;
-	for (i = 0; i < n; i++) {
-		CFDictionaryRef	dict;
-		CFStringRef	key;
-		CFIndex		j;
-		CFStringRef	service;
-
-		service = CFArrayGetValueAtIndex(order, i);
-		if (!isA_CFString(service)) {
-			continue;
-		}
-
-		key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								  kSCDynamicStoreDomainSetup,
-								  service,
-								  entity);
-		dict = entity_one(store, key);
-		if (dict) {
-			CFArrayAppendValue(ordered, dict);
-			CFRelease(dict);
-		}
-
-		j = CFArrayGetFirstIndexOfValue(defined,
-						CFRangeMake(0, CFArrayGetCount(defined)),
-						key);
-		if (j != kCFNotFound) {
-			CFArrayRemoveValueAtIndex(defined, j);
-		}
-
-		CFRelease(key);
-	}
-
-	n = CFArrayGetCount(defined);
-	for (i = 0; i < n; i++) {
-		CFDictionaryRef	dict;
-		CFStringRef	key;
-
-		key  = CFArrayGetValueAtIndex(defined, i);
-		dict = entity_one(store, key);
-		if (dict) {
-			CFArrayAppendValue(ordered, dict);
-			CFRelease(dict);
-		}
-	}
-
-    done:
-
-	if (defined)	CFRelease(defined);
-	if (CFArrayGetCount(ordered) == 0) {
-		CFRelease(ordered);
-		ordered = NULL;
-	}
-	return ordered;
-}
-
-
-static void
-encodeName(CFStringRef			name,
-	   CFStringEncoding		encoding,
-	   CFMutableDictionaryRef	startup,
-	   CFMutableDictionaryRef	globals)
-{
-	CFDataRef		bytes;
-	CFMutableStringRef	encodedName = NULL;
-	CFIndex			len;
-
-	if (!isA_CFString(name)) {
-		return;
-	}
-
-	if (encoding == kCFStringEncodingASCII) {
-		encodedName = (CFMutableStringRef)CFStringCreateCopy(NULL, name);
-		goto done;
-	}
-
-	/*
-	 * encode the potentially non-printable string
-	 */
-	bytes = CFStringCreateExternalRepresentation(NULL,
-						     name,
-						     encoding,
-						     0);
-	if (bytes) {
-		unsigned char	*byte;
-		CFIndex		i;
-
-		/*
-		 * check if the MacRoman string can be represented as ASCII
-		 */
-		if (encoding == kCFStringEncodingMacRoman) {
-			CFDataRef       ascii;
-
-			ascii = CFStringCreateExternalRepresentation(NULL,
-								     name,
-								     kCFStringEncodingASCII,
-								     0);
-			if (ascii) {
-				CFRelease(ascii);
-				CFRelease(bytes);
-				encodedName = (CFMutableStringRef)CFStringCreateCopy(NULL, name);
-				goto done;
-			}
-		}
-
-		encodedName = CFStringCreateMutable(NULL, 0);
-
-		len  = CFDataGetLength(bytes);
-		byte = (unsigned char *)CFDataGetBytePtr(bytes);
-		for (i = 0; i < len; i++, byte++) {
-			CFStringAppendFormat(encodedName,
-					     NULL,
-					     CFSTR("%02x"),
-					     *byte);
-		}
-
-		/*
-		 * add "encoded string" markers
-		 */
-		CFStringInsert(encodedName, 0, CFSTR("*"));
-		CFStringAppend(encodedName,    CFSTR("*"));
-
-		CFRelease(bytes);
-	}
-
-    done :
-
-	if (encodedName) {
-		if (startup) {
-			/* update "startup" dictionary */
-			CFDictionaryAddValue(startup, CFSTR("APPLETALK_HOSTNAME"), encodedName);
-		}
-
-		if (globals) {
-			CFNumberRef	num;
-
-			/* update "global" dictionary */
-			num = CFNumberCreate(NULL, kCFNumberIntType, &encoding);
-			CFDictionaryAddValue(globals, kSCPropNetAppleTalkComputerName,         name);
-			CFDictionaryAddValue(globals, kSCPropNetAppleTalkComputerNameEncoding, num);
-			CFRelease(num);
-		}
-
-		CFRelease(encodedName);
-	}
-
-	return;
-}
-
-
-static boolean_t
-updateConfiguration(int *newState)
-{
-	boolean_t		changed			= FALSE;
-	CFStringRef		computerName;
-	CFStringEncoding	computerNameEncoding;
-	CFArrayRef		configuredServices	= NULL;
-	CFDictionaryRef		dict;
-	CFIndex			i;
-	CFIndex			ifCount			= 0;
-	CFMutableArrayRef	info			= NULL;
-	CFArrayRef		interfaces		= NULL;
-	CFStringRef		key;
-	CFArrayRef		keys;
-	CFIndex			n;
-	CFMutableArrayRef	newConfigFile;
-	CFMutableDictionaryRef	newDefaults;
-	CFMutableDictionaryRef	newDict;
-	CFMutableDictionaryRef	newGlobals;
-	CFMutableDictionaryRef	newGlobalsX;			/* newGlobals without ServiceID */
-	CFMutableDictionaryRef	newStartup;
-	CFMutableDictionaryRef	newZones;
-	CFNumberRef		num;
-	CFMutableDictionaryRef	curGlobalsX;			/* curGlobals without ServiceID */
-	CFStringRef		pattern;
-	boolean_t		postGlobals		= FALSE;
-	CFStringRef		primaryPort		= NULL;	/* primary interface */
-	CFStringRef		primaryZone		= NULL;
-	CFArrayRef		serviceOrder		= NULL;
-	CFDictionaryRef		setGlobals		= NULL;
-
-	cache_open();
-
-	/*
-	 * establish the "new" AppleTalk configuration
-	 */
-	*newState     = curState;
-	newConfigFile = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-	newGlobals    = CFDictionaryCreateMutable(NULL,
-						  0,
-						  &kCFTypeDictionaryKeyCallBacks,
-						  &kCFTypeDictionaryValueCallBacks);
-	newDefaults   = CFDictionaryCreateMutable(NULL,
-						  0,
-						  &kCFTypeDictionaryKeyCallBacks,
-						  &kCFTypeDictionaryValueCallBacks);
-	newStartup    = CFDictionaryCreateMutable(NULL,
-						  0,
-						  &kCFTypeDictionaryKeyCallBacks,
-						  &kCFTypeDictionaryValueCallBacks);
-	newZones      = CFDictionaryCreateMutable(NULL,
-						  0,
-						  &kCFTypeDictionaryKeyCallBacks,
-						  &kCFTypeDictionaryValueCallBacks);
-
-	/* initialize overall state */
-	CFDictionarySetValue(newStartup, CFSTR("APPLETALK"), CFSTR("-NO-"));
-
-	/*
-	 * get the global settings (ServiceOrder, ComputerName, ...)
-	 */
-	key = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
-							 kSCDynamicStoreDomainSetup,
-							 kSCEntNetAppleTalk);
-	setGlobals = cache_SCDynamicStoreCopyValue(store, key);
-	CFRelease(key);
-	if (setGlobals) {
-		if (isA_CFDictionary(setGlobals)) {
-			/* get service order */
-			serviceOrder = CFDictionaryGetValue(setGlobals,
-							    kSCPropNetServiceOrder);
-			serviceOrder = isA_CFArray(serviceOrder);
-			if (serviceOrder) {
-				CFRetain(serviceOrder);
-			}
-		} else {
-			CFRelease(setGlobals);
-			setGlobals = NULL;
-		}
-	}
-
-	/*
-	 * if we don't have an AppleTalk ServiceOrder, use IPv4's (if defined)
-	 */
-	if (!serviceOrder) {
-		key = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
-								 kSCDynamicStoreDomainSetup,
-								 kSCEntNetIPv4);
-		dict = cache_SCDynamicStoreCopyValue(store, key);
-		CFRelease(key);
-		if (dict) {
-			if (isA_CFDictionary(dict)) {
-				serviceOrder = CFDictionaryGetValue(dict,
-								    kSCPropNetServiceOrder);
-				serviceOrder = isA_CFArray(serviceOrder);
-				if (serviceOrder) {
-					CFRetain(serviceOrder);
-				}
-			}
-			CFRelease(dict);
-		}
-	}
-
-	/*
-	 * get the list of ALL configured services
-	 */
-	configuredServices = entity_all(store, kSCEntNetAppleTalk, serviceOrder);
-	if (configuredServices) {
-		ifCount = CFArrayGetCount(configuredServices);
-	}
-
-	if (serviceOrder)	CFRelease(serviceOrder);
-
-	/*
-	 * get the list of ALL active interfaces
-	 */
-	key  = SCDynamicStoreKeyCreateNetworkInterface(NULL, kSCDynamicStoreDomainState);
-	dict = cache_SCDynamicStoreCopyValue(store, key);
-	CFRelease(key);
-	if (dict) {
-		if (isA_CFDictionary(dict)) {
-			interfaces = CFDictionaryGetValue(dict,
-							  kSCDynamicStorePropNetInterfaces);
-			interfaces = isA_CFArray(interfaces);
-			if (interfaces) {
-				CFRetain(interfaces);
-			}
-		}
-		CFRelease(dict);
-	}
-
-	/*
-	 * get the list of previously configured services
-	 */
-	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-							      kSCDynamicStoreDomainState,
-							      kSCCompAnyRegex,
-							      kSCEntNetAppleTalk);
-	keys = SCDynamicStoreCopyKeyList(store, pattern);
-	CFRelease(pattern);
-	if (keys) {
-		info = CFArrayCreateMutableCopy(NULL, 0, keys);
-		CFRelease(keys);
-	}
-
-	/*
-	 * iterate over each configured service to establish the new
-	 * configuration.
-	 */
-	for (i = 0; i < ifCount; i++) {
-		CFDictionaryRef		service;
-		CFStringRef		ifName;
-		CFStringRef		configMethod;
-		CFMutableStringRef	portConfig	= NULL;
-		CFArrayRef		networkRange;	/* for seed ports, CFArray[2] of CFNumber (lo, hi) */
-		int			sNetwork;
-		int			eNetwork;
-		CFArrayRef		zoneList;	/* for seed ports, CFArray[] of CFString (zones names) */
-		CFIndex			zCount;
-		CFIndex			j;
-		CFMutableDictionaryRef	ifDefaults	= NULL;
-		CFNumberRef		defaultNetwork;
-		CFNumberRef		defaultNode;
-		CFStringRef		defaultZone;
-
-		/* get AppleTalk service dictionary */
-		service = CFArrayGetValueAtIndex(configuredServices, i);
-
-		/* get interface name */
-		ifName  = CFDictionaryGetValue(service, kSCPropNetInterfaceDeviceName);
-
-		/* check inteface availability */
-		if (!interfaces ||
-		    !CFArrayContainsValue(interfaces, CFRangeMake(0, CFArrayGetCount(interfaces)), ifName)) {
-			/* if interface not available */
-			goto nextIF;
-		}
-
-		/* check interface link status */
-		key = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-								    kSCDynamicStoreDomainState,
-								    ifName,
-								    kSCEntNetLink);
-		dict = cache_SCDynamicStoreCopyValue(store, key);
-		CFRelease(key);
-		if (dict) {
-			Boolean	linkStatus	= TRUE;  /* assume the link is "up" */
-			Boolean	ifDetaching	= FALSE; /* assume link is not detaching */
-
-			/* the link key for this interface is available */
-			if (isA_CFDictionary(dict)) {
-				CFBooleanRef	bVal;
-
-				bVal = CFDictionaryGetValue(dict, kSCPropNetLinkActive);
-				if (isA_CFBoolean(bVal)) {
-					linkStatus = CFBooleanGetValue(bVal);
-				}
-
-				/* check if interface is detaching - value
-				   doesn't really matter, only that it exists */
-				ifDetaching = CFDictionaryContainsKey(dict, kSCPropNetLinkDetaching);
-			}
-			CFRelease(dict);
-
-			if (!linkStatus || ifDetaching) {
-				/* if link status down or the interface is detaching */
-				goto nextIF;
-			}
-		}
-
-		/*
-		 * Determine configuration method for this service
-		 */
-		configMethod = CFDictionaryGetValue(service, kSCPropNetAppleTalkConfigMethod);
-		if (!isA_CFString(configMethod)) {
-			/* if no ConfigMethod */
-			goto nextIF;
-		}
-
-		if (!CFEqual(configMethod, kSCValNetAppleTalkConfigMethodNode      ) &&
-		    !CFEqual(configMethod, kSCValNetAppleTalkConfigMethodRouter    ) &&
-		    !CFEqual(configMethod, kSCValNetAppleTalkConfigMethodSeedRouter)) {
-			/* if not one of the expected values, disable */
-			SCLog(TRUE, LOG_NOTICE,
-			      CFSTR("Unexpected AppleTalk ConfigMethod: %@"),
-			      configMethod);
-			goto nextIF;
-		}
-
-		/*
-		 * the first service to be defined will always be "primary"
-		 */
-		if (CFArrayGetCount(newConfigFile) == 0) {
-			CFDictionaryRef	active;
-
-			CFDictionarySetValue(newGlobals,
-					     kSCDynamicStorePropNetPrimaryService,
-					     CFDictionaryGetValue(service, CFSTR("ServiceID")));
-			CFDictionarySetValue(newGlobals,
-					     kSCDynamicStorePropNetPrimaryInterface,
-					     ifName);
-
-			/* and check if AT newtorking is active on the primary interface */
-			key = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-									    kSCDynamicStoreDomainState,
-									    ifName,
-									    kSCEntNetAppleTalk);
-			active = cache_SCDynamicStoreCopyValue(store, key);
-			CFRelease(key);
-			if (active) {
-				if (isA_CFDictionary(active)) {
-					postGlobals = TRUE;
-				}
-				CFRelease(active);
-			}
-		}
-
-		/*
-		 * define the port
-		 */
-		portConfig = CFStringCreateMutable(NULL, 0);
-		CFStringAppendFormat(portConfig, NULL, CFSTR("%@:"), ifName);
-
-		if (CFEqual(configMethod, kSCValNetAppleTalkConfigMethodSeedRouter)) {
-			CFNumberRef	num;
-
-			/*
-			 * we have been asked to configure this interface as a
-			 * seed port. Ensure that we have been provided at least
-			 * one network number, have been provided with at least
-			 * one zonename, ...
-			 */
-
-			networkRange = CFDictionaryGetValue(service,
-							    kSCPropNetAppleTalkSeedNetworkRange);
-			if (!isA_CFArray(networkRange) || (CFArrayGetCount(networkRange) == 0)) {
-				SCLog(TRUE, LOG_NOTICE,
-				      CFSTR("AppleTalk configuration error (%@)"),
-				      kSCPropNetAppleTalkSeedNetworkRange);
-				goto nextIF;
-			}
-
-			/*
-			 * establish the starting and ending network numbers
-			 */
-			num = CFArrayGetValueAtIndex(networkRange, 0);
-			if (!isA_CFNumber(num)) {
-				SCLog(TRUE, LOG_NOTICE,
-				      CFSTR("AppleTalk configuration error (%@)"),
-				      kSCPropNetAppleTalkSeedNetworkRange);
-				goto nextIF;
-			}
-			CFNumberGetValue(num, kCFNumberIntType, &sNetwork);
-			eNetwork = sNetwork;
-
-			if (CFArrayGetCount(networkRange) > 1) {
-				num = CFArrayGetValueAtIndex(networkRange, 1);
-				if (!isA_CFNumber(num)) {
-					SCLog(TRUE, LOG_NOTICE,
-					      CFSTR("AppleTalk configuration error (%@)"),
-					      kSCPropNetAppleTalkSeedNetworkRange);
-					goto nextIF;
-				}
-				CFNumberGetValue(num, kCFNumberIntType, &eNetwork);
-			}
-			CFStringAppendFormat(portConfig, NULL, CFSTR("%d:%d:"), sNetwork, eNetwork);
-
-			/*
-			 * establish the zones associated with this port
-			 */
-			zoneList = CFDictionaryGetValue(service,
-							kSCPropNetAppleTalkSeedZones);
-			if (!isA_CFArray(zoneList)) {
-				SCLog(TRUE, LOG_NOTICE,
-				      CFSTR("AppleTalk configuration error (%@)"),
-				      kSCPropNetAppleTalkSeedZones);
-				goto nextIF;
-			}
-
-			zCount = CFArrayGetCount(zoneList);
-			for (j = 0; j < zCount; j++) {
-				CFStringRef		zone;
-				CFArrayRef		ifList;
-				CFMutableArrayRef	newIFList;
-
-				zone = CFArrayGetValueAtIndex(zoneList, j);
-				if (!isA_CFString(zone)) {
-					continue;
-				}
-
-				if (CFDictionaryGetValueIfPresent(newZones, zone, (const void **)&ifList)) {
-					/* known zone */
-					newIFList = CFArrayCreateMutableCopy(NULL, 0, ifList);
-				} else {
-					/* new zone */
-					newIFList = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-				}
-				CFArrayAppendValue(newIFList, ifName);
-				CFArraySortValues(newIFList,
-						  CFRangeMake(0, CFArrayGetCount(newIFList)),
-						  (CFComparatorFunction)CFStringCompare,
-						  NULL);
-				CFDictionarySetValue(newZones, zone, newIFList);
-				CFRelease(newIFList);
-
-				/*
-				 * flag the default zone
-				 */
-				if (!primaryZone) {
-					primaryZone = CFRetain(zone);
-				}
-			}
-			if (!primaryZone) {
-				SCLog(TRUE, LOG_NOTICE,
-				      CFSTR("AppleTalk configuration error (%@)"),
-				      kSCPropNetAppleTalkSeedZones);
-				goto nextIF;
-			}
-		}
-
-		/* get the (per-interface) "Computer Name" */
-		computerName = CFDictionaryGetValue(service,
-						    kSCPropNetAppleTalkComputerName);
-		if (CFDictionaryGetValueIfPresent(service,
-						  kSCPropNetAppleTalkComputerNameEncoding,
-						  (const void **)&num) &&
-		    isA_CFNumber(num)) {
-			CFNumberGetValue(num, kCFNumberIntType, &computerNameEncoding);
-		} else {
-			computerNameEncoding = CFStringGetSystemEncoding();
-		}
-		encodeName(computerName, computerNameEncoding, newStartup, newGlobals);
-
-		/*
-		 * declare the first configured AppleTalk service / interface
-		 * as the "home port".
-		 */
-		if (CFArrayGetCount(newConfigFile) == 0) {
-			CFStringAppend(portConfig, CFSTR("*"));
-			primaryPort = CFRetain(ifName);
-		}
-		CFArrayAppendValue(newConfigFile, portConfig);
-
-		/*
-		 * get the per-interface defaults
-		 */
-		ifDefaults = CFDictionaryCreateMutable(NULL,
-						       0,
-						       &kCFTypeDictionaryKeyCallBacks,
-						       &kCFTypeDictionaryValueCallBacks);
-
-		defaultNetwork = CFDictionaryGetValue(service, kSCPropNetAppleTalkNetworkID);
-		defaultNode    = CFDictionaryGetValue(service, kSCPropNetAppleTalkNodeID);
-		if (isA_CFNumber(defaultNetwork) && isA_CFNumber(defaultNode)) {
-			/*
-			 * set the default node and network
-			 */
-			CFDictionarySetValue(ifDefaults,
-					     kSCPropNetAppleTalkNetworkID,
-					     defaultNetwork);
-			CFDictionarySetValue(ifDefaults,
-					     kSCPropNetAppleTalkNodeID,
-					     defaultNode);
-		}
-
-		if ((CFDictionaryGetValueIfPresent(service,
-						   kSCPropNetAppleTalkDefaultZone,
-						   (const void **)&defaultZone) == TRUE)) {
-			/*
-			 * set the default zone for this interface
-			 */
-			CFDictionarySetValue(ifDefaults,
-					     kSCPropNetAppleTalkDefaultZone,
-					     defaultZone);
-		}
-
-		CFDictionarySetValue(newDefaults, ifName, ifDefaults);
-		CFRelease(ifDefaults);
-
-		switch (CFArrayGetCount(newConfigFile)) {
-			case 1:
-				/*
-				 * first AppleTalk interface
-				 */
-				CFDictionarySetValue(newStartup, CFSTR("APPLETALK"), ifName);
-				break;
-			case 2:
-				/* second AppleTalk interface */
-				if (!CFEqual(CFDictionaryGetValue(newStartup, CFSTR("APPLETALK")),
-					     CFSTR("-ROUTER-"))) {
-					/*
-					 * if not routing (yet), configure as multi-home
-					 */
-					CFDictionarySetValue(newStartup, CFSTR("APPLETALK"), CFSTR("-MULTIHOME-"));
-				}
-				break;
-		}
-
-		if (CFEqual(configMethod, kSCValNetAppleTalkConfigMethodRouter) ||
-		    CFEqual(configMethod, kSCValNetAppleTalkConfigMethodSeedRouter)) {
-			/* if not a simple node, enable routing */
-			CFDictionarySetValue(newStartup, CFSTR("APPLETALK"), CFSTR("-ROUTER-"));
-		}
-
-		/*
-		 * establish the State:/Network/Service/nnn/AppleTalk key info
-		 */
-		key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								  kSCDynamicStoreDomainState,
-								  CFDictionaryGetValue(service, CFSTR("ServiceID")),
-								  kSCEntNetAppleTalk);
-		newDict = CFDictionaryCreateMutable(NULL,
-						    0,
-						    &kCFTypeDictionaryKeyCallBacks,
-						    &kCFTypeDictionaryValueCallBacks);
-		CFDictionaryAddValue(newDict, kSCPropInterfaceName, ifName);
-		cache_SCDynamicStoreSetValue(store, key, newDict);
-		CFRelease(newDict);
-		if (info) {
-			j = CFArrayGetFirstIndexOfValue(info,
-							CFRangeMake(0, CFArrayGetCount(info)),
-							key);
-			if (j != kCFNotFound) {
-				CFArrayRemoveValueAtIndex(info, j);
-			}
-		}
-		CFRelease(key);
-
-	    nextIF :
-
-		if (portConfig)	CFRelease(portConfig);
-	}
-
-	if (primaryZone) {
-		CFArrayRef		ifList;
-		CFMutableArrayRef	newIFList;
-
-		ifList = CFDictionaryGetValue(newZones, primaryZone);
-		if (CFArrayContainsValue(ifList,
-					 CFRangeMake(0, CFArrayGetCount(ifList)),
-					 primaryPort)) {
-			newIFList = CFArrayCreateMutableCopy(NULL, 0, ifList);
-			CFArrayAppendValue(newIFList, CFSTR("*"));
-			CFDictionarySetValue(newZones, primaryZone, newIFList);
-			CFRelease(newIFList);
-		}
-		CFRelease(primaryZone);
-	}
-	if (primaryPort) {
-		CFRelease(primaryPort);
-	}
-
-	/* sort the ports */
-	i = CFArrayGetCount(newConfigFile);
-	CFArraySortValues(newConfigFile,
-			  CFRangeMake(0, i),
-			  (CFComparatorFunction)CFStringCompare,
-			  NULL);
-
-	/* add the zones to the configuration */
-	CFDictionaryApplyFunction(newZones, addZoneToPorts, newConfigFile);
-	CFRelease(newZones);
-
-	/* sort the zones */
-	CFArraySortValues(newConfigFile,
-			  CFRangeMake(i, CFArrayGetCount(newConfigFile)-i),
-			  (CFComparatorFunction)CFStringCompare,
-			  NULL);
-
-	/* ensure that the last line of the configuration file is terminated */
-	CFArrayAppendValue(newConfigFile, CFSTR(""));
-
-	/*
-	 * Check if we have a "ComputerName" and look elsewhere if we don't have
-	 * one yet.
-	 */
-	if (!CFDictionaryContainsKey(newStartup, CFSTR("APPLETALK_HOSTNAME")) &&
-	    (setGlobals != NULL)) {
-		computerName = CFDictionaryGetValue(setGlobals,
-						    kSCPropNetAppleTalkComputerName);
-		if (CFDictionaryGetValueIfPresent(setGlobals,
-						  kSCPropNetAppleTalkComputerNameEncoding,
-						  (const void **)&num) &&
-		    isA_CFNumber(num)) {
-			CFNumberGetValue(num, kCFNumberIntType, &computerNameEncoding);
-		} else {
-			computerNameEncoding = CFStringGetSystemEncoding();
-		}
-		encodeName(computerName, computerNameEncoding, newStartup, newGlobals);
-	}
-	if (!CFDictionaryContainsKey(newStartup, CFSTR("APPLETALK_HOSTNAME"))) {
-		computerName = SCDynamicStoreCopyComputerName(store, &computerNameEncoding);
-		if (computerName) {
-			encodeName(computerName, computerNameEncoding, newStartup, newGlobals);
-			CFRelease(computerName);
-		}
-	}
-	if (!CFDictionaryContainsKey(newStartup, CFSTR("APPLETALK_HOSTNAME"))) {
-		struct utsname	name;
-
-		if (uname(&name) == 0) {
-			computerName = CFStringCreateWithCString(NULL, name.nodename, kCFStringEncodingASCII);
-			if (computerName) {
-				encodeName(computerName, kCFStringEncodingASCII, NULL, newGlobals);
-				CFRelease(computerName);
-			}
-		}
-	}
-
-	/* compare the previous and current configurations */
-
-	curGlobalsX = CFDictionaryCreateMutableCopy(NULL, 0, curGlobals);
-	CFDictionaryRemoveValue(curGlobalsX, kSCDynamicStorePropNetPrimaryService);
-
-	newGlobalsX = CFDictionaryCreateMutableCopy(NULL, 0, newGlobals);
-	CFDictionaryRemoveValue(newGlobalsX, kSCDynamicStorePropNetPrimaryService);
-
-	key = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
-							 kSCDynamicStoreDomainState,
-							 kSCEntNetAppleTalk);
-
-	if (CFEqual(curGlobalsX   , newGlobalsX   ) &&
-	    CFEqual(curConfigFile , newConfigFile) &&
-	    CFEqual(curDefaults   , newDefaults  ) &&
-	    CFEqual(curStartup    , newStartup   )
-	    ) {
-		/*
-		 * the configuration has not changed.
-		 */
-
-		if (postGlobals) {
-			/*
-			 * the requested configuration hasn't changed but we
-			 * now need to tell everyone that AppleTalk is active.
-			 */
-			if (!SCDynamicStoreSetValue(store, key, newGlobals)) {
-				SCLog(TRUE,
-				      LOG_ERR,
-				      CFSTR("SCDynamicStoreSetValue() failed: %s"),
-				      SCErrorString(SCError()));
-			}
-		}
-
-		CFRelease(newGlobals);
-		CFRelease(newConfigFile);
-		CFRelease(newDefaults);
-		CFRelease(newStartup);
-	} else if (CFArrayGetCount(newConfigFile) <= 1) {
-		/*
-		 * the configuration has changed but there are no
-		 * longer any interfaces configured for AppleTalk
-		 * networking.
-		 */
-
-		/*
-		 * remove the global (State:/Network/Global/AppleTalk) key.
-		 *
-		 * Note: it will be restored later after AT networking has
-		 *       been activated.
-		 */
-
-		/* remove the (/etc/appletalk.cfg) configuration file */
-		(void)unlink(AT_CFG_FILE);
-
-		/*
-		 * update the per-service (and global) state
-		 */
-		cache_SCDynamicStoreRemoveValue(store, key);	// remove State:/Network/Global/AppleTalk
-		n = CFArrayGetCount(info);
-		for (i = 0; i < n; i++) {
-			CFStringRef	xKey	= CFArrayGetValueAtIndex(info, i);
-
-			cache_SCDynamicStoreRemoveValue(store, xKey);
-		}
-		cache_write(store);
-
-		/* flag this as a new configuration */
-		*newState = -(abs(curState) + 1);
-		changed = TRUE;
-	} else {
-		/*
-		 * the configuration has changed.
-		 */
-
-		/* update the (/etc/appletalk.cfg) configuration file */
-		configWrite(AT_CFG_FILE, newConfigFile);
-
-		/*
-		 * update the per-service (and global) state
-		 *
-		 * Note: if present, we remove any existing global state key and allow it
-		 *       to be restored after the stack has been re-started.
-		 */
-		CFDictionaryApplyFunction(newDefaults, updateDefaults, NULL);
-		cache_SCDynamicStoreRemoveValue(store, key);	// remove State:/Network/Global/AppleTalk
-		n = CFArrayGetCount(info);
-		for (i = 0; i < n; i++) {
-			CFStringRef	xKey	= CFArrayGetValueAtIndex(info, i);
-
-			cache_SCDynamicStoreRemoveValue(store, xKey);
-		}
-		cache_write(store);
-
-		/* flag this as a new configuration */
-		*newState = abs(curState) + 1;
-		changed = TRUE;
-	}
-
-	CFRelease(curGlobalsX);
-	CFRelease(newGlobalsX);
-	CFRelease(key);
-
-	if (changed) {
-		CFRelease(curGlobals);
-		curGlobals    = newGlobals;
-		CFRelease(curConfigFile);
-		curConfigFile = newConfigFile;
-		CFRelease(curDefaults);
-		curDefaults   = newDefaults;
-		CFRelease(curStartup);
-		curStartup    = newStartup;
-	}
-
-	if (info)		CFRelease(info);
-	if (interfaces)		CFRelease(interfaces);
-	if (configuredServices)	CFRelease(configuredServices);
-	if (setGlobals)		CFRelease(setGlobals);
-
-	cache_close();
-
-	return changed;
-}
-
-
-#include <sysexits.h>
-#define AT_CMD_SUCCESS		EX_OK   /* success */
-#define AT_CMD_ALREADY_RUNNING	EX__MAX + 10
-#define AT_CMD_NOT_RUNNING	EX__MAX + 11
-
-
-static int
-stackState()
-{
-	int		ret;
-	int		sock;
-	at_state_t	state;
-
-	sock = socket(AF_APPLETALK, SOCK_RAW, 0);
-	ret  = ioctl(sock, AIOCGETSTATE, (caddr_t)&state);
-	(void)close(sock);
-	if (ret == -1) {
-		SCLog(TRUE, LOG_DEBUG, CFSTR("ioctl(AIOCGETSTATE) failed: %s"), strerror(errno));
-		return FALSE;
-	}
-
-	if (state.flags & AT_ST_STARTED) {
-		return abs(curState);
-	} else {
-		return -(abs(curState));
-	}
-}
-
-
-static pid_t	execCommand	= 0;
-static int	execRetry;
-
-
-static void
-stopComplete(pid_t pid, int status, struct rusage *rusage, void *context)
-{
-	execCommand = 0;
-
-	if (WIFEXITED(status)) {
-		switch (WEXITSTATUS(status)) {
-			case AT_CMD_SUCCESS :
-			case AT_CMD_NOT_RUNNING :
-				SCLog(TRUE, LOG_NOTICE, CFSTR("AppleTalk shutdown complete"));
-				if (curState > 0) {
-					// the stack is down but we really want it up
-					startAppleTalk(NULL, (void *)curState);
-				}
-				return;
-			default :
-				break;
-		}
-	}
-
-	SCLog(TRUE,
-	      (execRetry > 1) ? LOG_NOTICE : LOG_ERR,
-	      CFSTR("AppleTalk shutdown failed, status = %d%s"),
-	      WEXITSTATUS(status),
-	      (execRetry > 1) ? " (retrying)" : "");
-
-	// shutdown failed, retry
-	if (--execRetry > 0) {
-		CFRunLoopTimerContext	timerContext	= { 0, (void *)curState, NULL, NULL, NULL };
-		CFRunLoopTimerRef	timer;
-
-		timer = CFRunLoopTimerCreate(NULL,
-					     CFAbsoluteTimeGetCurrent() + RETRY_DELAY,
-					     0.0,
-					     0,
-					     0,
-					     stopAppleTalk,
-					     &timerContext);
-		CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
-		CFRelease(timer);
-		return;
-	} else {
-		// we weren't able to stop
-		curState = stackState();
-	}
-
-	return;
-}
-
-
-static void
-stopAppleTalk(CFRunLoopTimerRef timer, void *info)
-{
-	char	*argv[]	= { "appletalk",
-			    "-d",
-			    NULL };
-
-	if (execCommand == 0) {
-		SCLog(TRUE, LOG_NOTICE, CFSTR("AppleTalk shutdown"));
-	} else {
-		SCLog(TRUE, LOG_NOTICE, CFSTR("AppleTalk shutdown skipped, transition in progress"));
-		return;
-	}
-
-	execCommand = _SCDPluginExecCommand(stopComplete,		// callback
-					    info,			// context
-					    0,				// uid
-					    0,				// gid
-					    "/usr/sbin/appletalk",	// path
-					    argv);			// argv
-
-	if (!timer) {
-		execRetry = RETRY_LIMIT;	// initialize retry count
-	}
-
-	return;
-}
-
-
-static void
-startComplete(pid_t pid, int status, struct rusage *rusage, void *context)
-{
-	execCommand = 0;
-
-	if (WIFEXITED(status)) {
-		switch (WEXITSTATUS(status)) {
-			case AT_CMD_SUCCESS :
-				SCLog(TRUE, LOG_NOTICE, CFSTR("AppleTalk startup complete"));
-				if ((curState < 0) || (curState > (int)context)) {
-					// the stack is now up but we really want it down
-					stopAppleTalk(NULL, (void *)curState);
-				}
-				return;
-			case AT_CMD_ALREADY_RUNNING :
-				// the stack is already up but we're not sure
-				// if the configuration is correct, restart
-				SCLog(TRUE, LOG_NOTICE, CFSTR("AppleTalk already running, restarting"));
-				stopAppleTalk(NULL, (void *)curState);
-				return;
-			default :
-				break;
-		}
-	}
-
-	SCLog(TRUE,
-	      (execRetry > 1) ? LOG_NOTICE : LOG_ERR,
-	      CFSTR("AppleTalk startup failed, status = %d%s"),
-	      WEXITSTATUS(status),
-	      (execRetry > 1) ? " (retrying)" : "");
-
-	// startup failed, retry
-	if (--execRetry > 0) {
-		CFRunLoopTimerContext	timerContext	= { 0, (void *)curState, NULL, NULL, NULL };
-		CFRunLoopTimerRef	timer;
-
-		timer = CFRunLoopTimerCreate(NULL,
-					     CFAbsoluteTimeGetCurrent() + RETRY_DELAY,
-					     0.0,
-					     0,
-					     0,
-					     startAppleTalk,
-					     &timerContext);
-		CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
-		CFRelease(timer);
-		return;
-	} else {
-		// we weren't able to start
-		curState = stackState();
-	}
-
-	return;
-}
-
-
-static void
-startAppleTalk(CFRunLoopTimerRef timer, void *info)
-{
-	int		argc		= 0;
-	char		*argv[8];
-	char		*computerName	= NULL;
-	char		*interface	= NULL;
-	CFStringRef	mode		= CFDictionaryGetValue(curStartup, CFSTR("APPLETALK"));
-	CFStringRef	name		= CFDictionaryGetValue(curStartup, CFSTR("APPLETALK_HOSTNAME"));
-
-	if (execCommand == 0) {
-		SCLog(TRUE, LOG_NOTICE, CFSTR("AppleTalk startup"));
-	} else {
-		SCLog(TRUE, LOG_NOTICE, CFSTR("AppleTalk startup skipped, transition in progress"));
-		return;
-	}
-
-	if (!mode) {
-		// Huh?
-		return;
-	}
-
-	// set command name
-	argv[argc++] = "appletalk";
-
-	// set hostname
-	if (name) {
-		computerName = _SC_cfstring_to_cstring(name, NULL, 0, kCFStringEncodingASCII);
-		if (computerName) {
-			argv[argc++] = "-C";
-			argv[argc++] = computerName;
-		} else {
-			// could not convert name
-			goto done;
-		}
-	}
-
-	// set mode
-	if (CFEqual(mode, CFSTR("-ROUTER-"))) {
-		argv[argc++] = "-r";
-	} else if (CFEqual(mode, CFSTR("-MULTIHOME-"))) {
-		argv[argc++] = "-x";
-	} else {
-		interface = _SC_cfstring_to_cstring(mode, NULL, 0, kCFStringEncodingASCII);
-		if (interface) {
-			argv[argc++] = "-u";
-			argv[argc++] = interface;
-		} else {
-			// could not convert interface
-			goto done;
-		}
-	}
-
-	// set non-interactive
-	argv[argc++] = "-q";
-
-	// close argument list
-	argv[argc++] = NULL;
-
-	execCommand = _SCDPluginExecCommand(startComplete,		// callback
-					    info,			// context
-					    0,				// uid
-					    0,				// gid
-					    "/usr/sbin/appletalk",	// path
-					    argv);			// argv
-
-	if (!timer) {
-		execRetry = RETRY_LIMIT;	// initialize retry count
-	}
-
-    done :
-
-	if (computerName)	CFAllocatorDeallocate(NULL, computerName);
-	if (interface)		CFAllocatorDeallocate(NULL, interface);
-
-	return;
-}
-
-
-static void
-atConfigChangedCallback(SCDynamicStoreRef store, CFArrayRef changedKeys, void *arg)
-{
-	boolean_t	configChanged;
-	int		newState;
-
-	configChanged = updateConfiguration(&newState);
-
-	if (configChanged && (execCommand == 0)) {
-		// if the configuration has changed and we're not already transitioning
-		if (newState > 0) {
-			if (curState > 0) {
-				// already running, restart [with new configuration]
-				stopAppleTalk(NULL, (void *)newState);
-			} else {
-				startAppleTalk(NULL, (void *)newState);
-			}
-		} else {
-			if (curState > 0) {
-				stopAppleTalk(NULL, (void *)newState);
-			}
-		}
-	}
-
-	curState = newState;
-
-	return;
-}
-
-
-void
-stop_ATconfig(CFRunLoopSourceRef stopRls)
-{
-	// cleanup
-
-	if (storeRls != NULL) {
-		CFRunLoopSourceInvalidate(storeRls);
-		CFRelease(storeRls);
-		storeRls = NULL;
-	}
-
-	if (store != NULL) {
-		CFRelease(store);
-		store = NULL;
-		CFRelease(curGlobals);
-		CFRelease(curConfigFile);
-		CFRelease(curDefaults);
-		CFRelease(curStartup);
-	}
-
-	CFRunLoopSourceSignal(stopRls);
-	return;
-}
-
-
-void
-load_ATconfig(CFBundleRef bundle, Boolean bundleVerbose)
-{
-	CFStringRef		key;
-	CFMutableArrayRef	keys		= NULL;
-	CFStringRef		pattern;
-	CFMutableArrayRef	patterns	= NULL;
-
-	if (bundleVerbose) {
-		_verbose = TRUE;
-	}
-
-	SCLog(_verbose, LOG_DEBUG, CFSTR("load() called"));
-	SCLog(_verbose, LOG_DEBUG, CFSTR("  bundle ID = %@"), CFBundleGetIdentifier(bundle));
-
-	/* initialize a few globals */
-
-	curGlobals    = CFDictionaryCreateMutable(NULL,
-						  0,
-						  &kCFTypeDictionaryKeyCallBacks,
-						  &kCFTypeDictionaryValueCallBacks);
-	curConfigFile = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-	curDefaults   = CFDictionaryCreateMutable(NULL,
-						  0,
-						  &kCFTypeDictionaryKeyCallBacks,
-						  &kCFTypeDictionaryValueCallBacks);
-	curStartup    = CFDictionaryCreateMutable(NULL,
-						  0,
-						  &kCFTypeDictionaryKeyCallBacks,
-						  &kCFTypeDictionaryValueCallBacks);
-
-	/* open a "configd" store to allow cache updates */
-	store = SCDynamicStoreCreate(NULL,
-				     CFSTR("AppleTalk Configuraton plug-in"),
-				     atConfigChangedCallback,
-				     NULL);
-	if (store == NULL) {
-		SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreCreate() failed: %s"), SCErrorString(SCError()));
-		goto error;
-	}
-
-	/* establish notification keys and patterns */
-
-	keys     = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-	patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-
-	/* ...watch for (global) AppleTalk configuration changes */
-	key = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
-							 kSCDynamicStoreDomainSetup,
-							 kSCEntNetAppleTalk);
-	CFArrayAppendValue(keys, key);
-	CFRelease(key);
-
-	/* ...watch for (per-service) AppleTalk configuration changes */
-	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-							      kSCDynamicStoreDomainSetup,
-							      kSCCompAnyRegex,
-							      kSCEntNetAppleTalk);
-	CFArrayAppendValue(patterns, pattern);
-	CFRelease(pattern);
-
-	/* ...watch for network interface link status changes */
-	pattern = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-								kSCDynamicStoreDomainState,
-								kSCCompAnyRegex,
-								kSCEntNetLink);
-	CFArrayAppendValue(patterns, pattern);
-	CFRelease(pattern);
-
-	/* ...watch for (per-interface) AppleTalk configuration changes */
-	pattern = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-								kSCDynamicStoreDomainState,
-								kSCCompAnyRegex,
-								kSCEntNetAppleTalk);
-	CFArrayAppendValue(patterns, pattern);
-	CFRelease(pattern);
-
-	/* ...watch for computer name changes */
-	key = SCDynamicStoreKeyCreateComputerName(NULL);
-	CFArrayAppendValue(keys, key);
-	CFRelease(key);
-
-	/* register the keys/patterns */
-	if (!SCDynamicStoreSetNotificationKeys(store, keys, patterns)) {
-		SCLog(TRUE, LOG_ERR,
-		      CFSTR("SCDynamicStoreSetNotificationKeys() failed: %s"),
-		      SCErrorString(SCError()));
-		goto error;
-	}
-	CFRelease(keys);
-	CFRelease(patterns);
-
-	storeRls = SCDynamicStoreCreateRunLoopSource(NULL, store, 0);
-	if (!storeRls) {
-		SCLog(TRUE, LOG_ERR,
-		      CFSTR("SCDynamicStoreCreateRunLoopSource() failed: %s"),
-		      SCErrorString(SCError()));
-		goto error;
-	}
-	CFRunLoopAddSource(CFRunLoopGetCurrent(), storeRls, kCFRunLoopDefaultMode);
-
-	return;
-
-    error :
-
-	if (curGlobals)		CFRelease(curGlobals);
-	if (curConfigFile)	CFRelease(curConfigFile);
-	if (curDefaults)	CFRelease(curDefaults);
-	if (curStartup)		CFRelease(curStartup);
-	if (store) 		CFRelease(store);
-	if (keys)		CFRelease(keys);
-	if (patterns)		CFRelease(patterns);
-	return;
-}
-
-
-#ifdef	MAIN
-#include "cfManager.c"
-int
-main(int argc, char **argv)
-{
-	_sc_log     = FALSE;
-	_sc_verbose = (argc > 1) ? TRUE : FALSE;
-
-	load_ATconfig(CFBundleGetMainBundle(), (argc > 1) ? TRUE : FALSE);
-	CFRunLoopRun();
-	/* not reached */
-	exit(0);
-	return 0;
-}
-#endif
diff --git a/Plugins/ATconfig/cfManager.c b/Plugins/ATconfig/cfManager.c
deleted file mode 100644
index 72196cd..0000000
--- a/Plugins/ATconfig/cfManager.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-/*
- * Modification History
- *
- * July 17, 2000		Allan Nathanson <ajn@apple.com>
- * - initial revision
- */
-
-
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "cfManager.h"
-
-
-#ifdef	NOTNOW
-/*
- * Opens a configuration file and returns a CFArrayRef consisting
- * of a CFStringRef for each line.
- */
-__private_extern__
-CFArrayRef
-configRead(const char *path)
-{
-	int			fd;
-	struct stat		statBuf;
-	CFMutableDataRef	data;
-	CFStringRef		str;
-	CFArrayRef		config	= NULL;
-
-	fd = open(path, O_RDONLY, 0644);
-	if (fd == -1) {
-		goto done;
-	}
-	if (fstat(fd, &statBuf) == -1) {
-		goto done;
-	}
-	if ((statBuf.st_mode & S_IFMT) != S_IFREG) {
-		goto done;
-	}
-
-	data = CFDataCreateMutable(NULL, statBuf.st_size);
-	CFDataSetLength(data, statBuf.st_size);
-	if(read(fd, (void *)CFDataGetMutableBytePtr(data), statBuf.st_size) != statBuf.st_size) {
-		CFRelease(data);
-		goto done;
-	}
-
-	str = CFStringCreateFromExternalRepresentation(NULL, data, kCFStringEncodingMacRoman);
-	CFRelease(data);
-
-	config = CFStringCreateArrayBySeparatingStrings(NULL, str, CFSTR("\n"));
-	CFRelease(str);
-
-    done:
-
-	if (fd != -1) {
-		close(fd);
-	}
-	if (config == NULL) {
-		CFMutableArrayRef	emptyConfig;
-
-		/* pretend that we found an empty file */
-		emptyConfig = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-		CFArrayAppendValue(emptyConfig, CFSTR(""));
-		config = (CFArrayRef)emptyConfig;
-	}
-	return config;
-}
-#endif	/* NOTNOW */
-
-/*
- * Writes a new configuration file with the contents of a CFArrayRef. Each
- * element of the array is a CFStringRef.
- */
-__private_extern__
-void
-configWrite(const char *path, CFArrayRef config)
-{
-	CFStringRef	str;
-	CFDataRef	data;
-	int		fd = -1;
-	int		len;
-
-	str  = CFStringCreateByCombiningStrings(NULL, config, CFSTR("\n"));
-	data = CFStringCreateExternalRepresentation(NULL, str, kCFStringEncodingMacRoman, (UInt8)'.');
-	CFRelease(str);
-
-	fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644);
-	if (fd == -1) {
-		goto done;
-	}
-
-	len = CFDataGetLength(data);
-	if (len) {
-		(void)write(fd, CFDataGetBytePtr(data), len);
-	}
-
-    done:
-
-	if (fd != -1)
-		close(fd);
-	CFRelease(data);
-	return;
-}
-
-
-#ifdef	NOTNOW
-__private_extern__
-void
-configSet(CFMutableArrayRef config, CFStringRef key, CFStringRef value)
-{
-	CFMutableStringRef	pref;
-	CFIndex			configLen	= CFArrayGetCount(config);
-	CFIndex			i;
-	CFIndex			n;
-	CFMutableStringRef	newValue;
-	CFRange			range;
-	CFStringRef		specialChars	= CFSTR(" \"'$!|\\<>`{}[]");
-	boolean_t		mustQuote	= FALSE;
-
-	/* create search prefix */
-	pref = CFStringCreateMutableCopy(NULL, 0, key);
-	CFStringAppend(pref, CFSTR("="));
-
-	/*
-	 * create new / replacement value
-	 *
-	 * Note: Since the configuration file may be processed by a
-	 *       shell script we need to ensure that, if needed, the
-	 *       string is properly quoted.
-	 */
-	newValue = CFStringCreateMutableCopy(NULL, 0, value);
-
-	n = CFStringGetLength(specialChars);
-	for (i = 0; i < n; i++) {
-		CFStringRef	specialChar;
-
-		specialChar = CFStringCreateWithSubstring(NULL, specialChars, CFRangeMake(i, 1));
-		range = CFStringFind(newValue, specialChar, 0);
-		CFRelease(specialChar);
-		if (range.location != kCFNotFound) {
-			/* this string has at least one special character */
-			mustQuote = TRUE;
-			break;
-		}
-	}
-
-	if (mustQuote) {
-		CFStringRef	charsToQuote	= CFSTR("\\\"$`");
-
-		/*
-		 * in addition to quoting the entire string we also need to escape the
-		 * space " " and backslash "\" characters
-		 */
-		n = CFStringGetLength(charsToQuote);
-		for (i = 0; i < n; i++) {
-			CFStringRef	quoteChar;
-			CFArrayRef	matches;
-
-			quoteChar = CFStringCreateWithSubstring(NULL, charsToQuote, CFRangeMake(i, 1));
-			range     = CFRangeMake(0, CFStringGetLength(newValue));
-			matches   = CFStringCreateArrayWithFindResults(NULL,
-								       newValue,
-								       quoteChar,
-								       range,
-								       0);
-			CFRelease(quoteChar);
-
-			if (matches) {
-				CFIndex	j = CFArrayGetCount(matches);
-
-				while (--j >= 0) {
-					const CFRange	*range;
-
-					range = CFArrayGetValueAtIndex(matches, j);
-					CFStringInsert(newValue, range->location, CFSTR("\\"));
-				}
-				CFRelease(matches);
-			}
-		}
-
-		CFStringInsert(newValue, 0, CFSTR("\""));
-		CFStringAppend(newValue, CFSTR("\""));
-	}
-
-	/* locate existing key */
-	for (i = 0; i < configLen; i++) {
-		if (CFStringHasPrefix(CFArrayGetValueAtIndex(config, i), pref)) {
-			break;
-		}
-	}
-
-	CFStringAppend(pref, newValue);
-	CFRelease(newValue);
-	if (i < configLen) {
-		/* if replacing an existing entry */
-		CFArraySetValueAtIndex(config, i, pref);
-	} else {
-		/*
-		 * if new entry, insert it just prior to the last (emtpy)
-		 * array element.
-		 */
-		CFArrayInsertValueAtIndex(config, configLen-1, pref);
-	}
-	CFRelease(pref);
-
-	return;
-}
-
-
-__private_extern__
-void
-configRemove(CFMutableArrayRef config, CFStringRef key)
-{
-	CFMutableStringRef	pref;
-	CFIndex			configLen = CFArrayGetCount(config);
-	CFIndex			i;
-
-	/* create search prefix */
-	pref = CFStringCreateMutableCopy(NULL, 0, key);
-	CFStringAppend(pref, CFSTR("="));
-
-	/* locate existing key */
-	for (i = 0; i < configLen; i++) {
-		if (CFStringHasPrefix(CFArrayGetValueAtIndex(config, i), pref)) {
-			/* entry found, remove it */
-			CFArrayRemoveValueAtIndex(config, i);
-			break;
-		}
-	}
-
-	CFRelease(pref);
-	return;
-}
-#endif	/* NOTNOW */
diff --git a/Plugins/IPMonitor/Info.plist b/Plugins/IPMonitor/Info.plist
index 2fcfb06..473dee5 100644
--- a/Plugins/IPMonitor/Info.plist
+++ b/Plugins/IPMonitor/Info.plist
@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>Requires</key>
 	<array>
 		<string>com.apple.SystemConfiguration.IPConfiguration</string>
@@ -28,7 +28,7 @@
 	<key>Builtin</key>
 	<true/>
 	<key>mdns_timeout</key>
-	<integer>2</integer>
+	<integer>5</integer>
 	<key>pdns_timeout</key>
 	<integer>5</integer>
 	<key>AppendStateArrayToSetupArray</key>
diff --git a/Plugins/IPMonitor/Makefile b/Plugins/IPMonitor/Makefile
index 80077c8..f3106a4 100644
--- a/Plugins/IPMonitor/Makefile
+++ b/Plugins/IPMonitor/Makefile
@@ -1,14 +1,55 @@
-test_dns: Makefile dns-configuration.h dns-configuration.c
-	cc -Wall -g -o test_dns -DMAIN dns-configuration.c -framework SystemConfiguration -framework CoreFoundation -ldnsinfo
+EXTRA_CFLAGS=
+
+all: test_proxy
+
+# ----------
+
+shared_dns_info.h shared_dns_infoUser.c: ../../dnsinfo/shared_dns_info.defs
+	mig ../../dnsinfo/shared_dns_info.defs
+
+shared_dns_infoUser.o: shared_dns_info.h shared_dns_infoUser.c
+	cc -I../../dnsinfo -Wall -O0 -g -c shared_dns_infoUser.c
+
+dnsinfo_create.o: shared_dns_info.h ../../dnsinfo/dnsinfo_create.h ../../dnsinfo/dnsinfo_create.c
+	cc -I. -I../../dnsinfo -Wall -O0 -g -c ../../dnsinfo/dnsinfo_create.c
+
+dnsinfo_flatfile.o: ../../dnsinfo/dnsinfo_copy.c ../../dnsinfo/dnsinfo_flatfile.c shared_dns_info.h
+	cc -I../../dnsinfo -D_PATH_RESOLVER_DIR='"/var/tmp/resolver"' -Wall -O0 -g -c ../../dnsinfo/dnsinfo_flatfile.c
+
+dnsinfo_private.o: ../../dnsinfo/dnsinfo_private.h ../../dnsinfo/dnsinfo_private.c
+	cc -I../../dnsinfo -Wall -O0 -g -c ../../dnsinfo/dnsinfo_private.c
+
+dns-configuration.o: dns-configuration.h dns-configuration.c dnsinfo_create.o
+	cc -I. -I../../dnsinfo -DMAIN -Wall -O0 -g -c dns-configuration.c
+
+proxy-configuration.o: proxy-configuration.h proxy-configuration.c
+	cc -I. -Wall -O0 -g -c proxy-configuration.c
+
+smb-configuration.o: smb-configuration.c
+	cc -I. -Wall -O0 -g -c smb-configuration.c
+
+# ----------
+
+test_dns: Makefile dnsinfo_create.o dnsinfo_flatfile.o dnsinfo_private.o shared_dns_infoUser.o dns-configuration.o
+	cc -o test_dns dnsinfo_create.o dnsinfo_flatfile.o dnsinfo_private.o shared_dns_infoUser.o dns-configuration.o ${EXTRA_CFLAGS} -framework SystemConfiguration -framework CoreFoundation
+
+# ----------
+
+test_proxy: Makefile proxy-configuration.h proxy-configuration.c
+	cc -Wall -O0 -g -o test_proxy -DMAIN -DDEBUG proxy-configuration.c ${EXTRA_CFLAGS} -framework SystemConfiguration -framework CoreFoundation
+
+# ----------
 
 test_smb: Makefile smb-configuration.h smb-configuration.c
-	cc -Wall -g -o test_smb -DMAIN -DDEBUG smb-configuration.c -framework SystemConfiguration -framework CoreFoundation
+	cc -Wall -O0 -g -o test_smb -DMAIN -DDEBUG smb-configuration.c ${EXTRA_CFLAGS} -framework SystemConfiguration -framework CoreFoundation
 
-test_ipv4_routelist: ip_plugin.c
-	cc -Wall -g -o test_ipv4_routelist -DTEST_IPV4_ROUTELIST smb-configuration.c ip_plugin.c -framework SystemConfiguration -framework CoreFoundation -ldnsinfo
+# ----------
 
-IPMonitor: ip_plugin.c
-	cc -Wall -g -o IPMonitor -DTEST_IPMONITOR smb-configuration.c ip_plugin.c -framework SystemConfiguration -framework CoreFoundation -ldnsinfo
+test_ipv4_routelist.o: ip_plugin.c
+	cc -I. -I../../dnsinfo -DTEST_IPV4_ROUTELIST -Wall -O0 -g -c -o test_ipv4_routelist.o ip_plugin.c
+
+test_ipv4_routelist: test_ipv4_routelist.o dnsinfo_create.o dnsinfo_flatfile.o dnsinfo_private.o shared_dns_infoUser.o smb-configuration.o
+	cc -Wall -O0 -g -o test_ipv4_routelist test_ipv4_routelist.o dnsinfo_create.o dnsinfo_flatfile.o dnsinfo_private.o shared_dns_infoUser.o smb-configuration.o -framework SystemConfiguration -framework CoreFoundation
 
 test_ipv4_routelist_reference.txt: test_ipv4_routelist
 	sh test_reference.sh create test_ipv4_routelist test_ipv4_routelist_reference.txt test_ipv4_routelist_filter.sh
@@ -16,9 +57,21 @@ test_ipv4_routelist_reference.txt: test_ipv4_routelist
 test_ipv4_routelist_test: test_ipv4_routelist
 	sh test_reference.sh test test_ipv4_routelist test_ipv4_routelist_reference.txt test_ipv4_routelist_filter.sh
 
+# ----------
+
+IPMonitor.o: ip_plugin.c
+	cc -I. -I../../dnsinfo -DTEST_IPMONITOR -Wall -O0 -g -c -o IPMonitor.o ip_plugin.c
+
+IPMonitor: IPMonitor.o dnsinfo_create.o dnsinfo_flatfile.o dnsinfo_private.o shared_dns_infoUser.o smb-configuration.o
+	cc -Wall -O0 -g -o IPMonitor IPMonitor.o dnsinfo_create.o dnsinfo_flatfile.o dnsinfo_private.o shared_dns_infoUser.o smb-configuration.o -framework SystemConfiguration -framework CoreFoundation
+
+# ----------
 
 clean:
-	rm -rf	test_dns test_dns.dSYM	\
-		test_smb test_smb.dSYM	\
-		test_ipv4_routelist test_ipv4_routelist.dSYM	\
+	rm -rf	*.o								\
+		shared_dns_info.h shared_dns_infoServer.c shared_dns_infoUser.c	\
+		test_dns test_dns.dSYM						\
+		test_proxy test_proxy.dSYM					\
+		test_smb test_smb.dSYM						\
+		test_ipv4_routelist test_ipv4_routelist.dSYM			\
 		IPMonitor IPMonitor.dSYM
diff --git a/Plugins/IPMonitor/dns-configuration.c b/Plugins/IPMonitor/dns-configuration.c
index e5b860a..f60b512 100644
--- a/Plugins/IPMonitor/dns-configuration.c
+++ b/Plugins/IPMonitor/dns-configuration.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -54,6 +54,12 @@ extern uint32_t notify_monitor_file(int token, const char *name, int flags);
 #include <dnsinfo.h>
 #include <dnsinfo_create.h>
 
+#ifdef	MAIN
+#undef	MAIN
+#include "dnsinfo_copy.c"
+#define	MAIN
+#endif	// MAIN
+
 #include <dns_sd.h>
 #ifndef	kDNSServiceCompMulticastDNS
 #define	kDNSServiceCompMulticastDNS	"MulticastDNS"
@@ -70,10 +76,10 @@ static	CFNumberRef	S_pdns_timeout	= NULL;
 
 
 static void
-add_resolver(CFMutableArrayRef supplemental, CFMutableDictionaryRef resolver)
+add_resolver(CFMutableArrayRef resolvers, CFMutableDictionaryRef resolver)
 {
 	CFIndex		i;
-	CFIndex		n_supplemental;
+	CFIndex		n_resolvers;
 	CFNumberRef	order;
 	uint32_t	order_val	= 0;
 
@@ -84,12 +90,12 @@ add_resolver(CFMutableArrayRef supplemental, CFMutableDictionaryRef resolver)
 		order_val = 0;
 	}
 
-	n_supplemental = CFArrayGetCount(supplemental);
-	for (i = 0; i < n_supplemental; i++) {
-		CFDictionaryRef		supplemental_resolver;
+	n_resolvers = CFArrayGetCount(resolvers);
+	for (i = 0; i < n_resolvers; i++) {
+		CFDictionaryRef		match_resolver;
 
-		supplemental_resolver = CFArrayGetValueAtIndex(supplemental, i);
-		if (CFEqual(resolver, supplemental_resolver)) {
+		match_resolver = CFArrayGetValueAtIndex(resolvers, i);
+		if (CFEqual(resolver, match_resolver)) {
 			// a real duplicate
 			return;
 		}
@@ -98,24 +104,24 @@ add_resolver(CFMutableArrayRef supplemental, CFMutableDictionaryRef resolver)
 			CFMutableDictionaryRef	compare;
 			Boolean			match;
 
-			compare = CFDictionaryCreateMutableCopy(NULL, 0, supplemental_resolver);
+			compare = CFDictionaryCreateMutableCopy(NULL, 0, match_resolver);
 			CFDictionarySetValue(compare, kSCPropNetDNSSearchOrder, order);
 			match = CFEqual(resolver, compare);
 			CFRelease(compare);
 			if (match) {
-				CFNumberRef	supplemental_order;
-				uint32_t	supplemental_order_val	= 0;
+				CFNumberRef	match_order;
+				uint32_t	match_order_val	= 0;
 
 				// if only the search order's are different
-				supplemental_order = CFDictionaryGetValue(supplemental_resolver, kSCPropNetDNSSearchOrder);
-				if (!isA_CFNumber(supplemental_order) ||
-				    !CFNumberGetValue(supplemental_order, kCFNumberIntType, &supplemental_order_val)) {
-					supplemental_order_val = 0;
+				match_order = CFDictionaryGetValue(match_resolver, kSCPropNetDNSSearchOrder);
+				if (!isA_CFNumber(match_order) ||
+				    !CFNumberGetValue(match_order, kCFNumberIntType, &match_order_val)) {
+					match_order_val = 0;
 				}
 
-				if (order_val < supplemental_order_val ) {
+				if (order_val < match_order_val ) {
 					// if we should prefer this match resolver, else just skip it
-					CFArraySetValueAtIndex(supplemental, i, resolver);
+					CFArraySetValueAtIndex(resolvers, i, resolver);
 				}
 
 				return;
@@ -123,17 +129,17 @@ add_resolver(CFMutableArrayRef supplemental, CFMutableDictionaryRef resolver)
 		}
 	}
 
-	order = CFNumberCreate(NULL, kCFNumberIntType, &n_supplemental);
+	order = CFNumberCreate(NULL, kCFNumberIntType, &n_resolvers);
 	CFDictionarySetValue(resolver, CFSTR("*ORDER*"), order);
 	CFRelease(order);
 
-	CFArrayAppendValue(supplemental, resolver);
+	CFArrayAppendValue(resolvers, resolver);
 	return;
 }
 
 
 static void
-add_supplemental(CFMutableArrayRef supplemental, CFDictionaryRef dns, uint32_t defaultOrder)
+add_supplemental(CFMutableArrayRef resolvers, CFDictionaryRef dns, uint32_t defaultOrder)
 {
 	CFArrayRef	domains;
 	CFIndex		i;
@@ -155,7 +161,7 @@ add_supplemental(CFMutableArrayRef supplemental, CFDictionaryRef dns, uint32_t d
 
 	/*
 	 * yes, this is a "supplemental" resolver configuration, expand
-	 * the match domains and add each to the supplemental list.
+	 * the match domains and add each to the resolvers list.
 	 */
 	for (i = 0; i < n_domains; i++) {
 		CFStringRef		match_domain;
@@ -167,16 +173,8 @@ add_supplemental(CFMutableArrayRef supplemental, CFDictionaryRef dns, uint32_t d
 			continue;
 		}
 
-		match_order = (orders != NULL) ? CFArrayGetValueAtIndex(orders, i) : NULL;
-
 		match_resolver = CFDictionaryCreateMutableCopy(NULL, 0, dns);
 
-		// remove keys we don't want in a supplemental resolver
-		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSupplementalMatchDomains);
-		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSupplementalMatchOrders);
-		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSearchDomains);
-		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSortList);
-
 		// set supplemental resolver "domain"
 		if (CFStringGetLength(match_domain) > 0) {
 			CFDictionarySetValue(match_resolver, kSCPropNetDNSDomainName, match_domain);
@@ -185,6 +183,7 @@ add_supplemental(CFMutableArrayRef supplemental, CFDictionaryRef dns, uint32_t d
 		}
 
 		// set supplemental resolver "search_order"
+		match_order = (orders != NULL) ? CFArrayGetValueAtIndex(orders, i) : NULL;
 		if (isA_CFNumber(match_order)) {
 			CFDictionarySetValue(match_resolver, kSCPropNetDNSSearchOrder, match_order);
 		} else if (!CFDictionaryContainsKey(match_resolver, kSCPropNetDNSSearchOrder)) {
@@ -196,7 +195,14 @@ add_supplemental(CFMutableArrayRef supplemental, CFDictionaryRef dns, uint32_t d
 
 			defaultOrder++;		// if multiple domains, maintain ordering
 		}
-		add_resolver(supplemental, match_resolver);
+
+		// remove keys we don't want in a supplemental resolver
+		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSupplementalMatchDomains);
+		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSupplementalMatchOrders);
+		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSearchDomains);
+		CFDictionaryRemoveValue(match_resolver, kSCPropNetDNSSortList);
+
+		add_resolver(resolvers, match_resolver);
 		CFRelease(match_resolver);
 	}
 
@@ -208,7 +214,7 @@ add_supplemental(CFMutableArrayRef supplemental, CFDictionaryRef dns, uint32_t d
 
 
 static void
-add_supplemental_resolvers(CFMutableArrayRef supplemental, CFDictionaryRef services, CFArrayRef service_order)
+add_supplemental_resolvers(CFMutableArrayRef resolvers, CFDictionaryRef services, CFArrayRef service_order)
 {
 	const void *		keys_q[N_QUICK];
 	const void **		keys	= keys_q;
@@ -254,7 +260,7 @@ add_supplemental_resolvers(CFMutableArrayRef supplemental, CFDictionaryRef servi
 			defaultOrder += (DEFAULT_SEARCH_ORDER / 1000) * n_services;
 		}
 
-		add_supplemental(supplemental, dns, defaultOrder);
+		add_supplemental(resolvers, dns, defaultOrder);
 	}
 
 	if (keys != keys_q) {
@@ -267,7 +273,7 @@ add_supplemental_resolvers(CFMutableArrayRef supplemental, CFDictionaryRef servi
 
 
 static void
-add_multicast_resolvers(CFMutableArrayRef supplemental, CFArrayRef multicastResolvers)
+add_multicast_resolvers(CFMutableArrayRef resolvers, CFArrayRef multicastResolvers)
 {
 	CFIndex	i;
 	CFIndex	n;
@@ -280,7 +286,8 @@ add_multicast_resolvers(CFMutableArrayRef supplemental, CFArrayRef multicastReso
 		CFMutableDictionaryRef	resolver;
 
 		domain = CFArrayGetValueAtIndex(multicastResolvers, i);
-		if (!isA_CFString(domain) || (CFStringGetLength(domain) == 0)) {
+		domain = _SC_trimDomain(domain);
+		if (domain == NULL) {
 			continue;
 		}
 
@@ -300,8 +307,9 @@ add_multicast_resolvers(CFMutableArrayRef supplemental, CFArrayRef multicastReso
 		if (S_mdns_timeout != NULL) {
 			CFDictionarySetValue(resolver, kSCPropNetDNSServerTimeout, S_mdns_timeout);
 		}
-		add_resolver(supplemental, resolver);
+		add_resolver(resolvers, resolver);
 		CFRelease(resolver);
+		CFRelease(domain);
 	}
 
 	return;
@@ -309,7 +317,7 @@ add_multicast_resolvers(CFMutableArrayRef supplemental, CFArrayRef multicastReso
 
 
 static void
-add_private_resolvers(CFMutableArrayRef supplemental, CFArrayRef privateResolvers)
+add_private_resolvers(CFMutableArrayRef resolvers, CFArrayRef privateResolvers)
 {
 	CFIndex	i;
 	CFIndex	n;
@@ -322,7 +330,8 @@ add_private_resolvers(CFMutableArrayRef supplemental, CFArrayRef privateResolver
 		CFMutableDictionaryRef	resolver;
 
 		domain = CFArrayGetValueAtIndex(privateResolvers, i);
-		if (!isA_CFString(domain) || (CFStringGetLength(domain) == 0)) {
+		domain = _SC_trimDomain(domain);
+		if (domain == NULL) {
 			continue;
 		}
 
@@ -342,8 +351,9 @@ add_private_resolvers(CFMutableArrayRef supplemental, CFArrayRef privateResolver
 		if (S_pdns_timeout != NULL) {
 			CFDictionarySetValue(resolver, kSCPropNetDNSServerTimeout, S_pdns_timeout);
 		}
-		add_resolver(supplemental, resolver);
+		add_resolver(resolvers, resolver);
 		CFRelease(resolver);
+		CFRelease(domain);
 	}
 
 	return;
@@ -394,49 +404,8 @@ compareBySearchOrder(const void *val1, const void *val2, void *context)
 }
 
 
-static CFStringRef
-trimDomain(CFStringRef domain)
-{
-	CFIndex	length;
-
-	if (!isA_CFString(domain)) {
-		return NULL;
-	}
-
-	// remove any leading/trailing dots
-	length = CFStringGetLength(domain);
-	if ((length > 0) &&
-	    (CFStringFindWithOptions(domain,
-				     CFSTR("."),
-				     CFRangeMake(0, 1),
-				     kCFCompareAnchored,
-				     NULL) ||
-	     CFStringFindWithOptions(domain,
-				     CFSTR("."),
-				     CFRangeMake(0, length),
-				     kCFCompareAnchored|kCFCompareBackwards,
-				     NULL))) {
-		CFMutableStringRef	trimmed;
-
-		trimmed = CFStringCreateMutableCopy(NULL, 0, domain);
-		CFStringTrim(trimmed, CFSTR("."));
-		domain = (CFStringRef)trimmed;
-		length = CFStringGetLength(domain);
-	} else {
-		CFRetain(domain);
-	}
-
-	if (length == 0) {
-		CFRelease(domain);
-		domain = NULL;
-	}
-
-	return domain;
-}
-
-
-static void
-update_search_domains(CFMutableDictionaryRef *defaultDomain, CFArrayRef supplemental)
+static CFArrayRef
+extract_search_domains(CFMutableDictionaryRef defaultDomain, CFArrayRef supplemental)
 {
 	CFStringRef		defaultDomainName	= NULL;
 	uint32_t		defaultOrder		= DEFAULT_SEARCH_ORDER;
@@ -446,29 +415,23 @@ update_search_domains(CFMutableDictionaryRef *defaultDomain, CFArrayRef suppleme
 	CFMutableArrayRef	mySearchDomains;
 	CFMutableArrayRef	mySupplemental		= NULL;
 	CFIndex			n_supplemental;
-	Boolean			searchDomainAdded	= FALSE;
 
-	n_supplemental = CFArrayGetCount(supplemental);
-	if (n_supplemental == 0) {
-		// if no supplemental domains
-		return;
-	}
+	mySearchDomains = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 
-	if (*defaultDomain != NULL) {
+	if (defaultDomain != NULL) {
 		CFNumberRef	num;
 
-		num = CFDictionaryGetValue(*defaultDomain, kSCPropNetDNSSearchOrder);
+		num = CFDictionaryGetValue(defaultDomain, kSCPropNetDNSSearchOrder);
 		if (!isA_CFNumber(num) ||
 		    !CFNumberGetValue(num, kCFNumberIntType, &defaultOrder)) {
 			defaultOrder = DEFAULT_SEARCH_ORDER;
 		}
 
-		defaultDomainName    = CFDictionaryGetValue(*defaultDomain, kSCPropNetDNSDomainName);
-		defaultSearchDomains = CFDictionaryGetValue(*defaultDomain, kSCPropNetDNSSearchDomains);
+		defaultDomainName    = CFDictionaryGetValue(defaultDomain, kSCPropNetDNSDomainName);
+		defaultSearchDomains = CFDictionaryGetValue(defaultDomain, kSCPropNetDNSSearchDomains);
 	}
 
-	mySearchDomains = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-
+	// validate the provided "search" domains or move/expand/promote the "domain" name
 	if (isA_CFArray(defaultSearchDomains)) {
 		CFIndex	n_search;
 
@@ -477,18 +440,50 @@ update_search_domains(CFMutableDictionaryRef *defaultDomain, CFArrayRef suppleme
 			CFStringRef	search;
 
 			search = CFArrayGetValueAtIndex(defaultSearchDomains, i);
-			search = trimDomain(search);
+			search = _SC_trimDomain(search);
 			if (search != NULL) {
 				CFArrayAppendValue(mySearchDomains, search);
 				CFRelease(search);
 			}
 		}
 	} else {
-		defaultDomainName = trimDomain(defaultDomainName);
+		defaultDomainName = _SC_trimDomain(defaultDomainName);
 		if (defaultDomainName != NULL) {
-			char	*domain;
-			int	domain_parts	= 1;
-			char	*dp;
+			CFStringRef	defaultOptions;
+			char		*domain;
+			int		domain_parts	= 1;
+			char		*dp;
+			int		ndots		= 1;
+
+#define	NDOTS_OPT	"ndots="
+#define	NDOTS_OPT_LEN	(sizeof("ndots=") - 1)
+
+			defaultOptions = CFDictionaryGetValue(defaultDomain, kSCPropNetDNSOptions);
+			if (defaultOptions != NULL) {
+				char	*cp;
+				char	*options;
+
+				options = _SC_cfstring_to_cstring(defaultOptions,
+								 NULL,
+								 0,
+								 kCFStringEncodingUTF8);
+				cp = strstr(options, NDOTS_OPT);
+				if ((cp != NULL) &&
+				    ((cp == options) || isspace(cp[-1])) &&
+				    ((cp[NDOTS_OPT_LEN] != '\0') && isdigit(cp[NDOTS_OPT_LEN]))) {
+					char    *end;
+					long    val;
+
+					cp +=  NDOTS_OPT_LEN;
+					errno = 0;
+					val = strtol(cp, &end, 10);
+					if ((*cp != '\0') && (cp != end) && (errno == 0) &&
+					    ((*end == '\0') || isspace(*end)) && (val > 0)) {
+						ndots = val;
+					}
+				}
+				CFAllocatorDeallocate(NULL, options);
+			}
 
 			domain = _SC_cfstring_to_cstring(defaultDomainName,
 							 NULL,
@@ -503,23 +498,31 @@ update_search_domains(CFMutableDictionaryRef *defaultDomain, CFArrayRef suppleme
 				}
 			}
 
+			// move "domain" to "search" list (and expand as needed)
+			i = LOCALDOMAINPARTS;
 			dp = domain;
-			for (i = LOCALDOMAINPARTS; i <= domain_parts; i++) {
+			do {
 				CFStringRef	search;
-
-				search = CFStringCreateWithCString(NULL,
-								   dp,
-								   kCFStringEncodingUTF8);
-				CFArrayAppendValue(mySearchDomains, search);
-				CFRelease(search);
+				CFStringRef	str;
+
+				str = CFStringCreateWithCString(NULL,
+								dp,
+								kCFStringEncodingUTF8);
+				search = _SC_trimDomain(str);
+				CFRelease(str);
+				if (search != NULL) {
+					CFArrayAppendValue(mySearchDomains, search);
+					CFRelease(search);
+				}
 
 				dp = strchr(dp, '.') + 1;
-			}
-
+			} while (++i <= (domain_parts - ndots));
 			CFAllocatorDeallocate(NULL, domain);
 		}
 	}
 
+	// add any supplemental "domain" names to the search list
+	n_supplemental = (supplemental != NULL) ? CFArrayGetCount(supplemental) : 0;
 	if (n_supplemental > 1) {
 		mySupplemental = CFArrayCreateMutableCopy(NULL, 0, supplemental);
 		CFArraySortValues(mySupplemental,
@@ -528,7 +531,6 @@ update_search_domains(CFMutableDictionaryRef *defaultDomain, CFArrayRef suppleme
 				  NULL);
 		supplemental = mySupplemental;
 	}
-
 	for (i = 0; i < n_supplemental; i++) {
 		CFDictionaryRef dns;
 		CFIndex		domainIndex;
@@ -556,7 +558,7 @@ update_search_domains(CFMutableDictionaryRef *defaultDomain, CFArrayRef suppleme
 		}
 
 		supplementalDomain = CFDictionaryGetValue(dns, kSCPropNetDNSDomainName);
-		supplementalDomain = trimDomain(supplementalDomain);
+		supplementalDomain = _SC_trimDomain(supplementalDomain);
 		if (supplementalDomain == NULL) {
 			continue;
 		}
@@ -589,30 +591,195 @@ update_search_domains(CFMutableDictionaryRef *defaultDomain, CFArrayRef suppleme
 						  defaultSearchIndex,
 						  supplementalDomain);
 			defaultSearchIndex++;
-			searchDomainAdded = TRUE;
 		} else {
 			if (domainIndex == kCFNotFound) {
 				// add to the (end of the) search list
 				CFArrayAppendValue(mySearchDomains, supplementalDomain);
-				searchDomainAdded = TRUE;
 			}
 		}
 
 		CFRelease(supplementalDomain);
 	}
+	if (mySupplemental != NULL) CFRelease(mySupplemental);
+
+	// update the "search" domains
+	if (CFArrayGetCount(mySearchDomains) == 0) {
+		CFRelease(mySearchDomains);
+		mySearchDomains = NULL;
+	}
+
+	// remove the "domain" name and "search" list
+	CFDictionaryRemoveValue(defaultDomain, kSCPropNetDNSDomainName);
+	CFDictionaryRemoveValue(defaultDomain, kSCPropNetDNSSearchDomains);
+
+	return mySearchDomains;
+}
+
 
-	if (searchDomainAdded) {
-		if (*defaultDomain == NULL) {
-			*defaultDomain = CFDictionaryCreateMutable(NULL,
-								   0,
-								   &kCFTypeDictionaryKeyCallBacks,
-								   &kCFTypeDictionaryValueCallBacks);
+static void
+add_scoped_resolvers(CFMutableArrayRef scoped, CFDictionaryRef services, CFArrayRef service_order)
+{
+	const void *		keys_q[N_QUICK];
+	const void **		keys	= keys_q;
+	CFIndex			i;
+	CFIndex			n_order;
+	CFIndex			n_services;
+	CFMutableArrayRef	order;
+	CFMutableSetRef		seen;
+
+	n_services = isA_CFDictionary(services) ? CFDictionaryGetCount(services) : 0;
+	if (n_services == 0) {
+		return;		// if no services
+	}
+
+	// ensure that we process all services in order
+
+	n_order = isA_CFArray(service_order) ? CFArrayGetCount(service_order) : 0;
+	if (n_order > 0) {
+		order = CFArrayCreateMutableCopy(NULL, 0, service_order);
+	} else{
+		order = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	}
+
+	if (n_services > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) {
+		keys = CFAllocatorAllocate(NULL, n_services * sizeof(CFTypeRef), 0);
+	}
+	CFDictionaryGetKeysAndValues(services, keys, NULL);
+	for (i = 0; i < n_services; i++) {
+		CFStringRef	serviceID = (CFStringRef)keys[i];
+
+		if (!CFArrayContainsValue(order, CFRangeMake(0, n_order), serviceID)) {
+			CFArrayAppendValue(order, serviceID);
+			n_order++;
 		}
-		CFDictionarySetValue(*defaultDomain, kSCPropNetDNSSearchDomains, mySearchDomains);
+	}
+	if (keys != keys_q) {
+		CFAllocatorDeallocate(NULL, keys);
 	}
 
-	CFRelease(mySearchDomains);
-	if (mySupplemental != NULL) CFRelease(mySupplemental);
+	// iterate over services
+
+	seen = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+	for (i = 0; i < n_order; i++) {
+		CFDictionaryRef		dns;
+		uint32_t		flags;
+		unsigned int		if_index;
+		char			if_name[IF_NAMESIZE];
+		CFStringRef		interface;
+		CFMutableDictionaryRef	newDNS;
+		CFNumberRef		num;
+		CFArrayRef		searchDomains;
+		CFDictionaryRef		service;
+		CFStringRef		serviceID;
+
+		serviceID = CFArrayGetValueAtIndex(order, i);
+		service = CFDictionaryGetValue(services, serviceID);
+		if (!isA_CFDictionary(service)) {
+			// if no service
+			continue;
+		}
+
+		dns = CFDictionaryGetValue(service, kSCEntNetDNS);
+		if (!isA_CFDictionary(dns)) {
+			// if no DNS
+			continue;
+		}
+
+		interface = CFDictionaryGetValue(dns, kSCPropInterfaceName);
+		if (interface == NULL) {
+			// if no [scoped] interface
+			continue;
+		}
+		if (CFSetContainsValue(seen, interface)) {
+			// if we've already processed this [scoped] interface
+			continue;
+		}
+		CFSetSetValue(seen, interface);
+
+		if ((_SC_cfstring_to_cstring(interface,
+					     if_name,
+					     sizeof(if_name),
+					     kCFStringEncodingASCII) == NULL) ||
+		    ((if_index = if_nametoindex(if_name)) == 0)) {
+			// if interface index not available
+			continue;
+		}
+
+		// add [scoped] resolver entry
+		newDNS = CFDictionaryCreateMutableCopy(NULL, 0, dns);
+
+		// set search list
+		searchDomains = extract_search_domains(newDNS, NULL);
+		if (searchDomains != NULL) {
+			CFDictionarySetValue(newDNS, kSCPropNetDNSSearchDomains, searchDomains);
+			CFRelease(searchDomains);
+		}
+
+		// set if_index
+		num = CFNumberCreate(NULL, kCFNumberIntType, &if_index);
+		CFDictionarySetValue(newDNS, CFSTR("*IF_INDEX*"), num);
+		CFRelease(num);
+
+		// set "scoped" flag
+		flags = DNS_RESOLVER_FLAGS_SCOPED;
+		num = CFNumberCreate(NULL, kCFNumberSInt32Type, &flags);
+		CFDictionarySetValue(newDNS, CFSTR("*FLAGS*"), num);
+		CFRelease(num);
+
+		// remove keys we don't want in a [scoped] resolver
+		CFDictionaryRemoveValue(newDNS, kSCPropNetDNSSupplementalMatchDomains);
+		CFDictionaryRemoveValue(newDNS, kSCPropNetDNSSupplementalMatchOrders);
+
+		add_resolver(scoped, newDNS);
+		CFRelease(newDNS);
+	}
+
+	CFRelease(seen);
+	CFRelease(order);
+	return;
+}
+
+
+static void
+add_default_resolver(CFMutableArrayRef	resolvers,
+		     CFDictionaryRef	defaultResolver,
+		     Boolean		*orderAdded,
+		     CFArrayRef		*searchDomains)
+{
+	CFMutableDictionaryRef	myDefault;
+	uint32_t		myOrder	= DEFAULT_SEARCH_ORDER;
+	CFNumberRef		order;
+
+	if (defaultResolver == NULL) {
+		myDefault = CFDictionaryCreateMutable(NULL,
+						      0,
+						      &kCFTypeDictionaryKeyCallBacks,
+						      &kCFTypeDictionaryValueCallBacks);
+	} else {
+		myDefault = CFDictionaryCreateMutableCopy(NULL, 0, defaultResolver);
+	}
+
+	// ensure that the default resolver has a search order
+
+	order = CFDictionaryGetValue(myDefault, kSCPropNetDNSSearchOrder);
+	if (!isA_CFNumber(order) ||
+	    !CFNumberGetValue(order, kCFNumberIntType, &myOrder)) {
+		myOrder = DEFAULT_SEARCH_ORDER;
+		order = CFNumberCreate(NULL, kCFNumberIntType, &myOrder);
+		CFDictionarySetValue(myDefault, kSCPropNetDNSSearchOrder, order);
+		CFRelease(order);
+		*orderAdded = TRUE;
+	}
+
+	// extract the "search" domain list for the default resolver (and
+	// any supplemental resolvers)
+
+	*searchDomains = extract_search_domains(myDefault, resolvers);
+
+	// add the default resolver
+
+	add_resolver(resolvers, myDefault);
+	CFRelease(myDefault);
 	return;
 }
 
@@ -803,151 +970,228 @@ create_resolver(CFDictionaryRef dns)
 		}
 	}
 
+	// process interface index
+	num = CFDictionaryGetValue(dns, CFSTR("*IF_INDEX*"));
+	if (isA_CFNumber(num)) {
+		int	if_index;
+
+		if (CFNumberGetValue(num, kCFNumberIntType, &if_index)) {
+			_dns_resolver_set_if_index(&_resolver, if_index);
+		}
+	}
+
+	// process flags
+	num = CFDictionaryGetValue(dns, CFSTR("*FLAGS*"));
+	if (isA_CFNumber(num)) {
+		uint32_t	flags;
+
+		if (CFNumberGetValue(num, kCFNumberSInt32Type, &flags)) {
+			_dns_resolver_set_flags(&_resolver, flags);
+		}
+	}
+
 	return _resolver;
 }
 
 
-__private_extern__
-void
-dns_configuration_set(CFDictionaryRef   defaultResolver,
-		      CFDictionaryRef   services,
-		      CFArrayRef	serviceOrder,
-		      CFArrayRef	multicastResolvers,
-		      CFArrayRef	privateResolvers)
+static __inline__ Boolean
+isScopedDNS(CFDictionaryRef dns)
 {
-	CFIndex			i;
-	CFMutableDictionaryRef	myDefault;
-	uint32_t		myOrder		= DEFAULT_SEARCH_ORDER;
-	Boolean			myOrderAdded	= FALSE;
-	CFIndex			n_supplemental;
-	CFNumberRef		order;
-	dns_create_resolver_t	resolver;
-	CFMutableArrayRef	supplemental;
+	uint32_t	flags;
+	CFNumberRef	num;
+
+	if ((dns != NULL) &&
+	    CFDictionaryGetValueIfPresent(dns, CFSTR("*FLAGS*"), (const void **)&num) &&
+	    (num != NULL) &&
+	    CFNumberGetValue(num, kCFNumberSInt32Type, &flags) &&
+	    ((flags & DNS_RESOLVER_FLAGS_SCOPED) != 0)) {
+		return TRUE;
+	}
 
-#ifdef	SPECIAL_HANDLING_FOR_DEFAULT_DOMAIN
-	CFStringRef		myDomain	= NULL;
-	CFArrayRef		search;
-#endif	// SPECIAL_HANDLING_FOR_DEFAULT_DOMAIN
+	return FALSE;
+}
 
-	if (defaultResolver == NULL) {
-		myDefault = CFDictionaryCreateMutable(NULL,
-						      0,
-						      &kCFTypeDictionaryKeyCallBacks,
-						      &kCFTypeDictionaryValueCallBacks);
-	} else {
-		myDefault = CFDictionaryCreateMutableCopy(NULL, 0, defaultResolver);
 
-		// ensure that the default resolver has a search order
+static CFComparisonResult
+compareDomain(const void *val1, const void *val2, void *context)
+{
+	CFDictionaryRef		dns1	= (CFDictionaryRef)val1;
+	CFDictionaryRef		dns2	= (CFDictionaryRef)val2;
+	CFStringRef		domain1;
+	CFStringRef		domain2;
+	CFArrayRef		labels1	= NULL;
+	CFArrayRef		labels2	= NULL;
+	CFIndex			n1;
+	CFIndex			n2;
+	CFComparisonResult	result;
+	Boolean			rev1;
+	Boolean			rev2;
+	Boolean			scoped1;
+	Boolean			scoped2;
+
+	// "default" domains sort before "supplemental" domains
+	domain1 = CFDictionaryGetValue(dns1, kSCPropNetDNSDomainName);
+	domain2 = CFDictionaryGetValue(dns2, kSCPropNetDNSDomainName);
+	if (domain1 == NULL) {
+		return kCFCompareLessThan;
+	} else if (domain2 == NULL) {
+		return kCFCompareGreaterThan;
+	}
+
+	// sort non-scoped before scoped
+	scoped1 = isScopedDNS(dns1);
+	scoped2 = isScopedDNS(dns2);
+	if (scoped1 != scoped2) {
+		if (!scoped1) {
+			return kCFCompareLessThan;
+		} else {
+			return kCFCompareGreaterThan;
+		}
+	}
+
+	// must have domain names for any further comparisons
+	if ((domain1 == NULL) || (domain2 == NULL)) {
+		return kCFCompareEqualTo;
+	}
 
-		order = CFDictionaryGetValue(myDefault, kSCPropNetDNSSearchOrder);
-		if (!isA_CFNumber(order) ||
-		    !CFNumberGetValue(order, kCFNumberIntType, &myOrder)) {
-			myOrderAdded = TRUE;
-			myOrder = DEFAULT_SEARCH_ORDER;
-			order = CFNumberCreate(NULL, kCFNumberIntType, &myOrder);
-			CFDictionarySetValue(myDefault, kSCPropNetDNSSearchOrder, order);
-			CFRelease(order);
+	// forward (A, AAAA) domains sort before reverse (PTR) domains
+	rev1 = CFStringHasSuffix(domain1, CFSTR(".arpa"));
+	rev2 = CFStringHasSuffix(domain2, CFSTR(".arpa"));
+	if (rev1 != rev2) {
+		if (rev1) {
+			return kCFCompareGreaterThan;
+		} else {
+			return kCFCompareLessThan;
 		}
 	}
 
-	// establish list of supplemental resolvers
+	labels1 = CFStringCreateArrayBySeparatingStrings(NULL, domain1, CFSTR("."));
+	n1 = CFArrayGetCount(labels1);
 
-	supplemental = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	labels2 = CFStringCreateArrayBySeparatingStrings(NULL, domain2, CFSTR("."));
+	n2 = CFArrayGetCount(labels2);
 
-	// identify search[] list and/or domain name
+	while ((n1 > 0) && (n2 > 0)) {
+		CFStringRef	label1	= CFArrayGetValueAtIndex(labels1, --n1);
+		CFStringRef	label2	= CFArrayGetValueAtIndex(labels2, --n2);
 
-#ifdef	SPECIAL_HANDLING_FOR_DEFAULT_DOMAIN
-	search = CFDictionaryGetValue(myDefault, kSCPropNetDNSSearchDomains);
-	if (isA_CFArray(search) && (CFArrayGetCount(search) > 0)) {
-		myDomain = CFArrayGetValueAtIndex(search, 0);
-		myDomain = isA_CFString(myDomain);
+		// compare domain labels
+		result = CFStringCompare(label1, label2, kCFCompareCaseInsensitive);
+		if (result != kCFCompareEqualTo) {
+			goto done;
+		}
 	}
 
-	if (myDomain == NULL) {
-		myDomain = CFDictionaryGetValue(myDefault, kSCPropNetDNSDomainName);
-		myDomain = isA_CFString(myDomain);
+	// longer labels (corp.apple.com) sort before shorter labels (apple.com)
+	if (n1 > n2) {
+		result = kCFCompareLessThan;
+		goto done;
+	} else if (n1 < n2) {
+		result = kCFCompareGreaterThan;
+		goto done;
 	}
 
-	// add match for default domain
+	// sort by search order
+	result = compareBySearchOrder(val1, val2, context);
 
-	if (myDomain != NULL) {
-		CFMutableDictionaryRef	mySupplemental;
+    done :
 
-		mySupplemental = CFDictionaryCreateMutableCopy(NULL, 0, myDefault);
-		CFDictionarySetValue   (mySupplemental, kSCPropNetDNSDomainName, myDomain);
-		CFDictionaryRemoveValue(mySupplemental, kSCPropNetDNSSearchDomains);
-		CFDictionaryRemoveValue(mySupplemental, kSCPropNetDNSSupplementalMatchDomains);
-		CFDictionaryRemoveValue(mySupplemental, kSCPropNetDNSSupplementalMatchOrders);
-		add_resolver(supplemental, mySupplemental);
-		CFRelease(mySupplemental);
-	}
-#endif	// SPECIAL_HANDLING_FOR_DEFAULT_DOMAIN
+	if (labels1 != NULL) CFRelease(labels1);
+	if (labels2 != NULL) CFRelease(labels2);
+	return result;
+}
 
-	// collect (and add) any supplemental resolver configurations
 
-	add_supplemental_resolvers(supplemental, services, serviceOrder);
+__private_extern__
+void
+dns_configuration_set(CFDictionaryRef   defaultResolver,
+		      CFDictionaryRef   services,
+		      CFArrayRef	serviceOrder,
+		      CFArrayRef	multicastResolvers,
+		      CFArrayRef	privateResolvers)
+{
+	CFIndex			i;
+	CFMutableDictionaryRef	myDefault;
+	Boolean			myOrderAdded	= FALSE;
+	CFArrayRef		mySearchDomains	= NULL;
+	CFIndex			n_resolvers;
+	CFMutableArrayRef	resolvers;
+
+	// establish list of resolvers
+
+	resolvers = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+
+	// collect (and add) any "supplemental" resolver configurations
+
+	add_supplemental_resolvers(resolvers, services, serviceOrder);
 
 	// collect (and add) any "private" resolver configurations
 
-	add_private_resolvers(supplemental, privateResolvers);
+	add_private_resolvers(resolvers, privateResolvers);
 
-	// update the "search" list
+	// add the "default" resolver
 
-	update_search_domains(&myDefault, supplemental);
+	add_default_resolver(resolvers, defaultResolver, &myOrderAdded, &mySearchDomains);
 
 	// collect (and add) any "multicast" resolver configurations
 
-	add_multicast_resolvers(supplemental, multicastResolvers);
+	add_multicast_resolvers(resolvers, multicastResolvers);
 
-	// check if the "match for default domain" (above) is really needed
+	// collect (and add) any "scoped" resolver configurations
 
-#ifdef	SPECIAL_HANDLING_FOR_DEFAULT_DOMAIN
-	if (myDomain != NULL) {
-		Boolean	sharedDomain	= FALSE;
+	add_scoped_resolvers(resolvers, services, serviceOrder);
 
-		n_supplemental = CFArrayGetCount(supplemental);
-		for (i = 1; i < n_supplemental; i++) {
-			CFStringRef	domain;
-			CFDictionaryRef	mySupplemental;
+	// sort resolvers
 
-			mySupplemental = CFArrayGetValueAtIndex(supplemental, i);
-			domain = CFDictionaryGetValue(mySupplemental, kSCPropNetDNSDomainName);
-			if (isA_CFString(domain)) {
-				if (CFEqual(myDomain, domain)) {
-					sharedDomain = TRUE;
-					break;
-				}
+	n_resolvers = CFArrayGetCount(resolvers);
+	if (n_resolvers > 1) {
+		CFArraySortValues(resolvers, CFRangeMake(0, n_resolvers), compareDomain, NULL);
+	}
 
-				if (CFStringHasSuffix(myDomain, domain)) {
-					CFIndex	dotIndex;
+	// cleanup
 
-					dotIndex = CFStringGetLength(myDomain) - CFStringGetLength(domain) - 1;
-					if (dotIndex > 0) {
-						UniChar	dot;
+	for (i = n_resolvers; --i > 0; ) {
+		CFDictionaryRef	resolver;
 
-						dot = CFStringGetCharacterAtIndex(myDomain, dotIndex);
-						if (dot == (UniChar)'.') {
-							sharedDomain = TRUE;
-							break;
-						}
-					}
-				}
-			}
+		resolver = CFArrayGetValueAtIndex(resolvers, i);
+		if (!CFDictionaryContainsKey(resolver, kSCPropNetDNSDomainName) &&
+		    !CFDictionaryContainsKey(resolver, kSCPropNetDNSSearchDomains) &&
+		    !CFDictionaryContainsKey(resolver, kSCPropNetDNSServerAddresses)) {
+			// remove empty resolver
+			CFArrayRemoveValueAtIndex(resolvers, i);
+			n_resolvers--;
 		}
+	}
 
-		if (!sharedDomain) {
-			// if the default resolver domain name is not shared
-			CFArrayRemoveValueAtIndex(supplemental, 0);
+	// update the default resolver
+
+	myDefault = CFDictionaryCreateMutableCopy(NULL,
+						  0,
+						  CFArrayGetValueAtIndex(resolvers, 0));
+	if (mySearchDomains != NULL) {
+		// add search domains to the default resolver
+		CFDictionarySetValue(myDefault, kSCPropNetDNSSearchDomains, mySearchDomains);
+		CFRelease(mySearchDomains);
+	}
+	if (myOrderAdded && (n_resolvers > 1)) {
+		CFDictionaryRef	resolver;
+
+		resolver = CFArrayGetValueAtIndex(resolvers, 1);
+		if (CFDictionaryContainsKey(resolver, kSCPropNetDNSDomainName) ||
+		    isScopedDNS(resolver)) {
+			// if not a supplemental "default" resolver (a domain name is
+			// present) or a if it's a scoped resolver
+			CFDictionaryRemoveValue(myDefault, kSCPropNetDNSSearchOrder);
 		}
 	}
-#endif	// SPECIAL_HANDLING_FOR_DEFAULT_DOMAIN
+	CFArraySetValueAtIndex(resolvers, 0, myDefault);
+	CFRelease(myDefault);
 
 	// establish resolver configuration
 
-	n_supplemental = CFArrayGetCount(supplemental);
-	if ((defaultResolver == NULL) && (n_supplemental == 0)) {
+	if ((defaultResolver == NULL) && (n_resolvers <= 1)) {
 		/*
-		 * if no default or supplemental resolvers
+		 * if no default and no supplemental/scoped resolvers
 		 */
 		if (!_dns_configuration_store(NULL)) {
 			SCLog(TRUE, LOG_ERR, CFSTR("dns_configuration_set: could not store configuration"));
@@ -956,28 +1200,20 @@ dns_configuration_set(CFDictionaryRef   defaultResolver,
 		dns_create_config_t	_config;
 
 		/*
-		 * if default and/or supplemental resolvers are defined
+		 * if default and/or supplemental/scoped resolvers are defined
 		 */
 		_config = _dns_configuration_create();
 
-		// add [default] resolver
-
-		if ((n_supplemental == 0) && myOrderAdded) {
-			CFDictionaryRemoveValue(myDefault, kSCPropNetDNSSearchOrder);
-		}
-		resolver = create_resolver(myDefault);
-		_dns_configuration_add_resolver(&_config, resolver);
-		_dns_resolver_free(&resolver);
-
-		// add [supplemental] resolvers
+		// add resolvers
 
-		for (i = 0; i < n_supplemental; i++) {
-			CFDictionaryRef	supplementalResolver;
+		for (i = 0; i < n_resolvers; i++) {
+			CFDictionaryRef		resolver;
+			dns_create_resolver_t	_resolver;
 
-			supplementalResolver = CFArrayGetValueAtIndex(supplemental, i);
-			resolver = create_resolver(supplementalResolver);
-			_dns_configuration_add_resolver(&_config, resolver);
-			_dns_resolver_free(&resolver);
+			resolver = CFArrayGetValueAtIndex(resolvers, i);
+			_resolver = create_resolver(resolver);
+			_dns_configuration_add_resolver(&_config, _resolver);
+			_dns_resolver_free(&_resolver);
 		}
 
 #if	!TARGET_OS_IPHONE
@@ -995,9 +1231,7 @@ dns_configuration_set(CFDictionaryRef   defaultResolver,
 		_dns_configuration_free(&_config);
 	}
 
-	CFRelease(myDefault);
-	CFRelease(supplemental);
-
+	CFRelease(resolvers);
 	return;
 }
 
@@ -1060,12 +1294,10 @@ dns_configuration_monitor(SCDynamicStoreRef store, SCDynamicStoreCallBack callou
 		return;
 	}
 
-	mp = CFMachPortCreateWithPort(NULL, notify_port, dns_configuration_changed, NULL, NULL);
-	if (mp == NULL) {
-		SCLOG(NULL, NULL, ASL_LEVEL_ERR, CFSTR("CFMachPortCreateWithPort() failed"));
-		(void)notify_cancel(notify_token);
-		return;
-	}
+	mp = _SC_CFMachPortCreateWithPort("IPMonitor/dns_configuration",
+					  notify_port,
+					  dns_configuration_changed,
+					  NULL);
 
 	rls = CFMachPortCreateRunLoopSource(NULL, mp, -1);
 	if (rls == NULL) {
@@ -1103,7 +1335,6 @@ dns_configuration_init(CFBundleRef bundle)
 
 
 #ifdef	MAIN
-#undef	MAIN
 
 static void
 split(const void * key, const void * value, void * context)
@@ -1116,11 +1347,63 @@ split(const void * key, const void * value, void * context)
 	components = CFStringCreateArrayBySeparatingStrings(NULL, (CFStringRef)key, CFSTR("/"));
 	service_id = CFArrayGetValueAtIndex(components, 3);
 	entity_id  = CFArrayGetValueAtIndex(components, 4);
-	state_dict = CFDictionaryCreateMutable(NULL,
-					       0,
-					       &kCFTypeDictionaryKeyCallBacks,
-					       &kCFTypeDictionaryValueCallBacks);
-	CFDictionarySetValue(state_dict, entity_id, (CFDictionaryRef)value);
+	state_dict = (CFMutableDictionaryRef)CFDictionaryGetValue(context, service_id);
+	if (state_dict != NULL) {
+		state_dict = CFDictionaryCreateMutableCopy(NULL, 0, state_dict);
+	} else {
+		state_dict = CFDictionaryCreateMutable(NULL,
+						       0,
+						       &kCFTypeDictionaryKeyCallBacks,
+						       &kCFTypeDictionaryValueCallBacks);
+	}
+
+	if (CFEqual(entity_id, kSCEntNetIPv4) ||
+	    CFEqual(entity_id, kSCEntNetIPv6)) {
+		CFStringRef	interface;
+
+		interface = CFDictionaryGetValue((CFDictionaryRef)value, kSCPropInterfaceName);
+		if (interface != NULL) {
+			CFDictionaryRef		dns;
+			CFMutableDictionaryRef	new_dns;
+
+			dns = CFDictionaryGetValue(state_dict, kSCEntNetDNS);
+			if (dns != NULL) {
+				new_dns = CFDictionaryCreateMutableCopy(NULL, 0, dns);
+			} else {
+				new_dns = CFDictionaryCreateMutable(NULL,
+								0,
+								&kCFTypeDictionaryKeyCallBacks,
+								&kCFTypeDictionaryValueCallBacks);
+			}
+			CFDictionarySetValue(new_dns, kSCPropInterfaceName, interface);
+			CFDictionarySetValue(state_dict, kSCEntNetDNS, new_dns);
+			CFRelease(new_dns);
+		}
+	} else if (CFEqual(entity_id, kSCEntNetDNS)) {
+		CFDictionaryRef	dns;
+
+		dns = CFDictionaryGetValue(state_dict, kSCEntNetDNS);
+		if (dns != NULL) {
+			CFStringRef	interface;
+
+			interface = CFDictionaryGetValue(dns, kSCPropInterfaceName);
+			if (interface != NULL) {
+				CFMutableDictionaryRef	new_dns;
+
+				new_dns = CFDictionaryCreateMutableCopy(NULL, 0, (CFDictionaryRef)value);
+				CFDictionarySetValue(new_dns, kSCPropInterfaceName, interface);
+				CFDictionarySetValue(state_dict, kSCEntNetDNS, new_dns);
+				CFRelease(new_dns);
+			} else {
+				CFDictionarySetValue(state_dict, kSCEntNetDNS, (CFDictionaryRef)value);
+			}
+		} else {
+			CFDictionarySetValue(state_dict, kSCEntNetDNS, (CFDictionaryRef)value);
+		}
+	} else {
+		CFDictionarySetValue(state_dict, entity_id, (CFDictionaryRef)value);
+	}
+
 	CFDictionarySetValue((CFMutableDictionaryRef)context, service_id, state_dict);
 	CFRelease(state_dict);
 	CFRelease(components);
@@ -1150,12 +1433,24 @@ main(int argc, char **argv)
 
 	store = SCDynamicStoreCreate(NULL, CFSTR("TEST"), NULL, NULL);
 
-	// get DNS entities
+	// get IPv4, IPv6, and DNS entities
+	patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv4);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv6);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
 	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 							      kSCDynamicStoreDomainState,
 							      kSCCompAnyRegex,
 							      kSCEntNetDNS);
-	patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
 	entities = SCDynamicStoreCopyMultiple(store, NULL, patterns);
diff --git a/Plugins/IPMonitor/ip_plugin.c b/Plugins/IPMonitor/ip_plugin.c
index 5aaf1ea..82cd44b 100644
--- a/Plugins/IPMonitor/ip_plugin.c
+++ b/Plugins/IPMonitor/ip_plugin.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc.  All Rights Reserved.
+ * Copyright (c) 2000-2011 Apple Inc.  All Rights Reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -73,12 +73,16 @@
 #include <string.h>
 #include <stdio.h>
 #include <sys/fcntl.h>
+#include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <net/route.h>
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <netinet/in.h>
+#include <netinet/icmp6.h>
+#include <netinet6/in6_var.h>
+#include <netinet6/nd6.h>
 #include <arpa/inet.h>
 #include <sys/sysctl.h>
 #include <limits.h>
@@ -125,6 +129,7 @@ enum {
 
 #include "set-hostname.h"
 #include "dns-configuration.h"
+#include "proxy-configuration.h"
 #if	!TARGET_OS_IPHONE
 #include "smb-configuration.h"
 #endif	/* !TARGET_OS_IPHONE */
@@ -198,6 +203,7 @@ static boolean_t		S_netboot = FALSE;
 /* is scoped routing enabled? */
 #ifdef RTF_IFSCOPE
 static boolean_t		S_scopedroute = FALSE;
+static boolean_t		S_scopedroute_v6 = FALSE;
 #endif /* RTF_IFSCOPE */
 
 /* dictionary to hold per-service state: key is the serviceID */
@@ -220,7 +226,6 @@ static CFStringRef		S_state_global_dns = NULL;
 static CFStringRef		S_state_global_proxies = NULL;
 static CFStringRef		S_state_service_prefix = NULL;
 static CFStringRef		S_setup_global_ipv4 = NULL;
-static CFStringRef		S_setup_global_proxies = NULL;
 static CFStringRef		S_setup_service_prefix = NULL;
 
 static CFStringRef		S_multicast_resolvers = NULL;
@@ -236,7 +241,6 @@ static boolean_t		S_append_state = FALSE;
 #if	!TARGET_OS_IPHONE
 static CFStringRef		S_primary_smb = NULL;
 static CFStringRef		S_state_global_smb = NULL;
-static CFStringRef		S_setup_global_smb = NULL;
 #endif	/* !TARGET_OS_IPHONE */
 
 #if	!TARGET_OS_IPHONE
@@ -422,6 +426,45 @@ S_is_network_boot()
     return (netboot);
 }
 
+static __inline__ int
+inet6_dgram_socket()
+{
+    return (socket(AF_INET6, SOCK_DGRAM, 0));
+}
+
+#ifdef SIOCDRADD_IN6
+static int
+siocdradd_in6(int s, int if_index, const struct in6_addr * addr, u_char flags)
+{
+    struct in6_defrouter	dr;
+    struct sockaddr_in6 *	sin6;
+
+    bzero(&dr, sizeof(dr));
+    sin6 = &dr.rtaddr;
+    sin6->sin6_len = sizeof(struct sockaddr_in6);
+    sin6->sin6_family = AF_INET6;
+    sin6->sin6_addr = *addr;
+    dr.flags = flags;
+    dr.if_index = if_index;
+    return (ioctl(s, SIOCDRADD_IN6, &dr));
+}
+
+static int
+siocdrdel_in6(int s, int if_index, const struct in6_addr * addr)
+{
+    struct in6_defrouter	dr;
+    struct sockaddr_in6 *	sin6;
+
+    bzero(&dr, sizeof(dr));
+    sin6 = &dr.rtaddr;
+    sin6->sin6_len = sizeof(struct sockaddr_in6);
+    sin6->sin6_family = AF_INET6;
+    sin6->sin6_addr = *addr;
+    dr.if_index = if_index;
+    return (ioctl(s, SIOCDRDEL_IN6, &dr));
+}
+#endif /* SIOCDRADD_IN6 */
+
 #ifdef	RTF_IFSCOPE
 static boolean_t
 S_is_scoped_routing_enabled()
@@ -437,6 +480,21 @@ S_is_scoped_routing_enabled()
     }
     return (scopedroute);
 }
+
+static boolean_t
+S_is_scoped_v6_routing_enabled()
+{
+    int	    scopedroute_v6	= 0;
+    size_t  len			= sizeof(scopedroute_v6);
+
+    if ((sysctlbyname("net.inet6.ip6.scopedroute",
+		      &scopedroute_v6, &len,
+		      NULL, 0) == -1)
+	&& (errno != ENOENT)) {
+	SCLog(TRUE, LOG_ERR, CFSTR("sysctlbyname() failed: %s"), strerror(errno));
+    }
+    return (scopedroute_v6);
+}
 #endif /* RTF_IFSCOPE */
 
 static void
@@ -1175,7 +1233,9 @@ IPv4RouteListCreateWithDictionary(IPv4RouteListRef routes,
     unsigned int	ifindex;
     char		ifn[IFNAMSIZ];
     struct in_addr	mask = { 0 };
-    int			n;
+    int			n = 0;
+    boolean_t		add_default = FALSE;
+    boolean_t		add_subnet = FALSE;
     IPv4RouteRef	r;
     struct in_addr	subnet = { 0 };
     struct in_addr	router = { 0 };
@@ -1200,13 +1260,13 @@ IPv4RouteListCreateWithDictionary(IPv4RouteListRef routes,
 		       &router) == 0) {
 	(void)dict_get_first_ip(dict, kSCPropNetIPv4DestAddresses, &router);
     }
-    n = 1;
     if (dict_get_first_ip(dict, kSCPropNetIPv4Addresses, &addr)
 	&& dict_get_first_ip(dict, kSCPropNetIPv4SubnetMasks, &mask)) {
 	/* subnet route */
 	subnet = subnet_addr(addr, mask);
 	/* ignore link-local subnets, let IPConfiguration handle them for now */
 	if (ntohl(subnet.s_addr) != IN_LINKLOCALNETNUM) {
+	    add_subnet = TRUE;
 	    n++;
 	}
     }
@@ -1223,7 +1283,7 @@ IPv4RouteListCreateWithDictionary(IPv4RouteListRef routes,
 	 * not 255.255.255.255, assume all routes are local to the interface.
 	 */
 	if (addr.s_addr == router.s_addr
-	    && ifn[0] != '\0' && mask.s_addr != INADDR_BROADCAST) {
+	    && mask.s_addr != INADDR_BROADCAST) {
 	    flags |= kRouteIsDirectToInterfaceFlag;
 	}
 	if (primaryRank != NULL) {
@@ -1238,11 +1298,16 @@ IPv4RouteListCreateWithDictionary(IPv4RouteListRef routes,
 	    flags |= kRouteChooseFirstFlag;
 	}
     }
-    if (n > 1 && (flags & kRouteIsDirectToInterfaceFlag) == 0
+    if (add_subnet && (flags & kRouteIsDirectToInterfaceFlag) == 0
 	&& subnet.s_addr != subnet_addr(router, mask).s_addr) {
 	flags |= kRouteIsNotSubnetLocalFlag;
     }
 
+    if (strncmp(ifn, "lo0", sizeof(ifn)) != 0) {
+	add_default = TRUE;
+	n++;
+    }
+
     if (routes == NULL || routes->size < n) {
 	routes = (IPv4RouteListRef)malloc(IPv4RouteListComputeSize(n));
 	routes->size = n;
@@ -1253,22 +1318,23 @@ IPv4RouteListCreateWithDictionary(IPv4RouteListRef routes,
     /* start at the beginning */
     r = routes->list;
 
-    /* add the default route */
-    r->ifindex = ifindex;
-    strlcpy(r->ifname, ifn, sizeof(r->ifname));
-    r->ifa = addr;
-    r->flags = flags;
-    if ((flags & kRouteIsDirectToInterfaceFlag) == 0) {
+    if (add_default) {
+	/* add the default route */
+	r->ifindex = ifindex;
+	strlcpy(r->ifname, ifn, sizeof(r->ifname));
+	r->ifa = addr;
+	r->flags = flags;
+	if ((flags & kRouteIsDirectToInterfaceFlag) == 0) {
 	    r->gateway = router;
-    }
-    else {
+	}
+	else {
 	    r->gateway = addr;
+	}
+	r++;
     }
-    r++;
-    n--;
 
     /* add the subnet route */
-    if (n > 0) {
+    if (add_subnet) {
 	r->ifindex = ifindex;
 	r->gateway = addr;
 	r->dest = subnet;
@@ -1413,6 +1479,105 @@ service_dict_get(CFStringRef serviceID, CFStringRef entity)
     return (CFDictionaryGetValue(service_dict, entity));
 }
 
+static boolean_t
+ipv6_service_dict_set(CFStringRef serviceID, CFDictionaryRef new_val)
+{
+#ifdef SIOCDRADD_IN6
+    int			if_index;
+    char		ifn[IFNAMSIZ];
+    CFStringRef		new_router = NULL;
+    char 		ntopbuf[INET6_ADDRSTRLEN];
+    CFDictionaryRef	old_val = NULL;
+    CFStringRef		old_router = NULL;
+    struct in6_addr	router_ip;
+    int			s = -1;
+
+    ifn[0] = '\0';
+    old_val = service_dict_get(serviceID, kSCEntNetIPv6);
+    if (old_val != NULL) {
+	plist_get_cstring(old_val, kSCPropInterfaceName, ifn, sizeof(ifn));
+	old_router = CFDictionaryGetValue(old_val, kSCPropNetIPv6Router);
+    }
+    if (ifn[0] == '\0') {
+	if (new_val == NULL
+	    || plist_get_cstring(new_val, kSCPropInterfaceName,
+				 ifn, sizeof(ifn)) == FALSE) {
+	    /* no InterfaceName property, ignore it */
+	    goto done;
+	}
+    }
+    if_index = if_nametoindex(ifn);
+    if (if_index == 0) {
+	goto done;
+    }
+    s = inet6_dgram_socket();
+    if (s < 0) {
+	syslog(LOG_ERR,
+	       "IPMonitor: ipv6_service_dict_set: socket failed, %s",
+	       strerror(errno));
+	goto done;
+    }
+    if (new_val != NULL) {
+	new_router = CFDictionaryGetValue(new_val, kSCPropNetIPv6Router);
+    }
+    if (old_router != NULL
+	&& (new_router == NULL || CFEqual(old_router, new_router) == FALSE)) {
+	/* remove the old Router */
+	if (cfstring_to_ip6(old_router, &router_ip)) {
+	    if (IN6_IS_ADDR_LINKLOCAL(&router_ip)) {
+		/* scope it */
+		router_ip.__u6_addr.__u6_addr16[1] = htons(if_index);
+	    }
+	    if (siocdrdel_in6(s, if_index, &router_ip) < 0) {
+		if (errno != EINVAL) {
+		    syslog(LOG_ERR,
+			   "IPMonitor: siocdrdel_in6(%s, %s) failed, %s",
+			   ifn,
+			   inet_ntop(AF_INET6, &router_ip,
+				     ntopbuf, sizeof(ntopbuf)),
+			   strerror(errno));
+		}
+	    }
+	    else if (S_IPMonitor_debug & kDebugFlag1) {
+		syslog(LOG_NOTICE,
+		       "IPMonitor: %s removed default route %s",
+		       ifn,
+		       inet_ntop(AF_INET6, &router_ip,
+				 ntopbuf, sizeof(ntopbuf)));
+	    }
+	}
+    }
+    /* add the new Router */
+    if (cfstring_to_ip6(new_router, &router_ip)) {
+	if (IN6_IS_ADDR_LINKLOCAL(&router_ip)) {
+	    /* scope it */
+	    router_ip.__u6_addr.__u6_addr16[1] = htons(if_index);
+	}
+	if (siocdradd_in6(s, if_index, &router_ip, 0) < 0) {
+	    if (errno != EINVAL) {
+		syslog(LOG_ERR,
+		       "IPMonitor: siocdradd_in6(%s, %s) failed, %s",
+		       ifn,
+		       inet_ntop(AF_INET6, &router_ip,
+				 ntopbuf, sizeof(ntopbuf)),
+		       strerror(errno));
+	    }
+	}
+	else if (S_IPMonitor_debug & kDebugFlag1) {
+	    syslog(LOG_NOTICE,
+		   "IPMonitor: %s added default route %s",
+		   ifn,
+		   inet_ntop(AF_INET6, &router_ip,
+			     ntopbuf, sizeof(ntopbuf)));
+	}
+    }
+    close(s);
+
+ done:
+#endif /* SIOCDRADD_IN6 */
+    return (service_dict_set(serviceID, kSCEntNetIPv6, new_val));
+}
+
 #define	ALLOW_EMPTY_STRING	0x1
 
 static CFTypeRef
@@ -1644,8 +1809,9 @@ get_ipv6_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 	}
     }
     new_dict = dict;
+
  done:
-    changed = service_dict_set(serviceID, kSCEntNetIPv6, new_dict);
+    changed = ipv6_service_dict_set(serviceID, new_dict);
     if (new_dict == NULL) {
 	/* clean up the rank too */
 	CFDictionaryRemoveValue(S_ipv6_service_rank_dict, serviceID);
@@ -1654,25 +1820,6 @@ get_ipv6_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
     return (changed);
 }
 
-static boolean_t
-dns_has_supplemental(CFStringRef serviceID)
-{
-    CFDictionaryRef     dns_dict;
-    CFDictionaryRef     service_dict;
-
-    service_dict = CFDictionaryGetValue(S_service_state_dict, serviceID);
-    if (service_dict == NULL) {
-	return FALSE;
-    }
-
-    dns_dict = CFDictionaryGetValue(service_dict, kSCEntNetDNS);
-    if (dns_dict == NULL) {
-	return FALSE;
-    }
-
-    return CFDictionaryContainsKey(dns_dict, kSCPropNetDNSSupplementalMatchDomains);
-}
-
 static void
 accumulate_dns_servers(CFArrayRef in_servers, ProtocolFlags active_protos,
 		       CFMutableArrayRef out_servers)
@@ -1704,14 +1851,13 @@ accumulate_dns_servers(CFArrayRef in_servers, ProtocolFlags active_protos,
 	    if ((active_protos & kProtocolFlagsIPv6) == 0
 		&& !IN6_IS_ADDR_LOOPBACK(&ipv6_addr)) {
 		if ((S_IPMonitor_debug & kDebugFlag1) != 0) {
-		    char	str[128];
+		    char 	ntopbuf[INET6_ADDRSTRLEN];
 
-		    str[0] = '\0';
-		    inet_ntop(AF_INET6, &ipv6_addr, str, sizeof(str));
 		    syslog(LOG_NOTICE,
 			   "IPMonitor: no IPv6 connectivity, "
 			   "ignoring DNS server address %s",
-			   str);
+			   inet_ntop(AF_INET6, &ipv6_addr,
+				     ntopbuf, sizeof(ntopbuf)));
 		}
 		continue;
 	    }
@@ -1765,9 +1911,12 @@ static boolean_t
 get_dns_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 		CFDictionaryRef setup_dict, CFDictionaryRef info)
 {
-    ProtocolFlags		active_protos = kProtocolFlagsNone;
-    boolean_t			changed = FALSE;
+    ProtocolFlags		active_protos	= kProtocolFlagsNone;
+    boolean_t			changed		= FALSE;
     CFStringRef			domain;
+    CFStringRef			interface	= NULL;
+    CFDataRef			ipv4;
+    CFDictionaryRef		ipv6;
     int				i;
     struct {
 	CFStringRef     key;
@@ -1789,32 +1938,56 @@ get_dns_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
     };
 
     if ((state_dict == NULL) && (setup_dict == NULL)) {
-	/* there is no DNS */
+	/* there is no DNS content */
 	goto done;
     }
 
-    if (service_dict_get(serviceID, kSCEntNetIPv4) != NULL) {
+    ipv4 = (CFDataRef)service_dict_get(serviceID, kSCEntNetIPv4);
+    if (ipv4 != NULL) {
+	IPv4RouteListRef    routes;
+
 	active_protos |= kProtocolFlagsIPv4;
+
+	routes = (IPv4RouteListRef)CFDataGetBytePtr(ipv4);
+	if (routes->count > 0) {
+	    interface = CFStringCreateWithCString(NULL,
+						  routes->list[0].ifname,
+						  kCFStringEncodingASCII);
+	}
     }
-    if (service_dict_get(serviceID, kSCEntNetIPv6) != NULL) {
+
+    ipv6 = service_dict_get(serviceID, kSCEntNetIPv6);
+    if (ipv6 != NULL) {
 	active_protos |= kProtocolFlagsIPv6;
+
+	if ((interface == NULL) &&
+	    CFDictionaryGetValueIfPresent(ipv6,
+					  kSCPropInterfaceName,
+					  (const void **)&interface)) {
+		CFRetain(interface);
+	}
     }
-    /* merge DNS configuration */
-    new_dict = CFDictionaryCreateMutable(NULL, 0,
-					 &kCFTypeDictionaryKeyCallBacks,
-					 &kCFTypeDictionaryValueCallBacks);
+
     if (active_protos == kProtocolFlagsNone) {
 	/* there is no IPv4 nor IPv6 */
 	if (state_dict == NULL) {
-	    /* no DNS information at all */
+	    /* ... and no DNS content that we care about */
 	    goto done;
 	}
+	setup_dict = NULL;
+    }
+
+    /* merge DNS configuration */
+    new_dict = CFDictionaryCreateMutable(NULL, 0,
+					 &kCFTypeDictionaryKeyCallBacks,
+					 &kCFTypeDictionaryValueCallBacks);
+
+    if (active_protos == kProtocolFlagsNone) {
 	merge_dns_servers(new_dict,
 			  my_CFDictionaryGetArray(state_dict,
 						  kSCPropNetDNSServerAddresses),
 			  NULL,
 			  kProtocolFlagsIPv4 | kProtocolFlagsIPv6);
-	setup_dict = NULL;
     }
     else {
 	merge_dns_servers(new_dict,
@@ -1833,6 +2006,7 @@ get_dns_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 			 merge_list[i].flags,
 			 merge_list[i].append);
     }
+
     for (i = 0; i < sizeof(pick_list)/sizeof(pick_list[0]); i++) {
 	pick_prop(new_dict,
 		  pick_list[i],
@@ -1854,11 +2028,16 @@ get_dns_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 	    goto done;
 	}
     }
+
     if (CFDictionaryGetCount(new_dict) == 0) {
 	my_CFRelease(&new_dict);
 	goto done;
     }
 
+    if (interface != NULL) {
+	CFDictionarySetValue(new_dict, kSCPropInterfaceName, interface);
+    }
+
     if (S_append_state) {
 	/*
 	 * ensure any specified domain name (e.g. the domain returned by
@@ -1884,6 +2063,7 @@ get_dns_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
  done:
     changed = service_dict_set(serviceID, kSCEntNetDNS, new_dict);
     my_CFRelease(&new_dict);
+    my_CFRelease(&interface);
     return (changed);
 }
 
@@ -1908,13 +2088,22 @@ wpadURL_dhcp(CFDictionaryRef dhcp_options)
 
 	data = DHCPInfoGetOptionData(dhcp_options, PROXY_AUTO_DISCOVERY_URL);
 	if (data != NULL) {
-	    CFURLRef	url;
+	    CFURLRef    url;
+	    const UInt8	*urlBytes;
+	    CFIndex	urlLen;
+
+	    urlBytes = CFDataGetBytePtr(data);
+	    urlLen   = CFDataGetLength(data);
+	    while ((urlLen > 0) && (urlBytes[urlLen - 1] == 0)) {
+		// remove trailing NUL
+		urlLen--;
+	    }
 
-	    url = CFURLCreateWithBytes(NULL,
-				       CFDataGetBytePtr(data),
-				       CFDataGetLength(data),
-				       kCFStringEncodingUTF8,
-				       NULL);
+	    if (urlLen <= 0) {
+		return NULL;
+	    }
+
+	    url = CFURLCreateWithBytes(NULL, urlBytes, urlLen, kCFStringEncodingUTF8, NULL);
 	    if (url != NULL) {
 		urlString = CFURLGetString(url);
 		if (urlString != NULL) {
@@ -1950,8 +2139,20 @@ static boolean_t
 get_proxies_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 		    CFDictionaryRef setup_dict, CFDictionaryRef info)
 {
-    boolean_t			changed = FALSE;
-    CFMutableDictionaryRef	new_dict = NULL;
+    ProtocolFlags		active_protos	= kProtocolFlagsNone;
+    boolean_t			changed		= FALSE;
+    CFStringRef			interface	= NULL;
+    CFDataRef			ipv4;
+    CFDictionaryRef		ipv6;
+    CFMutableDictionaryRef	new_dict	= NULL;
+    struct {
+	CFStringRef     key;
+	uint32_t	flags;
+	Boolean		append;
+    } merge_list[] = {
+	{ kSCPropNetProxiesSupplementalMatchDomains,	ALLOW_EMPTY_STRING,	TRUE  },
+	{ kSCPropNetProxiesSupplementalMatchOrders,	0,			TRUE  },
+    };
     struct {
 	    CFStringRef	key1;	/* an "enable" key */
 	    CFStringRef	key2;
@@ -1965,18 +2166,52 @@ get_proxies_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 	    { kSCPropNetProxiesSOCKSEnable,	kSCPropNetProxiesSOCKSProxy,	kSCPropNetProxiesSOCKSPort	},
 	    { kSCPropNetProxiesProxyAutoConfigEnable,
 	      kSCPropNetProxiesProxyAutoConfigURLString,
-	      NULL, },
+	      kSCPropNetProxiesProxyAutoConfigJavaScript, },
 	    { kSCPropNetProxiesProxyAutoDiscoveryEnable,
 	      NULL,
 	      NULL, }
     };
 
-    if ((service_dict_get(serviceID, kSCEntNetIPv4) == NULL) &&
-	(service_dict_get(serviceID, kSCEntNetIPv6) == NULL)) {
-	/* there is no IPv4 nor IPv6 */
+    if ((state_dict == NULL) && (setup_dict == NULL)) {
+	/* there is no proxy content */
 	goto done;
     }
 
+    ipv4 = (CFDataRef)service_dict_get(serviceID, kSCEntNetIPv4);
+    if (ipv4 != NULL) {
+	IPv4RouteListRef    routes;
+
+	active_protos |= kProtocolFlagsIPv4;
+
+	routes = (IPv4RouteListRef)CFDataGetBytePtr(ipv4);
+	if (routes->count > 0) {
+	    interface = CFStringCreateWithCString(NULL,
+						  routes->list[0].ifname,
+						  kCFStringEncodingASCII);
+	}
+    }
+
+    ipv6 = service_dict_get(serviceID, kSCEntNetIPv6);
+    if (ipv6 != NULL) {
+	active_protos |= kProtocolFlagsIPv6;
+
+	if ((interface == NULL) &&
+	    CFDictionaryGetValueIfPresent(ipv6,
+					  kSCPropInterfaceName,
+					  (const void **)&interface)) {
+		CFRetain(interface);
+	    }
+    }
+
+    if (active_protos == kProtocolFlagsNone) {
+	/* there is no IPv4 nor IPv6 */
+	if (state_dict == NULL) {
+	    /* ... and no proxy content that we care about */
+	    goto done;
+	}
+	setup_dict = NULL;
+    }
+
     if ((setup_dict != NULL) && (state_dict != NULL)) {
 	CFIndex			i;
 	CFMutableDictionaryRef	setup_copy;
@@ -1990,6 +2225,16 @@ get_proxies_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 	 * the "Setup:" keys and others from the "State:" keys.
 	 */
 	new_dict   = CFDictionaryCreateMutableCopy(NULL, 0, state_dict);
+
+	for (i = 0; i < sizeof(merge_list)/sizeof(merge_list[0]); i++) {
+	    merge_array_prop(new_dict,
+			     merge_list[i].key,
+			     state_dict,
+			     setup_dict,
+			     merge_list[i].flags,
+			     merge_list[i].append);
+	}
+
 	setup_copy = CFDictionaryCreateMutableCopy(NULL, 0, setup_dict);
 	for (i = 0; i < sizeof(pick_list)/sizeof(pick_list[0]); i++) {
 	    if (CFDictionaryContainsKey(setup_copy, pick_list[i].key1)) {
@@ -2024,11 +2269,6 @@ get_proxies_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 	/* merge the "Setup:" keys */
 	CFDictionaryApplyFunction(setup_copy, merge_dict, new_dict);
 	CFRelease(setup_copy);
-
-	if (CFDictionaryGetCount(new_dict) == 0) {
-	    CFRelease(new_dict);
-	    new_dict = NULL;
-	}
     }
     else if (setup_dict != NULL) {
 	new_dict = CFDictionaryCreateMutableCopy(NULL, 0, setup_dict);
@@ -2037,6 +2277,15 @@ get_proxies_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 	new_dict = CFDictionaryCreateMutableCopy(NULL, 0, state_dict);
     }
 
+    if ((new_dict != NULL) && (CFDictionaryGetCount(new_dict) == 0)) {
+	CFRelease(new_dict);
+	new_dict = NULL;
+    }
+
+    if ((new_dict != NULL) && (interface != NULL)) {
+	CFDictionarySetValue(new_dict, kSCPropInterfaceName, interface);
+    }
+
     /* process WPAD */
     if (new_dict != NULL) {
 	CFDictionaryRef	dhcp_options;
@@ -2071,9 +2320,19 @@ get_proxies_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 		CFStringRef	pacURL;
 
 		pacURL = CFDictionaryGetValue(new_dict, kSCPropNetProxiesProxyAutoConfigURLString);
-		if (!isA_CFString(pacURL)) {
-		    /* if we don't like the PAC URL */
-		    pacEnabled = 0;
+		if (pacURL != NULL) {
+		    if (!isA_CFString(pacURL)) {
+			/* if we don't like the PAC URL */
+			pacEnabled = 0;
+		    }
+		} else {
+		    CFStringRef	pacJS;
+
+		    pacJS = CFDictionaryGetValue(new_dict, kSCPropNetProxiesProxyAutoConfigJavaScript);
+		    if (!isA_CFString(pacJS)) {
+			/* if we don't have (or like) the PAC JavaScript */
+			pacEnabled = 0;
+		    }
 		}
 	    }
 
@@ -2125,7 +2384,8 @@ get_proxies_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
 
  done:
     changed = service_dict_set(serviceID, kSCEntNetProxies, new_dict);
-    if (new_dict != NULL) CFRelease(new_dict);
+    my_CFRelease(&new_dict);
+    my_CFRelease(&interface);
     return (changed);
 }
 
@@ -2140,7 +2400,9 @@ get_smb_changes(CFStringRef serviceID, CFDictionaryRef state_dict,
     CFStringRef			pick_list[] = {
 	kSCPropNetSMBNetBIOSName,
 	kSCPropNetSMBNetBIOSNodeType,
+#ifdef	ADD_NETBIOS_SCOPE
 	kSCPropNetSMBNetBIOSScope,
+#endif	// ADD_NETBIOS_SCOPE
 	kSCPropNetSMBWorkgroup,
     };
 
@@ -2283,10 +2545,6 @@ services_info_copy(SCDynamicStoreRef session, CFArrayRef service_list)
     get_patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 
     CFArrayAppendValue(get_keys, S_setup_global_ipv4);
-    CFArrayAppendValue(get_keys, S_setup_global_proxies);
-#if	!TARGET_OS_IPHONE
-    CFArrayAppendValue(get_keys, S_setup_global_smb);
-#endif	/* !TARGET_OS_IPHONE */
     CFArrayAppendValue(get_keys, S_multicast_resolvers);
     CFArrayAppendValue(get_keys, S_private_resolvers);
 
@@ -2305,13 +2563,13 @@ services_info_copy(SCDynamicStoreRef session, CFArrayRef service_list)
 static int			rtm_seq = 0;
 
 static int
-ipv4_route_open_socket(void)
+route_open_socket(void)
 {
     int sockfd;
 
-    if ((sockfd = socket(PF_ROUTE, SOCK_RAW, AF_INET)) == -1) {
+    if ((sockfd = socket(PF_ROUTE, SOCK_RAW, PF_ROUTE)) == -1) {
 	SCLog(TRUE, LOG_NOTICE,
-	      CFSTR("IPMonitor: ipv4_route_open_socket: socket failed, %s"),
+	      CFSTR("IPMonitor: route_open_socket: socket failed, %s"),
 	      strerror(errno));
     }
     return (sockfd);
@@ -2468,10 +2726,8 @@ ipv6_route(int cmd, struct in6_addr gateway, struct in6_addr netaddr,
 	/* add the scope id to the link local address */
 	gateway.__u6_addr.__u6_addr16[1] = (uint16_t)htons(index);
     }
-    if ((sockfd = socket(PF_ROUTE, SOCK_RAW, AF_INET)) == -1) {
-	SCLog(TRUE, LOG_NOTICE,
-	      CFSTR("IPMonitor ipv6_route: open routing socket failed, %s"),
-	      strerror(errno));
+    sockfd = route_open_socket();
+    if (sockfd == -1) {
 	return (FALSE);
     }
     memset(&rtmsg, 0, sizeof(rtmsg));
@@ -2550,15 +2806,13 @@ ipv6_default_route_add(struct in6_addr router, char * ifname,
 		       boolean_t is_direct)
 {
     if ((S_IPMonitor_debug & kDebugFlag1) != 0) {
-	char	str[128];
-
-	str[0] = '\0';
+	char 	ntopbuf[INET6_ADDRSTRLEN];
 
-	inet_ntop(AF_INET6, &router, str, sizeof(str));
 	SCLog(TRUE, LOG_NOTICE,
 	      CFSTR("IPMonitor: IPv6 route add default"
 		    " %s interface %s direct %d"),
-	      str, ifname, is_direct);
+	      inet_ntop(AF_INET6, &router, ntopbuf, sizeof(ntopbuf)),
+	      ifname, is_direct);
     }
     return (ipv6_route(RTM_ADD, router, S_ip6_zeros, S_ip6_zeros,
 		       ifname, is_direct));
@@ -2587,6 +2841,39 @@ multicast_route_add(int sockfd)
 		       gateway, 0));
 }
 
+#ifdef RTF_IFSCOPE
+static void
+set_ipv6_default_interface(char * ifname)
+{
+    struct in6_ndifreq	ndifreq;
+    int			sock;
+
+    bzero((char *)&ndifreq, sizeof(ndifreq));
+    if (ifname != NULL) {
+	strlcpy(ndifreq.ifname, ifname, sizeof(ndifreq.ifname));
+	ndifreq.ifindex = if_nametoindex(ifname);
+    } else {
+	strlcpy(ndifreq.ifname, "lo0", sizeof(ndifreq.ifname));
+	ndifreq.ifindex = 0;
+    }
+
+    sock = inet6_dgram_socket();
+    if (sock == -1) {
+	SCLog(TRUE, LOG_ERR,
+	      CFSTR("IPMonitor: set_ipv6_default_interface: socket failed, %s"),
+	      strerror(errno));
+	return;
+    }
+    if (ioctl(sock, SIOCSDEFIFACE_IN6, (caddr_t)&ndifreq) == -1) {
+	SCLog(TRUE, LOG_ERR,
+	      CFSTR("IPMonitor: set_ipv6_default_interface: ioctl(SIOCSDEFIFACE_IN6) failed, %s"),
+	      strerror(errno));
+    }
+    close(sock);
+    return;
+}
+#endif /* RTF_IFSCOPE */
+
 static void
 set_ipv6_router(struct in6_addr * router, char * ifname, boolean_t is_direct)
 {
@@ -2628,10 +2915,6 @@ set_dns(CFArrayRef val_search_domains,
 	SCPrint(TRUE, f, CFSTR("# This file is automatically generated.\n"));
 	SCPrint(TRUE, f, CFSTR("#\n"));
 
-	if (isA_CFString(val_domain_name)) {
-	    SCPrint(TRUE, f, CFSTR("domain %@\n"), val_domain_name);
-	}
-
 	if (isA_CFArray(val_search_domains)) {
 	    SCPrint(TRUE, f, CFSTR("search"));
 	    n = CFArrayGetCount(val_search_domains);
@@ -2645,6 +2928,9 @@ set_dns(CFArrayRef val_search_domains,
 	    }
 	    SCPrint(TRUE, f, CFSTR("\n"));
 	}
+	else if (isA_CFString(val_domain_name)) {
+		SCPrint(TRUE, f, CFSTR("domain %@\n"), val_domain_name);
+	}
 
 	if (isA_CFArray(val_servers)) {
 	    n = CFArrayGetCount(val_servers);
@@ -2901,7 +3187,7 @@ update_ipv4(CFStringRef		primary,
     }
 
     bzero(&context, sizeof(context));
-    context.sockfd = ipv4_route_open_socket();
+    context.sockfd = route_open_socket();
     if (context.sockfd != -1) {
 	if ((S_IPMonitor_debug & kDebugFlag1) != 0) {
 	    if (S_ipv4_routelist == NULL) {
@@ -2954,6 +3240,7 @@ update_ipv6(CFDictionaryRef	service_info,
 	}
     }
     if (ipv6_dict != NULL) {
+	CFArrayRef		addrs;
 	CFMutableDictionaryRef	dict = NULL;
 	CFStringRef		if_name = NULL;
 	char			ifn[IFNAMSIZ] = { '\0' };
@@ -2965,16 +3252,18 @@ update_ipv6(CFDictionaryRef	service_info,
 					 &kCFTypeDictionaryKeyCallBacks,
 					 &kCFTypeDictionaryValueCallBacks);
 	val_router = CFDictionaryGetValue(ipv6_dict, kSCPropNetIPv6Router);
+	addrs = CFDictionaryGetValue(ipv6_dict,
+				     kSCPropNetIPv6Addresses);
 	if (val_router != NULL) {
-	    CFArrayRef		addrs;
-
 	    /* no router if router is one of our IP addresses */
-	    addrs = CFDictionaryGetValue(ipv6_dict,
-					 kSCPropNetIPv6Addresses);
 	    is_direct = router_is_our_ipv6_address(val_router, addrs);
 	    CFDictionarySetValue(dict, kSCPropNetIPv6Router,
 				 val_router);
 	}
+	else {
+	    val_router = CFArrayGetValueAtIndex(addrs, 0);
+	    is_direct = TRUE;
+	}
 	if_name = CFDictionaryGetValue(ipv6_dict, kSCPropInterfaceName);
 	if (if_name) {
 	    CFDictionarySetValue(dict,
@@ -2990,7 +3279,12 @@ update_ipv6(CFDictionaryRef	service_info,
 	keyChangeListSetValue(keys, S_state_global_ipv6, dict);
 	CFRelease(dict);
 
-	if (val_router != NULL) { /* route add default ... */
+#ifdef RTF_IFSCOPE
+	if (S_scopedroute_v6) {
+	    set_ipv6_default_interface(ifn_p);
+	} else
+#endif /* RTF_IFSCOPE */
+	{ /* route add default ... */
 	    struct in6_addr	router;
 
 	    (void)cfstring_to_ip6(val_router, &router);
@@ -2999,7 +3293,14 @@ update_ipv6(CFDictionaryRef	service_info,
     }
     else {
 	keyChangeListRemoveValue(keys, S_state_global_ipv6);
-	set_ipv6_router(NULL, NULL, FALSE);
+#ifdef RTF_IFSCOPE
+	if (S_scopedroute_v6) {
+	    set_ipv6_default_interface(NULL);
+	} else
+#endif /* RTF_IFSCOPE */
+	{ /* route delete default ... */
+	    set_ipv6_router(NULL, NULL, FALSE);
+	}
     }
     return;
 }
@@ -3026,13 +3327,20 @@ update_dns(CFDictionaryRef	service_info,
 	keyChangeListRemoveValue(keys, S_state_global_dns);
     }
     else {
+	CFMutableDictionaryRef	new_dict;
+
 #if	!TARGET_OS_IPHONE
 	set_dns(CFDictionaryGetValue(dict, kSCPropNetDNSSearchDomains),
 		CFDictionaryGetValue(dict, kSCPropNetDNSDomainName),
 		CFDictionaryGetValue(dict, kSCPropNetDNSServerAddresses),
 		CFDictionaryGetValue(dict, kSCPropNetDNSSortList));
 #endif	/* !TARGET_OS_IPHONE */
-	keyChangeListSetValue(keys, S_state_global_dns, dict);
+	new_dict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
+	CFDictionaryRemoveValue(new_dict, kSCPropInterfaceName);
+	CFDictionaryRemoveValue(new_dict, kSCPropNetDNSSupplementalMatchDomains);
+	CFDictionaryRemoveValue(new_dict, kSCPropNetDNSSupplementalMatchOrders);
+	keyChangeListSetValue(keys, S_state_global_dns, new_dict);
+	CFRelease(new_dict);
     }
     return;
 }
@@ -3071,9 +3379,11 @@ update_dnsinfo(CFDictionaryRef	service_info,
 static void
 update_proxies(CFDictionaryRef	service_info,
 	       CFStringRef	primary,
-	       keyChangeListRef	keys)
+	       keyChangeListRef	keys,
+	       CFArrayRef	service_order)
 {
     CFDictionaryRef dict	= NULL;
+    CFDictionaryRef new_dict;
 
     if (primary != NULL) {
 	CFDictionaryRef	service_dict;
@@ -3081,17 +3391,18 @@ update_proxies(CFDictionaryRef	service_info,
 	service_dict = CFDictionaryGetValue(S_service_state_dict, primary);
 	if (service_dict != NULL) {
 	    dict = CFDictionaryGetValue(service_dict, kSCEntNetProxies);
-	    if (dict == NULL) {
-		dict = my_CFDictionaryGetDictionary(service_info,
-						    S_setup_global_proxies);
-	    }
 	}
     }
-    if (dict == NULL) {
+
+    new_dict = proxy_configuration_update(dict,
+					  S_service_state_dict,
+					  service_order);
+    if (new_dict == NULL) {
 	keyChangeListRemoveValue(keys, S_state_global_proxies);
     }
     else {
-	keyChangeListSetValue(keys, S_state_global_proxies, dict);
+	keyChangeListSetValue(keys, S_state_global_proxies, new_dict);
+	CFRelease(new_dict);
     }
     return;
 }
@@ -3110,10 +3421,6 @@ update_smb(CFDictionaryRef	service_info,
 	service_dict = CFDictionaryGetValue(S_service_state_dict, primary);
 	if (service_dict != NULL) {
 	    dict = CFDictionaryGetValue(service_dict, kSCEntNetSMB);
-	    if (dict == NULL) {
-		dict = my_CFDictionaryGetDictionary(service_info,
-						    S_setup_global_smb);
-	    }
 	}
     }
     if (dict == NULL) {
@@ -3246,6 +3553,12 @@ elect_ipv4(void * context, election_info_t * info)
 	/* never elect as primary */
 	return (FALSE);
     }
+    if (strncmp(service_routes->list->ifname, "lo0",
+		sizeof(service_routes->list->ifname)) == 0) {
+	/* never elect as primary */
+	return (FALSE);
+    }
+
     rank_dict_set_service_rank(S_ipv4_service_rank_dict,
 			       info->serviceID, info->service_rank);
     return (TRUE);
@@ -3272,6 +3585,11 @@ elect_ipv6(void * context, election_info_t * info)
 	    return (FALSE);
 	}
     }
+    if_name = CFDictionaryGetValue(proto_dict, kSCPropInterfaceName);
+    if (if_name != NULL && CFEqual(if_name, CFSTR("lo0"))) {
+	/* never elect as primary */
+	return (FALSE);
+    }
     router = CFDictionaryGetValue(proto_dict,
 				  kSCPropNetIPv6Router);
     if (router == NULL) {
@@ -3286,9 +3604,7 @@ elect_ipv6(void * context, election_info_t * info)
 	info->service_rank = kRankFirst;
     }
     else if (S_ppp_override_primary
-	     && CFDictionaryGetValueIfPresent(proto_dict,
-					      kSCPropInterfaceName,
-					      (const void **)&if_name)
+	     && if_name != NULL
 	     && CFStringHasPrefix(if_name, CFSTR(PPP_PREFIX))) {
 	/* PPP override: make ppp* look the best */
 	/* Hack: should use interface type, not interface name */
@@ -3298,6 +3614,7 @@ elect_ipv6(void * context, election_info_t * info)
 	info->service_rank = get_service_rank(info->order, info->n_order,
 					      info->serviceID);
     }
+
     rank_dict_set_service_rank(S_ipv6_service_rank_dict,
 			       info->serviceID, info->service_rank);
     return (TRUE);
@@ -3495,6 +3812,7 @@ IPMonitorNotify(SCDynamicStoreRef session, CFArrayRef changed_keys,
     keyChangeList	keys;
     CFIndex		n;
     int			n_service_order = 0;
+    boolean_t		proxies_changed = FALSE;
     CFArrayRef		service_order;
     CFMutableArrayRef	service_changes = NULL;
     CFDictionaryRef	services_info = NULL;
@@ -3518,18 +3836,6 @@ IPMonitorNotify(SCDynamicStoreRef session, CFArrayRef changed_keys,
 	    global_ipv4_changed = TRUE;
 	    global_ipv6_changed = TRUE;
 	}
-	else if (CFEqual(change, S_setup_global_proxies)) {
-	    if (S_primary_proxies != NULL) {
-		my_CFArrayAppendUniqueValue(service_changes, S_primary_proxies);
-	    }
-	}
-#if	!TARGET_OS_IPHONE
-	else if (CFEqual(change, S_setup_global_smb)) {
-	    if (S_primary_smb != NULL) {
-		my_CFArrayAppendUniqueValue(service_changes, S_primary_smb);
-	    }
-	}
-#endif	/* !TARGET_OS_IPHONE */
 	else if (CFEqual(change, S_multicast_resolvers)) {
 	    dnsinfo_changed = TRUE;
 	}
@@ -3573,46 +3879,34 @@ IPMonitorNotify(SCDynamicStoreRef session, CFArrayRef changed_keys,
     for (i = 0; i < n; i++) {
 	uint32_t	changes;
 	CFStringRef	serviceID;
-	Boolean		wasSupplemental;
 
 	serviceID = CFArrayGetValueAtIndex(service_changes, i);
-	wasSupplemental = dns_has_supplemental(serviceID);
 	changes = service_changed(services_info, serviceID);
 	if ((changes & (1 << kEntityTypeServiceOptions)) != 0) {
 	    /* if __Service__ (e.g. PrimaryRank) changed */
 	    global_ipv4_changed = TRUE;
+	    global_ipv6_changed = TRUE;
 	}
-	else if (S_primary_ipv4 != NULL && CFEqual(S_primary_ipv4, serviceID)) {
-	    // if we are looking at the primary [IPv4] service
+	else {
 	    if ((changes & (1 << kEntityTypeIPv4)) != 0) {
-		// and something changed for THIS service
 		global_ipv4_changed = TRUE;
+		dnsinfo_changed = TRUE;
+		proxies_changed = TRUE;
 	    }
-	}
-	else if ((changes & (1 << kEntityTypeIPv4)) != 0) {
-	    global_ipv4_changed = TRUE;
-	}
-	if ((changes & (1 << kEntityTypeIPv6)) != 0) {
-	    // if we are looking at the primary [IPv6] service
-	    if (S_primary_ipv6 != NULL && CFEqual(S_primary_ipv6, serviceID)) {
-		update_ipv6(services_info, serviceID, &keys);
+	    if ((changes & (1 << kEntityTypeIPv6)) != 0) {
+		global_ipv6_changed = TRUE;
+		dnsinfo_changed = TRUE;
+		proxies_changed = TRUE;
 	    }
-	    // and something changed for THIS service
-	    global_ipv6_changed = TRUE;
 	}
 	if ((changes & (1 << kEntityTypeDNS)) != 0) {
 	    if (S_primary_dns != NULL && CFEqual(S_primary_dns, serviceID)) {
 		update_dns(services_info, serviceID, &keys);
-		dnsinfo_changed = TRUE;
-	    }
-	    else if (wasSupplemental || dns_has_supplemental(serviceID)) {
-		dnsinfo_changed = TRUE;
 	    }
+	    dnsinfo_changed = TRUE;
 	}
 	if ((changes & (1 << kEntityTypeProxies)) != 0) {
-	    if (S_primary_proxies != NULL && CFEqual(S_primary_proxies, serviceID)) {
-		update_proxies(services_info, serviceID, &keys);
-	    }
+	    proxies_changed = TRUE;
 	}
 #if	!TARGET_OS_IPHONE
 	if ((changes & (1 << kEntityTypeSMB)) != 0) {
@@ -3646,9 +3940,8 @@ IPMonitorNotify(SCDynamicStoreRef session, CFArrayRef changed_keys,
 	}
 	new_primary = elect_new_primary(&elect_ipv6, NULL,
 					service_order, n_service_order);
-	if (set_new_primary(&S_primary_ipv6, new_primary, "IPv6")) {
-	    update_ipv6(services_info, S_primary_ipv6, &keys);
-	}
+	(void)set_new_primary(&S_primary_ipv6, new_primary, "IPv6");
+	update_ipv6(services_info, S_primary_ipv6, &keys);
 	my_CFRelease(&new_primary);
     }
     if (global_ipv4_changed || global_ipv6_changed) {
@@ -3711,7 +4004,7 @@ IPMonitorNotify(SCDynamicStoreRef session, CFArrayRef changed_keys,
 	    dnsinfo_changed = TRUE;
 	}
 	if (set_new_primary(&S_primary_proxies, new_primary_proxies, "Proxies")) {
-	    update_proxies(services_info, S_primary_proxies, &keys);
+	    proxies_changed = TRUE;
 	}
 #if	!TARGET_OS_IPHONE
 	if (set_new_primary(&S_primary_smb, new_primary_smb, "SMB")) {
@@ -3722,6 +4015,9 @@ IPMonitorNotify(SCDynamicStoreRef session, CFArrayRef changed_keys,
     if (dnsinfo_changed) {
 	update_dnsinfo(services_info, S_primary_dns, &keys, service_order);
     }
+    if (proxies_changed || dnsinfo_changed) {	// note: supplemental Proxies may follow supplemental DNS
+	update_proxies(services_info, S_primary_proxies, &keys, service_order);
+    }
     my_CFRelease(&service_changes);
     my_CFRelease(&services_info);
     keyChangeListApplyToStore(&keys, session);
@@ -3744,6 +4040,10 @@ ip_plugin_init()
     if (S_is_scoped_routing_enabled() != 0) {
 	S_scopedroute = TRUE;
     }
+
+    if (S_is_scoped_v6_routing_enabled() != 0) {
+	S_scopedroute_v6 = TRUE;
+    }
 #endif /* RTF_IFSCOPE */
 
     S_session = SCDynamicStoreCreate(NULL, CFSTR("IPMonitor"),
@@ -3780,16 +4080,6 @@ ip_plugin_init()
 	= SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
 						     kSCDynamicStoreDomainSetup,
 						     kSCEntNetIPv4);
-    S_setup_global_proxies
-	= SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
-						     kSCDynamicStoreDomainSetup,
-						     kSCEntNetProxies);
-#if	!TARGET_OS_IPHONE
-    S_setup_global_smb
-	= SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
-						     kSCDynamicStoreDomainSetup,
-						     kSCEntNetSMB);
-#endif	/* !TARGET_OS_IPHONE */
     S_state_service_prefix
 	= SCDynamicStoreKeyCreate(NULL, CFSTR("%@/%@/%@/"),
 				  kSCDynamicStoreDomainState,
@@ -3917,6 +4207,7 @@ load_IPMonitor(CFBundleRef bundle, Boolean bundleVerbose)
     }
 
     dns_configuration_init(bundle);
+    proxy_configuration_init(bundle);
     ip_plugin_init();
 
 #if	!TARGET_OS_IPHONE
@@ -4401,12 +4692,12 @@ compare_callback(IPv4RouteListApplyCommand cmd, IPv4RouteRef route, void * arg)
 
     switch (cmd) {
     case kIPv4RouteListAddRouteCommand:
-	printf("Add new[%d] = ", route - context->new->list);
+	printf("Add new[%ld] = ", route - context->new->list);
 	IPv4RoutePrint(route);
 	printf("\n");
 	break;
     case kIPv4RouteListRemoveRouteCommand:
-	printf("Remove old[%d] = ", route - context->old->list);
+	printf("Remove old[%ld] = ", route - context->old->list);
 	IPv4RoutePrint(route);
 	printf("\n");
 	break;
diff --git a/Plugins/IPMonitor/proxy-configuration.c b/Plugins/IPMonitor/proxy-configuration.c
new file mode 100644
index 0000000..827b99f
--- /dev/null
+++ b/Plugins/IPMonitor/proxy-configuration.c
@@ -0,0 +1,886 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * Modification History
+ *
+ * January 3, 2011	Allan Nathanson <ajn@apple.com>
+ * - initial revision
+ */
+
+#include <TargetConditionals.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <SystemConfiguration/SystemConfiguration.h>
+#include <SystemConfiguration/SCPrivate.h>
+#include <SystemConfiguration/SCValidation.h>
+
+
+#define DEFAULT_MATCH_ORDER    200000   /* match order for the "default" proxy configuration */
+
+
+#define PROXY_MATCH_ORDER_KEY	CFSTR("__MATCH_ORDER__")
+#define ORDER_KEY		CFSTR("__ORDER__")
+
+
+static CFBooleanRef	S_proxies_follow_dns	= NULL;
+
+
+static void
+add_proxy(CFMutableArrayRef proxies, CFMutableDictionaryRef proxy)
+{
+	CFIndex		i;
+	CFIndex		n_proxies;
+	CFNumberRef	order;
+
+	n_proxies = CFArrayGetCount(proxies);
+	for (i = 0; i < n_proxies; i++) {
+		CFDictionaryRef		match_proxy;
+
+		match_proxy = CFArrayGetValueAtIndex(proxies, i);
+		if (CFEqual(proxy, match_proxy)) {
+			// a real duplicate
+			return;
+		}
+	}
+
+	order = CFNumberCreate(NULL, kCFNumberIntType, &n_proxies);
+	CFDictionarySetValue(proxy, ORDER_KEY, order);
+	CFRelease(order);
+
+	CFArrayAppendValue(proxies, proxy);
+	return;
+}
+
+
+static void
+add_supplemental(CFMutableArrayRef proxies, CFDictionaryRef proxy, uint32_t defaultOrder)
+{
+	CFArrayRef	domains;
+	CFIndex		i;
+	CFIndex		n_domains;
+	CFArrayRef	orders;
+
+	domains = CFDictionaryGetValue(proxy, kSCPropNetProxiesSupplementalMatchDomains);
+	n_domains = isA_CFArray(domains) ? CFArrayGetCount(domains) : 0;
+	if (n_domains == 0) {
+		return;
+	}
+
+	orders = CFDictionaryGetValue(proxy, kSCPropNetProxiesSupplementalMatchOrders);
+	if (orders != NULL) {
+		if (!isA_CFArray(orders) || (n_domains != CFArrayGetCount(orders))) {
+			return;
+		}
+	}
+
+	/*
+	 * yes, this is a "supplemental" proxy configuration, expand
+	 * the match domains and add each to the proxies list.
+	 */
+	for (i = 0; i < n_domains; i++) {
+		CFStringRef		match_domain;
+		CFNumberRef		match_order;
+		CFMutableDictionaryRef	match_proxy;
+
+		match_domain = CFArrayGetValueAtIndex(domains, i);
+		if (!isA_CFString(match_domain)) {
+			continue;
+		}
+
+		match_proxy = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+
+		// set supplemental proxy match "domain"
+		match_domain = _SC_trimDomain(match_domain);
+		if (match_domain != NULL) {
+			CFDictionarySetValue(match_proxy, kSCPropNetProxiesSupplementalMatchDomain, match_domain);
+			CFRelease(match_domain);
+		} else {
+			CFDictionaryRemoveValue(match_proxy, kSCPropNetProxiesSupplementalMatchDomain);
+		}
+
+		// set supplemental proxy match "order"
+		match_order = (orders != NULL) ? CFArrayGetValueAtIndex(orders, i) : NULL;
+		if (isA_CFNumber(match_order)) {
+			CFDictionarySetValue(match_proxy, PROXY_MATCH_ORDER_KEY, match_order);
+		} else {
+			CFNumberRef     num;
+
+			num = CFNumberCreate(NULL, kCFNumberIntType, &defaultOrder);
+			CFDictionarySetValue(match_proxy, PROXY_MATCH_ORDER_KEY, num);
+			CFRelease(num);
+
+			defaultOrder++;		// if multiple domains, maintain ordering
+		}
+
+		// remove keys we don't want in a supplemental proxy
+		CFDictionaryRemoveValue(match_proxy, kSCPropNetProxiesSupplementalMatchDomains);
+		CFDictionaryRemoveValue(match_proxy, kSCPropNetProxiesSupplementalMatchOrders);
+		CFDictionaryRemoveValue(match_proxy, kSCPropInterfaceName);
+
+		add_proxy(proxies, match_proxy);
+		CFRelease(match_proxy);
+	}
+
+	return;
+}
+
+
+#define	N_QUICK	32
+
+
+static void
+add_supplemental_proxies(CFMutableArrayRef proxies, CFDictionaryRef services, CFArrayRef service_order)
+{
+	const void *		keys_q[N_QUICK];
+	const void **		keys	= keys_q;
+	CFIndex			i;
+	CFIndex			n_order;
+	CFIndex			n_services;
+	const void *		vals_q[N_QUICK];
+	const void **		vals	= vals_q;
+
+	n_services = isA_CFDictionary(services) ? CFDictionaryGetCount(services) : 0;
+	if (n_services == 0) {
+		return;		// if no services
+	}
+
+	if (n_services > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) {
+		keys = CFAllocatorAllocate(NULL, n_services * sizeof(CFTypeRef), 0);
+		vals = CFAllocatorAllocate(NULL, n_services * sizeof(CFTypeRef), 0);
+	}
+
+	n_order = isA_CFArray(service_order) ? CFArrayGetCount(service_order) : 0;
+
+	CFDictionaryGetKeysAndValues(services, keys, vals);
+	for (i = 0; i < n_services; i++) {
+		uint32_t		defaultOrder;
+		CFDictionaryRef		proxy;
+		CFMutableDictionaryRef	proxyWithDNS	= NULL;
+		CFDictionaryRef		service		= (CFDictionaryRef)vals[i];
+
+		if (!isA_CFDictionary(service)) {
+			continue;
+		}
+
+		proxy = CFDictionaryGetValue(service, kSCEntNetProxies);
+		if (!isA_CFDictionary(proxy)) {
+			continue;
+		}
+
+		if ((S_proxies_follow_dns != NULL) && CFBooleanGetValue(S_proxies_follow_dns)) {
+			CFDictionaryRef	dns;
+			CFArrayRef	matchDomains;
+			CFArrayRef	matchOrders;
+
+			if (!CFDictionaryContainsKey(proxy, kSCPropNetProxiesSupplementalMatchDomains) &&
+			    CFDictionaryGetValueIfPresent(service, kSCEntNetDNS, (const void **)&dns) &&
+			    isA_CFDictionary(dns) &&
+			    CFDictionaryGetValueIfPresent(dns, kSCPropNetDNSSupplementalMatchDomains, (const void **)&matchDomains) &&
+			    isA_CFArray(matchDomains)) {
+				proxyWithDNS = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+				CFDictionarySetValue(proxyWithDNS, kSCPropNetProxiesSupplementalMatchDomains, matchDomains);
+				if (CFDictionaryGetValueIfPresent(dns, kSCPropNetDNSSupplementalMatchOrders, (const void **)&matchOrders) &&
+				    isA_CFArray(matchOrders)) {
+					CFDictionarySetValue(proxyWithDNS, kSCPropNetProxiesSupplementalMatchOrders, matchOrders);
+				} else {
+					CFDictionaryRemoveValue(proxyWithDNS, kSCPropNetProxiesSupplementalMatchOrders);
+				}
+				proxy = proxyWithDNS;
+			}
+		}
+
+		defaultOrder = DEFAULT_MATCH_ORDER
+			       - (DEFAULT_MATCH_ORDER / 2)
+			       + ((DEFAULT_MATCH_ORDER / 1000) * i);
+		if ((n_order > 0) &&
+		    !CFArrayContainsValue(service_order, CFRangeMake(0, n_order), keys[i])) {
+			// push out services not specified in service order
+			defaultOrder += (DEFAULT_MATCH_ORDER / 1000) * n_services;
+		}
+
+		add_supplemental(proxies, proxy, defaultOrder);
+		if (proxyWithDNS != NULL) CFRelease(proxyWithDNS);
+	}
+
+	if (keys != keys_q) {
+		CFAllocatorDeallocate(NULL, keys);
+		CFAllocatorDeallocate(NULL, vals);
+	}
+
+	return;
+}
+
+
+static CFComparisonResult
+compareBySearchOrder(const void *val1, const void *val2, void *context)
+{
+	CFDictionaryRef	proxy1	= (CFDictionaryRef)val1;
+	CFDictionaryRef	proxy2	= (CFDictionaryRef)val2;
+	CFNumberRef	num1;
+	CFNumberRef	num2;
+	uint32_t	order1	= DEFAULT_MATCH_ORDER;
+	uint32_t	order2	= DEFAULT_MATCH_ORDER;
+
+	num1 = CFDictionaryGetValue(proxy1, PROXY_MATCH_ORDER_KEY);
+	if (!isA_CFNumber(num1) ||
+	    !CFNumberGetValue(num1, kCFNumberIntType, &order1)) {
+		order1 = DEFAULT_MATCH_ORDER;
+	}
+
+	num2 = CFDictionaryGetValue(proxy2, PROXY_MATCH_ORDER_KEY);
+	if (!isA_CFNumber(num2) ||
+	    !CFNumberGetValue(num2, kCFNumberIntType, &order2)) {
+		order2 = DEFAULT_MATCH_ORDER;
+	}
+
+	if (order1 == order2) {
+		// if same match "order", retain original ordering for configurations
+		if (CFDictionaryGetValueIfPresent(proxy1, ORDER_KEY, (const void **)&num1) &&
+		    CFDictionaryGetValueIfPresent(proxy2, ORDER_KEY, (const void **)&num2) &&
+		    isA_CFNumber(num1) &&
+		    isA_CFNumber(num2) &&
+		    CFNumberGetValue(num1, kCFNumberIntType, &order1) &&
+		    CFNumberGetValue(num2, kCFNumberIntType, &order2)) {
+			if (order1 == order2) {
+				return kCFCompareEqualTo;
+			} else {
+				return (order1 < order2) ? kCFCompareLessThan : kCFCompareGreaterThan;
+			}
+		}
+
+		return kCFCompareEqualTo;
+	}
+
+	return (order1 < order2) ? kCFCompareLessThan : kCFCompareGreaterThan;
+}
+
+
+static __inline__ Boolean
+isSupplementalProxy(CFDictionaryRef proxy)
+{
+	if ((proxy != NULL) &&
+	    CFDictionaryContainsKey(proxy, kSCPropNetProxiesSupplementalMatchDomain)) {
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+
+static CFArrayRef
+copy_supplemental_proxies(CFArrayRef proxies, Boolean skip)
+{
+	CFIndex			i;
+	CFIndex			n_proxies;
+	CFMutableArrayRef	supplemental	= NULL;
+
+	// iterate over services
+
+	n_proxies = isA_CFArray(proxies) ? CFArrayGetCount(proxies) : 0;
+	for (i = 0; i < n_proxies; i++) {
+		CFDictionaryRef		proxy;
+
+		proxy = CFArrayGetValueAtIndex(proxies, i);
+		if (!isSupplementalProxy(proxy)) {
+			// if not supplemental proxy (i.e. no match domain)
+			continue;
+		}
+
+		// add [supplemental] proxy entry
+		if (supplemental == NULL) {
+			supplemental = CFArrayCreateMutable(NULL,
+							    0,
+							    &kCFTypeArrayCallBacks);
+		}
+		CFArrayAppendValue(supplemental, proxy);
+	}
+
+	return supplemental;
+}
+
+
+static CFDictionaryRef
+copy_scoped_proxies(CFDictionaryRef services, CFArrayRef service_order)
+{
+	const void *		keys_q[N_QUICK];
+	const void **		keys	= keys_q;
+	CFIndex			i;
+	CFIndex			n_order;
+	CFIndex			n_services;
+	CFMutableArrayRef	order;
+	CFMutableDictionaryRef	scoped	= NULL;
+
+	n_services = isA_CFDictionary(services) ? CFDictionaryGetCount(services) : 0;
+	if (n_services == 0) {
+		return NULL;		// if no services
+	}
+
+	// ensure that we process all services in order
+
+	n_order = isA_CFArray(service_order) ? CFArrayGetCount(service_order) : 0;
+	if (n_order > 0) {
+		order = CFArrayCreateMutableCopy(NULL, 0, service_order);
+	} else{
+		order = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	}
+
+	if (n_services > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) {
+		keys = CFAllocatorAllocate(NULL, n_services * sizeof(CFTypeRef), 0);
+	}
+	CFDictionaryGetKeysAndValues(services, keys, NULL);
+	for (i = 0; i < n_services; i++) {
+		CFStringRef	serviceID = (CFStringRef)keys[i];
+
+		if (!CFArrayContainsValue(order, CFRangeMake(0, n_order), serviceID)) {
+			CFArrayAppendValue(order, serviceID);
+			n_order++;
+		}
+	}
+	if (keys != keys_q) {
+		CFAllocatorDeallocate(NULL, keys);
+	}
+
+	// iterate over services
+
+	for (i = 0; i < n_order; i++) {
+		CFDictionaryRef		proxy;
+		char			if_name[IF_NAMESIZE];
+		CFStringRef		interface;
+		CFMutableDictionaryRef	newProxy;
+		CFDictionaryRef		service;
+		CFStringRef		serviceID;
+
+		serviceID = CFArrayGetValueAtIndex(order, i);
+		service = CFDictionaryGetValue(services, serviceID);
+		if (!isA_CFDictionary(service)) {
+			// if no service
+			continue;
+		}
+
+		proxy = CFDictionaryGetValue(service, kSCEntNetProxies);
+		if (!isA_CFDictionary(proxy)) {
+			// if no proxy
+			continue;
+		}
+
+		interface = CFDictionaryGetValue(proxy, kSCPropInterfaceName);
+		if (interface == NULL) {
+			// if no [scoped] interface
+			continue;
+		}
+		if ((scoped != NULL) &&
+		    CFDictionaryContainsKey(scoped, interface)) {
+			// if we've already processed this [scoped] interface
+			continue;
+		}
+
+		if ((_SC_cfstring_to_cstring(interface,
+					     if_name,
+					     sizeof(if_name),
+					     kCFStringEncodingASCII) == NULL) ||
+		    ((if_nametoindex(if_name)) == 0)) {
+			// if interface index not available
+			continue;
+		}
+
+		// add [scoped] proxy entry
+		// ... and remove keys we don't want in a [scoped] proxy
+		CFRetain(interface);
+		newProxy = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+		CFDictionaryRemoveValue(newProxy, kSCPropNetProxiesSupplementalMatchDomains);
+		CFDictionaryRemoveValue(newProxy, kSCPropNetProxiesSupplementalMatchOrders);
+		CFDictionaryRemoveValue(newProxy, kSCPropInterfaceName);
+		if (scoped == NULL) {
+			scoped = CFDictionaryCreateMutable(NULL,
+							   0,
+							   &kCFTypeDictionaryKeyCallBacks,
+							   &kCFTypeDictionaryValueCallBacks);
+		}
+		CFDictionarySetValue(scoped, interface, newProxy);
+		CFRelease(newProxy);
+		CFRelease(interface);
+	}
+
+	CFRelease(order);
+	return scoped;
+}
+
+
+static void
+add_default_proxy(CFMutableArrayRef	proxies,
+		  CFDictionaryRef	defaultProxy,
+		  Boolean		*orderAdded)
+{
+	CFMutableDictionaryRef	myDefault;
+	uint32_t		myOrder	= DEFAULT_MATCH_ORDER;
+	CFNumberRef		order	= NULL;
+
+	if (defaultProxy == NULL) {
+		myDefault = CFDictionaryCreateMutable(NULL,
+						      0,
+						      &kCFTypeDictionaryKeyCallBacks,
+						      &kCFTypeDictionaryValueCallBacks);
+	} else {
+		myDefault = CFDictionaryCreateMutableCopy(NULL, 0, defaultProxy);
+		CFDictionaryRemoveValue(myDefault, kSCPropInterfaceName);
+		order = CFDictionaryGetValue(myDefault, PROXY_MATCH_ORDER_KEY);
+	}
+
+	// ensure that the default proxy has a search order
+
+	if (!isA_CFNumber(order) ||
+	    !CFNumberGetValue(order, kCFNumberIntType, &myOrder)) {
+		myOrder = DEFAULT_MATCH_ORDER;
+		order = CFNumberCreate(NULL, kCFNumberIntType, &myOrder);
+		CFDictionarySetValue(myDefault, PROXY_MATCH_ORDER_KEY, order);
+		CFRelease(order);
+		*orderAdded = TRUE;
+	}
+
+	// add the default proxy
+
+	add_proxy(proxies, myDefault);
+	CFRelease(myDefault);
+	return;
+}
+
+
+static CFComparisonResult
+compareDomain(const void *val1, const void *val2, void *context)
+{
+	CFDictionaryRef		proxy1	= (CFDictionaryRef)val1;
+	CFDictionaryRef		proxy2	= (CFDictionaryRef)val2;
+	CFStringRef		domain1;
+	CFStringRef		domain2;
+	CFArrayRef		labels1	= NULL;
+	CFArrayRef		labels2	= NULL;
+	CFIndex			n1;
+	CFIndex			n2;
+	CFComparisonResult	result;
+	Boolean			rev1;
+	Boolean			rev2;
+
+	// "default" domains sort before "supplemental" domains
+	domain1 = CFDictionaryGetValue(proxy1, kSCPropNetProxiesSupplementalMatchDomain);
+	domain2 = CFDictionaryGetValue(proxy2, kSCPropNetProxiesSupplementalMatchDomain);
+	if (domain1 == NULL) {
+		if (domain2 == NULL) {
+			return kCFCompareEqualTo;
+		}
+		return kCFCompareLessThan;
+	} else if (domain2 == NULL) {
+		return kCFCompareGreaterThan;
+	}
+
+	// forward (A, AAAA) domains sort before reverse (PTR) domains
+	rev1 = CFStringHasSuffix(domain1, CFSTR(".arpa"));
+	rev2 = CFStringHasSuffix(domain2, CFSTR(".arpa"));
+	if (rev1 != rev2) {
+		if (rev1) {
+			return kCFCompareGreaterThan;
+		} else {
+			return kCFCompareLessThan;
+		}
+	}
+
+	labels1 = CFStringCreateArrayBySeparatingStrings(NULL, domain1, CFSTR("."));
+	n1 = CFArrayGetCount(labels1);
+
+	labels2 = CFStringCreateArrayBySeparatingStrings(NULL, domain2, CFSTR("."));
+	n2 = CFArrayGetCount(labels2);
+
+	while ((n1 > 0) && (n2 > 0)) {
+		CFStringRef	label1	= CFArrayGetValueAtIndex(labels1, --n1);
+		CFStringRef	label2	= CFArrayGetValueAtIndex(labels2, --n2);
+
+		// compare domain labels
+		result = CFStringCompare(label1, label2, kCFCompareCaseInsensitive);
+		if (result != kCFCompareEqualTo) {
+			goto done;
+		}
+	}
+
+	// longer labels (corp.apple.com) sort before shorter labels (apple.com)
+	if (n1 > n2) {
+		result = kCFCompareLessThan;
+		goto done;
+	} else if (n1 < n2) {
+		result = kCFCompareGreaterThan;
+		goto done;
+	}
+
+	// sort by search order
+	result = compareBySearchOrder(val1, val2, context);
+
+    done :
+
+	if (labels1 != NULL) CFRelease(labels1);
+	if (labels2 != NULL) CFRelease(labels2);
+	return result;
+}
+
+
+__private_extern__
+CFDictionaryRef
+proxy_configuration_update(CFDictionaryRef	defaultProxy,
+			   CFDictionaryRef	services,
+			   CFArrayRef		serviceOrder)
+{
+	CFIndex			i;
+	CFMutableDictionaryRef	myDefault;
+	Boolean			myOrderAdded	= FALSE;
+	CFMutableDictionaryRef	newProxy	= NULL;
+	CFIndex			n_proxies;
+	CFDictionaryRef		proxy;
+	CFMutableArrayRef	proxies;
+
+	SCLog(TRUE, LOG_DEBUG, CFSTR("defaultProxy : %@"), defaultProxy ? defaultProxy : (CFTypeRef)CFSTR("NULL"));
+	SCLog(TRUE, LOG_DEBUG, CFSTR("services : %@"), services ? services : (CFTypeRef)CFSTR("NULL"));
+	SCLog(TRUE, LOG_DEBUG, CFSTR("serviceOrder : %@"), serviceOrder ? serviceOrder : (CFTypeRef)CFSTR("NULL"));
+
+	// establish full list of proxies
+
+	proxies = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+
+	// collect (and add) any "supplemental" proxy configurations
+
+	add_supplemental_proxies(proxies, services, serviceOrder);
+
+	// add the "default" proxy
+
+	add_default_proxy(proxies, defaultProxy, &myOrderAdded);
+
+	// sort proxies, cleanup
+
+	n_proxies = CFArrayGetCount(proxies);
+	if (n_proxies > 1) {
+		CFArraySortValues(proxies, CFRangeMake(0, n_proxies), compareDomain, NULL);
+	}
+
+	// cleanup
+
+	for (i = n_proxies - 1; i >= 0; i--) {
+		proxy = CFArrayGetValueAtIndex(proxies, i);
+
+		if ((i > 0) &&
+		    !CFDictionaryContainsKey(proxy, kSCPropNetProxiesSupplementalMatchDomain)) {
+			// remove non-supplemental proxy
+			CFArrayRemoveValueAtIndex(proxies, i);
+			n_proxies--;
+			continue;
+		}
+
+		newProxy = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+		CFDictionaryRemoveValue(newProxy, PROXY_MATCH_ORDER_KEY);
+		CFDictionaryRemoveValue(newProxy, ORDER_KEY);
+		CFArraySetValueAtIndex(proxies, i, newProxy);
+		CFRelease(newProxy);
+	}
+
+	// update the default proxy
+
+	myDefault = CFDictionaryCreateMutableCopy(NULL,
+						  0,
+						  CFArrayGetValueAtIndex(proxies, 0));
+	if (myOrderAdded && (n_proxies > 1)) {
+		CFDictionaryRef	proxy;
+
+		proxy = CFArrayGetValueAtIndex(proxies, 1);
+		if (CFDictionaryContainsKey(proxy, kSCPropNetProxiesSupplementalMatchDomain)) {
+			// if not a supplemental "default" proxy (a match domain name is
+			// present)
+			CFDictionaryRemoveValue(myDefault, PROXY_MATCH_ORDER_KEY);
+		}
+	}
+	CFArraySetValueAtIndex(proxies, 0, myDefault);
+	CFRelease(myDefault);
+
+	// establish proxy configuration
+
+	if (n_proxies > 0) {
+		CFDictionaryRef		scoped;
+		Boolean			skip	= FALSE;
+		CFArrayRef		supplemental;
+
+		proxy = CFArrayGetValueAtIndex(proxies, 0);
+		if (!CFDictionaryContainsKey(proxy, kSCPropNetProxiesSupplementalMatchDomain)) {
+			// if we have "a" default (non-supplemental) proxy
+			newProxy = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+			CFDictionaryRemoveValue(newProxy, kSCPropNetProxiesSupplementalMatchDomains);
+			CFDictionaryRemoveValue(newProxy, kSCPropNetProxiesSupplementalMatchOrders);
+			skip = TRUE;
+		} else {
+			newProxy = CFDictionaryCreateMutable(NULL,
+							     0,
+							     &kCFTypeDictionaryKeyCallBacks,
+							     &kCFTypeDictionaryValueCallBacks);
+		}
+
+		// collect (and add) any "supplemental" proxy configurations
+
+		supplemental = copy_supplemental_proxies(proxies, skip);
+		if (supplemental != NULL) {
+			CFDictionarySetValue(newProxy, kSCPropNetProxiesSupplemental, supplemental);
+			CFRelease(supplemental);
+		}
+
+		// collect (and add) any "scoped" proxy configurations
+
+		scoped = copy_scoped_proxies(services, serviceOrder);
+		if (scoped != NULL) {
+			CFDictionarySetValue(newProxy, kSCPropNetProxiesScoped, scoped);
+			CFRelease(scoped);
+		}
+	} else {
+		newProxy = NULL;
+	}
+
+	CFRelease(proxies);
+	return newProxy;
+}
+
+
+__private_extern__
+void
+proxy_configuration_init(CFBundleRef bundle)
+{
+	CFDictionaryRef	dict;
+
+	dict = CFBundleGetInfoDictionary(bundle);
+	if (isA_CFDictionary(dict)) {
+		S_proxies_follow_dns = CFDictionaryGetValue(dict, CFSTR("SupplementalProxiesFollowSupplementalDNS"));
+		S_proxies_follow_dns = isA_CFBoolean(S_proxies_follow_dns);
+	}
+
+	return;
+}
+
+
+#ifdef	MAIN
+
+static void
+mergeDict(const void *key, const void *value, void *context)
+{
+	CFMutableDictionaryRef	newDict	= (CFMutableDictionaryRef)context;
+
+	CFDictionarySetValue(newDict, key, value);
+	return;
+}
+
+
+static void
+split(const void * key, const void * value, void * context)
+{
+	CFArrayRef		components;
+	CFStringRef		entity_id;
+	CFStringRef		service_id;
+	CFMutableDictionaryRef	state_dict;
+
+	components = CFStringCreateArrayBySeparatingStrings(NULL, (CFStringRef)key, CFSTR("/"));
+	service_id = CFArrayGetValueAtIndex(components, 3);
+	entity_id  = CFArrayGetValueAtIndex(components, 4);
+	state_dict = (CFMutableDictionaryRef)CFDictionaryGetValue(context, service_id);
+	if (state_dict != NULL) {
+		state_dict = CFDictionaryCreateMutableCopy(NULL, 0, state_dict);
+	} else {
+		state_dict = CFDictionaryCreateMutable(NULL,
+						       0,
+						       &kCFTypeDictionaryKeyCallBacks,
+						       &kCFTypeDictionaryValueCallBacks);
+	}
+
+	if (CFEqual(entity_id, kSCEntNetIPv4) ||
+	    CFEqual(entity_id, kSCEntNetIPv6)) {
+		CFStringRef	interface;
+
+		interface = CFDictionaryGetValue((CFDictionaryRef)value, kSCPropInterfaceName);
+		if (interface != NULL) {
+			CFDictionaryRef		proxy;
+			CFMutableDictionaryRef	new_proxy;
+
+			proxy = CFDictionaryGetValue(state_dict, kSCEntNetProxies);
+			if (proxy != NULL) {
+				new_proxy = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+			} else {
+				new_proxy = CFDictionaryCreateMutable(NULL,
+								0,
+								&kCFTypeDictionaryKeyCallBacks,
+								&kCFTypeDictionaryValueCallBacks);
+			}
+			CFDictionarySetValue(new_proxy, kSCPropInterfaceName, interface);
+			CFDictionarySetValue(state_dict, kSCEntNetProxies, new_proxy);
+			CFRelease(new_proxy);
+		}
+	} else if (CFEqual(entity_id, kSCEntNetProxies)) {
+		CFDictionaryRef	proxy;
+
+		proxy = CFDictionaryGetValue(state_dict, kSCEntNetProxies);
+		if (proxy != NULL) {
+			CFStringRef		domain;
+			CFMutableDictionaryRef	new_proxy;
+
+			// if we already have some Setup: or State: proxy content
+			domain = CFArrayGetValueAtIndex(components, 0);
+			if (CFEqual(domain, kSCDynamicStoreDomainState)) {
+				// if we've already seen the Setup: key
+				new_proxy = CFDictionaryCreateMutableCopy(NULL, 0, (CFDictionaryRef)value);
+				CFDictionaryApplyFunction(proxy, mergeDict, new_proxy);
+			} else {
+				// if we've already seen the State: key
+				new_proxy = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+				CFDictionaryApplyFunction((CFDictionaryRef)value, mergeDict, new_proxy);
+			}
+			CFDictionarySetValue(state_dict, kSCEntNetProxies, new_proxy);
+			CFRelease(new_proxy);
+		} else {
+			CFDictionarySetValue(state_dict, kSCEntNetProxies, (CFDictionaryRef)value);
+		}
+	} else {
+		CFDictionarySetValue(state_dict, entity_id, (CFDictionaryRef)value);
+	}
+
+	CFDictionarySetValue((CFMutableDictionaryRef)context, service_id, state_dict);
+	CFRelease(state_dict);
+	CFRelease(components);
+
+	return;
+}
+
+int
+main(int argc, char **argv)
+{
+	CFDictionaryRef		entities;
+	CFStringRef		key;
+	CFDictionaryRef		newProxy	= NULL;
+	CFStringRef		pattern;
+	CFMutableArrayRef	patterns;
+	CFStringRef		primary		= NULL;
+	CFMutableDictionaryRef	primary_proxy	= NULL;
+	CFArrayRef		service_order	= NULL;
+	CFMutableDictionaryRef	service_state_dict;
+	CFDictionaryRef		setup_global_ipv4;
+	CFDictionaryRef		state_global_ipv4;
+	SCDynamicStoreRef	store;
+
+	_sc_log     = FALSE;
+	_sc_verbose = (argc > 1) ? TRUE : FALSE;
+
+	store = SCDynamicStoreCreate(NULL, CFSTR("TEST"), NULL, NULL);
+
+	// get IPv4, IPv6, and Proxies entities
+	patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv4);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv6);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetProxies);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetProxies);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	entities = SCDynamicStoreCopyMultiple(store, NULL, patterns);
+	CFRelease(patterns);
+
+	service_state_dict = CFDictionaryCreateMutable(NULL,
+						       0,
+						       &kCFTypeDictionaryKeyCallBacks,
+						       &kCFTypeDictionaryValueCallBacks);
+	CFDictionaryApplyFunction(entities, split, service_state_dict);
+	CFRelease(entities);
+
+	// get primary service ID
+	key = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
+							 kSCDynamicStoreDomainState,
+							 kSCEntNetIPv4);
+	state_global_ipv4 = SCDynamicStoreCopyValue(store, key);
+	CFRelease(key);
+	if (state_global_ipv4 != NULL) {
+		primary = CFDictionaryGetValue(state_global_ipv4, kSCDynamicStorePropNetPrimaryService);
+		if (primary != NULL) {
+			CFDictionaryRef	service_dict;
+
+			// get proxy configuration for primary service
+			service_dict = CFDictionaryGetValue(service_state_dict, primary);
+			if (service_dict != NULL) {
+				CFDictionaryRef	service_proxy;
+
+				service_proxy = CFDictionaryGetValue(service_dict, kSCEntNetProxies);
+				if (service_proxy != NULL) {
+					primary_proxy = CFDictionaryCreateMutableCopy(NULL, 0, service_proxy);
+					CFDictionaryRemoveValue(primary_proxy, kSCPropInterfaceName);
+				}
+			}
+		}
+	}
+
+	// get serviceOrder
+	key = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
+							 kSCDynamicStoreDomainSetup,
+							 kSCEntNetIPv4);
+	setup_global_ipv4 = SCDynamicStoreCopyValue(store, key);
+	CFRelease(key);
+	if (setup_global_ipv4 != NULL) {
+		service_order = CFDictionaryGetValue(setup_global_ipv4, kSCPropNetServiceOrder);
+	}
+
+	// update proxy configuration
+	proxy_configuration_init(CFBundleGetMainBundle());
+	newProxy = proxy_configuration_update(primary_proxy,
+					      service_state_dict,
+					      service_order);
+	if (newProxy != NULL) {
+		SCPrint(TRUE, stdout, CFSTR("%@\n"), newProxy);
+		CFRelease(newProxy);
+	}
+
+	// cleanup
+	if (setup_global_ipv4 != NULL)	CFRelease(setup_global_ipv4);
+	if (state_global_ipv4 != NULL)	CFRelease(state_global_ipv4);
+	CFRelease(service_state_dict);
+	CFRelease(store);
+
+	/* not reached */
+	exit(0);
+	return 0;
+}
+#endif
+
diff --git a/SystemConfiguration.fproj/helper/helper_comm.h b/Plugins/IPMonitor/proxy-configuration.h
similarity index 72%
rename from SystemConfiguration.fproj/helper/helper_comm.h
rename to Plugins/IPMonitor/proxy-configuration.h
index 9ea23c8..c03d9e4 100644
--- a/SystemConfiguration.fproj/helper/helper_comm.h
+++ b/Plugins/IPMonitor/proxy-configuration.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -21,22 +21,23 @@
  * @APPLE_LICENSE_HEADER_END@
  */
 
-#ifndef _HELPER_COMM_H
-#define _HELPER_COMM_H
+#ifndef _PROXY_CONFIGURATION_H
+#define _PROXY_CONFIGURATION_H
 
+#include <TargetConditionals.h>
 #include <sys/cdefs.h>
 #include <CoreFoundation/CoreFoundation.h>
 
 __BEGIN_DECLS
 
-Boolean __SCHelper_txMessage(int	fd,
-			     uint32_t	msgID,
-			     CFDataRef	data);
+void		proxy_configuration_init	(CFBundleRef		bundle);
 
-Boolean __SCHelper_rxMessage(int	fd,
-			     uint32_t	*msgID,
-			     CFDataRef	*data);
+
+CFDictionaryRef	proxy_configuration_update	(CFDictionaryRef	defaultProxy,
+						 CFDictionaryRef	services,
+						 CFArrayRef		serviceOrder);
 
 __END_DECLS
 
-#endif /* _HELPER_COMM_H */
+#endif /* _PROXY_CONFIGURATION_H */
+
diff --git a/Plugins/IPMonitor/set-hostname.c b/Plugins/IPMonitor/set-hostname.c
index 41b0a0c..8d80870 100644
--- a/Plugins/IPMonitor/set-hostname.c
+++ b/Plugins/IPMonitor/set-hostname.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -441,29 +441,28 @@ getnameinfo_async_handleCFReply(CFMachPortRef port, void *msg, CFIndex size, voi
 	CFMachPortInvalidate(dnsPort);
 	CFRelease(dnsPort);
 	dnsPort = NULL;
-	__MACH_PORT_DEBUG(mp != NULL, "*** set-hostname (after unscheduling)", mp);
+	__MACH_PORT_DEBUG(mp != MACH_PORT_NULL, "*** set-hostname (after unscheduling)", mp);
 
 	status = getnameinfo_async_handle_reply(msg);
-	__MACH_PORT_DEBUG(mp != NULL, "*** set-hostname (after getnameinfo_async_handle_reply)", mp);
+	__MACH_PORT_DEBUG(mp != MACH_PORT_NULL, "*** set-hostname (after getnameinfo_async_handle_reply)", mp);
 	if ((status == 0) && dnsActive && (mp != MACH_PORT_NULL)) {
-		CFMachPortContext	context	= { 0
-						  , (void *)store
-						  , CFRetain
-						  , CFRelease
-						  , replyMPCopyDescription
-		};
+		CFMachPortContext	context		= { 0
+							  , (void *)store
+							  , CFRetain
+							  , CFRelease
+							  , replyMPCopyDescription
+							  };
 		CFRunLoopSourceRef	rls;
 
 		// if request has been re-queued
-		dnsPort = CFMachPortCreateWithPort(NULL,
-						   mp,
-						   getnameinfo_async_handleCFReply,
-						   &context,
-						   NULL);
+		dnsPort = _SC_CFMachPortCreateWithPort("IPMonitor/set-hostname/re-queue",
+						       mp,
+						       getnameinfo_async_handleCFReply,
+						       &context);
 		rls = CFMachPortCreateRunLoopSource(NULL, dnsPort, 0);
 		CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
 		CFRelease(rls);
-		__MACH_PORT_DEBUG(mp != NULL, "*** set-hostname (after rescheduling)", mp);
+		__MACH_PORT_DEBUG(mp != MACH_PORT_NULL, "*** set-hostname (after rescheduling)", mp);
 	}
 
 	return;
@@ -550,11 +549,10 @@ start_dns_query(SCDynamicStoreRef store, CFStringRef address)
 		__MACH_PORT_DEBUG(TRUE, "*** set-hostname (after getnameinfo_async_start)", mp);
 
 		dnsActive = TRUE;
-		dnsPort = CFMachPortCreateWithPort(NULL,
-						   mp,
-						   getnameinfo_async_handleCFReply,
-						   &context,
-						   NULL);
+		dnsPort = _SC_CFMachPortCreateWithPort("IPMonitor/set-hostname",
+						       mp,
+						       getnameinfo_async_handleCFReply,
+						       &context);
 		rls = CFMachPortCreateRunLoopSource(NULL, dnsPort, 0);
 		CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
 		CFRelease(rls);
diff --git a/Plugins/IPMonitor/smb-configuration.c b/Plugins/IPMonitor/smb-configuration.c
index 795dd43..3325efc 100644
--- a/Plugins/IPMonitor/smb-configuration.c
+++ b/Plugins/IPMonitor/smb-configuration.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2006-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -296,7 +296,7 @@ smb_set_configuration(SCDynamicStoreRef store, CFDictionaryRef dict)
 		// Server description
 		str = SCDynamicStoreCopyComputerName(store, &macEncoding);
 		update_pref(prefs, CFSTR(kSMBPrefServerDescription), str, &changed);
-		
+
 		// DOS code page
 		if (str != NULL) {
 			if (macEncoding == kCFStringEncodingMacRoman) {
@@ -361,10 +361,12 @@ smb_set_configuration(SCDynamicStoreRef store, CFDictionaryRef dict)
 	}
 	update_pref(prefs, CFSTR(kSMBPrefNetBIOSNodeType), str, &changed);
 
+#ifdef	ADD_NETBIOS_SCOPE
 	// NetBIOS scope
 	str = CFDictionaryGetValue(dict, kSCPropNetSMBNetBIOSScope);
 	str = isA_CFString(str);
 	update_pref(prefs, CFSTR(kSMBPrefNetBIOSScope), str, &changed);
+#endif	// ADD_NETBIOS_SCOPE
 
 	// WINS addresses
 	array = CFDictionaryGetValue(dict, kSCPropNetSMBWINSAddresses);
@@ -623,15 +625,14 @@ getnameinfo_async_handleCFReply(CFMachPortRef port, void *msg, CFIndex size, voi
 						  , CFRetain
 						  , CFRelease
 						  , replyMPCopyDescription
-		};
+						  };
 		CFRunLoopSourceRef	rls;
 
 		// if request has been re-queued
-		dnsPort = CFMachPortCreateWithPort(NULL,
-						   mp,
-						   getnameinfo_async_handleCFReply,
-						   &context,
-						   NULL);
+		dnsPort = _SC_CFMachPortCreateWithPort("IPMonitor/smb-configuration/re-queue",
+						       mp,
+						       getnameinfo_async_handleCFReply,
+						       &context);
 		rls = CFMachPortCreateRunLoopSource(NULL, dnsPort, 0);
 		CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
 		CFRelease(rls);
@@ -720,11 +721,10 @@ start_dns_query(SCDynamicStoreRef store, CFStringRef address)
 		}
 
 		dnsActive = TRUE;
-		dnsPort = CFMachPortCreateWithPort(NULL,
-						   mp,
-						   getnameinfo_async_handleCFReply,
-						   &context,
-						   NULL);
+		dnsPort = _SC_CFMachPortCreateWithPort("IPMonitor/smb-configuration",
+						       mp,
+						       getnameinfo_async_handleCFReply,
+						       &context);
 		rls = CFMachPortCreateRunLoopSource(NULL, dnsPort, 0);
 		CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
 		CFRelease(rls);
diff --git a/Plugins/InterfaceNamer/Info.plist b/Plugins/InterfaceNamer/Info.plist
index cbc99f0..2dbc4b4 100644
--- a/Plugins/InterfaceNamer/Info.plist
+++ b/Plugins/InterfaceNamer/Info.plist
@@ -17,10 +17,10 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 </dict>
 </plist>
diff --git a/Plugins/InterfaceNamer/Makefile b/Plugins/InterfaceNamer/Makefile
new file mode 100644
index 0000000..705d8af
--- /dev/null
+++ b/Plugins/InterfaceNamer/Makefile
@@ -0,0 +1,13 @@
+
+ifnamer: ifnamer.c
+	cc -Wall -g -DMAIN               -o ifnamer  ifnamer.c -framework CoreFoundation -framework SystemConfiguration -framework IOKit
+
+snapshot: ifnamer.c
+	cc -Wall -g -DTEST_SNAPSHOT      -o snapshot ifnamer.c -framework CoreFoundation -framework SystemConfiguration -framework IOKit
+
+uuid: ifnamer.c
+	cc -Wall -g -DTEST_PLATFORM_UUID -o uuid     ifnamer.c -framework CoreFoundation -framework SystemConfiguration -framework IOKit
+
+clean:
+	rm -rf ifnamer ifnamer.dSYM snapshot snapshot.dSYM uuid uuid.dSYM
+
diff --git a/Plugins/InterfaceNamer/ifnamer.c b/Plugins/InterfaceNamer/ifnamer.c
index f28450a..a0d377b 100644
--- a/Plugins/InterfaceNamer/ifnamer.c
+++ b/Plugins/InterfaceNamer/ifnamer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2001-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -62,6 +62,7 @@
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/stat.h>
+#include <sys/sysctl.h>
 #include <sys/param.h>
 #include <mach/mach.h>
 #include <net/ethernet.h>
@@ -83,8 +84,13 @@
 #include <IOKit/network/IONetworkInterface.h>
 #include <IOKit/usb/USB.h>
 
-#define kIONetworkStackUserCommand	"IONetworkStackUserCommand"
-#define kRegisterInterface		1
+// from <IOKit/network/IONetworkStack.h>
+#define kIONetworkStackUserCommand      "IONetworkStackUserCommand"
+enum {
+    kRegisterInterfaceWithFixedUnit = 0,
+    kRegisterInterface,
+    kRegisterAllInterfaces
+};
 
 #define	kSCNetworkInterfaceInfo		"SCNetworkInterfaceInfo"
 #define	kSCNetworkInterfaceType		"SCNetworkInterfaceType"
@@ -93,6 +99,9 @@
 #define MY_PLUGIN_NAME			"InterfaceNamer"
 #define	MY_PLUGIN_ID			CFSTR("com.apple.SystemConfiguration." MY_PLUGIN_NAME)
 
+#define WAIT_STACK_TIMEOUT_KEY		"WaitStackTimeout"
+#define WAIT_STACK_TIMEOUT_DEFAULT	300.0
+
 #define WAIT_QUIET_TIMEOUT_KEY		"WaitQuietTimeout"
 #define WAIT_QUIET_TIMEOUT_DEFAULT	60.0
 
@@ -129,6 +138,12 @@ static CFMutableArrayRef	S_iflist		= NULL;
  */
 static io_iterator_t		S_iter			= MACH_PORT_NULL;
 
+/*
+ * S_model
+ *   Hardware model for this network configuration.
+ */
+static CFStringRef		S_model			= NULL;
+
 /*
  * S_notify
  *   notification object for receiving IOKit notifications of
@@ -169,20 +184,30 @@ static CFMutableDictionaryRef	S_state			= NULL;
  * S_timer
  *   CFRunLoopTimer tracking how long we are willing to wait
  *   for IOKit matching to quiesce (IOKitWaitQuiet).
+ *
+ * S_stack_timeout
+ *   time to wait for the IONetworkStack object to appear before timeout
+ *
+ * S_quiet_timeout
+ *   time to wait for the IOKit to quiesce (after the IONetworkStack is
+ *   has appeared.
  */
 static CFRunLoopTimerRef	S_timer			= NULL;
+static double			S_stack_timeout		= WAIT_STACK_TIMEOUT_DEFAULT;
+static double			S_quiet_timeout		= WAIT_QUIET_TIMEOUT_DEFAULT;
+
 
-#if	!TARGET_OS_IPHONE
 /*
  * Virtual network interface configuration
- *   S_prefs : SCPreferences to configuration
- *   S_bonds : most recently actived Bond configuration
- *   S_vlans : most recently actived VLAN configuration
+ *   S_prefs   : SCPreferences to configuration
+ *   S_bonds   : most recently actived Bond configuration
+ *   S_bridges : most recently actived Bridge configuration
+ *   S_vlans   : most recently actived VLAN configuration
  */
 static SCPreferencesRef		S_prefs			= NULL;
 static CFArrayRef		S_bonds			= NULL;
+static CFArrayRef		S_bridges		= NULL;
 static CFArrayRef		S_vlans			= NULL;
-#endif	/* !TARGET_OS_IPHONE */
 
 static void
 addTimestamp(CFMutableDictionaryRef dict, CFStringRef key)
@@ -197,6 +222,35 @@ addTimestamp(CFMutableDictionaryRef dict, CFStringRef key)
     return;
 }
 
+#define	INTERFACES			CFSTR("Interfaces")
+#define	MODEL				CFSTR("Model")
+#define	NETWORK_INTERFACES_PREFS	CFSTR("NetworkInterfaces.plist")
+
+static CFStringRef
+hw_model()
+{
+    if (S_model == NULL) {
+	char	hwModel[64];
+	int	mib[]		= { CTL_HW, HW_MODEL };
+	size_t	n		= sizeof(hwModel);
+	int	ret;
+
+	// get HW model name
+	bzero(&hwModel, sizeof(hwModel));
+	ret = sysctl(mib, sizeof(mib) / sizeof(mib[0]), &hwModel, &n, NULL, 0);
+	if (ret != 0) {
+	    SCLog(TRUE, LOG_ERR, CFSTR("sysctl() CTL_HW/HW_MODEL failed: %s"), strerror(errno));
+	    return NULL;
+	}
+	hwModel[sizeof(hwModel) - 1] = '\0';
+
+	S_model = CFStringCreateWithCString(NULL, hwModel, kCFStringEncodingASCII);
+    }
+
+    return S_model;
+
+}
+
 static CFComparisonResult
 if_unit_compare(const void *val1, const void *val2, void *context)
 {
@@ -221,90 +275,27 @@ if_unit_compare(const void *val1, const void *val2, void *context)
     return (CFNumberCompare(unit1, unit2, NULL));
 }
 
-static void *
-read_file(char * filename, size_t * data_length)
+static void
+reportIssue(const char *signature, CFStringRef issue)
 {
-    void *		data	= NULL;
-    size_t		len	= 0;
-    int			fd	= -1;
-    struct stat		sb;
+    aslmsg  m;
 
-    *data_length = 0;
-    if (stat(filename, &sb) == -1)
-	goto done;
-    len = sb.st_size;
-    if (len == 0)
-	goto done;
-
-    data = malloc(len);
-    if (data == NULL)
-	goto done;
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, "com.apple.message.domain", "com.apple.SystemConfiguration." MY_PLUGIN_NAME);
+    asl_set(m, "com.apple.message.signature", signature);
+    asl_set(m, "com.apple.message.result", "failure");
+    SCLOG(NULL, m, ~ASL_LEVEL_ERR, CFSTR("%s\n%@"), signature, issue);
+    asl_free(m);
 
-    fd = open(filename, O_RDONLY);
-    if (fd == -1)
-	goto done;
-
-    if (read(fd, data, len) != len) {
-	SCLog(TRUE, LOG_ERR,
-	      CFSTR(MY_PLUGIN_NAME ": read %s failed, %s"),
-	      filename, strerror(errno));
-	goto done;
-    }
-
- done:
-    if (fd != -1)
-	close(fd);
-    if (data) {
-	*data_length = len;
-    }
-    return (data);
-}
-
-static CFPropertyListRef
-readPropertyList(char * filename)
-{
-    void *		buf;
-    size_t		bufsize;
-    CFDataRef		data		= NULL;
-    CFPropertyListRef	plist		= NULL;
-    CFStringRef		errorString	= NULL;
-
-    buf = read_file(filename, &bufsize);
-    if (buf == NULL) {
-	return (NULL);
-    }
-    data = CFDataCreate(NULL, buf, bufsize);
-    if (data == NULL) {
-	goto error;
-    }
-
-    plist = CFPropertyListCreateFromXMLData(NULL, data,
-					    kCFPropertyListMutableContainers,
-					    &errorString);
-    if (plist == NULL) {
-	if (errorString != NULL) {
-	    SCLog(TRUE, LOG_ERR,
-		  CFSTR(MY_PLUGIN_NAME ": %@"),
-		  errorString);
-	    CFRelease(errorString);
-	}
-    }
- error:
-    if (data)
-	CFRelease(data);
-    if (buf)
-	free(buf);
-    return (plist);
+    return;
 }
 
-#define	INTERFACES			CFSTR("Interfaces")
-#define	NETWORK_INTERFACES_PREFS	CFSTR("NetworkInterfaces.plist")
-#define	OLD_NETWORK_INTERFACES_FILE	"/var/db/NetworkInterfaces.xml"
-
 static void
 writeInterfaceList(CFArrayRef if_list)
 {
     CFArrayRef		cur_list;
+    CFStringRef		new_model;
+    CFStringRef		old_model;
     SCPreferencesRef	prefs;
 
     if (isA_CFArray(if_list) == NULL) {
@@ -324,6 +315,46 @@ writeInterfaceList(CFArrayRef if_list)
 	goto done;
     }
 
+    old_model = SCPreferencesGetValue(prefs, MODEL);
+    new_model = hw_model();
+    if ((old_model != NULL) &&
+	(new_model != NULL) &&
+	!CFEqual(old_model, new_model) &&
+	(cur_list != NULL)) {
+	CFStringRef history;
+	CFStringRef issue;
+
+	// if interface list was created on other hardware
+	history = CFStringCreateWithFormat(NULL, NULL,
+					   CFSTR("%@:%@"),
+					   INTERFACES,
+					   old_model);
+	SCPreferencesSetValue(prefs, history, cur_list);
+	CFRelease(history);
+
+	SCLog(TRUE, LOG_ERR,
+	      CFSTR(MY_PLUGIN_NAME ": Hardware model changed\n"
+		    MY_PLUGIN_NAME ":   created on \"%@\"\n"
+		    MY_PLUGIN_NAME ":   now on     \"%@\""),
+	      old_model,
+	      new_model);
+
+	issue = CFStringCreateWithFormat(NULL, NULL,
+					 CFSTR("%@ --> %@"),
+					 old_model,
+					 new_model);
+	reportIssue("Hardware model changed", issue);
+	CFRelease(issue);
+    }
+
+    if ((new_model != NULL) &&
+	!SCPreferencesSetValue(prefs, MODEL, new_model)) {
+	SCLog(TRUE, LOG_ERR,
+	      CFSTR(MY_PLUGIN_NAME ": SCPreferencesSetValue failed, %s"),
+	      SCErrorString(SCError()));
+	goto done;
+    }
+
     if (!SCPreferencesSetValue(prefs, INTERFACES, if_list)) {
 	SCLog(TRUE, LOG_ERR,
 	      CFSTR(MY_PLUGIN_NAME ": SCPreferencesSetValue failed, %s"),
@@ -348,8 +379,9 @@ static CFMutableArrayRef
 readInterfaceList()
 {
     CFArrayRef		if_list;
-    CFMutableArrayRef 	plist = NULL;
-    SCPreferencesRef	prefs = NULL;
+    CFStringRef		old_model;
+    CFMutableArrayRef 	plist	= NULL;
+    SCPreferencesRef	prefs	= NULL;
 
     prefs = SCPreferencesCreate(NULL, MY_PLUGIN_ID, NETWORK_INTERFACES_PREFS);
     if (!prefs) {
@@ -360,21 +392,19 @@ readInterfaceList()
     }
 
     if_list = SCPreferencesGetValue(prefs, INTERFACES);
-    if (!isA_CFArray(if_list)) {
-	if_list = (CFArrayRef)readPropertyList(OLD_NETWORK_INTERFACES_FILE);
-	if (if_list == NULL) {
-	    goto done;
-	}
-	if (!isA_CFArray(if_list)) {
-	    CFRelease(if_list);
+    if_list = isA_CFArray(if_list);
+
+    old_model = SCPreferencesGetValue(prefs, MODEL);
+    if (old_model != NULL) {
+	CFStringRef new_model;
+
+	new_model = hw_model();
+	if (!_SC_CFEqual(old_model, new_model)) {
+	    // if interface list was created on other hardware
 	    if_list = NULL;
-	    goto done;
 	}
-	writeInterfaceList(if_list);
-	(void)unlink(OLD_NETWORK_INTERFACES_FILE);
     }
 
-  done:
     if (if_list != NULL) {
 	CFIndex	i;
 	CFIndex	n	= CFArrayGetCount(if_list);
@@ -392,7 +422,8 @@ readInterfaceList()
 	    }
 	}
     }
-    if (prefs) {
+
+    if (prefs != NULL) {
 	CFRelease(prefs);
     }
     return (plist);
@@ -450,66 +481,81 @@ updateStore(void)
     return;
 }
 
-#if	!TARGET_OS_IPHONE
 static void
-updateVirtualNetworkInterfaceConfiguration(SCPreferencesRef		prefs,
-					   SCPreferencesNotification   notificationType,
-					   void				*info)
+updateBondInterfaceConfiguration(SCPreferencesRef prefs)
 {
     CFArrayRef	interfaces;
 
-    if ((notificationType & kSCPreferencesNotificationApply) != kSCPreferencesNotificationApply) {
+    interfaces = SCBondInterfaceCopyAll(prefs);
+    if ((interfaces != NULL) && (CFArrayGetCount(interfaces) == 0)) {
+	CFRelease(interfaces);
+	interfaces = NULL;
+    }
+
+    if (_SC_CFEqual(S_bonds, interfaces)) {
+	// if no change
+	if (interfaces != NULL) CFRelease(interfaces);
 	return;
     }
 
-    if (prefs == NULL) {
-	// if a new interface has been "named"
-	prefs = S_prefs;
-	if (S_bonds != NULL) {
-	    CFRelease(S_bonds);
-	    S_bonds = NULL;
-	}
-	if (S_vlans != NULL) {
-	    CFRelease(S_vlans);
-	    S_vlans = NULL;
-	}
+    if (S_bonds != NULL) CFRelease(S_bonds);
+    S_bonds = interfaces;
+
+    if (!_SCBondInterfaceUpdateConfiguration(prefs)) {
+	SCLog(TRUE, LOG_ERR,
+	      CFSTR(MY_PLUGIN_NAME ": _SCBondInterfaceUpdateConfiguration failed, %s"),
+	      SCErrorString(SCError()));
     }
 
-    // update Bond configuration
+    return;
+}
 
-    interfaces = SCBondInterfaceCopyAll(prefs);
-    if ((S_bonds == NULL) && (interfaces == NULL)) {
-	// if no change
-	goto vlan;
+static void
+updateBridgeInterfaceConfiguration(SCPreferencesRef prefs)
+{
+    CFArrayRef	interfaces;
+
+    interfaces = SCBridgeInterfaceCopyAll(prefs);
+    if ((interfaces != NULL) && (CFArrayGetCount(interfaces) == 0)) {
+	CFRelease(interfaces);
+	interfaces = NULL;
     }
-    if ((S_bonds != NULL) && (interfaces != NULL) && CFEqual(S_bonds, interfaces)) {
+
+    if (_SC_CFEqual(S_bridges, interfaces)) {
 	// if no change
-	CFRelease(interfaces);
-	goto vlan;
+	if (interfaces != NULL) CFRelease(interfaces);
+	return;
     }
-    if (S_bonds != NULL) CFRelease(S_bonds);
-    S_bonds = interfaces;
 
-    if (!_SCBondInterfaceUpdateConfiguration(prefs)) {
+    if (S_bridges != NULL) CFRelease(S_bridges);
+    S_bridges = interfaces;
+
+    if (!_SCBridgeInterfaceUpdateConfiguration(prefs)) {
 	SCLog(TRUE, LOG_ERR,
-	      CFSTR(MY_PLUGIN_NAME ": _SCBondInterfaceUpdateConfiguration failed, %s"),
+	      CFSTR(MY_PLUGIN_NAME ": _SCBridgeInterfaceUpdateConfiguration failed, %s"),
 	      SCErrorString(SCError()));
     }
 
-  vlan :
+    return;
+}
 
-    // update VLAN configuration
+static void
+updateVLANInterfaceConfiguration(SCPreferencesRef prefs)
+{
+    CFArrayRef	interfaces;
 
     interfaces = SCVLANInterfaceCopyAll(prefs);
-    if ((S_vlans == NULL) && (interfaces == NULL)) {
-	// if no change
-	goto done;
+    if ((interfaces != NULL) && (CFArrayGetCount(interfaces) == 0)) {
+	CFRelease(interfaces);
+	interfaces = NULL;
     }
-    if ((S_vlans != NULL) && (interfaces != NULL) && CFEqual(S_vlans, interfaces)) {
+
+    if (_SC_CFEqual(S_vlans, interfaces)) {
 	// if no change
-	CFRelease(interfaces);
-	goto done;
+	if (interfaces != NULL) CFRelease(interfaces);
+	return;
     }
+
     if (S_vlans != NULL) CFRelease(S_vlans);
     S_vlans = interfaces;
 
@@ -519,14 +565,43 @@ updateVirtualNetworkInterfaceConfiguration(SCPreferencesRef		prefs,
 	      SCErrorString(SCError()));
     }
 
-  done :
+    return;
+}
 
-    // we are finished with current prefs, wait for changes
+static void
+updateVirtualNetworkInterfaceConfiguration(SCPreferencesRef		prefs,
+					   SCPreferencesNotification   notificationType,
+					   void				*info)
+{
+    if ((notificationType & kSCPreferencesNotificationApply) != kSCPreferencesNotificationApply) {
+	return;
+    }
 
+    if (prefs == NULL) {
+	// if a new interface has been "named"
+	prefs = S_prefs;
+	if (S_bonds != NULL) {
+	    CFRelease(S_bonds);
+	    S_bonds = NULL;
+	}
+	if (S_bridges != NULL) {
+	    CFRelease(S_bridges);
+	    S_bridges = NULL;
+	}
+	if (S_vlans != NULL) {
+	    CFRelease(S_vlans);
+	    S_vlans = NULL;
+	}
+    }
+
+    updateBondInterfaceConfiguration  (prefs);
+    updateBridgeInterfaceConfiguration(prefs);
+    updateVLANInterfaceConfiguration  (prefs);
+
+    // we are finished with current prefs, wait for changes
     SCPreferencesSynchronize(prefs);
     return;
 }
-#endif	/* !TARGET_OS_IPHONE */
 
 static CFDictionaryRef
 createInterfaceDict(SCNetworkInterfaceRef interface)
@@ -958,21 +1033,36 @@ insertInterface(CFMutableArrayRef db_list, SCNetworkInterfaceRef interface)
 static void
 replaceInterface(SCNetworkInterfaceRef interface)
 {
-    CFIndex where;
+    int		n	= 0;
+    CFIndex	where;
 
     if (S_dblist == NULL) {
 	S_dblist = CFArrayCreateMutable(NULL, 0,
 					&kCFTypeArrayCallBacks);
     }
     // remove any dict that has our type/addr
-    if (lookupInterfaceByAddress(S_dblist, interface, &where) != NULL) {
+    while (lookupInterfaceByAddress(S_dblist, interface, &where) != NULL) {
 	CFArrayRemoveValueAtIndex(S_dblist, where);
+	n++;
     }
     // remove any dict that has the same type/unit
-    if (lookupInterfaceByUnit(S_dblist, interface, &where) != NULL) {
+    while (lookupInterfaceByUnit(S_dblist, interface, &where) != NULL) {
 	CFArrayRemoveValueAtIndex(S_dblist, where);
+	n++;
     }
     insertInterface(S_dblist, interface);
+
+    if (n > 1) {
+	CFStringRef	issue;
+
+	issue = CFStringCreateWithFormat(NULL, NULL,
+					 CFSTR("n = %d, %@"),
+					 n,
+					 interface);
+	reportIssue("Multiple interfaces updated", issue);
+	CFRelease(issue);
+    }
+
     return;
 }
 
@@ -1017,9 +1107,9 @@ getHighestUnitForType(CFNumberRef if_type)
 static kern_return_t
 registerInterface(io_connect_t	connect,
 		  CFStringRef	path,
-		  CFNumberRef	unit)
+		  CFNumberRef	unit,
+		  const int	command)
 {
-    static const int		command	= kRegisterInterface;
     CFMutableDictionaryRef	dict;
     kern_return_t		kr;
     CFNumberRef			num;
@@ -1049,7 +1139,7 @@ lookupIOKitPath(CFStringRef if_path)
     kr = IOMasterPort(bootstrap_port, &masterPort);
     if (kr != KERN_SUCCESS) {
 	SCLog(TRUE, LOG_ERR,
-	      CFSTR(MY_PLUGIN_NAME ": IOMasterPort returned 0x%x\n"),
+	      CFSTR(MY_PLUGIN_NAME ": IOMasterPort returned 0x%x"),
 	      kr);
 	goto error;
     }
@@ -1136,6 +1226,7 @@ nameInterfaces(CFMutableArrayRef if_list)
 
     for (i = 0; i < n; i++) {
 	SCNetworkInterfaceRef	interface;
+	Boolean			ok	= TRUE;
 	CFStringRef		path;
 	CFNumberRef		type;
 	CFNumberRef		unit;
@@ -1240,18 +1331,40 @@ nameInterfaces(CFMutableArrayRef if_list)
 		      is_builtin ? "built-in" : "next available");
 	    }
 
-	    kr = registerInterface(S_connect, path, unit);
+	    kr = registerInterface(S_connect,
+				   path,
+				   unit,
+				   (dbdict == NULL) ? kRegisterInterface : kRegisterInterfaceWithFixedUnit);
 	    if (kr != KERN_SUCCESS) {
+		CFStringRef issue;
+		const char  *signature;
+
+		signature = (dbdict == NULL) ? "failed to name new interface"
+					     : "failed to name known interface";
+
 		SCLog(TRUE, LOG_ERR,
-		      CFSTR(MY_PLUGIN_NAME ": failed to name the interface, kr=0x%x\n"
+		      CFSTR(MY_PLUGIN_NAME ": %s, kr=0x%x\n"
 			    MY_PLUGIN_NAME ":   path = %@\n"
 			    MY_PLUGIN_NAME ":   unit = %@"),
+		      signature,
 		      kr,
 		      path,
 		      unit);
+
 		if (S_debug) {
 		    displayInterface(interface);
 		}
+
+		// report issue w/MessageTracer
+		issue = CFStringCreateWithFormat(NULL, NULL,
+						 CFSTR("kr=0x%x, path=%@, unit=%@"),
+						 kr,
+						 path,
+						 unit);
+		reportIssue(signature, issue);
+		CFRelease(issue);
+
+		ok = FALSE;	// ... and don't update the database
 	    } else {
 		SCNetworkInterfaceRef	new_interface;
 
@@ -1293,7 +1406,9 @@ nameInterfaces(CFMutableArrayRef if_list)
 	}
 
 	// update db
-	replaceInterface(interface);
+	if (ok) {
+	    replaceInterface(interface);
+	}
     }
     return;
 }
@@ -1326,9 +1441,7 @@ updateInterfaces()
 	 *   in the HW config (or have yet to show up).
 	 */
 	writeInterfaceList(S_dblist);
-#if	!TARGET_OS_IPHONE
 	updateVirtualNetworkInterfaceConfiguration(NULL, kSCPreferencesNotificationApply, NULL);
-#endif	/* !TARGET_OS_IPHONE */
 	updateStore();
 
 	if (S_iflist != NULL) {
@@ -1585,6 +1698,14 @@ stackCallback(void *refcon, io_iterator_t iter)
 	S_stack = MACH_PORT_NULL;
     }
 
+    if ((S_timer != NULL) && CFRunLoopTimerIsValid(S_timer)) {
+	// With the IONetworkStack object now available we can
+	// reset (shorten?) the time we are willing to wait for
+	// IOKit to quiesce.
+	CFRunLoopTimerSetNextFireDate(S_timer,
+				      CFAbsoluteTimeGetCurrent() + S_quiet_timeout);
+    }
+
     updateInterfaces();
 
  error:
@@ -1638,17 +1759,19 @@ quietCallback(void		*refcon,
 }
 
 static void
-iterateRegistryBusy(io_iterator_t iterator, CFArrayRef nodes, int *count)
+iterateRegistryBusy(io_iterator_t iterator, CFArrayRef nodes, CFMutableStringRef snapshot, int *count)
 {
     kern_return_t	kr  = kIOReturnSuccess;;
     io_object_t		obj;
 
     while ((kr == kIOReturnSuccess) &&
 	   ((obj = IOIteratorNext(iterator)) != MACH_PORT_NULL)) {
-	uint32_t		busy;
+	uint64_t		accumulated_busy_time;
+	uint32_t		busy_state;
 	io_name_t		location;
 	io_name_t		name;
 	CFMutableArrayRef	newNodes;
+	uint64_t		state;
 	CFMutableStringRef	str	= NULL;
 
 	if (nodes == NULL) {
@@ -1660,7 +1783,7 @@ iterateRegistryBusy(io_iterator_t iterator, CFArrayRef nodes, int *count)
 	kr = IORegistryEntryGetName(obj, name);
 	if (kr != kIOReturnSuccess) {
 	    SCLog(TRUE, LOG_ERR,
-		  CFSTR(MY_PLUGIN_NAME ": reportBusy IORegistryEntryGetName returned 0x%x"),
+		  CFSTR(MY_PLUGIN_NAME ": captureBusy IORegistryEntryGetName returned 0x%x"),
 		  kr);
 	    goto next;
 	}
@@ -1678,7 +1801,7 @@ iterateRegistryBusy(io_iterator_t iterator, CFArrayRef nodes, int *count)
 		break;
 	    default :
 		SCLog(TRUE, LOG_ERR,
-		      CFSTR(MY_PLUGIN_NAME ": reportBusy IORegistryEntryGetLocationInPlane returned 0x%x"),
+		      CFSTR(MY_PLUGIN_NAME ": captureBusy IORegistryEntryGetLocationInPlane returned 0x%x"),
 		      kr);
 		CFRelease(str);
 		goto next;
@@ -1687,40 +1810,51 @@ iterateRegistryBusy(io_iterator_t iterator, CFArrayRef nodes, int *count)
 	CFArrayAppendValue(newNodes, str);
 	CFRelease(str);
 
-	kr = IOServiceGetBusyState(obj, &busy);
+	kr = IOServiceGetBusyStateAndTime(obj, &state, &busy_state, &accumulated_busy_time);
 	if (kr != kIOReturnSuccess) {
 	    SCLog(TRUE, LOG_ERR,
-		  CFSTR(MY_PLUGIN_NAME ": reportBusy IOServiceGetBusyState returned 0x%x"),
+		  CFSTR(MY_PLUGIN_NAME ": captureBusy IOServiceGetBusyStateAndTime returned 0x%x"),
 		  kr);
 	    goto next;
 	}
 
-	if (busy != 0) {
+#ifdef	TEST_SNAPSHOT
+	// report all nodes
+	busy_state = 1;
+#endif	// TEST_SNAPSHOT
+
+	if (busy_state != 0) {
 	    CFStringRef	path;
 
 	    if ((*count)++ == 0) {
-		SCLog(TRUE, LOG_WARNING, CFSTR(MY_PLUGIN_NAME ": Busy services :"));
+		CFStringAppend(snapshot, CFSTR("Busy services :"));
 	    }
 
 	    path = CFStringCreateByCombiningStrings(NULL, newNodes, CFSTR("/"));
-	    SCLog(TRUE, LOG_WARNING, CFSTR(MY_PLUGIN_NAME ":   %@ [%d]"), path, busy);
+	    CFStringAppendFormat(snapshot, NULL,
+				 CFSTR("\n  %@ [%s%s%s%d, %lld ms]"),
+				 path,
+				 (state & kIOServiceRegisteredState) ? "" : "!registered, ",
+				 (state & kIOServiceMatchedState)    ? "" : "!matched, ",
+				 (state & kIOServiceInactiveState)   ? "inactive, " : "",
+				 accumulated_busy_time / kMillisecondScale);
 	    CFRelease(path);
 	}
 
 	kr = IORegistryIteratorEnterEntry(iterator);
 	if (kr != kIOReturnSuccess) {
 	    SCLog(TRUE, LOG_ERR,
-		  CFSTR(MY_PLUGIN_NAME ": reportBusy IORegistryIteratorEnterEntry returned 0x%x"),
+		  CFSTR(MY_PLUGIN_NAME ": captureBusy IORegistryIteratorEnterEntry returned 0x%x"),
 		  kr);
 	    goto next;
 	}
 
-	iterateRegistryBusy(iterator, newNodes, count);
+	iterateRegistryBusy(iterator, newNodes, snapshot, count);
 
 	kr = IORegistryIteratorExitEntry(iterator);
 	if (kr != kIOReturnSuccess) {
 	    SCLog(TRUE, LOG_ERR,
-		  CFSTR(MY_PLUGIN_NAME ": reportBusy IORegistryIteratorExitEntry returned 0x%x"),
+		  CFSTR(MY_PLUGIN_NAME ": captureBusy IORegistryIteratorExitEntry returned 0x%x"),
 		  kr);
 	}
 
@@ -1733,12 +1867,15 @@ iterateRegistryBusy(io_iterator_t iterator, CFArrayRef nodes, int *count)
     return;
 }
 
-static void
-reportBusy()
+static CFStringRef
+captureBusy()
 {
     int			count		= 0;
     io_iterator_t	iterator	= MACH_PORT_NULL;
     kern_return_t	kr;
+    CFMutableStringRef	snapshot;
+
+    snapshot = CFStringCreateMutable(NULL, 0);
 
     kr = IORegistryCreateIterator(kIOMasterPortDefault,
 				  kIOServicePlane,
@@ -1746,30 +1883,37 @@ reportBusy()
 				  &iterator);
     if (kr != kIOReturnSuccess) {
 	SCLog(TRUE, LOG_ERR,
-	      CFSTR(MY_PLUGIN_NAME ": reportBusy IORegistryCreateIterator returned 0x%x"),
+	      CFSTR(MY_PLUGIN_NAME ": captureBusy IORegistryCreateIterator returned 0x%x"),
 	      kr);
-	return;
+	return snapshot;
+    }
+
+    iterateRegistryBusy(iterator, NULL, snapshot, &count);
+    if (count == 0) {
+	CFStringAppend(snapshot, CFSTR("w/no busy services"));
     }
 
-    iterateRegistryBusy(iterator, NULL, &count);
-    SCLog((count == 0), LOG_WARNING,
-	  CFSTR(MY_PLUGIN_NAME ":   w/no busy services"));
     IOObjectRelease(iterator);
-    return;
+    return snapshot;
 }
 
 static void
 timerCallback(CFRunLoopTimerRef	timer, void *info)
 {
-    /*
-     * We've been waiting for IOKit to quiesce and it just
-     * hasn't happenned.  Time to just move on!
-     */
+    CFStringRef	snapshot;
+
+    // We've been waiting for IOKit to quiesce and it just
+    // hasn't happenned.  Time to just move on!
     addTimestamp(S_state, CFSTR("*TIMEOUT*"));
+
+    // log busy nodes
+    snapshot = captureBusy();
     SCLog(TRUE, LOG_ERR,
-	  CFSTR(MY_PLUGIN_NAME ": timed out waiting for IOKit to quiesce"));
+	  CFSTR(MY_PLUGIN_NAME ": timed out waiting for IOKit to quiesce\n%@"),
+	  snapshot);
+    reportIssue("timed out waiting for IOKit to quiesce", snapshot);
+    CFRelease(snapshot);
 
-    reportBusy();
     quietCallback((void *)S_notify, MACH_PORT_NULL, 0, NULL);
     return;
 }
@@ -1778,12 +1922,10 @@ static Boolean
 setup_IOKit(CFBundleRef bundle)
 {
     uint32_t		busy;
-    CFDictionaryRef	dict;
     kern_return_t	kr;
     mach_port_t		masterPort	= MACH_PORT_NULL;
     Boolean		ok		= FALSE;
     io_object_t		root		= MACH_PORT_NULL;
-    double		timeout		= WAIT_QUIET_TIMEOUT_DEFAULT;
 
     // read DB of previously named network interfaces
     S_dblist = readInterfaceList();
@@ -1853,23 +1995,8 @@ setup_IOKit(CFBundleRef bundle)
     }
 
     // add a timer so we don't wait forever for IOKit to quiesce
-    dict = CFBundleGetInfoDictionary(bundle);
-    if (isA_CFDictionary(dict)) {
-	CFNumberRef	num;
-
-	num = CFDictionaryGetValue(dict, CFSTR(WAIT_QUIET_TIMEOUT_KEY));
-	if (num != NULL) {
-	    if (!isA_CFNumber(num) ||
-		!CFNumberGetValue(num, kCFNumberDoubleType, &timeout) ||
-		(timeout <= 0.0)) {
-		SCLog(TRUE, LOG_ERR,
-		      CFSTR(MY_PLUGIN_NAME ": " WAIT_QUIET_TIMEOUT_KEY " value error"));
-		timeout = WAIT_QUIET_TIMEOUT_DEFAULT;
-	    }
-	}
-    }
     S_timer = CFRunLoopTimerCreate(NULL,
-				   CFAbsoluteTimeGetCurrent() + timeout,
+				   CFAbsoluteTimeGetCurrent() + S_stack_timeout,
 				   0,
 				   0,
 				   0,
@@ -1960,7 +2087,6 @@ setup_IOKit(CFBundleRef bundle)
     return ok;
 }
 
-#if	!TARGET_OS_IPHONE
 static Boolean
 setup_Virtual(CFBundleRef bundle)
 {
@@ -1995,29 +2121,55 @@ setup_Virtual(CFBundleRef bundle)
 
     return TRUE;
 }
-#endif	/* !TARGET_OS_IPHONE */
 
-__private_extern__
-void
-load_InterfaceNamer(CFBundleRef bundle, Boolean bundleVerbose)
+static void *
+exec_InterfaceNamer(void *arg)
 {
-    if (bundleVerbose) {
-	S_debug = TRUE;
+    CFBundleRef		bundle  = (CFBundleRef)arg;
+    CFDictionaryRef	dict;
+
+#if	!TARGET_OS_EMBEDDED
+    pthread_setname_np(MY_PLUGIN_NAME " thread");
+#endif	// !TARGET_OS_EMBEDDED
+
+    dict = CFBundleGetInfoDictionary(bundle);
+    if (isA_CFDictionary(dict)) {
+	CFNumberRef	num;
+
+	num = CFDictionaryGetValue(dict, CFSTR(WAIT_STACK_TIMEOUT_KEY));
+	if (num != NULL) {
+	    if (!isA_CFNumber(num) ||
+		!CFNumberGetValue(num, kCFNumberDoubleType, &S_stack_timeout) ||
+		(S_stack_timeout <= 0.0)) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR(MY_PLUGIN_NAME ": " WAIT_STACK_TIMEOUT_KEY " value error"));
+		S_stack_timeout = WAIT_STACK_TIMEOUT_DEFAULT;
+	    }
+	}
+
+	num = CFDictionaryGetValue(dict, CFSTR(WAIT_QUIET_TIMEOUT_KEY));
+	if (num != NULL) {
+	    if (!isA_CFNumber(num) ||
+		!CFNumberGetValue(num, kCFNumberDoubleType, &S_quiet_timeout) ||
+		(S_quiet_timeout <= 0.0)) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR(MY_PLUGIN_NAME ": " WAIT_QUIET_TIMEOUT_KEY " value error"));
+		S_quiet_timeout = WAIT_QUIET_TIMEOUT_DEFAULT;
+	    }
+	}
     }
 
-#if	!TARGET_OS_IPHONE
     // setup virtual network interface monitoring
     if (!setup_Virtual(bundle)) {
 	goto error;
     }
-#endif	/* !TARGET_OS_IPHONE */
 
     // setup [IOKit] network interface monitoring
     if (!setup_IOKit(bundle)) {
 	goto error;
     }
 
-    return;
+    goto done;
 
   error :
     if (S_connect != MACH_PORT_NULL) {
@@ -2053,6 +2205,41 @@ load_InterfaceNamer(CFBundleRef bundle, Boolean bundleVerbose)
 	S_timer = NULL;
     }
 
+  done :
+#if	!TARGET_OS_EMBEDDED
+    CFRelease(bundle);
+    CFRunLoopRun();
+#endif	// !TARGET_OS_EMBEDDED
+
+    return NULL;
+}
+
+__private_extern__
+void
+load_InterfaceNamer(CFBundleRef bundle, Boolean bundleVerbose)
+{
+    if (bundleVerbose) {
+	S_debug = TRUE;
+    }
+
+#if	!TARGET_OS_EMBEDDED
+    {
+	pthread_attr_t	tattr;
+	pthread_t	tid;
+
+	CFRetain(bundle);	// released in exec_InterfaceNamer
+
+	pthread_attr_init(&tattr);
+	pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM);
+	pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
+//	pthread_attr_setstacksize(&tattr, 96 * 1024); // each thread gets a 96K stack
+	pthread_create(&tid, &tattr, exec_InterfaceNamer, bundle);
+	pthread_attr_destroy(&tattr);
+    }
+#else	// !TARGET_OS_EMBEDDED
+    (void)exec_InterfaceNamer(bundle);
+#endif	// !TARGET_OS_EMBEDDED
+
     return;
 }
 
@@ -2106,3 +2293,22 @@ main(int argc, char ** argv)
     return 0;
 }
 #endif	/* TEST_PLATFORM_UUID */
+
+#ifdef	TEST_SNAPSHOT
+int
+main(int argc, char ** argv)
+{
+    CFStringRef	snapshot;
+
+    _sc_log     = FALSE;
+    _sc_verbose = (argc > 1) ? TRUE : FALSE;
+
+    snapshot = captureBusy();
+    SCPrint(TRUE, stdout, CFSTR("%@\n"), snapshot);
+    CFRelease(snapshot);
+
+    exit(0);
+    return 0;
+}
+#endif	/* TEST_SNAPSHOT */
+
diff --git a/Plugins/KernelEventMonitor/Info.plist b/Plugins/KernelEventMonitor/Info.plist
index 0e6f278..995a930 100644
--- a/Plugins/KernelEventMonitor/Info.plist
+++ b/Plugins/KernelEventMonitor/Info.plist
@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>Requires</key>
 	<array>
 		<string>com.apple.SystemConfiguration.InterfaceNamer</string>
diff --git a/Plugins/KernelEventMonitor/ev_appletalk.c b/Plugins/KernelEventMonitor/ev_appletalk.c
deleted file mode 100644
index d48d5e5..0000000
--- a/Plugins/KernelEventMonitor/ev_appletalk.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright (c) 2002-2007 Apple Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-/*
- * Modification History
- *
- * August 5, 2002	Allan Nathanson <ajn@apple.com>
- * - split code out from eventmon.c
- */
-
-#include "eventmon.h"
-#include "cache.h"
-#include "ev_appletalk.h"
-
-// from <netat/ddp.h>
-#define DDP_MIN_NETWORK	0x0001
-#define DDP_MAX_NETWORK	0xfffe
-
-
-static int
-get_atalk_interface_cfg(const char *if_name, at_if_cfg_t *cfg)
-{
-	int 	fd;
-
-	/* open socket */
-	if ((fd = socket(AF_APPLETALK, SOCK_RAW, 0)) == -1)
-		return -1;
-
-	/* get config info for given interface */
-	strncpy(cfg->ifr_name, if_name, sizeof(cfg->ifr_name));
-	if (ioctl(fd, AIOCGETIFCFG, (caddr_t)cfg) == -1) {
-		(void)close(fd);
-		return -1;
-	}
-
-	(void)close(fd);
-	return 0;
-}
-
-
-static CFMutableDictionaryRef
-getIF(CFStringRef key, CFMutableDictionaryRef oldIFs, CFMutableDictionaryRef newIFs)
-{
-	CFDictionaryRef		dict		= NULL;
-	CFMutableDictionaryRef	newDict		= NULL;
-
-	if (CFDictionaryGetValueIfPresent(newIFs, key, (const void **)&dict)) {
-		newDict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
-	} else {
-		dict = cache_SCDynamicStoreCopyValue(store, key);
-		if (dict) {
-			CFDictionarySetValue(oldIFs, key, dict);
-			if (isA_CFDictionary(dict)) {
-				newDict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
-				CFDictionaryRemoveValue(newDict, kSCPropNetAppleTalkNetworkID);
-				CFDictionaryRemoveValue(newDict, kSCPropNetAppleTalkNodeID);
-				CFDictionaryRemoveValue(newDict, kSCPropNetAppleTalkNetworkRange);
-				CFDictionaryRemoveValue(newDict, kSCPropNetAppleTalkDefaultZone);
-			}
-			CFRelease(dict);
-		}
-	}
-
-	if (!newDict) {
-		newDict = CFDictionaryCreateMutable(NULL,
-						    0,
-						    &kCFTypeDictionaryKeyCallBacks,
-						    &kCFTypeDictionaryValueCallBacks);
-	}
-
-	return newDict;
-}
-
-
-static void
-updateStore(const void *key, const void *value, void *context)
-{
-	CFDictionaryRef dict;
-	CFDictionaryRef newDict = (CFDictionaryRef)value;
-	CFDictionaryRef	oldIFs	= (CFDictionaryRef)context;
-
-	dict = CFDictionaryGetValue(oldIFs, key);
-
-	if (!dict || !CFEqual(dict, newDict)) {
-		if (CFDictionaryGetCount(newDict) > 0) {
-			cache_SCDynamicStoreSetValue(store, key, newDict);
-		} else if (dict) {
-			cache_SCDynamicStoreRemoveValue(store, key);
-		}
-		network_changed = TRUE;
-	}
-
-	return;
-}
-
-
-__private_extern__
-void
-interface_update_appletalk(struct ifaddrs *ifap, const char *if_name)
-{
-	struct ifaddrs		*ifa;
-	struct ifaddrs		*ifap_temp	= NULL;
-	CFStringRef		interface;
-	boolean_t		interfaceFound	= FALSE;
-	CFStringRef		key		= NULL;
-	CFMutableDictionaryRef	oldIFs;
-	CFMutableDictionaryRef	newDict		= NULL;
-	CFMutableDictionaryRef	newIFs;
-
-	oldIFs = CFDictionaryCreateMutable(NULL,
-					   0,
-					   &kCFTypeDictionaryKeyCallBacks,
-					   &kCFTypeDictionaryValueCallBacks);
-	newIFs = CFDictionaryCreateMutable(NULL,
-					   0,
-					   &kCFTypeDictionaryKeyCallBacks,
-					   &kCFTypeDictionaryValueCallBacks);
-
-	if (!ifap) {
-		if (getifaddrs(&ifap_temp) == -1) {
-			SCLog(TRUE, LOG_ERR, CFSTR("getifaddrs() failed: %s"), strerror(errno));
-			goto error;
-		}
-		ifap = ifap_temp;
-	}
-
-	for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
-		at_if_cfg_t		cfg;
-		int			iVal;
-		CFNumberRef		num;
-		struct sockaddr_at	*sat;
-
-		if (ifa->ifa_addr->sa_family != AF_APPLETALK) {
-			continue;			/* sorry, not interested */
-		}
-
-		/* check if this is the requested interface */
-		if (if_name) {
-			if (strncmp(if_name, ifa->ifa_name, IFNAMSIZ) == 0) {
-				interfaceFound = TRUE;	/* yes, this is the one I want */
-			} else {
-				continue;		/* sorry, not interested */
-			}
-		}
-
-		/* get the current cache information */
-		interface = CFStringCreateWithCString(NULL, ifa->ifa_name, kCFStringEncodingMacRoman);
-		key       = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-									  kSCDynamicStoreDomainState,
-									  interface,
-									  kSCEntNetAppleTalk);
-		CFRelease(interface);
-
-		newDict = getIF(key, oldIFs, newIFs);
-
-		sat = (struct sockaddr_at *)ifa->ifa_addr;
-
-		iVal = (int)sat->sat_addr.s_net;
-		num  = CFNumberCreate(NULL, kCFNumberIntType, &iVal);
-		CFDictionarySetValue(newDict, kSCPropNetAppleTalkNetworkID, num);
-		CFRelease(num);
-
-		iVal = (int)sat->sat_addr.s_node;
-		num  = CFNumberCreate(NULL, kCFNumberIntType, &iVal);
-		CFDictionarySetValue(newDict, kSCPropNetAppleTalkNodeID, num);
-		CFRelease(num);
-
-		if (get_atalk_interface_cfg(ifa->ifa_name, &cfg) == 0) {
-			CFStringRef		zone;
-
-			/*
-			 * Set starting and ending net values
-			 */
-			if (!(((cfg.netStart == 0) && (cfg.netEnd == 0)) ||
-			      ((cfg.netStart == DDP_MIN_NETWORK) && (cfg.netEnd == DDP_MAX_NETWORK)))) {
-				CFMutableArrayRef	array;
-
-				array = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-
-				iVal = cfg.netStart;
-				num  = CFNumberCreate(NULL, kCFNumberIntType, &iVal);
-				CFArrayAppendValue(array, num);
-				CFRelease(num);
-
-				iVal = cfg.netEnd;
-				num  = CFNumberCreate(NULL, kCFNumberIntType, &iVal);
-				CFArrayAppendValue(array, num);
-				CFRelease(num);
-
-				CFDictionarySetValue(newDict, kSCPropNetAppleTalkNetworkRange, array);
-				CFRelease(array);
-			}
-
-			/*
-			 * Set the default zone
-			 */
-			zone = CFStringCreateWithPascalString(NULL,
-							      (ConstStr255Param)&cfg.zonename,
-							      kCFStringEncodingMacRoman);
-			CFDictionarySetValue(newDict, kSCPropNetAppleTalkDefaultZone, zone);
-			CFRelease(zone);
-		}
-
-		CFDictionarySetValue(newIFs, key, newDict);
-		CFRelease(newDict);
-		CFRelease(key);
-	}
-
-	/* if the last address[es] were removed from the target interface */
-	if (if_name && !interfaceFound) {
-		interface = CFStringCreateWithCString(NULL, if_name, kCFStringEncodingMacRoman);
-		key       = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-									  kSCDynamicStoreDomainState,
-									  interface,
-									  kSCEntNetAppleTalk);
-		CFRelease(interface);
-
-		newDict = getIF(key, oldIFs, newIFs);
-
-		CFDictionarySetValue(newIFs, key, newDict);
-		CFRelease(newDict);
-		CFRelease(key);
-	}
-
-	CFDictionaryApplyFunction(newIFs, updateStore, oldIFs);
-
-    error :
-
-	if (ifap_temp)	freeifaddrs(ifap_temp);
-	CFRelease(oldIFs);
-	CFRelease(newIFs);
-
-	return;
-}
-
-
-__private_extern__
-void
-interface_update_atalk_address(struct kev_atalk_data *aEvent, const char *if_name)
-{
-	CFStringRef		interface;
-	CFStringRef		key;
-	CFDictionaryRef		dict;
-	CFMutableDictionaryRef	newDict = NULL;
-	CFNumberRef		newNode, newNet;
-	int			node;
-	int			net;
-
-	/* get the current cache information */
-	interface = CFStringCreateWithCString(NULL, if_name, kCFStringEncodingMacRoman);
-	key       = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-								  kSCDynamicStoreDomainState,
-								  interface,
-								  kSCEntNetAppleTalk);
-	CFRelease(interface);
-
-	dict = cache_SCDynamicStoreCopyValue(store, key);
-	if (dict) {
-		if (isA_CFDictionary(dict)) {
-			newDict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
-		}
-		CFRelease(dict);
-	}
-
-	if (!newDict) {
-		newDict = CFDictionaryCreateMutable(NULL,
-						    0,
-						    &kCFTypeDictionaryKeyCallBacks,
-						    &kCFTypeDictionaryValueCallBacks);
-	}
-
-	/* Update node/net values in cache */
-	node	= (int)aEvent->node_data.address.s_node;
-	net	= (int)aEvent->node_data.address.s_net;
-
-	newNode	= CFNumberCreate(NULL, kCFNumberIntType, &node);
-	newNet 	= CFNumberCreate(NULL, kCFNumberIntType, &net);
-
-	CFDictionarySetValue(newDict, kSCPropNetAppleTalkNodeID, newNode);
-	CFDictionarySetValue(newDict, kSCPropNetAppleTalkNetworkID, newNet);
-
-	CFRelease(newNode);
-	CFRelease(newNet);
-
-	/* update cache */
-	cache_SCDynamicStoreSetValue(store, key, newDict);
-	network_changed = TRUE;
-	CFRelease(newDict);
-	CFRelease(key);
-	return;
-}
-
-
-__private_extern__
-void
-interface_update_atalk_zone(struct kev_atalk_data *aEvent, const char *if_name)
-{
-	CFStringRef		interface;
-	CFStringRef		key;
-	CFDictionaryRef		dict;
-	CFMutableDictionaryRef	newDict	= NULL;
-	CFStringRef		newZone;
-
-	/* get the current cache information */
-	interface = CFStringCreateWithCString(NULL, if_name, kCFStringEncodingMacRoman);
-	key       = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-								  kSCDynamicStoreDomainState,
-								  interface,
-								  kSCEntNetAppleTalk);
-	CFRelease(interface);
-
-	dict = cache_SCDynamicStoreCopyValue(store, key);
-	if (dict) {
-		if (isA_CFDictionary(dict)) {
-			newDict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
-		}
-		CFRelease(dict);
-	}
-
-	if (!newDict) {
-		newDict = CFDictionaryCreateMutable(NULL,
-						    0,
-						    &kCFTypeDictionaryKeyCallBacks,
-						    &kCFTypeDictionaryValueCallBacks);
-	}
-
-	/* Update zone value in cache */
-	newZone = CFStringCreateWithPascalString(NULL, (ConstStr255Param)&(aEvent->node_data.zone), kCFStringEncodingMacRoman);
-
-	CFDictionarySetValue(newDict, kSCPropNetAppleTalkDefaultZone, newZone);
-
-	CFRelease(newZone);
-
-	/* update cache */
-	cache_SCDynamicStoreSetValue(store, key, newDict);
-	network_changed = TRUE;
-	CFRelease(newDict);
-	CFRelease(key);
-	return;
-}
-
-
-__private_extern__
-void
-interface_update_shutdown_atalk()
-{
-	CFStringRef			cacheKey;
-	CFDictionaryRef			dict;
-	CFArrayRef			ifList = NULL;
-	CFIndex 			count, index;
-	CFStringRef 			interface;
-	CFStringRef			key;
-
-	cacheKey  = SCDynamicStoreKeyCreateNetworkInterface(NULL,
-							    kSCDynamicStoreDomainState);
-
-	dict = cache_SCDynamicStoreCopyValue(store, cacheKey);
-	CFRelease(cacheKey);
-
-	if (dict) {
-		if (isA_CFDictionary(dict)) {
-			/*get a list of the interfaces*/
-			ifList  = isA_CFArray(CFDictionaryGetValue(dict, kSCPropNetInterfaces));
-			if (ifList) {
-				count = CFArrayGetCount(ifList);
-
-				/*iterate through list and remove AppleTalk data*/
-				for (index = 0; index < count; index++) {
-					interface = CFArrayGetValueAtIndex(ifList, index);
-					key       = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-												  kSCDynamicStoreDomainState,
-												  interface,
-												  kSCEntNetAppleTalk);
-					cache_SCDynamicStoreRemoveValue(store, key);
-					network_changed = TRUE;
-					CFRelease(key);
-				}
-			}
-		}
-		CFRelease(dict);
-	}
-
-	return;
-}
diff --git a/Plugins/KernelEventMonitor/eventmon.c b/Plugins/KernelEventMonitor/eventmon.c
index bc24c8f..10792c0 100644
--- a/Plugins/KernelEventMonitor/eventmon.c
+++ b/Plugins/KernelEventMonitor/eventmon.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2008, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -60,9 +60,8 @@
 #include "ev_ipv6.h"
 #include <notify.h>
 
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-#include "ev_appletalk.h"
-#endif	/* !TARGET_OS_IPHONE && INCLUDE_APPLETALK */
+// from ip_fw2.c
+#define KEV_LOG_SUBCLASS	10
 
 static const char *inetEventName[] = {
 	"",
@@ -73,6 +72,7 @@ static const char *inetEventName[] = {
 	"INET broadcast address changed",
 	"INET netmask changed",
 	"INET ARP collision",
+	"INET port in use",
 };
 
 static const char *dlEventName[] = {
@@ -92,21 +92,13 @@ static const char *dlEventName[] = {
 	"KEV_DL_LINK_ON",
 	"KEV_DL_PROTO_ATTACHED",
 	"KEV_DL_PROTO_DETACHED",
+	"KEV_DL_LINK_ADDRESS_CHANGED",
+	"KEV_DL_WAKEFLAGS_CHANGED",
+#ifdef	KEV_DL_IF_IDLE_ROUTE_REFCNT
+	"KEV_DL_IF_IDLE_ROUTE_REFCNT",
+#endif	// KEV_DL_IF_IDLE_ROUTE_REFCNT
 };
 
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-static const char *atalkEventName[] = {
-	"",
-	"KEV_ATALK_ENABLED",
-	"KEV_ATALK_DISABLED",
-	"KEV_ATALK_ZONEUPDATED",
-	"KEV_ATALK_ROUTERUP",
-	"KEV_ATALK_ROUTERUP_INVALID",
-	"KEV_ATALK_ROUTERDOWN",
-	"KEV_ATALK_ZONELISTCHANGED"
-};
-#endif	/* !TARGET_OS_IPHONE && INCLUDE_APPLETALK */
-
 static const char *inet6EventName[] = {
 	"",
 	"KEV_INET6_NEW_USER_ADDR",
@@ -135,7 +127,7 @@ ifflags_set(int s, char * name, short flags)
     int 		ret;
 
     bzero(&ifr, sizeof(ifr));
-    strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
     ret = ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr);
     if (ret == -1) {
 		return (ret);
@@ -151,7 +143,7 @@ ifflags_clear(int s, char * name, short flags)
     int 		ret;
 
     bzero(&ifr, sizeof(ifr));
-    strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
     ret = ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr);
     if (ret == -1) {
 		return (ret);
@@ -203,8 +195,12 @@ logEvent(CFStringRef evStr, struct kern_event_msg *ev_msg)
 	int	i;
 	int	j;
 
-	SCLog(_verbose, LOG_DEBUG, CFSTR("%@ event:"), evStr);
-	SCLog(_verbose, LOG_DEBUG,
+	if (!_verbose) {
+		return;
+	}
+
+	SCLog(TRUE, LOG_DEBUG, CFSTR("%@ event:"), evStr);
+	SCLog(TRUE, LOG_DEBUG,
 	      CFSTR("  Event size=%d, id=%d, vendor=%d, class=%d, subclass=%d, code=%d"),
 	      ev_msg->total_size,
 	      ev_msg->id,
@@ -213,14 +209,14 @@ logEvent(CFStringRef evStr, struct kern_event_msg *ev_msg)
 	      ev_msg->kev_subclass,
 	      ev_msg->event_code);
 	for (i = 0, j = KEV_MSG_HEADER_SIZE; j < ev_msg->total_size; i++, j+=4) {
-		SCLog(_verbose, LOG_DEBUG, CFSTR("  Event data[%2d] = %08lx"), i, ev_msg->event_data[i]);
+		SCLog(TRUE, LOG_DEBUG, CFSTR("  Event data[%2d] = %08lx"), i, ev_msg->event_data[i]);
 	}
 }
 
 static const char *
 inetEventNameString(uint32_t event_code)
 {
-	if (event_code <= KEV_INET_ARPCOLLISION) {
+	if (event_code < sizeof(inetEventName) / sizeof(inetEventName[0])) {
 		return (inetEventName[event_code]);
 	}
 	return ("New Apple network INET subcode");
@@ -229,7 +225,7 @@ inetEventNameString(uint32_t event_code)
 static const char *
 inet6EventNameString(uint32_t event_code)
 {
-	if (event_code <= KEV_INET6_DEFROUTER) {
+	if (event_code < sizeof(inet6EventName) / sizeof(inet6EventName[0])) {
 		return (inet6EventName[event_code]);
 	}
 	return ("New Apple network INET6 subcode");
@@ -238,23 +234,12 @@ inet6EventNameString(uint32_t event_code)
 static const char *
 dlEventNameString(uint32_t event_code)
 {
-	if (event_code <= KEV_DL_PROTO_DETACHED) {
+	if (event_code < sizeof(dlEventName) / sizeof(dlEventName[0])) {
 		return (dlEventName[event_code]);
 	}
 	return ("New Apple network DL subcode");
 }
 
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-static const char *
-atalkEventNameString(uint32_t event_code)
-{
-	if (event_code <= KEV_ATALK_ZONELISTCHANGED) {
-		return (atalkEventName[event_code]);
-	}
-	return ("New Apple network AppleTalk subcode");
-}
-#endif	/* !TARGET_OS_IPHONE && INCLUDE_APPLETALK */
-
 static void
 copy_if_name(struct net_event_data * ev, char * ifr_name, int ifr_len)
 {
@@ -269,7 +254,7 @@ processEvent_Apple_Network(struct kern_event_msg *ev_msg)
 	int				dataLen = (ev_msg->total_size - KEV_MSG_HEADER_SIZE);
 	void *				event_data = &ev_msg->event_data[0];
 	Boolean				handled = TRUE;
-	char				ifr_name[IFNAMSIZ + 1];
+	char				ifr_name[IFNAMSIZ];
 
 	switch (ev_msg->kev_subclass) {
 		case KEV_INET_SUBCLASS : {
@@ -394,17 +379,6 @@ processEvent_Apple_Network(struct kern_event_msg *ev_msg)
 					interface_detaching(ifr_name);
 					break;
 
-				case KEV_DL_SIFFLAGS :
-				case KEV_DL_SIFMETRICS :
-				case KEV_DL_SIFMTU :
-				case KEV_DL_SIFPHYS :
-				case KEV_DL_SIFMEDIA :
-				case KEV_DL_SIFGENERIC :
-				case KEV_DL_ADDMULTI :
-				case KEV_DL_DELMULTI :
-					handled = FALSE;
-					break;
-
 				case KEV_DL_PROTO_ATTACHED :
 				case KEV_DL_PROTO_DETACHED : {
 					struct kev_dl_proto_data * protoEvent;
@@ -437,43 +411,19 @@ processEvent_Apple_Network(struct kern_event_msg *ev_msg)
 					link_update_status(ifr_name, FALSE);
 					break;
 
-				default :
-					handled = FALSE;
-					break;
-			}
-			break;
-		}
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-		case KEV_ATALK_SUBCLASS: {
-			struct kev_atalk_data * ev;
-
-			eventName = atalkEventNameString(ev_msg->event_code);
-			ev = (struct kev_atalk_data *)event_data;
-			if (dataLen < sizeof(*ev)) {
-				handled = FALSE;
-				break;
-			}
-			copy_if_name(&ev->link_data, ifr_name, sizeof(ifr_name));
-			switch (ev_msg->event_code) {
-				case KEV_ATALK_ENABLED:
-					interface_update_atalk_address(ev, ifr_name);
-					break;
-
-				case KEV_ATALK_DISABLED:
-					interface_update_shutdown_atalk();
-					break;
-
-				case KEV_ATALK_ZONEUPDATED:
-					interface_update_atalk_zone(ev, ifr_name);
-					break;
-
-				case KEV_ATALK_ROUTERUP:
-				case KEV_ATALK_ROUTERUP_INVALID:
-				case KEV_ATALK_ROUTERDOWN:
-					interface_update_appletalk(NULL, ifr_name);
-					break;
-
-				case KEV_ATALK_ZONELISTCHANGED:
+				case KEV_DL_SIFFLAGS :
+				case KEV_DL_SIFMETRICS :
+				case KEV_DL_SIFMTU :
+				case KEV_DL_SIFPHYS :
+				case KEV_DL_SIFMEDIA :
+				case KEV_DL_SIFGENERIC :
+				case KEV_DL_ADDMULTI :
+				case KEV_DL_DELMULTI :
+				case KEV_DL_LINK_ADDRESS_CHANGED :
+				case KEV_DL_WAKEFLAGS_CHANGED :
+#ifdef	KEV_DL_IF_IDLE_ROUTE_REFCNT
+				case KEV_DL_IF_IDLE_ROUTE_REFCNT :
+#endif	// KEV_DL_IF_IDLE_ROUTE_REFCNT
 					break;
 
 				default :
@@ -482,7 +432,9 @@ processEvent_Apple_Network(struct kern_event_msg *ev_msg)
 			}
 			break;
 		}
-#endif	/* !TARGET_OS_IPHONE && INCLUDE_APPLETALK */
+		case KEV_LOG_SUBCLASS : {
+			break;
+		}
 		default :
 			handled = FALSE;
 			break;
@@ -500,30 +452,6 @@ processEvent_Apple_Network(struct kern_event_msg *ev_msg)
 	return;
 }
 
-static void
-processEvent_Apple_IOKit(struct kern_event_msg *ev_msg)
-{
-	switch (ev_msg->kev_subclass) {
-		default :
-			logEvent(CFSTR("New Apple IOKit subclass"), ev_msg);
-			break;
-	}
-
-	return;
-}
-
-static void
-processEvent_Apple_System(struct kern_event_msg *ev_msg)
-{
-	switch (ev_msg->kev_subclass) {
-		default :
-			logEvent(CFSTR("New Apple System subclass"), ev_msg);
-			break;
-	}
-
-	return;
-}
-
 static void
 eventCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
 {
@@ -554,10 +482,10 @@ eventCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const
 						processEvent_Apple_Network(ev_msg);
 						break;
 					case KEV_IOKIT_CLASS :
-						processEvent_Apple_IOKit(ev_msg);
-						break;
 					case KEV_SYSTEM_CLASS :
-						processEvent_Apple_System(ev_msg);
+					case KEV_APPLESHARE_CLASS :
+					case KEV_FIREWALL_CLASS :
+					case KEV_IEEE80211_CLASS :
 						break;
 					default :
 						/* unrecognized (Apple) event class */
@@ -636,14 +564,6 @@ prime_KernelEventMonitor()
 	 */
 	interface_update_ipv6(ifap, NULL);
 
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-	/*
-	 * update AppleTalk network addresses already assigned
-	 * to the interfaces.
-	 */
-	interface_update_appletalk(ifap, NULL);
-#endif	/* !TARGET_OS_IPHONE && INCLUDE_APPLETALK */
-
 	freeifaddrs(ifap);
 
  done:
@@ -702,10 +622,10 @@ load_KernelEventMonitor(CFBundleRef bundle, Boolean bundleVerbose)
 	/* Open an event socket */
 	so = socket(PF_SYSTEM, SOCK_RAW, SYSPROTO_EVENT);
 	if (so != -1) {
-		/* establish filter to return all events */
-		kev_req.vendor_code  = 0;
-		kev_req.kev_class    = 0;	/* Not used if vendor_code is 0 */
-		kev_req.kev_subclass = 0;	/* Not used if either kev_class OR vendor_code are 0 */
+		/* establish filter to return events of interest */
+		kev_req.vendor_code  = KEV_VENDOR_APPLE;
+		kev_req.kev_class    = KEV_NETWORK_CLASS;
+		kev_req.kev_subclass = KEV_ANY_SUBCLASS;
 		status = ioctl(so, SIOCSKEVFILT, &kev_req);
 		if (status) {
 			SCLog(TRUE, LOG_ERR, CFSTR("could not establish event filter, ioctl() failed: %s"), strerror(errno));
@@ -769,14 +689,6 @@ load_KernelEventMonitor(CFBundleRef bundle, Boolean bundleVerbose)
 #undef getIF
 #undef updateStore
 
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-#define getIF		getIF_at
-#define updateStore	updateStore_at
-#include "ev_appletalk.c"
-#undef getIF
-#undef updateStore
-#endif	/* !TARGET_OS_IPHONE && INCLUDE_APPLETALK */
-
 int
 main(int argc, char **argv)
 {
diff --git a/Plugins/Kicker/Info.plist b/Plugins/Kicker/Info.plist
deleted file mode 100644
index ca15b27..0000000
--- a/Plugins/Kicker/Info.plist
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>Kicker</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.apple.SystemConfiguration.Kicker</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>com.apple.SystemConfiguration.Kicker</string>
-	<key>CFBundlePackageType</key>
-	<string>BNDL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
-	<key>Requires</key>
-	<array>
-		<string>com.apple.SystemConfiguration.ATconfig</string>
-		<string>com.apple.SystemConfiguration.IPConfiguration</string>
-		<string>com.apple.SystemConfiguration.IPMonitor</string>
-	</array>
-	<key>Builtin</key>
-	<true/>
-</dict>
-</plist>
diff --git a/Plugins/Kicker/Kicker.xml b/Plugins/Kicker/Kicker.xml
deleted file mode 100644
index db550c4..0000000
--- a/Plugins/Kicker/Kicker.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<array>
-	<dict>
-		<key>execCommand</key>
-		<string>$BUNDLE/Contents/Resources/enable-network</string>
-		<key>execUID</key>
-		<integer>0</integer>
-		<key>keys</key>
-		<array>
-			<string>State:/Network/Global/IPv4</string>
-		</array>
-		<key>name</key>
-		<string>enable-network</string>
-	</dict>
-</array>
-</plist>
diff --git a/Plugins/Kicker/enable-network b/Plugins/Kicker/enable-network
deleted file mode 100755
index 106de56..0000000
--- a/Plugins/Kicker/enable-network
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-#
-# network configuration has changed
-#
-logger -i -p daemon.debug -t enable-network "process network configuration change"
-
-. /etc/rc.common
-CheckForNetwork
-if [ "${NETWORKUP}" = "-NO-" ]; then exit 0; fi
-
-if [ -x /System/Library/StartupItems/NetworkTime/NetworkTime ]; then
-	/System/Library/StartupItems/NetworkTime/NetworkTime start
-fi
-
-if [ -x /System/Library/StartupItems/NIS/NIS ]; then
-	/System/Library/StartupItems/NIS/NIS start
-fi
-
-if [ -x /System/Library/StartupItems/NFS/NFS ]; then
-	/System/Library/StartupItems/NFS/NFS start
-fi
-
-exit 1
diff --git a/Plugins/Kicker/kicker.c b/Plugins/Kicker/kicker.c
deleted file mode 100644
index ad552d2..0000000
--- a/Plugins/Kicker/kicker.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-/*
- * Modification History
- *
- * April 16, 2002		Allan Nathanson <ajn@apple.com>
- * - updated to use _SCDPluginExecCommand()
- *
- * June 23, 2001		Allan Nathanson <ajn@apple.com>
- * - updated to public SystemConfiguration.framework APIs
- *
- * June 4, 2001			Allan Nathanson <ajn@apple.com>
- * - add changed keys as the arguments to the kicker script
- *
- * June 30, 2000		Allan Nathanson <ajn@apple.com>
- * - initial revision
- */
-
-#include <stdio.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <notify.h>
-
-#include <SystemConfiguration/SystemConfiguration.h>
-#include <SystemConfiguration/SCPrivate.h>	// for SCLog()
-#include <SystemConfiguration/SCDPlugin.h>
-#include <SystemConfiguration/SCValidation.h>
-
-/*
- * Information maintained for each to-be-kicked registration.
- */
-typedef struct {
-	boolean_t		active;
-	boolean_t		needsKick;
-
-	/* dictionary associated with this target */
-	CFDictionaryRef		dict;
-
-	/* SCDynamicStore session information for this target */
-	CFRunLoopRef		rl;
-	CFRunLoopSourceRef	rls;
-	SCDynamicStoreRef	store;
-
-	/* changed keys */
-	CFMutableArrayRef	changedKeys;
-} kickee, *kickeeRef;
-
-static CFURLRef	myBundleURL	= NULL;
-static Boolean	_verbose	= FALSE;
-
-static void booter(kickeeRef target);
-static void booterExit(pid_t pid, int status, struct rusage *rusage, void *context);
-
-
-static void
-cleanupKicker(kickeeRef target)
-{
-	CFStringRef		name	= CFDictionaryGetValue(target->dict, CFSTR("name"));
-
-	SCLog(TRUE, LOG_NOTICE,
-	      CFSTR("  target=%@: disabled"),
-	      name);
-	CFRunLoopRemoveSource(target->rl, target->rls, kCFRunLoopDefaultMode);
-	CFRelease(target->rls);
-	CFRelease(target->store);
-	if (target->dict)		CFRelease(target->dict);
-	if (target->changedKeys)	CFRelease(target->changedKeys);
-	CFAllocatorDeallocate(NULL, target);
-}
-
-
-static void
-booter(kickeeRef target)
-{
-	char			**argv		= NULL;
-	char			*cmd		= NULL;
-	CFStringRef		execCommand	= CFDictionaryGetValue(target->dict, CFSTR("execCommand"));
-	int			i;
-	CFArrayRef		keys		= NULL;
-	CFStringRef		name		= CFDictionaryGetValue(target->dict, CFSTR("name"));
-	int			nKeys		= 0;
-	Boolean			ok		= FALSE;
-	CFStringRef		postName	= CFDictionaryGetValue(target->dict, CFSTR("postName"));
-
-	if (target->active) {
-		/* we need another kick! */
-		target->needsKick = TRUE;
-
-		SCLog(_verbose, LOG_DEBUG, CFSTR("Kicker callback, target=%@ request queued"), name);
-		return;
-	}
-
-	SCLog(_verbose, LOG_DEBUG, CFSTR("Kicker callback, target=%@"), name);
-
-	if (!isA_CFString(postName) && !isA_CFString(execCommand)) {
-		goto error;	/* if no notifications to post nor commands to execute */
-	}
-
-	if (isA_CFString(postName)) {
-		uint32_t	status;
-
-		/*
-		 * post a notification
-		 */
-		cmd = _SC_cfstring_to_cstring(postName, NULL, 0, kCFStringEncodingASCII);
-		if (!cmd) {
-			SCLog(TRUE, LOG_DEBUG, CFSTR("  could not convert post name to C string"));
-			goto error;
-		}
-
-		SCLog(TRUE, LOG_NOTICE, CFSTR("posting notification %s"), cmd);
-		status = notify_post(cmd);
-		if (status != NOTIFY_STATUS_OK) {
-			SCLog(TRUE, LOG_DEBUG, CFSTR("  notify_post() failed: error=%ld"), status);
-			goto error;
-		}
-
-		CFAllocatorDeallocate(NULL, cmd);	/* clean up */
-		cmd = NULL;
-	}
-
-	/*
-	 * get the arguments for the kickee
-	 */
-	keys = target->changedKeys;
-	target->changedKeys = NULL;
-
-	if (isA_CFString(execCommand)) {
-		CFRange			bpr;
-		CFNumberRef		execGID		= CFDictionaryGetValue(target->dict, CFSTR("execGID"));
-		CFNumberRef		execUID		= CFDictionaryGetValue(target->dict, CFSTR("execUID"));
-		CFBooleanRef		passKeys	= CFDictionaryGetValue(target->dict, CFSTR("changedKeysAsArguments"));
-		gid_t			reqGID		= 0;
-		uid_t			reqUID		= 0;
-		CFMutableStringRef	str;
-
-		/*
-		 * build the kickee command
-		 */
-		str = CFStringCreateMutableCopy(NULL, 0, execCommand);
-		bpr = CFStringFind(str, CFSTR("$BUNDLE"), 0);
-		if (bpr.location != kCFNotFound) {
-			CFStringRef	bundlePath;
-
-			bundlePath = CFURLCopyFileSystemPath(myBundleURL, kCFURLPOSIXPathStyle);
-			CFStringReplace(str, bpr, bundlePath);
-			CFRelease(bundlePath);
-		}
-
-		cmd = _SC_cfstring_to_cstring(str, NULL, 0, kCFStringEncodingASCII);
-		CFRelease(str);
-		if (!cmd) {
-			SCLog(TRUE, LOG_DEBUG, CFSTR("  could not convert command to C string"));
-			goto error;
-		}
-
-		/*
-		 * get the UID/GID for the kickee
-		 */
-		if (isA_CFNumber(execUID)) {
-			CFNumberGetValue(execUID, kCFNumberIntType, &reqUID);
-		}
-
-		if (isA_CFNumber(execGID)) {
-			CFNumberGetValue(execGID, kCFNumberIntType, &reqGID);
-		}
-
-		nKeys = CFArrayGetCount(keys);
-		argv  = CFAllocatorAllocate(NULL, (nKeys + 2) * sizeof(char *), 0);
-		for (i = 0; i < (nKeys + 2); i++) {
-			argv[i] = NULL;
-		}
-
-		/* create command name argument */
-		if ((argv[0] = rindex(cmd, '/')) != NULL) {
-			argv[0]++;
-		} else {
-			argv[0] = cmd;
-		}
-
-		/* create changed key arguments */
-		if (isA_CFBoolean(passKeys) && CFBooleanGetValue(passKeys)) {
-			for (i = 0; i < nKeys; i++) {
-				CFStringRef	key = CFArrayGetValueAtIndex(keys, i);
-
-				argv[i+1] = _SC_cfstring_to_cstring(key, NULL, 0, kCFStringEncodingASCII);
-				if (!argv[i+1]) {
-					SCLog(TRUE, LOG_DEBUG, CFSTR("  could not convert argument to C string"));
-					goto error;
-				}
-			}
-		}
-
-		SCLog(TRUE,     LOG_NOTICE, CFSTR("executing %s"), cmd);
-		SCLog(_verbose, LOG_DEBUG,  CFSTR("  current uid = %d, requested = %d"), geteuid(), reqUID);
-
-		/* this kicker is now "running" */
-		target->active = TRUE;
-
-		(void)_SCDPluginExecCommand(booterExit,
-			      target,
-			      reqUID,
-			      reqGID,
-			      cmd,
-			      argv);
-
-//		CFAllocatorDeallocate(NULL, cmd);	/* clean up */
-//		cmd = NULL;
-	}
-	ok = TRUE;
-
-    error :
-
-	if (keys)	CFRelease(keys);
-	if (cmd)	CFAllocatorDeallocate(NULL, cmd);
-	if (argv) {
-		for (i = 0; i < nKeys; i++) {
-			if (argv[i+1]) {
-				CFAllocatorDeallocate(NULL, argv[i+1]);
-			}
-		}
-		CFAllocatorDeallocate(NULL, argv);
-	}
-
-	if (!ok) {
-		/*
-		 * If the target action can't be performed this time then
-		 * there's not much point in trying again. As such, I close
-		 * the session and the kickee target released.
-		 */
-		cleanupKicker(target);
-	}
-
-	return;
-}
-
-
-static void
-booterExit(pid_t pid, int status, struct rusage *rusage, void *context)
-{
-	CFStringRef	name;
-	Boolean		ok	= TRUE;
-	kickeeRef	target	= (kickeeRef)context;
-
-	name = CFDictionaryGetValue(target->dict, CFSTR("name"));
-	target->active = FALSE;
-	if (WIFEXITED(status)) {
-		SCLog(TRUE, LOG_DEBUG,
-		      CFSTR("  target=%@: exit status = %d"),
-		      name,
-		      WEXITSTATUS(status));
-		if (WEXITSTATUS(status) != 0) {
-			ok = FALSE;
-		}
-	} else if (WIFSIGNALED(status)) {
-		SCLog(TRUE, LOG_DEBUG,
-		      CFSTR("  target=%@: terminated w/signal = %d"),
-		      name,
-		      WTERMSIG(status));
-		ok = FALSE;
-	} else {
-		SCLog(TRUE, LOG_DEBUG,
-		      CFSTR("  target=%@: exit status = %d"),
-		      name,
-		      status);
-		ok = FALSE;
-	}
-
-	if (!ok) {
-		if (CFDictionaryContainsKey(target->dict, CFSTR("postName"))) {
-			CFDictionaryRef		oldDict	= target->dict;
-			CFMutableDictionaryRef	newDict	= CFDictionaryCreateMutableCopy(NULL, 0, oldDict);
-
-			/*
-			 * if this target specifies both a BSD notification and
-			 * a script to be executed then we want to continue to
-			 * post the BSD notifications (and not execute the
-			 * script).  As such, remove the script reference from
-			 * the dictionary.
-			 */
-			CFDictionaryRemoveValue(newDict, CFSTR("execCommand"));
-			CFDictionaryRemoveValue(newDict, CFSTR("execGID"));
-			CFDictionaryRemoveValue(newDict, CFSTR("execUID"));
-			CFDictionaryRemoveValue(newDict, CFSTR("changedKeysAsArguments"));
-			target->dict = newDict;
-			CFRelease(oldDict);
-		} else {
-			/*
-			 * If the target action can't be performed this time then
-			 * there's not much point in trying again. As such, I close
-			 * the session and the kickee target released.
-			 */
-			cleanupKicker(target);
-			target = NULL;
-		}
-	}
-	if (target != NULL && target->needsKick) {
-		target->needsKick = FALSE;
-		booter(target);
-	}
-
-	return;
-}
-
-
-static void
-kicker(SCDynamicStoreRef store, CFArrayRef changedKeys, void *arg)
-{
-	CFIndex		i;
-	CFIndex		n		= CFArrayGetCount(changedKeys);
-	kickeeRef	target		= (kickeeRef)arg;
-
-	/*
-	 * Start a new kicker.  If a kicker was already active then flag
-	 * the need for a second kick after the active one completes.
-	 */
-
-	/* create (or add to) the full list of keys that have changed */
-	if (!target->changedKeys) {
-		target->changedKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-	}
-	for (i = 0; i < n; i++) {
-		CFStringRef	key = CFArrayGetValueAtIndex(changedKeys, i);
-
-		if (!CFArrayContainsValue(target->changedKeys,
-					  CFRangeMake(0, CFArrayGetCount(target->changedKeys)),
-					  key)) {
-			CFArrayAppendValue(target->changedKeys, key);
-		}
-	}
-
-	/*
-	 * let 'er rip.
-	 */
-	booter(target);
-
-	return;
-}
-
-
-/*
- * startKicker()
- *
- * The first argument is a dictionary representing the keys
- * which need to be monitored for a given "target" and what
- * action should be taken if a change in one of those keys
- * is detected.
- */
-static void
-startKicker(const void *value, void *context)
-{
-	CFMutableStringRef	name;
-	CFArrayRef		keys;
-	CFArrayRef		patterns;
-	kickeeRef		target		= CFAllocatorAllocate(NULL, sizeof(kickee), 0);
-	SCDynamicStoreContext	targetContext	= { 0, (void *)target, NULL, NULL, NULL };
-
-	target->active		= FALSE;
-	target->needsKick	= FALSE;
-	target->dict		= CFRetain((CFDictionaryRef)value);
-	target->store		= NULL;
-	target->rl		= NULL;
-	target->rls		= NULL;
-	target->changedKeys	= NULL;
-
-	name = CFStringCreateMutableCopy(NULL,
-					 0,
-					 CFDictionaryGetValue(target->dict, CFSTR("name")));
-	SCLog(TRUE, LOG_DEBUG, CFSTR("Starting kicker for %@"), name);
-
-	CFStringAppend(name, CFSTR(" \"Kicker\""));
-	target->store = SCDynamicStoreCreate(NULL, name, kicker, &targetContext);
-	CFRelease(name);
-	if (!target->store) {
-		SCLog(TRUE,
-		      LOG_NOTICE,
-		      CFSTR("SCDynamicStoreCreate() failed: %s"),
-		      SCErrorString(SCError()));
-		goto error;
-	}
-
-	keys     = isA_CFArray(CFDictionaryGetValue(target->dict, CFSTR("keys")));
-	patterns = isA_CFArray(CFDictionaryGetValue(target->dict, CFSTR("regexKeys")));
-	if (!SCDynamicStoreSetNotificationKeys(target->store, keys, patterns)) {
-		SCLog(TRUE,
-		      LOG_NOTICE,
-		      CFSTR("SCDynamicStoreSetNotifications() failed: %s"),
-		      SCErrorString(SCError()));
-		goto error;
-	}
-
-	target->rl  = CFRunLoopGetCurrent();
-	target->rls = SCDynamicStoreCreateRunLoopSource(NULL, target->store, 0);
-	if (!target->rls) {
-		SCLog(TRUE,
-		      LOG_NOTICE,
-		      CFSTR("SCDynamicStoreCreateRunLoopSource() failed: %s"),
-		      SCErrorString(SCError()));
-		goto error;
-	}
-
-	CFRunLoopAddSource(target->rl, target->rls, kCFRunLoopDefaultMode);
-	return;
-
-    error :
-
-	CFRelease(target->dict);
-	if (target->store)	CFRelease(target->store);
-	CFAllocatorDeallocate(NULL, target);
-	return;
-}
-
-
-static CFArrayRef
-getTargets(CFBundleRef bundle)
-{
-	Boolean			ok;
-	CFArrayRef		targets;	/* The array of dictionaries
-						   representing targets with
-						   a "kick me" sign posted on
-						   their backs. */
-	CFURLRef		url;
-	CFStringRef		xmlError;
-	CFDataRef		xmlTargets	= NULL;
-
-	/* locate the Kicker targets */
-	url = CFBundleCopyResourceURL(bundle, CFSTR("Kicker"), CFSTR("xml"), NULL);
-	if (url == NULL) {
-		return NULL;
-	}
-
-	/* read the resource data */
-	ok = CFURLCreateDataAndPropertiesFromResource(NULL, url, &xmlTargets, NULL, NULL, NULL);
-	CFRelease(url);
-	if (!ok || (xmlTargets == NULL)) {
-		return NULL;
-	}
-
-	/* convert the XML data into a property list */
-	targets = CFPropertyListCreateFromXMLData(NULL,
-						  xmlTargets,
-						  kCFPropertyListImmutable,
-						  &xmlError);
-	CFRelease(xmlTargets);
-	if (targets == NULL) {
-		if (xmlError != NULL) {
-			SCLog(TRUE, LOG_DEBUG, CFSTR("getTargets(): %@"), xmlError);
-			CFRelease(xmlError);
-		}
-		return NULL;
-	}
-
-	if (!isA_CFArray(targets)) {
-		CFRelease(targets);
-		targets = NULL;
-	}
-
-	return targets;
-}
-
-
-__private_extern__
-void
-load_Kicker(CFBundleRef bundle, Boolean bundleVerbose)
-{
-	CFArrayRef	targets;	/* The array of dictionaries representing targets
-					 * with a "kick me" sign posted on their backs.*/
-
-	if (bundleVerbose) {
-		_verbose = TRUE;
-	}
-
-	SCLog(_verbose, LOG_DEBUG, CFSTR("load() called"));
-	SCLog(_verbose, LOG_DEBUG, CFSTR("  bundle ID = %@"), CFBundleGetIdentifier(bundle));
-
-	/* get the bundle's URL */
-	myBundleURL = CFBundleCopyBundleURL(bundle);
-	if (myBundleURL == NULL) {
-		return;
-	}
-
-	/* get the targets */
-	targets = getTargets(bundle);
-	if (targets == NULL) {
-		/* if nothing to do */
-		CFRelease(myBundleURL);
-		return;
-	}
-
-	/* start a kicker for each target */
-	CFArrayApplyFunction(targets,
-			     CFRangeMake(0, CFArrayGetCount(targets)),
-			     startKicker,
-			     NULL);
-	CFRelease(targets);
-
-	return;
-}
-
-#ifdef	MAIN
-int
-main(int argc, char * const argv[])
-{
-	_sc_log     = FALSE;
-	_sc_verbose = (argc > 1) ? TRUE : FALSE;
-
-	load_Kicker(CFBundleGetMainBundle(), (argc > 1) ? TRUE : FALSE);
-	CFRunLoopRun();
-	/* not reached */
-	exit(0);
-	return 0;
-}
-#endif
diff --git a/Plugins/LinkConfiguration/Info.plist b/Plugins/LinkConfiguration/Info.plist
index addfd0e..a4e758f 100644
--- a/Plugins/LinkConfiguration/Info.plist
+++ b/Plugins/LinkConfiguration/Info.plist
@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>Requires</key>
 	<array>
 		<string>com.apple.SystemConfiguration.InterfaceNamer</string>
diff --git a/Plugins/LinkConfiguration/Makefile b/Plugins/LinkConfiguration/Makefile
new file mode 100644
index 0000000..135a805
--- /dev/null
+++ b/Plugins/LinkConfiguration/Makefile
@@ -0,0 +1,12 @@
+all : linkconfig
+
+linkconfig.o: linkconfig.c Makefile
+	cc -I../../SystemConfiguration.fproj -Wall -g -DMAIN -O0 -c linkconfig.c
+
+linkconfig: linkconfig.o Makefile
+#	cc -o linkconfig linkconfig.c -framework CoreFoundation -framework SystemConfiguration -framework IOKit
+	cc -o linkconfig linkconfig.o -framework CoreFoundation -framework SystemConfiguration
+
+clean:
+	rm -rf *.o linkconfig linkconfig.dSYM
+
diff --git a/Plugins/LinkConfiguration/linkconfig.c b/Plugins/LinkConfiguration/linkconfig.c
index b0d89df..3f73f2e 100644
--- a/Plugins/LinkConfiguration/linkconfig.c
+++ b/Plugins/LinkConfiguration/linkconfig.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2002-2007, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,7 +31,6 @@
 
 #include <stdio.h>
 #include <unistd.h>
-//#include <sys/fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/wait.h>
@@ -44,6 +43,8 @@
 #include <SystemConfiguration/LinkConfiguration.h>
 #include <SystemConfiguration/SCDPlugin.h>		// for _SCDPluginExecCommand
 
+#include "SCNetworkConfigurationInternal.h"
+
 
 static CFMutableDictionaryRef	baseSettings	= NULL;
 static CFStringRef		interfacesKey	= NULL;
@@ -54,9 +55,87 @@ static CFMutableDictionaryRef	wantSettings	= NULL;
 static Boolean			_verbose	= FALSE;
 
 
-/* in SystemConfiguration/LinkConfiguration.c */
-int
-__createMediaOptions(CFStringRef interfaceName, CFDictionaryRef media_options);
+#pragma mark -
+#pragma mark Capabilities
+
+
+#define	CAPABILITIES_KEY	CFSTR("_CAPABILITIES_")
+
+
+__private_extern__
+Boolean
+_SCNetworkInterfaceSetCapabilities(SCNetworkInterfaceRef	interface,
+				   CFDictionaryRef		options)
+{
+	CFDictionaryRef	baseOptions;
+	int		cap_base;
+	int		cap_current;
+	int		cap_requested;
+	CFStringRef	interfaceName;
+
+#ifdef	SIOCSIFCAP
+	struct ifreq	ifr;
+	int		ret;
+	int		sock;
+#endif	// SIOCSIFCAP
+
+	interfaceName = SCNetworkInterfaceGetBSDName(interface);
+	if (interfaceName == NULL) {
+		/* if no BSD interface name */
+		return FALSE;
+	}
+
+	cap_current = __SCNetworkInterfaceCreateCapabilities(interface, -1, NULL);
+	if (cap_current == -1) {
+		/* could not get current capabilities */
+		return FALSE;
+	}
+
+	// get base capabilities
+	cap_base = cap_current;
+	baseOptions = CFDictionaryGetValue(baseSettings, interfaceName);
+	if (baseOptions != NULL) {
+		CFNumberRef	num;
+
+		num = CFDictionaryGetValue(baseOptions, CAPABILITIES_KEY);
+		if (num != NULL) {
+			CFNumberGetValue(num, kCFNumberIntType, &cap_base);
+		}
+	}
+
+	cap_requested = __SCNetworkInterfaceCreateCapabilities(interface, cap_base, options);
+
+#ifdef	SIOCSIFCAP
+	if (cap_requested == cap_current) {
+		/* if current setting is as requested */
+		return TRUE;
+	}
+
+	bzero((char *)&ifr, sizeof(ifr));
+	(void)_SC_cfstring_to_cstring(interfaceName, ifr.ifr_name, sizeof(ifr.ifr_name), kCFStringEncodingASCII);
+	ifr.ifr_curcap = cap_current;
+	ifr.ifr_reqcap = cap_requested;
+
+	sock = socket(AF_INET, SOCK_DGRAM, 0);
+	if (sock == -1) {
+		SCLog(TRUE, LOG_ERR, CFSTR("socket() failed: %s"), strerror(errno));
+		return FALSE;
+	}
+
+	ret = ioctl(sock, SIOCSIFCAP, (caddr_t)&ifr);
+	(void)close(sock);
+	if (ret == -1) {
+		SCLog(TRUE, LOG_DEBUG, CFSTR("ioctl(SIOCSIFCAP) failed: %s"), strerror(errno));
+		return FALSE;
+	}
+#endif	// SIOCSIFCAP
+
+	return TRUE;
+}
+
+
+#pragma mark -
+#pragma mark Media options
 
 
 static CFDictionaryRef
@@ -109,10 +188,16 @@ _SCNetworkInterfaceSetMediaOptions(SCNetworkInterfaceRef	interface,
 	CFDictionaryRef		requested;
 	int			sock		= -1;
 
+	if (!isA_SCNetworkInterface(interface)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
 	interfaceName = SCNetworkInterfaceGetBSDName(interface);
 	if (interfaceName == NULL) {
 		/* if no BSD interface name */
 		SCLog(_verbose, LOG_INFO, CFSTR("no BSD interface name for %@"), interface);
+		_SCErrorSet(kSCStatusInvalidArgument);
 		return FALSE;
 	}
 
@@ -153,7 +238,7 @@ _SCNetworkInterfaceSetMediaOptions(SCNetworkInterfaceRef	interface,
 		goto done;
 	}
 
-	newOptions = __createMediaOptions(interfaceName, requested);
+	newOptions = __SCNetworkInterfaceCreateMediaOptions(interface, requested);
 	if (newOptions == -1) {
 		/* since we have just validated, this should never happen */
 		goto done;
@@ -199,6 +284,10 @@ _SCNetworkInterfaceSetMediaOptions(SCNetworkInterfaceRef	interface,
 }
 
 
+#pragma mark -
+#pragma mark MTU
+
+
 #ifndef	USE_SIOCSIFMTU
 static void
 ifconfig_exit(pid_t pid, int status, struct rusage *rusage, void *context)
@@ -336,6 +425,10 @@ _SCNetworkInterfaceSetMTU(SCNetworkInterfaceRef	interface,
 }
 
 
+#pragma mark -
+#pragma mark Update link configuration
+
+
 /*
  * Function: parse_component
  * Purpose:
@@ -427,6 +520,7 @@ updateLink(CFStringRef interfaceName, CFDictionaryRef options)
 
 	if (options != NULL) {
 		if (!CFDictionaryContainsKey(baseSettings, interfaceName)) {
+			int			cur_cap		= -1;
 			CFDictionaryRef		cur_media	= NULL;
 			CFMutableDictionaryRef	new_media	= NULL;
 			int			cur_mtu		= -1;
@@ -457,6 +551,23 @@ updateLink(CFStringRef interfaceName, CFDictionaryRef options)
 				}
 			}
 
+			/* preserve capabilities */
+			cur_cap = __SCNetworkInterfaceCreateCapabilities(interface, -1, NULL);
+			if (cur_cap != -1) {
+				CFNumberRef	num;
+
+				if (new_media == NULL) {
+					new_media = CFDictionaryCreateMutable(NULL,
+									      0,
+									      &kCFTypeDictionaryKeyCallBacks,
+									      &kCFTypeDictionaryValueCallBacks);
+				}
+
+				num = CFNumberCreate(NULL, kCFNumberIntType, &cur_cap);
+				CFDictionaryAddValue(new_media, CAPABILITIES_KEY, num);
+				CFRelease(num);
+			}
+
 			if (new_media != NULL) {
 				CFDictionarySetValue(baseSettings, interfaceName, new_media);
 				CFRelease(new_media);
@@ -464,6 +575,7 @@ updateLink(CFStringRef interfaceName, CFDictionaryRef options)
 		}
 
 		/* establish new settings */
+		(void)_SCNetworkInterfaceSetCapabilities(interface, options);
 		(void)_SCNetworkInterfaceSetMediaOptions(interface, options);
 		(void)_SCNetworkInterfaceSetMTU         (interface, options);
 	} else {
@@ -471,6 +583,7 @@ updateLink(CFStringRef interfaceName, CFDictionaryRef options)
 		options = CFDictionaryGetValue(baseSettings, interfaceName);
 		if (options != NULL) {
 			/* restore original settings */
+			(void)_SCNetworkInterfaceSetCapabilities(interface, options);
 			(void)_SCNetworkInterfaceSetMediaOptions(interface, options);
 			(void)_SCNetworkInterfaceSetMTU         (interface, options);
 			CFDictionaryRemoveValue(baseSettings, interfaceName);
@@ -634,12 +747,81 @@ load_LinkConfiguration(CFBundleRef bundle, Boolean bundleVerbose)
 
 
 #ifdef	MAIN
+
+
+#pragma mark -
+#pragma mark Standalone test code
+
+
 int
 main(int argc, char **argv)
 {
+	SCPreferencesRef	prefs;
+
 	_sc_log     = FALSE;
 	_sc_verbose = (argc > 1) ? TRUE : FALSE;
 
+	prefs = SCPreferencesCreate(NULL, CFSTR("linkconfig"), NULL);
+	if (prefs != NULL) {
+		SCNetworkSetRef	set;
+
+		set = SCNetworkSetCopyCurrent(prefs);
+		if (set != NULL) {
+			CFMutableSetRef	seen;
+			CFArrayRef	services;
+
+			services = SCNetworkSetCopyServices(set);
+			if (services != NULL) {
+				CFIndex		i;
+				CFIndex		n;
+
+				seen = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+
+				n = CFArrayGetCount(services);
+				for (i = 0; i < n; i++) {
+					SCNetworkInterfaceRef	interface;
+					SCNetworkServiceRef	service;
+
+					service = CFArrayGetValueAtIndex(services, i);
+					interface = SCNetworkServiceGetInterface(service);
+					if ((interface != NULL) &&
+					    !CFSetContainsValue(seen, interface)){
+						CFDictionaryRef	capabilities;
+
+						capabilities = SCNetworkInterfaceCopyCapability(interface, NULL);
+						if (capabilities != NULL) {
+							int		cap_current;
+							int		cap_requested;
+							CFDictionaryRef	options;
+
+							options = SCNetworkInterfaceGetConfiguration(interface);
+							cap_current   = __SCNetworkInterfaceCreateCapabilities(interface, -1, NULL);
+							cap_requested = __SCNetworkInterfaceCreateCapabilities(interface, cap_current, options);
+
+							SCPrint(TRUE, stdout,
+								CFSTR("%sinterface = %@, current = %p, requested = %p\n%@\n"),
+								(i == 0) ? "" : "\n",
+								SCNetworkInterfaceGetBSDName(interface),
+								(void *)(uintptr_t)cap_current,
+								(void *)(uintptr_t)cap_requested,
+								capabilities);
+							CFRelease(capabilities);
+						}
+
+						CFSetAddValue(seen, interface);
+					}
+				}
+
+				CFRelease(seen);
+				CFRelease(services);
+			}
+
+			CFRelease(set);
+		}
+
+		CFRelease(prefs);
+	}
+
 	load_LinkConfiguration(CFBundleGetMainBundle(), (argc > 1) ? TRUE : FALSE);
 	CFRunLoopRun();
 	/* not reached */
diff --git a/Plugins/Logger/Info-Embedded.plist b/Plugins/Logger/Info-Embedded.plist
index d460282..42509e5 100644
--- a/Plugins/Logger/Info-Embedded.plist
+++ b/Plugins/Logger/Info-Embedded.plist
@@ -15,13 +15,13 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>Enabled</key>
-	<true/>
+	<false/>
 	<key>Verbose</key>
 	<false/>
 	<key>LOG_ALL</key>
diff --git a/Plugins/Logger/Info.plist b/Plugins/Logger/Info.plist
index 6d96c49..a5ca3f6 100644
--- a/Plugins/Logger/Info.plist
+++ b/Plugins/Logger/Info.plist
@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>Enabled</key>
 	<false/>
 	<key>Verbose</key>
diff --git a/Plugins/Logger/Makefile b/Plugins/Logger/Makefile
index 1fa0070..6e67879 100644
--- a/Plugins/Logger/Makefile
+++ b/Plugins/Logger/Makefile
@@ -1,5 +1,5 @@
 logger: logger.c
-	cc -Wall -g -DMAIN -o logger logger.c -framework CoreFoundation -framework SystemConfiguration -framework IOKit -ldnsinfo
+	cc -Wall -g -DMAIN -o logger logger.c -framework CoreFoundation -framework SystemConfiguration -framework IOKit
 
 clean:
 	rm -rf logger logger.dSYM
diff --git a/Plugins/Logger/logger.c b/Plugins/Logger/logger.c
index 3abe51d..489734c 100644
--- a/Plugins/Logger/logger.c
+++ b/Plugins/Logger/logger.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2005-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -55,10 +55,14 @@
 #include <IOKit/IOMessage.h>
 #include <IOKit/pwr_mgt/IOPM.h>
 #include <IOKit/pwr_mgt/IOPMLib.h>
+#include <IOKit/pwr_mgt/IOPMLibPrivate.h>
 
 #include <dnsinfo.h>
 #include <notify.h>
+#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) && !TARGET_OS_EMBEDDED
 #include <utmpx.h>
+#include <utmpx_thread.h>
+#endif	// !(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) && !TARGET_OS_EMBEDDED
 
 
 /* generic MessageTracer keys */
@@ -133,7 +137,7 @@ copyInterfaceFlags(const char *if_name)
 	}
 
 	bzero((char *)&ifr, sizeof(ifr));
-	(void) strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
+	(void) strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
 	if (ioctl(sock, SIOCGIFFLAGS, (caddr_t)&ifr) == 0) {
 		struct ifmediareq	ifm;
 
@@ -233,11 +237,10 @@ KernelEvent_notification(CFSocketRef s, CFSocketCallBackType type, CFDataRef add
 						switch (ev_msg->kev_subclass) {
 							case KEV_DL_SUBCLASS : {
 								struct net_event_data	*ev;
-								char			if_name[IFNAMSIZ+1];
+								char			if_name[IFNAMSIZ];
 
 								ev = (struct net_event_data *)event_data;
 
-								bzero(&if_name, sizeof(if_name));
 								snprintf(if_name, IFNAMSIZ, "%s%d",
 									 ev->if_name,
 									 ev->if_unit);
@@ -296,12 +299,11 @@ KernelEvent_notification(CFSocketRef s, CFSocketCallBackType type, CFDataRef add
 							case KEV_INET_SUBCLASS : {
 								char			addr[128];
 								struct kev_in_data	*ev;
-								char			if_name[IFNAMSIZ+1];
+								char			if_name[IFNAMSIZ];
 								char			mask[128];
 
 								ev = (struct kev_in_data *)event_data;
 
-								bzero(&if_name, sizeof(if_name));
 								snprintf(if_name, IFNAMSIZ, "%s%d",
 									 ev->link_data.if_name,
 									 ev->link_data.if_unit);
@@ -365,12 +367,11 @@ KernelEvent_notification(CFSocketRef s, CFSocketCallBackType type, CFDataRef add
 							case KEV_INET6_SUBCLASS : {
 								char			addr[128];
 								struct kev_in6_data	*ev;
-								char			if_name[IFNAMSIZ+1];
+								char			if_name[IFNAMSIZ];
 								int			plen	= 0;
 
 								ev = (struct kev_in6_data *)event_data;
 
-								bzero(&if_name, sizeof(if_name));
 								snprintf(if_name, IFNAMSIZ, "%s%d",
 									 ev->link_data.if_name,
 									 ev->link_data.if_unit);
@@ -459,9 +460,9 @@ add_KernelEvent_notification()
 	}
 
 	/* establish filter to return all events */
-	kev_req.vendor_code  = 0;
-	kev_req.kev_class    = 0;	/* Not used if vendor_code is 0 */
-	kev_req.kev_subclass = 0;	/* Not used if either kev_class OR vendor_code are 0 */
+	kev_req.vendor_code  = KEV_VENDOR_APPLE;
+	kev_req.kev_class    = KEV_NETWORK_CLASS;
+	kev_req.kev_subclass = KEV_ANY_SUBCLASS;
 	if (ioctl(so, SIOCSKEVFILT, &kev_req) == -1) {
 		SCLOG(NULL, NULL, ASL_LEVEL_ERR, CFSTR("ioctl(, SIOCSKEVFILT, ) failed"));
 		(void)close(so);
@@ -718,7 +719,8 @@ NetworkChange_notification(SCDynamicStoreRef store, CFArrayRef changedKeys, void
 			}
 			CFStringAppendFormat(str, NULL, CFSTR("\n%@ (%s)"), key, val);
 		} else if (CFStringHasSuffix(key, kSCEntNetIPv4) ||
-			   CFStringHasSuffix(key, kSCEntNetIPv6)) {
+			   CFStringHasSuffix(key, kSCEntNetIPv6) ||
+			   CFStringHasSuffix(key, kSCEntNetDNS)) {
 			CFDictionaryRef	dict;
 
 			dict = SCDynamicStoreCopyValue(store, key);
@@ -732,6 +734,20 @@ NetworkChange_notification(SCDynamicStoreRef store, CFArrayRef changedKeys, void
 			} else {
 				CFStringAppendFormat(str, NULL, CFSTR("\n%@ : removed"), key);
 			}
+		} else if (CFStringHasSuffix(key, CFSTR(kIOPMSystemPowerCapabilitiesKeySuffix))) {
+			CFNumberRef	num;
+
+			num = SCDynamicStoreCopyValue(store, key);
+			if (num != NULL) {
+				IOPMSystemPowerStateCapabilities	capabilities;
+
+				if (isA_CFNumber(num) &&
+				    CFNumberGetValue(num, kCFNumberSInt32Type, &capabilities)) {
+					CFStringAppendFormat(str, NULL, CFSTR("\n%@ (0x%x)"), key, capabilities);
+				}
+
+				CFRelease(num);
+			}
 		} else {
 			CFStringAppendFormat(str, NULL, CFSTR("\n%@"), key);
 		}
@@ -798,6 +814,24 @@ add_NetworkChange_notification()
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
 
+	// PPP, VPN
+
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetPPP);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+	pattern = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetPPP);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetVPN);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+	pattern = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetVPN);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
 	// Link
 
 	pattern = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetLink);
@@ -840,6 +874,12 @@ add_NetworkChange_notification()
 	CFArrayAppendValue(keys, key);
 	CFRelease(key);
 
+	key = SCDynamicStoreKeyCreate(NULL, CFSTR("%@%@"),
+				      kSCDynamicStoreDomainState,
+				      CFSTR(kIOPMSystemPowerCapabilitiesKeySuffix));
+	CFArrayAppendValue(keys, key);
+	CFRelease(key);
+
 	ok = SCDynamicStoreSetNotificationKeys(store, keys, patterns);
 	CFRelease(keys);
 	CFRelease(patterns);
@@ -1270,7 +1310,7 @@ add_dnsinfo_notification()
 		return;
 	}
 
-	mp = CFMachPortCreateWithPort(NULL, notify_port, dnsinfo_notification, NULL, NULL);
+	mp = _SC_CFMachPortCreateWithPort("Logger/dns_configuration", notify_port, dnsinfo_notification, NULL);
 	if (mp == NULL) {
 		SCLOG(NULL, NULL, ASL_LEVEL_ERR, CFSTR("CFMachPortCreateWithPort() failed"));
 		(void)notify_cancel(notify_token);
@@ -1327,7 +1367,7 @@ add_network_notification()
 		return;
 	}
 
-	mp = CFMachPortCreateWithPort(NULL, notify_port, network_notification, NULL, NULL);
+	mp = _SC_CFMachPortCreateWithPort("Logger/network_change", notify_port, network_notification, NULL);
 	if (mp == NULL) {
 		SCLOG(NULL, NULL, ASL_LEVEL_ERR, CFSTR("CFMachPortCreateWithPort() failed"));
 		(void)notify_cancel(notify_token);
@@ -1386,7 +1426,7 @@ add_smbconf_notification()
 		return;
 	}
 
-	mp = CFMachPortCreateWithPort(NULL, notify_port, smbconf_notification, NULL, NULL);
+	mp = _SC_CFMachPortCreateWithPort("Logger/smb_configuration", notify_port, smbconf_notification, NULL);
 	if (mp == NULL) {
 		SCLOG(NULL, NULL, ASL_LEVEL_ERR, CFSTR("CFMachPortCreateWithPort() failed"));
 		(void)notify_cancel(notify_token);
@@ -1413,7 +1453,7 @@ add_smbconf_notification()
 #pragma mark pututxline Events
 
 
-#if	!TARGET_OS_EMBEDDED
+#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) && !TARGET_OS_EMBEDDED
 static const char *
 ut_time(struct utmpx *utmpx)
 {
@@ -1470,14 +1510,15 @@ pututxline_notification(CFMachPortRef port, void *msg, CFIndex size, void *info)
 {
 	CFMutableStringRef	str	= CFStringCreateMutable(NULL, 0);
 	struct utmpx		*utmpx;
+	utmpx_t			utx;
 
 	CFStringAppendFormat(str,
 			     NULL,
 			     CFSTR("%s pututxline notification"),
 			     elapsed());
 
-	setutxent();
-	while ((utmpx = getutxent()) != NULL) {
+	utx = _openutx(NULL);
+	while ((utmpx = _getutxent(utx)) != NULL) {
 		const char *	entry_id	= NULL;
 		const char *	entry_line	= NULL;
 		const char *	entry_pid	= NULL;
@@ -1565,7 +1606,7 @@ pututxline_notification(CFMachPortRef port, void *msg, CFIndex size, void *info)
 
 		CFStringAppendFormat(str, NULL, CFSTR("%s"), line);
 	}
-	endutxent();
+	_endutxent(utx);
 
 	SCLOG(NULL, log_msg, ~ASL_LEVEL_INFO, CFSTR("%@"), str);
 	CFRelease(str);
@@ -1588,7 +1629,7 @@ add_pututxline_notification()
 		return;
 	}
 
-	mp = CFMachPortCreateWithPort(NULL, notify_port, pututxline_notification, NULL, NULL);
+	mp = _SC_CFMachPortCreateWithPort("Logger/utmpx", notify_port, pututxline_notification, NULL);
 	if (mp == NULL) {
 		SCLOG(NULL, NULL, ASL_LEVEL_ERR, CFSTR("CFMachPortCreateWithPort() failed"));
 		(void)notify_cancel(notify_token);
@@ -1608,7 +1649,7 @@ add_pututxline_notification()
 	CFRelease(mp);
 	return;
 }
-#endif	// !TARGET_OS_EMBEDDED
+#endif	// (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) && !TARGET_OS_EMBEDDED
 
 
 #pragma mark -
@@ -1704,7 +1745,7 @@ add_BTMM_notification()
 #pragma mark -
 
 
-static inline Boolean
+static __inline__ Boolean
 bValFromDictionary(CFDictionaryRef dict, CFStringRef key)
 {
 	CFBooleanRef	bVal;
@@ -1765,11 +1806,11 @@ load(CFBundleRef bundle, Boolean bundleVerbose)
 	}
 #endif	// !TARGET_OS_EMBEDDED
 
-#if	!TARGET_OS_EMBEDDED
+#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) && !TARGET_OS_EMBEDDED
 	if (log_all || bValFromDictionary(config, CFSTR("LOG_NOTIFY_UTMPX_CHANGE"))) {
 		add_pututxline_notification();
 	}
-#endif	// !TARGET_OS_EMBEDDED
+#endif	// (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) && !TARGET_OS_EMBEDDED
 
 #if	!TARGET_OS_EMBEDDED
 	if (log_all || bValFromDictionary(config, CFSTR("LOG_SC_BTMM_CONFIGURATION"))) {
@@ -1807,6 +1848,10 @@ load(CFBundleRef bundle, Boolean bundleVerbose)
 			hosts = NULL;
 		}
 
+		if (verbose) {
+			_sc_debug = TRUE;
+		}
+
 		add_reachability_notification(hosts);
 	}
 
diff --git a/Plugins/NetworkIdentification/Info.plist b/Plugins/NetworkIdentification/Info.plist
index d5421f8..f3aa421 100644
--- a/Plugins/NetworkIdentification/Info.plist
+++ b/Plugins/NetworkIdentification/Info.plist
@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>Builtin</key>
 	<true/>
 </dict>
diff --git a/Plugins/PreferencesMonitor/Info.plist b/Plugins/PreferencesMonitor/Info.plist
index af8557a..d202828 100644
--- a/Plugins/PreferencesMonitor/Info.plist
+++ b/Plugins/PreferencesMonitor/Info.plist
@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>Builtin</key>
 	<true/>
 	<key>Requires</key>
diff --git a/Plugins/PreferencesMonitor/prefsmon.c b/Plugins/PreferencesMonitor/prefsmon.c
index 637f827..bd496eb 100644
--- a/Plugins/PreferencesMonitor/prefsmon.c
+++ b/Plugins/PreferencesMonitor/prefsmon.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2008, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -63,6 +63,7 @@ static CFMutableDictionaryRef	newPrefs;		/* new prefs */
 static CFMutableArrayRef	unchangedPrefsKeys;	/* new prefs keys which match current */
 static CFMutableArrayRef	removedPrefsKeys;	/* old prefs keys to be removed */
 
+static Boolean			rofs		= FALSE;
 static Boolean			_verbose	= FALSE;
 
 
@@ -146,6 +147,9 @@ establishNewPreferences()
 			if (sc_status == EROFS) {
 				/* a read-only fileysstem is OK */
 				ok = TRUE;
+
+				/* ... but we don't want to synchronize */
+				rofs = TRUE;
 			}
 		}
 
@@ -199,7 +203,7 @@ quiet(Boolean *timeout)
 static void
 watchQuietDisable()
 {
-	if ((initKey == NULL) && (initRls == NULL)) {
+	if ((initKey == NULL) || (initRls == NULL)) {
 		return;
 	}
 
@@ -612,7 +616,9 @@ updateConfiguration(SCPreferencesRef		prefs,
 	updateSCDynamicStore(prefs);
 
 	/* finished with current prefs, wait for changes */
-	SCPreferencesSynchronize(prefs);
+	if (!rofs) {
+		SCPreferencesSynchronize(prefs);
+	}
 
 	return;
 }
diff --git a/SCMonitor/Info.plist b/SCMonitor/Info.plist
index 094b9d1..0f5dca2 100644
--- a/SCMonitor/Info.plist
+++ b/SCMonitor/Info.plist
@@ -15,11 +15,11 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>CFPlugInDynamicRegistration</key>
 	<string>NO</string>
 	<key>CFPlugInFactories</key>
diff --git a/SCMonitor/monitor.c b/SCMonitor/monitor.c
index 17b347d..a7d3fef 100644
--- a/SCMonitor/monitor.c
+++ b/SCMonitor/monitor.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2007-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -75,6 +75,8 @@ typedef struct {
 	CFUUIDRef			_factoryID;
 	UInt32				_refCount;
 
+	Boolean				debug;
+
 	aslmsg				log_msg;
 
 	CFStringRef			configuration_action;
@@ -96,11 +98,85 @@ typedef struct {
 
 	CFUserNotificationRef		userNotification;
 	CFRunLoopSourceRef		userRls;
+
+	AuthorizationRef		authorization;
 } MyType;
 
 static CFMutableDictionaryRef	notify_to_instance	= NULL;
 
 
+#pragma mark -
+#pragma mark Authorization
+
+
+static AuthorizationRef
+getAuthorization(MyType *myInstance)
+{
+	if (myInstance->authorization == NULL) {
+		AuthorizationFlags	flags	= kAuthorizationFlagDefaults;
+		OSStatus		status;
+
+		status = AuthorizationCreate(NULL,
+					     kAuthorizationEmptyEnvironment,
+					     flags,
+					     &myInstance->authorization);
+		if (status != errAuthorizationSuccess) {
+			SCLOG(NULL, myInstance->log_msg, ASL_LEVEL_ERR,
+			      CFSTR("AuthorizationCreate() failed: status = %d"),
+			      status);
+		}
+	}
+
+	return myInstance->authorization;
+}
+
+
+static Boolean
+hasAuthorization(MyType *myInstance)
+{
+	AuthorizationRef	authorization;
+	Boolean			isAdmin		= FALSE;
+
+	authorization = getAuthorization(myInstance);
+	if (authorization != NULL) {
+		AuthorizationFlags	flags	= kAuthorizationFlagDefaults;
+		AuthorizationItem	items[1];
+		AuthorizationRights	rights;
+		OSStatus		status;
+
+		items[0].name        = "system.preferences";
+		items[0].value       = NULL;
+		items[0].valueLength = 0;
+		items[0].flags       = 0;
+
+		rights.count = sizeof(items) / sizeof(items[0]);
+		rights.items = items;
+
+		status = AuthorizationCopyRights(authorization,
+						 &rights,
+						 kAuthorizationEmptyEnvironment,
+						 flags,
+						 NULL);
+		isAdmin = (status == errAuthorizationSuccess);
+	}
+
+	return isAdmin;
+}
+
+
+static void
+freeAuthorization(MyType *myInstance)
+{
+	if (myInstance->authorization != NULL) {
+		AuthorizationFree(myInstance->authorization, kAuthorizationFlagDefaults);
+//              AuthorizationFree(myInstance->authorization, kAuthorizationFlagDestroyRights);
+		myInstance->authorization = NULL;
+	}
+
+	return;
+}
+
+
 #pragma mark -
 #pragma mark New interface notification / configuration
 
@@ -377,7 +453,6 @@ notify_add(MyType *myInstance)
 static void
 notify_configure(MyType *myInstance)
 {
-	AuthorizationRef	authorization	= NULL;
 	CFIndex			i;
 	CFIndex			n		= CFArrayGetCount(myInstance->interfaces_configure);
 	Boolean			ok;
@@ -387,17 +462,10 @@ notify_configure(MyType *myInstance)
 	if (geteuid() == 0) {
 		prefs = SCPreferencesCreate(NULL, CFSTR("SCMonitor"), NULL);
 	} else {
-		AuthorizationFlags	flags		= kAuthorizationFlagDefaults;
-		OSStatus		status;
+		AuthorizationRef	authorization;
 
-		status = AuthorizationCreate(NULL,
-					     kAuthorizationEmptyEnvironment,
-					     flags,
-					     &authorization);
-		if (status != errAuthorizationSuccess) {
-			SCLOG(NULL, myInstance->log_msg, ASL_LEVEL_ERR,
-			      CFSTR("AuthorizationCreate() failed: status = %d"),
-			      status);
+		authorization = getAuthorization(myInstance);
+		if (authorization == NULL) {
 			return;
 		}
 
@@ -453,12 +521,6 @@ notify_configure(MyType *myInstance)
 		prefs = NULL;
 	}
 
-	if (authorization != NULL) {
-		AuthorizationFree(authorization, kAuthorizationFlagDefaults);
-//              AuthorizationFree(authorization, kAuthorizationFlagDestroyRights);
-		authorization = NULL;
-	}
-
 	CFRelease(myInstance->interfaces_configure);
 	myInstance->interfaces_configure = NULL;
 
@@ -495,7 +557,7 @@ updateInterfaceList(MyType *myInstance)
 
 	interfaces_old = CFSetCreateMutableCopy(NULL, 0, myInstance->interfaces_known);
 
-	interfaces = SCNetworkInterfaceCopyAll();
+	interfaces = _SCNetworkInterfaceCopyAllWithPreferences(prefs);
 	if (interfaces != NULL) {
 		n = CFArrayGetCount(interfaces);
 		for (i = 0; i < n; i++) {
@@ -543,6 +605,12 @@ updateInterfaceList(MyType *myInstance)
 						myInstance->interfaces_configure = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 					}
 					CFArrayAppendValue(myInstance->interfaces_configure, interface);
+				} else if (hasAuthorization(myInstance)) {
+					// if we already have the "admin" (system.preferences) right, configure automatically (without user intervention)
+					if (myInstance->interfaces_configure == NULL) {
+						myInstance->interfaces_configure = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+					}
+					CFArrayAppendValue(myInstance->interfaces_configure, interface);
 				} else {
 					// notify user
 					if (myInstance->interfaces_prompt == NULL) {
@@ -841,14 +909,14 @@ add_init_watcher(MyType *myInstance, io_registry_entry_t interface)
 	while (node != MACH_PORT_NULL) {
 		io_registry_entry_t	parent;
 
-		val = IORegistryEntryCreateCFProperty(node, CFSTR("HiddenPort"), NULL, 0);
+		val = IORegistryEntryCreateCFProperty(node, kSCNetworkInterfaceHiddenPortKey, NULL, 0);
 		if (val != NULL) {
 			CFRelease(val);
 			val = NULL;
 			break;
 		}
 
-		val = IORegistryEntryCreateCFProperty(node, CFSTR("Initializing"), NULL, 0);
+		val = IORegistryEntryCreateCFProperty(node, kSCNetworkInterfaceInitializingKey, NULL, 0);
 		if (val != NULL) {
 			break;
 		}
@@ -1007,12 +1075,19 @@ watcher_add(MyType *myInstance)
 	bundle = CFBundleGetBundleWithIdentifier(CFSTR(MY_BUNDLE_ID));
 	if (bundle != NULL) {
 		CFStringRef	action;
+		CFBooleanRef	bVal;
 		CFDictionaryRef	info;
 
 		info = CFBundleGetInfoDictionary(bundle);
+
+		bVal = CFDictionaryGetValue(info, CFSTR("Debug"));
+		bVal = isA_CFBoolean(bVal);
+		if (bVal != NULL) {
+			myInstance->debug = CFBooleanGetValue(bVal);
+		}
+
 		action = CFDictionaryGetValue(info, kSCNetworkInterfaceConfigurationActionKey);
 		action = isA_CFString(action);
-
 		if (action != NULL) {
 			myInstance->configuration_action = action;
 		} else {
@@ -1095,6 +1170,7 @@ myRelease(void *myInstance)
 
 			watcher_remove((MyType *)myInstance);
 			notify_remove((MyType *)myInstance, TRUE);
+			freeAuthorization((MyType *)myInstance);
 		}
 		free(myInstance);
 		return 0;
diff --git a/SystemConfiguration.fproj/AppWorkaround.plist b/SystemConfiguration.fproj/AppWorkaround.plist
new file mode 100644
index 0000000..e4c1550
--- /dev/null
+++ b/SystemConfiguration.fproj/AppWorkaround.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>kCSCheckFixVersion</key>
+	<string>1</string>
+	<key>kCSCheckFixUniversal</key>
+	<dict>
+		<key>7408115</key>
+		<dict>
+			<key>com.mackiev.3dweatherglobe</key>
+			<array>
+				<string>231</string>
+				<string>232</string>
+			</array>
+		</dict>
+		<key>9022571</key>
+		<dict>
+			<key>com.mackiev.3dweatherglobe</key>
+			<array>
+				<string>256</string>
+			</array>
+		</dict>
+	</dict>
+</dict>
+</plist>
diff --git a/SystemConfiguration.fproj/BondConfiguration.c b/SystemConfiguration.fproj/BondConfiguration.c
index 7746e7a..4b48910 100644
--- a/SystemConfiguration.fproj/BondConfiguration.c
+++ b/SystemConfiguration.fproj/BondConfiguration.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -100,7 +100,7 @@ if_bond_status_req_copy(int s, const char * ifname)
 	struct ifreq			ifr;
 
 	bzero(&ifr, sizeof(ifr));
-	strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+	strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
 	bzero((char *)&ibr, sizeof(ibr));
 	ibr.ibr_op = IF_BOND_OP_GET_STATUS;
 	ibsr_p = &ibr.ibr_ibru.ibru_status;
@@ -393,7 +393,7 @@ SCBondInterfaceCopyAll(SCPreferencesRef prefs)
 
 
 __private_extern__ void
-__SCBondInterfaceListCopyMembers(CFArrayRef interfaces, CFMutableSetRef set)
+__SCBondInterfaceListCollectMembers(CFArrayRef interfaces, CFMutableSetRef set)
 {
 	CFIndex	i;
 	CFIndex	n;
@@ -428,16 +428,23 @@ CFArrayRef /* of SCNetworkInterfaceRef's */
 SCBondInterfaceCopyAvailableMemberInterfaces(SCPreferencesRef prefs)
 {
 	CFMutableArrayRef	available;
-	CFMutableSetRef		exclude;
+	CFMutableSetRef		excluded;
 	CFArrayRef		interfaces;
 
 	available = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-	exclude   = CFSetCreateMutable  (NULL, 0, &kCFTypeSetCallBacks);
+	excluded  = CFSetCreateMutable  (NULL, 0, &kCFTypeSetCallBacks);
 
 	// exclude Bond [member] interfaces
 	interfaces = SCBondInterfaceCopyAll(prefs);
 	if (interfaces != NULL) {
-		__SCBondInterfaceListCopyMembers(interfaces, exclude);
+		__SCBondInterfaceListCollectMembers(interfaces, excluded);
+		CFRelease(interfaces);
+	}
+
+	// exclude Bridge [member] interfaces
+	interfaces = SCBridgeInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		__SCBridgeInterfaceListCollectMembers(interfaces, excluded);
 		CFRelease(interfaces);
 	}
 
@@ -455,7 +462,7 @@ SCBondInterfaceCopyAvailableMemberInterfaces(SCPreferencesRef prefs)
 			// exclude the physical interface of this VLAN
 			vlanInterface = CFArrayGetValueAtIndex(interfaces, i);
 			physical = SCVLANInterfaceGetPhysicalInterface(vlanInterface);
-			CFSetAddValue(exclude, physical);
+			CFSetAddValue(excluded, physical);
 		}
 		CFRelease(interfaces);
 	}
@@ -479,7 +486,7 @@ SCBondInterfaceCopyAvailableMemberInterfaces(SCPreferencesRef prefs)
 				continue;
 			}
 
-			if (CFSetContainsValue(exclude, interface)) {
+			if (CFSetContainsValue(excluded, interface)) {
 				// if excluded
 				continue;
 			}
@@ -489,7 +496,7 @@ SCBondInterfaceCopyAvailableMemberInterfaces(SCPreferencesRef prefs)
 		CFRelease(interfaces);
 	}
 
-	CFRelease(exclude);
+	CFRelease(excluded);
 
 	return available;
 }
@@ -567,12 +574,9 @@ _SCBondInterfaceCopyActive(void)
 			// iterate over each member interface
 			ibs_p = (struct if_bond_status *)ibsr_p->ibsr_buffer;
 			for (i = 0; i < ibsr_p->ibsr_total; i++) {
-				char		if_name[IFNAMSIZ + 1];
 				CFStringRef	member;
 
-				bzero(&if_name, sizeof(if_name));
-				bcopy(ibs_p[i].ibs_if_name, if_name, IFNAMSIZ);
-				member = CFStringCreateWithCString(NULL, if_name, kCFStringEncodingASCII);
+				member = CFStringCreateWithCString(NULL, ibs_p[i].ibs_if_name, kCFStringEncodingASCII);
 				add_interface(&members, member);
 				CFRelease(member);
 			}
@@ -802,7 +806,8 @@ Boolean
 SCBondInterfaceSetMemberInterfaces(SCBondInterfaceRef bond, CFArrayRef members)
 {
 	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bond;
-	Boolean				ok			= TRUE;
+	Boolean				ok;
+	int				sc_status		= kSCStatusOK;
 
 	if (!isA_SCBondInterface(bond)) {
 		_SCErrorSet(kSCStatusInvalidArgument);
@@ -821,6 +826,7 @@ SCBondInterfaceSetMemberInterfaces(SCBondInterfaceRef bond, CFArrayRef members)
 		CFIndex		n_available;
 		CFIndex		n_current;
 		CFIndex		n_members;
+		CFArrayRef	services	= NULL;
 
 		current     = SCBondInterfaceGetMemberInterfaces(bond);
 		n_current   = (current != NULL) ? CFArrayGetCount(current) : 0;
@@ -842,26 +848,37 @@ SCBondInterfaceSetMemberInterfaces(SCBondInterfaceRef bond, CFArrayRef members)
 
 			if ((available != NULL) &&
 			    CFArrayContainsValue(available, CFRangeMake(0, n_available), member)) {
-				// available members are allowed
+				// available members are allowed but cannot be associated
+				// with any other network services.
+
+				if (services == NULL) {
+					services = __SCNetworkServiceCopyAllEnabled(interfacePrivate->prefs);
+				}
+				if ((services != NULL) &&
+				    __SCNetworkServiceExistsForInterface(services, member)) {
+					sc_status = kSCStatusKeyExists;
+					break;
+				}
+
+				// if available
 				continue;
 			}
 
 			// if member not allowed
-			ok = FALSE;
+			sc_status = kSCStatusInvalidArgument;
 			break;
 		}
 
-		CFRelease(available);
-
-		if (!ok) {
-			_SCErrorSet(kSCStatusInvalidArgument);
-		}
+		if (available != NULL) CFRelease(available);
+		if (services != NULL) CFRelease(services);
 	}
 
-	if (ok) {
-		ok = _SCBondInterfaceSetMemberInterfaces(bond, members);
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+		return FALSE;
 	}
 
+	ok = _SCBondInterfaceSetMemberInterfaces(bond, members);
 	return ok;
 }
 
@@ -1308,7 +1325,7 @@ SCBondInterfaceCopyStatus(SCBondInterfaceRef bond)
 	int				bond_if_status;
 	CFIndex				i;
 	struct if_bond_status_req	*ibsr_p		= NULL;
-	char				if_name[IFNAMSIZ + 1];
+	char				if_name[IFNAMSIZ];
 	CFIndex				n;
 	CFNumberRef			num;
 	int				s;
@@ -1426,8 +1443,7 @@ SCBondInterfaceCopyStatus(SCBondInterfaceRef bond)
 		}
 
 		// interface
-		bzero(&if_name, sizeof(if_name));
-		bcopy(scan_p->ibs_if_name, if_name, IFNAMSIZ);
+		strlcpy(if_name, scan_p->ibs_if_name, sizeof(if_name));
 		interface_name = CFStringCreateWithCString(NULL, if_name, kCFStringEncodingASCII);
 		interface = _SCNetworkInterfaceCreateWithBSDName(NULL, interface_name,
 								 kIncludeNoVirtualInterfaces);
@@ -1600,11 +1616,11 @@ _SCBondInterfaceUpdateConfiguration(SCPreferencesRef prefs)
 
 	/* configured Bonds */
 	config  = SCBondInterfaceCopyAll(prefs);
-	nConfig = CFArrayGetCount(config);
+	nConfig = (config != NULL) ? CFArrayGetCount(config) : 0;
 
 	/* active Bonds */
 	active  = _SCBondInterfaceCopyActive();
-	nActive = CFArrayGetCount(active);
+	nActive = (active != NULL) ? CFArrayGetCount(active) : 0;
 
 	/*
 	 * remove any no-longer-configured bond interfaces and
@@ -1710,7 +1726,7 @@ _SCBondInterfaceUpdateConfiguration(SCPreferencesRef prefs)
 		c_bond            = CFArrayGetValueAtIndex(config, i);
 		c_bond_if         = SCNetworkInterfaceGetBSDName(c_bond);
 		c_bond_interfaces = SCBondInterfaceGetMemberInterfaces(c_bond);
-		c_bond_mode		  = SCBondInterfaceGetMode(c_bond);
+		c_bond_mode       = SCBondInterfaceGetMode(c_bond);
 		c_count           = (c_bond_interfaces != NULL) ? CFArrayGetCount(c_bond_interfaces) : 0;
 
 		for (j = 0; j < nActive; j++) {
diff --git a/SystemConfiguration.fproj/BridgeConfiguration.c b/SystemConfiguration.fproj/BridgeConfiguration.c
new file mode 100644
index 0000000..806856c
--- /dev/null
+++ b/SystemConfiguration.fproj/BridgeConfiguration.c
@@ -0,0 +1,1221 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * Modification History
+ *
+ * July 27, 2009		Allan Nathanson <ajn@apple.com>
+ * - initial revision
+ */
+
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreFoundation/CFRuntime.h>
+
+#include <SystemConfiguration/SystemConfiguration.h>
+#include "SCNetworkConfigurationInternal.h"
+#include <SystemConfiguration/SCValidation.h>
+#include <SystemConfiguration/SCPrivate.h>
+
+#include <ifaddrs.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sysctl.h>
+#include <net/ethernet.h>
+#define	KERNEL_PRIVATE
+#include <net/if.h>
+#include <net/if_var.h>
+#undef	KERNEL_PRIVATE
+#include <net/if_types.h>
+#include <net/if_media.h>
+#include <net/route.h>
+
+#ifdef	IFT_BRIDGE
+#include <net/if_bridgevar.h>
+#endif	// IFT_BRIDGE
+
+/* ---------- Bridge support ---------- */
+
+static int
+inet_dgram_socket()
+{
+	int	s;
+
+	s = socket(AF_INET, SOCK_DGRAM, 0);
+	if (s == -1) {
+		SCLog(TRUE, LOG_ERR, CFSTR("socket() failed: %s"), strerror(errno));
+	}
+
+	return s;
+}
+
+#ifdef	IFT_BRIDGE
+static struct ifbifconf *
+ifbifconf_copy(int s, const char * ifname)
+{
+	void *			buf;
+	size_t			buflen;
+	struct ifbifconf *	ibc_p	= NULL;
+	struct ifdrv		ifd;
+	uint32_t		len	= sizeof(struct ifbreq) * 16;
+
+	bzero(&ifd, sizeof(ifd));
+	strncpy(ifd.ifd_name, ifname, sizeof(ifd.ifd_name));
+	ifd.ifd_cmd = BRDGGIFS;
+
+	buflen = sizeof(struct ifbifconf) + len;
+	buf = malloc(buflen);
+	while (buf != NULL) {
+		bzero(buf, buflen);
+		ibc_p = (struct ifbifconf *)buf;
+		ibc_p->ifbic_len = len;
+		ibc_p->ifbic_buf = buf + sizeof(*ibc_p);
+
+		ifd.ifd_len = sizeof(*ibc_p);
+		ifd.ifd_data = ibc_p;
+		if (ioctl(s, SIOCGDRVSPEC, (caddr_t)&ifd) == -1) {
+			goto failed;
+		}
+
+		if ((ibc_p->ifbic_len + sizeof(struct ifbreq)) < len) {
+			// if we have room for all of the member interfaces
+			break;
+		}
+
+		len *= 2;
+		buflen = sizeof(struct ifbifconf) + len;
+		buf = reallocf(buf, buflen);
+	}
+
+	if (buf == NULL) {
+		goto failed;
+	}
+
+	return ibc_p;
+
+    failed:
+	if (buf != NULL) {
+		free(buf);
+	}
+	return NULL;
+}
+#endif	// IFT_BRIDGE
+
+
+static void
+add_interface(CFMutableArrayRef *interfaces, CFStringRef if_name)
+{
+	SCNetworkInterfaceRef	interface;
+
+	if (*interfaces == NULL) {
+		*interfaces = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	}
+
+	interface = _SCNetworkInterfaceCreateWithBSDName(NULL, if_name,
+							 kIncludeNoVirtualInterfaces);
+	CFArrayAppendValue(*interfaces, interface);
+	CFRelease(interface);
+}
+
+
+static Boolean
+_SCBridgeInterfaceSetMemberInterfaces(SCBridgeInterfaceRef bridge, CFArrayRef members);
+
+
+typedef struct {
+	CFMutableArrayRef	bridges;
+	SCPreferencesRef	prefs;
+} addContext, *addContextRef;
+
+
+static void
+add_configured_interface(const void *key, const void *value, void *context)
+{
+	SCBridgeInterfaceRef		bridge;
+	CFStringRef			bridge_if		= (CFStringRef)key;
+	CFDictionaryRef			bridge_info	= (CFDictionaryRef)value;
+	CFDictionaryRef			bridge_options;
+	CFIndex				i;
+	CFArrayRef			interfaces;
+	SCNetworkInterfacePrivateRef	interfacePrivate;
+	CFMutableArrayRef		members		= NULL;
+	addContextRef			myContext	= (addContextRef)context;
+	CFStringRef			name;
+	CFIndex				n;
+
+	// create the bridge interface
+	bridge = (SCBridgeInterfaceRef)_SCBridgeInterfaceCreatePrivate(NULL, bridge_if);
+
+	// add member interfaces
+	interfaces = CFDictionaryGetValue(bridge_info, kSCPropVirtualNetworkInterfacesBridgeInterfaces);
+	n = isA_CFArray(interfaces) ? CFArrayGetCount(interfaces) : 0;
+	for (i = 0; i < n; i++) {
+		CFStringRef	member;
+
+		member = CFArrayGetValueAtIndex(interfaces, i);
+		if (isA_CFString(member)) {
+			add_interface(&members, member);
+		}
+	}
+	if (members != NULL) {
+		_SCBridgeInterfaceSetMemberInterfaces(bridge, members);
+		CFRelease(members);
+	}
+
+	// set display name
+	name = CFDictionaryGetValue(bridge_info, kSCPropUserDefinedName);
+	if (isA_CFString(name)) {
+		SCBridgeInterfaceSetLocalizedDisplayName(bridge, name);
+	}
+
+	// set options
+	bridge_options = CFDictionaryGetValue(bridge_info, kSCPropVirtualNetworkInterfacesBridgeOptions);
+	if (isA_CFDictionary(bridge_options)) {
+		SCBridgeInterfaceSetOptions(bridge, bridge_options);
+	}
+
+	// estabish link to the stored configuration
+	interfacePrivate = (SCNetworkInterfacePrivateRef)bridge;
+	interfacePrivate->prefs = CFRetain(myContext->prefs);
+
+	CFArrayAppendValue(myContext->bridges, bridge);
+	CFRelease(bridge);
+
+	return;
+}
+
+
+#pragma mark -
+#pragma mark SCBridgeInterface APIs
+
+
+CFArrayRef
+SCBridgeInterfaceCopyAll(SCPreferencesRef prefs)
+{
+	addContext		context;
+	CFDictionaryRef		dict;
+	CFStringRef		path;
+
+	context.bridges = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	context.prefs = prefs;
+
+	path = CFStringCreateWithFormat(NULL,
+					NULL,
+					CFSTR("/%@/%@"),
+					kSCPrefVirtualNetworkInterfaces,
+					kSCNetworkInterfaceTypeBridge);
+	dict = SCPreferencesPathGetValue(prefs, path);
+	if (isA_CFDictionary(dict)) {
+		CFDictionaryApplyFunction(dict, add_configured_interface, &context);
+	}
+	CFRelease(path);
+
+	return context.bridges;
+}
+
+
+__private_extern__ void
+__SCBridgeInterfaceListCollectMembers(CFArrayRef interfaces, CFMutableSetRef set)
+{
+	CFIndex	i;
+	CFIndex	n;
+
+	n = CFArrayGetCount(interfaces);
+	for (i = 0; i < n; i++) {
+		SCBridgeInterfaceRef	bridgeInterface;
+		CFArrayRef		members;
+
+		bridgeInterface = CFArrayGetValueAtIndex(interfaces, i);
+		members = SCBridgeInterfaceGetMemberInterfaces(bridgeInterface);
+		if (members != NULL) {
+			CFIndex	j;
+			CFIndex	n_members;
+
+			// exclude the member interfaces of this bridge
+			n_members = CFArrayGetCount(members);
+			for (j = 0; j < n_members; j++) {
+				SCNetworkInterfaceRef	member;
+
+				member = CFArrayGetValueAtIndex(members, j);
+				CFSetAddValue(set, member);
+			}
+		}
+
+	}
+	return;
+}
+
+
+CFArrayRef /* of SCNetworkInterfaceRef's */
+SCBridgeInterfaceCopyAvailableMemberInterfaces(SCPreferencesRef prefs)
+{
+	CFMutableArrayRef	available;
+	CFMutableSetRef		excluded;
+	CFArrayRef		interfaces;
+
+	available = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	excluded  = CFSetCreateMutable  (NULL, 0, &kCFTypeSetCallBacks);
+
+	// exclude Bond [member] interfaces
+	interfaces = SCBondInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		__SCBondInterfaceListCollectMembers(interfaces, excluded);
+		CFRelease(interfaces);
+	}
+
+	// exclude Bridge [member] interfaces
+	interfaces = SCBridgeInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		__SCBridgeInterfaceListCollectMembers(interfaces, excluded);
+		CFRelease(interfaces);
+	}
+
+	// exclude VLAN [physical] interfaces
+	interfaces = SCVLANInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		CFIndex	i;
+		CFIndex	n;
+
+		n = CFArrayGetCount(interfaces);
+		for (i = 0; i < n; i++) {
+			SCVLANInterfaceRef	vlanInterface;
+			SCNetworkInterfaceRef	physical;
+
+			// exclude the physical interface of this VLAN
+			vlanInterface = CFArrayGetValueAtIndex(interfaces, i);
+			physical = SCVLANInterfaceGetPhysicalInterface(vlanInterface);
+			CFSetAddValue(excluded, physical);
+		}
+		CFRelease(interfaces);
+	}
+
+	// identify available interfaces
+	interfaces = __SCNetworkInterfaceCopyAll_IONetworkInterface();
+	if (interfaces != NULL) {
+		CFIndex	i;
+		CFIndex	n;
+
+		n = CFArrayGetCount(interfaces);
+		for (i = 0; i < n; i++) {
+			SCNetworkInterfaceRef		interface;
+			SCNetworkInterfacePrivateRef	interfacePrivate;
+
+			interface = CFArrayGetValueAtIndex(interfaces, i);
+			interfacePrivate = (SCNetworkInterfacePrivateRef)interface;
+
+			if (!interfacePrivate->supportsBridge) {
+				// if this interface is not available
+				continue;
+			}
+
+			if (CFSetContainsValue(excluded, interface)) {
+				// if excluded
+				continue;
+			}
+
+			CFArrayAppendValue(available, interface);
+		}
+		CFRelease(interfaces);
+	}
+
+	CFRelease(excluded);
+
+	return available;
+}
+
+
+CFArrayRef
+_SCBridgeInterfaceCopyActive(void)
+{
+	struct ifaddrs		*ifap;
+	struct ifaddrs		*ifp;
+	int			s;
+	CFMutableArrayRef	bridges	= NULL;
+
+	if (getifaddrs(&ifap) == -1) {
+		_SCErrorSet(errno);
+		SCLog(TRUE, LOG_ERR, CFSTR("getifaddrs() failed: %s"), strerror(errno));
+		return NULL;
+	}
+
+	s = inet_dgram_socket();
+	if (s == -1) {
+		_SCErrorSet(errno);
+		goto done;
+	}
+
+	bridges = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+
+	for (ifp = ifap; ifp != NULL; ifp = ifp->ifa_next) {
+#ifdef	IFT_BRIDGE
+		SCBridgeInterfaceRef		bridge;
+		CFStringRef			bridge_if;
+		struct ifbifconf		*ibc_p;
+		struct if_data			*if_data;
+		CFMutableArrayRef		members		= NULL;
+
+		if_data = (struct if_data *)ifp->ifa_data;
+		if (if_data == NULL
+		    || ifp->ifa_addr->sa_family != AF_LINK
+		    || if_data->ifi_type != IFT_BRIDGE) {
+			continue;
+		}
+
+		ibc_p = ifbifconf_copy(s, ifp->ifa_name);
+		if (ibc_p == NULL) {
+			if (errno == EBUSY) {
+				continue;
+			}
+			_SCErrorSet(errno);
+			SCLog(TRUE, LOG_ERR,
+			      CFSTR("ifbifconf_copy(%s) failed: %s"),
+			      ifp->ifa_name,
+			      strerror(errno));
+			CFRelease(bridges);
+			bridges = NULL;
+			goto done;
+		}
+
+		// create the bridge interface
+		bridge_if = CFStringCreateWithCString(NULL, ifp->ifa_name, kCFStringEncodingASCII);
+		bridge    = (SCBridgeInterfaceRef)_SCBridgeInterfaceCreatePrivate(NULL, bridge_if);
+		CFRelease(bridge_if);
+
+		// add member interfaces
+		if (ibc_p->ifbic_len > 0) {
+			int 		i;
+
+			// iterate over each member interface
+			for (i = 0; i < ibc_p->ifbic_len / sizeof(struct ifbreq); i++) {
+				struct ifbreq	*ibr_p;
+				CFStringRef	member;
+
+				ibr_p = ibc_p->ifbic_req + i;
+				member = CFStringCreateWithCString(NULL, ibr_p->ifbr_ifsname, kCFStringEncodingASCII);
+				add_interface(&members, member);
+				CFRelease(member);
+			}
+		}
+		free(ibc_p);
+
+		if (members != NULL) {
+			_SCBridgeInterfaceSetMemberInterfaces(bridge, members);
+			CFRelease(members);
+		}
+
+		// add bridge
+		CFArrayAppendValue(bridges, bridge);
+		CFRelease(bridge);
+#endif	// IFT_BRIDGE
+	}
+
+    done :
+
+	(void) close(s);
+	freeifaddrs(ifap);
+	return bridges;
+}
+
+
+SCBridgeInterfaceRef
+SCBridgeInterfaceCreate(SCPreferencesRef prefs)
+{
+	CFAllocatorRef		allocator;
+	SCBridgeInterfaceRef	bridge		= NULL;
+	CFIndex			i;
+
+	if (prefs == NULL) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
+
+	allocator = CFGetAllocator(prefs);
+
+	// create a new bridge using an unused interface name
+	for (i = 0; bridge == NULL; i++) {
+		CFDictionaryRef			dict;
+		CFStringRef			bridge_if;
+		SCNetworkInterfacePrivateRef	interfacePrivate;
+		CFMutableDictionaryRef		newDict;
+		CFArrayRef			newInterfaces;
+		Boolean				ok;
+		CFStringRef			path;
+
+		bridge_if = CFStringCreateWithFormat(allocator, NULL, CFSTR("bridge%d"), i);
+		path    = CFStringCreateWithFormat(allocator,
+						   NULL,
+						   CFSTR("/%@/%@/%@"),
+						   kSCPrefVirtualNetworkInterfaces,
+						   kSCNetworkInterfaceTypeBridge,
+						   bridge_if);
+		dict = SCPreferencesPathGetValue(prefs, path);
+		if (dict != NULL) {
+			// if bridge interface name not available
+			CFRelease(path);
+			CFRelease(bridge_if);
+			continue;
+		}
+
+		// add the bridge to the stored preferences
+		newDict = CFDictionaryCreateMutable(allocator,
+						    0,
+						    &kCFTypeDictionaryKeyCallBacks,
+						    &kCFTypeDictionaryValueCallBacks);
+		newInterfaces = CFArrayCreate(allocator, NULL, 0, &kCFTypeArrayCallBacks);
+		CFDictionaryAddValue(newDict, kSCPropVirtualNetworkInterfacesBridgeInterfaces, newInterfaces);
+		CFRelease(newInterfaces);
+		ok = SCPreferencesPathSetValue(prefs, path, newDict);
+		CFRelease(newDict);
+		CFRelease(path);
+		if (!ok) {
+			// if the bridge could not be saved
+			CFRelease(bridge_if);
+			break;
+		}
+
+		// create the SCBridgeInterfaceRef
+		bridge = (SCBridgeInterfaceRef)_SCBridgeInterfaceCreatePrivate(allocator, bridge_if);
+		CFRelease(bridge_if);
+
+		// estabish link to the stored configuration
+		interfacePrivate = (SCNetworkInterfacePrivateRef)bridge;
+		interfacePrivate->prefs = CFRetain(prefs);
+	}
+
+	return bridge;
+}
+
+
+Boolean
+SCBridgeInterfaceRemove(SCBridgeInterfaceRef bridge)
+{
+	CFStringRef			bridge_if;
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bridge;
+	Boolean				ok;
+	CFStringRef			path;
+
+	if (!isA_SCBridgeInterface(bridge)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if (interfacePrivate->prefs == NULL) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	bridge_if = SCNetworkInterfaceGetBSDName(bridge);
+	path    = CFStringCreateWithFormat(NULL,
+					   NULL,
+					   CFSTR("/%@/%@/%@"),
+					   kSCPrefVirtualNetworkInterfaces,
+					   kSCNetworkInterfaceTypeBridge,
+					   bridge_if);
+	ok = SCPreferencesPathRemoveValue(interfacePrivate->prefs, path);
+	CFRelease(path);
+
+	return ok;
+}
+
+
+CFArrayRef
+SCBridgeInterfaceGetMemberInterfaces(SCBridgeInterfaceRef bridge)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bridge;
+
+	if (!isA_SCBridgeInterface(bridge)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
+
+	return interfacePrivate->bridge.interfaces;
+}
+
+
+CFDictionaryRef
+SCBridgeInterfaceGetOptions(SCBridgeInterfaceRef bridge)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bridge;
+
+	if (!isA_SCBridgeInterface(bridge)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
+
+	return interfacePrivate->bridge.options;
+}
+
+
+static Boolean
+_SCBridgeInterfaceSetMemberInterfaces(SCBridgeInterfaceRef bridge, CFArrayRef members)
+{
+	CFIndex				i;
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bridge;
+	CFIndex				n;
+	CFMutableArrayRef		newMembers;
+	Boolean				ok			= TRUE;
+
+	n = (members != NULL) ? CFArrayGetCount(members) : 0;
+
+	// set member interfaces in the stored preferences
+	if (interfacePrivate->prefs != NULL) {
+		CFDictionaryRef		dict;
+		CFMutableDictionaryRef	newDict;
+		CFStringRef		path;
+
+		path = CFStringCreateWithFormat(NULL,
+						NULL,
+						CFSTR("/%@/%@/%@"),
+						kSCPrefVirtualNetworkInterfaces,
+						kSCNetworkInterfaceTypeBridge,
+						interfacePrivate->entity_device);
+		dict = SCPreferencesPathGetValue(interfacePrivate->prefs, path);
+		if (!isA_CFDictionary(dict)) {
+			// if the prefs are confused
+			CFRelease(path);
+			_SCErrorSet(kSCStatusFailed);
+			return FALSE;
+		}
+
+		newMembers = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+		for (i = 0; i < n; i++) {
+			SCNetworkInterfaceRef	interface;
+			CFStringRef		memberName;
+
+			interface = CFArrayGetValueAtIndex(members, i);
+			memberName = SCNetworkInterfaceGetBSDName(interface);
+			CFArrayAppendValue(newMembers, memberName);
+		}
+
+		newDict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
+		CFDictionarySetValue(newDict, kSCPropVirtualNetworkInterfacesBridgeInterfaces, newMembers);
+		CFRelease(newMembers);
+
+		ok = SCPreferencesPathSetValue(interfacePrivate->prefs, path, newDict);
+		CFRelease(newDict);
+		CFRelease(path);
+	}
+
+	if (ok) {
+		newMembers = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+		for (i = 0; i < n; i++) {
+			SCNetworkInterfaceRef		member;
+			SCNetworkInterfacePrivateRef	newMember;
+
+			member = CFArrayGetValueAtIndex(members, i);
+			newMember = __SCNetworkInterfaceCreateCopy(NULL,
+								   member,
+								   interfacePrivate->prefs,
+								   interfacePrivate->serviceID);
+			CFArrayAppendValue(newMembers, newMember);
+			CFRelease(newMember);
+		}
+		CFRelease(interfacePrivate->bridge.interfaces);
+		interfacePrivate->bridge.interfaces = newMembers;
+	}
+
+	return ok;
+}
+
+
+Boolean
+SCBridgeInterfaceSetMemberInterfaces(SCBridgeInterfaceRef bridge, CFArrayRef members)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bridge;
+	Boolean				ok;
+	int				sc_status		= kSCStatusOK;
+
+	if (!isA_SCBridgeInterface(bridge)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if ((members != NULL) && !isA_CFArray(members)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if (interfacePrivate->prefs != NULL) {
+		CFArrayRef	available;
+		CFArrayRef	current;
+		CFIndex		i;
+		CFIndex		n_available;
+		CFIndex		n_current;
+		CFIndex		n_members;
+		CFArrayRef	services	= NULL;
+
+		current     = SCBridgeInterfaceGetMemberInterfaces(bridge);
+		n_current   = (current != NULL) ? CFArrayGetCount(current) : 0;
+
+		available   = SCBridgeInterfaceCopyAvailableMemberInterfaces(interfacePrivate->prefs);
+		n_available = (available != NULL) ? CFArrayGetCount(available) : 0;
+
+		n_members = (members != NULL) ? CFArrayGetCount(members) : 0;
+		for (i = 0; i < n_members; i++) {
+			SCNetworkInterfaceRef	member;
+
+			member = CFArrayGetValueAtIndex(members, i);
+
+			if ((current != NULL) &&
+			    CFArrayContainsValue(current, CFRangeMake(0, n_current), member)) {
+				// current members are allowed
+				continue;
+			}
+
+			if ((available != NULL) &&
+			    CFArrayContainsValue(available, CFRangeMake(0, n_available), member)) {
+				// available members are allowed but cannot be associated
+				// with any other network services.
+
+				if (services == NULL) {
+					services = __SCNetworkServiceCopyAllEnabled(interfacePrivate->prefs);
+				}
+				if ((services != NULL) &&
+				    __SCNetworkServiceExistsForInterface(services, member)) {
+					sc_status = kSCStatusKeyExists;
+					break;
+				}
+
+				// if available
+				continue;
+			}
+
+			// if member not allowed
+			sc_status = kSCStatusInvalidArgument;
+			break;
+		}
+
+		if (available != NULL) CFRelease(available);
+		if (services != NULL) CFRelease(services);
+	}
+
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+		return FALSE;
+	}
+
+	ok = _SCBridgeInterfaceSetMemberInterfaces(bridge, members);
+	return ok;
+}
+
+
+Boolean
+SCBridgeInterfaceSetLocalizedDisplayName(SCBridgeInterfaceRef bridge, CFStringRef newName)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bridge;
+	Boolean				ok			= TRUE;
+
+	if (!isA_SCBridgeInterface(bridge)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if ((newName != NULL) && !isA_CFString(newName)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	// set name in the stored preferences
+	if (interfacePrivate->prefs != NULL) {
+		CFDictionaryRef		dict;
+		CFMutableDictionaryRef	newDict;
+		CFStringRef		path;
+
+		path = CFStringCreateWithFormat(NULL,
+						NULL,
+						CFSTR("/%@/%@/%@"),
+						kSCPrefVirtualNetworkInterfaces,
+						kSCNetworkInterfaceTypeBridge,
+						interfacePrivate->entity_device);
+		dict = SCPreferencesPathGetValue(interfacePrivate->prefs, path);
+		if (!isA_CFDictionary(dict)) {
+			// if the prefs are confused
+			CFRelease(path);
+			_SCErrorSet(kSCStatusFailed);
+			return FALSE;
+		}
+
+		newDict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
+		if (newName != NULL) {
+			CFDictionarySetValue(newDict, kSCPropUserDefinedName, newName);
+		} else {
+			CFDictionaryRemoveValue(newDict, kSCPropUserDefinedName);
+		}
+		ok = SCPreferencesPathSetValue(interfacePrivate->prefs, path, newDict);
+		CFRelease(newDict);
+		CFRelease(path);
+	}
+
+	// set name in the SCBridgeInterfaceRef
+	if (ok) {
+		if (interfacePrivate->localized_name != NULL) {
+			CFRelease(interfacePrivate->localized_name);
+			interfacePrivate->localized_name = NULL;
+		}
+		if (newName != NULL) {
+			interfacePrivate->localized_name = CFStringCreateCopy(NULL, newName);
+		}
+	}
+
+	return ok;
+}
+
+
+Boolean
+SCBridgeInterfaceSetOptions(SCBridgeInterfaceRef bridge, CFDictionaryRef newOptions)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)bridge;
+	Boolean				ok			= TRUE;
+
+	if (!isA_SCBridgeInterface(bridge)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if ((newOptions != NULL) && !isA_CFDictionary(newOptions)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	// set options in the stored preferences
+	if (interfacePrivate->prefs != NULL) {
+		CFDictionaryRef		dict;
+		CFMutableDictionaryRef	newDict;
+		CFStringRef		path;
+
+		path = CFStringCreateWithFormat(NULL,
+						NULL,
+						CFSTR("/%@/%@/%@"),
+						kSCPrefVirtualNetworkInterfaces,
+						kSCNetworkInterfaceTypeBridge,
+						interfacePrivate->entity_device);
+		dict = SCPreferencesPathGetValue(interfacePrivate->prefs, path);
+		if (!isA_CFDictionary(dict)) {
+			// if the prefs are confused
+			CFRelease(path);
+			_SCErrorSet(kSCStatusFailed);
+			return FALSE;
+		}
+
+		newDict = CFDictionaryCreateMutableCopy(NULL, 0, dict);
+		if (newOptions != NULL) {
+			CFDictionarySetValue(newDict, kSCPropVirtualNetworkInterfacesBridgeOptions, newOptions);
+		} else {
+			CFDictionaryRemoveValue(newDict, kSCPropVirtualNetworkInterfacesBridgeOptions);
+		}
+		ok = SCPreferencesPathSetValue(interfacePrivate->prefs, path, newDict);
+		CFRelease(newDict);
+		CFRelease(path);
+	}
+
+	// set options in the SCBridgeInterfaceRef
+	if (ok) {
+		if (interfacePrivate->bridge.options != NULL) {
+			CFRelease(interfacePrivate->bridge.options);
+			interfacePrivate->bridge.options = NULL;
+		}
+		if (newOptions != NULL) {
+			interfacePrivate->bridge.options = CFDictionaryCreateCopy(NULL, newOptions);
+		}
+	}
+
+	return ok;
+}
+
+
+#pragma mark -
+#pragma mark SCBridgeInterface management
+
+
+#ifdef	IFT_BRIDGE
+static Boolean
+__bridge_add_interface(int s, CFStringRef bridge_if, CFStringRef interface_if)
+{
+	struct ifbreq	breq;
+	struct ifdrv	ifd;
+
+	// bridge interface
+	bzero(&ifd, sizeof(ifd));
+	(void) _SC_cfstring_to_cstring(bridge_if,
+				       ifd.ifd_name,
+				       sizeof(ifd.ifd_name),
+				       kCFStringEncodingASCII);
+	ifd.ifd_cmd = BRDGADD;
+	ifd.ifd_len = sizeof(breq);
+	ifd.ifd_data = (caddr_t)&breq;
+
+	// new bridge member
+	bzero(&breq, sizeof(breq));
+	(void) _SC_cfstring_to_cstring(interface_if,
+				       breq.ifbr_ifsname,
+				       sizeof(breq.ifbr_ifsname),
+				       kCFStringEncodingASCII);
+
+	// add new bridge member
+	if (ioctl(s, SIOCSDRVSPEC, (caddr_t)&ifd) == -1) {
+		_SCErrorSet(errno);
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("could not add interface \"%@\" to bridge \"%@\": %s"),
+		      interface_if,
+		      bridge_if,
+		      strerror(errno));
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+
+static Boolean
+__bridge_remove_interface(int s, CFStringRef bridge_if, CFStringRef interface_if)
+{
+	struct ifbreq	breq;
+	struct ifdrv	ifd;
+
+	// bridge interface
+	bzero(&ifd, sizeof(ifd));
+	(void) _SC_cfstring_to_cstring(bridge_if,
+				       ifd.ifd_name,
+				       sizeof(ifd.ifd_name),
+				       kCFStringEncodingASCII);
+	ifd.ifd_cmd = BRDGDEL;
+	ifd.ifd_len = sizeof(breq);
+	ifd.ifd_data = (caddr_t)&breq;
+
+	// bridge member to remove
+	bzero(&breq, sizeof(breq));
+	(void) _SC_cfstring_to_cstring(interface_if,
+				       breq.ifbr_ifsname,
+				       sizeof(breq.ifbr_ifsname),
+				       kCFStringEncodingASCII);
+
+	// remove bridge member
+	if (ioctl(s, SIOCSDRVSPEC, (caddr_t)&ifd) == -1) {
+		_SCErrorSet(errno);
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("could not add interface \"%@\" to bridge \"%@\": %s"),
+		      interface_if,
+		      bridge_if,
+		      strerror(errno));
+		return FALSE;
+	}
+
+	return TRUE;
+}
+#endif	// IFT_BRIDGE
+
+
+Boolean
+_SCBridgeInterfaceUpdateConfiguration(SCPreferencesRef prefs)
+{
+#ifdef	IFT_BRIDGE
+	CFArrayRef			active		= NULL;
+	CFArrayRef			config		= NULL;
+	CFIndex				i;
+	CFIndex				nActive;
+	CFIndex				nConfig;
+	Boolean				ok		= TRUE;
+	int				s		= -1;
+
+	if (prefs == NULL) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	/* configured Bridges */
+	config  = SCBridgeInterfaceCopyAll(prefs);
+	nConfig = (config != NULL) ? CFArrayGetCount(config) : 0;
+
+	/* active Bridges */
+	active  = _SCBridgeInterfaceCopyActive();
+	nActive = (active != NULL) ? CFArrayGetCount(active) : 0;
+
+	/*
+	 * remove any no-longer-configured bridge interfaces and
+	 * any devices associated with a bridge that are no longer
+	 * associated with a bridge.
+	 */
+	for (i = 0; i < nActive; i++) {
+		SCBridgeInterfaceRef	a_bridge;
+		CFStringRef		a_bridge_if;
+		CFIndex			j;
+		Boolean			found	= FALSE;
+
+		a_bridge    = CFArrayGetValueAtIndex(active, i);
+		a_bridge_if = SCNetworkInterfaceGetBSDName(a_bridge);
+
+		for (j = 0; j < nConfig; j++) {
+			SCBridgeInterfaceRef	c_bridge;
+			CFStringRef		c_bridge_if;
+
+			c_bridge    = CFArrayGetValueAtIndex(config, j);
+			c_bridge_if = SCNetworkInterfaceGetBSDName(c_bridge);
+
+			if (CFEqual(a_bridge_if, c_bridge_if)) {
+				CFIndex		a;
+				CFArrayRef	a_bridge_interfaces;
+				CFIndex		a_count;
+				CFArrayRef	c_bridge_interfaces;
+				CFIndex		c_count;
+
+				c_bridge_interfaces = SCBridgeInterfaceGetMemberInterfaces(c_bridge);
+				c_count           = (c_bridge_interfaces != NULL) ? CFArrayGetCount(c_bridge_interfaces) : 0;
+
+				a_bridge_interfaces = SCBridgeInterfaceGetMemberInterfaces(a_bridge);
+				a_count           = (a_bridge_interfaces != NULL) ? CFArrayGetCount(a_bridge_interfaces) : 0;
+
+				for (a = 0; a < a_count; a++) {
+					SCNetworkInterfaceRef	a_interface;
+					CFStringRef		a_interface_if;
+
+					a_interface = CFArrayGetValueAtIndex(a_bridge_interfaces, a);
+					if ((c_count == 0) ||
+					    !CFArrayContainsValue(c_bridge_interfaces,
+								  CFRangeMake(0, c_count),
+								  a_interface)) {
+						/*
+						 * if this device is no longer part
+						 * of the bridge.
+						 */
+						if (s == -1) {
+							s = inet_dgram_socket();
+							if (s == -1) {
+								_SCErrorSet(errno);
+								ok = FALSE;
+								goto done;
+							}
+						}
+
+						a_interface_if = SCNetworkInterfaceGetBSDName(a_interface);
+						if (!__bridge_remove_interface(s, a_bridge_if, a_interface_if)) {
+							ok = FALSE;
+						}
+					}
+				}
+
+				found = TRUE;
+				break;
+			}
+		}
+
+		if (!found) {
+			/*
+			 * if this interface is no longer configured
+			 */
+			if (s == -1) {
+				s = inet_dgram_socket();
+				if (s == -1) {
+					_SCErrorSet(errno);
+					ok = FALSE;
+					goto done;
+				}
+			}
+
+			if (!__destroyInterface(s, a_bridge_if)) {
+				_SCErrorSet(errno);
+				ok = FALSE;
+			}
+		}
+	}
+
+	/*
+	 * add any newly-configured bridge interfaces and add any
+	 * devices that should now be associated with the bridge.
+	 */
+	for (i = 0; i < nConfig; i++) {
+		SCBridgeInterfaceRef	c_bridge;
+		CFArrayRef		c_bridge_interfaces;
+		CFStringRef		c_bridge_if;
+		CFIndex			c_count;
+		Boolean			found		= FALSE;
+		CFIndex			j;
+
+		c_bridge            = CFArrayGetValueAtIndex(config, i);
+		c_bridge_if         = SCNetworkInterfaceGetBSDName(c_bridge);
+		c_bridge_interfaces = SCBridgeInterfaceGetMemberInterfaces(c_bridge);
+		c_count             = (c_bridge_interfaces != NULL) ? CFArrayGetCount(c_bridge_interfaces) : 0;
+
+		for (j = 0; j < nActive; j++) {
+			SCBridgeInterfaceRef	a_bridge;
+			CFArrayRef		a_bridge_interfaces;
+			CFStringRef		a_bridge_if;
+			CFIndex			a_count;
+
+			a_bridge            = CFArrayGetValueAtIndex(active, j);
+			a_bridge_if         = SCNetworkInterfaceGetBSDName(a_bridge);
+			a_bridge_interfaces = SCBridgeInterfaceGetMemberInterfaces(a_bridge);
+			a_count             = (a_bridge_interfaces != NULL) ? CFArrayGetCount(a_bridge_interfaces) : 0;
+
+			if (CFEqual(c_bridge_if, a_bridge_if)) {
+				CFIndex	c;
+				Boolean	if_list_change = FALSE;
+
+				found = TRUE;
+
+				if (!_SC_CFEqual(c_bridge_interfaces, a_bridge_interfaces)) {
+					if_list_change = TRUE;
+				}
+				if (!if_list_change) {
+					break;	// if no change
+				}
+				if (s == -1) {
+					s = inet_dgram_socket();
+					if (s == -1) {
+						_SCErrorSet(errno);
+						ok = FALSE;
+						goto done;
+					}
+				}
+				if (!if_list_change) {
+					break; // no if list changes
+				}
+
+				/*
+				 * ensure that the first device of the bridge matches, if
+				 * not then we remove all current devices and add them
+				 * back in the preferred order.
+				 */
+				if ((c_count > 0) &&
+				    (a_count > 0) &&
+				    !CFEqual(CFArrayGetValueAtIndex(c_bridge_interfaces, 0),
+					     CFArrayGetValueAtIndex(a_bridge_interfaces, 0))) {
+					CFIndex	a;
+
+					for (a = 0; a < a_count; a++) {
+						SCNetworkInterfaceRef	a_interface;
+						CFStringRef		a_interface_if;
+
+						a_interface = CFArrayGetValueAtIndex(a_bridge_interfaces, a);
+						if (!CFArrayContainsValue(c_bridge_interfaces,
+									 CFRangeMake(0, c_count),
+									 a_interface)) {
+							continue;	// if already removed
+						}
+
+						a_interface_if = SCNetworkInterfaceGetBSDName(a_interface);
+						if (!__bridge_remove_interface(s, a_bridge_if, a_interface_if)) {
+							ok = FALSE;
+						}
+					}
+
+					a_count = 0;	// all active devices have been removed
+				}
+
+				/*
+				 * add any devices which are not currently associated
+				 * with the bridge interface.
+				 */
+				for (c = 0; c < c_count; c++) {
+					SCNetworkInterfaceRef		c_interface;
+					SCNetworkInterfacePrivateRef	c_interfacePrivate;
+					CFStringRef			c_interface_if;
+
+					c_interface = CFArrayGetValueAtIndex(c_bridge_interfaces, c);
+					if ((a_count == 0) ||
+					    !CFArrayContainsValue(a_bridge_interfaces,
+								  CFRangeMake(0, a_count),
+								  c_interface)) {
+						/*
+						 * check if this member interface can be added to a bridge.
+						 */
+						c_interfacePrivate = (SCNetworkInterfacePrivateRef)c_interface;
+						if (!c_interfacePrivate->supportsBridge) {
+							// if member not supported
+							continue;
+						}
+
+						/*
+						 * if this member interface is not currently part of the bridge.
+						 */
+						c_interface_if = SCNetworkInterfaceGetBSDName(c_interface);
+						if (!__bridge_add_interface(s, c_bridge_if, c_interface_if)) {
+							// if member could not be added
+							ok = FALSE;
+						}
+					}
+				}
+
+				break;
+			}
+		}
+
+		if (!found) {
+			CFIndex	c;
+
+			if (s == -1) {
+				s = inet_dgram_socket();
+				if (s == -1) {
+					_SCErrorSet(errno);
+					ok = FALSE;
+					goto done;
+				}
+			}
+
+			/*
+			 * establish the new bridge interface.
+			 */
+			if (!__createInterface(s, c_bridge_if)) {
+				_SCErrorSet(errno);
+				ok = FALSE;
+				continue;
+			}
+
+			/*
+			 * add the member interfaces
+			 */
+			for (c = 0; c < c_count; c++) {
+				SCNetworkInterfaceRef		c_interface;
+				SCNetworkInterfacePrivateRef	c_interfacePrivate;
+				CFStringRef			c_interface_if;
+
+				c_interface = CFArrayGetValueAtIndex(c_bridge_interfaces, c);
+				c_interfacePrivate = (SCNetworkInterfacePrivateRef)c_interface;
+				if (!c_interfacePrivate->supportsBridge) {
+					// if member not supported
+					continue;
+				}
+
+				c_interface_if = SCNetworkInterfaceGetBSDName(c_interface);
+				if (!__bridge_add_interface(s, c_bridge_if, c_interface_if)) {
+					// if member could not be added
+					ok = FALSE;
+				}
+			}
+		}
+
+	}
+
+    done :
+
+	if (active != NULL)	CFRelease(active);
+	if (config != NULL)	CFRelease(config);
+	if (s != -1)		(void) close(s);
+
+	return ok;
+#else	// IFT_BRIDGE
+	return TRUE;
+#endif	// IFT_BRIDGE
+}
diff --git a/SystemConfiguration.fproj/CaptiveNetwork.c b/SystemConfiguration.fproj/CaptiveNetwork.c
new file mode 100644
index 0000000..413ebce
--- /dev/null
+++ b/SystemConfiguration.fproj/CaptiveNetwork.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2009, 2010 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <dlfcn.h>
+
+#include <SystemConfiguration/CaptiveNetwork.h>
+
+
+#pragma mark -
+#pragma mark CaptiveNetwork.framework APIs (exported through the SystemConfiguration.framework)
+
+const CFStringRef kCNNetworkInfoKeySSIDData    = CFSTR("SSIDDATA");
+const CFStringRef kCNNetworkInfoKeySSID        = CFSTR("SSID");
+const CFStringRef kCNNetworkInfoKeyBSSID       = CFSTR("BSSID");
+
+static void *
+__loadCaptiveNetwork(void) {
+	static void *image = NULL;
+	if (NULL == image) {
+		const char	*framework		= "/System/Library/PrivateFrameworks/CaptiveNetwork.framework/CaptiveNetwork";
+		struct stat	statbuf;
+		const char	*suffix			= getenv("DYLD_IMAGE_SUFFIX");
+		char		path[MAXPATHLEN];
+
+		strlcpy(path, framework, sizeof(path));
+		if (suffix) strlcat(path, suffix, sizeof(path));
+		if (0 <= stat(path, &statbuf)) {
+			image = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
+		} else {
+			image = dlopen(framework, RTLD_LAZY | RTLD_LOCAL);
+		}
+	}
+	return (void *)image;
+}
+
+
+Boolean
+CNSetSupportedSSIDs(CFArrayRef ssidArray)
+{
+	static typeof (CNSetSupportedSSIDs) *dyfunc = NULL;
+	if (!dyfunc) {
+		void *image = __loadCaptiveNetwork();
+		if (image) dyfunc = dlsym(image, "__CNSetSupportedSSIDs");
+	}
+	return dyfunc ? dyfunc(ssidArray) : FALSE;
+}
+
+
+Boolean
+CNMarkPortalOnline(CFStringRef interfaceName)
+{
+	static typeof (CNMarkPortalOnline) *dyfunc = NULL;
+	if (!dyfunc) {
+		void *image = __loadCaptiveNetwork();
+		if (image) dyfunc = dlsym(image, "__CNMarkPortalOnline");
+	}
+	return dyfunc ? dyfunc(interfaceName) : FALSE;
+}
+
+
+Boolean
+CNMarkPortalOffline(CFStringRef interfaceName)
+{
+	static typeof (CNMarkPortalOffline) *dyfunc = NULL;
+	if (!dyfunc) {
+		void *image = __loadCaptiveNetwork();
+		if (image) dyfunc = dlsym(image, "__CNMarkPortalOffline");
+	}
+	return dyfunc ? dyfunc(interfaceName) : FALSE;
+}
+
+CFArrayRef
+CNCopySupportedInterfaces(void)
+{
+	static typeof (CNCopySupportedInterfaces) *dyfunc = NULL;
+	if (!dyfunc) {
+		void *image = __loadCaptiveNetwork();
+		if (image) dyfunc = dlsym(image, "__CNCopySupportedInterfaces");
+	}
+	return dyfunc ? dyfunc() : NULL;
+}
+
+CFDictionaryRef
+CNCopyCurrentNetworkInfo(CFStringRef	interfaceName)
+{
+	static typeof (CNCopyCurrentNetworkInfo) *dyfunc = NULL;
+	if (!dyfunc) {
+		void *image = __loadCaptiveNetwork();
+		if (image) dyfunc = dlsym(image, "__CNCopyCurrentNetworkInfo");
+	}
+	return dyfunc ? dyfunc(interfaceName) : NULL;
+}
diff --git a/SystemConfiguration.fproj/CaptiveNetwork.h b/SystemConfiguration.fproj/CaptiveNetwork.h
new file mode 100644
index 0000000..78d8fb9
--- /dev/null
+++ b/SystemConfiguration.fproj/CaptiveNetwork.h
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2009, 2010 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef _CAPTIVENETWORK_H
+#define _CAPTIVENETWORK_H
+
+#include <Availability.h>
+#include <sys/cdefs.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+/*!
+	@header CaptiveNetwork
+	@discussion The CaptiveNetwork API allows applications to interact
+		with Captive Network Support. Captive Network Support is a
+		system component responsible for detecting and help users
+		navigate networks that require interaction before providing
+		internet access. The most common Captive Networks are WiFi
+		Hotspots in places like airports, restaurants, and hotels.
+		Captive Network Support will attempt to authenticate if
+		possible or drop a user in to a web sheet if authentication
+		is not possible. In the web sheet the user has an opportunity
+		to authenticate or disassociate from the network.
+
+		The following APIs are designed for third party applications
+		that may handle authentication on these networks on behalf of
+		the user.
+
+		These APIs are treated as advisory only.
+		There is no guarantee or contract that the operating system
+		will take the intended action.
+ */
+
+__BEGIN_DECLS
+
+/*!
+	@function CNSetSupportedSSIDs
+	@discussion Provides Captive Network Support with an updated list of
+		SSIDs that this application will perform authentication on.
+		When Captive Network Support would show the Web Sheet for a
+		network with an SSID the application has registered for, it
+		will suppress showing the Web Sheet if the application is
+		still installed.
+	@param ssidArray A CFArray of CFStrings of the SSIDs.
+	@result Returns TRUE if the operation succeeded, FALSE otherwise.
+ */
+Boolean
+CNSetSupportedSSIDs	(CFArrayRef	ssidArray)		__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
+
+/*!
+	@function CNMarkPortalOnline
+	@discussion Tells Captive Network Support that your application has
+		authenticated the device to the network. Captive Network Support
+		will notify the rest of the system that WiFi is now a viable
+		interface.
+	@param interfaceName Name of the interface that is now online.
+	@result Returns TRUE if the operation succeeded, FALSE otherwise.
+ */
+Boolean
+CNMarkPortalOnline	(CFStringRef	interfaceName)		__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
+
+/*!
+	@function CNMarkPortalOffline
+	@discussion Tells Captive Network Support that the device is not
+		authenticated on the given network interface.
+	@param interfaceName Name of the interface that is still captive.
+	@result Returns TRUE if the operation succeeded, FALSE otherwise.
+ */
+Boolean
+CNMarkPortalOffline	(CFStringRef	interfaceName)		__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
+
+
+/*!
+ @function CNCopySupportedInterfaces
+ @discussion copies a list of all interfaces CaptiveNetworkSupport is monitoring.
+ @result An array of CFStringRef- BSD interface names.
+	 Returns NULL if an error was encountered.
+	 You MUST release the returned value.
+ */
+CFArrayRef
+CNCopySupportedInterfaces	(void)				__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);
+
+/*!
+ @constant kCNNetworkInfoKeySSIDData
+ @discussion NetworkInfo Dictionary key for SSID in CFData format
+ */
+extern const CFStringRef kCNNetworkInfoKeySSIDData		__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);
+
+/*!
+ @constant kCNNetworkInfoKeySSID
+ @discussion NetworkInfo Dictionary key for SSID in CFString format
+ */
+extern const CFStringRef kCNNetworkInfoKeySSID			__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);
+
+/*!
+ @constant kCNNetworkInfoKeyBSSID
+ @discussion NetworkInfo Dictionary key for BSSID in CFString format
+ */
+extern const CFStringRef kCNNetworkInfoKeyBSSID			__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);
+
+/*!
+ @function CNCopyCurrentNetworkInfo
+ @discussion Returns the Network Info for the specified interface.
+	For example, Network Info dictionary will contain the following
+	keys, and values:
+	<pre>
+	@textblock
+	Keys                      : Values
+	=======================================
+	kCNNetworkInfoKeySSIDData : CFDataRef
+	kCNNetworkInfoKeySSID     : CFStringRef
+	kCNNetworkInfoKeyBSSID    : CFStringRef
+	@/textblock
+	</pre>
+ @param interfaceName Name of the interface you are interested in
+ @result Network Info dictionary associated with the interface.
+	 Returns NULL if an error was encountered.
+	 You MUST release the returned value.
+ */
+CFDictionaryRef
+CNCopyCurrentNetworkInfo	(CFStringRef interfaceName)	__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);
+
+__END_DECLS
+
+#endif	/* _CAPTIVENETWORK_H */
diff --git a/SystemConfiguration.fproj/English.lproj/Localizable.strings b/SystemConfiguration.fproj/English.lproj/Localizable.strings
index 87406e7c67fcbda09260e06507699978b6c1a778..49e8abe7369bcfa1883f96e0239946f2a13b9f56 100644
GIT binary patch
delta 90
zcmbQlb%lF_5bNXw#t_yph5!b?$@`h*CtqOUascxf;(=n048cGc&fw1w#Nfi9#Gt@n
f3&ctc5ETkQ6^RVRKv>R@&rrmW0+g|4;9>v(iP8}M

delta 7
Ocmcb@J&9|B5Gw!+Py#~$

diff --git a/SystemConfiguration.fproj/English.lproj/NetworkInterface.strings b/SystemConfiguration.fproj/English.lproj/NetworkInterface.strings
index 9a0d08b25dbffbaa46661467018aeb5b155c6402..fe6b31b7bdf48cec1e1088599dae58108e1327cb 100644
GIT binary patch
delta 310
zcmdm_I74m25hl)XhD-)s1~-Px%@>*OGqdV4q%-7AcI1+re2z_F@)R~1phzA=;$%f0
z;mIEu*?^)_+`0^Y42}!|3`z{vlP9vtGwU*xPM*js3Y8aQHev|a{G3gmkw1qa9|#K=
zk{A*hk{PlmFXU4ODdP7*72o`u-IAFziJ=JSloW>a$$|oklMk>7a6<VEsgoU<MK_yp
zA7f-!VkiTemj^USeR2UK4|5npz~n-1(apbjzA^IVGvomErvlAUV9=QSpHEa$2gveZ
z@C1^{3>iR2<N<w`3RI&xS(smaau1Up*v&_n#5SAp*D&%cF+>2vA`|Gf44@11zz&%p
Qz%}_C9}gSQvkY7e0P6`&6#xJL

delta 89
zcmV-f0H*(#CbA*0!~&B#5f+mu1`xC60>%TAlnWS>fCn6t;06k_rUw`SlR^s|lTZyD
vvq%Z{0<)G3#sRag4)y^LTL5nWYye~cWdL#jT>v1Hu@DuL;1DLWR1tUqPVOAj

diff --git a/SystemConfiguration.fproj/Info-Embedded.plist b/SystemConfiguration.fproj/Info-Embedded.plist
index c44f15a..5597be5 100644
--- a/SystemConfiguration.fproj/Info-Embedded.plist
+++ b/SystemConfiguration.fproj/Info-Embedded.plist
@@ -7,7 +7,7 @@
 	<key>CFBundleExecutable</key>
 	<string>SystemConfiguration</string>
 	<key>CFBundleGetInfoString</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>CFBundleIdentifier</key>
 	<string>com.apple.SystemConfiguration</string>
 	<key>CFBundleInfoDictionaryVersion</key>
@@ -17,10 +17,10 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 </dict>
 </plist>
diff --git a/SystemConfiguration.fproj/Info.plist b/SystemConfiguration.fproj/Info.plist
index c44f15a..5597be5 100644
--- a/SystemConfiguration.fproj/Info.plist
+++ b/SystemConfiguration.fproj/Info.plist
@@ -7,7 +7,7 @@
 	<key>CFBundleExecutable</key>
 	<string>SystemConfiguration</string>
 	<key>CFBundleGetInfoString</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 	<key>CFBundleIdentifier</key>
 	<string>com.apple.SystemConfiguration</string>
 	<key>CFBundleInfoDictionaryVersion</key>
@@ -17,10 +17,10 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.10.8</string>
+	<string>1.11</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.10.2</string>
+	<string>1.11</string>
 </dict>
 </plist>
diff --git a/SystemConfiguration.fproj/LinkConfiguration.c b/SystemConfiguration.fproj/LinkConfiguration.c
index 145c44b..0d03d7e 100644
--- a/SystemConfiguration.fproj/LinkConfiguration.c
+++ b/SystemConfiguration.fproj/LinkConfiguration.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2002-2007, 2010, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -39,9 +39,11 @@
 #include <net/if_vlan_var.h>
 #include <net/if_media.h>
 #include <net/if_types.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>			// for IPV6_MMTU
 
 #include <SystemConfiguration/SystemConfiguration.h>
-#include <SystemConfiguration/SCPrivate.h>			// for SCLog()
+#include <SystemConfiguration/SCPrivate.h>	// for SCLog()
 #include "SCNetworkConfigurationInternal.h"	// for __SCNetworkInterfaceCreatePrivate
 #include <SystemConfiguration/SCValidation.h>
 
@@ -51,6 +53,313 @@
 #include "dy_framework.h"
 
 
+#pragma mark -
+#pragma mark Capabilities
+
+
+// the following table needs to keep the capabilitiy names and values
+// between the <SystemConfiguration/SCSchemaDefinitionsPrivate.h> and
+// <net/if.h> headers in sync.
+static const struct {
+	const CFStringRef	*name;
+	Boolean			readwrite;
+	int			val;
+} capabilityMappings[] = {
+#ifdef	SIOCGIFCAP
+	{ &kSCPropNetEthernetCapabilityRXCSUM,		TRUE,	IFCAP_RXCSUM		},	// can offload checksum on RX
+	{ &kSCPropNetEthernetCapabilityTXCSUM,		TRUE,	IFCAP_TXCSUM		},	// can offload checksum on TX
+	{ &kSCPropNetEthernetCapabilityVLAN_MTU,	FALSE,	IFCAP_VLAN_MTU		},	// VLAN-compatible MTU
+	{ &kSCPropNetEthernetCapabilityVLAN_HWTAGGING,	FALSE,	IFCAP_VLAN_HWTAGGING	},	// hardware VLAN tag support
+	{ &kSCPropNetEthernetCapabilityJUMBO_MTU,	FALSE,	IFCAP_JUMBO_MTU		},	// 9000 byte MTU supported
+	{ &kSCPropNetEthernetCapabilityTSO,		TRUE,	IFCAP_TSO		},	// can do TCP/TCP6 Segmentation Offload
+	{ &kSCPropNetEthernetCapabilityTSO4,		FALSE,	IFCAP_TSO4		},	// can do TCP Segmentation Offload
+	{ &kSCPropNetEthernetCapabilityTSO6,		FALSE,	IFCAP_TSO6		},	// can do TCP6 Segmentation Offload
+	{ &kSCPropNetEthernetCapabilityLRO,		TRUE,	IFCAP_LRO		},	// can do Large Receive Offload
+	{ &kSCPropNetEthernetCapabilityAV,		TRUE,	IFCAP_AV		},	// can do 802.1 AV Bridging
+#endif	// SIOCGIFCAP
+};
+
+
+static CFIndex
+findCapability(CFStringRef capability)
+{
+	CFIndex		i;
+
+	for (i = 0; i < sizeof(capabilityMappings) / sizeof(capabilityMappings[0]); i++) {
+		if (CFEqual(capability, *capabilityMappings[i].name)) {
+			return i;
+		}
+	}
+
+	return kCFNotFound;
+}
+
+
+static Boolean
+__getCapabilities(CFStringRef	interfaceName,
+		  int		*current,
+		  int		*available)
+{
+#ifdef	SIOCGIFCAP
+	struct ifreq	ifr;
+	Boolean		ok		= FALSE;
+	int		sock		= -1;
+
+	bzero((void *)&ifr, sizeof(ifr));
+	if (_SC_cfstring_to_cstring(interfaceName, ifr.ifr_name, sizeof(ifr.ifr_name), kCFStringEncodingASCII) == NULL) {
+		SCLog(TRUE, LOG_ERR, CFSTR("could not convert interface name"));
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	sock = socket(AF_INET, SOCK_DGRAM, 0);
+	if (sock == -1) {
+		_SCErrorSet(errno);
+		SCLog(TRUE, LOG_ERR, CFSTR("socket() failed: %s"), strerror(errno));
+		return FALSE;
+	}
+
+	if (ioctl(sock, SIOCGIFCAP, (caddr_t)&ifr) == -1) {
+		_SCErrorSet(errno);
+		SCLog(TRUE, LOG_ERR, CFSTR("ioctl(SIOCGIFCAP) failed: %s"), strerror(errno));
+		goto done;
+	}
+
+	if (current   != NULL)	*current   = ifr.ifr_curcap;
+	if (available != NULL)	*available = ifr.ifr_reqcap;
+
+	ok = TRUE;
+
+    done :
+
+	(void)close(sock);
+	return ok;
+#else	// SIOCGIFCAP
+	if (current != NULL)	*current = 0;
+	if (available != NULL)	*available = 0;
+	return TRUE;
+#endif	// SIOCGIFCAP
+}
+
+
+int
+__SCNetworkInterfaceCreateCapabilities(SCNetworkInterfaceRef	interface,
+				       int			capability_base,
+				       CFDictionaryRef		capability_options)
+{
+	int		cap_available	= 0;
+	int		cap_current	= capability_base;
+	CFIndex		i;
+	CFStringRef	interfaceName;
+
+	if (!isA_SCNetworkInterface(interface)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		goto done;
+	}
+
+	interfaceName = SCNetworkInterfaceGetBSDName(interface);
+	if (interfaceName == NULL) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		goto done;
+	}
+
+	if (!__getCapabilities(interfaceName,
+			       (capability_base == -1) ? &cap_current : NULL,
+			       &cap_available)) {
+		goto done;
+	}
+
+	if (cap_available == 0) {
+		goto done;
+	}
+
+	if (capability_options == NULL) {
+		goto done;
+	}
+
+	for (i = 0; i < sizeof(capabilityMappings) / sizeof(capabilityMappings[0]); i++) {
+		int		cap_val;
+		CFTypeRef	val;
+
+		if (((cap_available & capabilityMappings[i].val) != 0) &&
+		    capabilityMappings[i].readwrite &&
+		    CFDictionaryGetValueIfPresent(capability_options,
+						  *capabilityMappings[i].name,
+						  &val) &&
+		    isA_CFNumber(val) &&
+		    CFNumberGetValue(val, kCFNumberIntType, &cap_val)) {
+			// update capability
+			if (cap_val != 0) {
+				cap_current |= (cap_available & capabilityMappings[i].val);
+			} else {
+				cap_current &= ~capabilityMappings[i].val;
+			}
+
+			// don't process again
+			cap_available &= ~capabilityMappings[i].val;
+		}
+	}
+
+    done :
+
+	return cap_current;
+}
+
+
+CFTypeRef
+SCNetworkInterfaceCopyCapability(SCNetworkInterfaceRef	interface,
+				 CFStringRef		capability)
+{
+	int		cap_current	= 0;
+	int		cap_available	= 0;
+	int		cap_val;
+	CFIndex		i;
+	CFStringRef	interfaceName;
+	CFTypeRef	val		= NULL;
+
+	if (!isA_SCNetworkInterface(interface)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
+
+	interfaceName = SCNetworkInterfaceGetBSDName(interface);
+	if (interfaceName == NULL) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
+
+	if (!__getCapabilities(interfaceName, &cap_current, &cap_available)) {
+		return NULL;
+	}
+
+	if (capability == NULL) {
+		CFMutableDictionaryRef	all	= NULL;
+
+		// if ALL capabilities requested
+		for (i = 0; i < sizeof(capabilityMappings) / sizeof(capabilityMappings[0]); i++) {
+			if ((cap_available & capabilityMappings[i].val) == capabilityMappings[i].val) {
+				if (all == NULL) {
+					all = CFDictionaryCreateMutable(NULL,
+									0,
+									&kCFTypeDictionaryKeyCallBacks,
+									&kCFTypeDictionaryValueCallBacks);
+				}
+				cap_val = ((cap_current & capabilityMappings[i].val) == capabilityMappings[i].val) ? 1 : 0;
+				val = CFNumberCreate(NULL, kCFNumberIntType, &cap_val);
+				CFDictionarySetValue(all, *capabilityMappings[i].name, val);
+				CFRelease(val);
+				cap_available &= ~capabilityMappings[i].val;
+			}
+		}
+
+		val = all;
+	} else {
+		i = findCapability(capability);
+		if (i == kCFNotFound) {
+			// if unknown capability
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+
+		if ((cap_available & capabilityMappings[i].val) != capabilityMappings[i].val) {
+			// if capability not available
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+
+		cap_val = ((cap_current & capabilityMappings[i].val) == capabilityMappings[i].val) ? 1 : 0;
+		val = CFNumberCreate(NULL, kCFNumberIntType, &cap_val);
+	}
+
+	return val;
+}
+
+
+Boolean
+SCNetworkInterfaceSetCapability(SCNetworkInterfaceRef	interface,
+				CFStringRef		capability,
+				CFTypeRef		newValue)
+{
+	int			cap_available		= 0;
+	CFDictionaryRef		configuration;
+	CFIndex			i;
+	CFStringRef		interfaceName;
+	CFMutableDictionaryRef	newConfiguration	= NULL;
+	Boolean			ok			= FALSE;
+
+	if (!isA_SCNetworkInterface(interface)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	interfaceName = SCNetworkInterfaceGetBSDName(interface);
+	if (interfaceName == NULL) {
+		// if no interface name
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	i = findCapability(capability);
+	if (i == kCFNotFound) {
+		// if unknown capability
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if (!capabilityMappings[i].readwrite) {
+		// if not read-write
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if ((newValue != NULL) && !isA_CFNumber(newValue)) {
+		// all values must (for now) be CFNumber[0 or 1]'s
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if (!__getCapabilities(interfaceName, NULL, &cap_available)) {
+		return FALSE;
+	}
+
+	if ((cap_available & capabilityMappings[i].val) == 0) {
+		// if capability not available
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	configuration = SCNetworkInterfaceGetConfiguration(interface);
+	if (configuration == NULL) {
+		newConfiguration = CFDictionaryCreateMutable(NULL,
+							     0,
+							     &kCFTypeDictionaryKeyCallBacks,
+							     &kCFTypeDictionaryValueCallBacks);
+	} else {
+		newConfiguration = CFDictionaryCreateMutableCopy(NULL, 0, configuration);
+		CFDictionaryRemoveValue(newConfiguration, kSCResvInactive);
+	}
+
+	if ((newValue != NULL)) {
+		CFDictionarySetValue(newConfiguration, capability, newValue);
+	} else {
+		CFDictionaryRemoveValue(newConfiguration, capability);
+		if (CFDictionaryGetCount(newConfiguration) == 0) {
+			CFRelease(newConfiguration);
+			newConfiguration = NULL;
+		}
+	}
+
+	ok = SCNetworkInterfaceSetConfiguration(interface, newConfiguration);
+	if (newConfiguration != NULL) CFRelease(newConfiguration);
+
+	return ok;
+}
+
+
+#pragma mark -
+#pragma mark Media Options
+
+
 static const struct ifmedia_description ifm_subtype_shared_descriptions[] =
     IFM_SUBTYPE_SHARED_DESCRIPTIONS;
 
@@ -193,34 +502,30 @@ __createMediaDictionary(int media_options, Boolean filter)
 
 	options = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 
-	while (IFM_OPTIONS(media_options) != 0) {
-		val = NULL;
-		for (i = 0; !val && ifm_shared_option_descriptions[i].ifmt_string; i++) {
-			if (IFM_OPTIONS(media_options) & ifm_shared_option_descriptions[i].ifmt_word) {
+	for (i = 0; (IFM_OPTIONS(media_options) != 0) && (ifm_shared_option_descriptions[i].ifmt_string != NULL); i++) {
+		if ((media_options & ifm_shared_option_descriptions[i].ifmt_word) != 0) {
+			val = CFStringCreateWithCString(NULL,
+							ifm_shared_option_descriptions[i].ifmt_string,
+							kCFStringEncodingASCII);
+			CFArrayAppendValue(options, val);
+			CFRelease(val);
+
+			media_options &= ~ifm_shared_option_descriptions[i].ifmt_word;
+		}
+	}
+
+	if (option_descriptions != NULL) {
+		for (i = 0; (IFM_OPTIONS(media_options) != 0) && (option_descriptions[i].ifmt_string != NULL); i++) {
+			if ((media_options & option_descriptions[i].ifmt_word) != 0) {
 				val = CFStringCreateWithCString(NULL,
-								ifm_shared_option_descriptions[i].ifmt_string,
+								option_descriptions[i].ifmt_string,
 								kCFStringEncodingASCII);
-				media_options &= ~ifm_shared_option_descriptions[i].ifmt_word;
-				break;
-			}
-		}
+				CFArrayAppendValue(options, val);
+				CFRelease(val);
 
-		if (option_descriptions != NULL) {
-			for (i = 0; !val && option_descriptions[i].ifmt_string; i++) {
-				if (IFM_OPTIONS(media_options) & option_descriptions[i].ifmt_word) {
-					val = CFStringCreateWithCString(NULL,
-									option_descriptions[i].ifmt_string,
-									kCFStringEncodingASCII);
-					media_options &= ~option_descriptions[i].ifmt_word;
-					break;
-				}
+				media_options &= ~option_descriptions[i].ifmt_word;
 			}
 		}
-
-		if (val) {
-			CFArrayAppendValue(options, val);
-			CFRelease(val);
-		}
 	}
 
 	CFDictionaryAddValue(dict, kSCPropNetEthernetMediaOptions, options);
@@ -231,11 +536,12 @@ __createMediaDictionary(int media_options, Boolean filter)
 
 
 int
-__createMediaOptions(CFStringRef interfaceName, CFDictionaryRef media_options)
+__SCNetworkInterfaceCreateMediaOptions(SCNetworkInterfaceRef interface, CFDictionaryRef media_options)
 {
 	CFIndex					i;
 	struct ifmediareq			*ifm;
 	int					ifm_new	= -1;
+	CFStringRef				interfaceName;
 	Boolean					match;
 	CFIndex					n;
 	const struct ifmedia_description	*option_descriptions	= NULL;
@@ -244,6 +550,17 @@ __createMediaOptions(CFStringRef interfaceName, CFDictionaryRef media_options)
 	const struct ifmedia_description	*subtype_descriptions	= NULL;
 	CFStringRef				val;
 
+	if (!isA_SCNetworkInterface(interface)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return -1;
+	}
+
+	interfaceName = SCNetworkInterfaceGetBSDName(interface);
+	if (interfaceName == NULL) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return -1;
+	}
+
 	/* set type */
 
 	ifm = __copyMediaList(interfaceName);
@@ -377,7 +694,6 @@ SCNetworkInterfaceCopyMediaOptions(SCNetworkInterfaceRef	interface,
 
 	interfaceName = SCNetworkInterfaceGetBSDName(interface);
 	if (interfaceName == NULL) {
-		SCLog(TRUE, LOG_ERR, CFSTR("no interface name"));
 		_SCErrorSet(kSCStatusInvalidArgument);
 		return FALSE;
 	}
@@ -530,6 +846,49 @@ SCNetworkInterfaceCopyMediaSubTypeOptions(CFArrayRef	available,
 }
 
 
+Boolean
+_SCNetworkInterfaceIsPhysicalEthernet(SCNetworkInterfaceRef interface)
+{
+	int			i;
+	struct ifmediareq	*ifm;
+	CFStringRef		interfaceName;
+	Boolean			realEthernet = FALSE;
+
+	if (!isA_SCNetworkInterface(interface)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	interfaceName = SCNetworkInterfaceGetBSDName(interface);
+	if (interfaceName == NULL) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	ifm = __copyMediaList(interfaceName);
+	if (ifm == NULL) {
+		return FALSE;
+	}
+	_SCErrorSet(kSCStatusOK);
+	if (IFM_TYPE(ifm->ifm_current) != IFM_ETHER) {
+		goto done;
+	}
+	if (ifm->ifm_count == 1
+	    && IFM_SUBTYPE(ifm->ifm_ulist[0]) == IFM_AUTO) {
+		/* only support autoselect, not really ethernet */
+		goto done;
+	}
+	for (i = 0; i < ifm->ifm_count; i++) {
+		if ((ifm->ifm_ulist[i] & IFM_FDX) != 0) {
+			realEthernet = TRUE;
+			break;
+		}
+	}
+ done:
+	__freeMediaList(ifm);
+	return (realEthernet);
+}
+
 static Boolean
 __getMTULimits(char	ifr_name[IFNAMSIZ],
 	       int	*mtu_min,
@@ -639,22 +998,22 @@ SCNetworkInterfaceCopyMTU(SCNetworkInterfaceRef	interface,
 
 	interfaceName = SCNetworkInterfaceGetBSDName(interface);
 	if (interfaceName == NULL) {
-		SCLog(TRUE, LOG_ERR, CFSTR("no interface name"));
-		goto done;
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
 	}
 
 	bzero((void *)&ifr, sizeof(ifr));
 	if (_SC_cfstring_to_cstring(interfaceName, ifr.ifr_name, sizeof(ifr.ifr_name), kCFStringEncodingASCII) == NULL) {
 		SCLog(TRUE, LOG_ERR, CFSTR("could not convert interface name"));
 		_SCErrorSet(kSCStatusInvalidArgument);
-		goto done;
+		return FALSE;
 	}
 
 	sock = socket(AF_INET, SOCK_DGRAM, 0);
 	if (sock == -1) {
 		_SCErrorSet(errno);
 		SCLog(TRUE, LOG_ERR, CFSTR("socket() failed: %s"), strerror(errno));
-		goto done;
+		return FALSE;
 	}
 
 	if (ioctl(sock, SIOCGIFMTU, (caddr_t)&ifr) == -1) {
@@ -684,14 +1043,37 @@ SCNetworkInterfaceCopyMTU(SCNetworkInterfaceRef	interface,
 		} else {
 			(void)__getMTULimits(ifr.ifr_name, mtu_min, mtu_max);
 		}
+
+		if (mtu_min != NULL) {
+#if	IP_MSS > IPV6_MMTU
+			if (*mtu_min < IP_MSS) {
+				/* bump up the minimum MTU */
+				*mtu_min = IP_MSS/*576*/;
+			}
+#else	// IP_MSS > IPV6_MMTU
+			if (*mtu_min < IPV6_MMTU) {
+				/* bump up the minimum MTU */
+				*mtu_min = IPV6_MMTU;
+			}
+#endif	// IP_MSS > IPV6_MMTU
+
+			if ((mtu_cur != NULL) && (*mtu_min > *mtu_cur)) {
+				/* min must be <= cur */
+				*mtu_min = *mtu_cur;
+			}
+
+			if ((mtu_max != NULL) && (*mtu_min > *mtu_max)) {
+				/* min must be <= max */
+				*mtu_min = *mtu_max;
+			}
+		}
 	}
 
 	ok = TRUE;
 
     done :
 
-	if (sock != -1)	(void)close(sock);
-
+	(void)close(sock);
 	return ok;
 }
 
diff --git a/SystemConfiguration.fproj/NetworkConfiguration.plist b/SystemConfiguration.fproj/NetworkConfiguration.plist
index de4cf22..b9ff5d7 100644
--- a/SystemConfiguration.fproj/NetworkConfiguration.plist
+++ b/SystemConfiguration.fproj/NetworkConfiguration.plist
@@ -29,6 +29,8 @@
 		</dict>
 		<key>Bond</key>
 		<dict/>
+		<key>Bridge</key>
+		<dict/>
 		<key>Ethernet</key>
 		<dict/>
 		<key>FireWire</key>
@@ -44,6 +46,8 @@
 		<dict/>
 		<key>L2TP-IPv4</key>
 		<dict/>
+		<key>Loopback</key>
+		<dict/>
 		<key>Modem</key>
 		<dict>
 			<key>ConnectionPersonality</key>
@@ -450,6 +454,19 @@
 		<dict/>
 		<key>VLAN</key>
 		<dict/>
+		<key>VPN-*</key>
+		<dict>
+			<key>DisconnectOnFastUserSwitch</key>
+			<integer>1</integer>
+			<key>DisconnectOnLogout</key>
+			<integer>1</integer>
+			<key>DisconnectOnSleep</key>
+			<integer>0</integer>
+			<key>Logfile</key>
+			<string>/var/log/ppp.log</string>
+			<key>VerboseLogging</key>
+			<integer>0</integer>
+		</dict>
 		<key>WWAN</key>
 		<dict>
 			<key>ConnectionScript</key>
@@ -501,6 +518,31 @@
 				<integer>1</integer>
 			</dict>
 		</dict>
+		<key>Bridge</key>
+		<dict>
+			<key>DNS</key>
+			<dict/>
+			<key>IPv4</key>
+			<dict>
+				<key>ConfigMethod</key>
+				<string>DHCP</string>
+			</dict>
+			<key>IPv6</key>
+			<dict>
+				<key>ConfigMethod</key>
+				<string>Automatic</string>
+			</dict>
+			<key>Proxies</key>
+			<dict>
+				<key>ExceptionsList</key>
+				<array>
+					<string>*.local</string>
+					<string>169.254/16</string>
+				</array>
+				<key>FTPPassive</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
 		<key>Ethernet</key>
 		<dict>
 			<key>DNS</key>
@@ -598,6 +640,8 @@
 		</dict>
 		<key>L2TP-IPv4</key>
 		<dict/>
+		<key>Loopback</key>
+		<dict/>
 		<key>PPP-Bluetooth</key>
 		<dict>
 			<key>DNS</key>
@@ -805,6 +849,26 @@
 				<integer>1</integer>
 			</dict>
 		</dict>
+		<key>VPN-*</key>
+		<dict>
+			<key>DNS</key>
+			<dict/>
+			<key>IPv4</key>
+			<dict>
+				<key>ConfigMethod</key>
+				<string>VPN</string>
+			</dict>
+			<key>IPv6</key>
+			<dict>
+				<key>ConfigMethod</key>
+				<string>Automatic</string>
+			</dict>
+			<key>Proxies</key>
+			<dict>
+				<key>FTPPassive</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
 	</dict>
 </dict>
 </plist>
diff --git a/SystemConfiguration.fproj/SCD.c b/SystemConfiguration.fproj/SCD.c
index 070ff01..5f92caa 100644
--- a/SystemConfiguration.fproj/SCD.c
+++ b/SystemConfiguration.fproj/SCD.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2008, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -275,24 +275,36 @@ _SCCopyDescription(CFTypeRef cf, CFDictionaryRef formatOptions)
 		CFMutableStringRef	nPrefix1;
 		CFMutableStringRef	nPrefix2;
 		CFMutableStringRef	str;
-		const void *		values_q[N_QUICK];
-		const void **		values	= values_q;
 
 		str = CFStringCreateMutable(NULL, 0);
 		CFStringAppendFormat(str, formatOptions, CFSTR("%@<dictionary> {"), prefix1);
 
 		nElements = CFDictionaryGetCount(cf);
 		if (nElements > 0) {
+			CFMutableArrayRef	sortedKeys;
+
 			if (nElements > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) {
-				keys   = CFAllocatorAllocate(NULL, nElements * sizeof(CFTypeRef), 0);
-				values = CFAllocatorAllocate(NULL, nElements * sizeof(CFTypeRef), 0);
+				keys = CFAllocatorAllocate(NULL, nElements * sizeof(CFTypeRef), 0);
+			}
+			CFDictionaryGetKeysAndValues(cf, keys, NULL);
+
+			sortedKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+			for (i = 0; i < nElements; i++) {
+				CFArrayAppendValue(sortedKeys, (CFStringRef)keys[i]);
 			}
-			CFDictionaryGetKeysAndValues(cf, keys, values);
+			CFArraySortValues(sortedKeys,
+					  CFRangeMake(0, nElements),
+					  (CFComparatorFunction)CFStringCompare,
+					  NULL);
+
 			for (i = 0; i < nElements; i++) {
+				CFStringRef		key;
 				CFStringRef		kStr;
+				CFTypeRef		val;
 				CFStringRef		vStr;
 
-				kStr = _SCCopyDescription((CFTypeRef)keys[i], NULL);
+				key  = CFArrayGetValueAtIndex(sortedKeys, i);
+				kStr = _SCCopyDescription((CFTypeRef)key, NULL);
 
 				nPrefix1 = CFStringCreateMutable(NULL, 0);
 				CFStringAppendFormat(nPrefix1,
@@ -312,16 +324,19 @@ _SCCopyDescription(CFTypeRef cf, CFDictionaryRef formatOptions)
 				CFRelease(nPrefix2);
 				CFRelease(kStr);
 
-				vStr = _SCCopyDescription((CFTypeRef)values[i], nFormatOptions);
+				val  = CFDictionaryGetValue(cf, key);
+				vStr = _SCCopyDescription((CFTypeRef)val, nFormatOptions);
 				CFStringAppendFormat(str,
 						     formatOptions,
 						     CFSTR("\n%@"),
 						     vStr);
 				CFRelease(vStr);
 			}
+
+			CFRelease(sortedKeys);
+
 			if (keys != keys_q) {
 				CFAllocatorDeallocate(NULL, keys);
-				CFAllocatorDeallocate(NULL, values);
 			}
 		}
 		CFStringAppendFormat(str, formatOptions, CFSTR("\n%@}"), prefix2);
@@ -459,23 +474,48 @@ void
 SCLog(Boolean condition, int level, CFStringRef formatString, ...)
 {
 	va_list		formatArguments;
+	va_list		formatArguments_print;
+	Boolean		log	= FALSE;
+	Boolean		print	= FALSE;
 
 	if (!condition) {
 		return;
 	}
 
-	va_start(formatArguments, formatString);
+	/*
+	 * Note: The following are the expected values for _sc_log
+	 *
+	 * 0 if SC messages should be written to stdout/stderr
+	 * 1 if SC messages should be logged w/asl(3)
+	 * 2 if SC messages should be written to stdout/stderr AND logged
+	 */
+
 	if (_sc_log > 0) {
+		log = TRUE;		// log requested
+		va_start(formatArguments, formatString);
+
+		if (_sc_log > 1) {
+			print = TRUE;	// log AND print requested
+			va_copy(formatArguments_print, formatArguments);
+		}
+	} else {
+		print = TRUE;		// print requested
+		va_start(formatArguments_print, formatString);
+	}
+
+	if (log) {
 		__SCLog(NULL, NULL, level, formatString, formatArguments);
+		va_end(formatArguments);
 	}
-	if (_sc_log != 1) {
+
+	if (print) {
 		__SCPrint((LOG_PRI(level) > LOG_NOTICE) ? stderr : stdout,
 			  formatString,
-			  formatArguments,
+			  formatArguments_print,
 			  (_sc_log > 0),	// trace
 			  TRUE);		// add newline
+		va_end(formatArguments_print);
 	}
-	va_end(formatArguments);
 
 	return;
 }
@@ -485,22 +525,47 @@ void
 SCLOG(aslclient asl, aslmsg msg, int level, CFStringRef formatString, ...)
 {
 	va_list		formatArguments;
+	va_list		formatArguments_print;
+	Boolean		log	= FALSE;
+	Boolean		print	= FALSE;
+
+	/*
+	 * Note: The following are the expected values for _sc_log
+	 *
+	 * 0 if SC messages should be written to stdout/stderr
+	 * 1 if SC messages should be logged w/asl(3)
+	 * 2 if SC messages should be written to stdout/stderr AND logged
+	 */
 
-	va_start(formatArguments, formatString);
 	if (_sc_log > 0) {
+		log = TRUE;		// log requested
+		va_start(formatArguments, formatString);
+
+		if (_sc_log > 1) {
+			print = TRUE;	// log AND print requested
+			va_copy(formatArguments_print, formatArguments);
+		}
+	} else {
+		print = TRUE;		// print requested
+		va_start(formatArguments_print, formatString);
+	}
+
+	if (log) {
 		__SCLog(asl, msg, level, formatString, formatArguments);
+		va_end(formatArguments);
 	}
-	if (_sc_log != 1) {
+
+	if (print) {
 		if (level < 0) {
 			level = ~level;
 		}
 		__SCPrint((level > ASL_LEVEL_NOTICE) ? stderr : stdout,
 			  formatString,
-			  formatArguments,
+			  formatArguments_print,
 			  (_sc_log > 0),	// trace
 			  TRUE);		// add newline
+		va_end(formatArguments_print);
 	}
-	va_end(formatArguments);
 
 	return;
 }
diff --git a/SystemConfiguration.fproj/SCDAdd.c b/SystemConfiguration.fproj/SCDAdd.c
index e22424a..74c9bd1 100644
--- a/SystemConfiguration.fproj/SCDAdd.c
+++ b/SystemConfiguration.fproj/SCDAdd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -78,6 +78,8 @@ SCDynamicStoreAddTemporaryValue(SCDynamicStoreRef store, CFStringRef key, CFProp
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key & data to the server */
 	status = configadd_s(storePrivate->server,
 			     myKeyRef,
@@ -87,12 +89,8 @@ SCDynamicStoreAddTemporaryValue(SCDynamicStoreRef store, CFStringRef key, CFProp
 			     &newInstance,
 			     (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-	CFRelease(xmlData);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -100,10 +98,18 @@ SCDynamicStoreAddTemporaryValue(SCDynamicStoreRef store, CFStringRef key, CFProp
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreAddTemporaryValue configadd_s(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+	CFRelease(xmlData);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
@@ -151,6 +157,8 @@ SCDynamicStoreAddValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListR
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key & data to the server */
 	status = configadd(storePrivate->server,
 			   myKeyRef,
@@ -160,12 +168,8 @@ SCDynamicStoreAddValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListR
 			   &newInstance,
 			   (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-	CFRelease(xmlData);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -173,10 +177,18 @@ SCDynamicStoreAddValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListR
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreAddValue configadd(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+	CFRelease(xmlData);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
diff --git a/SystemConfiguration.fproj/SCDGet.c b/SystemConfiguration.fproj/SCDGet.c
index ba86734..9ce5a19 100644
--- a/SystemConfiguration.fproj/SCDGet.c
+++ b/SystemConfiguration.fproj/SCDGet.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -53,8 +53,8 @@ SCDynamicStoreCopyMultiple(SCDynamicStoreRef	store,
 	CFDataRef			xmlPatterns	= NULL;	/* patterns (XML serialized) */
 	xmlData_t			myPatternsRef	= NULL;	/* patterns (serialized) */
 	CFIndex				myPatternsLen	= 0;
-	xmlDataOut_t			xmlDictRef;		/* dict (serialized) */
-	mach_msg_type_number_t		xmlDictLen;
+	xmlDataOut_t			xmlDictRef	= NULL;	/* dict (serialized) */
+	mach_msg_type_number_t		xmlDictLen	= 0;
 	CFDictionaryRef			dict		= NULL;	/* dict (un-serialized) */
 	CFDictionaryRef			expDict		= NULL;	/* dict (un-serialized / expanded) */
 	int				sc_status;
@@ -71,7 +71,7 @@ SCDynamicStoreCopyMultiple(SCDynamicStoreRef	store,
 	}
 
 	/* serialize the keys */
-	if (keys) {
+	if (keys != NULL) {
 		if (!_SCSerialize(keys, &xmlKeys, (void **)&myKeysRef, &myKeysLen)) {
 			_SCErrorSet(kSCStatusFailed);
 			return NULL;
@@ -79,14 +79,16 @@ SCDynamicStoreCopyMultiple(SCDynamicStoreRef	store,
 	}
 
 	/* serialize the patterns */
-	if (patterns) {
+	if (patterns != NULL) {
 		if (!_SCSerialize(patterns, &xmlPatterns, (void **)&myPatternsRef, &myPatternsLen)) {
-			CFRelease(xmlKeys);
+			if (xmlKeys != NULL) CFRelease(xmlKeys);
 			_SCErrorSet(kSCStatusFailed);
 			return NULL;
 		}
 	}
 
+    retry :
+
 	/* send the keys and patterns, fetch the associated result from the server */
 	status = configget_m(storePrivate->server,
 			     myKeysRef,
@@ -97,12 +99,8 @@ SCDynamicStoreCopyMultiple(SCDynamicStoreRef	store,
 			     &xmlDictLen,
 			     (int *)&sc_status);
 
-	/* clean up */
-	if (xmlKeys)		CFRelease(xmlKeys);
-	if (xmlPatterns)	CFRelease(xmlPatterns);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -110,12 +108,22 @@ SCDynamicStoreCopyMultiple(SCDynamicStoreRef	store,
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreCopyMultiple configget_m(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return NULL;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	if (xmlKeys != NULL)		CFRelease(xmlKeys);
+	if (xmlPatterns != NULL)	CFRelease(xmlPatterns);
+
 	if (sc_status != kSCStatusOK) {
-		(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDictRef, xmlDictLen);
+		if (xmlDictRef != NULL) {
+			(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDictRef, xmlDictLen);
+		}
 		_SCErrorSet(sc_status);
 		return NULL;
 	}
@@ -136,14 +144,14 @@ SCDynamicStoreCopyMultiple(SCDynamicStoreRef	store,
 CFPropertyListRef
 SCDynamicStoreCopyValue(SCDynamicStoreRef store, CFStringRef key)
 {
-	SCDynamicStorePrivateRef	storePrivate = (SCDynamicStorePrivateRef)store;
+	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 	kern_return_t			status;
-	CFDataRef			utfKey;		/* key (XML serialized) */
-	xmlData_t			myKeyRef;	/* key (serialized) */
+	CFDataRef			utfKey;			/* key (XML serialized) */
+	xmlData_t			myKeyRef;		/* key (serialized) */
 	CFIndex				myKeyLen;
-	xmlDataOut_t			xmlDataRef;	/* data (serialized) */
-	mach_msg_type_number_t		xmlDataLen;
-	CFPropertyListRef		data;		/* data (un-serialized) */
+	xmlDataOut_t			xmlDataRef	= NULL;	/* data (serialized) */
+	mach_msg_type_number_t		xmlDataLen	= 0;
+	CFPropertyListRef		data;			/* data (un-serialized) */
 	int				newInstance;
 	int				sc_status;
 
@@ -164,6 +172,8 @@ SCDynamicStoreCopyValue(SCDynamicStoreRef store, CFStringRef key)
 		return NULL;
 	}
 
+    retry :
+
 	/* send the key & fetch the associated data from the server */
 	status = configget(storePrivate->server,
 			   myKeyRef,
@@ -173,11 +183,8 @@ SCDynamicStoreCopyValue(SCDynamicStoreRef store, CFStringRef key)
 			   &newInstance,
 			   (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -185,12 +192,21 @@ SCDynamicStoreCopyValue(SCDynamicStoreRef store, CFStringRef key)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreCopyValue configget(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return NULL;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+
 	if (sc_status != kSCStatusOK) {
-		(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
+		if (xmlDataRef != NULL) {
+			(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
+		}
 		_SCErrorSet(sc_status);
 		return NULL;
 	}
diff --git a/SystemConfiguration.fproj/SCDKeys.c b/SystemConfiguration.fproj/SCDKeys.c
index a2eb4cc..26349cc 100644
--- a/SystemConfiguration.fproj/SCDKeys.c
+++ b/SystemConfiguration.fproj/SCDKeys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2005, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -50,12 +50,17 @@ SCDynamicStoreKeyCreate(CFAllocatorRef	allocator,
 			CFStringRef	fmt,
 			...)
 {
-	va_list	args;
+	va_list		args;
+	CFStringRef	result;
+
 	va_start(args, fmt);
-	return (CFStringCreateWithFormatAndArguments(allocator,
-						     NULL,
-						     fmt,
-						     args));
+	result = CFStringCreateWithFormatAndArguments(allocator,
+						      NULL,
+						      fmt,
+						      args);
+	va_end(args);
+
+	return result;
 }
 
 CFStringRef
diff --git a/SystemConfiguration.fproj/SCDList.c b/SystemConfiguration.fproj/SCDList.c
index 7659c0f..5ba13bb 100644
--- a/SystemConfiguration.fproj/SCDList.c
+++ b/SystemConfiguration.fproj/SCDList.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -42,13 +42,13 @@
 CFArrayRef
 SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
 {
-	SCDynamicStorePrivateRef	storePrivate = (SCDynamicStorePrivateRef)store;
+	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 	kern_return_t			status;
-	CFDataRef			utfPattern;	/* serialized pattern */
+	CFDataRef			utfPattern;		/* serialized pattern */
 	xmlData_t			myPatternRef;
 	CFIndex				myPatternLen;
-	xmlDataOut_t			xmlDataRef;	/* serialized data */
-	mach_msg_type_number_t		xmlDataLen;
+	xmlDataOut_t			xmlDataRef	= NULL;		/* serialized data */
+	mach_msg_type_number_t		xmlDataLen	= 0;
 	int				sc_status;
 	CFArrayRef			allKeys;
 
@@ -69,6 +69,8 @@ SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
 		return NULL;
 	}
 
+    retry :
+
 	/* send the pattern & fetch the associated data from the server */
 	status = configlist(storePrivate->server,
 			    myPatternRef,
@@ -78,11 +80,8 @@ SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
 			    &xmlDataLen,
 			    (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfPattern);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -90,12 +89,21 @@ SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreCopyKeyList configlist(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return NULL;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfPattern);
+
 	if (sc_status != kSCStatusOK) {
-		(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
+		if (xmlDataRef != NULL) {
+			(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
+		}
 		_SCErrorSet(sc_status);
 		return NULL;
 	}
diff --git a/SystemConfiguration.fproj/SCDLock.c b/SystemConfiguration.fproj/SCDLock.c
index 291cb32..90617fd 100644
--- a/SystemConfiguration.fproj/SCDLock.c
+++ b/SystemConfiguration.fproj/SCDLock.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -58,11 +58,13 @@ SCDynamicStoreLock(SCDynamicStoreRef store)
 		return FALSE;
 	}
 
+    retry :
+
 	/* get the lock from the server */
 	status = configlock(storePrivate->server, (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -70,8 +72,12 @@ SCDynamicStoreLock(SCDynamicStoreRef store)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreLock configlock(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
 	if (sc_status != kSCStatusOK) {
diff --git a/SystemConfiguration.fproj/SCDNotifierAdd.c b/SystemConfiguration.fproj/SCDNotifierAdd.c
index 7e58721..40b7569 100644
--- a/SystemConfiguration.fproj/SCDNotifierAdd.c
+++ b/SystemConfiguration.fproj/SCDNotifierAdd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -39,6 +39,19 @@
 #include "SCDynamicStoreInternal.h"
 #include "config.h"		/* MiG generated file */
 
+
+static void
+addKey(CFMutableArrayRef *keysP, CFStringRef key)
+{
+	if (*keysP == NULL) {
+		*keysP = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	}
+
+	CFArrayAppendValue(*keysP, key);
+	return;
+}
+
+
 Boolean
 SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex)
 {
@@ -67,6 +80,8 @@ SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean is
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key to the server */
 	status = notifyadd(storePrivate->server,
 			   myKeyRef,
@@ -74,11 +89,8 @@ SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean is
 			   isRegex,
 			   (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -86,14 +98,26 @@ SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean is
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreAddWatchedKey notifyadd(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
 	}
 
+	if (isRegex) {
+		addKey(&storePrivate->patterns, key);
+	} else {
+		addKey(&storePrivate->keys, key);
+	}
 	return TRUE;
 }
diff --git a/SystemConfiguration.fproj/SCDNotifierCancel.c b/SystemConfiguration.fproj/SCDNotifierCancel.c
index fa290e9..ca0454d 100644
--- a/SystemConfiguration.fproj/SCDNotifierCancel.c
+++ b/SystemConfiguration.fproj/SCDNotifierCancel.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -52,19 +52,10 @@ SCDynamicStoreNotifyCancel(SCDynamicStoreRef store)
 		return FALSE;
 	}
 
-	if (storePrivate->server == MACH_PORT_NULL) {
-		/* sorry, you must have an open session to play */
-		_SCErrorSet(kSCStatusNoStoreServer);
-		return FALSE;
-	}
-
 	switch (storePrivate->notifyStatus) {
 		case NotifierNotRegistered :
 			/* if no notifications have been registered */
 			return TRUE;
-		case Using_NotifierInformViaRunLoop :
-			CFRunLoopSourceInvalidate(storePrivate->rls);
-			return TRUE;
 		case Using_NotifierInformViaCallback :
 			/* invalidate and release the run loop source */
 			if (storePrivate->callbackRLS != NULL) {
@@ -84,17 +75,26 @@ SCDynamicStoreNotifyCancel(SCDynamicStoreRef store)
 			storePrivate->callbackArgument	= NULL;
 			storePrivate->callbackFunction	= NULL;
 			break;
+		case Using_NotifierInformViaRunLoop :
+			CFRunLoopSourceInvalidate(storePrivate->rls);
+			storePrivate->rls = NULL;
+			return TRUE;
+		case Using_NotifierInformViaDispatch :
+			(void) SCDynamicStoreSetDispatchQueue(store, NULL);
+			return TRUE;
 		default :
 			break;
 	}
 
-	status = notifycancel(storePrivate->server, (int *)&sc_status);
-
-	/* set notifier inactive */
-	storePrivate->notifyStatus = NotifierNotRegistered;
+	if (storePrivate->server == MACH_PORT_NULL) {
+		/* sorry, you must have an open session to play */
+		sc_status = kSCStatusNoStoreServer;
+		goto done;
+	}
 
+	status = notifycancel(storePrivate->server, (int *)&sc_status);
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -102,10 +102,19 @@ SCDynamicStoreNotifyCancel(SCDynamicStoreRef store)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyCancel notifycancel(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if (((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED))
+		    && __SCDynamicStoreReconnect(store)) {
+			sc_status = kSCStatusOK;
+		} else {
+			sc_status = status;
+		}
 	}
 
+    done :
+
+	/* set notifier inactive */
+	storePrivate->notifyStatus = NotifierNotRegistered;
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
diff --git a/SystemConfiguration.fproj/SCDNotifierGetChanges.c b/SystemConfiguration.fproj/SCDNotifierGetChanges.c
index a302091..bbfe5e4 100644
--- a/SystemConfiguration.fproj/SCDNotifierGetChanges.c
+++ b/SystemConfiguration.fproj/SCDNotifierGetChanges.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -42,10 +42,10 @@
 CFArrayRef
 SCDynamicStoreCopyNotifiedKeys(SCDynamicStoreRef store)
 {
-	SCDynamicStorePrivateRef	storePrivate = (SCDynamicStorePrivateRef)store;
+	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 	kern_return_t			status;
-	xmlDataOut_t			xmlDataRef;	/* serialized data */
-	mach_msg_type_number_t		xmlDataLen;
+	xmlDataOut_t			xmlDataRef	= NULL;	/* serialized data */
+	mach_msg_type_number_t		xmlDataLen	= 0;
 	int				sc_status;
 	CFArrayRef			allKeys;
 
@@ -60,6 +60,8 @@ SCDynamicStoreCopyNotifiedKeys(SCDynamicStoreRef store)
 		return NULL;
 	}
 
+    retry :
+
 	/* send the key & fetch the associated data from the server */
 	status = notifychanges(storePrivate->server,
 			       &xmlDataRef,
@@ -67,7 +69,7 @@ SCDynamicStoreCopyNotifiedKeys(SCDynamicStoreRef store)
 			       (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -75,12 +77,18 @@ SCDynamicStoreCopyNotifiedKeys(SCDynamicStoreRef store)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreCopyNotifiedKeys notifychanges(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return NULL;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
 	if (sc_status != kSCStatusOK) {
-		(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
+		if (xmlDataRef != NULL) {
+			(void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen);
+		}
 		_SCErrorSet(sc_status);
 		return NULL;
 	}
diff --git a/SystemConfiguration.fproj/SCDNotifierInformViaCallback.c b/SystemConfiguration.fproj/SCDNotifierInformViaCallback.c
index f88afec..166c0ce 100644
--- a/SystemConfiguration.fproj/SCDNotifierInformViaCallback.c
+++ b/SystemConfiguration.fproj/SCDNotifierInformViaCallback.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -34,9 +34,7 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <mach/mach.h>
 #include <mach/mach_error.h>
 
@@ -51,8 +49,8 @@ informCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
 {
 	SCDynamicStoreRef		store		= (SCDynamicStoreRef)info;
 	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
-	mach_msg_empty_rcv_t		*buf		= msg;
-	mach_msg_id_t			msgid		= buf->header.msgh_id;
+	mach_no_senders_notification_t	*buf		= msg;
+	mach_msg_id_t			msgid		= buf->not_header.msgh_id;
 	SCDynamicStoreCallBack_v1	cbFunc		= storePrivate->callbackFunction;
 	void				*cbArg		= storePrivate->callbackArgument;
 
@@ -130,17 +128,17 @@ SCDynamicStoreNotifyCallback(SCDynamicStoreRef		store,
 			     SCDynamicStoreCallBack_v1	func,
 			     void			*arg)
 {
-	SCDynamicStorePrivateRef	storePrivate = (SCDynamicStorePrivateRef)store;
-	kern_return_t			status;
-	mach_port_t			port;
+	CFMachPortContext		context		= { 0
+							  , (void *)store
+							  , CFRetain
+							  , CFRelease
+							  , notifyMPCopyDescription
+							  };
 	mach_port_t			oldNotify;
+	mach_port_t			port;
 	int				sc_status;
-	CFMachPortContext		context = { 0
-						  , (void *)store
-						  , CFRetain
-						  , CFRelease
-						  , notifyMPCopyDescription
-						  };
+	kern_return_t			status;
+	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 
 	if (store == NULL) {
 		/* sorry, you must provide a session */
@@ -206,6 +204,8 @@ SCDynamicStoreNotifyCallback(SCDynamicStoreRef		store,
 		SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyCallback(): oldNotify != MACH_PORT_NULL"));
 	}
 
+    retry :
+
 	/* Requesting notification via mach port */
 	status = notifyviaport(storePrivate->server,
 			       port,
@@ -213,7 +213,7 @@ SCDynamicStoreNotifyCallback(SCDynamicStoreRef		store,
 			       (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -221,16 +221,17 @@ SCDynamicStoreNotifyCallback(SCDynamicStoreRef		store,
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyCallback notifyviaport(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
 			/* remove the send right that we tried (but failed) to pass to the server */
 			(void) mach_port_deallocate(mach_task_self(), port);
 		}
 
 		/* remove our receive right  */
 		(void) mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE, -1);
-		_SCErrorSet(status);
-		return FALSE;
+		sc_status = status;
 	}
 
 	if (sc_status != kSCStatusOK) {
@@ -245,7 +246,10 @@ SCDynamicStoreNotifyCallback(SCDynamicStoreRef		store,
 	__MACH_PORT_DEBUG(TRUE, "*** SCDynamicStoreNotifyCallback", port);
 	storePrivate->callbackArgument	= arg;
 	storePrivate->callbackFunction	= func;
-	storePrivate->callbackPort	= CFMachPortCreateWithPort(NULL, port, informCallback, &context, NULL);
+	storePrivate->callbackPort	= _SC_CFMachPortCreateWithPort("SCDynamicStoreNotifyCallback",
+								       port,
+								       informCallback,
+								       &context);
 	storePrivate->callbackRLS	= CFMachPortCreateRunLoopSource(NULL, storePrivate->callbackPort, 0);
 	CFRunLoopAddSource(runLoop, storePrivate->callbackRLS, kCFRunLoopDefaultMode);
 
@@ -256,8 +260,8 @@ SCDynamicStoreNotifyCallback(SCDynamicStoreRef		store,
 static void
 rlsCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
 {
-	mach_msg_empty_rcv_t		*buf		= msg;
-	mach_msg_id_t			msgid		= buf->header.msgh_id;
+	mach_no_senders_notification_t	*buf		= msg;
+	mach_msg_id_t			msgid		= buf->not_header.msgh_id;
 	SCDynamicStoreRef		store		= (SCDynamicStoreRef)info;
 	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 
@@ -273,22 +277,8 @@ rlsCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
 		}
 #endif	/* DEBUG */
 
-		/* invalidate the run loop source(s) */
-		if (storePrivate->callbackRLS != NULL) {
-			CFRunLoopSourceInvalidate(storePrivate->callbackRLS);
-			CFRelease(storePrivate->callbackRLS);
-			storePrivate->callbackRLS = NULL;
-		}
-
-		/* invalidate port */
-		if (storePrivate->callbackPort != NULL) {
-			__MACH_PORT_DEBUG(TRUE, "*** rlsCallback w/MACH_NOTIFY_NO_SENDERS", CFMachPortGetPort(storePrivate->callbackPort));
-			CFMachPortInvalidate(storePrivate->callbackPort);
-			CFRelease(storePrivate->callbackPort);
-			storePrivate->callbackPort = NULL;
-		}
-
-		return;
+		/* re-establish notification and inform the client */
+		(void)__SCDynamicStoreReconnectNotifications(store);
 	}
 
 	/* signal the real runloop source */
@@ -321,13 +311,13 @@ rlsSchedule(void *info, CFRunLoopRef rl, CFStringRef mode)
 	      (rl != NULL) ? mode : CFSTR("libdispatch"));
 #endif	/* DEBUG */
 
-	if (storePrivate->rlsRefs++ == 0) {
-		CFMachPortContext	context = { 0
-						  , (void *)store
-						  , CFRetain
-						  , CFRelease
-						  , notifyMPCopyDescription
-						  };
+	if (storePrivate->rlList == NULL) {
+		CFMachPortContext	context		= { 0
+							  , (void *)store
+							  , CFRetain
+							  , CFRelease
+							  , notifyMPCopyDescription
+							  };
 		mach_port_t		oldNotify;
 		mach_port_t		port;
 		int			sc_status;
@@ -380,10 +370,12 @@ rlsSchedule(void *info, CFRunLoopRef rl, CFStringRef mode)
 			SCLog(TRUE, LOG_ERR, CFSTR("rlsSchedule(): oldNotify != MACH_PORT_NULL"));
 		}
 
+	    retry :
+
 		__MACH_PORT_DEBUG(TRUE, "*** rlsSchedule", port);
 		status = notifyviaport(storePrivate->server, port, 0, (int *)&sc_status);
 		if (status != KERN_SUCCESS) {
-			if (status == MACH_SEND_INVALID_DEST) {
+			if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 				/* the server's gone and our session port's dead, remove the dead name right */
 				(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 			} else {
@@ -391,8 +383,10 @@ rlsSchedule(void *info, CFRunLoopRef rl, CFStringRef mode)
 				SCLog(TRUE, LOG_ERR, CFSTR("rlsSchedule notifyviaport(): %s"), mach_error_string(status));
 			}
 			storePrivate->server = MACH_PORT_NULL;
-
-			if (status == MACH_SEND_INVALID_DEST) {
+			if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+				if (__SCDynamicStoreReconnect(store)) {
+					goto retry;
+				}
 				/* remove the send right that we tried (but failed) to pass to the server */
 				(void) mach_port_deallocate(mach_task_self(), port);
 			}
@@ -402,28 +396,33 @@ rlsSchedule(void *info, CFRunLoopRef rl, CFStringRef mode)
 			return;
 		}
 
-		__MACH_PORT_DEBUG(TRUE, "*** rlsSchedule (after notifyviaport)", port);
-		storePrivate->callbackPort = CFMachPortCreateWithPort(NULL, port, rlsCallback, &context, NULL);
-		if (storePrivate->callbackPort == NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("*** CFMachPortCreateWithPort returned NULL while attempting to schedule"));
-			SCLog(TRUE, LOG_ERR, CFSTR("*** a SCDynamicStore notification.  Did this process call \"fork\" without"));
-			SCLog(TRUE, LOG_ERR, CFSTR("*** calling \"exec\""));
-
-			/* the server's gone and our session port's dead, remove the dead name right */
-			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
-			storePrivate->server = MACH_PORT_NULL;
-
-			/* remove our receive right  */
+		if (sc_status != kSCStatusOK) {
+			/* something [else] didn't work, remove our receive right  */
 			(void) mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE, -1);
 			return;
 		}
+
+		__MACH_PORT_DEBUG(TRUE, "*** rlsSchedule (after notifyviaport)", port);
+		storePrivate->callbackPort = _SC_CFMachPortCreateWithPort("SCDynamicStore",
+									  port,
+									  rlsCallback,
+									  &context);
 		CFMachPortSetInvalidationCallBack(storePrivate->callbackPort, portInvalidate);
 		storePrivate->callbackRLS = CFMachPortCreateRunLoopSource(NULL, storePrivate->callbackPort, 0);
+
+		storePrivate->rlList = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 	}
 
 	if ((rl != NULL) && (storePrivate->callbackRLS != NULL)) {
-		CFRunLoopAddSource(rl, storePrivate->callbackRLS, mode);
-		__MACH_PORT_DEBUG(TRUE, "*** rlsSchedule (after CFRunLoopAddSource)", CFMachPortGetPort(storePrivate->callbackPort));
+		if (!_SC_isScheduled(store, rl, mode, storePrivate->rlList)) {
+			/*
+			 * if we are not already scheduled with this runLoop / runLoopMode
+			 */
+			CFRunLoopAddSource(rl, storePrivate->callbackRLS, mode);
+			__MACH_PORT_DEBUG(TRUE, "*** rlsSchedule (after CFRunLoopAddSource)", CFMachPortGetPort(storePrivate->callbackPort));
+		}
+
+		_SC_schedule(store, rl, mode, storePrivate->rlList);
 	}
 
 	return;
@@ -433,6 +432,7 @@ rlsSchedule(void *info, CFRunLoopRef rl, CFStringRef mode)
 static void
 rlsCancel(void *info, CFRunLoopRef rl, CFStringRef mode)
 {
+	CFIndex				n		= 0;
 	SCDynamicStoreRef		store		= (SCDynamicStoreRef)info;
 	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 
@@ -443,10 +443,22 @@ rlsCancel(void *info, CFRunLoopRef rl, CFStringRef mode)
 #endif	/* DEBUG */
 
 	if ((rl != NULL) && (storePrivate->callbackRLS != NULL)) {
-		CFRunLoopRemoveSource(rl, storePrivate->callbackRLS, mode);
+		if (_SC_unschedule(store, rl, mode, storePrivate->rlList, FALSE)) {
+			/*
+			 * if currently scheduled on this runLoop / runLoopMode
+			 */
+			n = CFArrayGetCount(storePrivate->rlList);
+			if (n == 0 || !_SC_isScheduled(store, rl, mode, storePrivate->rlList)) {
+				/*
+				 * if we are no longer scheduled to receive notifications for
+				 * this runLoop / runLoopMode
+				 */
+				CFRunLoopRemoveSource(rl, storePrivate->callbackRLS, mode);
+			}
+		}
 	}
 
-	if (--storePrivate->rlsRefs == 0) {
+	if (n == 0) {
 		int		sc_status;
 		kern_return_t	status;
 
@@ -457,6 +469,9 @@ rlsCancel(void *info, CFRunLoopRef rl, CFStringRef mode)
 				  "*** rlsCancel",
 				  CFMachPortGetPort(storePrivate->callbackPort));
 
+		CFRelease(storePrivate->rlList);
+		storePrivate->rlList = NULL;
+
 		if (storePrivate->callbackRLS != NULL) {
 			/* invalidate & remove the run loop source */
 			CFRunLoopSourceInvalidate(storePrivate->callbackRLS);
@@ -477,7 +492,7 @@ rlsCancel(void *info, CFRunLoopRef rl, CFStringRef mode)
 		if (storePrivate->server != MACH_PORT_NULL) {
 			status = notifycancel(storePrivate->server, (int *)&sc_status);
 			if (status != KERN_SUCCESS) {
-				if (status == MACH_SEND_INVALID_DEST) {
+				if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 					/* the server's gone and our session port's dead, remove the dead name right */
 					(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 				} else {
@@ -485,6 +500,9 @@ rlsCancel(void *info, CFRunLoopRef rl, CFStringRef mode)
 					SCLog(TRUE, LOG_ERR, CFSTR("rlsCancel notifycancel(): %s"), mach_error_string(status));
 				}
 				storePrivate->server = MACH_PORT_NULL;
+				if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+					(void) __SCDynamicStoreReconnect(store);
+				}
 				return;
 			}
 		}
@@ -509,13 +527,18 @@ rlsPerform(void *info)
 #endif	/* DEBUG */
 
 	changedKeys = SCDynamicStoreCopyNotifiedKeys(store);
-	if (changedKeys == NULL) {
-		/* if no changes or something happened to the server */
-		return;
-	}
-
-	if (CFArrayGetCount(changedKeys) == 0) {
-		goto done;
+	if (storePrivate->disconnectForceCallBack) {
+		storePrivate->disconnectForceCallBack = FALSE;
+		if (changedKeys == NULL) {
+			changedKeys = CFArrayCreate(NULL, NULL, 0, &kCFTypeArrayCallBacks);
+		}
+	} else {
+		if (changedKeys == NULL) {
+			/* if no changes or something happened to the server */
+			return;
+		} else if (CFArrayGetCount(changedKeys) == 0) {
+			goto done;
+		}
 	}
 
 	rlsFunction = storePrivate->rlsFunction;
@@ -545,11 +568,18 @@ rlsRetain(CFTypeRef cf)
 	SCDynamicStoreRef		store		= (SCDynamicStoreRef)cf;
 	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 
-	if (storePrivate->notifyStatus != Using_NotifierInformViaRunLoop) {
-		/* mark RLS active */
-		storePrivate->notifyStatus = Using_NotifierInformViaRunLoop;
-		/* keep a reference to the store */
-		CFRetain(store);
+	switch (storePrivate->notifyStatus) {
+		case NotifierNotRegistered :
+			/* mark RLS active */
+			storePrivate->notifyStatus = Using_NotifierInformViaRunLoop;
+			/* keep a reference to the store */
+			CFRetain(store);
+			break;
+		case Using_NotifierInformViaRunLoop :
+			break;
+		default :
+			SCLog(TRUE, LOG_ERR, CFSTR("rlsRetain() error: notifyStatus=%d"), storePrivate->notifyStatus);
+			break;
 	}
 
 	return cf;
@@ -562,12 +592,21 @@ rlsRelease(CFTypeRef cf)
 	SCDynamicStoreRef		store		= (SCDynamicStoreRef)cf;
 	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 
-	/* mark RLS inactive */
-	storePrivate->notifyStatus = NotifierNotRegistered;
-	storePrivate->rls = NULL;
+	switch (storePrivate->notifyStatus) {
+		case NotifierNotRegistered :
+			break;
+		case Using_NotifierInformViaRunLoop :
+			/* mark RLS inactive */
+			storePrivate->notifyStatus = NotifierNotRegistered;
+			storePrivate->rls = NULL;
 
-	/* release our reference to the store */
-	CFRelease(store);
+			/* release our reference to the store */
+			CFRelease(store);
+			break;
+		default :
+			SCLog(TRUE, LOG_ERR, CFSTR("rlsRelease() error: notifyStatus=%d"), storePrivate->notifyStatus);
+			break;
+	}
 
 	return;
 }
@@ -664,16 +703,23 @@ SCDynamicStoreCreateRunLoopSource(CFAllocatorRef	allocator,
 }
 
 
-#if	!TARGET_OS_IPHONE
 static boolean_t
 SCDynamicStoreNotifyMIGCallback(mach_msg_header_t *message, mach_msg_header_t *reply)
 {
-	SCDynamicStorePrivateRef	storePrivate;
+	mach_msg_empty_rcv_t	*buf	= (mach_msg_empty_rcv_t *)message;
+	mach_msg_id_t		msgid	= buf->header.msgh_id;
+	SCDynamicStoreRef	store;
+
+	store = dispatch_get_context(dispatch_get_current_queue());
+	if (store != NULL) {
+		SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 
-	storePrivate = dispatch_get_context(dispatch_get_current_queue());
-	if (storePrivate != NULL) {
 		CFRetain(storePrivate);
 		dispatch_async(storePrivate->dispatchQueue, ^{
+			if (msgid == MACH_NOTIFY_NO_SENDERS) {
+				/* re-establish notification and inform the client */
+				(void)__SCDynamicStoreReconnectNotifications(store);
+			}
 			rlsPerform(storePrivate);
 			CFRelease(storePrivate);
 		});
@@ -695,15 +741,15 @@ SCDynamicStoreSetDispatchQueue(SCDynamicStoreRef store, dispatch_queue_t queue)
 		return FALSE;
 	}
 
-	if (storePrivate->server == MACH_PORT_NULL) {
-		/* sorry, you must have an open session to play */
-		_SCErrorSet(kSCStatusNoStoreServer);
-		return FALSE;
-	}
-
 	if (queue != NULL) {
 		mach_port_t	mp;
 
+		if (storePrivate->server == MACH_PORT_NULL) {
+			/* sorry, you must have an open session to play */
+			_SCErrorSet(kSCStatusNoStoreServer);
+			return FALSE;
+		}
+
 		if ((storePrivate->dispatchQueue != NULL) || (storePrivate->rls != NULL)) {
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return FALSE;
@@ -725,6 +771,12 @@ SCDynamicStoreSetDispatchQueue(SCDynamicStoreRef store, dispatch_queue_t queue)
 		storePrivate->dispatchQueue = queue;
 		dispatch_retain(storePrivate->dispatchQueue);
 
+		if (storePrivate->callbackPort == NULL) {
+			/* if we could not schedule the notification */
+			_SCErrorSet(kSCStatusFailed);
+			goto cleanup;
+		}
+
 		/*
 		 * create a dispatch queue for the mach notifications source, we'll use
 		 * this queue's context to carry the store pointer for the callback code.
@@ -753,8 +805,13 @@ SCDynamicStoreSetDispatchQueue(SCDynamicStoreRef store, dispatch_queue_t queue)
 			goto cleanup;
 		}
 		dispatch_source_set_event_handler(storePrivate->callbackSource, ^{
+			union MaxMsgSize {
+				mach_msg_empty_rcv_t		normal;
+				mach_no_senders_notification_t	no_senders;
+			};
+
 			dispatch_mig_server(storePrivate->callbackSource,
-					    sizeof(mach_msg_header_t),
+					    sizeof(union MaxMsgSize),
 					    SCDynamicStoreNotifyMIGCallback);
 		});
 		dispatch_resume(storePrivate->callbackSource);
@@ -794,4 +851,3 @@ SCDynamicStoreSetDispatchQueue(SCDynamicStoreRef store, dispatch_queue_t queue)
 
 	return ok;
 }
-#endif	// !TARGET_OS_IPHONE
diff --git a/SystemConfiguration.fproj/SCDNotifierInformViaFD.c b/SystemConfiguration.fproj/SCDNotifierInformViaFD.c
index 221181c..f1b6f65 100644
--- a/SystemConfiguration.fproj/SCDNotifierInformViaFD.c
+++ b/SystemConfiguration.fproj/SCDNotifierInformViaFD.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -118,6 +118,8 @@ SCDynamicStoreNotifyFileDescriptor(SCDynamicStoreRef	store,
 		return FALSE;
 	}
 
+    retry :
+
 	status = notifyviafd(storePrivate->server,
 			     un.sun_path,
 			     strlen(un.sun_path),
@@ -125,7 +127,7 @@ SCDynamicStoreNotifyFileDescriptor(SCDynamicStoreRef	store,
 			     (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -133,6 +135,11 @@ SCDynamicStoreNotifyFileDescriptor(SCDynamicStoreRef	store,
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyFileDescriptor notifyviafd(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
 		_SCErrorSet(status);
 		return FALSE;
 	}
diff --git a/SystemConfiguration.fproj/SCDNotifierInformViaMachPort.c b/SystemConfiguration.fproj/SCDNotifierInformViaMachPort.c
index 9e6a532..4d0f145 100644
--- a/SystemConfiguration.fproj/SCDNotifierInformViaMachPort.c
+++ b/SystemConfiguration.fproj/SCDNotifierInformViaMachPort.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005, 2009 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -113,13 +113,15 @@ SCDynamicStoreNotifyMachPort(SCDynamicStoreRef store, mach_msg_id_t identifier,
 		SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyMachPort(): oldNotify != MACH_PORT_NULL"));
 	}
 
+    retry :
+
 	status = notifyviaport(storePrivate->server,
 			       *port,
 			       identifier,
 			       (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -127,8 +129,10 @@ SCDynamicStoreNotifyMachPort(SCDynamicStoreRef store, mach_msg_id_t identifier,
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyMachPort notifyviaport(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
 			/* remove the send right that we tried (but failed) to pass to the server */
 			(void) mach_port_deallocate(mach_task_self(), *port);
 		}
diff --git a/SystemConfiguration.fproj/SCDNotifierInformViaSignal.c b/SystemConfiguration.fproj/SCDNotifierInformViaSignal.c
index 495d79b..3b81fc8 100644
--- a/SystemConfiguration.fproj/SCDNotifierInformViaSignal.c
+++ b/SystemConfiguration.fproj/SCDNotifierInformViaSignal.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -72,10 +72,12 @@ SCDynamicStoreNotifySignal(SCDynamicStoreRef store, pid_t pid, int sig)
 		return FALSE;
 	}
 
+    retry :
+
 	status = notifyviasignal(storePrivate->server, task, sig, (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -83,6 +85,11 @@ SCDynamicStoreNotifySignal(SCDynamicStoreRef store, pid_t pid, int sig)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifySignal notifyviasignal(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
 		_SCErrorSet(status);
 		return FALSE;
 	}
diff --git a/SystemConfiguration.fproj/SCDNotifierRemove.c b/SystemConfiguration.fproj/SCDNotifierRemove.c
index 42e3cd3..be63da6 100644
--- a/SystemConfiguration.fproj/SCDNotifierRemove.c
+++ b/SystemConfiguration.fproj/SCDNotifierRemove.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -39,6 +39,29 @@
 #include "SCDynamicStoreInternal.h"
 #include "config.h"		/* MiG generated file */
 
+static void
+removeKey(CFMutableArrayRef keys, CFStringRef key)
+{
+	CFIndex	i;
+	CFIndex	n;
+
+	if (keys == NULL) {
+		/* if no keys */
+		return;
+	}
+
+	n = CFArrayGetCount(keys);
+	i = CFArrayGetFirstIndexOfValue(keys, CFRangeMake(0, n), key);
+	if (i == kCFNotFound) {
+		/* if key not in list */
+	}
+
+	/* remove key from list */
+	CFArrayRemoveValueAtIndex(keys, i);
+	return;
+}
+
+
 Boolean
 SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex)
 {
@@ -67,6 +90,8 @@ SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key to the server */
 	status = notifyremove(storePrivate->server,
 			      myKeyRef,
@@ -74,11 +99,8 @@ SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean
 			      isRegex,
 			      (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -86,14 +108,26 @@ SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreRemoveWatchedKey notifyremove(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
 	}
 
+	if (isRegex) {
+		removeKey(storePrivate->patterns, key);
+	} else {
+		removeKey(storePrivate->keys, key);
+	}
 	return TRUE;
 }
diff --git a/SystemConfiguration.fproj/SCDNotifierSetKeys.c b/SystemConfiguration.fproj/SCDNotifierSetKeys.c
index 9343c99..23777fa 100644
--- a/SystemConfiguration.fproj/SCDNotifierSetKeys.c
+++ b/SystemConfiguration.fproj/SCDNotifierSetKeys.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -51,6 +51,7 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef	store,
 	xmlData_t			myPatternsRef	= NULL;	/* patterns (serialized) */
 	CFIndex				myPatternsLen	= 0;
 	int				sc_status;
+	CFMutableArrayRef		tmp;
 
 	if (store == NULL) {
 		/* sorry, you must provide a session */
@@ -64,7 +65,7 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef	store,
 	}
 
 	/* serialize the keys */
-	if (keys) {
+	if (keys != NULL) {
 		if (!_SCSerialize(keys, &xmlKeys, (void **)&myKeysRef, &myKeysLen)) {
 			_SCErrorSet(kSCStatusFailed);
 			return FALSE;
@@ -72,14 +73,16 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef	store,
 	}
 
 	/* serialize the patterns */
-	if (patterns) {
+	if (patterns != NULL) {
 		if (!_SCSerialize(patterns, &xmlPatterns, (void **)&myPatternsRef, &myPatternsLen)) {
-			CFRelease(xmlKeys);
+			if (xmlKeys != NULL) CFRelease(xmlKeys);
 			_SCErrorSet(kSCStatusFailed);
 			return FALSE;
 		}
 	}
 
+    retry :
+
 	/* send the keys and patterns, fetch the associated result from the server */
 	status = notifyset(storePrivate->server,
 			   myKeysRef,
@@ -88,12 +91,8 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef	store,
 			   myPatternsLen,
 			   (int *)&sc_status);
 
-	/* clean up */
-	if (xmlKeys)		CFRelease(xmlKeys);
-	if (xmlPatterns)	CFRelease(xmlPatterns);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -101,14 +100,31 @@ SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef	store,
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreSetNotificationKeys notifyset(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	if (xmlKeys != NULL)		CFRelease(xmlKeys);
+	if (xmlPatterns != NULL)	CFRelease(xmlPatterns);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
 	}
 
+	/* in case we need to re-connect, save the keys/patterns */
+	tmp = (keys != NULL) ? CFArrayCreateMutableCopy(NULL, 0, keys) : NULL;
+	if (storePrivate->keys != NULL) CFRelease(storePrivate->keys);
+	storePrivate->keys = tmp;
+
+	tmp = (patterns != NULL) ? CFArrayCreateMutableCopy(NULL, 0, patterns) : NULL;
+	if (storePrivate->patterns != NULL) CFRelease(storePrivate->patterns);
+	storePrivate->patterns = tmp;
+
 	return TRUE;
 }
diff --git a/SystemConfiguration.fproj/SCDNotifierWait.c b/SystemConfiguration.fproj/SCDNotifierWait.c
index 8b654a2..707fc82 100644
--- a/SystemConfiguration.fproj/SCDNotifierWait.c
+++ b/SystemConfiguration.fproj/SCDNotifierWait.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2006, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2006, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -138,13 +138,15 @@ SCDynamicStoreNotifyWait(SCDynamicStoreRef store)
 		SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyWait(): oldNotify != MACH_PORT_NULL"));
 	}
 
+    retry :
+
 	status = notifyviaport(storePrivate->server,
 			       port,
 			       0,
 			       (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -152,16 +154,17 @@ SCDynamicStoreNotifyWait(SCDynamicStoreRef store)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyWait notifyviaport(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
 			/* remove the send right that we tried (but failed) to pass to the server */
 			(void) mach_port_deallocate(mach_task_self(), port);
 		}
 
 		/* remove our receive right  */
 		(void) mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE, -1);
-		_SCErrorSet(status);
-		return FALSE;
+		sc_status = status;
 	}
 
 	if (sc_status != kSCStatusOK) {
@@ -201,7 +204,7 @@ SCDynamicStoreNotifyWait(SCDynamicStoreRef store)
 			      (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -209,14 +212,21 @@ SCDynamicStoreNotifyWait(SCDynamicStoreRef store)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyWait notifycancel(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-
-		/* remove our receive right  */
-		(void) mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE , -1);
-		_SCErrorSet(status);
-		return FALSE;
+		if (((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) &&
+		    __SCDynamicStoreReconnect(store)) {
+			sc_status = kSCStatusOK;
+		} else {
+			sc_status = status;
+		}
 	}
 
+	/* remove our receive right  */
 	(void) mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE , -1);
 
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+		return FALSE;
+	}
+
 	return TRUE;
 }
diff --git a/SystemConfiguration.fproj/SCDNotify.c b/SystemConfiguration.fproj/SCDNotify.c
index 72f23b9..36394bf 100644
--- a/SystemConfiguration.fproj/SCDNotify.c
+++ b/SystemConfiguration.fproj/SCDNotify.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -65,17 +65,16 @@ SCDynamicStoreNotifyValue(SCDynamicStoreRef	store,
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key to the server */
 	status = confignotify(storePrivate->server,
 			      myKeyRef,
 			      myKeyLen,
 			      (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -83,10 +82,17 @@ SCDynamicStoreNotifyValue(SCDynamicStoreRef	store,
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreNotifyValue confignotify(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
diff --git a/SystemConfiguration.fproj/SCDOpen.c b/SystemConfiguration.fproj/SCDOpen.c
index 77db1bb..f21d49c 100644
--- a/SystemConfiguration.fproj/SCDOpen.c
+++ b/SystemConfiguration.fproj/SCDOpen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2006, 2008-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,12 +31,14 @@
  * - initial revision
  */
 
+#include <TargetConditionals.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <mach/mach.h>
 #include <mach/mach_error.h>
 #include <servers/bootstrap.h>
+#include <bootstrap_priv.h>
 
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCPrivate.h>
@@ -49,6 +51,18 @@ static pthread_mutex_t	_sc_lock	= PTHREAD_MUTEX_INITIALIZER;
 static mach_port_t	_sc_server	= MACH_PORT_NULL;
 
 
+static const char	*notifyType[] = {
+	"",
+	"wait",
+	"inform w/callback",
+	"inform w/mach port",
+	"inform w/fd",
+	"inform w/signal",
+	"inform w/runLoop",
+	"inform w/dispatch"
+};
+
+
 static CFStringRef
 __SCDynamicStoreCopyDescription(CFTypeRef cf) {
 	CFAllocatorRef			allocator	= CFGetAllocator(cf);
@@ -65,6 +79,9 @@ __SCDynamicStoreCopyDescription(CFTypeRef cf) {
 	if (storePrivate->locked) {
 		CFStringAppendFormat(result, NULL, CFSTR(", locked"));
 	}
+	if (storePrivate->disconnectFunction != NULL) {
+		CFStringAppendFormat(result, NULL, CFSTR(", disconnect = %p"), storePrivate->disconnectFunction);
+	}
 	switch (storePrivate->notifyStatus) {
 		case Using_NotifierWait :
 			CFStringAppendFormat(result, NULL, CFSTR(", waiting for a notification"));
@@ -85,7 +102,6 @@ __SCDynamicStoreCopyDescription(CFTypeRef cf) {
 				CFStringAppendFormat(result, NULL, CFSTR(" {callout = %p"), storePrivate->rlsFunction);
 				CFStringAppendFormat(result, NULL, CFSTR(", info = %p"), storePrivate->rlsContext.info);
 				CFStringAppendFormat(result, NULL, CFSTR(", rls = %p"), storePrivate->rls);
-				CFStringAppendFormat(result, NULL, CFSTR(", refs = %d"), storePrivate->rlsRefs);
 			} else {
 				CFStringAppendFormat(result, NULL, CFSTR(", mach port/callback notifications"));
 				CFStringAppendFormat(result, NULL, CFSTR(" {callout = %p"), storePrivate->callbackFunction);
@@ -150,8 +166,12 @@ __SCDynamicStoreDeallocate(CFTypeRef cf)
 	}
 
 	/* release any keys being watched */
-	CFRelease(storePrivate->keys);
-	CFRelease(storePrivate->patterns);
+	if (storePrivate->keys != NULL) CFRelease(storePrivate->keys);
+	if (storePrivate->patterns != NULL) CFRelease(storePrivate->patterns);
+
+	/* release any client info */
+	if (storePrivate->name != NULL) CFRelease(storePrivate->name);
+	if (storePrivate->options != NULL) CFRelease(storePrivate->options);
 
 	return;
 }
@@ -235,11 +255,23 @@ __SCDynamicStoreServerPort(kern_return_t *status)
 		server_name = SCD_SERVER;
 	}
 
+#ifdef	BOOTSTRAP_PRIVILEGED_SERVER
+	*status = bootstrap_look_up2(bootstrap_port,
+				     server_name,
+				     &server,
+				     0,
+				     BOOTSTRAP_PRIVILEGED_SERVER);
+#else	// BOOTSTRAP_PRIVILEGED_SERVER
 	*status = bootstrap_look_up(bootstrap_port, server_name, &server);
+#endif	// BOOTSTRAP_PRIVILEGED_SERVER
+
 	switch (*status) {
 		case BOOTSTRAP_SUCCESS :
 			/* service currently registered, "a good thing" (tm) */
 			return server;
+		case BOOTSTRAP_NOT_PRIVILEGED :
+			/* the service is not privileged */
+			break;
 		case BOOTSTRAP_UNKNOWN_SERVICE :
 			/* service not currently registered, try again later */
 			break;
@@ -262,7 +294,6 @@ __SCDynamicStoreCreatePrivate(CFAllocatorRef		allocator,
 			     SCDynamicStoreCallBack	callout,
 			     SCDynamicStoreContext	*context)
 {
-	int				sc_status	= kSCStatusOK;
 	uint32_t			size;
 	SCDynamicStorePrivateRef	storePrivate;
 
@@ -281,6 +312,10 @@ __SCDynamicStoreCreatePrivate(CFAllocatorRef		allocator,
 		return NULL;
 	}
 
+	/* client side of the "configd" session */
+	storePrivate->name				= NULL;
+	storePrivate->options				= NULL;
+
 	/* server side of the "configd" session */
 	storePrivate->server				= MACH_PORT_NULL;
 
@@ -292,7 +327,7 @@ __SCDynamicStoreCreatePrivate(CFAllocatorRef		allocator,
 	storePrivate->notifyStatus			= NotifierNotRegistered;
 
 	/* "client" information associated with SCDynamicStoreCreateRunLoopSource() */
-	storePrivate->rlsRefs				= 0;
+	storePrivate->rlList				= NULL;
 	storePrivate->rls				= NULL;
 	storePrivate->rlsFunction			= callout;
 	storePrivate->rlsContext.info			= NULL;
@@ -312,9 +347,18 @@ __SCDynamicStoreCreatePrivate(CFAllocatorRef		allocator,
 	storePrivate->callbackPort			= NULL;
 	storePrivate->callbackRLS			= NULL;
 
+	/* "client" information associated with SCDynamicStoreSetDispatchQueue() */
+	storePrivate->dispatchQueue			= NULL;
+	storePrivate->callbackSource			= NULL;
+	storePrivate->callbackQueue			= NULL;
+
+	/* "client" information associated with SCDynamicStoreSetDisconnectCallBack() */
+	storePrivate->disconnectFunction		= NULL;
+	storePrivate->disconnectForceCallBack		= FALSE;
+
 	/* "server" information associated with SCDynamicStoreSetNotificationKeys() */
-	storePrivate->keys				= CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
-	storePrivate->patterns				= CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+	storePrivate->keys				= NULL;
+	storePrivate->patterns				= NULL;
 
 	/* "server" information associated with SCDynamicStoreNotifyMachPort(); */
 	storePrivate->notifyPort			= MACH_PORT_NULL;
@@ -328,64 +372,31 @@ __SCDynamicStoreCreatePrivate(CFAllocatorRef		allocator,
 	storePrivate->notifySignal			= 0;
 	storePrivate->notifySignalTask			= TASK_NULL;
 
-	if (sc_status != kSCStatusOK) {
-		_SCErrorSet(sc_status);
-		CFRelease(storePrivate);
-		storePrivate = NULL;
-	}
-
 	return storePrivate;
 }
 
 
-const CFStringRef	kSCDynamicStoreUseSessionKeys	= CFSTR("UseSessionKeys");	/* CFBoolean */
-
-
-SCDynamicStoreRef
-SCDynamicStoreCreateWithOptions(CFAllocatorRef		allocator,
-				CFStringRef		name,
-				CFDictionaryRef		storeOptions,
-				SCDynamicStoreCallBack	callout,
-				SCDynamicStoreContext	*context)
+static Boolean
+__SCDynamicStoreAddSession(SCDynamicStorePrivateRef storePrivate)
 {
-	int				sc_status	= kSCStatusFailed;
-	mach_port_t			server;
-	kern_return_t			status		= KERN_SUCCESS;
-	SCDynamicStorePrivateRef	storePrivate;
-	CFDataRef			utfName;		/* serialized name */
-	xmlData_t			myNameRef;
-	CFIndex				myNameLen;
-	CFDataRef			xmlOptions	= NULL;	/* serialized options */
-	xmlData_t			myOptionsRef	= NULL;
-	CFIndex				myOptionsLen	= 0;
-
-	/*
-	 * allocate and initialize a new session
-	 */
-	storePrivate = __SCDynamicStoreCreatePrivate(allocator, name, callout, context);
-	if (storePrivate == NULL) {
-		return NULL;
-	}
-
-	if (_sc_bundleID != NULL) {
-		CFStringRef	fullName;
-
-		fullName = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@:%@"), _sc_bundleID, name);
-		name = fullName;
-	} else {
-		CFRetain(name);
-	}
-
-	if (!_SCSerializeString(name, &utfName, (void **)&myNameRef, &myNameLen)) {
-		CFRelease(name);
+	CFDataRef	myName;			/* serialized name */
+	xmlData_t	myNameRef;
+	CFIndex		myNameLen;
+	CFDataRef	myOptions	= NULL;	/* serialized options */
+	xmlData_t	myOptionsRef	= NULL;
+	CFIndex		myOptionsLen	= 0;
+	int		sc_status	= kSCStatusFailed;
+	mach_port_t	server;
+	kern_return_t	status		= KERN_SUCCESS;
+
+	if (!_SCSerializeString(storePrivate->name, &myName, (void **)&myNameRef, &myNameLen)) {
 		goto done;
 	}
-	CFRelease(name);
 
 	/* serialize the options */
-	if (storeOptions != NULL) {
-		if (!_SCSerialize(storeOptions, &xmlOptions, (void **)&myOptionsRef, &myOptionsLen)) {
-			CFRelease(utfName);
+	if (storePrivate->options != NULL) {
+		if (!_SCSerialize(storePrivate->options, &myOptions, (void **)&myOptionsRef, &myOptionsLen)) {
+			CFRelease(myName);
 			goto done;
 		}
 	}
@@ -406,7 +417,7 @@ SCDynamicStoreCreateWithOptions(CFAllocatorRef		allocator,
 			}
 
 			// our [cached] server port is not valid
-			if (status != MACH_SEND_INVALID_DEST) {
+			if ((status != MACH_SEND_INVALID_DEST) && (status != MIG_SERVER_DIED)) {
 				// if we got an unexpected error, don't retry
 				sc_status = status;
 				break;
@@ -433,20 +444,242 @@ SCDynamicStoreCreateWithOptions(CFAllocatorRef		allocator,
 			break;
 		}
 	}
-	__MACH_PORT_DEBUG(TRUE, "*** SCDynamicStoreCreate[WithOptions]", storePrivate->server);
+	__MACH_PORT_DEBUG(TRUE, "*** SCDynamicStoreAddSession", storePrivate->server);
 
-	/* clean up */
-	CFRelease(utfName);
-	if (xmlOptions)	CFRelease(xmlOptions);
+	// clean up
+	CFRelease(myName);
+	if (myOptions != NULL)	CFRelease(myOptions);
 
     done :
 
-	if (sc_status != kSCStatusOK) {
-		SCLog(TRUE,
-		      (status == KERN_SUCCESS) ? LOG_DEBUG : LOG_ERR,
-		      CFSTR("SCDynamicStoreCreate[WithOptions] configopen(): %s"),
-		      SCErrorString(sc_status));
-		_SCErrorSet(sc_status);
+	switch (sc_status) {
+		case kSCStatusOK :
+			return TRUE;
+		case BOOTSTRAP_UNKNOWN_SERVICE :
+			SCLog(TRUE,
+			      (status == KERN_SUCCESS) ? LOG_DEBUG : LOG_ERR,
+			      CFSTR("SCDynamicStore server not available"));
+			break;
+		default :
+			SCLog(TRUE,
+			      (status == KERN_SUCCESS) ? LOG_DEBUG : LOG_ERR,
+			      CFSTR("SCDynamicStoreCreateAddSession configopen(): %s"),
+			      SCErrorString(sc_status));
+			break;
+	}
+
+	_SCErrorSet(sc_status);
+	return FALSE;
+}
+
+
+__private_extern__
+Boolean
+__SCDynamicStoreReconnect(SCDynamicStoreRef store)
+{
+	Boolean				ok;
+	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
+
+	ok = __SCDynamicStoreAddSession(storePrivate);
+	return ok;
+}
+
+
+static void
+pushDisconnect(SCDynamicStoreRef store)
+{
+	void					*context_info;
+	void					(*context_release)(const void *);
+	SCDynamicStoreDisconnectCallBack	disconnectFunction;
+	SCDynamicStorePrivateRef		storePrivate	= (SCDynamicStorePrivateRef)store;
+
+	disconnectFunction = storePrivate->disconnectFunction;
+	if (disconnectFunction == NULL) {
+		// if no reconnect callout, push empty notification
+		storePrivate->disconnectForceCallBack = TRUE;
+		return;
+	}
+
+	if (storePrivate->rlsContext.retain != NULL) {
+		context_info	= (void *)storePrivate->rlsContext.retain(storePrivate->rlsContext.info);
+		context_release	= storePrivate->rlsContext.release;
+	} else {
+		context_info	= storePrivate->rlsContext.info;
+		context_release	= NULL;
+	}
+	(*disconnectFunction)(store, context_info);
+	if (context_release) {
+		context_release(context_info);
+	}
+
+	return;
+}
+
+
+__private_extern__
+Boolean
+__SCDynamicStoreReconnectNotifications(SCDynamicStoreRef store)
+{
+	dispatch_queue_t			dispatchQueue	= NULL;
+	__SCDynamicStoreNotificationStatus	notifyStatus;
+	Boolean					ok		= TRUE;
+	CFArrayRef				rlList		= NULL;
+	SCDynamicStorePrivateRef		storePrivate	= (SCDynamicStorePrivateRef)store;
+
+	// save old SCDynamicStore [notification] state
+	notifyStatus = storePrivate->notifyStatus;
+
+	// before tearing down our [old] notifications, make sure we've
+	// retained any information that will be lost when we cancel the
+	// current no-longer-valid handler
+	switch (notifyStatus) {
+		case Using_NotifierInformViaRunLoop :
+			if (storePrivate->rlList != NULL) {
+				rlList = CFArrayCreateCopy(NULL, storePrivate->rlList);
+			}
+		case Using_NotifierInformViaDispatch :
+			dispatchQueue = storePrivate->dispatchQueue;
+			if (dispatchQueue != NULL) dispatch_retain(dispatchQueue);
+			break;
+		default :
+			break;
+	}
+
+#ifdef	NOTNOW
+	// invalidate the run loop source(s)
+	if (storePrivate->callbackRLS != NULL) {
+		CFRunLoopSourceInvalidate(storePrivate->callbackRLS);
+		CFRelease(storePrivate->callbackRLS);
+		storePrivate->callbackRLS = NULL;
+	}
+
+	// invalidate port
+	if (storePrivate->callbackPort != NULL) {
+		__MACH_PORT_DEBUG(TRUE, "*** __SCDynamicStoreReconnectNotifications w/MACH_NOTIFY_NO_SENDERS", CFMachPortGetPort(storePrivate->callbackPort));
+		CFMachPortInvalidate(storePrivate->callbackPort);
+		CFRelease(storePrivate->callbackPort);
+		storePrivate->callbackPort = NULL;
+	}
+#endif	// NOTNOW
+
+	// cancel [old] notifications
+	SCDynamicStoreNotifyCancel(store);
+
+	// set notification keys & patterns
+	if ((storePrivate->keys != NULL) || (storePrivate->patterns)) {
+		ok = SCDynamicStoreSetNotificationKeys(store,
+						       storePrivate->keys,
+						       storePrivate->patterns);
+		if (!ok) {
+			SCLog((SCError() != BOOTSTRAP_UNKNOWN_SERVICE),
+			      LOG_ERR,
+			      CFSTR("__SCDynamicStoreReconnectNotifications: SCDynamicStoreSetNotificationKeys() failed"));
+			goto done;
+		}
+	}
+
+	switch (notifyStatus) {
+		case Using_NotifierInformViaRunLoop : {
+			CFIndex			i;
+			CFIndex			n;
+			CFRunLoopSourceRef	rls;
+
+			rls = SCDynamicStoreCreateRunLoopSource(NULL, store, 0);
+			if (rls == NULL) {
+				SCLog((SCError() != BOOTSTRAP_UNKNOWN_SERVICE),
+				      LOG_ERR,
+				      CFSTR("__SCDynamicStoreReconnectNotifications: SCDynamicStoreCreateRunLoopSource() failed"));
+				ok = FALSE;
+				break;
+			}
+
+			n = (rlList != NULL) ? CFArrayGetCount(rlList) : 0;
+			for (i = 0; i < n; i += 3) {
+				CFRunLoopRef	rl	= (CFRunLoopRef)CFArrayGetValueAtIndex(rlList, i+1);
+				CFStringRef	rlMode	= (CFStringRef) CFArrayGetValueAtIndex(rlList, i+2);
+
+				CFRunLoopAddSource(rl, rls, rlMode);
+			}
+
+			CFRelease(rls);
+			break;
+		}
+		case Using_NotifierInformViaDispatch :
+			ok = SCDynamicStoreSetDispatchQueue(store, dispatchQueue);
+			if (!ok) {
+				SCLog((SCError() != BOOTSTRAP_UNKNOWN_SERVICE),
+				      LOG_ERR,
+				      CFSTR("__SCDynamicStoreReconnectNotifications: SCDynamicStoreSetDispatchQueue() failed"));
+				goto done;
+			}
+			break;
+
+		default :
+			_SCErrorSet(kSCStatusFailed);
+			ok = FALSE;
+			break;
+	}
+
+    done :
+
+	// cleanup
+	switch (notifyStatus) {
+		case Using_NotifierInformViaRunLoop :
+			if (rlList != NULL) CFRelease(rlList);
+			break;
+		case Using_NotifierInformViaDispatch :
+			if (dispatchQueue != NULL) dispatch_release(dispatchQueue);
+			break;
+		default :
+			break;
+	}
+
+	if (!ok) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SCDynamicStore server %s, notification (%s) not restored"),
+		      (SCError() == BOOTSTRAP_UNKNOWN_SERVICE) ? "shutdown" : "failed",
+		      notifyType[notifyStatus]);
+	}
+
+	// inform the client
+	pushDisconnect(store);
+
+	return ok;
+}
+
+
+const CFStringRef	kSCDynamicStoreUseSessionKeys	= CFSTR("UseSessionKeys");	/* CFBoolean */
+
+
+SCDynamicStoreRef
+SCDynamicStoreCreateWithOptions(CFAllocatorRef		allocator,
+				CFStringRef		name,
+				CFDictionaryRef		storeOptions,
+				SCDynamicStoreCallBack	callout,
+				SCDynamicStoreContext	*context)
+{
+	Boolean				ok;
+	SCDynamicStorePrivateRef	storePrivate;
+
+	// allocate and initialize a new session
+	storePrivate = __SCDynamicStoreCreatePrivate(allocator, name, callout, context);
+	if (storePrivate == NULL) {
+		return NULL;
+	}
+
+	// set "name"
+	if (_sc_bundleID != NULL) {
+		storePrivate->name = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@:%@"), _sc_bundleID, name);
+	} else {
+		storePrivate->name = CFRetain(name);
+	}
+
+	// set "options"
+	storePrivate->options = (storeOptions != NULL) ? CFRetain(storeOptions) : NULL;
+
+	// establish SCDynamicStore session
+	ok = __SCDynamicStoreAddSession(storePrivate);
+	if (!ok) {
 		CFRelease(storePrivate);
 		storePrivate = NULL;
 	}
@@ -470,3 +703,19 @@ SCDynamicStoreGetTypeID(void) {
 	pthread_once(&initialized, __SCDynamicStoreInitialize);	/* initialize runtime */
 	return __kSCDynamicStoreTypeID;
 }
+
+Boolean
+SCDynamicStoreSetDisconnectCallBack(SCDynamicStoreRef			store,
+				    SCDynamicStoreDisconnectCallBack	callout)
+{
+	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
+
+	if (store == NULL) {
+		/* sorry, you must provide a session */
+		_SCErrorSet(kSCStatusNoStoreSession);
+		return FALSE;
+	}
+
+	storePrivate->disconnectFunction = callout;
+	return TRUE;
+}
diff --git a/SystemConfiguration.fproj/SCDPlugin.c b/SystemConfiguration.fproj/SCDPlugin.c
index 4e685b6..8431f3c 100644
--- a/SystemConfiguration.fproj/SCDPlugin.c
+++ b/SystemConfiguration.fproj/SCDPlugin.c
@@ -79,7 +79,7 @@ static childInfoRef	activeChildren	= NULL;
 static pthread_mutex_t	lock		= PTHREAD_MUTEX_INITIALIZER;
 
 
-static inline void
+static __inline__ void
 blockSignal()
 {
 	sigset_t	mask	= sigmask(SIGCHLD);
@@ -93,7 +93,7 @@ blockSignal()
 }
 
 
-static inline void
+static __inline__ void
 unblockSignal()
 {
 	sigset_t	mask	= sigmask(SIGCHLD);
diff --git a/SystemConfiguration.fproj/SCDPrivate.c b/SystemConfiguration.fproj/SCDPrivate.c
index d41332b..5a1bf29 100644
--- a/SystemConfiguration.fproj/SCDPrivate.c
+++ b/SystemConfiguration.fproj/SCDPrivate.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,6 +31,9 @@
  * - initial revision
  */
 
+//#define DO_NOT_CRASH
+//#define DO_NOT_INFORM
+
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCValidation.h>
 #include <SystemConfiguration/SCPrivate.h>
@@ -51,6 +54,12 @@
 #include <execinfo.h>
 #include <libproc.h>
 #include <unistd.h>
+#include <dlfcn.h>
+
+
+#if	TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
+#include <CoreFoundation/CFUserNotification.h>
+#endif	// TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
 
 #define	N_QUICK	32
 
@@ -182,7 +191,7 @@ _SC_sendMachMessage(mach_port_t port, mach_msg_id_t msg_id)
 			  MACH_PORT_NULL,		/* rcv_name */
 			  0,				/* timeout */
 			  MACH_PORT_NULL);		/* notify */
-	if (status == MACH_SEND_TIMED_OUT) {
+	if (status != MACH_MSG_SUCCESS) {
 		mach_msg_destroy(&msg.header);
 	}
 
@@ -190,6 +199,47 @@ _SC_sendMachMessage(mach_port_t port, mach_msg_id_t msg_id)
 }
 
 
+CFStringRef
+_SC_trimDomain(CFStringRef domain)
+{
+	CFIndex	length;
+
+	if (!isA_CFString(domain)) {
+		return NULL;
+	}
+
+	// remove any leading/trailing dots
+	length = CFStringGetLength(domain);
+	if ((length > 0) &&
+	    (CFStringFindWithOptions(domain,
+				     CFSTR("."),
+				     CFRangeMake(0, 1),
+				     kCFCompareAnchored,
+				     NULL) ||
+	     CFStringFindWithOptions(domain,
+				     CFSTR("."),
+				     CFRangeMake(0, length),
+				     kCFCompareAnchored|kCFCompareBackwards,
+				     NULL))) {
+		     CFMutableStringRef	trimmed;
+
+		     trimmed = CFStringCreateMutableCopy(NULL, 0, domain);
+		     CFStringTrim(trimmed, CFSTR("."));
+		     domain = (CFStringRef)trimmed;
+		     length = CFStringGetLength(domain);
+	     } else {
+		     CFRetain(domain);
+	     }
+
+	if (length == 0) {
+		CFRelease(domain);
+		domain = NULL;
+	}
+
+	return domain;
+}
+
+
 #pragma mark -
 #pragma mark Serialization
 
@@ -198,19 +248,17 @@ Boolean
 _SCSerialize(CFPropertyListRef obj, CFDataRef *xml, void **dataRef, CFIndex *dataLen)
 {
 	CFDataRef		myXml;
-	CFWriteStreamRef	stream;
 
 	if ((xml == NULL) && ((dataRef == NULL) || (dataLen == NULL))) {
 		/* if not keeping track of allocated space */
 		return FALSE;
 	}
 
-	stream = CFWriteStreamCreateWithAllocatedBuffers(NULL, NULL);
-	CFWriteStreamOpen(stream);
-	CFPropertyListWriteToStream(obj, stream, kCFPropertyListBinaryFormat_v1_0, NULL);
-	CFWriteStreamClose(stream);
-	myXml = CFWriteStreamCopyProperty(stream, kCFStreamPropertyDataWritten);
-	CFRelease(stream);
+	myXml = CFPropertyListCreateData(NULL,
+					 obj,
+					 kCFPropertyListBinaryFormat_v1_0,
+					 0,
+					 NULL);
 	if (myXml == NULL) {
 		SCLog(TRUE, LOG_ERR, CFSTR("_SCSerialize() failed"));
 		if (xml != NULL) {
@@ -257,16 +305,13 @@ _SCSerialize(CFPropertyListRef obj, CFDataRef *xml, void **dataRef, CFIndex *dat
 Boolean
 _SCUnserialize(CFPropertyListRef *obj, CFDataRef xml, void *dataRef, CFIndex dataLen)
 {
-	CFStringRef	xmlError;
+	CFErrorRef	error;
 
 	if (xml == NULL) {
 		kern_return_t	status;
 
 		xml = CFDataCreateWithBytesNoCopy(NULL, (void *)dataRef, dataLen, kCFAllocatorNull);
-		*obj = CFPropertyListCreateFromXMLData(NULL,
-						       xml,
-						       kCFPropertyListImmutable,
-						       &xmlError);
+		*obj = CFPropertyListCreateWithData(NULL, xml, kCFPropertyListImmutable, NULL, &error);
 		CFRelease(xml);
 
 		status = vm_deallocate(mach_task_self(), (vm_address_t)dataRef, dataLen);
@@ -275,16 +320,13 @@ _SCUnserialize(CFPropertyListRef *obj, CFDataRef xml, void *dataRef, CFIndex dat
 			/* non-fatal???, proceed */
 		}
 	} else {
-		*obj = CFPropertyListCreateFromXMLData(NULL,
-						       xml,
-						       kCFPropertyListImmutable,
-						       &xmlError);
+		*obj = CFPropertyListCreateWithData(NULL, xml, kCFPropertyListImmutable, NULL, &error);
 	}
 
 	if (*obj == NULL) {
-		if (xmlError != NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("_SCUnserialize(): %@"), xmlError);
-			CFRelease(xmlError);
+		if (error != NULL) {
+			SCLog(TRUE, LOG_ERR, CFSTR("_SCUnserialize(): %@"), error);
+			CFRelease(error);
 		}
 		_SCErrorSet(kSCStatusFailed);
 		return FALSE;
@@ -801,10 +843,11 @@ _SC_CFBundleCopyNonLocalizedString(CFBundleRef bundle, CFStringRef key, CFString
 							     &errCode)) {
 			CFDictionaryRef	table;
 
-			table = (CFDictionaryRef)CFPropertyListCreateFromXMLData(NULL,
-										 data,
-										 kCFPropertyListImmutable,
-										 NULL);
+			table = CFPropertyListCreateWithData(NULL,
+							     data,
+							     kCFPropertyListImmutable,
+							     NULL,
+							     NULL);
 			if (table != NULL) {
 				if (isA_CFDictionary(table)) {
 					str = CFDictionaryGetValue(table, key);
@@ -830,6 +873,55 @@ _SC_CFBundleCopyNonLocalizedString(CFBundleRef bundle, CFStringRef key, CFString
 }
 
 
+#pragma mark -
+#pragma mark Mach port / CFMachPort management
+
+
+CFMachPortRef
+_SC_CFMachPortCreateWithPort(const char		*portDescription,
+				 mach_port_t		portNum,
+				 CFMachPortCallBack	callout,
+				 CFMachPortContext	*context)
+{
+	CFMachPortRef	port;
+	Boolean	shouldFree	= FALSE;
+
+	port = CFMachPortCreateWithPort(NULL, portNum, callout, context, &shouldFree);
+	if ((port == NULL) || shouldFree) {
+		CFStringRef	err;
+		char		*crash_info	= NULL;
+		char		name[64]	= "";
+
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("%s: CFMachPortCreateWithPort() failed , port = %p"),
+		      portDescription,
+		      portNum);
+		if (port != NULL) {
+			err = CFStringCreateWithFormat(NULL, NULL,
+						       CFSTR("%s: CFMachPortCreateWithPort recycled, [old] port = %@"),
+						       portDescription, port);
+		} else {
+			err = CFStringCreateWithFormat(NULL, NULL,
+						       CFSTR("%s: CFMachPortCreateWithPort returned NULL"),
+						       portDescription);
+		}
+		crash_info = _SC_cfstring_to_cstring(err, NULL, 0, kCFStringEncodingASCII);
+		CFRelease(err);
+
+		(void) proc_name(getpid(), name, sizeof(name));
+		err = CFStringCreateWithFormat(NULL,
+					       NULL,
+					       CFSTR("A recycled mach_port has been detected by \"%s\"."),
+					       name);
+		_SC_crash(crash_info, CFSTR("CFMachPort error"), err);
+		CFAllocatorDeallocate(NULL, crash_info);
+		CFRelease(err);
+	}
+
+	return port;
+}
+
+
 #pragma mark -
 #pragma mark DOS encoding/codepage
 
@@ -940,7 +1032,7 @@ _SC_logMachPortStatus(void)
 	mach_msg_type_number_t	pi, pn, tn;
 	CFMutableStringRef	str;
 
-	SCLog(TRUE, LOG_DEBUG, CFSTR("----------"));
+	SCLog(TRUE, LOG_NOTICE, CFSTR("----------"));
 
 	/* report on ALL mach ports associated with this task */
 	status = mach_port_names(mach_task_self(), &ports, &pn, &types, &tn);
@@ -967,7 +1059,7 @@ _SC_logMachPortStatus(void)
 			*rp = '\0';
 			CFStringAppendFormat(str, NULL, CFSTR(" %d%s"), ports[pi], rights);
 		}
-		SCLog(TRUE, LOG_DEBUG, CFSTR("Task ports (n=%d):%@"), pn, str);
+		SCLog(TRUE, LOG_NOTICE, CFSTR("Task ports (n=%d):%@"), pn, str);
 		CFRelease(str);
 	}
 
@@ -1018,7 +1110,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 
 	status = mach_port_type(mach_task_self(), port, &pt);
 	if (status != KERN_SUCCESS) {
-		SCLog(TRUE, LOG_DEBUG,
+		SCLog(TRUE, LOG_NOTICE,
 		      CFSTR("%smach_port_get_refs(..., %d, MACH_PORT_RIGHT_SEND): %s"),
 		      buf,
 		      port,
@@ -1028,7 +1120,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 	if ((pt & MACH_PORT_TYPE_SEND) != 0) {
 		status = mach_port_get_refs(mach_task_self(), port, MACH_PORT_RIGHT_SEND,      &refs_send);
 		if (status != KERN_SUCCESS) {
-			SCLog(TRUE, LOG_DEBUG,
+			SCLog(TRUE, LOG_NOTICE,
 			      CFSTR("%smach_port_get_refs(..., %d, MACH_PORT_RIGHT_SEND): %s"),
 			      buf,
 			      port,
@@ -1041,7 +1133,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 
 		status = mach_port_get_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE,   &refs_recv);
 		if (status != KERN_SUCCESS) {
-			SCLog(TRUE, LOG_DEBUG,
+			SCLog(TRUE, LOG_NOTICE,
 			      CFSTR("%smach_port_get_refs(..., %d, MACH_PORT_RIGHT_RECEIVE): %s"),
 			      buf,
 			      port,
@@ -1055,7 +1147,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 					       (mach_port_info_t)&recv_status,
 					       &count);
 		if (status != KERN_SUCCESS) {
-			SCLog(TRUE, LOG_DEBUG,
+			SCLog(TRUE, LOG_NOTICE,
 			      CFSTR("%mach_port_get_attributes(..., %d, MACH_PORT_RECEIVE_STATUS): %s"),
 			      buf,
 			      port,
@@ -1066,7 +1158,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 	if ((pt & MACH_PORT_TYPE_SEND_ONCE) != 0) {
 		status = mach_port_get_refs(mach_task_self(), port, MACH_PORT_RIGHT_SEND_ONCE, &refs_once);
 		if (status != KERN_SUCCESS) {
-			SCLog(TRUE, LOG_DEBUG,
+			SCLog(TRUE, LOG_NOTICE,
 			      CFSTR("%smach_port_get_refs(..., %d, MACH_PORT_RIGHT_SEND_ONCE): %s"),
 			      buf,
 			      port,
@@ -1077,7 +1169,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 	if ((pt & MACH_PORT_TYPE_PORT_SET) != 0) {
 		status = mach_port_get_refs(mach_task_self(), port, MACH_PORT_RIGHT_PORT_SET,  &refs_pset);
 		if (status != KERN_SUCCESS) {
-			SCLog(TRUE, LOG_DEBUG,
+			SCLog(TRUE, LOG_NOTICE,
 			      CFSTR("%smach_port_get_refs(..., %d, MACH_PORT_RIGHT_PORT_SET): %s"),
 			      buf,
 			      port,
@@ -1088,7 +1180,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 	if ((pt & MACH_PORT_TYPE_DEAD_NAME) != 0) {
 		status = mach_port_get_refs(mach_task_self(), port, MACH_PORT_RIGHT_DEAD_NAME, &refs_dead);
 		if (status != KERN_SUCCESS) {
-			SCLog(TRUE, LOG_DEBUG,
+			SCLog(TRUE, LOG_NOTICE,
 			      CFSTR("%smach_port_get_refs(..., %d, MACH_PORT_RIGHT_DEAD_NAME): %s"),
 			      buf,
 			      port,
@@ -1096,7 +1188,7 @@ _SC_logMachPortReferences(const char *str, mach_port_t port)
 		}
 	}
 
-	SCLog(TRUE, LOG_DEBUG,
+	SCLog(TRUE, LOG_NOTICE,
 	      CFSTR("%smach port 0x%x (%d): send=%d, receive=%d, send once=%d, port set=%d, dead name=%d%s%s"),
 	      buf,
 	      port,
@@ -1142,3 +1234,102 @@ _SC_copyBacktrace()
 
 	return trace;
 }
+
+
+/* CrashReporter info */
+const char *__crashreporter_info__ = NULL;
+asm(".desc ___crashreporter_info__, 0x10");
+
+
+static Boolean
+_SC_SimulateCrash(const char *crash_info, CFStringRef notifyHeader, CFStringRef notifyMessage)
+{
+	static bool	(*dyfunc_SimulateCrash)(pid_t, mach_exception_data_type_t, CFStringRef)	= NULL;
+	static void	*image											= NULL;
+	Boolean	ok											= FALSE;
+
+	if ((dyfunc_SimulateCrash == NULL) && (image == NULL)) {
+		const char	*framework	= "/System/Library/PrivateFrameworks/CrashReporterSupport.framework/"
+#if	!TARGET_OS_EMBEDDED
+							"Versions/A/"
+#endif	// !TARGET_OS_EMBEDDED
+							"CrashReporterSupport";
+		struct stat	statbuf;
+		const char	*suffix	= getenv("DYLD_IMAGE_SUFFIX");
+		char		path[MAXPATHLEN];
+
+		strlcpy(path, framework, sizeof(path));
+		if (suffix) strlcat(path, suffix, sizeof(path));
+		if (0 <= stat(path, &statbuf)) {
+			image = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
+		} else {
+			image = dlopen(framework, RTLD_LAZY | RTLD_LOCAL);
+		}
+
+		if (image != NULL) {
+			dyfunc_SimulateCrash = dlsym(image, "SimulateCrash");
+		} else {
+			image = (void *)0x1;	// to ensure that we only dlopen() once
+		}
+	}
+
+	if (dyfunc_SimulateCrash != NULL) {
+		CFStringRef	str;
+
+		str = CFStringCreateWithCString(NULL, crash_info, kCFStringEncodingUTF8);
+		ok = dyfunc_SimulateCrash(getpid(), 0xbad0005cull, str);
+		CFRelease(str);
+	}
+
+#if	TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
+	if (ok) {
+		static Boolean	warned	= FALSE;
+
+		if (!warned) {
+			notifyMessage = CFStringCreateWithFormat(NULL,
+								 NULL,
+								 CFSTR("%@\n\nPlease collect the crash report and file a Radar."),
+								 notifyMessage);
+			CFUserNotificationDisplayNotice(0,
+							kCFUserNotificationStopAlertLevel,
+							NULL,
+							NULL,
+							NULL,
+							notifyHeader,
+							notifyMessage,
+							NULL);
+			CFRelease(notifyMessage);
+			warned = TRUE;
+		}
+	}
+#endif	// TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
+
+	return ok;
+}
+
+
+void
+_SC_crash(const char *crash_info, CFStringRef notifyHeader, CFStringRef notifyMessage)
+{
+	Boolean	ok	= FALSE;
+
+	if (crash_info != NULL) {
+		__crashreporter_info__ = crash_info;
+
+		SCLog(TRUE, LOG_ERR, CFSTR("%s"), crash_info);
+	}
+
+	if (_SC_isAppleInternal()) {
+		// simulate a crash report
+		ok = _SC_SimulateCrash(crash_info, notifyHeader, notifyMessage);
+#ifndef DO_NOT_CRASH
+		if (!ok) {
+			// if we could not simulate a crash report, crash for real
+			__builtin_trap();
+		}
+#endif	// DO_NOT_CRASH
+	}
+
+	__crashreporter_info__ = NULL;
+	return;
+}
diff --git a/SystemConfiguration.fproj/SCDRemove.c b/SystemConfiguration.fproj/SCDRemove.c
index 1b95ae3..5f1230d 100644
--- a/SystemConfiguration.fproj/SCDRemove.c
+++ b/SystemConfiguration.fproj/SCDRemove.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -67,17 +67,16 @@ SCDynamicStoreRemoveValue(SCDynamicStoreRef store, CFStringRef key)
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key to the server */
 	status = configremove(storePrivate->server,
 			      myKeyRef,
 			      myKeyLen,
 			      (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -85,10 +84,17 @@ SCDynamicStoreRemoveValue(SCDynamicStoreRef store, CFStringRef key)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreRemoveValue configremove(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
diff --git a/SystemConfiguration.fproj/SCDSet.c b/SystemConfiguration.fproj/SCDSet.c
index 4504855..a0b2221 100644
--- a/SystemConfiguration.fproj/SCDSet.c
+++ b/SystemConfiguration.fproj/SCDSet.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2006, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2006, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -108,6 +108,8 @@ SCDynamicStoreSetMultiple(SCDynamicStoreRef	store,
 		}
 	}
 
+    retry :
+
 	/* send the keys and patterns, fetch the associated result from the server */
 	status = configset_m(storePrivate->server,
 			     mySetRef,
@@ -118,13 +120,8 @@ SCDynamicStoreSetMultiple(SCDynamicStoreRef	store,
 			     myNotifyLen,
 			     (int *)&sc_status);
 
-	/* clean up */
-	if (xmlSet != NULL)	CFRelease(xmlSet);
-	if (xmlRemove != NULL)	CFRelease(xmlRemove);
-	if (xmlNotify != NULL)	CFRelease(xmlNotify);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -132,10 +129,19 @@ SCDynamicStoreSetMultiple(SCDynamicStoreRef	store,
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreSetMultiple configset_m(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	if (xmlSet != NULL)	CFRelease(xmlSet);
+	if (xmlRemove != NULL)	CFRelease(xmlRemove);
+	if (xmlNotify != NULL)	CFRelease(xmlNotify);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
@@ -183,6 +189,8 @@ SCDynamicStoreSetValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListR
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key & data to the server, get new instance id */
 	status = configset(storePrivate->server,
 			   myKeyRef,
@@ -193,12 +201,8 @@ SCDynamicStoreSetValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListR
 			   &newInstance,
 			   (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-	CFRelease(xmlData);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -206,10 +210,18 @@ SCDynamicStoreSetValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListR
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreSetValue configset(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+	CFRelease(xmlData);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
diff --git a/SystemConfiguration.fproj/SCDSnapshot.c b/SystemConfiguration.fproj/SCDSnapshot.c
index d869d38..4227790 100644
--- a/SystemConfiguration.fproj/SCDSnapshot.c
+++ b/SystemConfiguration.fproj/SCDSnapshot.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -58,10 +58,12 @@ SCDynamicStoreSnapshot(SCDynamicStoreRef store)
 		return FALSE;
 	}
 
+    retry :
+
 	status = snapshot(storePrivate->server, (int *)&sc_status);
 
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -69,8 +71,12 @@ SCDynamicStoreSnapshot(SCDynamicStoreRef store)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreSnapshot snapshot(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
 	if (sc_status != kSCStatusOK) {
diff --git a/SystemConfiguration.fproj/SCDTouch.c b/SystemConfiguration.fproj/SCDTouch.c
index f1a7027..ca7ea4e 100644
--- a/SystemConfiguration.fproj/SCDTouch.c
+++ b/SystemConfiguration.fproj/SCDTouch.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -67,17 +67,16 @@ SCDynamicStoreTouchValue(SCDynamicStoreRef store, CFStringRef key)
 		return FALSE;
 	}
 
+    retry :
+
 	/* send the key to the server */
 	status = configtouch(storePrivate->server,
 			     myKeyRef,
 			     myKeyLen,
 			     (int *)&sc_status);
 
-	/* clean up */
-	CFRelease(utfKey);
-
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -85,10 +84,17 @@ SCDynamicStoreTouchValue(SCDynamicStoreRef store, CFStringRef key)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreTouchValue configtouch(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+			if (__SCDynamicStoreReconnect(store)) {
+				goto retry;
+			}
+		}
+		sc_status = status;
 	}
 
+	/* clean up */
+	CFRelease(utfKey);
+
 	if (sc_status != kSCStatusOK) {
 		_SCErrorSet(sc_status);
 		return FALSE;
diff --git a/SystemConfiguration.fproj/SCDUnlock.c b/SystemConfiguration.fproj/SCDUnlock.c
index 994d57a..06ac770 100644
--- a/SystemConfiguration.fproj/SCDUnlock.c
+++ b/SystemConfiguration.fproj/SCDUnlock.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -61,7 +61,7 @@ SCDynamicStoreUnlock(SCDynamicStoreRef store)
 	/* (attempt to) release the servers lock */
 	status = configunlock(storePrivate->server, (int *)&sc_status);
 	if (status != KERN_SUCCESS) {
-		if (status == MACH_SEND_INVALID_DEST) {
+		if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
 			/* the server's gone and our session port's dead, remove the dead name right */
 			(void) mach_port_deallocate(mach_task_self(), storePrivate->server);
 		} else {
@@ -69,8 +69,12 @@ SCDynamicStoreUnlock(SCDynamicStoreRef store)
 			SCLog(TRUE, LOG_ERR, CFSTR("SCDynamicStoreUnlock configunlock(): %s"), mach_error_string(status));
 		}
 		storePrivate->server = MACH_PORT_NULL;
-		_SCErrorSet(status);
-		return FALSE;
+		if (((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED))
+		    && __SCDynamicStoreReconnect(store)) {
+			sc_status = kSCStatusOK;
+		} else {
+			sc_status = status;
+		}
 	}
 
 	if (sc_status != kSCStatusOK) {
diff --git a/SystemConfiguration.fproj/SCDynamicStore.h b/SystemConfiguration.fproj/SCDynamicStore.h
index 716d5dc..cc431f4 100644
--- a/SystemConfiguration.fproj/SCDynamicStore.h
+++ b/SystemConfiguration.fproj/SCDynamicStore.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -30,9 +30,7 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <CoreFoundation/CoreFoundation.h>
 
 
@@ -95,6 +93,17 @@ typedef struct {
 		changes to the dynamic store is delivered.
 	@param store The dynamic store session.
 	@param changedKeys The list of changed keys.
+
+		The list includes any specific SCDynamicStore keys that
+		changed (add, update, remove, notify) since the last call
+		to SCDynamicStoreSetNotificationKeys or since the last
+		notification callback. The list also includes any specific
+		keys matching one of the pattern string(s) that changed.
+
+		An empty list indicates that the SCDynamicStore server
+		restarted and that any assumptions based on prior content
+		of the SCDynamicStore should be disgarded.
+
 	@param info A C pointer to a user-specified block of data.
  */
 typedef void (*SCDynamicStoreCallBack)	(
@@ -219,7 +228,6 @@ SCDynamicStoreCreateRunLoopSource	(
 					CFIndex				order
 					)				__OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/);
 
-#if	!TARGET_OS_IPHONE
 /*!
 	@function SCDynamicStoreSetDispatchQueue
 	@discussion Initiates notifications for the Notification
@@ -234,8 +242,7 @@ Boolean
 SCDynamicStoreSetDispatchQueue		(
 					SCDynamicStoreRef		store,
 					dispatch_queue_t		queue
-					)				__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA);
-#endif	// !TARGET_OS_IPHONE
+					)				__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCDynamicStoreCopyKeyList
diff --git a/SystemConfiguration.fproj/SCDynamicStoreInternal.h b/SystemConfiguration.fproj/SCDynamicStoreInternal.h
index 2481504..04dc0ff 100644
--- a/SystemConfiguration.fproj/SCDynamicStoreInternal.h
+++ b/SystemConfiguration.fproj/SCDynamicStoreInternal.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004, 2006, 2009 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2006, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -27,9 +27,7 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <sys/types.h>
 #include <mach/mach.h>
 #include <pthread.h>
@@ -57,6 +55,10 @@ typedef struct {
 	/* base CFType information */
 	CFRuntimeBase			cfBase;
 
+	/* client side of the "configd" session */
+	CFStringRef			name;
+	CFDictionaryRef			options;
+
 	/* server side of the "configd" session */
 	mach_port_t			server;
 
@@ -68,7 +70,7 @@ typedef struct {
 	__SCDynamicStoreNotificationStatus	notifyStatus;
 
 	/* "client" information associated with SCDynamicStoreCreateRunLoopSource() */
-	CFIndex				rlsRefs;
+	CFMutableArrayRef		rlList;
 	CFRunLoopSourceRef		rls;
 	SCDynamicStoreCallBack		rlsFunction;
 	SCDynamicStoreContext		rlsContext;
@@ -79,16 +81,18 @@ typedef struct {
 	CFMachPortRef			callbackPort;
 	CFRunLoopSourceRef		callbackRLS;
 
-#if	!TARGET_OS_IPHONE
 	/* "client" information associated with SCDynamicStoreSetDispatchQueue() */
 	dispatch_queue_t		dispatchQueue;
 	dispatch_source_t		callbackSource;
 	dispatch_queue_t		callbackQueue;
-#endif	// !TARGET_OS_IPHONE
+
+	/* "client" information associated with SCDynamicStoreSetDisconnectCallBack() */
+	SCDynamicStoreDisconnectCallBack	disconnectFunction;
+	Boolean					disconnectForceCallBack;
 
 	/* "server" SCDynamicStoreKeys being watched */
-	CFMutableSetRef			keys;
-	CFMutableSetRef			patterns;
+	CFMutableArrayRef		keys;
+	CFMutableArrayRef		patterns;
 
 	/* "server" information associated with SCDynamicStoreNotifyMachPort() */
 	mach_port_t			notifyPort;
@@ -113,6 +117,12 @@ __SCDynamicStoreCreatePrivate		(CFAllocatorRef			allocator,
 					 SCDynamicStoreCallBack		callout,
 					 SCDynamicStoreContext		*context);
 
+Boolean
+__SCDynamicStoreReconnect		(SCDynamicStoreRef		store);
+
+Boolean
+__SCDynamicStoreReconnectNotifications	(SCDynamicStoreRef		store);
+
 __END_DECLS
 
 #endif /* _SCDYNAMICSTOREINTERNAL_H */
diff --git a/SystemConfiguration.fproj/SCDynamicStorePrivate.h b/SystemConfiguration.fproj/SCDynamicStorePrivate.h
index 326cc36..1837b6a 100644
--- a/SystemConfiguration.fproj/SCDynamicStorePrivate.h
+++ b/SystemConfiguration.fproj/SCDynamicStorePrivate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,6 +31,69 @@
 
 /*!
 	@header SCDynamicStorePrivate
+	@discussion The SCDynamicStore APIs provide access to a key-value
+		dictionary maintained by a server process.  The dictionary is
+		accessible by all processes on the system.  The APIs allow you
+		to list the current key-value pairs, add or remove key-value
+		pairs, add or change the values associated with a key, and
+		request change notifications.
+
+		The SCDynamicStore is not "persistent" (the store content
+		starts off empty and is not saved across boot).
+
+		All interaction with the SCDynamicStore [server] is via Mach
+		IPC (MiG) messages.
+
+		A client process, using the SCDynamicStoreSetNotificationKeys
+		API, specifies a list of specific keys of interest and/or a
+		list of regex(3) pattern strings that will be matched on
+		current (and future) keys in the store.  Any matched keys that
+		are added, updated, or removed will trigger a notification.
+		The notification is delivered to the monitoring session via
+		a "something has changed" Mach IPC message.  The callback
+		notification, as part of its implementation, issues a request
+		to the server to identify the specific list of changes and
+		this list is passed along as part of the callback.  Any
+		subsequent changes to the SCDynamicStore will trigger a new
+		"something has changed" Mach IPC message and an additional
+		callback.
+
+		Note: the list (array) of changed keys passed to the
+		      notification callback will be always be non-NULL
+		      and non-empty with one exception.  That exception
+		      is when the SCDynamicStore server has been restarted.
+		      In that case, if no reconnect callback was setup
+		      with the SCDynamicStoreSetReconnectCallBack API
+		      then a non-NULL but empty array will be passed.
+
+		Disconnect/reconnect considerations:
+
+		1. We don't expect the SCDynamicStore server to fail but one
+		   should always be prepared for the unexpected.
+
+		2. Processes that write to the SCDynamicStore should be
+		   prepared to repost any content when/if the server fails.
+		   A callout, registered with the SCDynamicStoreSetReconnectCallBack
+		   API, should be used to post any updates the SCDynamicStore
+		   after a failure.
+
+		3. Processes that cache SCDynamicStore content (or otherwise
+		   maintain state based on previous notifications) should be
+		   aware that all store content is lost when/if the server
+		   fails.  After handling a SCDynamicStore notification with
+		   no keys or a disconnect/reconnect callout, your code should
+		   assume that any cached content is no longer valid.
+
+		Performance considerations:
+
+		1. We recommend that any code trying to capture a snapshot of
+		   more than one SCDynamicStore key should use the SCDynamicStoreCopyMultiple
+		   API (and not make multiple calls to SCDynamicStoreCopyValue).
+
+		2. We recommend that any code making multiple (and related)
+		   changes to the SCDynamicStore should batch them into a
+		   single call using the SCDynamicStoreSetMultiple API (and
+		   not make multiple calls to SCDynamicStoreSetValue).
  */
 
 /*!
@@ -45,6 +108,18 @@ typedef boolean_t (*SCDynamicStoreCallBack_v1)	(
 						void			*info
 						);
 
+/*!
+	@typedef SCDynamicStoreDisconnectCallBack
+	@discussion Type of callback function used when notification of
+		the dynamic store session being disconnected is delivered.
+	@param store The dynamic store session.
+	@param info A C pointer to a user-specified block of data.
+ */
+typedef void (*SCDynamicStoreDisconnectCallBack)	(
+							 SCDynamicStoreRef	store,
+							 void			*info
+							 );
+
 
 __BEGIN_DECLS
 
@@ -237,6 +312,24 @@ SCDynamicStoreNotifyWait		(SCDynamicStoreRef		store);
 Boolean
 SCDynamicStoreNotifyCancel		(SCDynamicStoreRef		store);
 
+/*!
+	@function SCDynamicStoreSetDisconnectCallBack
+	@discussion Assigns a callback to a SCDynamicStore session.  The function
+		is called when the session has been disconnected.  The callback
+		should be established before a client writes any content to the
+		SCDynamicStore to ensure that the information can be re-posted
+		when/if a disconnect is detected.
+	@param store A reference to the dynamic store session.
+	@param callout The function to be called when the session was disconnected.
+		If NULL, the current callback is removed.
+	@result Returns TRUE on success, FALSE on failure.
+ */
+Boolean
+SCDynamicStoreSetDisconnectCallBack	(
+					 SCDynamicStoreRef			store,
+					 SCDynamicStoreDisconnectCallBack	callout
+					)				__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
+
 Boolean
 SCDynamicStoreSnapshot			(SCDynamicStoreRef		store);
 
diff --git a/SystemConfiguration.fproj/SCLocation.c b/SystemConfiguration.fproj/SCLocation.c
index 5704408..06f71cd 100644
--- a/SystemConfiguration.fproj/SCLocation.c
+++ b/SystemConfiguration.fproj/SCLocation.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2004, 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2002, 2004, 2006, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -28,6 +28,7 @@
  * - initial revision
  */
 
+#include <TargetConditionals.h>
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCValidation.h>
 #include <SystemConfiguration/SCPrivate.h>
diff --git a/SystemConfiguration.fproj/SCNetwork.h b/SystemConfiguration.fproj/SCNetwork.h
index 8e04726..1e0cf19 100644
--- a/SystemConfiguration.fproj/SCNetwork.h
+++ b/SystemConfiguration.fproj/SCNetwork.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2009 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -154,8 +154,8 @@ SCNetworkCheckReachabilityByAddress	(
 		Note: this API has been deprecated but you can
 		      get equivalent results with :
 <pre>
-	SCNetworkReachabiltyRef   target;
-	SCNetworkReachabiltyFlags flags = 0;
+	SCNetworkReachabilityRef   target;
+	SCNetworkReachabilityFlags flags = 0;
 	Boolean                   ok;
 
 	target = SCNetworkReachabilityCreateWithName(NULL, name);
diff --git a/SystemConfiguration.fproj/SCNetworkConfiguration.h b/SystemConfiguration.fproj/SCNetworkConfiguration.h
index 7e20211..25b99fe 100644
--- a/SystemConfiguration.fproj/SCNetworkConfiguration.h
+++ b/SystemConfiguration.fproj/SCNetworkConfiguration.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -75,7 +75,7 @@ extern const CFStringRef kSCNetworkInterfaceTypeBluetooth					__OSX_AVAILABLE_ST
 /*!
 	@const kSCNetworkInterfaceTypeBond
  */
-extern const CFStringRef kSCNetworkInterfaceTypeBond						__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_NA);
+extern const CFStringRef kSCNetworkInterfaceTypeBond						__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@const kSCNetworkInterfaceTypeEthernet
@@ -93,7 +93,7 @@ extern const CFStringRef kSCNetworkInterfaceTypeFireWire					__OSX_AVAILABLE_STA
 extern const CFStringRef kSCNetworkInterfaceTypeIEEE80211					__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/);	// IEEE 802.11, AirPort
 
 /*!
- @const kSCNetworkInterfaceTypeIPSec
+	@const kSCNetworkInterfaceTypeIPSec
  */
 extern const CFStringRef kSCNetworkInterfaceTypeIPSec						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/);
 
@@ -130,7 +130,7 @@ extern const CFStringRef kSCNetworkInterfaceTypeSerial						__OSX_AVAILABLE_STAR
 /*!
 	@const kSCNetworkInterfaceTypeVLAN
  */
-extern const CFStringRef kSCNetworkInterfaceTypeVLAN						__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_NA);
+extern const CFStringRef kSCNetworkInterfaceTypeVLAN						__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@const kSCNetworkInterfaceTypeWWAN
@@ -172,7 +172,6 @@ typedef SCNetworkInterfaceRef SCBondInterfaceRef;
  */
 typedef const struct __SCBondStatus *		SCBondStatusRef;
 
-#if	!TARGET_OS_IPHONE
 /*!
 	@enum Ethernet Bond Aggregation Status (kSCBondStatusDeviceAggregationStatus) codes
 	@discussion Returned status codes.
@@ -189,22 +188,21 @@ enum {
 	kSCBondStatusNotInActiveGroup	= 3,	/* We're talking to a partner, but the link aggregation group is different from the one that's active */
 	kSCBondStatusUnknown		= 999	/* Non-specific failure */
 };
-#endif	// !TARGET_OS_IPHONE
 
 /*!
-  @const kSCBondStatusDeviceAggregationStatus
+	@const kSCBondStatusDeviceAggregationStatus
  */
-extern const CFStringRef kSCBondStatusDeviceAggregationStatus	/* CFNumber */			__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_NA);
+extern const CFStringRef kSCBondStatusDeviceAggregationStatus	/* CFNumber */			__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_4_0/*SPI*/);
 
 /*!
-  @const kSCBondStatusDeviceCollecting
+	@const kSCBondStatusDeviceCollecting
  */
-extern const CFStringRef kSCBondStatusDeviceCollecting		/* CFNumber (0 or 1) */		__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_NA);
+extern const CFStringRef kSCBondStatusDeviceCollecting		/* CFNumber (0 or 1) */		__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_4_0/*SPI*/);
 
 /*!
-  @const kSCBondStatusDeviceDistributing
+	@const kSCBondStatusDeviceDistributing
  */
-extern const CFStringRef kSCBondStatusDeviceDistributing	/* CFNumber (0 or 1) */		__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_NA);
+extern const CFStringRef kSCBondStatusDeviceDistributing	/* CFNumber (0 or 1) */		__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@group Interface configuration (VLAN)
@@ -506,7 +504,7 @@ SCNetworkInterfaceCopyMediaSubTypes		(CFArrayRef			available)	__OSX_AVAILABLE_ST
 	@discussion For the provided interface configuration options and specific
 		subtype, return a list of available media options.
 	@param available The available options as returned by the
-		NetworkInterfaceCopyMediaOptions function.
+		SCNetworkInterfaceCopyMediaOptions function.
 	@param subType The subtype
 	@result An array of available media options.  Each of the available options
 		is returned as an array of CFString's (e.g. <half-duplex>,
@@ -545,7 +543,6 @@ SCNetworkInterfaceCopyMTU			(SCNetworkInterfaceRef		interface,
 	@param interface The desired network interface.
 	@param subtype The desired media subtype (e.g. "autoselect", "100baseTX", ...).
 	@param options The desired media options (e.g. "half-duplex", "full-duplex", ...).
-		If NULL, the active options will not be returned.
 	@result TRUE if the configuration was updated; FALSE if an error was encountered.
  */
 Boolean
@@ -603,7 +600,7 @@ SCNetworkInterfaceForceConfigurationRefresh	(SCNetworkInterfaceRef		interface)	_
 		You must release the returned value.
  */
 CFArrayRef /* of SCBondInterfaceRef's */
-SCBondInterfaceCopyAll				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondInterfaceCopyAll				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceCopyAvailableMemberInterfaces
@@ -614,7 +611,7 @@ SCBondInterfaceCopyAll				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__
 		You must release the returned value.
  */
 CFArrayRef /* of SCNetworkInterfaceRef's */
-SCBondInterfaceCopyAvailableMemberInterfaces	(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondInterfaceCopyAvailableMemberInterfaces	(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceCreate
@@ -624,7 +621,7 @@ SCBondInterfaceCopyAvailableMemberInterfaces	(SCPreferencesRef		prefs)		__OSX_AV
 		You must release the returned value.
  */
 SCBondInterfaceRef
-SCBondInterfaceCreate				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondInterfaceCreate				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceRemove
@@ -633,7 +630,7 @@ SCBondInterfaceCreate				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__M
 	@result TRUE if the interface was removed; FALSE if an error was encountered.
  */
 Boolean
-SCBondInterfaceRemove				(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondInterfaceRemove				(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceGetMemberInterfaces
@@ -642,7 +639,7 @@ SCBondInterfaceRemove				(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__
 	@result The list of interfaces.
  */
 CFArrayRef /* of SCNetworkInterfaceRef's */
-SCBondInterfaceGetMemberInterfaces		(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondInterfaceGetMemberInterfaces		(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceGetOptions
@@ -652,7 +649,7 @@ SCBondInterfaceGetMemberInterfaces		(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_
 		NULL if no changes to the default configuration have been saved.
  */
 CFDictionaryRef
-SCBondInterfaceGetOptions			(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondInterfaceGetOptions			(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceSetMemberInterfaces
@@ -664,7 +661,7 @@ SCBondInterfaceGetOptions			(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING
 Boolean
 SCBondInterfaceSetMemberInterfaces		(SCBondInterfaceRef		bond,
 						 CFArrayRef			members) /* of SCNetworkInterfaceRef's */
-												__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+												__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceSetLocalizedDisplayName
@@ -675,7 +672,7 @@ SCBondInterfaceSetMemberInterfaces		(SCBondInterfaceRef		bond,
  */
 Boolean
 SCBondInterfaceSetLocalizedDisplayName		(SCBondInterfaceRef		bond,
-						 CFStringRef			newName)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+						 CFStringRef			newName)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceSetOptions
@@ -686,7 +683,7 @@ SCBondInterfaceSetLocalizedDisplayName		(SCBondInterfaceRef		bond,
  */
 Boolean
 SCBondInterfaceSetOptions			(SCBondInterfaceRef		bond,
-						 CFDictionaryRef		newOptions)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+						 CFDictionaryRef		newOptions)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 #pragma mark -
 
@@ -698,14 +695,14 @@ SCBondInterfaceSetOptions			(SCBondInterfaceRef		bond,
 		You must release the returned value.
  */
 SCBondStatusRef
-SCBondInterfaceCopyStatus			(SCBondInterfaceRef	bond)			__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondInterfaceCopyStatus			(SCBondInterfaceRef	bond)			__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondStatusGetTypeID
 	@discussion Returns the type identifier of all SCBondStatus instances.
  */
 CFTypeID
-SCBondStatusGetTypeID				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondStatusGetTypeID				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondStatusGetMemberInterfaces
@@ -715,7 +712,7 @@ SCBondStatusGetTypeID				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHON
 	@result The list of interfaces.
  */
 CFArrayRef /* of SCNetworkInterfaceRef's */
-SCBondStatusGetMemberInterfaces			(SCBondStatusRef	bondStatus)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCBondStatusGetMemberInterfaces			(SCBondStatusRef	bondStatus)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondStatusGetInterfaceStatus
@@ -732,7 +729,7 @@ SCBondStatusGetMemberInterfaces			(SCBondStatusRef	bondStatus)		__OSX_AVAILABLE_
  */
 CFDictionaryRef
 SCBondStatusGetInterfaceStatus			(SCBondStatusRef	bondStatus,
-						 SCNetworkInterfaceRef	interface)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+						 SCNetworkInterfaceRef	interface)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@group Interface configuration (VLAN)
@@ -748,7 +745,7 @@ SCBondStatusGetInterfaceStatus			(SCBondStatusRef	bondStatus,
 		You must release the returned value.
  */
 CFArrayRef /* of SCVLANInterfaceRef's */
-SCVLANInterfaceCopyAll				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCVLANInterfaceCopyAll				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceCopyAvailablePhysicalInterfaces
@@ -758,7 +755,7 @@ SCVLANInterfaceCopyAll				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__
 		You must release the returned value.
  */
 CFArrayRef /* of SCNetworkInterfaceRef's */
-SCVLANInterfaceCopyAvailablePhysicalInterfaces	(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCVLANInterfaceCopyAvailablePhysicalInterfaces	(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceCreate
@@ -774,7 +771,7 @@ SCVLANInterfaceCopyAvailablePhysicalInterfaces	(void)						__OSX_AVAILABLE_START
 SCVLANInterfaceRef
 SCVLANInterfaceCreate				(SCPreferencesRef		prefs,
 						 SCNetworkInterfaceRef		physical,
-						 CFNumberRef			tag)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+						 CFNumberRef			tag)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceRemove
@@ -783,7 +780,7 @@ SCVLANInterfaceCreate				(SCPreferencesRef		prefs,
 	@result TRUE if the interface was removed; FALSE if an error was encountered.
  */
 Boolean
-SCVLANInterfaceRemove				(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCVLANInterfaceRemove				(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceGetPhysicalInterface
@@ -792,7 +789,7 @@ SCVLANInterfaceRemove				(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__
 	@result The list of interfaces.
  */
 SCNetworkInterfaceRef
-SCVLANInterfaceGetPhysicalInterface		(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCVLANInterfaceGetPhysicalInterface		(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceGetTag
@@ -801,7 +798,7 @@ SCVLANInterfaceGetPhysicalInterface		(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE
 	@result The tag.
  */
 CFNumberRef
-SCVLANInterfaceGetTag				(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCVLANInterfaceGetTag				(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceGetOptions
@@ -811,7 +808,7 @@ SCVLANInterfaceGetTag				(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__
 		NULL if no changes to the default configuration have been saved.
  */
 CFDictionaryRef
-SCVLANInterfaceGetOptions			(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+SCVLANInterfaceGetOptions			(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceSetPhysicalInterfaceAndTag
@@ -826,7 +823,7 @@ SCVLANInterfaceGetOptions			(SCVLANInterfaceRef		vlan)		__OSX_AVAILABLE_STARTING
 Boolean
 SCVLANInterfaceSetPhysicalInterfaceAndTag	(SCVLANInterfaceRef		vlan,
 						 SCNetworkInterfaceRef		physical,
-						 CFNumberRef			tag)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+						 CFNumberRef			tag)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceSetLocalizedDisplayName
@@ -837,7 +834,7 @@ SCVLANInterfaceSetPhysicalInterfaceAndTag	(SCVLANInterfaceRef		vlan,
  */
 Boolean
 SCVLANInterfaceSetLocalizedDisplayName		(SCVLANInterfaceRef		vlan,
-						 CFStringRef			newName)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+						 CFStringRef			newName)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCVLANInterfaceSetOptions
@@ -848,7 +845,7 @@ SCVLANInterfaceSetLocalizedDisplayName		(SCVLANInterfaceRef		vlan,
  */
 Boolean
 SCVLANInterfaceSetOptions			(SCVLANInterfaceRef		vlan,
-						 CFDictionaryRef		newOptions)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+						 CFDictionaryRef		newOptions)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 
 /* --------------------------------------------------------------------------------
diff --git a/SystemConfiguration.fproj/SCNetworkConfigurationInternal.c b/SystemConfiguration.fproj/SCNetworkConfigurationInternal.c
index 13ba9e8..088b769 100644
--- a/SystemConfiguration.fproj/SCNetworkConfigurationInternal.c
+++ b/SystemConfiguration.fproj/SCNetworkConfigurationInternal.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2007, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -187,10 +187,10 @@ static CFDictionaryRef
 __copyTemplates()
 {
 	CFBundleRef     bundle;
+	CFErrorRef	error		= NULL;
 	Boolean		ok;
 	CFDictionaryRef templates;
 	CFURLRef	url;
-	CFStringRef     xmlError	= NULL;
 	CFDataRef       xmlTemplates    = NULL;
 
 	bundle = _SC_CFBundleGet();
@@ -210,12 +210,12 @@ __copyTemplates()
 	}
 
 	// convert the XML data into a property list
-	templates = CFPropertyListCreateFromXMLData(NULL, xmlTemplates, kCFPropertyListImmutable, &xmlError);
+	templates = CFPropertyListCreateWithData(NULL, xmlTemplates, kCFPropertyListImmutable, NULL, &error);
 	CFRelease(xmlTemplates);
 	if (templates == NULL) {
-		if (xmlError != NULL) {
-			SCLog(TRUE, LOG_DEBUG, CFSTR("could not load SCNetworkConfiguration templates: %@"), xmlError);
-			CFRelease(xmlError);
+		if (error != NULL) {
+			SCLog(TRUE, LOG_DEBUG, CFSTR("could not load SCNetworkConfiguration templates: %@"), error);
+			CFRelease(error);
 		}
 		return NULL;
 	}
@@ -253,6 +253,11 @@ __copyInterfaceTemplate(CFStringRef      interfaceType,
 	} else {
 		CFStringRef     expandedType;
 
+		if (CFStringFind(childInterfaceType, CFSTR("."), 0).location != kCFNotFound) {
+			// if "vendor" type
+			childInterfaceType = CFSTR("*");
+		}
+
 		expandedType = CFStringCreateWithFormat(NULL,
 							NULL,
 							CFSTR("%@-%@"),
@@ -300,6 +305,11 @@ __copyProtocolTemplate(CFStringRef      interfaceType,
 	} else {
 		CFStringRef     expandedType;
 
+		if (CFStringFind(childInterfaceType, CFSTR("."), 0).location != kCFNotFound) {
+			// if "vendor" type
+			childInterfaceType = CFSTR("*");
+		}
+
 		expandedType = CFStringCreateWithFormat(NULL,
 							NULL,
 							CFSTR("%@-%@"),
diff --git a/SystemConfiguration.fproj/SCNetworkConfigurationInternal.h b/SystemConfiguration.fproj/SCNetworkConfigurationInternal.h
index 13ff626..c7272f3 100644
--- a/SystemConfiguration.fproj/SCNetworkConfigurationInternal.h
+++ b/SystemConfiguration.fproj/SCNetworkConfigurationInternal.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -133,6 +133,7 @@ typedef struct {
 	CFStringRef		addressString;
 	Boolean			builtin;
 	CFStringRef		configurationAction;
+	Boolean			hidden;
 	CFStringRef		location;
 	CFStringRef		path;
 	CFMutableDictionaryRef	overrides;
@@ -148,7 +149,6 @@ typedef struct {
 	// misc
 	int			sort_order;		// sort order for this interface
 
-#if	!TARGET_OS_IPHONE
 	// for BOND interfaces
 	Boolean			supportsBond;
 	struct {
@@ -157,6 +157,13 @@ typedef struct {
 		CFNumberRef		mode;
 	} bond;
 
+	// for Bridge interfaces
+	Boolean			supportsBridge;
+	struct {
+		CFArrayRef		interfaces;
+		CFDictionaryRef		options;
+	} bridge;
+
 	// for VLAN interfaces
 	Boolean			supportsVLAN;
 	struct {
@@ -164,7 +171,6 @@ typedef struct {
 		CFNumberRef		tag;		// e.g. 1 <= tag <= 4094
 		CFDictionaryRef		options;
 	} vlan;
-#endif	// !TARGET_OS_IPHONE
 
 } SCNetworkInterfacePrivate, *SCNetworkInterfacePrivateRef;
 
@@ -192,15 +198,17 @@ __SCNetworkInterfaceCreatePrivate		(CFAllocatorRef		allocator,
 						 CFStringRef		serviceID,
 						 io_string_t		path);
 
-#if	!TARGET_OS_IPHONE
 SCNetworkInterfacePrivateRef
 _SCBondInterfaceCreatePrivate			(CFAllocatorRef		allocator,
 						 CFStringRef		bond_if);
 
+SCNetworkInterfacePrivateRef
+_SCBridgeInterfaceCreatePrivate			(CFAllocatorRef		allocator,
+						 CFStringRef		bridge_if);
+
 SCNetworkInterfacePrivateRef
 _SCVLANInterfaceCreatePrivate			(CFAllocatorRef		allocator,
 						 CFStringRef		vlan_if);
-#endif	// !TARGET_OS_IPHONE
 
 CFDictionaryRef
 __SCNetworkInterfaceCopyInterfaceEntity		(SCNetworkInterfaceRef	interface);
@@ -209,11 +217,22 @@ CFArrayRef
 __SCNetworkInterfaceCopyDeepConfiguration       (SCNetworkSetRef	set,
 						 SCNetworkInterfaceRef	interface);
 
+#if	!TARGET_OS_EMBEDDED && !TARGET_IPHONE_SIMULATOR
 CFStringRef
 __SCNetworkInterfaceCopyXLocalizedDisplayName	(SCNetworkInterfaceRef	interface);
 
 CFStringRef
 __SCNetworkInterfaceCopyXNonLocalizedDisplayName(SCNetworkInterfaceRef	interface);
+#endif	// !TARGET_OS_EMBEDDED && !TARGET_IPHONE_SIMULATOR
+
+int
+__SCNetworkInterfaceCreateCapabilities		(SCNetworkInterfaceRef	interface,
+						 int			capability_base,
+						 CFDictionaryRef	capability_options);
+
+int
+__SCNetworkInterfaceCreateMediaOptions		(SCNetworkInterfaceRef	interface,
+						 CFDictionaryRef	media_options);
 
 CFStringRef
 __SCNetworkInterfaceGetDefaultConfigurationType	(SCNetworkInterfaceRef	interface);
@@ -221,6 +240,10 @@ __SCNetworkInterfaceGetDefaultConfigurationType	(SCNetworkInterfaceRef	interface
 CFStringRef
 __SCNetworkInterfaceGetNonLocalizedDisplayName	(SCNetworkInterfaceRef	interface);
 
+Boolean
+__SCNetworkInterfaceIsMember			(SCPreferencesRef	prefs,
+						 SCNetworkInterfaceRef	interface);
+
 Boolean
 __SCNetworkInterfaceIsValidExtendedConfigurationType
 						(SCNetworkInterfaceRef	interface,
@@ -229,7 +252,7 @@ __SCNetworkInterfaceIsValidExtendedConfigurationType
 
 CFDictionaryRef
 __SCNetworkInterfaceGetTemplateOverrides	(SCNetworkInterfaceRef	interface,
-						 CFStringRef		interfaceType);
+						 CFStringRef		overrideType);
 
 int
 __SCNetworkInterfaceOrder			(SCNetworkInterfaceRef	interface);
@@ -245,14 +268,16 @@ __SCNetworkInterfaceSetDeepConfiguration	(SCNetworkSetRef	set,
 						 SCNetworkInterfaceRef	interface,
 						 CFArrayRef		configs);
 
-#if	!TARGET_OS_IPHONE
 Boolean
 __SCNetworkInterfaceSupportsVLAN		(CFStringRef		bsd_if);
 
 void
-__SCBondInterfaceListCopyMembers		(CFArrayRef 		interfaces,
+__SCBondInterfaceListCollectMembers		(CFArrayRef 		interfaces,
+						 CFMutableSetRef 	set);
+
+void
+__SCBridgeInterfaceListCollectMembers		(CFArrayRef 		interfaces,
 						 CFMutableSetRef 	set);
-#endif	// !TARGET_OS_IPHONE
 
 #pragma mark -
 #pragma mark SCNetworkProtocol configuration (internal)
@@ -271,12 +296,22 @@ __SCNetworkProtocolIsValidType			(CFStringRef		protocolType);
 #pragma mark SCNetworkService configuration (internal)
 
 
+CFArrayRef /* of SCNetworkServiceRef's */
+__SCNetworkServiceCopyAllEnabled		(SCPreferencesRef	prefs);
+
 SCNetworkServicePrivateRef
 __SCNetworkServiceCreatePrivate			(CFAllocatorRef		allocator,
 						 SCPreferencesRef	prefs,
 						 CFStringRef		serviceID,
 						 SCNetworkInterfaceRef	interface);
 
+Boolean
+__SCNetworkServiceExistsForInterface		(CFArrayRef		services,
+						 SCNetworkInterfaceRef	interface);
+
+CFStringRef
+__SCNetworkServiceNextName			(SCNetworkServiceRef	service);
+
 
 #pragma mark -
 #pragma mark SCNetworkSet configuration (internal)
diff --git a/SystemConfiguration.fproj/SCNetworkConfigurationPrivate.h b/SystemConfiguration.fproj/SCNetworkConfigurationPrivate.h
index 63ba880..3998ac9 100644
--- a/SystemConfiguration.fproj/SCNetworkConfigurationPrivate.h
+++ b/SystemConfiguration.fproj/SCNetworkConfigurationPrivate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2005-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -39,9 +39,48 @@
 __BEGIN_DECLS
 
 
+/*!
+	@group Interface configuration
+ */
+
 #pragma mark -
-#pragma mark SCNetworkInterface configuration (SPI)
+#pragma mark SCNetworkInterface configuration (typedefs, consts)
+
+/*!
+	@const kSCNetworkInterfaceTypeBridge
+ */
+extern const CFStringRef kSCNetworkInterfaceTypeBridge						__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@const kSCNetworkInterfaceTypeLoopback
+ */
+extern const CFStringRef kSCNetworkInterfaceTypeLoopback					__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
 
+/*!
+	@const kSCNetworkInterfaceLoopback
+	@discussion A network interface representing the loopback
+		interface (lo0).
+ */
+extern const SCNetworkInterfaceRef kSCNetworkInterfaceLoopback					__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@const kSCNetworkInterfaceTypeVPN
+ */
+extern const CFStringRef kSCNetworkInterfaceTypeVPN						__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@group Interface configuration (Bridge)
+ */
+
+/*!
+	@typedef SCBridgeInterfaceRef
+	@discussion This is the type of a reference to an object that represents
+		a bridge interface.
+ */
+typedef SCNetworkInterfaceRef SCBridgeInterfaceRef;
+
+#pragma mark -
+#pragma mark SCNetworkInterface configuration (SPI)
 
 /*!
 	@group Interface configuration
@@ -53,7 +92,6 @@ isA_SCNetworkInterface(CFTypeRef obj)
 	return (isA_CFType(obj, SCNetworkInterfaceGetTypeID()));
 }
 
-#if	!TARGET_OS_IPHONE
 static __inline__ CFTypeRef
 isA_SCBondInterface(CFTypeRef obj)
 {
@@ -73,6 +111,25 @@ isA_SCBondInterface(CFTypeRef obj)
 	return obj;
 }
 
+static __inline__ CFTypeRef
+isA_SCBridgeInterface(CFTypeRef obj)
+{
+	CFStringRef	interfaceType;
+
+	if (!isA_SCNetworkInterface(obj)) {
+		// if not an SCNetworkInterface
+		return NULL;
+	}
+
+	interfaceType = SCNetworkInterfaceGetInterfaceType((SCNetworkInterfaceRef)obj);
+	if (!CFEqual(interfaceType, kSCNetworkInterfaceTypeBridge)) {
+		// if not a bridge
+		return NULL;
+	}
+
+	return obj;
+}
+
 static __inline__ CFTypeRef
 isA_SCVLANInterface(CFTypeRef obj)
 {
@@ -91,7 +148,6 @@ isA_SCVLANInterface(CFTypeRef obj)
 
 	return obj;
 }
-#endif	// !TARGET_OS_IPHONE
 
 /*!
 	@function _SCNetworkInterfaceCompare
@@ -106,6 +162,16 @@ _SCNetworkInterfaceCompare				(const void			*val1,
 							 const void			*val2,
 							 void				*context)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
 
+/*!
+	@function _SCNetworkInterfaceCopyAllWithPreferences
+		Returns all network capable interfaces on the system.
+	@param prefs The "preferences" session.
+	@result The list of interfaces on the system.
+		You must release the returned value.
+ */
+CFArrayRef /* of SCNetworkInterfaceRef's */
+_SCNetworkInterfaceCopyAllWithPreferences		(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
+
 /*!
 	@function _SCNetworkInterfaceCopySlashDevPath
 	@discussion Returns the /dev pathname for the interface.
@@ -119,15 +185,16 @@ _SCNetworkInterfaceCopySlashDevPath			(SCNetworkInterfaceRef		interface)	__OSX_A
 #define kIncludeNoVirtualInterfaces	0x0
 #define kIncludeVLANInterfaces		0x1
 #define kIncludeBondInterfaces		0x2
+#define kIncludeBridgeInterfaces	0x4
 #define kIncludeAllVirtualInterfaces	0xffffffff
 
 /*!
 	@function _SCNetworkInterfaceCreateWithBSDName
 	@discussion Create a new network interface associated with the provided
-		BSD interface name.  This API supports Ethhernet, FireWire, and
+		BSD interface name.  This API supports Ethernet, FireWire, and
 		IEEE 802.11 interfaces.
 	@param bsdName The BSD interface name.
-	@param flags Indicates whether virtual (Bond, VLAN)
+	@param flags Indicates whether virtual (Bond, Bridge, VLAN)
 		network interfaces should be included.
 	@result A reference to the new SCNetworkInterface.
 		You must release the returned value.
@@ -167,6 +234,13 @@ _SCNetworkInterfaceCreateWithIONetworkInterfaceObject	(io_object_t			if_obj)		__
 #define	kSCNetworkInterfaceConfigurationActionValuePrompt	CFSTR("Prompt")
 #define	kSCNetworkInterfaceConfigurationActionValueConfigure	CFSTR("Configure")
 
+#define	kSCNetworkInterfaceNetworkConfigurationOverridesKey	CFSTR("NetworkConfigurationOverrides")
+#define	kSCNetworkInterfaceHiddenConfigurationKey		CFSTR("HiddenConfiguration")
+#define	kSCNetworkInterfaceHiddenPortKey			CFSTR("HiddenPort")
+
+// IORegistry property to indicate that a [WWAN] interface is not yet ready
+#define	kSCNetworkInterfaceInitializingKey			CFSTR("Initializing")
+
 /*!
 	@function _SCNetworkInterfaceCopyInterfaceInfo
 	@discussion Returns interface details
@@ -227,13 +301,31 @@ _SCNetworkInterfaceGetIOPath				(SCNetworkInterfaceRef		interface)	__OSX_AVAILAB
 
 /*!
 	@function _SCNetworkInterfaceIsBluetoothPAN
-	@discussion Identifies if a network interface is a Bluetooth PAN device.
+	@discussion Identifies if a network interface is a Bluetooth PAN (GN) device.
 	@param interface The network interface.
 	@result TRUE if the interface is a Bluetooth PAN device.
  */
 Boolean
 _SCNetworkInterfaceIsBluetoothPAN			(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0);
 
+/*!
+	@function _SCNetworkInterfaceIsBluetoothPAN_NAP
+	@discussion Identifies if a network interface is a Bluetooth PAN-NAP device.
+	@param interface The network interface.
+	@result TRUE if the interface is a Bluetooth PAN-NAP device.
+ */
+Boolean
+_SCNetworkInterfaceIsBluetoothPAN_NAP			(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0);
+
+/*!
+	@function _SCNetworkInterfaceIsBluetoothP2P
+	@discussion Identifies if a network interface is a Bluetooth P2P (PAN-U) device.
+	@param interface The network interface.
+	@result TRUE if the interface is a Bluetooth P2P device.
+ */
+Boolean
+_SCNetworkInterfaceIsBluetoothP2P			(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0);
+
 /*!
 	@function _SCNetworkInterfaceIsBuiltin
 	@discussion Identifies if a network interface is "built-in".
@@ -244,13 +336,14 @@ Boolean
 _SCNetworkInterfaceIsBuiltin				(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
 
 /*!
-	@function _SCNetworkInterfaceIsTethered
-	@discussion Identifies if a network interface is an Apple tethered device (e.g. an iPhone).
+	@function _SCNetworkInterfaceIsHiddenConfiguration
+	@discussion Identifies if the configuration of a network interface should be
+		hidden from any user interface (e.g. the "Network" pref pane).
 	@param interface The network interface.
-	@result TRUE if the interface is a tethered device.
+	@result TRUE if the interface configuration should be hidden.
  */
 Boolean
-_SCNetworkInterfaceIsTethered				(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0);
+_SCNetworkInterfaceIsHiddenConfiguration		(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
 
 /*!
 	@function _SCNetworkInterfaceIsModemV92
@@ -262,6 +355,24 @@ _SCNetworkInterfaceIsTethered				(SCNetworkInterfaceRef		interface)	__OSX_AVAILA
 Boolean
 _SCNetworkInterfaceIsModemV92				(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
 
+/*!
+	@function _SCNetworkInterfaceIsTethered
+	@discussion Identifies if a network interface is an Apple tethered device (e.g. an iPhone).
+	@param interface The network interface.
+	@result TRUE if the interface is a tethered device.
+ */
+Boolean
+_SCNetworkInterfaceIsTethered				(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0);
+
+/*!
+	@function _SCNetworkInterfaceIsPhysicalEthernet
+	@discussion Indicates whether a network interface is a real ethernet interface i.e. one with an ethernet PHY.
+	@param interface The network interface.
+	@result TRUE if the interface is a real ethernet interface.
+ */
+Boolean
+_SCNetworkInterfaceIsPhysicalEthernet			(SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0);
+
 /*!
 	@function _SCNetworkInterfaceForceConfigurationRefresh
 	@discussion Forces a configuration refresh of the
@@ -272,6 +383,41 @@ _SCNetworkInterfaceIsModemV92				(SCNetworkInterfaceRef		interface)	__OSX_AVAILA
 Boolean
 _SCNetworkInterfaceForceConfigurationRefresh		(CFStringRef			ifName)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
 
+/*!
+	@function SCNetworkInterfaceCopyCapability
+	@discussion For the specified network interface, returns information
+		about the currently requested capabilities, the active capabilities,
+		and the capabilities which are available.
+	@param interface The desired network interface.
+	@param capability The desired capability.
+	@result a CFTypeRef representing the current value of requested
+		capability;
+		NULL if the capability is not available for this
+		interface or if an error was encountered.
+		You must release the returned value.
+ */
+CFTypeRef
+SCNetworkInterfaceCopyCapability			(SCNetworkInterfaceRef		interface,
+							 CFStringRef			capability)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
+
+/*!
+	@function SCNetworkInterfaceSetCapability
+	@discussion For the specified network interface, sets the requested
+		capabilities.
+	@param interface The desired network interface.
+	@param capability The desired capability.
+	@param newValue The new requested setting for the capability;
+		NULL to restore the default setting.
+	@result TRUE if the configuration was updated; FALSE if an error was encountered.
+ */
+Boolean
+SCNetworkInterfaceSetCapability				(SCNetworkInterfaceRef		interface,
+							 CFStringRef			capability,
+							 CFTypeRef			newValue)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
+
+#pragma mark -
+#pragma mark SCBondInterface configuration (SPIs)
+
 /*!
 	@function _SCBondInterfaceCopyActive
 	@discussion Returns all Ethernet Bond interfaces on the system.
@@ -279,7 +425,7 @@ _SCNetworkInterfaceForceConfigurationRefresh		(CFStringRef			ifName)		__OSX_AVAI
 		You must release the returned value.
  */
 CFArrayRef
-_SCBondInterfaceCopyActive				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+_SCBondInterfaceCopyActive				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function _SCBondInterfaceUpdateConfiguration
@@ -289,7 +435,16 @@ _SCBondInterfaceCopyActive				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__
 		an error was encountered.
  */
 Boolean
-_SCBondInterfaceUpdateConfiguration			(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+_SCBondInterfaceUpdateConfiguration			(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBondInterfaceGetMode
+	@discussion Return the mode for the given bond interface.
+	@param bond The bond interface to get the mode from.
+	@result A CFNumberRef containing the mode (IF_BOND_MODE_{LACP,STATIC}).
+ */
+CFNumberRef
+SCBondInterfaceGetMode					(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCBondInterfaceSetMode
@@ -300,16 +455,128 @@ _SCBondInterfaceUpdateConfiguration			(SCPreferencesRef		prefs)		__OSX_AVAILABLE
  */
 Boolean
 SCBondInterfaceSetMode					(SCBondInterfaceRef		bond,
-							 CFNumberRef			mode)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+							 CFNumberRef			mode)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
+
+#pragma mark -
+#pragma mark SCBridgeInterface configuration (SPIs)
 
 /*!
-	@function SCBondInterfaceSetMode
-	@discussion Return the mode for the given bond interface.
-	@param bond The bond interface to get the mode from.
-	@result A CFNumberRef containing the mode (IF_BOND_MODE_{LACP,STATIC}).
+	@function SCBridgeInterfaceCopyAll
+	@discussion Returns all bridge interfaces on the system.
+	@param prefs The "preferences" session.
+	@result The list of bridge interfaces on the system.
+		You must release the returned value.
  */
-CFNumberRef
-SCBondInterfaceGetMode					(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+CFArrayRef /* of SCBridgeInterfaceRef's */
+SCBridgeInterfaceCopyAll				(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceCopyAvailableMemberInterfaces
+	@discussion Returns all network capable devices on the system
+		that can be added to an bridge interface.
+	@param prefs The "preferences" session.
+	@result The list of interfaces.
+		You must release the returned value.
+ */
+CFArrayRef /* of SCNetworkInterfaceRef's */
+SCBridgeInterfaceCopyAvailableMemberInterfaces		(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceCreate
+	@discussion Create a new SCBridgeInterface interface.
+	@param prefs The "preferences" session.
+	@result A reference to the new SCBridgeInterface.
+		You must release the returned value.
+ */
+SCBridgeInterfaceRef
+SCBridgeInterfaceCreate					(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceRemove
+	@discussion Removes the SCBridgeInterface from the configuration.
+	@param bridge The SCBridgeInterface interface.
+	@result TRUE if the interface was removed; FALSE if an error was encountered.
+ */
+Boolean
+SCBridgeInterfaceRemove					(SCBridgeInterfaceRef		bridge)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceGetMemberInterfaces
+	@discussion Returns the member interfaces for the specified bridge interface.
+	@param bridge The SCBridgeInterface interface.
+	@result The list of interfaces.
+ */
+CFArrayRef /* of SCNetworkInterfaceRef's */
+SCBridgeInterfaceGetMemberInterfaces			(SCBridgeInterfaceRef		bridge)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceGetOptions
+	@discussion Returns the configuration settings associated with a bridge interface.
+	@param bridge The SCBridgeInterface interface.
+	@result The configuration settings associated with the bridge interface;
+		NULL if no changes to the default configuration have been saved.
+ */
+CFDictionaryRef
+SCBridgeInterfaceGetOptions				(SCBridgeInterfaceRef		bridge)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceSetMemberInterfaces
+	@discussion Sets the member interfaces for the specified bridge interface.
+	@param bridge The SCBridgeInterface interface.
+	@param members The desired member interfaces.
+	@result TRUE if the configuration was stored; FALSE if an error was encountered.
+ */
+Boolean
+SCBridgeInterfaceSetMemberInterfaces			(SCBridgeInterfaceRef		bridge,
+							 CFArrayRef			members) /* of SCNetworkInterfaceRef's */
+													__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceSetLocalizedDisplayName
+	@discussion Sets the localized display name for the specified bridge interface.
+	@param bridge The SCBridgeInterface interface.
+	@param newName The new display name.
+	@result TRUE if the configuration was stored; FALSE if an error was encountered.
+ */
+Boolean
+SCBridgeInterfaceSetLocalizedDisplayName		(SCBridgeInterfaceRef		bridge,
+							 CFStringRef			newName)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function SCBridgeInterfaceSetOptions
+	@discussion Sets the configuration settings for the specified bridge interface.
+	@param bridge The SCBridgeInterface interface.
+	@param newOptions The new configuration settings.
+	@result TRUE if the configuration was stored; FALSE if an error was encountered.
+ */
+Boolean
+SCBridgeInterfaceSetOptions				(SCBridgeInterfaceRef		bridge,
+							 CFDictionaryRef		newOptions)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+#pragma mark -
+
+/*!
+	@function _SCBridgeInterfaceCopyActive
+	@discussion Returns all bridge interfaces on the system.
+	@result The list of SCBridgeInterface interfaces on the system.
+		You must release the returned value.
+ */
+CFArrayRef
+_SCBridgeInterfaceCopyActive				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+/*!
+	@function _SCBridgeInterfaceUpdateConfiguration
+	@discussion Updates the bridge interface configuration.
+	@param prefs The "preferences" session.
+	@result TRUE if the bridge interface configuration was updated.; FALSE if the
+		an error was encountered.
+ */
+Boolean
+_SCBridgeInterfaceUpdateConfiguration			(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/);
+
+
+#pragma mark -
+#pragma mark SCVLANInterface configuration (SPIs)
 
 /*!
 	@function _SCVLANInterfaceCopyActive
@@ -318,7 +585,7 @@ SCBondInterfaceGetMode					(SCBondInterfaceRef		bond)		__OSX_AVAILABLE_STARTING(
 		You must release the returned value.
  */
 CFArrayRef
-_SCVLANInterfaceCopyActive				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+_SCVLANInterfaceCopyActive				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function _SCVLANInterfaceUpdateConfiguration
@@ -328,7 +595,7 @@ _SCVLANInterfaceCopyActive				(void)						__OSX_AVAILABLE_STARTING(__MAC_10_5,__
 		an error was encountered.
  */
 Boolean
-_SCVLANInterfaceUpdateConfiguration			(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
+_SCVLANInterfaceUpdateConfiguration			(SCPreferencesRef		prefs)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_4_0/*SPI*/);
 
 
 #pragma mark -
@@ -340,6 +607,7 @@ enum {
 	kSCNetworkInterfacePasswordTypeIPSecSharedSecret,
 	kSCNetworkInterfacePasswordTypeEAPOL,
 	kSCNetworkInterfacePasswordTypeIPSecXAuth,
+	kSCNetworkInterfacePasswordTypeVPN,
 };
 typedef uint32_t	SCNetworkInterfacePasswordType;
 
@@ -401,6 +669,19 @@ enum {
 };
 typedef uint32_t	SCNetworkServicePrimaryRank;
 
+/*!
+	@function _SCNetworkServiceCompare
+	@discussion Compares two SCNetworkService objects.
+	@param val1 The SCNetworkService object.
+	@param val2 The SCNetworkService object.
+	@param context The service order (from SCNetworkSetGetServiceOrder).
+	@result A comparison result.
+ */
+CFComparisonResult
+_SCNetworkServiceCompare				(const void			*val1,
+							 const void			*val2,
+							 void				*context)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
+
 /*!
 	@function _SCNetworkServiceCopyActive
 	@discussion Returns the network service with the specified identifier.
@@ -446,6 +727,14 @@ Boolean
 SCNetworkServiceSetPrimaryRank				(SCNetworkServiceRef		service,
 							 SCNetworkServicePrimaryRank	newRank)	__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0);
 
+/*!
+	@function _SCNetworkServiceIsVPN
+	@discussion Identifies a VPN service.
+	@param service The network service.
+	@result TRUE if the service is a VPN.
+ */
+Boolean
+_SCNetworkServiceIsVPN					(SCNetworkServiceRef		service)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
 
 #pragma mark -
 #pragma mark SCNetworkSet configuration (SPI)
@@ -503,6 +792,32 @@ Boolean
 SCNetworkSetEstablishDefaultInterfaceConfiguration	(SCNetworkSetRef		set,
 							 SCNetworkInterfaceRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
 
+/*!
+	@function SCNetworkSetCopySelectedVPNService
+	@discussion On the iPhone we only allow a single VPN network service
+		to be selected at any given time.  This API will identify
+		the selected VPN service.
+	@param set The network set.
+	@result The selected VPN service; NULL if no service has been
+		selected.
+		You must release the returned value.
+ */
+SCNetworkServiceRef
+SCNetworkSetCopySelectedVPNService			(SCNetworkSetRef		set)		__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
+
+/*!
+	@function SCNetworkSetSetSelectedVPNService
+	@discussion On the iPhone we only allow a single VPN network service
+		to be selected at any given time.  This API should be used to
+		select a VPN service.
+	@param set The network set.
+	@param service The VPN service to be selected.
+	@result TRUE if the name was saved; FALSE if an error was encountered.
+ */
+Boolean
+SCNetworkSetSetSelectedVPNService			(SCNetworkSetRef		set,
+							 SCNetworkServiceRef		service)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
+
 __END_DECLS
 
 #endif	/* _SCNETWORKCONFIGURATIONPRIVATE_H */
diff --git a/SystemConfiguration.fproj/SCNetworkConnection.c b/SystemConfiguration.fproj/SCNetworkConnection.c
index 01aeb22..abaefee 100644
--- a/SystemConfiguration.fproj/SCNetworkConnection.c
+++ b/SystemConfiguration.fproj/SCNetworkConnection.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2003-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -32,12 +32,13 @@
  */
 
 
+//#define DEBUG_MACH_PORT_ALLOCATIONS
+
+
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreFoundation/CFRuntime.h>
 #include <SystemConfiguration/SystemConfiguration.h>
@@ -50,6 +51,7 @@
 #endif	// !TARGET_OS_IPHONE
 
 #include <servers/bootstrap.h>
+#include <bootstrap_priv.h>
 
 #include <pthread.h>
 #include <notify.h>
@@ -61,6 +63,7 @@
 #include <sys/socket.h>
 #include <net/if.h>
 #include <mach/mach.h>
+#include <bsm/audit.h>
 
 #include <ppp/ppp_msg.h>
 #include "pppcontroller.h"
@@ -70,6 +73,8 @@
 
 static int		debug			= 0;
 static pthread_once_t	initialized		= PTHREAD_ONCE_INIT;
+static pthread_mutex_t	scnc_lock		= PTHREAD_MUTEX_INITIALIZER;
+static mach_port_t	scnc_server		= MACH_PORT_NULL;
 
 
 typedef struct {
@@ -89,6 +94,9 @@ typedef struct {
 	/* ref to PPP controller for notification messages */
 	CFMachPortRef			notify_port;
 
+	/* keep track of whether we're acquired the initial status */
+	Boolean				haveStatus;
+
 	/* run loop source, callout, context, rl scheduling info */
 	Boolean				scheduled;
 	CFRunLoopSourceRef		rls;
@@ -96,11 +104,10 @@ typedef struct {
 	SCNetworkConnectionContext	rlsContext;
 	CFMutableArrayRef		rlList;
 
-#if	!TARGET_OS_IPHONE
-	dispatch_queue_t		dispatchQueue;		// SCNetworkConnectionSetDispatchQueue
+	/* SCNetworkConnectionSetDispatchQueue */
+	dispatch_queue_t		dispatchQueue;
 	dispatch_queue_t		callbackQueue;
 	dispatch_source_t		callbackSource;
-#endif	// !TARGET_OS_IPHONE
 
 } SCNetworkConnectionPrivate, *SCNetworkConnectionPrivateRef;
 
@@ -186,6 +193,16 @@ static const CFRuntimeClass __SCNetworkConnectionClass = {
 };
 
 
+static void
+childForkHandler()
+{
+	/* the process has forked (and we are the child process) */
+
+	scnc_server = MACH_PORT_NULL;
+	return;
+}
+
+
 static void
 __SCNetworkConnectionInitialize(void)
 {
@@ -200,38 +217,49 @@ __SCNetworkConnectionInitialize(void)
 		}
 	}
 
+	/* register with CoreFoundation */
 	__kSCNetworkConnectionTypeID = _CFRuntimeRegisterClass(&__SCNetworkConnectionClass);
+
+	/* add handler to cleanup after fork() */
+	(void) pthread_atfork(NULL, NULL, childForkHandler);
+
 	return;
 }
 
 
+static Boolean
+__SCNetworkConnectionReconnectNotifications(SCNetworkConnectionRef connection);
+
+
 static void
 __SCNetworkConnectionCallBack(CFMachPortRef port, void * msg, CFIndex size, void * info)
 {
-	mach_msg_empty_rcv_t *		buf			= msg;
+	mach_no_senders_notification_t	*buf			= msg;
+	mach_msg_id_t			msgid			= buf->not_header.msgh_id;
+
 	SCNetworkConnectionRef		connection		= (SCNetworkConnectionRef)info;
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
 	void				*context_info;
 	void				(*context_release)(const void *);
-	int				error			= kSCStatusFailed;
-	mach_msg_id_t			msgid			= buf->header.msgh_id;
-	SCNetworkConnectionCallBack	rlsFunction;
-	SCNetworkConnectionStatus	scstatus = kSCNetworkConnectionInvalid;
+	SCNetworkConnectionCallBack	rlsFunction		= NULL;
+	SCNetworkConnectionStatus	nc_status		= kSCNetworkConnectionInvalid;
 
 	if (msgid == MACH_NOTIFY_NO_SENDERS) {
+		// re-establish notification
 		SCLog(_sc_verbose, LOG_DEBUG, CFSTR("__SCNetworkConnectionCallBack: PPPController server died"));
-	} else {
-		(void) pppcontroller_getstatus(connectionPrivate->session_port, &scstatus, &error);
+		(void)__SCNetworkConnectionReconnectNotifications(connection);
 	}
 
+	pthread_mutex_lock(&connectionPrivate->lock);
+
 	if (!connectionPrivate->scheduled) {
 		// if not currently scheduled
-		return;
+		goto doit;
 	}
 
 	rlsFunction = connectionPrivate->rlsFunction;
 	if (rlsFunction == NULL) {
-		return;
+		goto doit;
 	}
 
 	if ((connectionPrivate->rlsContext.retain != NULL) && (connectionPrivate->rlsContext.info != NULL)) {
@@ -242,7 +270,16 @@ __SCNetworkConnectionCallBack(CFMachPortRef port, void * msg, CFIndex size, void
 		context_release	= NULL;
 	}
 
-	(*rlsFunction)(connection, scstatus, context_info);
+    doit :
+
+	pthread_mutex_unlock(&connectionPrivate->lock);
+
+	if (rlsFunction == NULL) {
+		return;
+	}
+
+	nc_status = SCNetworkConnectionGetStatus(connection);
+	(*rlsFunction)(connection, nc_status, context_info);
 	if ((context_release != NULL) && (context_info != NULL)) {
 		(*context_release)(context_info);
 	}
@@ -321,140 +358,425 @@ __SCNetworkConnectionCreatePrivate(CFAllocatorRef		allocator,
 }
 
 
+static mach_port_t
+__SCNetworkConnectionServerPort(kern_return_t *status)
+{
+	mach_port_t	server	= MACH_PORT_NULL;
+
+#ifdef	BOOTSTRAP_PRIVILEGED_SERVER
+	*status = bootstrap_look_up2(bootstrap_port,
+				     PPPCONTROLLER_SERVER,
+				     &server,
+				     0,
+				     BOOTSTRAP_PRIVILEGED_SERVER);
+#else	// BOOTSTRAP_PRIVILEGED_SERVER
+	*status = bootstrap_look_up(bootstrap_port, PPPCONTROLLER_SERVER, &server);
+#endif	// BOOTSTRAP_PRIVILEGED_SERVER
+
+	switch (*status) {
+		case BOOTSTRAP_SUCCESS :
+			// service currently registered, "a good thing" (tm)
+			return server;
+		case BOOTSTRAP_NOT_PRIVILEGED :
+			// the service is not privileged
+			break;
+		case BOOTSTRAP_UNKNOWN_SERVICE :
+			// service not currently registered, try again later
+			break;
+		default :
+#ifdef	DEBUG
+			SCLog(_sc_verbose, LOG_DEBUG,
+			      CFSTR("SCNetworkConnection bootstrap_look_up() failed: status=%s"),
+			      bootstrap_strerror(*status));
+#endif	// DEBUG
+			break;
+	}
+
+	return MACH_PORT_NULL;
+}
+
+
 static mach_port_t
 __SCNetworkConnectionSessionPort(SCNetworkConnectionPrivateRef connectionPrivate)
 {
-	void		*data;
-	CFIndex		dataLen;
-	CFDataRef	dataRef			= NULL;
-	int		error			= kSCStatusFailed;
-	mach_port_t	notify_port		= MACH_PORT_NULL;
-	mach_port_t	oldNotify		= MACH_PORT_NULL;
-	mach_port_t	server			= MACH_PORT_NULL;
-	kern_return_t	status;
-	mach_port_t	unpriv_bootstrap_port	= MACH_PORT_NULL;
+	void		*data		= NULL;
+	CFIndex		dataLen		= 0;
+	CFDataRef	dataRef		= NULL;
+	mach_port_t	notify_port	= MACH_PORT_NULL;
+	mach_port_t	oldNotify	= MACH_PORT_NULL;
+	int		retry		= 0;
+	int		sc_status	= kSCStatusFailed;
+	mach_port_t	server		= scnc_server;
+	kern_return_t	status		= KERN_SUCCESS;
+	mach_port_t	au_session	= MACH_PORT_NULL;
 
 	if (connectionPrivate->session_port != MACH_PORT_NULL) {
 		return connectionPrivate->session_port;
 	}
 
-	pthread_mutex_lock(&connectionPrivate->lock);
-
-	if (bootstrap_look_up(bootstrap_port, PPPCONTROLLER_SERVER, &server) != BOOTSTRAP_SUCCESS) {
-		SCLog(_sc_verbose, LOG_ERR, CFSTR("PPP Controller not found"));
-		goto done;
-	}
-
 	if (!_SCSerializeString(SCNetworkServiceGetServiceID(connectionPrivate->service), &dataRef, &data, &dataLen)) {
 		goto done;
 	}
 
-	status = bootstrap_unprivileged(bootstrap_port, &unpriv_bootstrap_port);
-	if (status != BOOTSTRAP_SUCCESS) {
-		goto done;
+	if (connectionPrivate->notify_port != NULL) {
+		mach_port_t	mp	= CFMachPortGetPort(connectionPrivate->notify_port);
+
+		__MACH_PORT_DEBUG(TRUE, "*** __SCNetworkConnectionReconnectNotifications mp", mp);
+		CFMachPortInvalidate(connectionPrivate->notify_port);
+		CFRelease(connectionPrivate->notify_port);
+		connectionPrivate->notify_port = NULL;
+		mach_port_mod_refs(mach_task_self(), mp, MACH_PORT_RIGHT_RECEIVE, -1);
 	}
 
-	if (connectionPrivate->rlsFunction != NULL) {
-		/* allocate port (for server response) */
-		status = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &notify_port);
-		if (status != KERN_SUCCESS) {
-			goto done;
-		}
+	au_session = audit_session_self();
 
-		status = mach_port_insert_right(mach_task_self(),
-						notify_port,
-						notify_port,
-						MACH_MSG_TYPE_MAKE_SEND);
-		if (status != KERN_SUCCESS) {
-			/*
-			 * We can't insert a send right into our own port!  This should
-			 * only happen if someone stomped on OUR port (so let's leave
-			 * the port alone).
-			 */
-			SCLog(TRUE, LOG_ERR, CFSTR("__SCNetworkConnectionSessionPort mach_port_insert_right(): %s"), mach_error_string(status));
-			goto done;
-		}
+	// open a new session with the server
+	while (TRUE) {
+		if ((connectionPrivate->rlsFunction != NULL) && (notify_port == MACH_PORT_NULL)) {
+			// allocate port (for server response)
+			status = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &notify_port);
+			if (status != KERN_SUCCESS) {
+				SCLog(TRUE, LOG_ERR, CFSTR("__SCNetworkConnectionSessionPort mach_port_allocate(): %s"), mach_error_string(status));
+				sc_status = status;
+				goto done;
+			}
 
-		/* request a notification when/if the server dies */
-		status = mach_port_request_notification(mach_task_self(),
+			// add send right (passed to the server)
+			status = mach_port_insert_right(mach_task_self(),
 							notify_port,
-							MACH_NOTIFY_NO_SENDERS,
-							1,
 							notify_port,
-							MACH_MSG_TYPE_MAKE_SEND_ONCE,
-							&oldNotify);
-		if (status != KERN_SUCCESS) {
-			goto done;
+							MACH_MSG_TYPE_MAKE_SEND);
+			if (status != KERN_SUCCESS) {
+				SCLog(TRUE, LOG_ERR, CFSTR("__SCNetworkConnectionSessionPort mach_port_insert_right(): %s"), mach_error_string(status));
+				mach_port_mod_refs(mach_task_self(), notify_port, MACH_PORT_RIGHT_RECEIVE, -1);
+				sc_status = status;
+				goto done;
+			}
 		}
 
-		if (oldNotify != MACH_PORT_NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("__SCNetworkConnectionSessionPort(): oldNotify != MACH_PORT_NULL"));
+		if (server != MACH_PORT_NULL) {
+			status = pppcontroller_attach(server,
+						      data,
+						      dataLen,
+						      bootstrap_port,
+						      notify_port,
+						      au_session,
+						      &connectionPrivate->session_port,
+						      &sc_status);
+			if (status == KERN_SUCCESS) {
+				if (sc_status != kSCStatusOK) {
+					SCLog(TRUE, LOG_DEBUG,
+					      CFSTR("__SCNetworkConnectionSessionPort : attach w/error, sc_status=%s%s"),
+					      SCErrorString(sc_status),
+					      (connectionPrivate->session_port != MACH_PORT_NULL) ? ", w/session_port!=MACH_PORT_NULL" : "");
+
+					if (connectionPrivate->session_port != MACH_PORT_NULL) {
+						__MACH_PORT_DEBUG(TRUE,
+								  "*** __SCNetworkConnectionSessionPort session_port (attach w/error, cleanup)",
+								  connectionPrivate->session_port);
+						mach_port_deallocate(mach_task_self(), connectionPrivate->session_port);
+						connectionPrivate->session_port = MACH_PORT_NULL;
+					}
+
+					if (notify_port != MACH_PORT_NULL) {
+						__MACH_PORT_DEBUG(TRUE,
+								  "*** __SCNetworkConnectionSessionPort notify_port (attach w/error, cleanup)",
+								  notify_port);
+						(void) mach_port_mod_refs(mach_task_self(), notify_port, MACH_PORT_RIGHT_RECEIVE, -1);
+						notify_port = MACH_PORT_NULL;
+					}
+				}
+				break;
+			}
+
+			// our [cached] server port is not valid
+			SCLog(TRUE, LOG_DEBUG, CFSTR("__SCNetworkConnectionSessionPort : !attach: %s"), SCErrorString(status));
+			if (status == MACH_SEND_INVALID_DEST) {
+				// the server is not yet available
+				__MACH_PORT_DEBUG(TRUE, "*** __SCNetworkConnectionSessionPort notify_port (!dest)", notify_port);
+			} else if (status == MIG_SERVER_DIED) {
+				__MACH_PORT_DEBUG(TRUE, "*** __SCNetworkConnectionSessionPort notify_port (!mig)", notify_port);
+				// the server we were using is gone and we've lost our send right
+				mach_port_mod_refs(mach_task_self(), notify_port, MACH_PORT_RIGHT_RECEIVE, -1);
+				notify_port = MACH_PORT_NULL;
+			} else {
+				// if we got an unexpected error, don't retry
+				sc_status = status;
+				break;
+			}
 		}
 
-		__MACH_PORT_DEBUG(TRUE, "*** __SCNetworkConnectionSessionPort notify_port (before)", notify_port);
-	}
+		pthread_mutex_lock(&scnc_lock);
+		if (scnc_server != MACH_PORT_NULL) {
+			if (server == scnc_server) {
+				// if the server we tried returned the error
+				(void)mach_port_deallocate(mach_task_self(), scnc_server);
+				scnc_server = __SCNetworkConnectionServerPort(&sc_status);
+			} else {
+				// another thread has refreshed the server port
+			}
+		} else {
+			scnc_server = __SCNetworkConnectionServerPort(&sc_status);
+		}
+		server = scnc_server;
+		pthread_mutex_unlock(&scnc_lock);
+
+		if (server == MACH_PORT_NULL) {
+			// if server not available
+			if (sc_status == BOOTSTRAP_UNKNOWN_SERVICE) {
+				// if first retry attempt, wait for SCDynamicStore server
+				if (retry == 0) {
+					SCDynamicStoreRef	store;
+
+					store = SCDynamicStoreCreate(NULL,
+								     CFSTR("SCNetworkConnection connect"),
+								     NULL,
+								     NULL);
+					if (store != NULL) {
+						CFRelease(store);
+					}
+				}
 
-	status = pppcontroller_attach(server, data, dataLen, unpriv_bootstrap_port, notify_port,
-				      &connectionPrivate->session_port, &error);
-	if (status != KERN_SUCCESS) {
-		SCLog(TRUE, LOG_DEBUG, CFSTR("__SCNetworkConnectionSessionPort : pppcontroller_attach failed (status=0x%x)"), status);
-		if ((notify_port != MACH_PORT_NULL) && (status == MACH_SEND_INVALID_DEST)) {
-			(void) mach_port_destroy(mach_task_self(), notify_port);
-			notify_port = MACH_PORT_NULL;
+				// wait up to 2.5 seconds for the [SCNetworkConnection] server
+				// to startup
+				if ((retry += 50) < 2500) {
+					usleep(50 * 1000);	// sleep 50ms between attempts
+					continue;
+				}
+			}
+			break;
 		}
-		error = kSCStatusFailed;
-		goto done;
 	}
 
-	__MACH_PORT_DEBUG(connectionPrivate->session_port != MACH_PORT_NULL,
-			  "*** __SCNetworkConnectionSessionPort session_port",
-			  connectionPrivate->session_port);
-	__MACH_PORT_DEBUG(notify_port != MACH_PORT_NULL,
-			  "*** __SCNetworkConnectionSessionPort notify_port",
-			  notify_port);
-
 	if (notify_port != MACH_PORT_NULL) {
-		CFMachPortContext	context	= { 0
-						  , (void *)connectionPrivate
-						  , NULL
-						  , NULL
-						  , pppMPCopyDescription
-		};
+		if (connectionPrivate->session_port != MACH_PORT_NULL) {
+			CFMachPortContext	context	= { 0
+							  , (void *)connectionPrivate
+							  , NULL
+							  , NULL
+							  , pppMPCopyDescription
+			};
+
+			// request a notification when/if the server dies
+			status = mach_port_request_notification(mach_task_self(),
+								notify_port,
+								MACH_NOTIFY_NO_SENDERS,
+								1,
+								notify_port,
+								MACH_MSG_TYPE_MAKE_SEND_ONCE,
+								&oldNotify);
+			if (status != KERN_SUCCESS) {
+				SCLog(TRUE, LOG_ERR, CFSTR("__SCNetworkConnectionSessionPort mach_port_request_notification(): %s"), mach_error_string(status));
+				mach_port_mod_refs(mach_task_self(), notify_port, MACH_PORT_RIGHT_RECEIVE, -1);
+				sc_status = status;
+				goto done;
+			}
+
+			if (oldNotify != MACH_PORT_NULL) {
+				SCLog(TRUE, LOG_ERR, CFSTR("__SCNetworkConnectionSessionPort(): oldNotify != MACH_PORT_NULL"));
+			}
 
-		connectionPrivate->notify_port = CFMachPortCreateWithPort(NULL, notify_port, __SCNetworkConnectionCallBack, &context, NULL);
+			// create CFMachPort for SCNetworkConnection notification callback
+			connectionPrivate->notify_port = _SC_CFMachPortCreateWithPort("SCNetworkConnection",
+										      notify_port,
+										      __SCNetworkConnectionCallBack,
+										      &context);
+
+			// we need to try a bit harder to acquire the initial status
+			connectionPrivate->haveStatus = FALSE;
+		} else {
+			// with no server port, release the notification port we allocated
+			__MACH_PORT_DEBUG(TRUE,
+					  "*** __SCNetworkConnectionSessionPort notify_port (!server)",
+					  notify_port);
+			(void) mach_port_mod_refs  (mach_task_self(), notify_port, MACH_PORT_RIGHT_RECEIVE, -1);
+			(void) mach_port_deallocate(mach_task_self(), notify_port);
+			notify_port = MACH_PORT_NULL;
+		}
 	}
 
     done :
 
+	// clean up
+	if (au_session != MACH_PORT_NULL) {
+		(void)mach_port_deallocate(mach_task_self(), au_session);
+	}
+
 	if (dataRef != NULL)	CFRelease(dataRef);
 
-	if (unpriv_bootstrap_port != MACH_PORT_NULL) {
-		mach_port_deallocate(mach_task_self(), unpriv_bootstrap_port);
+	switch (sc_status) {
+		case kSCStatusOK :
+			__MACH_PORT_DEBUG(connectionPrivate->session_port != MACH_PORT_NULL,
+					  "*** __SCNetworkConnectionSessionPort session_port",
+					  connectionPrivate->session_port);
+			__MACH_PORT_DEBUG(notify_port != MACH_PORT_NULL,
+					  "*** __SCNetworkConnectionSessionPort notify_port",
+					  notify_port);
+			break;
+		case BOOTSTRAP_UNKNOWN_SERVICE :
+			SCLog(TRUE,
+			      (status == KERN_SUCCESS) ? LOG_DEBUG : LOG_ERR,
+			      CFSTR("PPPController not available"));
+			break;
+		default :
+			SCLog(TRUE,
+			      (status == KERN_SUCCESS) ? LOG_DEBUG : LOG_ERR,
+			      CFSTR("__SCNetworkConnectionSessionPort pppcontroller_attach(): %s"),
+			      SCErrorString(sc_status));
+			break;
 	}
 
-	if (error != kSCStatusOK) {
-		if (connectionPrivate->session_port != MACH_PORT_NULL) {
-			__MACH_PORT_DEBUG(TRUE,
-					  "*** __SCNetworkConnectionSessionPort attach failed: session_port",
-					  connectionPrivate->session_port);
-			mach_port_deallocate(mach_task_self(), connectionPrivate->session_port);
-			connectionPrivate->session_port = MACH_PORT_NULL;
-		}
-		if (connectionPrivate->notify_port != NULL) {
-			mach_port_t	port = CFMachPortGetPort(connectionPrivate->notify_port);
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+	}
 
-			CFMachPortInvalidate(connectionPrivate->notify_port);
-			CFRelease(connectionPrivate->notify_port);
-			connectionPrivate->notify_port = NULL;
-			__MACH_PORT_DEBUG(TRUE, "*** __SCNetworkConnectionSessionPort attach failed: notify_port", port);
-			mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE, -1);
+	return connectionPrivate->session_port;
+}
+
+
+static Boolean
+__SCNetworkConnectionReconnect(SCNetworkConnectionRef connection)
+{
+	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
+	mach_port_t			port;
+
+	port = __SCNetworkConnectionSessionPort(connectionPrivate);
+	return (port != MACH_PORT_NULL);
+}
+
+
+static Boolean
+__SCNetworkConnectionReconnectNotifications(SCNetworkConnectionRef connection)
+{
+	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
+	dispatch_queue_t		dispatchQueue		= NULL;
+	Boolean				ok			= TRUE;
+	CFArrayRef			rlList			= NULL;
+
+	// Before we fully tearing down our [old] notifications, make sure
+	// we have retained any information that is needed to re-register the
+	// [new] notifications.
+
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+	if (connectionPrivate->rlList != NULL) {
+		rlList = CFArrayCreateCopy(NULL, connectionPrivate->rlList);
+	}
+	if (connectionPrivate->dispatchQueue != NULL) {
+		dispatchQueue = connectionPrivate->dispatchQueue;
+		dispatch_retain(dispatchQueue);
+	}
+
+	// cancel [old] notifications
+	if (connectionPrivate->rlList != NULL) {
+		CFRelease(connectionPrivate->rlList);
+		connectionPrivate->rlList = NULL;
+	}
+	if (connectionPrivate->rls != NULL) {
+		CFRunLoopSourceInvalidate(connectionPrivate->rls);
+		CFRelease(connectionPrivate->rls);
+		connectionPrivate->rls = NULL;
+	}
+	if (connectionPrivate->callbackSource != NULL) {
+		dispatch_source_cancel(connectionPrivate->callbackSource);
+		if (connectionPrivate->callbackQueue != dispatch_get_current_queue()) {
+			// ensure the cancellation has completed
+			dispatch_sync(connectionPrivate->callbackQueue, ^{});
 		}
-		_SCErrorSet(error);
+		dispatch_release(connectionPrivate->callbackSource);
+		connectionPrivate->callbackSource = NULL;
 	}
+	if (connectionPrivate->callbackQueue != NULL) {
+		dispatch_release(connectionPrivate->callbackQueue);
+		connectionPrivate->callbackQueue = NULL;
+	}
+	if (connectionPrivate->dispatchQueue != NULL) {
+		dispatch_release(connectionPrivate->dispatchQueue);
+		connectionPrivate->dispatchQueue = NULL;
+	}
+
+	connectionPrivate->scheduled = FALSE;
 
 	pthread_mutex_unlock(&connectionPrivate->lock);
 
-	return connectionPrivate->session_port;
+	// re-schedule
+	if (rlList != NULL) {
+		CFIndex	i;
+		CFIndex	n;
+
+		n = CFArrayGetCount(rlList);
+		for (i = 0; i < n; i += 3) {
+			CFRunLoopRef	rl	= (CFRunLoopRef)CFArrayGetValueAtIndex(rlList, i+1);
+			CFStringRef	rlMode	= (CFStringRef) CFArrayGetValueAtIndex(rlList, i+2);
+
+			ok = SCNetworkConnectionScheduleWithRunLoop(connection, rl, rlMode);
+			if (!ok) {
+				SCLog((SCError() != BOOTSTRAP_UNKNOWN_SERVICE),
+				      LOG_ERR,
+				      CFSTR("__SCNetworkConnectionReconnectNotifications: SCNetworkConnectionScheduleWithRunLoop() failed"));
+				goto done;
+			}
+		}
+	} else if (dispatchQueue != NULL) {
+		ok = SCNetworkConnectionSetDispatchQueue(connection, dispatchQueue);
+		if (!ok) {
+			SCLog((SCError() != BOOTSTRAP_UNKNOWN_SERVICE),
+			      LOG_ERR,
+			      CFSTR("__SCNetworkConnectionReconnectNotifications: SCNetworkConnectionSetDispatchQueue() failed"));
+			goto done;
+		}
+	} else {
+		ok = FALSE;
+	}
+
+    done :
+
+	// cleanup
+	if (rlList != NULL) {
+		CFRelease(rlList);
+	}
+	if (dispatchQueue != NULL) {
+		dispatch_release(dispatchQueue);
+	}
+
+	if (!ok) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SCNetworkConnection server %s, notification not restored"),
+		      (SCError() == BOOTSTRAP_UNKNOWN_SERVICE) ? "shutdown" : "failed");
+	}
+
+	return ok;
+}
+
+
+static Boolean
+__SCNetworkConnectionNeedsRetry(SCNetworkConnectionRef	connection,
+				const char		*error_label,
+				kern_return_t		status,
+				int			*sc_status)
+{
+	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
+
+	if (status == KERN_SUCCESS) {
+		return FALSE;
+	}
+
+	if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+		// the server's gone and our session port's dead, remove the dead name right
+		(void) mach_port_deallocate(mach_task_self(), connectionPrivate->session_port);
+	} else {
+		// we got an unexpected error, leave the [session] port alone
+		SCLog(TRUE, LOG_ERR, CFSTR("%s: %s"), error_label, mach_error_string(status));
+	}
+	connectionPrivate->session_port = MACH_PORT_NULL;
+	if ((status == MACH_SEND_INVALID_DEST) || (status == MIG_SERVER_DIED)) {
+		if (__SCNetworkConnectionReconnect(connection)) {
+			return TRUE;
+		}
+	}
+	*sc_status = status;
+
+	return FALSE;
 }
 
 
@@ -506,6 +828,7 @@ SCNetworkConnectionCopyAvailableServices(SCNetworkSetRef set)
 
 				interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
 				if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPP) ||
+				    CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN) ||
 				    CFEqual(interfaceType, kSCNetworkInterfaceTypeIPSec)) {
 					CFArrayAppendValue(available, service);
 				}
@@ -587,8 +910,8 @@ SCNetworkConnectionCopyStatistics(SCNetworkConnectionRef connection)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
 	xmlDataOut_t			data			= NULL;
-	mach_msg_type_number_t		datalen;
-	int				error			= kSCStatusFailed;
+	mach_msg_type_number_t		datalen			= 0;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	CFPropertyListRef		statistics		= NULL;
 	kern_return_t			status;
@@ -598,34 +921,44 @@ SCNetworkConnectionCopyStatistics(SCNetworkConnectionRef connection)
 		return NULL;
 	}
 
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
 	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
 	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return NULL;
+		goto done;
 	}
 
-	status = pppcontroller_copystatistics(session_port, &data, &datalen, &error);
-	if (status != KERN_SUCCESS) {
-		goto fail;
+	status = pppcontroller_copystatistics(session_port, &data, &datalen, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionCopyStatistics()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
-	if (error != kSCStatusOK) {
-		goto fail;
+	if (data != NULL) {
+		if (!_SCUnserialize(&statistics, NULL, data, datalen)) {
+			if (sc_status != kSCStatusOK) sc_status = SCError();
+		}
+		if ((sc_status == kSCStatusOK) && !isA_CFDictionary(statistics)) {
+			sc_status = kSCStatusFailed;
+		}
 	}
 
-	if ((data == NULL) ||
-	    !_SCUnserialize(&statistics, NULL, data, datalen) ||
-	    !isA_CFDictionary(statistics)) {
-		goto fail;
+	if (sc_status != kSCStatusOK) {
+		if (statistics != NULL)	{
+			CFRelease(statistics);
+			statistics = NULL;
+		}
+		_SCErrorSet(sc_status);
 	}
 
-	return statistics;
-
-    fail:
+    done :
 
-	if (statistics)	CFRelease(statistics);
-	_SCErrorSet(error);
-	return NULL;
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return statistics;
 }
 
 
@@ -647,8 +980,9 @@ SCNetworkConnectionStatus
 SCNetworkConnectionGetStatus(SCNetworkConnectionRef connection)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
-	int				error			= kSCStatusFailed;
-	SCNetworkConnectionStatus	scstatus;
+	SCNetworkConnectionStatus	nc_status		= kSCNetworkConnectionInvalid;
+	int				retry			= 0;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
@@ -657,24 +991,43 @@ SCNetworkConnectionGetStatus(SCNetworkConnectionRef connection)
 		return kSCNetworkConnectionInvalid;
 	}
 
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
 	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
 	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return kSCNetworkConnectionInvalid;
+		nc_status = kSCNetworkConnectionInvalid;
+		goto done;
 	}
 
-	status = pppcontroller_getstatus(session_port, &scstatus, &error);
-	if (status != KERN_SUCCESS) {
-		_SCErrorSet(kSCStatusFailed);
-		return kSCNetworkConnectionInvalid;
+	status = pppcontroller_getstatus(session_port, &nc_status, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionGetStatus()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
-	if (error != kSCStatusOK) {
-		_SCErrorSet(error);
-		return kSCNetworkConnectionInvalid;
+	// wait up to 250 ms for the network service to become available
+	if (!connectionPrivate->haveStatus &&
+	    (sc_status == kSCStatusConnectionNoService) &&
+	    ((retry += 10) < 250)) {
+		usleep(10 * 1000);	// sleep 10ms between attempts
+		goto retry;
+	}
+
+	if (sc_status == kSCStatusOK) {
+		connectionPrivate->haveStatus = TRUE;
+	} else {
+		_SCErrorSet(sc_status);
+		nc_status = kSCNetworkConnectionInvalid;
 	}
 
-	return scstatus;
+    done :
+
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return nc_status;
 }
 
 
@@ -683,9 +1036,10 @@ SCNetworkConnectionCopyExtendedStatus(SCNetworkConnectionRef connection)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
 	xmlDataOut_t			data			= NULL;
-	mach_msg_type_number_t		datalen;
-	int				error			= kSCStatusFailed;
+	mach_msg_type_number_t		datalen			= 0;
 	CFPropertyListRef		extstatus		= NULL;
+	int				retry			= 0;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
@@ -694,34 +1048,54 @@ SCNetworkConnectionCopyExtendedStatus(SCNetworkConnectionRef connection)
 		return NULL;
 	}
 
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
 	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
 	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return NULL;
+		goto done;
 	}
 
-	status = pppcontroller_copyextendedstatus(session_port, &data, &datalen, &error);
-	if (status != KERN_SUCCESS) {
-		goto fail;
+	status = pppcontroller_copyextendedstatus(session_port, &data, &datalen, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionCopyExtendedStatus()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
-	if (error != kSCStatusOK) {
-		goto fail;
+	if (data != NULL) {
+		if (!_SCUnserialize(&extstatus, NULL, data, datalen)) {
+			if (sc_status != kSCStatusOK) sc_status = SCError();
+		}
+		if ((sc_status == kSCStatusOK) && !isA_CFDictionary(extstatus)) {
+			sc_status = kSCStatusFailed;
+		}
 	}
 
-	if ((data == NULL) ||
-	    !_SCUnserialize(&extstatus, NULL, data, datalen) ||
-	    !isA_CFDictionary(extstatus)) {
-		goto fail;
+	// wait up to 250 ms for the network service to become available
+	if (!connectionPrivate->haveStatus &&
+	    (sc_status == kSCStatusConnectionNoService) &&
+	    ((retry += 10) < 250)) {
+		usleep(10 * 1000);	// sleep 10ms between attempts
+		goto retry;
 	}
 
-	return extstatus;
+	if (sc_status == kSCStatusOK) {
+		connectionPrivate->haveStatus = TRUE;
+	} else {
+		if (extstatus != NULL)	{
+			CFRelease(extstatus);
+			extstatus = NULL;
+		}
+		_SCErrorSet(sc_status);
+	}
 
-    fail:
+    done :
 
-	if (extstatus)	CFRelease(extstatus);
-	_SCErrorSet(error);
-	return NULL;
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return extstatus;
 }
 
 
@@ -734,7 +1108,8 @@ SCNetworkConnectionStart(SCNetworkConnectionRef	connection,
 	CFDataRef			dataref			= NULL;
 	void				*data			= NULL;
 	CFIndex				datalen			= 0;
-	int				error			= kSCStatusFailed;
+	Boolean				ok			= FALSE;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
@@ -748,12 +1123,6 @@ SCNetworkConnectionStart(SCNetworkConnectionRef	connection,
 		return FALSE;
 	}
 
-	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
-	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
-	}
-
 	if (debug > 0) {
 		CFMutableDictionaryRef	mdict = NULL;
 
@@ -809,35 +1178,44 @@ SCNetworkConnectionStart(SCNetworkConnectionRef	connection,
 	}
 
 	if (userOptions && !_SCSerialize(userOptions, &dataref, &data, &datalen)) {
-		goto fail;
+		return FALSE;
 	}
 
-	status = pppcontroller_start(session_port, data, datalen, linger, &error);
-	if (status != KERN_SUCCESS) {
-		goto fail;
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
+	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
+	if (session_port == MACH_PORT_NULL) {
+		if (dataref)	CFRelease(dataref);
+		goto done;
 	}
 
-	if (dataref) {
-		CFRelease(dataref);
-		dataref = NULL;
+	status = pppcontroller_start(session_port, data, datalen, linger, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionStart()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
+	if (dataref)	CFRelease(dataref);
+
 	if (debug > 0) {
-		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionStart (0x%x), return: %d"), connectionPrivate, error);
+		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionStart (0x%x), return: %d"), connectionPrivate, sc_status);
 	}
 
-	if (error != kSCStatusOK) {
-		goto fail;
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+		goto done;
 	}
 
 	/* connection is now started */
-	return TRUE;
-
-    fail:
+	ok = TRUE;
 
-	if (dataref)	CFRelease(dataref);
-	_SCErrorSet(error);
-	return FALSE;
+    done:
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return ok;
 }
 
 
@@ -846,7 +1224,8 @@ SCNetworkConnectionStop(SCNetworkConnectionRef	connection,
 			Boolean			forceDisconnect)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
-	int				error			= kSCStatusFailed;
+	Boolean				ok			= FALSE;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
@@ -855,36 +1234,43 @@ SCNetworkConnectionStop(SCNetworkConnectionRef	connection,
 		return FALSE;
 	}
 
-	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
-	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
-	}
-
 	if (debug > 0) {
 		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionStop (0x%x)"), connectionPrivate);
 	}
 
-	status = pppcontroller_stop(session_port, forceDisconnect, &error);
-	if (status != KERN_SUCCESS) {
-		goto fail;
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
+	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
+	if (session_port == MACH_PORT_NULL) {
+		goto done;
+	}
+
+	status = pppcontroller_stop(session_port, forceDisconnect, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionStop()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
 	if (debug > 0) {
-		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionStop (0x%x), return: %d"), connectionPrivate, error);
+		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionStop (0x%x), return: %d"), connectionPrivate, sc_status);
 	}
 
-	if (error != kSCStatusOK) {
-		goto fail;
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+		goto done;
 	}
 
 	/* connection is now disconnecting */
-	return TRUE;
+	ok = TRUE;
 
-    fail:
+    done :
 
-	_SCErrorSet(error);
-	return FALSE;
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return ok;
 }
 
 
@@ -892,7 +1278,8 @@ Boolean
 SCNetworkConnectionSuspend(SCNetworkConnectionRef connection)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
-	int				error			= kSCStatusFailed;
+	Boolean				ok			= FALSE;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
@@ -901,36 +1288,43 @@ SCNetworkConnectionSuspend(SCNetworkConnectionRef connection)
 		return FALSE;
 	}
 
-	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
-	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
-	}
-
 	if (debug > 0) {
 		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionSuspend (0x%x)"), connectionPrivate);
 	}
 
-	status = pppcontroller_suspend(session_port, &error);
-	if (status != KERN_SUCCESS) {
-		goto fail;
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
+	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
+	if (session_port == MACH_PORT_NULL) {
+		goto done;
+	}
+
+	status = pppcontroller_suspend(session_port, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionSuspend()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
 	if (debug > 0) {
-		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionSuspend (0x%x), return: %d"), connectionPrivate, error);
+		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionSuspend (0x%x), return: %d"), connectionPrivate, sc_status);
 	}
 
-	if (error != kSCStatusOK) {
-		goto fail;
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+		goto done;
 	}
 
 	/* connection is now suspended */
-	return TRUE;
+	ok = TRUE;
 
-    fail:
+    done :
 
-	_SCErrorSet(error);
-	return FALSE;
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return ok;
 }
 
 
@@ -938,7 +1332,8 @@ Boolean
 SCNetworkConnectionResume(SCNetworkConnectionRef connection)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
-	int				error			= kSCStatusFailed;
+	Boolean				ok			= FALSE;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
@@ -947,36 +1342,43 @@ SCNetworkConnectionResume(SCNetworkConnectionRef connection)
 		return FALSE;
 	}
 
-	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
-	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
-	}
-
 	if (debug > 0) {
 		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionResume (0x%x)"), connectionPrivate);
 	}
 
-	status = pppcontroller_resume(session_port, &error);
-	if (status != KERN_SUCCESS) {
-		goto fail;
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
+	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
+	if (session_port == MACH_PORT_NULL) {
+		goto done;
+	}
+
+	status = pppcontroller_resume(session_port, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionResume()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
 	if (debug > 0) {
-		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionResume (0x%x), return: %d"), connectionPrivate, error);
+		SCLog(TRUE, LOG_DEBUG, CFSTR("SCNetworkConnectionResume (0x%x), return: %d"), connectionPrivate, sc_status);
 	}
 
-	if (error != kSCStatusOK) {
-		goto fail;
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+		goto done;
 	}
 
 	/* connection is now resume */
-	return TRUE;
+	ok = TRUE;
 
-    fail:
+    done :
 
-	_SCErrorSet(error);
-	return FALSE;
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return ok;
 }
 
 
@@ -985,8 +1387,8 @@ SCNetworkConnectionCopyUserOptions(SCNetworkConnectionRef connection)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
 	xmlDataOut_t			data			= NULL;
-	mach_msg_type_number_t		datalen;
-	int				error			= kSCStatusFailed;
+	mach_msg_type_number_t		datalen			= 0;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 	CFPropertyListRef 		userOptions		= NULL;
@@ -996,106 +1398,126 @@ SCNetworkConnectionCopyUserOptions(SCNetworkConnectionRef connection)
 		return NULL;
 	}
 
+	pthread_mutex_lock(&connectionPrivate->lock);
+
+    retry :
+
 	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
 	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return NULL;
+		goto done;
 	}
 
-	status = pppcontroller_copyuseroptions(session_port, &data, &datalen, &error);
-	if (status != KERN_SUCCESS) {
-		goto fail;
+	status = pppcontroller_copyuseroptions(session_port, &data, &datalen, &sc_status);
+	if (__SCNetworkConnectionNeedsRetry(connection,
+					    "SCNetworkConnectionCopyUserOptions()",
+					    status,
+					    &sc_status)) {
+		goto retry;
 	}
 
-	if (error != kSCStatusOK) {
-		goto fail;
+	if (data != NULL) {
+		if (!_SCUnserialize(&userOptions, NULL, data, datalen)) {
+			if (sc_status != kSCStatusOK) sc_status = SCError();
+		}
+		if ((sc_status == kSCStatusOK) && (userOptions != NULL) && !isA_CFDictionary(userOptions)) {
+			sc_status = kSCStatusFailed;
+		}
 	}
 
-	// no data were used, return an empty dictionary
-	if (data == NULL) {
-		CFDictionaryRef dict;
-
-		dict = CFDictionaryCreateMutable(NULL, 0, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
-		if (dict == NULL) {
-			_SCErrorSet(kSCStatusFailed); // XXX
+	if (sc_status == kSCStatusOK) {
+		if (userOptions == NULL) {
+			// if no user options, return an empty dictionary
+			userOptions = CFDictionaryCreate(NULL,
+							 NULL,
+							 NULL,
+							 0,
+							 &kCFTypeDictionaryKeyCallBacks,
+							 &kCFTypeDictionaryValueCallBacks);
+		}
+	} else {
+		if (userOptions) {
+			CFRelease(userOptions);
+			userOptions = NULL;
 		}
-		return dict;
+		_SCErrorSet(sc_status);
 	}
 
-	if (!_SCUnserialize(&userOptions, NULL, data, datalen) ||
-	    !isA_CFDictionary(userOptions)) {
-		goto fail;
-	}
+    done :
 
+	pthread_mutex_unlock(&connectionPrivate->lock);
 	return userOptions;
-
-    fail:
-
-	if (userOptions)	CFRelease(userOptions);
-	_SCErrorSet(error);
-	return NULL;
 }
 
 
-#if	!TARGET_OS_IPHONE
 static boolean_t
 SCNetworkConnectionNotifyMIGCallback(mach_msg_header_t *message, mach_msg_header_t *reply)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate = dispatch_get_context(dispatch_get_current_queue());
 
 	if (connectionPrivate != NULL) {
+		mach_msg_empty_rcv_t	*buf	= malloc(sizeof(*buf));
+
+		bcopy(message, buf, sizeof(*buf));
 		CFRetain(connectionPrivate);
 		dispatch_async(connectionPrivate->dispatchQueue, ^{
-			__SCNetworkConnectionCallBack(connectionPrivate->notify_port, message, 4096, connectionPrivate);
+			__SCNetworkConnectionCallBack(connectionPrivate->notify_port,
+						      buf,
+						      sizeof(*buf),
+						      connectionPrivate);
 			CFRelease(connectionPrivate);
+			free(buf);
 		});
 	}
 	reply->msgh_remote_port = MACH_PORT_NULL;
 	return false;
 }
-#endif	// !TARGET_OS_IPHONE
 
 
 static Boolean
 __SCNetworkConnectionScheduleWithRunLoop(SCNetworkConnectionRef	connection,
 					 CFRunLoopRef		runLoop,
 					 CFStringRef		runLoopMode,
-#if	!TARGET_OS_IPHONE
-					 dispatch_queue_t	queue
-#else	// !TARGET_OS_IPHONE
-					 void			*queue
-#endif	// !TARGET_OS_IPHONE
-					 )
+					 dispatch_queue_t	queue)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
-	int				error			= kSCStatusFailed;
+	Boolean				ok			= FALSE;
+	int				sc_status		= kSCStatusFailed;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
+	pthread_mutex_lock(&connectionPrivate->lock);
+
 	if (connectionPrivate->rlsFunction == NULL) {
 		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
+		goto done;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if ((connectionPrivate->dispatchQueue != NULL) ||		// if we are already scheduled on a dispatch queue
 	    ((queue != NULL) && connectionPrivate->scheduled)) {	// if we are already scheduled on a CFRunLoop
 		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
-	}
-#endif	// !TARGET_OS_IPHONE
-
-	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
-	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
+		goto done;
 	}
 
 	if (!connectionPrivate->scheduled) {
-		status = pppcontroller_notification(session_port, 1, &error);
-		if ((status != KERN_SUCCESS) || (error != kSCStatusOK)) {
-			_SCErrorSet(error);
-			return FALSE;
+
+	    retry :
+
+		session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
+		if (session_port == MACH_PORT_NULL) {
+			goto done;
+		}
+
+		status = pppcontroller_notification(session_port, 1, &sc_status);
+		if (__SCNetworkConnectionNeedsRetry(connection,
+						    "__SCNetworkConnectionScheduleWithRunLoop()",
+						    status,
+						    &sc_status)) {
+			goto retry;
+		}
+
+		if (sc_status != kSCStatusOK) {
+			_SCErrorSet(sc_status);
+			goto done;
 		}
 
 		if (runLoop != NULL) {
@@ -1106,14 +1528,15 @@ __SCNetworkConnectionScheduleWithRunLoop(SCNetworkConnectionRef	connection,
 		connectionPrivate->scheduled = TRUE;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (queue != NULL) {
 		mach_port_t	mp;
+		char		qname[256];
 
 		connectionPrivate->dispatchQueue = queue;
 		dispatch_retain(connectionPrivate->dispatchQueue);
 
-		connectionPrivate->callbackQueue = dispatch_queue_create("com.apple.SCNetworkConnection.notifications", NULL);
+		snprintf(qname, sizeof(qname), "com.apple.SCNetworkConnection.%p", connection);
+		connectionPrivate->callbackQueue = dispatch_queue_create(qname, NULL);
 		if (connectionPrivate->callbackQueue == NULL){
 			SCLog(TRUE, LOG_ERR, CFSTR("SCNetworkConnection dispatch_queue_create() failed"));
 			goto fail;
@@ -1132,14 +1555,17 @@ __SCNetworkConnectionScheduleWithRunLoop(SCNetworkConnectionRef	connection,
 			goto fail;
 		}
 		dispatch_source_set_event_handler(connectionPrivate->callbackSource, ^{
+			union MaxMsgSize {
+				mach_msg_empty_rcv_t		normal;
+				mach_no_senders_notification_t	no_senders;
+			};
+
 			dispatch_mig_server(connectionPrivate->callbackSource,
-					    sizeof(mach_msg_header_t),
+					    sizeof(union MaxMsgSize),
 					    SCNetworkConnectionNotifyMIGCallback);
 		});
 		dispatch_resume(connectionPrivate->callbackSource);
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		if (!_SC_isScheduled(NULL, runLoop, runLoopMode, connectionPrivate->rlList)) {
 			/*
 			 * if we do not already have notifications scheduled with
@@ -1151,9 +1577,9 @@ __SCNetworkConnectionScheduleWithRunLoop(SCNetworkConnectionRef	connection,
 		_SC_schedule(connection, runLoop, runLoopMode, connectionPrivate->rlList);
 	}
 
-	return TRUE;
+	ok = TRUE;
+	goto done;
 
-#if	!TARGET_OS_IPHONE
     fail :
 
 	if (connectionPrivate->callbackSource != NULL) {
@@ -1170,8 +1596,11 @@ __SCNetworkConnectionScheduleWithRunLoop(SCNetworkConnectionRef	connection,
 		connectionPrivate->dispatchQueue = NULL;
 	}
 	_SCErrorSet(kSCStatusFailed);
-	return FALSE;
-#endif	// !TARGET_OS_IPHONE
+
+    done :
+
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return ok;
 }
 
 
@@ -1179,39 +1608,33 @@ static Boolean
 __SCNetworkConnectionUnscheduleFromRunLoop(SCNetworkConnectionRef	connection,
 					   CFRunLoopRef			runLoop,
 					   CFStringRef			runLoopMode,
-#if	!TARGET_OS_IPHONE
-					   dispatch_queue_t		queue
-#else	// !TARGET_OS_IPHONE
-					   void				*queue
-#endif	// !TARGET_OS_IPHONE
-					   )
+					   dispatch_queue_t		queue)
 {
 	SCNetworkConnectionPrivateRef	connectionPrivate	= (SCNetworkConnectionPrivateRef)connection;
-	int				error			= kSCStatusFailed;
+	int				sc_status		= kSCStatusFailed;
 	CFIndex				n			= 0;
+	Boolean				ok			= FALSE;
 	mach_port_t			session_port;
 	kern_return_t			status;
 
+	pthread_mutex_lock(&connectionPrivate->lock);
+
 	if ((runLoop != NULL) && !connectionPrivate->scheduled) {			// if we should be scheduled (but are not)
 		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
+		goto done;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (((runLoop == NULL) && (connectionPrivate->dispatchQueue == NULL)) ||	// if we should be scheduled on a dispatch queue (but are not)
 	    ((runLoop != NULL) && (connectionPrivate->dispatchQueue != NULL))) {	// if we should be scheduled on a CFRunLoop (but are scheduled on a dispatch queue)
 		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
+		goto done;
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	session_port = __SCNetworkConnectionSessionPort(connectionPrivate);
 	if (session_port == MACH_PORT_NULL) {
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return FALSE;
+		goto done;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (runLoop == NULL) {
 		dispatch_source_cancel(connectionPrivate->callbackSource);
 		if (connectionPrivate->callbackQueue != dispatch_get_current_queue()) {
@@ -1224,13 +1647,11 @@ __SCNetworkConnectionUnscheduleFromRunLoop(SCNetworkConnectionRef	connection,
 		connectionPrivate->callbackQueue = NULL;
 		dispatch_release(connectionPrivate->dispatchQueue);
 		connectionPrivate->dispatchQueue = NULL;
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		if (!_SC_unschedule(connection, runLoop, runLoopMode, connectionPrivate->rlList, FALSE)) {
 			// if not currently scheduled on this runLoop / runLoopMode
 			_SCErrorSet(kSCStatusFailed);
-			return FALSE;
+			goto done;
 		}
 
 		n = CFArrayGetCount(connectionPrivate->rlList);
@@ -1256,14 +1677,27 @@ __SCNetworkConnectionUnscheduleFromRunLoop(SCNetworkConnectionRef	connection,
 		// if *all* notifications have been unscheduled
 		connectionPrivate->scheduled = FALSE;
 
-		status = pppcontroller_notification(session_port, 0, &error);
-		if ((status != KERN_SUCCESS) || (error != kSCStatusOK)) {
-			_SCErrorSet(error);
-			return FALSE;
+		status = pppcontroller_notification(session_port, 0, &sc_status);
+		if (__SCNetworkConnectionNeedsRetry(connection,
+						    "__SCNetworkConnectionUnscheduleFromRunLoop pppcontroller_notification()",
+						    status,
+						    &sc_status)) {
+			sc_status = kSCStatusOK;
+			status = KERN_SUCCESS;
+		}
+
+		if ((status != KERN_SUCCESS) || (sc_status != kSCStatusOK)) {
+			_SCErrorSet(sc_status);
+			goto done;
 		}
 	}
 
-	return TRUE;
+	ok = TRUE;
+
+    done :
+
+	pthread_mutex_unlock(&connectionPrivate->lock);
+	return ok;
 }
 
 
@@ -1295,7 +1729,6 @@ SCNetworkConnectionUnscheduleFromRunLoop(SCNetworkConnectionRef		connection,
 }
 
 
-#if	!TARGET_OS_IPHONE
 Boolean
 SCNetworkConnectionSetDispatchQueue(SCNetworkConnectionRef	connection,
 				    dispatch_queue_t		queue)
@@ -1315,7 +1748,6 @@ SCNetworkConnectionSetDispatchQueue(SCNetworkConnectionRef	connection,
 
 	return ok;
 }
-#endif	// !TARGET_OS_IPHONE
 
 
 #pragma mark -
@@ -2174,45 +2606,25 @@ addPasswordFromKeychain(SCDynamicStoreRef session, CFStringRef serviceID, CFDict
 static CFArrayRef
 copyKeychainEnumerator(CFStringRef uniqueIdentifier)
 {
-	char			*buf;
-	CFMutableArrayRef	itemArray	= NULL;
+	CFArrayRef		itemArray	= NULL;
+	CFMutableDictionaryRef	query;
 	OSStatus		result;
-	SecKeychainSearchRef	search		= NULL;
-
-	buf = _SC_cfstring_to_cstring(uniqueIdentifier, NULL, 0, kCFStringEncodingUTF8);
-	if (buf != NULL) {
-		// search for unique identifier in "svce" attribute
-		SecKeychainAttribute		attributes[]	= {{ kSecServiceItemAttr,
-								     CFStringGetLength(uniqueIdentifier),
-								     (void *)buf
-								   }};
-
-		SecKeychainAttributeList	attrList	= { sizeof(attributes) / sizeof(*attributes),
-								    attributes };
 
-		result = SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, &attrList, &search);
-		if (result == noErr) {
-			itemArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-
-			while (result == noErr) {
-				SecKeychainItemRef	itemFound	= NULL;
-
-				result = SecKeychainSearchCopyNext(search, &itemFound);
-				if (result != noErr) {
-					break;
-				}
-
-				if (itemFound) {
-					CFArrayAppendValue(itemArray, itemFound);
-					CFRelease(itemFound);
-				}
-			}
-		}
+	query = CFDictionaryCreateMutable(NULL,
+					  0,
+					  &kCFTypeDictionaryKeyCallBacks,
+					  &kCFTypeDictionaryValueCallBacks);
+	CFDictionarySetValue(query, kSecClass      , kSecClassGenericPassword);
+	CFDictionarySetValue(query, kSecAttrService, uniqueIdentifier);
+	CFDictionarySetValue(query, kSecReturnRef  , kCFBooleanTrue);
+	CFDictionarySetValue(query, kSecMatchLimit , kSecMatchLimitAll);
+	result = SecItemCopyMatching(query, (CFTypeRef *)&itemArray);
+	CFRelease(query);
+	if ((result != noErr) && (itemArray != NULL)) {
+		CFRelease(itemArray);
+		itemArray = NULL;
 	}
 
-	if (search)	CFRelease(search);
-	if (buf)	CFAllocatorDeallocate(NULL, buf);
-
 	return itemArray;
 }
 #endif	// !TARGET_OS_IPHONE
diff --git a/SystemConfiguration.fproj/SCNetworkConnection.h b/SystemConfiguration.fproj/SCNetworkConnection.h
index 7282b87..38f89f7 100644
--- a/SystemConfiguration.fproj/SCNetworkConnection.h
+++ b/SystemConfiguration.fproj/SCNetworkConnection.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2006, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2003-2006, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -30,9 +30,7 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <CoreFoundation/CoreFoundation.h>
@@ -218,18 +216,16 @@ typedef void (*SCNetworkConnectionCallBack)	(
 	@discussion A host name that will be used to select the
 		"best" SCNetworkConnection.
  */
-#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000) || TARGET_IPHONE_SIMULATOR
-#define kSCNetworkConnectionSelectionOptionOnDemandHostName	CFSTR("OnDemandHostName")	/* CFString */
-#endif
+#define kSCNetworkConnectionSelectionOptionOnDemandHostName	CFSTR("OnDemandHostName")	// CFString
+												// __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/)
 
 /*!
 	@define kSCNetworkConnectionSelectionOptionOnDemandRetry
 	@discussion A boolean value used to indicate whether a DNS query has
 		already been issued for the specified OnDemand host name.
  */
-#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000) || TARGET_IPHONE_SIMULATOR
-#define kSCNetworkConnectionSelectionOptionOnDemandRetry	CFSTR("OnDemandRetry")		/* CFBoolean */
-#endif
+#define kSCNetworkConnectionSelectionOptionOnDemandRetry	CFSTR("OnDemandRetry")		// CFBoolean
+												// __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/)
 
 __BEGIN_DECLS
 
@@ -238,7 +234,6 @@ __BEGIN_DECLS
 	@discussion Returns the type identifier of all SCNetworkConnection
 		instances.
  */
-CF_EXPORT
 CFTypeID
 SCNetworkConnectionGetTypeID			(void)			__OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/);
 
@@ -551,7 +546,6 @@ SCNetworkConnectionUnscheduleFromRunLoop	(
 						)			__OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/);
 
 
-#if	!TARGET_OS_IPHONE
 /*!
 	 @function SCNetworkConnectionSetDispatchQueue
 	 @discussion Caller provides a dispatch queue on which the callback contained in connection will run.
@@ -566,8 +560,7 @@ Boolean
 SCNetworkConnectionSetDispatchQueue		(
 						 SCNetworkConnectionRef		connection,
 						 dispatch_queue_t		queue
-						 )			__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA);
-#endif	// !TARGET_OS_IPHONE
+						 )			__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0/*SPI*/);
 
 __END_DECLS
 
diff --git a/SystemConfiguration.fproj/SCNetworkConnectionPrivate.c b/SystemConfiguration.fproj/SCNetworkConnectionPrivate.c
index 3d2a7f0..381f753 100644
--- a/SystemConfiguration.fproj/SCNetworkConnectionPrivate.c
+++ b/SystemConfiguration.fproj/SCNetworkConnectionPrivate.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2006-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -201,9 +201,12 @@ logCFPreferencesChange(CFStringRef serviceID, CFArrayRef newPreferences)
 
 	bVal = CFPreferencesCopyAppValue(CFSTR("LOG_SC_CHANGES"), USER_PREFERENCES_APPLICATION_ID);
 	if (bVal != NULL) {
-		if (!isA_CFBoolean(bVal) || !CFBooleanGetValue(bVal)) {
+		Boolean	enabled;
+
+		enabled = isA_CFBoolean(bVal) && CFBooleanGetValue(bVal);
+		CFRelease(bVal);
+		if (!enabled) {
 			// if debugging not enabled
-			CFRelease(bVal);
 			return;
 		}
 	} else {
@@ -268,9 +271,9 @@ logCFPreferencesChange(CFStringRef serviceID, CFArrayRef newPreferences)
 			CFRelease(oldPreferences);
 			return;
 		}
-		data = CFPropertyListCreateXMLData(NULL, oldPreferences);
+		data = CFPropertyListCreateData(NULL, oldPreferences, kCFPropertyListXMLFormat_v1_0, 0, NULL);
 		if (data == NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("logCFPreferencesChange CFPropertyListCreateXMLData() failed"));
+			SCLog(TRUE, LOG_ERR, CFSTR("logCFPreferencesChange CFPropertyListCreateData() failed"));
 			close(fd);
 			CFRelease(oldPreferences);
 			return;
@@ -293,9 +296,9 @@ logCFPreferencesChange(CFStringRef serviceID, CFArrayRef newPreferences)
 			SCLog(TRUE, LOG_ERR, CFSTR("logCFPreferencesChange fopen() failed, error = %s"), SCErrorString(errno));
 			return;
 		}
-		data = CFPropertyListCreateXMLData(NULL, newPreferences);
+		data = CFPropertyListCreateData(NULL, newPreferences, kCFPropertyListXMLFormat_v1_0, 0, NULL);
 		if (data == NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("logCFPreferencesChange CFPropertyListCreateXMLData() failed"));
+			SCLog(TRUE, LOG_ERR, CFSTR("logCFPreferencesChange CFPropertyListCreateData() failed"));
 			close(fd);
 			return;
 		}
@@ -1536,6 +1539,17 @@ checkUserPreferencesPassword(SCUserPreferencesRef		userPreferences,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFStringRef	interfaceType;
+
+			interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
+			if (!CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN)) {
+				_SCErrorSet(kSCStatusInvalidArgument);
+				return FALSE;
+			}
+			break;
+		}
+
 		default :
 			break;
 	}
@@ -1629,6 +1643,29 @@ SCUserPreferencesCheckInterfacePassword(SCUserPreferencesRef		userPreferences,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFDictionaryRef	config;
+			CFStringRef	unique_id;
+
+			// get configuration
+			config = SCUserPreferencesCopyInterfaceConfiguration(userPreferences, interface);
+
+			// get userPreferences ID
+			unique_id = getUserPasswordID(config, userPreferences);
+
+			// check
+			exists = __extract_password(NULL,
+						    config,
+						    kSCPropNetVPNAuthPassword,
+						    kSCPropNetVPNAuthPasswordEncryption,
+						    kSCValNetVPNAuthPasswordEncryptionKeychain,
+						    unique_id,
+						    NULL);
+
+			if (config != NULL)	CFRelease(config);
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return FALSE;
@@ -1723,6 +1760,29 @@ SCUserPreferencesCopyInterfacePassword(SCUserPreferencesRef		userPreferences,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFDictionaryRef	config;
+			CFStringRef	unique_id;
+
+			// get configuration
+			config = SCUserPreferencesCopyInterfaceConfiguration(userPreferences, interface);
+
+			// get userPreferences ID
+			unique_id = getUserPasswordID(config, userPreferences);
+
+			// extract
+			(void) __extract_password(NULL,
+						  config,
+						  kSCPropNetVPNAuthPassword,
+						  kSCPropNetVPNAuthPasswordEncryption,
+						  kSCValNetVPNAuthPasswordEncryptionKeychain,
+						  unique_id,
+						  &password);
+
+			if (config != NULL)	CFRelease(config);
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return NULL;
@@ -1835,6 +1895,34 @@ SCUserPreferencesRemoveInterfacePassword(SCUserPreferencesRef		userPreferences,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFDictionaryRef	config;
+			CFDictionaryRef	newConfig	= NULL;
+			CFStringRef	unique_id;
+
+			// get configuration
+			config = SCUserPreferencesCopyInterfaceConfiguration(userPreferences, interface);
+
+			// get userPreferences ID
+			unique_id = getUserPasswordID(config, userPreferences);
+
+			// remove password
+			ok = __remove_password(NULL,
+					       config,
+					       kSCPropNetVPNAuthPassword,
+					       kSCPropNetVPNAuthPasswordEncryption,
+					       kSCValNetVPNAuthPasswordEncryptionKeychain,
+					       unique_id,
+					       &newConfig);
+			if (ok) {
+				ok = SCUserPreferencesSetInterfaceConfiguration(userPreferences, interface, newConfig);
+				if (newConfig != NULL) CFRelease(newConfig);
+			}
+
+			if (config != NULL) CFRelease(config);
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return FALSE;
@@ -1950,7 +2038,7 @@ SCUserPreferencesSetInterfacePassword(SCUserPreferencesRef		userPreferences,
 			// set password
 			ok = _SCSecKeychainPasswordItemSet(NULL,
 							   shared_id,
-							   (label != NULL)       ? label       : CFSTR("VPN Connection"),
+							   (label != NULL)       ? label       : CFSTR("Network Connection"),
 							   (description != NULL) ? description : CFSTR("IPSec Shared Secret"),
 							   NULL,
 							   password,
@@ -2014,7 +2102,7 @@ SCUserPreferencesSetInterfacePassword(SCUserPreferencesRef		userPreferences,
 			// store password
 			ok = _SCSecKeychainPasswordItemSet(NULL,
 							   xauth_id,
-							   (label != NULL)       ? label       : CFSTR("VPN Connection"),
+							   (label != NULL)       ? label       : CFSTR("Network Connection"),
 							   (description != NULL) ? description : CFSTR("IPSec XAuth Password"),
 							   account,
 							   password,
@@ -2047,6 +2135,66 @@ SCUserPreferencesSetInterfacePassword(SCUserPreferencesRef		userPreferences,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFStringRef	unique_id;
+
+			// get configuration
+			config = SCUserPreferencesCopyInterfaceConfiguration(userPreferences, interface);
+
+			// get userPreferences ID
+			unique_id = getUserPasswordID(config, userPreferences);
+
+			// User prefs auth name --> keychain "Account"
+			if (config != NULL) {
+				account = CFDictionaryGetValue(config, kSCPropNetVPNAuthName);
+			}
+
+			// User prefs "name" --> keychain "Name"
+			label = SCUserPreferencesCopyName(userPreferences);
+
+			// "VPN Password" --> keychain "Kind"
+			if (bundle != NULL) {
+				description = CFBundleCopyLocalizedString(bundle,
+									  CFSTR("KEYCHAIN_KIND_VPN_PASSWORD"),
+									  CFSTR("VPN Password"),
+									  NULL);
+			}
+
+			// store password
+			ok = _SCSecKeychainPasswordItemSet(NULL,
+							   unique_id,
+							   (label != NULL)       ? label       : CFSTR("Network Connection"),
+							   (description != NULL) ? description : CFSTR("VPN Password"),
+							   account,
+							   password,
+							   options);
+			if (ok) {
+				CFMutableDictionaryRef	newConfig;
+
+				if (config != NULL) {
+					newConfig = CFDictionaryCreateMutableCopy(NULL, 0, config);
+				} else {
+					newConfig = CFDictionaryCreateMutable(NULL,
+									      0,
+									      &kCFTypeDictionaryKeyCallBacks,
+									      &kCFTypeDictionaryValueCallBacks);
+				}
+				CFDictionarySetValue(newConfig,
+						     kSCPropNetVPNAuthPassword,
+						     unique_id);
+				CFDictionarySetValue(newConfig,
+						     kSCPropNetVPNAuthPasswordEncryption,
+						     kSCValNetVPNAuthPasswordEncryptionKeychain);
+				ok = SCUserPreferencesSetInterfaceConfiguration(userPreferences, interface, newConfig);
+				CFRelease(newConfig);
+			}
+
+			if (config      != NULL) CFRelease(config);
+			if (description != NULL) CFRelease(description);
+			if (label       != NULL) CFRelease(label);
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return FALSE;
diff --git a/SystemConfiguration.fproj/SCNetworkConnectionPrivate.h b/SystemConfiguration.fproj/SCNetworkConnectionPrivate.h
index fe17873..a3ec9ff 100644
--- a/SystemConfiguration.fproj/SCNetworkConnectionPrivate.h
+++ b/SystemConfiguration.fproj/SCNetworkConnectionPrivate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2006, 2008, 2009, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -62,6 +62,12 @@ SCNetworkConnectionCopyCurrentUserPreferences	(SCNetworkConnectionRef		connectio
 SCUserPreferencesRef
 SCNetworkConnectionCreateUserPreferences	(SCNetworkConnectionRef		connection)		__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
 
+Boolean
+SCNetworkConnectionSuspend			(SCNetworkConnectionRef		connection)		__OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0);
+
+Boolean
+SCNetworkConnectionResume			(SCNetworkConnectionRef		connection)		__OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0);
+
 
 #pragma mark -
 #pragma mark SCNetworkConnection "VPN on Demand" SPIs
diff --git a/SystemConfiguration.fproj/SCNetworkInterface.c b/SystemConfiguration.fproj/SCNetworkInterface.c
index ce21227..c751a62 100644
--- a/SystemConfiguration.fproj/SCNetworkInterface.c
+++ b/SystemConfiguration.fproj/SCNetworkInterface.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -75,6 +75,10 @@
 #define kUSBProductString		"USB Product Name"
 #endif
 
+#ifndef	kIOUserEthernetInterfaceRoleKey
+#define	kIOUserEthernetInterfaceRoleKey	"InterfaceRole"
+#endif
+
 #include <string.h>
 #include <mach/mach.h>
 #include <net/if.h>
@@ -112,39 +116,39 @@ enum {
 	kSortOtherWireless,
 	kSortTethered,
 	kSortWWANEthernet,
-	kSortBluetoothPAN,
-#if	!TARGET_OS_IPHONE
+	kSortBluetoothPAN_GN,
+	kSortBluetoothPAN_NAP,
+	kSortBluetoothPAN_U,
 	kSortBond,
+	kSortBridge,
 	kSortVLAN,
-#endif	// !TARGET_OS_IPHONE
 	kSortUnknown
 };
 
 
 const CFStringRef kSCNetworkInterfaceType6to4		= CFSTR("6to4");
 const CFStringRef kSCNetworkInterfaceTypeBluetooth	= CFSTR("Bluetooth");
-#if	!TARGET_OS_IPHONE
 const CFStringRef kSCNetworkInterfaceTypeBond		= CFSTR("Bond");
-#endif	// !TARGET_OS_IPHONE
+const CFStringRef kSCNetworkInterfaceTypeBridge		= CFSTR("Bridge");
 const CFStringRef kSCNetworkInterfaceTypeEthernet	= CFSTR("Ethernet");
 const CFStringRef kSCNetworkInterfaceTypeFireWire	= CFSTR("FireWire");
 const CFStringRef kSCNetworkInterfaceTypeIEEE80211	= CFSTR("IEEE80211");	// IEEE 802.11, AirPort
 const CFStringRef kSCNetworkInterfaceTypeIPSec		= CFSTR("IPSec");
 const CFStringRef kSCNetworkInterfaceTypeIrDA		= CFSTR("IrDA");
 const CFStringRef kSCNetworkInterfaceTypeL2TP		= CFSTR("L2TP");
+const CFStringRef kSCNetworkInterfaceTypeLoopback	= CFSTR("Loopback");
 const CFStringRef kSCNetworkInterfaceTypeModem		= CFSTR("Modem");
 const CFStringRef kSCNetworkInterfaceTypePPP		= CFSTR("PPP");
 const CFStringRef kSCNetworkInterfaceTypePPTP		= CFSTR("PPTP");
 const CFStringRef kSCNetworkInterfaceTypeSerial		= CFSTR("Serial");
-#if	!TARGET_OS_IPHONE
 const CFStringRef kSCNetworkInterfaceTypeVLAN		= CFSTR("VLAN");
-#endif	// !TARGET_OS_IPHONE
+const CFStringRef kSCNetworkInterfaceTypeVPN		= CFSTR("VPN");
 const CFStringRef kSCNetworkInterfaceTypeWWAN		= CFSTR("WWAN");
 
 const CFStringRef kSCNetworkInterfaceTypeIPv4		= CFSTR("IPv4");
 
-static SCNetworkInterfacePrivate __kSCNetworkInterfaceIPv4      = {
-	INIT_CFRUNTIME_BASE(NULL, 0, 0x0080),   // cfBase
+static SCNetworkInterfacePrivate __kSCNetworkInterfaceIPv4	= {
+	INIT_CFRUNTIME_BASE(),			// cfBase
 	NULL,					// interface type
 	NULL,					// name
 	NULL,					// localized name
@@ -165,6 +169,7 @@ static SCNetworkInterfacePrivate __kSCNetworkInterfaceIPv4      = {
 	NULL,					// addressString
 	FALSE,					// builtin
 	NULL,					// configurationAction
+	FALSE,					// hidden
 	NULL,					// location
 	NULL,					// path
 	NULL,					// overrides
@@ -173,15 +178,58 @@ static SCNetworkInterfacePrivate __kSCNetworkInterfaceIPv4      = {
 	NULL,					// unit
 	{ NULL, 0, 0 },				// usb { name, vid, pid }
 	kSortUnknown,				// sort_order
-#if	!TARGET_OS_IPHONE
 	FALSE,					// supportsBond
-	{ NULL, NULL},				// bond { interfaces, options }
+	{ NULL, NULL, NULL },			// bond { interfaces, options, mode }
+	FALSE,					// supportsBridge
+	{ NULL, NULL },				// bridge { interfaces, options }
+	FALSE,					// supportsVLAN
+	{ NULL, NULL, NULL }			// vlan { interface, tag, options }
+};
+
+const SCNetworkInterfaceRef kSCNetworkInterfaceIPv4	= (SCNetworkInterfaceRef)&__kSCNetworkInterfaceIPv4;
+
+static SCNetworkInterfacePrivate __kSCNetworkInterfaceLoopback	= {
+	INIT_CFRUNTIME_BASE(),			// cfBase
+	NULL,					// interface type
+	NULL,					// name
+	NULL,					// localized name
+	NULL,					// localization key
+	NULL,					// localization arg1
+	NULL,					// localization arg2
+	NULL,					// [layered] interface
+	NULL,					// prefs
+	NULL,					// serviceID
+	NULL,					// unsaved
+	NULL,					// entity_device
+	NULL,					// entity_device_unique
+	NULL,					// entity_type
+	NULL,					// entity_subtype
+	NULL,					// supported_interface_types
+	NULL,					// supported_protocol_types
+	NULL,					// address
+	NULL,					// addressString
+	FALSE,					// builtin
+	NULL,					// configurationAction
+	FALSE,					// hidden
+	NULL,					// location
+	NULL,					// path
+	NULL,					// overrides
+	FALSE,					// modemIsV92
+	NULL,					// type
+	NULL,					// unit
+	{ NULL, 0, 0 },				// usb { name, vid, pid }
+	kSortUnknown,				// sort_order
+	FALSE,					// supportsBond
+	{ NULL, NULL, NULL },			// bond { interfaces, options, mode }
+	FALSE,					// supportsBridge
+	{ NULL, NULL },				// bridge { interfaces, options }
 	FALSE,					// supportsVLAN
 	{ NULL, NULL, NULL }			// vlan { interface, tag, options }
-#endif	// !TARGET_OS_IPHONE
 };
 
-const SCNetworkInterfaceRef kSCNetworkInterfaceIPv4     = (SCNetworkInterfaceRef)&__kSCNetworkInterfaceIPv4;
+const SCNetworkInterfaceRef kSCNetworkInterfaceLoopback	= (SCNetworkInterfaceRef)&__kSCNetworkInterfaceLoopback;
+
+static CFMutableSetRef	vendor_interface_types	= NULL;
 
 #pragma mark -
 #pragma mark SCNetworkInterface configuration details
@@ -195,11 +243,6 @@ const SCNetworkInterfaceRef kSCNetworkInterfaceIPv4     = (SCNetworkInterfaceRef
 #define doIPSec		1<<4
 #define doOverIP	do6to4|doL2TP|doPPTP|doIPSec
 
-#if	!TARGET_OS_IPHONE
-#define doAppleTalk     1<<0
-#else	// !TARGET_OS_IPHONE
-#define doAppleTalk     0
-#endif	// !TARGET_OS_IPHONE
 #define doDNS		1<<1
 #define doIPv4		1<<2
 #define doIPv6		1<<3
@@ -220,27 +263,27 @@ static const struct {
 } configurations[] = {
 	// interface type			  entity_hardware    if config? interface types PPP sub-type				interface protocols
 	// =====================================  =================  ========== =============== ======================================= =========================================
-	{ &kSCNetworkInterfaceType6to4		, &kSCEntNet6to4    , FALSE,	doNone,		NULL,					doIPv6						},
-	{ &kSCNetworkInterfaceTypeBluetooth     , &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone						},
-#if	!TARGET_OS_IPHONE
-	{ &kSCNetworkInterfaceTypeBond		, &kSCEntNetEthernet, TRUE ,	doNone,		NULL,					doAppleTalk|doDNS|doIPv4|doIPv6|doProxies|doSMB	},
-#endif	// !TARGET_OS_IPHONE
-	{ &kSCNetworkInterfaceTypeEthernet      , &kSCEntNetEthernet, TRUE ,	doPPP,		&kSCValNetInterfaceSubTypePPPoE,	doAppleTalk|doDNS|doIPv4|doIPv6|doProxies|doSMB	},
-	{ &kSCNetworkInterfaceTypeFireWire      , &kSCEntNetFireWire, TRUE ,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB		},
-	{ &kSCNetworkInterfaceTypeIEEE80211     , &kSCEntNetAirPort , TRUE ,	doPPP,		&kSCValNetInterfaceSubTypePPPoE,	doAppleTalk|doDNS|doIPv4|doIPv6|doProxies|doSMB	},
-	{ &kSCNetworkInterfaceTypeIPSec		, &kSCEntNetIPSec   , FALSE,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB		},
-	{ &kSCNetworkInterfaceTypeIrDA		, &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone						},
-	{ &kSCNetworkInterfaceTypeL2TP		, NULL              , FALSE,	doPPP,		&kSCValNetInterfaceSubTypeL2TP,		doNone						},
-	{ &kSCNetworkInterfaceTypeModem		, &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone						},
-	{ &kSCNetworkInterfaceTypePPP		, &kSCEntNetPPP     , FALSE,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB		},
-	{ &kSCNetworkInterfaceTypePPTP		, NULL              , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPTP,		doNone						},
-	{ &kSCNetworkInterfaceTypeSerial	, &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone						},
-#if	!TARGET_OS_IPHONE
-	{ &kSCNetworkInterfaceTypeVLAN		, &kSCEntNetEthernet, TRUE ,	doNone,		NULL,					doAppleTalk|doDNS|doIPv4|doIPv6|doProxies|doSMB	},
-#endif	// !TARGET_OS_IPHONE
-	{ &kSCNetworkInterfaceTypeWWAN          , &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone						},
+	{ &kSCNetworkInterfaceType6to4		, &kSCEntNet6to4    , FALSE,	doNone,		NULL,					doIPv6					},
+	{ &kSCNetworkInterfaceTypeBluetooth     , &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone					},
+	{ &kSCNetworkInterfaceTypeBond		, &kSCEntNetEthernet, TRUE ,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeBridge	, &kSCEntNetEthernet, TRUE ,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeEthernet      , &kSCEntNetEthernet, TRUE ,	doPPP,		&kSCValNetInterfaceSubTypePPPoE,	doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeFireWire      , &kSCEntNetFireWire, TRUE ,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeIEEE80211     , &kSCEntNetAirPort , TRUE ,	doPPP,		&kSCValNetInterfaceSubTypePPPoE,	doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeIPSec		, &kSCEntNetIPSec   , FALSE,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeIrDA		, &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone					},
+	{ &kSCNetworkInterfaceTypeL2TP		, NULL              , FALSE,	doPPP,		&kSCValNetInterfaceSubTypeL2TP,		doNone					},
+	{ &kSCNetworkInterfaceTypeModem		, &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone					},
+	{ &kSCNetworkInterfaceTypePPP		, &kSCEntNetPPP     , FALSE,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypePPTP		, NULL              , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPTP,		doNone					},
+	{ &kSCNetworkInterfaceTypeSerial	, &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone					},
+	{ &kSCNetworkInterfaceTypeVLAN		, &kSCEntNetEthernet, TRUE ,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeVPN		, &kSCEntNetVPN     , FALSE,	doNone,		NULL,					doDNS|doIPv4|doIPv6|doProxies|doSMB	},
+	{ &kSCNetworkInterfaceTypeWWAN          , &kSCEntNetModem   , FALSE,	doPPP,		&kSCValNetInterfaceSubTypePPPSerial,    doNone					},
 	// =====================================  =================  ========== =============== ======================================= =========================================
-	{ &kSCNetworkInterfaceTypeIPv4		, NULL              , FALSE,	doOverIP,	NULL,					doNone						}
+	{ &kSCNetworkInterfaceTypeLoopback	, NULL              , TRUE ,	doNone,		NULL,					doIPv4|doIPv6				},
+	// =====================================  =================  ========== =============== ======================================= =========================================
+	{ &kSCNetworkInterfaceTypeIPv4		, NULL              , FALSE,	doOverIP,	NULL,					doNone					}
 };
 
 
@@ -319,6 +362,9 @@ __SCNetworkInterfaceCopyDescription(CFTypeRef cf)
 		}
 	}
 	CFStringAppendFormat(result, NULL, CFSTR(", builtin = %s"), interfacePrivate->builtin ? "TRUE" : "FALSE");
+	if (interfacePrivate->hidden) {
+		CFStringAppendFormat(result, NULL, CFSTR(", hidden = TRUE"));
+	}
 	if (interfacePrivate->modemIsV92) {
 		CFStringAppendFormat(result, NULL, CFSTR(", v.92"));
 	}
@@ -347,9 +393,12 @@ __SCNetworkInterfaceCopyDescription(CFTypeRef cf)
 			vid = 0;
 		}
 
-		CFStringAppendFormat(result, NULL, CFSTR(", USB%s%@ vid/pid = 0x%0x/0x%0x"),
-				     interfacePrivate->usb.name != NULL ? " name = " : "",
-				     interfacePrivate->usb.name != NULL ? interfacePrivate->usb.name : CFSTR(""),
+		if (interfacePrivate->usb.name != NULL) {
+			CFStringAppendFormat(result, NULL, CFSTR(", USB name = %@"),
+					     interfacePrivate->usb.name);
+		}
+
+		CFStringAppendFormat(result, NULL, CFSTR(", USB vid/pid = 0x%0x/0x%0x"),
 				     interfacePrivate->usb.vid,
 				     interfacePrivate->usb.pid);
 	}
@@ -372,7 +421,7 @@ __SCNetworkInterfaceCopyDescription(CFTypeRef cf)
 	if (interfacePrivate->unsaved != NULL) {
 		CFStringAppendFormat(result, NULL, CFSTR(", unsaved = %@"), interfacePrivate->unsaved);
 	}
-#if	!TARGET_OS_IPHONE
+
 	if (interfacePrivate->bond.interfaces != NULL) {
 		CFIndex	i;
 		CFIndex	n;
@@ -394,9 +443,26 @@ __SCNetworkInterfaceCopyDescription(CFTypeRef cf)
 	if (interfacePrivate->bond.options != NULL) {
 		CFStringAppendFormat(result, NULL, CFSTR(", options = %@"), interfacePrivate->bond.options);
 	}
-	if (interfacePrivate->bond.mode != NULL) {
-		CFStringAppendFormat(result, NULL, CFSTR(", mode = %@"), interfacePrivate->bond.mode);
+
+	if (interfacePrivate->bridge.interfaces != NULL) {
+		CFIndex	i;
+		CFIndex	n;
+
+		n = CFArrayGetCount(interfacePrivate->bridge.interfaces);
+		for (i = 0; i < n; i++) {
+			SCNetworkInterfaceRef	member;
+
+			member = CFArrayGetValueAtIndex(interfacePrivate->bridge.interfaces, i);
+			CFStringAppendFormat(result, NULL,
+					     CFSTR("%s%@"),
+					     (i == 0) ? ", interfaces = " : ", ",
+					     SCNetworkInterfaceGetBSDName(member));
+		}
+	}
+	if (interfacePrivate->bridge.options != NULL) {
+		CFStringAppendFormat(result, NULL, CFSTR(", options = %@"), interfacePrivate->bridge.options);
 	}
+
 	if (interfacePrivate->vlan.interface != NULL) {
 		CFStringAppendFormat(result, NULL,
 				     CFSTR(", interface = %@"),
@@ -408,7 +474,7 @@ __SCNetworkInterfaceCopyDescription(CFTypeRef cf)
 	if (interfacePrivate->vlan.options != NULL) {
 		CFStringAppendFormat(result, NULL, CFSTR(", options = %@"), interfacePrivate->vlan.options);
 	}
-#endif	// !TARGET_OS_IPHONE
+
 	CFStringAppendFormat(result, NULL, CFSTR("}"));
 
 	return result;
@@ -422,9 +488,6 @@ __SCNetworkInterfaceDeallocate(CFTypeRef cf)
 
 	/* release resources */
 
-	if (interfacePrivate->interface != NULL)
-		CFRelease(interfacePrivate->interface);
-
 	if (interfacePrivate->name != NULL)
 		CFRelease(interfacePrivate->name);
 
@@ -437,6 +500,9 @@ __SCNetworkInterfaceDeallocate(CFTypeRef cf)
 	if (interfacePrivate->localized_arg2 != NULL)
 		CFRelease(interfacePrivate->localized_arg2);
 
+	if (interfacePrivate->interface != NULL)
+		CFRelease(interfacePrivate->interface);
+
 	if (interfacePrivate->prefs != NULL)
 		CFRelease(interfacePrivate->prefs);
 
@@ -464,15 +530,15 @@ __SCNetworkInterfaceDeallocate(CFTypeRef cf)
 	if (interfacePrivate->addressString != NULL)
 		CFRelease(interfacePrivate->addressString);
 
+	if (interfacePrivate->configurationAction != NULL)
+		CFRelease(interfacePrivate->configurationAction);
+
 	if (interfacePrivate->location != NULL)
 		CFRelease(interfacePrivate->location);
 
 	if (interfacePrivate->path != NULL)
 		CFRelease(interfacePrivate->path);
 
-	if (interfacePrivate->configurationAction != NULL)
-		CFRelease(interfacePrivate->configurationAction);
-
 	if (interfacePrivate->overrides != NULL)
 		CFRelease(interfacePrivate->overrides);
 
@@ -491,7 +557,6 @@ __SCNetworkInterfaceDeallocate(CFTypeRef cf)
 	if (interfacePrivate->usb.vid != NULL)
 		CFRelease(interfacePrivate->usb.vid);
 
-#if	!TARGET_OS_IPHONE
 	if (interfacePrivate->bond.interfaces != NULL)
 		CFRelease(interfacePrivate->bond.interfaces);
 
@@ -501,6 +566,12 @@ __SCNetworkInterfaceDeallocate(CFTypeRef cf)
 	if (interfacePrivate->bond.options != NULL)
 		CFRelease(interfacePrivate->bond.options);
 
+	if (interfacePrivate->bridge.interfaces != NULL)
+		CFRelease(interfacePrivate->bridge.interfaces);
+
+	if (interfacePrivate->bridge.options != NULL)
+		CFRelease(interfacePrivate->bridge.options);
+
 	if (interfacePrivate->vlan.interface != NULL)
 		CFRelease(interfacePrivate->vlan.interface);
 
@@ -509,7 +580,6 @@ __SCNetworkInterfaceDeallocate(CFTypeRef cf)
 
 	if (interfacePrivate->vlan.options != NULL)
 		CFRelease(interfacePrivate->vlan.options);
-#endif	// !TARGET_OS_IPHONE
 
 	return;
 }
@@ -547,7 +617,6 @@ __SCNetworkInterfaceEqual(CFTypeRef cf1, CFTypeRef cf2)
 		}
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (CFEqual(if1->interface_type, kSCNetworkInterfaceTypeBond)) {
 		if (!_SC_CFEqual(if1->bond.interfaces, if2->bond.interfaces)) {
 			return FALSE; // if not the same interfaces
@@ -557,6 +626,12 @@ __SCNetworkInterfaceEqual(CFTypeRef cf1, CFTypeRef cf2)
 		}
 	}
 
+	if (CFEqual(if1->interface_type, kSCNetworkInterfaceTypeBridge)) {
+		if (!_SC_CFEqual(if1->bridge.interfaces, if2->bridge.interfaces)) {
+			return FALSE; // if not the same interfaces
+		}
+	}
+
 	if (CFEqual(if1->interface_type, kSCNetworkInterfaceTypeVLAN)) {
 		if (!_SC_CFEqual(if1->vlan.interface, if2->vlan.interface)) {
 			return FALSE;	// if not the same physical interface
@@ -565,7 +640,6 @@ __SCNetworkInterfaceEqual(CFTypeRef cf1, CFTypeRef cf2)
 			return FALSE;	// if not the same tag
 		}
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	if (!_SC_CFEqual(if1->interface, if2->interface)) {
 		return FALSE;	// if not the same layering
@@ -608,10 +682,17 @@ __SCNetworkInterfaceInitialize(void)
 	__kSCNetworkInterfaceTypeID = _CFRuntimeRegisterClass(&__SCNetworkInterfaceClass);
 
 	// initialize __kSCNetworkInterfaceIPv4
-	_CFRuntimeSetInstanceTypeID(&__kSCNetworkInterfaceIPv4, __kSCNetworkInterfaceTypeID);
+	_CFRuntimeInitStaticInstance(&__kSCNetworkInterfaceIPv4, __kSCNetworkInterfaceTypeID);
 	__kSCNetworkInterfaceIPv4.interface_type = kSCNetworkInterfaceTypeIPv4;
 	__kSCNetworkInterfaceIPv4.localized_key  = CFSTR("ipv4");
 
+	// initialize __kSCNetworkInterfaceLoopback
+	_CFRuntimeInitStaticInstance(&__kSCNetworkInterfaceLoopback, __kSCNetworkInterfaceTypeID);
+	__kSCNetworkInterfaceLoopback.interface_type = kSCNetworkInterfaceTypeLoopback;
+	__kSCNetworkInterfaceLoopback.localized_key  = CFSTR("loopback");
+	__kSCNetworkInterfaceLoopback.entity_device  = CFRetain(CFSTR("lo0"));
+	__kSCNetworkInterfaceLoopback.entity_type    = kSCValNetInterfaceTypeLoopback;
+
 	// get CFBundleRef for SystemConfiguration.framework
 	bundle = _SC_CFBundleGet();
 
@@ -682,22 +763,25 @@ __SCNetworkInterfaceCreatePrivate(CFAllocatorRef	allocator,
 	interfacePrivate->usb.vid			= NULL;
 	interfacePrivate->usb.pid			= NULL;
 	interfacePrivate->sort_order			= kSortUnknown;
-#if	!TARGET_OS_IPHONE
+
 	interfacePrivate->supportsBond			= FALSE;
 	interfacePrivate->bond.interfaces		= NULL;
 	interfacePrivate->bond.mode			= NULL;
 	interfacePrivate->bond.options			= NULL;
+
+	interfacePrivate->supportsBridge		= FALSE;
+	interfacePrivate->bridge.interfaces		= NULL;
+	interfacePrivate->bridge.options		= NULL;
+
 	interfacePrivate->supportsVLAN			= FALSE;
 	interfacePrivate->vlan.interface		= NULL;
 	interfacePrivate->vlan.tag			= NULL;
 	interfacePrivate->vlan.options			= NULL;
-#endif	// !TARGET_OS_IPHONE
 
 	return interfacePrivate;
 }
 
 
-#if	!TARGET_OS_IPHONE
 __private_extern__
 Boolean
 __SCNetworkInterfaceSupportsVLAN(CFStringRef bsd_if)
@@ -792,6 +876,35 @@ _SCBondInterfaceCreatePrivate(CFAllocatorRef	allocator,
 }
 
 
+__private_extern__
+SCNetworkInterfacePrivateRef
+_SCBridgeInterfaceCreatePrivate(CFAllocatorRef	allocator,
+				CFStringRef	bridge_if)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate;
+
+	interfacePrivate = __SCNetworkInterfaceCreatePrivate(allocator, NULL, NULL, NULL, NULL);
+	if (interfacePrivate == NULL) {
+		return NULL;
+	}
+
+	interfacePrivate->interface_type	= kSCNetworkInterfaceTypeBridge;
+	interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
+	interfacePrivate->entity_device		= CFStringCreateCopy(allocator, bridge_if);
+	interfacePrivate->builtin		= TRUE;
+	interfacePrivate->supportsVLAN		= __SCNetworkInterfaceSupportsVLAN(bridge_if);
+	interfacePrivate->sort_order		= kSortBridge;
+
+	interfacePrivate->localized_key		= CFSTR("bridge");
+	interfacePrivate->localized_arg1	= CFRetain(interfacePrivate->entity_device);
+
+	interfacePrivate->bridge.interfaces	= CFArrayCreate(NULL, NULL, 0, &kCFTypeArrayCallBacks);
+//	interfacePrivate->bridge.options	= NULL;
+
+	return interfacePrivate;
+}
+
+
 __private_extern__
 SCNetworkInterfacePrivateRef
 _SCVLANInterfaceCreatePrivate(CFAllocatorRef		allocator,
@@ -819,7 +932,6 @@ _SCVLANInterfaceCreatePrivate(CFAllocatorRef		allocator,
 
 	return interfacePrivate;
 }
-#endif	// !TARGET_OS_IPHONE
 
 
 #pragma mark -
@@ -1431,6 +1543,38 @@ typedef Boolean (*processInterface)(SCNetworkInterfacePrivateRef	interfacePrivat
 				    CFDictionaryRef			bus_dict);
 
 
+static void
+merge_override(SCNetworkInterfacePrivateRef	interfacePrivate,
+	       io_registry_entry_t		interface,
+	       CFStringRef			override)
+{
+	CFStringRef	key;
+	CFTypeRef	val;
+
+	key = CFStringCreateWithFormat(NULL, NULL, CFSTR("Device%@Overrides"), override);
+	val = IORegistryEntrySearchCFProperty(interface,
+					      kIOServicePlane,
+					      key,
+					      NULL,
+					      kIORegistryIterateRecursively | kIORegistryIterateParents);
+	CFRelease(key);
+	if (val != NULL) {
+		if (isA_CFDictionary(val)) {
+			if (interfacePrivate->overrides == NULL) {
+				interfacePrivate->overrides = CFDictionaryCreateMutable(NULL,
+											0,
+											&kCFTypeDictionaryKeyCallBacks,
+											&kCFTypeDictionaryValueCallBacks);
+			}
+			CFDictionarySetValue(interfacePrivate->overrides, override, val);
+		}
+		CFRelease(val);
+	}
+
+	return;
+}
+
+
 static Boolean
 processNetworkInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 			io_registry_entry_t		interface,
@@ -1470,7 +1614,7 @@ processNetworkInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 			} else if (IOObjectConformsTo(controller, "IOBluetoothBNEPDriver")) {
 				interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
 				interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
-				interfacePrivate->sort_order		= kSortBluetoothPAN;
+				interfacePrivate->sort_order		= kSortBluetoothPAN_GN;
 			} else if (IOObjectConformsTo(controller, "AppleUSBEthernetHost")) {
 				interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
 				interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
@@ -1479,26 +1623,60 @@ processNetworkInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 				interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
 				interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
 				interfacePrivate->sort_order		= kSortWWANEthernet;
-			} else {
+			}
+
+			if (interfacePrivate->interface_type == NULL) {
+				val = IORegistryEntrySearchCFProperty(interface,
+								      kIOServicePlane,
+								      CFSTR(kIOUserEthernetInterfaceRoleKey),
+								      NULL,
+								      kIORegistryIterateRecursively | kIORegistryIterateParents);
+				if (val != NULL) {
+					if (isA_CFString(val)) {
+						if (CFEqual(val, CFSTR("Bluetooth PAN"))) {
+							interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
+							interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
+							interfacePrivate->sort_order		= kSortBluetoothPAN_GN;
+						} else if (CFEqual(val, CFSTR("Bluetooth PAN-NAP"))) {
+							interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
+							interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
+							interfacePrivate->sort_order		= kSortBluetoothPAN_NAP;
+						} else if (CFEqual(val, CFSTR("Bluetooth P2P"))) {
+							interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
+							interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
+							interfacePrivate->sort_order		= kSortBluetoothPAN_U;
+						}
+					}
+
+					CFRelease(val);
+				}
+			}
+
+			if (interfacePrivate->interface_type == NULL) {
 				str = IODictionaryCopyCFStringValue(bus_dict, CFSTR("name"));
-				if ((str != NULL) && CFEqual(str, CFSTR("radio"))) {
-					interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;	// ??
-					interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
-					interfacePrivate->sort_order		= kSortOtherWireless;
-				} else {
-					interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
-					interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
-					interfacePrivate->sort_order		= kSortEthernet;
+				if (str != NULL) {
+					if (CFEqual(str, CFSTR("radio"))) {
+						interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;	// ??
+						interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
+						interfacePrivate->sort_order		= kSortOtherWireless;
+					}
 
-#if	!TARGET_OS_IPHONE
-					// BOND support only enabled for ethernet devices
-					interfacePrivate->supportsBond = TRUE;
-#endif	// !TARGET_OS_IPHONE
+					CFRelease(str);
 				}
+			}
+
+			if (interfacePrivate->interface_type == NULL) {
+				interfacePrivate->interface_type	= kSCNetworkInterfaceTypeEthernet;
+				interfacePrivate->entity_type		= kSCValNetInterfaceTypeEthernet;
+				interfacePrivate->sort_order		= kSortEthernet;
 
-				if (str != NULL) CFRelease(str);
+				// BOND support only enabled for ethernet devices
+				interfacePrivate->supportsBond = TRUE;
 			}
 
+			// enable Bridge support
+			interfacePrivate->supportsBridge = TRUE;
+
 			// built-in
 			val = isA_CFBoolean(CFDictionaryGetValue(interface_dict, CFSTR(kIOBuiltin)));
 			if (val == NULL) {
@@ -1519,7 +1697,6 @@ processNetworkInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 			// location
 			interfacePrivate->location = IODictionaryCopyCFStringValue(interface_dict, CFSTR(kIOLocation));
 
-#if	!TARGET_OS_IPHONE
 			// VLAN support
 			num = CFDictionaryGetValue(controller_dict, CFSTR(kIOFeatures));
 			if (isA_CFNumber(num) &&
@@ -1528,13 +1705,16 @@ processNetworkInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 					interfacePrivate->supportsVLAN = TRUE;
 				}
 			}
-#endif	// !TARGET_OS_IPHONE
 
 			// localized name
 			if (CFEqual(interfacePrivate->interface_type, kSCNetworkInterfaceTypeIEEE80211)) {
 				interfacePrivate->localized_key = CFSTR("airport");
-			} else if (interfacePrivate->sort_order == kSortBluetoothPAN) {
-				interfacePrivate->localized_key  = CFSTR("bluetooth-pan");
+			} else if (interfacePrivate->sort_order == kSortBluetoothPAN_GN) {
+				interfacePrivate->localized_key  = CFSTR("bluetooth-pan-gn");
+			} else if (interfacePrivate->sort_order == kSortBluetoothPAN_NAP) {
+				interfacePrivate->localized_key  = CFSTR("bluetooth-pan-nap");
+			} else if (interfacePrivate->sort_order == kSortBluetoothPAN_U) {
+				interfacePrivate->localized_key  = CFSTR("bluetooth-pan-u");
 			} else if (interfacePrivate->sort_order == kSortOtherWireless) {
 				interfacePrivate->localized_key  = CFSTR("wireless");
 				interfacePrivate->localized_arg1 = CFRetain(CFSTR(""));		// ??
@@ -1676,6 +1856,9 @@ processNetworkInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 		interfacePrivate->unit = CFRetain(num);
 	}
 
+	// configuration [PPP] template override (now deprecated, use NetworkConfigurationOverrides)
+	merge_override(interfacePrivate, interface, kSCNetworkInterfaceTypePPP);
+
 	return TRUE;
 }
 
@@ -1812,7 +1995,7 @@ processSerialInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 	// check if hidden
 	val = IORegistryEntrySearchCFProperty(interface,
 					      kIOServicePlane,
-					      CFSTR("HiddenPort"),
+					      kSCNetworkInterfaceHiddenPortKey,
 					      NULL,
 					      kIORegistryIterateRecursively | kIORegistryIterateParents);
 	if (val != NULL) {
@@ -1823,7 +2006,7 @@ processSerialInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 	// check if initializing
 	val = IORegistryEntrySearchCFProperty(interface,
 					      kIOServicePlane,
-					      CFSTR("Initializing"),
+					      kSCNetworkInterfaceInitializingKey,
 					      NULL,
 					      kIORegistryIterateRecursively | kIORegistryIterateParents);
 	if (val != NULL) {
@@ -1939,41 +2122,17 @@ processSerialInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 		goto done;
 	}
 
-	// configuration template overrides
-	val = IORegistryEntrySearchCFProperty(interface,
-					      kIOServicePlane,
-					      CFSTR("DevicePPPOverrides"),
-					      NULL,
-					      kIORegistryIterateRecursively | kIORegistryIterateParents);
-	if (val != NULL) {
-		if (isA_CFDictionary(val)) {
-			if (interfacePrivate->overrides == NULL) {
-				interfacePrivate->overrides = CFDictionaryCreateMutable(NULL,
-											0,
-											&kCFTypeDictionaryKeyCallBacks,
-											&kCFTypeDictionaryValueCallBacks);
-			}
-			CFDictionarySetValue(interfacePrivate->overrides, kSCNetworkInterfaceTypePPP, val);
-		}
-		CFRelease(val);
-	}
+	// configuration [PPP] template override   (now deprecated, use NetworkConfigurationOverrides)
+	merge_override(interfacePrivate, interface, kSCNetworkInterfaceTypePPP);
 
-	val = IORegistryEntrySearchCFProperty(interface,
-					      kIOServicePlane,
-					      CFSTR("DeviceModemOverrides"),
-					      NULL,
-					      kIORegistryIterateRecursively | kIORegistryIterateParents);
-	if (val != NULL) {
-		if (isA_CFDictionary(val)) {
-			CFStringRef	uniqueID;
+	// configuration [Modem] template override (now deprecated, use NetworkConfigurationOverrides)
+	merge_override(interfacePrivate, interface, kSCNetworkInterfaceTypeModem);
 
-			if (interfacePrivate->overrides == NULL) {
-				interfacePrivate->overrides = CFDictionaryCreateMutable(NULL,
-											0,
-											&kCFTypeDictionaryKeyCallBacks,
-											&kCFTypeDictionaryValueCallBacks);
-			}
-			CFDictionarySetValue(interfacePrivate->overrides, kSCNetworkInterfaceTypeModem, val);
+	// look for modem CCL, unique identifier
+	if (interfacePrivate->overrides != NULL) {
+		val = CFDictionaryGetValue(interfacePrivate->overrides, kSCNetworkInterfaceTypeModem);
+		if (val != NULL) {
+			CFStringRef	uniqueID;
 
 			modemCCL = CFDictionaryGetValue(val, kSCPropNetModemConnectionScript);
 			modemCCL = isA_CFString(modemCCL);
@@ -1987,10 +2146,10 @@ processSerialInterface(SCNetworkInterfacePrivateRef	interfacePrivate,
 				interfacePrivate->entity_device_unique = CFStringCreateCopy(NULL, uniqueID);
 			}
 		}
-		CFRelease(val);
 	}
 
-	// if not part of the DeviceModemOverrides, look harder for the modem CCL
+	// if not part of the NetworkConfigurationOverrides/DeviceModemOverrides, look
+	// a bit harder for the modem CCL
 	if (modemCCL == NULL) {
 		val = IORegistryEntrySearchCFProperty(interface,
 						      kIOServicePlane,
@@ -2133,6 +2292,7 @@ createInterface(io_registry_entry_t interface, processInterface func)
 	CFMutableDictionaryRef		interface_dict		= NULL;
 	kern_return_t			kr;
 	io_string_t			path;
+	CFTypeRef			val;
 
 	kr = IORegistryEntryGetPath(interface, kIOServicePlane, path);
 	if (kr != kIOReturnSuccess) {
@@ -2176,10 +2336,21 @@ createInterface(io_registry_entry_t interface, processInterface func)
 
 	interfacePrivate = __SCNetworkInterfaceCreatePrivate(NULL, NULL, NULL, NULL, path);
 
-	if ((*func)(interfacePrivate, interface, interface_dict, controller, controller_dict, bus, bus_dict)) {
-		CFTypeRef	val;
+	// configuration [PPP, Modem, DNS, IPv4, IPv6, Proxies, SMB] template overrides
+	val = IORegistryEntrySearchCFProperty(interface,
+					      kIOServicePlane,
+					      kSCNetworkInterfaceNetworkConfigurationOverridesKey,
+					      NULL,
+					      kIORegistryIterateRecursively | kIORegistryIterateParents);
+	if (val != NULL) {
+		if (isA_CFDictionary(val)) {
+			interfacePrivate->overrides = CFDictionaryCreateMutableCopy(NULL, 0, val);
+		}
+		CFRelease(val);
+	}
 
-		/* check user-notification / auto-configuration preferences */
+	if ((*func)(interfacePrivate, interface, interface_dict, controller, controller_dict, bus, bus_dict)) {
+		/* get user-notification / auto-configuration preference */
 		val = IORegistryEntrySearchCFProperty(interface,
 						      kIOServicePlane,
 						      kSCNetworkInterfaceConfigurationActionKey,
@@ -2191,6 +2362,17 @@ createInterface(io_registry_entry_t interface, processInterface func)
 			}
 			CFRelease(val);
 		}
+
+		/* get HiddenConfiguration preference */
+		val = IORegistryEntrySearchCFProperty(interface,
+						      kIOServicePlane,
+						      kSCNetworkInterfaceHiddenConfigurationKey,
+						      NULL,
+						      kIORegistryIterateRecursively | kIORegistryIterateParents);
+		if (val != NULL) {
+			interfacePrivate->hidden = TRUE;
+			CFRelease(val);
+		}
 	} else {
 		CFRelease(interfacePrivate);
 		interfacePrivate = NULL;
@@ -2218,6 +2400,13 @@ findMatchingInterfaces(CFDictionaryRef matching, processInterface func)
 	kern_return_t		kr;
 	io_iterator_t		iterator	= MACH_PORT_NULL;
 
+	/*
+	 * A reference to the "matching" dictionary will be consumed by the
+	 * the call to IOServiceGetMatchingServices so we bump up the retain
+	 * count.
+	 */
+	CFRetain(matching);
+
 	kr = IOServiceGetMatchingServices(masterPort, matching, &iterator);
 	if (kr != kIOReturnSuccess) {
 		SCLog(TRUE, LOG_DEBUG, CFSTR("findMatchingInterfaces IOServiceGetMatchingServices() failed, kr = 0x%x"), kr);
@@ -2613,6 +2802,11 @@ __SCNetworkInterfaceCopyInterfaceEntity(SCNetworkInterfaceRef interface)
 				     CFSTR("DeviceUniqueIdentifier"),
 				     interfacePrivate->entity_device_unique);
 	}
+	if (interfacePrivate->hidden) {
+		CFDictionarySetValue(entity,
+				     kSCNetworkInterfaceHiddenConfigurationKey,
+				     kCFBooleanTrue);
+	}
 
 	// match the "hardware" with the lowest layer
 	while (TRUE) {
@@ -2667,7 +2861,6 @@ __SCNetworkInterfaceCopyInterfaceEntity(SCNetworkInterfaceRef interface)
 }
 
 
-#if	!TARGET_OS_IPHONE
 static SCNetworkInterfaceRef
 findInterface(CFArrayRef interfaces, CFStringRef match_if)
 {
@@ -2689,7 +2882,6 @@ findInterface(CFArrayRef interfaces, CFStringRef match_if)
 	return NULL;
 }
 
-
 static SCNetworkInterfaceRef
 findBondInterface(SCPreferencesRef prefs, CFStringRef ifDevice)
 {
@@ -2709,6 +2901,25 @@ findBondInterface(SCPreferencesRef prefs, CFStringRef ifDevice)
 	return interface;
 }
 
+static SCNetworkInterfaceRef
+findBridgeInterface(SCPreferencesRef prefs, CFStringRef ifDevice)
+{
+	CFArrayRef		bridges;
+	SCNetworkInterfaceRef	interface	= NULL;
+
+	if (prefs == NULL) {
+		return (NULL);
+	}
+
+	// check if the interface is an bridge
+	bridges = SCBridgeInterfaceCopyAll(prefs);
+	if (bridges != NULL) {
+		interface = findInterface(bridges, ifDevice);
+		CFRelease(bridges);
+	}
+	return interface;
+}
+
 static SCNetworkInterfaceRef
 findVLANInterface(SCPreferencesRef prefs, CFStringRef ifDevice)
 {
@@ -2727,7 +2938,6 @@ findVLANInterface(SCPreferencesRef prefs, CFStringRef ifDevice)
 	}
 	return interface;
 }
-#endif	// !TARGET_OS_IPHONE
 
 
 SCNetworkInterfaceRef
@@ -2743,14 +2953,19 @@ _SCNetworkInterfaceCreateWithBSDName(CFAllocatorRef		allocator,
 					   &kCFTypeDictionaryKeyCallBacks,
 					   &kCFTypeDictionaryValueCallBacks);
 	CFDictionarySetValue(entity, kSCPropNetInterfaceDeviceName, bsdName);
-#if	!TARGET_OS_IPHONE
+
 	if ((flags & kIncludeBondInterfaces) == 0) {
 		CFDictionarySetValue(entity, CFSTR("_NO_BOND_INTERFACES_"), kCFBooleanTrue);
 	}
+
+	if ((flags & kIncludeBridgeInterfaces) == 0) {
+		CFDictionarySetValue(entity, CFSTR("_NO_BRIDGE_INTERFACES_"), kCFBooleanTrue);
+	}
+
 	if ((flags & kIncludeVLANInterfaces) == 0) {
 		CFDictionarySetValue(entity, CFSTR("_NO_VLAN_INTERFACES_"), kCFBooleanTrue);
 	}
-#endif	// !TARGET_OS_IPHONE
+
 	interface = _SCNetworkInterfaceCreateWithEntity(NULL, entity, NULL);
 	CFRelease(entity);
 
@@ -2861,7 +3076,8 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 	}
 
 	ifSubType = CFDictionaryGetValue(interface_entity, kSCPropNetInterfaceSubType);
-	if (CFEqual(ifType, kSCValNetInterfaceTypePPP)) {
+	if (CFEqual(ifType, kSCValNetInterfaceTypePPP) ||
+	    CFEqual(ifType, kSCValNetInterfaceTypeVPN)) {
 		if (!isA_CFString(ifSubType)) {
 			return NULL;
 		}
@@ -2873,14 +3089,19 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 	if (CFEqual(ifType, kSCValNetInterfaceTypeEthernet) ||
 	    CFEqual(ifType, kSCValNetInterfaceTypeFireWire) ||
 	    (CFEqual(ifType, kSCValNetInterfaceTypePPP) && CFEqual(ifSubType, kSCValNetInterfaceSubTypePPPoE))) {
-		char			bsdName[IFNAMSIZ + 1];
+		char			bsdName[IFNAMSIZ];
 		CFMutableDictionaryRef	matching;
 
 		if (!isA_CFString(ifDevice)) {
 			return NULL;
 		}
 
-		if (_SC_cfstring_to_cstring(ifDevice, bsdName, sizeof(bsdName), kCFStringEncodingASCII) == NULL) {
+		if (CFEqual(ifDevice, CFSTR("lo0"))) {	// for _SCNetworkInterfaceCreateWithBSDName
+			interfacePrivate = __SCNetworkInterfaceCreateCopy(NULL, kSCNetworkInterfaceLoopback, NULL, NULL);
+			goto done;
+		}
+
+		if (_SC_cfstring_to_cstring(ifDevice, bsdName, sizeof(bsdName), kCFStringEncodingASCII) == NULL) {
 			goto done;
 		}
 
@@ -2888,10 +3109,8 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 		if (matching == NULL) {
 			goto done;
 		}
-
-		// note: the "matching" dictionary will be consumed by the following
 		matching_interfaces = findMatchingInterfaces(matching, processNetworkInterface);
-
+		CFRelease(matching);
 	} else if (CFEqual(ifType, kSCValNetInterfaceTypePPP)) {
 		if (CFEqual(ifSubType, kSCValNetInterfaceSubTypePPPSerial)) {
 			CFDictionaryRef	matching;
@@ -2914,9 +3133,8 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 						      sizeof(match_keys)/sizeof(match_keys[0]),
 						      &kCFTypeDictionaryKeyCallBacks,
 						      &kCFTypeDictionaryValueCallBacks);
-
-			// note: the "matching" dictionary will be consumed by the following
 			matching_interfaces = findMatchingInterfaces(matching, processSerialInterface);
+			CFRelease(matching);
 
 			if (ifUnique == NULL) {
 				CFIndex	n;
@@ -2949,9 +3167,8 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 								      sizeof(match_keys)/sizeof(match_keys[0]),
 								      &kCFTypeDictionaryKeyCallBacks,
 								      &kCFTypeDictionaryValueCallBacks);
-
-					// note: the "matching" dictionary will be consumed by the following
 					matching_interfaces = findMatchingInterfaces(matching, processSerialInterface);
+					CFRelease(matching);
 				}
 			}
 		} else if (CFEqual(ifSubType, kSCValNetInterfaceSubTypeL2TP)) {
@@ -2975,6 +3192,13 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 	} else if (CFEqual(ifType, kSCValNetInterfaceTypeIPSec)) {
 		interfacePrivate = (SCNetworkInterfacePrivateRef)SCNetworkInterfaceCreateWithInterface(kSCNetworkInterfaceIPv4,
 												       kSCNetworkInterfaceTypeIPSec);
+	} else if (CFEqual(ifType, kSCValNetInterfaceTypeLoopback)) {
+		interfacePrivate = __SCNetworkInterfaceCreateCopy(NULL, kSCNetworkInterfaceLoopback, NULL, NULL);
+	} else if (CFEqual(ifType, kSCValNetInterfaceTypeVPN)) {
+		if (CFStringFind(ifSubType, CFSTR("."), 0).location != kCFNotFound) {
+			interfacePrivate = (SCNetworkInterfacePrivateRef)SCNetworkInterfaceCreateWithInterface(kSCNetworkInterfaceIPv4,
+													       ifSubType);
+		}
 	} else if ((CFStringFind(ifType, CFSTR("."), 0).location != kCFNotFound) && (ifDevice == NULL)) {
 		interfacePrivate = (SCNetworkInterfacePrivateRef)SCNetworkInterfaceCreateWithInterface(kSCNetworkInterfaceIPv4,
 												       ifType);
@@ -3004,15 +3228,19 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 				if (prefs == NULL) {
 					break;
 				}
-#if	!TARGET_OS_IPHONE
-				if (!CFDictionaryContainsKey(interface_entity, CFSTR("_NO_VLAN_INTERFACES_"))) {
-					interfacePrivate = (SCNetworkInterfacePrivateRef)findVLANInterface(prefs, ifDevice);
+				if (!CFDictionaryContainsKey(interface_entity, CFSTR("_NO_BOND_INTERFACES_"))) {
+					interfacePrivate = (SCNetworkInterfacePrivateRef)findBondInterface(prefs, ifDevice);
 				}
+
 				if ((interfacePrivate == NULL)
-				    && !CFDictionaryContainsKey(interface_entity, CFSTR("_NO_BOND_INTERFACES_"))) {
-					interfacePrivate = (SCNetworkInterfacePrivateRef)findBondInterface(prefs, ifDevice);
+				    && !CFDictionaryContainsKey(interface_entity, CFSTR("_NO_BRIDGE_INTERFACES_"))) {
+					interfacePrivate = (SCNetworkInterfacePrivateRef)findBridgeInterface(prefs, ifDevice);
+				}
+
+				if ((interfacePrivate == NULL)
+				    && !CFDictionaryContainsKey(interface_entity, CFSTR("_NO_VLAN_INTERFACES_"))) {
+					interfacePrivate = (SCNetworkInterfacePrivateRef)findVLANInterface(prefs, ifDevice);
 				}
-#endif	// !TARGET_OS_IPHONE
 				CFRelease(prefs);
 				break;
 			default :
@@ -3093,6 +3321,7 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 			if (isA_CFString((entity_hardware)) &&
 			    CFEqual(entity_hardware, kSCEntNetAirPort)) {
 				interfacePrivate->interface_type = kSCNetworkInterfaceTypeIEEE80211;
+				interfacePrivate->localized_key  = CFSTR("airport");
 				interfacePrivate->sort_order     = kSortAirPort;
 			} else {
 				CFStringRef	name;
@@ -3101,9 +3330,17 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 
 				name = CFDictionaryGetValue(interface_entity, kSCPropUserDefinedName);
 				if (_SCNetworkInterfaceMatchesName(name, CFSTR("iPhone"))) {
-					interfacePrivate->sort_order = kSortTethered;
-				} else if (_SCNetworkInterfaceMatchesName(name, CFSTR("bluetooth-pan"))) {
-					interfacePrivate->sort_order = kSortBluetoothPAN;
+					interfacePrivate->localized_key = CFSTR("iPhone");
+					interfacePrivate->sort_order    = kSortTethered;
+				} else if (_SCNetworkInterfaceMatchesName(name, CFSTR("bluetooth-pan-gn"))) {
+					interfacePrivate->localized_key = CFSTR("bluetooth-pan-gn");
+					interfacePrivate->sort_order    = kSortBluetoothPAN_GN;
+				} else if (_SCNetworkInterfaceMatchesName(name, CFSTR("bluetooth-pan-nap"))) {
+					interfacePrivate->localized_key = CFSTR("bluetooth-pan-nap");
+					interfacePrivate->sort_order    = kSortBluetoothPAN_NAP;
+				} else if (_SCNetworkInterfaceMatchesName(name, CFSTR("bluetooth-pan-u"))) {
+					interfacePrivate->localized_key = CFSTR("bluetooth-pan-u");
+					interfacePrivate->sort_order    = kSortBluetoothPAN_U;
 				} else {
 					interfacePrivate->sort_order = kSortEthernet;
 				}
@@ -3139,26 +3376,50 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 					interfacePrivate->sort_order     = kSortModem;
 				}
 			} else {
+				SCNetworkInterfaceRef	child;
+
 				// PPTP, L2TP, ...
 				CFRelease(interfacePrivate);
-				interfacePrivate = (SCNetworkInterfacePrivateRef)kSCNetworkInterfaceIPv4;
-				CFRetain(interfacePrivate);
+				child = SCNetworkInterfaceCreateWithInterface(kSCNetworkInterfaceIPv4, ifSubType);
+				interfacePrivate = (SCNetworkInterfacePrivateRef)child;
+				if (interfacePrivate == NULL) {
+					return NULL;
+				}
+			}
+		} else if (CFEqual(ifType, kSCValNetInterfaceTypeVPN)) {
+			SCNetworkInterfaceRef	child;
+
+			CFRelease(interfacePrivate);
+			child = SCNetworkInterfaceCreateWithInterface(kSCNetworkInterfaceIPv4, ifSubType);
+			interfacePrivate = (SCNetworkInterfacePrivateRef)child;
+			if (interfacePrivate == NULL) {
+				return NULL;
 			}
 		} else if (CFStringFind(ifType, CFSTR("."), 0).location != kCFNotFound) {
 			// if vendor interface
-			interfacePrivate->interface_type = ifType;
+			if (vendor_interface_types == NULL) {
+				vendor_interface_types = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+			}
+			CFSetAddValue(vendor_interface_types, ifType);
+
+			interfacePrivate->interface_type = CFSetGetValue(vendor_interface_types, ifType);
 		} else {
 			// if unknown interface
 			CFRelease(interfacePrivate);
 			interfacePrivate = NULL;
+			return NULL;
+		}
+
+		if (CFDictionaryContainsKey(interface_entity, kSCNetworkInterfaceHiddenConfigurationKey)) {
+			interfacePrivate->hidden = TRUE;
 		}
 	}
 
-	if ((interfacePrivate != NULL) && (service != NULL)) {
+	if (service != NULL) {
 		__SCNetworkInterfaceSetService((SCNetworkInterfaceRef)interfacePrivate,
 					       service);
-#if	!TARGET_OS_IPHONE
-		// set prefs & serviceID to VLANs and Bonds
+
+		// set prefs & serviceID to Bond member interfaces
 		if (CFEqual(interfacePrivate->interface_type, kSCNetworkInterfaceTypeBond)) {
 			CFIndex		i;
 			CFArrayRef	members;
@@ -3172,7 +3433,26 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 				member = CFArrayGetValueAtIndex(members, i);
 				__SCNetworkInterfaceSetService(member, service);
 			}
-		} else if (CFEqual(interfacePrivate->interface_type, kSCNetworkInterfaceTypeVLAN)) {
+		}
+
+		// set prefs & serviceID to Bridge member interfaces
+		if (CFEqual(interfacePrivate->interface_type, kSCNetworkInterfaceTypeBridge)) {
+			CFIndex		i;
+			CFArrayRef	members;
+			CFIndex		n;
+
+			members = SCBridgeInterfaceGetMemberInterfaces((SCNetworkInterfaceRef)interfacePrivate);
+			n = (members != NULL) ? CFArrayGetCount(members) : 0;
+			for (i = 0; i < n; i++) {
+				SCNetworkInterfaceRef	member;
+
+				member = CFArrayGetValueAtIndex(members, i);
+				__SCNetworkInterfaceSetService(member, service);
+			}
+		}
+
+		// set prefs & serviceID to VLAN pyhsical interface
+		if (CFEqual(interfacePrivate->interface_type, kSCNetworkInterfaceTypeVLAN)) {
 			SCNetworkInterfaceRef	vlan_physical;
 
 			vlan_physical = SCVLANInterfaceGetPhysicalInterface((SCNetworkInterfaceRef)interfacePrivate);
@@ -3180,7 +3460,6 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 				__SCNetworkInterfaceSetService(vlan_physical, service);
 			}
 		}
-#endif	// !TARGET_OS_IPHONE
 	}
 
 	if (CFEqual(ifType, kSCValNetInterfaceTypePPP)) {
@@ -3191,6 +3470,14 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef		allocator,
 							       kSCNetworkInterfaceTypePPP);
 		CFRelease(interfacePrivate);
 		interfacePrivate = (SCNetworkInterfacePrivateRef)parent;
+	} else if (CFEqual(ifType, kSCValNetInterfaceTypeVPN)) {
+		SCNetworkInterfaceRef   parent;
+
+		// create parent
+		parent = SCNetworkInterfaceCreateWithInterface((SCNetworkInterfaceRef)interfacePrivate,
+							       kSCNetworkInterfaceTypeVPN);
+		CFRelease(interfacePrivate);
+		interfacePrivate = (SCNetworkInterfacePrivateRef)parent;
 	}
 
 	return (SCNetworkInterfaceRef)interfacePrivate;
@@ -3212,6 +3499,7 @@ __SCNetworkInterfaceCopyAll_IONetworkInterface(void)
 
 	matching = IOServiceMatching(kIONetworkInterfaceClass);
 	new_interfaces = findMatchingInterfaces(matching, processNetworkInterface);
+	CFRelease(matching);
 
 	return new_interfaces;
 }
@@ -3239,6 +3527,7 @@ __SCNetworkInterfaceCopyAll_Modem()
 				      &kCFTypeDictionaryKeyCallBacks,
 				      &kCFTypeDictionaryValueCallBacks);
 	new_interfaces = findMatchingInterfaces(matching, processSerialInterface);
+	CFRelease(matching);
 
 	return new_interfaces;
 }
@@ -3266,6 +3555,7 @@ __SCNetworkInterfaceCopyAll_RS232()
 				      &kCFTypeDictionaryKeyCallBacks,
 				      &kCFTypeDictionaryValueCallBacks);
 	new_interfaces = findMatchingInterfaces(matching, processSerialInterface);
+	CFRelease(matching);
 
 	return new_interfaces;
 }
@@ -3357,13 +3647,11 @@ __waitForInterfaces()
 
 
 CFArrayRef /* of SCNetworkInterfaceRef's */
-SCNetworkInterfaceCopyAll()
+_SCNetworkInterfaceCopyAllWithPreferences(SCPreferencesRef prefs)
 {
 	CFMutableArrayRef	all_interfaces;
 	CFArrayRef		new_interfaces;
-#if	!TARGET_OS_IPHONE
-	SCPreferencesRef	prefs;
-#endif	// !TARGET_OS_IPHONE
+	Boolean			temp_preferences	= FALSE;
 
 	/* initialize runtime */
 	pthread_once(&initialized, __SCNetworkInterfaceInitialize);
@@ -3394,9 +3682,13 @@ SCNetworkInterfaceCopyAll()
 		CFRelease(new_interfaces);
 	}
 
-#if	!TARGET_OS_IPHONE
-	// get virtual network interfaces (Bond, VLAN)
-	prefs = SCPreferencesCreate(NULL, CFSTR("SCNetworkInterfaceCopyAll"), NULL);
+	// get virtual network interfaces (Bond, Bridge, VLAN)
+	if (prefs == NULL) {
+		prefs = SCPreferencesCreate(NULL, CFSTR("SCNetworkInterfaceCopyAll"), NULL);
+		if (prefs != NULL) {
+			temp_preferences = TRUE;
+		}
+	}
 	if (prefs != NULL) {
 		new_interfaces = SCBondInterfaceCopyAll(prefs);
 		if (new_interfaces != NULL) {
@@ -3404,15 +3696,20 @@ SCNetworkInterfaceCopyAll()
 			CFRelease(new_interfaces);
 		}
 
+		new_interfaces = SCBridgeInterfaceCopyAll(prefs);
+		if (new_interfaces != NULL) {
+			add_interfaces(all_interfaces, new_interfaces);
+			CFRelease(new_interfaces);
+		}
+
 		new_interfaces = SCVLANInterfaceCopyAll(prefs);
 		if (new_interfaces != NULL) {
 			add_interfaces(all_interfaces, new_interfaces);
 			CFRelease(new_interfaces);
 		}
 
-		CFRelease(prefs);
+		if (temp_preferences) CFRelease(prefs);
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	// all interfaces have been identified, order and return
 	sort_interfaces(all_interfaces);
@@ -3421,6 +3718,16 @@ SCNetworkInterfaceCopyAll()
 }
 
 
+CFArrayRef /* of SCNetworkInterfaceRef's */
+SCNetworkInterfaceCopyAll()
+{
+	CFArrayRef	all_interfaces;
+
+	all_interfaces = _SCNetworkInterfaceCopyAllWithPreferences(NULL);
+	return all_interfaces;
+}
+
+
 CFArrayRef /* of kSCNetworkInterfaceTypeXXX CFStringRef's */
 SCNetworkInterfaceGetSupportedInterfaceTypes(SCNetworkInterfaceRef interface)
 {
@@ -3456,6 +3763,14 @@ SCNetworkInterfaceGetSupportedInterfaceTypes(SCNetworkInterfaceRef interface)
 				CFArrayAppendValue(interfacePrivate->supported_interface_types, kSCNetworkInterfaceTypeIPSec);
 			}
 		}
+	} else {
+		SCNetworkInterfaceRef	child;
+
+		child = SCNetworkInterfaceGetInterface(interface);
+		if ((child != NULL) && CFEqual(child, kSCNetworkInterfaceIPv4)) {
+			interfacePrivate->supported_interface_types = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+			CFArrayAppendValue(interfacePrivate->supported_interface_types, kSCNetworkInterfaceTypeVPN);
+		}
 	}
 
     done :
@@ -3483,11 +3798,6 @@ SCNetworkInterfaceGetSupportedProtocolTypes(SCNetworkInterfaceRef interface)
 	if (i != kCFNotFound) {
 		if (configurations[i].supported_protocols != doNone) {
 			interfacePrivate->supported_protocol_types = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-#if	!TARGET_OS_IPHONE
-			if (configurations[i].supported_protocols & doAppleTalk) {
-				CFArrayAppendValue(interfacePrivate->supported_protocol_types, kSCNetworkProtocolTypeAppleTalk);
-			}
-#endif	// !TARGET_OS_IPHONE
 			if (configurations[i].supported_protocols & doDNS) {
 				CFArrayAppendValue(interfacePrivate->supported_protocol_types, kSCNetworkProtocolTypeDNS);
 			}
@@ -3531,6 +3841,12 @@ SCNetworkInterfaceCreateWithInterface(SCNetworkInterfaceRef child, CFStringRef i
 		return NULL;
 	}
 
+	if (CFEqual(child, kSCNetworkInterfaceLoopback)) {
+		// can't layer on top of loopback
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
+
 	childIndex = findConfiguration(childPrivate->interface_type);
 
 	parentPrivate = __SCNetworkInterfaceCreatePrivate(NULL,
@@ -3605,10 +3921,60 @@ SCNetworkInterfaceCreateWithInterface(SCNetworkInterfaceRef child, CFStringRef i
 		parentPrivate->interface_type = kSCNetworkInterfaceTypeIPSec;
 		parentPrivate->localized_key  = CFSTR("ipsec");
 		parentPrivate->entity_type    = kSCValNetInterfaceTypeIPSec;
+	} else 	if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN)) {
+		if (childIndex != kCFNotFound) {
+			// if not a "vendor" child interface
+			goto fail;
+		}
+
+		parentPrivate->interface_type = kSCNetworkInterfaceTypeVPN;
+		parentPrivate->localized_key  = CFSTR("vpn");
+		parentPrivate->localized_arg1 = CFRetain(childPrivate->entity_type);
+		parentPrivate->entity_type    = kSCValNetInterfaceTypeVPN;
+		parentPrivate->entity_subtype = childPrivate->entity_type;
+		if (childPrivate->entity_device != NULL) {
+			parentPrivate->entity_device = CFStringCreateCopy(NULL, childPrivate->entity_device);
+		}
+		if (parentPrivate->entity_subtype != NULL) {
+			CFArrayRef	components;
+			CFIndex		n;
+			CFStringRef	vpnType;
+
+			//
+			// the "default" interface name is derived from the VPN type
+			//
+			// e.g.
+			//	com.apple.Apple-VPN.vpnplugin --> "Apple VPN"
+			//	          ^^^^^^^^^
+			//
+			vpnType = parentPrivate->entity_subtype;
+			components = CFStringCreateArrayBySeparatingStrings(NULL, vpnType, CFSTR("."));
+			n = CFArrayGetCount(components);
+			if ((n >= 4) &&
+			    CFEqual(CFArrayGetValueAtIndex(components, n - 1), CFSTR("vpnplugin"))) {
+				CFMutableStringRef	str;
+
+				str = CFStringCreateMutableCopy(NULL,
+								0,
+								CFArrayGetValueAtIndex(components, n - 2));
+				(void) CFStringFindAndReplace(str,
+							      CFSTR("-"),
+							      CFSTR(" "),
+							      CFRangeMake(0, CFStringGetLength(str)),
+							      0);
+				parentPrivate->localized_name = str;
+			}
+			CFRelease(components);
+		}
 	} else if (CFStringFind(interfaceType, CFSTR("."), 0).location != kCFNotFound) {
 		// if custom interface type
-		parentPrivate->interface_type = interfaceType;
-		parentPrivate->entity_type    = interfaceType;			// interface config goes into a
+		if (vendor_interface_types == NULL) {
+			vendor_interface_types = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+		}
+		CFSetAddValue(vendor_interface_types, interfaceType);
+
+		parentPrivate->interface_type = CFSetGetValue(vendor_interface_types, interfaceType);
+		parentPrivate->entity_type    = parentPrivate->interface_type;	// interface config goes into a
 										// a dictionary with the same
 										// name as the interfaceType
 	} else {
@@ -3616,6 +3982,8 @@ SCNetworkInterfaceCreateWithInterface(SCNetworkInterfaceRef child, CFStringRef i
 		goto fail;
 	}
 
+	parentPrivate->hidden = childPrivate->hidden;
+
 	if (childPrivate->overrides != NULL) {
 		parentPrivate->overrides = CFDictionaryCreateMutableCopy(NULL, 0, childPrivate->overrides);
 	}
@@ -3911,7 +4279,8 @@ copy_display_name(SCNetworkInterfaceRef interface, Boolean localized, Boolean ol
 		SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)interface;
 
 		if ((interfacePrivate->interface != NULL) &&
-		    (interfacePrivate->interface != kSCNetworkInterfaceIPv4)) {
+		    (interfacePrivate->interface != kSCNetworkInterfaceIPv4) &&
+		    !CFEqual(interfacePrivate->interface_type, kSCNetworkInterfaceTypeVPN)) {
 			child = interfacePrivate->interface;
 		}
 
@@ -3988,6 +4357,7 @@ copy_display_name(SCNetworkInterfaceRef interface, Boolean localized, Boolean ol
 }
 
 
+#if	!TARGET_OS_EMBEDDED && !TARGET_IPHONE_SIMULATOR
 __private_extern__
 CFStringRef
 __SCNetworkInterfaceCopyXLocalizedDisplayName(SCNetworkInterfaceRef interface)
@@ -4018,6 +4388,7 @@ __SCNetworkInterfaceCopyXNonLocalizedDisplayName(SCNetworkInterfaceRef interface
 	localized_name = copy_display_name(interface, FALSE, TRUE);
 	return localized_name;
 }
+#endif	// !TARGET_OS_EMBEDDED && !TARGET_IPHONE_SIMULATOR
 
 
 __private_extern__
@@ -4059,13 +4430,13 @@ SCNetworkInterfaceGetLocalizedDisplayName(SCNetworkInterfaceRef interface)
 
 __private_extern__
 CFDictionaryRef
-__SCNetworkInterfaceGetTemplateOverrides(SCNetworkInterfaceRef interface, CFStringRef interfaceType)
+__SCNetworkInterfaceGetTemplateOverrides(SCNetworkInterfaceRef interface, CFStringRef overrideType)
 {
 	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)interface;
 	CFDictionaryRef			overrides		= NULL;
 
 	if (interfacePrivate->overrides != NULL) {
-		overrides = CFDictionaryGetValue(interfacePrivate->overrides, interfaceType);
+		overrides = CFDictionaryGetValue(interfacePrivate->overrides, overrideType);
 	}
 
 	return overrides;
@@ -4309,7 +4680,7 @@ __SCNetworkInterfaceForceConfigurationRefresh_helper(SCPreferencesRef prefs, CFS
 	uint32_t		status		= kSCStatusOK;
 	CFDataRef		reply		= NULL;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		ok = __SCPreferencesCreate_helper(prefs);
 		if (!ok) {
 			return FALSE;
@@ -4325,7 +4696,7 @@ __SCNetworkInterfaceForceConfigurationRefresh_helper(SCPreferencesRef prefs, CFS
 	// have the helper "refresh" the configuration
 	status = kSCStatusOK;
 	reply  = NULL;
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_INTERFACE_REFRESH,
 			   data,
 			   &status,
@@ -4344,9 +4715,8 @@ __SCNetworkInterfaceForceConfigurationRefresh_helper(SCPreferencesRef prefs, CFS
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -4554,6 +4924,18 @@ checkInterfacePassword(SCNetworkInterfaceRef		interface,
 			goto error;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFStringRef	interfaceType;
+
+			interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
+			if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN)) {
+				// if VPN interface
+				break;
+			}
+
+			goto error;
+		}
+
 		default :
 			break;
 	}
@@ -4671,6 +5053,27 @@ SCNetworkInterfaceCheckPassword(SCNetworkInterfaceRef		interface,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFDictionaryRef	config;
+			CFStringRef	vpn_id;
+
+			// get configuration
+			config = SCNetworkInterfaceGetConfiguration(interface);
+
+			// get serviceID
+			vpn_id = getPasswordID(config, serviceID);
+
+			// check
+			exists = __extract_password(prefs,
+						    config,
+						    kSCPropNetVPNAuthPassword,
+						    kSCPropNetVPNAuthPasswordEncryption,
+						    kSCValNetVPNAuthPasswordEncryptionKeychain,
+						    vpn_id,
+						    NULL);
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return FALSE;
@@ -4786,6 +5189,27 @@ SCNetworkInterfaceCopyPassword(SCNetworkInterfaceRef		interface,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFDictionaryRef	config;
+			CFStringRef	vpn_id;
+
+			// get configuration
+			config = SCNetworkInterfaceGetConfiguration(interface);
+
+			// get serviceID
+			vpn_id = getPasswordID(config, serviceID);
+
+			// extract
+			(void) __extract_password(prefs,
+						  config,
+						  kSCPropNetVPNAuthPassword,
+						  kSCPropNetVPNAuthPasswordEncryption,
+						  kSCValNetVPNAuthPasswordEncryptionKeychain,
+						  vpn_id,
+						  &password);
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return NULL;
@@ -4925,6 +5349,32 @@ SCNetworkInterfaceRemovePassword(SCNetworkInterfaceRef		interface,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			CFDictionaryRef	config;
+			CFDictionaryRef	newConfig	= NULL;
+			CFStringRef	vpn_id;
+
+			// get configuration
+			config = SCNetworkInterfaceGetConfiguration(interface);
+
+			// get serviceID
+			vpn_id = getPasswordID(config, serviceID);
+
+			// remove password
+			ok = __remove_password(prefs,
+					       config,
+					       kSCPropNetVPNAuthPassword,
+					       kSCPropNetVPNAuthPasswordEncryption,
+					       kSCValNetVPNAuthPasswordEncryptionKeychain,
+					       vpn_id,
+					       &newConfig);
+			if (ok) {
+				ok = SCNetworkInterfaceSetConfiguration(interface, newConfig);
+				if (newConfig != NULL) CFRelease(newConfig);
+			}
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			return FALSE;
@@ -5097,7 +5547,7 @@ SCNetworkInterfaceSetPassword(SCNetworkInterfaceRef		interface,
 			// set password
 			ok = _SCPreferencesSystemKeychainPasswordItemSet(prefs,
 									 shared_id,
-									 (label != NULL)       ? label       : CFSTR("VPN Connection"),
+									 (label != NULL)       ? label       : CFSTR("Network Connection"),
 									 (description != NULL) ? description : CFSTR("IPSec Shared Secret"),
 									 account,
 									 password,
@@ -5145,13 +5595,14 @@ SCNetworkInterfaceSetPassword(SCNetworkInterfaceRef		interface,
 			// get 802.1X identifier
 			if (config != NULL) {
 				unique_id = CFDictionaryGetValue(config, kEAPClientPropUserPasswordKeychainItemID);
+				unique_id = isA_CFString(unique_id);
 			}
-			if (isA_CFString(unique_id)) {
+			if (unique_id != NULL) {
 				CFRetain(unique_id);
 			} else {
 				CFUUIDRef	uuid;
 
-				uuid     = CFUUIDCreate(NULL);
+				uuid      = CFUUIDCreate(NULL);
 				unique_id = CFUUIDCreateString(NULL, uuid);
 				CFRelease(uuid);
 			}
@@ -5268,7 +5719,7 @@ SCNetworkInterfaceSetPassword(SCNetworkInterfaceRef		interface,
 			// store password
 			ok = _SCPreferencesSystemKeychainPasswordItemSet(prefs,
 									 xauth_id,
-									 (label != NULL)       ? label       : CFSTR("VPN Connection"),
+									 (label != NULL)       ? label       : CFSTR("Network Connection"),
 									 (description != NULL) ? description : CFSTR("IPSec XAuth Password"),
 									 account,
 									 password,
@@ -5300,6 +5751,81 @@ SCNetworkInterfaceSetPassword(SCNetworkInterfaceRef		interface,
 			break;
 		}
 
+		case kSCNetworkInterfacePasswordTypeVPN : {
+			SCNetworkServiceRef	service	= NULL;
+			CFStringRef		vpn_id;
+
+			// get configuration
+			config = SCNetworkInterfaceGetConfiguration(interface);
+
+			// get serviceID
+			vpn_id = getPasswordID(config, serviceID);
+
+			// get "Account", "Name", "Kind"
+			if (config != NULL) {
+				// auth name --> keychain "Account"
+				account = CFDictionaryGetValue(config, kSCPropNetVPNAuthName);
+
+				// VPN [user defined] "name" --> keychain "Name"
+				label = CFDictionaryGetValue(config, kSCPropUserDefinedName);
+			}
+
+			if (label == NULL) {
+				// service name --> keychain "Name"
+				service = (SCNetworkServiceRef)__SCNetworkServiceCreatePrivate(NULL,
+											       prefs,
+											       serviceID,
+											       interface);
+
+				label = SCNetworkServiceGetName(service);
+				if (label == NULL) {
+					// interface name --> keychain "Name"
+					label = SCNetworkInterfaceGetLocalizedDisplayName(interface);
+				}
+			}
+
+			if (bundle != NULL) {
+				// "VPN Password" --> keychain "Kind"
+				description = CFBundleCopyLocalizedString(bundle,
+									  CFSTR("KEYCHAIN_KIND_VPN_PASSWORD"),
+									  CFSTR("VPN Password"),
+									  NULL);
+			}
+
+			// store password
+			ok = _SCPreferencesSystemKeychainPasswordItemSet(prefs,
+									 vpn_id,
+									 (label != NULL)       ? label       : CFSTR("Network Connection"),
+									 (description != NULL) ? description : CFSTR("VPN Password"),
+									 account,
+									 password,
+									 options);
+			if (ok) {
+				CFMutableDictionaryRef	newConfig;
+
+				if (config != NULL) {
+					newConfig = CFDictionaryCreateMutableCopy(NULL, 0, config);
+				} else {
+					newConfig = CFDictionaryCreateMutable(NULL,
+									      0,
+									      &kCFTypeDictionaryKeyCallBacks,
+									      &kCFTypeDictionaryValueCallBacks);
+				}
+				CFDictionarySetValue(newConfig,
+						     kSCPropNetVPNAuthPassword,
+						     vpn_id);
+				CFDictionarySetValue(newConfig,
+						     kSCPropNetVPNAuthPasswordEncryption,
+						     kSCValNetVPNAuthPasswordEncryptionKeychain);
+				ok = SCNetworkInterfaceSetConfiguration(interface, newConfig);
+				CFRelease(newConfig);
+			}
+
+			if (description != NULL) CFRelease(description);
+			if (service     != NULL) CFRelease(service);
+			break;
+		}
+
 		default :
 			_SCErrorSet(kSCStatusInvalidArgument);
 			break;
@@ -5485,9 +6011,26 @@ _SCNetworkInterfaceCopySlashDevPath(SCNetworkInterfaceRef interface)
 
 		overrides = IORegistryEntrySearchCFProperty(device,
 							    kIOServicePlane,
-							    CFSTR("DeviceModemOverrides"),
+							    kSCNetworkInterfaceNetworkConfigurationOverridesKey,
 							    NULL,
 							    kIORegistryIterateRecursively | kIORegistryIterateParents);
+		if (overrides != NULL) {
+			CFDictionaryRef	modemOverrides;
+
+			modemOverrides = CFDictionaryGetValue(overrides, kSCEntNetModem);
+			if (modemOverrides != NULL) {
+				CFRetain(modemOverrides);
+			}
+			CFRelease(overrides);
+			overrides = modemOverrides;
+		}
+		if (overrides == NULL) {
+			overrides = IORegistryEntrySearchCFProperty(device,
+								    kIOServicePlane,
+								    CFSTR("DeviceModemOverrides"),
+								    NULL,
+								    kIORegistryIterateRecursively | kIORegistryIterateParents);
+		}
 		if (overrides != NULL) {
 			if (isA_CFDictionary(overrides)) {
 				CFStringRef	matchIdentifier;
@@ -5528,7 +6071,34 @@ _SCNetworkInterfaceIsBluetoothPAN(SCNetworkInterfaceRef interface)
 {
 	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)interface;
 
-	return (interfacePrivate->sort_order == kSortBluetoothPAN);
+	return (interfacePrivate->sort_order == kSortBluetoothPAN_GN);
+}
+
+
+Boolean
+_SCNetworkInterfaceIsBluetoothPAN_NAP(SCNetworkInterfaceRef interface)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)interface;
+
+	return (interfacePrivate->sort_order == kSortBluetoothPAN_NAP);
+}
+
+
+Boolean
+_SCNetworkInterfaceIsBluetoothP2P(SCNetworkInterfaceRef interface)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)interface;
+
+	return (interfacePrivate->sort_order == kSortBluetoothPAN_U);
+}
+
+
+Boolean
+_SCNetworkInterfaceIsHiddenConfiguration(SCNetworkInterfaceRef interface)
+{
+	SCNetworkInterfacePrivateRef	interfacePrivate	= (SCNetworkInterfacePrivateRef)interface;
+
+	return interfacePrivate->hidden;
 }
 
 
@@ -5616,6 +6186,7 @@ __SCNetworkInterfaceCreateCopy(CFAllocatorRef		allocator,
 	if (oldPrivate->configurationAction != NULL) {
 		newPrivate->configurationAction	= CFRetain(oldPrivate->configurationAction);
 	}
+	newPrivate->hidden			= oldPrivate->hidden;
 	if (oldPrivate->location != NULL) {
 		newPrivate->location		= CFRetain(oldPrivate->location);
 	}
@@ -5642,7 +6213,7 @@ __SCNetworkInterfaceCreateCopy(CFAllocatorRef		allocator,
 		newPrivate->usb.pid		= CFRetain(oldPrivate->usb.pid);
 	}
 	newPrivate->sort_order			= oldPrivate->sort_order;
-#if	!TARGET_OS_IPHONE
+
 	newPrivate->supportsBond		= oldPrivate->supportsBond;
 	if (oldPrivate->bond.interfaces != NULL) {
 		newPrivate->bond.interfaces	= CFRetain(oldPrivate->bond.interfaces);
@@ -5653,6 +6224,15 @@ __SCNetworkInterfaceCreateCopy(CFAllocatorRef		allocator,
 	if (oldPrivate->bond.options != NULL) {
 		newPrivate->bond.options	= CFRetain(oldPrivate->bond.options);
 	}
+
+	newPrivate->supportsBridge		= oldPrivate->supportsBridge;
+	if (oldPrivate->bridge.interfaces != NULL) {
+		newPrivate->bridge.interfaces	= CFRetain(oldPrivate->bridge.interfaces);
+	}
+	if (oldPrivate->bridge.options != NULL) {
+		newPrivate->bridge.options	= CFRetain(oldPrivate->bridge.options);
+	}
+
 	newPrivate->supportsVLAN		= oldPrivate->supportsVLAN;
 	if (oldPrivate->vlan.interface != NULL) {
 		newPrivate->vlan.interface	= CFRetain(oldPrivate->vlan.interface);
@@ -5663,7 +6243,6 @@ __SCNetworkInterfaceCreateCopy(CFAllocatorRef		allocator,
 	if (oldPrivate->vlan.options != NULL) {
 		newPrivate->vlan.options	= CFRetain(oldPrivate->vlan.options);
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	return newPrivate;
 }
@@ -5732,6 +6311,51 @@ __SCNetworkInterfaceCopyDeepConfiguration(SCNetworkSetRef set, SCNetworkInterfac
 }
 
 
+__private_extern__ Boolean
+__SCNetworkInterfaceIsMember(SCPreferencesRef prefs, SCNetworkInterfaceRef interface)
+{
+	CFArrayRef	interfaces;
+	Boolean		match		= FALSE;
+	CFMutableSetRef	members;
+
+	members = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+
+	// add Bond [member] interfaces
+	interfaces = SCBondInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		__SCBondInterfaceListCollectMembers(interfaces, members);
+		CFRelease(interfaces);
+	}
+
+	// add Bridge [member] interfaces
+	interfaces = SCBridgeInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		__SCBridgeInterfaceListCollectMembers(interfaces, members);
+		CFRelease(interfaces);
+	}
+
+	if (CFSetGetCount(members) == 0) {
+		goto done;
+	}
+
+	while (interface != NULL) {
+		match = CFSetContainsValue(members, interface);
+		if (match) {
+			// if the interface is a member of an
+			// Ethernet Bond or Bridge
+			break;
+		}
+
+		interface = SCNetworkInterfaceGetInterface(interface);
+	}
+
+    done :
+
+	CFRelease(members);
+	return match;
+}
+
+
 __private_extern__
 void
 __SCNetworkInterfaceSetDeepConfiguration(SCNetworkSetRef set, SCNetworkInterfaceRef interface, CFArrayRef configs)
diff --git a/SystemConfiguration.fproj/SCNetworkReachability.c b/SystemConfiguration.fproj/SCNetworkReachability.c
index 6a8818d..7cc048c 100644
--- a/SystemConfiguration.fproj/SCNetworkReachability.c
+++ b/SystemConfiguration.fproj/SCNetworkReachability.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2003-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -34,9 +34,7 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreFoundation/CFRuntime.h>
 #include <SystemConfiguration/SystemConfiguration.h>
@@ -72,12 +70,38 @@
 
 #include <ppp/ppp_msg.h>
 
+#if	!TARGET_IPHONE_SIMULATOR
+#include <ppp/PPPControllerPriv.h>
+#endif	// !TARGET_IPHONE_SIMULATOR
+
+
+
+#if	((__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 40000)) && !TARGET_IPHONE_SIMULATOR
+#define	HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+#endif	// ((__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 40000)) && !TARGET_IPHONE_SIMULATOR
+
+#if	((__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 40000)) && !TARGET_IPHONE_SIMULATOR && !TARGET_OS_EMBEDDED_OTHER
+#define	HAVE_IPSEC_STATUS
+#define	HAVE_VPN_STATUS
+#endif	// ((__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 40000)) && !TARGET_IPHONE_SIMULATOR && !TARGET_OS_EMBEDDED_OTHER
+
+
+#ifdef	HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+/* Libinfo SPI */
+mach_port_t
+_getaddrinfo_interface_async_call(const char			*nodename,
+				  const char			*servname,
+				  const struct addrinfo		*hints,
+				  const char			*interface,
+				  getaddrinfo_async_callback	callback,
+				  void				*context);
+#endif	/* HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL */
 
 
 #define kSCNetworkReachabilityFlagsFirstResolvePending	(1<<31)
 
 
-#define	N_QUICK	32
+#define	N_QUICK	64
 
 
 typedef enum {
@@ -96,12 +120,9 @@ static Boolean
 __SCNetworkReachabilityScheduleWithRunLoop	(SCNetworkReachabilityRef	target,
 						 CFRunLoopRef			runLoop,
 						 CFStringRef			runLoopMode,
-#if	!TARGET_OS_IPHONE
 						 dispatch_queue_t		queue,
-#else	// !TARGET_OS_IPHONE
-						 void				*queue,
-#endif	// !TARGET_OS_IPHONE
 						 Boolean			onDemand);
+
 static Boolean
 __SCNetworkReachabilityUnscheduleFromRunLoop	(SCNetworkReachabilityRef	target,
 						 CFRunLoopRef			runLoop,
@@ -111,7 +132,7 @@ __SCNetworkReachabilityUnscheduleFromRunLoop	(SCNetworkReachabilityRef	target,
 
 typedef struct {
 	SCNetworkReachabilityFlags	flags;
-	uint16_t			if_index;
+	unsigned int			if_index;
 	Boolean				sleeping;
 } ReachabilityInfo;
 
@@ -135,6 +156,10 @@ typedef struct {
 	CFArrayRef			resolvedAddress;	/* CFArray[CFData] */
 	int				resolvedAddressError;
 
+	/* [scoped routing] interface constraints */
+	unsigned int			if_index;
+	char				if_name[IFNAMSIZ];
+
 	/* local & remote addresses */
 	struct sockaddr			*localAddress;
 	struct sockaddr			*remoteAddress;
@@ -150,11 +175,9 @@ typedef struct {
 	SCNetworkReachabilityContext	rlsContext;
 	CFMutableArrayRef		rlList;
 
-#if	!TARGET_OS_IPHONE
 	dispatch_queue_t		dispatchQueue;		// SCNetworkReachabilitySetDispatchQueue
 	dispatch_queue_t		asyncDNSQueue;
 	dispatch_source_t		asyncDNSSource;
-#endif	// !TARGET_OS_IPHONE
 
 	/* [async] DNS query info */
 	Boolean				haveDNS;
@@ -193,8 +216,8 @@ static const CFRuntimeClass __SCNetworkReachabilityClass = {
 
 
 static pthread_once_t		initialized	= PTHREAD_ONCE_INIT;
-static ReachabilityInfo		NOT_REACHABLE	= { 0,		0,	FALSE };
-static ReachabilityInfo		NOT_REPORTED	= { 0xFFFFFFFF,	0,	FALSE };
+static const ReachabilityInfo	NOT_REACHABLE	= { 0,		0,	FALSE };
+static const ReachabilityInfo	NOT_REPORTED	= { 0xFFFFFFFF,	0,	FALSE };
 static int			rtm_seq		= 0;
 
 
@@ -212,12 +235,7 @@ static IOPMSystemPowerStateCapabilities	power_capabilities	= kIOPMSytemPowerStat
 
 static pthread_mutex_t		hn_lock		= PTHREAD_MUTEX_INITIALIZER;
 static SCDynamicStoreRef	hn_store	= NULL;
-#if	!TARGET_OS_IPHONE
 static dispatch_queue_t		hn_dispatchQueue = NULL;
-#else	// !TARGET_OS_IPHONE
-static CFRunLoopSourceRef	hn_storeRLS	= NULL;
-static CFMutableArrayRef	hn_rlList	= NULL;
-#endif	// !TARGET_OS_IPHONE
 static CFMutableSetRef		hn_targets	= NULL;
 
 
@@ -273,98 +291,256 @@ __log_query_time(SCNetworkReachabilityRef target, Boolean found, Boolean async,
 }
 
 
-static int
-updatePPPStatus(SCDynamicStoreRef		*storeP,
-		const struct sockaddr		*sa,
-		const char			*if_name,
-		SCNetworkReachabilityFlags	*flags,
-		CFStringRef			*ppp_server,
-		const char			*log_prefix)
+static __inline__ Boolean
+__reach_equal(ReachabilityInfo *r1, ReachabilityInfo *r2)
 {
-	CFDictionaryRef		dict		= NULL;
+	if ((r1->flags    == r2->flags   ) &&
+	    (r1->if_index == r2->if_index) &&
+	    (r1->sleeping == r2->sleeping)) {
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+
+typedef struct {
+	SCDynamicStoreRef	store;
+	Boolean			storeAdded;
 	CFStringRef		entity;
-	CFIndex			i;
-	const void *		keys_q[N_QUICK];
-	const void **		keys		= keys_q;
+	CFDictionaryRef		dict;
 	CFIndex			n;
-	CFStringRef		ppp_if;
-	int			sc_status	= kSCStatusReachabilityUnknown;
-	SCDynamicStoreRef	store		= *storeP;
+	const void **		keys;
+	const void *		keys_q[N_QUICK];
+	const void **		values;
 	const void *		values_q[N_QUICK];
-	const void **		values	= values_q;
+} ReachabilityStoreInfo, *ReachabilityStoreInfoRef;
 
-	switch (sa->sa_family) {
+
+static void
+initReachabilityStoreInfo(ReachabilityStoreInfoRef store_info)
+{
+	bzero(store_info, sizeof(ReachabilityStoreInfo));
+	return;
+}
+
+
+static Boolean
+updateReachabilityStoreInfo(ReachabilityStoreInfoRef	store_info,
+			    SCDynamicStoreRef		*storeP,
+			    sa_family_t			sa_family)
+{
+	CFStringRef		pattern;
+	CFMutableArrayRef	patterns;
+
+	switch (sa_family) {
+		case AF_UNSPEC :
+			store_info->entity = NULL;
+			break;
 		case AF_INET :
-			entity = kSCEntNetIPv4;
+			store_info->entity = kSCEntNetIPv4;
 			break;
 		case AF_INET6 :
-			entity = kSCEntNetIPv6;
+			store_info->entity = kSCEntNetIPv6;
 			break;
 		default :
-			goto done;
+			return FALSE;
 	}
 
-	if (store == NULL) {
-		store = SCDynamicStoreCreate(NULL, CFSTR("SCNetworkReachability"), NULL, NULL);
-		if (store == NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("updatePPPStatus SCDynamicStoreCreate() failed"));
-			goto done;
+	if (store_info->dict != NULL) {
+		// if info already available
+		return TRUE;
+	}
+
+	if (store_info->store == NULL) {
+		store_info->store = (storeP != NULL) ? *storeP : NULL;
+		if (store_info->store == NULL) {
+			store_info->store = SCDynamicStoreCreate(NULL, CFSTR("SCNetworkReachability"), NULL, NULL);
+			if (store_info->store == NULL) {
+				SCLog(TRUE, LOG_ERR, CFSTR("updateReachabilityStoreInfo SCDynamicStoreCreate() failed"));
+				return FALSE;
+			}
+
+			if (storeP != NULL) {
+				/// pass back the allocated SCDynamicStoreRef
+				*storeP = store_info->store;
+			} else {
+				// this one is ours
+				store_info->storeAdded = TRUE;
+			}
 		}
-		*storeP = store;
 	}
 
-	// grab a snapshot of the PPP configuration from the dynamic store
-	{
-		CFStringRef		pattern;
-		CFMutableArrayRef	patterns;
-
-		patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainState,
-								      kSCCompAnyRegex,
-								      entity);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainSetup,
-								      kSCCompAnyRegex,
-								      kSCEntNetPPP);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainState,
-								      kSCCompAnyRegex,
-								      kSCEntNetPPP);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		dict = SCDynamicStoreCopyMultiple(store, NULL, patterns);
-		CFRelease(patterns);
-	}
-	if (dict == NULL) {
-		// if we could not access the dynamic store
-		goto done;
+	if (sa_family == AF_UNSPEC) {
+		// if the address family was not specified than
+		// all we wanted, for now, was to establish the
+		// SCDynamicStore session
+		return TRUE;
 	}
 
-	sc_status = kSCStatusOK;
+	patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 
-	// look for the service which matches the provided interface
-	n = CFDictionaryGetCount(dict);
-	if (n <= 0) {
-		goto done;
+	// get info for IPv4 services
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv4);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv4);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+	// get info for IPv6 services
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv6);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv6);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+	// get info for PPP services
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetPPP);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetPPP);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+#if	!TARGET_IPHONE_SIMULATOR
+	// get info for VPN services
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetVPN);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetVPN);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+#endif	// !TARGET_IPHONE_SIMULATOR
+
+	// get info for IPSec services
+//	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+//							      kSCDynamicStoreDomainSetup,
+//							      kSCCompAnyRegex,
+//							      kSCEntNetIPSec);
+//	CFArrayAppendValue(patterns, pattern);
+//	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPSec);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+	// get info to identify "available" services
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetInterface);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+
+	// get the SCDynamicStore info
+	store_info->dict = SCDynamicStoreCopyMultiple(store_info->store, NULL, patterns);
+	CFRelease(patterns);
+	if (store_info->dict == NULL) {
+		return FALSE;
+	}
+
+	// and extract the keys/values for post-processing
+	store_info->n = CFDictionaryGetCount(store_info->dict);
+	if (store_info->n > 0) {
+		if (store_info->n <= (CFIndex)(sizeof(store_info->keys_q) / sizeof(CFTypeRef))) {
+			store_info->keys   = store_info->keys_q;
+			store_info->values = store_info->values_q;
+		} else {
+			store_info->keys   = CFAllocatorAllocate(NULL, store_info->n * sizeof(CFTypeRef), 0);
+			store_info->values = CFAllocatorAllocate(NULL, store_info->n * sizeof(CFTypeRef), 0);
+		}
+		CFDictionaryGetKeysAndValues(store_info->dict,
+					     store_info->keys,
+					     store_info->values);
+	}
+
+	return TRUE;
+}
+
+
+static void
+freeReachabilityStoreInfo(ReachabilityStoreInfoRef store_info)
+{
+	if ((store_info->n > 0) && (store_info->keys != store_info->keys_q)) {
+		CFAllocatorDeallocate(NULL, store_info->keys);
+		store_info->keys = NULL;
+
+		CFAllocatorDeallocate(NULL, store_info->values);
+		store_info->values = NULL;
+	}
+
+	if (store_info->dict != NULL) {
+		CFRelease(store_info->dict);
+		store_info->dict = NULL;
+	}
+
+	if (store_info->storeAdded && (store_info->store != NULL)) {
+		CFRelease(store_info->store);
+		store_info->store = NULL;
+	}
+
+	return;
+}
+
+
+static int
+updatePPPStatus(ReachabilityStoreInfoRef	store_info,
+		const struct sockaddr		*sa,
+		const char			*if_name,
+		SCNetworkReachabilityFlags	*flags,
+		CFStringRef			*ppp_server,
+		const char			*log_prefix)
+{
+	CFIndex		i;
+	CFStringRef	ppp_if;
+	int		sc_status	= kSCStatusNoKey;
+
+	if (!updateReachabilityStoreInfo(store_info, NULL, sa->sa_family)) {
+		return kSCStatusReachabilityUnknown;
+	}
+
+	if (store_info->n <= 0) {
+		// if no services
+		return kSCStatusNoKey;
 	}
 
+	// look for the [PPP] service which matches the provided interface
+
 	ppp_if = CFStringCreateWithCStringNoCopy(NULL,
 						 if_name,
 						 kCFStringEncodingASCII,
 						 kCFAllocatorNull);
 
-	if (n > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) {
-		keys   = CFAllocatorAllocate(NULL, n * sizeof(CFTypeRef), 0);
-		values = CFAllocatorAllocate(NULL, n * sizeof(CFTypeRef), 0);
-	}
-	CFDictionaryGetKeysAndValues(dict, keys, values);
-
-	for (i=0; i < n; i++) {
+	for (i=0; i < store_info->n; i++) {
 		CFArrayRef	components;
 		CFStringRef	key;
 		CFNumberRef	num;
@@ -373,16 +549,17 @@ updatePPPStatus(SCDynamicStoreRef		*storeP,
 		int32_t		ppp_demand;
 		int32_t		ppp_status;
 		CFStringRef	service		= NULL;
-		CFStringRef	s_key		= (CFStringRef)    keys[i];
-		CFDictionaryRef	s_dict		= (CFDictionaryRef)values[i];
+		CFStringRef	s_key		= (CFStringRef)    store_info->keys[i];
+		CFDictionaryRef	s_dict		= (CFDictionaryRef)store_info->values[i];
 		CFStringRef	s_if;
 
 		if (!isA_CFString(s_key) || !isA_CFDictionary(s_dict)) {
 			continue;
 		}
 
-		if (!CFStringHasSuffix(s_key, entity)) {
-			continue;	// if not an IPv4 or IPv6 entity
+		if (!CFStringHasSuffix(s_key, store_info->entity) ||
+		    !CFStringHasPrefix(s_key, kSCDynamicStoreDomainState)) {
+			continue;	// if not an active IPv4 or IPv6 entity
 		}
 
 		s_if = CFDictionaryGetValue(s_dict, kSCPropInterfaceName);
@@ -407,13 +584,13 @@ updatePPPStatus(SCDynamicStoreRef		*storeP,
 								  kSCDynamicStoreDomainState,
 								  service,
 								  kSCEntNetPPP);
-		p_state = CFDictionaryGetValue(dict, key);
+		p_state = CFDictionaryGetValue(store_info->dict, key);
 		CFRelease(key);
 		key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 								  kSCDynamicStoreDomainSetup,
 								  service,
 								  kSCEntNetPPP);
-		p_setup = CFDictionaryGetValue(dict, key);
+		p_setup = CFDictionaryGetValue(store_info->dict, key);
 		CFRelease(key);
 		CFRelease(components);
 
@@ -422,6 +599,8 @@ updatePPPStatus(SCDynamicStoreRef		*storeP,
 			break;
 		}
 
+		sc_status = kSCStatusOK;
+
 		*flags |= kSCNetworkReachabilityFlagsTransientConnection;
 
 		// get PPP server
@@ -449,6 +628,11 @@ updatePPPStatus(SCDynamicStoreRef		*storeP,
 				// if we're effectively UP and RUNNING
 				break;
 			case PPP_IDLE :
+				// if we're not connected at all
+				SCLog(_sc_debug, LOG_INFO, CFSTR("%s  PPP link idle"),
+				      log_prefix);
+				*flags |= kSCNetworkReachabilityFlagsConnectionRequired;
+				break;
 			case PPP_STATERESERVED :
 				// if we're not connected at all
 				SCLog(_sc_debug, LOG_INFO, CFSTR("%s  PPP link idle, dial-on-traffic to connect"),
@@ -481,107 +665,35 @@ updatePPPStatus(SCDynamicStoreRef		*storeP,
 	}
 
 	CFRelease(ppp_if);
-	if (keys != keys_q) {
-		CFAllocatorDeallocate(NULL, keys);
-		CFAllocatorDeallocate(NULL, values);
-	}
 
-    done :
-
-	if (dict != NULL)	CFRelease(dict);
 	return sc_status;
 }
 
 
 static int
-updatePPPAvailable(SCDynamicStoreRef		*storeP,
+updatePPPAvailable(ReachabilityStoreInfoRef	store_info,
 		   const struct sockaddr	*sa,
 		   SCNetworkReachabilityFlags	*flags,
 		   const char			*log_prefix)
 {
-	CFDictionaryRef		dict		= NULL;
-	CFStringRef		entity;
-	CFIndex			i;
-	const void *		keys_q[N_QUICK];
-	const void **		keys		= keys_q;
-	CFIndex			n;
-	int			sc_status	= kSCStatusReachabilityUnknown;
-	SCDynamicStoreRef	store		= *storeP;
-	const void *		values_q[N_QUICK];
-	const void **		values	= values_q;
-
-	if (sa == NULL) {
-		entity = kSCEntNetIPv4;
-	} else {
-		switch (sa->sa_family) {
-			case AF_INET :
-				entity = kSCEntNetIPv4;
-				break;
-			case AF_INET6 :
-				entity = kSCEntNetIPv6;
-				break;
-			default :
-				goto done;
-		}
-	}
+	CFIndex		i;
+	int		sc_status	= kSCStatusNoKey;
 
-	if (store == NULL) {
-		store = SCDynamicStoreCreate(NULL, CFSTR("SCNetworkReachability"), NULL, NULL);
-		if (store == NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("updatePPPAvailable SCDynamicStoreCreate() failed"));
-			goto done;
-		}
-		*storeP = store;
+	if (!updateReachabilityStoreInfo(store_info,
+					 NULL,
+					 (sa != NULL) ? sa->sa_family : AF_INET)) {
+		return kSCStatusReachabilityUnknown;
 	}
 
-	// grab a snapshot of the PPP configuration from the dynamic store
-	{
-		CFStringRef		pattern;
-		CFMutableArrayRef	patterns;
-
-		patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainSetup,
-								      kSCCompAnyRegex,
-								      entity);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainSetup,
-								      kSCCompAnyRegex,
-								      kSCEntNetInterface);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainSetup,
-								      kSCCompAnyRegex,
-								      kSCEntNetPPP);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		dict = SCDynamicStoreCopyMultiple(store, NULL, patterns);
-		CFRelease(patterns);
-	}
-	if (dict == NULL) {
-		// if we could not access the dynamic store
-		goto done;
+	if (store_info->n <= 0) {
+		// if no services
+		return kSCStatusNoKey;
 	}
 
-	sc_status = kSCStatusOK;
-
 	// look for an available service which will provide connectivity
 	// for the requested address family.
-	n = CFDictionaryGetCount(dict);
-	if (n <= 0) {
-		goto done;
-	}
-
-	if (n > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) {
-		keys   = CFAllocatorAllocate(NULL, n * sizeof(CFTypeRef), 0);
-		values = CFAllocatorAllocate(NULL, n * sizeof(CFTypeRef), 0);
-	}
-	CFDictionaryGetKeysAndValues(dict, keys, values);
 
-	for (i = 0; i < n; i++) {
+	for (i = 0; i < store_info->n; i++) {
 		CFArrayRef	components;
 		Boolean		found		= FALSE;
 		CFStringRef	i_key;
@@ -589,14 +701,15 @@ updatePPPAvailable(SCDynamicStoreRef		*storeP,
 		CFStringRef	p_key;
 		CFDictionaryRef	p_dict;
 		CFStringRef	service;
-		CFStringRef	s_key		= (CFStringRef)    keys[i];
-		CFDictionaryRef	s_dict		= (CFDictionaryRef)values[i];
+		CFStringRef	s_key		= (CFStringRef)    store_info->keys[i];
+		CFDictionaryRef	s_dict		= (CFDictionaryRef)store_info->values[i];
 
 		if (!isA_CFString(s_key) || !isA_CFDictionary(s_dict)) {
 			continue;
 		}
 
-		if (!CFStringHasSuffix(s_key, entity)) {
+		if (!CFStringHasSuffix(s_key, store_info->entity) ||
+		    !CFStringHasPrefix(s_key, kSCDynamicStoreDomainSetup)) {
 			continue;	// if not an IPv4 or IPv6 entity
 		}
 
@@ -613,14 +726,14 @@ updatePPPAvailable(SCDynamicStoreRef		*storeP,
 								    kSCDynamicStoreDomainSetup,
 								    service,
 								    kSCEntNetPPP);
-		p_dict = CFDictionaryGetValue(dict, p_key);
+		p_dict = CFDictionaryGetValue(store_info->dict, p_key);
 		CFRelease(p_key);
 
 		i_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 								    kSCDynamicStoreDomainSetup,
 								    service,
 								    kSCEntNetInterface);
-		i_dict = CFDictionaryGetValue(dict, i_key);
+		i_dict = CFDictionaryGetValue(store_info->dict, i_key);
 		CFRelease(i_key);
 
 		if (isA_CFDictionary(p_dict) &&
@@ -660,120 +773,291 @@ updatePPPAvailable(SCDynamicStoreRef		*storeP,
 		CFRelease(components);
 
 		if (found) {
+			sc_status = kSCStatusOK;
 			break;
 		}
 	}
 
-	if (keys != keys_q) {
-		CFAllocatorDeallocate(NULL, keys);
-		CFAllocatorDeallocate(NULL, values);
+	return sc_status;
+}
+
+
+#if	!TARGET_IPHONE_SIMULATOR
+static int
+updateVPNStatus(ReachabilityStoreInfoRef	store_info,
+		const struct sockaddr		*sa,
+		const char			*if_name,
+		SCNetworkReachabilityFlags	*flags,
+		CFStringRef			*vpn_server,
+		const char			*log_prefix)
+{
+	CFIndex		i;
+	CFStringRef	vpn_if;
+	int		sc_status	= kSCStatusNoKey;
+
+	if (!updateReachabilityStoreInfo(store_info, NULL, sa->sa_family)) {
+		return kSCStatusReachabilityUnknown;
 	}
 
-    done :
+	if (store_info->n <= 0) {
+		// if no services
+		return kSCStatusNoKey;
+	}
+
+	// look for the [VPN] service which matches the provided interface
+
+	vpn_if = CFStringCreateWithCStringNoCopy(NULL,
+						 if_name,
+						 kCFStringEncodingASCII,
+						 kCFAllocatorNull);
+
+	for (i=0; i < store_info->n; i++) {
+		CFArrayRef	components;
+		CFStringRef	key;
+		CFNumberRef	num;
+		CFDictionaryRef	p_state;
+		int32_t		vpn_status;
+		CFStringRef	service		= NULL;
+		CFStringRef	s_key		= (CFStringRef)    store_info->keys[i];
+		CFDictionaryRef	s_dict		= (CFDictionaryRef)store_info->values[i];
+		CFStringRef	s_if;
+
+		if (!isA_CFString(s_key) || !isA_CFDictionary(s_dict)) {
+			continue;
+		}
+
+		if (!CFStringHasSuffix(s_key, store_info->entity) ||
+		    !CFStringHasPrefix(s_key, kSCDynamicStoreDomainState)) {
+			continue;	// if not an active IPv4 or IPv6 entity
+		}
+
+		s_if = CFDictionaryGetValue(s_dict, kSCPropInterfaceName);
+		if (!isA_CFString(s_if)) {
+			continue;	// if no interface
+		}
+
+		if (!CFEqual(vpn_if, s_if)) {
+			continue;	// if not this interface
+		}
+
+		// extract the service ID and get the VPN "state" entity for
+		// the "Status"
+		components = CFStringCreateArrayBySeparatingStrings(NULL, s_key, CFSTR("/"));
+		if (CFArrayGetCount(components) != 5) {
+			CFRelease(components);
+			break;
+		}
+		service = CFArrayGetValueAtIndex(components, 3);
+		key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+								  kSCDynamicStoreDomainState,
+								  service,
+								  kSCEntNetVPN);
+		p_state = CFDictionaryGetValue(store_info->dict, key);
+		CFRelease(key);
+		CFRelease(components);
+
+		// ensure that this is a VPN service
+		if (!isA_CFDictionary(p_state)) {
+			break;
+		}
+
+		sc_status = kSCStatusOK;
+
+		*flags |= kSCNetworkReachabilityFlagsTransientConnection;
+
+		// get VPN server
+		if (vpn_server != NULL) {
+			*vpn_server = CFDictionaryGetValue(s_dict, CFSTR("ServerAddress"));
+			*vpn_server = isA_CFString(*vpn_server);
+			if (*vpn_server != NULL) {
+				CFRetain(*vpn_server);
+			}
+		}
+
+		// get VPN status
+		if (!CFDictionaryGetValueIfPresent(p_state,
+						   kSCPropNetVPNStatus,
+						   (const void **)&num) ||
+		    !isA_CFNumber(num) ||
+		    !CFNumberGetValue(num, kCFNumberSInt32Type, &vpn_status)) {
+			break;
+		}
+#ifdef	HAVE_VPN_STATUS
+		switch (vpn_status) {
+			case VPN_RUNNING :
+				// if we're really UP and RUNNING
+				break;
+			case VPN_IDLE :
+			case VPN_LOADING :
+			case VPN_LOADED :
+			case VPN_UNLOADING :
+				// if we're not connected at all
+				SCLog(_sc_debug, LOG_INFO, CFSTR("%s  VPN link idle"),
+				      log_prefix);
+				*flags |= kSCNetworkReachabilityFlagsConnectionRequired;
+				break;
+			default :
+				// if we're in the process of [dis]connecting
+				SCLog(_sc_debug, LOG_INFO, CFSTR("%s  VPN link, connection in progress"),
+				      log_prefix);
+				*flags |= kSCNetworkReachabilityFlagsConnectionRequired;
+				break;
+		}
+#endif	// HAVE_VPN_STATUS
+
+		break;
+	}
+
+	CFRelease(vpn_if);
 
-	if (dict != NULL)	CFRelease(dict);
 	return sc_status;
 }
 
 
 static int
-updateIPSecStatus(SCDynamicStoreRef		*storeP,
-		  const struct sockaddr		*sa,
-		  const char			*if_name,
-		  SCNetworkReachabilityFlags	*flags,
-		  CFStringRef			*ipsec_server)
+updateVPNAvailable(ReachabilityStoreInfoRef	store_info,
+		   const struct sockaddr	*sa,
+		   SCNetworkReachabilityFlags	*flags,
+		   const char			*log_prefix)
 {
-	CFDictionaryRef		dict		= NULL;
-	CFStringRef		entity;
-	CFIndex			i;
-	CFStringRef		ipsec_if;
-	const void *		keys_q[N_QUICK];
-	const void **		keys		= keys_q;
-	CFIndex			n;
-	int			sc_status	= kSCStatusReachabilityUnknown;
-	SCDynamicStoreRef	store		= *storeP;
-	const void *		values_q[N_QUICK];
-	const void **		values	= values_q;
+	CFIndex		i;
+	int		sc_status	= kSCStatusNoKey;
 
-	switch (sa->sa_family) {
-		case AF_INET :
-			entity = kSCEntNetIPv4;
-			break;
-		case AF_INET6 :
-			entity = kSCEntNetIPv6;
-			break;
-		default :
-			goto done;
+	if (!updateReachabilityStoreInfo(store_info,
+					 NULL,
+					 (sa != NULL) ? sa->sa_family : AF_INET)) {
+		return kSCStatusReachabilityUnknown;
 	}
 
-	if (store == NULL) {
-		store = SCDynamicStoreCreate(NULL, CFSTR("SCNetworkReachability"), NULL, NULL);
-		if (store == NULL) {
-			SCLog(TRUE, LOG_ERR, CFSTR("updateIPSecStatus SCDynamicStoreCreate() failed"));
-			goto done;
-		}
-		*storeP = store;
+	if (store_info->n <= 0) {
+		// if no services
+		return kSCStatusNoKey;
 	}
 
-	// grab a snapshot of the IPSec configuration from the dynamic store
-	{
-		CFStringRef		pattern;
-		CFMutableArrayRef	patterns;
-
-		patterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainState,
-								      kSCCompAnyRegex,
-								      entity);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								      kSCDynamicStoreDomainSetup,
-								      kSCCompAnyRegex,
-								      kSCEntNetIPSec);
-		CFArrayAppendValue(patterns, pattern);
-		CFRelease(pattern);
-		dict = SCDynamicStoreCopyMultiple(store, NULL, patterns);
-		CFRelease(patterns);
-	}
-	if (dict == NULL) {
-		// if we could not access the dynamic store
-		goto done;
+	// look for an available service which will provide connectivity
+	// for the requested address family.
+
+	for (i = 0; i < store_info->n; i++) {
+		CFArrayRef	components;
+		Boolean		found		= FALSE;
+		CFStringRef	i_key;
+		CFDictionaryRef	i_dict;
+		CFStringRef	p_key;
+		CFDictionaryRef	p_dict;
+		CFStringRef	service;
+		CFStringRef	s_key		= (CFStringRef)    store_info->keys[i];
+		CFDictionaryRef	s_dict		= (CFDictionaryRef)store_info->values[i];
+
+		if (!isA_CFString(s_key) || !isA_CFDictionary(s_dict)) {
+			continue;
+		}
+
+		if (!CFStringHasSuffix(s_key, store_info->entity) ||
+		    !CFStringHasPrefix(s_key, kSCDynamicStoreDomainSetup)) {
+			continue;	// if not an IPv4 or IPv6 entity
+		}
+
+		// extract service ID
+		components = CFStringCreateArrayBySeparatingStrings(NULL, s_key, CFSTR("/"));
+		if (CFArrayGetCount(components) != 5) {
+			CFRelease(components);
+			continue;
+		}
+		service = CFArrayGetValueAtIndex(components, 3);
+
+		// check for VPN entity
+		p_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+								    kSCDynamicStoreDomainSetup,
+								    service,
+								    kSCEntNetVPN);
+		p_dict = CFDictionaryGetValue(store_info->dict, p_key);
+		CFRelease(p_key);
+
+		i_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+								    kSCDynamicStoreDomainSetup,
+								    service,
+								    kSCEntNetInterface);
+		i_dict = CFDictionaryGetValue(store_info->dict, i_key);
+		CFRelease(i_key);
+
+		if (isA_CFDictionary(p_dict) &&
+		    isA_CFDictionary(i_dict) &&
+		    CFDictionaryContainsKey(i_dict, kSCPropNetInterfaceDeviceName)) {
+			// we have a VPN service for this address family
+			found = TRUE;
+
+			*flags |= kSCNetworkReachabilityFlagsReachable;
+			*flags |= kSCNetworkReachabilityFlagsTransientConnection;
+			*flags |= kSCNetworkReachabilityFlagsConnectionRequired;
+
+			if (_sc_debug) {
+				SCLog(TRUE, LOG_INFO, CFSTR("%s  status    = isReachable (after connect)"),
+				      log_prefix);
+				SCLog(TRUE, LOG_INFO, CFSTR("%s  service   = %@"),
+				      log_prefix,
+				      service);
+			}
+
+		}
+
+		CFRelease(components);
+
+		if (found) {
+			sc_status = kSCStatusOK;
+			break;
+		}
 	}
 
-	sc_status = kSCStatusOK;
+	return sc_status;
+}
+#endif	// !TARGET_IPHONE_SIMULATOR
 
-	// look for the service which matches the provided interface
-	n = CFDictionaryGetCount(dict);
-	if (n <= 0) {
-		goto done;
+
+static int
+updateIPSecStatus(ReachabilityStoreInfoRef	store_info,
+		  const struct sockaddr		*sa,
+		  const char			*if_name,
+		  SCNetworkReachabilityFlags	*flags,
+		  CFStringRef			*ipsec_server,
+		  const char			*log_prefix)
+{
+	CFIndex		i;
+	CFStringRef	ipsec_if;
+	int		sc_status	= kSCStatusNoKey;
+
+	if (!updateReachabilityStoreInfo(store_info, NULL, sa->sa_family)) {
+		return kSCStatusReachabilityUnknown;
+	}
+
+	if (store_info->n <= 0) {
+		// if no services
+		return kSCStatusNoKey;
 	}
 
+	// look for the [IPSec] service that matches the provided interface
+
 	ipsec_if = CFStringCreateWithCStringNoCopy(NULL,
 						   if_name,
 						   kCFStringEncodingASCII,
 						   kCFAllocatorNull);
 
-	if (n > (CFIndex)(sizeof(keys_q) / sizeof(CFTypeRef))) {
-		keys   = CFAllocatorAllocate(NULL, n * sizeof(CFTypeRef), 0);
-		values = CFAllocatorAllocate(NULL, n * sizeof(CFTypeRef), 0);
-	}
-	CFDictionaryGetKeysAndValues(dict, keys, values);
-
-	for (i=0; i < n; i++) {
+	for (i=0; i < store_info->n; i++) {
 		CFArrayRef	components;
 		CFStringRef	key;
-		CFDictionaryRef	i_setup;
+		CFDictionaryRef	i_state;
+		int32_t		ipsec_status;
+		CFNumberRef	num;
 		CFStringRef	service		= NULL;
-		CFStringRef	s_key		= (CFStringRef)    keys[i];
-		CFDictionaryRef	s_dict		= (CFDictionaryRef)values[i];
+		CFStringRef	s_key		= (CFStringRef)    store_info->keys[i];
+		CFDictionaryRef	s_dict		= (CFDictionaryRef)store_info->values[i];
 		CFStringRef	s_if;
 
 		if (!isA_CFString(s_key) || !isA_CFDictionary(s_dict)) {
 			continue;
 		}
 
-		if (!CFStringHasSuffix(s_key, entity)) {
+		if (!CFStringHasSuffix(s_key, store_info->entity) ||
+		    !CFStringHasPrefix(s_key, kSCDynamicStoreDomainState)) {
 			continue;	// if not an IPv4 or IPv6 entity
 		}
 
@@ -786,8 +1070,9 @@ updateIPSecStatus(SCDynamicStoreRef		*storeP,
 			continue;	// if not this interface
 		}
 
-		// extract the service ID and get the IPSec "setup" entity
-		// to confirm that we're looking at what we're expecting
+		// extract the service ID, get the IPSec "state" entity for
+		// the "Status", and get the IPSec "setup" entity to confirm
+		// that we're looking at what we're expecting
 		components = CFStringCreateArrayBySeparatingStrings(NULL, s_key, CFSTR("/"));
 		if (CFArrayGetCount(components) != 5) {
 			CFRelease(components);
@@ -795,18 +1080,20 @@ updateIPSecStatus(SCDynamicStoreRef		*storeP,
 		}
 		service = CFArrayGetValueAtIndex(components, 3);
 		key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
-								  kSCDynamicStoreDomainSetup,
+								  kSCDynamicStoreDomainState,
 								  service,
 								  kSCEntNetIPSec);
-		i_setup = CFDictionaryGetValue(dict, key);
+		i_state = CFDictionaryGetValue(store_info->dict, key);
 		CFRelease(key);
 		CFRelease(components);
 
 		// ensure that this is an IPSec service
-		if (!isA_CFDictionary(i_setup)) {
+		if (!isA_CFDictionary(i_state)) {
 			break;
 		}
 
+		sc_status = kSCStatusOK;
+
 		*flags |= kSCNetworkReachabilityFlagsTransientConnection;
 
 		// get IPSec server
@@ -818,18 +1105,39 @@ updateIPSecStatus(SCDynamicStoreRef		*storeP,
 			}
 		}
 
+		// get IPSec status
+		if (!CFDictionaryGetValueIfPresent(i_state,
+						   kSCPropNetIPSecStatus,
+						   (const void **)&num) ||
+		    !isA_CFNumber(num) ||
+		    !CFNumberGetValue(num, kCFNumberSInt32Type, &ipsec_status)) {
+			break;
+		}
+#ifdef	HAVE_IPSEC_STATUS
+		switch (ipsec_status) {
+			case IPSEC_RUNNING :
+				// if we're really UP and RUNNING
+				break;
+			case IPSEC_IDLE :
+				// if we're not connected at all
+				SCLog(_sc_debug, LOG_INFO, CFSTR("%s  IPSec link idle"),
+				      log_prefix);
+				*flags |= kSCNetworkReachabilityFlagsConnectionRequired;
+				break;
+			default :
+				// if we're in the process of [dis]connecting
+				SCLog(_sc_debug, LOG_INFO, CFSTR("%s  IPSec link, connection in progress"),
+				      log_prefix);
+				*flags |= kSCNetworkReachabilityFlagsConnectionRequired;
+				break;
+		}
+#endif	// HAVE_IPSEC_STATUS
+
 		break;
 	}
 
 	CFRelease(ipsec_if);
-	if (keys != keys_q) {
-		CFAllocatorDeallocate(NULL, keys);
-		CFAllocatorDeallocate(NULL, values);
-	}
 
-    done :
-
-	if (dict != NULL)	CFRelease(dict);
 	return sc_status;
 }
 
@@ -878,9 +1186,11 @@ typedef struct {
  */
 static int
 route_get(const struct sockaddr	*address,
+	  unsigned int		if_index,
 	  route_info		*info)
 {
 	int			n;
+	int			opt;
 	pid_t			pid		= getpid();
 	int			rsock;
 	struct sockaddr         *sa;
@@ -906,6 +1216,11 @@ route_get(const struct sockaddr	*address,
 	info->rtm->rtm_pid     = pid;
 	info->rtm->rtm_seq     = seq;
 
+	if (if_index != 0) {
+		info->rtm->rtm_flags |= RTF_IFSCOPE;
+		info->rtm->rtm_index = if_index;
+	}
+
 	switch (address->sa_family) {
 		case AF_INET6: {
 			struct sockaddr_in6	*sin6;
@@ -935,14 +1250,25 @@ route_get(const struct sockaddr	*address,
 #ifndef	RTM_GET_SILENT
 	pthread_mutex_lock(&lock);
 #endif
-	rsock = socket(PF_ROUTE, SOCK_RAW, 0);
+	rsock = socket(PF_ROUTE, SOCK_RAW, PF_ROUTE);
 	if (rsock == -1) {
 		int	error	= errno;
 
 #ifndef	RTM_GET_SILENT
 		pthread_mutex_unlock(&lock);
 #endif
-		SCLog(TRUE, LOG_ERR, CFSTR("socket(PF_ROUTE) failed: %s"), strerror(error));
+		SCLog(TRUE, LOG_ERR, CFSTR("socket(PF_ROUTE) failed: %s"), strerror(error));
+		return error;
+	}
+	opt = 1;
+	if (ioctl(rsock, FIONBIO, &opt) < 0) {
+		int	error	= errno;
+
+		(void)close(rsock);
+#ifndef	RTM_GET_SILENT
+		pthread_mutex_unlock(&lock);
+#endif
+		SCLog(TRUE, LOG_ERR, CFSTR("ioctl(FIONBIO) failed: %s"), strerror(error));
 		return error;
 	}
 
@@ -975,25 +1301,31 @@ route_get(const struct sockaddr	*address,
 	 * Type, seq, pid identify our response.
 	 * Routing sockets are broadcasters on input.
 	 */
-	do {
+	while (TRUE) {
 		int	n;
 
 		n = read(rsock, (void *)&info->buf, sizeof(info->buf));
 		if (n == -1) {
-			if (errno != EINTR) {
-				int	error	= errno;
+			int	error	= errno;
 
-				(void)close(rsock);
+			if (error == EINTR) {
+				continue;
+			}
+			(void)close(rsock);
 #ifndef	RTM_GET_SILENT
-				pthread_mutex_unlock(&lock);
+			pthread_mutex_unlock(&lock);
 #endif
-				SCLog(TRUE, LOG_ERR, CFSTR("read() failed: %s"), strerror(error));
-				return error;
-			}
+			SCLog(TRUE, LOG_ERR,
+			      CFSTR("SCNetworkReachability: routing socket"
+				    " read() failed: %s"), strerror(error));
+			return error;
 		}
-	} while ((info->rtm->rtm_type != RTM_GET)	||
-		 (info->rtm->rtm_seq  != seq)		||
-		 (info->rtm->rtm_pid  != pid));
+		if ((info->rtm->rtm_type == RTM_GET) 	&&
+		    (info->rtm->rtm_seq == seq) 	&&
+		    (info->rtm->rtm_pid == pid)) {
+		    break;
+		}
+	}
 
 	(void)close(rsock);
 #ifndef	RTM_GET_SILENT
@@ -1002,6 +1334,7 @@ route_get(const struct sockaddr	*address,
 
 	get_rtaddrs(info->rtm->rtm_addrs, sa, info->rti_info);
 
+//#define LOG_RTADDRS
 #ifdef	LOG_RTADDRS
 	{
 		int	i;
@@ -1041,14 +1374,15 @@ route_get(const struct sockaddr	*address,
 
 
 static Boolean
-checkAddress(SCDynamicStoreRef		*storeP,
+checkAddress(ReachabilityStoreInfoRef	store_info,
 	     const struct sockaddr	*address,
+	     unsigned int		if_index,
 	     ReachabilityInfo		*reach_info,
 	     const char			*log_prefix)
 {
 	route_info		info;
 	struct ifreq		ifr;
-	char			if_name[IFNAMSIZ + 1];
+	char			if_name[IFNAMSIZ];
 	int			isock		= -1;
 	int			ret;
 	int			sc_status	= kSCStatusReachabilityUnknown;
@@ -1068,11 +1402,21 @@ checkAddress(SCDynamicStoreRef		*storeP,
 		case AF_INET6 :
 			if (_sc_debug) {
 				char	addr[128];
+				char	if_name[IFNAMSIZ + 1];
 
 				_SC_sockaddr_to_string(address, addr, sizeof(addr));
-				SCLog(TRUE, LOG_INFO, CFSTR("%scheckAddress(%s)"),
+
+				if ((if_index != 0) &&
+				    (if_indextoname(if_index, &if_name[1]) != NULL)) {
+					if_name[0] = '%';
+				} else {
+					if_name[0] = '\0';
+				}
+
+				SCLog(TRUE, LOG_INFO, CFSTR("%scheckAddress(%s%s)"),
 				      log_prefix,
-				      addr);
+				      addr,
+				      if_name);
 			}
 			break;
 		default :
@@ -1099,7 +1443,7 @@ checkAddress(SCDynamicStoreRef		*storeP,
 		}
 	}
 
-	ret = route_get(address, &info);
+	ret = route_get(address, if_index, &info);
 	switch (ret) {
 		case 0 :
 			break;
@@ -1221,13 +1565,23 @@ checkAddress(SCDynamicStoreRef		*storeP,
 		 * 2. check for dial-on-demand PPP link that is not yet connected
 		 * 3. get PPP server address
 		 */
-		sc_status = updatePPPStatus(storeP, address, if_name, &reach_info->flags, &server, log_prefix);
+		sc_status = updatePPPStatus(store_info, address, if_name, &reach_info->flags, &server, log_prefix);
 	} else if (info.sdl->sdl_type == IFT_OTHER) {
 		/*
 		 * 1. check if IPSec service
 		 * 2. get IPSec server address
 		 */
-		sc_status = updateIPSecStatus(storeP, address, if_name, &reach_info->flags, &server);
+		sc_status = updateIPSecStatus(store_info, address, if_name, &reach_info->flags, &server, log_prefix);
+
+#if	!TARGET_IPHONE_SIMULATOR
+		if (sc_status == kSCStatusNoKey) {
+			/*
+			 * 1. check if VPN service
+			 * 2. get VPN server address
+			 */
+			sc_status = updateVPNStatus(store_info, address, if_name, &reach_info->flags, &server, log_prefix);
+		}
+#endif	// !TARGET_IPHONE_SIMULATOR
 	}
 
 
@@ -1236,7 +1590,17 @@ checkAddress(SCDynamicStoreRef		*storeP,
     checkAvailable :
 
 
-	sc_status = updatePPPAvailable(storeP, address, &reach_info->flags, log_prefix);
+	sc_status = updatePPPAvailable(store_info, address, &reach_info->flags, log_prefix);
+	if ((sc_status == kSCStatusOK) && (reach_info->flags != 0)) {
+		goto done;
+	}
+
+#if	!TARGET_IPHONE_SIMULATOR
+	sc_status = updateVPNAvailable(store_info, address, &reach_info->flags, log_prefix);
+	if ((sc_status == kSCStatusOK) && (reach_info->flags != 0)) {
+		goto done;
+	}
+#endif	// !TARGET_IPHONE_SIMULATOR
 
     done :
 
@@ -1246,7 +1610,7 @@ checkAddress(SCDynamicStoreRef		*storeP,
 
 	if (isock != -1)	(void)close(isock);
 	if (server != NULL)	CFRelease(server);
-	if (sc_status != kSCStatusOK) {
+	if ((sc_status != kSCStatusOK) && (sc_status != kSCStatusNoKey)) {
 		_SCErrorSet(sc_status);
 		return FALSE;
 	}
@@ -1404,7 +1768,6 @@ __SCNetworkReachabilityPerform(SCNetworkReachabilityRef target)
 {
 	SCNetworkReachabilityPrivateRef	targetPrivate	= (SCNetworkReachabilityPrivateRef)target;
 
-#if	!TARGET_OS_IPHONE
 	if (targetPrivate->dispatchQueue != NULL) {
 		CFRetain(target);
 		dispatch_async(targetPrivate->dispatchQueue,
@@ -1412,9 +1775,7 @@ __SCNetworkReachabilityPerform(SCNetworkReachabilityRef target)
 				       rlsPerform((void *)target);
 				       CFRelease(target);
 			       });
-	} else
-#endif	// !TARGET_OS_IPHONE
-	if (targetPrivate->rls != NULL) {
+	} else if (targetPrivate->rls != NULL) {
 		CFRunLoopSourceSignal(targetPrivate->rls);
 		_SC_signalRunLoop(target, targetPrivate->rls, targetPrivate->rlList);
 	}
@@ -1455,6 +1816,8 @@ __SCNetworkReachabilityCreatePrivate(CFAllocatorRef	allocator)
 	targetPrivate->resolvedAddress			= NULL;
 	targetPrivate->resolvedAddressError		= NETDB_SUCCESS;
 
+	targetPrivate->if_index				= 0;
+
 	targetPrivate->localAddress			= NULL;
 	targetPrivate->remoteAddress			= NULL;
 
@@ -1493,15 +1856,63 @@ __SCNetworkReachabilityCreatePrivate(CFAllocatorRef	allocator)
 }
 
 
+
+
+static const struct sockaddr *
+is_valid_address(const struct sockaddr *address)
+{
+	const struct sockaddr	*valid	= NULL;
+	static Boolean	warned	= FALSE;
+
+	if ((address != NULL) &&
+	    (address->sa_len <= sizeof(struct sockaddr_storage))) {
+		switch (address->sa_family) {
+			case AF_INET :
+				if (address->sa_len >= sizeof(struct sockaddr_in)) {
+					valid = address;
+				} else {
+					if (!warned) {
+						SCLog(TRUE, LOG_ERR,
+						      CFSTR("SCNetworkReachabilityCreateWithAddress[Pair] called with \"struct sockaddr *\" len %d < %d"),
+						      address->sa_len,
+						      sizeof(struct sockaddr_in));
+						warned = TRUE;
+					}
+				}
+				break;
+			case AF_INET6 :
+				if (address->sa_len >= sizeof(struct sockaddr_in6)) {
+					valid = address;
+				} else if (!warned) {
+					SCLog(TRUE, LOG_ERR,
+					      CFSTR("SCNetworkReachabilityCreateWithAddress[Pair] called with \"struct sockaddr *\" len %d < %d"),
+					      address->sa_len,
+					      sizeof(struct sockaddr_in6));
+					warned = TRUE;
+				}
+				break;
+			default :
+				if (!warned) {
+					SCLog(TRUE, LOG_ERR,
+					      CFSTR("SCNetworkReachabilityCreateWithAddress[Pair] called with invalid address family %d"),
+					      address->sa_family);
+					warned = TRUE;
+				}
+		}
+	}
+
+	return valid;
+}
+
+
 SCNetworkReachabilityRef
 SCNetworkReachabilityCreateWithAddress(CFAllocatorRef		allocator,
 				       const struct sockaddr	*address)
 {
 	SCNetworkReachabilityPrivateRef	targetPrivate;
 
-	if ((address == NULL) ||
-	    (address->sa_len == 0) ||
-	    (address->sa_len > sizeof(struct sockaddr_storage))) {
+	address = is_valid_address(address);
+	if (address == NULL) {
 		_SCErrorSet(kSCStatusInvalidArgument);
 		return NULL;
 	}
@@ -1532,18 +1943,18 @@ SCNetworkReachabilityCreateWithAddressPair(CFAllocatorRef		allocator,
 	}
 
 	if (localAddress != NULL) {
-		if ((localAddress->sa_len == 0) ||
-		    (localAddress->sa_len > sizeof(struct sockaddr_storage))) {
-			    _SCErrorSet(kSCStatusInvalidArgument);
-			    return NULL;
+		localAddress = is_valid_address(localAddress);
+		if (localAddress == NULL) {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
 		}
 	}
 
 	if (remoteAddress != NULL) {
-		if ((remoteAddress->sa_len == 0) ||
-		    (remoteAddress->sa_len > sizeof(struct sockaddr_storage))) {
-			    _SCErrorSet(kSCStatusInvalidArgument);
-			    return NULL;
+		remoteAddress = is_valid_address(remoteAddress);
+		if (remoteAddress == NULL) {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
 		}
 	}
 
@@ -1634,12 +2045,15 @@ SCNetworkReachabilityRef
 SCNetworkReachabilityCreateWithOptions(CFAllocatorRef	allocator,
 				       CFDictionaryRef	options)
 {
+	const struct sockaddr		*addr_l		= NULL;
+	const struct sockaddr		*addr_r		= NULL;
 	CFBooleanRef			bypass;
 	CFDataRef			data;
-	struct addrinfo			*hints	= NULL;
-	const char			*name;
+	struct addrinfo			*hints		= NULL;
+	CFStringRef			interface	= NULL;
 	CFStringRef			nodename;
 	CFStringRef			servname;
+	SCNetworkReachabilityRef	target;
 	SCNetworkReachabilityPrivateRef	targetPrivate;
 
 	if (!isA_CFDictionary(options)) {
@@ -1659,6 +2073,22 @@ SCNetworkReachabilityCreateWithOptions(CFAllocatorRef	allocator,
 		_SCErrorSet(kSCStatusInvalidArgument);
 		return NULL;
 	}
+	data = CFDictionaryGetValue(options, kSCNetworkReachabilityOptionLocalAddress);
+	if (data != NULL) {
+		if (!isA_CFData(data) || (CFDataGetLength(data) < sizeof(struct sockaddr_in))) {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+		addr_l = (const struct sockaddr *)CFDataGetBytePtr(data);
+	}
+	data = CFDictionaryGetValue(options, kSCNetworkReachabilityOptionRemoteAddress);
+	if (data != NULL) {
+		if (!isA_CFData(data) || (CFDataGetLength(data) < sizeof(struct sockaddr_in))) {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+		addr_r = (const struct sockaddr *)CFDataGetBytePtr(data);
+	}
 	data = CFDictionaryGetValue(options, kSCNetworkReachabilityOptionHints);
 	if (data != NULL) {
 		if (!isA_CFData(data) || (CFDataGetLength(data) != sizeof(targetPrivate->hints))) {
@@ -1675,23 +2105,47 @@ SCNetworkReachabilityCreateWithOptions(CFAllocatorRef	allocator,
 			return NULL;
 		}
 	}
-	bypass = CFDictionaryGetValue(options, kSCNetworkReachabilityOptionConnectionOnDemandByPass);
-	if ((bypass != NULL) && !isA_CFBoolean(bypass)) {
+	interface = CFDictionaryGetValue(options, kSCNetworkReachabilityOptionInterface);
+	if ((interface != NULL) &&
+	    (!isA_CFString(interface) || (CFStringGetLength(interface) == 0))) {
 		_SCErrorSet(kSCStatusInvalidArgument);
 		return NULL;
 	}
-	if ((nodename == NULL) && (servname == NULL)) {
+	bypass = CFDictionaryGetValue(options, kSCNetworkReachabilityOptionConnectionOnDemandByPass);
+	if ((bypass != NULL) && !isA_CFBoolean(bypass)) {
 		_SCErrorSet(kSCStatusInvalidArgument);
 		return NULL;
 	}
 
-	name = _SC_cfstring_to_cstring(nodename, NULL, 0, kCFStringEncodingUTF8);
-	targetPrivate = (SCNetworkReachabilityPrivateRef)SCNetworkReachabilityCreateWithName(allocator, name);
-	CFAllocatorDeallocate(NULL, (void *)name);
-	if (targetPrivate == NULL) {
+	if ((nodename != NULL) || (servname != NULL)) {
+		const char	*name;
+
+		if ((addr_l != NULL) || (addr_r != NULL)) {
+			// can't have both a name/serv and an address
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+
+		name = _SC_cfstring_to_cstring(nodename, NULL, 0, kCFStringEncodingUTF8);
+		target = SCNetworkReachabilityCreateWithName(allocator, name);
+		CFAllocatorDeallocate(NULL, (void *)name);
+	} else {
+		if ((addr_l != NULL) && (addr_r != NULL)) {
+			target = SCNetworkReachabilityCreateWithAddressPair(NULL, addr_l, addr_r);
+		} else if (addr_r != NULL) {
+			target = SCNetworkReachabilityCreateWithAddress(NULL, addr_r);
+		} else if (addr_l != NULL) {
+			target = SCNetworkReachabilityCreateWithAddress(NULL, addr_l);
+		} else {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+	}
+	if (target == NULL) {
 		return NULL;
 	}
 
+	targetPrivate = (SCNetworkReachabilityPrivateRef)target;
 	if (targetPrivate->type == reachabilityTypeName) {
 		if (servname != NULL) {
 			targetPrivate->serv = _SC_cfstring_to_cstring(servname, NULL, 0, kCFStringEncodingUTF8);
@@ -1701,6 +2155,18 @@ SCNetworkReachabilityCreateWithOptions(CFAllocatorRef	allocator,
 		}
 	}
 
+	if (interface != NULL) {
+		if ((_SC_cfstring_to_cstring(interface,
+					     targetPrivate->if_name,
+					     sizeof(targetPrivate->if_name),
+					     kCFStringEncodingASCII) == NULL) ||
+		    ((targetPrivate->if_index = if_nametoindex(targetPrivate->if_name)) == 0)) {
+			CFRelease(targetPrivate);
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+	}
+
 	if (bypass != NULL) {
 		targetPrivate->onDemandBypass = CFBooleanGetValue(bypass);
 	}
@@ -1737,7 +2203,7 @@ SCNetworkReachabilityCopyResolvedAddress(SCNetworkReachabilityRef	target,
 		*error_num = targetPrivate->resolvedAddressError;
 	}
 
-	if ((targetPrivate->resolvedAddress != NULL) || (targetPrivate->resolvedAddressError != NETDB_SUCCESS)) {
+	if (targetPrivate->resolvedAddress != NULL) {
 		if (isA_CFArray(targetPrivate->resolvedAddress)) {
 			return CFRetain(targetPrivate->resolvedAddress);
 		} else {
@@ -1877,7 +2343,6 @@ getaddrinfo_async_handleCFReply(CFMachPortRef port, void *msg, CFIndex size, voi
 }
 
 
-#if	!TARGET_OS_IPHONE
 static boolean_t
 SCNetworkReachabilityNotifyMIGCallback(mach_msg_header_t *message, mach_msg_header_t *reply)
 {
@@ -1888,27 +2353,24 @@ SCNetworkReachabilityNotifyMIGCallback(mach_msg_header_t *message, mach_msg_head
 	reply->msgh_remote_port = MACH_PORT_NULL;
 	return false;
 }
-#endif	// !TARGET_OS_IPHONE
 
 
 static Boolean
 enqueueAsyncDNSQuery(SCNetworkReachabilityRef target, mach_port_t mp)
 {
-	CFMachPortContext		context	= { 0
-						  , (void *)target
-						  , CFRetain
-						  , CFRelease
-						  , replyMPCopyDescription
-						  };
+	CFMachPortContext		context		= { 0
+							  , (void *)target
+							  , CFRetain
+							  , CFRelease
+							  , replyMPCopyDescription
+							  };
 	SCNetworkReachabilityPrivateRef	targetPrivate	= (SCNetworkReachabilityPrivateRef)target;
 
-	targetPrivate->dnsMP = mp;
-	targetPrivate->dnsPort = CFMachPortCreateWithPort(NULL,
-							  mp,
-							  getaddrinfo_async_handleCFReply,
-							  &context,
-							  NULL);
-#if	!TARGET_OS_IPHONE
+	targetPrivate->dnsMP   = mp;
+	targetPrivate->dnsPort = _SC_CFMachPortCreateWithPort("SCNetworkReachability",
+							      mp,
+							      getaddrinfo_async_handleCFReply,
+							      &context);
 	if (targetPrivate->dispatchQueue != NULL) {
 		targetPrivate->asyncDNSQueue = dispatch_queue_create("com.apple.SCNetworkReachabilty.async_DNS_query", NULL);
 		if (targetPrivate->asyncDNSQueue == NULL) {
@@ -1933,9 +2395,7 @@ enqueueAsyncDNSQuery(SCNetworkReachabilityRef target, mach_port_t mp)
 					    SCNetworkReachabilityNotifyMIGCallback);
 		});
 		dispatch_resume(targetPrivate->asyncDNSSource);
-	} else
-#endif	// !TARGET_OS_IPHONE
-	if (targetPrivate->rls != NULL) {
+	} else if (targetPrivate->rls != NULL) {
 		CFIndex	i;
 		CFIndex	n;
 
@@ -1952,7 +2412,6 @@ enqueueAsyncDNSQuery(SCNetworkReachabilityRef target, mach_port_t mp)
 
 	return TRUE;
 
-#if	!TARGET_OS_IPHONE
     fail :
 
 	if (targetPrivate->asyncDNSSource != NULL) {
@@ -1972,7 +2431,6 @@ enqueueAsyncDNSQuery(SCNetworkReachabilityRef target, mach_port_t mp)
 
 	_SCErrorSet(kSCStatusFailed);
 	return FALSE;
-#endif	// !TARGET_OS_IPHONE
 }
 
 
@@ -1981,7 +2439,6 @@ dequeueAsyncDNSQuery(SCNetworkReachabilityRef target)
 {
 	SCNetworkReachabilityPrivateRef	targetPrivate	= (SCNetworkReachabilityPrivateRef)target;
 
-#if	!TARGET_OS_IPHONE
 	if (targetPrivate->asyncDNSSource != NULL) {
 		dispatch_source_cancel(targetPrivate->asyncDNSSource);
 		if (targetPrivate->asyncDNSQueue != dispatch_get_current_queue()) {
@@ -1999,7 +2456,6 @@ dequeueAsyncDNSQuery(SCNetworkReachabilityRef target)
 		dispatch_release(targetPrivate->asyncDNSQueue);
 		targetPrivate->asyncDNSQueue = NULL;
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	if (targetPrivate->dnsRLS != NULL) {
 		CFRelease(targetPrivate->dnsRLS);
@@ -2054,7 +2510,7 @@ processAsyncDNSReply(mach_port_t mp, void *msg, SCNetworkReachabilityRef target)
 
 
 static Boolean
-check_resolver_reachability(SCDynamicStoreRef		*storeP,
+check_resolver_reachability(ReachabilityStoreInfoRef	store_info,
 			    dns_resolver_t		*resolver,
 			    SCNetworkReachabilityFlags	*flags,
 			    Boolean			*haveDNS,
@@ -2081,7 +2537,7 @@ check_resolver_reachability(SCDynamicStoreRef		*storeP,
 			continue;
 		}
 
-		ok = checkAddress(storeP, address, &ns_info, log_prefix);
+		ok = checkAddress(store_info, address, resolver->if_index, &ns_info, log_prefix);
 		if (!ok) {
 			/* not today */
 			goto done;
@@ -2100,16 +2556,27 @@ check_resolver_reachability(SCDynamicStoreRef		*storeP,
 
 
 static Boolean
-check_matching_resolvers(SCDynamicStoreRef		*storeP,
+check_matching_resolvers(ReachabilityStoreInfoRef	store_info,
 			 dns_config_t			*dns_config,
 			 const char			*fqdn,
+			 unsigned int			if_index,
 			 SCNetworkReachabilityFlags	*flags,
 			 Boolean			*haveDNS,
 			 const char			*log_prefix)
 {
 	int		i;
-	Boolean		matched	= FALSE;
-	const char	*name	= fqdn;
+	Boolean		matched		= FALSE;
+	const char	*name		= fqdn;
+	int32_t		n_resolvers;
+	dns_resolver_t	**resolvers;
+
+	if (if_index == 0) {
+		n_resolvers = dns_config->n_resolver;
+		resolvers   = dns_config->resolver;
+	} else {
+		n_resolvers = dns_config->n_scoped_resolver;
+		resolvers   = dns_config->scoped_resolver;
+	}
 
 	while (!matched && (name != NULL)) {
 		int	len;
@@ -2119,11 +2586,15 @@ check_matching_resolvers(SCDynamicStoreRef		*storeP,
 		 * matches one of our resolver configurations.
 		 */
 		len = strlen(name);
-		for (i = 0; i < dns_config->n_resolver; i++) {
+		for (i = 0; i < n_resolvers; i++) {
 			char		*domain;
 			dns_resolver_t	*resolver;
 
-			resolver = dns_config->resolver[i];
+			resolver = resolvers[i];
+			if ((if_index != 0) && (if_index != resolver->if_index)) {
+				continue;
+			}
+
 			domain   = resolver->domain;
 			if (domain != NULL && (len == strlen(domain))) {
 				if (strcasecmp(name, domain) == 0) {
@@ -2133,7 +2604,7 @@ check_matching_resolvers(SCDynamicStoreRef		*storeP,
 					 * if name matches domain
 					 */
 					matched = TRUE;
-					ok = check_resolver_reachability(storeP, resolver, flags, haveDNS, log_prefix);
+					ok = check_resolver_reachability(store_info, resolver, flags, haveDNS, log_prefix);
 					if (!ok) {
 						/* not today */
 						return FALSE;
@@ -2160,6 +2631,42 @@ check_matching_resolvers(SCDynamicStoreRef		*storeP,
 }
 
 
+static dns_resolver_t *
+get_default_resolver(dns_config_t *dns_config, unsigned int if_index)
+{
+	int		i;
+	int32_t		n_resolvers;
+	dns_resolver_t	*resolver	= NULL;
+	dns_resolver_t	**resolvers;
+
+	if (if_index == 0) {
+		n_resolvers = dns_config->n_resolver;
+		resolvers   = dns_config->resolver;
+	} else {
+		n_resolvers = dns_config->n_scoped_resolver;
+		resolvers   = dns_config->scoped_resolver;
+	}
+
+	for (i = 0; i < n_resolvers; i++) {
+		if ((if_index != 0) && (if_index != resolvers[i]->if_index)) {
+			continue;
+		}
+
+		if (((if_index == 0) && (i == 0)) ||
+		    ((if_index != 0) && (resolver == NULL))) {
+			// if this is the first (aka default) resolver
+			resolver = resolvers[i];
+		} else if ((resolvers[i]->domain == NULL) &&
+			   (resolvers[i]->search_order < resolver->search_order)) {
+			// if this is a default resolver with a lower search order
+			resolver = resolvers[i];
+		}
+	}
+
+	return resolver;
+}
+
+
 static dns_configuration_t *
 dns_configuration_retain()
 {
@@ -2289,11 +2796,12 @@ dns_configuration_unwatch()
 
 
 static Boolean
-_SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
+_SC_R_checkResolverReachability(ReachabilityStoreInfoRef	store_info,
 				SCNetworkReachabilityFlags	*flags,
 				Boolean				*haveDNS,
 				const char			*nodename,
 				const char			*servname,
+				unsigned int			if_index,
 				const char			*log_prefix)
 {
 	dns_resolver_t		*default_resolver;
@@ -2303,6 +2811,7 @@ _SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
 	int			i;
 	Boolean			isFQDN			= FALSE;
 	uint32_t		len;
+	int			ndots			= 1;
 	Boolean			ok			= TRUE;
 	Boolean			useDefault		= FALSE;
 
@@ -2353,12 +2862,12 @@ _SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
 		}
 	}
 
-	default_resolver = dns->config->resolver[0];
+	default_resolver = get_default_resolver(dns->config, if_index);
 
 	/*
 	 * check if the provided name matches a supplemental domain
 	 */
-	found = check_matching_resolvers(storeP, dns->config, fqdn, flags, haveDNS, log_prefix);
+	found = check_matching_resolvers(store_info, dns->config, fqdn, if_index, flags, haveDNS, log_prefix);
 
 	if (!found && !isFQDN) {
 		/*
@@ -2368,7 +2877,6 @@ _SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
 		 */
 		char	*cp;
 		int	dots;
-		int	ndots	= 1;
 
 #define	NDOTS_OPT	"ndots="
 #define	NDOTS_OPT_LEN	(sizeof("ndots=") - 1)
@@ -2416,9 +2924,10 @@ _SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
 				}
 
 				// try the provided name with the search domain appended
-				found = check_matching_resolvers(storeP,
+				found = check_matching_resolvers(store_info,
 								 dns->config,
 								 search_fqdn,
+								 if_index,
 								 flags,
 								 haveDNS,
 								 log_prefix);
@@ -2447,7 +2956,7 @@ _SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
 			}
 
 			dp = default_resolver->domain;
-			for (i = LOCALDOMAINPARTS; !found && (i <= domain_parts); i++) {
+			for (i = LOCALDOMAINPARTS; !found && (i <= (domain_parts - ndots)); i++) {
 				int	ret;
 				char	*search_fqdn	= NULL;
 
@@ -2457,9 +2966,10 @@ _SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
 				}
 
 				// try the provided name with the [default] domain appended
-				found = check_matching_resolvers(storeP,
+				found = check_matching_resolvers(store_info,
 								 dns->config,
 								 search_fqdn,
+								 if_index,
 								 flags,
 								 haveDNS,
 								 log_prefix);
@@ -2475,7 +2985,7 @@ _SC_R_checkResolverReachability(SCDynamicStoreRef		*storeP,
 		/*
 		 * check the reachability of the default resolver
 		 */
-		ok = check_resolver_reachability(storeP, default_resolver, flags, haveDNS, log_prefix);
+		ok = check_resolver_reachability(store_info, default_resolver, flags, haveDNS, log_prefix);
 	}
 
 	if (fqdn != nodename)	free(fqdn);
@@ -2497,7 +3007,21 @@ _SC_checkResolverReachability(SCDynamicStoreRef			*storeP,
 			      const char			*nodename,
 			      const char			*servname)
 {
-	return _SC_R_checkResolverReachability(storeP, flags, haveDNS, nodename, servname, "");
+	Boolean			ok;
+	ReachabilityStoreInfo	store_info;
+
+	initReachabilityStoreInfo(&store_info);
+	ok = updateReachabilityStoreInfo(&store_info, storeP, AF_UNSPEC);
+	if (!ok) {
+		goto done;
+	}
+
+	ok = _SC_R_checkResolverReachability(&store_info, flags, haveDNS, nodename, servname, 0, "");
+
+    done :
+
+	freeReachabilityStoreInfo(&store_info);
+	return ok;
 }
 
 
@@ -2513,9 +3037,16 @@ _SC_checkResolverReachabilityByAddress(SCDynamicStoreRef		*storeP,
 				       Boolean				*haveDNS,
 				       struct sockaddr			*sa)
 {
-	int				i;
-	Boolean				ok		= FALSE;
-	char				ptr_name[128];
+	int			i;
+	Boolean			ok;
+	char			ptr_name[128];
+	ReachabilityStoreInfo	store_info;
+
+	initReachabilityStoreInfo(&store_info);
+	ok = updateReachabilityStoreInfo(&store_info, storeP, AF_UNSPEC);
+	if (!ok) {
+		goto done;
+	}
 
 	/*
 	 * Ideally, we would have an API that given a local IP
@@ -2582,29 +3113,46 @@ _SC_checkResolverReachabilityByAddress(SCDynamicStoreRef		*storeP,
 			goto done;
 	}
 
-	ok = _SC_R_checkResolverReachability(storeP, flags, haveDNS, ptr_name, NULL, "");
+	ok = _SC_R_checkResolverReachability(&store_info, flags, haveDNS, ptr_name, NULL, 0, "");
 
     done :
 
+	freeReachabilityStoreInfo(&store_info);
 	return ok;
 }
 
 
 static Boolean
 startAsyncDNSQuery(SCNetworkReachabilityRef target) {
-	int				error;
-	mach_port_t			mp;
+	int				error	= 0;
+	mach_port_t			mp	= MACH_PORT_NULL;
 	Boolean				ok;
 	SCNetworkReachabilityPrivateRef	targetPrivate	= (SCNetworkReachabilityPrivateRef)target;
 
 	(void) gettimeofday(&targetPrivate->dnsQueryStart, NULL);
 
-	error = getaddrinfo_async_start(&mp,
-					targetPrivate->name,
-					targetPrivate->serv,
-					&targetPrivate->hints,
-					__SCNetworkReachabilityCallbackSetResolvedAddress,
-					(void *)target);
+#ifdef	HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+	if (targetPrivate->if_index == 0) {
+#endif	/* HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL */
+		error = getaddrinfo_async_start(&mp,
+						targetPrivate->name,
+						targetPrivate->serv,
+						&targetPrivate->hints,
+						__SCNetworkReachabilityCallbackSetResolvedAddress,
+						(void *)target);
+#ifdef	HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+	} else {
+		mp = _getaddrinfo_interface_async_call(targetPrivate->name,
+						       targetPrivate->serv,
+						       &targetPrivate->hints,
+						       targetPrivate->if_name,
+						       __SCNetworkReachabilityCallbackSetResolvedAddress,
+						       (void *)target);
+		if (mp == MACH_PORT_NULL) {
+			error = EAI_SYSTEM;
+		}
+	}
+#endif	/* HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL */
 	if (error != 0) {
 		/* save the error associated with the attempt to resolve the name */
 		__SCNetworkReachabilityCallbackSetResolvedAddress(error, NULL, (void *)target);
@@ -2676,7 +3224,7 @@ __SCNetworkReachabilityOnDemandCheckCallback(SCNetworkReachabilityRef	onDemandSe
 
 
 static Boolean
-__SCNetworkReachabilityOnDemandCheck(SCDynamicStoreRef		*storeP,
+__SCNetworkReachabilityOnDemandCheck(ReachabilityStoreInfoRef	store_info,
 				     SCNetworkReachabilityRef	target,
 				     Boolean			onDemandRetry,
 				     SCNetworkReachabilityFlags	*flags)
@@ -2686,6 +3234,7 @@ __SCNetworkReachabilityOnDemandCheck(SCDynamicStoreRef		*storeP,
 	CFStringRef			onDemandRemoteAddress	= NULL;
 	CFStringRef			onDemandServiceID	= NULL;
 	SCNetworkConnectionStatus	onDemandStatus;
+	SCDynamicStoreRef		store;
 	SCNetworkReachabilityPrivateRef	targetPrivate		= (SCNetworkReachabilityPrivateRef)target;
 
 //	SCLog(_sc_debug, LOG_INFO,
@@ -2700,12 +3249,17 @@ __SCNetworkReachabilityOnDemandCheck(SCDynamicStoreRef		*storeP,
 	/*
 	 * check if an OnDemand VPN configuration matches the name.
 	 */
-	ok = __SCNetworkConnectionCopyOnDemandInfoWithName(storeP,
+	store = store_info->store;
+	ok = __SCNetworkConnectionCopyOnDemandInfoWithName(&store,
 							   targetPrivate->onDemandName,
 							   onDemandRetry,
 							   &onDemandServiceID,
 							   &onDemandStatus,
 							   &onDemandRemoteAddress);
+	if (store_info->store != store) {
+		store_info->store = store;
+		store_info->storeAdded = TRUE;
+	}
 	if (!_SC_CFEqual(targetPrivate->onDemandRemoteAddress, onDemandRemoteAddress) ||
 	    !_SC_CFEqual(targetPrivate->onDemandServiceID, onDemandServiceID)) {
 		if (targetPrivate->onDemandRemoteAddress != NULL) {
@@ -2714,13 +3268,10 @@ __SCNetworkReachabilityOnDemandCheck(SCDynamicStoreRef		*storeP,
 		}
 
 		if (targetPrivate->onDemandServer != NULL) {
-#if	!TARGET_OS_IPHONE
 			if (targetPrivate->dispatchQueue != NULL) {
 				// unschedule
 				__SCNetworkReachabilityUnscheduleFromRunLoop(targetPrivate->onDemandServer, NULL, NULL, TRUE);
-			} else
-#endif	// !TARGET_OS_IPHONE
-			if (targetPrivate->rls != NULL) {
+			} else if (targetPrivate->rls != NULL) {
 				CFIndex	i;
 				CFIndex	n;
 
@@ -2770,12 +3321,9 @@ __SCNetworkReachabilityOnDemandCheck(SCDynamicStoreRef		*storeP,
 									 &context);
 
 					// schedule server reachability to match that of the target
-#if	!TARGET_OS_IPHONE
 					if (targetPrivate->dispatchQueue != NULL) {
 						__SCNetworkReachabilityScheduleWithRunLoop(targetPrivate->onDemandServer, NULL, NULL, targetPrivate->dispatchQueue, TRUE);
-					} else
-#endif	// !TARGET_OS_IPHONE
-					{
+					} else {
 						CFIndex	i;
 						CFIndex	n;
 
@@ -2841,8 +3389,88 @@ __SCNetworkReachabilityOnDemandCheck(SCDynamicStoreRef		*storeP,
 #pragma mark Reachability Flags
 
 
+#ifdef	HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+typedef struct {
+	int		status;
+	struct addrinfo	*res;
+} reply_info;
+
+
+static void
+reply_callback(int32_t status, struct addrinfo *res, void *context)
+{
+	reply_info	*reply	= (reply_info *)context;
+
+	reply->status = status;
+	reply->res    = res;
+	return;
+}
+
+
+static int
+getaddrinfo_interface_sync(const char			*nodename,
+			   const char			*servname,
+			   const struct addrinfo	*hints,
+			   const char			*interface,
+			   struct addrinfo		**res)
+{
+	mach_port_t	mp;
+	reply_info	reply	= { NETDB_SUCCESS, NULL };
+
+	mp = _getaddrinfo_interface_async_call(nodename,
+					       servname,
+					       hints,
+					       interface,
+					       reply_callback,
+					       (void *)&reply);
+	if (mp == MACH_PORT_NULL) {
+		return EAI_SYSTEM;
+	}
+
+	while (TRUE) {
+		int		g_status;
+		union {
+			u_int8_t		buf[8192];
+			mach_msg_empty_rcv_t	msg;
+		}		m_reply;
+		kern_return_t 	m_status;
+
+		m_status = mach_msg(&m_reply.msg.header,	/* msg */
+				    MACH_RCV_MSG,		/* options */
+				    0,				/* send_size */
+				    sizeof(m_reply),		/* rcv_size */
+				    mp,				/* rcv_name */
+				    MACH_MSG_TIMEOUT_NONE,	/* timeout */
+				    MACH_PORT_NULL);		/* notify */
+		if (m_status != KERN_SUCCESS) {
+			return EAI_SYSTEM;
+		}
+
+		g_status = getaddrinfo_async_handle_reply((void *)m_reply.buf);
+		if (g_status != 0) {
+			if (reply.res != NULL) {
+				freeaddrinfo(reply.res);
+				reply.res = NULL;
+			}
+			return EAI_SYSTEM;
+		}
+
+		if ((reply.res != NULL) || (reply.status != NETDB_SUCCESS)) {
+			// if we have a reply or an error
+			break;
+		}
+
+		// if the request is not complete and needs to be re-queued
+	}
+
+	*res = reply.res;
+	return reply.status;
+}
+#endif	/* HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL */
+
+
 static Boolean
-__SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
+__SCNetworkReachabilityGetFlags(ReachabilityStoreInfoRef	store_info,
 				SCNetworkReachabilityRef	target,
 				ReachabilityInfo		*reach_info,
 				Boolean				async)
@@ -2869,8 +3497,9 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 				/*
 				 * Check "local" address
 				 */
-				ok = checkAddress(storeP,
+				ok = checkAddress(store_info,
 						  targetPrivate->localAddress,
+						  targetPrivate->if_index,
 						  &my_info,
 						  targetPrivate->log_prefix);
 				if (!ok) {
@@ -2895,8 +3524,9 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 				/*
 				 * Check "remote" address
 				 */
-				ok = checkAddress(storeP,
+				ok = checkAddress(store_info,
 						  targetPrivate->remoteAddress,
+						  targetPrivate->if_index,
 						  &my_info,
 						  targetPrivate->log_prefix);
 				if (!ok) {
@@ -2933,7 +3563,7 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 				 * before we attempt our initial DNS query, check if there is
 				 * an OnDemand configuration that we should be using.
 				 */
-				onDemand = __SCNetworkReachabilityOnDemandCheck(storeP, target, FALSE, &my_info.flags);
+				onDemand = __SCNetworkReachabilityOnDemandCheck(store_info, target, FALSE, &my_info.flags);
 				if (onDemand) {
 					/* if OnDemand connection is needed */
 					goto done;
@@ -2941,11 +3571,12 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 			}
 
 			/* check the reachability of the DNS servers */
-			ok = _SC_R_checkResolverReachability(storeP,
+			ok = _SC_R_checkResolverReachability(store_info,
 							     &ns_flags,
 							     &targetPrivate->haveDNS,
 							     targetPrivate->name,
 							     targetPrivate->serv,
+							     targetPrivate->if_index,
 							     targetPrivate->log_prefix);
 			if (!ok) {
 				/* if we could not get DNS server info */
@@ -2962,8 +3593,9 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 				SCLog(_sc_debug, LOG_INFO, CFSTR("%sDNS server(s) not available"),
 				      targetPrivate->log_prefix);
 
-				ok = checkAddress(storeP,
+				ok = checkAddress(store_info,
 						  NULL,
+						  targetPrivate->if_index,
 						  &my_info,
 						  targetPrivate->log_prefix);
 				if (!ok) {
@@ -3043,10 +3675,22 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 				(void) gettimeofday(&dnsQueryStart, NULL);
 			}
 
-			error = getaddrinfo(targetPrivate->name,
-					    targetPrivate->serv,
-					    &targetPrivate->hints,
-					    &res);
+#ifdef	HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+			if (targetPrivate->if_index == 0) {
+#endif	// HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+				error = getaddrinfo(targetPrivate->name,
+						    targetPrivate->serv,
+						    &targetPrivate->hints,
+						    &res);
+#ifdef	HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
+			} else {
+				error = getaddrinfo_interface_sync(targetPrivate->name,
+								   targetPrivate->serv,
+								   &targetPrivate->hints,
+								   targetPrivate->if_name,
+								   &res);
+			}
+#endif	// HAVE_GETADDRINFO_INTERFACE_ASYNC_CALL
 
 			__log_query_time(target,
 					 ((error == 0) && (res != NULL)),	// if successful query
@@ -3076,8 +3720,9 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 
 					sa = (struct sockaddr *)CFDataGetBytePtr(CFArrayGetValueAtIndex(addresses, i));
 
-					ok = checkAddress(storeP,
+					ok = checkAddress(store_info,
 							  sa,
+							  targetPrivate->if_index,
 							  &ns_info,
 							  targetPrivate->log_prefix);
 					if (!ok) {
@@ -3109,7 +3754,7 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 						 * our initial DNS query failed, check again to see if there
 						 * there is an OnDemand configuration that we should be using.
 						 */
-						onDemand = __SCNetworkReachabilityOnDemandCheck(storeP, target, TRUE, &my_info.flags);
+						onDemand = __SCNetworkReachabilityOnDemandCheck(store_info, target, TRUE, &my_info.flags);
 						if (onDemand) {
 							/* if OnDemand connection is needed */
 							goto done;
@@ -3122,8 +3767,9 @@ __SCNetworkReachabilityGetFlags(SCDynamicStoreRef		*storeP,
 						 * the availability of configured (but not active)
 						 * services.
 						 */
-						ok = checkAddress(storeP,
+						ok = checkAddress(store_info,
 								  NULL,
+								  targetPrivate->if_index,
 								  &my_info,
 								  targetPrivate->log_prefix);
 						if (!ok) {
@@ -3165,7 +3811,7 @@ SCNetworkReachabilityGetFlags(SCNetworkReachabilityRef		target,
 			      SCNetworkReachabilityFlags	*flags)
 {
 	Boolean				ok		= TRUE;
-	SCDynamicStoreRef		store		= NULL;
+	ReachabilityStoreInfo		store_info;
 	SCNetworkReachabilityPrivateRef	targetPrivate	= (SCNetworkReachabilityPrivateRef)target;
 
 	if (!isA_SCNetworkReachability(target)) {
@@ -3173,6 +3819,7 @@ SCNetworkReachabilityGetFlags(SCNetworkReachabilityRef		target,
 		return FALSE;
 	}
 
+	initReachabilityStoreInfo(&store_info);
 	pthread_mutex_lock(&targetPrivate->lock);
 
 	if (targetPrivate->scheduled) {
@@ -3182,13 +3829,13 @@ SCNetworkReachabilityGetFlags(SCNetworkReachabilityRef		target,
 	}
 
 
-	ok = __SCNetworkReachabilityGetFlags(&store, target, &targetPrivate->info, FALSE);
+	ok = __SCNetworkReachabilityGetFlags(&store_info, target, &targetPrivate->info, FALSE);
 	*flags = targetPrivate->info.flags & ~kSCNetworkReachabilityFlagsFirstResolvePending;
-	if (store != NULL) CFRelease(store);
 
     done :
 
 	pthread_mutex_unlock(&targetPrivate->lock);
+	freeReachabilityStoreInfo(&store_info);
 	return ok;
 }
 
@@ -3236,31 +3883,49 @@ __SCNetworkReachabilityReachabilitySetNotifications(SCDynamicStoreRef	store)
 	CFArrayAppendValue(keys, key);
 	CFRelease(key);
 
-	// Setup: per-service IPv4 info
+	// Setup: per-service Interface info
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetInterface);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+
+	// per-service IPv4 info
 	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 							      kSCDynamicStoreDomainSetup,
 							      kSCCompAnyRegex,
 							      kSCEntNetIPv4);
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv4);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
 
-	// Setup: per-service Interface info
+	// per-service IPv6 info
 	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 							      kSCDynamicStoreDomainSetup,
 							      kSCCompAnyRegex,
-							      kSCEntNetInterface);
+							      kSCEntNetIPv6);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPv6);
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
 
-	// Setup: per-service PPP info (for kSCPropNetPPPDialOnDemand)
+	// per-service PPP info (for existence, kSCPropNetPPPDialOnDemand, kSCPropNetPPPStatus)
 	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 							      kSCDynamicStoreDomainSetup,
 							      kSCCompAnyRegex,
 							      kSCEntNetPPP);
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
-
-	// State: per-service PPP info (for kSCPropNetPPPStatus)
 	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 							      kSCDynamicStoreDomainState,
 							      kSCCompAnyRegex,
@@ -3268,27 +3933,33 @@ __SCNetworkReachabilityReachabilitySetNotifications(SCDynamicStoreRef	store)
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
 
-	// Setup: per-service IPSec info
+#if	!TARGET_IPHONE_SIMULATOR
+	// per-service VPN info (for existence, kSCPropNetVPNStatus)
 	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
 							      kSCDynamicStoreDomainSetup,
 							      kSCCompAnyRegex,
-							      kSCEntNetIPSec);
+							      kSCEntNetVPN);
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
-
-	// State: per-interface IPv4 info
-	pattern = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-								kSCDynamicStoreDomainState,
-								kSCCompAnyRegex,
-								kSCEntNetIPv4);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetVPN);
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
+#endif	// !TARGET_IPHONE_SIMULATOR
 
-	// State: per-interface IPv6 info
-	pattern = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
-								kSCDynamicStoreDomainState,
-								kSCCompAnyRegex,
-								kSCEntNetIPv6);
+	// per-service IPSec info (for existence, kSCPropNetIPSecStatus)
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainSetup,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPSec);
+	CFArrayAppendValue(patterns, pattern);
+	CFRelease(pattern);
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      kSCEntNetIPSec);
 	CFArrayAppendValue(patterns, pattern);
 	CFRelease(pattern);
 
@@ -3315,16 +3986,17 @@ __SCNetworkReachabilityHandleChanges(SCDynamicStoreRef	store,
 				     CFArrayRef		changedKeys,
 				     void		*info)
 {
-	Boolean		dnsConfigChanged	= FALSE;
-	CFIndex		i;
-	CFStringRef	key;
-	CFIndex		nChanges		= CFArrayGetCount(changedKeys);
-	CFIndex		nTargets;
+	Boolean			dnsConfigChanged	= FALSE;
+	CFIndex			i;
+	CFStringRef		key;
+	CFIndex			nChanges		= CFArrayGetCount(changedKeys);
+	CFIndex			nTargets;
 #if	!TARGET_OS_IPHONE
-	Boolean		powerStatusChanged	= FALSE;
+	Boolean			powerStatusChanged	= FALSE;
 #endif	// !TARGET_OS_IPHONE
-	const void *	targets_q[N_QUICK];
-	const void **	targets			= targets_q;
+	ReachabilityStoreInfo	store_info;
+	const void *		targets_q[N_QUICK];
+	const void **		targets			= targets_q;
 
 	if (nChanges == 0) {
 		/* if no changes */
@@ -3372,31 +4044,34 @@ __SCNetworkReachabilityHandleChanges(SCDynamicStoreRef	store,
 		const char	*str;
 
 #if	!TARGET_OS_IPHONE
+		#define	PWR	4
 		if (powerStatusChanged) {
-			changes |= 4;
+			changes |= PWR;
 			nChanges -= 1;
 		}
 #endif	// !TARGET_OS_IPHONE
 
+		#define	DNS	2
 		if (dnsConfigChanged) {
-			changes |= 2;
+			changes |= DNS;
 			nChanges -= 1;
 		}
 
+		#define	NET	1
 		if (nChanges > 0) {
-			changes |= 1;
+			changes |= NET;
 		}
 
 		switch (changes) {
-			case 0	: str = "";				break;
-			case 1	: str = "network ";			break;
-			case 2	: str = "DNS ";				break;
-			case 3	: str = "network and DNS ";		break;
+			case 0           : str = "";				break;
+			case NET         : str = "network ";			break;
+			case DNS         : str = "DNS ";			break;
+			case DNS|NET     : str = "network and DNS ";		break;
 #if	!TARGET_OS_IPHONE
-			case 4	: str = "power ";			break;
-			case 5	: str = "network and power ";		break;
-			case 6	: str = "DNS and power ";		break;
-			case 7	: str = "network, DNS, and power ";	break;
+			case PWR         : str = "power ";			break;
+			case PWR|NET     : str = "network and power ";		break;
+			case PWR|DNS     : str = "DNS and power ";		break;
+			case PWR|DNS|NET : str = "network, DNS, and power ";	break;
 #endif	// !TARGET_OS_IPHONE
 			default	: str = "??? ";
 		}
@@ -3404,6 +4079,8 @@ __SCNetworkReachabilityHandleChanges(SCDynamicStoreRef	store,
 		SCLog(TRUE, LOG_INFO, CFSTR("process %sconfiguration change"), str);
 	}
 
+	initReachabilityStoreInfo(&store_info);
+
 	if (nTargets > (CFIndex)(sizeof(targets_q) / sizeof(CFTypeRef)))
 		targets = CFAllocatorAllocate(NULL, nTargets * sizeof(CFTypeRef), 0);
 	CFSetGetValues(hn_targets, targets);
@@ -3425,12 +4102,17 @@ __SCNetworkReachabilityHandleChanges(SCDynamicStoreRef	store,
 				Boolean				ok;
 
 				/* check the reachability of the DNS servers */
-				ok = _SC_R_checkResolverReachability(&store,
-								     &ns_flags,
-								     &targetPrivate->haveDNS,
-								     targetPrivate->name,
-								     targetPrivate->serv,
-								     targetPrivate->log_prefix);
+				ok = updateReachabilityStoreInfo(&store_info, &store, AF_UNSPEC);
+				if (ok) {
+					ok = _SC_R_checkResolverReachability(&store_info,
+									     &ns_flags,
+									     &targetPrivate->haveDNS,
+									     targetPrivate->name,
+									     targetPrivate->serv,
+									     targetPrivate->if_index,
+									     targetPrivate->log_prefix);
+				}
+
 				if (!ok) {
 					/* if we could not get DNS server info */
 					SCLog(_sc_debug, LOG_INFO, CFSTR("%sDNS server reachability unknown"),
@@ -3476,6 +4158,8 @@ __SCNetworkReachabilityHandleChanges(SCDynamicStoreRef	store,
 	}
 	if (targets != targets_q)	CFAllocatorDeallocate(NULL, targets);
 
+	freeReachabilityStoreInfo(&store_info);
+
     done :
 
 	pthread_mutex_unlock(&hn_lock);
@@ -3522,7 +4206,7 @@ rlsPerform(void *info)
 	Boolean				ok;
 	ReachabilityInfo		reach_info	= NOT_REACHABLE;
 	SCNetworkReachabilityCallBack	rlsFunction;
-	SCDynamicStoreRef		store		= NULL;
+	ReachabilityStoreInfo		store_info;
 	SCNetworkReachabilityRef	target		= (SCNetworkReachabilityRef)info;
 	SCNetworkReachabilityPrivateRef	targetPrivate	= (SCNetworkReachabilityPrivateRef)target;
 
@@ -3539,8 +4223,9 @@ rlsPerform(void *info)
 	}
 
 	/* update reachability, notify if status changed */
-	ok = __SCNetworkReachabilityGetFlags(&store, target, &reach_info, TRUE);
-	if (store != NULL) CFRelease(store);
+	initReachabilityStoreInfo(&store_info);
+	ok = __SCNetworkReachabilityGetFlags(&store_info, target, &reach_info, TRUE);
+	freeReachabilityStoreInfo(&store_info);
 	if (!ok) {
 		/* if reachability status not available */
 		SCLog(_sc_debug, LOG_INFO, CFSTR("%flags not available"),
@@ -3564,14 +4249,14 @@ rlsPerform(void *info)
 			 * the same or "better"
 			 */
 			defer = TRUE;
-		} else if (bcmp(&targetPrivate->last_notify, &reach_info, sizeof(reach_info)) == 0) {
+		} else if (__reach_equal(&targetPrivate->last_notify, &reach_info)) {
 			/* if we have already posted this change */
 			defer = TRUE;
 		}
 	}
 #endif	// !TARGET_OS_IPHONE
 
-	if (bcmp(&targetPrivate->info, &reach_info, sizeof(reach_info)) == 0) {
+	if (__reach_equal(&targetPrivate->info, &reach_info)) {
 		SCLog(_sc_debug, LOG_INFO,
 		      CFSTR("%sflags/interface match (now 0x%08x/%hu%s)"),
 		      targetPrivate->log_prefix,
@@ -3618,7 +4303,9 @@ rlsPerform(void *info)
 	pthread_mutex_unlock(&targetPrivate->lock);
 
 	if (rlsFunction != NULL) {
-		(*rlsFunction)(target, reach_info.flags, context_info);
+		(*rlsFunction)(target,
+			       reach_info.flags & ~kSCNetworkReachabilityFlagsFirstResolvePending,
+			       context_info);
 	}
 
 	if (context_release != NULL) {
@@ -3677,11 +4364,7 @@ static Boolean
 __SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef	target,
 					   CFRunLoopRef			runLoop,
 					   CFStringRef			runLoopMode,
-#if	!TARGET_OS_IPHONE
 					   dispatch_queue_t		queue,
-#else	// !TARGET_OS_IPHONE
-					   void				*queue,
-#endif	// !TARGET_OS_IPHONE
 					   Boolean			onDemand)
 {
 	SCNetworkReachabilityPrivateRef	targetPrivate	= (SCNetworkReachabilityPrivateRef)target;
@@ -3693,13 +4376,11 @@ __SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef	target,
 	}
 	pthread_mutex_lock(&targetPrivate->lock);
 
-#if	!TARGET_OS_IPHONE
 	if ((targetPrivate->dispatchQueue != NULL) ||		// if we are already scheduled with a dispatch queue
 	    ((queue != NULL) && targetPrivate->scheduled)) {	// if we are already scheduled on a CFRunLoop
 		_SCErrorSet(kSCStatusInvalidArgument);
 		goto done;
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	/* schedule the SCNetworkReachability run loop source */
 
@@ -3724,7 +4405,6 @@ __SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef	target,
 
 		__SCNetworkReachabilityReachabilitySetNotifications(hn_store);
 
-#if	!TARGET_OS_IPHONE
 		hn_dispatchQueue = dispatch_queue_create("com.apple.SCNetworkReachabilty.network_changes", NULL);
 		if (hn_dispatchQueue == NULL) {
 			SCLog(TRUE, LOG_ERR, CFSTR("__SCNetworkReachabilityScheduleWithRunLoop dispatch_queue_create() failed"));
@@ -3746,10 +4426,6 @@ __SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef	target,
 			hn_store = NULL;
 			goto done;
 		}
-#else	// !TARGET_OS_IPHONE
-		hn_storeRLS = SCDynamicStoreCreateRunLoopSource(NULL, hn_store, 0);
-		hn_rlList   = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-#endif	// !TARGET_OS_IPHONE
 		hn_targets  = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
 	}
 
@@ -3778,13 +4454,10 @@ __SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef	target,
 		init = TRUE;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (queue != NULL) {
 		targetPrivate->dispatchQueue = queue;
 		dispatch_retain(targetPrivate->dispatchQueue);
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		if (!_SC_isScheduled(NULL, runLoop, runLoopMode, targetPrivate->rlList)) {
 			/*
 			 * if we do not already have host notifications scheduled with
@@ -3799,35 +4472,20 @@ __SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef	target,
 		}
 
 		_SC_schedule(target, runLoop, runLoopMode, targetPrivate->rlList);
-
-#if	TARGET_OS_IPHONE
-		if (!onDemand) {
-			/* schedule the global SCDynamicStore run loop source */
-
-			if (!_SC_isScheduled(NULL, runLoop, runLoopMode, hn_rlList)) {
-				/*
-				 * if we do not already have SC notifications scheduled with
-				 * this runLoop / runLoopMode
-				 */
-				CFRunLoopAddSource(runLoop, hn_storeRLS, runLoopMode);
-			}
-
-			_SC_schedule(target, runLoop, runLoopMode, hn_rlList);
-		}
-#endif	// TARGET_OS_IPHONE
 	}
 
 	CFSetAddValue(hn_targets, target);
 
 	if (init) {
 		ReachabilityInfo	reach_info	= NOT_REACHABLE;
-		SCDynamicStoreRef	store		= NULL;
+		ReachabilityStoreInfo	store_info;
 
 		/*
 		 * if we have yet to schedule SC notifications for this address
 		 * - initialize current reachability status
 		 */
-		if (__SCNetworkReachabilityGetFlags(&store, target, &reach_info, TRUE)) {
+		initReachabilityStoreInfo(&store_info);
+		if (__SCNetworkReachabilityGetFlags(&store_info, target, &reach_info, TRUE)) {
 			/*
 			 * if reachability status available
 			 * - set flags
@@ -3839,7 +4497,7 @@ __SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef	target,
 			/* if reachability status not available, async lookup started */
 			targetPrivate->info = NOT_REACHABLE;
 		}
-		if (store != NULL) CFRelease(store);
+		freeReachabilityStoreInfo(&store_info);
 	}
 
 	if (targetPrivate->onDemandServer != NULL) {
@@ -3873,13 +4531,11 @@ __SCNetworkReachabilityUnscheduleFromRunLoop(SCNetworkReachabilityRef	target,
 	}
 	pthread_mutex_lock(&targetPrivate->lock);
 
-#if	!TARGET_OS_IPHONE
 	if (((runLoop == NULL) && (targetPrivate->dispatchQueue == NULL)) ||	// if we should be scheduled on a dispatch queue (but are not)
 	    ((runLoop != NULL) && (targetPrivate->dispatchQueue != NULL))) {	// if we should be scheduled on a CFRunLoop (but are not)
 		_SCErrorSet(kSCStatusInvalidArgument);
 		goto done;
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	if (!targetPrivate->scheduled) {
 		// if not currently scheduled
@@ -3888,14 +4544,11 @@ __SCNetworkReachabilityUnscheduleFromRunLoop(SCNetworkReachabilityRef	target,
 	}
 
 	// first, unschedule the target specific sources
-#if	!TARGET_OS_IPHONE
 	if (targetPrivate->dispatchQueue != NULL) {
 		if (targetPrivate->onDemandServer != NULL) {
 			__SCNetworkReachabilityUnscheduleFromRunLoop(targetPrivate->onDemandServer, NULL, NULL, TRUE);
 		}
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		if (!_SC_unschedule(target, runLoop, runLoopMode, targetPrivate->rlList, FALSE)) {
 			// if not currently scheduled
 			_SCErrorSet(kSCStatusInvalidArgument);
@@ -3944,77 +4597,17 @@ __SCNetworkReachabilityUnscheduleFromRunLoop(SCNetworkReachabilityRef	target,
 		}
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (runLoop == NULL) {
 		dispatch_release(targetPrivate->dispatchQueue);
 		targetPrivate->dispatchQueue = NULL;
 	}
-#endif	// !TARGET_OS_IPHONE
-
-	// now, unschedule the global dynamic store source
-#if	TARGET_OS_IPHONE
-	if (!onDemand) {
-		(void)_SC_unschedule(target, runLoop, runLoopMode, hn_rlList, FALSE);
-
-		n = CFArrayGetCount(hn_rlList);
-		if ((n == 0) || !_SC_isScheduled(NULL, runLoop, runLoopMode, hn_rlList)) {
-			/*
-			 * if we no longer have any addresses scheduled for
-			 * this runLoop / runLoopMode
-			 */
-			CFRunLoopRemoveSource(runLoop, hn_storeRLS, runLoopMode);
-
-			if (n > 0) {
-				if (CFEqual(runLoopMode, kCFRunLoopCommonModes)) {
-					CFArrayRef	modes;
-
-					modes = CFRunLoopCopyAllModes(runLoop);
-					if (modes != NULL) {
-						CFIndex	i;
-						CFIndex	n	= CFArrayGetCount(modes);
-
-						for (i = 0; i < n; i++) {
-							CFStringRef	mode;
-
-							mode = CFArrayGetValueAtIndex(modes, i);
-							if (_SC_isScheduled(NULL, runLoop, mode, hn_rlList)) {
-								/*
-								 * removing kCFRunLoopCommonModes cleaned up more
-								 * than we wanted.  Add back the modes that were
-								 * expect to be present.
-								 */
-								CFRunLoopAddSource(runLoop, hn_storeRLS, mode);
-							}
-						}
-
-						CFRelease(modes);
-					}
-				} else if (_SC_isScheduled(NULL, runLoop, kCFRunLoopCommonModes, hn_rlList)) {
-					/*
-					 * if we are still scheduling kCFRunLoopCommonModes, make sure that
-					 * none of the common modes were inadvertently removed.
-					 */
-					CFRunLoopAddSource(runLoop, hn_storeRLS, kCFRunLoopCommonModes);
-				}
-			}
-		}
-	}
-#endif	// TARGET_OS_IPHONE
 
 	n = CFSetGetCount(hn_targets);
 	if (n == 0) {
 		// if we are no longer monitoring any targets
-#if	!TARGET_OS_IPHONE
 		SCDynamicStoreSetDispatchQueue(hn_store, NULL);
 		dispatch_release(hn_dispatchQueue);
 		hn_dispatchQueue = NULL;
-#else	// !TARGET_OS_IPHONE
-		CFRunLoopSourceInvalidate(hn_storeRLS);
-		CFRelease(hn_storeRLS);
-		hn_storeRLS = NULL;
-		CFRelease(hn_rlList);
-		hn_rlList = NULL;
-#endif	// !TARGET_OS_IPHONE
 		CFRelease(hn_store);
 		hn_store = NULL;
 		CFRelease(hn_targets);
@@ -4065,7 +4658,6 @@ SCNetworkReachabilityUnscheduleFromRunLoop(SCNetworkReachabilityRef	target,
 	return __SCNetworkReachabilityUnscheduleFromRunLoop(target, runLoop, runLoopMode, FALSE);
 }
 
-#if	!TARGET_OS_IPHONE
 Boolean
 SCNetworkReachabilitySetDispatchQueue(SCNetworkReachabilityRef	target,
 				      dispatch_queue_t		queue)
@@ -4085,4 +4677,3 @@ SCNetworkReachabilitySetDispatchQueue(SCNetworkReachabilityRef	target,
 
 	return ok;
 }
-#endif	// !TARGET_OS_IPHONE
diff --git a/SystemConfiguration.fproj/SCNetworkReachability.h b/SystemConfiguration.fproj/SCNetworkReachability.h
index 7d00c23..14c56c7 100644
--- a/SystemConfiguration.fproj/SCNetworkReachability.h
+++ b/SystemConfiguration.fproj/SCNetworkReachability.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2005, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2003-2005, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,9 +31,7 @@
 #include <sys/socket.h>
 #include <CoreFoundation/CoreFoundation.h>
 #include <SystemConfiguration/SCNetwork.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 
 /*!
 	@header SCNetworkReachability
@@ -152,9 +150,7 @@ enum {
 	kSCNetworkReachabilityFlagsConnectionRequired	= 1<<2,
 	kSCNetworkReachabilityFlagsConnectionOnTraffic	= 1<<3,
 	kSCNetworkReachabilityFlagsInterventionRequired	= 1<<4,
-#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000) || TARGET_IPHONE_SIMULATOR
-	kSCNetworkReachabilityFlagsConnectionOnDemand	= 1<<5,
-#endif
+	kSCNetworkReachabilityFlagsConnectionOnDemand	= 1<<5,	// __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0)
 	kSCNetworkReachabilityFlagsIsLocalAddress	= 1<<16,
 	kSCNetworkReachabilityFlagsIsDirect		= 1<<17,
 #if	TARGET_OS_IPHONE
@@ -323,7 +319,6 @@ SCNetworkReachabilityUnscheduleFromRunLoop	(
 						CFStringRef			runLoopMode
 						)				__OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0);
 
-#if	!TARGET_OS_IPHONE
 /*!
 	@function SCNetworkReachabilitySetDispatchQueue
 	@discussion Schedules callbacks for the given target on the given
@@ -338,8 +333,7 @@ Boolean
 SCNetworkReachabilitySetDispatchQueue		(
 						SCNetworkReachabilityRef	target,
 						dispatch_queue_t		queue
-						)				__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA);
-#endif	// !TARGET_OS_IPHONE
+						)				__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0);
 
 __END_DECLS
 
diff --git a/SystemConfiguration.fproj/SCNetworkService.c b/SystemConfiguration.fproj/SCNetworkService.c
index d01acc0..efdc4b7 100644
--- a/SystemConfiguration.fproj/SCNetworkService.c
+++ b/SystemConfiguration.fproj/SCNetworkService.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -172,6 +172,42 @@ __SCNetworkServiceCreatePrivate(CFAllocatorRef		allocator,
 }
 
 
+#pragma mark -
+#pragma mark Service ordering
+
+
+CFComparisonResult
+_SCNetworkServiceCompare(const void *val1, const void *val2, void *context)
+{
+	CFStringRef		id1;
+	CFStringRef		id2;
+	CFArrayRef		order	= (CFArrayRef)context;
+	SCNetworkServiceRef	s1	= (SCNetworkServiceRef)val1;
+	SCNetworkServiceRef	s2	= (SCNetworkServiceRef)val2;
+
+	id1 = SCNetworkServiceGetServiceID(s1);
+	id2 = SCNetworkServiceGetServiceID(s2);
+
+	if (order != NULL) {
+		CFIndex	o1;
+		CFIndex	o2;
+		CFRange	range;
+
+		range = CFRangeMake(0, CFArrayGetCount(order));
+		o1 = CFArrayGetFirstIndexOfValue(order, range, id1);
+		o2 = CFArrayGetFirstIndexOfValue(order, range, id2);
+
+		if (o1 > o2) {
+			return (o2 != kCFNotFound) ? kCFCompareGreaterThan : kCFCompareLessThan;
+		} else if (o1 < o2) {
+			return (o1 != kCFNotFound) ? kCFCompareLessThan    : kCFCompareGreaterThan;
+		}
+	}
+
+	return CFStringCompare(id1, id2, 0);
+}
+
+
 #pragma mark -
 #pragma mark SCNetworkService APIs
 
@@ -179,36 +215,196 @@ __SCNetworkServiceCreatePrivate(CFAllocatorRef		allocator,
 #define	N_QUICK	64
 
 
+__private_extern__ CFArrayRef /* of SCNetworkServiceRef's */
+__SCNetworkServiceCopyAllEnabled(SCPreferencesRef prefs)
+{
+	CFMutableArrayRef	array	= NULL;
+	CFIndex			i_sets;
+	CFIndex			n_sets;
+	CFArrayRef		sets;
+
+	sets = SCNetworkSetCopyAll(prefs);
+	if (sets == NULL) {
+		return NULL;
+	}
+
+	n_sets = CFArrayGetCount(sets);
+	for (i_sets = 0; i_sets < n_sets; i_sets++) {
+		CFIndex		i_services;
+		CFIndex		n_services;
+		CFArrayRef	services;
+		SCNetworkSetRef	set;
+
+		set = CFArrayGetValueAtIndex(sets, i_sets);
+		services = SCNetworkSetCopyServices(set);
+		if (services == NULL) {
+			continue;
+		}
+
+		n_services = CFArrayGetCount(services);
+		for (i_services = 0; i_services < n_services; i_services++) {
+			SCNetworkServiceRef service;
+
+			service = CFArrayGetValueAtIndex(services, i_services);
+			if (!SCNetworkServiceGetEnabled(service)) {
+				// if not enabled
+				continue;
+			}
+
+			if ((array == NULL) ||
+			    !CFArrayContainsValue(array,
+						  CFRangeMake(0, CFArrayGetCount(array)),
+						  service)) {
+				if (array == NULL) {
+					array = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+				}
+				CFArrayAppendValue(array, service);
+			}
+		}
+		CFRelease(services);
+	}
+	CFRelease(sets);
+
+	return array;
+}
+
+
+__private_extern__ Boolean
+__SCNetworkServiceExistsForInterface(CFArrayRef services, SCNetworkInterfaceRef interface)
+{
+	CFIndex	i;
+	CFIndex	n;
+
+	n = isA_CFArray(services) ? CFArrayGetCount(services) : 0;
+	for (i = 0; i < n; i++) {
+		SCNetworkServiceRef	service;
+		SCNetworkInterfaceRef	service_interface;
+
+		service = CFArrayGetValueAtIndex(services, i);
+
+		service_interface = SCNetworkServiceGetInterface(service);
+		while (service_interface != NULL) {
+			if (CFEqual(interface, service_interface)) {
+				return TRUE;
+			}
+
+			service_interface = SCNetworkInterfaceGetInterface(service_interface);
+		}
+	}
+
+	return FALSE;
+}
+
+
+__private_extern__ CFStringRef
+__SCNetworkServiceNextName(SCNetworkServiceRef service)
+{
+	CFArrayRef		components;
+	CFIndex			n;
+	CFStringRef		name;
+	CFMutableArrayRef	newComponents;
+	SInt32			suffix	= 2;
+
+	name = SCNetworkServiceGetName(service);
+	if (name == NULL) {
+		return NULL;
+	}
+
+	components = CFStringCreateArrayBySeparatingStrings(NULL, name, CFSTR(" "));
+	if (components != NULL) {
+		newComponents = CFArrayCreateMutableCopy(NULL, 0, components);
+		CFRelease(components);
+	} else {
+		newComponents = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+		CFArrayAppendValue(newComponents, name);
+	}
+
+	n = CFArrayGetCount(newComponents);
+	if (n > 1) {
+		CFStringRef	str;
+
+		str = CFArrayGetValueAtIndex(newComponents, n - 1);
+		suffix = CFStringGetIntValue(str);
+		if (suffix++ > 0) {
+			CFArrayRemoveValueAtIndex(newComponents, n - 1);
+		} else {
+			suffix = 2;
+		}
+	}
+
+	name = CFStringCreateWithFormat(NULL, NULL, CFSTR("%d"), suffix);
+	CFArrayAppendValue(newComponents, name);
+	CFRelease(name);
+
+	name = CFStringCreateByCombiningStrings(NULL, newComponents, CFSTR(" "));
+	CFRelease(newComponents);
+
+	return name;
+}
+
+
+static void
+mergeDict(const void *key, const void *value, void *context)
+{
+	CFMutableDictionaryRef	newDict	= (CFMutableDictionaryRef)context;
+
+	CFDictionarySetValue(newDict, key, value);
+	return;
+}
+
+
 static CFDictionaryRef
 _protocolTemplate(SCNetworkServiceRef service, CFStringRef protocolType)
 {
-	CFDictionaryRef			newEntity       = NULL;
+	SCNetworkInterfaceRef		interface;
 	SCNetworkServicePrivateRef      servicePrivate  = (SCNetworkServicePrivateRef)service;
+	CFDictionaryRef			template	= NULL;
 
-	if (servicePrivate->interface != NULL) {
+	interface = servicePrivate->interface;
+	if (interface != NULL) {
 		SCNetworkInterfaceRef   childInterface;
 		CFStringRef		childInterfaceType      = NULL;
 		CFStringRef		interfaceType;
 
+		// get the template
 		interfaceType = SCNetworkInterfaceGetInterfaceType(servicePrivate->interface);
 		childInterface = SCNetworkInterfaceGetInterface(servicePrivate->interface);
 		if (childInterface != NULL) {
 			childInterfaceType = SCNetworkInterfaceGetInterfaceType(childInterface);
 		}
 
-		newEntity = __copyProtocolTemplate(interfaceType, childInterfaceType, protocolType);
+		template = __copyProtocolTemplate(interfaceType, childInterfaceType, protocolType);
+		if (template != NULL) {
+			CFDictionaryRef		overrides;
+
+			// move to the interface at the lowest layer
+			while (childInterface != NULL) {
+				interface = childInterface;
+				childInterface = SCNetworkInterfaceGetInterface(interface);
+			}
+
+			overrides = __SCNetworkInterfaceGetTemplateOverrides(interface, protocolType);
+			if (overrides != NULL) {
+				CFMutableDictionaryRef	newTemplate;
+
+				newTemplate = CFDictionaryCreateMutableCopy(NULL, 0, template);
+				CFDictionaryApplyFunction(overrides, mergeDict, newTemplate);
+				CFRelease(template);
+				template = newTemplate;
+			}
+		}
 	}
 
-	if (newEntity == NULL) {
-		newEntity = CFDictionaryCreate(NULL,
-					       NULL,
-					       NULL,
-					       0,
-					       &kCFTypeDictionaryKeyCallBacks,
-					       &kCFTypeDictionaryValueCallBacks);
+	if (template == NULL) {
+		template = CFDictionaryCreate(NULL,
+					      NULL,
+					      NULL,
+					      0,
+					      &kCFTypeDictionaryKeyCallBacks,
+					      &kCFTypeDictionaryValueCallBacks);
 	}
 
-	return newEntity;
+	return template;
 }
 
 
@@ -580,16 +776,6 @@ __SCNetworkServiceSetInterfaceEntity(SCNetworkServiceRef     service,
 }
 
 
-static void
-mergeDict(const void *key, const void *value, void *context)
-{
-	CFMutableDictionaryRef	newDict	= (CFMutableDictionaryRef)context;
-
-	CFDictionarySetValue(newDict, key, value);
-	return;
-}
-
-
 SCNetworkServiceRef
 SCNetworkServiceCreate(SCPreferencesRef prefs, SCNetworkInterfaceRef interface)
 {
@@ -617,10 +803,18 @@ SCNetworkServiceCreate(SCPreferencesRef prefs, SCNetworkInterfaceRef interface)
 
 		interface_type = SCNetworkInterfaceGetInterfaceType(interface);
 		if (CFStringFind(interface_type, CFSTR("."), 0).location == kCFNotFound) {
+			_SCErrorSet(kSCStatusInvalidArgument);
 			return NULL;
 		}
 	}
 
+	// do not allow creation of a network service if the interface is a
+	// member of a bond or bridge
+	if (__SCNetworkInterfaceIsMember(prefs, interface)) {
+		_SCErrorSet(kSCStatusKeyExists);
+		return NULL;
+	}
+
 	// establish the service
 	prefix = SCPreferencesPathKeyCreateNetworkServices(NULL);
 	path = __SCPreferencesPathCreateUniqueChild_WithMoreSCFCompatibility(prefs, prefix);
@@ -666,34 +860,28 @@ SCNetworkServiceCreate(SCPreferencesRef prefs, SCNetworkInterfaceRef interface)
 			    CFEqual(interfaceType, kSCNetworkInterfaceTypeModem    ) ||
 			    CFEqual(interfaceType, kSCNetworkInterfaceTypeSerial   ) ||
 			    CFEqual(interfaceType, kSCNetworkInterfaceTypeWWAN     )) {
-				CFDictionaryRef	overrides;
+				CFDictionaryRef		overrides;
 
 				overrides = __SCNetworkInterfaceGetTemplateOverrides(interface, kSCNetworkInterfaceTypeModem);
 
 				// a ConnectionScript (and related keys) from the interface
 				// should trump the settings from the configuration template.
-				if ((overrides != NULL) &&
-				    CFDictionaryContainsKey(overrides, kSCPropNetModemConnectionScript)) {
-					CFMutableDictionaryRef	newConfig;
-
-					newConfig = CFDictionaryCreateMutableCopy(NULL, 0, config);
-					CFDictionaryRemoveValue(newConfig, kSCPropNetModemConnectionPersonality);
-					CFDictionaryRemoveValue(newConfig, kSCPropNetModemConnectionScript);
-					CFDictionaryRemoveValue(newConfig, kSCPropNetModemDeviceVendor);
-					CFDictionaryRemoveValue(newConfig, kSCPropNetModemDeviceModel);
-					CFRelease(config);
-					config = newConfig;
-				}
-
 				if (overrides != NULL) {
 					CFMutableDictionaryRef	newConfig;
 
 					newConfig = CFDictionaryCreateMutableCopy(NULL, 0, config);
+					if (CFDictionaryContainsKey(overrides, kSCPropNetModemConnectionScript)) {
+						CFDictionaryRemoveValue(newConfig, kSCPropNetModemConnectionPersonality);
+						CFDictionaryRemoveValue(newConfig, kSCPropNetModemConnectionScript);
+						CFDictionaryRemoveValue(newConfig, kSCPropNetModemDeviceVendor);
+						CFDictionaryRemoveValue(newConfig, kSCPropNetModemDeviceModel);
+					}
 					CFDictionaryApplyFunction(overrides, mergeDict, newConfig);
 					CFRelease(config);
 					config = newConfig;
 				}
-			} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPP)) {
+			} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPP) ||
+				   CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN)) {
 				CFDictionaryRef		overrides;
 
 				overrides = __SCNetworkInterfaceGetTemplateOverrides(interface, kSCNetworkInterfaceTypePPP);
@@ -896,9 +1084,16 @@ SCNetworkServiceGetName(SCNetworkServiceRef service)
 	interface = SCNetworkServiceGetInterface(service);
 	while (interface != NULL) {
 		SCNetworkInterfaceRef   childInterface;
+		CFStringRef		interfaceType;
+
+		interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
+		if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN)) {
+			break;
+		}
 
 		childInterface = SCNetworkInterfaceGetInterface(interface);
-		if ((childInterface == NULL) || CFEqual(childInterface, kSCNetworkInterfaceIPv4)) {
+		if ((childInterface == NULL) ||
+		    CFEqual(childInterface, kSCNetworkInterfaceIPv4)) {
 			break;
 		}
 
@@ -935,6 +1130,7 @@ SCNetworkServiceGetName(SCNetworkServiceRef service)
 						CFRetain(interface_name);
 					}
 					break;
+#if	!TARGET_OS_EMBEDDED && !TARGET_IPHONE_SIMULATOR
 				case 1 :
 					// compare the older "Built-in XXX" localized name
 					interface_name = __SCNetworkInterfaceCopyXLocalizedDisplayName(interface);
@@ -943,11 +1139,14 @@ SCNetworkServiceGetName(SCNetworkServiceRef service)
 					// compare the older "Built-in XXX" non-localized name
 					interface_name = __SCNetworkInterfaceCopyXNonLocalizedDisplayName(interface);
 					break;
+#endif	// !TARGET_OS_EMBEDDED && !TARGET_IPHONE_SIMULATOR
+				default :
+					continue;
 			}
 
 			if (interface_name != NULL) {
 				Boolean	match	= FALSE;
-				
+
 				if (CFEqual(name, interface_name)) {
 					// if service name matches the OLD localized
 					// interface name
@@ -1113,6 +1312,19 @@ SCNetworkServiceSetEnabled(SCNetworkServiceRef service, Boolean enabled)
 		return FALSE;
 	}
 
+	// make sure that we do not enable a network service if the
+	// associated interface is a member of a bond or bridge.
+	if (enabled) {
+		SCNetworkInterfaceRef	interface;
+
+		interface = SCNetworkServiceGetInterface(service);
+		if ((interface != NULL) &&
+		    __SCNetworkInterfaceIsMember(servicePrivate->prefs, interface)) {
+			_SCErrorSet(kSCStatusKeyExists);
+			return FALSE;
+		}
+	}
+
 	path = SCPreferencesPathKeyCreateNetworkServiceEntity(NULL,				// allocator
 							      servicePrivate->serviceID,	// service
 							      NULL);				// entity
@@ -1508,3 +1720,39 @@ SCNetworkServiceSetPrimaryRank(SCNetworkServiceRef		service,
 	if (path != NULL)	CFRelease(path);
 	return ok;
 }
+
+
+Boolean
+_SCNetworkServiceIsVPN(SCNetworkServiceRef service)
+{
+	SCNetworkInterfaceRef	interface;
+	CFStringRef		interfaceType;
+
+	interface = SCNetworkServiceGetInterface(service);
+	if (interface == NULL) {
+		return FALSE;
+	}
+
+	interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
+	if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPP)) {
+		interface = SCNetworkInterfaceGetInterface(interface);
+		if (interface == NULL) {
+			return FALSE;
+		}
+
+		interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
+		if (CFEqual(interfaceType, kSCNetworkInterfaceTypeL2TP)) {
+			return TRUE;
+		}
+		if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPTP)) {
+			return TRUE;
+		}
+	} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN)) {
+		return TRUE;
+	} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypeIPSec)) {
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
diff --git a/SystemConfiguration.fproj/SCNetworkSet.c b/SystemConfiguration.fproj/SCNetworkSet.c
index 7ff5750..dad99e7 100644
--- a/SystemConfiguration.fproj/SCNetworkSet.c
+++ b/SystemConfiguration.fproj/SCNetworkSet.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2007, 2009-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -169,48 +169,13 @@ __SCNetworkSetCreatePrivate(CFAllocatorRef      allocator,
 #pragma mark -
 
 
-static Boolean
-_serviceIsVPN(SCNetworkServiceRef service)
-{
-	SCNetworkInterfaceRef	interface;
-	CFStringRef		interfaceType;
-
-	interface = SCNetworkServiceGetInterface(service);
-	if (interface == NULL) {
-		return FALSE;
-	}
-
-	interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
-	if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPP)) {
-		interface = SCNetworkInterfaceGetInterface(interface);
-		if (interface == NULL) {
-			return FALSE;
-		}
-
-		interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
-		if (CFEqual(interfaceType, kSCNetworkInterfaceTypeL2TP)) {
-			return TRUE;
-		}
-		if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPTP)) {
-			return TRUE;
-		}
-		return FALSE;
-	}
-	if (CFEqual(interfaceType, kSCNetworkInterfaceTypeIPSec)) {
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-
 static int
 _serviceOrder(SCNetworkServiceRef service)
 {
 	SCNetworkInterfaceRef	interface;
 
 	interface = SCNetworkServiceGetInterface(service);
-	if ((interface == NULL) || _serviceIsVPN(service)) {
+	if ((interface == NULL) || _SCNetworkServiceIsVPN(service)) {
 		return 100000;	// if unknown or VPN interface, sort last
 	}
 
@@ -346,6 +311,15 @@ SCNetworkSetAddService(SCNetworkSetRef set, SCNetworkServiceRef service)
 		return FALSE;
 	}
 
+	// make sure that we do not add an orphaned network service if its
+	// associated interface is a member of a bond or bridge.
+	interface = SCNetworkServiceGetInterface(service);
+	if ((interface != NULL) &&
+	    __SCNetworkInterfaceIsMember(servicePrivate->prefs, interface)) {
+		_SCErrorSet(kSCStatusKeyExists);
+		return FALSE;
+	}
+
 #define PREVENT_DUPLICATE_SERVICE_NAMES
 #ifdef  PREVENT_DUPLICATE_SERVICE_NAMES
 	CFStringRef	name;
@@ -376,9 +350,9 @@ SCNetworkSetAddService(SCNetworkSetRef set, SCNetworkServiceRef service)
 					return FALSE;
 				}
 			}
-		}
 
-		CFRelease(services);
+			CFRelease(services);
+		}
 	}
 #endif	// PREVENT_DUPLICATE_SERVICE_NAMES
 
@@ -484,33 +458,6 @@ SCNetworkSetCopy(SCPreferencesRef prefs, CFStringRef setID)
 }
 
 
-static Boolean
-_SCNetworkServiceExistsForInterface(CFArrayRef services, SCNetworkInterfaceRef interface)
-{
-	CFIndex	i;
-	CFIndex	n;
-
-	n = isA_CFArray(services) ? CFArrayGetCount(services) : 0;
-	for (i = 0; i < n; i++) {
-		SCNetworkServiceRef	service;
-		SCNetworkInterfaceRef	service_interface;
-
-		service = CFArrayGetValueAtIndex(services, i);
-
-		service_interface = SCNetworkServiceGetInterface(service);
-		while (service_interface != NULL) {
-			if (CFEqual(interface, service_interface)) {
-				return TRUE;
-			}
-
-			service_interface = SCNetworkInterfaceGetInterface(service_interface);
-		}
-	}
-
-	return FALSE;
-}
-
-
 Boolean
 SCNetworkSetContainsInterface(SCNetworkSetRef set, SCNetworkInterfaceRef interface)
 {
@@ -519,7 +466,7 @@ SCNetworkSetContainsInterface(SCNetworkSetRef set, SCNetworkInterfaceRef interfa
 
 	services = SCNetworkSetCopyServices(set);
 	if (services != NULL) {
-		found = _SCNetworkServiceExistsForInterface(services, interface);
+		found = __SCNetworkServiceExistsForInterface(services, interface);
 		CFRelease(services);
 	}
 
@@ -709,6 +656,8 @@ SCNetworkSetRef
 SCNetworkSetCreate(SCPreferencesRef prefs)
 {
 	CFArrayRef		components;
+	CFDictionaryRef		entity;
+	Boolean			ok;
 	CFStringRef		path;
 	CFStringRef		prefix;
 	CFStringRef		setID;
@@ -723,8 +672,6 @@ SCNetworkSetCreate(SCPreferencesRef prefs)
 	}
 
 	components = CFStringCreateArrayBySeparatingStrings(NULL, path, CFSTR("/"));
-	CFRelease(path);
-
 	setID = CFArrayGetValueAtIndex(components, 2);
 	setPrivate = __SCNetworkSetCreatePrivate(NULL, prefs, setID);
 	CFRelease(components);
@@ -732,6 +679,19 @@ SCNetworkSetCreate(SCPreferencesRef prefs)
 	// mark set as "new" (not yet established)
 	setPrivate->established = FALSE;
 
+	// establish the set in the preferences
+	entity = CFDictionaryCreate(NULL,
+				    NULL, NULL, 0,
+				    &kCFTypeDictionaryKeyCallBacks,
+				    &kCFTypeDictionaryValueCallBacks);
+	ok = SCPreferencesPathSetValue(prefs, path, entity);
+	CFRelease(path);
+	CFRelease(entity);
+	if (!ok) {
+		CFRelease(setPrivate);
+		setPrivate = NULL;
+	}
+
 	return (SCNetworkSetRef)setPrivate;
 }
 
@@ -869,6 +829,8 @@ SCNetworkSetRemove(SCNetworkSetRef set)
 	path = SCPreferencesPathKeyCreateSet(NULL, setPrivate->setID);
 	if (!isA_CFString(currentPath) || !CFEqual(currentPath, path)) {
 		ok = SCPreferencesPathRemoveValue(setPrivate->prefs, path);
+	} else {
+		_SCErrorSet(kSCStatusInvalidArgument);
 	}
 	CFRelease(path);
 
@@ -1168,64 +1130,67 @@ add_supported_interfaces(CFMutableArrayRef interface_list, SCNetworkInterfaceRef
 	return;
 }
 
-
-static CFStringRef
-next_service_name(SCNetworkServiceRef service)
+static CFSetRef	/* of SCNetworkInterfaceRef's */
+copyExcludedInterfaces(SCPreferencesRef prefs)
 {
-	CFArrayRef		components;
-	CFIndex			n;
-	CFStringRef		name;
-	CFMutableArrayRef	newComponents;
-	SInt32			suffix	= 2;
+	CFMutableSetRef	excluded;
+	CFArrayRef	interfaces;
 
-	name = SCNetworkServiceGetName(service);
-	if (name == NULL) {
-		return NULL;
-	}
+	excluded = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
 
-	components = CFStringCreateArrayBySeparatingStrings(NULL, name, CFSTR(" "));
-	if (components != NULL) {
-		newComponents = CFArrayCreateMutableCopy(NULL, 0, components);
-		CFRelease(components);
-	} else {
-		newComponents = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-		CFArrayAppendValue(newComponents, name);
+	// exclude Bond [member] interfaces
+	interfaces = SCBondInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		__SCBondInterfaceListCollectMembers(interfaces, excluded);
+		CFRelease(interfaces);
 	}
 
-	n = CFArrayGetCount(newComponents);
-	if (n > 1) {
-		CFStringRef	str;
-
-		str = CFArrayGetValueAtIndex(newComponents, n - 1);
-		suffix = CFStringGetIntValue(str);
-		if (suffix++ > 0) {
-			CFArrayRemoveValueAtIndex(newComponents, n - 1);
-		} else {
-			suffix = 2;
-		}
+	// exclude Bridge [member] interfaces
+	interfaces = SCBridgeInterfaceCopyAll(prefs);
+	if (interfaces != NULL) {
+		__SCBridgeInterfaceListCollectMembers(interfaces, excluded);
+		CFRelease(interfaces);
 	}
 
-	name = CFStringCreateWithFormat(NULL, NULL, CFSTR("%d"), suffix);
-	CFArrayAppendValue(newComponents, name);
-	CFRelease(name);
-
-	name = CFStringCreateByCombiningStrings(NULL, newComponents, CFSTR(" "));
-	CFRelease(newComponents);
-
-	return name;
+	return excluded;
 }
 
 
 static Boolean
 __SCNetworkSetEstablishDefaultConfigurationForInterfaces(SCNetworkSetRef set, CFArrayRef interfaces)
 {
+	CFSetRef		excluded	= NULL;
 	CFIndex			i;
-	CFIndex			n;
+	CFIndex			n		= 0;
 	Boolean			ok		= TRUE;
 	CFArrayRef		services;
 	SCNetworkSetPrivateRef	setPrivate	= (SCNetworkSetPrivateRef)set;
 	Boolean			updated		= FALSE;
 
+#if	TARGET_OS_IPHONE
+	CFArrayRef		orphans		= NULL;
+	CFArrayRef		sets;
+
+	sets = SCNetworkSetCopyAll(setPrivate->prefs);
+	if (sets != NULL) {
+		if (CFArrayGetCount(sets) == 1) {
+			services = SCNetworkSetCopyServices(set);
+			if (services != NULL) {
+				n = CFArrayGetCount(services);
+				CFRelease(services);
+			}
+
+			if ((n == 0) && CFEqual(set, CFArrayGetValueAtIndex(sets, 0))) {
+				// after a "Reset Network Settings" we need to find (and
+				// add back) any VPN services that were orphaned.
+				orphans = SCNetworkServiceCopyAll(setPrivate->prefs);
+			}
+		}
+
+		CFRelease(sets);
+	}
+#endif	// TARGET_OS_IPHONE
+
 	// first, assume that we only want to add new services
 	// for those interfaces that are not represented in the
 	// current set.
@@ -1238,13 +1203,21 @@ __SCNetworkSetEstablishDefaultConfigurationForInterfaces(SCNetworkSetRef set, CF
 		services = SCNetworkServiceCopyAll(setPrivate->prefs);
 	}
 
+	excluded = copyExcludedInterfaces(setPrivate->prefs);
+
 	n = (interfaces != NULL) ? CFArrayGetCount(interfaces) : 0;
 	for (i = 0; i < n; i++) {
 		SCNetworkInterfaceRef	interface;
 		CFMutableArrayRef	interface_list;
 
 		interface = CFArrayGetValueAtIndex(interfaces, i);
-		if (_SCNetworkServiceExistsForInterface(services, interface)) {
+		if ((excluded != NULL)
+		    && CFSetContainsValue(excluded, interface)) {
+			// if this interface is a member of a Bond or Bridge
+			continue;
+		}
+
+		if (__SCNetworkServiceExistsForInterface(services, interface)) {
 			// if this is not a new interface
 			continue;
 		}
@@ -1303,7 +1276,7 @@ __SCNetworkSetEstablishDefaultConfigurationForInterfaces(SCNetworkSetRef set, CF
 					// we have two interfaces with the same service
 					// name, acquire a new, hopefully unique, name
 
-					newName = next_service_name(service);
+					newName = __SCNetworkServiceNextName(service);
 					if (newName == NULL) {
 						SCLog(TRUE, LOG_DEBUG,
 						      CFSTR("could not set unique name for \"%@\": %s\n"),
@@ -1344,6 +1317,30 @@ __SCNetworkSetEstablishDefaultConfigurationForInterfaces(SCNetworkSetRef set, CF
 		CFRelease(interface_list);
 	}
 	if (services != NULL)	CFRelease(services);
+	if (excluded != NULL)	CFRelease(excluded);
+
+#if	TARGET_OS_IPHONE
+	if (orphans != NULL) {
+		if (ok && updated) {
+			CFIndex	i;
+			CFIndex	n	= CFArrayGetCount(orphans);
+
+			for (i = 0; i < n; i++) {
+				SCNetworkServiceRef	service;
+
+				service = CFArrayGetValueAtIndex(orphans, i);
+				if (_SCNetworkServiceIsVPN(service)) {
+					ok = SCNetworkSetAddService(set, service);
+					if (!ok) {
+						break;
+					}
+				}
+			}
+		}
+
+		CFRelease(orphans);
+	}
+#endif	// TARGET_OS_IPHONE
 
 	if (ok && !updated) {
 		// if no changes were made
@@ -1357,17 +1354,20 @@ __SCNetworkSetEstablishDefaultConfigurationForInterfaces(SCNetworkSetRef set, CF
 Boolean
 SCNetworkSetEstablishDefaultConfiguration(SCNetworkSetRef set)
 {
-	CFArrayRef	interfaces;
-	Boolean		updated;
+	CFArrayRef		interfaces;
+	SCNetworkSetPrivateRef	setPrivate	= (SCNetworkSetPrivateRef)set;
+	Boolean			updated		= FALSE;
 
 	if (!isA_SCNetworkSet(set)) {
 		_SCErrorSet(kSCStatusInvalidArgument);
 		return FALSE;
 	}
 
-	interfaces = SCNetworkInterfaceCopyAll();
-	updated = __SCNetworkSetEstablishDefaultConfigurationForInterfaces(set, interfaces);
-	if (interfaces != NULL) CFRelease(interfaces);
+	interfaces = _SCNetworkInterfaceCopyAllWithPreferences(setPrivate->prefs);
+	if (interfaces != NULL) {
+		updated = __SCNetworkSetEstablishDefaultConfigurationForInterfaces(set, interfaces);
+		CFRelease(interfaces);
+	}
 
 	return updated;
 }
@@ -1376,8 +1376,8 @@ SCNetworkSetEstablishDefaultConfiguration(SCNetworkSetRef set)
 Boolean
 SCNetworkSetEstablishDefaultInterfaceConfiguration(SCNetworkSetRef set, SCNetworkInterfaceRef interface)
 {
-	CFMutableArrayRef	interfaces;
-	Boolean			updated;
+	CFArrayRef	interfaces;
+	Boolean		updated;
 
 	if (!isA_SCNetworkSet(set)) {
 		_SCErrorSet(kSCStatusInvalidArgument);
@@ -1389,10 +1389,156 @@ SCNetworkSetEstablishDefaultInterfaceConfiguration(SCNetworkSetRef set, SCNetwor
 		return FALSE;
 	}
 
-	interfaces = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-	CFArrayAppendValue(interfaces, interface);
+	interfaces = CFArrayCreate(NULL, (const void **)&interface, 1, &kCFTypeArrayCallBacks);
 	updated = __SCNetworkSetEstablishDefaultConfigurationForInterfaces(set, interfaces);
 	CFRelease(interfaces);
 
 	return updated;
 }
+
+
+SCNetworkServiceRef
+SCNetworkSetCopySelectedVPNService(SCNetworkSetRef set)
+{
+	CFIndex			i;
+	CFIndex			n;
+	SCNetworkServiceRef	selected	= NULL;
+	CFArrayRef		services;
+	CFMutableArrayRef	services_vpn	= NULL;
+
+	if (!isA_SCNetworkSet(set)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
+
+	services = SCNetworkSetCopyServices(set);
+	if (services != NULL) {
+		n = CFArrayGetCount(services);
+		for (i = 0; i < n; i++) {
+			SCNetworkServiceRef	service;
+
+			service = CFArrayGetValueAtIndex(services, i);
+			if (!SCNetworkServiceGetEnabled(service)) {
+				// if not enabled
+				continue;
+			}
+
+			if (!_SCNetworkServiceIsVPN(service)) {
+				// if not VPN service
+				continue;
+			}
+
+			if (services_vpn == NULL) {
+				services_vpn = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+			}
+			CFArrayAppendValue(services_vpn, service);
+		}
+
+		CFRelease(services);
+	}
+
+	if (services_vpn == NULL) {
+		// if no VPN services
+		return NULL;
+	}
+
+	n = CFArrayGetCount(services_vpn);
+	if (n > 1) {
+		CFArrayRef		order;
+		CFMutableArrayRef	sorted;
+
+		order = SCNetworkSetGetServiceOrder(set);
+		sorted = CFArrayCreateMutableCopy(NULL, 0, services_vpn);
+		CFArraySortValues(sorted,
+				  CFRangeMake(0, CFArrayGetCount(sorted)),
+				  _SCNetworkServiceCompare,
+				  (void *)order);
+		CFRelease(services_vpn);
+		services_vpn = sorted;
+	}
+
+#if	TARGET_OS_IPHONE
+	if (n > 1) {
+		CFStringRef	serviceID_prefs;
+
+#define VPN_PREFERENCES	CFSTR("com.apple.mobilevpn")
+#define VPN_SERVICE_ID	CFSTR("activeVPNID")
+
+		CFPreferencesAppSynchronize(VPN_PREFERENCES);
+		serviceID_prefs = CFPreferencesCopyAppValue(VPN_SERVICE_ID, VPN_PREFERENCES);
+		if (serviceID_prefs != NULL) {
+			for (i = 0; i < n; i++) {
+				SCNetworkServiceRef	service;
+				CFStringRef		serviceID;
+
+				service = CFArrayGetValueAtIndex(services_vpn, i);
+				serviceID = SCNetworkServiceGetServiceID(service);
+				if (CFEqual(serviceID, serviceID_prefs)) {
+					selected = service;
+					CFRetain(selected);
+					break;
+				}
+
+			}
+
+			CFRelease(serviceID_prefs);
+		}
+	}
+#endif	// TARGET_OS_IPHONE
+
+	if (selected == NULL) {
+		selected = CFArrayGetValueAtIndex(services_vpn, 0);
+		CFRetain(selected);
+	}
+
+	CFRelease(services_vpn);
+	return selected;
+}
+
+
+Boolean
+SCNetworkSetSetSelectedVPNService(SCNetworkSetRef set, SCNetworkServiceRef service)
+{
+	Boolean		ok	= TRUE;
+	CFArrayRef	services;
+
+	if (!isA_SCNetworkSet(set)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	if (!isA_SCNetworkService(service) || !_SCNetworkServiceIsVPN(service)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return FALSE;
+	}
+
+	services = SCNetworkSetCopyServices(set);
+	if (services != NULL) {
+		CFIndex	i;
+		CFIndex	n	= CFArrayGetCount(services);
+
+		if (!CFArrayContainsValue(services, CFRangeMake(0, n), service)) {
+			// if selected service not a member of the current set
+			_SCErrorSet(kSCStatusInvalidArgument);
+			ok = FALSE;
+			goto done;
+		}
+
+		for (i = 0; ok && (i < n); i++) {
+			SCNetworkServiceRef	vpn;
+
+			vpn = CFArrayGetValueAtIndex(services, i);
+			if (!_SCNetworkServiceIsVPN(vpn)) {
+				// if not VPN service
+				continue;
+			}
+
+			ok = SCNetworkServiceSetEnabled(vpn, CFEqual(service, vpn));
+		}
+	}
+
+    done :
+
+	if (services != NULL) CFRelease(services);
+	return ok;
+}
diff --git a/SystemConfiguration.fproj/SCNetworkSignature.c b/SystemConfiguration.fproj/SCNetworkSignature.c
index 274bc15..d0296ae 100644
--- a/SystemConfiguration.fproj/SCNetworkSignature.c
+++ b/SystemConfiguration.fproj/SCNetworkSignature.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2006, 2011 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -45,6 +45,7 @@
 #include <SystemConfiguration/SCPrivate.h>
 #include "SCNetworkSignature.h"
 #include "SCNetworkSignaturePrivate.h"
+#include <arpa/inet.h>
 
 const char * kSCNetworkSignatureActiveChangedNotifyName = NETWORK_ID_KEY ".active";
 
@@ -168,4 +169,153 @@ SCNetworkSignatureCopyActiveIdentifiers(CFAllocatorRef alloc)
 	return (active);
 }
 
+static CFDictionaryRef
+copy_services_for_address_family(CFAllocatorRef alloc,
+				 SCDynamicStoreRef store, int af)
+{
+	CFDictionaryRef	info;
+	CFArrayRef	patterns;
+	CFStringRef	pattern;
+	CFStringRef	prop;
+	Boolean		release_store = FALSE;
+
+	if (store == NULL) {
+		store = store_create(alloc);
+		if (store == NULL) {
+			return (NULL);
+		}
+		release_store = TRUE;
+	}
+	prop = (af == AF_INET) ? kSCEntNetIPv4 : kSCEntNetIPv6;
+	pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+							      kSCDynamicStoreDomainState,
+							      kSCCompAnyRegex,
+							      prop);
+	patterns = CFArrayCreate(NULL,
+				 (const void * *)&pattern, 1,
+				 &kCFTypeArrayCallBacks);
+	CFRelease(pattern);
+	info = SCDynamicStoreCopyMultiple(store, NULL, patterns);
+	CFRelease(patterns);
+	if (release_store) {
+		CFRelease(store);
+	}
+	return (info);
+}
+
+static CFStringRef
+my_IPAddressToCFString(int af, const void * src_p)
+{
+	char		ntopbuf[INET6_ADDRSTRLEN];
+
+	if (inet_ntop(af, src_p, ntopbuf, sizeof(ntopbuf)) != NULL) {
+		return (CFStringCreateWithCString(NULL, ntopbuf,
+						  kCFStringEncodingASCII));
+	}
+	return (NULL);
+}
+
+CFStringRef
+SCNetworkSignatureCopyIdentifierForConnectedSocket(CFAllocatorRef alloc,
+						   int sock_fd)
+{
+	CFStringRef		addresses_key;
+	int			af;
+	int			count;
+	int			i;
+	const void * *		keys = NULL;
+#define KEYS_STATIC_COUNT	10
+	const void *		keys_static[KEYS_STATIC_COUNT];
+	static const void *	local_ip_p;
+	CFStringRef		local_ip_str = NULL;
+	CFStringRef		ret_signature = NULL;
+	CFDictionaryRef		service_info = NULL;
+	union {
+		struct sockaddr_in	inet;
+		struct sockaddr_in6	inet6;
+		struct sockaddr		sa;
+	} 			ss;
+	socklen_t		ss_len = sizeof(ss);
+	int			status = kSCStatusFailed;
+
+	if (getsockname(sock_fd, &ss.sa, &ss_len) != 0) {
+		status = kSCStatusInvalidArgument;
+		goto done;
+	}
+	af = ss.inet.sin_family;
+	switch (af) {
+	case AF_INET:
+		addresses_key = kSCPropNetIPv4Addresses;
+		local_ip_p = &ss.inet.sin_addr;
+		break;
+	case AF_INET6:
+		addresses_key = kSCPropNetIPv6Addresses;
+		local_ip_p = &ss.inet6.sin6_addr;
+		break;
+	default:
+		status = kSCStatusInvalidArgument;
+		goto done;
+	}
+
+	/* find a service matching the local IP and get its network signature */
+	service_info = copy_services_for_address_family(alloc, NULL, af);
+	if (service_info == NULL) {
+		goto done;
+	}
+	local_ip_str = my_IPAddressToCFString(af, local_ip_p);
+	if (local_ip_str == NULL) {
+		goto done;
+	}
+	count = CFDictionaryGetCount(service_info);
+	if (count > KEYS_STATIC_COUNT) {
+		keys = (const void * *)malloc(sizeof(*keys) * count);
+	}
+	else {
+		keys = keys_static;
+	}
+	CFDictionaryGetKeysAndValues(service_info, keys, NULL);
+	for (i = 0; i < count; i++) {
+		CFArrayRef		addrs;
+		CFRange			range;
+		CFStringRef		signature;
+		CFDictionaryRef		value;
+
+		value = CFDictionaryGetValue(service_info, keys[i]);
+		if (isA_CFDictionary(value) == NULL) {
+			continue;
+		}
+		signature = CFDictionaryGetValue(value,
+						 kStoreKeyNetworkSignature);
+		if (isA_CFString(signature) == NULL) {
+			/* no signature */
+			continue;
+		}
+		addrs = CFDictionaryGetValue(value, addresses_key);
+		if (isA_CFArray(addrs) == NULL) {
+			continue;
+		}
+		range = CFRangeMake(0, CFArrayGetCount(addrs));
+		if (CFArrayContainsValue(addrs, range, local_ip_str)) {
+			ret_signature = CFRetain(signature);
+			status = kSCStatusOK;
+			break;
+		}
+	}
+
+ done:
+	if (local_ip_str != NULL) {
+		CFRelease(local_ip_str);
+	}
+	if (keys != NULL && keys != keys_static) {
+		free(keys);
+	}
+	if (service_info != NULL) {
+		CFRelease(service_info);
+	}
+	if (status != kSCStatusOK) {
+		_SCErrorSet(status);
+	}
+	return (ret_signature);
+}
+
 #pragma mark -
diff --git a/SystemConfiguration.fproj/SCNetworkSignature.h b/SystemConfiguration.fproj/SCNetworkSignature.h
index c065caa..41bd0d7 100644
--- a/SystemConfiguration.fproj/SCNetworkSignature.h
+++ b/SystemConfiguration.fproj/SCNetworkSignature.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2006, 2008, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -81,4 +81,21 @@ CFStringRef
 SCNetworkSignatureCopyActiveIdentifierForAddress(CFAllocatorRef alloc,
 						 const struct sockaddr * addr)	__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/);
 
+/*!
+	@function SCNetworkSignatureCopyIdentifierForConnectedSocket
+	@discussion Find the identifier for the given file descriptor
+		corresponding to a connected socket.
+	@param allocator The CFAllocator that should be used to allocate
+		memory for the local dynamic store object.
+		This parameter may be NULL in which case the current
+		default CFAllocator is used. If this reference is not
+		a valid CFAllocator, the behavior is undefined.
+	@param sock_fd The socket file descriptor, must be either AF_INET
+		or AF_INET6.
+	@result The unique (string) identifier associated with the address,
+		NULL if no network is known.
+ */
+CFStringRef
+SCNetworkSignatureCopyIdentifierForConnectedSocket(CFAllocatorRef alloc,
+						   int sock_fd) __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
 #endif	/* _SCNETWORKSIGNATURE_H */
diff --git a/SystemConfiguration.fproj/SCNetworkSignaturePrivate.h b/SystemConfiguration.fproj/SCNetworkSignaturePrivate.h
index 71fc457..55219f0 100644
--- a/SystemConfiguration.fproj/SCNetworkSignaturePrivate.h
+++ b/SystemConfiguration.fproj/SCNetworkSignaturePrivate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2006, 2011 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -32,4 +32,6 @@
 #define kStoreKeyActiveIdentifiers  	CFSTR("ActiveIdentifiers")
 #define kStoreKeyPrimaryIPv4Identifier 	CFSTR("PrimaryIPv4Identifier")
 
+#define kStoreKeyNetworkSignature	CFSTR("NetworkSignature")
+
 #endif	/* _SCNETWORKSIGNATUREPRIVATE_H */
diff --git a/SystemConfiguration.fproj/SCP.c b/SystemConfiguration.fproj/SCP.c
index 1acfe1d..fc79654 100644
--- a/SystemConfiguration.fproj/SCP.c
+++ b/SystemConfiguration.fproj/SCP.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2007-2009 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -137,6 +137,9 @@ _SCPNotificationKey(CFAllocatorRef	allocator,
 	CFStringRef	storeKey;
 
 	switch (keyType) {
+		case kSCPreferencesKeyLock :
+			keyStr = CFSTR("lock");
+			break;
 		case kSCPreferencesKeyCommit :
 			keyStr = CFSTR("commit");
 			break;
diff --git a/SystemConfiguration.fproj/SCPApply.c b/SystemConfiguration.fproj/SCPApply.c
index 720ab46..f913dc9 100644
--- a/SystemConfiguration.fproj/SCPApply.c
+++ b/SystemConfiguration.fproj/SCPApply.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004-2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004-2006, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -44,14 +44,14 @@ __SCPreferencesApplyChanges_helper(SCPreferencesRef prefs)
 	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
 	uint32_t		status		= kSCStatusOK;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		// if no helper
 		goto fail;
 	}
 
 	// have the helper "apply" the prefs
 //	status = kSCStatusOK;
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_PREFS_APPLY,
 			   NULL,
 			   &status,
@@ -69,9 +69,8 @@ __SCPreferencesApplyChanges_helper(SCPreferencesRef prefs)
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -127,6 +126,12 @@ SCPreferencesApplyChanges(SCPreferencesRef prefs)
 
     done :
 
-	if (!wasLocked)	(void) SCPreferencesUnlock(prefs);
+	if (!wasLocked) {
+		uint32_t	status;
+
+		status = SCError();	// preserve status across unlock
+		(void) SCPreferencesUnlock(prefs);
+		_SCErrorSet(status);
+	}
 	return ok;
 }
diff --git a/SystemConfiguration.fproj/SCPCommit.c b/SystemConfiguration.fproj/SCPCommit.c
index c380dc0..6f193c1 100644
--- a/SystemConfiguration.fproj/SCPCommit.c
+++ b/SystemConfiguration.fproj/SCPCommit.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2008, 2010, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,6 +31,7 @@
  * - initial revision
  */
 
+#include <TargetConditionals.h>
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCPrivate.h>
 #include "SCPreferencesInternal.h"
@@ -49,22 +50,24 @@ __SCPreferencesCommitChanges_helper(SCPreferencesRef prefs)
 	uint32_t		status		= kSCStatusOK;
 	CFDataRef		reply		= NULL;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		// if no helper
+		status = kSCStatusAccessError;
 		goto fail;
 	}
 
 	if (prefsPrivate->changed) {
 		ok = _SCSerialize(prefsPrivate->prefs, &data, NULL, NULL);
 		if (!ok) {
-			goto fail;
+			status = kSCStatusFailed;
+			goto error;
 		}
 	}
 
 	// have the helper "commit" the prefs
 //	status = kSCStatusOK;
 //	reply  = NULL;
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_PREFS_COMMIT,
 			   data,
 			   &status,
@@ -81,6 +84,8 @@ __SCPreferencesCommitChanges_helper(SCPreferencesRef prefs)
 	if (prefsPrivate->changed) {
 		if (prefsPrivate->signature != NULL) CFRelease(prefsPrivate->signature);
 		prefsPrivate->signature = reply;
+	} else {
+		if (reply != NULL) CFRelease(reply);
 	}
 
 	prefsPrivate->changed = FALSE;
@@ -89,13 +94,10 @@ __SCPreferencesCommitChanges_helper(SCPreferencesRef prefs)
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
-	status = kSCStatusAccessError;
-
     error :
 
 	// return error
@@ -130,7 +132,10 @@ Boolean
 SCPreferencesCommitChanges(SCPreferencesRef prefs)
 {
 	Boolean			ok		= FALSE;
+	char *			path;
 	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
+	Boolean			save		= TRUE;
+	struct stat		statBuf;
 	Boolean			wasLocked;
 
 	if (prefs == NULL) {
@@ -162,12 +167,33 @@ SCPreferencesCommitChanges(SCPreferencesRef prefs)
 	/*
 	 * if necessary, apply changes
 	 */
-	if (prefsPrivate->changed) {
+	if (!prefsPrivate->changed) {
+		goto committed;
+	}
+
+	/*
+	 * check if the preferences should be removed
+	 */
+	if (CFDictionaryGetCount(prefsPrivate->prefs) == 0) {
+		CFBooleanRef	val;
+
+		/* if empty */
+		if ((prefsPrivate->options != NULL) &&
+		    CFDictionaryGetValueIfPresent(prefsPrivate->options,
+						  kSCPreferencesOptionRemoveWhenEmpty,
+						  (const void **)&val) &&
+		    isA_CFBoolean(val) &&
+		    CFBooleanGetValue(val)) {
+			/* if we've been asked to remove empty .plists */
+			save = FALSE;
+		}
+	}
+
+	path = prefsPrivate->newPath ? prefsPrivate->newPath : prefsPrivate->path;
+	if (save) {
 		int		fd;
 		CFDataRef	newPrefs;
-		char *		path;
 		int		pathLen;
-		struct stat	statBuf;
 		char *		thePath;
 
 		if (stat(prefsPrivate->path, &statBuf) == -1) {
@@ -183,7 +209,6 @@ SCPreferencesCommitChanges(SCPreferencesRef prefs)
 		}
 
 		/* create the (new) preferences file */
-		path = prefsPrivate->newPath ? prefsPrivate->newPath : prefsPrivate->path;
 		pathLen = strlen(path) + sizeof("-new");
 		thePath = CFAllocatorAllocate(NULL, pathLen, 0);
 		snprintf(thePath, pathLen, "%s-new", path);
@@ -201,10 +226,18 @@ SCPreferencesCommitChanges(SCPreferencesRef prefs)
 		(void) fchmod(fd, statBuf.st_mode);
 
 		/* write the new preferences */
-		newPrefs = CFPropertyListCreateXMLData(NULL, prefsPrivate->prefs);
+		newPrefs = CFPropertyListCreateData(NULL,
+						    prefsPrivate->prefs,
+#if	TARGET_OS_IPHONE
+						    kCFPropertyListBinaryFormat_v1_0,
+#else	// TARGET_OS_IPHONE
+						    kCFPropertyListXMLFormat_v1_0,
+#endif	// TARGET_OS_IPHONE
+						    0,
+						    NULL);
 		if (!newPrefs) {
 			_SCErrorSet(kSCStatusFailed);
-			SCLog(_sc_verbose, LOG_ERR, CFSTR("SCPreferencesCommitChanges CFPropertyListCreateXMLData() failed"));
+			SCLog(_sc_verbose, LOG_ERR, CFSTR("SCPreferencesCommitChanges CFPropertyListCreateData() failed"));
 			SCLog(_sc_verbose, LOG_ERR, CFSTR("  prefs = %s"), path);
 			CFAllocatorDeallocate(NULL, thePath);
 			(void) close(fd);
@@ -273,17 +306,27 @@ SCPreferencesCommitChanges(SCPreferencesRef prefs)
 			prefsPrivate->newPath = NULL;
 		}
 
-		/* update signature */
+		/* grab the new signature */
 		if (stat(path, &statBuf) == -1) {
 			_SCErrorSet(errno);
 			SCLog(_sc_verbose, LOG_ERR, CFSTR("SCPreferencesCommitChanges stat() failed: %s"), strerror(errno));
 			SCLog(_sc_verbose, LOG_ERR, CFSTR("  path = %s"), thePath);
 			goto done;
 		}
-		if (prefsPrivate->signature != NULL) CFRelease(prefsPrivate->signature);
-		prefsPrivate->signature = __SCPSignatureFromStatbuf(&statBuf);
+	} else {
+		/* remove the empty .plist */
+		unlink(path);
+
+		/* init the new signature */
+		bzero(&statBuf, sizeof(statBuf));
 	}
 
+	/* update signature */
+	if (prefsPrivate->signature != NULL) CFRelease(prefsPrivate->signature);
+	prefsPrivate->signature = __SCPSignatureFromStatbuf(&statBuf);
+
+    committed :
+
 	/* post notification */
 	if (prefsPrivate->session == NULL) {
 		ok = TRUE;
@@ -300,6 +343,12 @@ SCPreferencesCommitChanges(SCPreferencesRef prefs)
 
     done :
 
-	if (!wasLocked)	(void) SCPreferencesUnlock(prefs);
+	if (!wasLocked) {
+		uint32_t	status;
+
+		status = SCError();	// preserve status across unlock
+		(void) SCPreferencesUnlock(prefs);
+		_SCErrorSet(status);
+	}
 	return ok;
 }
diff --git a/SystemConfiguration.fproj/SCPLock.c b/SystemConfiguration.fproj/SCPLock.c
index 3bffe8b..fe2eca0 100644
--- a/SystemConfiguration.fproj/SCPLock.c
+++ b/SystemConfiguration.fproj/SCPLock.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,6 +31,7 @@
  * - initial revision
  */
 
+#include <TargetConditionals.h>
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCPrivate.h>
 #include "SCPreferencesInternal.h"
@@ -41,20 +42,13 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <pthread.h>
+#include <sys/attr.h>
 #include <sys/errno.h>
+#include <sys/mount.h>
+#include <sys/param.h>
 
 
 
-#if	TARGET_OS_IPHONE
-__private_extern__ int
-getgrnam_r(const char *name, __unused struct group *grp, __unused char *buf, __unused size_t bufsize, struct group **grpP)
-{
-	*grpP = getgrnam(name);
-	return (*grpP == NULL) ? -1 : 0;
-}
-#endif	/* TARGET_OS_IPHONE */
-
-
 static Boolean
 __SCPreferencesLock_helper(SCPreferencesRef prefs, Boolean wait)
 {
@@ -63,7 +57,7 @@ __SCPreferencesLock_helper(SCPreferencesRef prefs, Boolean wait)
 	uint32_t		status		= kSCStatusOK;
 	CFDataRef		reply		= NULL;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		ok = __SCPreferencesCreate_helper(prefs);
 		if (!ok) {
 			return FALSE;
@@ -73,7 +67,7 @@ __SCPreferencesLock_helper(SCPreferencesRef prefs, Boolean wait)
 	// have the helper "lock" the prefs
 	status = kSCStatusOK;
 	reply  = NULL;
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   wait ? SCHELPER_MSG_PREFS_LOCKWAIT : SCHELPER_MSG_PREFS_LOCK,
 			   prefsPrivate->signature,
 			   &status,
@@ -92,9 +86,8 @@ __SCPreferencesLock_helper(SCPreferencesRef prefs, Boolean wait)
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -130,15 +123,9 @@ createParentDirectory(const char *path)
 
 	// create parent directories
 	for (scan = dir; TRUE; scan = slash) {
-		mode_t	mode;
+		mode_t	mode	= S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;	// 755
 		char	sep	= '\0';
 
-		if ((slash == NULL) || (scan == dir)) {
-			mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;	// 755
-		} else {
-			mode = S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH;		// 775
-		}
-
 		if (slash != NULL) {
 			sep = *slash;
 			*slash = '\0';
@@ -146,26 +133,26 @@ createParentDirectory(const char *path)
 
 		ret = mkdir(dir, mode);
 		if (ret == 0) {
-			static	gid_t	admin	= -1;
+			static	gid_t	group	= -1;
 
 			// set group
-			if (admin == -1) {
+			if (group == -1) {
 				char		buf[256];
 				struct group	grp;
 				struct group	*grpP	= NULL;
 
-				if ((getgrnam_r("admin", &grp, buf, sizeof(buf), &grpP) == 0) &&
+				if ((getgrnam_r("wheel", &grp, buf, sizeof(buf), &grpP) == 0) &&
 				    (grpP != NULL)) {
-					admin = grpP->gr_gid;
+					group = grpP->gr_gid;
 				} else {
 					SCLog(TRUE, LOG_ERR,
 					      CFSTR("SCPreferencesLock getgrnam_r() failed: %s"),
 					      strerror(errno));
-					admin = 80;
+					group = 0;	// wheel
 				}
 			}
 
-			if (chown(dir, -1, admin) == -1) {
+			if (chown(dir, -1, group) == -1) {
 				SCLog(TRUE, LOG_ERR,
 				      CFSTR("SCPreferencesLock chown() failed: %s"),
 				      strerror(errno));
@@ -236,6 +223,135 @@ reportDelay(SCPreferencesRef prefs, struct timeval *delay, Boolean isStale)
 }
 
 
+static Boolean
+has_O_EXLOCK(SCPreferencesPrivateRef prefsPrivate)
+{
+#pragma pack(push, 4)
+	struct {
+		u_int32_t		size;
+		vol_capabilities_attr_t	capabilities;
+	} attrbuf;
+#pragma pack(pop)
+	struct attrlist			attrs;
+	int				fd;
+	int				ret;
+	struct statfs			statbuf;
+
+	fd = open(prefsPrivate->lockPath, O_WRONLY|O_CREAT, 0644);
+	if (fd == -1) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SCPreferencesLock open() failed: %s"),
+		      strerror(errno));
+		return FALSE;
+	}
+
+	ret = fstatfs(fd, &statbuf);
+	unlink(prefsPrivate->lockPath);
+	close(fd);
+	if (ret == -1) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SCPreferencesLock fstatfs() failed: %s"),
+		      strerror(errno));
+		return FALSE;
+	}
+
+	bzero(&attrs, sizeof(attrs));
+	attrs.bitmapcount = ATTR_BIT_MAP_COUNT;
+	attrs.volattr     = ATTR_VOL_INFO | ATTR_VOL_CAPABILITIES;
+	bzero(&attrbuf, sizeof(attrbuf));
+	ret = getattrlist(statbuf.f_mntonname,	// path (of mount point)
+			  &attrs,		// attribute list
+			  &attrbuf,		// attribute buffer
+			  sizeof(attrbuf),
+			  0);			// options
+	if (ret == -1) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SCPreferencesLock getattrlist() failed: %s"),
+		      strerror(errno));
+		return FALSE;
+	}
+
+	if ((attrbuf.capabilities.capabilities[VOL_CAPABILITIES_INTERFACES] & VOL_CAP_INT_FLOCK) &&
+	    (attrbuf.capabilities.valid       [VOL_CAPABILITIES_INTERFACES] & VOL_CAP_INT_FLOCK)) {
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+
+static Boolean
+lockWithSCDynamicStore(SCPreferencesPrivateRef	prefsPrivate, Boolean wait)
+{
+	CFArrayRef	changes;
+	Boolean		locked		= FALSE;
+	Boolean		ok;
+	int		sc_status	= kSCStatusOK;
+
+	// add [lock] notification
+	ok = SCDynamicStoreAddWatchedKey(prefsPrivate->session,
+					 prefsPrivate->sessionKeyLock,
+					 FALSE);
+	if (!ok) {
+		sc_status = SCError();
+		SCLog(_sc_verbose, LOG_ERR, CFSTR("SCPreferencesLock SCDynamicStoreAddWatchedKey() failed"));
+	}
+
+	while (ok) {
+		CFDateRef	value;
+
+		// Attempt to acquire the lock
+		value = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent());
+		ok = SCDynamicStoreAddTemporaryValue(prefsPrivate->session,
+						     prefsPrivate->sessionKeyLock,
+						     value);
+		CFRelease(value);
+		if (ok) {
+			locked = TRUE;
+			break;
+		}
+
+		if (!wait) {
+			sc_status = kSCStatusPrefsBusy;
+			break;
+		}
+
+		// wait for the lock to be released
+		ok = SCDynamicStoreNotifyWait(prefsPrivate->session);
+		if (!ok) {
+			sc_status = SCError();
+			SCLog(_sc_verbose, LOG_ERR, CFSTR("SCPreferencesLock SCDynamicStoreNotifyWait() failed"));
+			break;
+		}
+
+		// clear out any notifications
+		changes = SCDynamicStoreCopyNotifiedKeys(prefsPrivate->session);
+		if (changes != NULL) {
+			CFRelease(changes);
+		} else {
+			SCLog(_sc_verbose, LOG_ERR, CFSTR("SCPreferencesLock SCDynamicStoreCopyNotifiedKeys() failed"));
+			break;
+		}
+	}
+
+	// remove [lock] notification
+	(void) SCDynamicStoreRemoveWatchedKey(prefsPrivate->session,
+					      prefsPrivate->sessionKeyLock,
+					      0);
+
+	// clear out any notifications
+	changes = SCDynamicStoreCopyNotifiedKeys(prefsPrivate->session);
+	if (changes != NULL) {
+		CFRelease(changes);
+	}
+
+	if (sc_status != kSCStatusOK) {
+		_SCErrorSet(sc_status);
+	}
+	return locked;
+}
+
+
 Boolean
 SCPreferencesLock(SCPreferencesRef prefs, Boolean wait)
 {
@@ -289,6 +405,14 @@ SCPreferencesLock(SCPreferencesRef prefs, Boolean wait)
 
     retry :
 
+	if (prefsPrivate->sessionKeyLock != NULL) {
+		if (lockWithSCDynamicStore(prefsPrivate, wait)) {
+			goto locked;
+		}
+
+		goto error;
+	}
+
 	prefsPrivate->lockFD = open(prefsPrivate->lockPath,
 				    wait ? O_WRONLY|O_CREAT|O_EXLOCK
 					 : O_WRONLY|O_CREAT|O_EXLOCK|O_NONBLOCK,
@@ -319,6 +443,16 @@ SCPreferencesLock(SCPreferencesRef prefs, Boolean wait)
 				// if already locked (and we are not blocking)
 				sc_status = kSCStatusPrefsBusy;
 				goto error;
+			case ENOTSUP :
+				if (!has_O_EXLOCK(prefsPrivate)) {
+					// O_EXLOCK *not* available, use SCDynamicStore
+					prefsPrivate->sessionKeyLock = _SCPNotificationKey(NULL,
+											   prefsPrivate->prefsID,
+											   kSCPreferencesKeyLock);
+					goto retry;
+				}
+				errno = ENOTSUP;
+				break;
 			default :
 				break;
 		}
diff --git a/SystemConfiguration.fproj/SCPOpen.c b/SystemConfiguration.fproj/SCPOpen.c
index 9dfde1d..b6fa454 100644
--- a/SystemConfiguration.fproj/SCPOpen.c
+++ b/SystemConfiguration.fproj/SCPOpen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright(c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -37,9 +37,7 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCValidation.h>
 #include <SystemConfiguration/SCPrivate.h>
@@ -49,6 +47,7 @@
 #include "dy_framework.h"
 
 #include <fcntl.h>
+#include <libproc.h>
 #include <pthread.h>
 #include <unistd.h>
 #include <sys/errno.h>
@@ -82,8 +81,8 @@ __SCPreferencesCopyDescription(CFTypeRef cf) {
 	if (prefsPrivate->locked) {
 		CFStringAppendFormat(result, NULL, CFSTR(", locked"));
 	}
-	if (prefsPrivate->helper != -1) {
-		CFStringAppendFormat(result, NULL, CFSTR(", helper fd=%d"), prefsPrivate->helper);
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		CFStringAppendFormat(result, NULL, CFSTR(", helper port = %p"), prefsPrivate->helper_port);
 	}
 	CFStringAppendFormat(result, NULL, CFSTR("}"));
 
@@ -102,6 +101,7 @@ __SCPreferencesDeallocate(CFTypeRef cf)
 
 	if (prefsPrivate->name)			CFRelease(prefsPrivate->name);
 	if (prefsPrivate->prefsID)		CFRelease(prefsPrivate->prefsID);
+	if (prefsPrivate->options)		CFRelease(prefsPrivate->options);
 	if (prefsPrivate->path)			CFAllocatorDeallocate(NULL, prefsPrivate->path);
 	if (prefsPrivate->newPath)		CFAllocatorDeallocate(NULL, prefsPrivate->newPath);
 	if (prefsPrivate->lockFD != -1)	{
@@ -113,6 +113,7 @@ __SCPreferencesDeallocate(CFTypeRef cf)
 	if (prefsPrivate->lockPath)		CFAllocatorDeallocate(NULL, prefsPrivate->lockPath);
 	if (prefsPrivate->signature)		CFRelease(prefsPrivate->signature);
 	if (prefsPrivate->session)		CFRelease(prefsPrivate->session);
+	if (prefsPrivate->sessionKeyLock)	CFRelease(prefsPrivate->sessionKeyLock);
 	if (prefsPrivate->sessionKeyCommit)	CFRelease(prefsPrivate->sessionKeyCommit);
 	if (prefsPrivate->sessionKeyApply)	CFRelease(prefsPrivate->sessionKeyApply);
 	if (prefsPrivate->rlsContext.release != NULL) {
@@ -120,9 +121,13 @@ __SCPreferencesDeallocate(CFTypeRef cf)
 	}
 	if (prefsPrivate->prefs)		CFRelease(prefsPrivate->prefs);
 	if (prefsPrivate->authorizationData != NULL) CFRelease(prefsPrivate->authorizationData);
-	if (prefsPrivate->helper != -1) {
-		(void) _SCHelperExec(prefsPrivate->helper, SCHELPER_MSG_PREFS_CLOSE, NULL, NULL, NULL);
-		_SCHelperClose(prefsPrivate->helper);
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		(void) _SCHelperExec(prefsPrivate->helper_port,
+				     SCHELPER_MSG_PREFS_CLOSE,
+				     NULL,
+				     NULL,
+				     NULL);
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	return;
@@ -177,6 +182,7 @@ __SCPreferencesCreatePrivate(CFAllocatorRef	allocator)
 
 	prefsPrivate->name				= NULL;
 	prefsPrivate->prefsID				= NULL;
+	prefsPrivate->options				= NULL;
 	prefsPrivate->path				= NULL;
 	prefsPrivate->newPath				= NULL;		// new prefs path
 	prefsPrivate->locked				= FALSE;
@@ -184,6 +190,7 @@ __SCPreferencesCreatePrivate(CFAllocatorRef	allocator)
 	prefsPrivate->lockPath				= NULL;
 	prefsPrivate->signature				= NULL;
 	prefsPrivate->session				= NULL;
+	prefsPrivate->sessionKeyLock			= NULL;
 	prefsPrivate->sessionKeyCommit			= NULL;
 	prefsPrivate->sessionKeyApply			= NULL;
 	prefsPrivate->scheduled				= FALSE;
@@ -194,15 +201,13 @@ __SCPreferencesCreatePrivate(CFAllocatorRef	allocator)
 	prefsPrivate->rlsContext.release		= NULL;
 	prefsPrivate->rlsContext.copyDescription	= NULL;
 	prefsPrivate->rlList				= NULL;
-#if	!TARGET_OS_IPHONE
 	prefsPrivate->dispatchQueue			= NULL;
-#endif	// !TARGET_OS_IPHONE
 	prefsPrivate->prefs				= NULL;
 	prefsPrivate->accessed				= FALSE;
 	prefsPrivate->changed				= FALSE;
 	prefsPrivate->isRoot				= (geteuid() == 0);
 	prefsPrivate->authorizationData			= NULL;
-	prefsPrivate->helper				= -1;
+	prefsPrivate->helper_port			= MACH_PORT_NULL;
 
 	return prefsPrivate;
 }
@@ -213,15 +218,18 @@ __SCPreferencesCreate_helper(SCPreferencesRef prefs)
 {
 	CFDataRef		data		= NULL;
 	CFMutableDictionaryRef	info;
+	char			name[64]	= "???";
 	CFNumberRef		num;
 	Boolean			ok;
 	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
 	uint32_t		status		= kSCStatusOK;
+	CFStringRef		str;
 	uint32_t		pid		= getpid();
 
 	// start helper
-	prefsPrivate->helper = _SCHelperOpen(prefsPrivate->authorizationData);
-	if (prefsPrivate->helper == -1) {
+	ok = _SCHelperOpen(prefsPrivate->authorizationData,
+			   &prefsPrivate->helper_port);
+	if (!ok) {
 		goto fail;
 	}
 
@@ -230,14 +238,31 @@ __SCPreferencesCreate_helper(SCPreferencesRef prefs)
 					 0,
 					 &kCFTypeDictionaryKeyCallBacks,
 					 &kCFTypeDictionaryValueCallBacks);
+
+	// save prefsID
 	if (prefsPrivate->prefsID != NULL) {
 		CFDictionarySetValue(info, CFSTR("prefsID"), prefsPrivate->prefsID);
 	}
+
+	// save options
+	if (prefsPrivate->options != NULL) {
+		CFDictionarySetValue(info, CFSTR("options"), prefsPrivate->options);
+	}
+
+	// save preferences session "name"
 	CFDictionarySetValue(info, CFSTR("name"), prefsPrivate->name);
+
+	// save PID
 	num = CFNumberCreate(NULL, kCFNumberSInt32Type, &pid);
 	CFDictionarySetValue(info, CFSTR("PID"), num);
 	CFRelease(num);
 
+	// save process name
+	(void) proc_name(getpid(), name, sizeof(name));
+	str = CFStringCreateWithCString(NULL, name, kCFStringEncodingUTF8);
+	CFDictionarySetValue(info, CFSTR("PROC_NAME"), str);
+	CFRelease(str);
+
 	// serialize the info
 	ok = _SCSerialize(info, &data, NULL, NULL);
 	CFRelease(info);
@@ -246,7 +271,7 @@ __SCPreferencesCreate_helper(SCPreferencesRef prefs)
 	}
 
 	// have the helper "open" the prefs
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_PREFS_OPEN,
 			   data,
 			   &status,
@@ -265,9 +290,8 @@ __SCPreferencesCreate_helper(SCPreferencesRef prefs)
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -291,7 +315,7 @@ __SCPreferencesAccess_helper(SCPreferencesRef prefs)
 	uint32_t		status		= kSCStatusOK;
 	CFDataRef		reply		= NULL;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		ok = __SCPreferencesCreate_helper(prefs);
 		if (!ok) {
 			return FALSE;
@@ -299,7 +323,7 @@ __SCPreferencesAccess_helper(SCPreferencesRef prefs)
 	}
 
 	// have the helper "access" the prefs
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_PREFS_ACCESS,
 			   NULL,
 			   &status,
@@ -323,11 +347,14 @@ __SCPreferencesAccess_helper(SCPreferencesRef prefs)
 	}
 
 	if (isA_CFDictionary(serverDict)) {
-		serverPrefs     = CFDictionaryGetValue(serverDict, CFSTR("preferences"));
+		serverPrefs = CFDictionaryGetValue(serverDict, CFSTR("preferences"));
+		serverPrefs = isA_CFDictionary(serverPrefs);
+
 		serverSignature = CFDictionaryGetValue(serverDict, CFSTR("signature"));
+		serverSignature = isA_CFData(serverSignature);
 	}
 
-	if (!isA_CFDictionary(serverPrefs) || !isA_CFData(serverSignature)) {
+	if ((serverPrefs == NULL) || (serverSignature == NULL)) {
 		CFRelease(serverDict);
 		goto fail;
 	}
@@ -342,9 +369,8 @@ __SCPreferencesAccess_helper(SCPreferencesRef prefs)
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -361,7 +387,8 @@ static SCPreferencesPrivateRef
 __SCPreferencesCreate(CFAllocatorRef	allocator,
 		      CFStringRef	name,
 		      CFStringRef	prefsID,
-		      CFDataRef		authorizationData)
+		      CFDataRef		authorizationData,
+		      CFDictionaryRef	options)
 {
 	int				fd		= -1;
 	SCPreferencesPrivateRef		prefsPrivate;
@@ -382,6 +409,9 @@ __SCPreferencesCreate(CFAllocatorRef	allocator,
 	if (authorizationData != NULL) {
 		prefsPrivate->authorizationData = CFRetain(authorizationData);
 	}
+	if (options != NULL) {
+		prefsPrivate->options = CFDictionaryCreateCopy(allocator, options);
+	}
 
     retry :
 
@@ -512,8 +542,8 @@ __SCPreferencesAccess(SCPreferencesRef	prefs)
 
 	if (statBuf.st_size > 0) {
 		CFDictionaryRef		dict;
+		CFErrorRef		error;
 		CFMutableDataRef	xmlData;
-		CFStringRef		xmlError;
 
 		/*
 		 * extract property list
@@ -531,18 +561,15 @@ __SCPreferencesAccess(SCPreferencesRef	prefs)
 		/*
 		 * load preferences
 		 */
-		dict = CFPropertyListCreateFromXMLData(allocator,
-						       xmlData,
-						       kCFPropertyListImmutable,
-						       &xmlError);
+		dict = CFPropertyListCreateWithData(allocator, xmlData, kCFPropertyListImmutable, NULL, &error);
 		CFRelease(xmlData);
 		if (dict == NULL) {
 			/* corrupt prefs file, start fresh */
-			if (xmlError != NULL) {
+			if (error != NULL) {
 				SCLog(TRUE, LOG_ERR,
-				      CFSTR("__SCPreferencesAccess CFPropertyListCreateFromXMLData(): %@"),
-				      xmlError);
-				CFRelease(xmlError);
+				      CFSTR("__SCPreferencesAccess CFPropertyListCreateWithData(): %@"),
+				      error);
+				CFRelease(error);
 			}
 			goto done;
 		}
@@ -591,7 +618,7 @@ SCPreferencesCreate(CFAllocatorRef		allocator,
 {
 	SCPreferencesPrivateRef	prefsPrivate;
 
-	prefsPrivate = __SCPreferencesCreate(allocator, name, prefsID, NULL);
+	prefsPrivate = __SCPreferencesCreate(allocator, name, prefsID, NULL, NULL);
 	return (SCPreferencesRef)prefsPrivate;
 }
 
@@ -601,59 +628,86 @@ SCPreferencesCreateWithAuthorization(CFAllocatorRef	allocator,
 				     CFStringRef	name,
 				     CFStringRef	prefsID,
 				     AuthorizationRef	authorization)
+{
+	SCPreferencesRef	prefs;
+
+#if	TARGET_OS_IPHONE
+	authorization = (AuthorizationRef)1;
+#endif	// TARGET_OS_IPHONE
+
+	prefs = SCPreferencesCreateWithOptions(allocator, name, prefsID, authorization, NULL);
+	return prefs;
+}
+
+
+SCPreferencesRef
+SCPreferencesCreateWithOptions(CFAllocatorRef	allocator,
+			       CFStringRef	name,
+			       CFStringRef	prefsID,
+			       AuthorizationRef	authorization,
+			       CFDictionaryRef	options)
 {
 	CFDataRef			authorizationData	= NULL;
 	SCPreferencesPrivateRef		prefsPrivate;
 
+	if (options != NULL) {
+		if (!isA_CFDictionary(options)) {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+	}
+
+	if (authorization != NULL) {
 #if	!TARGET_OS_IPHONE
-	AuthorizationExternalForm	extForm;
-	OSStatus			os_status;
+		AuthorizationExternalForm	extForm;
+		OSStatus			os_status;
 
-	os_status = AuthorizationMakeExternalForm(authorization, &extForm);
-	if (os_status != errAuthorizationSuccess) {
-		SCLog(TRUE, LOG_INFO, CFSTR("_SCHelperOpen AuthorizationMakeExternalForm() failed"));
-		_SCErrorSet(kSCStatusInvalidArgument);
-		return NULL;
-	}
+		os_status = AuthorizationMakeExternalForm(authorization, &extForm);
+		if (os_status != errAuthorizationSuccess) {
+			SCLog(TRUE, LOG_INFO, CFSTR("_SCHelperOpen AuthorizationMakeExternalForm() failed"));
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
 
-	authorizationData = CFDataCreate(NULL, (const UInt8 *)extForm.bytes, sizeof(extForm.bytes));
+		authorizationData = CFDataCreate(NULL, (const UInt8 *)extForm.bytes, sizeof(extForm.bytes));
 #else	// !TARGET_OS_IPHONE
-	CFBundleRef	bundle;
-	CFStringRef	bundleID	= NULL;
-
-	/* get the application/executable/bundle name */
-	bundle = CFBundleGetMainBundle();
-	if (bundle != NULL) {
-		bundleID = CFBundleGetIdentifier(bundle);
-		if (bundleID != NULL) {
-			CFRetain(bundleID);
-		} else {
-			CFURLRef	url;
-
-			url = CFBundleCopyExecutableURL(bundle);
-			if (url != NULL) {
-				bundleID = CFURLCopyPath(url);
-				CFRelease(url);
+		CFBundleRef	bundle;
+		CFStringRef	bundleID	= NULL;
+
+		/* get the application/executable/bundle name */
+		bundle = CFBundleGetMainBundle();
+		if (bundle != NULL) {
+			bundleID = CFBundleGetIdentifier(bundle);
+			if (bundleID != NULL) {
+				CFRetain(bundleID);
+			} else {
+				CFURLRef	url;
+
+				url = CFBundleCopyExecutableURL(bundle);
+				if (url != NULL) {
+					bundleID = CFURLCopyPath(url);
+					CFRelease(url);
+				}
 			}
-		}
 
-		if (bundleID != NULL) {
-			if (CFEqual(bundleID, CFSTR("/"))) {
-				CFRelease(bundleID);
-				bundleID = NULL;
+			if (bundleID != NULL) {
+				if (CFEqual(bundleID, CFSTR("/"))) {
+					CFRelease(bundleID);
+					bundleID = NULL;
+				}
 			}
 		}
-	}
-	if (bundleID == NULL) {
-		bundleID = CFStringCreateWithFormat(NULL, NULL, CFSTR("Unknown(%d)"), getpid());
-	}
+		if (bundleID == NULL) {
+			bundleID = CFStringCreateWithFormat(NULL, NULL, CFSTR("Unknown(%d)"), getpid());
+		}
 
-	_SCSerializeString(bundleID, &authorizationData, NULL, NULL);
-	CFRelease(bundleID);
+		_SCSerializeString(bundleID, &authorizationData, NULL, NULL);
+		CFRelease(bundleID);
 #endif	// !TARGET_OS_IPHONE
+	}
 
-	prefsPrivate = __SCPreferencesCreate(allocator, name, prefsID, authorizationData);
-	CFRelease(authorizationData);
+	prefsPrivate = __SCPreferencesCreate(allocator, name, prefsID, authorizationData, options);
+	if (authorizationData != NULL) CFRelease(authorizationData);
 
 	return (SCPreferencesRef)prefsPrivate;
 }
@@ -802,25 +856,18 @@ static Boolean
 __SCPreferencesScheduleWithRunLoop(SCPreferencesRef	prefs,
 				   CFRunLoopRef		runLoop,
 				   CFStringRef		runLoopMode,
-#if	!TARGET_OS_IPHONE
-				   dispatch_queue_t	queue
-#else	// !TARGET_OS_IPHONE
-				   void			*queue
-#endif	// !TARGET_OS_IPHONE
-				   )
+				   dispatch_queue_t	queue)
 {
 	Boolean			ok		= FALSE;
 	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
 
 	pthread_mutex_lock(&prefsPrivate->lock);
 
-#if	!TARGET_OS_IPHONE
 	if ((prefsPrivate->dispatchQueue != NULL) ||		// if we are already scheduled on a dispatch queue
 	    ((queue != NULL) && prefsPrivate->scheduled)) {	// if we are already scheduled on a CFRunLoop
 		_SCErrorSet(kSCStatusInvalidArgument);
 		goto done;
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	if (!prefsPrivate->scheduled) {
 		CFMutableArrayRef       keys;
@@ -848,7 +895,6 @@ __SCPreferencesScheduleWithRunLoop(SCPreferencesRef	prefs,
 		prefsPrivate->scheduled = TRUE;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (queue != NULL) {
 		ok = SCDynamicStoreSetDispatchQueue(prefsPrivate->session, queue);
 		if (!ok) {
@@ -860,9 +906,7 @@ __SCPreferencesScheduleWithRunLoop(SCPreferencesRef	prefs,
 
 		prefsPrivate->dispatchQueue = queue;
 		dispatch_retain(prefsPrivate->dispatchQueue);
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		if (!_SC_isScheduled(NULL, runLoop, runLoopMode, prefsPrivate->rlList)) {
 			/*
 			 * if we do not already have notifications scheduled with
@@ -899,22 +943,17 @@ __SCPreferencesUnscheduleFromRunLoop(SCPreferencesRef	prefs,
 		goto done;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (((runLoop == NULL) && (prefsPrivate->dispatchQueue == NULL)) ||	// if we should be scheduled on a dispatch queue (but are not)
 	    ((runLoop != NULL) && (prefsPrivate->dispatchQueue != NULL))) {	// if we should be scheduled on a CFRunLoop (but are scheduled on a dispatch queue)
 		_SCErrorSet(kSCStatusInvalidArgument);
 		goto done;
 	}
-#endif	// !TARGET_OS_IPHONE
 
-#if	!TARGET_OS_IPHONE
 	if (runLoop == NULL) {
 		SCDynamicStoreSetDispatchQueue(prefsPrivate->session, NULL);
 		dispatch_release(prefsPrivate->dispatchQueue);
 		prefsPrivate->dispatchQueue = NULL;
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		if (!_SC_unschedule(prefs, runLoop, runLoopMode, prefsPrivate->rlList, FALSE)) {
 			// if not currently scheduled on this runLoop / runLoopMode
 			_SCErrorSet(kSCStatusInvalidArgument);
@@ -967,6 +1006,7 @@ __SCPreferencesUnscheduleFromRunLoop(SCPreferencesRef	prefs,
 	return ok;
 }
 
+
 Boolean
 SCPreferencesScheduleWithRunLoop(SCPreferencesRef       prefs,
 				 CFRunLoopRef		runLoop,
@@ -980,6 +1020,7 @@ SCPreferencesScheduleWithRunLoop(SCPreferencesRef       prefs,
 	return __SCPreferencesScheduleWithRunLoop(prefs, runLoop, runLoopMode, NULL);
 }
 
+
 Boolean
 SCPreferencesUnscheduleFromRunLoop(SCPreferencesRef     prefs,
 				   CFRunLoopRef		runLoop,
@@ -993,7 +1034,7 @@ SCPreferencesUnscheduleFromRunLoop(SCPreferencesRef     prefs,
 	return __SCPreferencesUnscheduleFromRunLoop(prefs, runLoop, runLoopMode);
 }
 
-#if	!TARGET_OS_IPHONE
+
 Boolean
 SCPreferencesSetDispatchQueue(SCPreferencesRef	prefs,
 			      dispatch_queue_t	queue)
@@ -1014,7 +1055,6 @@ SCPreferencesSetDispatchQueue(SCPreferencesRef	prefs,
 
 	return ok;
 }
-#endif	// !TARGET_OS_IPHONE
 
 
 static void
@@ -1024,22 +1064,21 @@ __SCPreferencesSynchronize_helper(SCPreferencesRef prefs)
 	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
 	uint32_t		status		= kSCStatusOK;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		// if no helper
 		return;
 	}
 
 	// have the helper "synchronize" the prefs
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_PREFS_SYNCHRONIZE,
 			   NULL,
 			   &status,
 			   NULL);
 	if (!ok) {
 		// close helper
-		if (prefsPrivate->helper != -1) {
-			_SCHelperClose(prefsPrivate->helper);
-			prefsPrivate->helper = -1;
+		if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+			_SCHelperClose(&prefsPrivate->helper_port);
 		}
 	}
 
diff --git a/SystemConfiguration.fproj/SCPPath.c b/SystemConfiguration.fproj/SCPPath.c
index c3d5b5f..0794553 100644
--- a/SystemConfiguration.fproj/SCPPath.c
+++ b/SystemConfiguration.fproj/SCPPath.c
@@ -38,13 +38,17 @@
 
 #define	MAXLINKS	8
 
-static CFArrayRef
+static CFMutableArrayRef
 normalizePath(CFStringRef path)
 {
-	CFArrayRef		tmpElements;
 	CFMutableArrayRef	elements;
-	CFIndex			nElements;
-	CFIndex			i;
+	CFIndex			n;
+	CFArrayRef		tmpElements;
+
+	if (!isA_CFString(path)) {
+		_SCErrorSet(kSCStatusInvalidArgument);
+		return NULL;
+	}
 
 	if (!CFStringHasPrefix(path, CFSTR("/"))) {
 		/* if no root separator */
@@ -56,14 +60,13 @@ normalizePath(CFStringRef path)
 	CFRelease(tmpElements);
 
 	/* remove empty path components */
-	nElements = CFArrayGetCount(elements);
-	for (i = nElements; i > 0; i--) {
+	n = CFArrayGetCount(elements);
+	while (n-- > 0) {
 		CFStringRef	pathElement;
 
-		pathElement = CFArrayGetValueAtIndex(elements, i - 1);
+		pathElement = CFArrayGetValueAtIndex(elements, n);
 		if (CFStringGetLength(pathElement) == 0) {
-			CFArrayRemoveValueAtIndex(elements, i - 1);
-			nElements--;
+			CFArrayRemoveValueAtIndex(elements, n);
 		}
 	}
 
@@ -75,7 +78,7 @@ static Boolean
 getPath(SCPreferencesRef prefs, CFStringRef path, CFDictionaryRef *entity)
 {
 	CFStringRef		element;
-	CFArrayRef		elements;
+	CFMutableArrayRef	elements;
 	CFIndex			i;
 	CFStringRef		link;
 	CFIndex			nElements;
@@ -97,7 +100,10 @@ getPath(SCPreferencesRef prefs, CFStringRef path, CFDictionaryRef *entity)
 		SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
 
 		__SCPreferencesAccess(prefs);
-		value = prefsPrivate->prefs;
+
+		*entity = prefsPrivate->prefs;
+		ok = TRUE;
+		goto done;
 	}
 
 	for (i = 0; i < nElements; i++) {
@@ -125,8 +131,7 @@ getPath(SCPreferencesRef prefs, CFStringRef path, CFDictionaryRef *entity)
 			 * if not the last path component and this
 			 * element is a link
 			 */
-			CFArrayRef		linkElements;
-			CFMutableArrayRef	newElements;
+			CFMutableArrayRef	linkElements;
 
 			if (++nLinks > MAXLINKS) {
 				/* if we are chasing our tail */
@@ -141,13 +146,11 @@ getPath(SCPreferencesRef prefs, CFStringRef path, CFDictionaryRef *entity)
 				goto done;
 			}
 
-			newElements = CFArrayCreateMutableCopy(NULL, 0, linkElements);
-			CFRelease(linkElements);
-			CFArrayAppendArray(newElements,
+			CFArrayAppendArray(linkElements,
 					   elements,
 					   CFRangeMake(i + 1, nElements-i - 1));
 			CFRelease(elements);
-			elements = newElements;
+			elements = linkElements;
 
 			goto restart;
 		}
@@ -167,7 +170,7 @@ static Boolean
 setPath(SCPreferencesRef prefs, CFStringRef path, CFDictionaryRef entity)
 {
 	CFStringRef		element;
-	CFArrayRef		elements;
+	CFMutableArrayRef	elements;
 	CFIndex			i;
 	CFStringRef		link;
 	CFIndex			nElements;
@@ -251,8 +254,7 @@ setPath(SCPreferencesRef prefs, CFStringRef path, CFDictionaryRef entity)
 			 * if not the last path component and this
 			 * element is a link
 			 */
-			CFArrayRef		linkElements;
-			CFMutableArrayRef	newElements;
+			CFMutableArrayRef	linkElements;
 
 			if (++nLinks > MAXLINKS) {
 				/* if we are chasing our tail */
@@ -267,15 +269,14 @@ setPath(SCPreferencesRef prefs, CFStringRef path, CFDictionaryRef entity)
 				goto done;
 			}
 
-			newElements = CFArrayCreateMutableCopy(NULL, 0, linkElements);
-			CFRelease(linkElements);
-			CFArrayAppendArray(newElements,
+			CFArrayAppendArray(linkElements,
 					   elements,
 					   CFRangeMake(i + 1, nElements-i - 1));
 			CFRelease(elements);
-			elements = newElements;
+			elements = linkElements;
 
 			CFRelease(nodes);
+			nodes = NULL;
 			goto restart;
 		}
 	}
@@ -524,7 +525,7 @@ Boolean
 SCPreferencesPathRemoveValue(SCPreferencesRef	prefs,
 			     CFStringRef	path)
 {
-	CFArrayRef		elements	= NULL;
+	CFMutableArrayRef	elements	= NULL;
 	Boolean			ok		= FALSE;
 	CFDictionaryRef		value;
 
diff --git a/SystemConfiguration.fproj/SCPRemove.c b/SystemConfiguration.fproj/SCPRemove.c
index c2a3b58..fa2b1b5 100644
--- a/SystemConfiguration.fproj/SCPRemove.c
+++ b/SystemConfiguration.fproj/SCPRemove.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -35,6 +35,25 @@
 #include <SystemConfiguration/SCPrivate.h>
 #include "SCPreferencesInternal.h"
 
+Boolean
+SCPreferencesRemoveAllValues(SCPreferencesRef prefs)
+{
+	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
+
+	if (prefs == NULL) {
+		/* sorry, you must provide a session */
+		_SCErrorSet(kSCStatusNoPrefsSession);
+		return FALSE;
+	}
+
+	__SCPreferencesAccess(prefs);
+
+	CFDictionaryRemoveAllValues(prefsPrivate->prefs);
+	prefsPrivate->changed  = TRUE;
+	return TRUE;
+}
+
+
 Boolean
 SCPreferencesRemoveValue(SCPreferencesRef prefs, CFStringRef key)
 {
diff --git a/SystemConfiguration.fproj/SCPUnlock.c b/SystemConfiguration.fproj/SCPUnlock.c
index 2419fb8..4a87fa9 100644
--- a/SystemConfiguration.fproj/SCPUnlock.c
+++ b/SystemConfiguration.fproj/SCPUnlock.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -46,14 +46,14 @@ __SCPreferencesUnlock_helper(SCPreferencesRef prefs)
 	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
 	uint32_t		status		= kSCStatusOK;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		// if no helper
 		goto fail;
 	}
 
 	// have the helper "unlock" the prefs
 //	status = kSCStatusOK;
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_PREFS_UNLOCK,
 			   NULL,
 			   &status,
@@ -72,9 +72,8 @@ __SCPreferencesUnlock_helper(SCPreferencesRef prefs)
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -142,6 +141,11 @@ SCPreferencesUnlock(SCPreferencesRef prefs)
 
 	pthread_mutex_lock(&prefsPrivate->lock);
 
+	if (prefsPrivate->sessionKeyLock != NULL) {
+		SCDynamicStoreRemoveValue(prefsPrivate->session,
+					  prefsPrivate->sessionKeyLock);
+	}
+
 	if (prefsPrivate->lockFD != -1)	{
 		if (prefsPrivate->lockPath != NULL) {
 			unlink(prefsPrivate->lockPath);
diff --git a/SystemConfiguration.fproj/SCPreferences.h b/SystemConfiguration.fproj/SCPreferences.h
index f05a427..b31ba81 100644
--- a/SystemConfiguration.fproj/SCPreferences.h
+++ b/SystemConfiguration.fproj/SCPreferences.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2004, 2005, 2007-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2004, 2005, 2007-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -30,9 +30,7 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 #include <sys/cdefs.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 #include <CoreFoundation/CoreFoundation.h>
 #include <SystemConfiguration/SCDynamicStore.h>
 
@@ -85,12 +83,10 @@ typedef const struct __SCPreferences *	SCPreferencesRef;
 		request has been made to apply the currently saved
 		preferences to the active system configuration.
  */
-#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
 enum {
-	kSCPreferencesNotificationCommit	= 1<<0,
-	kSCPreferencesNotificationApply		= 1<<1
+	kSCPreferencesNotificationCommit	= 1<<0,	// __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/)
+	kSCPreferencesNotificationApply		= 1<<1	// __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/)
 };
-#endif	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
 
 typedef	uint32_t	SCPreferencesNotification;
 
@@ -437,7 +433,6 @@ SCPreferencesUnscheduleFromRunLoop	(
 					CFStringRef		runLoopMode
 					)			__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/);
 
-#if	!TARGET_OS_IPHONE
 /*!
 	@function SCPreferencesSetDispatchQueue
 	@discussion Schedule commit and apply notifications for the specified
@@ -451,8 +446,7 @@ Boolean
 SCPreferencesSetDispatchQueue		(
 					 SCPreferencesRef	prefs,
 					 dispatch_queue_t	queue
-					 )			__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA);
-#endif	// !TARGET_OS_IPHONE
+					 )			__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0/*SPI*/);
 
 /*!
 	@function SCPreferencesSynchronize
diff --git a/SystemConfiguration.fproj/SCPreferencesInternal.h b/SystemConfiguration.fproj/SCPreferencesInternal.h
index b86c07b..7d62507 100644
--- a/SystemConfiguration.fproj/SCPreferencesInternal.h
+++ b/SystemConfiguration.fproj/SCPreferencesInternal.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2007-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2007-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,9 +31,7 @@
 #include <CoreFoundation/CFRuntime.h>
 #include <SystemConfiguration/SCPreferences.h>
 #include <SystemConfiguration/SCDynamicStore.h>
-#if	!TARGET_OS_IPHONE
 #include <dispatch/dispatch.h>
-#endif	// !TARGET_OS_IPHONE
 
 
 #define	PREFS_DEFAULT_DIR		CFSTR("/Library/Preferences/SystemConfiguration")
@@ -60,6 +58,9 @@ typedef struct {
 	/* preferences ID */
 	CFStringRef		prefsID;
 
+	/* options */
+	CFDictionaryRef		options;
+
 	/* configuration file */
 	char			*path;
 	char			*newPath;
@@ -77,6 +78,7 @@ typedef struct {
 	SCDynamicStoreRef	session;
 
 	/* configd session keys */
+	CFStringRef		sessionKeyLock;
 	CFStringRef		sessionKeyCommit;
 	CFStringRef		sessionKeyApply;
 
@@ -86,9 +88,7 @@ typedef struct {
 	SCPreferencesCallBack	rlsFunction;
 	SCPreferencesContext	rlsContext;
 	CFMutableArrayRef       rlList;
-#if	!TARGET_OS_IPHONE
 	dispatch_queue_t	dispatchQueue;		// SCPreferencesSetDispatchQueue
-#endif	// !TARGET_OS_IPHONE
 
 	/* preferences */
 	CFMutableDictionaryRef	prefs;
@@ -100,7 +100,7 @@ typedef struct {
 
 	/* authorization, helper */
 	CFDataRef		authorizationData;
-	int			helper;
+	mach_port_t		helper_port;
 
 } SCPreferencesPrivate, *SCPreferencesPrivateRef;
 
diff --git a/SystemConfiguration.fproj/SCPreferencesKeychainPrivate.c b/SystemConfiguration.fproj/SCPreferencesKeychainPrivate.c
index c154f8d..30029da 100644
--- a/SystemConfiguration.fproj/SCPreferencesKeychainPrivate.c
+++ b/SystemConfiguration.fproj/SCPreferencesKeychainPrivate.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2006, 2007, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -92,6 +92,7 @@ copyMyExecutablePath(void)
 #pragma mark Keychain helper APIs
 
 
+#if	(__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
 /*
  * Create a SecAccessRef with a custom form.
  *
@@ -182,6 +183,7 @@ _SCSecAccessCreateForUID(uid_t uid)
 
 	return access;
 }
+#endif	// (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
 
 
 // one example would be to pass a URL for "/System/Library/CoreServices/SystemUIServer.app"
@@ -236,29 +238,6 @@ _SCSecAccessCreateForExecutables(CFStringRef	label,
 		goto done;
 	}
 
-#ifdef	NOT_NEEDED
-	// get the access control list for decryption operations (this controls access to an item's data)
-	status = SecAccessCopySelectedACLList(access, CSSM_ACL_AUTHORIZATION_DECRYPT, &aclList);
-	if (status == noErr) {
-		SecACLRef				acl;
-		CFArrayRef				applicationList	= NULL;
-		CFStringRef				description	= NULL;
-		CSSM_ACL_KEYCHAIN_PROMPT_SELECTOR	promptSelector;
-
-		// get the first entry in the access control list
-		acl = (SecACLRef)CFArrayGetValueAtIndex(aclList, 0);
-
-		// get the description and prompt selector
-		status = SecACLCopySimpleContents(acl, &applicationList, &description, &promptSelector);
-
-		// modify the application list
-		status = SecACLSetSimpleContents(acl, (CFArrayRef)trustedApplications, description, &promptSelector);
-
-		if (applicationList != NULL)	CFRelease(applicationList);
-		if (description != NULL)	CFRelease(description);
-	}
-#endif	// NOT_NEEDED
-
     done :
 
 	if (aclList != NULL)	CFRelease(aclList);
@@ -315,29 +294,28 @@ _SCSecKeychainCopySystemKeychain(void)
 #if	!TARGET_OS_IPHONE
 static OSStatus
 findKeychainItem(SecKeychainRef		keychain,
-		 UInt32			serviceNameLength,
-		 void			*serviceName,
+		 CFStringRef		unique_id,
 		 SecKeychainItemRef	*item)
 {
-	SecKeychainAttribute		attributes[1];
-	SecKeychainAttributeList	attributeList	= { 1, attributes };
-	SecKeychainSearchRef		search		= NULL;
-	OSStatus			status;
+	CFMutableDictionaryRef	query;
+	OSStatus		status;
 
-	attributes[0].tag    = kSecServiceItemAttr;
-	attributes[0].data   = serviceName;
-	attributes[0].length = serviceNameLength;
+	query = CFDictionaryCreateMutable(NULL,
+					  0,
+					  &kCFTypeDictionaryKeyCallBacks,
+					  &kCFTypeDictionaryValueCallBacks);
+	if (keychain != NULL) {
+		CFArrayRef	keychains;
 
-	status = SecKeychainSearchCreateFromAttributes(keychain,
-						       kSecGenericPasswordItemClass,
-						       &attributeList,
-						       &search);
-	if (status != noErr) {
-		return status;
+		keychains = CFArrayCreate(NULL, (const void **)&keychain, 1, &kCFTypeArrayCallBacks);
+		CFDictionarySetValue(query, kSecMatchSearchList, keychains);
+		CFRelease(keychains);
 	}
-
-	status = SecKeychainSearchCopyNext(search, item);
-	CFRelease(search);
+	CFDictionarySetValue(query, kSecClass      , kSecClassGenericPassword);
+	CFDictionarySetValue(query, kSecAttrService, unique_id);
+	CFDictionarySetValue(query, kSecReturnRef  , kCFBooleanTrue);
+	status = SecItemCopyMatching(query, (CFTypeRef *)item);
+	CFRelease(query);
 
 	return status;
 }
@@ -351,15 +329,9 @@ _SCSecKeychainPasswordItemCopy(SecKeychainRef	keychain,
 #if	!TARGET_OS_IPHONE
 	SecKeychainItemRef	item			= NULL;
 	CFDataRef		keychain_password	= NULL;
-	const char		*keychain_serviceName;
 	OSStatus		status;
 
-	keychain_serviceName = _SC_cfstring_to_cstring(unique_id, NULL, 0, kCFStringEncodingUTF8);
-	status = findKeychainItem(keychain,
-				  strlen(keychain_serviceName),
-				  (void *)keychain_serviceName,
-				  &item);
-	CFAllocatorDeallocate(NULL, (void *)keychain_serviceName);
+	status = findKeychainItem(keychain, unique_id, &item);
 	if (status == noErr) {
 		void *		pw	= NULL;
 		UInt32 		pw_len	= 0;
@@ -388,15 +360,9 @@ _SCSecKeychainPasswordItemExists(SecKeychainRef keychain, CFStringRef unique_id)
 {
 #if	!TARGET_OS_IPHONE
 	SecKeychainItemRef	item;
-	const char		*keychain_serviceName;
 	OSStatus		status;
 
-	keychain_serviceName = _SC_cfstring_to_cstring(unique_id, NULL, 0, kCFStringEncodingUTF8);
-	status = findKeychainItem(keychain,
-				  strlen(keychain_serviceName),
-				  (void *)keychain_serviceName,
-				  &item);
-	CFAllocatorDeallocate(NULL, (void *)keychain_serviceName);
+	status = findKeychainItem(keychain, unique_id, &item);
 	if (status != noErr) {
 		_SCErrorSet(status);
 		return FALSE;
@@ -416,15 +382,9 @@ _SCSecKeychainPasswordItemRemove(SecKeychainRef keychain, CFStringRef unique_id)
 {
 #if	!TARGET_OS_IPHONE
 	SecKeychainItemRef	item;
-	const char		*keychain_serviceName;
 	OSStatus		status;
 
-	keychain_serviceName = _SC_cfstring_to_cstring(unique_id, NULL, 0, kCFStringEncodingUTF8);
-	status = findKeychainItem(keychain,
-				  strlen(keychain_serviceName),
-				  (void *)keychain_serviceName,
-				  &item);
-	CFAllocatorDeallocate(NULL, (void *)keychain_serviceName);
+	status = findKeychainItem(keychain, unique_id, &item);
 	if (status != noErr) {
 		_SCErrorSet(status);
 		return FALSE;
@@ -488,10 +448,27 @@ _SCSecKeychainPasswordItemSet(SecKeychainRef	keychain,
 	}
 
 	if ((allowRoot != NULL) && CFBooleanGetValue(allowRoot)) {
+#if	(__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
 		access = _SCSecAccessCreateForUID(0);
 		if (access == NULL) {
 			return FALSE;
 		}
+#else	// (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
+		CFErrorRef	error	= NULL;
+
+		access = SecAccessCreateWithOwnerAndACL(0, 0, kSecUseOnlyUID, NULL, &error);
+		if (access == NULL) {
+			CFIndex	code	= kSCStatusAccessError;
+
+			if (error != NULL) {
+
+				code = CFErrorGetCode(error);
+				CFRelease(error);
+			}
+			_SCErrorSet(code);
+			return FALSE;
+		}
+#endif	// (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
 	} else if (allowedExecutables != NULL) {
 		access = _SCSecAccessCreateForExecutables(label, allowedExecutables);
 		if (access == NULL) {
@@ -532,10 +509,7 @@ _SCSecKeychainPasswordItemSet(SecKeychainRef	keychain,
 		n++;
 	}
 
-	status = findKeychainItem(keychain,
-				  attributes[0].length,
-				  attributes[0].data,
-				  &item);
+	status = findKeychainItem(keychain, unique_id, &item);
 	switch (status) {
 		case noErr : {
 			const void	*pw	= NULL;
@@ -623,7 +597,7 @@ __SCPreferencesSystemKeychainPasswordItemCopy_helper(SCPreferencesRef	prefs,
 	uint32_t		status		= kSCStatusOK;
 	CFDataRef		reply		= NULL;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		ok = __SCPreferencesCreate_helper(prefs);
 		if (!ok) {
 			return FALSE;
@@ -636,7 +610,7 @@ __SCPreferencesSystemKeychainPasswordItemCopy_helper(SCPreferencesRef	prefs,
 	}
 
 	// have the helper set the "System" Keychain password
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_KEYCHAIN_COPY,
 			   data,
 			   &status,
@@ -655,9 +629,8 @@ __SCPreferencesSystemKeychainPasswordItemCopy_helper(SCPreferencesRef	prefs,
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -769,7 +742,7 @@ __SCPreferencesSystemKeychainPasswordItemRemove_helper(SCPreferencesRef	prefs,
 	uint32_t		status		= kSCStatusOK;
 	CFDataRef		reply		= NULL;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		ok = __SCPreferencesCreate_helper(prefs);
 		if (!ok) {
 			return FALSE;
@@ -782,7 +755,7 @@ __SCPreferencesSystemKeychainPasswordItemRemove_helper(SCPreferencesRef	prefs,
 	}
 
 	// have the helper set the "System" Keychain password
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_KEYCHAIN_REMOVE,
 			   data,
 			   &status,
@@ -801,9 +774,8 @@ __SCPreferencesSystemKeychainPasswordItemRemove_helper(SCPreferencesRef	prefs,
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
@@ -878,7 +850,7 @@ __SCPreferencesSystemKeychainPasswordItemSet_helper(SCPreferencesRef	prefs,
 	uint32_t		status		= kSCStatusOK;
 	CFDataRef		reply		= NULL;
 
-	if (prefsPrivate->helper == -1) {
+	if (prefsPrivate->helper_port == MACH_PORT_NULL) {
 		ok = __SCPreferencesCreate_helper(prefs);
 		if (!ok) {
 			return FALSE;
@@ -964,7 +936,7 @@ __SCPreferencesSystemKeychainPasswordItemSet_helper(SCPreferencesRef	prefs,
 	}
 
 	// have the helper create the "System" Keychain password
-	ok = _SCHelperExec(prefsPrivate->helper,
+	ok = _SCHelperExec(prefsPrivate->helper_port,
 			   SCHELPER_MSG_KEYCHAIN_SET,
 			   data,
 			   &status,
@@ -983,9 +955,8 @@ __SCPreferencesSystemKeychainPasswordItemSet_helper(SCPreferencesRef	prefs,
     fail :
 
 	// close helper
-	if (prefsPrivate->helper != -1) {
-		_SCHelperClose(prefsPrivate->helper);
-		prefsPrivate->helper = -1;
+	if (prefsPrivate->helper_port != MACH_PORT_NULL) {
+		_SCHelperClose(&prefsPrivate->helper_port);
 	}
 
 	status = kSCStatusAccessError;
diff --git a/SystemConfiguration.fproj/SCPreferencesPathKey.c b/SystemConfiguration.fproj/SCPreferencesPathKey.c
index d3a738a..2667601 100644
--- a/SystemConfiguration.fproj/SCPreferencesPathKey.c
+++ b/SystemConfiguration.fproj/SCPreferencesPathKey.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2004, 2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2001, 2004, 2005, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -37,12 +37,17 @@ SCPreferencesPathKeyCreate(CFAllocatorRef	allocator,
 			   CFStringRef		fmt,
 			   ...)
 {
-	va_list args;
+	va_list		args;
+	CFStringRef	result;
+
 	va_start(args, fmt);
-	return (CFStringCreateWithFormatAndArguments(allocator,
-						     NULL,
-						     fmt,
-						     args));
+	result = CFStringCreateWithFormatAndArguments(allocator,
+						      NULL,
+						      fmt,
+						      args);
+	va_end(args);
+
+	return result;
 }
 
 
diff --git a/SystemConfiguration.fproj/SCPreferencesPrivate.h b/SystemConfiguration.fproj/SCPreferencesPrivate.h
index 7ed9bc6..95f18f9 100644
--- a/SystemConfiguration.fproj/SCPreferencesPrivate.h
+++ b/SystemConfiguration.fproj/SCPreferencesPrivate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2007-2009, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -35,6 +35,8 @@
 	@header SCPreferencesPrivate
  */
 
+#define kSCPreferencesOptionRemoveWhenEmpty	CFSTR("remove-when-empty")	// CFBooleanRef
+
 /*!
 	@enum SCPreferencesKeyType
 	@discussion Used with the SCDynamicStoreKeyCreatePreferences() function
@@ -45,6 +47,7 @@
 		to be applied to the active system configuration.
  */
 enum {
+	kSCPreferencesKeyLock	= 1,
 	kSCPreferencesKeyCommit	= 2,
 	kSCPreferencesKeyApply	= 3
 };
@@ -72,6 +75,54 @@ SCDynamicStoreKeyCreatePreferences	(
 					SCPreferencesKeyType	keyType
 					)	__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_4,__IPHONE_2_0,__IPHONE_2_0);
 
+/*!
+	@function SCPreferencesCreateWithOptions
+	@discussion Initiates access to the per-system set of configuration
+		preferences.
+	@param allocator The CFAllocator that should be used to allocate
+		memory for this preferences session.
+		This parameter may be NULL in which case the current
+		default CFAllocator is used.
+		If this reference is not a valid CFAllocator, the behavior
+		is undefined.
+	@param name A string that describes the name of the calling
+		process.
+	@param prefsID A string that identifies the name of the
+		group of preferences to be accessed or updated.
+	@param authorization An authorization reference that is used to
+		authorize any access to the enhanced privileges needed
+		to manage the preferences session.
+	@param options A CFDictionary with options that affect the
+		configuration preferences and how the APIs interact
+		with the plist.
+	@result Returns a reference to the new SCPreferences.
+		You must release the returned value.
+ */
+SCPreferencesRef
+SCPreferencesCreateWithOptions		(
+					 CFAllocatorRef		allocator,
+					 CFStringRef		name,
+					 CFStringRef		prefsID,
+					 AuthorizationRef	authorization,
+					 CFDictionaryRef	options
+					 )			__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
+
+/*!
+	@function SCPreferencesRemoveAllValues
+	@discussion Removes all data associated with the preferences.
+
+	This function removes all data associated with the preferences.
+	To commit these changes to permanent storage a call must be made
+	to the SCPreferencesCommitChanges function.
+	@param prefs The preferences session.
+	@result Returns TRUE if the value was removed;
+		FALSE if the key did not exist or if an error occurred.
+ */
+Boolean
+SCPreferencesRemoveAllValues		(
+					 SCPreferencesRef	prefs
+					 )			__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
+
 __END_DECLS
 
 #endif /* _SCPREFERENCESPRIVATE_H */
diff --git a/SystemConfiguration.fproj/SCPreferencesSetSpecific.h b/SystemConfiguration.fproj/SCPreferencesSetSpecific.h
index 940c04a..b044efb 100644
--- a/SystemConfiguration.fproj/SCPreferencesSetSpecific.h
+++ b/SystemConfiguration.fproj/SCPreferencesSetSpecific.h
@@ -73,7 +73,7 @@ SCPreferencesSetComputerName		(
 
 		Note: To commit these changes to permanent storage you must
 		call the SCPreferencesCommitChanges function.
-		In addition, you must call theSCPreferencesApplyChanges
+		In addition, you must call the SCPreferencesApplyChanges
 		function for the new name to become active.
 	@param prefs The preferences session.
 	@param name The local host name to be set.
diff --git a/SystemConfiguration.fproj/SCPrivate.h b/SystemConfiguration.fproj/SCPrivate.h
index 4fa55e9..ba073c4 100644
--- a/SystemConfiguration.fproj/SCPrivate.h
+++ b/SystemConfiguration.fproj/SCPrivate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -26,6 +26,7 @@
 
 #include <sys/cdefs.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #include <asl.h>
 #include <sys/syslog.h>
 #include <mach/message.h>
@@ -78,7 +79,21 @@ extern int	_sc_log;	/* 0 if SC messages should be written to stdout/stderr,
 		value is either a valid host name or a numeric host address string
 		consisting of a dotted decimal IPv4 address or an IPv6 address.
  */
-#define kSCNetworkReachabilityOptionNodeName	CFSTR("nodename")
+#define kSCNetworkReachabilityOptionNodeName			CFSTR("nodename")
+
+/*!
+	@constant kSCNetworkReachabilityOptionLocalAddress
+	@discussion A CFData wrapping a "struct sockaddr" that represents
+		local address associated with a network connection.
+ */
+#define kSCNetworkReachabilityOptionLocalAddress		CFSTR("local-address")
+
+/*!
+	@constant kSCNetworkReachabilityOptionRemoteAddress
+	@discussion A CFData wrapping a "struct sockaddr" that represents
+		remote address associated with a network connection.
+ */
+#define kSCNetworkReachabilityOptionRemoteAddress		CFSTR("remote-address")
 
 /*!
 	@constant kSCNetworkReachabilityOptionServName
@@ -86,7 +101,7 @@ extern int	_sc_log;	/* 0 if SC messages should be written to stdout/stderr,
 		value is either a decimal port number or a service name listed in
 		services(5).
  */
-#define kSCNetworkReachabilityOptionServName	CFSTR("servname")
+#define kSCNetworkReachabilityOptionServName			CFSTR("servname")
 
 /*!
 	@constant kSCNetworkReachabilityOptionHints
@@ -95,7 +110,15 @@ extern int	_sc_log;	/* 0 if SC messages should be written to stdout/stderr,
 		ai_socktype, ai_protocol, and ai_flags structure elements.  All
 		other elements must be 0 or the null pointer.
  */
-#define kSCNetworkReachabilityOptionHints	CFSTR("hints")
+#define kSCNetworkReachabilityOptionHints			CFSTR("hints")
+
+/*!
+	@constant kSCNetworkReachabilityOptionInterface
+	@discussion A CFString specifying that the reachability query should be
+		limited to the provided network interface (e.g. "en0", "en1", ...).
+ */
+#define kSCNetworkReachabilityOptionInterface			CFSTR("interface")
+
 
 /*!
 	@constant kSCNetworkReachabilityOptionConnectionOnDemandByPass
@@ -110,6 +133,11 @@ extern int	_sc_log;	/* 0 if SC messages should be written to stdout/stderr,
 
 __BEGIN_DECLS
 
+
+#pragma mark -
+#pragma mark SCError()
+
+
 /*!
 	@function _SCErrorSet
 	@discussion Sets the last SystemConfiguration.framework API error code.
@@ -117,6 +145,11 @@ __BEGIN_DECLS
  */
 void		_SCErrorSet			(int			error);
 
+
+#pragma mark -
+#pragma mark Serialization/Unserialization
+
+
 /*!
 	@function _SCSerialize
 	@discussion Serialize a CFPropertyList object for passing
@@ -229,6 +262,11 @@ CFDictionaryRef	_SCSerializeMultiple		(CFDictionaryRef	dict);
  */
 CFDictionaryRef	_SCUnserializeMultiple		(CFDictionaryRef	dict);
 
+
+#pragma mark -
+#pragma mark String conversion
+
+
 /*!
 	@function _SC_cfstring_to_cstring
 	@discussion Extracts a C-string from a CFString.
@@ -259,6 +297,20 @@ void		_SC_sockaddr_to_string		(const struct sockaddr  *address,
 						 char			*buf,
 						 size_t			bufLen);
 
+
+/*!
+ *	@function _SC_trimDomain
+ *	@discussion Trims leading and trailing "."s from a domain or host name
+ *	@param domain The domain name to trim
+ *	@result The trimmed domain name.
+ */
+CFStringRef	_SC_trimDomain			(CFStringRef		domain);
+
+
+#pragma mark -
+#pragma mark Mach IPC
+
+
 /*!
 	@function _SC_sendMachMessage
 	@discussion Sends a trivial mach message (one with just a
@@ -270,6 +322,10 @@ void		_SC_sendMachMessage		(mach_port_t		port,
 						 mach_msg_id_t		msg_id);
 
 
+#pragma mark -
+#pragma mark Logging
+
+
 /*!
 	@function _SCCopyDescription
 	@discussion Returns a formatted textual description of a CF object.
@@ -346,6 +402,35 @@ void		SCTrace				(Boolean		condition,
 						 CFStringRef		formatString,
 						 ...);
 
+#pragma mark -
+#pragma mark Proxies
+
+
+/*!
+	@function SCNetworkProxiesCopyMatching
+	@discussion
+	@param globalConfiguration the proxy dictionary currently returned
+		by SCDynamicStoreCopyProxies().
+	@param server A CFString specying the hostname of interest; NULL if
+		no specific hostname should be used in selecting the proxy
+		configurations.
+	@param interface A CFString specifying that the proxy configuration
+		for the provided network interface (e.g. "en0", "en1", ...)
+		should be returned; NULL if proxy usage will not be scoped
+		to an interface.
+	@result A CFArray containing the proxy configurations associated
+		with the requested server and/or network interface.
+
+ */
+CFArrayRef
+SCNetworkProxiesCopyMatching			(CFDictionaryRef	globalConfiguration,
+						 CFStringRef		server,
+						 CFStringRef		interface)	__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/);
+
+#pragma mark -
+#pragma mark Reachability
+
+
 /*!
 	@function SCNetworkReachabilityCopyOnDemandService
 	@discussion For target hosts that require an OnDemand connection, returns
@@ -397,6 +482,10 @@ _SC_checkResolverReachabilityByAddress		(SCDynamicStoreRef		*storeP,
 						 Boolean			*haveDNS,
 						 struct sockaddr		*sa);
 
+#pragma mark -
+#pragma mark NetBIOS
+
+
 #if	!TARGET_OS_IPHONE
 /*
  * DOS encoding/codepage
@@ -408,6 +497,10 @@ _SC_dos_encoding_and_codepage			(CFStringEncoding	macEncoding,
 						 UInt32			*dosCodepage);
 #endif	// !TARGET_OS_IPHONE
 
+#pragma mark -
+#pragma mark ScheduleWithRunLoop/UnscheduleFromRunLoop
+
+
 /*
  * object / CFRunLoop  management
  */
@@ -435,6 +528,10 @@ _SC_unschedule					(CFTypeRef		obj,
 						 CFMutableArrayRef      rlList,
 						 Boolean		all);
 
+#pragma mark -
+#pragma mark Bundle
+
+
 /*
  * bundle access
  */
@@ -447,6 +544,19 @@ _SC_CFBundleCopyNonLocalizedString		(CFBundleRef		bundle,
 						 CFStringRef		value,
 						 CFStringRef		tableName);
 
+#pragma mark -
+#pragma mark Misc
+
+
+/*
+ * mach port access
+ */
+CFMachPortRef
+_SC_CFMachPortCreateWithPort			(const char *		portDescription,
+						 mach_port_t		portNum,
+						 CFMachPortCallBack	callout,
+						 CFMachPortContext	*context);
+
 /*
  * misc
  */
@@ -462,6 +572,22 @@ _SC_CFEqual(CFTypeRef val1, CFTypeRef val2)
 	return FALSE;
 }
 
+static __inline__ Boolean
+_SC_isAppleInternal()
+{
+	static int isInternal	= 0;
+
+	if (isInternal == 0) {
+		int		ret;
+		struct stat	statbuf;
+
+		ret = stat("/AppleInternal", &statbuf);
+		isInternal = (ret == 0) ? 1 : 2;
+	}
+
+	return (isInternal == 1);
+}
+
 /*
  * debugging
  */
@@ -485,6 +611,11 @@ _SC_logMachPortReferences			(const char		*str,
 CFStringRef
 _SC_copyBacktrace				(void);
 
+void
+_SC_crash					(const char		*crash_info,
+						 CFStringRef		notifyHeader,
+						 CFStringRef		notifyMessage);
+
 __END_DECLS
 
 #endif	/* _SCPRIVATE_H */
diff --git a/SystemConfiguration.fproj/SCProxies.c b/SystemConfiguration.fproj/SCProxies.c
index 8cfc5ff..68fa5e0 100644
--- a/SystemConfiguration.fproj/SCProxies.c
+++ b/SystemConfiguration.fproj/SCProxies.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004, 2006-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2006-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -28,6 +28,7 @@
  * - initial revision
  */
 
+#include <TargetConditionals.h>
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCValidation.h>
 #include <SystemConfiguration/SCPrivate.h>
@@ -204,12 +205,24 @@ SCDynamicStoreCopyProxies(SCDynamicStoreRef store)
 			       kSCPropNetProxiesSOCKSPort,
 			       "socks",
 			       1080);
-	validate_proxy_content(newProxies,
-			       kSCPropNetProxiesProxyAutoConfigEnable,
-			       kSCPropNetProxiesProxyAutoConfigURLString,
-			       NULL,
-			       NULL,
-			       0);
+	if (CFDictionaryContainsKey(newProxies, kSCPropNetProxiesProxyAutoConfigURLString)) {
+		validate_proxy_content(newProxies,
+				       kSCPropNetProxiesProxyAutoConfigEnable,
+				       kSCPropNetProxiesProxyAutoConfigURLString,
+				       NULL,
+				       NULL,
+				       0);
+
+		// and we can't have both URLString and JavaScript keys
+		CFDictionaryRemoveValue(newProxies, kSCPropNetProxiesProxyAutoConfigJavaScript);
+	} else {
+		validate_proxy_content(newProxies,
+				       kSCPropNetProxiesProxyAutoConfigEnable,
+				       kSCPropNetProxiesProxyAutoConfigJavaScript,
+				       NULL,
+				       NULL,
+				       0);
+	}
 	validate_proxy_content(newProxies,
 			       kSCPropNetProxiesProxyAutoDiscoveryEnable,
 			       NULL,
@@ -281,3 +294,176 @@ SCDynamicStoreCopyProxies(SCDynamicStoreRef store)
 	if (tempSession)	CFRelease(store);
 	return proxies;
 }
+
+
+CFArrayRef
+SCNetworkProxiesCopyMatching(CFDictionaryRef	globalConfiguration,
+			     CFStringRef	server,
+			     CFStringRef	interface)
+{
+	CFMutableDictionaryRef	newProxy;
+	CFArrayRef		proxies		= NULL;
+	CFDictionaryRef		proxy;
+	int			sc_status	= kSCStatusOK;
+	CFStringRef		trimmed		= NULL;
+
+	if (!isA_CFDictionary(globalConfiguration)) {
+		// if no proxy configuration
+		_SCErrorSet(kSCStatusOK);
+		return NULL;
+	}
+
+	if (interface != NULL) {
+		CFDictionaryRef		scoped;
+
+		if (!isA_CFString(interface) ||
+		    (CFStringGetLength(interface) == 0)) {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+
+		scoped = CFDictionaryGetValue(globalConfiguration, kSCPropNetProxiesScoped);
+		if (scoped == NULL) {
+			// if no scoped proxy configurations
+			_SCErrorSet(kSCStatusOK);
+			return NULL;
+		}
+
+		if (!isA_CFDictionary(scoped)) {
+			// if corrupt proxy configuration
+			_SCErrorSet(kSCStatusFailed);
+			return NULL;
+		}
+
+		proxy = CFDictionaryGetValue(scoped, interface);
+		if (proxy == NULL) {
+			// if no scoped proxy configuration for this interface
+			_SCErrorSet(kSCStatusOK);
+			return NULL;
+		}
+
+		if (!isA_CFDictionary(proxy)) {
+			// if corrupt proxy configuration
+			_SCErrorSet(kSCStatusFailed);
+			return NULL;
+		}
+
+		// return per-interface proxy configuration
+		proxies = CFArrayCreate(NULL, (const void **)&proxy, 1, &kCFTypeArrayCallBacks);
+		return proxies;
+	}
+
+	if (server != NULL) {
+		CFIndex			i;
+		CFMutableArrayRef	matching	= NULL;
+		CFIndex			n;
+		CFIndex			server_len;
+		CFArrayRef		supplemental;
+
+		trimmed = _SC_trimDomain(server);
+		if (trimmed == NULL) {
+			_SCErrorSet(kSCStatusInvalidArgument);
+			return NULL;
+		}
+
+		server = trimmed;
+		server_len = CFStringGetLength(server);
+
+		supplemental = CFDictionaryGetValue(globalConfiguration, kSCPropNetProxiesSupplemental);
+		if (supplemental == NULL) {
+			// if no supplemental configurations
+			goto done;
+		}
+
+		if (!isA_CFArray(supplemental)) {
+			// if corrupt proxy configuration
+			sc_status = kSCStatusFailed;
+			goto done;
+		}
+
+		n = CFArrayGetCount(supplemental);
+		for (i = 0; i < n; i++) {
+			CFStringRef	domain;
+			CFIndex		domain_len;
+			CFIndex		n_matching;
+
+			proxy = CFArrayGetValueAtIndex(supplemental, i);
+			if (!isA_CFDictionary(proxy)) {
+				// if corrupt proxy configuration
+				continue;
+			}
+
+			domain = CFDictionaryGetValue(proxy, kSCPropNetProxiesSupplementalMatchDomain);
+			if (!isA_CFString(domain)) {
+				// if corrupt proxy configuration
+				continue;
+			}
+
+			domain_len = CFStringGetLength(domain);
+			if (domain_len > 0) {
+				if (!CFStringFindWithOptions(server,
+							     domain,
+							     CFRangeMake(0, server_len),
+							     kCFCompareCaseInsensitive|kCFCompareAnchored|kCFCompareBackwards,
+							     NULL)) {
+					// if server does not match this proxy domain (or host)
+					continue;
+				}
+
+				if ((server_len > domain_len) &&
+				    !CFStringFindWithOptions(server,
+							     CFSTR("."),
+							     CFRangeMake(0, server_len - domain_len),
+							     kCFCompareCaseInsensitive|kCFCompareAnchored|kCFCompareBackwards,
+							     NULL)) {
+					// if server does not match this proxy domain
+					continue;
+				}
+//			} else {
+//				// if this is a "default" (match all) proxy domain
+			}
+
+			if (matching == NULL) {
+				matching = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+			}
+			n_matching = CFArrayGetCount(matching);
+
+			newProxy = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+			CFDictionaryRemoveValue(newProxy, kSCPropNetProxiesSupplementalMatchDomain);
+			if ((n_matching == 0) ||
+			    !CFArrayContainsValue(matching, CFRangeMake(0, n_matching), newProxy)) {
+				// add this matching proxy
+				CFArrayAppendValue(matching, newProxy);
+			}
+			CFRelease(newProxy);
+		}
+
+		if (matching != NULL) {
+			// if we have any supplemental match domains
+			proxies = CFArrayCreateCopy(NULL, matching);
+			CFRelease(matching);
+			goto done;
+		}
+	}
+
+	// no matches, return "global" proxy configuration
+
+	newProxy = CFDictionaryCreateMutableCopy(NULL, 0, globalConfiguration);
+	CFDictionaryRemoveValue(newProxy, kSCPropNetProxiesScoped);
+	CFDictionaryRemoveValue(newProxy, kSCPropNetProxiesSupplemental);
+	proxies = CFArrayCreate(NULL, (const void **)&newProxy, 1, &kCFTypeArrayCallBacks);
+	CFRelease(newProxy);
+
+    done :
+
+	if (sc_status != kSCStatusOK) {
+		if (proxies != NULL) {
+			CFRelease(proxies);
+			proxies = NULL;
+		}
+		_SCErrorSet(sc_status);
+	}
+	if (trimmed != NULL) CFRelease(trimmed);
+
+	return proxies;
+}
diff --git a/SystemConfiguration.fproj/SCSchemaDefinitions.c b/SystemConfiguration.fproj/SCSchemaDefinitions.c
index ac8b474..159a37d 100644
--- a/SystemConfiguration.fproj/SCSchemaDefinitions.c
+++ b/SystemConfiguration.fproj/SCSchemaDefinitions.c
@@ -62,8 +62,10 @@ const CFStringRef kSCEntNet6to4                                    = CFSTR("6to4
 
 
 const CFStringRef kSCEntNetEAPOL                                   = CFSTR("EAPOL");
+const CFStringRef kSCEntNetLoopback                                = CFSTR("Loopback");
 const CFStringRef kSCEntNetOnDemand                                = CFSTR("OnDemand");
 const CFStringRef kSCEntNetService                                 = CFSTR("__SERVICE__");
+const CFStringRef kSCEntNetVPN                                     = CFSTR("VPN");
 const CFStringRef kSCPropNetOverridePrimary                        = CFSTR("OverridePrimary");
 const CFStringRef kSCPropNetServiceOrder                           = CFSTR("ServiceOrder");
 const CFStringRef kSCPropNetPPPOverridePrimary                     = CFSTR("PPPOverridePrimary");
@@ -114,6 +116,16 @@ const CFStringRef kSCPropNetDNSSupplementalMatchOrders             = CFSTR("Supp
 const CFStringRef kSCPropNetEthernetMediaSubType                   = CFSTR("MediaSubType");
 const CFStringRef kSCPropNetEthernetMediaOptions                   = CFSTR("MediaOptions");
 const CFStringRef kSCPropNetEthernetMTU                            = CFSTR("MTU");
+const CFStringRef kSCPropNetEthernetCapabilityAV                   = CFSTR("AV");
+const CFStringRef kSCPropNetEthernetCapabilityJUMBO_MTU            = CFSTR("JUMBO_MTU");
+const CFStringRef kSCPropNetEthernetCapabilityLRO                  = CFSTR("LRO");
+const CFStringRef kSCPropNetEthernetCapabilityRXCSUM               = CFSTR("RXCSUM");
+const CFStringRef kSCPropNetEthernetCapabilityTSO                  = CFSTR("TSO");
+const CFStringRef kSCPropNetEthernetCapabilityTSO4                 = CFSTR("TSO4");
+const CFStringRef kSCPropNetEthernetCapabilityTSO6                 = CFSTR("TSO6");
+const CFStringRef kSCPropNetEthernetCapabilityTXCSUM               = CFSTR("TXCSUM");
+const CFStringRef kSCPropNetEthernetCapabilityVLAN_HWTAGGING       = CFSTR("VLAN_HWTAGGING");
+const CFStringRef kSCPropNetEthernetCapabilityVLAN_MTU             = CFSTR("VLAN_MTU");
 const CFStringRef kSCPropNetInterfaceDeviceName                    = CFSTR("DeviceName");
 const CFStringRef kSCPropNetInterfaceHardware                      = CFSTR("Hardware");
 const CFStringRef kSCPropNetInterfaceType                          = CFSTR("Type");
@@ -128,6 +140,8 @@ const CFStringRef kSCValNetInterfaceSubTypePPPoE                   = CFSTR("PPPo
 const CFStringRef kSCValNetInterfaceSubTypePPPSerial               = CFSTR("PPPSerial");
 const CFStringRef kSCValNetInterfaceSubTypePPTP                    = CFSTR("PPTP");
 const CFStringRef kSCValNetInterfaceSubTypeL2TP                    = CFSTR("L2TP");
+const CFStringRef kSCValNetInterfaceTypeLoopback                   = CFSTR("Loopback");
+const CFStringRef kSCValNetInterfaceTypeVPN                        = CFSTR("VPN");
 const CFStringRef kSCPropNetIPSecAuthenticationMethod              = CFSTR("AuthenticationMethod");
 const CFStringRef kSCPropNetIPSecLocalCertificate                  = CFSTR("LocalCertificate");
 const CFStringRef kSCPropNetIPSecLocalIdentifier                   = CFSTR("LocalIdentifier");
@@ -167,7 +181,12 @@ const CFStringRef kSCValNetIPv4ConfigMethodINFORM                  = CFSTR("INFO
 const CFStringRef kSCValNetIPv4ConfigMethodLinkLocal               = CFSTR("LinkLocal");
 const CFStringRef kSCValNetIPv4ConfigMethodManual                  = CFSTR("Manual");
 const CFStringRef kSCValNetIPv4ConfigMethodPPP                     = CFSTR("PPP");
+const CFStringRef kSCPropNetIPv4ExcludedRoutes                     = CFSTR("ExcludedRoutes");
+const CFStringRef kSCPropNetIPv4IncludedRoutes                     = CFSTR("IncludedRoutes");
 const CFStringRef kSCValNetIPv4ConfigMethodFailover                = CFSTR("Failover");
+const CFStringRef kSCPropNetIPv4RouteDestinationAddress            = CFSTR("DestinationAddress");
+const CFStringRef kSCPropNetIPv4RouteSubnetMask                    = CFSTR("SubnetMask");
+const CFStringRef kSCPropNetIPv4RouteGatewayAddress                = CFSTR("GatewayAddress");
 const CFStringRef kSCPropNetIPv6Addresses                          = CFSTR("Addresses");
 const CFStringRef kSCPropNetIPv6ConfigMethod                       = CFSTR("ConfigMethod");
 const CFStringRef kSCPropNetIPv6DestAddresses                      = CFSTR("DestAddresses");
@@ -175,9 +194,15 @@ const CFStringRef kSCPropNetIPv6Flags                              = CFSTR("Flag
 const CFStringRef kSCPropNetIPv6PrefixLength                       = CFSTR("PrefixLength");
 const CFStringRef kSCPropNetIPv6Router                             = CFSTR("Router");
 const CFStringRef kSCValNetIPv6ConfigMethodAutomatic               = CFSTR("Automatic");
+const CFStringRef kSCValNetIPv6ConfigMethodLinkLocal               = CFSTR("LinkLocal");
 const CFStringRef kSCValNetIPv6ConfigMethodManual                  = CFSTR("Manual");
 const CFStringRef kSCValNetIPv6ConfigMethodRouterAdvertisement     = CFSTR("RouterAdvertisement");
 const CFStringRef kSCValNetIPv6ConfigMethod6to4                    = CFSTR("6to4");
+const CFStringRef kSCPropNetIPv6ExcludedRoutes                     = CFSTR("ExcludedRoutes");
+const CFStringRef kSCPropNetIPv6IncludedRoutes                     = CFSTR("IncludedRoutes");
+const CFStringRef kSCPropNetIPv6RouteDestinationAddress            = CFSTR("DestinationAddress");
+const CFStringRef kSCPropNetIPv6RoutePrefixLength                  = CFSTR("PrefixLength");
+const CFStringRef kSCPropNetIPv6RouteGatewayAddress                = CFSTR("GatewayAddress");
 const CFStringRef kSCPropNet6to4Relay                              = CFSTR("Relay");
 const CFStringRef kSCPropNetLinkActive                             = CFSTR("Active");
 const CFStringRef kSCPropNetLinkDetaching                          = CFSTR("Detaching");
@@ -276,6 +301,9 @@ const CFStringRef kSCPropNetPPPLCPTransmitACCM                     = CFSTR("LCPT
 const CFStringRef kSCPropNetPPPOnDemandDomains                     = CFSTR("OnDemandDomains");
 const CFStringRef kSCPropNetPPPOnDemandEnabled                     = CFSTR("OnDemandEnabled");
 const CFStringRef kSCPropNetPPPOnDemandHostName                    = CFSTR("OnDemandHostName");
+const CFStringRef kSCPropNetPPPOnDemandMatchDomainsAlways          = CFSTR("OnDemandMatchDomainsAlways");
+const CFStringRef kSCPropNetPPPOnDemandMatchDomainsOnRetry         = CFSTR("OnDemandMatchDomainsOnRetry");
+const CFStringRef kSCPropNetPPPOnDemandMatchDomainsNever           = CFSTR("OnDemandMatchDomainsNever");
 const CFStringRef kSCPropNetPPPOnDemandMode                        = CFSTR("OnDemandMode");
 const CFStringRef kSCPropNetPPPOnDemandPriority                    = CFSTR("OnDemandPriority");
 const CFStringRef kSCValNetPPPOnDemandModeAggressive               = CFSTR("Aggressive");
@@ -312,8 +340,14 @@ const CFStringRef kSCPropNetProxiesSOCKSEnable                     = CFSTR("SOCK
 const CFStringRef kSCPropNetProxiesSOCKSPort                       = CFSTR("SOCKSPort");
 const CFStringRef kSCPropNetProxiesSOCKSProxy                      = CFSTR("SOCKSProxy");
 const CFStringRef kSCPropNetProxiesProxyAutoConfigEnable           = CFSTR("ProxyAutoConfigEnable");
+const CFStringRef kSCPropNetProxiesProxyAutoConfigJavaScript       = CFSTR("ProxyAutoConfigJavaScript");
 const CFStringRef kSCPropNetProxiesProxyAutoConfigURLString        = CFSTR("ProxyAutoConfigURLString");
 const CFStringRef kSCPropNetProxiesProxyAutoDiscoveryEnable        = CFSTR("ProxyAutoDiscoveryEnable");
+const CFStringRef kSCPropNetProxiesSupplementalMatchDomains        = CFSTR("SupplementalMatchDomains");
+const CFStringRef kSCPropNetProxiesSupplementalMatchOrders         = CFSTR("SupplementalMatchOrders");
+const CFStringRef kSCPropNetProxiesScoped                          = CFSTR("__SCOPED__");
+const CFStringRef kSCPropNetProxiesSupplemental                    = CFSTR("__SUPPLEMENTAL__");
+const CFStringRef kSCPropNetProxiesSupplementalMatchDomain         = CFSTR("__MATCH_DOMAIN__");
 const CFStringRef kSCPropNetServicePrimaryRank                     = CFSTR("PrimaryRank");
 const CFStringRef kSCPropNetServiceUserDefinedName                 = CFSTR("UserDefinedName");
 const CFStringRef kSCValNetServicePrimaryRankFirst                 = CFSTR("First");
@@ -332,6 +366,30 @@ const CFStringRef kSCValNetSMBNetBIOSNodeTypeMixed                 = CFSTR("Mixe
 const CFStringRef kSCValNetSMBNetBIOSNodeTypeHybrid                = CFSTR("Hybrid");
 #endif // !TARGET_OS_IPHONE
 
+const CFStringRef kSCPropNetVPNAuthName                            = CFSTR("AuthName");
+const CFStringRef kSCPropNetVPNAuthPassword                        = CFSTR("AuthPassword");
+const CFStringRef kSCPropNetVPNAuthPasswordEncryption              = CFSTR("AuthPasswordEncryption");
+const CFStringRef kSCPropNetVPNAuthenticationMethod                = CFSTR("AuthenticationMethod");
+const CFStringRef kSCPropNetVPNConnectTime                         = CFSTR("ConnectTime");
+const CFStringRef kSCPropNetVPNDisconnectOnFastUserSwitch          = CFSTR("DisconnectOnFastUserSwitch");
+const CFStringRef kSCPropNetVPNDisconnectOnIdle                    = CFSTR("DisconnectOnIdle");
+const CFStringRef kSCPropNetVPNDisconnectOnIdleTimer               = CFSTR("DisconnectOnIdleTimer");
+const CFStringRef kSCPropNetVPNDisconnectOnLogout                  = CFSTR("DisconnectOnLogout");
+const CFStringRef kSCPropNetVPNDisconnectOnSleep                   = CFSTR("DisconnectOnSleep");
+const CFStringRef kSCPropNetVPNLocalCertificate                    = CFSTR("LocalCertificate");
+const CFStringRef kSCPropNetVPNLogfile                             = CFSTR("Logfile");
+const CFStringRef kSCPropNetVPNMTU                                 = CFSTR("MTU");
+const CFStringRef kSCPropNetVPNOnDemandEnabled                     = CFSTR("OnDemandEnabled");
+const CFStringRef kSCPropNetVPNOnDemandMatchDomainsAlways          = CFSTR("OnDemandMatchDomainsAlways");
+const CFStringRef kSCPropNetVPNOnDemandMatchDomainsOnRetry         = CFSTR("OnDemandMatchDomainsOnRetry");
+const CFStringRef kSCPropNetVPNOnDemandMatchDomainsNever           = CFSTR("OnDemandMatchDomainsNever");
+const CFStringRef kSCPropNetVPNRemoteAddress                       = CFSTR("RemoteAddress");
+const CFStringRef kSCPropNetVPNStatus                              = CFSTR("Status");
+const CFStringRef kSCPropNetVPNVerboseLogging                      = CFSTR("VerboseLogging");
+const CFStringRef kSCValNetVPNAuthenticationMethodPassword         = CFSTR("Password");
+const CFStringRef kSCValNetVPNAuthenticationMethodCertificate      = CFSTR("Certificate");
+const CFStringRef kSCValNetVPNAuthPasswordEncryptionKeychain       = CFSTR("Keychain");
+const CFStringRef kSCValNetVPNAuthPasswordEncryptionPrompt         = CFSTR("Prompt");
 
 #if !TARGET_OS_IPHONE
 const CFStringRef kSCEntUsersConsoleUser                           = CFSTR("ConsoleUser");
@@ -352,16 +410,14 @@ const CFStringRef kSCDynamicStorePropNetInterfaces                 = CFSTR("Inte
 const CFStringRef kSCDynamicStorePropNetPrimaryInterface           = CFSTR("PrimaryInterface");
 const CFStringRef kSCDynamicStorePropNetPrimaryService             = CFSTR("PrimaryService");
 const CFStringRef kSCDynamicStorePropNetServiceIDs                 = CFSTR("ServiceIDs");
-
-#if !TARGET_OS_IPHONE
 const CFStringRef kSCPropVirtualNetworkInterfacesBondInterfaces    = CFSTR("Interfaces");
 const CFStringRef kSCPropVirtualNetworkInterfacesBondMode          = CFSTR("Mode");
 const CFStringRef kSCPropVirtualNetworkInterfacesBondOptions       = CFSTR("Options");
+const CFStringRef kSCPropVirtualNetworkInterfacesBridgeInterfaces  = CFSTR("Interfaces");
+const CFStringRef kSCPropVirtualNetworkInterfacesBridgeOptions     = CFSTR("Options");
 const CFStringRef kSCPropVirtualNetworkInterfacesVLANInterface     = CFSTR("Interface");
 const CFStringRef kSCPropVirtualNetworkInterfacesVLANTag           = CFSTR("Tag");
 const CFStringRef kSCPropVirtualNetworkInterfacesVLANOptions       = CFSTR("Options");
-#endif // !TARGET_OS_IPHONE
-
 
 #if !TARGET_OS_IPHONE
 const CFStringRef kSCPropUsersConsoleUserName                      = CFSTR("Name");
diff --git a/SystemConfiguration.fproj/SCSchemaDefinitions.h b/SystemConfiguration.fproj/SCSchemaDefinitions.h
index 5089eca..22e2b0b 100644
--- a/SystemConfiguration.fproj/SCSchemaDefinitions.h
+++ b/SystemConfiguration.fproj/SCSchemaDefinitions.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -220,6 +220,7 @@
  *
  *   --- kSCPropNetIPv6ConfigMethod values ---
  *   kSCValNetIPv6ConfigMethodAutomatic                 "Automatic"
+ *   kSCValNetIPv6ConfigMethodLinkLocal                 "LinkLocal"
  *   kSCValNetIPv6ConfigMethodManual                    "Manual"
  *   kSCValNetIPv6ConfigMethodRouterAdvertisement       "RouterAdvertisement"
  *   kSCValNetIPv6ConfigMethod6to4                      "6to4"
@@ -386,6 +387,7 @@
  *   kSCPropNetProxiesSOCKSPort                         "SOCKSPort"                    CFNumber
  *   kSCPropNetProxiesSOCKSProxy                        "SOCKSProxy"                   CFString
  *   kSCPropNetProxiesProxyAutoConfigEnable             "ProxyAutoConfigEnable"        CFNumber (0 or 1)
+ *   kSCPropNetProxiesProxyAutoConfigJavaScript         "ProxyAutoConfigJavaScript"    CFString
  *   kSCPropNetProxiesProxyAutoConfigURLString          "ProxyAutoConfigURLString"     CFString
  *   kSCPropNetProxiesProxyAutoDiscoveryEnable          "ProxyAutoDiscoveryEnable"     CFNumber (0 or 1)
  *
@@ -483,23 +485,6 @@
 #include <Availability.h>
 #include <TargetConditionals.h>
 
-/*
- * let's "do the right thing" for those wishing to build for
- * Mac OS X 10.1.0 ... 10.2.x
- */
-#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && (__MAC_OS_X_VERSION_MIN_REQUIRED <= 1020) && !defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
-  #ifndef SCSTR
-    #include <CoreFoundation/CFString.h>
-    #define SCSTR(s) CFSTR(s)
-  #endif
-  #ifndef SC_SCHEMA_DECLARATION
-    #define SC_SCHEMA_DECLARATION(k,q)	extern const CFStringRef k q;
-  #endif
-  #ifndef SC_SCHEMA_KV
-    #define SC_SCHEMA_KV(k,v,t)	SCSTR( v )
-  #endif
-#endif
-
 /*
  * Define a schema key/value/type tuple
  */
@@ -519,14 +504,6 @@
     #define SC_SCHEMA_DECLARATION(k,q)	extern NSString * k q;
   #endif
 #endif
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) && (__MAC_OS_X_VERSION_MAX_ALLOWED <= 1040) && !defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
-  #ifndef SCSTR
-    #include <CoreFoundation/CFString.h>
-    #define SCSTR(s) CFSTR(s)
-  #endif
-#endif
-
-
 /* -------------------- HeaderDoc comments -------------------- */
 
 
@@ -1417,6 +1394,12 @@ extern const CFStringRef kSCPropNetIPv6Router;
  */
 extern const CFStringRef kSCValNetIPv6ConfigMethodAutomatic;
 
+/*!
+  @const kSCValNetIPv6ConfigMethodLinkLocal
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCValNetIPv6ConfigMethodLinkLocal;
+
 /*!
   @const kSCValNetIPv6ConfigMethodManual
   @availability Introduced in Mac OS X 10.3.
@@ -2189,6 +2172,12 @@ extern const CFStringRef kSCPropNetProxiesSOCKSProxy;
  */
 extern const CFStringRef kSCPropNetProxiesProxyAutoConfigEnable;
 
+/*!
+  @const kSCPropNetProxiesProxyAutoConfigJavaScript
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetProxiesProxyAutoConfigJavaScript;
+
 /*!
   @const kSCPropNetProxiesProxyAutoConfigURLString
   @availability Introduced in Mac OS X 10.4.
@@ -2219,7 +2208,7 @@ extern const CFStringRef kSCPropNetSMBNetBIOSNodeType;
 
 /*!
   @const kSCPropNetSMBNetBIOSScope
-  @availability Introduced in Mac OS X 10.5.
+  @availability Introduced in Mac OS X 10.5, but later deprecated in Mac OS X 10.7.
  */
 extern const CFStringRef kSCPropNetSMBNetBIOSScope;
 
@@ -2388,2330 +2377,1768 @@ extern const CFStringRef kSCPropUsersConsoleUserGID;
 
 
   SC_SCHEMA_DECLARATION(kSCResvLink, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCResvLink                                                   \
 	  SC_SCHEMA_KV(kSCResvLink                                      \
 		      ,"__LINK__"                                       \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCResvInactive, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCResvInactive                                               \
 	  SC_SCHEMA_KV(kSCResvInactive                                  \
 		      ,"__INACTIVE__"                                   \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropInterfaceName, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropInterfaceName                                          \
 	  SC_SCHEMA_KV(kSCPropInterfaceName                             \
 		      ,"InterfaceName"                                  \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropMACAddress, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropMACAddress                                             \
 	  SC_SCHEMA_KV(kSCPropMACAddress                                \
 		      ,"MACAddress"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropUserDefinedName, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropUserDefinedName                                        \
 	  SC_SCHEMA_KV(kSCPropUserDefinedName                           \
 		      ,"UserDefinedName"                                \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropVersion, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropVersion                                                \
 	  SC_SCHEMA_KV(kSCPropVersion                                   \
 		      ,"Version"                                        \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPrefCurrentSet, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPrefCurrentSet                                             \
 	  SC_SCHEMA_KV(kSCPrefCurrentSet                                \
 		      ,"CurrentSet"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPrefNetworkServices, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPrefNetworkServices                                        \
 	  SC_SCHEMA_KV(kSCPrefNetworkServices                           \
 		      ,"NetworkServices"                                \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPrefSets, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPrefSets                                                   \
 	  SC_SCHEMA_KV(kSCPrefSets                                      \
 		      ,"Sets"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPrefSystem, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPrefSystem                                                 \
 	  SC_SCHEMA_KV(kSCPrefSystem                                    \
 		      ,"System"                                         \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompNetwork, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompNetwork                                                \
 	  SC_SCHEMA_KV(kSCCompNetwork                                   \
 		      ,"Network"                                        \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompService, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompService                                                \
 	  SC_SCHEMA_KV(kSCCompService                                   \
 		      ,"Service"                                        \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompGlobal, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompGlobal                                                 \
 	  SC_SCHEMA_KV(kSCCompGlobal                                    \
 		      ,"Global"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompHostNames, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompHostNames                                              \
 	  SC_SCHEMA_KV(kSCCompHostNames                                 \
 		      ,"HostNames"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompInterface, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompInterface                                              \
 	  SC_SCHEMA_KV(kSCCompInterface                                 \
 		      ,"Interface"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompSystem, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompSystem                                                 \
 	  SC_SCHEMA_KV(kSCCompSystem                                    \
 		      ,"System"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompUsers, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompUsers                                                  \
 	  SC_SCHEMA_KV(kSCCompUsers                                     \
 		      ,"Users"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCCompAnyRegex, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCCompAnyRegex                                               \
 	  SC_SCHEMA_KV(kSCCompAnyRegex                                  \
 		      ,"[^/]+"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetAirPort, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetAirPort                                              \
 	  SC_SCHEMA_KV(kSCEntNetAirPort                                 \
 		      ,"AirPort"                                        \
 		      ,CFDictionary                                     )
-#endif
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCEntNetAppleTalk, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCEntNetAppleTalk                                            \
 	  SC_SCHEMA_KV(kSCEntNetAppleTalk                               \
 		      ,"AppleTalk"                                      \
 		      ,CFDictionary                                     )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCEntNetDHCP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetDHCP                                                 \
 	  SC_SCHEMA_KV(kSCEntNetDHCP                                    \
 		      ,"DHCP"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetDNS, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetDNS                                                  \
 	  SC_SCHEMA_KV(kSCEntNetDNS                                     \
 		      ,"DNS"                                            \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetEthernet, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetEthernet                                             \
 	  SC_SCHEMA_KV(kSCEntNetEthernet                                \
 		      ,"Ethernet"                                       \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetFireWire, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetFireWire                                             \
 	  SC_SCHEMA_KV(kSCEntNetFireWire                                \
 		      ,"FireWire"                                       \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetInterface, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetInterface                                            \
 	  SC_SCHEMA_KV(kSCEntNetInterface                               \
 		      ,"Interface"                                      \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetIPSec, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetIPSec                                                \
 	  SC_SCHEMA_KV(kSCEntNetIPSec                                   \
 		      ,"IPSec"                                          \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetIPv4, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetIPv4                                                 \
 	  SC_SCHEMA_KV(kSCEntNetIPv4                                    \
 		      ,"IPv4"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetIPv6, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetIPv6                                                 \
 	  SC_SCHEMA_KV(kSCEntNetIPv6                                    \
 		      ,"IPv6"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetL2TP, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetL2TP                                                 \
 	  SC_SCHEMA_KV(kSCEntNetL2TP                                    \
 		      ,"L2TP"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetLink, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetLink                                                 \
 	  SC_SCHEMA_KV(kSCEntNetLink                                    \
 		      ,"Link"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetModem, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetModem                                                \
 	  SC_SCHEMA_KV(kSCEntNetModem                                   \
 		      ,"Modem"                                          \
 		      ,CFDictionary                                     )
-#endif
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCEntNetNetInfo, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCEntNetNetInfo                                              \
 	  SC_SCHEMA_KV(kSCEntNetNetInfo                                 \
 		      ,"NetInfo"                                        \
 		      ,CFDictionary                                     )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCEntNetPPP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetPPP                                                  \
 	  SC_SCHEMA_KV(kSCEntNetPPP                                     \
 		      ,"PPP"                                            \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetPPPoE, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetPPPoE                                                \
 	  SC_SCHEMA_KV(kSCEntNetPPPoE                                   \
 		      ,"PPPoE"                                          \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetPPPSerial, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetPPPSerial                                            \
 	  SC_SCHEMA_KV(kSCEntNetPPPSerial                               \
 		      ,"PPPSerial"                                      \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetPPTP, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetPPTP                                                 \
 	  SC_SCHEMA_KV(kSCEntNetPPTP                                    \
 		      ,"PPTP"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetProxies, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetProxies                                              \
 	  SC_SCHEMA_KV(kSCEntNetProxies                                 \
 		      ,"Proxies"                                        \
 		      ,CFDictionary                                     )
-#endif
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCEntNetSMB, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetSMB                                                  \
 	  SC_SCHEMA_KV(kSCEntNetSMB                                     \
 		      ,"SMB"                                            \
 		      ,CFDictionary                                     )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCEntNet6to4, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNet6to4                                                 \
 	  SC_SCHEMA_KV(kSCEntNet6to4                                    \
 		      ,"6to4"                                           \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetOverridePrimary, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetOverridePrimary                                     \
 	  SC_SCHEMA_KV(kSCPropNetOverridePrimary                        \
 		      ,"OverridePrimary"                                \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetServiceOrder, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetServiceOrder                                        \
 	  SC_SCHEMA_KV(kSCPropNetServiceOrder                           \
 		      ,"ServiceOrder"                                   \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPOverridePrimary, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPOverridePrimary                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPOverridePrimary                     \
 		      ,"PPPOverridePrimary"                             \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetInterfaces, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetInterfaces                                          \
 	  SC_SCHEMA_KV(kSCPropNetInterfaces                             \
 		      ,"Interfaces"                                     \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetLocalHostName, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetLocalHostName                                       \
 	  SC_SCHEMA_KV(kSCPropNetLocalHostName                          \
 		      ,"LocalHostName"                                  \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAirPortAllowNetCreation, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetAirPortAllowNetCreation                             \
 	  SC_SCHEMA_KV(kSCPropNetAirPortAllowNetCreation                \
 		      ,"AllowNetCreation"                               \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAirPortAuthPassword, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetAirPortAuthPassword                                 \
 	  SC_SCHEMA_KV(kSCPropNetAirPortAuthPassword                    \
 		      ,"AuthPassword"                                   \
 		      ,CFData                                           )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAirPortAuthPasswordEncryption, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetAirPortAuthPasswordEncryption                       \
 	  SC_SCHEMA_KV(kSCPropNetAirPortAuthPasswordEncryption          \
 		      ,"AuthPasswordEncryption"                         \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAirPortJoinMode, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetAirPortJoinMode                                     \
 	  SC_SCHEMA_KV(kSCPropNetAirPortJoinMode                        \
 		      ,"JoinMode"                                       \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAirPortPowerEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetAirPortPowerEnabled                                 \
 	  SC_SCHEMA_KV(kSCPropNetAirPortPowerEnabled                    \
 		      ,"PowerEnabled"                                   \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAirPortPreferredNetwork, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetAirPortPreferredNetwork                             \
 	  SC_SCHEMA_KV(kSCPropNetAirPortPreferredNetwork                \
 		      ,"PreferredNetwork"                               \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAirPortSavePasswords, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetAirPortSavePasswords                                \
 	  SC_SCHEMA_KV(kSCPropNetAirPortSavePasswords                   \
 		      ,"SavePasswords"                                  \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAirPortJoinModeAutomatic, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetAirPortJoinModeAutomatic                             \
 	  SC_SCHEMA_KV(kSCValNetAirPortJoinModeAutomatic                \
 		      ,"Automatic"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAirPortJoinModePreferred, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetAirPortJoinModePreferred                             \
 	  SC_SCHEMA_KV(kSCValNetAirPortJoinModePreferred                \
 		      ,"Preferred"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAirPortJoinModeRanked, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetAirPortJoinModeRanked                                \
 	  SC_SCHEMA_KV(kSCValNetAirPortJoinModeRanked                   \
 		      ,"Ranked"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAirPortJoinModeRecent, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetAirPortJoinModeRecent                                \
 	  SC_SCHEMA_KV(kSCValNetAirPortJoinModeRecent                   \
 		      ,"Recent"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAirPortJoinModeStrongest, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetAirPortJoinModeStrongest                             \
 	  SC_SCHEMA_KV(kSCValNetAirPortJoinModeStrongest                \
 		      ,"Strongest"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAirPortAuthPasswordEncryptionKeychain, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetAirPortAuthPasswordEncryptionKeychain                \
 	  SC_SCHEMA_KV(kSCValNetAirPortAuthPasswordEncryptionKeychain   \
 		      ,"Keychain"                                       \
 		      ,                                                 )
-#endif
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkComputerName, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkComputerName                               \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkComputerName                  \
 		      ,"ComputerName"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkComputerNameEncoding, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkComputerNameEncoding                       \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkComputerNameEncoding          \
 		      ,"ComputerNameEncoding"                           \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkConfigMethod, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkConfigMethod                               \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkConfigMethod                  \
 		      ,"ConfigMethod"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkDefaultZone, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkDefaultZone                                \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkDefaultZone                   \
 		      ,"DefaultZone"                                    \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkNetworkID, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkNetworkID                                  \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkNetworkID                     \
 		      ,"NetworkID"                                      \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkNetworkRange, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020)
   #define kSCPropNetAppleTalkNetworkRange                               \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkNetworkRange                  \
 		      ,"NetworkRange"                                   \
 		      ,CFArray[CFNumber]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkNodeID, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkNodeID                                     \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkNodeID                        \
 		      ,"NodeID"                                         \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkSeedNetworkRange, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkSeedNetworkRange                           \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkSeedNetworkRange              \
 		      ,"SeedNetworkRange"                               \
 		      ,CFArray[CFNumber]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetAppleTalkSeedZones, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetAppleTalkSeedZones                                  \
 	  SC_SCHEMA_KV(kSCPropNetAppleTalkSeedZones                     \
 		      ,"SeedZones"                                      \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAppleTalkConfigMethodNode, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCValNetAppleTalkConfigMethodNode                            \
 	  SC_SCHEMA_KV(kSCValNetAppleTalkConfigMethodNode               \
 		      ,"Node"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAppleTalkConfigMethodRouter, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCValNetAppleTalkConfigMethodRouter                          \
 	  SC_SCHEMA_KV(kSCValNetAppleTalkConfigMethodRouter             \
 		      ,"Router"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetAppleTalkConfigMethodSeedRouter, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_6,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCValNetAppleTalkConfigMethodSeedRouter                      \
 	  SC_SCHEMA_KV(kSCValNetAppleTalkConfigMethodSeedRouter         \
 		      ,"SeedRouter"                                     \
 		      ,                                                 )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSDomainName, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSDomainName                                       \
 	  SC_SCHEMA_KV(kSCPropNetDNSDomainName                          \
 		      ,"DomainName"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSOptions, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSOptions                                          \
 	  SC_SCHEMA_KV(kSCPropNetDNSOptions                             \
 		      ,"Options"                                        \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSSearchDomains, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSSearchDomains                                    \
 	  SC_SCHEMA_KV(kSCPropNetDNSSearchDomains                       \
 		      ,"SearchDomains"                                  \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSSearchOrder, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSSearchOrder                                      \
 	  SC_SCHEMA_KV(kSCPropNetDNSSearchOrder                         \
 		      ,"SearchOrder"                                    \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSServerAddresses, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSServerAddresses                                  \
 	  SC_SCHEMA_KV(kSCPropNetDNSServerAddresses                     \
 		      ,"ServerAddresses"                                \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSServerPort, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSServerPort                                       \
 	  SC_SCHEMA_KV(kSCPropNetDNSServerPort                          \
 		      ,"ServerPort"                                     \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSServerTimeout, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSServerTimeout                                    \
 	  SC_SCHEMA_KV(kSCPropNetDNSServerTimeout                       \
 		      ,"ServerTimeout"                                  \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSSortList, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSSortList                                         \
 	  SC_SCHEMA_KV(kSCPropNetDNSSortList                            \
 		      ,"SortList"                                       \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSSupplementalMatchDomains, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSSupplementalMatchDomains                         \
 	  SC_SCHEMA_KV(kSCPropNetDNSSupplementalMatchDomains            \
 		      ,"SupplementalMatchDomains"                       \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetDNSSupplementalMatchOrders, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetDNSSupplementalMatchOrders                          \
 	  SC_SCHEMA_KV(kSCPropNetDNSSupplementalMatchOrders             \
 		      ,"SupplementalMatchOrders"                        \
 		      ,CFArray[CFNumber]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetEthernetMediaSubType, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetEthernetMediaSubType                                \
 	  SC_SCHEMA_KV(kSCPropNetEthernetMediaSubType                   \
 		      ,"MediaSubType"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetEthernetMediaOptions, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetEthernetMediaOptions                                \
 	  SC_SCHEMA_KV(kSCPropNetEthernetMediaOptions                   \
 		      ,"MediaOptions"                                   \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetEthernetMTU, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetEthernetMTU                                         \
 	  SC_SCHEMA_KV(kSCPropNetEthernetMTU                            \
 		      ,"MTU"                                            \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetInterfaceDeviceName, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetInterfaceDeviceName                                 \
 	  SC_SCHEMA_KV(kSCPropNetInterfaceDeviceName                    \
 		      ,"DeviceName"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetInterfaceHardware, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetInterfaceHardware                                   \
 	  SC_SCHEMA_KV(kSCPropNetInterfaceHardware                      \
 		      ,"Hardware"                                       \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetInterfaceType, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetInterfaceType                                       \
 	  SC_SCHEMA_KV(kSCPropNetInterfaceType                          \
 		      ,"Type"                                           \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetInterfaceSubType, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetInterfaceSubType                                    \
 	  SC_SCHEMA_KV(kSCPropNetInterfaceSubType                       \
 		      ,"SubType"                                        \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetInterfaceSupportsModemOnHold, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetInterfaceSupportsModemOnHold                        \
 	  SC_SCHEMA_KV(kSCPropNetInterfaceSupportsModemOnHold           \
 		      ,"SupportsModemOnHold"                            \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceTypeEthernet, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceTypeEthernet                                \
 	  SC_SCHEMA_KV(kSCValNetInterfaceTypeEthernet                   \
 		      ,"Ethernet"                                       \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceTypeFireWire, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceTypeFireWire                                \
 	  SC_SCHEMA_KV(kSCValNetInterfaceTypeFireWire                   \
 		      ,"FireWire"                                       \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceTypePPP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceTypePPP                                     \
 	  SC_SCHEMA_KV(kSCValNetInterfaceTypePPP                        \
 		      ,"PPP"                                            \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceType6to4, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceType6to4                                    \
 	  SC_SCHEMA_KV(kSCValNetInterfaceType6to4                       \
 		      ,"6to4"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceTypeIPSec, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceTypeIPSec                                   \
 	  SC_SCHEMA_KV(kSCValNetInterfaceTypeIPSec                      \
 		      ,"IPSec"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceSubTypePPPoE, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceSubTypePPPoE                                \
 	  SC_SCHEMA_KV(kSCValNetInterfaceSubTypePPPoE                   \
 		      ,"PPPoE"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceSubTypePPPSerial, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceSubTypePPPSerial                            \
 	  SC_SCHEMA_KV(kSCValNetInterfaceSubTypePPPSerial               \
 		      ,"PPPSerial"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceSubTypePPTP, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceSubTypePPTP                                 \
 	  SC_SCHEMA_KV(kSCValNetInterfaceSubTypePPTP                    \
 		      ,"PPTP"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetInterfaceSubTypeL2TP, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetInterfaceSubTypeL2TP                                 \
 	  SC_SCHEMA_KV(kSCValNetInterfaceSubTypeL2TP                    \
 		      ,"L2TP"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecAuthenticationMethod, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecAuthenticationMethod                           \
 	  SC_SCHEMA_KV(kSCPropNetIPSecAuthenticationMethod              \
 		      ,"AuthenticationMethod"                           \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecLocalCertificate, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecLocalCertificate                               \
 	  SC_SCHEMA_KV(kSCPropNetIPSecLocalCertificate                  \
 		      ,"LocalCertificate"                               \
 		      ,CFData                                           )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecLocalIdentifier, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecLocalIdentifier                                \
 	  SC_SCHEMA_KV(kSCPropNetIPSecLocalIdentifier                   \
 		      ,"LocalIdentifier"                                \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecLocalIdentifierType, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecLocalIdentifierType                            \
 	  SC_SCHEMA_KV(kSCPropNetIPSecLocalIdentifierType               \
 		      ,"LocalIdentifierType"                            \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecSharedSecret, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecSharedSecret                                   \
 	  SC_SCHEMA_KV(kSCPropNetIPSecSharedSecret                      \
 		      ,"SharedSecret"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecSharedSecretEncryption, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecSharedSecretEncryption                         \
 	  SC_SCHEMA_KV(kSCPropNetIPSecSharedSecretEncryption            \
 		      ,"SharedSecretEncryption"                         \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecConnectTime, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecConnectTime                                    \
 	  SC_SCHEMA_KV(kSCPropNetIPSecConnectTime                       \
 		      ,"ConnectTime"                                    \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecRemoteAddress, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecRemoteAddress                                  \
 	  SC_SCHEMA_KV(kSCPropNetIPSecRemoteAddress                     \
 		      ,"RemoteAddress"                                  \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecStatus, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecStatus                                         \
 	  SC_SCHEMA_KV(kSCPropNetIPSecStatus                            \
 		      ,"Status"                                         \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecXAuthEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecXAuthEnabled                                   \
 	  SC_SCHEMA_KV(kSCPropNetIPSecXAuthEnabled                      \
 		      ,"XAuthEnabled"                                   \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecXAuthName, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecXAuthName                                      \
 	  SC_SCHEMA_KV(kSCPropNetIPSecXAuthName                         \
 		      ,"XAuthName"                                      \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecXAuthPassword, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecXAuthPassword                                  \
 	  SC_SCHEMA_KV(kSCPropNetIPSecXAuthPassword                     \
 		      ,"XAuthPassword"                                  \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecXAuthPasswordEncryption, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPSecXAuthPasswordEncryption                        \
 	  SC_SCHEMA_KV(kSCPropNetIPSecXAuthPasswordEncryption           \
 		      ,"XAuthPasswordEncryption"                        \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPSecAuthenticationMethodSharedSecret, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPSecAuthenticationMethodSharedSecret                \
 	  SC_SCHEMA_KV(kSCValNetIPSecAuthenticationMethodSharedSecret   \
 		      ,"SharedSecret"                                   \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPSecAuthenticationMethodCertificate, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPSecAuthenticationMethodCertificate                 \
 	  SC_SCHEMA_KV(kSCValNetIPSecAuthenticationMethodCertificate    \
 		      ,"Certificate"                                    \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPSecAuthenticationMethodHybrid, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPSecAuthenticationMethodHybrid                      \
 	  SC_SCHEMA_KV(kSCValNetIPSecAuthenticationMethodHybrid         \
 		      ,"Hybrid"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPSecLocalIdentifierTypeKeyID, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPSecLocalIdentifierTypeKeyID                        \
 	  SC_SCHEMA_KV(kSCValNetIPSecLocalIdentifierTypeKeyID           \
 		      ,"KeyID"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPSecSharedSecretEncryptionKeychain, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPSecSharedSecretEncryptionKeychain                  \
 	  SC_SCHEMA_KV(kSCValNetIPSecSharedSecretEncryptionKeychain     \
 		      ,"Keychain"                                       \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPSecXAuthPasswordEncryptionKeychain, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPSecXAuthPasswordEncryptionKeychain                 \
 	  SC_SCHEMA_KV(kSCValNetIPSecXAuthPasswordEncryptionKeychain    \
 		      ,"Keychain"                                       \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPSecXAuthPasswordEncryptionPrompt, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/
   #define kSCValNetIPSecXAuthPasswordEncryptionPrompt                   \
 	  SC_SCHEMA_KV(kSCValNetIPSecXAuthPasswordEncryptionPrompt      \
 		      ,"Prompt"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv4Addresses, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv4Addresses                                       \
 	  SC_SCHEMA_KV(kSCPropNetIPv4Addresses                          \
 		      ,"Addresses"                                      \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv4ConfigMethod, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv4ConfigMethod                                    \
 	  SC_SCHEMA_KV(kSCPropNetIPv4ConfigMethod                       \
 		      ,"ConfigMethod"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv4DHCPClientID, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv4DHCPClientID                                    \
 	  SC_SCHEMA_KV(kSCPropNetIPv4DHCPClientID                       \
 		      ,"DHCPClientID"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv4Router, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv4Router                                          \
 	  SC_SCHEMA_KV(kSCPropNetIPv4Router                             \
 		      ,"Router"                                         \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv4SubnetMasks, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv4SubnetMasks                                     \
 	  SC_SCHEMA_KV(kSCPropNetIPv4SubnetMasks                        \
 		      ,"SubnetMasks"                                    \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv4DestAddresses, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv4DestAddresses                                   \
 	  SC_SCHEMA_KV(kSCPropNetIPv4DestAddresses                      \
 		      ,"DestAddresses"                                  \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv4BroadcastAddresses, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv4BroadcastAddresses                              \
 	  SC_SCHEMA_KV(kSCPropNetIPv4BroadcastAddresses                 \
 		      ,"BroadcastAddresses"                             \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodAutomatic, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodAutomatic                            \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodAutomatic               \
 		      ,"Automatic"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodBOOTP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodBOOTP                                \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodBOOTP                   \
 		      ,"BOOTP"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodDHCP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodDHCP                                 \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodDHCP                    \
 		      ,"DHCP"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodINFORM, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodINFORM                               \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodINFORM                  \
 		      ,"INFORM"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodLinkLocal, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodLinkLocal                            \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodLinkLocal               \
 		      ,"LinkLocal"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodManual, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodManual                               \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodManual                  \
 		      ,"Manual"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodPPP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodPPP                                  \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodPPP                     \
 		      ,"PPP"                                            \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv6Addresses, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv6Addresses                                       \
 	  SC_SCHEMA_KV(kSCPropNetIPv6Addresses                          \
 		      ,"Addresses"                                      \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv6ConfigMethod, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv6ConfigMethod                                    \
 	  SC_SCHEMA_KV(kSCPropNetIPv6ConfigMethod                       \
 		      ,"ConfigMethod"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv6DestAddresses, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv6DestAddresses                                   \
 	  SC_SCHEMA_KV(kSCPropNetIPv6DestAddresses                      \
 		      ,"DestAddresses"                                  \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv6Flags, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv6Flags                                           \
 	  SC_SCHEMA_KV(kSCPropNetIPv6Flags                              \
 		      ,"Flags"                                          \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv6PrefixLength, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv6PrefixLength                                    \
 	  SC_SCHEMA_KV(kSCPropNetIPv6PrefixLength                       \
 		      ,"PrefixLength"                                   \
 		      ,CFArray[CFNumber]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPv6Router, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIPv6Router                                          \
 	  SC_SCHEMA_KV(kSCPropNetIPv6Router                             \
 		      ,"Router"                                         \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv6ConfigMethodAutomatic, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv6ConfigMethodAutomatic                            \
 	  SC_SCHEMA_KV(kSCValNetIPv6ConfigMethodAutomatic               \
 		      ,"Automatic"                                      \
 		      ,                                                 )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCValNetIPv6ConfigMethodLinkLocal, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCValNetIPv6ConfigMethodLinkLocal                            \
+	  SC_SCHEMA_KV(kSCValNetIPv6ConfigMethodLinkLocal               \
+		      ,"LinkLocal"                                      \
+		      ,                                                 )
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv6ConfigMethodManual, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv6ConfigMethodManual                               \
 	  SC_SCHEMA_KV(kSCValNetIPv6ConfigMethodManual                  \
 		      ,"Manual"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv6ConfigMethodRouterAdvertisement, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv6ConfigMethodRouterAdvertisement                  \
 	  SC_SCHEMA_KV(kSCValNetIPv6ConfigMethodRouterAdvertisement     \
 		      ,"RouterAdvertisement"                            \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv6ConfigMethod6to4, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv6ConfigMethod6to4                                 \
 	  SC_SCHEMA_KV(kSCValNetIPv6ConfigMethod6to4                    \
 		      ,"6to4"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNet6to4Relay, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNet6to4Relay                                           \
 	  SC_SCHEMA_KV(kSCPropNet6to4Relay                              \
 		      ,"Relay"                                          \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetLinkActive, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetLinkActive                                          \
 	  SC_SCHEMA_KV(kSCPropNetLinkActive                             \
 		      ,"Active"                                         \
 		      ,CFBoolean                                        )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetLinkDetaching, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetLinkDetaching                                       \
 	  SC_SCHEMA_KV(kSCPropNetLinkDetaching                          \
 		      ,"Detaching"                                      \
 		      ,CFBoolean                                        )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemAccessPointName, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemAccessPointName                                \
 	  SC_SCHEMA_KV(kSCPropNetModemAccessPointName                   \
 		      ,"AccessPointName"                                \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemConnectionPersonality, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemConnectionPersonality                          \
 	  SC_SCHEMA_KV(kSCPropNetModemConnectionPersonality             \
 		      ,"ConnectionPersonality"                          \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemConnectionScript, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemConnectionScript                               \
 	  SC_SCHEMA_KV(kSCPropNetModemConnectionScript                  \
 		      ,"ConnectionScript"                               \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemConnectSpeed, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemConnectSpeed                                   \
 	  SC_SCHEMA_KV(kSCPropNetModemConnectSpeed                      \
 		      ,"ConnectSpeed"                                   \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemDataCompression, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemDataCompression                                \
 	  SC_SCHEMA_KV(kSCPropNetModemDataCompression                   \
 		      ,"DataCompression"                                \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemDeviceContextID, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemDeviceContextID                                \
 	  SC_SCHEMA_KV(kSCPropNetModemDeviceContextID                   \
 		      ,"DeviceContextID"                                \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemDeviceModel, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemDeviceModel                                    \
 	  SC_SCHEMA_KV(kSCPropNetModemDeviceModel                       \
 		      ,"DeviceModel"                                    \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemDeviceVendor, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemDeviceVendor                                   \
 	  SC_SCHEMA_KV(kSCPropNetModemDeviceVendor                      \
 		      ,"DeviceVendor"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemDialMode, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemDialMode                                       \
 	  SC_SCHEMA_KV(kSCPropNetModemDialMode                          \
 		      ,"DialMode"                                       \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemErrorCorrection, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemErrorCorrection                                \
 	  SC_SCHEMA_KV(kSCPropNetModemErrorCorrection                   \
 		      ,"ErrorCorrection"                                \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemHoldCallWaitingAudibleAlert, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemHoldCallWaitingAudibleAlert                    \
 	  SC_SCHEMA_KV(kSCPropNetModemHoldCallWaitingAudibleAlert       \
 		      ,"HoldCallWaitingAudibleAlert"                    \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemHoldDisconnectOnAnswer, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemHoldDisconnectOnAnswer                         \
 	  SC_SCHEMA_KV(kSCPropNetModemHoldDisconnectOnAnswer            \
 		      ,"HoldDisconnectOnAnswer"                         \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemHoldEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemHoldEnabled                                    \
 	  SC_SCHEMA_KV(kSCPropNetModemHoldEnabled                       \
 		      ,"HoldEnabled"                                    \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemHoldReminder, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemHoldReminder                                   \
 	  SC_SCHEMA_KV(kSCPropNetModemHoldReminder                      \
 		      ,"HoldReminder"                                   \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemHoldReminderTime, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemHoldReminderTime                               \
 	  SC_SCHEMA_KV(kSCPropNetModemHoldReminderTime                  \
 		      ,"HoldReminderTime"                               \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemNote, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemNote                                           \
 	  SC_SCHEMA_KV(kSCPropNetModemNote                              \
 		      ,"Note"                                           \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemPulseDial, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemPulseDial                                      \
 	  SC_SCHEMA_KV(kSCPropNetModemPulseDial                         \
 		      ,"PulseDial"                                      \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemSpeaker, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemSpeaker                                        \
 	  SC_SCHEMA_KV(kSCPropNetModemSpeaker                           \
 		      ,"Speaker"                                        \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetModemSpeed, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetModemSpeed                                          \
 	  SC_SCHEMA_KV(kSCPropNetModemSpeed                             \
 		      ,"Speed"                                          \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetModemDialModeIgnoreDialTone, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetModemDialModeIgnoreDialTone                          \
 	  SC_SCHEMA_KV(kSCValNetModemDialModeIgnoreDialTone             \
 		      ,"IgnoreDialTone"                                 \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetModemDialModeManual, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetModemDialModeManual                                  \
 	  SC_SCHEMA_KV(kSCValNetModemDialModeManual                     \
 		      ,"Manual"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetModemDialModeWaitForDialTone, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetModemDialModeWaitForDialTone                         \
 	  SC_SCHEMA_KV(kSCValNetModemDialModeWaitForDialTone            \
 		      ,"WaitForDialTone"                                \
 		      ,                                                 )
-#endif
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropNetNetInfoBindingMethods, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetNetInfoBindingMethods                               \
 	  SC_SCHEMA_KV(kSCPropNetNetInfoBindingMethods                  \
 		      ,"BindingMethods"                                 \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetNetInfoServerAddresses, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetNetInfoServerAddresses                              \
 	  SC_SCHEMA_KV(kSCPropNetNetInfoServerAddresses                 \
 		      ,"ServerAddresses"                                \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetNetInfoServerTags, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetNetInfoServerTags                                   \
 	  SC_SCHEMA_KV(kSCPropNetNetInfoServerTags                      \
 		      ,"ServerTags"                                     \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetNetInfoBroadcastServerTag, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropNetNetInfoBroadcastServerTag                           \
 	  SC_SCHEMA_KV(kSCPropNetNetInfoBroadcastServerTag              \
 		      ,"BroadcastServerTag"                             \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetNetInfoBindingMethodsBroadcast, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCValNetNetInfoBindingMethodsBroadcast                       \
 	  SC_SCHEMA_KV(kSCValNetNetInfoBindingMethodsBroadcast          \
 		      ,"Broadcast"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetNetInfoBindingMethodsDHCP, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCValNetNetInfoBindingMethodsDHCP                            \
 	  SC_SCHEMA_KV(kSCValNetNetInfoBindingMethodsDHCP               \
 		      ,"DHCP"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetNetInfoBindingMethodsManual, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCValNetNetInfoBindingMethodsManual                          \
 	  SC_SCHEMA_KV(kSCValNetNetInfoBindingMethodsManual             \
 		      ,"Manual"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetNetInfoDefaultServerTag, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCValNetNetInfoDefaultServerTag                              \
 	  SC_SCHEMA_KV(kSCValNetNetInfoDefaultServerTag                 \
 		      ,"network"                                        \
 		      ,                                                 )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPACSPEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPACSPEnabled                                      \
 	  SC_SCHEMA_KV(kSCPropNetPPPACSPEnabled                         \
 		      ,"ACSPEnabled"                                    \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPConnectTime, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPConnectTime                                      \
 	  SC_SCHEMA_KV(kSCPropNetPPPConnectTime                         \
 		      ,"ConnectTime"                                    \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDeviceLastCause, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDeviceLastCause                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPDeviceLastCause                     \
 		      ,"DeviceLastCause"                                \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDialOnDemand, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDialOnDemand                                     \
 	  SC_SCHEMA_KV(kSCPropNetPPPDialOnDemand                        \
 		      ,"DialOnDemand"                                   \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDisconnectOnFastUserSwitch, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDisconnectOnFastUserSwitch                       \
 	  SC_SCHEMA_KV(kSCPropNetPPPDisconnectOnFastUserSwitch          \
 		      ,"DisconnectOnFastUserSwitch"                     \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDisconnectOnIdle, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDisconnectOnIdle                                 \
 	  SC_SCHEMA_KV(kSCPropNetPPPDisconnectOnIdle                    \
 		      ,"DisconnectOnIdle"                               \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDisconnectOnIdleTimer, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDisconnectOnIdleTimer                            \
 	  SC_SCHEMA_KV(kSCPropNetPPPDisconnectOnIdleTimer               \
 		      ,"DisconnectOnIdleTimer"                          \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDisconnectOnLogout, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDisconnectOnLogout                               \
 	  SC_SCHEMA_KV(kSCPropNetPPPDisconnectOnLogout                  \
 		      ,"DisconnectOnLogout"                             \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDisconnectOnSleep, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDisconnectOnSleep                                \
 	  SC_SCHEMA_KV(kSCPropNetPPPDisconnectOnSleep                   \
 		      ,"DisconnectOnSleep"                              \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPDisconnectTime, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPDisconnectTime                                   \
 	  SC_SCHEMA_KV(kSCPropNetPPPDisconnectTime                      \
 		      ,"DisconnectTime"                                 \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPIdleReminderTimer, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPIdleReminderTimer                                \
 	  SC_SCHEMA_KV(kSCPropNetPPPIdleReminderTimer                   \
 		      ,"IdleReminderTimer"                              \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPIdleReminder, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPIdleReminder                                     \
 	  SC_SCHEMA_KV(kSCPropNetPPPIdleReminder                        \
 		      ,"IdleReminder"                                   \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLastCause, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLastCause                                        \
 	  SC_SCHEMA_KV(kSCPropNetPPPLastCause                           \
 		      ,"LastCause"                                      \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLogfile, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLogfile                                          \
 	  SC_SCHEMA_KV(kSCPropNetPPPLogfile                             \
 		      ,"Logfile"                                        \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPPlugins, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPPlugins                                          \
 	  SC_SCHEMA_KV(kSCPropNetPPPPlugins                             \
 		      ,"Plugins"                                        \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPRetryConnectTime, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPRetryConnectTime                                 \
 	  SC_SCHEMA_KV(kSCPropNetPPPRetryConnectTime                    \
 		      ,"RetryConnectTime"                               \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPSessionTimer, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPSessionTimer                                     \
 	  SC_SCHEMA_KV(kSCPropNetPPPSessionTimer                        \
 		      ,"SessionTimer"                                   \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPStatus, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPStatus                                           \
 	  SC_SCHEMA_KV(kSCPropNetPPPStatus                              \
 		      ,"Status"                                         \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPUseSessionTimer, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPUseSessionTimer                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPUseSessionTimer                     \
 		      ,"UseSessionTimer"                                \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPVerboseLogging, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPVerboseLogging                                   \
 	  SC_SCHEMA_KV(kSCPropNetPPPVerboseLogging                      \
 		      ,"VerboseLogging"                                 \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPAuthEAPPlugins, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPAuthEAPPlugins                                   \
 	  SC_SCHEMA_KV(kSCPropNetPPPAuthEAPPlugins                      \
 		      ,"AuthEAPPlugins"                                 \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPAuthName, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPAuthName                                         \
 	  SC_SCHEMA_KV(kSCPropNetPPPAuthName                            \
 		      ,"AuthName"                                       \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPAuthPassword, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPAuthPassword                                     \
 	  SC_SCHEMA_KV(kSCPropNetPPPAuthPassword                        \
 		      ,"AuthPassword"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPAuthPasswordEncryption, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPAuthPasswordEncryption                           \
 	  SC_SCHEMA_KV(kSCPropNetPPPAuthPasswordEncryption              \
 		      ,"AuthPasswordEncryption"                         \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPAuthPrompt, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPAuthPrompt                                       \
 	  SC_SCHEMA_KV(kSCPropNetPPPAuthPrompt                          \
 		      ,"AuthPrompt"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPAuthProtocol, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPAuthProtocol                                     \
 	  SC_SCHEMA_KV(kSCPropNetPPPAuthProtocol                        \
 		      ,"AuthProtocol"                                   \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthPasswordEncryptionKeychain, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthPasswordEncryptionKeychain                    \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthPasswordEncryptionKeychain       \
 		      ,"Keychain"                                       \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthPasswordEncryptionToken, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthPasswordEncryptionToken                       \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthPasswordEncryptionToken          \
 		      ,"Token"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthPromptBefore, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthPromptBefore                                  \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthPromptBefore                     \
 		      ,"Before"                                         \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthPromptAfter, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthPromptAfter                                   \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthPromptAfter                      \
 		      ,"After"                                          \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthProtocolCHAP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthProtocolCHAP                                  \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthProtocolCHAP                     \
 		      ,"CHAP"                                           \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthProtocolEAP, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthProtocolEAP                                   \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthProtocolEAP                      \
 		      ,"EAP"                                            \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthProtocolMSCHAP1, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthProtocolMSCHAP1                               \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthProtocolMSCHAP1                  \
 		      ,"MSCHAP1"                                        \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthProtocolMSCHAP2, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthProtocolMSCHAP2                               \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthProtocolMSCHAP2                  \
 		      ,"MSCHAP2"                                        \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPAuthProtocolPAP, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPAuthProtocolPAP                                   \
 	  SC_SCHEMA_KV(kSCValNetPPPAuthProtocolPAP                      \
 		      ,"PAP"                                            \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommAlternateRemoteAddress, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommAlternateRemoteAddress                       \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommAlternateRemoteAddress          \
 		      ,"CommAlternateRemoteAddress"                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommConnectDelay, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommConnectDelay                                 \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommConnectDelay                    \
 		      ,"CommConnectDelay"                               \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommDisplayTerminalWindow, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommDisplayTerminalWindow                        \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommDisplayTerminalWindow           \
 		      ,"CommDisplayTerminalWindow"                      \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommRedialCount, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommRedialCount                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommRedialCount                     \
 		      ,"CommRedialCount"                                \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommRedialEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommRedialEnabled                                \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommRedialEnabled                   \
 		      ,"CommRedialEnabled"                              \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommRedialInterval, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommRedialInterval                               \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommRedialInterval                  \
 		      ,"CommRedialInterval"                             \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommRemoteAddress, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommRemoteAddress                                \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommRemoteAddress                   \
 		      ,"CommRemoteAddress"                              \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommTerminalScript, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommTerminalScript                               \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommTerminalScript                  \
 		      ,"CommTerminalScript"                             \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCommUseTerminalScript, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCommUseTerminalScript                            \
 	  SC_SCHEMA_KV(kSCPropNetPPPCommUseTerminalScript               \
 		      ,"CommUseTerminalScript"                          \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCCPEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCCPEnabled                                       \
 	  SC_SCHEMA_KV(kSCPropNetPPPCCPEnabled                          \
 		      ,"CCPEnabled"                                     \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCCPMPPE40Enabled, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCCPMPPE40Enabled                                 \
 	  SC_SCHEMA_KV(kSCPropNetPPPCCPMPPE40Enabled                    \
 		      ,"CCPMPPE40Enabled"                               \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPCCPMPPE128Enabled, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPCCPMPPE128Enabled                                \
 	  SC_SCHEMA_KV(kSCPropNetPPPCCPMPPE128Enabled                   \
 		      ,"CCPMPPE128Enabled"                              \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPIPCPCompressionVJ, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPIPCPCompressionVJ                                \
 	  SC_SCHEMA_KV(kSCPropNetPPPIPCPCompressionVJ                   \
 		      ,"IPCPCompressionVJ"                              \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPIPCPUsePeerDNS, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPIPCPUsePeerDNS                                   \
 	  SC_SCHEMA_KV(kSCPropNetPPPIPCPUsePeerDNS                      \
 		      ,"IPCPUsePeerDNS"                                 \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPEchoEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPEchoEnabled                                   \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPEchoEnabled                      \
 		      ,"LCPEchoEnabled"                                 \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPEchoFailure, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPEchoFailure                                   \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPEchoFailure                      \
 		      ,"LCPEchoFailure"                                 \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPEchoInterval, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPEchoInterval                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPEchoInterval                     \
 		      ,"LCPEchoInterval"                                \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPCompressionACField, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPCompressionACField                            \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPCompressionACField               \
 		      ,"LCPCompressionACField"                          \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPCompressionPField, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPCompressionPField                             \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPCompressionPField                \
 		      ,"LCPCompressionPField"                           \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPMRU, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPMRU                                           \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPMRU                              \
 		      ,"LCPMRU"                                         \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPMTU, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPMTU                                           \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPMTU                              \
 		      ,"LCPMTU"                                         \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPReceiveACCM, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPReceiveACCM                                   \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPReceiveACCM                      \
 		      ,"LCPReceiveACCM"                                 \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPLCPTransmitACCM, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPLCPTransmitACCM                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPLCPTransmitACCM                     \
 		      ,"LCPTransmitACCM"                                \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetL2TPIPSecSharedSecret, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetL2TPIPSecSharedSecret                               \
 	  SC_SCHEMA_KV(kSCPropNetL2TPIPSecSharedSecret                  \
 		      ,"IPSecSharedSecret"                              \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetL2TPIPSecSharedSecretEncryption, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetL2TPIPSecSharedSecretEncryption                     \
 	  SC_SCHEMA_KV(kSCPropNetL2TPIPSecSharedSecretEncryption        \
 		      ,"IPSecSharedSecretEncryption"                    \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetL2TPTransport, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetL2TPTransport                                       \
 	  SC_SCHEMA_KV(kSCPropNetL2TPTransport                          \
 		      ,"Transport"                                      \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetL2TPIPSecSharedSecretEncryptionKeychain, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetL2TPIPSecSharedSecretEncryptionKeychain              \
 	  SC_SCHEMA_KV(kSCValNetL2TPIPSecSharedSecretEncryptionKeychain \
 		      ,"Keychain"                                       \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetL2TPTransportIP, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetL2TPTransportIP                                      \
 	  SC_SCHEMA_KV(kSCValNetL2TPTransportIP                         \
 		      ,"IP"                                             \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetL2TPTransportIPSec, __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetL2TPTransportIPSec                                   \
 	  SC_SCHEMA_KV(kSCValNetL2TPTransportIPSec                      \
 		      ,"IPSec"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesExceptionsList, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesExceptionsList                               \
 	  SC_SCHEMA_KV(kSCPropNetProxiesExceptionsList                  \
 		      ,"ExceptionsList"                                 \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesExcludeSimpleHostnames, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesExcludeSimpleHostnames                       \
 	  SC_SCHEMA_KV(kSCPropNetProxiesExcludeSimpleHostnames          \
 		      ,"ExcludeSimpleHostnames"                         \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesFTPEnable, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesFTPEnable                                    \
 	  SC_SCHEMA_KV(kSCPropNetProxiesFTPEnable                       \
 		      ,"FTPEnable"                                      \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesFTPPassive, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesFTPPassive                                   \
 	  SC_SCHEMA_KV(kSCPropNetProxiesFTPPassive                      \
 		      ,"FTPPassive"                                     \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesFTPPort, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesFTPPort                                      \
 	  SC_SCHEMA_KV(kSCPropNetProxiesFTPPort                         \
 		      ,"FTPPort"                                        \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesFTPProxy, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesFTPProxy                                     \
 	  SC_SCHEMA_KV(kSCPropNetProxiesFTPProxy                        \
 		      ,"FTPProxy"                                       \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesGopherEnable, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesGopherEnable                                 \
 	  SC_SCHEMA_KV(kSCPropNetProxiesGopherEnable                    \
 		      ,"GopherEnable"                                   \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesGopherPort, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesGopherPort                                   \
 	  SC_SCHEMA_KV(kSCPropNetProxiesGopherPort                      \
 		      ,"GopherPort"                                     \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesGopherProxy, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesGopherProxy                                  \
 	  SC_SCHEMA_KV(kSCPropNetProxiesGopherProxy                     \
 		      ,"GopherProxy"                                    \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesHTTPEnable, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesHTTPEnable                                   \
 	  SC_SCHEMA_KV(kSCPropNetProxiesHTTPEnable                      \
 		      ,"HTTPEnable"                                     \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesHTTPPort, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesHTTPPort                                     \
 	  SC_SCHEMA_KV(kSCPropNetProxiesHTTPPort                        \
 		      ,"HTTPPort"                                       \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesHTTPProxy, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesHTTPProxy                                    \
 	  SC_SCHEMA_KV(kSCPropNetProxiesHTTPProxy                       \
 		      ,"HTTPProxy"                                      \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesHTTPSEnable, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesHTTPSEnable                                  \
 	  SC_SCHEMA_KV(kSCPropNetProxiesHTTPSEnable                     \
 		      ,"HTTPSEnable"                                    \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesHTTPSPort, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesHTTPSPort                                    \
 	  SC_SCHEMA_KV(kSCPropNetProxiesHTTPSPort                       \
 		      ,"HTTPSPort"                                      \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesHTTPSProxy, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesHTTPSProxy                                   \
 	  SC_SCHEMA_KV(kSCPropNetProxiesHTTPSProxy                      \
 		      ,"HTTPSProxy"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesRTSPEnable, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesRTSPEnable                                   \
 	  SC_SCHEMA_KV(kSCPropNetProxiesRTSPEnable                      \
 		      ,"RTSPEnable"                                     \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesRTSPPort, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesRTSPPort                                     \
 	  SC_SCHEMA_KV(kSCPropNetProxiesRTSPPort                        \
 		      ,"RTSPPort"                                       \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesRTSPProxy, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesRTSPProxy                                    \
 	  SC_SCHEMA_KV(kSCPropNetProxiesRTSPProxy                       \
 		      ,"RTSPProxy"                                      \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesSOCKSEnable, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesSOCKSEnable                                  \
 	  SC_SCHEMA_KV(kSCPropNetProxiesSOCKSEnable                     \
 		      ,"SOCKSEnable"                                    \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesSOCKSPort, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesSOCKSPort                                    \
 	  SC_SCHEMA_KV(kSCPropNetProxiesSOCKSPort                       \
 		      ,"SOCKSPort"                                      \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesSOCKSProxy, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesSOCKSProxy                                   \
 	  SC_SCHEMA_KV(kSCPropNetProxiesSOCKSProxy                      \
 		      ,"SOCKSProxy"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesProxyAutoConfigEnable, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesProxyAutoConfigEnable                        \
 	  SC_SCHEMA_KV(kSCPropNetProxiesProxyAutoConfigEnable           \
 		      ,"ProxyAutoConfigEnable"                          \
 		      ,CFNumber (0 or 1)                                )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCPropNetProxiesProxyAutoConfigJavaScript, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetProxiesProxyAutoConfigJavaScript                    \
+	  SC_SCHEMA_KV(kSCPropNetProxiesProxyAutoConfigJavaScript       \
+		      ,"ProxyAutoConfigJavaScript"                      \
+		      ,CFString                                         )
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesProxyAutoConfigURLString, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesProxyAutoConfigURLString                     \
 	  SC_SCHEMA_KV(kSCPropNetProxiesProxyAutoConfigURLString        \
 		      ,"ProxyAutoConfigURLString"                       \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetProxiesProxyAutoDiscoveryEnable, __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetProxiesProxyAutoDiscoveryEnable                     \
 	  SC_SCHEMA_KV(kSCPropNetProxiesProxyAutoDiscoveryEnable        \
 		      ,"ProxyAutoDiscoveryEnable"                       \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropNetSMBNetBIOSName, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetSMBNetBIOSName                                      \
 	  SC_SCHEMA_KV(kSCPropNetSMBNetBIOSName                         \
 		      ,"NetBIOSName"                                    \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetSMBNetBIOSNodeType, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetSMBNetBIOSNodeType                                  \
 	  SC_SCHEMA_KV(kSCPropNetSMBNetBIOSNodeType                     \
 		      ,"NetBIOSNodeType"                                \
 		      ,CFString                                         )
-#endif
 
-  SC_SCHEMA_DECLARATION(kSCPropNetSMBNetBIOSScope, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
+  SC_SCHEMA_DECLARATION(kSCPropNetSMBNetBIOSScope, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_7,__IPHONE_NA,__IPHONE_NA))
   #define kSCPropNetSMBNetBIOSScope                                     \
 	  SC_SCHEMA_KV(kSCPropNetSMBNetBIOSScope                        \
 		      ,"NetBIOSScope"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetSMBWINSAddresses, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetSMBWINSAddresses                                    \
 	  SC_SCHEMA_KV(kSCPropNetSMBWINSAddresses                       \
 		      ,"WINSAddresses"                                  \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetSMBWorkgroup, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetSMBWorkgroup                                        \
 	  SC_SCHEMA_KV(kSCPropNetSMBWorkgroup                           \
 		      ,"Workgroup"                                      \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetSMBNetBIOSNodeTypeBroadcast, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetSMBNetBIOSNodeTypeBroadcast                          \
 	  SC_SCHEMA_KV(kSCValNetSMBNetBIOSNodeTypeBroadcast             \
 		      ,"Broadcast"                                      \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetSMBNetBIOSNodeTypePeer, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetSMBNetBIOSNodeTypePeer                               \
 	  SC_SCHEMA_KV(kSCValNetSMBNetBIOSNodeTypePeer                  \
 		      ,"Peer"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetSMBNetBIOSNodeTypeMixed, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetSMBNetBIOSNodeTypeMixed                              \
 	  SC_SCHEMA_KV(kSCValNetSMBNetBIOSNodeTypeMixed                 \
 		      ,"Mixed"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetSMBNetBIOSNodeTypeHybrid, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetSMBNetBIOSNodeTypeHybrid                             \
 	  SC_SCHEMA_KV(kSCValNetSMBNetBIOSNodeTypeHybrid                \
 		      ,"Hybrid"                                         \
 		      ,                                                 )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCEntUsersConsoleUser, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntUsersConsoleUser                                        \
 	  SC_SCHEMA_KV(kSCEntUsersConsoleUser                           \
 		      ,"ConsoleUser"                                    \
 		      ,                                                 )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropSystemComputerName, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropSystemComputerName                                     \
 	  SC_SCHEMA_KV(kSCPropSystemComputerName                        \
 		      ,"ComputerName"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropSystemComputerNameEncoding, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropSystemComputerNameEncoding                             \
 	  SC_SCHEMA_KV(kSCPropSystemComputerNameEncoding                \
 		      ,"ComputerNameEncoding"                           \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStoreDomainFile, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStoreDomainFile                                     \
 	  SC_SCHEMA_KV(kSCDynamicStoreDomainFile                        \
 		      ,"File:"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStoreDomainPlugin, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStoreDomainPlugin                                   \
 	  SC_SCHEMA_KV(kSCDynamicStoreDomainPlugin                      \
 		      ,"Plugin:"                                        \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStoreDomainSetup, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStoreDomainSetup                                    \
 	  SC_SCHEMA_KV(kSCDynamicStoreDomainSetup                       \
 		      ,"Setup:"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStoreDomainState, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStoreDomainState                                    \
 	  SC_SCHEMA_KV(kSCDynamicStoreDomainState                       \
 		      ,"State:"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStoreDomainPrefs, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStoreDomainPrefs                                    \
 	  SC_SCHEMA_KV(kSCDynamicStoreDomainPrefs                       \
 		      ,"Prefs:"                                         \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStorePropSetupCurrentSet, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStorePropSetupCurrentSet                            \
 	  SC_SCHEMA_KV(kSCDynamicStorePropSetupCurrentSet               \
 		      ,"CurrentSet"                                     \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStorePropSetupLastUpdated, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStorePropSetupLastUpdated                           \
 	  SC_SCHEMA_KV(kSCDynamicStorePropSetupLastUpdated              \
 		      ,"LastUpdated"                                    \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStorePropNetInterfaces, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStorePropNetInterfaces                              \
 	  SC_SCHEMA_KV(kSCDynamicStorePropNetInterfaces                 \
 		      ,"Interfaces"                                     \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStorePropNetPrimaryInterface, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStorePropNetPrimaryInterface                        \
 	  SC_SCHEMA_KV(kSCDynamicStorePropNetPrimaryInterface           \
 		      ,"PrimaryInterface"                               \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStorePropNetPrimaryService, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStorePropNetPrimaryService                          \
 	  SC_SCHEMA_KV(kSCDynamicStorePropNetPrimaryService             \
 		      ,"PrimaryService"                                 \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCDynamicStorePropNetServiceIDs, __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCDynamicStorePropNetServiceIDs                              \
 	  SC_SCHEMA_KV(kSCDynamicStorePropNetServiceIDs                 \
 		      ,"ServiceIDs"                                     \
 		      ,CFArray[CFString]                                )
-#endif
 
 #if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropUsersConsoleUserName, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_4,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropUsersConsoleUserName                                   \
 	  SC_SCHEMA_KV(kSCPropUsersConsoleUserName                      \
 		      ,"Name"                                           \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropUsersConsoleUserUID, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_4,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropUsersConsoleUserUID                                    \
 	  SC_SCHEMA_KV(kSCPropUsersConsoleUserUID                       \
 		      ,"UID"                                            \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropUsersConsoleUserGID, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_4,__IPHONE_NA,__IPHONE_NA))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)
   #define kSCPropUsersConsoleUserGID                                    \
 	  SC_SCHEMA_KV(kSCPropUsersConsoleUserGID                       \
 		      ,"GID"                                            \
 		      ,CFNumber                                         )
-#endif
 
 #endif // !TARGET_OS_IPHONE
 
diff --git a/SystemConfiguration.fproj/SCSchemaDefinitionsPrivate.h b/SystemConfiguration.fproj/SCSchemaDefinitionsPrivate.h
index 6da9747..f7cebc1 100644
--- a/SystemConfiguration.fproj/SCSchemaDefinitionsPrivate.h
+++ b/SystemConfiguration.fproj/SCSchemaDefinitionsPrivate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -35,8 +35,10 @@
  *
  *   kSCEntNetCommCenter                                "com.apple.CommCenter"         CFDictionary
  *   kSCEntNetEAPOL                                     "EAPOL"                        CFDictionary
+ *   kSCEntNetLoopback                                  "Loopback"                     CFDictionary
  *   kSCEntNetOnDemand                                  "OnDemand"                     CFDictionary
  *   kSCEntNetService                                   "__SERVICE__"                  CFDictionary
+ *   kSCEntNetVPN                                       "VPN"                          CFDictionary
  *
  * kSCCompNetwork Properties
  *
@@ -47,6 +49,25 @@
  *   kSCPropNetCommCenterAllowNetworkAccess             "AllowNetworkAccess"           CFNumber (0 or 1)
  *   kSCPropNetCommCenterAvailable                      "Available"                    CFNumber (0 or 1)
  *
+ * kSCEntNetEthernet (Hardware) Entity Keys
+ *
+ *   kSCPropNetEthernetCapabilityAV                     "AV"                           CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityJUMBO_MTU              "JUMBO_MTU"                    CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityLRO                    "LRO"                          CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityRXCSUM                 "RXCSUM"                       CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityTSO                    "TSO"                          CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityTSO4                   "TSO4"                         CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityTSO6                   "TSO6"                         CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityTXCSUM                 "TXCSUM"                       CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityVLAN_HWTAGGING         "VLAN_HWTAGGING"               CFNumber (0 or 1)
+ *   kSCPropNetEthernetCapabilityVLAN_MTU               "VLAN_MTU"                     CFNumber (0 or 1)
+ *
+ * kSCEntNetInterface Entity Keys
+ *
+ *   --- kSCPropNetInterfaceType values ---
+ *   kSCValNetInterfaceTypeLoopback                     "Loopback"
+ *   kSCValNetInterfaceTypeVPN                          "VPN"
+ *
  * kSCEntNetIPSec Entity Keys
  *
  *   kSCPropNetIPSecLastCause                           "LastCause"                    CFNumber
@@ -59,15 +80,36 @@
  *
  * kSCEntNetIPv4 Entity Keys
  *
+ *   kSCPropNetIPv4ExcludedRoutes                       "ExcludedRoutes"               CFArray[CFDictionary]
+ *   kSCPropNetIPv4IncludedRoutes                       "IncludedRoutes"               CFArray[CFDictionary]
+ *
  *   --- kSCPropNetIPv4ConfigMethod values ---
  *   kSCValNetIPv4ConfigMethodFailover                  "Failover"
  *
+ *   --- kSCPropNetIPv4IncludedRoutes, kSCPropNetIPv4ExcludedRoutes [CFDictionary] keys ---
+ *   kSCPropNetIPv4RouteDestinationAddress              "DestinationAddress"           CFString
+ *   kSCPropNetIPv4RouteSubnetMask                      "SubnetMask"                   CFString
+ *   kSCPropNetIPv4RouteGatewayAddress                  "GatewayAddress"               CFString
+ *
+ * kSCEntNetIPv6 Entity Keys
+ *
+ *   kSCPropNetIPv6ExcludedRoutes                       "ExcludedRoutes"               CFArray[CFDictionary]
+ *   kSCPropNetIPv6IncludedRoutes                       "IncludedRoutes"               CFArray[CFDictionary]
+ *
+ *   --- kSCPropNetIPv6IncludedRoutes, kSCPropNetIPv6ExcludedRoutes [CFDictionary] keys ---
+ *   kSCPropNetIPv6RouteDestinationAddress              "DestinationAddress"           CFString
+ *   kSCPropNetIPv6RoutePrefixLength                    "PrefixLength"                 CFNumber
+ *   kSCPropNetIPv6RouteGatewayAddress                  "GatewayAddress"               CFString
+ *
  * kSCEntNetPPP Entity Keys
  *
  *   --- OnDemand: ---
  *   kSCPropNetPPPOnDemandDomains                       "OnDemandDomains"              CFArray[CFString]
  *   kSCPropNetPPPOnDemandEnabled                       "OnDemandEnabled"              CFNumber (0 or 1)
  *   kSCPropNetPPPOnDemandHostName                      "OnDemandHostName"             CFString
+ *   kSCPropNetPPPOnDemandMatchDomainsAlways            "OnDemandMatchDomainsAlways"   CFArray[CFString]
+ *   kSCPropNetPPPOnDemandMatchDomainsOnRetry           "OnDemandMatchDomainsOnRetry"  CFArray[CFString]
+ *   kSCPropNetPPPOnDemandMatchDomainsNever             "OnDemandMatchDomainsNever"    CFArray[CFString]
  *   kSCPropNetPPPOnDemandMode                          "OnDemandMode"                 CFString
  *   kSCPropNetPPPOnDemandPriority                      "OnDemandPriority"             CFString
  *
@@ -81,6 +123,15 @@
  *   kSCValNetPPPOnDemandPriorityHigh                   "High"
  *   kSCValNetPPPOnDemandPriorityLow                    "Low"
  *
+ * kSCEntNetProxies Entity Keys
+ *
+ *   kSCPropNetProxiesSupplementalMatchDomains          "SupplementalMatchDomains"     CFArray[CFString]
+ *   kSCPropNetProxiesSupplementalMatchOrders           "SupplementalMatchOrders"      CFArray[CFNumber]
+ *
+ *   kSCPropNetProxiesScoped                            "__SCOPED__"                   CFDictionary
+ *   kSCPropNetProxiesSupplemental                      "__SUPPLEMENTAL__"             CFArray[CFDictionary]
+ *   kSCPropNetProxiesSupplementalMatchDomain           "__MATCH_DOMAIN__"             CFString
+ *
  * kSCEntNetService Entity Keys
  *
  *   kSCPropNetServicePrimaryRank                       "PrimaryRank"                  CFString
@@ -91,6 +142,37 @@
  *   kSCValNetServicePrimaryRankLast                    "Last"
  *   kSCValNetServicePrimaryRankNever                   "Never"
  *
+ * kSCEntNetVPN Entity Keys
+ *
+ *   kSCPropNetVPNAuthName                              "AuthName"                     CFString
+ *   kSCPropNetVPNAuthPassword                          "AuthPassword"                 CFString
+ *   kSCPropNetVPNAuthPasswordEncryption                "AuthPasswordEncryption"       CFString
+ *   kSCPropNetVPNAuthenticationMethod                  "AuthenticationMethod"         CFString
+ *   kSCPropNetVPNConnectTime                           "ConnectTime"                  CFString
+ *   kSCPropNetVPNDisconnectOnFastUserSwitch            "DisconnectOnFastUserSwitch"   CFNumber (0 or 1)
+ *   kSCPropNetVPNDisconnectOnIdle                      "DisconnectOnIdle"             CFNumber (0 or 1)
+ *   kSCPropNetVPNDisconnectOnIdleTimer                 "DisconnectOnIdleTimer"        CFNumber
+ *   kSCPropNetVPNDisconnectOnLogout                    "DisconnectOnLogout"           CFNumber (0 or 1)
+ *   kSCPropNetVPNDisconnectOnSleep                     "DisconnectOnSleep"            CFNumber (0 or 1)
+ *   kSCPropNetVPNLocalCertificate                      "LocalCertificate"             CFData
+ *   kSCPropNetVPNLogfile                               "Logfile"                      CFString
+ *   kSCPropNetVPNMTU                                   "MTU"                          CFNumber
+ *   kSCPropNetVPNOnDemandEnabled                       "OnDemandEnabled"              CFNumber (0 or 1)
+ *   kSCPropNetVPNOnDemandMatchDomainsAlways            "OnDemandMatchDomainsAlways"   CFArray[CFString]
+ *   kSCPropNetVPNOnDemandMatchDomainsOnRetry           "OnDemandMatchDomainsOnRetry"  CFArray[CFString]
+ *   kSCPropNetVPNOnDemandMatchDomainsNever             "OnDemandMatchDomainsNever"    CFArray[CFString]
+ *   kSCPropNetVPNRemoteAddress                         "RemoteAddress"                CFString
+ *   kSCPropNetVPNStatus                                "Status"                       CFNumber
+ *   kSCPropNetVPNVerboseLogging                        "VerboseLogging"               CFNumber (0 or 1)
+ *
+ *   --- kSCPropNetVPNAuthenticationMethod values ---
+ *   kSCValNetVPNAuthenticationMethodPassword           "Password"
+ *   kSCValNetVPNAuthenticationMethodCertificate        "Certificate"
+ *
+ *   --- kSCPropNetVPNAuthPasswordEncryption values ---
+ *   kSCValNetVPNAuthPasswordEncryptionKeychain         "Keychain"
+ *   kSCValNetVPNAuthPasswordEncryptionPrompt           "Prompt"
+ *
  * kSCCompSystem Properties
  *
  *   kSCPropSystemComputerNameRegion                    "ComputerNameRegion"           CFNumber
@@ -102,6 +184,9 @@
  *   kSCPropVirtualNetworkInterfacesBondMode            "Mode"                         CFNumber
  *   kSCPropVirtualNetworkInterfacesBondOptions         "Options"                      CFDictionary
  *
+ *   kSCPropVirtualNetworkInterfacesBridgeInterfaces    "Interfaces"                   CFArray[CFString]
+ *   kSCPropVirtualNetworkInterfacesBridgeOptions       "Options"                      CFDictionary
+ *
  *   kSCPropVirtualNetworkInterfacesVLANInterface       "Interface"                    CFString
  *   kSCPropVirtualNetworkInterfacesVLANTag             "Tag"                          CFNumber
  *   kSCPropVirtualNetworkInterfacesVLANOptions         "Options"                      CFDictionary
@@ -149,6 +234,12 @@ extern const CFStringRef kSCEntNetCommCenter;
  */
 extern const CFStringRef kSCEntNetEAPOL;
 
+/*!
+  @const kSCEntNetLoopback
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCEntNetLoopback;
+
 /*!
   @const kSCEntNetOnDemand
   @availability Introduced in Mac OS X 10.6.
@@ -161,6 +252,12 @@ extern const CFStringRef kSCEntNetOnDemand;
  */
 extern const CFStringRef kSCEntNetService;
 
+/*!
+  @const kSCEntNetVPN
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCEntNetVPN;
+
 /*!
   @group kSCCompNetwork Properties
  */
@@ -187,6 +284,86 @@ extern const CFStringRef kSCPropNetCommCenterAllowNetworkAccess;
  */
 extern const CFStringRef kSCPropNetCommCenterAvailable;
 
+/*!
+  @group kSCEntNetEthernet (Hardware) Entity Keys
+ */
+
+/*!
+  @const kSCPropNetEthernetCapabilityAV
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityAV;
+
+/*!
+  @const kSCPropNetEthernetCapabilityJUMBO_MTU
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityJUMBO_MTU;
+
+/*!
+  @const kSCPropNetEthernetCapabilityLRO
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityLRO;
+
+/*!
+  @const kSCPropNetEthernetCapabilityRXCSUM
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityRXCSUM;
+
+/*!
+  @const kSCPropNetEthernetCapabilityTSO
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityTSO;
+
+/*!
+  @const kSCPropNetEthernetCapabilityTSO4
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityTSO4;
+
+/*!
+  @const kSCPropNetEthernetCapabilityTSO6
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityTSO6;
+
+/*!
+  @const kSCPropNetEthernetCapabilityTXCSUM
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityTXCSUM;
+
+/*!
+  @const kSCPropNetEthernetCapabilityVLAN_HWTAGGING
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityVLAN_HWTAGGING;
+
+/*!
+  @const kSCPropNetEthernetCapabilityVLAN_MTU
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetEthernetCapabilityVLAN_MTU;
+
+/*!
+  @group kSCEntNetInterface Entity Keys
+ */
+
+/*!
+  @const kSCValNetInterfaceTypeLoopback
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCValNetInterfaceTypeLoopback;
+
+/*!
+  @const kSCValNetInterfaceTypeVPN
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCValNetInterfaceTypeVPN;
+
 /*!
   @group kSCEntNetIPSec Entity Keys
  */
@@ -225,12 +402,76 @@ extern const CFStringRef kSCPropNetIPSecOnDemandMatchDomainsNever;
   @group kSCEntNetIPv4 Entity Keys
  */
 
+/*!
+  @const kSCPropNetIPv4ExcludedRoutes
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv4ExcludedRoutes;
+
+/*!
+  @const kSCPropNetIPv4IncludedRoutes
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv4IncludedRoutes;
+
 /*!
   @const kSCValNetIPv4ConfigMethodFailover
   @availability Introduced in Mac OS X 10.5.
  */
 extern const CFStringRef kSCValNetIPv4ConfigMethodFailover;
 
+/*!
+  @const kSCPropNetIPv4RouteDestinationAddress
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv4RouteDestinationAddress;
+
+/*!
+  @const kSCPropNetIPv4RouteSubnetMask
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv4RouteSubnetMask;
+
+/*!
+  @const kSCPropNetIPv4RouteGatewayAddress
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv4RouteGatewayAddress;
+
+/*!
+  @group kSCEntNetIPv6 Entity Keys
+ */
+
+/*!
+  @const kSCPropNetIPv6ExcludedRoutes
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv6ExcludedRoutes;
+
+/*!
+  @const kSCPropNetIPv6IncludedRoutes
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv6IncludedRoutes;
+
+/*!
+  @const kSCPropNetIPv6RouteDestinationAddress
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv6RouteDestinationAddress;
+
+/*!
+  @const kSCPropNetIPv6RoutePrefixLength
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv6RoutePrefixLength;
+
+/*!
+  @const kSCPropNetIPv6RouteGatewayAddress
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetIPv6RouteGatewayAddress;
+
 /*!
   @group kSCEntNetPPP Entity Keys
  */
@@ -253,6 +494,24 @@ extern const CFStringRef kSCPropNetPPPOnDemandEnabled;
  */
 extern const CFStringRef kSCPropNetPPPOnDemandHostName;
 
+/*!
+  @const kSCPropNetPPPOnDemandMatchDomainsAlways
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetPPPOnDemandMatchDomainsAlways;
+
+/*!
+  @const kSCPropNetPPPOnDemandMatchDomainsOnRetry
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetPPPOnDemandMatchDomainsOnRetry;
+
+/*!
+  @const kSCPropNetPPPOnDemandMatchDomainsNever
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetPPPOnDemandMatchDomainsNever;
+
 /*!
   @const kSCPropNetPPPOnDemandMode
   @availability Introduced in Mac OS X 10.5.
@@ -301,6 +560,40 @@ extern const CFStringRef kSCValNetPPPOnDemandPriorityHigh;
  */
 extern const CFStringRef kSCValNetPPPOnDemandPriorityLow;
 
+/*!
+  @group kSCEntNetProxies Entity Keys
+ */
+
+/*!
+  @const kSCPropNetProxiesSupplementalMatchDomains
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetProxiesSupplementalMatchDomains;
+
+/*!
+  @const kSCPropNetProxiesSupplementalMatchOrders
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetProxiesSupplementalMatchOrders;
+
+/*!
+  @const kSCPropNetProxiesScoped
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetProxiesScoped;
+
+/*!
+  @const kSCPropNetProxiesSupplemental
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetProxiesSupplemental;
+
+/*!
+  @const kSCPropNetProxiesSupplementalMatchDomain
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetProxiesSupplementalMatchDomain;
+
 /*!
   @group kSCEntNetService Entity Keys
  */
@@ -335,6 +628,154 @@ extern const CFStringRef kSCValNetServicePrimaryRankLast;
  */
 extern const CFStringRef kSCValNetServicePrimaryRankNever;
 
+/*!
+  @group kSCEntNetVPN Entity Keys
+ */
+
+/*!
+  @const kSCPropNetVPNAuthName
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNAuthName;
+
+/*!
+  @const kSCPropNetVPNAuthPassword
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNAuthPassword;
+
+/*!
+  @const kSCPropNetVPNAuthPasswordEncryption
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNAuthPasswordEncryption;
+
+/*!
+  @const kSCPropNetVPNAuthenticationMethod
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNAuthenticationMethod;
+
+/*!
+  @const kSCPropNetVPNConnectTime
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNConnectTime;
+
+/*!
+  @const kSCPropNetVPNDisconnectOnFastUserSwitch
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNDisconnectOnFastUserSwitch;
+
+/*!
+  @const kSCPropNetVPNDisconnectOnIdle
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNDisconnectOnIdle;
+
+/*!
+  @const kSCPropNetVPNDisconnectOnIdleTimer
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNDisconnectOnIdleTimer;
+
+/*!
+  @const kSCPropNetVPNDisconnectOnLogout
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNDisconnectOnLogout;
+
+/*!
+  @const kSCPropNetVPNDisconnectOnSleep
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNDisconnectOnSleep;
+
+/*!
+  @const kSCPropNetVPNLocalCertificate
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNLocalCertificate;
+
+/*!
+  @const kSCPropNetVPNLogfile
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNLogfile;
+
+/*!
+  @const kSCPropNetVPNMTU
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNMTU;
+
+/*!
+  @const kSCPropNetVPNOnDemandEnabled
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNOnDemandEnabled;
+
+/*!
+  @const kSCPropNetVPNOnDemandMatchDomainsAlways
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNOnDemandMatchDomainsAlways;
+
+/*!
+  @const kSCPropNetVPNOnDemandMatchDomainsOnRetry
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNOnDemandMatchDomainsOnRetry;
+
+/*!
+  @const kSCPropNetVPNOnDemandMatchDomainsNever
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNOnDemandMatchDomainsNever;
+
+/*!
+  @const kSCPropNetVPNRemoteAddress
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNRemoteAddress;
+
+/*!
+  @const kSCPropNetVPNStatus
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNStatus;
+
+/*!
+  @const kSCPropNetVPNVerboseLogging
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropNetVPNVerboseLogging;
+
+/*!
+  @const kSCValNetVPNAuthenticationMethodPassword
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCValNetVPNAuthenticationMethodPassword;
+
+/*!
+  @const kSCValNetVPNAuthenticationMethodCertificate
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCValNetVPNAuthenticationMethodCertificate;
+
+/*!
+  @const kSCValNetVPNAuthPasswordEncryptionKeychain
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCValNetVPNAuthPasswordEncryptionKeychain;
+
+/*!
+  @const kSCValNetVPNAuthPasswordEncryptionPrompt
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCValNetVPNAuthPasswordEncryptionPrompt;
+
 /*!
   @group kSCCompSystem Properties
  */
@@ -373,6 +814,18 @@ extern const CFStringRef kSCPropVirtualNetworkInterfacesBondMode;
  */
 extern const CFStringRef kSCPropVirtualNetworkInterfacesBondOptions;
 
+/*!
+  @const kSCPropVirtualNetworkInterfacesBridgeInterfaces
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropVirtualNetworkInterfacesBridgeInterfaces;
+
+/*!
+  @const kSCPropVirtualNetworkInterfacesBridgeOptions
+  @availability Introduced in Mac OS X 10.7.
+ */
+extern const CFStringRef kSCPropVirtualNetworkInterfacesBridgeOptions;
+
 /*!
   @const kSCPropVirtualNetworkInterfacesVLANInterface
   @availability Introduced in Mac OS X 10.5.
@@ -398,289 +851,563 @@ extern const CFStringRef kSCPropVirtualNetworkInterfacesVLANOptions;
 
 
   SC_SCHEMA_DECLARATION(kSCPrefVirtualNetworkInterfaces, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPrefVirtualNetworkInterfaces                               \
 	  SC_SCHEMA_KV(kSCPrefVirtualNetworkInterfaces                  \
 		      ,"VirtualNetworkInterfaces"                       \
 		      ,CFDictionary                                     )
-#endif
 
 
   SC_SCHEMA_DECLARATION(kSCEntNetEAPOL, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetEAPOL                                                \
 	  SC_SCHEMA_KV(kSCEntNetEAPOL                                   \
 		      ,"EAPOL"                                          \
 		      ,CFDictionary                                     )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCEntNetLoopback, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCEntNetLoopback                                             \
+	  SC_SCHEMA_KV(kSCEntNetLoopback                                \
+		      ,"Loopback"                                       \
+		      ,CFDictionary                                     )
 
   SC_SCHEMA_DECLARATION(kSCEntNetOnDemand, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/
   #define kSCEntNetOnDemand                                             \
 	  SC_SCHEMA_KV(kSCEntNetOnDemand                                \
 		      ,"OnDemand"                                       \
 		      ,CFDictionary                                     )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCEntNetService, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCEntNetService                                              \
 	  SC_SCHEMA_KV(kSCEntNetService                                 \
 		      ,"__SERVICE__"                                    \
 		      ,CFDictionary                                     )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCEntNetVPN, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCEntNetVPN                                                  \
+	  SC_SCHEMA_KV(kSCEntNetVPN                                     \
+		      ,"VPN"                                            \
+		      ,CFDictionary                                     )
 
   SC_SCHEMA_DECLARATION(kSCPropNetIgnoreLinkStatus, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetIgnoreLinkStatus                                    \
 	  SC_SCHEMA_KV(kSCPropNetIgnoreLinkStatus                       \
 		      ,"IgnoreLinkStatus"                               \
 		      ,CFBoolean                                        )
-#endif
 
 
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityAV, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityAV                                \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityAV                   \
+		      ,"AV"                                             \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityJUMBO_MTU, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityJUMBO_MTU                         \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityJUMBO_MTU            \
+		      ,"JUMBO_MTU"                                      \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityLRO, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityLRO                               \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityLRO                  \
+		      ,"LRO"                                            \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityRXCSUM, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityRXCSUM                            \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityRXCSUM               \
+		      ,"RXCSUM"                                         \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityTSO, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityTSO                               \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityTSO                  \
+		      ,"TSO"                                            \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityTSO4, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityTSO4                              \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityTSO4                 \
+		      ,"TSO4"                                           \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityTSO6, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityTSO6                              \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityTSO6                 \
+		      ,"TSO6"                                           \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityTXCSUM, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityTXCSUM                            \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityTXCSUM               \
+		      ,"TXCSUM"                                         \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityVLAN_HWTAGGING, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityVLAN_HWTAGGING                    \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityVLAN_HWTAGGING       \
+		      ,"VLAN_HWTAGGING"                                 \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetEthernetCapabilityVLAN_MTU, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetEthernetCapabilityVLAN_MTU                          \
+	  SC_SCHEMA_KV(kSCPropNetEthernetCapabilityVLAN_MTU             \
+		      ,"VLAN_MTU"                                       \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCValNetInterfaceTypeLoopback, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCValNetInterfaceTypeLoopback                                \
+	  SC_SCHEMA_KV(kSCValNetInterfaceTypeLoopback                   \
+		      ,"Loopback"                                       \
+		      ,                                                 )
+
+  SC_SCHEMA_DECLARATION(kSCValNetInterfaceTypeVPN, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCValNetInterfaceTypeVPN                                     \
+	  SC_SCHEMA_KV(kSCValNetInterfaceTypeVPN                        \
+		      ,"VPN"                                            \
+		      ,                                                 )
+
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecLastCause, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/
   #define kSCPropNetIPSecLastCause                                      \
 	  SC_SCHEMA_KV(kSCPropNetIPSecLastCause                         \
 		      ,"LastCause"                                      \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecOnDemandEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/
   #define kSCPropNetIPSecOnDemandEnabled                                \
 	  SC_SCHEMA_KV(kSCPropNetIPSecOnDemandEnabled                   \
 		      ,"OnDemandEnabled"                                \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecOnDemandMatchDomainsAlways, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/
   #define kSCPropNetIPSecOnDemandMatchDomainsAlways                     \
 	  SC_SCHEMA_KV(kSCPropNetIPSecOnDemandMatchDomainsAlways        \
 		      ,"OnDemandMatchDomainsAlways"                     \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecOnDemandMatchDomainsOnRetry, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/
   #define kSCPropNetIPSecOnDemandMatchDomainsOnRetry                    \
 	  SC_SCHEMA_KV(kSCPropNetIPSecOnDemandMatchDomainsOnRetry       \
 		      ,"OnDemandMatchDomainsOnRetry"                    \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetIPSecOnDemandMatchDomainsNever, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/
   #define kSCPropNetIPSecOnDemandMatchDomainsNever                      \
 	  SC_SCHEMA_KV(kSCPropNetIPSecOnDemandMatchDomainsNever         \
 		      ,"OnDemandMatchDomainsNever"                      \
 		      ,CFArray[CFString]                                )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv4ExcludedRoutes, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv4ExcludedRoutes                                  \
+	  SC_SCHEMA_KV(kSCPropNetIPv4ExcludedRoutes                     \
+		      ,"ExcludedRoutes"                                 \
+		      ,CFArray[CFDictionary]                            )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv4IncludedRoutes, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv4IncludedRoutes                                  \
+	  SC_SCHEMA_KV(kSCPropNetIPv4IncludedRoutes                     \
+		      ,"IncludedRoutes"                                 \
+		      ,CFArray[CFDictionary]                            )
 
   SC_SCHEMA_DECLARATION(kSCValNetIPv4ConfigMethodFailover, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetIPv4ConfigMethodFailover                             \
 	  SC_SCHEMA_KV(kSCValNetIPv4ConfigMethodFailover                \
 		      ,"Failover"                                       \
 		      ,                                                 )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv4RouteDestinationAddress, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv4RouteDestinationAddress                         \
+	  SC_SCHEMA_KV(kSCPropNetIPv4RouteDestinationAddress            \
+		      ,"DestinationAddress"                             \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv4RouteSubnetMask, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv4RouteSubnetMask                                 \
+	  SC_SCHEMA_KV(kSCPropNetIPv4RouteSubnetMask                    \
+		      ,"SubnetMask"                                     \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv4RouteGatewayAddress, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv4RouteGatewayAddress                             \
+	  SC_SCHEMA_KV(kSCPropNetIPv4RouteGatewayAddress                \
+		      ,"GatewayAddress"                                 \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv6ExcludedRoutes, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv6ExcludedRoutes                                  \
+	  SC_SCHEMA_KV(kSCPropNetIPv6ExcludedRoutes                     \
+		      ,"ExcludedRoutes"                                 \
+		      ,CFArray[CFDictionary]                            )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv6IncludedRoutes, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv6IncludedRoutes                                  \
+	  SC_SCHEMA_KV(kSCPropNetIPv6IncludedRoutes                     \
+		      ,"IncludedRoutes"                                 \
+		      ,CFArray[CFDictionary]                            )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv6RouteDestinationAddress, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv6RouteDestinationAddress                         \
+	  SC_SCHEMA_KV(kSCPropNetIPv6RouteDestinationAddress            \
+		      ,"DestinationAddress"                             \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv6RoutePrefixLength, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv6RoutePrefixLength                               \
+	  SC_SCHEMA_KV(kSCPropNetIPv6RoutePrefixLength                  \
+		      ,"PrefixLength"                                   \
+		      ,CFNumber                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetIPv6RouteGatewayAddress, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetIPv6RouteGatewayAddress                             \
+	  SC_SCHEMA_KV(kSCPropNetIPv6RouteGatewayAddress                \
+		      ,"GatewayAddress"                                 \
+		      ,CFString                                         )
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandDomains, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPOnDemandDomains                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandDomains                     \
 		      ,"OnDemandDomains"                                \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPOnDemandEnabled                                  \
 	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandEnabled                     \
 		      ,"OnDemandEnabled"                                \
 		      ,CFNumber (0 or 1)                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandHostName, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPOnDemandHostName                                 \
 	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandHostName                    \
 		      ,"OnDemandHostName"                               \
 		      ,CFString                                         )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandMatchDomainsAlways, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetPPPOnDemandMatchDomainsAlways                       \
+	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandMatchDomainsAlways          \
+		      ,"OnDemandMatchDomainsAlways"                     \
+		      ,CFArray[CFString]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandMatchDomainsOnRetry, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetPPPOnDemandMatchDomainsOnRetry                      \
+	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandMatchDomainsOnRetry         \
+		      ,"OnDemandMatchDomainsOnRetry"                    \
+		      ,CFArray[CFString]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandMatchDomainsNever, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetPPPOnDemandMatchDomainsNever                        \
+	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandMatchDomainsNever           \
+		      ,"OnDemandMatchDomainsNever"                      \
+		      ,CFArray[CFString]                                )
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandMode, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPOnDemandMode                                     \
 	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandMode                        \
 		      ,"OnDemandMode"                                   \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetPPPOnDemandPriority, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetPPPOnDemandPriority                                 \
 	  SC_SCHEMA_KV(kSCPropNetPPPOnDemandPriority                    \
 		      ,"OnDemandPriority"                               \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPOnDemandModeAggressive, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPOnDemandModeAggressive                            \
 	  SC_SCHEMA_KV(kSCValNetPPPOnDemandModeAggressive               \
 		      ,"Aggressive"                                     \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPOnDemandModeConservative, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPOnDemandModeConservative                          \
 	  SC_SCHEMA_KV(kSCValNetPPPOnDemandModeConservative             \
 		      ,"Conservative"                                   \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPOnDemandModeCompatible, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPOnDemandModeCompatible                            \
 	  SC_SCHEMA_KV(kSCValNetPPPOnDemandModeCompatible               \
 		      ,"Compatible"                                     \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPOnDemandPriorityDefault, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPOnDemandPriorityDefault                           \
 	  SC_SCHEMA_KV(kSCValNetPPPOnDemandPriorityDefault              \
 		      ,"Default"                                        \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPOnDemandPriorityHigh, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPOnDemandPriorityHigh                              \
 	  SC_SCHEMA_KV(kSCValNetPPPOnDemandPriorityHigh                 \
 		      ,"High"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetPPPOnDemandPriorityLow, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetPPPOnDemandPriorityLow                               \
 	  SC_SCHEMA_KV(kSCValNetPPPOnDemandPriorityLow                  \
 		      ,"Low"                                            \
 		      ,                                                 )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCPropNetProxiesSupplementalMatchDomains, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetProxiesSupplementalMatchDomains                     \
+	  SC_SCHEMA_KV(kSCPropNetProxiesSupplementalMatchDomains        \
+		      ,"SupplementalMatchDomains"                       \
+		      ,CFArray[CFString]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetProxiesSupplementalMatchOrders, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetProxiesSupplementalMatchOrders                      \
+	  SC_SCHEMA_KV(kSCPropNetProxiesSupplementalMatchOrders         \
+		      ,"SupplementalMatchOrders"                        \
+		      ,CFArray[CFNumber]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetProxiesScoped, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetProxiesScoped                                       \
+	  SC_SCHEMA_KV(kSCPropNetProxiesScoped                          \
+		      ,"__SCOPED__"                                     \
+		      ,CFDictionary                                     )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetProxiesSupplemental, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetProxiesSupplemental                                 \
+	  SC_SCHEMA_KV(kSCPropNetProxiesSupplemental                    \
+		      ,"__SUPPLEMENTAL__"                               \
+		      ,CFArray[CFDictionary]                            )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetProxiesSupplementalMatchDomain, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))
+  #define kSCPropNetProxiesSupplementalMatchDomain                      \
+	  SC_SCHEMA_KV(kSCPropNetProxiesSupplementalMatchDomain         \
+		      ,"__MATCH_DOMAIN__"                               \
+		      ,CFString                                         )
 
   SC_SCHEMA_DECLARATION(kSCPropNetServicePrimaryRank, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetServicePrimaryRank                                  \
 	  SC_SCHEMA_KV(kSCPropNetServicePrimaryRank                     \
 		      ,"PrimaryRank"                                    \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropNetServiceUserDefinedName, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropNetServiceUserDefinedName                              \
 	  SC_SCHEMA_KV(kSCPropNetServiceUserDefinedName                 \
 		      ,"UserDefinedName"                                \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetServicePrimaryRankFirst, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetServicePrimaryRankFirst                              \
 	  SC_SCHEMA_KV(kSCValNetServicePrimaryRankFirst                 \
 		      ,"First"                                          \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetServicePrimaryRankLast, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetServicePrimaryRankLast                               \
 	  SC_SCHEMA_KV(kSCValNetServicePrimaryRankLast                  \
 		      ,"Last"                                           \
 		      ,                                                 )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCValNetServicePrimaryRankNever, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCValNetServicePrimaryRankNever                              \
 	  SC_SCHEMA_KV(kSCValNetServicePrimaryRankNever                 \
 		      ,"Never"                                          \
 		      ,                                                 )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNAuthName, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNAuthName                                         \
+	  SC_SCHEMA_KV(kSCPropNetVPNAuthName                            \
+		      ,"AuthName"                                       \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNAuthPassword, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNAuthPassword                                     \
+	  SC_SCHEMA_KV(kSCPropNetVPNAuthPassword                        \
+		      ,"AuthPassword"                                   \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNAuthPasswordEncryption, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNAuthPasswordEncryption                           \
+	  SC_SCHEMA_KV(kSCPropNetVPNAuthPasswordEncryption              \
+		      ,"AuthPasswordEncryption"                         \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNAuthenticationMethod, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNAuthenticationMethod                             \
+	  SC_SCHEMA_KV(kSCPropNetVPNAuthenticationMethod                \
+		      ,"AuthenticationMethod"                           \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNConnectTime, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNConnectTime                                      \
+	  SC_SCHEMA_KV(kSCPropNetVPNConnectTime                         \
+		      ,"ConnectTime"                                    \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNDisconnectOnFastUserSwitch, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNDisconnectOnFastUserSwitch                       \
+	  SC_SCHEMA_KV(kSCPropNetVPNDisconnectOnFastUserSwitch          \
+		      ,"DisconnectOnFastUserSwitch"                     \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNDisconnectOnIdle, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNDisconnectOnIdle                                 \
+	  SC_SCHEMA_KV(kSCPropNetVPNDisconnectOnIdle                    \
+		      ,"DisconnectOnIdle"                               \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNDisconnectOnIdleTimer, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNDisconnectOnIdleTimer                            \
+	  SC_SCHEMA_KV(kSCPropNetVPNDisconnectOnIdleTimer               \
+		      ,"DisconnectOnIdleTimer"                          \
+		      ,CFNumber                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNDisconnectOnLogout, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNDisconnectOnLogout                               \
+	  SC_SCHEMA_KV(kSCPropNetVPNDisconnectOnLogout                  \
+		      ,"DisconnectOnLogout"                             \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNDisconnectOnSleep, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNDisconnectOnSleep                                \
+	  SC_SCHEMA_KV(kSCPropNetVPNDisconnectOnSleep                   \
+		      ,"DisconnectOnSleep"                              \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNLocalCertificate, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNLocalCertificate                                 \
+	  SC_SCHEMA_KV(kSCPropNetVPNLocalCertificate                    \
+		      ,"LocalCertificate"                               \
+		      ,CFData                                           )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNLogfile, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNLogfile                                          \
+	  SC_SCHEMA_KV(kSCPropNetVPNLogfile                             \
+		      ,"Logfile"                                        \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNMTU, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNMTU                                              \
+	  SC_SCHEMA_KV(kSCPropNetVPNMTU                                 \
+		      ,"MTU"                                            \
+		      ,CFNumber                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNOnDemandEnabled, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNOnDemandEnabled                                  \
+	  SC_SCHEMA_KV(kSCPropNetVPNOnDemandEnabled                     \
+		      ,"OnDemandEnabled"                                \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNOnDemandMatchDomainsAlways, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNOnDemandMatchDomainsAlways                       \
+	  SC_SCHEMA_KV(kSCPropNetVPNOnDemandMatchDomainsAlways          \
+		      ,"OnDemandMatchDomainsAlways"                     \
+		      ,CFArray[CFString]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNOnDemandMatchDomainsOnRetry, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNOnDemandMatchDomainsOnRetry                      \
+	  SC_SCHEMA_KV(kSCPropNetVPNOnDemandMatchDomainsOnRetry         \
+		      ,"OnDemandMatchDomainsOnRetry"                    \
+		      ,CFArray[CFString]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNOnDemandMatchDomainsNever, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNOnDemandMatchDomainsNever                        \
+	  SC_SCHEMA_KV(kSCPropNetVPNOnDemandMatchDomainsNever           \
+		      ,"OnDemandMatchDomainsNever"                      \
+		      ,CFArray[CFString]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNRemoteAddress, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNRemoteAddress                                    \
+	  SC_SCHEMA_KV(kSCPropNetVPNRemoteAddress                       \
+		      ,"RemoteAddress"                                  \
+		      ,CFString                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNStatus, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNStatus                                           \
+	  SC_SCHEMA_KV(kSCPropNetVPNStatus                              \
+		      ,"Status"                                         \
+		      ,CFNumber                                         )
+
+  SC_SCHEMA_DECLARATION(kSCPropNetVPNVerboseLogging, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropNetVPNVerboseLogging                                   \
+	  SC_SCHEMA_KV(kSCPropNetVPNVerboseLogging                      \
+		      ,"VerboseLogging"                                 \
+		      ,CFNumber (0 or 1)                                )
+
+  SC_SCHEMA_DECLARATION(kSCValNetVPNAuthenticationMethodPassword, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCValNetVPNAuthenticationMethodPassword                      \
+	  SC_SCHEMA_KV(kSCValNetVPNAuthenticationMethodPassword         \
+		      ,"Password"                                       \
+		      ,                                                 )
+
+  SC_SCHEMA_DECLARATION(kSCValNetVPNAuthenticationMethodCertificate, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCValNetVPNAuthenticationMethodCertificate                   \
+	  SC_SCHEMA_KV(kSCValNetVPNAuthenticationMethodCertificate      \
+		      ,"Certificate"                                    \
+		      ,                                                 )
+
+  SC_SCHEMA_DECLARATION(kSCValNetVPNAuthPasswordEncryptionKeychain, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCValNetVPNAuthPasswordEncryptionKeychain                    \
+	  SC_SCHEMA_KV(kSCValNetVPNAuthPasswordEncryptionKeychain       \
+		      ,"Keychain"                                       \
+		      ,                                                 )
+
+  SC_SCHEMA_DECLARATION(kSCValNetVPNAuthPasswordEncryptionPrompt, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCValNetVPNAuthPasswordEncryptionPrompt                      \
+	  SC_SCHEMA_KV(kSCValNetVPNAuthPasswordEncryptionPrompt         \
+		      ,"Prompt"                                         \
+		      ,                                                 )
 
   SC_SCHEMA_DECLARATION(kSCPropSystemComputerNameRegion, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropSystemComputerNameRegion                               \
 	  SC_SCHEMA_KV(kSCPropSystemComputerNameRegion                  \
 		      ,"ComputerNameRegion"                             \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropSystemHostName, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropSystemHostName                                         \
 	  SC_SCHEMA_KV(kSCPropSystemHostName                            \
 		      ,"HostName"                                       \
 		      ,CFString                                         )
-#endif
-
-#if !TARGET_OS_IPHONE
 
   SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesBondInterfaces, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropVirtualNetworkInterfacesBondInterfaces                 \
 	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesBondInterfaces    \
 		      ,"Interfaces"                                     \
 		      ,CFArray[CFString]                                )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesBondMode, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropVirtualNetworkInterfacesBondMode                       \
 	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesBondMode          \
 		      ,"Mode"                                           \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesBondOptions, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropVirtualNetworkInterfacesBondOptions                    \
 	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesBondOptions       \
 		      ,"Options"                                        \
 		      ,CFDictionary                                     )
-#endif
+
+  SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesBridgeInterfaces, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropVirtualNetworkInterfacesBridgeInterfaces               \
+	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesBridgeInterfaces  \
+		      ,"Interfaces"                                     \
+		      ,CFArray[CFString]                                )
+
+  SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesBridgeOptions, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))
+  #define kSCPropVirtualNetworkInterfacesBridgeOptions                  \
+	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesBridgeOptions     \
+		      ,"Options"                                        \
+		      ,CFDictionary                                     )
 
   SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesVLANInterface, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropVirtualNetworkInterfacesVLANInterface                  \
 	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesVLANInterface     \
 		      ,"Interface"                                      \
 		      ,CFString                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesVLANTag, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropVirtualNetworkInterfacesVLANTag                        \
 	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesVLANTag           \
 		      ,"Tag"                                            \
 		      ,CFNumber                                         )
-#endif
 
   SC_SCHEMA_DECLARATION(kSCPropVirtualNetworkInterfacesVLANOptions, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))
-#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/
   #define kSCPropVirtualNetworkInterfacesVLANOptions                    \
 	  SC_SCHEMA_KV(kSCPropVirtualNetworkInterfacesVLANOptions       \
 		      ,"Options"                                        \
 		      ,CFDictionary                                     )
-#endif
-
-#endif // !TARGET_OS_IPHONE
 
 #endif /* _SCSCHEMADEFINITIONSPRIVATE_H */
diff --git a/SystemConfiguration.fproj/SystemConfiguration.h b/SystemConfiguration.fproj/SystemConfiguration.h
index 044107f..a1337bd 100644
--- a/SystemConfiguration.fproj/SystemConfiguration.h
+++ b/SystemConfiguration.fproj/SystemConfiguration.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004, 2006, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2006, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -106,9 +106,9 @@ enum {
 	/*
 	 * SCNetworkConnection error codes
 	 */
-#if	(__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)
-	kSCStatusConnectionNoService		= 5001	/* Network service for connection not available */
-#endif
+	kSCStatusConnectionNoService		= 5001,	/* Network service for connection not available
+							   __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0)
+							 */
 };
 
 
diff --git a/SystemConfiguration.fproj/VLANConfiguration.c b/SystemConfiguration.fproj/VLANConfiguration.c
index ed8bd36..0323b94 100644
--- a/SystemConfiguration.fproj/VLANConfiguration.c
+++ b/SystemConfiguration.fproj/VLANConfiguration.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2003-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -336,7 +336,7 @@ SCVLANInterfaceCopyAll(SCPreferencesRef prefs)
 
 static void
 addAvailableInterfaces(CFMutableArrayRef available, CFArrayRef interfaces,
-		       CFSetRef exclude)
+		       CFSetRef excluded)
 {
 	CFIndex	i;
 	CFIndex	n;
@@ -349,8 +349,8 @@ addAvailableInterfaces(CFMutableArrayRef available, CFArrayRef interfaces,
 		interface = CFArrayGetValueAtIndex(interfaces, i);
 		interfacePrivate = (SCNetworkInterfacePrivateRef)interface;
 
-		if (exclude != NULL
-		    && CFSetContainsValue(exclude, interface)) {
+		if ((excluded != NULL)
+		    && CFSetContainsValue(excluded, interface)) {
 			// exclude this interface
 			continue;
 		}
@@ -368,8 +368,9 @@ CFArrayRef
 SCVLANInterfaceCopyAvailablePhysicalInterfaces()
 {
 	CFMutableArrayRef	available;
-	CFArrayRef		bond_interfaces = NULL;
-	CFMutableSetRef		exclude = NULL;
+	CFArrayRef		bond_interfaces		= NULL;
+	CFArrayRef		bridge_interfaces	= NULL;
+	CFMutableSetRef		excluded		= NULL;
 	CFArrayRef		interfaces;
 	SCPreferencesRef	prefs;
 
@@ -378,17 +379,26 @@ SCVLANInterfaceCopyAvailablePhysicalInterfaces()
 	prefs = SCPreferencesCreate(NULL, CFSTR("SCVLANInterfaceCopyAvailablePhysicalInterfaces"), NULL);
 	if (prefs != NULL) {
 		bond_interfaces = SCBondInterfaceCopyAll(prefs);
-		CFRelease(prefs);
 		if (bond_interfaces != NULL) {
-			exclude = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
-			__SCBondInterfaceListCopyMembers(bond_interfaces, exclude);
+			excluded = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+			__SCBondInterfaceListCollectMembers(bond_interfaces, excluded);
 		}
+
+		bridge_interfaces = SCBridgeInterfaceCopyAll(prefs);
+		if (bridge_interfaces != NULL) {
+			if (excluded == NULL) {
+				excluded = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
+			}
+			__SCBridgeInterfaceListCollectMembers(bridge_interfaces, excluded);
+		}
+
+		CFRelease(prefs);
 	}
 
-	// add real interfaces that aren't part of a bond
+	// add real interfaces that aren't part of a bond or bridge
 	interfaces = __SCNetworkInterfaceCopyAll_IONetworkInterface();
 	if (interfaces != NULL) {
-		addAvailableInterfaces(available, interfaces, exclude);
+		addAvailableInterfaces(available, interfaces, excluded);
 		CFRelease(interfaces);
 	}
 
@@ -397,8 +407,15 @@ SCVLANInterfaceCopyAvailablePhysicalInterfaces()
 		addAvailableInterfaces(available, bond_interfaces, NULL);
 		CFRelease(bond_interfaces);
 	}
-	if (exclude != NULL) {
-		CFRelease(exclude);
+
+	// add bridge interfaces
+	if (bridge_interfaces != NULL) {
+		addAvailableInterfaces(available, bridge_interfaces, NULL);
+		CFRelease(bridge_interfaces);
+	}
+
+	if (excluded != NULL) {
+		CFRelease(excluded);
 	}
 
 	return available;
@@ -435,7 +452,7 @@ _SCVLANInterfaceCopyActive(void)
 		SCNetworkInterfaceRef	vlan_physical;
 		CFStringRef		vlan_physical_if;
 		CFNumberRef		vlan_tag;
-		char			vlr_parent[IFNAMSIZ + 1];
+		char			vlr_parent[IFNAMSIZ];
 		int			vlr_tag;
 		struct vlanreq		vreq;
 
@@ -448,7 +465,7 @@ _SCVLANInterfaceCopyActive(void)
 
 		bzero(&ifr, sizeof(ifr));
 		bzero(&vreq, sizeof(vreq));
-		strncpy(ifr.ifr_name, ifp->ifa_name, sizeof(ifr.ifr_name));
+		strlcpy(ifr.ifr_name, ifp->ifa_name, sizeof(ifr.ifr_name));
 		ifr.ifr_data = (caddr_t)&vreq;
 
 		if (ioctl(s, SIOCGIFVLAN, (caddr_t)&ifr) == -1) {
@@ -465,8 +482,7 @@ _SCVLANInterfaceCopyActive(void)
 		CFRelease(vlan_if);
 
 		// set the physical interface and tag
-		bzero(&vlr_parent, sizeof(vlr_parent));
-		bcopy(vreq.vlr_parent, vlr_parent, IFNAMSIZ);
+		strlcpy(vlr_parent, vreq.vlr_parent, sizeof(vlr_parent));
 		vlan_physical_if = CFStringCreateWithCString(NULL, vlr_parent, kCFStringEncodingASCII);
 		vlan_physical = _SCNetworkInterfaceCreateWithBSDName(NULL, vlan_physical_if,
 								     kIncludeBondInterfaces);
@@ -985,7 +1001,7 @@ _SCVLANInterfaceUpdateConfiguration(SCPreferencesRef prefs)
 
 	/* configured VLANs */
 	config = SCVLANInterfaceCopyAll(prefs);
-	nConfig = CFArrayGetCount(config);
+	nConfig = (config != NULL) ? CFArrayGetCount(config) : 0;
 
 	/* physical interfaces */
 	devices = CFDictionaryCreateMutable(NULL,
@@ -995,7 +1011,7 @@ _SCVLANInterfaceUpdateConfiguration(SCPreferencesRef prefs)
 
 	/* active VLANs */
 	active  = _SCVLANInterfaceCopyActive();
-	nActive = CFArrayGetCount(active);
+	nActive = (active != NULL) ? CFArrayGetCount(active) : 0;
 
 	/* remove any no-longer-configured VLAN interfaces */
 	for (i = 0; i < nActive; i++) {
diff --git a/SystemConfiguration.fproj/VPNConfiguration.c b/SystemConfiguration.fproj/VPNConfiguration.c
new file mode 100644
index 0000000..4e587a2
--- /dev/null
+++ b/SystemConfiguration.fproj/VPNConfiguration.c
@@ -0,0 +1,4 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ */
+
diff --git a/SystemConfiguration.fproj/VPNConfiguration.h b/SystemConfiguration.fproj/VPNConfiguration.h
new file mode 100644
index 0000000..4e587a2
--- /dev/null
+++ b/SystemConfiguration.fproj/VPNConfiguration.h
@@ -0,0 +1,4 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ */
+
diff --git a/SystemConfiguration.fproj/VPNPrivate.c b/SystemConfiguration.fproj/VPNPrivate.c
new file mode 100644
index 0000000..2dfbed3
--- /dev/null
+++ b/SystemConfiguration.fproj/VPNPrivate.c
@@ -0,0 +1,5 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ */
+
+
diff --git a/SystemConfiguration.fproj/VPNPrivate.h b/SystemConfiguration.fproj/VPNPrivate.h
new file mode 100644
index 0000000..4e587a2
--- /dev/null
+++ b/SystemConfiguration.fproj/VPNPrivate.h
@@ -0,0 +1,4 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ */
+
diff --git a/SystemConfiguration.fproj/VPNTunnel.c b/SystemConfiguration.fproj/VPNTunnel.c
new file mode 100644
index 0000000..4e587a2
--- /dev/null
+++ b/SystemConfiguration.fproj/VPNTunnel.c
@@ -0,0 +1,4 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ */
+
diff --git a/SystemConfiguration.fproj/VPNTunnel.h b/SystemConfiguration.fproj/VPNTunnel.h
new file mode 100644
index 0000000..4e587a2
--- /dev/null
+++ b/SystemConfiguration.fproj/VPNTunnel.h
@@ -0,0 +1,4 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ */
+
diff --git a/SystemConfiguration.fproj/VPNTunnelPrivate.h b/SystemConfiguration.fproj/VPNTunnelPrivate.h
new file mode 100644
index 0000000..4e587a2
--- /dev/null
+++ b/SystemConfiguration.fproj/VPNTunnelPrivate.h
@@ -0,0 +1,4 @@
+/*
+ * Copyright (c) 2009-2011 Apple Inc. All rights reserved.
+ */
+
diff --git a/SystemConfiguration.fproj/dy_framework.c b/SystemConfiguration.fproj/dy_framework.c
index 9763e5b..e35580e 100644
--- a/SystemConfiguration.fproj/dy_framework.c
+++ b/SystemConfiguration.fproj/dy_framework.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2002-2008, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -37,6 +37,10 @@
 #include "dy_framework.h"
 
 
+
+#pragma mark -
+#pragma mark IOKit.framework APIs
+
 static void *
 __loadIOKit(void) {
 	static void *image = NULL;
@@ -252,13 +256,18 @@ _IOServiceMatching(const char *name)
 	return dyfunc ? dyfunc(name) : NULL;
 }
 
-#if	!TARGET_OS_IPHONE
+#pragma mark -
+#pragma mark Security.framework APIs
 
 static void *
 __loadSecurity(void) {
 	static void *image = NULL;
 	if (NULL == image) {
+#if	TARGET_OS_IPHONE
+		const char	*framework		= "/System/Library/Frameworks/Security.framework/Security";
+#else
 		const char	*framework		= "/System/Library/Frameworks/Security.framework/Versions/A/Security";
+#endif
 		struct stat	statbuf;
 		const char	*suffix			= getenv("DYLD_IMAGE_SUFFIX");
 		char		path[MAXPATHLEN];
@@ -274,6 +283,27 @@ __loadSecurity(void) {
 	return (void *)image;
 }
 
+#if	!TARGET_OS_IPHONE
+
+#define	SECURITY_FRAMEWORK_EXTERN(t, s)				\
+	__private_extern__ t					\
+	_ ## s()						\
+	{							\
+		static t	*dysym = NULL;			\
+		if (!dysym) {					\
+			void *image = __loadSecurity();		\
+			if (image) dysym = dlsym(image, #s );	\
+		}						\
+		return (dysym != NULL) ? *dysym : NULL;		\
+	}
+
+SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecAttrService)
+SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecClass)
+SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecClassGenericPassword)
+SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchLimit)
+SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchLimitAll)
+SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchSearchList)
+SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecReturnRef)
 
 __private_extern__ OSStatus
 _AuthorizationMakeExternalForm(AuthorizationRef authorization, AuthorizationExternalForm *extForm)
@@ -287,18 +317,6 @@ _AuthorizationMakeExternalForm(AuthorizationRef authorization, AuthorizationExte
 	return dyfunc ? dyfunc(authorization, extForm) : -1;
 }
 
-__private_extern__ OSStatus
-_SecAccessCopySelectedACLList(SecAccessRef accessRef, CSSM_ACL_AUTHORIZATION_TAG action, CFArrayRef *aclList)
-{
-	#undef SecAccessCopySelectedACLList
-	static typeof (SecAccessCopySelectedACLList) *dyfunc = NULL;
-	if (!dyfunc) {
-		void *image = __loadSecurity();
-		if (image) dyfunc = dlsym(image, "SecAccessCopySelectedACLList");
-	}
-	return dyfunc ? dyfunc(accessRef, action, aclList) : -1;
-}
-
 __private_extern__ OSStatus
 _SecAccessCreate(CFStringRef descriptor, CFArrayRef trustedlist, SecAccessRef *accessRef)
 {
@@ -311,6 +329,7 @@ _SecAccessCreate(CFStringRef descriptor, CFArrayRef trustedlist, SecAccessRef *a
 	return dyfunc ? dyfunc(descriptor, trustedlist, accessRef) : -1;
 }
 
+#if	(__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
 __private_extern__ OSStatus
 _SecAccessCreateFromOwnerAndACL(const CSSM_ACL_OWNER_PROTOTYPE *owner, uint32 aclCount, const CSSM_ACL_ENTRY_INFO *acls, SecAccessRef *accessRef)
 {
@@ -322,6 +341,31 @@ _SecAccessCreateFromOwnerAndACL(const CSSM_ACL_OWNER_PROTOTYPE *owner, uint32 ac
 	}
 	return dyfunc ? dyfunc(owner, aclCount, acls, accessRef) : -1;
 }
+#else	// (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
+__private_extern__ SecAccessRef
+_SecAccessCreateWithOwnerAndACL(uid_t userId, gid_t groupId, SecAccessOwnerType ownerType, CFArrayRef acls, CFErrorRef *error)
+{
+#undef SecAccessCreateWithOwnerAndACL
+	static typeof (SecAccessCreateWithOwnerAndACL) *dyfunc = NULL;
+	if (!dyfunc) {
+		void *image = __loadSecurity();
+		if (image) dyfunc = dlsym(image, "SecAccessCreateWithOwnerAndACL");
+	}
+	return dyfunc ? dyfunc(userId, groupId, ownerType, acls, error) : NULL;
+}
+#endif	// (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
+
+__private_extern__ OSStatus
+_SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result)
+{
+#undef SecItemCopyMatching
+	static typeof (SecItemCopyMatching) *dyfunc = NULL;
+	if (!dyfunc) {
+		void *image = __loadSecurity();
+		if (image) dyfunc = dlsym(image, "SecItemCopyMatching");
+	}
+	return dyfunc ? dyfunc(query, result) : -1;
+}
 
 __private_extern__ OSStatus
 _SecKeychainCopyDomainDefault(SecPreferencesDomain domain, SecKeychainRef *keychain)
@@ -444,39 +488,28 @@ _SecKeychainItemModifyContent(SecKeychainItemRef itemRef, const SecKeychainAttri
 }
 
 __private_extern__ OSStatus
-_SecKeychainSearchCopyNext(SecKeychainSearchRef searchRef, SecKeychainItemRef *itemRef)
+_SecTrustedApplicationCreateFromPath(const char *path, SecTrustedApplicationRef *app)
 {
-	#undef SecKeychainSearchCopyNext
-	static typeof (SecKeychainSearchCopyNext) *dyfunc = NULL;
+	#undef SecTrustedApplicationCreateFromPath
+	static typeof (SecTrustedApplicationCreateFromPath) *dyfunc = NULL;
 	if (!dyfunc) {
 		void *image = __loadSecurity();
-		if (image) dyfunc = dlsym(image, "SecKeychainSearchCopyNext");
+		if (image) dyfunc = dlsym(image, "SecTrustedApplicationCreateFromPath");
 	}
-	return dyfunc ? dyfunc(searchRef, itemRef) : -1;
+	return dyfunc ? dyfunc(path, app) : -1;
 }
 
-__private_extern__ OSStatus
-_SecKeychainSearchCreateFromAttributes(CFTypeRef keychainOrArray, SecItemClass itemClass, const SecKeychainAttributeList *attrList, SecKeychainSearchRef *searchRef)
-{
-	#undef SecKeychainSearchCreateFromAttributes
-	static typeof (SecKeychainSearchCreateFromAttributes) *dyfunc = NULL;
-	if (!dyfunc) {
-		void *image = __loadSecurity();
-		if (image) dyfunc = dlsym(image, "SecKeychainSearchCreateFromAttributes");
-	}
-	return dyfunc ? dyfunc(keychainOrArray, itemClass, attrList, searchRef) : -1;
-}
+#endif	// !TARGET_OS_IPHONE
 
-__private_extern__ OSStatus
-_SecTrustedApplicationCreateFromPath(const char *path, SecTrustedApplicationRef *app)
+__private_extern__ SecCertificateRef
+_SecCertificateCreateWithData(CFAllocatorRef allocator, CFDataRef data)
 {
-	#undef SecTrustedApplicationCreateFromPath
-	static typeof (SecTrustedApplicationCreateFromPath) *dyfunc = NULL;
+	#undef SecCertificateCreateWithData
+	static typeof (SecCertificateCreateWithData) *dyfunc = NULL;
 	if (!dyfunc) {
 		void *image = __loadSecurity();
-		if (image) dyfunc = dlsym(image, "SecTrustedApplicationCreateFromPath");
+		if (image) dyfunc = dlsym(image, "SecCertificateCreateWithData");
 	}
-	return dyfunc ? dyfunc(path, app) : -1;
+	return dyfunc ? dyfunc(allocator, data) : NULL;
 }
 
-#endif	// !TARGET_OS_IPHONE
diff --git a/SystemConfiguration.fproj/dy_framework.h b/SystemConfiguration.fproj/dy_framework.h
index cb5f201..84e3d10 100644
--- a/SystemConfiguration.fproj/dy_framework.h
+++ b/SystemConfiguration.fproj/dy_framework.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2002-2008, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -31,10 +31,8 @@
 #include <mach/mach.h>
 #include <CoreFoundation/CoreFoundation.h>
 #include <IOKit/IOKitLib.h>
-
-#if	!TARGET_OS_IPHONE
 #include <Security/Security.h>
-#endif	// !TARGET_OS_IPHONE
+#include <Security/SecItem.h>	// only needed for Mac OS X 10.6[.x]
 
 __BEGIN_DECLS
 
@@ -161,6 +159,27 @@ _IOServiceMatching			(
 
 #if	!TARGET_OS_IPHONE
 
+CFTypeRef _kSecAttrService();
+#define kSecAttrService _kSecAttrService()
+
+CFTypeRef _kSecClass();
+#define kSecClass _kSecClass()
+
+CFTypeRef _kSecClassGenericPassword();
+#define kSecClassGenericPassword _kSecClassGenericPassword()
+
+CFTypeRef _kSecMatchLimit();
+#define kSecMatchLimit _kSecMatchLimit()
+
+CFTypeRef _kSecMatchLimitAll();
+#define kSecMatchLimitAll _kSecMatchLimitAll()
+
+CFTypeRef _kSecMatchSearchList();
+#define kSecMatchSearchList _kSecMatchSearchList()
+
+CFTypeRef _kSecReturnRef();
+#define kSecReturnRef _kSecReturnRef()
+
 OSStatus
 _AuthorizationMakeExternalForm		(
 					AuthorizationRef		authorization,
@@ -168,14 +187,6 @@ _AuthorizationMakeExternalForm		(
 					);
 #define AuthorizationMakeExternalForm _AuthorizationMakeExternalForm
 
-OSStatus
-_SecAccessCopySelectedACLList		(
-					SecAccessRef			accessRef,
-					CSSM_ACL_AUTHORIZATION_TAG	action,
-					CFArrayRef			*aclList
-					);
-#define SecAccessCopySelectedACLList _SecAccessCopySelectedACLList
-
 OSStatus
 _SecAccessCreate			(
 					CFStringRef			descriptor,
@@ -184,6 +195,7 @@ _SecAccessCreate			(
 					);
 #define SecAccessCreate _SecAccessCreate
 
+#if	(__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
 OSStatus
 _SecAccessCreateFromOwnerAndACL		(
 					const CSSM_ACL_OWNER_PROTOTYPE	*owner,
@@ -192,6 +204,24 @@ _SecAccessCreateFromOwnerAndACL		(
 					SecAccessRef			*accessRef
 					);
 #define SecAccessCreateFromOwnerAndACL _SecAccessCreateFromOwnerAndACL
+#else	// (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
+SecAccessRef
+_SecAccessCreateWithOwnerAndACL		(
+					uid_t				userId,
+					gid_t				groupId,
+					SecAccessOwnerType		ownerType,
+					CFArrayRef			acls,
+					CFErrorRef			*error
+					);
+#define SecAccessCreateWithOwnerAndACL _SecAccessCreateWithOwnerAndACL
+#endif	// (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
+
+OSStatus
+_SecItemCopyMatching			(
+					CFDictionaryRef			query,
+					CFTypeRef			*result
+					);
+#define SecItemCopyMatching _SecItemCopyMatching
 
 OSStatus
 _SecKeychainCopyDomainDefault		(
@@ -270,22 +300,6 @@ _SecKeychainItemModifyContent		(
 					);
 #define SecKeychainItemModifyContent _SecKeychainItemModifyContent
 
-OSStatus
-_SecKeychainSearchCopyNext		(
-					SecKeychainSearchRef		searchRef,
-					SecKeychainItemRef		*itemRef
-					);
-#define SecKeychainSearchCopyNext _SecKeychainSearchCopyNext
-
-OSStatus
-_SecKeychainSearchCreateFromAttributes	(
-					CFTypeRef			keychainOrArray,
-					SecItemClass			itemClass,
-					const SecKeychainAttributeList	*attrList,
-					SecKeychainSearchRef		*searchRef
-					);
-#define SecKeychainSearchCreateFromAttributes _SecKeychainSearchCreateFromAttributes
-
 OSStatus
 _SecTrustedApplicationCreateFromPath	(
 					const char			*path,
@@ -295,6 +309,13 @@ _SecTrustedApplicationCreateFromPath	(
 
 #endif	// !TARGET_OS_IPHONE
 
+SecCertificateRef
+_SecCertificateCreateWithData(
+			      CFAllocatorRef allocator,
+			      CFDataRef data
+			      );
+#define SecCertificateCreateWithData _SecCertificateCreateWithData
+
 __END_DECLS
 
 #endif	// _DY_FRAMEWORK_H
diff --git a/SystemConfiguration.fproj/genSCPreferences.c b/SystemConfiguration.fproj/genSCPreferences.c
index dd435d5..ec98374 100644
--- a/SystemConfiguration.fproj/genSCPreferences.c
+++ b/SystemConfiguration.fproj/genSCPreferences.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -59,7 +59,7 @@
 
 char copyright_string[] =
 "/*\n"
-" * Copyright (c) 2000-2009 Apple Inc. All rights reserved.\n"
+" * Copyright (c) 2000-2011 Apple Inc. All rights reserved.\n"
 " *\n"
 " * @APPLE_LICENSE_HEADER_START@\n"
 " * \n"
@@ -94,15 +94,19 @@ typedef enum {
 	SC_10_4,
 	SC_10_1_10_5,	// deprecated in 10.5
 	SC_10_5,
+	SC_10_5_10_7,	// deprecated in 10.7
 	SC_10_1_10_6,	// deprecated in 10.6
 	SC_10_2_10_6,	// deprecated in 10.6
 	SC_10_6_IPHONE_2_0,
 	SC_10_6_IPHONE_3_0,
+	SC_10_7_IPHONE_4_0,
 	COMMENT_PRIVATE,
 	GROUP_PRIVATE,
 	SC_10_5_PRIVATE,
 	SC_10_6_IPHONE_2_0_PRIVATE,
 	SC_10_6_IPHONE_3_0_PRIVATE,
+	SC_10_7_IPHONE_4_0_PRIVATE,
+	SC_10_7_IPHONE_5_0_PRIVATE,
 	SC_IPHONE_2_0_PRIVATE,
 	COMMENT_DEPRECATED,
 	GROUP_DEPRECATED,
@@ -132,6 +136,7 @@ typedef enum {
 #define VERSION			"Version"
 #define VIRTUALPROP		"PropVirtualNetworkInterfaces"
 
+#define CFARRAY_CFDICTIONARY	"CFArray[CFDictionary]"
 #define CFARRAY_CFNUMBER	"CFArray[CFNumber]"
 #define CFARRAY_CFSTRING	"CFArray[CFString]"
 #define CFBOOLEAN		"CFBoolean"
@@ -144,13 +149,14 @@ typedef enum {
 #define ACCESSPOINTNAME		"AccessPointName"
 #define ACSP			"ACSP"			// Apple Client Server Protocol
 #define ACTIVE			"Active"
+#define ADDRESS			"Address"
 #define ADDRESSES		"Addresses"
 #define AFTER			"After"
 #define AGGRESSIVE		"Aggressive"
 #define AIRPORT			"AirPort"
 #define ALERT			"Alert"
 #define ALLOWNETCREATION	"AllowNetCreation"
-#define ALTERNATEREMOTEADDRESS	"AlternateRemoteAddress"
+#define ALTERNATE		"Alternate"
 #define ALWAYS			"Always"
 #define ANYREGEX		"AnyRegex"
 #define APPLETALK		"AppleTalk"
@@ -159,12 +165,16 @@ typedef enum {
 #define AUTOCONFIG		"AutoConfig"
 #define AUTODISCOVERY		"AutoDiscovery"
 #define AUTOMATIC		"Automatic"
+#define AV			"AV"
 #define BEFORE			"Before"
 #define BINDINGMETHODS		"BindingMethods"
 #define	BOND			"Bond"
 #define BOOTP			"BOOTP"
+#define	BRIDGE			"Bridge"
 #define BROADCAST		"Broadcast"
 #define CALLWAITINGAUDIBLEALERT	"CallWaitingAudibleAlert"
+#define CAPABILITY		"Capability"
+#define CAPABILITIES		"Capabilities"
 #define CAUSE			"Cause"
 #define CCP			"CCP"
 #define CHAP			"CHAP"
@@ -188,6 +198,7 @@ typedef enum {
 #define DEFAULT			"Default"
 #define DEFAULTZONE		"DefaultZone"
 #define DEST			"Dest"
+#define DESTINATION		"Destination"
 #define DETACHING		"Detaching"
 #define DEVICE			"Device"
 #define DEVICENAME		"DeviceName"
@@ -218,6 +229,7 @@ typedef enum {
 #define ERRORCORRECTION		"ErrorCorrection"
 #define ETHERNET		"Ethernet"
 #define EXCEPTIONSLIST		"ExceptionsList"
+#define EXCLUDED		"Excluded"
 #define EXCLUDESIMPLEHOSTNAMES	"ExcludeSimpleHostnames"
 #define FAILOVER		"Failover"
 #define FILE			"File"
@@ -225,6 +237,7 @@ typedef enum {
 #define FIRST			"First"
 #define FLAGS			"Flags"
 #define FTP			"FTP"
+#define GATEWAY			"Gateway"
 #define GID			"GID"
 #define GLOBAL			"Global"
 #define GOPHER			"Gopher"
@@ -241,6 +254,7 @@ typedef enum {
 #define IGNOREDIALTONE		"IgnoreDialTone"
 #define IGNORELINKSTATUS	"IgnoreLinkStatus"
 #define INACTIVE		"Inactive"
+#define INCLUDED		"Included"
 #define INFORM			"INFORM"
 #define INTERFACE		"Interface"
 #define INTERFACENAME		"InterfaceName"
@@ -250,7 +264,9 @@ typedef enum {
 #define IPV4			"IPv4"
 #define IPV6			"IPv6"
 #define IPSEC			"IPSec"
+#define JAVASCRIPT		"JavaScript"
 #define JOIN			"Join"
+#define JUMBO_MTU		"JUMBO_MTU"
 #define KEYCHAIN		"Keychain"
 #define KEYID			"KeyID"
 #define L2TP			"L2TP"
@@ -262,7 +278,9 @@ typedef enum {
 #define LOCALHOSTNAME		"LocalHostName"
 #define LOCALIDENTIFIER		"LocalIdentifier"
 #define LOGFILE			"Logfile"
+#define LOOPBACK		"Loopback"
 #define LOW			"Low"
+#define LRO			"LRO"
 #define MACADDRESS		"MACAddress"
 #define MANUAL			"Manual"
 #define MATCH			"Match"
@@ -332,11 +350,15 @@ typedef enum {
 #define REMOTEADDRESS		"RemoteAddress"
 #define RETRYCONNECTTIME	"RetryConnectTime"
 #define ROOTSEPARATOR		"RootSeparator"
+#define ROUTE			"Route"
 #define ROUTER			"Router"
+#define ROUTES			"Routes"
 #define ROUTERADVERTISEMENT	"RouterAdvertisement"
 #define RTSP			"RTSP"
+#define RXCSUM			"RXCSUM"
 #define SAVEPASSWORDS		"SavePasswords"
 #define SCOPE			"Scope"
+#define SCOPED			"Scoped"
 #define SCRIPT			"Script"
 #define SEARCH			"Search"
 #define SEEDNETWORKRANGE	"SeedNetworkRange"
@@ -358,6 +380,7 @@ typedef enum {
 #define STATUS			"Status"
 #define STF			"6to4"
 #define STRONGEST		"Strongest"
+#define SUBNETMASK		"SubnetMask"
 #define SUBNETMASKS		"SubnetMasks"
 #define SUBTYPE			"SubType"
 #define SUPPLEMENTAL		"Supplemental"
@@ -370,6 +393,10 @@ typedef enum {
 #define TOKEN			"Token"
 #define TRANSMITACCM		"TransmitACCM"
 #define TRANSPORT		"Transport"
+#define TSO			"TSO"
+#define TSO4			"TSO4"
+#define TSO6			"TSO6"
+#define TXCSUM			"TXCSUM"
 #define TYPE			"Type"
 #define UID			"UID"
 #define UPDATED			"Updated"
@@ -381,6 +408,9 @@ typedef enum {
 #define VERBOSELOGGING		"VerboseLogging"
 #define VIRTUALNETWORKINTERFACES	"VirtualNetworkInterfaces"
 #define	VLAN			"VLAN"
+#define VLAN_HWTAGGING		"VLAN_HWTAGGING"
+#define VLAN_MTU		"VLAN_MTU"
+#define	VPN			"VPN"
 #define WAITFORDIALTONE		"WaitForDialTone"
 #define WINS			"WINS"
 #define WORKGROUP		"Workgroup"
@@ -473,8 +503,10 @@ static schemaDefinition names[] = {
   { GROUP_PRIVATE, NETENT, "Network Entity Keys", NULL, NULL },
 
     { SC_10_5_PRIVATE, NETENT, EAPOL, NULL, CFDICTIONARY },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETENT, LOOPBACK, NULL, CFDICTIONARY },
     { SC_10_6_IPHONE_3_0_PRIVATE, NETENT, ONDEMAND, NULL, CFDICTIONARY },
     { SC_10_6_IPHONE_2_0_PRIVATE, NETENT, SERVICE, "__SERVICE__", CFDICTIONARY },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETENT, VPN, NULL, CFDICTIONARY },
     { COMMENT_PRIVATE, "", NULL, NULL, NULL },
 
   { GROUP, NETPROP, KEY_PREFIX COMP NETWORK " Properties", NULL, NULL },
@@ -562,6 +594,20 @@ static schemaDefinition names[] = {
     { SC_10_2, NETPROP ETHERNET, MTU, NULL, CFNUMBER },
     { COMMENT, "", NULL, NULL, NULL },
 
+  { GROUP_PRIVATE, NETPROP ETHERNET, KEY_PREFIX NETENT ETHERNET " (Hardware) Entity Keys", NULL, NULL },
+    
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY AV, AV, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY JUMBO_MTU, JUMBO_MTU, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY LRO, LRO, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY RXCSUM, RXCSUM, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY TSO, TSO, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY TSO4, TSO4, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY TSO6, TSO6, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY TXCSUM, TXCSUM, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY VLAN_HWTAGGING, VLAN_HWTAGGING, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP ETHERNET, CAPABILITY VLAN_MTU, VLAN_MTU, CFNUMBER_BOOL },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    
   { GROUP, NETPROP FIREWIRE, KEY_PREFIX NETENT FIREWIRE " (Hardware) Entity Keys", NULL, NULL },
 
     { COMMENT, "* RESERVED FOR FUTURE USE *", NULL, NULL, NULL },
@@ -588,6 +634,13 @@ static schemaDefinition names[] = {
     { SC_10_2, NETVAL INTERFACE SUBTYPE, PPTP, NULL, NULL },
     { SC_10_3, NETVAL INTERFACE SUBTYPE, L2TP, NULL, NULL },
     { COMMENT, "", NULL, NULL, NULL },
+    
+  { GROUP_PRIVATE, NETPROP INTERFACE, KEY_PREFIX NETENT INTERFACE " Entity Keys", NULL, NULL },
+    
+    { COMMENT_PRIVATE, "--- " KEY_PREFIX NETPROP INTERFACE TYPE " values ---", NULL, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETVAL INTERFACE TYPE, LOOPBACK, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETVAL INTERFACE TYPE, VPN, NULL, NULL },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
 
   { GROUP, NETPROP IPSEC, KEY_PREFIX NETENT IPSEC " Entity Keys", NULL, NULL },
 
@@ -653,9 +706,18 @@ static schemaDefinition names[] = {
     { COMMENT, "", NULL, NULL, NULL },
 
   { GROUP_PRIVATE, NETPROP IPV4, KEY_PREFIX NETENT IPV4 " Entity Keys", NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV4, EXCLUDED ROUTES, NULL, CFARRAY_CFDICTIONARY },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV4, INCLUDED ROUTES, NULL, CFARRAY_CFDICTIONARY },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
     { COMMENT_PRIVATE, "--- " KEY_PREFIX NETPROP IPV4 CONFIGMETHOD " values ---", NULL, NULL, NULL },
     { SC_10_5_PRIVATE, NETVAL IPV4 CONFIGMETHOD, FAILOVER, NULL, NULL },
     { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    { COMMENT_PRIVATE, "--- " KEY_PREFIX NETPROP IPV4 INCLUDED ROUTES ", "
+			      KEY_PREFIX NETPROP IPV4 EXCLUDED ROUTES " [CFDictionary] keys ---", NULL, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV4 ROUTE, DESTINATION ADDRESS, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV4 ROUTE, SUBNETMASK, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV4 ROUTE, GATEWAY ADDRESS, NULL, CFSTRING },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
 
   { GROUP, NETPROP IPV6, KEY_PREFIX NETENT IPV6 " Entity Keys", NULL, NULL },
 
@@ -668,11 +730,23 @@ static schemaDefinition names[] = {
     { COMMENT, "", NULL, NULL, NULL },
     { COMMENT, "--- " KEY_PREFIX NETPROP IPV6 CONFIGMETHOD " values ---", NULL, NULL, NULL },
     { SC_10_3, NETVAL IPV6 CONFIGMETHOD, AUTOMATIC, NULL, NULL },
+    { SC_10_7_IPHONE_4_0, NETVAL IPV6 CONFIGMETHOD, LINKLOCAL, NULL, NULL },
     { SC_10_3, NETVAL IPV6 CONFIGMETHOD, MANUAL, NULL, NULL },
     { SC_10_3, NETVAL IPV6 CONFIGMETHOD, ROUTERADVERTISEMENT, NULL, NULL },
     { SC_10_3, NETVAL IPV6 CONFIGMETHOD, STF, NULL, NULL },
     { COMMENT, "", NULL, NULL, NULL },
 
+  { GROUP_PRIVATE, NETPROP IPV6, KEY_PREFIX NETENT IPV6 " Entity Keys", NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV6, EXCLUDED ROUTES, NULL, CFARRAY_CFDICTIONARY },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV6, INCLUDED ROUTES, NULL, CFARRAY_CFDICTIONARY },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    { COMMENT_PRIVATE, "--- " KEY_PREFIX NETPROP IPV6 INCLUDED ROUTES ", "
+			      KEY_PREFIX NETPROP IPV6 EXCLUDED ROUTES " [CFDictionary] keys ---", NULL, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV6 ROUTE, DESTINATION ADDRESS, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV6 ROUTE, PREFIXLENGTH, NULL, CFNUMBER },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP IPV6 ROUTE, GATEWAY ADDRESS, NULL, CFSTRING },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    
   { GROUP, NETPROP STF, KEY_PREFIX NETENT STF " Entity Keys", NULL, NULL },
 
     { SC_10_3, NETPROP STF, RELAY, NULL, CFSTRING },
@@ -779,7 +853,7 @@ static schemaDefinition names[] = {
     { COMMENT, "", NULL, NULL, NULL },
 
     { COMMENT, "--- " COMM ": ---", NULL, NULL, NULL },
-    { SC_10_1, NETPROP PPP, COMM ALTERNATEREMOTEADDRESS, NULL, CFSTRING },
+    { SC_10_1, NETPROP PPP, COMM ALTERNATE REMOTEADDRESS, NULL, CFSTRING },
     { SC_10_1, NETPROP PPP, COMM CONNECTDELAY, NULL, CFNUMBER },
     { SC_10_1, NETPROP PPP, COMM DISPLAYTERMINALWINDOW, NULL, CFNUMBER_BOOL },
     { SC_10_1, NETPROP PPP, COMM REDIALCOUNT, NULL, CFNUMBER },
@@ -819,11 +893,9 @@ static schemaDefinition names[] = {
     { SC_10_5_PRIVATE, NETPROP PPP, ONDEMAND DOMAINS, NULL, CFARRAY_CFSTRING },
     { SC_10_5_PRIVATE, NETPROP PPP, ONDEMAND ENABLED, NULL, CFNUMBER_BOOL },
     { SC_10_5_PRIVATE, NETPROP PPP, ONDEMAND HOSTNAME, NULL, CFSTRING },    // DEPRECATED, use kSCNetworkConnectionSelectionOptionOnDemandHostName
-#ifdef	NOTYET
-    { SC_10_6_IPHONE_3_0_PRIVATE, NETPROP PPP, ONDEMAND MATCH DOMAINS ALWAYS, NULL, CFARRAY_CFSTRING },
-    { SC_10_6_IPHONE_3_0_PRIVATE, NETPROP PPP, ONDEMAND MATCH DOMAINS ONRETRY, NULL, CFARRAY_CFSTRING },
-    { SC_10_6_IPHONE_3_0_PRIVATE, NETPROP PPP, ONDEMAND MATCH DOMAINS NEVER, NULL, CFARRAY_CFSTRING },
-#endif	// NOTYET
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PPP, ONDEMAND MATCH DOMAINS ALWAYS, NULL, CFARRAY_CFSTRING },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PPP, ONDEMAND MATCH DOMAINS ONRETRY, NULL, CFARRAY_CFSTRING },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PPP, ONDEMAND MATCH DOMAINS NEVER, NULL, CFARRAY_CFSTRING },
     { SC_10_5_PRIVATE, NETPROP PPP, ONDEMAND MODE, NULL, CFSTRING },
     { SC_10_5_PRIVATE, NETPROP PPP, ONDEMAND PRIORITY, NULL, CFSTRING },
     { COMMENT_PRIVATE, "", NULL, NULL, NULL },
@@ -891,10 +963,21 @@ static schemaDefinition names[] = {
     { SC_10_1, NETPROP PROXIES, SOCKS PORT, NULL, CFNUMBER },
     { SC_10_1, NETPROP PROXIES, SOCKS PROXY, NULL, CFSTRING },
     { SC_10_4, NETPROP PROXIES, PROXY AUTOCONFIG ENABLE, NULL, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_4_0, NETPROP PROXIES, PROXY AUTOCONFIG JAVASCRIPT, NULL, CFSTRING },
     { SC_10_4, NETPROP PROXIES, PROXY AUTOCONFIG URLSTRING, NULL, CFSTRING },
     { SC_10_4, NETPROP PROXIES, PROXY AUTODISCOVERY ENABLE, NULL, CFNUMBER_BOOL },
     { COMMENT, "", NULL, NULL, NULL },
 
+  { GROUP_PRIVATE, NETPROP PROXIES, KEY_PREFIX NETENT PROXIES " Entity Keys", NULL, NULL },
+
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PROXIES, SUPPLEMENTAL MATCH DOMAINS, NULL, CFARRAY_CFSTRING},
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PROXIES, SUPPLEMENTAL MATCH ORDERS, NULL, CFARRAY_CFNUMBER},
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PROXIES, SCOPED, "__SCOPED__", CFDICTIONARY},
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PROXIES, SUPPLEMENTAL, "__SUPPLEMENTAL__", CFARRAY_CFDICTIONARY},
+    { SC_10_7_IPHONE_5_0_PRIVATE, NETPROP PROXIES, SUPPLEMENTAL MATCH DOMAIN, "__MATCH_DOMAIN__", CFSTRING},
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    
   { GROUP_PRIVATE, NETPROP SERVICE, KEY_PREFIX NETENT SERVICE " Entity Keys", NULL, NULL },
     
     { SC_10_6_IPHONE_2_0_PRIVATE, NETPROP SERVICE, PRIMARYRANK, NULL, CFSTRING },
@@ -911,7 +994,7 @@ static schemaDefinition names[] = {
     { DEFINE, "#if", "!TARGET_OS_IPHONE", NULL, NULL },
     { SC_10_5, NETPROP SMB, NETBIOS NAME, NULL, CFSTRING },
     { SC_10_5, NETPROP SMB, NETBIOS NODE TYPE, NULL, CFSTRING },
-    { SC_10_5, NETPROP SMB, NETBIOS SCOPE, NULL, CFSTRING },
+    { SC_10_5_10_7, NETPROP SMB, NETBIOS SCOPE, NULL, CFSTRING },
     { SC_10_5, NETPROP SMB, WINS ADDRESSES, NULL, CFARRAY_CFSTRING },
     { SC_10_5, NETPROP SMB, WORKGROUP, NULL, CFSTRING },
     { COMMENT, "", NULL, NULL, NULL },
@@ -923,6 +1006,38 @@ static schemaDefinition names[] = {
     { DEFINE, "#endif", "// !TARGET_OS_IPHONE", NULL, NULL },
     { COMMENT, "", NULL, NULL, NULL },
 
+  { GROUP_PRIVATE, NETPROP VPN, KEY_PREFIX NETENT VPN " Entity Keys", NULL, NULL },
+
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, AUTH NAME, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, AUTH PASSWORD, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, AUTH PASSWORD ENCRYPTION, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, AUTHENTICATIONMETHOD, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, CONNECTTIME, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, DISCONNECTONFASTUSERSWITCH, NULL, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, DISCONNECTONIDLE, NULL, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, DISCONNECTONIDLETIMER, NULL, CFNUMBER },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, DISCONNECTONLOGOUT, NULL, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, DISCONNECTONSLEEP, NULL, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, LOCALCERTIFICATE, NULL, CFDATA },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, LOGFILE, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, MTU, NULL, CFNUMBER },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, ONDEMAND ENABLED, NULL, CFNUMBER_BOOL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, ONDEMAND MATCH DOMAINS ALWAYS, NULL, CFARRAY_CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, ONDEMAND MATCH DOMAINS ONRETRY, NULL, CFARRAY_CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, ONDEMAND MATCH DOMAINS NEVER, NULL, CFARRAY_CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, REMOTEADDRESS, NULL, CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, STATUS, NULL, CFNUMBER },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETPROP VPN, VERBOSELOGGING, NULL, CFNUMBER_BOOL },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    { COMMENT_PRIVATE, "--- " KEY_PREFIX NETPROP VPN AUTHENTICATIONMETHOD " values ---", NULL, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETVAL VPN AUTHENTICATIONMETHOD, PASSWORD, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETVAL VPN AUTHENTICATIONMETHOD, CERTIFICATE, NULL, NULL },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    { COMMENT_PRIVATE, "--- " KEY_PREFIX NETPROP VPN AUTH PASSWORD ENCRYPTION " values ---", NULL, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETVAL VPN AUTH PASSWORD ENCRYPTION, KEYCHAIN, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, NETVAL VPN AUTH PASSWORD ENCRYPTION, PROMPT, NULL, NULL },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+
   { GROUP, USERSENT CONSOLEUSER, KEY_PREFIX COMP USERS " Entity Keys", NULL, NULL },
 
     { DEFINE, "#if", "!TARGET_OS_IPHONE", NULL, NULL },
@@ -967,15 +1082,16 @@ static schemaDefinition names[] = {
 
   { GROUP_PRIVATE, VIRTUALNETWORKINTERFACES, "Virtual Network Interface Keys", NULL, NULL },
 
-    { DEFINE_PRIVATE, "#if", "!TARGET_OS_IPHONE", NULL, NULL },
     { SC_10_5_PRIVATE, VIRTUALPROP BOND, INTERFACES, NULL, CFARRAY_CFSTRING },
     { SC_10_5_PRIVATE, VIRTUALPROP BOND, MODE, NULL, CFNUMBER },
     { SC_10_5_PRIVATE, VIRTUALPROP BOND, OPTIONS, NULL, CFDICTIONARY },
     { COMMENT_PRIVATE, "", NULL, NULL, NULL },
+    { SC_10_7_IPHONE_4_0_PRIVATE, VIRTUALPROP BRIDGE, INTERFACES, NULL, CFARRAY_CFSTRING },
+    { SC_10_7_IPHONE_4_0_PRIVATE, VIRTUALPROP BRIDGE, OPTIONS, NULL, CFDICTIONARY },
+    { COMMENT_PRIVATE, "", NULL, NULL, NULL },
     { SC_10_5_PRIVATE, VIRTUALPROP VLAN, INTERFACE, NULL, CFSTRING },
     { SC_10_5_PRIVATE, VIRTUALPROP VLAN, TAG, NULL, CFNUMBER },
     { SC_10_5_PRIVATE, VIRTUALPROP VLAN, OPTIONS, NULL, CFDICTIONARY },
-    { DEFINE_PRIVATE, "#endif", "// !TARGET_OS_IPHONE", NULL, NULL },
 //  { COMMENT_PRIVATE, "", NULL, NULL, NULL },
 
 //{ GROUP, "DEPRECATED", "Deprecated schema definition keys", NULL, NULL },
@@ -995,7 +1111,7 @@ static char	*maxkstr	= NULL;
 static int	maxvbuf		= 0;
 static char	*maxvstr	= NULL;
 
-static inline void
+static __inline__ void
 setmax(int *max, char **maxstr, char *str)
 {
     int l;
@@ -1086,6 +1202,11 @@ print_headerdoc(schemaDefinition *def)
 		printf("  @availability Introduced in Mac OS X 10.1, but later deprecated in Mac OS X 10.5.\n");
 		break;
 	    case SC_10_5:
+		printf("  @availability Introduced in Mac OS X 10.5.\n");
+		break;
+	    case SC_10_5_10_7:
+		printf("  @availability Introduced in Mac OS X 10.5, but later deprecated in Mac OS X 10.7.\n");
+		break;
 	    case SC_10_5_PRIVATE:
 		printf("  @availability Introduced in Mac OS X 10.5.\n");
 		break;
@@ -1103,6 +1224,11 @@ print_headerdoc(schemaDefinition *def)
 	    case SC_10_6_IPHONE_3_0_PRIVATE:
 		printf("  @availability Introduced in Mac OS X 10.6.\n");
 		break;
+	    case SC_10_7_IPHONE_4_0:
+	    case SC_10_7_IPHONE_4_0_PRIVATE:
+	    case SC_10_7_IPHONE_5_0_PRIVATE:
+		printf("  @availability Introduced in Mac OS X 10.7.\n");
+		break;
 	    case SC_IPHONE_2_0_PRIVATE:
 		printf("  @availability Introduced in iPhone OS 2.0.\n");
 		break;
@@ -1149,6 +1275,11 @@ print_hfile(schemaDefinition *def)
 		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1,__MAC_10_5,__IPHONE_NA,__IPHONE_NA))\n", kbuf);
 		break;
 	    case SC_10_5:
+		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))\n", kbuf);
+		break;
+	    case SC_10_5_10_7:
+		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_7,__IPHONE_NA,__IPHONE_NA))\n", kbuf);
+		break;
 	    case SC_10_5_PRIVATE:
 		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0/*SPI*/))\n", kbuf);
 		break;
@@ -1166,6 +1297,13 @@ print_hfile(schemaDefinition *def)
 	    case SC_10_6_IPHONE_3_0_PRIVATE:
 		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0/*SPI*/))\n", kbuf);
 		break;
+	    case SC_10_7_IPHONE_4_0:
+	    case SC_10_7_IPHONE_4_0_PRIVATE:
+		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0/*SPI*/))\n", kbuf);
+		break;
+	    case SC_10_7_IPHONE_5_0_PRIVATE:
+		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_5_0/*SPI*/))\n", kbuf);
+		break;
 	    case SC_IPHONE_2_0_PRIVATE:
 		printf("  " SC_SCHEMA_DECLARATION "(%s, __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_2_0/*SPI*/))\n", kbuf);
 		break;
@@ -1174,48 +1312,6 @@ print_hfile(schemaDefinition *def)
 		break;
 	}
 
-	switch (def->control) {
-	    case SC_10_1:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/\n");
-		break;
-	    case SC_10_2:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/\n");
-		break;
-	    case SC_10_3:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/\n");
-		break;
-	    case SC_10_1_10_4:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)\n");
-		break;
-	    case SC_10_4:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/\n");
-		break;
-	    case SC_10_1_10_5:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)\n");
-		break;
-	    case SC_10_5:
-	    case SC_10_5_PRIVATE:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/\n");
-		break;
-	    case SC_10_1_10_6:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010)\n");
-		break;
-	    case SC_10_2_10_6:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1020)\n");
-		break;
-	    case SC_10_6_IPHONE_2_0:
-	    case SC_10_6_IPHONE_2_0_PRIVATE:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/\n");
-		break;
-	    case SC_10_6_IPHONE_3_0:
-	    case SC_10_6_IPHONE_3_0_PRIVATE:
-		printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) || (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000)/*SPI*/\n");
-		break;
-	    case SC_IPHONE_2_0_PRIVATE:
-		printf("#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 20000)/*SPI*/\n");
-		break;
-	}
-
 	printf("  #define %-48s              \\\n",
 	       kbuf);
 	printf("	  " SC_SCHEMA_KV "(%-48s \\\n",
@@ -1225,26 +1321,6 @@ print_hfile(schemaDefinition *def)
 	printf("		      ,%-48s )\n",
 	       def->type ? def->type : "");
 
-	switch (def->control) {
-	    case SC_10_1:
-	    case SC_10_2:
-	    case SC_10_3:
-	    case SC_10_1_10_4:
-	    case SC_10_4:
-	    case SC_10_1_10_5:
-	    case SC_10_5:
-	    case SC_10_5_PRIVATE:
-	    case SC_10_1_10_6:
-	    case SC_10_2_10_6:
-	    case SC_10_6_IPHONE_2_0:
-	    case SC_10_6_IPHONE_3_0:
-	    case SC_10_6_IPHONE_2_0_PRIVATE:
-	    case SC_10_6_IPHONE_3_0_PRIVATE:
-	    case SC_IPHONE_2_0_PRIVATE:
-		printf("#endif\n");
-		break;
-	}
-
 	return;
 }
 
@@ -1401,6 +1477,8 @@ dump_names(int type)
 			    case SC_10_5_PRIVATE:
 			    case SC_10_6_IPHONE_2_0_PRIVATE:
 			    case SC_10_6_IPHONE_3_0_PRIVATE:
+			    case SC_10_7_IPHONE_4_0_PRIVATE:
+			    case SC_10_7_IPHONE_5_0_PRIVATE:
 			    case SC_IPHONE_2_0_PRIVATE:
 				// don't report private definitions
 				break;
@@ -1420,6 +1498,8 @@ dump_names(int type)
 			    case SC_10_5_PRIVATE:
 			    case SC_10_6_IPHONE_2_0_PRIVATE:
 			    case SC_10_6_IPHONE_3_0_PRIVATE:
+			    case SC_10_7_IPHONE_4_0_PRIVATE:
+			    case SC_10_7_IPHONE_5_0_PRIVATE:
 			    case SC_IPHONE_2_0_PRIVATE:
 				print_comment(&names[i]);
 				break;
@@ -1434,6 +1514,8 @@ dump_names(int type)
 			    case SC_10_5_PRIVATE:
 			    case SC_10_6_IPHONE_2_0_PRIVATE:
 			    case SC_10_6_IPHONE_3_0_PRIVATE:
+			    case SC_10_7_IPHONE_4_0_PRIVATE:
+			    case SC_10_7_IPHONE_5_0_PRIVATE:
 			    case SC_IPHONE_2_0_PRIVATE:
 				// don't report private definitions
 				break;
@@ -1447,6 +1529,8 @@ dump_names(int type)
 			    case SC_10_5_PRIVATE:
 			    case SC_10_6_IPHONE_2_0_PRIVATE:
 			    case SC_10_6_IPHONE_3_0_PRIVATE:
+			    case SC_10_7_IPHONE_4_0_PRIVATE:
+			    case SC_10_7_IPHONE_5_0_PRIVATE:
 			    case SC_IPHONE_2_0_PRIVATE:
 				print_headerdoc(&names[i]);
 				break;
@@ -1461,6 +1545,8 @@ dump_names(int type)
 			    case SC_10_5_PRIVATE:
 			    case SC_10_6_IPHONE_2_0_PRIVATE:
 			    case SC_10_6_IPHONE_3_0_PRIVATE:
+			    case SC_10_7_IPHONE_4_0_PRIVATE:
+			    case SC_10_7_IPHONE_5_0_PRIVATE:
 			    case SC_IPHONE_2_0_PRIVATE:
 				break;
 				// don't report private definitions
@@ -1474,6 +1560,8 @@ dump_names(int type)
 			    case SC_10_5_PRIVATE:
 			    case SC_10_6_IPHONE_2_0_PRIVATE:
 			    case SC_10_6_IPHONE_3_0_PRIVATE:
+			    case SC_10_7_IPHONE_4_0_PRIVATE:
+			    case SC_10_7_IPHONE_5_0_PRIVATE:
 			    case SC_IPHONE_2_0_PRIVATE:
 				print_hfile(&names[i]);
 				break;
@@ -1577,24 +1665,6 @@ main(int argc, char * argv[])
 	printf("#include <TargetConditionals.h>\n");
 	printf("\n");
 
-	printf("/*\n");
-	printf(" * let's \"do the right thing\" for those wishing to build for\n");
-	printf(" * Mac OS X 10.1.0 ... 10.2.x\n");
-	printf(" */\n");
-
-	printf("#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && (__MAC_OS_X_VERSION_MIN_REQUIRED <= 1020) && !defined(__IPHONE_OS_VERSION_MIN_REQUIRED)\n");
-	printf("  #ifndef SCSTR\n");
-	printf("    #include <CoreFoundation/CFString.h>\n");
-	printf("    #define SCSTR(s) CFSTR(s)\n");
-	printf("  #endif\n");
-	printf("  #ifndef " SC_SCHEMA_DECLARATION "\n");
-	printf("    #define " SC_SCHEMA_DECLARATION "(k,q)\textern const CFStringRef k q;\n");
-	printf("  #endif\n");
-	printf("  #ifndef " SC_SCHEMA_KV "\n");
-	printf("    #define " SC_SCHEMA_KV "(k,v,t)\tSCSTR( v )\n");
-	printf("  #endif\n");
-	printf("#endif\n\n");
-
 	printf("/*\n");
 	printf(" * Define a schema key/value/type tuple\n");
 	printf(" */\n");
@@ -1615,14 +1685,6 @@ main(int argc, char * argv[])
 	printf("  #endif\n");
 	printf("#endif\n");
 
-	// The SCSTR() macro should only be availble for Mac OS X 10.1.0 ... 10.4.x
-	printf("#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1010) && (__MAC_OS_X_VERSION_MAX_ALLOWED <= 1040) && !defined(__IPHONE_OS_VERSION_MIN_REQUIRED)\n");
-	printf("  #ifndef SCSTR\n");
-	printf("    #include <CoreFoundation/CFString.h>\n");
-	printf("    #define SCSTR(s) CFSTR(s)\n");
-	printf("  #endif\n");
-	printf("#endif\n\n\n");
-
 	printf("/* -------------------- HeaderDoc comments -------------------- */\n\n\n");
 	printf("#if\t0\n");
 	printf("/*!\n");
diff --git a/SystemConfiguration.fproj/helper/SCHelper_client.c b/SystemConfiguration.fproj/helper/SCHelper_client.c
index 638008f..7c69a2f 100644
--- a/SystemConfiguration.fproj/helper/SCHelper_client.c
+++ b/SystemConfiguration.fproj/helper/SCHelper_client.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2005-2007, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -33,12 +33,16 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/wait.h>
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <servers/bootstrap.h>
+#include <bootstrap_priv.h>
 
 #include <CoreFoundation/CoreFoundation.h>
 #include <SystemConfiguration/SCPrivate.h>
 
 #include "SCHelper_client.h"
-#include "helper_comm.h"
+#include "helper.h"		// MiG generated file
 
 
 #define	HELPER					"SCHelper"
@@ -48,61 +52,209 @@
 #define	SUFFIX_SYM_LEN				(sizeof(SUFFIX_SYM) - 1)
 
 
+static pthread_mutex_t	_helper_lock	= PTHREAD_MUTEX_INITIALIZER;
+static mach_port_t	_helper_server	= MACH_PORT_NULL;
+
+
+static mach_port_t
+__SCHelperServerPort(kern_return_t *status)
+{
+	mach_port_t	server	= MACH_PORT_NULL;
+	char		*server_name;
+
+	server_name = getenv("SCHELPER_SERVER");
+	if (!server_name) {
+		server_name = SCHELPER_SERVER;
+	}
+
+#ifdef	BOOTSTRAP_PRIVILEGED_SERVER
+	*status = bootstrap_look_up2(bootstrap_port,
+				     server_name,
+				     &server,
+				     0,
+				     BOOTSTRAP_PRIVILEGED_SERVER);
+#else	// BOOTSTRAP_PRIVILEGED_SERVER
+	*status = bootstrap_look_up(bootstrap_port, server_name, &server);
+#endif	// BOOTSTRAP_PRIVILEGED_SERVER
+
+	switch (*status) {
+		case BOOTSTRAP_SUCCESS :
+			/* service currently registered, "a good thing" (tm) */
+			return server;
+		case BOOTSTRAP_NOT_PRIVILEGED :
+			/* the service is not privileged */
+			break;
+		case BOOTSTRAP_UNKNOWN_SERVICE :
+			/* service not currently registered, try again later */
+			break;
+		default :
+#ifdef	DEBUG
+			SCLog(_sc_verbose, LOG_DEBUG,
+			      CFSTR("__SCHelperServerPort bootstrap_look_up() failed: status=%s"),
+			      bootstrap_strerror(*status));
+#endif	/* DEBUG */
+			break;
+	}
+
+	return MACH_PORT_NULL;
+}
+
+
 __private_extern__
-int
-_SCHelperOpen(CFDataRef authorizationData)
+Boolean
+_SCHelperOpen(CFDataRef authorizationData, mach_port_t *helper_port)
 {
+	kern_return_t		kr;
 	Boolean			ok;
-	int			sock;
-	struct sockaddr_un	sun;
+	mach_port_t		server;
 	uint32_t		status	= 0;
-	static int		yes	= 1;
 
-	if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
-		perror("_SCHelperOpen socket() failed");
-		return -1;
-	}
+	*helper_port = MACH_PORT_NULL;
+
+	// open a new session with the server
+	server = _helper_server;
+	while (TRUE) {
+		if (server != MACH_PORT_NULL) {
+			kr = helperinit(server,
+					helper_port,
+					&status);
+			if (kr == KERN_SUCCESS) {
+				break;
+			}
+
+			// our [cached] server port is not valid
+			if (kr != MACH_SEND_INVALID_DEST) {
+				// if we got an unexpected error, don't retry
+				status = kr;
+				break;
+			}
+		}
 
-	sun.sun_family = AF_UNIX;
-	strlcpy(sun.sun_path, "/var/run/SCHelper", sizeof(sun.sun_path));
-	if (connect(sock, (struct sockaddr *)&sun, sizeof(sun)) == -1) {
-		perror("_SCHelperOpen connect() failed");
-		close(sock);
-		return -1;
+		pthread_mutex_lock(&_helper_lock);
+		if (_helper_server != MACH_PORT_NULL) {
+			if (server == _helper_server) {
+				// if the server we tried returned the error
+				(void)mach_port_deallocate(mach_task_self(), _helper_server);
+				_helper_server = __SCHelperServerPort(&kr);
+				if (_helper_server == MACH_PORT_NULL) {
+					status = kr;
+				}
+			} else {
+				// another thread has refreshed the SCHelper server port
+			}
+		} else {
+			_helper_server = __SCHelperServerPort(&kr);
+			if (_helper_server == MACH_PORT_NULL) {
+				status = kr;
+			}
+		}
+		server = _helper_server;
+		pthread_mutex_unlock(&_helper_lock);
+
+		if (server == MACH_PORT_NULL) {
+			// if SCHelper server not available
+			break;
+		}
 	}
+	__MACH_PORT_DEBUG(TRUE, "*** _SCHelperOpen", *helper_port);
 
-	if (setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, (const void *)&yes, sizeof(yes)) == -1) {
-		perror("_SCHelperOpen setsockopt() failed");
-		close(sock);
-		return -1;
+	if (*helper_port == MACH_PORT_NULL) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("_SCHelperOpen: could not contact server: %s"),
+		      SCErrorString(status));
+		return FALSE;
 	}
 
-	ok = _SCHelperExec(sock, SCHELPER_MSG_AUTH, authorizationData, &status, NULL);
+	ok = _SCHelperExec(*helper_port, SCHELPER_MSG_AUTH, authorizationData, &status, NULL);
 	if (!ok) {
 		SCLog(TRUE, LOG_INFO, CFSTR("_SCHelperOpen: could not send authorization"));
-		close(sock);
-		return -1;
+		goto error;
 	}
 
 	ok = (status == 0);
 	if (!ok) {
 		SCLog(TRUE, LOG_INFO, CFSTR("could not start \"" HELPER "\", status = %u"), status);
-		close(sock);
-		return -1;
+		goto error;
+	}
+
+	return TRUE;
+
+    error :
+
+	if (*helper_port != MACH_PORT_NULL) {
+		(void)mach_port_deallocate(mach_task_self(), *helper_port);
+		*helper_port = MACH_PORT_NULL;
 	}
 
-	return sock;
+	return FALSE;
+
 }
 
 
 __private_extern__
 void
-_SCHelperClose(int helper)
+_SCHelperClose(mach_port_t *helper_port)
 {
-	if (!_SCHelperExec(helper, SCHELPER_MSG_EXIT, NULL, NULL, NULL)) {
+	if (!_SCHelperExec(*helper_port, SCHELPER_MSG_EXIT, NULL, NULL, NULL)) {
 		SCLog(TRUE, LOG_INFO, CFSTR("_SCHelperOpen: could not send exit request"));
 	}
 
-	(void)close(helper);
+	if (*helper_port != MACH_PORT_NULL) {
+		(void)mach_port_deallocate(mach_task_self(), *helper_port);
+		*helper_port = MACH_PORT_NULL;
+	}
+
 	return;
 }
+
+
+Boolean
+_SCHelperExec(mach_port_t port, uint32_t msgID, CFDataRef data, uint32_t *status, CFDataRef *reply)
+{
+	kern_return_t		kr;
+	CFDataRef		myData		= NULL;
+	xmlDataOut_t		replyRef	= NULL;		/* raw bytes */
+	mach_msg_type_number_t	replyLen	= 0;
+	uint32_t		replyStatus	= 0;
+
+	kr = helperexec(port,
+			msgID,
+			(data != NULL) ? (void *)CFDataGetBytePtr(data) : NULL,
+			(data != NULL) ? CFDataGetLength(data)  : 0,
+			&replyStatus,
+			&replyRef,
+			&replyLen);
+	if (kr != KERN_SUCCESS) {
+		if (replyRef != NULL) {
+			(void) vm_deallocate(mach_task_self(), (vm_address_t)replyRef, replyLen);
+		}
+
+		if (kr != MACH_SEND_INVALID_DEST) {
+			// if we got an unexpected error
+			SCLog(TRUE, LOG_ERR, CFSTR("_SCHelperExec() failed: %s"), mach_error_string(kr));
+		}
+		_SCErrorSet(kr);
+
+		return FALSE;
+	}
+
+	// un-serialize the reply
+	if (replyRef != NULL) {
+		if (!_SCUnserializeData(&myData, replyRef, replyLen)) {
+			return FALSE;
+		}
+	}
+
+	if (status != NULL) {
+		*status = replyStatus;
+	}
+
+	if (reply != NULL) {
+		*reply = myData;
+	} else if (myData != NULL) {
+		SCLog(TRUE, LOG_DEBUG, CFSTR("_SCHelperExec() data available with no place to go"));
+		CFRelease(myData);
+	}
+
+	return TRUE;
+}
diff --git a/SystemConfiguration.fproj/helper/SCHelper_client.h b/SystemConfiguration.fproj/helper/SCHelper_client.h
index 74d78eb..02ecf75 100644
--- a/SystemConfiguration.fproj/helper/SCHelper_client.h
+++ b/SystemConfiguration.fproj/helper/SCHelper_client.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2005-2007, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -67,15 +67,16 @@ enum {
 
 __BEGIN_DECLS
 
-int	_SCHelperOpen	(CFDataRef		authorizationData);
+Boolean	_SCHelperOpen	(CFDataRef		authorizationData,
+			 mach_port_t		*helper_port);
 
-Boolean	_SCHelperExec	(int			helper,
+Boolean	_SCHelperExec	(mach_port_t		helper_port,
 			 uint32_t		msgID,
 			 CFDataRef		data,
 			 uint32_t		*status,
 			 CFDataRef		*reply);
 
-void	_SCHelperClose	(int			helper);
+void	_SCHelperClose	(mach_port_t		*helper_port);
 
 __END_DECLS
 
diff --git a/SystemConfiguration.fproj/helper/SCHelper_server.c b/SystemConfiguration.fproj/helper/SCHelper_server.c
index cdf3fd3..c7efc4c 100644
--- a/SystemConfiguration.fproj/helper/SCHelper_server.c
+++ b/SystemConfiguration.fproj/helper/SCHelper_server.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2005-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -21,40 +21,50 @@
  * @APPLE_LICENSE_HEADER_END@
  */
 
-#include <stdlib.h>
 #include <getopt.h>
+#include <grp.h>
+#include <launch.h>
+#include <pthread.h>
+#include <stdlib.h>
 #include <unistd.h>
+#include <bsm/libbsm.h>
 #include <sys/types.h>
+#include <sysexits.h>
+
+//#define DEBUG_MACH_PORT_ALLOCATIONS
 
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreFoundation/CFRuntime.h>
 #include <SystemConfiguration/SystemConfiguration.h>
 #include <SystemConfiguration/SCPrivate.h>
 #include <SystemConfiguration/SCValidation.h>
-#include <pthread.h>
-#include <sysexits.h>
 
 #include "SCPreferencesInternal.h"
 #include "SCHelper_client.h"
-#include "helper_comm.h"
+#include "helper_types.h"
+
+
+#pragma mark -
+#pragma mark SCHelper session managment
 
 
 #if	TARGET_OS_IPHONE
-#include <grp.h>
 
-__private_extern__ int
-getgrnam_r(const char *name, __unused struct group *grp, __unused char *buf, __unused size_t bufsize, struct group **grpP)
-{
-	*grpP = getgrnam(name);
-	return (*grpP == NULL) ? -1 : 0;
-}
-#endif	// TARGET_OS_IPHONE
+//
+// entitlement used to control write access to a given "prefsID"
+//
+#define	kSCWriteEntitlementName		CFSTR("com.apple.SystemConfiguration.SCPreferences-write-access")
 
+//
+// entitlement used to allow limited [VPN configuration] write access to the "preferences.plist"
+//
+#define kSCVPNFilterEntitlementName	CFSTR("com.apple.networking.vpn.configuration")
 
-#pragma mark -
-#pragma mark Session managment
+#endif	// TARGET_OS_IPHONE
 
 
+typedef	enum { NO = 0, YES, UNKNOWN } lazyBoolean;
+
 typedef const struct __SCHelperSession * SCHelperSessionRef;
 
 typedef struct {
@@ -62,12 +72,24 @@ typedef struct {
 	// base CFType information
 	CFRuntimeBase		cfBase;
 
+	// per session lock
+	pthread_mutex_t		lock;
+
 	// authorization
 	AuthorizationRef	authorization;
-#if	TARGET_OS_IPHONE
-	uid_t			peer_euid;
-	gid_t			peer_egid;
-#endif	// TARGET_OS_IPHONE
+
+	// session mach port
+	mach_port_t		port;
+	CFMachPortRef		mp;
+
+	// Mach security audit trailer for evaluating credentials
+	audit_token_t		auditToken;
+
+	// write access entitlement associated with this session
+	lazyBoolean		callerWriteAccess;
+
+	// VPN configuration filtering
+	CFArrayRef		vpnFilter;
 
 	// preferences
 	SCPreferencesRef	prefs;
@@ -75,6 +97,23 @@ typedef struct {
 } SCHelperSessionPrivate, *SCHelperSessionPrivateRef;
 
 
+static CFStringRef	__SCHelperSessionCopyDescription	(CFTypeRef cf);
+static void		__SCHelperSessionDeallocate		(CFTypeRef cf);
+
+
+static CFTypeID		__kSCHelperSessionTypeID	= _kCFRuntimeNotATypeID;
+static Boolean		debug				= FALSE;
+static pthread_once_t	initialized			= PTHREAD_ONCE_INIT;
+static CFRunLoopRef	main_runLoop			= NULL;
+static CFMutableSetRef	sessions			= NULL;
+static int		sessions_closed			= 0;	// count of sessions recently closed
+static int		sessions_generation		= 0;
+static pthread_mutex_t	sessions_lock			= PTHREAD_MUTEX_INITIALIZER;
+
+
+#pragma mark -
+
+
 static AuthorizationRef
 __SCHelperSessionGetAuthorization(SCHelperSessionRef session)
 {
@@ -90,6 +129,8 @@ __SCHelperSessionSetAuthorization(SCHelperSessionRef session, CFTypeRef authoriz
 	Boolean				ok		= TRUE;
 	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
+	pthread_mutex_lock(&sessionPrivate->lock);
+
 #if	!TARGET_OS_IPHONE
 	if (sessionPrivate->authorization != NULL) {
 		AuthorizationFree(sessionPrivate->authorization, kAuthorizationFlagDefaults);
@@ -126,70 +167,161 @@ __SCHelperSessionSetAuthorization(SCHelperSessionRef session, CFTypeRef authoriz
 	}
 #endif	// !TARGET_OS_IPHONE
 
+	pthread_mutex_unlock(&sessionPrivate->lock);
+
 	return ok;
 }
 
 
-#if	TARGET_OS_IPHONE
+static SCPreferencesRef
+__SCHelperSessionGetPreferences(SCHelperSessionRef session)
+{
+	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
+
+	return sessionPrivate->prefs;
+}
+
+
 static void
-__SCHelperSessionGetCredentials(SCHelperSessionRef session, uid_t *euid, gid_t *egid)
+__SCHelperSessionSetThreadName(SCHelperSessionRef session)
 {
+	char				*caller		= NULL;
+	char				name[64];
+	char				*path		= NULL;
+	char				*path_s		= NULL;
 	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
-	if (euid != NULL) *euid = sessionPrivate->peer_euid;
-	if (egid != NULL) *egid = sessionPrivate->peer_egid;
+
+	if (sessionPrivate->mp == NULL) {
+		return;
+	}
+
+	if (sessionPrivate->prefs != NULL) {
+		SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)sessionPrivate->prefs;
+
+		if (prefsPrivate->name != NULL) {
+			caller = _SC_cfstring_to_cstring(prefsPrivate->name,
+							 NULL,
+							 0,
+							 kCFStringEncodingUTF8);
+		}
+
+		path = (prefsPrivate->newPath != NULL) ? prefsPrivate->newPath : prefsPrivate->path;
+		if (path != NULL) {
+			path_s = strrchr(path, '/');
+			if (path_s != NULL) {
+				path = path_s;
+			}
+		}
+	}
+
+	if (caller != NULL) {
+		snprintf(name, sizeof(name), "SESSION|%p|%s|%s%s",
+			(void *)(uintptr_t)CFMachPortGetPort(sessionPrivate->mp),
+			(caller != NULL) ? caller : "?",
+			(path_s != NULL) ? "*/"   : "",
+			(path   != NULL) ? path   : "?");
+		CFAllocatorDeallocate(NULL, caller);
+	} else {
+		snprintf(name, sizeof(name), "SESSION|%p",
+			 (void *)(uintptr_t)CFMachPortGetPort(sessionPrivate->mp));
+	}
+
+	pthread_setname_np(name);
+
 	return;
 }
 
 
 static Boolean
-__SCHelperSessionSetCredentials(SCHelperSessionRef session, uid_t euid, gid_t egid)
+__SCHelperSessionSetPreferences(SCHelperSessionRef session, SCPreferencesRef prefs)
 {
 	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
-	sessionPrivate->peer_euid = euid;
-	sessionPrivate->peer_egid = egid;
+	pthread_mutex_lock(&sessionPrivate->lock);
+
+	if (prefs != NULL) {
+		CFRetain(prefs);
+	}
+	if (sessionPrivate->prefs != NULL) {
+		SCLog(debug, LOG_DEBUG,
+		      CFSTR("%p : close"),
+		      session);
+		CFRelease(sessionPrivate->prefs);
+	}
+	if (prefs != NULL) {
+		SCLog(debug, LOG_DEBUG,
+		      CFSTR("%p : open, prefs = %@"),
+		      session,
+		      prefs);
+	}
+	sessionPrivate->prefs = prefs;
+
+	__SCHelperSessionSetThreadName(session);
+
+	pthread_mutex_unlock(&sessionPrivate->lock);
+
 	return TRUE;
 }
-#endif	// TARGET_OS_IPHONE
 
-static SCPreferencesRef
-__SCHelperSessionGetPreferences(SCHelperSessionRef session)
+
+static CFArrayRef
+__SCHelperSessionGetVPNFilter(SCHelperSessionRef session)
 {
 	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
-	return sessionPrivate->prefs;
+	return sessionPrivate->vpnFilter;
 }
 
 
 static Boolean
-__SCHelperSessionSetPreferences(SCHelperSessionRef session, SCPreferencesRef prefs)
+__SCHelperSessionSetVPNFilter(SCHelperSessionRef session, CFArrayRef vpnFilter)
 {
 	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
-	if (prefs != NULL) {
-		CFRetain(prefs);
+	pthread_mutex_lock(&sessionPrivate->lock);
+
+	if (vpnFilter != NULL) {
+		CFRetain(vpnFilter);
 	}
-	if (sessionPrivate->prefs != NULL) {
-		CFRelease(sessionPrivate->prefs);
+	if (sessionPrivate->vpnFilter != NULL) {
+		CFRelease(sessionPrivate->vpnFilter);
 	}
-	sessionPrivate->prefs = prefs;
+	sessionPrivate->vpnFilter = vpnFilter;
+
+	pthread_mutex_unlock(&sessionPrivate->lock);
 
 	return TRUE;
 }
 
 
-static CFStringRef	__SCHelperSessionCopyDescription	(CFTypeRef cf);
-static void		__SCHelperSessionDeallocate		(CFTypeRef cf);
+static void
+__SCHelperSessionLog(const void *value, void *context)
+{
+	SCHelperSessionRef		session		= (SCHelperSessionRef)value;
+	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
+	pthread_mutex_lock(&sessionPrivate->lock);
 
-static CFTypeID		__kSCHelperSessionTypeID	= _kCFRuntimeNotATypeID;
-static Boolean		debug				= FALSE;
-static pthread_once_t	initialized			= PTHREAD_ONCE_INIT;
-static CFRunLoopRef	main_runLoop			= NULL;
-static CFMutableSetRef	sessions			= NULL;
-static int		sessions_closed			= 0;	// count of sessions recently closed
-static pthread_mutex_t	sessions_lock			= PTHREAD_MUTEX_INITIALIZER;
+	if ((sessionPrivate->mp != NULL) && (sessionPrivate->prefs != NULL)) {
+		SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)sessionPrivate->prefs;
+
+		SCLog(TRUE, LOG_NOTICE,
+		      CFSTR("  %p {port = %p, caller = %@, path = %s%s}"),
+		      session,
+		      CFMachPortGetPort(sessionPrivate->mp),
+		      prefsPrivate->name,
+		      prefsPrivate->newPath ? prefsPrivate->newPath : prefsPrivate->path,
+		      prefsPrivate->locked ? ", locked" : "");
+	}
+
+	pthread_mutex_unlock(&sessionPrivate->lock);
+
+	return;
+}
+
+
+#pragma mark -
 
 
 static const CFRuntimeClass __SCHelperSessionClass = {
@@ -212,12 +344,24 @@ __SCHelperSessionCopyDescription(CFTypeRef cf)
 	CFMutableStringRef		result;
 	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)cf;
 
+	pthread_mutex_lock(&sessionPrivate->lock);
+
 	result = CFStringCreateMutable(allocator, 0);
 	CFStringAppendFormat(result, NULL, CFSTR("<SCHelperSession %p [%p]> {"), cf, allocator);
 	CFStringAppendFormat(result, NULL, CFSTR("authorization = %p"), sessionPrivate->authorization);
-	CFStringAppendFormat(result, NULL, CFSTR(", prefs = %p"), sessionPrivate->prefs);
+	if (sessionPrivate->mp != NULL) {
+		CFStringAppendFormat(result, NULL,
+				     CFSTR(", mp = %p (port = %p)"),
+				     sessionPrivate->mp,
+				     CFMachPortGetPort(sessionPrivate->mp));
+	}
+	if (sessionPrivate->prefs != NULL) {
+		CFStringAppendFormat(result, NULL, CFSTR(", prefs = %@"), sessionPrivate->prefs);
+	}
 	CFStringAppendFormat(result, NULL, CFSTR("}"));
 
+	pthread_mutex_unlock(&sessionPrivate->lock);
+
 	return result;
 }
 
@@ -225,16 +369,24 @@ __SCHelperSessionCopyDescription(CFTypeRef cf)
 static void
 __SCHelperSessionDeallocate(CFTypeRef cf)
 {
-	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)cf;
+	SCHelperSessionRef		session		= (SCHelperSessionRef)cf;
+	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
+
+	// we're releasing "a" session so take the global lock...
+	pthread_mutex_lock(&sessions_lock);
 
 	// release resources
-	__SCHelperSessionSetAuthorization((SCHelperSessionRef)sessionPrivate, NULL);
-	__SCHelperSessionSetPreferences  ((SCHelperSessionRef)sessionPrivate, NULL);
+	__SCHelperSessionSetAuthorization(session, NULL);
+	__SCHelperSessionSetPreferences  (session, NULL);
+	__SCHelperSessionSetVPNFilter    (session, NULL);
+	pthread_mutex_destroy(&sessionPrivate->lock);
 
 	// we no longer need/want to track this session
-	pthread_mutex_lock(&sessions_lock);
 	CFSetRemoveValue(sessions, sessionPrivate);
+	sessions_generation++;
 	sessions_closed++;
+
+	// release the global lock, wake up the main runloop, all done
 	pthread_mutex_unlock(&sessions_lock);
 	CFRunLoopWakeUp(main_runLoop);
 
@@ -256,10 +408,10 @@ __SCHelperSessionCreate(CFAllocatorRef allocator)
 	SCHelperSessionPrivateRef	sessionPrivate;
 	uint32_t			size;
 
-	/* initialize runtime */
+	// initialize runtime
 	pthread_once(&initialized, __SCHelperSessionInitialize);
 
-	/* allocate session */
+	// allocate session
 	size           = sizeof(SCHelperSessionPrivate) - sizeof(CFRuntimeBase);
 	sessionPrivate = (SCHelperSessionPrivateRef)_CFRuntimeCreateInstance(allocator,
 									    __kSCHelperSessionTypeID,
@@ -269,25 +421,71 @@ __SCHelperSessionCreate(CFAllocatorRef allocator)
 		return NULL;
 	}
 
-	sessionPrivate->authorization	= NULL;
-#if	TARGET_OS_IPHONE
-	sessionPrivate->peer_euid	= 0;
-	sessionPrivate->peer_egid	= 0;
-#endif	// TARGET_OS_IPHONE
-	sessionPrivate->prefs		= NULL;
+	if (pthread_mutex_init(&sessionPrivate->lock, NULL) != 0) {
+		SCLog(TRUE, LOG_ERR, CFSTR("pthread_mutex_init(): failure to initialize per session lock"));
+		CFRelease(sessionPrivate);
+		return NULL;
+	}
+	sessionPrivate->authorization		= NULL;
+	sessionPrivate->port			= MACH_PORT_NULL;
+	sessionPrivate->mp			= NULL;
+	sessionPrivate->callerWriteAccess	= UNKNOWN;
+	sessionPrivate->vpnFilter		= NULL;
+	sessionPrivate->prefs			= NULL;
 
 	// keep track this session
 	pthread_mutex_lock(&sessions_lock);
 	if (sessions == NULL) {
-		sessions = CFSetCreateMutable(NULL, 0, NULL);	// create a non-retaining set
+		const CFSetCallBacks mySetCallBacks = { 0, NULL, NULL, CFCopyDescription, CFEqual, CFHash };
+
+		// create a non-retaining set
+		sessions = CFSetCreateMutable(NULL, 0, &mySetCallBacks);
 	}
 	CFSetAddValue(sessions, sessionPrivate);
+	sessions_generation++;
 	pthread_mutex_unlock(&sessions_lock);
 
 	return (SCHelperSessionRef)sessionPrivate;
 }
 
 
+#pragma mark -
+
+
+static SCHelperSessionRef
+__SCHelperSessionFindWithPort(mach_port_t port)
+{
+	SCHelperSessionRef	session	= NULL;
+
+	// keep track this session
+	pthread_mutex_lock(&sessions_lock);
+	if (sessions != NULL) {
+		CFIndex		i;
+		CFIndex		n	= CFSetGetCount(sessions);
+		const void *	vals_q[16];
+		const void **	vals	= vals_q;
+
+		if (n > (CFIndex)(sizeof(vals_q) / sizeof(SCHelperSessionRef)))
+			vals = CFAllocatorAllocate(NULL, n * sizeof(CFStringRef), 0);
+		CFSetGetValues(sessions, vals);
+		for (i = 0; i < n; i++) {
+			SCHelperSessionPrivateRef	sessionPrivate;
+
+			sessionPrivate = (SCHelperSessionPrivateRef)vals[i];
+			if (sessionPrivate->port == port) {
+				session = (SCHelperSessionRef)sessionPrivate;
+				break;
+			}
+		}
+		if (vals != vals_q)
+			CFAllocatorDeallocate(NULL, vals);
+	}
+	pthread_mutex_unlock(&sessions_lock);
+
+	return session;
+}
+
+
 #pragma mark -
 #pragma mark Helpers
 
@@ -356,6 +554,7 @@ do_Auth(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *status
 static Boolean
 do_keychain_copy(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *status, CFDataRef *reply)
 {
+	Boolean			ok		= FALSE;
 	SCPreferencesRef	prefs;
 	CFStringRef		unique_id	= NULL;
 
@@ -363,18 +562,20 @@ do_keychain_copy(SCHelperSessionRef session, void *info, CFDataRef data, uint32_
 		return FALSE;
 	}
 
-	if (!isA_CFString(unique_id)) {
-		return FALSE;
-	}
+	if (unique_id != NULL) {
+		if (isA_CFString(unique_id)) {
+			prefs = __SCHelperSessionGetPreferences(session);
+			*reply = _SCPreferencesSystemKeychainPasswordItemCopy(prefs, unique_id);
+			if (*reply == NULL) {
+				*status = SCError();
+			}
+			ok = TRUE;
+		}
 
-	prefs = __SCHelperSessionGetPreferences(session);
-	*reply = _SCPreferencesSystemKeychainPasswordItemCopy(prefs, unique_id);
-	CFRelease(unique_id);
-	if (*reply == NULL) {
-		*status = SCError();
+		CFRelease(unique_id);
 	}
 
-	return TRUE;
+	return ok;
 }
 
 
@@ -387,7 +588,7 @@ do_keychain_copy(SCHelperSessionRef session, void *info, CFDataRef data, uint32_
 static Boolean
 do_keychain_exists(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *status, CFDataRef *reply)
 {
-	Boolean			ok;
+	Boolean			ok		= FALSE;
 	SCPreferencesRef	prefs;
 	CFStringRef		unique_id	= NULL;
 
@@ -395,19 +596,19 @@ do_keychain_exists(SCHelperSessionRef session, void *info, CFDataRef data, uint3
 		return FALSE;
 	}
 
-	if (!isA_CFString(unique_id)) {
-		if (unique_id != NULL) CFRelease(unique_id);
-		return FALSE;
-	}
+	if (unique_id != NULL) {
+		if (isA_CFString(unique_id)) {
+			prefs = __SCHelperSessionGetPreferences(session);
+			ok = _SCPreferencesSystemKeychainPasswordItemExists(prefs, unique_id);
+			if (!ok) {
+				*status = SCError();
+			}
+		}
 
-	prefs = __SCHelperSessionGetPreferences(session);
-	ok = _SCPreferencesSystemKeychainPasswordItemExists(prefs, unique_id);
-	CFRelease(unique_id);
-	if (!ok) {
-		*status = SCError();
+		CFRelease(unique_id);
 	}
 
-	return TRUE;
+	return ok;
 }
 
 
@@ -420,7 +621,7 @@ do_keychain_exists(SCHelperSessionRef session, void *info, CFDataRef data, uint3
 static Boolean
 do_keychain_remove(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *status, CFDataRef *reply)
 {
-	Boolean			ok;
+	Boolean			ok		= FALSE;
 	SCPreferencesRef	prefs;
 	CFStringRef		unique_id	= NULL;
 
@@ -428,19 +629,19 @@ do_keychain_remove(SCHelperSessionRef session, void *info, CFDataRef data, uint3
 		return FALSE;
 	}
 
-	if (!isA_CFString(unique_id)) {
-		if (unique_id != NULL) CFRelease(unique_id);
-		return FALSE;
-	}
+	if (unique_id != NULL) {
+		if (isA_CFString(unique_id)) {
+			prefs = __SCHelperSessionGetPreferences(session);
+			ok = _SCPreferencesSystemKeychainPasswordItemRemove(prefs, unique_id);
+			if (!ok) {
+				*status = SCError();
+			}
+		}
 
-	prefs = __SCHelperSessionGetPreferences(session);
-	ok = _SCPreferencesSystemKeychainPasswordItemRemove(prefs, unique_id);
-	CFRelease(unique_id);
-	if (!ok) {
-		*status = SCError();
+		CFRelease(unique_id);
 	}
 
-	return TRUE;
+	return ok;
 }
 
 
@@ -467,8 +668,12 @@ do_keychain_set(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t
 		return FALSE;
 	}
 
-	if (!isA_CFDictionary(options)) {
-		if (options != NULL) CFRelease(options);
+	if (options != NULL) {
+		if (!isA_CFDictionary(options)) {
+			CFRelease(options);
+			return FALSE;
+		}
+	} else {
 		return FALSE;
 	}
 
@@ -541,26 +746,29 @@ static Boolean
 do_interface_refresh(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *status, CFDataRef *reply)
 {
 	CFStringRef	ifName	= NULL;
-	Boolean		ok;
+	Boolean		ok	= FALSE;
 
 	if ((data != NULL) && !_SCUnserializeString(&ifName, data, NULL, 0)) {
 		SCLog(TRUE, LOG_ERR, CFSTR("interface name not valid"));
 		return FALSE;
 	}
 
-	if (!isA_CFString(ifName)) {
-		SCLog(TRUE, LOG_ERR, CFSTR("interface name not valid"));
-		if (ifName != NULL) CFRelease(ifName);
-		return FALSE;
+	if (ifName != NULL) {
+		if (isA_CFString(ifName)) {
+			ok = _SCNetworkInterfaceForceConfigurationRefresh(ifName);
+			if (!ok) {
+				*status = SCError();
+			}
+		}
+
+		CFRelease(ifName);
 	}
 
-	ok = _SCNetworkInterfaceForceConfigurationRefresh(ifName);
-	CFRelease(ifName);
 	if (!ok) {
-		*status = SCError();
+		SCLog(TRUE, LOG_ERR, CFSTR("interface name not valid"));
 	}
 
-	return TRUE;
+	return ok;
 }
 
 
@@ -574,11 +782,13 @@ static Boolean
 do_prefs_Open(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *status, CFDataRef *reply)
 {
 	CFStringRef		name;
+	CFDictionaryRef		options;
 	CFNumberRef		pid;
 	SCPreferencesRef	prefs		= __SCHelperSessionGetPreferences(session);
 	CFDictionaryRef		prefsInfo	= NULL;
 	CFStringRef		prefsID;
 	CFStringRef		prefsName;
+	CFStringRef		proc_name;
 
 	if (prefs != NULL) {
 		return FALSE;
@@ -611,6 +821,10 @@ do_prefs_Open(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *
 		}
 	}
 
+	// get [optional] options
+	options = CFDictionaryGetValue(prefsInfo, CFSTR("options"));
+	options = isA_CFDictionary(options);
+
 	// get preferences session "name"
 	name = CFDictionaryGetValue(prefsInfo, CFSTR("name"));
 	if (!isA_CFString(name)) {
@@ -627,15 +841,42 @@ do_prefs_Open(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *
 		return FALSE;
 	}
 
+	// get process name of caller
+	proc_name = CFDictionaryGetValue(prefsInfo, CFSTR("PROC_NAME"));
+	if (!isA_CFString(proc_name)) {
+		SCLog(TRUE, LOG_ERR, CFSTR("process name not valid"));
+		CFRelease(prefsInfo);
+		return FALSE;
+	}
+
 	// build [helper] preferences "name" (used for debugging) and estabish
 	// a preferences session.
-	prefsName = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@:%@"), pid, name);
-	prefs = SCPreferencesCreate(NULL, prefsName, prefsID);
+	prefsName = CFStringCreateWithFormat(NULL, NULL,
+					     CFSTR("%@(%@):%@"),
+					     proc_name,
+					     pid,
+					     name);
+
+	prefs = SCPreferencesCreateWithOptions(NULL, prefsName, prefsID, NULL, options);
 	CFRelease(prefsName);
 	CFRelease(prefsInfo);
 
 	__SCHelperSessionSetPreferences(session, prefs);
+
 	if (prefs != NULL) {
+#ifdef	NOTYET
+		Boolean	ok;
+		CFRunLoopRef	rl	= CFRunLoopGetCurrent();
+
+		// [temporarily] schedule notifications to ensure that we can use
+		// the SCDynamicStore to track helper sessions
+		ok = SCPreferencesScheduleWithRunLoop(prefs, rl, kCFRunLoopDefaultMode);
+		if (ok) {
+			(void)SCPreferencesUnscheduleFromRunLoop(prefs, rl, kCFRunLoopDefaultMode);
+		}
+#endif	// NOTYET
+
+		// the session now holds a references to the SCPreferencesRef
 		CFRelease(prefs);
 	} else {
 		*status = SCError();
@@ -743,24 +984,118 @@ static Boolean
 do_prefs_Commit(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t *status, CFDataRef *reply)
 {
 	Boolean			ok;
-	SCPreferencesRef	prefs	= __SCHelperSessionGetPreferences(session);
+	SCPreferencesRef	prefs		= __SCHelperSessionGetPreferences(session);
+	CFPropertyListRef	prefsData	= NULL;
+	SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
+	CFArrayRef		vpnFilter;
 
 	if (prefs == NULL) {
 		return FALSE;
 	}
 
 	if (data != NULL) {
-		SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
+		ok = _SCUnserialize(&prefsData, data, NULL, 0);
+		if (!ok) {
+			return FALSE;
+		}
 
-		if (prefsPrivate->prefs != NULL) {
-			CFRelease(prefsPrivate->prefs);
+		if (!isA_CFDictionary(prefsData)) {
+			*status = kSCStatusFailed;
+			ok = FALSE;
+			goto done;
+		}
+	}
+
+	vpnFilter = __SCHelperSessionGetVPNFilter(session);
+	if (vpnFilter != NULL) {
+		ok = FALSE;
+
+		if ((prefsPrivate->prefs != NULL) && (prefsData != NULL)) {
+			CFIndex			c;
+			CFMutableDictionaryRef	prefsNew	= NULL;
+			CFMutableDictionaryRef	prefsOld	= NULL;
+			CFMutableDictionaryRef	prefsSave	= prefsPrivate->prefs;
+			CFRange			range		= CFRangeMake(0, CFArrayGetCount(vpnFilter));
+
+			for (c = 0; c < 2; c++) {
+				CFArrayRef	services;
+
+				switch (c) {
+					case 0 :
+						prefsPrivate->prefs = CFDictionaryCreateMutableCopy(NULL, 0, prefsSave);
+						break;
+					case 1 :
+						prefsPrivate->prefs = CFDictionaryCreateMutableCopy(NULL, 0, prefsData);
+						break;
+				}
+
+				// filter out VPN services of the specified type
+				services = SCNetworkServiceCopyAll(prefs);
+				if (services != NULL) {
+					CFIndex	i;
+					CFIndex	n	= CFArrayGetCount(services);
+
+					for (i = 0; i < n; i++) {
+						SCNetworkServiceRef	service;
+
+						service = CFArrayGetValueAtIndex(services, i);
+						if (_SCNetworkServiceIsVPN(service)) {
+							SCNetworkInterfaceRef	child;
+							CFStringRef		childType	= NULL;
+							SCNetworkInterfaceRef	interface;
+							CFStringRef		interfaceType;
+
+							interface     = SCNetworkServiceGetInterface(service);
+							interfaceType = SCNetworkInterfaceGetInterfaceType(interface);
+							child         = SCNetworkInterfaceGetInterface(interface);
+							if (child != NULL) {
+								childType = SCNetworkInterfaceGetInterfaceType(child);
+							}
+							if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN) &&
+							    (childType != NULL) &&
+							    CFArrayContainsValue(vpnFilter, range, childType)) {
+								// filter out VPN service
+								(void) SCNetworkServiceRemove(service);
+							} else {
+								// mark all other VPN services "enabled"
+								(void) SCNetworkServiceSetEnabled(service, TRUE);
+							}
+						}
+					}
+
+					CFRelease(services);
+				}
+
+				switch (c) {
+					case 0 :
+						prefsOld = prefsPrivate->prefs;
+						break;
+					case 1 :
+						prefsNew = prefsPrivate->prefs;
+						break;
+				}
+			}
+
+			// compare the filtered configurations
+			ok = _SC_CFEqual(prefsOld, prefsNew);
+
+			// clean up
+			if (prefsOld != NULL) CFRelease(prefsOld);
+			if (prefsNew != NULL) CFRelease(prefsNew);
+			prefsPrivate->prefs = prefsSave;
 		}
 
-		ok = _SCUnserialize((CFPropertyListRef *)&prefsPrivate->prefs, data, NULL, 0);
 		if (!ok) {
-			return FALSE;
+			*status = kSCStatusAccessError;
+			goto done;
 		}
+	}
 
+	if (prefsData != NULL) {
+		if (prefsPrivate->prefs != NULL) {
+			CFRelease(prefsPrivate->prefs);
+		}
+		prefsPrivate->prefs    = CFDictionaryCreateMutableCopy(NULL, 0, prefsData);
 		prefsPrivate->accessed = TRUE;
 		prefsPrivate->changed  = TRUE;
 	}
@@ -773,7 +1108,10 @@ do_prefs_Commit(SCHelperSessionRef session, void *info, CFDataRef data, uint32_t
 		*status = SCError();
 	}
 
-	return TRUE;
+    done :
+
+	if (prefsData != NULL) CFRelease(prefsData);
+	return ok;
 }
 
 
@@ -873,21 +1211,87 @@ do_prefs_Synchronize(SCHelperSessionRef session, void *info, CFDataRef data, uin
 #pragma mark Process commands
 
 
+#if	TARGET_OS_IPHONE
+
+#include <Security/Security.h>
+#include <Security/SecTask.h>
+
+static CFStringRef
+sessionName(SCHelperSessionRef session)
+{
+	CFStringRef		name	= NULL;
+	SCPreferencesRef	prefs;
+
+	prefs = __SCHelperSessionGetPreferences(session);
+	if (prefs != NULL) {
+		SCPreferencesPrivateRef	prefsPrivate	= (SCPreferencesPrivateRef)prefs;
+
+		name = prefsPrivate->name;
+	}
+
+	return (name != NULL) ? name : CFSTR("???");
+}
+
+
+static CFTypeRef
+copyEntitlement(SCHelperSessionRef session, CFStringRef entitlement)
+{
+	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
+	SecTaskRef			task;
+	CFTypeRef			value		= NULL;
+
+	// Create the security task from the audit token
+	task = SecTaskCreateWithAuditToken(NULL, sessionPrivate->auditToken);
+	if (task != NULL) {
+		CFErrorRef	error	= NULL;
+
+		// Get the value for the entitlement
+		value = SecTaskCopyValueForEntitlement(task, entitlement, &error);
+		if ((value == NULL) && (error != NULL)) {
+			CFIndex		code	= CFErrorGetCode(error);
+			CFStringRef	domain	= CFErrorGetDomain(error);
+
+			if (!CFEqual(domain, kCFErrorDomainMach) || (code != kIOReturnNotFound)) {
+				// if unexpected error
+				SCLog(TRUE, LOG_ERR,
+				      CFSTR("SecTaskCopyValueForEntitlement(,\"%@\",) failed, error = %@ : %@"),
+				      entitlement,
+				      error,
+				      sessionName(session));
+			}
+			CFRelease(error);
+		}
+
+		CFRelease(task);
+	} else {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SecTaskCreateWithAuditToken() failed: %@"),
+		      sessionName(session));
+	}
+
+	return value;
+}
+
+#endif	// TARGET_OS_IPHONE
+
+
+
+
 static Boolean
 hasAuthorization(SCHelperSessionRef session)
 {
 	AuthorizationRef	authorization	= __SCHelperSessionGetAuthorization(session);
 
+	if (authorization == NULL) {
+		return FALSE;
+	}
+
 #if	!TARGET_OS_IPHONE
 	AuthorizationFlags	flags;
 	AuthorizationItem	items[1];
 	AuthorizationRights	rights;
 	OSStatus		status;
 
-	if (authorization == NULL) {
-		return FALSE;
-	}
-
 	items[0].name        = "system.preferences";
 	items[0].value       = NULL;
 	items[0].valueLength = 0;
@@ -910,41 +1314,85 @@ hasAuthorization(SCHelperSessionRef session)
 	if (status != errAuthorizationSuccess) {
 		return FALSE;
 	}
-#else	// !TARGET_OS_IPHONE
-	uid_t	peer_euid;
-	gid_t	peer_egid;
 
-	if (authorization == NULL) {
-		return FALSE;
-	}
+	return TRUE;
+#else	// !TARGET_OS_IPHONE
+	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
-	__SCHelperSessionGetCredentials(session, &peer_euid, &peer_egid);
-	if ((peer_euid != 0) && (peer_egid != 0)) {
-		static gid_t	mobile_gid	= -1;
+	if (sessionPrivate->callerWriteAccess == UNKNOWN) {
+		CFArrayRef		entitlement;
+		CFStringRef		prefsID;
+		SCPreferencesPrivateRef	prefsPrivate;
+
+		// assume that the client DOES NOT have the entitlement
+		sessionPrivate->callerWriteAccess = NO;
+
+		prefsPrivate = (SCPreferencesPrivateRef)sessionPrivate->prefs;
+		prefsID      = (prefsPrivate->prefsID != NULL) ? prefsPrivate->prefsID : PREFS_DEFAULT_CONFIG;
+
+		entitlement = copyEntitlement(session, kSCWriteEntitlementName);
+		if (entitlement != NULL) {
+			if (isA_CFArray(entitlement)) {
+				if (CFArrayContainsValue(entitlement,
+							 CFRangeMake(0, CFArrayGetCount(entitlement)),
+							 prefsID)) {
+					// if client DOES have entitlement
+					sessionPrivate->callerWriteAccess = YES;
+				}
+			} else {
+				SCLog(TRUE, LOG_ERR,
+				      CFSTR("hasAuthorization: entitlement not valid: %@"),
+				      sessionName(session));
+			}
 
-		/*
-		 * if peer is not user "root" nor group "wheel" then
-		 * we check to see if we are one of the authorized
-		 * callers.
-		 */
-		if (mobile_gid == -1) {
-			char		buffer[1024];
-			struct group	grp;
-			struct group	*grpP;
+			CFRelease(entitlement);
+		}
 
-			if (getgrnam_r("mobile", &grp, buffer, sizeof(buffer), &grpP) == 0) {
-				mobile_gid = grpP->gr_gid;
+		// make an exception for VPN configuration management
+		if (sessionPrivate->callerWriteAccess != YES) {
+			entitlement = copyEntitlement(session, kSCVPNFilterEntitlementName);
+			if (entitlement != NULL) {
+				if (isA_CFArray(entitlement)) {
+					if (CFEqual(prefsID, PREFS_DEFAULT_CONFIG)) {
+						// save the VPN bundle identifiers
+						__SCHelperSessionSetVPNFilter(session, entitlement);
+
+						// and grant a "filtered" exception
+						sessionPrivate->callerWriteAccess = YES;
+					} else if (CFStringHasPrefix(prefsID, CFSTR("VPN-")) &&
+						   CFStringHasSuffix(prefsID, CFSTR(".plist"))) {
+						CFRange		range;
+						CFStringRef	vpnID;
+
+						range.location = sizeof("VPN-") - 1;
+						range.length   = CFStringGetLength(prefsID)
+								 - (sizeof("VPN-") - 1)		// trim VPN-
+								 - (sizeof(".plist") - 1);	// trim .plist
+						vpnID = CFStringCreateWithSubstring(NULL, prefsID, range);
+						if (CFArrayContainsValue(entitlement,
+									 CFRangeMake(0, CFArrayGetCount(entitlement)),
+									 vpnID)) {
+							// grant an exception
+							sessionPrivate->callerWriteAccess = YES;
+						}
+						CFRelease(vpnID);
+					}
+				}
+
+				CFRelease(entitlement);
 			}
 		}
 
-		if (peer_egid != mobile_gid) {
-			return FALSE;
+		if (sessionPrivate->callerWriteAccess != YES) {
+			SCLog(TRUE, LOG_ERR,
+			      CFSTR("SCPreferences write access to \"%@\" denied, no entitlement for \"%@\""),
+			      prefsID,
+			      sessionName(session));
 		}
 	}
-#endif	// !TARGET_OS_IPHONE
 
-//	if (items[0].flags != 0) SCLog(TRUE, LOG_DEBUG, CFSTR("***** success w/flags (%u) != 0"), items[0].flags);
-	return TRUE;
+	return (sessionPrivate->callerWriteAccess == YES) ? TRUE : FALSE;
+#endif	// TARGET_OS_IPHONE
 }
 
 
@@ -989,7 +1437,7 @@ static const struct helper {
 
 
 static int
-findHelper(uint32_t command)
+findCommand(uint32_t command)
 {
 	int	i;
 
@@ -1003,187 +1451,506 @@ findHelper(uint32_t command)
 }
 
 
-static Boolean
-process_command(SCHelperSessionRef session, int fd, int *err)
+static void *
+newHelper(void *arg)
 {
-	uint32_t	command	= 0;
-	CFDataRef	data	= NULL;
-	int		i;
-	Boolean		ok	= FALSE;
-	CFDataRef	reply	= NULL;
-	uint32_t	status	= kSCStatusOK;
+	CFRunLoopSourceRef		rls		= NULL;
+	SCHelperSessionRef		session		= (SCHelperSessionRef)arg;
+	SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
 
-	if (!__SCHelper_rxMessage(fd, &command, &data)) {
-		SCLog(TRUE, LOG_ERR, CFSTR("no command"));
-		*err = EIO;
-		goto done;
-	}
+	__SCHelperSessionSetThreadName(session);
 
-	i = findHelper(command);
-	if (i == -1) {
-		SCLog(TRUE, LOG_ERR, CFSTR("received unknown command : %u"), command);
-		*err = EINVAL;
-		goto done;
-	}
+	rls = CFMachPortCreateRunLoopSource(NULL, sessionPrivate->mp, 0);
+	CFRelease(sessionPrivate->mp);
 
-	SCLog(debug, LOG_DEBUG,
-	      CFSTR("processing command \"%s\"%s"),
-	      helpers[i].commandName,
-	      (data != NULL) ? " w/data" : "");
+	if (rls != NULL) {
+		CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
+		CFRelease(rls);
 
-	if (helpers[i].needsAuthorization && !hasAuthorization(session)) {
-		SCLog(debug, LOG_DEBUG,
-		      CFSTR("command \"%s\" : not authorized"),
-		      helpers[i].commandName);
-		status = kSCStatusAccessError;
+		SCLog(debug, LOG_DEBUG, CFSTR("%p : start"), session);
+		CFRunLoopRun();
+		SCLog(debug, LOG_DEBUG, CFSTR("%p : stop"), session);
 	}
 
-	if (status == kSCStatusOK) {
-		ok = (*helpers[i].func)(session, helpers[i].info, data, &status, &reply);
+	return NULL;
+}
+
+
+#pragma mark -
+#pragma mark Main loop
+
+
+// MiG generated externals and functions
+extern struct mig_subsystem	_helper_subsystem;
+extern boolean_t		helper_server(mach_msg_header_t *, mach_msg_header_t *);
+
+
+static
+boolean_t
+notify_server(mach_msg_header_t *request, mach_msg_header_t *reply)
+{
+	mach_no_senders_notification_t	*Request = (mach_no_senders_notification_t *)request;
+	mig_reply_error_t		*Reply   = (mig_reply_error_t *)reply;
+
+	reply->msgh_bits        = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(request->msgh_bits), 0);
+	reply->msgh_remote_port = request->msgh_remote_port;
+	reply->msgh_size        = sizeof(mig_reply_error_t);	/* Minimal size: update as needed */
+	reply->msgh_local_port  = MACH_PORT_NULL;
+	reply->msgh_id          = request->msgh_id + 100;
+
+	if ((Request->not_header.msgh_id > MACH_NOTIFY_LAST) ||
+	    (Request->not_header.msgh_id < MACH_NOTIFY_FIRST)) {
+		Reply->NDR     = NDR_record;
+		Reply->RetCode = MIG_BAD_ID;
+		return FALSE;	/* if this is not a notification message */
 	}
 
-	if ((status != -1) || (reply != NULL)) {
-		SCLog(debug, LOG_DEBUG,
-		      CFSTR("sending status %u%s"),
-		      status,
-		      (reply != NULL) ? " w/reply" : "");
+	switch (Request->not_header.msgh_id) {
+		case MACH_NOTIFY_NO_SENDERS : {
+			SCHelperSessionRef		session;
 
-		if (!__SCHelper_txMessage(fd, status, reply)) {
-			*err = EIO;
-			ok = FALSE;
-			goto done;
+			__MACH_PORT_DEBUG(TRUE, "*** notify_server MACH_NOTIFY_NO_SENDERS", Request->not_header.msgh_local_port);
+
+			// clean up session
+			session = __SCHelperSessionFindWithPort(Request->not_header.msgh_local_port);
+			if (session != NULL) {
+				SCHelperSessionPrivateRef	sessionPrivate	= (SCHelperSessionPrivateRef)session;
+
+				// release CFMachPort *and* SCHelperSession
+				CFMachPortInvalidate(sessionPrivate->mp);
+			}
+
+			__MACH_PORT_DEBUG(TRUE, "*** notify_server after invalidate", Request->not_header.msgh_local_port);
+
+			// and, lastly, remove our receive right.
+			(void) mach_port_mod_refs(mach_task_self(),
+						  Request->not_header.msgh_local_port,
+						  MACH_PORT_RIGHT_RECEIVE, -1);
+
+			Reply->Head.msgh_bits		= 0;
+			Reply->Head.msgh_remote_port	= MACH_PORT_NULL;
+			Reply->RetCode			= KERN_SUCCESS;
+			return TRUE;
 		}
+
+		default :
+			break;
 	}
 
-    done :
+	SCLog(TRUE, LOG_ERR, CFSTR("HELP!, Received notification: port=%d, msgh_id=%d"),
+	      Request->not_header.msgh_local_port,
+	      Request->not_header.msgh_id);
 
-	if (data != NULL) {
-		CFRelease(data);
+	Reply->NDR     = NDR_record;
+	Reply->RetCode = MIG_BAD_ID;
+	return FALSE;	/* if this is not a notification we are handling */
+}
+
+
+__private_extern__
+boolean_t
+helper_demux(mach_msg_header_t *request, mach_msg_header_t *reply)
+{
+	Boolean				processed = FALSE;
+
+	/*
+	 * (attempt to) process SCHelper requests.
+	 */
+	processed = helper_server(request, reply);
+	if (processed) {
+		return TRUE;
 	}
 
-	if (reply != NULL) {
-		CFRelease(reply);
+	/*
+	 * (attempt to) process (NO MORE SENDERS) notification messages.
+	 */
+	processed = notify_server(request, reply);
+	if (processed) {
+		return TRUE;
 	}
 
-	return ok;
+	/*
+	 * unknown message ID, log and return an error.
+	 */
+	SCLog(TRUE, LOG_ERR, CFSTR("helper_demux(): unknown message ID (%d) received"), request->msgh_id);
+	reply->msgh_bits        = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(request->msgh_bits), 0);
+	reply->msgh_remote_port = request->msgh_remote_port;
+	reply->msgh_size        = sizeof(mig_reply_error_t);	/* Minimal size */
+	reply->msgh_local_port  = MACH_PORT_NULL;
+	reply->msgh_id          = request->msgh_id + 100;
+	((mig_reply_error_t *)reply)->NDR = NDR_record;
+	((mig_reply_error_t *)reply)->RetCode = MIG_BAD_ID;
+
+	return FALSE;
 }
 
 
-#pragma mark -
-#pragma mark Main loop
+#define	MACH_MSG_BUFFER_SIZE	128
 
 
 static void
-readCallback(CFSocketRef		s,
-	     CFSocketCallBackType	callbackType,
-	     CFDataRef			address,
-	     const void			*data,
-	     void			*info)
+helperCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
 {
-	CFSocketNativeHandle	fd;
-	int			err	= 0;
-	Boolean			ok;
-	SCHelperSessionRef	session	= (SCHelperSessionRef)info;
-
-	if (callbackType != kCFSocketReadCallBack) {
-		SCLog(TRUE, LOG_ERR, CFSTR("readCallback w/callbackType = %d"), callbackType);
-		return;
+	mig_reply_error_t *	bufRequest	= msg;
+	uint32_t		bufReply_q[MACH_MSG_BUFFER_SIZE/sizeof(uint32_t)];
+	mig_reply_error_t *	bufReply	= (mig_reply_error_t *)bufReply_q;
+	static CFIndex		bufSize		= 0;
+	mach_msg_return_t	mr;
+	int			options;
+
+	if (bufSize == 0) {
+		// get max size for MiG reply buffers
+		bufSize = _helper_subsystem.maxsize;
+
+		// check if our on-the-stack reply buffer will be big enough
+		if (bufSize > sizeof(bufReply_q)) {
+			SCLog(TRUE, LOG_NOTICE,
+			      CFSTR("helperCallback(): buffer size should be increased > %d"),
+			      _helper_subsystem.maxsize);
+		}
 	}
 
-	fd = CFSocketGetNative(s);
-	ok = process_command(session, fd, &err);
-	if (!ok) {
-		SCLog(debug, LOG_DEBUG, CFSTR("per-session socket : invalidate fd %d"), fd);
-		CFSocketInvalidate(s);
+	if (bufSize > sizeof(bufReply_q)) {
+		bufReply = CFAllocatorAllocate(NULL, _helper_subsystem.maxsize, 0);
 	}
+	bufReply->RetCode = 0;
 
-	return;
-}
+	/* we have a request message */
+	(void) helper_demux(&bufRequest->Head, &bufReply->Head);
 
+	if (!(bufReply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)) {
+		if (bufReply->RetCode == MIG_NO_REPLY) {
+			bufReply->Head.msgh_remote_port = MACH_PORT_NULL;
+		} else if ((bufReply->RetCode != KERN_SUCCESS) &&
+			   (bufRequest->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)) {
+			/*
+			 * destroy the request - but not the reply port
+			 */
+			bufRequest->Head.msgh_remote_port = MACH_PORT_NULL;
+			mach_msg_destroy(&bufRequest->Head);
+		}
+	}
 
-static void *
-newHelper(void *arg)
-{
-	CFSocketContext		context	= { 0, NULL, CFRetain, CFRelease, CFCopyDescription };
-	CFSocketNativeHandle	fd	= (CFSocketNativeHandle)(intptr_t)arg;
-	CFRunLoopSourceRef	rls;
-	SCHelperSessionRef	session;
-	CFSocketRef		sock;
+	if (bufReply->Head.msgh_remote_port != MACH_PORT_NULL) {
+		/*
+		 * send reply.
+		 *
+		 * We don't want to block indefinitely because the client
+		 * isn't receiving messages from the reply port.
+		 * If we have a send-once right for the reply port, then
+		 * this isn't a concern because the send won't block.
+		 * If we have a send right, we need to use MACH_SEND_TIMEOUT.
+		 * To avoid falling off the kernel's fast RPC path unnecessarily,
+		 * we only supply MACH_SEND_TIMEOUT when absolutely necessary.
+		 */
 
-#if	TARGET_OS_IPHONE
-	uid_t			peer_euid;
-	gid_t			peer_egid;
-#endif	// TARGET_OS_IPHONE
+		options = MACH_SEND_MSG;
+		if (MACH_MSGH_BITS_REMOTE(bufReply->Head.msgh_bits) != MACH_MSG_TYPE_MOVE_SEND_ONCE) {
+			options |= MACH_SEND_TIMEOUT;
+		}
+		mr = mach_msg(&bufReply->Head,		/* msg */
+			      options,			/* option */
+			      bufReply->Head.msgh_size,	/* send_size */
+			      0,			/* rcv_size */
+			      MACH_PORT_NULL,		/* rcv_name */
+			      MACH_MSG_TIMEOUT_NONE,	/* timeout */
+			      MACH_PORT_NULL);		/* notify */
+
+		/* Has a message error occurred? */
+		switch (mr) {
+			case MACH_SEND_INVALID_DEST:
+			case MACH_SEND_TIMED_OUT:
+				break;
+			default :
+				/* Includes success case.  */
+				goto done;
+		}
+	}
 
-	session = __SCHelperSessionCreate(NULL);
-#if	TARGET_OS_IPHONE
-	if (getpeereid(fd, &peer_euid, &peer_egid) == 0) {
-		__SCHelperSessionSetCredentials(session, peer_euid, peer_egid);
-	} else {
-		SCLog(TRUE, LOG_ERR, CFSTR("getpeereid() failed: %s"), strerror(errno));
+	if (bufReply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) {
+		mach_msg_destroy(&bufReply->Head);
 	}
-#endif	// TARGET_OS_IPHONE
 
-	context.info = (void *)session;
-	sock = CFSocketCreateWithNative(NULL,
-					fd,
-					kCFSocketReadCallBack,
-					readCallback,
-					&context);
-	CFRelease(session);
+	done :
 
-	rls = CFSocketCreateRunLoopSource(NULL, sock, 0);
-	CFRelease(sock);
+	if (bufReply != (mig_reply_error_t *)bufReply_q)
+		CFAllocatorDeallocate(NULL, bufReply);
+	return;
+}
 
-	CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
-	CFRelease(rls);
 
-	CFRunLoopRun();
-	return NULL;
+static CFStringRef
+initMPCopyDescription(const void *info)
+{
+	return CFStringCreateWithFormat(NULL, NULL, CFSTR("<SCHelper MP>"));
 }
 
 
-static void
-acceptCallback(CFSocketRef		s,
-	       CFSocketCallBackType	callbackType,
-	       CFDataRef		address,
-	       const void		*data,
-	       void			*info)
+__private_extern__
+kern_return_t
+_helperinit(mach_port_t			server,
+	    mach_port_t			*newSession,
+	    uint32_t			*status,
+	    audit_token_t		audit_token)
 {
-	CFSocketNativeHandle	fd;
-	pthread_attr_t		tattr;
-	pthread_t		tid;
-	static int		yes	= 1;
+	CFMachPortContext		context		= { 0
+							  , NULL
+							  , CFRetain
+							  , CFRelease
+							  , initMPCopyDescription
+							  };
+	kern_return_t			kr;
+	mach_port_t			oldNotify;
+	SCHelperSessionRef		session;
+	SCHelperSessionPrivateRef	sessionPrivate;
+	pthread_attr_t			tattr;
+	pthread_t			tid;
 
-	if (callbackType != kCFSocketAcceptCallBack) {
-		SCLog(TRUE, LOG_ERR, CFSTR("acceptCallback w/callbackType = %d"), callbackType);
-		return;
+	session = __SCHelperSessionFindWithPort(server);
+	if (session != NULL) {
+#ifdef	DEBUG
+		SCLog(TRUE, LOG_DEBUG, CFSTR("_helperinit(): session is already open."));
+#endif	/* DEBUG */
+		*status = kSCStatusFailed;	/* you can't re-open an "open" session */
+		return KERN_SUCCESS;
 	}
 
-	if ((data == NULL) ||
-	    ((fd = *((CFSocketNativeHandle *)data)) == -1)) {
-		SCLog(TRUE, LOG_ERR, CFSTR("accept w/no FD"));
-		return;
+	session = __SCHelperSessionCreate(NULL);
+	sessionPrivate = (SCHelperSessionPrivateRef)session;
+
+	// create per-session port
+	(void) mach_port_allocate(mach_task_self(),
+				  MACH_PORT_RIGHT_RECEIVE,
+				  &sessionPrivate->port);
+	*newSession = sessionPrivate->port;
+
+	//
+	// Note: we create the CFMachPort *before* we insert a send
+	//       right present to ensure that CF does not establish
+	//       its dead name notification.
+	//
+	context.info = (void *)session;
+	sessionPrivate->mp = _SC_CFMachPortCreateWithPort("SCHelper/session",
+							  *newSession,
+							  helperCallback,
+							  &context);
+
+	/* Request a notification when/if the client dies */
+	kr = mach_port_request_notification(mach_task_self(),
+					    *newSession,
+					    MACH_NOTIFY_NO_SENDERS,
+					    1,
+					    *newSession,
+					    MACH_MSG_TYPE_MAKE_SEND_ONCE,
+					    &oldNotify);
+	if (kr != KERN_SUCCESS) {
+		SCLog(TRUE, LOG_ERR, CFSTR("_helperinit() mach_port_request_notification() failed: %s"), mach_error_string(kr));
+
+		// clean up CFMachPort, mach port rights
+		CFMachPortInvalidate(sessionPrivate->mp);
+		CFRelease(sessionPrivate->mp);
+		sessionPrivate->mp = NULL;
+		(void) mach_port_mod_refs(mach_task_self(), *newSession, MACH_PORT_RIGHT_RECEIVE, -1);
+		*newSession = MACH_PORT_NULL;
+		*status = kSCStatusFailed;
+		goto done;
 	}
 
-	if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (const void *)&yes, sizeof(yes)) == -1) {
-		SCLog(TRUE, LOG_ERR, CFSTR("setsockopt(SO_NOSIGPIPE) failed: %s"), strerror(errno));
-		return;
+	if (oldNotify != MACH_PORT_NULL) {
+		SCLog(TRUE, LOG_ERR, CFSTR("_helperinit(): oldNotify != MACH_PORT_NULL"));
 	}
 
+	// add send right (that will be passed back to the client)
+	(void) mach_port_insert_right(mach_task_self(),
+				      *newSession,
+				      *newSession,
+				      MACH_MSG_TYPE_MAKE_SEND);
+
+	// save audit token
+	sessionPrivate->auditToken = audit_token;
+
+	//
+	// Note: at this time we should be holding ONE send right and
+	//       ONE receive right to the server.  The send right is
+	//       moved to the caller.
+	//
+
 	// start per-session thread
 	pthread_attr_init(&tattr);
 	pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM);
 	pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
 	pthread_attr_setstacksize(&tattr, 96 * 1024);	// each thread gets a 96K stack
-	pthread_create(&tid, &tattr, newHelper, (void *)(intptr_t)fd);
+	pthread_create(&tid, &tattr, newHelper, (void *)session);
 	pthread_attr_destroy(&tattr);
 
+	*status = kSCStatusOK;
+
+    done :
+
+	CFRelease(session);
+	return KERN_SUCCESS;
+}
+
+
+__private_extern__
+kern_return_t
+_helperexec(mach_port_t			server,
+	    uint32_t			msgID,
+	    xmlData_t			dataRef,	/* raw XML bytes */
+	    mach_msg_type_number_t	dataLen,
+	    uint32_t			*status,
+	    xmlDataOut_t		*replyRef,	/* raw XML bytes */
+	    mach_msg_type_number_t	*replyLen)
+{
+	CFDataRef			data	= NULL;
+	int				i;
+	CFDataRef			reply	= NULL;
+	SCHelperSessionRef		session;
+
+	*status   = kSCStatusOK;
+	*replyRef = NULL;
+	*replyLen = 0;
+
+	if ((dataRef != NULL) && (dataLen > 0)) {
+		if (!_SCUnserializeData(&data, (void *)dataRef, dataLen)) {
+			*status = SCError();
+			return KERN_SUCCESS;
+		}
+	}
+
+	session = __SCHelperSessionFindWithPort(server);
+	if (session == NULL) {
+		*status = kSCStatusFailed;	/* you must have an open session to play */
+		goto done;
+	}
+
+	i = findCommand(msgID);
+	if (i == -1) {
+		SCLog(TRUE, LOG_ERR, CFSTR("received unknown command : %u"), msgID);
+		*status = kSCStatusInvalidArgument;
+		goto done;
+	}
+
+	SCLog(debug, LOG_DEBUG,
+	      CFSTR("%p : processing command \"%s\"%s"),
+	      session,
+	      helpers[i].commandName,
+	      (data != NULL) ? " w/data" : "");
+
+	if (helpers[i].needsAuthorization && !hasAuthorization(session)) {
+		SCLog(debug, LOG_DEBUG,
+		      CFSTR("%p : command \"%s\" : not authorized"),
+		      session,
+		      helpers[i].commandName);
+		*status = kSCStatusAccessError;
+	}
+
+	if (*status == kSCStatusOK) {
+		(*helpers[i].func)(session, helpers[i].info, data, status, &reply);
+	}
+
+	if ((*status != -1) || (reply != NULL)) {
+		Boolean	ok;
+
+		SCLog(debug, LOG_DEBUG,
+		      CFSTR("%p : sending status %u%s"),
+		      session,
+		      *status,
+		      (reply != NULL) ? " w/reply" : "");
+
+		/* serialize the data */
+		if (reply != NULL) {
+			ok = _SCSerializeData(reply, (void **)replyRef, (CFIndex *)replyLen);
+			CFRelease(reply);
+			reply = NULL;
+			if (!ok) {
+				*status = SCError();
+				goto done;
+			}
+		}
+	}
+
+    done :
+
+	if (data  != NULL) CFRelease(data);
+	if (reply != NULL) CFRelease(reply);
+	return KERN_SUCCESS;
+}
+
+
+static CFStringRef
+helperMPCopyDescription(const void *info)
+{
+	return CFStringCreateWithFormat(NULL, NULL, CFSTR("<main SCHelper MP>"));
+}
+
+
+static void
+init_MiG_1(const launch_data_t l_obj, const char *name, void *info)
+{
+	CFMachPortContext	context		= { 0
+						  , (void *)1
+						  , NULL
+						  , NULL
+						  , helperMPCopyDescription
+						  };
+	launch_data_type_t	l_type;
+	CFMachPortRef		mp;
+	int			*n_listeners	= (int *)info;
+	CFRunLoopSourceRef	rls;
+	mach_port_t		service_port;
+
+	// get the mach port
+	l_type = (l_obj != NULL) ? launch_data_get_type(l_obj) : 0;
+	if (l_type != LAUNCH_DATA_MACHPORT) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SCHelper: error w/MachServices \"%s\" port (%p, %d)"),
+		      (name != NULL) ? name : "?",
+		      l_obj,
+		      l_type);
+		return;
+	}
+	service_port = launch_data_get_machport(l_obj);
+
+	// add a run loop source to listen for new requests
+	mp = _SC_CFMachPortCreateWithPort("SCHelper/server",
+					  service_port,
+					  helperCallback,
+					  &context);
+	rls = CFMachPortCreateRunLoopSource(NULL, mp, 0);
+	CFRelease(mp);
+	CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
+	CFRelease(rls);
+
+	*n_listeners = *n_listeners + 1;
+
 	return;
 }
 
 
-#include <launch.h>
+static int
+init_MiG(launch_data_t l_reply, int *n_listeners)
+{
+	launch_data_t		l_machservices;
+	launch_data_type_t	l_type;
+
+	l_machservices = launch_data_dict_lookup(l_reply, LAUNCH_JOBKEY_MACHSERVICES);
+	l_type = (l_machservices != NULL) ? launch_data_get_type(l_machservices) : 0;
+	if (l_type != LAUNCH_DATA_DICTIONARY) {
+		SCLog(TRUE, LOG_ERR,
+		      CFSTR("SCHelper: error w/" LAUNCH_JOBKEY_MACHSERVICES " (%p, %d)"),
+		      l_machservices,
+		      l_type);
+		return 1;
+	}
+
+	launch_data_dict_iterate(l_machservices, init_MiG_1, (void *)n_listeners);
+	return 0;
+}
+
+
+#pragma mark -
+#pragma mark Main
 
 
 static const struct option longopts[] = {
@@ -1195,15 +1962,14 @@ static const struct option longopts[] = {
 int
 main(int argc, char **argv)
 {
-	Boolean			done	= FALSE;
-	int			err	= 0;
-	int			i;
-	launch_data_t		l_listeners;
+	Boolean			done		= FALSE;
+	int			err		= 0;
+	int			gen_reported	= 0;
+	int			idle		= 0;
 	launch_data_t		l_msg;
 	launch_data_t		l_reply;
-	launch_data_t		l_sockets;
 	launch_data_type_t	l_type;
-	int			n	= 0;
+	int			n_listeners	= 0;
 	extern int		optind;
 	int			opt;
 	int			opti;
@@ -1250,76 +2016,55 @@ main(int argc, char **argv)
 		goto done;
 	}
 
-	l_sockets = launch_data_dict_lookup(l_reply, LAUNCH_JOBKEY_SOCKETS);
-	l_type = (l_sockets != NULL) ? launch_data_get_type(l_sockets) : 0;
-	if (l_type != LAUNCH_DATA_DICTIONARY) {
-		SCLog(TRUE, LOG_ERR,
-		      CFSTR("SCHelper: error w/" LAUNCH_JOBKEY_SOCKETS " (%p, %d)"),
-		      l_sockets,
-		      l_type);
-		err = 1;
-		goto done;
-	}
-
-	l_listeners = launch_data_dict_lookup(l_sockets, "Listeners");
-	l_type = (l_listeners != NULL) ? launch_data_get_type(l_listeners) : 0;
-	if (l_type != LAUNCH_DATA_ARRAY) {
-		SCLog(TRUE, LOG_ERR, CFSTR("SCHelper: error w/Listeners (%p, %d)"),
-		      l_listeners,
-		      l_type);
+	err = init_MiG(l_reply, &n_listeners);
+	if (err != 0) {
 		goto done;
 	}
 
-	n = launch_data_array_get_count(l_listeners);
-	for (i = 0; i < n; i++) {
-		CFSocketNativeHandle	fd;
-		launch_data_t		l_fd;
-		CFRunLoopSourceRef	rls;
-		CFSocketRef		sock;
-
-		l_fd = launch_data_array_get_index(l_listeners, i);
-		l_type = (l_fd != NULL) ? launch_data_get_type(l_fd) : 0;
-		if (l_type != LAUNCH_DATA_FD) {
-			SCLog(TRUE, LOG_ERR, CFSTR("SCHelper: error w/Listeners[%d] (%p, %d)"),
-			      i,
-			      l_fd,
-			      l_type);
-			err = 1;
-			goto done;
-		}
-
-		fd = launch_data_get_fd(l_fd);
-		sock = CFSocketCreateWithNative(NULL,
-						fd,
-						kCFSocketAcceptCallBack,
-						acceptCallback,
-						NULL);
-		rls = CFSocketCreateRunLoopSource(NULL, sock, 0);
-		CFRunLoopAddSource(main_runLoop, rls, kCFRunLoopDefaultMode);
-		CFRelease(rls);
-		CFRelease(sock);
-	}
-
     done :
 
 	if (l_reply != NULL) launch_data_free(l_reply);
 
-	if ((err != 0) || (n == 0)) {
+	if ((err != 0) || (n_listeners == 0)) {
 		exit(err);
 	}
 
+	pthread_setname_np("SCHelper main thread");
+
 	while (!done) {
 		SInt32	rlStatus;
+		int	gen_current;
 
 		rlStatus = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 15.0, TRUE);
-		if (rlStatus == kCFRunLoopRunTimedOut) {
-			pthread_mutex_lock(&sessions_lock);
-			done = ((sessions != NULL) &&
-				(CFSetGetCount(sessions) == 0) &&
-				(sessions_closed == 0));
-			sessions_closed = 0;
-			pthread_mutex_unlock(&sessions_lock);
+
+		pthread_mutex_lock(&sessions_lock);
+
+		if (sessions != NULL) {
+			if (rlStatus == kCFRunLoopRunTimedOut) {
+				idle++;
+
+				if ((CFSetGetCount(sessions) == 0) && (sessions_closed == 0)) {
+					// if we don't have any open sessions and no
+					// sessions have recently been closed
+					done = TRUE;
+				}
+			} else {
+				idle = 0;
+			}
 		}
+		gen_current = sessions_generation;
+		sessions_closed = 0;
+
+		if (!done && (idle >= (2 * 60 / 15))) {
+			if (gen_reported != gen_current) {
+				SCLog(TRUE, LOG_NOTICE, CFSTR("active (but IDLE) sessions"));
+				CFSetApplyFunction(sessions, __SCHelperSessionLog, NULL);
+				gen_reported = gen_current;
+			}
+			idle = 0;
+		}
+
+		pthread_mutex_unlock(&sessions_lock);
 	}
 
 	exit(EX_OK);
diff --git a/SystemConfiguration.fproj/helper/com.apple.SCHelper-embedded.plist b/SystemConfiguration.fproj/helper/com.apple.SCHelper-embedded.plist
index 023d9b4..abf8095 100644
--- a/SystemConfiguration.fproj/helper/com.apple.SCHelper-embedded.plist
+++ b/SystemConfiguration.fproj/helper/com.apple.SCHelper-embedded.plist
@@ -6,17 +6,10 @@
 	<string>com.apple.SCHelper</string>
 	<key>Program</key>
 	<string>/System/Library/Frameworks/SystemConfiguration.framework/SCHelper</string>
-	<key>Sockets</key>
+	<key>MachServices</key>
 	<dict>
-		<key>Listeners</key>
-		<dict>
-			<key>SockFamily</key>
-			<string>Unix</string>
-			<key>SockPathMode</key>
-			<integer>438</integer>
-			<key>SockPathName</key>
-			<string>/var/run/SCHelper</string>
-		</dict>
+		<key>com.apple.SystemConfiguration.helper</key>
+		<true/>
 	</dict>
 </dict>
 </plist>
diff --git a/SystemConfiguration.fproj/helper/com.apple.SCHelper.plist b/SystemConfiguration.fproj/helper/com.apple.SCHelper.plist
index 10dd6df..ee55286 100644
--- a/SystemConfiguration.fproj/helper/com.apple.SCHelper.plist
+++ b/SystemConfiguration.fproj/helper/com.apple.SCHelper.plist
@@ -6,17 +6,10 @@
 	<string>com.apple.SCHelper</string>
 	<key>Program</key>
 	<string>/System/Library/Frameworks/SystemConfiguration.framework/Resources/SCHelper</string>
-	<key>Sockets</key>
+	<key>MachServices</key>
 	<dict>
-		<key>Listeners</key>
-		<dict>
-			<key>SockFamily</key>
-			<string>Unix</string>
-			<key>SockPathMode</key>
-			<integer>438</integer>
-			<key>SockPathName</key>
-			<string>/var/run/SCHelper</string>
-		</dict>
+		<key>com.apple.SystemConfiguration.helper</key>
+		<true/>
 	</dict>
 </dict>
 </plist>
diff --git a/SystemConfiguration.fproj/helper/helper.defs b/SystemConfiguration.fproj/helper/helper.defs
new file mode 100644
index 0000000..e7d0b77
--- /dev/null
+++ b/SystemConfiguration.fproj/helper/helper.defs
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2010 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * Modification History
+ *
+ * January 13, 2010		Allan Nathanson <ajn@apple.com>
+ * - initial revision
+ */
+
+#include <mach/std_types.defs>
+#include <mach/mach_types.defs>
+
+subsystem helper 22000;
+serverprefix _;
+
+import "helper_types.h";
+
+/*
+ * serialized XML or UTF8 data (client->server)
+ */
+type xmlData    = ^ array [] of MACH_MSG_TYPE_BYTE
+	ctype : xmlData_t;
+
+/*
+ * serialized XML or UTF8 data (server->client)
+ */
+type xmlDataOut = ^ array [] of MACH_MSG_TYPE_BYTE
+	ctype : xmlDataOut_t;
+
+
+/*
+ * SCHelper API's
+ */
+
+routine helperinit	(	server		: mach_port_t;
+			 out	session		: mach_port_move_send_t;
+			 out	status		: uint32_t;
+	    ServerAuditToken	audit_token	: audit_token_t);
+
+routine helperexec	(	server		: mach_port_t;
+				msgID		: uint32_t;
+				data		: xmlData;
+			 out	status		: uint32_t;
+			 out	reply		: xmlDataOut, dealloc);
diff --git a/SystemConfiguration.fproj/helper/helper_comm.c b/SystemConfiguration.fproj/helper/helper_comm.c
deleted file mode 100644
index fd4193d..0000000
--- a/SystemConfiguration.fproj/helper/helper_comm.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <unistd.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include "helper_comm.h"
-
-#include <SystemConfiguration/SCPrivate.h>
-
-
-static ssize_t
-readn(int ref, void *data, size_t len)
-{
-	size_t	left	= len;
-	ssize_t	n;
-	void	*p	= data;
-
-	while (left > 0) {
-		if ((n = read(ref, p, left)) == -1) {
-			if (errno != EINTR) {
-				return -1;
-			}
-			n = 0;
-		} else if (n == 0) {
-			break; /* EOF */
-		}
-
-		left -= n;
-		p += n;
-	}
-	return (len - left);
-}
-
-
-static ssize_t
-writen(int ref, const void *data, size_t len)
-{
-	size_t		left	= len;
-	ssize_t		n;
-	const void	*p	= data;
-
-	while (left > 0) {
-		if ((n = write(ref, p, left)) == -1) {
-			if (errno != EINTR) {
-				return -1;
-			}
-			n = 0;
-		}
-		left -= n;
-		p += n;
-	}
-	return len;
-}
-
-
-Boolean
-__SCHelper_txMessage(int fd, uint32_t msgID, CFDataRef data)
-{
-	ssize_t		n_written;
-	uint32_t	header[2];
-
-	header[0] = msgID;
-	header[1] = (data != NULL) ? CFDataGetLength(data) : 0;
-
-	n_written = writen(fd, header, sizeof(header));
-	if (n_written != sizeof(header)) {
-		if ((n_written == -1) && (errno != EPIPE)) {
-			perror("write() failed while sending msgID");
-		}
-		return FALSE;
-	}
-
-	if (header[1] == 0) {
-		// if no data to send
-		return TRUE;
-	}
-
-	n_written = writen(fd, CFDataGetBytePtr(data), header[1]);
-	if (n_written != header[1]) {
-		if ((n_written == -1) && (errno != EPIPE)) {
-			perror("write() failed while sending data");
-		}
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-Boolean
-__SCHelper_rxMessage(int fd, uint32_t *msgID, CFDataRef *data)
-{
-	void		*bytes;
-	size_t		n_read;
-	uint32_t	header[2];
-
-	n_read = readn(fd, header, sizeof(header));
-	if (n_read != sizeof(header)) {
-		if (n_read == -1) {
-			perror("read() failed while reading msgID");
-		}
-		return FALSE;
-	}
-
-	if (msgID != NULL) {
-		*msgID = header[0];
-	}
-
-	if (header[1] == 0) {
-		if (data != NULL) {
-			*data = NULL;
-		}
-		return TRUE;
-	} else if ((int32_t)header[1] < 0) {
-		perror("read() failed, invalid data length");
-		return FALSE;
-	}
-
-	bytes  = CFAllocatorAllocate(NULL, header[1], 0);
-	n_read = readn(fd, bytes, header[1]);
-	if (n_read != header[1]) {
-		if (n_read == -1) {
-			perror("read() failed while reading data");
-		}
-		CFAllocatorDeallocate(NULL, bytes);
-		return FALSE;
-	}
-
-	if (data != NULL) {
-		*data = CFDataCreateWithBytesNoCopy(NULL, bytes, header[1], NULL);
-	} else {
-		// toss reply data
-		CFAllocatorDeallocate(NULL, bytes);
-	}
-
-	return TRUE;
-}
-
-
-Boolean
-_SCHelperExec(int fd, uint32_t msgID, CFDataRef data, uint32_t *status, CFDataRef *reply)
-{
-	Boolean		ok;
-
-	ok = __SCHelper_txMessage(fd, msgID, data);
-	if (!ok) {
-		return FALSE;
-	}
-
-	if ((status == NULL) && (reply == NULL)) {
-		// if no reply expected (one way)
-		return TRUE;
-	}
-
-	ok = __SCHelper_rxMessage(fd, status, reply);
-	if (!ok) {
-		return FALSE;
-	}
-
-	return TRUE;
-}
diff --git a/Plugins/KernelEventMonitor/ev_appletalk.h b/SystemConfiguration.fproj/helper/helper_types.h
similarity index 55%
rename from Plugins/KernelEventMonitor/ev_appletalk.h
rename to SystemConfiguration.fproj/helper/helper_types.h
index f02f722..91dbb21 100644
--- a/Plugins/KernelEventMonitor/ev_appletalk.h
+++ b/SystemConfiguration.fproj/helper/helper_types.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2004, 2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -21,28 +21,37 @@
  * @APPLE_LICENSE_HEADER_END@
  */
 
+#ifndef _HELPER_TYPES_H
+#define _HELPER_TYPES_H
+
 /*
- * Modification History
- *
- * August 5, 2002	Allan Nathanson <ajn@apple.com>
- * - split code out from eventmon.c
+ * Keep IPC functions private to the framework
  */
+#ifdef mig_external
+#undef mig_external
+#endif
+#define mig_external __private_extern__
 
+/* Turn MIG type checking on by default */
+#ifdef __MigTypeCheck
+#undef __MigTypeCheck
+#endif
+#define __MigTypeCheck	1
 
-#ifndef _EV_APPLETALK_H
-#define _EV_APPLETALK_H
-
-#include <netat/appletalk.h>
-#include <netat/at_var.h>
-
-__BEGIN_DECLS
-
-void	interface_update_appletalk	(struct ifaddrs *ifap, const char *if_name);
-void	interface_update_atalk_address	(struct kev_atalk_data *aEvent, const char *if_name);
-void	interface_update_atalk_zone	(struct kev_atalk_data *aEvent, const char *if_name);
-void	interface_update_shutdown_atalk	();
+/*
+ * Mach server port name
+ */
+#define SCHELPER_SERVER	"com.apple.SystemConfiguration.helper"
 
-__END_DECLS
+/*
+ * Input arguments: serialized key's, list delimiters, ...
+ *	(sent as out-of-line data in a message)
+ */
+typedef const char * xmlData_t;
 
-#endif /* _EV_EVENTMON_H */
+/* Output arguments: serialized data, lists, ...
+ *	(sent as out-of-line data in a message)
+ */
+typedef char * xmlDataOut_t;
 
+#endif /* !_HELPER_TYPES_H */
diff --git a/SystemConfiguration.fproj/update-headers b/SystemConfiguration.fproj/update-headers
index 62838ac..862125b 100755
--- a/SystemConfiguration.fproj/update-headers
+++ b/SystemConfiguration.fproj/update-headers
@@ -14,7 +14,7 @@ sub clean_INC {
 
 	$inc =~ s/#ifdef\s+USE_SYSTEMCONFIGURATION_PRIVATE_HEADERS\s*.*?\n#include\s+<SystemConfiguration\/.*?>.*?\n#else.*?\n//;
 	$inc =~ s/#endif\s+.*?USE_SYSTEMCONFIGURATION_PRIVATE_HEADERS.*?\n//;
-	
+
 	return $inc;
 }
 
@@ -24,9 +24,7 @@ sub clean_API {
 
 	$api_new = $DO_SPLIT ? $api : clean_INC($api);
 	$api_new =~ s/(__MAC)_\w+\/\*SPI\*\//\1_NA/g;
-	$api_new =~ s/(\(__MAC_OS_X_VERSION_MIN_REQUIRED >= \d+\)\/\*SPI\*\/ \|\| )//g;
 	$api_new =~ s/(__IPHONE)_\w+\/\*SPI\*\//\1_NA/g;
-	$api_new =~ s/( \|\| \(__IPHONE_OS_VERSION_MIN_REQUIRED >= \d+\))\/\*SPI\*\///g;
 
 	return $api_new;
 }
@@ -37,9 +35,7 @@ sub clean_SPI {
 
 	$spi_new = clean_INC($spi);
 	$spi_new =~ s/(__MAC_\w+)\/\*SPI\*\//\1/g;
-	$api_new =~ s/(\(__MAC_OS_X_VERSION_MIN_REQUIRED >= \d+\))\/\*SPI\*\/( \|\| )/\1\2/g;
 	$spi_new =~ s/(__IPHONE_\w+)\/\*SPI\*\//\1/g;
-	$spi_new =~ s/( \|\| )(\(__IPHONE_OS_VERSION_MIN_REQUIRED >= \d+\))\/\*SPI\*\//\1\2/g;
 
 	return $spi_new;
 }
@@ -67,7 +63,7 @@ for (@headers) {
 
 	$spi_new = clean_SPI($spi);
 	if ($spi ne $spi_new) {
-#		printf "cleaning .../PrivateHeaders/%s\n", $spi_header;
+		printf "cleaning .../PrivateHeaders/%s\n", $spi_header;
 		open(SPI, ">", $spi_path);
 		print SPI $spi_new;
 		close(SPI);
@@ -98,7 +94,7 @@ for (@headers) {
 
 	$api_new = clean_API($api);
 	if ($api ne $api_new) {
-#		printf "cleaning .../Headers/%s\n", $api_header;
+		printf "cleaning .../Headers/%s\n", $api_header;
 		open(API, ">", $api_path);
 		print API $api_new;
 		close(API);
@@ -116,7 +112,7 @@ for (@headers) {
 #					$spi_header =~ s/\.h$/PRIVATE.h/;
 				}
 
-#				printf "  adding .../PrivateHeaders/%s\n", $spi_header;
+				printf "  adding .../PrivateHeaders/%s\n", $spi_header;
 				$spi_path = $SPI_BASE . "/" . $spi_header;
 				open(SPI, ">", $spi_path);
 				print SPI $spi_new;
diff --git a/configd.tproj/_configclose.c b/configd.tproj/_configclose.c
index 5b817f2..df4a366 100644
--- a/configd.tproj/_configclose.c
+++ b/configd.tproj/_configclose.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003, 2004, 2006-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003, 2004, 2006-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -69,22 +69,16 @@ static void
 removeAllKeys(SCDynamicStoreRef store, Boolean isRegex)
 {
 	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
-	CFSetRef			keys;
+	CFArrayRef			keys;
 	CFIndex				n;
 
 	keys = isRegex ? storePrivate->patterns : storePrivate->keys;
-	n = CFSetGetCount(keys);
+	n = (keys != NULL) ? CFArrayGetCount(keys) : 0;
 	if (n > 0) {
 		CFIndex		i;
 		CFArrayRef	keysToRemove;
-		const void *	watchedKeys_q[N_QUICK];
-		const void **	watchedKeys	= watchedKeys_q;
-
-		if (n > (CFIndex)(sizeof(watchedKeys_q) / sizeof(CFStringRef)))
-			watchedKeys = CFAllocatorAllocate(NULL, n * sizeof(CFStringRef), 0);
-		CFSetGetValues(keys, watchedKeys);
-		keysToRemove = CFArrayCreate(NULL, watchedKeys, n, &kCFTypeArrayCallBacks);
-		if (watchedKeys != watchedKeys_q) CFAllocatorDeallocate(NULL, watchedKeys);
+
+		keysToRemove = CFArrayCreateCopy(NULL, keys);
 		for (i = 0; i < n; i++) {
 			(void) __SCDynamicStoreRemoveWatchedKey(store,
 								CFArrayGetValueAtIndex(keysToRemove, i),
diff --git a/configd.tproj/_notifyadd.c b/configd.tproj/_notifyadd.c
index 8eebbbb..5fd22f6 100644
--- a/configd.tproj/_notifyadd.c
+++ b/configd.tproj/_notifyadd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004, 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2006, 2008, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -37,17 +37,46 @@
 
 
 static __inline__ void
-my_CFSetApplyFunction(CFSetRef			theSet,
-		      CFSetApplierFunction	applier,
-		      void			*context)
+my_CFArrayApplyFunction(CFArrayRef		theArray,
+			CFArrayApplierFunction	applier,
+			void			*context)
 {
 	CFAllocatorRef	myAllocator;
-	CFSetRef	mySet;
+	CFArrayRef	myArray;
 
-	myAllocator = CFGetAllocator(theSet);
-	mySet       = CFSetCreateCopy(myAllocator, theSet);
-	CFSetApplyFunction(mySet, applier, context);
-	CFRelease(mySet);
+	myAllocator = CFGetAllocator(theArray);
+	myArray     = CFArrayCreateCopy(myAllocator, theArray);
+	CFArrayApplyFunction(myArray, CFRangeMake(0, CFArrayGetCount(myArray)), applier, context);
+	CFRelease(myArray);
+	return;
+}
+
+
+static int
+hasKey(CFMutableArrayRef keys, CFStringRef key)
+{
+	if (keys != NULL) {
+		CFIndex	n;
+
+		n = CFArrayGetCount(keys);
+		if (CFArrayContainsValue(keys, CFRangeMake(0, n), key)) {
+			/* sorry, pattern already exists in notifier list */
+			return kSCStatusKeyExists;
+		}
+	}
+
+	return kSCStatusOK;
+}
+
+
+static void
+addKey(CFMutableArrayRef *keysP, CFStringRef key)
+{
+	if (*keysP == NULL) {
+		*keysP = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+	}
+
+	CFArrayAppendValue(*keysP, key);
 	return;
 }
 
@@ -76,9 +105,8 @@ __SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean
 	sessionNum = CFNumberCreate(NULL, kCFNumberIntType, &storePrivate->server);
 
 	if (isRegex) {
-		if (CFSetContainsValue(storePrivate->patterns, key)) {
-			/* sorry, pattern already exists in notifier list */
-			sc_status = kSCStatusKeyExists;
+		sc_status = hasKey(storePrivate->patterns, key);
+		if (sc_status != kSCStatusOK) {
 			goto done;
 		}
 
@@ -91,11 +119,10 @@ __SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean
 		}
 
 		/* add pattern to this sessions notifier list */
-		CFSetAddValue(storePrivate->patterns, key);
+		addKey(&storePrivate->patterns, key);
 	} else {
-		if (CFSetContainsValue(storePrivate->keys, key)) {
-			/* sorry, key already exists in notifier list */
-			sc_status = kSCStatusKeyExists;
+		sc_status = hasKey(storePrivate->keys, key);
+		if (sc_status != kSCStatusOK) {
 			goto done;
 		}
 
@@ -106,7 +133,7 @@ __SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean
 		_addWatcher(sessionNum, key);
 
 		/* add key to this sessions notifier list */
-		CFSetAddValue(storePrivate->keys, key);
+		addKey(&storePrivate->keys, key);
 	}
 
     done :
@@ -159,7 +186,7 @@ _notifyadd(mach_port_t 			server,
  */
 typedef struct {
 	SCDynamicStoreRef       store;
-	CFSetRef		oldKeys;	/* for addNewKey */
+	CFArrayRef		oldKeys;	/* for addNewKey */
 	CFArrayRef		newKeys;	/* for removeOldKey */
 	Boolean			isRegex;
 	int			sc_status;
@@ -202,7 +229,9 @@ addNewKey(const void *value, void *context)
 	}
 
 	if ((myContextRef->oldKeys == NULL) ||
-	    !CFSetContainsValue(myContextRef->oldKeys, newKey)) {
+	    !CFArrayContainsValue(myContextRef->oldKeys,
+				  CFRangeMake(0, CFArrayGetCount(myContextRef->oldKeys)),
+				  newKey)) {
 		/* if this is a new notification key */
 		myContextRef->sc_status = __SCDynamicStoreAddWatchedKey(myContextRef->store,
 									newKey,
@@ -237,30 +266,36 @@ __SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef store, CFArrayRef keys, CF
 	myContext.sc_status = kSCStatusOK;
 
 	/* remove any previously registered keys, register any new keys */
-	myContext.oldKeys = CFSetCreateCopy(NULL, storePrivate->keys);
+	myContext.oldKeys = NULL;
 	myContext.newKeys = keys;
 	myContext.isRegex = FALSE;
-	my_CFSetApplyFunction(storePrivate->keys, removeOldKey, &myContext);
+	if (storePrivate->keys != NULL) {
+		myContext.oldKeys = CFArrayCreateCopy(NULL, storePrivate->keys);
+		my_CFArrayApplyFunction(storePrivate->keys, removeOldKey, &myContext);
+	}
 	if (keys != NULL) {
 		CFArrayApplyFunction(keys,
 				     CFRangeMake(0, CFArrayGetCount(keys)),
 				     addNewKey,
 				     &myContext);
 	}
-	CFRelease(myContext.oldKeys);
+	if (myContext.oldKeys != NULL) CFRelease(myContext.oldKeys);
 
 	/* remove any previously registered patterns, register any new patterns */
-	myContext.oldKeys = CFSetCreateCopy(NULL, storePrivate->patterns);
+	myContext.oldKeys = NULL;
 	myContext.newKeys = patterns;
 	myContext.isRegex = TRUE;
-	my_CFSetApplyFunction(storePrivate->patterns, removeOldKey, &myContext);
+	if (storePrivate->patterns != NULL) {
+		myContext.oldKeys = CFArrayCreateCopy(NULL, storePrivate->patterns);
+		my_CFArrayApplyFunction(storePrivate->patterns, removeOldKey, &myContext);
+	}
 	if (patterns != NULL) {
 		CFArrayApplyFunction(patterns,
 				     CFRangeMake(0, CFArrayGetCount(patterns)),
 				     addNewKey,
 				     &myContext);
 	}
-	CFRelease(myContext.oldKeys);
+	if (myContext.oldKeys != NULL) CFRelease(myContext.oldKeys);
 
 	return myContext.sc_status;
 }
diff --git a/configd.tproj/_notifyremove.c b/configd.tproj/_notifyremove.c
index e77c777..5af6405 100644
--- a/configd.tproj/_notifyremove.c
+++ b/configd.tproj/_notifyremove.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004, 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2006, 2008, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -37,12 +37,37 @@
 #include "pattern.h"
 
 
+static int
+removeKey(CFMutableArrayRef keys, CFStringRef key)
+{
+	CFIndex	i;
+	CFIndex	n;
+
+	if (keys == NULL) {
+		/* sorry, empty notifier list */
+		return kSCStatusNoKey;
+	}
+
+	n = CFArrayGetCount(keys);
+	i = CFArrayGetFirstIndexOfValue(keys, CFRangeMake(0, n), key);
+	if (i == kCFNotFound) {
+		/* sorry, key does not exist in notifier list */
+		return kSCStatusNoKey;
+	}
+
+	/* remove key from this sessions notifier list */
+	CFArrayRemoveValueAtIndex(keys, i);
+	return kSCStatusOK;
+}
+
+
 __private_extern__
 int
 __SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex, Boolean internal)
 {
+	int				sc_status	= kSCStatusOK;
 	CFNumberRef			sessionNum;
-	SCDynamicStorePrivateRef	storePrivate = (SCDynamicStorePrivateRef)store;
+	SCDynamicStorePrivateRef	storePrivate	= (SCDynamicStorePrivateRef)store;
 
 	if ((store == NULL) || (storePrivate->server == MACH_PORT_NULL)) {
 		return kSCStatusNoStoreSession;	/* you must have an open session to play */
@@ -62,22 +87,20 @@ __SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boole
 	 * it was previously defined.
 	 */
 	if (isRegex) {
-		if (!CFSetContainsValue(storePrivate->patterns, key))
-			return kSCStatusNoKey;		/* sorry, key does not exist in notifier list */
-
-		/* remove key from this sessions notifier list */
-		CFSetRemoveValue(storePrivate->patterns, key);
+		sc_status = removeKey(storePrivate->patterns, key);
+		if (sc_status != kSCStatusOK) {
+			goto done;
+		}
 
 		/* remove this session as a pattern watcher */
 		sessionNum = CFNumberCreate(NULL, kCFNumberIntType, &storePrivate->server);
 		patternRemoveSession(key, sessionNum);
 		CFRelease(sessionNum);
 	} else {
-		if (!CFSetContainsValue(storePrivate->keys, key))
-			return kSCStatusNoKey;		/* sorry, key does not exist in notifier list */
-
-		/* remove key from this sessions notifier list */
-		CFSetRemoveValue(storePrivate->keys, key);
+		sc_status = removeKey(storePrivate->keys, key);
+		if (sc_status != kSCStatusOK) {
+			goto done;
+		}
 
 		/*
 		 * We are watching a specific key. As such, update the
@@ -88,7 +111,9 @@ __SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boole
 		CFRelease(sessionNum);
 	}
 
-	return kSCStatusOK;
+    done :
+
+	return sc_status;
 }
 
 
diff --git a/configd.tproj/_notifyviafd.c b/configd.tproj/_notifyviafd.c
index 870813c..2cda2b7 100644
--- a/configd.tproj/_notifyviafd.c
+++ b/configd.tproj/_notifyviafd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2006, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2006, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -146,6 +146,12 @@ _notifyviafd(mach_port_t		server,
 		}
 	}
 
+	if (!hasPathAccess(mySession, un.sun_path)) {
+		*sc_status = kSCStatusAccessError;
+		SCLog(TRUE, LOG_DEBUG, CFSTR("_notifyviafd permissions error"));
+		return KERN_SUCCESS;
+	}
+
 	/* do common sanity checks, get socket */
 	*sc_status = __SCDynamicStoreNotifyFileDescriptor(mySession->store, identifier, &sock);
 
diff --git a/configd.tproj/_snapshot.c b/configd.tproj/_snapshot.c
index 4459095..2c94f85 100644
--- a/configd.tproj/_snapshot.c
+++ b/configd.tproj/_snapshot.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2006, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2006, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -42,9 +42,9 @@
 
 
 #define	SNAPSHOT_PATH_STATE	_PATH_VARTMP "configd-state"
-#define	SNAPSHOT_PATH_STORE	_PATH_VARTMP "configd-store.xml"
-#define	SNAPSHOT_PATH_PATTERN	_PATH_VARTMP "configd-pattern.xml"
-#define	SNAPSHOT_PATH_SESSION	_PATH_VARTMP "configd-session.xml"
+#define	SNAPSHOT_PATH_STORE	_PATH_VARTMP "configd-store.plist"
+#define	SNAPSHOT_PATH_PATTERN	_PATH_VARTMP "configd-pattern.plist"
+#define	SNAPSHOT_PATH_SESSION	_PATH_VARTMP "configd-session.plist"
 
 
 #define N_QUICK	100
@@ -80,11 +80,9 @@ _expandStore(CFDictionaryRef storeData)
 			if (data) {
 				CFPropertyListRef	plist;
 
-				if (!_SCUnserialize(&plist, data, NULL, 0)) {
-					goto done;
-				}
-
 				nValues[i] = CFDictionaryCreateMutableCopy(NULL, 0, oValues[i]);
+
+				_SCUnserialize(&plist, data, NULL, 0);
 				CFDictionarySetValue((CFMutableDictionaryRef)nValues[i],
 						     kSCDData,
 						     plist);
@@ -102,13 +100,11 @@ _expandStore(CFDictionaryRef storeData)
 				     &kCFTypeDictionaryKeyCallBacks,
 				     &kCFTypeDictionaryValueCallBacks);
 
-    done :
-
 	if (nElements > 0) {
 		CFIndex	i;
 
 		for (i = 0; i < nElements; i++) {
-			if (nValues[i])	CFRelease(nValues[i]);
+			CFRelease(nValues[i]);
 		}
 
 		if (keys != keys_q) {
@@ -169,10 +165,10 @@ __SCDynamicStoreSnapshot(SCDynamicStoreRef store)
 	}
 
 	expandedStoreData = _expandStore(storeData);
-	xmlData = CFPropertyListCreateXMLData(NULL, expandedStoreData);
+	xmlData = CFPropertyListCreateData(NULL, expandedStoreData, kCFPropertyListXMLFormat_v1_0, 0, NULL);
 	CFRelease(expandedStoreData);
-	if (!xmlData) {
-		SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateXMLData() failed"));
+	if (xmlData == NULL) {
+		SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateData() failed"));
 		close(fd);
 		return kSCStatusFailed;
 	}
@@ -188,9 +184,9 @@ __SCDynamicStoreSnapshot(SCDynamicStoreRef store)
 		return kSCStatusFailed;
 	}
 
-	xmlData = CFPropertyListCreateXMLData(NULL, patternData);
-	if (!xmlData) {
-		SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateXMLData() failed"));
+	xmlData = CFPropertyListCreateData(NULL, patternData, kCFPropertyListXMLFormat_v1_0, 0, NULL);
+	if (xmlData == NULL) {
+		SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateData() failed"));
 		close(fd);
 		return kSCStatusFailed;
 	}
@@ -206,9 +202,9 @@ __SCDynamicStoreSnapshot(SCDynamicStoreRef store)
 		return kSCStatusFailed;
 	}
 
-	xmlData = CFPropertyListCreateXMLData(NULL, sessionData);
-	if (!xmlData) {
-		SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateXMLData() failed"));
+	xmlData = CFPropertyListCreateData(NULL, sessionData, kCFPropertyListXMLFormat_v1_0, 0, NULL);
+	if (xmlData == NULL) {
+		SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateData() failed"));
 		close(fd);
 		return kSCStatusFailed;
 	}
diff --git a/configd.tproj/com.apple.configd.plist b/configd.tproj/com.apple.configd.plist
index 50243de..3ffea54 100644
--- a/configd.tproj/com.apple.configd.plist
+++ b/configd.tproj/com.apple.configd.plist
@@ -8,8 +8,6 @@
 	<true/>
 	<key>Label</key>
 	<string>com.apple.configd</string>
-	<key>MachExceptionHandler</key>
-	<string>com.apple.ReportCrash.DirectoryService</string>
 	<key>MachServices</key>
 	<dict>
 		<key>com.apple.SystemConfiguration.configd</key>
diff --git a/configd.tproj/configd.8 b/configd.tproj/configd.8
index 1cb36da..f697803 100644
--- a/configd.tproj/configd.8
+++ b/configd.tproj/configd.8
@@ -1,7 +1,7 @@
 .\"
 .\"     @(#)configd.8
 .\"
-.Dd November 4, 2003
+.Dd June 18, 2009
 .Dt CONFIGD 8
 .Os "Mac OS X"
 .Sh NAME
@@ -117,7 +117,7 @@ the priority is greater than LOG_NOTICE).
 was designed to run without any intervention but if you insist on sending a signal to the daemon then the following are available:
 .Bl -tag -width SIGTERM
 .It Dv SIGHUP
-This signal, typically used to tell a daemon to reload it's configuration, is ignored (there is no configuration).
+This signal, typically used to tell a daemon to reload its configuration, is ignored (there is no configuration).
 .It Dv SIGTERM
 This signal initiates a
 .Qq graceful
diff --git a/configd.tproj/configd.m b/configd.tproj/configd.m
index 9a6958e..d701c24 100644
--- a/configd.tproj/configd.m
+++ b/configd.tproj/configd.m
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -34,6 +34,8 @@
  * - created
  */
 
+//#define DO_NOT_INFORM
+
 #include <getopt.h>
 #include <stdio.h>
 #include <sysexits.h>
@@ -53,6 +55,10 @@
 #include "configd_server.h"
 #include "plugin_support.h"
 
+#if	TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
+#include <CoreFoundation/CFUserNotification.h>
+#endif	// TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
+
 __private_extern__
 Boolean	_configd_verbose		= FALSE;	/* TRUE if verbose logging enabled */
 
@@ -75,6 +81,7 @@ static const struct option longopts[] = {
 //	{ "no-bundles",		no_argument,		0,	'b' },
 //	{ "exclude-plugin",	required_argument,	0,	'B' },
 //	{ "no-fork",		no_argument,		0,	'd' },
+//	{ "fork-all",		no_argument,		0,	'f' },
 //	{ "test-bundle",	required_argument,      0,	't' },
 //	{ "verbose",		no_argument,		0,	'v' },
 //	{ "verbose-bundle",	required_argument,	0,	'V' },
@@ -91,6 +98,7 @@ usage(const char *prog)
 	SCPrint(TRUE, stderr, CFSTR("\t-d\tdisable daemon/run in foreground\n"));
 	SCPrint(TRUE, stderr, CFSTR("\t-v\tenable verbose logging\n"));
 	SCPrint(TRUE, stderr, CFSTR("\t-V\tenable verbose logging for the specified plug-in\n"));
+	SCPrint(TRUE, stderr, CFSTR("\t-f\tload ALL plug-ins in a separate process\n"));
 	SCPrint(TRUE, stderr, CFSTR("\t-b\tdisable loading of ALL plug-ins\n"));
 	SCPrint(TRUE, stderr, CFSTR("\t-B\tdisable loading of the specified plug-in\n"));
 	SCPrint(TRUE, stderr, CFSTR("\t-t\tload/test the specified plug-in\n"));
@@ -349,6 +357,33 @@ main(int argc, char * const argv[])
 	/* check if we have been started by launchd */
 	vproc_swap_integer(NULL, VPROC_GSK_IS_MANAGED, NULL, &is_launchd_job);
 
+#if	TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
+	// if launchd job, check to see if we have been restarted
+	if (is_launchd_job) {
+		int64_t	status	= 0;
+
+		vproc_swap_integer(NULL, VPROC_GSK_LAST_EXIT_STATUS, NULL, &status);
+		if ((status != 0) && _SC_isAppleInternal()) {
+			int	fd;
+
+			// if we've been restarted
+			fd = open("/var/run/configd-crash-reported", O_WRONLY|O_CREAT|O_EXCL, 0644);
+			if (fd >= 0) {
+				// if we have not yet alerted the user
+				CFUserNotificationDisplayNotice(0,
+								kCFUserNotificationStopAlertLevel,
+								NULL,
+								NULL,
+								NULL,
+								CFSTR("\"configd\" restarted"),
+								CFSTR("Please collect the crash report and file a Radar."),
+								NULL);
+				close(fd);
+			}
+		}
+	}
+#endif	// TARGET_OS_EMBEDDED && !TARGET_OS_EMBEDDED_OTHER && !defined(DO_NOT_INFORM)
+
 	/* ensure that forked plugins behave */
 	if ((testBundle != NULL) && (getenv("__FORKED_PLUGIN__") != NULL)) {
 		forcePlugin = TRUE;
diff --git a/configd.tproj/configd_server.c b/configd.tproj/configd_server.c
index 6b2af16..dce8172 100644
--- a/configd.tproj/configd_server.c
+++ b/configd.tproj/configd_server.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -136,6 +136,7 @@ configdCallback(CFMachPortRef port, void *msg, CFIndex size, void *info)
 	if (bufSize > sizeof(bufReply_q)) {
 		bufReply = CFAllocatorAllocate(NULL, _config_subsystem.maxsize, 0);
 	}
+	bufReply->RetCode = 0;
 
 	/* we have a request message */
 	(void) config_demux(&bufRequest->Head, &bufReply->Head);
@@ -269,19 +270,19 @@ int
 server_shutdown()
 {
 	if (configd_port != NULL) {
-		mach_port_t	service_port;
+		mach_port_t	service_port	= CFMachPortGetPort(configd_port);
+
+		CFMachPortSetInvalidationCallBack(configd_port, NULL);
+		CFMachPortInvalidate(configd_port);
+		CFRelease(configd_port);
+		configd_port = NULL;
 
-		service_port = CFMachPortGetPort(configd_port);
 		if (service_port != MACH_PORT_NULL) {
 			(void) mach_port_mod_refs(mach_task_self(),
 						  service_port,
 						  MACH_PORT_RIGHT_RECEIVE,
 						  -1);
 		}
-
-		CFMachPortInvalidate(configd_port);
-		CFRelease(configd_port);
-		configd_port = NULL;
 	}
 
 	return EX_OK;
@@ -294,6 +295,8 @@ server_loop()
 {
 	CFStringRef	rlMode;
 
+	pthread_setname_np("SCDynamicStore");
+
 	while (TRUE) {
 		/*
 		 * process one run loop event
diff --git a/configd.tproj/entitlements.plist b/configd.tproj/entitlements.plist
index ec0be16..9309ae1 100644
--- a/configd.tproj/entitlements.plist
+++ b/configd.tproj/entitlements.plist
@@ -5,6 +5,7 @@
 	<key>keychain-access-groups</key>
 	<array>
 		<string>apple</string>
+		<string>com.apple.identities</string>
 	</array>
 	<key>com.apple.springboard.launchapplications</key>
 	<true/>
diff --git a/configd.tproj/pattern.c b/configd.tproj/pattern.c
index 207491b..58a87be 100644
--- a/configd.tproj/pattern.c
+++ b/configd.tproj/pattern.c
@@ -126,10 +126,15 @@ patternCompile(CFStringRef pattern, regex_t *preg, CFStringRef *error)
 	Boolean		append		= FALSE;
 	Boolean		insert		= FALSE;
 	CFIndex		len		= 0;
+	CFIndex		len_c;
 	Boolean		ok;
 	char		str_q[256];
 	char *		str		= str_q;
 
+	if (CFStringGetLength(pattern) == 0) {
+		SCLog(TRUE, LOG_ERR, CFSTR("patternCompile(): empty string"));
+	}
+
 	if (!CFStringHasPrefix(pattern, CFSTR("^"))) {
 		insert = TRUE;
 	}
@@ -149,14 +154,18 @@ patternCompile(CFStringRef pattern, regex_t *preg, CFStringRef *error)
 						 append ? "$" : "");
 	}
 
-	(void)CFStringGetBytes(pattern,
-			       CFRangeMake(0, CFStringGetLength(pattern)),
-			       kCFStringEncodingASCII,
-			       0,
-			       FALSE,
-			       NULL,
-			       0,
-			       &len);
+	len_c = CFStringGetBytes(pattern,
+				 CFRangeMake(0, CFStringGetLength(pattern)),
+				 kCFStringEncodingASCII,
+				 0,
+				 FALSE,
+				 NULL,
+				 0,
+				 &len);
+	if (len_c <= 0) {
+		SCLog(TRUE, LOG_ERR, CFSTR("patternCompile(): could not get buffer length for \"%@\""), pattern);
+		len = sizeof(str_q) - 1;
+	}
 	if (++len > (CFIndex)sizeof(str_q)) {
 		str = CFAllocatorAllocate(NULL, len, 0);
 	}
diff --git a/configd.tproj/plugin_support.c b/configd.tproj/plugin_support.c
index f0a5506..eded4d6 100644
--- a/configd.tproj/plugin_support.c
+++ b/configd.tproj/plugin_support.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2009, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -37,7 +37,6 @@
  * - initial revision
  */
 
-#include <mach-o/dyld.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/param.h>
@@ -709,9 +708,14 @@ stopBundles()
 	} else {
 		CFRunLoopTimerRef	timer;
 
-		/* sorry, we're not going to wait longer than 20 seconds */
+		/*
+		 * launchd will only wait 20 seconds before sending us a
+		 * SIGKILL and because we want to know what's stuck before
+		 * that time so set our own "we're not waiting any longer"
+		 * timeout for 15 seconds.
+		 */
 		timer = CFRunLoopTimerCreate(NULL,				/* allocator */
-					     CFAbsoluteTimeGetCurrent() + 20.0,	/* fireDate (in 20 seconds) */
+					     CFAbsoluteTimeGetCurrent() + 15.0,	/* fireDate (in 15 seconds) */
 					     0.0,				/* interval (== one-shot) */
 					     0,					/* flags */
 					     0,					/* order */
@@ -878,6 +882,19 @@ sortBundles(CFMutableArrayRef orig)
 }
 
 
+/*
+ * ALT_CFRelease()
+ *
+ * An alternate CFRelease() that we can use to fake out the
+ * static analyzer.
+ */
+static __inline__ void
+ALT_CFRelease(CFTypeRef cf)
+{
+	CFRelease(cf);
+}
+
+
 __private_extern__
 void *
 plugin_exec(void *arg)
@@ -923,6 +940,17 @@ plugin_exec(void *arg)
 
 					bundle = (CFBundleRef)CFArrayGetValueAtIndex(bundles, i);
 					addBundle(bundle, FALSE);
+
+					// The CFBundleCreateBundlesFromDirectory() API has
+					// a known/outstanding bug in that it over-retains the
+					// returned bundles.  Since we do not expect this to
+					// be fixed we release the extra references.
+					//
+					//   See <rdar://problems/4912137&6078752> for more info.
+					//
+					// Also, we use the hack below to keep the static
+					// analyzer happy.
+					ALT_CFRelease(bundle);
 				}
 				CFRelease(bundles);
 			}
@@ -1043,6 +1071,7 @@ plugin_exec(void *arg)
 	 */
 	SCLog(_configd_verbose, LOG_DEBUG, CFSTR("starting plugin CFRunLoop"));
 	plugin_runLoop = CFRunLoopGetCurrent();
+	pthread_setname_np("Main plugin thread");
 	CFRunLoopRun();
 
     done :
diff --git a/configd.tproj/session.c b/configd.tproj/session.c
index bc25fe2..ccce9b3 100644
--- a/configd.tproj/session.c
+++ b/configd.tproj/session.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2007-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2007-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -37,11 +37,30 @@
 
 #include <unistd.h>
 #include <bsm/libbsm.h>
+#include <sandbox.h>
+
 
 /* information maintained for each active session */
 static serverSessionRef	*sessions = NULL;
 static int		nSessions = 0;
 
+/* CFMachPortInvalidation runloop */
+static CFRunLoopRef	sessionRunLoop	= NULL;
+
+
+static void
+CFMachPortInvalidateSessionCallback(CFMachPortRef port, void *info)
+{
+	CFRunLoopRef	currentRunLoop	= CFRunLoopGetCurrent();
+
+	// Bear trap
+	if (!_SC_CFEqual(currentRunLoop, sessionRunLoop)) {
+		_SC_crash("SCDynamicStore CFMachPort invalidation error",
+			   CFSTR("CFMachPort invalidated"),
+			   CFSTR("An SCDynamicStore CFMachPort has incorrectly been invalidated."));
+	}
+}
+
 
 __private_extern__
 serverSessionRef
@@ -79,7 +98,12 @@ addSession(mach_port_t server, CFStringRef (*copyDescription)(const void *info))
 {
 	CFMachPortContext	context	= { 0, NULL, NULL, NULL, NULL };
 	mach_port_t		mp	= server;
-	int			n = -1;
+	int			n	= -1;
+
+	/* save current (SCDynamicStore) runloop */
+	if (sessionRunLoop == NULL) {
+		sessionRunLoop = CFRunLoopGetCurrent();
+	}
 
 	if (nSessions <= 0) {
 		/* new session (actually, the first) found */
@@ -124,11 +148,17 @@ addSession(mach_port_t server, CFStringRef (*copyDescription)(const void *info))
 	//       right present to ensure that CF does not establish
 	//       its dead name notification.
 	//
-	sessions[n]->serverPort = CFMachPortCreateWithPort(NULL,
-							   mp,
-							   configdCallback,
-							   &context,
-							   NULL);
+	sessions[n]->serverPort = _SC_CFMachPortCreateWithPort("SCDynamicStore/session",
+							       mp,
+							       configdCallback,
+							       &context);
+
+	//
+	// Set bear trap (an invalidation callback) to catch other
+	// threads stomping on us
+	//
+	CFMachPortSetInvalidationCallBack(sessions[n]->serverPort,
+					  CFMachPortInvalidateSessionCallback);
 
 	if (server == MACH_PORT_NULL) {
 		// insert send right that will be moved to the client
@@ -303,7 +333,7 @@ listSessions(FILE *f)
 }
 
 
-#if	TARGET_OS_IPHONE
+#if	TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
 
 #include <Security/Security.h>
 #include <Security/SecTask.h>
@@ -340,12 +370,12 @@ hasEntitlement(serverSessionRef session, CFStringRef entitlement)
 		CFTypeRef	value;
 
 		/* Get the value for the entitlement. */
-		value = SecTaskCopyValueForEntitlement(task, kSCWriteEntitlementName, &error);
+		value = SecTaskCopyValueForEntitlement(task, entitlement, &error);
 		if (value != NULL) {
 			if (isA_CFBoolean(value)) {
 				if (CFBooleanGetValue(value)) {
 					/* if client DOES have entitlement */
-					hasEntitlement = YES;
+					hasEntitlement = TRUE;
 				}
 			} else {
 				SCLog(TRUE, LOG_ERR,
@@ -354,10 +384,14 @@ hasEntitlement(serverSessionRef session, CFStringRef entitlement)
 			}
 
 			CFRelease(value);
-		} else if (error != NULL) {
-			SCLog(TRUE, LOG_ERR,
-			      CFSTR("hasEntitlement SecTaskCopyValueForEntitlement() failed, error=%@: %@"),
-			      error,
+		}
+		if (error != NULL) {
+			SCLog(TRUE,
+			      (value == NULL) ? LOG_ERR : LOG_DEBUG,
+			      CFSTR("hasEntitlement SecTaskCopyValueForEntitlement() %s, error domain=%@, error code=%lx"),
+			      (value == NULL) ? "failed" : "warned",
+			      CFErrorGetDomain(error),
+			      CFErrorGetCode(error),
 			      sessionName(session));
 			CFRelease(error);
 		}
@@ -372,7 +406,7 @@ hasEntitlement(serverSessionRef session, CFStringRef entitlement)
 	return hasEntitlement;
 }
 
-#endif	// TARGET_OS_IPHONE
+#endif  // TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
 
 
 __private_extern__
@@ -412,13 +446,44 @@ hasWriteAccess(serverSessionRef session)
 			// grant write access to eUID==0 processes
 			session->callerWriteAccess = YES;
 		}
-#if	TARGET_OS_IPHONE
+#if	TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
 		else if (hasEntitlement(session, kSCWriteEntitlementName)) {
 			// grant write access to "entitled" processes
 			session->callerWriteAccess = YES;
 		}
-#endif	// TARGET_OS_IPHONE
+#endif  // TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
 	}
 
 	return (session->callerWriteAccess == YES) ? TRUE : FALSE;
 }
+
+
+__private_extern__
+Boolean
+hasPathAccess(serverSessionRef session, const char *path)
+{
+	pid_t	pid;
+	char	realPath[PATH_MAX];
+
+	if (realpath(path, realPath) == NULL) {
+		SCLog(TRUE, LOG_DEBUG, CFSTR("hasPathAccess realpath() failed: %s"), strerror(errno));
+		return FALSE;
+	}
+
+	audit_token_to_au32(session->auditToken,
+			    NULL,		// auidp
+			    NULL,		// euid
+			    NULL,		// egid
+			    NULL,		// ruid
+			    NULL,		// rgid
+			    &pid,		// pid
+			    NULL,		// asid
+			    NULL);		// tid
+
+	if (sandbox_check(pid, "file-write-data", SANDBOX_FILTER_PATH, realPath) > 0) {
+		SCLog(TRUE, LOG_DEBUG, CFSTR("hasPathAccess sandbox access denied: %s"), strerror(errno));
+		return FALSE;
+	}
+
+	return TRUE;
+}
diff --git a/configd.tproj/session.h b/configd.tproj/session.h
index 37817d1..6e4962f 100644
--- a/configd.tproj/session.h
+++ b/configd.tproj/session.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2005-2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2005-2007, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -39,12 +39,12 @@
 #include <TargetConditionals.h>
 
 
-#if	TARGET_OS_IPHONE
+#if	TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
 #define	kSCWriteEntitlementName	CFSTR("com.apple.SystemConfiguration.SCDynamicStore-write-access")
-#endif	// TARGET_OS_IPHONE
+#endif  // TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
 
 
-typedef	enum { UNKNOWN, NO, YES } lazyBoolean;
+typedef	enum { NO = 0, YES, UNKNOWN } lazyBoolean;
 
 
 /* Per client server state */
@@ -91,6 +91,9 @@ Boolean			hasRootAccess	(serverSessionRef	session);
 
 Boolean			hasWriteAccess	(serverSessionRef	session);
 
+Boolean			hasPathAccess	(serverSessionRef	session,
+					 const char		*path);
+
 __END_DECLS
 
 #endif /* !_S_SESSION_H */
diff --git a/configd.xcodeproj/project.pbxproj b/configd.xcodeproj/project.pbxproj
index a29f242..b572e25 100644
--- a/configd.xcodeproj/project.pbxproj
+++ b/configd.xcodeproj/project.pbxproj
@@ -106,6 +106,79 @@
 			name = "configd_executables-Embedded";
 			productName = configd_executables;
 		};
+		1583E9E01083959E00A3BC0C /* All-EmbeddedOther */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 1583E9E91083959E00A3BC0C /* Build configuration list for PBXAggregateTarget "All-EmbeddedOther" */;
+			buildPhases = (
+			);
+			dependencies = (
+				15AC515810839608004A9ED5 /* PBXTargetDependency */,
+				15AC515B1083960E004A9ED5 /* PBXTargetDependency */,
+				15AC515D10839613004A9ED5 /* PBXTargetDependency */,
+				15AC515F1083961E004A9ED5 /* PBXTargetDependency */,
+			);
+			name = "All-EmbeddedOther";
+			productName = Embedded;
+		};
+		1583E9FD108395BB00A3BC0C /* configd_libSystem-EmbeddedOther */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 1583EA01108395BB00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_libSystem-EmbeddedOther" */;
+			buildPhases = (
+			);
+			dependencies = (
+				15AC516110839649004A9ED5 /* PBXTargetDependency */,
+			);
+			name = "configd_libSystem-EmbeddedOther";
+			productName = configd_libSystem;
+		};
+		1583EA11108395BB00A3BC0C /* configd_base-EmbeddedOther */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 1583EA16108395BB00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_base-EmbeddedOther" */;
+			buildPhases = (
+			);
+			dependencies = (
+				15AC516310839666004A9ED5 /* PBXTargetDependency */,
+				15AC51651083966B004A9ED5 /* PBXTargetDependency */,
+			);
+			name = "configd_base-EmbeddedOther";
+			productName = Frameworks;
+		};
+		1583EAAC108395BB00A3BC0C /* configd_plugins-EmbeddedOther */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 1583EAC7108395BB00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_plugins-EmbeddedOther" */;
+			buildPhases = (
+			);
+			dependencies = (
+				15AC5189108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5187108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5185108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5183108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5181108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC517F108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC517D108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC517B108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5179108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5177108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5175108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5173108396D2004A9ED5 /* PBXTargetDependency */,
+				15AC5171108396D2004A9ED5 /* PBXTargetDependency */,
+			);
+			name = "configd_plugins-EmbeddedOther";
+			productName = Plugins;
+		};
+		1583EB41108395BD00A3BC0C /* configd_executables-EmbeddedOther */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 1583EB48108395BD00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_executables-EmbeddedOther" */;
+			buildPhases = (
+			);
+			dependencies = (
+				15AC516E108396B7004A9ED5 /* PBXTargetDependency */,
+				15AC516C108396B7004A9ED5 /* PBXTargetDependency */,
+				15AC516A108396B7004A9ED5 /* PBXTargetDependency */,
+			);
+			name = "configd_executables-EmbeddedOther";
+			productName = configd_executables;
+		};
 		159D542007528E7C004F8947 /* configd_plugins */ = {
 			isa = PBXAggregateTarget;
 			buildConfigurationList = 156EB61E0905594A00EEF749 /* Build configuration list for PBXAggregateTarget "configd_plugins" */;
@@ -133,7 +206,6 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = 15C64A270F684C6B00D78394 /* Build configuration list for PBXAggregateTarget "configd_libSystem" */;
 			buildPhases = (
-				15BED7930F6853F800016614 /* OLD libdnsinfo.a */,
 			);
 			dependencies = (
 				15C64A220F684C4900D78394 /* PBXTargetDependency */,
@@ -145,7 +217,6 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = 15C64A2B0F684C6B00D78394 /* Build configuration list for PBXAggregateTarget "configd_libSystem-Embedded" */;
 			buildPhases = (
-				15BED7A20F68551200016614 /* OLD libdnsinfo.a */,
 			);
 			dependencies = (
 				15C64A310F684C8F00D78394 /* PBXTargetDependency */,
@@ -190,6 +261,21 @@
 		1521400C0E93FFF500DACD2C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
 		152140580E93FFFC00DACD2C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1559C4440D349A4E0098FD59 /* SystemConfiguration.framework */; };
 		1522FCFB0FA7FE4B00B24128 /* dnsinfo_flatfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 1522FCE50FA7FD7000B24128 /* dnsinfo_flatfile.c */; };
+		152691D81129EE8A006BD2D5 /* BondConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 9EE943F306AF409B00772EB5 /* BondConfiguration.c */; };
+		152691D91129EE94006BD2D5 /* BondConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 9EE943F306AF409B00772EB5 /* BondConfiguration.c */; };
+		152691DA1129EE98006BD2D5 /* BondConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 9EE943F306AF409B00772EB5 /* BondConfiguration.c */; };
+		152691DB1129EEA6006BD2D5 /* BridgeConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15FD7B3B101E439200C56621 /* BridgeConfiguration.c */; };
+		152691DC1129EEAD006BD2D5 /* BridgeConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15FD7B3B101E439200C56621 /* BridgeConfiguration.c */; };
+		152691DD1129EEB1006BD2D5 /* BridgeConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15FD7B3B101E439200C56621 /* BridgeConfiguration.c */; };
+		152691DE1129EEC2006BD2D5 /* VLANConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B605C0722B0099E85F /* VLANConfiguration.c */; };
+		152691DF1129EEC8006BD2D5 /* VLANConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B605C0722B0099E85F /* VLANConfiguration.c */; };
+		152691E01129EECB006BD2D5 /* VLANConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B605C0722B0099E85F /* VLANConfiguration.c */; };
+		152E0E7F10FE820E00E402F2 /* helper.defs in Sources */ = {isa = PBXBuildFile; fileRef = 152E0E7E10FE820E00E402F2 /* helper.defs */; settings = {ATTRIBUTES = (Server, ); }; };
+		152E0E8010FE820E00E402F2 /* helper.defs in Sources */ = {isa = PBXBuildFile; fileRef = 152E0E7E10FE820E00E402F2 /* helper.defs */; settings = {ATTRIBUTES = (Server, ); }; };
+		152E0E8110FE820E00E402F2 /* helper.defs in Sources */ = {isa = PBXBuildFile; fileRef = 152E0E7E10FE820E00E402F2 /* helper.defs */; settings = {ATTRIBUTES = (Server, ); }; };
+		152E0E8910FE824000E402F2 /* helper_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 152E0E8810FE824000E402F2 /* helper_types.h */; };
+		152E0E8A10FE824000E402F2 /* helper_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 152E0E8810FE824000E402F2 /* helper_types.h */; };
+		152E0E8B10FE824000E402F2 /* helper_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 152E0E8810FE824000E402F2 /* helper_types.h */; };
 		152E68C10A2C89C70011FDA8 /* SCPreferencesKeychainPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 152E68C00A2C89C70011FDA8 /* SCPreferencesKeychainPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		152E68C30A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 152E68C20A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c */; };
 		1533D77B0B10A14300CA4946 /* libNetworkIdentification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F95B8A5F0B03F81400993BA3 /* libNetworkIdentification.a */; };
@@ -277,14 +363,11 @@
 		1572C4C30CFB55B400E2776E /* DeviceOnHold.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694505C0722B0099E85F /* DeviceOnHold.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1572C4C50CFB55B400E2776E /* dy_framework.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694905C0722B0099E85F /* dy_framework.h */; };
 		1572C4C70CFB55B400E2776E /* SCPreferencesPathKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 151BDA2B05D9E28B00657BC7 /* SCPreferencesPathKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		1572C4C80CFB55B400E2776E /* dnsinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0905FD1B670096477F /* dnsinfo.h */; };
-		1572C4C90CFB55B400E2776E /* dnsinfo_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0C05FD1B670096477F /* dnsinfo_private.h */; };
 		1572C4CA0CFB55B400E2776E /* pppcontroller_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 23C1E2B4062DD2C700835B54 /* pppcontroller_types.h */; };
 		1572C4CB0CFB55B400E2776E /* pppcontroller.h in Headers */ = {isa = PBXBuildFile; fileRef = 23C1E2BE062DD5DB00835B54 /* pppcontroller.h */; };
 		1572C4CE0CFB55B400E2776E /* SCPreferencesSetSpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 156BD6BB07E0DFA9008698FF /* SCPreferencesSetSpecificPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1572C4CF0CFB55B400E2776E /* SCPreferencesGetSpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 154CF3F307E1EA4D00D8302E /* SCPreferencesGetSpecificPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1572C4D00CFB55B400E2776E /* SCNetworkConfigurationPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 155A1E6B081079CC00F70D98 /* SCNetworkConfigurationPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		1572C4D10CFB55B400E2776E /* helper_comm.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DAF2D708466D4900D1B2BD /* helper_comm.h */; };
 		1572C4D20CFB55B400E2776E /* SCHelper_client.h in Headers */ = {isa = PBXBuildFile; fileRef = 155B7BF60847776D00F0E262 /* SCHelper_client.h */; };
 		1572C4D40CFB55B400E2776E /* SCNetworkConnectionPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A2972E0A13C08C009879B3 /* SCNetworkConnectionPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1572C4D50CFB55B400E2776E /* SCPreferencesKeychainPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 152E68C00A2C89C70011FDA8 /* SCPreferencesKeychainPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -348,15 +431,12 @@
 		1572C5120CFB55B400E2776E /* dy_framework.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B405C0722B0099E85F /* dy_framework.c */; settings = {ATTRIBUTES = (); }; };
 		1572C5140CFB55B400E2776E /* config.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69BE05C0722B0099E85F /* config.defs */; settings = {ATTRIBUTES = (Client, ); }; };
 		1572C5150CFB55B400E2776E /* SCPreferencesPathKey.c in Sources */ = {isa = PBXBuildFile; fileRef = 151BDA5D05D9E2ED00657BC7 /* SCPreferencesPathKey.c */; };
-		1572C5160CFB55B400E2776E /* dnsinfo_private.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0B05FD1B670096477F /* dnsinfo_private.c */; };
-		1572C5170CFB55B400E2776E /* dnsinfo_copy.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0805FD1B670096477F /* dnsinfo_copy.c */; };
 		1572C5180CFB55B400E2776E /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; settings = {ATTRIBUTES = (Client, ); }; };
 		1572C5190CFB55B400E2776E /* SCNetworkConfigurationInternal.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A390670A85900BFE03C /* SCNetworkConfigurationInternal.c */; };
 		1572C51A0CFB55B400E2776E /* SCNetworkInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3B0670A85900BFE03C /* SCNetworkInterface.c */; };
 		1572C51B0CFB55B400E2776E /* SCNetworkProtocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3C0670A85900BFE03C /* SCNetworkProtocol.c */; };
 		1572C51C0CFB55B400E2776E /* SCNetworkService.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3D0670A85900BFE03C /* SCNetworkService.c */; };
 		1572C51D0CFB55B400E2776E /* SCNetworkSet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3E0670A85900BFE03C /* SCNetworkSet.c */; };
-		1572C51F0CFB55B400E2776E /* helper_comm.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D608466D4900D1B2BD /* helper_comm.c */; };
 		1572C5200CFB55B400E2776E /* SCHelper_client.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D808466D4900D1B2BD /* SCHelper_client.c */; };
 		1572C5210CFB55B400E2776E /* SCPreferencesKeychainPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 152E68C20A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c */; };
 		1572C5220CFB55B400E2776E /* SCNetworkSignature.c in Sources */ = {isa = PBXBuildFile; fileRef = F95B8A420B03E07A00993BA3 /* SCNetworkSignature.c */; };
@@ -394,6 +474,12 @@
 		1574340E0D4A8137002ACA73 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
 		1574340F0D4A8137002ACA73 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1547072E0D1F70C80075C28D /* SystemConfiguration.framework */; };
 		157434110D4A8137002ACA73 /* libedit.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 152CEED0070CF6640050F23C /* libedit.dylib */; };
+		1575FD2712CD15C60003D86E /* proxy-configuration.c in Sources */ = {isa = PBXBuildFile; fileRef = 1575FD2512CD15C60003D86E /* proxy-configuration.c */; };
+		1575FD2812CD15C60003D86E /* proxy-configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 1575FD2612CD15C60003D86E /* proxy-configuration.h */; };
+		1575FD2912CD15C60003D86E /* proxy-configuration.c in Sources */ = {isa = PBXBuildFile; fileRef = 1575FD2512CD15C60003D86E /* proxy-configuration.c */; };
+		1575FD2A12CD15C60003D86E /* proxy-configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 1575FD2612CD15C60003D86E /* proxy-configuration.h */; };
+		1575FD2B12CD15C60003D86E /* proxy-configuration.c in Sources */ = {isa = PBXBuildFile; fileRef = 1575FD2512CD15C60003D86E /* proxy-configuration.c */; };
+		1575FD2C12CD15C60003D86E /* proxy-configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 1575FD2612CD15C60003D86E /* proxy-configuration.h */; };
 		15792B9B0DA2C190008DDED9 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1543636A0752D03C00A8EC6C /* IOKit.framework */; };
 		157A84DA0D56C63900B6F1A0 /* dnsinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0905FD1B670096477F /* dnsinfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		157A84DB0D56C63900B6F1A0 /* dnsinfo_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0C05FD1B670096477F /* dnsinfo_private.h */; };
@@ -466,24 +552,256 @@
 		158317560CFB80A1006F62B9 /* libNetworkIdentification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F95B8A5F0B03F81400993BA3 /* libNetworkIdentification.a */; };
 		158317570CFB80A1006F62B9 /* libPreferencesMonitor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53FA07528C95004F8947 /* libPreferencesMonitor.a */; };
 		1583175C0CFB80A1006F62B9 /* com.apple.configd.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1540E3600987DA9500157C07 /* com.apple.configd.plist */; };
-		1583379B0CFB6B9E0033AB93 /* helper_comm.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DAF2D708466D4900D1B2BD /* helper_comm.h */; };
 		1583379C0CFB6B9E0033AB93 /* SCHelper_client.h in Headers */ = {isa = PBXBuildFile; fileRef = 155B7BF60847776D00F0E262 /* SCHelper_client.h */; };
 		1583379E0CFB6B9E0033AB93 /* SCHelper_server.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D908466D4900D1B2BD /* SCHelper_server.c */; };
 		158337A00CFB6B9E0033AB93 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
 		158337A20CFB6B9E0033AB93 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1520A3DE0846B2DC0010B584 /* Security.framework */; };
 		158337AD0CFB6BDC0033AB93 /* com.apple.SCHelper-embedded.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = 151356AD0CE0CF2F0017E523 /* com.apple.SCHelper-embedded.plist */; };
-		158ADD190754F1F100124717 /* Kicker.xml in Resources */ = {isa = PBXBuildFile; fileRef = 159D53BC07528B36004F8947 /* Kicker.xml */; };
-		158ADD1B0754F1F400124717 /* enable-network in Resources */ = {isa = PBXBuildFile; fileRef = 159D53BD07528B36004F8947 /* enable-network */; };
+		1583EA06108395BB00A3BC0C /* dnsinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0905FD1B670096477F /* dnsinfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1583EA07108395BB00A3BC0C /* dnsinfo_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0C05FD1B670096477F /* dnsinfo_private.h */; };
+		1583EA09108395BB00A3BC0C /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; settings = {ATTRIBUTES = (Client, ); }; };
+		1583EA0A108395BB00A3BC0C /* dnsinfo_copy.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0805FD1B670096477F /* dnsinfo_copy.c */; };
+		1583EA0B108395BB00A3BC0C /* dnsinfo_private.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0B05FD1B670096477F /* dnsinfo_private.c */; };
+		1583EA1B108395BB00A3BC0C /* SCSchemaDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 150607DE075A00A300B147BA /* SCSchemaDefinitions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1583EA1C108395BB00A3BC0C /* SystemConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB691305C0722B0099E85F /* SystemConfiguration.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA1D108395BB00A3BC0C /* SCPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB691505C0722B0099E85F /* SCPrivate.h */; settings = {ATTRIBUTES = (Project, Private, ); }; };
+		1583EA1E108395BB00A3BC0C /* SCDPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB691705C0722B0099E85F /* SCDPlugin.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA1F108395BB00A3BC0C /* SCDynamicStoreInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB691B05C0722B0099E85F /* SCDynamicStoreInternal.h */; settings = {ATTRIBUTES = (Project, ); }; };
+		1583EA20108395BB00A3BC0C /* SCDynamicStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB691D05C0722B0099E85F /* SCDynamicStore.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA21108395BB00A3BC0C /* SCDynamicStorePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB691F05C0722B0099E85F /* SCDynamicStorePrivate.h */; settings = {ATTRIBUTES = (Project, Private, ); }; };
+		1583EA22108395BB00A3BC0C /* SCDynamicStoreKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692105C0722B0099E85F /* SCDynamicStoreKey.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA23108395BB00A3BC0C /* SCDynamicStoreCopySpecific.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692305C0722B0099E85F /* SCDynamicStoreCopySpecific.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA24108395BB00A3BC0C /* SCDynamicStoreCopySpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692505C0722B0099E85F /* SCDynamicStoreCopySpecificPrivate.h */; settings = {ATTRIBUTES = (Project, Private, ); }; };
+		1583EA25108395BB00A3BC0C /* SCDynamicStoreSetSpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692705C0722B0099E85F /* SCDynamicStoreSetSpecificPrivate.h */; settings = {ATTRIBUTES = (Project, Private, ); }; };
+		1583EA26108395BB00A3BC0C /* SCPreferencesInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692905C0722B0099E85F /* SCPreferencesInternal.h */; settings = {ATTRIBUTES = (Project, ); }; };
+		1583EA27108395BB00A3BC0C /* SCPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692B05C0722B0099E85F /* SCPreferences.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA28108395BB00A3BC0C /* SCPreferencesPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692D05C0722B0099E85F /* SCPreferencesPrivate.h */; settings = {ATTRIBUTES = (Project, Private, ); }; };
+		1583EA29108395BB00A3BC0C /* SCPreferencesPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB692F05C0722B0099E85F /* SCPreferencesPath.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA2A108395BB00A3BC0C /* SCPreferencesSetSpecific.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB693105C0722B0099E85F /* SCPreferencesSetSpecific.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA2B108395BB00A3BC0C /* SCNetworkConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 15AD7A380670A85900BFE03C /* SCNetworkConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1583EA2C108395BB00A3BC0C /* SCNetworkConfigurationInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 15AD7A3A0670A85900BFE03C /* SCNetworkConfigurationInternal.h */; settings = {ATTRIBUTES = (); }; };
+		1583EA2D108395BB00A3BC0C /* SCNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB693305C0722B0099E85F /* SCNetwork.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA2E108395BB00A3BC0C /* SCNetworkConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB693505C0722B0099E85F /* SCNetworkConnection.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA2F108395BB00A3BC0C /* SCNetworkReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB693705C0722B0099E85F /* SCNetworkReachability.h */; settings = {ATTRIBUTES = (Public, Project, ); }; };
+		1583EA30108395BB00A3BC0C /* SCValidation.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB693905C0722B0099E85F /* SCValidation.h */; settings = {ATTRIBUTES = (Project, Private, ); }; };
+		1583EA31108395BB00A3BC0C /* DHCPClientPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB693D05C0722B0099E85F /* DHCPClientPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1583EA32108395BB00A3BC0C /* SCDynamicStoreCopyDHCPInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB693F05C0722B0099E85F /* SCDynamicStoreCopyDHCPInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1583EA33108395BB00A3BC0C /* moh_msg.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694105C0722B0099E85F /* moh_msg.h */; };
+		1583EA34108395BB00A3BC0C /* moh.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694305C0722B0099E85F /* moh.h */; };
+		1583EA35108395BB00A3BC0C /* DeviceOnHold.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694505C0722B0099E85F /* DeviceOnHold.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA36108395BB00A3BC0C /* dy_framework.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694905C0722B0099E85F /* dy_framework.h */; };
+		1583EA37108395BB00A3BC0C /* SCPreferencesPathKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 151BDA2B05D9E28B00657BC7 /* SCPreferencesPathKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA38108395BB00A3BC0C /* pppcontroller_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 23C1E2B4062DD2C700835B54 /* pppcontroller_types.h */; };
+		1583EA39108395BB00A3BC0C /* pppcontroller.h in Headers */ = {isa = PBXBuildFile; fileRef = 23C1E2BE062DD5DB00835B54 /* pppcontroller.h */; };
+		1583EA3A108395BB00A3BC0C /* SCPreferencesSetSpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 156BD6BB07E0DFA9008698FF /* SCPreferencesSetSpecificPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA3B108395BB00A3BC0C /* SCPreferencesGetSpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 154CF3F307E1EA4D00D8302E /* SCPreferencesGetSpecificPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA3C108395BB00A3BC0C /* SCNetworkConfigurationPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 155A1E6B081079CC00F70D98 /* SCNetworkConfigurationPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA3E108395BB00A3BC0C /* SCHelper_client.h in Headers */ = {isa = PBXBuildFile; fileRef = 155B7BF60847776D00F0E262 /* SCHelper_client.h */; };
+		1583EA3F108395BB00A3BC0C /* SCNetworkConnectionPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A2972E0A13C08C009879B3 /* SCNetworkConnectionPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA40108395BB00A3BC0C /* SCPreferencesKeychainPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 152E68C00A2C89C70011FDA8 /* SCPreferencesKeychainPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA41108395BB00A3BC0C /* SCSchemaDefinitionsPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 157A88880A470D0F003A4256 /* SCSchemaDefinitionsPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA42108395BB00A3BC0C /* SCNetworkSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = F95B8A440B03E09300993BA3 /* SCNetworkSignature.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA43108395BB00A3BC0C /* SCNetworkSignaturePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = F95B8A450B03E09300993BA3 /* SCNetworkSignaturePrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		1583EA44108395BB00A3BC0C /* CaptiveNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A1FF3010597F17004C9CC9 /* CaptiveNetwork.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1583EA4B108395BB00A3BC0C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 15A6F7C20A4B266D00B907EA /* Localizable.strings */; };
+		1583EA4C108395BB00A3BC0C /* NetworkInterface.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1577253606EFBF3100D7B52B /* NetworkInterface.strings */; };
+		1583EA4D108395BB00A3BC0C /* NetworkConfiguration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 15B686220678B65C00FF4023 /* NetworkConfiguration.plist */; };
+		1583EA4E108395BB00A3BC0C /* get-mobility-info in Resources */ = {isa = PBXBuildFile; fileRef = 15CFC229068B222F00123568 /* get-mobility-info */; };
+		1583EA50108395BB00A3BC0C /* SCSchemaDefinitions.c in Sources */ = {isa = PBXBuildFile; fileRef = 150607BD075A00A200B147BA /* SCSchemaDefinitions.c */; };
+		1583EA51108395BB00A3BC0C /* SCD.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695005C0722B0099E85F /* SCD.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA52108395BB00A3BC0C /* SCDKeys.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695205C0722B0099E85F /* SCDKeys.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA53108395BB00A3BC0C /* SCDPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695405C0722B0099E85F /* SCDPrivate.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA54108395BB00A3BC0C /* SCDPlugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695605C0722B0099E85F /* SCDPlugin.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA55108395BB00A3BC0C /* SCDOpen.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695805C0722B0099E85F /* SCDOpen.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA56108395BB00A3BC0C /* SCDLock.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695A05C0722B0099E85F /* SCDLock.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA57108395BB00A3BC0C /* SCDUnlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695C05C0722B0099E85F /* SCDUnlock.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA58108395BB00A3BC0C /* SCDList.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB695E05C0722B0099E85F /* SCDList.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA59108395BB00A3BC0C /* SCDAdd.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB696005C0722B0099E85F /* SCDAdd.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA5A108395BB00A3BC0C /* SCDGet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB696405C0722B0099E85F /* SCDGet.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA5B108395BB00A3BC0C /* SCDSet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB696605C0722B0099E85F /* SCDSet.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA5C108395BB00A3BC0C /* SCDRemove.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB696805C0722B0099E85F /* SCDRemove.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA5D108395BB00A3BC0C /* SCDTouch.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB696A05C0722B0099E85F /* SCDTouch.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA5E108395BB00A3BC0C /* SCDNotify.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB696C05C0722B0099E85F /* SCDNotify.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA5F108395BB00A3BC0C /* SCDNotifierSetKeys.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB696E05C0722B0099E85F /* SCDNotifierSetKeys.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA60108395BB00A3BC0C /* SCDNotifierAdd.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697005C0722B0099E85F /* SCDNotifierAdd.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA61108395BB00A3BC0C /* SCDNotifierRemove.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697205C0722B0099E85F /* SCDNotifierRemove.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA62108395BB00A3BC0C /* SCDNotifierGetChanges.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697405C0722B0099E85F /* SCDNotifierGetChanges.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA63108395BB00A3BC0C /* SCDNotifierWait.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697605C0722B0099E85F /* SCDNotifierWait.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA64108395BB00A3BC0C /* SCDNotifierInformViaCallback.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697805C0722B0099E85F /* SCDNotifierInformViaCallback.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA65108395BB00A3BC0C /* SCDNotifierInformViaMachPort.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697A05C0722B0099E85F /* SCDNotifierInformViaMachPort.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA66108395BB00A3BC0C /* SCDNotifierInformViaFD.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697C05C0722B0099E85F /* SCDNotifierInformViaFD.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA67108395BB00A3BC0C /* SCDNotifierInformViaSignal.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB697E05C0722B0099E85F /* SCDNotifierInformViaSignal.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA68108395BB00A3BC0C /* SCDNotifierCancel.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698005C0722B0099E85F /* SCDNotifierCancel.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA69108395BB00A3BC0C /* SCDSnapshot.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698205C0722B0099E85F /* SCDSnapshot.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA6A108395BB00A3BC0C /* SCP.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698405C0722B0099E85F /* SCP.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA6B108395BB00A3BC0C /* SCPOpen.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698605C0722B0099E85F /* SCPOpen.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA6C108395BB00A3BC0C /* SCPLock.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698805C0722B0099E85F /* SCPLock.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA6D108395BB00A3BC0C /* SCPUnlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698A05C0722B0099E85F /* SCPUnlock.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA6E108395BB00A3BC0C /* SCPList.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698C05C0722B0099E85F /* SCPList.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA6F108395BB00A3BC0C /* SCPGet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB698E05C0722B0099E85F /* SCPGet.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA70108395BB00A3BC0C /* SCPAdd.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB699005C0722B0099E85F /* SCPAdd.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA71108395BB00A3BC0C /* SCPSet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB699205C0722B0099E85F /* SCPSet.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA72108395BB00A3BC0C /* SCPRemove.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB699405C0722B0099E85F /* SCPRemove.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA73108395BB00A3BC0C /* SCPCommit.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB699605C0722B0099E85F /* SCPCommit.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA74108395BB00A3BC0C /* SCPApply.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB699805C0722B0099E85F /* SCPApply.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA75108395BB00A3BC0C /* SCPPath.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB699A05C0722B0099E85F /* SCPPath.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA76108395BB00A3BC0C /* SCDHostName.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB699E05C0722B0099E85F /* SCDHostName.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA77108395BB00A3BC0C /* SCLocation.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69A005C0722B0099E85F /* SCLocation.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA78108395BB00A3BC0C /* SCNetwork.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69A205C0722B0099E85F /* SCNetwork.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA79108395BB00A3BC0C /* pppcontroller.defs in Sources */ = {isa = PBXBuildFile; fileRef = 23C1E2B8062DD45900835B54 /* pppcontroller.defs */; settings = {ATTRIBUTES = (Client, ); }; };
+		1583EA7A108395BB00A3BC0C /* SCNetworkConnection.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69A405C0722B0099E85F /* SCNetworkConnection.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA7B108395BB00A3BC0C /* SCNetworkConnectionPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 15A2972D0A13C08C009879B3 /* SCNetworkConnectionPrivate.c */; };
+		1583EA7C108395BB00A3BC0C /* SCNetworkReachability.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69A605C0722B0099E85F /* SCNetworkReachability.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA7D108395BB00A3BC0C /* SCProxies.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69A805C0722B0099E85F /* SCProxies.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA7E108395BB00A3BC0C /* DHCP.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69AC05C0722B0099E85F /* DHCP.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA7F108395BB00A3BC0C /* moh.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69AE05C0722B0099E85F /* moh.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA80108395BB00A3BC0C /* DeviceOnHold.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B005C0722B0099E85F /* DeviceOnHold.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA81108395BB00A3BC0C /* LinkConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B205C0722B0099E85F /* LinkConfiguration.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA82108395BB00A3BC0C /* dy_framework.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B405C0722B0099E85F /* dy_framework.c */; settings = {ATTRIBUTES = (); }; };
+		1583EA83108395BB00A3BC0C /* config.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69BE05C0722B0099E85F /* config.defs */; settings = {ATTRIBUTES = (Client, ); }; };
+		1583EA84108395BB00A3BC0C /* SCPreferencesPathKey.c in Sources */ = {isa = PBXBuildFile; fileRef = 151BDA5D05D9E2ED00657BC7 /* SCPreferencesPathKey.c */; };
+		1583EA85108395BB00A3BC0C /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; settings = {ATTRIBUTES = (Client, ); }; };
+		1583EA86108395BB00A3BC0C /* SCNetworkConfigurationInternal.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A390670A85900BFE03C /* SCNetworkConfigurationInternal.c */; };
+		1583EA87108395BB00A3BC0C /* SCNetworkInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3B0670A85900BFE03C /* SCNetworkInterface.c */; };
+		1583EA88108395BB00A3BC0C /* SCNetworkProtocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3C0670A85900BFE03C /* SCNetworkProtocol.c */; };
+		1583EA89108395BB00A3BC0C /* SCNetworkService.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3D0670A85900BFE03C /* SCNetworkService.c */; };
+		1583EA8A108395BB00A3BC0C /* SCNetworkSet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3E0670A85900BFE03C /* SCNetworkSet.c */; };
+		1583EA8C108395BB00A3BC0C /* SCHelper_client.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D808466D4900D1B2BD /* SCHelper_client.c */; };
+		1583EA8D108395BB00A3BC0C /* SCPreferencesKeychainPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 152E68C20A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c */; };
+		1583EA8E108395BB00A3BC0C /* SCNetworkSignature.c in Sources */ = {isa = PBXBuildFile; fileRef = F95B8A420B03E07A00993BA3 /* SCNetworkSignature.c */; };
+		1583EA8F108395BB00A3BC0C /* CaptiveNetwork.c in Sources */ = {isa = PBXBuildFile; fileRef = 15A1FF3110597F17004C9CC9 /* CaptiveNetwork.c */; };
+		1583EA94108395BB00A3BC0C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
+		1583EA9E108395BB00A3BC0C /* SCHelper_client.h in Headers */ = {isa = PBXBuildFile; fileRef = 155B7BF60847776D00F0E262 /* SCHelper_client.h */; };
+		1583EAA0108395BB00A3BC0C /* SCHelper_server.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D908466D4900D1B2BD /* SCHelper_server.c */; };
+		1583EAA2108395BB00A3BC0C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
+		1583EAA3108395BB00A3BC0C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1547072E0D1F70C80075C28D /* SystemConfiguration.framework */; };
+		1583EAA4108395BB00A3BC0C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1520A3DE0846B2DC0010B584 /* Security.framework */; };
+		1583EAA6108395BB00A3BC0C /* com.apple.SCHelper-embedded.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = 151356AD0CE0CF2F0017E523 /* com.apple.SCHelper-embedded.plist */; };
+		1583EACC108395BB00A3BC0C /* dns-configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 155D22380AF13A7300D52ED0 /* dns-configuration.h */; };
+		1583EACD108395BB00A3BC0C /* set-hostname.h in Headers */ = {isa = PBXBuildFile; fileRef = 155D22390AF13A7300D52ED0 /* set-hostname.h */; };
+		1583EACE108395BB00A3BC0C /* dnsinfo_create.h in Headers */ = {isa = PBXBuildFile; fileRef = 1532629006281C9D00B1C10C /* dnsinfo_create.h */; };
+		1583EAD0108395BB00A3BC0C /* ip_plugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53A707528B36004F8947 /* ip_plugin.c */; };
+		1583EAD1108395BB00A3BC0C /* dns-configuration.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53AA07528B36004F8947 /* dns-configuration.c */; };
+		1583EAD2108395BB00A3BC0C /* set-hostname.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53AB07528B36004F8947 /* set-hostname.c */; };
+		1583EAD3108395BB00A3BC0C /* dnsinfo_create.c in Sources */ = {isa = PBXBuildFile; fileRef = 1521FC5C060F296A003B28F5 /* dnsinfo_create.c */; };
+		1583EAD4108395BB00A3BC0C /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; };
+		1583EAE3108395BB00A3BC0C /* ifnamer.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53AE07528B36004F8947 /* ifnamer.c */; };
+		1583EAF1108395BC00A3BC0C /* cache.h in Headers */ = {isa = PBXBuildFile; fileRef = 159D53CB07528B36004F8947 /* cache.h */; };
+		1583EAF2108395BC00A3BC0C /* ev_dlil.h in Headers */ = {isa = PBXBuildFile; fileRef = 159D53B207528B36004F8947 /* ev_dlil.h */; };
+		1583EAF3108395BC00A3BC0C /* ev_ipv4.h in Headers */ = {isa = PBXBuildFile; fileRef = 159D53B807528B36004F8947 /* ev_ipv4.h */; };
+		1583EAF4108395BC00A3BC0C /* ev_ipv6.h in Headers */ = {isa = PBXBuildFile; fileRef = 159D53BA07528B36004F8947 /* ev_ipv6.h */; };
+		1583EAF5108395BC00A3BC0C /* eventmon.h in Headers */ = {isa = PBXBuildFile; fileRef = 159D53B707528B36004F8947 /* eventmon.h */; };
+		1583EAF7108395BC00A3BC0C /* cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53CA07528B36004F8947 /* cache.c */; };
+		1583EAF8108395BC00A3BC0C /* ev_dlil.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53B107528B36004F8947 /* ev_dlil.c */; };
+		1583EAF9108395BC00A3BC0C /* ev_ipv4.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53B307528B36004F8947 /* ev_ipv4.c */; };
+		1583EAFA108395BC00A3BC0C /* ev_ipv6.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53B407528B36004F8947 /* ev_ipv6.c */; };
+		1583EAFB108395BC00A3BC0C /* eventmon.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53B007528B36004F8947 /* eventmon.c */; };
+		1583EB0A108395BC00A3BC0C /* linkconfig.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53C107528B36004F8947 /* linkconfig.c */; };
+		1583EB18108395BC00A3BC0C /* logger.c in Sources */ = {isa = PBXBuildFile; fileRef = 1531D3DB0E93E6DA00248432 /* logger.c */; };
+		1583EB1A108395BC00A3BC0C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
+		1583EB1B108395BC00A3BC0C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1559C4440D349A4E0098FD59 /* SystemConfiguration.framework */; };
+		1583EB1C108395BC00A3BC0C /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1543636A0752D03C00A8EC6C /* IOKit.framework */; };
+		1583EB26108395BD00A3BC0C /* NetworkIdentification.c in Sources */ = {isa = PBXBuildFile; fileRef = F95B8A680B03F97800993BA3 /* NetworkIdentification.c */; };
+		1583EB35108395BD00A3BC0C /* prefsmon.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53C307528B36004F8947 /* prefsmon.c */; };
+		1583EB4D108395BD00A3BC0C /* configd.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB69CF05C0722B0099E85F /* configd.h */; };
+		1583EB4E108395BD00A3BC0C /* _SCD.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB69D105C0722B0099E85F /* _SCD.h */; };
+		1583EB4F108395BD00A3BC0C /* configd_server.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB69D305C0722B0099E85F /* configd_server.h */; };
+		1583EB50108395BD00A3BC0C /* notify_server.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB69D505C0722B0099E85F /* notify_server.h */; };
+		1583EB51108395BD00A3BC0C /* plugin_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB69D705C0722B0099E85F /* plugin_support.h */; };
+		1583EB52108395BD00A3BC0C /* session.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB69D905C0722B0099E85F /* session.h */; };
+		1583EB53108395BD00A3BC0C /* pattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB69DB05C0722B0099E85F /* pattern.h */; };
+		1583EB55108395BD00A3BC0C /* configd.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69E005C0722B0099E85F /* configd.m */; settings = {ATTRIBUTES = (); }; };
+		1583EB56108395BD00A3BC0C /* _SCD.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69E205C0722B0099E85F /* _SCD.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB57108395BD00A3BC0C /* configd_server.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69E405C0722B0099E85F /* configd_server.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB58108395BD00A3BC0C /* notify_server.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69E605C0722B0099E85F /* notify_server.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB59108395BD00A3BC0C /* plugin_support.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69E805C0722B0099E85F /* plugin_support.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB5A108395BD00A3BC0C /* session.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69EA05C0722B0099E85F /* session.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB5B108395BD00A3BC0C /* pattern.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69EC05C0722B0099E85F /* pattern.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB5C108395BD00A3BC0C /* _configopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69F005C0722B0099E85F /* _configopen.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB5D108395BD00A3BC0C /* _configclose.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69F205C0722B0099E85F /* _configclose.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB5E108395BD00A3BC0C /* _configlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69F405C0722B0099E85F /* _configlock.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB5F108395BD00A3BC0C /* _configunlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69F605C0722B0099E85F /* _configunlock.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB60108395BD00A3BC0C /* _configlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69F805C0722B0099E85F /* _configlist.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB61108395BD00A3BC0C /* _configadd.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69FA05C0722B0099E85F /* _configadd.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB62108395BD00A3BC0C /* _configget.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69FE05C0722B0099E85F /* _configget.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB63108395BD00A3BC0C /* _configset.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0005C0722B0099E85F /* _configset.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB64108395BD00A3BC0C /* _configremove.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0205C0722B0099E85F /* _configremove.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB65108395BD00A3BC0C /* _configtouch.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0405C0722B0099E85F /* _configtouch.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB66108395BD00A3BC0C /* _confignotify.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0605C0722B0099E85F /* _confignotify.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB67108395BD00A3BC0C /* _notifyadd.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0805C0722B0099E85F /* _notifyadd.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB68108395BD00A3BC0C /* _notifyremove.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0A05C0722B0099E85F /* _notifyremove.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB69108395BD00A3BC0C /* _notifychanges.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0C05C0722B0099E85F /* _notifychanges.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB6A108395BD00A3BC0C /* _notifyviaport.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A0E05C0722B0099E85F /* _notifyviaport.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB6B108395BD00A3BC0C /* _notifyviafd.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A1005C0722B0099E85F /* _notifyviafd.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB6C108395BD00A3BC0C /* _notifyviasignal.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A1205C0722B0099E85F /* _notifyviasignal.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB6D108395BD00A3BC0C /* _notifycancel.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A1405C0722B0099E85F /* _notifycancel.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB6E108395BD00A3BC0C /* _snapshot.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A1605C0722B0099E85F /* _snapshot.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB6F108395BD00A3BC0C /* config.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69BE05C0722B0099E85F /* config.defs */; settings = {ATTRIBUTES = (Server, ); }; };
+		1583EB70108395BD00A3BC0C /* dnsinfo_private.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0B05FD1B670096477F /* dnsinfo_private.c */; };
+		1583EB71108395BD00A3BC0C /* dnsinfo_server.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0D05FD1B670096477F /* dnsinfo_server.c */; };
+		1583EB72108395BD00A3BC0C /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; settings = {ATTRIBUTES = (Server, ); }; };
+		1583EB74108395BD00A3BC0C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
+		1583EB75108395BD00A3BC0C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1547072E0D1F70C80075C28D /* SystemConfiguration.framework */; };
+		1583EB76108395BD00A3BC0C /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1543636A0752D03C00A8EC6C /* IOKit.framework */; };
+		1583EB77108395BD00A3BC0C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1520A3DE0846B2DC0010B584 /* Security.framework */; };
+		1583EB78108395BD00A3BC0C /* libbsm.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 15BAA32207F0699A00D9EC95 /* libbsm.dylib */; };
+		1583EB79108395BD00A3BC0C /* libKernelEventMonitor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53D407528BDA004F8947 /* libKernelEventMonitor.a */; };
+		1583EB7A108395BD00A3BC0C /* libInterfaceNamer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53E507528C4A004F8947 /* libInterfaceNamer.a */; };
+		1583EB7B108395BD00A3BC0C /* libIPMonitor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53EC07528C61004F8947 /* libIPMonitor.a */; };
+		1583EB7C108395BD00A3BC0C /* libLinkConfiguration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53F307528C79004F8947 /* libLinkConfiguration.a */; };
+		1583EB7D108395BD00A3BC0C /* libNetworkIdentification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F95B8A5F0B03F81400993BA3 /* libNetworkIdentification.a */; };
+		1583EB7E108395BD00A3BC0C /* libPreferencesMonitor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53FA07528C95004F8947 /* libPreferencesMonitor.a */; };
+		1583EB80108395BD00A3BC0C /* com.apple.configd.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1540E3600987DA9500157C07 /* com.apple.configd.plist */; };
+		1583EB89108395BE00A3BC0C /* scselect.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A2E05C0722B0099E85F /* scselect.c */; settings = {ATTRIBUTES = (); }; };
+		1583EB8B108395BE00A3BC0C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
+		1583EB8C108395BE00A3BC0C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1547072E0D1F70C80075C28D /* SystemConfiguration.framework */; };
+		1583EB94108395BE00A3BC0C /* scutil.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A4305C0722B0099E85F /* scutil.h */; };
+		1583EB95108395BE00A3BC0C /* commands.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A4505C0722B0099E85F /* commands.h */; };
+		1583EB96108395BE00A3BC0C /* dictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A4705C0722B0099E85F /* dictionary.h */; };
+		1583EB97108395BE00A3BC0C /* session.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A4905C0722B0099E85F /* session.h */; };
+		1583EB98108395BE00A3BC0C /* cache.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A4B05C0722B0099E85F /* cache.h */; };
+		1583EB99108395BE00A3BC0C /* notifications.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A4D05C0722B0099E85F /* notifications.h */; };
+		1583EB9A108395BE00A3BC0C /* tests.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A4F05C0722B0099E85F /* tests.h */; };
+		1583EB9B108395BE00A3BC0C /* prefs.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB6A5105C0722B0099E85F /* prefs.h */; };
+		1583EB9C108395BE00A3BC0C /* net.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A509A406C2518F001F0AB7 /* net.h */; };
+		1583EB9D108395BE00A3BC0C /* net_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DC34680711D49400A3311C /* net_interface.h */; };
+		1583EB9E108395BE00A3BC0C /* net_protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DC346A0711D49400A3311C /* net_protocol.h */; };
+		1583EB9F108395BE00A3BC0C /* net_service.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DC346C0711D49400A3311C /* net_service.h */; };
+		1583EBA0108395BE00A3BC0C /* net_set.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DC346E0711D49400A3311C /* net_set.h */; };
+		1583EBA2108395BE00A3BC0C /* scutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A5405C0722B0099E85F /* scutil.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBA3108395BE00A3BC0C /* commands.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A5605C0722B0099E85F /* commands.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBA4108395BE00A3BC0C /* dictionary.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A5805C0722B0099E85F /* dictionary.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBA5108395BE00A3BC0C /* session.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A5A05C0722B0099E85F /* session.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBA6108395BE00A3BC0C /* cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A5C05C0722B0099E85F /* cache.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBA7108395BE00A3BC0C /* notifications.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A5E05C0722B0099E85F /* notifications.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBA8108395BE00A3BC0C /* tests.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A6005C0722B0099E85F /* tests.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBA9108395BE00A3BC0C /* prefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB6A6205C0722B0099E85F /* prefs.c */; settings = {ATTRIBUTES = (); }; };
+		1583EBAA108395BE00A3BC0C /* net.c in Sources */ = {isa = PBXBuildFile; fileRef = 15A509A306C2518F001F0AB7 /* net.c */; };
+		1583EBAB108395BE00A3BC0C /* net_interface.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DC34670711D49400A3311C /* net_interface.c */; };
+		1583EBAC108395BE00A3BC0C /* net_protocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DC34690711D49400A3311C /* net_protocol.c */; };
+		1583EBAD108395BE00A3BC0C /* net_service.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DC346B0711D49400A3311C /* net_service.c */; };
+		1583EBAE108395BE00A3BC0C /* net_set.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DC346D0711D49400A3311C /* net_set.c */; };
+		1583EBB0108395BE00A3BC0C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
+		1583EBB1108395BE00A3BC0C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1547072E0D1F70C80075C28D /* SystemConfiguration.framework */; };
+		1583EBB2108395BE00A3BC0C /* libedit.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 152CEED0070CF6640050F23C /* libedit.dylib */; };
+		158E595E1107CAE40062081E /* helper.defs in Sources */ = {isa = PBXBuildFile; fileRef = 152E0E7E10FE820E00E402F2 /* helper.defs */; };
+		158E595F1107CAE80062081E /* helper.defs in Sources */ = {isa = PBXBuildFile; fileRef = 152E0E7E10FE820E00E402F2 /* helper.defs */; };
+		158E59601107CAF10062081E /* helper.defs in Sources */ = {isa = PBXBuildFile; fileRef = 152E0E7E10FE820E00E402F2 /* helper.defs */; };
+		158E59611107CAF40062081E /* helper.defs in Sources */ = {isa = PBXBuildFile; fileRef = 152E0E7E10FE820E00E402F2 /* helper.defs */; };
 		15943D440E94081800B87535 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1543636A0752D03C00A8EC6C /* IOKit.framework */; };
+		159A751A107FEAA400A57EAB /* VPNPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 159A7513107FEAA400A57EAB /* VPNPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		159A751C107FEAA400A57EAB /* VPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 159A7515107FEAA400A57EAB /* VPNConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		159A751E107FEAA400A57EAB /* VPNPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 159A7517107FEAA400A57EAB /* VPNPrivate.c */; };
+		159A7520107FEAA400A57EAB /* VPNConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 159A7519107FEAA400A57EAB /* VPNConfiguration.c */; };
+		159A7521107FEAA400A57EAB /* VPNPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 159A7513107FEAA400A57EAB /* VPNPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		159A7523107FEAA400A57EAB /* VPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 159A7515107FEAA400A57EAB /* VPNConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		159A7525107FEAA400A57EAB /* VPNPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 159A7517107FEAA400A57EAB /* VPNPrivate.c */; };
+		159A7527107FEAA400A57EAB /* VPNConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 159A7519107FEAA400A57EAB /* VPNConfiguration.c */; };
+		159A7528107FEAA400A57EAB /* VPNPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 159A7513107FEAA400A57EAB /* VPNPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		159A752A107FEAA400A57EAB /* VPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 159A7515107FEAA400A57EAB /* VPNConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		159A752C107FEAA400A57EAB /* VPNPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 159A7517107FEAA400A57EAB /* VPNPrivate.c */; };
+		159A752E107FEAA400A57EAB /* VPNConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 159A7519107FEAA400A57EAB /* VPNConfiguration.c */; };
 		159C32B60F583724008A72EE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1520A3DE0846B2DC0010B584 /* Security.framework */; };
-		159C9B290DB68E0700BEEF10 /* atconfig.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53C707528B36004F8947 /* atconfig.c */; };
-		159C9B2A0DB68E0800BEEF10 /* cfManager.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53C507528B36004F8947 /* cfManager.c */; };
-		159C9B2D0DB68E3D00BEEF10 /* cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53CA07528B36004F8947 /* cache.c */; };
-		159C9B300DB68E8400BEEF10 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
-		159C9B7A0DB68E8A00BEEF10 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1559C4440D349A4E0098FD59 /* SystemConfiguration.framework */; };
-		159C9B820DB68EE500BEEF10 /* kicker.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53BE07528B36004F8947 /* kicker.c */; };
-		159C9B860DB68F1600BEEF10 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
-		159C9B870DB68F1600BEEF10 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1559C4440D349A4E0098FD59 /* SystemConfiguration.framework */; };
 		159D540907528D3A004F8947 /* cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53CA07528B36004F8947 /* cache.c */; };
 		159D540A07528D3B004F8947 /* cache.h in Headers */ = {isa = PBXBuildFile; fileRef = 159D53CB07528B36004F8947 /* cache.h */; };
 		159D540D07528DAE004F8947 /* ev_dlil.c in Sources */ = {isa = PBXBuildFile; fileRef = 159D53B107528B36004F8947 /* ev_dlil.c */; };
@@ -543,6 +861,10 @@
 		159D54D207529FFF004F8947 /* libLinkConfiguration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53F307528C79004F8947 /* libLinkConfiguration.a */; };
 		159D54D307529FFF004F8947 /* libPreferencesMonitor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 159D53FA07528C95004F8947 /* libPreferencesMonitor.a */; };
 		159D54D607529FFF004F8947 /* configd.8 in CopyFiles */ = {isa = PBXBuildFile; fileRef = 15CB6A2005C0722B0099E85F /* configd.8 */; };
+		15A1FF3210597F17004C9CC9 /* CaptiveNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A1FF3010597F17004C9CC9 /* CaptiveNetwork.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		15A1FF3310597F17004C9CC9 /* CaptiveNetwork.c in Sources */ = {isa = PBXBuildFile; fileRef = 15A1FF3110597F17004C9CC9 /* CaptiveNetwork.c */; };
+		15A1FF3410597F17004C9CC9 /* CaptiveNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A1FF3010597F17004C9CC9 /* CaptiveNetwork.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		15A1FF3510597F17004C9CC9 /* CaptiveNetwork.c in Sources */ = {isa = PBXBuildFile; fileRef = 15A1FF3110597F17004C9CC9 /* CaptiveNetwork.c */; };
 		15A2972F0A13C08C009879B3 /* SCNetworkConnectionPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 15A2972D0A13C08C009879B3 /* SCNetworkConnectionPrivate.c */; };
 		15A297300A13C08C009879B3 /* SCNetworkConnectionPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A2972E0A13C08C009879B3 /* SCNetworkConnectionPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		15A5A1E70D5B94190087BDA0 /* SCSchemaDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 150607DE075A00A300B147BA /* SCSchemaDefinitions.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -581,7 +903,6 @@
 		15A5A20C0D5B94190087BDA0 /* SCPreferencesSetSpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 156BD6BB07E0DFA9008698FF /* SCPreferencesSetSpecificPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		15A5A20D0D5B94190087BDA0 /* SCPreferencesGetSpecificPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 154CF3F307E1EA4D00D8302E /* SCPreferencesGetSpecificPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		15A5A20E0D5B94190087BDA0 /* SCNetworkConfigurationPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 155A1E6B081079CC00F70D98 /* SCNetworkConfigurationPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		15A5A20F0D5B94190087BDA0 /* helper_comm.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DAF2D708466D4900D1B2BD /* helper_comm.h */; };
 		15A5A2100D5B94190087BDA0 /* SCHelper_client.h in Headers */ = {isa = PBXBuildFile; fileRef = 155B7BF60847776D00F0E262 /* SCHelper_client.h */; };
 		15A5A2110D5B94190087BDA0 /* SCNetworkConnectionPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A2972E0A13C08C009879B3 /* SCNetworkConnectionPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		15A5A2120D5B94190087BDA0 /* SCPreferencesKeychainPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 152E68C00A2C89C70011FDA8 /* SCPreferencesKeychainPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -652,12 +973,19 @@
 		15A5A25A0D5B94190087BDA0 /* SCNetworkProtocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3C0670A85900BFE03C /* SCNetworkProtocol.c */; };
 		15A5A25B0D5B94190087BDA0 /* SCNetworkService.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3D0670A85900BFE03C /* SCNetworkService.c */; };
 		15A5A25C0D5B94190087BDA0 /* SCNetworkSet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3E0670A85900BFE03C /* SCNetworkSet.c */; };
-		15A5A25E0D5B94190087BDA0 /* helper_comm.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D608466D4900D1B2BD /* helper_comm.c */; };
 		15A5A25F0D5B94190087BDA0 /* SCHelper_client.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D808466D4900D1B2BD /* SCHelper_client.c */; };
 		15A5A2600D5B94190087BDA0 /* SCPreferencesKeychainPrivate.c in Sources */ = {isa = PBXBuildFile; fileRef = 152E68C20A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c */; };
 		15A5A2610D5B94190087BDA0 /* SCNetworkSignature.c in Sources */ = {isa = PBXBuildFile; fileRef = F95B8A420B03E07A00993BA3 /* SCNetworkSignature.c */; };
 		15A5A2630D5B94190087BDA0 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
 		15A6F7C40A4B266D00B907EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 15A6F7C20A4B266D00B907EA /* Localizable.strings */; };
+		15AAA7F4108E310700C2A607 /* VPNTunnelPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15AAA7F1108E310700C2A607 /* VPNTunnelPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		15AAA7F5108E310700C2A607 /* VPNTunnel.h in Headers */ = {isa = PBXBuildFile; fileRef = 15AAA7F2108E310700C2A607 /* VPNTunnel.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		15AAA7F6108E310700C2A607 /* VPNTunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AAA7F3108E310700C2A607 /* VPNTunnel.c */; };
+		15AAA7F7108E310700C2A607 /* VPNTunnelPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 15AAA7F1108E310700C2A607 /* VPNTunnelPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		15AAA7F8108E310700C2A607 /* VPNTunnel.h in Headers */ = {isa = PBXBuildFile; fileRef = 15AAA7F2108E310700C2A607 /* VPNTunnel.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		15AAA7F9108E310700C2A607 /* VPNTunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AAA7F3108E310700C2A607 /* VPNTunnel.c */; };
+		15B274A5114467CD003414AD /* nc.c in Sources */ = {isa = PBXBuildFile; fileRef = 72B43727113C7BFC00EBF1B6 /* nc.c */; };
+		15B274A6114467D8003414AD /* nc.h in Headers */ = {isa = PBXBuildFile; fileRef = 72B43726113C7BFC00EBF1B6 /* nc.h */; };
 		15BAA32307F0699A00D9EC95 /* libbsm.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 15BAA32207F0699A00D9EC95 /* libbsm.dylib */; };
 		15D48EBF0F67061600B4711E /* dnsinfo_create.c in Sources */ = {isa = PBXBuildFile; fileRef = 1521FC5C060F296A003B28F5 /* dnsinfo_create.c */; };
 		15D48EC00F67061700B4711E /* dnsinfo_create.h in Headers */ = {isa = PBXBuildFile; fileRef = 1532629006281C9D00B1C10C /* dnsinfo_create.h */; };
@@ -665,6 +993,7 @@
 		15D48EC20F67061F00B4711E /* dnsinfo_create.h in Headers */ = {isa = PBXBuildFile; fileRef = 1532629006281C9D00B1C10C /* dnsinfo_create.h */; };
 		15D48ED30F67079B00B4711E /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; };
 		15D48ED40F6707A600B4711E /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; };
+		15D9DCFB10DD90A1004E545D /* AppWorkaround.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = 15D9DCFA10DD90A1004E545D /* AppWorkaround.plist */; };
 		15DAD5E1075913CE0084A6ED /* dnsinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0905FD1B670096477F /* dnsinfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		15DAD5E2075913CE0084A6ED /* dnsinfo_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0C05FD1B670096477F /* dnsinfo_private.h */; };
 		15DAD5E5075913CE0084A6ED /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; settings = {ATTRIBUTES = (Client, ); }; };
@@ -699,8 +1028,6 @@
 		15DAD65D07591A1A0084A6ED /* LinkConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694705C0722B0099E85F /* LinkConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		15DAD65E07591A1A0084A6ED /* dy_framework.h in Headers */ = {isa = PBXBuildFile; fileRef = 15CB694905C0722B0099E85F /* dy_framework.h */; };
 		15DAD66107591A1A0084A6ED /* SCPreferencesPathKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 151BDA2B05D9E28B00657BC7 /* SCPreferencesPathKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		15DAD66207591A1A0084A6ED /* dnsinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0905FD1B670096477F /* dnsinfo.h */; };
-		15DAD66307591A1A0084A6ED /* dnsinfo_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 15B73F0C05FD1B670096477F /* dnsinfo_private.h */; };
 		15DAD66407591A1A0084A6ED /* pppcontroller_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 23C1E2B4062DD2C700835B54 /* pppcontroller_types.h */; };
 		15DAD66507591A1A0084A6ED /* pppcontroller.h in Headers */ = {isa = PBXBuildFile; fileRef = 23C1E2BE062DD5DB00835B54 /* pppcontroller.h */; };
 		15DAD66907591A1A0084A6ED /* NetworkConfiguration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 15B686220678B65C00FF4023 /* NetworkConfiguration.plist */; };
@@ -759,8 +1086,6 @@
 		15DAD69F07591A1A0084A6ED /* VLANConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69B605C0722B0099E85F /* VLANConfiguration.c */; settings = {ATTRIBUTES = (); COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; };
 		15DAD6A007591A1A0084A6ED /* config.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15CB69BE05C0722B0099E85F /* config.defs */; settings = {ATTRIBUTES = (Client, ); }; };
 		15DAD6A207591A1A0084A6ED /* SCPreferencesPathKey.c in Sources */ = {isa = PBXBuildFile; fileRef = 151BDA5D05D9E2ED00657BC7 /* SCPreferencesPathKey.c */; };
-		15DAD6A307591A1A0084A6ED /* dnsinfo_private.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0B05FD1B670096477F /* dnsinfo_private.c */; };
-		15DAD6A407591A1A0084A6ED /* dnsinfo_copy.c in Sources */ = {isa = PBXBuildFile; fileRef = 15B73F0805FD1B670096477F /* dnsinfo_copy.c */; };
 		15DAD6A507591A1A0084A6ED /* shared_dns_info.defs in Sources */ = {isa = PBXBuildFile; fileRef = 15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */; settings = {ATTRIBUTES = (Client, ); }; };
 		15DAD6A607591A1A0084A6ED /* SCNetworkConfigurationInternal.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A390670A85900BFE03C /* SCNetworkConfigurationInternal.c */; };
 		15DAD6A707591A1A0084A6ED /* SCNetworkInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3B0670A85900BFE03C /* SCNetworkInterface.c */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; };
@@ -769,16 +1094,21 @@
 		15DAD6AA07591A1A0084A6ED /* SCNetworkSet.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AD7A3E0670A85900BFE03C /* SCNetworkSet.c */; };
 		15DAD6AB07591A1A0084A6ED /* BondConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 9EE943F306AF409B00772EB5 /* BondConfiguration.c */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; };
 		15DAD6AE07591A1A0084A6ED /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
-		15DAF2DA08466D4900D1B2BD /* helper_comm.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D608466D4900D1B2BD /* helper_comm.c */; };
-		15DAF2DB08466D4900D1B2BD /* helper_comm.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DAF2D708466D4900D1B2BD /* helper_comm.h */; };
 		15DAF2DC08466D4900D1B2BD /* SCHelper_client.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D808466D4900D1B2BD /* SCHelper_client.c */; };
-		15DAF2DF08466D4900D1B2BD /* helper_comm.h in Headers */ = {isa = PBXBuildFile; fileRef = 15DAF2D708466D4900D1B2BD /* helper_comm.h */; };
 		15DAF2E108466D4900D1B2BD /* SCHelper_server.c in Sources */ = {isa = PBXBuildFile; fileRef = 15DAF2D908466D4900D1B2BD /* SCHelper_server.c */; };
+		15F21618110F823500E89CF7 /* libbsm.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 15BAA32207F0699A00D9EC95 /* libbsm.dylib */; };
+		15F21619110F826800E89CF7 /* libbsm.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 15BAA32207F0699A00D9EC95 /* libbsm.dylib */; };
 		15FC130B0CCEA59E0013872C /* monitor.c in Sources */ = {isa = PBXBuildFile; fileRef = 15FC130A0CCEA59E0013872C /* monitor.c */; };
 		15FC13180CCF74740013872C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */; };
+		15FD7B3C101E439200C56621 /* BridgeConfiguration.c in Sources */ = {isa = PBXBuildFile; fileRef = 15FD7B3B101E439200C56621 /* BridgeConfiguration.c */; };
 		15FEE80E0CCFD341001312F9 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15FEE80D0CCFD341001312F9 /* ApplicationServices.framework */; };
 		15FEE81F0CD03E75001312F9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 15FEE8180CD03CBB001312F9 /* Localizable.strings */; };
 		15FF5C370CDF776200EEC8AA /* com.apple.SCHelper.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = 15FF5C290CDF770500EEC8AA /* com.apple.SCHelper.plist */; };
+		72B43728113C7BFC00EBF1B6 /* nc.h in Headers */ = {isa = PBXBuildFile; fileRef = 72B43726113C7BFC00EBF1B6 /* nc.h */; };
+		72B43729113C7BFC00EBF1B6 /* nc.c in Sources */ = {isa = PBXBuildFile; fileRef = 72B43727113C7BFC00EBF1B6 /* nc.c */; };
+		72B4372A113C7BFC00EBF1B6 /* nc.h in Headers */ = {isa = PBXBuildFile; fileRef = 72B43726113C7BFC00EBF1B6 /* nc.h */; };
+		72B4372B113C7BFC00EBF1B6 /* nc.c in Sources */ = {isa = PBXBuildFile; fileRef = 72B43727113C7BFC00EBF1B6 /* nc.c */; };
+		D6623873120B2AA7007F8E95 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1520A3DE0846B2DC0010B584 /* Security.framework */; };
 		F95B8A430B03E07A00993BA3 /* SCNetworkSignature.c in Sources */ = {isa = PBXBuildFile; fileRef = F95B8A420B03E07A00993BA3 /* SCNetworkSignature.c */; };
 		F95B8A460B03E09300993BA3 /* SCNetworkSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = F95B8A440B03E09300993BA3 /* SCNetworkSignature.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		F95B8A470B03E09300993BA3 /* SCNetworkSignaturePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = F95B8A450B03E09300993BA3 /* SCNetworkSignaturePrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -1087,6 +1417,167 @@
 			remoteGlobalIDString = 15A5A1E40D5B94190087BDA0;
 			remoteInfo = "SystemConfiguration.framework-EmbeddedSimulator";
 		};
+		15AC515710839608004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583E9FD108395BB00A3BC0C;
+			remoteInfo = "configd_libSystem-EmbeddedOther";
+		};
+		15AC515A1083960E004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EA11108395BB00A3BC0C;
+			remoteInfo = "configd_base-EmbeddedOther";
+		};
+		15AC515C10839613004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EAAC108395BB00A3BC0C;
+			remoteInfo = "configd_plugins-EmbeddedOther";
+		};
+		15AC515E1083961E004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB41108395BD00A3BC0C;
+			remoteInfo = "configd_executables-EmbeddedOther";
+		};
+		15AC516010839649004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EA04108395BB00A3BC0C;
+			remoteInfo = "DNSConfiguration-EmbeddedOther";
+		};
+		15AC516210839666004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EA19108395BB00A3BC0C;
+			remoteInfo = "SystemConfiguration.framework-EmbeddedOther";
+		};
+		15AC51641083966B004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EA9B108395BB00A3BC0C;
+			remoteInfo = "SCHelper-EmbeddedOther";
+		};
+		15AC5169108396B7004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB92108395BE00A3BC0C;
+			remoteInfo = "scutil-EmbeddedOther";
+		};
+		15AC516B108396B7004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB86108395BE00A3BC0C;
+			remoteInfo = "scselect-EmbeddedOther";
+		};
+		15AC516D108396B7004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB4B108395BD00A3BC0C;
+			remoteInfo = "configd-EmbeddedOther";
+		};
+		15AC5170108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB3A108395BD00A3BC0C;
+			remoteInfo = "PreferencesMonitor.bundle-EmbeddedOther";
+		};
+		15AC5172108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB32108395BD00A3BC0C;
+			remoteInfo = "PreferencesMonitor-EmbeddedOther";
+		};
+		15AC5174108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB2B108395BD00A3BC0C;
+			remoteInfo = "NetworkIdentification.bundle-EmbeddedOther";
+		};
+		15AC5176108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB23108395BD00A3BC0C;
+			remoteInfo = "NetworkIdentification-EmbeddedOther";
+		};
+		15AC5178108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB16108395BC00A3BC0C;
+			remoteInfo = "Logger.bundle-EmbeddedOther";
+		};
+		15AC517A108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB0F108395BC00A3BC0C;
+			remoteInfo = "LinkConfiguration.bundle-EmbeddedOther";
+		};
+		15AC517C108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB07108395BC00A3BC0C;
+			remoteInfo = "LinkConfiguration-EmbeddedOther";
+		};
+		15AC517E108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EB00108395BC00A3BC0C;
+			remoteInfo = "KernelEventMonitor.bundle-EmbeddedOther";
+		};
+		15AC5180108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EAEF108395BC00A3BC0C;
+			remoteInfo = "KernelEventMonitor-EmbeddedOther";
+		};
+		15AC5182108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EAE8108395BC00A3BC0C;
+			remoteInfo = "InterfaceNamer.bundle-EmbeddedOther";
+		};
+		15AC5184108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EAE0108395BB00A3BC0C;
+			remoteInfo = "InterfaceNamer-EmbeddedOther";
+		};
+		15AC5186108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EAD9108395BB00A3BC0C;
+			remoteInfo = "IPMonitor.bundle-EmbeddedOther";
+		};
+		15AC5188108396D2004A9ED5 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1583EACA108395BB00A3BC0C;
+			remoteInfo = "IPMonitor-EmbeddedOther";
+		};
 		15C64A210F684C4900D78394 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 15CB6A7705C0722B0099E85F /* Project object */;
@@ -1172,6 +1663,26 @@
 			);
 			runOnlyForDeploymentPostprocessing = 1;
 		};
+		1583EAA5108395BB00A3BC0C /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 8;
+			dstPath = /System/Library/LaunchDaemons;
+			dstSubfolderSpec = 0;
+			files = (
+				1583EAA6108395BB00A3BC0C /* com.apple.SCHelper-embedded.plist in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
+		1583EB7F108395BD00A3BC0C /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 8;
+			dstPath = /System/Library/LaunchDaemons;
+			dstSubfolderSpec = 0;
+			files = (
+				1583EB80108395BD00A3BC0C /* com.apple.configd.plist in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
 		159D54D507529FFF004F8947 /* CopyFiles */ = {
 			isa = PBXCopyFilesBuildPhase;
 			buildActionMask = 8;
@@ -1192,6 +1703,16 @@
 			);
 			runOnlyForDeploymentPostprocessing = 1;
 		};
+		15D9DCF910DD909F004E545D /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 8;
+			dstPath = /usr/local/AppSpecificWorkaround/SystemConfiguration;
+			dstSubfolderSpec = 0;
+			files = (
+				15D9DCFB10DD90A1004E545D /* AppWorkaround.plist in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
 		15FF5C380CDF778F00EEC8AA /* CopyFiles */ = {
 			isa = PBXCopyFilesBuildPhase;
 			buildActionMask = 8;
@@ -1218,6 +1739,8 @@
 		1521FC5C060F296A003B28F5 /* dnsinfo_create.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = dnsinfo_create.c; path = dnsinfo/dnsinfo_create.c; sourceTree = SOURCE_ROOT; };
 		1522FCE50FA7FD7000B24128 /* dnsinfo_flatfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dnsinfo_flatfile.c; path = dnsinfo/dnsinfo_flatfile.c; sourceTree = "<group>"; };
 		152CEED0070CF6640050F23C /* libedit.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libedit.dylib; path = /usr/lib/libedit.2.dylib; sourceTree = "<absolute>"; };
+		152E0E7E10FE820E00E402F2 /* helper.defs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.mig; name = helper.defs; path = SystemConfiguration.fproj/helper/helper.defs; sourceTree = "<group>"; };
+		152E0E8810FE824000E402F2 /* helper_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = helper_types.h; path = SystemConfiguration.fproj/helper/helper_types.h; sourceTree = "<group>"; };
 		152E68C00A2C89C70011FDA8 /* SCPreferencesKeychainPrivate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SCPreferencesKeychainPrivate.h; sourceTree = "<group>"; };
 		152E68C20A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = SCPreferencesKeychainPrivate.c; sourceTree = "<group>"; };
 		1531D3DA0E93E6DA00248432 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Plugins/Logger/Info.plist; sourceTree = "<group>"; };
@@ -1252,8 +1775,10 @@
 		1572EB7A0A506D3B00D02459 /* smb-configuration.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = "smb-configuration.c"; sourceTree = "<group>"; };
 		157433EC0D4A8122002ACA73 /* scselect */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = scselect; sourceTree = BUILT_PRODUCTS_DIR; };
 		1574341A0D4A8137002ACA73 /* scutil */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = scutil; sourceTree = BUILT_PRODUCTS_DIR; };
+		1575FD2512CD15C60003D86E /* proxy-configuration.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "proxy-configuration.c"; sourceTree = "<group>"; };
+		1575FD2612CD15C60003D86E /* proxy-configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "proxy-configuration.h"; sourceTree = "<group>"; };
 		1577252F06EFB96700D7B52B /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/NetworkInterface.strings; sourceTree = "<group>"; };
-		157A84E80D56C63900B6F1A0 /* libdnsinfo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libdnsinfo.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		157A84E80D56C63900B6F1A0 /* libdnsinfo.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libdnsinfo.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
 		157A85020D56C7E800B6F1A0 /* libIPMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libIPMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		157A850D0D56C8AA00B6F1A0 /* libInterfaceNamer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libInterfaceNamer.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		157A85230D56C8E000B6F1A0 /* libKernelEventMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKernelEventMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1262,11 +1787,33 @@
 		157A85440D56C96F00B6F1A0 /* libPreferencesMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPreferencesMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		157A88880A470D0F003A4256 /* SCSchemaDefinitionsPrivate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SCSchemaDefinitionsPrivate.h; sourceTree = "<group>"; };
 		15828AE70753B5F900AD4710 /* KernelEventMonitor.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KernelEventMonitor.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
-		158AD85B0754E38F00124717 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		1583EA10108395BB00A3BC0C /* dnsinfo.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = dnsinfo.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EA99108395BB00A3BC0C /* SystemConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SystemConfiguration.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EAAA108395BB00A3BC0C /* SCHelper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SCHelper; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EAD8108395BB00A3BC0C /* libIPMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libIPMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EADE108395BB00A3BC0C /* IPMonitor.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IPMonitor.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EAE7108395BB00A3BC0C /* libInterfaceNamer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libInterfaceNamer.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EAED108395BC00A3BC0C /* InterfaceNamer.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = InterfaceNamer.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EAFF108395BC00A3BC0C /* libKernelEventMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKernelEventMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB05108395BC00A3BC0C /* KernelEventMonitor.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KernelEventMonitor.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB0E108395BC00A3BC0C /* libLinkConfiguration.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libLinkConfiguration.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB14108395BC00A3BC0C /* LinkConfiguration.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LinkConfiguration.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB21108395BC00A3BC0C /* Logger.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Logger.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB2A108395BD00A3BC0C /* libNetworkIdentification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libNetworkIdentification.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB30108395BD00A3BC0C /* NetworkIdentification.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NetworkIdentification.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB39108395BD00A3BC0C /* libPreferencesMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPreferencesMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB3F108395BD00A3BC0C /* PreferencesMonitor.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PreferencesMonitor.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB84108395BD00A3BC0C /* configd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = configd; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EB90108395BE00A3BC0C /* scselect */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = scselect; sourceTree = BUILT_PRODUCTS_DIR; };
+		1583EBB6108395BE00A3BC0C /* scutil */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = scutil; sourceTree = BUILT_PRODUCTS_DIR; };
 		158AD8700754E3D400124717 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		158AD8C00754E3EF00124717 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		158AD9100754E40E00124717 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		158AD9F80754EA2F00124717 /* AppleTalk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppleTalk.framework; path = /System/Library/Frameworks/AppleTalk.framework; sourceTree = "<absolute>"; };
+		159A7513107FEAA400A57EAB /* VPNPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VPNPrivate.h; sourceTree = "<group>"; };
+		159A7515107FEAA400A57EAB /* VPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VPNConfiguration.h; sourceTree = "<group>"; };
+		159A7517107FEAA400A57EAB /* VPNPrivate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = VPNPrivate.c; sourceTree = "<group>"; };
+		159A7519107FEAA400A57EAB /* VPNConfiguration.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = VPNConfiguration.c; sourceTree = "<group>"; };
 		159D53A707528B36004F8947 /* ip_plugin.c */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.c; path = ip_plugin.c; sourceTree = "<group>"; };
 		159D53AA07528B36004F8947 /* dns-configuration.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = "dns-configuration.c"; sourceTree = "<group>"; };
 		159D53AB07528B36004F8947 /* set-hostname.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = "set-hostname.c"; sourceTree = "<group>"; };
@@ -1276,19 +1823,11 @@
 		159D53B207528B36004F8947 /* ev_dlil.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ev_dlil.h; sourceTree = "<group>"; };
 		159D53B307528B36004F8947 /* ev_ipv4.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = ev_ipv4.c; sourceTree = "<group>"; };
 		159D53B407528B36004F8947 /* ev_ipv6.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = ev_ipv6.c; sourceTree = "<group>"; };
-		159D53B607528B36004F8947 /* ev_appletalk.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ev_appletalk.h; sourceTree = "<group>"; };
 		159D53B707528B36004F8947 /* eventmon.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = eventmon.h; sourceTree = "<group>"; };
 		159D53B807528B36004F8947 /* ev_ipv4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ev_ipv4.h; sourceTree = "<group>"; };
-		159D53B907528B36004F8947 /* ev_appletalk.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = ev_appletalk.c; sourceTree = "<group>"; };
 		159D53BA07528B36004F8947 /* ev_ipv6.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ev_ipv6.h; sourceTree = "<group>"; };
-		159D53BC07528B36004F8947 /* Kicker.xml */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = Kicker.xml; sourceTree = "<group>"; };
-		159D53BD07528B36004F8947 /* enable-network */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; path = "enable-network"; sourceTree = "<group>"; };
-		159D53BE07528B36004F8947 /* kicker.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = kicker.c; sourceTree = "<group>"; };
 		159D53C107528B36004F8947 /* linkconfig.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = linkconfig.c; sourceTree = "<group>"; };
 		159D53C307528B36004F8947 /* prefsmon.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = prefsmon.c; sourceTree = "<group>"; };
-		159D53C507528B36004F8947 /* cfManager.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = cfManager.c; sourceTree = "<group>"; };
-		159D53C607528B36004F8947 /* cfManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = cfManager.h; sourceTree = "<group>"; };
-		159D53C707528B36004F8947 /* atconfig.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = atconfig.c; sourceTree = "<group>"; };
 		159D53CA07528B36004F8947 /* cache.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = cache.c; sourceTree = "<group>"; };
 		159D53CB07528B36004F8947 /* cache.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = "<group>"; };
 		159D53D407528BDA004F8947 /* libKernelEventMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKernelEventMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1297,12 +1836,17 @@
 		159D53F307528C79004F8947 /* libLinkConfiguration.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libLinkConfiguration.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		159D53FA07528C95004F8947 /* libPreferencesMonitor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPreferencesMonitor.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		159D54D907529FFF004F8947 /* configd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = configd; sourceTree = BUILT_PRODUCTS_DIR; };
+		15A1FF3010597F17004C9CC9 /* CaptiveNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CaptiveNetwork.h; sourceTree = "<group>"; };
+		15A1FF3110597F17004C9CC9 /* CaptiveNetwork.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CaptiveNetwork.c; sourceTree = "<group>"; };
 		15A2972D0A13C08C009879B3 /* SCNetworkConnectionPrivate.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = SCNetworkConnectionPrivate.c; sourceTree = "<group>"; };
 		15A2972E0A13C08C009879B3 /* SCNetworkConnectionPrivate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SCNetworkConnectionPrivate.h; sourceTree = "<group>"; };
 		15A509A306C2518F001F0AB7 /* net.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = net.c; sourceTree = "<group>"; };
 		15A509A406C2518F001F0AB7 /* net.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = net.h; sourceTree = "<group>"; };
 		15A5A26A0D5B94190087BDA0 /* SystemConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SystemConfiguration.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		15A6F7C30A4B266D00B907EA /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = "<group>"; };
+		15AAA7F1108E310700C2A607 /* VPNTunnelPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VPNTunnelPrivate.h; sourceTree = "<group>"; };
+		15AAA7F2108E310700C2A607 /* VPNTunnel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VPNTunnel.h; sourceTree = "<group>"; };
+		15AAA7F3108E310700C2A607 /* VPNTunnel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = VPNTunnel.c; sourceTree = "<group>"; };
 		15AD7A380670A85900BFE03C /* SCNetworkConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SCNetworkConfiguration.h; sourceTree = "<group>"; };
 		15AD7A390670A85900BFE03C /* SCNetworkConfigurationInternal.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = SCNetworkConfigurationInternal.c; sourceTree = "<group>"; };
 		15AD7A3A0670A85900BFE03C /* SCNetworkConfigurationInternal.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SCNetworkConfigurationInternal.h; sourceTree = "<group>"; };
@@ -1452,9 +1996,8 @@
 		15CB6A6A05C0722B0099E85F /* scutil.8 */ = {isa = PBXFileReference; explicitFileType = text.man; path = scutil.8; sourceTree = "<group>"; };
 		15CB6A6F05C0722B0099E85F /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
 		15CFC229068B222F00123568 /* get-mobility-info */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; path = "get-mobility-info"; sourceTree = SOURCE_ROOT; };
-		15DAD5EE075913CE0084A6ED /* libdnsinfo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libdnsinfo.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		15DAF2D608466D4900D1B2BD /* helper_comm.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = helper_comm.c; path = helper/helper_comm.c; sourceTree = "<group>"; };
-		15DAF2D708466D4900D1B2BD /* helper_comm.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = helper_comm.h; path = helper/helper_comm.h; sourceTree = "<group>"; };
+		15D9DCFA10DD90A1004E545D /* AppWorkaround.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AppWorkaround.plist; sourceTree = "<group>"; };
+		15DAD5EE075913CE0084A6ED /* libdnsinfo.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libdnsinfo.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
 		15DAF2D808466D4900D1B2BD /* SCHelper_client.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = SCHelper_client.c; path = helper/SCHelper_client.c; sourceTree = "<group>"; };
 		15DAF2D908466D4900D1B2BD /* SCHelper_server.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = SCHelper_server.c; path = helper/SCHelper_server.c; sourceTree = "<group>"; };
 		15DC34670711D49400A3311C /* net_interface.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = net_interface.c; sourceTree = "<group>"; };
@@ -1470,21 +2013,21 @@
 		15FCAACF05FD0EBF00CB79E6 /* shared_dns_info_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = shared_dns_info_types.h; path = dnsinfo/shared_dns_info_types.h; sourceTree = SOURCE_ROOT; };
 		15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.mig; name = shared_dns_info.defs; path = dnsinfo/shared_dns_info.defs; sourceTree = "<group>"; };
 		15FD147B0D594FE700F9409C /* IndigoSDK.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = IndigoSDK.xcconfig; path = /AppleInternal/Indigo/IndigoSDK.xcconfig; sourceTree = "<absolute>"; };
-		15FD71090754D628001CC321 /* Kicker.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Kicker.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
 		15FD72970754DA2B001CC321 /* InterfaceNamer.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = InterfaceNamer.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
 		15FD72A50754DA4C001CC321 /* IPMonitor.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IPMonitor.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
 		15FD72B50754DA69001CC321 /* LinkConfiguration.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LinkConfiguration.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
 		15FD72C90754DA7E001CC321 /* PreferencesMonitor.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PreferencesMonitor.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
-		15FD73220754DB9F001CC321 /* ATconfig.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ATconfig.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
-		15FD73970754DE49001CC321 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		15FD73EE0754DE62001CC321 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		15FD743E0754DE7A001CC321 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		15FD7B3B101E439200C56621 /* BridgeConfiguration.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BridgeConfiguration.c; sourceTree = "<group>"; };
 		15FEE80D0CCFD341001312F9 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
 		15FEE8160CD03CA3001312F9 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = SCMonitor/English.lproj/Localizable.strings; sourceTree = "<group>"; };
 		15FF5C290CDF770500EEC8AA /* com.apple.SCHelper.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.apple.SCHelper.plist; path = helper/com.apple.SCHelper.plist; sourceTree = "<group>"; };
-		23C1E2B4062DD2C700835B54 /* pppcontroller_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = pppcontroller_types.h; path = /usr/local/include/ppp/pppcontroller_types.h; sourceTree = "<absolute>"; };
+		23C1E2B4062DD2C700835B54 /* pppcontroller_types.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 30; name = pppcontroller_types.h; path = usr/local/include/ppp/pppcontroller_types.h; sourceTree = SDKROOT; };
 		23C1E2B8062DD45900835B54 /* pppcontroller.defs */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.mig; name = pppcontroller.defs; path = SystemConfiguration.fproj/pppcontroller.defs; sourceTree = "<group>"; };
 		23C1E2BE062DD5DB00835B54 /* pppcontroller.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = pppcontroller.h; path = configd.build/SystemConfiguration.framework.build/DerivedSources/pppcontroller.h; sourceTree = BUILT_PRODUCTS_DIR; };
+		72B43726113C7BFC00EBF1B6 /* nc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nc.h; sourceTree = "<group>"; };
+		72B43727113C7BFC00EBF1B6 /* nc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nc.c; sourceTree = "<group>"; };
 		9EE943F306AF409B00772EB5 /* BondConfiguration.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = BondConfiguration.c; sourceTree = "<group>"; };
 		F95B8A420B03E07A00993BA3 /* SCNetworkSignature.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = SCNetworkSignature.c; sourceTree = "<group>"; };
 		F95B8A440B03E09300993BA3 /* SCNetworkSignature.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SCNetworkSignature.h; sourceTree = "<group>"; };
@@ -1616,24 +2159,80 @@
 				158337A00CFB6B9E0033AB93 /* CoreFoundation.framework in Frameworks */,
 				154707300D1F70C80075C28D /* SystemConfiguration.framework in Frameworks */,
 				158337A20CFB6B9E0033AB93 /* Security.framework in Frameworks */,
+				15F21618110F823500E89CF7 /* libbsm.dylib in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EA0C108395BB00A3BC0C /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EA93108395BB00A3BC0C /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EA94108395BB00A3BC0C /* CoreFoundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EAA1108395BB00A3BC0C /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EAA2108395BB00A3BC0C /* CoreFoundation.framework in Frameworks */,
+				1583EAA3108395BB00A3BC0C /* SystemConfiguration.framework in Frameworks */,
+				1583EAA4108395BB00A3BC0C /* Security.framework in Frameworks */,
+				15F21619110F826800E89CF7 /* libbsm.dylib in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB19108395BC00A3BC0C /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB1A108395BC00A3BC0C /* CoreFoundation.framework in Frameworks */,
+				1583EB1B108395BC00A3BC0C /* SystemConfiguration.framework in Frameworks */,
+				1583EB1C108395BC00A3BC0C /* IOKit.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB73108395BD00A3BC0C /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB74108395BD00A3BC0C /* CoreFoundation.framework in Frameworks */,
+				1583EB75108395BD00A3BC0C /* SystemConfiguration.framework in Frameworks */,
+				1583EB76108395BD00A3BC0C /* IOKit.framework in Frameworks */,
+				1583EB77108395BD00A3BC0C /* Security.framework in Frameworks */,
+				1583EB78108395BD00A3BC0C /* libbsm.dylib in Frameworks */,
+				1583EB79108395BD00A3BC0C /* libKernelEventMonitor.a in Frameworks */,
+				1583EB7A108395BD00A3BC0C /* libInterfaceNamer.a in Frameworks */,
+				1583EB7B108395BD00A3BC0C /* libIPMonitor.a in Frameworks */,
+				1583EB7C108395BD00A3BC0C /* libLinkConfiguration.a in Frameworks */,
+				1583EB7D108395BD00A3BC0C /* libNetworkIdentification.a in Frameworks */,
+				1583EB7E108395BD00A3BC0C /* libPreferencesMonitor.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159C9B2F0DB68E8300BEEF10 /* Frameworks */ = {
+		1583EB8A108395BE00A3BC0C /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159C9B300DB68E8400BEEF10 /* CoreFoundation.framework in Frameworks */,
-				159C9B7A0DB68E8A00BEEF10 /* SystemConfiguration.framework in Frameworks */,
+				1583EB8B108395BE00A3BC0C /* CoreFoundation.framework in Frameworks */,
+				1583EB8C108395BE00A3BC0C /* SystemConfiguration.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159C9B850DB68F0300BEEF10 /* Frameworks */ = {
+		1583EBAF108395BE00A3BC0C /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159C9B860DB68F1600BEEF10 /* CoreFoundation.framework in Frameworks */,
-				159C9B870DB68F1600BEEF10 /* SystemConfiguration.framework in Frameworks */,
+				1583EBB0108395BE00A3BC0C /* CoreFoundation.framework in Frameworks */,
+				1583EBB1108395BE00A3BC0C /* SystemConfiguration.framework in Frameworks */,
+				1583EBB2108395BE00A3BC0C /* libedit.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1644,6 +2243,7 @@
 				159D54CC07529FFF004F8947 /* CoreFoundation.framework in Frameworks */,
 				1559C44A0D349A4E0098FD59 /* SystemConfiguration.framework in Frameworks */,
 				1543636B0752D03C00A8EC6C /* IOKit.framework in Frameworks */,
+				D6623873120B2AA7007F8E95 /* Security.framework in Frameworks */,
 				15BAA32307F0699A00D9EC95 /* libbsm.dylib in Frameworks */,
 				159D54CE07529FFF004F8947 /* libKernelEventMonitor.a in Frameworks */,
 				159D54D007529FFF004F8947 /* libInterfaceNamer.a in Frameworks */,
@@ -1680,6 +2280,48 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		1513E399108420A700088779 /* EmbeddedOther */ = {
+			isa = PBXGroup;
+			children = (
+				1583EA10108395BB00A3BC0C /* dnsinfo.dylib */,
+				1583EA99108395BB00A3BC0C /* SystemConfiguration.framework */,
+				1513E39D108420DE00088779 /* Plugins */,
+				1583EAAA108395BB00A3BC0C /* SCHelper */,
+				1513E3A11084216500088779 /* configd, scutil, scselect */,
+			);
+			name = EmbeddedOther;
+			sourceTree = "<group>";
+		};
+		1513E39D108420DE00088779 /* Plugins */ = {
+			isa = PBXGroup;
+			children = (
+				1583EAD8108395BB00A3BC0C /* libIPMonitor.a */,
+				1583EADE108395BB00A3BC0C /* IPMonitor.bundle */,
+				1583EAE7108395BB00A3BC0C /* libInterfaceNamer.a */,
+				1583EAED108395BC00A3BC0C /* InterfaceNamer.bundle */,
+				1583EAFF108395BC00A3BC0C /* libKernelEventMonitor.a */,
+				1583EB05108395BC00A3BC0C /* KernelEventMonitor.bundle */,
+				1583EB0E108395BC00A3BC0C /* libLinkConfiguration.a */,
+				1583EB14108395BC00A3BC0C /* LinkConfiguration.bundle */,
+				1583EB21108395BC00A3BC0C /* Logger.bundle */,
+				1583EB2A108395BD00A3BC0C /* libNetworkIdentification.a */,
+				1583EB30108395BD00A3BC0C /* NetworkIdentification.bundle */,
+				1583EB39108395BD00A3BC0C /* libPreferencesMonitor.a */,
+				1583EB3F108395BD00A3BC0C /* PreferencesMonitor.bundle */,
+			);
+			name = Plugins;
+			sourceTree = "<group>";
+		};
+		1513E3A11084216500088779 /* configd, scutil, scselect */ = {
+			isa = PBXGroup;
+			children = (
+				1583EB84108395BD00A3BC0C /* configd */,
+				1583EB90108395BE00A3BC0C /* scselect */,
+				1583EBB6108395BE00A3BC0C /* scutil */,
+			);
+			name = "configd, scutil, scselect";
+			sourceTree = "<group>";
+		};
 		151F5DA80CCE995D0093AC3B /* SCMonitor */ = {
 			isa = PBXGroup;
 			children = (
@@ -1703,7 +2345,7 @@
 		154083530D5B824400E07907 /* MacOSX */ = {
 			isa = PBXGroup;
 			children = (
-				15DAD5EE075913CE0084A6ED /* libdnsinfo.a */,
+				15DAD5EE075913CE0084A6ED /* libdnsinfo.dylib */,
 				1547072E0D1F70C80075C28D /* SystemConfiguration.framework */,
 				1547001D08455B98006787CE /* SCHelper */,
 				151F5D9A0CCE98E50093AC3B /* SCMonitor.plugin */,
@@ -1716,7 +2358,7 @@
 		1540835A0D5B825200E07907 /* Embedded */ = {
 			isa = PBXGroup;
 			children = (
-				157A84E80D56C63900B6F1A0 /* libdnsinfo.a */,
+				157A84E80D56C63900B6F1A0 /* libdnsinfo.dylib */,
 				1559C4440D349A4E0098FD59 /* SystemConfiguration.framework */,
 				154083C50D5B832F00E07907 /* Plugins */,
 				1559C4470D349A4E0098FD59 /* SCHelper */,
@@ -1777,7 +2419,6 @@
 		1547002F084561ED006787CE /* Headers */ = {
 			isa = PBXGroup;
 			children = (
-				15DAF2D708466D4900D1B2BD /* helper_comm.h */,
 				155B7BF60847776D00F0E262 /* SCHelper_client.h */,
 			);
 			name = Headers;
@@ -1786,7 +2427,6 @@
 		15470030084561FF006787CE /* Sources */ = {
 			isa = PBXGroup;
 			children = (
-				15DAF2D608466D4900D1B2BD /* helper_comm.c */,
 				15DAF2D808466D4900D1B2BD /* SCHelper_client.c */,
 				15DAF2D908466D4900D1B2BD /* SCHelper_server.c */,
 			);
@@ -1828,14 +2468,12 @@
 		158ADBFD0754ECB100124717 /* Plugins */ = {
 			isa = PBXGroup;
 			children = (
-				15FD73220754DB9F001CC321 /* ATconfig.bundle */,
 				159D53EC07528C61004F8947 /* libIPMonitor.a */,
 				15FD72A50754DA4C001CC321 /* IPMonitor.bundle */,
 				159D53E507528C4A004F8947 /* libInterfaceNamer.a */,
 				15FD72970754DA2B001CC321 /* InterfaceNamer.bundle */,
 				159D53D407528BDA004F8947 /* libKernelEventMonitor.a */,
 				15828AE70753B5F900AD4710 /* KernelEventMonitor.bundle */,
-				15FD71090754D628001CC321 /* Kicker.bundle */,
 				159D53F307528C79004F8947 /* libLinkConfiguration.a */,
 				15FD72B50754DA69001CC321 /* LinkConfiguration.bundle */,
 				F95B8A5F0B03F81400993BA3 /* libNetworkIdentification.a */,
@@ -1861,11 +2499,9 @@
 			isa = PBXGroup;
 			children = (
 				159D53C907528B36004F8947 /* common */,
-				159D53C407528B36004F8947 /* ATconfig */,
 				159D53A607528B36004F8947 /* IPMonitor */,
 				159D53AC07528B36004F8947 /* InterfaceNamer */,
 				159D53AF07528B36004F8947 /* KernelEventMonitor */,
-				159D53BB07528B36004F8947 /* Kicker */,
 				159D53C007528B36004F8947 /* LinkConfiguration */,
 				1531D3D90E93E6AA00248432 /* Logger */,
 				F95B8A660B03F97800993BA3 /* NetworkIdentification */,
@@ -1880,6 +2516,8 @@
 				159D53A707528B36004F8947 /* ip_plugin.c */,
 				155D22380AF13A7300D52ED0 /* dns-configuration.h */,
 				159D53AA07528B36004F8947 /* dns-configuration.c */,
+				1575FD2512CD15C60003D86E /* proxy-configuration.c */,
+				1575FD2612CD15C60003D86E /* proxy-configuration.h */,
 				155D22390AF13A7300D52ED0 /* set-hostname.h */,
 				159D53AB07528B36004F8947 /* set-hostname.c */,
 				155D223A0AF13A7300D52ED0 /* smb-configuration.h */,
@@ -1904,12 +2542,10 @@
 			isa = PBXGroup;
 			children = (
 				159D53B707528B36004F8947 /* eventmon.h */,
-				159D53B607528B36004F8947 /* ev_appletalk.h */,
 				159D53B207528B36004F8947 /* ev_dlil.h */,
 				159D53B807528B36004F8947 /* ev_ipv4.h */,
 				159D53BA07528B36004F8947 /* ev_ipv6.h */,
 				159D53B007528B36004F8947 /* eventmon.c */,
-				159D53B907528B36004F8947 /* ev_appletalk.c */,
 				159D53B107528B36004F8947 /* ev_dlil.c */,
 				159D53B307528B36004F8947 /* ev_ipv4.c */,
 				159D53B407528B36004F8947 /* ev_ipv6.c */,
@@ -1919,18 +2555,6 @@
 			path = Plugins/KernelEventMonitor;
 			sourceTree = "<group>";
 		};
-		159D53BB07528B36004F8947 /* Kicker */ = {
-			isa = PBXGroup;
-			children = (
-				159D53BE07528B36004F8947 /* kicker.c */,
-				158AD85B0754E38F00124717 /* Info.plist */,
-				159D53BC07528B36004F8947 /* Kicker.xml */,
-				159D53BD07528B36004F8947 /* enable-network */,
-			);
-			name = Kicker;
-			path = Plugins/Kicker;
-			sourceTree = "<group>";
-		};
 		159D53C007528B36004F8947 /* LinkConfiguration */ = {
 			isa = PBXGroup;
 			children = (
@@ -1951,18 +2575,6 @@
 			path = Plugins/PreferencesMonitor;
 			sourceTree = "<group>";
 		};
-		159D53C407528B36004F8947 /* ATconfig */ = {
-			isa = PBXGroup;
-			children = (
-				159D53C507528B36004F8947 /* cfManager.c */,
-				159D53C607528B36004F8947 /* cfManager.h */,
-				159D53C707528B36004F8947 /* atconfig.c */,
-				15FD73970754DE49001CC321 /* Info.plist */,
-			);
-			name = ATconfig;
-			path = Plugins/ATconfig;
-			sourceTree = "<group>";
-		};
 		159D53C907528B36004F8947 /* common */ = {
 			isa = PBXGroup;
 			children = (
@@ -1976,6 +2588,7 @@
 		15B6861D0678B61900FF4023 /* Supporting Files */ = {
 			isa = PBXGroup;
 			children = (
+				15D9DCFA10DD90A1004E545D /* AppWorkaround.plist */,
 				15A6F7C20A4B266D00B907EA /* Localizable.strings */,
 				15B686220678B65C00FF4023 /* NetworkConfiguration.plist */,
 				1577253606EFBF3100D7B52B /* NetworkInterface.strings */,
@@ -2027,6 +2640,7 @@
 				154083530D5B824400E07907 /* MacOSX */,
 				1540835A0D5B825200E07907 /* Embedded */,
 				154083890D5B82A900E07907 /* EmbeddedSimulator */,
+				1513E399108420A700088779 /* EmbeddedOther */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -2066,6 +2680,7 @@
 				F95B8A440B03E09300993BA3 /* SCNetworkSignature.h */,
 				F95B8A450B03E09300993BA3 /* SCNetworkSignaturePrivate.h */,
 				15CB693905C0722B0099E85F /* SCValidation.h */,
+				15A1FF3010597F17004C9CC9 /* CaptiveNetwork.h */,
 				15CB694505C0722B0099E85F /* DeviceOnHold.h */,
 				15CB693D05C0722B0099E85F /* DHCPClientPreferences.h */,
 				15CB694705C0722B0099E85F /* LinkConfiguration.h */,
@@ -2073,6 +2688,10 @@
 				15CB694305C0722B0099E85F /* moh.h */,
 				15CB694105C0722B0099E85F /* moh_msg.h */,
 				23C1E2BE062DD5DB00835B54 /* pppcontroller.h */,
+				159A7513107FEAA400A57EAB /* VPNPrivate.h */,
+				159A7515107FEAA400A57EAB /* VPNConfiguration.h */,
+				15AAA7F2108E310700C2A607 /* VPNTunnel.h */,
+				15AAA7F1108E310700C2A607 /* VPNTunnelPrivate.h */,
 			);
 			name = Headers;
 			sourceTree = "<group>";
@@ -2126,6 +2745,7 @@
 				15AD7A3E0670A85900BFE03C /* SCNetworkSet.c */,
 				15CB69B205C0722B0099E85F /* LinkConfiguration.c */,
 				9EE943F306AF409B00772EB5 /* BondConfiguration.c */,
+				15FD7B3B101E439200C56621 /* BridgeConfiguration.c */,
 				15CB69B605C0722B0099E85F /* VLANConfiguration.c */,
 				15CB695605C0722B0099E85F /* SCDPlugin.c */,
 				15CB699C05C0722B0099E85F /* SCDConsoleUser.c */,
@@ -2137,10 +2757,14 @@
 				15CB69A605C0722B0099E85F /* SCNetworkReachability.c */,
 				F95B8A420B03E07A00993BA3 /* SCNetworkSignature.c */,
 				15CB69A805C0722B0099E85F /* SCProxies.c */,
+				15A1FF3110597F17004C9CC9 /* CaptiveNetwork.c */,
 				15CB69AC05C0722B0099E85F /* DHCP.c */,
 				15CB69AE05C0722B0099E85F /* moh.c */,
 				15CB69B005C0722B0099E85F /* DeviceOnHold.c */,
 				15CB69B405C0722B0099E85F /* dy_framework.c */,
+				159A7517107FEAA400A57EAB /* VPNPrivate.c */,
+				159A7519107FEAA400A57EAB /* VPNConfiguration.c */,
+				15AAA7F3108E310700C2A607 /* VPNTunnel.c */,
 			);
 			name = Sources;
 			sourceTree = "<group>";
@@ -2261,6 +2885,7 @@
 				15CB6A4D05C0722B0099E85F /* notifications.h */,
 				15CB6A4F05C0722B0099E85F /* tests.h */,
 				15CB6A5105C0722B0099E85F /* prefs.h */,
+				72B43726113C7BFC00EBF1B6 /* nc.h */,
 				15A509A406C2518F001F0AB7 /* net.h */,
 				15DC34680711D49400A3311C /* net_interface.h */,
 				15DC346A0711D49400A3311C /* net_protocol.h */,
@@ -2281,6 +2906,7 @@
 				15CB6A5E05C0722B0099E85F /* notifications.c */,
 				15CB6A6005C0722B0099E85F /* tests.c */,
 				15CB6A6205C0722B0099E85F /* prefs.c */,
+				72B43727113C7BFC00EBF1B6 /* nc.c */,
 				15A509A306C2518F001F0AB7 /* net.c */,
 				15DC34670711D49400A3311C /* net_interface.c */,
 				15DC34690711D49400A3311C /* net_protocol.c */,
@@ -2325,6 +2951,8 @@
 			children = (
 				15CB69BE05C0722B0099E85F /* config.defs */,
 				1514D76D05C08A5F00757DC9 /* config_types.h */,
+				152E0E7E10FE820E00E402F2 /* helper.defs */,
+				152E0E8810FE824000E402F2 /* helper_types.h */,
 				15FCAAD005FD0EBF00CB79E6 /* shared_dns_info.defs */,
 				15FCAACF05FD0EBF00CB79E6 /* shared_dns_info_types.h */,
 				23C1E2B8062DD45900835B54 /* pppcontroller.defs */,
@@ -2359,8 +2987,8 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				15DAF2DF08466D4900D1B2BD /* helper_comm.h in Headers */,
 				155B7BF70847776D00F0E262 /* SCHelper_client.h in Headers */,
+				152E0E8910FE824000E402F2 /* helper_types.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2381,6 +3009,7 @@
 				155847510754FDCD0046C2E9 /* net_protocol.h in Headers */,
 				155847520754FDCD0046C2E9 /* net_service.h in Headers */,
 				155847530754FDCD0046C2E9 /* net_set.h in Headers */,
+				72B43728113C7BFC00EBF1B6 /* nc.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2424,20 +3053,22 @@
 				1572C4C30CFB55B400E2776E /* DeviceOnHold.h in Headers */,
 				1572C4C50CFB55B400E2776E /* dy_framework.h in Headers */,
 				1572C4C70CFB55B400E2776E /* SCPreferencesPathKey.h in Headers */,
-				1572C4C80CFB55B400E2776E /* dnsinfo.h in Headers */,
-				1572C4C90CFB55B400E2776E /* dnsinfo_private.h in Headers */,
 				1572C4CA0CFB55B400E2776E /* pppcontroller_types.h in Headers */,
 				1572C4CB0CFB55B400E2776E /* pppcontroller.h in Headers */,
 				1572C4CE0CFB55B400E2776E /* SCPreferencesSetSpecificPrivate.h in Headers */,
 				1572C4CF0CFB55B400E2776E /* SCPreferencesGetSpecificPrivate.h in Headers */,
 				1572C4D00CFB55B400E2776E /* SCNetworkConfigurationPrivate.h in Headers */,
-				1572C4D10CFB55B400E2776E /* helper_comm.h in Headers */,
 				1572C4D20CFB55B400E2776E /* SCHelper_client.h in Headers */,
 				1572C4D40CFB55B400E2776E /* SCNetworkConnectionPrivate.h in Headers */,
 				1572C4D50CFB55B400E2776E /* SCPreferencesKeychainPrivate.h in Headers */,
 				1572C4D60CFB55B400E2776E /* SCSchemaDefinitionsPrivate.h in Headers */,
 				1572C4D70CFB55B400E2776E /* SCNetworkSignature.h in Headers */,
 				1572C4D80CFB55B400E2776E /* SCNetworkSignaturePrivate.h in Headers */,
+				15A1FF3210597F17004C9CC9 /* CaptiveNetwork.h in Headers */,
+				159A751A107FEAA400A57EAB /* VPNPrivate.h in Headers */,
+				159A751C107FEAA400A57EAB /* VPNConfiguration.h in Headers */,
+				15AAA7F5108E310700C2A607 /* VPNTunnel.h in Headers */,
+				15AAA7F4108E310700C2A607 /* VPNTunnelPrivate.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2465,6 +3096,7 @@
 				157433FC0D4A8137002ACA73 /* net_protocol.h in Headers */,
 				157433FD0D4A8137002ACA73 /* net_service.h in Headers */,
 				157433FE0D4A8137002ACA73 /* net_set.h in Headers */,
+				72B4372A113C7BFC00EBF1B6 /* nc.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2482,6 +3114,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				157A84F60D56C7E800B6F1A0 /* dns-configuration.h in Headers */,
+				1575FD2812CD15C60003D86E /* proxy-configuration.h in Headers */,
 				157A84F70D56C7E800B6F1A0 /* set-hostname.h in Headers */,
 				15D48EC20F67061F00B4711E /* dnsinfo_create.h in Headers */,
 			);
@@ -2545,114 +3178,260 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1583379B0CFB6B9E0033AB93 /* helper_comm.h in Headers */,
 				1583379C0CFB6B9E0033AB93 /* SCHelper_client.h in Headers */,
+				152E0E8A10FE824000E402F2 /* helper_types.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159C9B2B0DB68E2600BEEF10 /* Headers */ = {
+		1583EA05108395BB00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				1583EA06108395BB00A3BC0C /* dnsinfo.h in Headers */,
+				1583EA07108395BB00A3BC0C /* dnsinfo_private.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159C9B830DB68F0300BEEF10 /* Headers */ = {
+		1583EA1A108395BB00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				1583EA1B108395BB00A3BC0C /* SCSchemaDefinitions.h in Headers */,
+				1583EA1C108395BB00A3BC0C /* SystemConfiguration.h in Headers */,
+				1583EA1D108395BB00A3BC0C /* SCPrivate.h in Headers */,
+				1583EA1E108395BB00A3BC0C /* SCDPlugin.h in Headers */,
+				1583EA1F108395BB00A3BC0C /* SCDynamicStoreInternal.h in Headers */,
+				1583EA20108395BB00A3BC0C /* SCDynamicStore.h in Headers */,
+				1583EA21108395BB00A3BC0C /* SCDynamicStorePrivate.h in Headers */,
+				1583EA22108395BB00A3BC0C /* SCDynamicStoreKey.h in Headers */,
+				1583EA23108395BB00A3BC0C /* SCDynamicStoreCopySpecific.h in Headers */,
+				1583EA24108395BB00A3BC0C /* SCDynamicStoreCopySpecificPrivate.h in Headers */,
+				1583EA25108395BB00A3BC0C /* SCDynamicStoreSetSpecificPrivate.h in Headers */,
+				1583EA26108395BB00A3BC0C /* SCPreferencesInternal.h in Headers */,
+				1583EA27108395BB00A3BC0C /* SCPreferences.h in Headers */,
+				1583EA28108395BB00A3BC0C /* SCPreferencesPrivate.h in Headers */,
+				1583EA29108395BB00A3BC0C /* SCPreferencesPath.h in Headers */,
+				1583EA2A108395BB00A3BC0C /* SCPreferencesSetSpecific.h in Headers */,
+				1583EA2B108395BB00A3BC0C /* SCNetworkConfiguration.h in Headers */,
+				1583EA2C108395BB00A3BC0C /* SCNetworkConfigurationInternal.h in Headers */,
+				1583EA2D108395BB00A3BC0C /* SCNetwork.h in Headers */,
+				1583EA2E108395BB00A3BC0C /* SCNetworkConnection.h in Headers */,
+				1583EA2F108395BB00A3BC0C /* SCNetworkReachability.h in Headers */,
+				1583EA30108395BB00A3BC0C /* SCValidation.h in Headers */,
+				1583EA31108395BB00A3BC0C /* DHCPClientPreferences.h in Headers */,
+				1583EA32108395BB00A3BC0C /* SCDynamicStoreCopyDHCPInfo.h in Headers */,
+				1583EA33108395BB00A3BC0C /* moh_msg.h in Headers */,
+				1583EA34108395BB00A3BC0C /* moh.h in Headers */,
+				1583EA35108395BB00A3BC0C /* DeviceOnHold.h in Headers */,
+				1583EA36108395BB00A3BC0C /* dy_framework.h in Headers */,
+				1583EA37108395BB00A3BC0C /* SCPreferencesPathKey.h in Headers */,
+				1583EA38108395BB00A3BC0C /* pppcontroller_types.h in Headers */,
+				1583EA39108395BB00A3BC0C /* pppcontroller.h in Headers */,
+				1583EA3A108395BB00A3BC0C /* SCPreferencesSetSpecificPrivate.h in Headers */,
+				1583EA3B108395BB00A3BC0C /* SCPreferencesGetSpecificPrivate.h in Headers */,
+				1583EA3C108395BB00A3BC0C /* SCNetworkConfigurationPrivate.h in Headers */,
+				1583EA3E108395BB00A3BC0C /* SCHelper_client.h in Headers */,
+				1583EA3F108395BB00A3BC0C /* SCNetworkConnectionPrivate.h in Headers */,
+				1583EA40108395BB00A3BC0C /* SCPreferencesKeychainPrivate.h in Headers */,
+				1583EA41108395BB00A3BC0C /* SCSchemaDefinitionsPrivate.h in Headers */,
+				1583EA42108395BB00A3BC0C /* SCNetworkSignature.h in Headers */,
+				1583EA43108395BB00A3BC0C /* SCNetworkSignaturePrivate.h in Headers */,
+				1583EA44108395BB00A3BC0C /* CaptiveNetwork.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53D007528BDA004F8947 /* Headers */ = {
+		1583EA9C108395BB00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D540A07528D3B004F8947 /* cache.h in Headers */,
-				159D540E07528DAE004F8947 /* ev_dlil.h in Headers */,
-				159D541007528DB1004F8947 /* ev_ipv4.h in Headers */,
-				159D541207528DB3004F8947 /* ev_ipv6.h in Headers */,
-				159D541407528DB5004F8947 /* eventmon.h in Headers */,
+				1583EA9E108395BB00A3BC0C /* SCHelper_client.h in Headers */,
+				152E0E8B10FE824000E402F2 /* helper_types.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53E107528C4A004F8947 /* Headers */ = {
+		1583EACB108395BB00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				1583EACC108395BB00A3BC0C /* dns-configuration.h in Headers */,
+				1575FD2C12CD15C60003D86E /* proxy-configuration.h in Headers */,
+				1583EACD108395BB00A3BC0C /* set-hostname.h in Headers */,
+				1583EACE108395BB00A3BC0C /* dnsinfo_create.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53E807528C61004F8947 /* Headers */ = {
+		1583EAE1108395BB00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				155D223B0AF13A7300D52ED0 /* dns-configuration.h in Headers */,
-				155D223C0AF13A7300D52ED0 /* set-hostname.h in Headers */,
-				155D223D0AF13A7300D52ED0 /* smb-configuration.h in Headers */,
-				15D48EC00F67061700B4711E /* dnsinfo_create.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53EF07528C79004F8947 /* Headers */ = {
+		1583EAF0108395BC00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				1583EAF1108395BC00A3BC0C /* cache.h in Headers */,
+				1583EAF2108395BC00A3BC0C /* ev_dlil.h in Headers */,
+				1583EAF3108395BC00A3BC0C /* ev_ipv4.h in Headers */,
+				1583EAF4108395BC00A3BC0C /* ev_ipv6.h in Headers */,
+				1583EAF5108395BC00A3BC0C /* eventmon.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53F607528C95004F8947 /* Headers */ = {
+		1583EB08108395BC00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D54A307529FFF004F8947 /* Headers */ = {
+		1583EB24108395BD00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D54A407529FFF004F8947 /* configd.h in Headers */,
-				159D54A507529FFF004F8947 /* _SCD.h in Headers */,
-				159D54A607529FFF004F8947 /* configd_server.h in Headers */,
-				159D54A707529FFF004F8947 /* notify_server.h in Headers */,
-				159D54A807529FFF004F8947 /* plugin_support.h in Headers */,
-				159D54A907529FFF004F8947 /* session.h in Headers */,
-				159D54AA07529FFF004F8947 /* pattern.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		15A5A1E60D5B94190087BDA0 /* Headers */ = {
+		1583EB33108395BD00A3BC0C /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				15A5A1E70D5B94190087BDA0 /* SCSchemaDefinitions.h in Headers */,
-				15A5A1E80D5B94190087BDA0 /* SystemConfiguration.h in Headers */,
-				15A5A1E90D5B94190087BDA0 /* SCPrivate.h in Headers */,
-				15A5A1EA0D5B94190087BDA0 /* SCDPlugin.h in Headers */,
-				15A5A1EB0D5B94190087BDA0 /* SCDynamicStoreInternal.h in Headers */,
-				15A5A1EC0D5B94190087BDA0 /* SCDynamicStore.h in Headers */,
-				15A5A1ED0D5B94190087BDA0 /* SCDynamicStorePrivate.h in Headers */,
-				15A5A1EE0D5B94190087BDA0 /* SCDynamicStoreKey.h in Headers */,
-				15A5A1EF0D5B94190087BDA0 /* SCDynamicStoreCopySpecific.h in Headers */,
-				15A5A1F00D5B94190087BDA0 /* SCDynamicStoreCopySpecificPrivate.h in Headers */,
-				15A5A1F10D5B94190087BDA0 /* SCDynamicStoreSetSpecificPrivate.h in Headers */,
-				15A5A1F20D5B94190087BDA0 /* SCPreferencesInternal.h in Headers */,
-				15A5A1F30D5B94190087BDA0 /* SCPreferences.h in Headers */,
-				15A5A1F40D5B94190087BDA0 /* SCPreferencesPrivate.h in Headers */,
-				15A5A1F50D5B94190087BDA0 /* SCPreferencesPath.h in Headers */,
-				15A5A1F60D5B94190087BDA0 /* SCPreferencesSetSpecific.h in Headers */,
-				15A5A1F70D5B94190087BDA0 /* SCNetworkConfiguration.h in Headers */,
-				15A5A1F80D5B94190087BDA0 /* SCNetworkConfigurationInternal.h in Headers */,
-				15A5A1F90D5B94190087BDA0 /* SCNetwork.h in Headers */,
-				15A5A1FA0D5B94190087BDA0 /* SCNetworkConnection.h in Headers */,
-				15A5A1FB0D5B94190087BDA0 /* SCNetworkReachability.h in Headers */,
-				15A5A1FC0D5B94190087BDA0 /* SCValidation.h in Headers */,
-				15A5A1FD0D5B94190087BDA0 /* DHCPClientPreferences.h in Headers */,
-				15A5A1FE0D5B94190087BDA0 /* SCDynamicStoreCopyDHCPInfo.h in Headers */,
-				15A5A1FF0D5B94190087BDA0 /* moh_msg.h in Headers */,
-				15A5A2000D5B94190087BDA0 /* moh.h in Headers */,
-				15A5A2010D5B94190087BDA0 /* DeviceOnHold.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB4C108395BD00A3BC0C /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB4D108395BD00A3BC0C /* configd.h in Headers */,
+				1583EB4E108395BD00A3BC0C /* _SCD.h in Headers */,
+				1583EB4F108395BD00A3BC0C /* configd_server.h in Headers */,
+				1583EB50108395BD00A3BC0C /* notify_server.h in Headers */,
+				1583EB51108395BD00A3BC0C /* plugin_support.h in Headers */,
+				1583EB52108395BD00A3BC0C /* session.h in Headers */,
+				1583EB53108395BD00A3BC0C /* pattern.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB87108395BE00A3BC0C /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB93108395BE00A3BC0C /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB94108395BE00A3BC0C /* scutil.h in Headers */,
+				1583EB95108395BE00A3BC0C /* commands.h in Headers */,
+				1583EB96108395BE00A3BC0C /* dictionary.h in Headers */,
+				1583EB97108395BE00A3BC0C /* session.h in Headers */,
+				1583EB98108395BE00A3BC0C /* cache.h in Headers */,
+				1583EB99108395BE00A3BC0C /* notifications.h in Headers */,
+				1583EB9A108395BE00A3BC0C /* tests.h in Headers */,
+				1583EB9B108395BE00A3BC0C /* prefs.h in Headers */,
+				1583EB9C108395BE00A3BC0C /* net.h in Headers */,
+				1583EB9D108395BE00A3BC0C /* net_interface.h in Headers */,
+				1583EB9E108395BE00A3BC0C /* net_protocol.h in Headers */,
+				1583EB9F108395BE00A3BC0C /* net_service.h in Headers */,
+				1583EBA0108395BE00A3BC0C /* net_set.h in Headers */,
+				15B274A6114467D8003414AD /* nc.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53D007528BDA004F8947 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D540A07528D3B004F8947 /* cache.h in Headers */,
+				159D540E07528DAE004F8947 /* ev_dlil.h in Headers */,
+				159D541007528DB1004F8947 /* ev_ipv4.h in Headers */,
+				159D541207528DB3004F8947 /* ev_ipv6.h in Headers */,
+				159D541407528DB5004F8947 /* eventmon.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53E107528C4A004F8947 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53E807528C61004F8947 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				155D223B0AF13A7300D52ED0 /* dns-configuration.h in Headers */,
+				1575FD2A12CD15C60003D86E /* proxy-configuration.h in Headers */,
+				155D223C0AF13A7300D52ED0 /* set-hostname.h in Headers */,
+				155D223D0AF13A7300D52ED0 /* smb-configuration.h in Headers */,
+				15D48EC00F67061700B4711E /* dnsinfo_create.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53EF07528C79004F8947 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53F607528C95004F8947 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D54A307529FFF004F8947 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D54A407529FFF004F8947 /* configd.h in Headers */,
+				159D54A507529FFF004F8947 /* _SCD.h in Headers */,
+				159D54A607529FFF004F8947 /* configd_server.h in Headers */,
+				159D54A707529FFF004F8947 /* notify_server.h in Headers */,
+				159D54A807529FFF004F8947 /* plugin_support.h in Headers */,
+				159D54A907529FFF004F8947 /* session.h in Headers */,
+				159D54AA07529FFF004F8947 /* pattern.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		15A5A1E60D5B94190087BDA0 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				15A5A1E70D5B94190087BDA0 /* SCSchemaDefinitions.h in Headers */,
+				15A5A1E80D5B94190087BDA0 /* SystemConfiguration.h in Headers */,
+				15A5A1E90D5B94190087BDA0 /* SCPrivate.h in Headers */,
+				15A5A1EA0D5B94190087BDA0 /* SCDPlugin.h in Headers */,
+				15A5A1EB0D5B94190087BDA0 /* SCDynamicStoreInternal.h in Headers */,
+				15A5A1EC0D5B94190087BDA0 /* SCDynamicStore.h in Headers */,
+				15A5A1ED0D5B94190087BDA0 /* SCDynamicStorePrivate.h in Headers */,
+				15A5A1EE0D5B94190087BDA0 /* SCDynamicStoreKey.h in Headers */,
+				15A5A1EF0D5B94190087BDA0 /* SCDynamicStoreCopySpecific.h in Headers */,
+				15A5A1F00D5B94190087BDA0 /* SCDynamicStoreCopySpecificPrivate.h in Headers */,
+				15A5A1F10D5B94190087BDA0 /* SCDynamicStoreSetSpecificPrivate.h in Headers */,
+				15A5A1F20D5B94190087BDA0 /* SCPreferencesInternal.h in Headers */,
+				15A5A1F30D5B94190087BDA0 /* SCPreferences.h in Headers */,
+				15A5A1F40D5B94190087BDA0 /* SCPreferencesPrivate.h in Headers */,
+				15A5A1F50D5B94190087BDA0 /* SCPreferencesPath.h in Headers */,
+				15A5A1F60D5B94190087BDA0 /* SCPreferencesSetSpecific.h in Headers */,
+				15A5A1F70D5B94190087BDA0 /* SCNetworkConfiguration.h in Headers */,
+				15A5A1F80D5B94190087BDA0 /* SCNetworkConfigurationInternal.h in Headers */,
+				15A5A1F90D5B94190087BDA0 /* SCNetwork.h in Headers */,
+				15A5A1FA0D5B94190087BDA0 /* SCNetworkConnection.h in Headers */,
+				15A5A1FB0D5B94190087BDA0 /* SCNetworkReachability.h in Headers */,
+				15A5A1FC0D5B94190087BDA0 /* SCValidation.h in Headers */,
+				15A5A1FD0D5B94190087BDA0 /* DHCPClientPreferences.h in Headers */,
+				15A5A1FE0D5B94190087BDA0 /* SCDynamicStoreCopyDHCPInfo.h in Headers */,
+				15A5A1FF0D5B94190087BDA0 /* moh_msg.h in Headers */,
+				15A5A2000D5B94190087BDA0 /* moh.h in Headers */,
+				15A5A2010D5B94190087BDA0 /* DeviceOnHold.h in Headers */,
 				15A5A2030D5B94190087BDA0 /* dy_framework.h in Headers */,
 				15A5A2050D5B94190087BDA0 /* SCPreferencesPathKey.h in Headers */,
 				15A5A2060D5B94190087BDA0 /* dnsinfo.h in Headers */,
@@ -2662,13 +3441,15 @@
 				15A5A20C0D5B94190087BDA0 /* SCPreferencesSetSpecificPrivate.h in Headers */,
 				15A5A20D0D5B94190087BDA0 /* SCPreferencesGetSpecificPrivate.h in Headers */,
 				15A5A20E0D5B94190087BDA0 /* SCNetworkConfigurationPrivate.h in Headers */,
-				15A5A20F0D5B94190087BDA0 /* helper_comm.h in Headers */,
 				15A5A2100D5B94190087BDA0 /* SCHelper_client.h in Headers */,
 				15A5A2110D5B94190087BDA0 /* SCNetworkConnectionPrivate.h in Headers */,
 				15A5A2120D5B94190087BDA0 /* SCPreferencesKeychainPrivate.h in Headers */,
 				15A5A2130D5B94190087BDA0 /* SCSchemaDefinitionsPrivate.h in Headers */,
 				15A5A2140D5B94190087BDA0 /* SCNetworkSignature.h in Headers */,
 				15A5A2150D5B94190087BDA0 /* SCNetworkSignaturePrivate.h in Headers */,
+				15A1FF3410597F17004C9CC9 /* CaptiveNetwork.h in Headers */,
+				159A7528107FEAA400A57EAB /* VPNPrivate.h in Headers */,
+				159A752A107FEAA400A57EAB /* VPNConfiguration.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2715,20 +3496,21 @@
 				15DAD65D07591A1A0084A6ED /* LinkConfiguration.h in Headers */,
 				15DAD65E07591A1A0084A6ED /* dy_framework.h in Headers */,
 				15DAD66107591A1A0084A6ED /* SCPreferencesPathKey.h in Headers */,
-				15DAD66207591A1A0084A6ED /* dnsinfo.h in Headers */,
-				15DAD66307591A1A0084A6ED /* dnsinfo_private.h in Headers */,
 				15DAD66407591A1A0084A6ED /* pppcontroller_types.h in Headers */,
 				15DAD66507591A1A0084A6ED /* pppcontroller.h in Headers */,
 				156BD6BC07E0DFA9008698FF /* SCPreferencesSetSpecificPrivate.h in Headers */,
 				154CF3F407E1EA4D00D8302E /* SCPreferencesGetSpecificPrivate.h in Headers */,
 				155A1E6C081079CC00F70D98 /* SCNetworkConfigurationPrivate.h in Headers */,
-				15DAF2DB08466D4900D1B2BD /* helper_comm.h in Headers */,
 				155B7BF80847776D00F0E262 /* SCHelper_client.h in Headers */,
 				15A297300A13C08C009879B3 /* SCNetworkConnectionPrivate.h in Headers */,
 				152E68C10A2C89C70011FDA8 /* SCPreferencesKeychainPrivate.h in Headers */,
 				157A88890A470D0F003A4256 /* SCSchemaDefinitionsPrivate.h in Headers */,
 				F95B8A460B03E09300993BA3 /* SCNetworkSignature.h in Headers */,
 				F95B8A470B03E09300993BA3 /* SCNetworkSignaturePrivate.h in Headers */,
+				159A7521107FEAA400A57EAB /* VPNPrivate.h in Headers */,
+				159A7523107FEAA400A57EAB /* VPNConfiguration.h in Headers */,
+				15AAA7F8108E310700C2A607 /* VPNTunnel.h in Headers */,
+				15AAA7F7108E310700C2A607 /* VPNTunnelPrivate.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2938,8 +3720,8 @@
 			name = "DNSConfiguration-Embedded";
 			productInstallPath = /usr/local/lib/system;
 			productName = DNSConfiguration;
-			productReference = 157A84E80D56C63900B6F1A0 /* libdnsinfo.a */;
-			productType = "com.apple.product-type.library.static";
+			productReference = 157A84E80D56C63900B6F1A0 /* libdnsinfo.dylib */;
+			productType = "com.apple.product-type.library.dynamic";
 		};
 		157A84F40D56C7E800B6F1A0 /* IPMonitor-Embedded */ = {
 			isa = PBXNativeTarget;
@@ -3185,1650 +3967,2968 @@
 			productReference = 1559C4470D349A4E0098FD59 /* SCHelper */;
 			productType = "com.apple.product-type.tool";
 		};
-		159D53D307528BDA004F8947 /* KernelEventMonitor */ = {
+		1583EA04108395BB00A3BC0C /* DNSConfiguration-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB6020905594A00EEF749 /* Build configuration list for PBXNativeTarget "KernelEventMonitor" */;
+			buildConfigurationList = 1583EA0D108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "DNSConfiguration-EmbeddedOther" */;
 			buildPhases = (
-				159D53D007528BDA004F8947 /* Headers */,
-				159D53D107528BDA004F8947 /* Sources */,
+				1583EA05108395BB00A3BC0C /* Headers */,
+				1583EA08108395BB00A3BC0C /* Sources */,
+				1583EA0C108395BB00A3BC0C /* Frameworks */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = KernelEventMonitor;
-			productName = KernelEventMonitor;
-			productReference = 159D53D407528BDA004F8947 /* libKernelEventMonitor.a */;
-			productType = "com.apple.product-type.library.static";
+			name = "DNSConfiguration-EmbeddedOther";
+			productInstallPath = /usr/local/lib/system;
+			productName = DNSConfiguration;
+			productReference = 1583EA10108395BB00A3BC0C /* dnsinfo.dylib */;
+			productType = "com.apple.product-type.library.dynamic";
 		};
-		159D53E407528C4A004F8947 /* InterfaceNamer */ = {
+		1583EA19108395BB00A3BC0C /* SystemConfiguration.framework-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB5F60905594A00EEF749 /* Build configuration list for PBXNativeTarget "InterfaceNamer" */;
+			buildConfigurationList = 1583EA96108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "SystemConfiguration.framework-EmbeddedOther" */;
 			buildPhases = (
-				159D53E107528C4A004F8947 /* Headers */,
-				159D53E207528C4A004F8947 /* Sources */,
+				1583EA1A108395BB00A3BC0C /* Headers */,
+				1583EA49108395BB00A3BC0C /* Update Headers */,
+				1583EA4A108395BB00A3BC0C /* Resources */,
+				1583EA4F108395BB00A3BC0C /* Sources */,
+				1583EA93108395BB00A3BC0C /* Frameworks */,
+				1583EA95108395BB00A3BC0C /* get-mobility-info */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = InterfaceNamer;
-			productName = InterfaceNamer;
-			productReference = 159D53E507528C4A004F8947 /* libInterfaceNamer.a */;
-			productType = "com.apple.product-type.library.static";
+			name = "SystemConfiguration.framework-EmbeddedOther";
+			productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
+			productName = "SystemConfiguration (Framework)";
+			productReference = 1583EA99108395BB00A3BC0C /* SystemConfiguration.framework */;
+			productType = "com.apple.product-type.framework";
 		};
-		159D53EB07528C61004F8947 /* IPMonitor */ = {
+		1583EA9B108395BB00A3BC0C /* SCHelper-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB5EE0905594A00EEF749 /* Build configuration list for PBXNativeTarget "IPMonitor" */;
+			buildConfigurationList = 1583EAA7108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "SCHelper-EmbeddedOther" */;
 			buildPhases = (
-				159D53E807528C61004F8947 /* Headers */,
-				159D53E907528C61004F8947 /* Sources */,
+				1583EA9C108395BB00A3BC0C /* Headers */,
+				1583EA9F108395BB00A3BC0C /* Sources */,
+				1583EAA1108395BB00A3BC0C /* Frameworks */,
+				1583EAA5108395BB00A3BC0C /* CopyFiles */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = IPMonitor;
-			productName = IPMonitor;
-			productReference = 159D53EC07528C61004F8947 /* libIPMonitor.a */;
-			productType = "com.apple.product-type.library.static";
+			name = "SCHelper-EmbeddedOther";
+			productInstallPath = /usr/local/bin;
+			productName = SCPreferencesHelper;
+			productReference = 1583EAAA108395BB00A3BC0C /* SCHelper */;
+			productType = "com.apple.product-type.tool";
 		};
-		159D53F207528C79004F8947 /* LinkConfiguration */ = {
+		1583EACA108395BB00A3BC0C /* IPMonitor-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB60E0905594A00EEF749 /* Build configuration list for PBXNativeTarget "LinkConfiguration" */;
+			buildConfigurationList = 1583EAD5108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "IPMonitor-EmbeddedOther" */;
 			buildPhases = (
-				159D53EF07528C79004F8947 /* Headers */,
-				159D53F007528C79004F8947 /* Sources */,
+				1583EACB108395BB00A3BC0C /* Headers */,
+				1583EACF108395BB00A3BC0C /* Sources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = LinkConfiguration;
-			productName = LinkConfiguration;
-			productReference = 159D53F307528C79004F8947 /* libLinkConfiguration.a */;
+			name = "IPMonitor-EmbeddedOther";
+			productName = IPMonitor;
+			productReference = 1583EAD8108395BB00A3BC0C /* libIPMonitor.a */;
 			productType = "com.apple.product-type.library.static";
 		};
-		159D53F907528C95004F8947 /* PreferencesMonitor */ = {
+		1583EAD9108395BB00A3BC0C /* IPMonitor.bundle-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB6160905594A00EEF749 /* Build configuration list for PBXNativeTarget "PreferencesMonitor" */;
+			buildConfigurationList = 1583EADB108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "IPMonitor.bundle-EmbeddedOther" */;
 			buildPhases = (
-				159D53F607528C95004F8947 /* Headers */,
-				159D53F707528C95004F8947 /* Sources */,
+				1583EADA108395BB00A3BC0C /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = PreferencesMonitor;
-			productName = PreferencesMonitor;
-			productReference = 159D53FA07528C95004F8947 /* libPreferencesMonitor.a */;
-			productType = "com.apple.product-type.library.static";
+			name = "IPMonitor.bundle-EmbeddedOther";
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = IPMonitor.bundle;
+			productReference = 1583EADE108395BB00A3BC0C /* IPMonitor.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		159D549F07529FFF004F8947 /* configd */ = {
+		1583EAE0108395BB00A3BC0C /* InterfaceNamer-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB6220905594A00EEF749 /* Build configuration list for PBXNativeTarget "configd" */;
+			buildConfigurationList = 1583EAE4108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "InterfaceNamer-EmbeddedOther" */;
 			buildPhases = (
-				159D54A307529FFF004F8947 /* Headers */,
-				159D54AB07529FFF004F8947 /* Sources */,
-				159D54CA07529FFF004F8947 /* Frameworks */,
-				159D54D507529FFF004F8947 /* CopyFiles */,
-				159D54D707529FFF004F8947 /* CopyFiles */,
+				1583EAE1108395BB00A3BC0C /* Headers */,
+				1583EAE2108395BB00A3BC0C /* Sources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = configd;
-			productInstallPath = /usr/sbin;
-			productName = "configd (Tool)";
-			productReference = 159D54D907529FFF004F8947 /* configd */;
-			productType = "com.apple.product-type.tool";
+			name = "InterfaceNamer-EmbeddedOther";
+			productName = InterfaceNamer;
+			productReference = 1583EAE7108395BB00A3BC0C /* libInterfaceNamer.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		15A5A1E40D5B94190087BDA0 /* SystemConfiguration.framework-EmbeddedSimulator */ = {
+		1583EAE8108395BC00A3BC0C /* InterfaceNamer.bundle-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 15A5A2660D5B94190087BDA0 /* Build configuration list for PBXNativeTarget "SystemConfiguration.framework-EmbeddedSimulator" */;
+			buildConfigurationList = 1583EAEA108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "InterfaceNamer.bundle-EmbeddedOther" */;
 			buildPhases = (
-				15A5A1E60D5B94190087BDA0 /* Headers */,
-				15A5A2170D5B94190087BDA0 /* Update Headers */,
-				15A5A2180D5B94190087BDA0 /* Resources */,
-				15A5A21D0D5B94190087BDA0 /* Sources */,
-				15A5A2620D5B94190087BDA0 /* Frameworks */,
+				1583EAE9108395BC00A3BC0C /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "SystemConfiguration.framework-EmbeddedSimulator";
-			productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
-			productName = "SystemConfiguration (Framework)";
-			productReference = 15A5A26A0D5B94190087BDA0 /* SystemConfiguration.framework */;
-			productType = "com.apple.product-type.framework";
+			name = "InterfaceNamer.bundle-EmbeddedOther";
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = InterfaceNamer.bundle;
+			productReference = 1583EAED108395BC00A3BC0C /* InterfaceNamer.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		15DAD5DF075913CE0084A6ED /* DNSConfiguration */ = {
+		1583EAEF108395BC00A3BC0C /* KernelEventMonitor-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB5DA0905594A00EEF749 /* Build configuration list for PBXNativeTarget "DNSConfiguration" */;
+			buildConfigurationList = 1583EAFC108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "KernelEventMonitor-EmbeddedOther" */;
 			buildPhases = (
-				15DAD5E0075913CE0084A6ED /* Headers */,
-				15DAD5E4075913CE0084A6ED /* Sources */,
-				15DAD5E9075913CE0084A6ED /* Frameworks */,
+				1583EAF0108395BC00A3BC0C /* Headers */,
+				1583EAF6108395BC00A3BC0C /* Sources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = DNSConfiguration;
-			productInstallPath = /usr/local/lib/system;
-			productName = DNSConfiguration;
-			productReference = 15DAD5EE075913CE0084A6ED /* libdnsinfo.a */;
+			name = "KernelEventMonitor-EmbeddedOther";
+			productName = KernelEventMonitor;
+			productReference = 1583EAFF108395BC00A3BC0C /* libKernelEventMonitor.a */;
 			productType = "com.apple.product-type.library.static";
 		};
-		15DAD63F07591A1A0084A6ED /* SystemConfiguration.framework */ = {
+		1583EB00108395BC00A3BC0C /* KernelEventMonitor.bundle-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB5DE0905594A00EEF749 /* Build configuration list for PBXNativeTarget "SystemConfiguration.framework" */;
+			buildConfigurationList = 1583EB02108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "KernelEventMonitor.bundle-EmbeddedOther" */;
 			buildPhases = (
-				15DAD6AC07591A1A0084A6ED /* SystemConfiguration.order */,
-				15DAD64107591A1A0084A6ED /* Headers */,
-				15AC82480D376E2400A579D0 /* Update Headers */,
-				15DAD66807591A1A0084A6ED /* Resources */,
-				15DAD66C07591A1A0084A6ED /* Sources */,
-				15DAD6AD07591A1A0084A6ED /* Frameworks */,
-				15DAD6B007591A1A0084A6ED /* get-mobility-info */,
+				1583EB01108395BC00A3BC0C /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = SystemConfiguration.framework;
-			productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
-			productName = "SystemConfiguration (Framework)";
-			productReference = 1559C4440D349A4E0098FD59 /* SystemConfiguration.framework */;
-			productType = "com.apple.product-type.framework";
+			name = "KernelEventMonitor.bundle-EmbeddedOther";
+			productName = KernelEventMonitor.bundle;
+			productReference = 1583EB05108395BC00A3BC0C /* KernelEventMonitor.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		15FD70FF0754D627001CC321 /* Kicker.bundle */ = {
+		1583EB07108395BC00A3BC0C /* LinkConfiguration-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB60A0905594A00EEF749 /* Build configuration list for PBXNativeTarget "Kicker.bundle" */;
+			buildConfigurationList = 1583EB0B108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "LinkConfiguration-EmbeddedOther" */;
 			buildPhases = (
-				159C9B830DB68F0300BEEF10 /* Headers */,
-				159C9B840DB68F0300BEEF10 /* Sources */,
-				159C9B850DB68F0300BEEF10 /* Frameworks */,
-				15FD71010754D627001CC321 /* Resources */,
+				1583EB08108395BC00A3BC0C /* Headers */,
+				1583EB09108395BC00A3BC0C /* Sources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = Kicker.bundle;
-			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
-			productName = Kicker.bundle;
-			productReference = 15FD71090754D628001CC321 /* Kicker.bundle */;
-			productType = "com.apple.product-type.bundle";
+			name = "LinkConfiguration-EmbeddedOther";
+			productName = LinkConfiguration;
+			productReference = 1583EB0E108395BC00A3BC0C /* libLinkConfiguration.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		15FD72930754DA2B001CC321 /* InterfaceNamer.bundle */ = {
+		1583EB0F108395BC00A3BC0C /* LinkConfiguration.bundle-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB5FA0905594A00EEF749 /* Build configuration list for PBXNativeTarget "InterfaceNamer.bundle" */;
+			buildConfigurationList = 1583EB11108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "LinkConfiguration.bundle-EmbeddedOther" */;
 			buildPhases = (
-				15FD72940754DA2B001CC321 /* Resources */,
+				1583EB10108395BC00A3BC0C /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = InterfaceNamer.bundle;
+			name = "LinkConfiguration.bundle-EmbeddedOther";
 			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
-			productName = InterfaceNamer.bundle;
-			productReference = 15FD72970754DA2B001CC321 /* InterfaceNamer.bundle */;
+			productName = LinkConfiguration.bundle;
+			productReference = 1583EB14108395BC00A3BC0C /* LinkConfiguration.bundle */;
 			productType = "com.apple.product-type.bundle";
 		};
-		15FD72A10754DA4C001CC321 /* IPMonitor.bundle */ = {
+		1583EB16108395BC00A3BC0C /* Logger.bundle-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB5F20905594A00EEF749 /* Build configuration list for PBXNativeTarget "IPMonitor.bundle" */;
+			buildConfigurationList = 1583EB1E108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "Logger.bundle-EmbeddedOther" */;
 			buildPhases = (
-				15FD72A20754DA4C001CC321 /* Resources */,
+				1583EB17108395BC00A3BC0C /* Sources */,
+				1583EB19108395BC00A3BC0C /* Frameworks */,
+				1583EB1D108395BC00A3BC0C /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = IPMonitor.bundle;
-			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
-			productName = IPMonitor.bundle;
-			productReference = 15FD72A50754DA4C001CC321 /* IPMonitor.bundle */;
+			name = "Logger.bundle-EmbeddedOther";
+			productName = Logger.bundle;
+			productReference = 1583EB21108395BC00A3BC0C /* Logger.bundle */;
 			productType = "com.apple.product-type.bundle";
 		};
-		15FD72B10754DA69001CC321 /* LinkConfiguration.bundle */ = {
+		1583EB23108395BD00A3BC0C /* NetworkIdentification-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB6120905594A00EEF749 /* Build configuration list for PBXNativeTarget "LinkConfiguration.bundle" */;
+			buildConfigurationList = 1583EB27108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "NetworkIdentification-EmbeddedOther" */;
 			buildPhases = (
-				15FD72B20754DA69001CC321 /* Resources */,
+				1583EB24108395BD00A3BC0C /* Headers */,
+				1583EB25108395BD00A3BC0C /* Sources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = LinkConfiguration.bundle;
-			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
-			productName = LinkConfiguration.bundle;
-			productReference = 15FD72B50754DA69001CC321 /* LinkConfiguration.bundle */;
-			productType = "com.apple.product-type.bundle";
+			name = "NetworkIdentification-EmbeddedOther";
+			productName = NetworkIdentification;
+			productReference = 1583EB2A108395BD00A3BC0C /* libNetworkIdentification.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		15FD72C50754DA7E001CC321 /* PreferencesMonitor.bundle */ = {
+		1583EB2B108395BD00A3BC0C /* NetworkIdentification.bundle-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB61A0905594A00EEF749 /* Build configuration list for PBXNativeTarget "PreferencesMonitor.bundle" */;
+			buildConfigurationList = 1583EB2D108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "NetworkIdentification.bundle-EmbeddedOther" */;
 			buildPhases = (
-				15FD72C60754DA7E001CC321 /* Resources */,
+				1583EB2C108395BD00A3BC0C /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = PreferencesMonitor.bundle;
+			name = "NetworkIdentification.bundle-EmbeddedOther";
 			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
-			productName = PreferencesMonitor.bundle;
-			productReference = 15FD72C90754DA7E001CC321 /* PreferencesMonitor.bundle */;
+			productName = NetworkIdentification.bundle;
+			productReference = 1583EB30108395BD00A3BC0C /* NetworkIdentification.bundle */;
 			productType = "com.apple.product-type.bundle";
 		};
-		15FD731E0754DB9F001CC321 /* ATconfig.bundle */ = {
+		1583EB32108395BD00A3BC0C /* PreferencesMonitor-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 156EB5EA0905594A00EEF749 /* Build configuration list for PBXNativeTarget "ATconfig.bundle" */;
+			buildConfigurationList = 1583EB36108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "PreferencesMonitor-EmbeddedOther" */;
 			buildPhases = (
-				159C9B2B0DB68E2600BEEF10 /* Headers */,
-				159C9B2C0DB68E2600BEEF10 /* Sources */,
-				159C9B2F0DB68E8300BEEF10 /* Frameworks */,
-				15FD731F0754DB9F001CC321 /* Resources */,
+				1583EB33108395BD00A3BC0C /* Headers */,
+				1583EB34108395BD00A3BC0C /* Sources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = ATconfig.bundle;
-			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
-			productName = ATconfig.bundle;
-			productReference = 15FD73220754DB9F001CC321 /* ATconfig.bundle */;
-			productType = "com.apple.product-type.bundle";
+			name = "PreferencesMonitor-EmbeddedOther";
+			productName = PreferencesMonitor;
+			productReference = 1583EB39108395BD00A3BC0C /* libPreferencesMonitor.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		F95B8A5E0B03F81400993BA3 /* NetworkIdentification */ = {
+		1583EB3A108395BD00A3BC0C /* PreferencesMonitor.bundle-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = F95B8A610B03F83200993BA3 /* Build configuration list for PBXNativeTarget "NetworkIdentification" */;
+			buildConfigurationList = 1583EB3C108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "PreferencesMonitor.bundle-EmbeddedOther" */;
 			buildPhases = (
-				F95B8A5B0B03F81400993BA3 /* Headers */,
-				F95B8A5C0B03F81400993BA3 /* Sources */,
+				1583EB3B108395BD00A3BC0C /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = NetworkIdentification;
-			productName = NetworkIdentification;
-			productReference = F95B8A5F0B03F81400993BA3 /* libNetworkIdentification.a */;
-			productType = "com.apple.product-type.library.static";
+			name = "PreferencesMonitor.bundle-EmbeddedOther";
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = PreferencesMonitor.bundle;
+			productReference = 1583EB3F108395BD00A3BC0C /* PreferencesMonitor.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		F95B8A6A0B03F9D100993BA3 /* NetworkIdentification.bundle */ = {
+		1583EB4B108395BD00A3BC0C /* configd-EmbeddedOther */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = F95B8A6C0B03F9D100993BA3 /* Build configuration list for PBXNativeTarget "NetworkIdentification.bundle" */;
+			buildConfigurationList = 1583EB81108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "configd-EmbeddedOther" */;
 			buildPhases = (
-				F95B8A6B0B03F9D100993BA3 /* Resources */,
+				1583EB4C108395BD00A3BC0C /* Headers */,
+				1583EB54108395BD00A3BC0C /* Sources */,
+				1583EB73108395BD00A3BC0C /* Frameworks */,
+				1583EB7F108395BD00A3BC0C /* CopyFiles */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = NetworkIdentification.bundle;
-			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
-			productName = NetworkIdentification.bundle;
-			productReference = F95B8A700B03F9D100993BA3 /* NetworkIdentification.bundle */;
-			productType = "com.apple.product-type.bundle";
+			name = "configd-EmbeddedOther";
+			productInstallPath = /usr/sbin;
+			productName = "configd (Tool)";
+			productReference = 1583EB84108395BD00A3BC0C /* configd */;
+			productType = "com.apple.product-type.tool";
 		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		15CB6A7705C0722B0099E85F /* Project object */ = {
-			isa = PBXProject;
-			buildConfigurationList = 156EB63E0905594A00EEF749 /* Build configuration list for PBXProject "configd" */;
-			compatibilityVersion = "Xcode 3.1";
-			hasScannedForEncodings = 1;
-			mainGroup = 15CB68FC05C072220099E85F /* configd */;
-			productRefGroup = 15CB690F05C0722B0099E85F /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				15CB690005C0722A0099E85F /* All */,
-				15C64A1E0F684C3300D78394 /* configd_libSystem */,
-				15DAD5DF075913CE0084A6ED /* DNSConfiguration */,
-				157BB8AE075924360025DA7A /* configd_base */,
-				15DAD63F07591A1A0084A6ED /* SystemConfiguration.framework */,
-				1547001808455B98006787CE /* SCHelper */,
-				159D542007528E7C004F8947 /* configd_plugins */,
-				15FD731E0754DB9F001CC321 /* ATconfig.bundle */,
-				159D53EB07528C61004F8947 /* IPMonitor */,
-				15FD72A10754DA4C001CC321 /* IPMonitor.bundle */,
-				159D53E407528C4A004F8947 /* InterfaceNamer */,
-				15FD72930754DA2B001CC321 /* InterfaceNamer.bundle */,
-				159D53D307528BDA004F8947 /* KernelEventMonitor */,
-				15828AE60753B5F900AD4710 /* KernelEventMonitor.bundle */,
-				15FD70FF0754D627001CC321 /* Kicker.bundle */,
-				159D53F207528C79004F8947 /* LinkConfiguration */,
-				15FD72B10754DA69001CC321 /* LinkConfiguration.bundle */,
-				15213FF90E93E9F500DACD2C /* Logger.bundle */,
-				F95B8A5E0B03F81400993BA3 /* NetworkIdentification */,
-				F95B8A6A0B03F9D100993BA3 /* NetworkIdentification.bundle */,
-				159D53F907528C95004F8947 /* PreferencesMonitor */,
-				15FD72C50754DA7E001CC321 /* PreferencesMonitor.bundle */,
-				155847FA07550D210046C2E9 /* configd_executables */,
-				159D549F07529FFF004F8947 /* configd */,
-				1558481207550EC10046C2E9 /* scselect */,
-				155847430754FDCD0046C2E9 /* scutil */,
-				151F5D990CCE98E50093AC3B /* SCMonitor */,
-				151C1CC60CFB487000C5AFD6 /* All-Embedded */,
-				15C64A280F684C6B00D78394 /* configd_libSystem-Embedded */,
-				157A84D80D56C63900B6F1A0 /* DNSConfiguration-Embedded */,
-				158316CF0CFB774B006F62B9 /* configd_base-Embedded */,
-				1572C4A60CFB55B400E2776E /* SystemConfiguration.framework-Embedded */,
-				158337990CFB6B9E0033AB93 /* SCHelper-Embedded */,
-				158316E30CFB7761006F62B9 /* configd_plugins-Embedded */,
-				157A84F40D56C7E800B6F1A0 /* IPMonitor-Embedded */,
-				1583177D0CFB85C8006F62B9 /* IPMonitor.bundle-Embedded */,
-				157A85050D56C8AA00B6F1A0 /* InterfaceNamer-Embedded */,
-				158317870CFB85DD006F62B9 /* InterfaceNamer.bundle-Embedded */,
-				157A85100D56C8E000B6F1A0 /* KernelEventMonitor-Embedded */,
-				158317900CFB85F7006F62B9 /* KernelEventMonitor.bundle-Embedded */,
-				157A85260D56C91100B6F1A0 /* LinkConfiguration-Embedded */,
-				158317980CFB860C006F62B9 /* LinkConfiguration.bundle-Embedded */,
-				156CA4790EF853BB00C59A18 /* Logger.bundle-Embedded */,
-				157A85310D56C94F00B6F1A0 /* NetworkIdentification-Embedded */,
-				158317A00CFB8626006F62B9 /* NetworkIdentification.bundle-Embedded */,
-				157A853C0D56C96F00B6F1A0 /* PreferencesMonitor-Embedded */,
-				158317A80CFB8639006F62B9 /* PreferencesMonitor.bundle-Embedded */,
-				158317040CFB7782006F62B9 /* configd_executables-Embedded */,
-				158317230CFB80A1006F62B9 /* configd-Embedded */,
-				157433DD0D4A8122002ACA73 /* scselect-Embedded */,
-				157433F00D4A8137002ACA73 /* scutil-Embedded */,
-				15FD13BF0D59485000F9409C /* All-EmbeddedSimulator */,
-				151FE2DD0D5B7046000D6DB1 /* configd_base-EmbeddedSimulator */,
-				15A5A1E40D5B94190087BDA0 /* SystemConfiguration.framework-EmbeddedSimulator */,
-				151F63DA09328A3C0096DCC9 /* Schema */,
+		1583EB86108395BE00A3BC0C /* scselect-EmbeddedOther */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1583EB8D108395BE00A3BC0C /* Build configuration list for PBXNativeTarget "scselect-EmbeddedOther" */;
+			buildPhases = (
+				1583EB87108395BE00A3BC0C /* Headers */,
+				1583EB88108395BE00A3BC0C /* Sources */,
+				1583EB8A108395BE00A3BC0C /* Frameworks */,
 			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		151F5D960CCE98E50093AC3B /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				15FEE81F0CD03E75001312F9 /* Localizable.strings in Resources */,
+			buildRules = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		15213FF60E93E9F500DACD2C /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = "scselect-EmbeddedOther";
+			productInstallPath = /usr/sbin;
+			productName = "scselect (Tool)";
+			productReference = 1583EB90108395BE00A3BC0C /* scselect */;
+			productType = "com.apple.product-type.tool";
 		};
-		156CA4810EF853BB00C59A18 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		1583EB92108395BE00A3BC0C /* scutil-EmbeddedOther */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1583EBB3108395BE00A3BC0C /* Build configuration list for PBXNativeTarget "scutil-EmbeddedOther" */;
+			buildPhases = (
+				1583EB93108395BE00A3BC0C /* Headers */,
+				1583EBA1108395BE00A3BC0C /* Sources */,
+				1583EBAF108395BE00A3BC0C /* Frameworks */,
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1572C4D90CFB55B400E2776E /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1572C4DA0CFB55B400E2776E /* Localizable.strings in Resources */,
-				1572C4DB0CFB55B400E2776E /* NetworkInterface.strings in Resources */,
-				1572C4DC0CFB55B400E2776E /* NetworkConfiguration.plist in Resources */,
-				1572C4DD0CFB55B400E2776E /* get-mobility-info in Resources */,
+			buildRules = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		15828AE30753B5F900AD4710 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = "scutil-EmbeddedOther";
+			productInstallPath = /usr/sbin;
+			productName = "scutil (Tool)";
+			productReference = 1583EBB6108395BE00A3BC0C /* scutil */;
+			productType = "com.apple.product-type.tool";
 		};
-		1583177E0CFB85C8006F62B9 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		159D53D307528BDA004F8947 /* KernelEventMonitor */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB6020905594A00EEF749 /* Build configuration list for PBXNativeTarget "KernelEventMonitor" */;
+			buildPhases = (
+				159D53D007528BDA004F8947 /* Headers */,
+				159D53D107528BDA004F8947 /* Sources */,
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		158317880CFB85DD006F62B9 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			buildRules = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		158317910CFB85F7006F62B9 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = KernelEventMonitor;
+			productName = KernelEventMonitor;
+			productReference = 159D53D407528BDA004F8947 /* libKernelEventMonitor.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		158317990CFB860C006F62B9 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		159D53E407528C4A004F8947 /* InterfaceNamer */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB5F60905594A00EEF749 /* Build configuration list for PBXNativeTarget "InterfaceNamer" */;
+			buildPhases = (
+				159D53E107528C4A004F8947 /* Headers */,
+				159D53E207528C4A004F8947 /* Sources */,
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		158317A10CFB8626006F62B9 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			buildRules = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		158317A90CFB8639006F62B9 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = InterfaceNamer;
+			productName = InterfaceNamer;
+			productReference = 159D53E507528C4A004F8947 /* libInterfaceNamer.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		15A5A2180D5B94190087BDA0 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				15A5A2190D5B94190087BDA0 /* Localizable.strings in Resources */,
-				15A5A21A0D5B94190087BDA0 /* NetworkInterface.strings in Resources */,
-				15A5A21B0D5B94190087BDA0 /* NetworkConfiguration.plist in Resources */,
+		159D53EB07528C61004F8947 /* IPMonitor */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB5EE0905594A00EEF749 /* Build configuration list for PBXNativeTarget "IPMonitor" */;
+			buildPhases = (
+				159D53E807528C61004F8947 /* Headers */,
+				159D53E907528C61004F8947 /* Sources */,
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		15DAD66807591A1A0084A6ED /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				15A6F7C40A4B266D00B907EA /* Localizable.strings in Resources */,
-				15DAD66B07591A1A0084A6ED /* NetworkInterface.strings in Resources */,
-				15DAD66907591A1A0084A6ED /* NetworkConfiguration.plist in Resources */,
-				15DAD66A07591A1A0084A6ED /* get-mobility-info in Resources */,
+			buildRules = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		15FD71010754D627001CC321 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				158ADD190754F1F100124717 /* Kicker.xml in Resources */,
-				158ADD1B0754F1F400124717 /* enable-network in Resources */,
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = IPMonitor;
+			productName = IPMonitor;
+			productReference = 159D53EC07528C61004F8947 /* libIPMonitor.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		15FD72940754DA2B001CC321 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		159D53F207528C79004F8947 /* LinkConfiguration */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB60E0905594A00EEF749 /* Build configuration list for PBXNativeTarget "LinkConfiguration" */;
+			buildPhases = (
+				159D53EF07528C79004F8947 /* Headers */,
+				159D53F007528C79004F8947 /* Sources */,
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		15FD72A20754DA4C001CC321 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			buildRules = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		15FD72B20754DA69001CC321 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = LinkConfiguration;
+			productName = LinkConfiguration;
+			productReference = 159D53F307528C79004F8947 /* libLinkConfiguration.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-		15FD72C60754DA7E001CC321 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		159D53F907528C95004F8947 /* PreferencesMonitor */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB6160905594A00EEF749 /* Build configuration list for PBXNativeTarget "PreferencesMonitor" */;
+			buildPhases = (
+				159D53F607528C95004F8947 /* Headers */,
+				159D53F707528C95004F8947 /* Sources */,
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		15FD731F0754DB9F001CC321 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			buildRules = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		F95B8A6B0B03F9D100993BA3 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = PreferencesMonitor;
+			productName = PreferencesMonitor;
+			productReference = 159D53FA07528C95004F8947 /* libPreferencesMonitor.a */;
+			productType = "com.apple.product-type.library.static";
 		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
-		151F63DB09328A3C0096DCC9 /* ShellScript */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		159D549F07529FFF004F8947 /* configd */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB6220905594A00EEF749 /* Build configuration list for PBXNativeTarget "configd" */;
+			buildPhases = (
+				159D54A307529FFF004F8947 /* Headers */,
+				159D54AB07529FFF004F8947 /* Sources */,
+				159D54CA07529FFF004F8947 /* Frameworks */,
+				159D54D507529FFF004F8947 /* CopyFiles */,
+				159D54D707529FFF004F8947 /* CopyFiles */,
 			);
-			inputPaths = (
-				SystemConfiguration.fproj/genSCPreferences.c,
+			buildRules = (
 			);
-			outputPaths = (
-				"${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.h",
-				"${BUILT_PRODUCTS_DIR}/SCSchemaDefinitionsPrivate.h",
-				"${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.c",
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "echo ${BUILT_PRODUCTS_DIR}\ncc -o ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} ${SRCROOT}/SystemConfiguration.fproj/genSCPreferences.c || exit 1\n${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} header   > ${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.h        || exit 1\n${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} private  > ${BUILT_PRODUCTS_DIR}/SCSchemaDefinitionsPrivate.h || exit 1\n${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} cfile    > ${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.c        || exit 1\nexit 0";
+			name = configd;
+			productInstallPath = /usr/sbin;
+			productName = "configd (Tool)";
+			productReference = 159D54D907529FFF004F8947 /* configd */;
+			productType = "com.apple.product-type.tool";
 		};
-		153393E40D34999D00FE74E7 /* Update Headers */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		15A5A1E40D5B94190087BDA0 /* SystemConfiguration.framework-EmbeddedSimulator */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 15A5A2660D5B94190087BDA0 /* Build configuration list for PBXNativeTarget "SystemConfiguration.framework-EmbeddedSimulator" */;
+			buildPhases = (
+				15A5A1E60D5B94190087BDA0 /* Headers */,
+				15A5A2170D5B94190087BDA0 /* Update Headers */,
+				15A5A2180D5B94190087BDA0 /* Resources */,
+				15A5A21D0D5B94190087BDA0 /* Sources */,
+				15A5A2620D5B94190087BDA0 /* Frameworks */,
 			);
-			inputPaths = (
-				"$(SRCROOT)/SystemConfiguration.fproj/update-headers",
+			buildRules = (
 			);
-			name = "Update Headers";
-			outputPaths = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "if [ -x ${SCRIPT_INPUT_FILE_0} ]; then\n\t${SCRIPT_INPUT_FILE_0} split\nfi\n";
-			showEnvVarsInLog = 0;
+			name = "SystemConfiguration.framework-EmbeddedSimulator";
+			productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
+			productName = "SystemConfiguration (Framework)";
+			productReference = 15A5A26A0D5B94190087BDA0 /* SystemConfiguration.framework */;
+			productType = "com.apple.product-type.framework";
 		};
-		1572C5270CFB55B400E2776E /* get-mobility-info */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 8;
-			files = (
+		15DAD5DF075913CE0084A6ED /* DNSConfiguration */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB5DA0905594A00EEF749 /* Build configuration list for PBXNativeTarget "DNSConfiguration" */;
+			buildPhases = (
+				15DAD5E0075913CE0084A6ED /* Headers */,
+				15DAD5E4075913CE0084A6ED /* Sources */,
+				15DAD5E9075913CE0084A6ED /* Frameworks */,
 			);
-			inputPaths = (
+			buildRules = (
 			);
-			name = "get-mobility-info";
-			outputPaths = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 1;
-			shellPath = /bin/sh;
-			shellScript = "mkdir -p \"${DSTROOT}/usr/local/bin\"\nln -fs \"${INSTALL_PATH}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/get-mobility-info\" \"${DSTROOT}/usr/local/bin/\"\n";
-			showEnvVarsInLog = 0;
+			name = DNSConfiguration;
+			productInstallPath = /usr/local/lib/system;
+			productName = DNSConfiguration;
+			productReference = 15DAD5EE075913CE0084A6ED /* libdnsinfo.dylib */;
+			productType = "com.apple.product-type.library.dynamic";
 		};
-		15A5A2170D5B94190087BDA0 /* Update Headers */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		15DAD63F07591A1A0084A6ED /* SystemConfiguration.framework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB5DE0905594A00EEF749 /* Build configuration list for PBXNativeTarget "SystemConfiguration.framework" */;
+			buildPhases = (
+				15DAD6AC07591A1A0084A6ED /* SystemConfiguration.order */,
+				15DAD64107591A1A0084A6ED /* Headers */,
+				15AC82480D376E2400A579D0 /* Update Headers */,
+				15DAD66807591A1A0084A6ED /* Resources */,
+				15DAD66C07591A1A0084A6ED /* Sources */,
+				15DAD6AD07591A1A0084A6ED /* Frameworks */,
+				15DAD6B007591A1A0084A6ED /* get-mobility-info */,
+				15D9DCF910DD909F004E545D /* CopyFiles */,
 			);
-			inputPaths = (
-				"$(SRCROOT)/SystemConfiguration.fproj/update-headers",
+			buildRules = (
 			);
-			name = "Update Headers";
-			outputPaths = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "if [ -x ${SCRIPT_INPUT_FILE_0} ]; then\n\t${SCRIPT_INPUT_FILE_0} split\nfi\n";
-			showEnvVarsInLog = 0;
+			name = SystemConfiguration.framework;
+			productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
+			productName = "SystemConfiguration (Framework)";
+			productReference = 1559C4440D349A4E0098FD59 /* SystemConfiguration.framework */;
+			productType = "com.apple.product-type.framework";
 		};
-		15AC82480D376E2400A579D0 /* Update Headers */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		15FD72930754DA2B001CC321 /* InterfaceNamer.bundle */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB5FA0905594A00EEF749 /* Build configuration list for PBXNativeTarget "InterfaceNamer.bundle" */;
+			buildPhases = (
+				15FD72940754DA2B001CC321 /* Resources */,
 			);
-			inputPaths = (
-				"$(SRCROOT)/SystemConfiguration.fproj/update-headers",
+			buildRules = (
 			);
-			name = "Update Headers";
-			outputPaths = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "if [ -x ${SCRIPT_INPUT_FILE_0} ]; then\n\t${SCRIPT_INPUT_FILE_0} clean\nfi\n";
-			showEnvVarsInLog = 0;
+			name = InterfaceNamer.bundle;
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = InterfaceNamer.bundle;
+			productReference = 15FD72970754DA2B001CC321 /* InterfaceNamer.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		15BED7930F6853F800016614 /* OLD libdnsinfo.a */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 8;
-			files = (
+		15FD72A10754DA4C001CC321 /* IPMonitor.bundle */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB5F20905594A00EEF749 /* Build configuration list for PBXNativeTarget "IPMonitor.bundle" */;
+			buildPhases = (
+				15FD72A20754DA4C001CC321 /* Resources */,
 			);
-			inputPaths = (
+			buildRules = (
 			);
-			name = "OLD libdnsinfo.a";
-			outputPaths = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 1;
-			shellPath = /bin/sh;
-			shellScript = "if [ -f \"${INSTALL_DIR}/libdnsinfo.a\" ]; then\n\tln -f \"${INSTALL_DIR}/libdnsinfo.a\" \"${INSTALL_DIR}/../libdnsinfo.a\"\nfi";
-			showEnvVarsInLog = 0;
+			name = IPMonitor.bundle;
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = IPMonitor.bundle;
+			productReference = 15FD72A50754DA4C001CC321 /* IPMonitor.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		15BED7A20F68551200016614 /* OLD libdnsinfo.a */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 8;
-			files = (
+		15FD72B10754DA69001CC321 /* LinkConfiguration.bundle */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB6120905594A00EEF749 /* Build configuration list for PBXNativeTarget "LinkConfiguration.bundle" */;
+			buildPhases = (
+				15FD72B20754DA69001CC321 /* Resources */,
 			);
-			inputPaths = (
+			buildRules = (
 			);
-			name = "OLD libdnsinfo.a";
-			outputPaths = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 1;
-			shellPath = /bin/sh;
-			shellScript = "if [ -f \"${INSTALL_DIR}/libdnsinfo.a\" ]; then\n\tln -f \"${INSTALL_DIR}/libdnsinfo.a\" \"${INSTALL_DIR}/../libdnsinfo.a\"\nfi";
-			showEnvVarsInLog = 0;
+			name = LinkConfiguration.bundle;
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = LinkConfiguration.bundle;
+			productReference = 15FD72B50754DA69001CC321 /* LinkConfiguration.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		15DAD6AC07591A1A0084A6ED /* SystemConfiguration.order */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+		15FD72C50754DA7E001CC321 /* PreferencesMonitor.bundle */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 156EB61A0905594A00EEF749 /* Build configuration list for PBXNativeTarget "PreferencesMonitor.bundle" */;
+			buildPhases = (
+				15FD72C60754DA7E001CC321 /* Resources */,
 			);
-			inputPaths = (
-				/usr/local/lib/OrderFiles/SystemConfiguration.order,
+			buildRules = (
 			);
-			name = SystemConfiguration.order;
-			outputPaths = (
-				"${OBJROOT}/SystemConfiguration.order",
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "if [ -r /usr/local/lib/OrderFiles/SystemConfiguration.order ]; then\n\tcp /usr/local/lib/OrderFiles/SystemConfiguration.order ${OBJROOT}/SystemConfiguration.order\nelse\n\ttouch ${OBJROOT}/SystemConfiguration.order\nfi";
-			showEnvVarsInLog = 0;
+			name = PreferencesMonitor.bundle;
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = PreferencesMonitor.bundle;
+			productReference = 15FD72C90754DA7E001CC321 /* PreferencesMonitor.bundle */;
+			productType = "com.apple.product-type.bundle";
 		};
-		15DAD6B007591A1A0084A6ED /* get-mobility-info */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 8;
-			files = (
+		F95B8A5E0B03F81400993BA3 /* NetworkIdentification */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = F95B8A610B03F83200993BA3 /* Build configuration list for PBXNativeTarget "NetworkIdentification" */;
+			buildPhases = (
+				F95B8A5B0B03F81400993BA3 /* Headers */,
+				F95B8A5C0B03F81400993BA3 /* Sources */,
 			);
-			inputPaths = (
+			buildRules = (
 			);
-			name = "get-mobility-info";
-			outputPaths = (
+			dependencies = (
 			);
-			runOnlyForDeploymentPostprocessing = 1;
-			shellPath = /bin/sh;
-			shellScript = "mkdir -p \"${DSTROOT}/usr/local/bin\"\nln -fs \"${INSTALL_PATH}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/get-mobility-info\" \"${DSTROOT}/usr/local/bin/\"\n";
-			showEnvVarsInLog = 0;
-		};
-/* End PBXShellScriptBuildPhase section */
+			name = NetworkIdentification;
+			productName = NetworkIdentification;
+			productReference = F95B8A5F0B03F81400993BA3 /* libNetworkIdentification.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		F95B8A6A0B03F9D100993BA3 /* NetworkIdentification.bundle */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = F95B8A6C0B03F9D100993BA3 /* Build configuration list for PBXNativeTarget "NetworkIdentification.bundle" */;
+			buildPhases = (
+				F95B8A6B0B03F9D100993BA3 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = NetworkIdentification.bundle;
+			productInstallPath = "$(USER_LIBRARY_DIR)/Bundles";
+			productName = NetworkIdentification.bundle;
+			productReference = F95B8A700B03F9D100993BA3 /* NetworkIdentification.bundle */;
+			productType = "com.apple.product-type.bundle";
+		};
+/* End PBXNativeTarget section */
 
-/* Begin PBXSourcesBuildPhase section */
-		151F5D970CCE98E50093AC3B /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+/* Begin PBXProject section */
+		15CB6A7705C0722B0099E85F /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = 156EB63E0905594A00EEF749 /* Build configuration list for PBXProject "configd" */;
+			compatibilityVersion = "Xcode 3.1";
+			developmentRegion = English;
+			hasScannedForEncodings = 1;
+			knownRegions = (
+				English,
+				Japanese,
+				French,
+				German,
+			);
+			mainGroup = 15CB68FC05C072220099E85F /* configd */;
+			productRefGroup = 15CB690F05C0722B0099E85F /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				15CB690005C0722A0099E85F /* All */,
+				15C64A1E0F684C3300D78394 /* configd_libSystem */,
+				15DAD5DF075913CE0084A6ED /* DNSConfiguration */,
+				157BB8AE075924360025DA7A /* configd_base */,
+				15DAD63F07591A1A0084A6ED /* SystemConfiguration.framework */,
+				1547001808455B98006787CE /* SCHelper */,
+				159D542007528E7C004F8947 /* configd_plugins */,
+				159D53EB07528C61004F8947 /* IPMonitor */,
+				15FD72A10754DA4C001CC321 /* IPMonitor.bundle */,
+				159D53E407528C4A004F8947 /* InterfaceNamer */,
+				15FD72930754DA2B001CC321 /* InterfaceNamer.bundle */,
+				159D53D307528BDA004F8947 /* KernelEventMonitor */,
+				15828AE60753B5F900AD4710 /* KernelEventMonitor.bundle */,
+				159D53F207528C79004F8947 /* LinkConfiguration */,
+				15FD72B10754DA69001CC321 /* LinkConfiguration.bundle */,
+				15213FF90E93E9F500DACD2C /* Logger.bundle */,
+				F95B8A5E0B03F81400993BA3 /* NetworkIdentification */,
+				F95B8A6A0B03F9D100993BA3 /* NetworkIdentification.bundle */,
+				159D53F907528C95004F8947 /* PreferencesMonitor */,
+				15FD72C50754DA7E001CC321 /* PreferencesMonitor.bundle */,
+				155847FA07550D210046C2E9 /* configd_executables */,
+				159D549F07529FFF004F8947 /* configd */,
+				1558481207550EC10046C2E9 /* scselect */,
+				155847430754FDCD0046C2E9 /* scutil */,
+				151F5D990CCE98E50093AC3B /* SCMonitor */,
+				151C1CC60CFB487000C5AFD6 /* All-Embedded */,
+				15C64A280F684C6B00D78394 /* configd_libSystem-Embedded */,
+				157A84D80D56C63900B6F1A0 /* DNSConfiguration-Embedded */,
+				158316CF0CFB774B006F62B9 /* configd_base-Embedded */,
+				1572C4A60CFB55B400E2776E /* SystemConfiguration.framework-Embedded */,
+				158337990CFB6B9E0033AB93 /* SCHelper-Embedded */,
+				158316E30CFB7761006F62B9 /* configd_plugins-Embedded */,
+				157A84F40D56C7E800B6F1A0 /* IPMonitor-Embedded */,
+				1583177D0CFB85C8006F62B9 /* IPMonitor.bundle-Embedded */,
+				157A85050D56C8AA00B6F1A0 /* InterfaceNamer-Embedded */,
+				158317870CFB85DD006F62B9 /* InterfaceNamer.bundle-Embedded */,
+				157A85100D56C8E000B6F1A0 /* KernelEventMonitor-Embedded */,
+				158317900CFB85F7006F62B9 /* KernelEventMonitor.bundle-Embedded */,
+				157A85260D56C91100B6F1A0 /* LinkConfiguration-Embedded */,
+				158317980CFB860C006F62B9 /* LinkConfiguration.bundle-Embedded */,
+				156CA4790EF853BB00C59A18 /* Logger.bundle-Embedded */,
+				157A85310D56C94F00B6F1A0 /* NetworkIdentification-Embedded */,
+				158317A00CFB8626006F62B9 /* NetworkIdentification.bundle-Embedded */,
+				157A853C0D56C96F00B6F1A0 /* PreferencesMonitor-Embedded */,
+				158317A80CFB8639006F62B9 /* PreferencesMonitor.bundle-Embedded */,
+				158317040CFB7782006F62B9 /* configd_executables-Embedded */,
+				158317230CFB80A1006F62B9 /* configd-Embedded */,
+				157433DD0D4A8122002ACA73 /* scselect-Embedded */,
+				157433F00D4A8137002ACA73 /* scutil-Embedded */,
+				15FD13BF0D59485000F9409C /* All-EmbeddedSimulator */,
+				151FE2DD0D5B7046000D6DB1 /* configd_base-EmbeddedSimulator */,
+				15A5A1E40D5B94190087BDA0 /* SystemConfiguration.framework-EmbeddedSimulator */,
+				151F63DA09328A3C0096DCC9 /* Schema */,
+				1583E9E01083959E00A3BC0C /* All-EmbeddedOther */,
+				1583E9FD108395BB00A3BC0C /* configd_libSystem-EmbeddedOther */,
+				1583EA04108395BB00A3BC0C /* DNSConfiguration-EmbeddedOther */,
+				1583EA11108395BB00A3BC0C /* configd_base-EmbeddedOther */,
+				1583EA19108395BB00A3BC0C /* SystemConfiguration.framework-EmbeddedOther */,
+				1583EA9B108395BB00A3BC0C /* SCHelper-EmbeddedOther */,
+				1583EAAC108395BB00A3BC0C /* configd_plugins-EmbeddedOther */,
+				1583EACA108395BB00A3BC0C /* IPMonitor-EmbeddedOther */,
+				1583EAD9108395BB00A3BC0C /* IPMonitor.bundle-EmbeddedOther */,
+				1583EAE0108395BB00A3BC0C /* InterfaceNamer-EmbeddedOther */,
+				1583EAE8108395BC00A3BC0C /* InterfaceNamer.bundle-EmbeddedOther */,
+				1583EAEF108395BC00A3BC0C /* KernelEventMonitor-EmbeddedOther */,
+				1583EB00108395BC00A3BC0C /* KernelEventMonitor.bundle-EmbeddedOther */,
+				1583EB07108395BC00A3BC0C /* LinkConfiguration-EmbeddedOther */,
+				1583EB0F108395BC00A3BC0C /* LinkConfiguration.bundle-EmbeddedOther */,
+				1583EB16108395BC00A3BC0C /* Logger.bundle-EmbeddedOther */,
+				1583EB23108395BD00A3BC0C /* NetworkIdentification-EmbeddedOther */,
+				1583EB2B108395BD00A3BC0C /* NetworkIdentification.bundle-EmbeddedOther */,
+				1583EB32108395BD00A3BC0C /* PreferencesMonitor-EmbeddedOther */,
+				1583EB3A108395BD00A3BC0C /* PreferencesMonitor.bundle-EmbeddedOther */,
+				1583EB41108395BD00A3BC0C /* configd_executables-EmbeddedOther */,
+				1583EB4B108395BD00A3BC0C /* configd-EmbeddedOther */,
+				1583EB86108395BE00A3BC0C /* scselect-EmbeddedOther */,
+				1583EB92108395BE00A3BC0C /* scutil-EmbeddedOther */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		151F5D960CCE98E50093AC3B /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				15FC130B0CCEA59E0013872C /* monitor.c in Sources */,
+				15FEE81F0CD03E75001312F9 /* Localizable.strings in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		15213FF70E93E9F500DACD2C /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15213FF60E93E9F500DACD2C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				152140020E93EC6500DACD2C /* logger.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		1547001A08455B98006787CE /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		156CA4810EF853BB00C59A18 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				15DAF2E108466D4900D1B2BD /* SCHelper_server.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		155847540754FDCD0046C2E9 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1572C4D90CFB55B400E2776E /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				155847550754FDCD0046C2E9 /* scutil.c in Sources */,
-				155847560754FDCD0046C2E9 /* commands.c in Sources */,
-				155847570754FDCD0046C2E9 /* dictionary.c in Sources */,
-				155847580754FDCD0046C2E9 /* session.c in Sources */,
-				155847590754FDCD0046C2E9 /* cache.c in Sources */,
-				1558475A0754FDCD0046C2E9 /* notifications.c in Sources */,
-				1558475B0754FDCD0046C2E9 /* tests.c in Sources */,
-				1558475C0754FDCD0046C2E9 /* prefs.c in Sources */,
-				1558475D0754FDCD0046C2E9 /* net.c in Sources */,
-				1558475E0754FDCD0046C2E9 /* net_interface.c in Sources */,
-				1558475F0754FDCD0046C2E9 /* net_protocol.c in Sources */,
-				155847600754FDCD0046C2E9 /* net_service.c in Sources */,
-				155847610754FDCD0046C2E9 /* net_set.c in Sources */,
+				1572C4DA0CFB55B400E2776E /* Localizable.strings in Resources */,
+				1572C4DB0CFB55B400E2776E /* NetworkInterface.strings in Resources */,
+				1572C4DC0CFB55B400E2776E /* NetworkConfiguration.plist in Resources */,
+				1572C4DD0CFB55B400E2776E /* get-mobility-info in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		1558481507550EC10046C2E9 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15828AE30753B5F900AD4710 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1558481607550EC10046C2E9 /* scselect.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		156CA47A0EF853BB00C59A18 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583177E0CFB85C8006F62B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				156CA47B0EF853BB00C59A18 /* logger.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		1572C4DE0CFB55B400E2776E /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		158317880CFB85DD006F62B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1572C4DF0CFB55B400E2776E /* SCSchemaDefinitions.c in Sources */,
-				1572C4E00CFB55B400E2776E /* SCD.c in Sources */,
-				1572C4E10CFB55B400E2776E /* SCDKeys.c in Sources */,
-				1572C4E20CFB55B400E2776E /* SCDPrivate.c in Sources */,
-				1572C4E30CFB55B400E2776E /* SCDPlugin.c in Sources */,
-				1572C4E40CFB55B400E2776E /* SCDOpen.c in Sources */,
-				1572C4E50CFB55B400E2776E /* SCDLock.c in Sources */,
-				1572C4E60CFB55B400E2776E /* SCDUnlock.c in Sources */,
-				1572C4E70CFB55B400E2776E /* SCDList.c in Sources */,
-				1572C4E80CFB55B400E2776E /* SCDAdd.c in Sources */,
-				1572C4E90CFB55B400E2776E /* SCDGet.c in Sources */,
-				1572C4EA0CFB55B400E2776E /* SCDSet.c in Sources */,
-				1572C4EB0CFB55B400E2776E /* SCDRemove.c in Sources */,
-				1572C4EC0CFB55B400E2776E /* SCDTouch.c in Sources */,
-				1572C4ED0CFB55B400E2776E /* SCDNotify.c in Sources */,
-				1572C4EE0CFB55B400E2776E /* SCDNotifierSetKeys.c in Sources */,
-				1572C4EF0CFB55B400E2776E /* SCDNotifierAdd.c in Sources */,
-				1572C4F00CFB55B400E2776E /* SCDNotifierRemove.c in Sources */,
-				1572C4F10CFB55B400E2776E /* SCDNotifierGetChanges.c in Sources */,
-				1572C4F20CFB55B400E2776E /* SCDNotifierWait.c in Sources */,
-				1572C4F30CFB55B400E2776E /* SCDNotifierInformViaCallback.c in Sources */,
-				1572C4F40CFB55B400E2776E /* SCDNotifierInformViaMachPort.c in Sources */,
-				1572C4F50CFB55B400E2776E /* SCDNotifierInformViaFD.c in Sources */,
-				1572C4F60CFB55B400E2776E /* SCDNotifierInformViaSignal.c in Sources */,
-				1572C4F70CFB55B400E2776E /* SCDNotifierCancel.c in Sources */,
-				1572C4F80CFB55B400E2776E /* SCDSnapshot.c in Sources */,
-				1572C4F90CFB55B400E2776E /* SCP.c in Sources */,
-				1572C4FA0CFB55B400E2776E /* SCPOpen.c in Sources */,
-				1572C4FB0CFB55B400E2776E /* SCPLock.c in Sources */,
-				1572C4FC0CFB55B400E2776E /* SCPUnlock.c in Sources */,
-				1572C4FD0CFB55B400E2776E /* SCPList.c in Sources */,
-				1572C4FE0CFB55B400E2776E /* SCPGet.c in Sources */,
-				1572C4FF0CFB55B400E2776E /* SCPAdd.c in Sources */,
-				1572C5000CFB55B400E2776E /* SCPSet.c in Sources */,
-				1572C5010CFB55B400E2776E /* SCPRemove.c in Sources */,
-				1572C5020CFB55B400E2776E /* SCPCommit.c in Sources */,
-				1572C5030CFB55B400E2776E /* SCPApply.c in Sources */,
-				1572C5040CFB55B400E2776E /* SCPPath.c in Sources */,
-				1572C5060CFB55B400E2776E /* SCDHostName.c in Sources */,
-				1572C5070CFB55B400E2776E /* SCLocation.c in Sources */,
-				1572C5080CFB55B400E2776E /* SCNetwork.c in Sources */,
-				1572C5090CFB55B400E2776E /* pppcontroller.defs in Sources */,
-				1572C50A0CFB55B400E2776E /* SCNetworkConnection.c in Sources */,
-				1572C50B0CFB55B400E2776E /* SCNetworkConnectionPrivate.c in Sources */,
-				1572C50C0CFB55B400E2776E /* SCNetworkReachability.c in Sources */,
-				1572C50D0CFB55B400E2776E /* SCProxies.c in Sources */,
-				1572C50E0CFB55B400E2776E /* DHCP.c in Sources */,
-				1572C50F0CFB55B400E2776E /* moh.c in Sources */,
-				1572C5100CFB55B400E2776E /* DeviceOnHold.c in Sources */,
-				1572C5110CFB55B400E2776E /* LinkConfiguration.c in Sources */,
-				1572C5120CFB55B400E2776E /* dy_framework.c in Sources */,
-				1572C5140CFB55B400E2776E /* config.defs in Sources */,
-				1572C5150CFB55B400E2776E /* SCPreferencesPathKey.c in Sources */,
-				1572C5160CFB55B400E2776E /* dnsinfo_private.c in Sources */,
-				1572C5170CFB55B400E2776E /* dnsinfo_copy.c in Sources */,
-				1572C5180CFB55B400E2776E /* shared_dns_info.defs in Sources */,
-				1572C5190CFB55B400E2776E /* SCNetworkConfigurationInternal.c in Sources */,
-				1572C51A0CFB55B400E2776E /* SCNetworkInterface.c in Sources */,
-				1572C51B0CFB55B400E2776E /* SCNetworkProtocol.c in Sources */,
-				1572C51C0CFB55B400E2776E /* SCNetworkService.c in Sources */,
-				1572C51D0CFB55B400E2776E /* SCNetworkSet.c in Sources */,
-				1572C51F0CFB55B400E2776E /* helper_comm.c in Sources */,
-				1572C5200CFB55B400E2776E /* SCHelper_client.c in Sources */,
-				1572C5210CFB55B400E2776E /* SCPreferencesKeychainPrivate.c in Sources */,
-				1572C5220CFB55B400E2776E /* SCNetworkSignature.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157433DF0D4A8122002ACA73 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		158317910CFB85F7006F62B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157433E00D4A8122002ACA73 /* scselect.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157433FF0D4A8137002ACA73 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		158317990CFB860C006F62B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157434000D4A8137002ACA73 /* scutil.c in Sources */,
-				157434010D4A8137002ACA73 /* commands.c in Sources */,
-				157434020D4A8137002ACA73 /* dictionary.c in Sources */,
-				157434030D4A8137002ACA73 /* session.c in Sources */,
-				157434040D4A8137002ACA73 /* cache.c in Sources */,
-				157434050D4A8137002ACA73 /* notifications.c in Sources */,
-				157434060D4A8137002ACA73 /* tests.c in Sources */,
-				157434070D4A8137002ACA73 /* prefs.c in Sources */,
-				157434080D4A8137002ACA73 /* net.c in Sources */,
-				157434090D4A8137002ACA73 /* net_interface.c in Sources */,
-				1574340A0D4A8137002ACA73 /* net_protocol.c in Sources */,
-				1574340B0D4A8137002ACA73 /* net_service.c in Sources */,
-				1574340C0D4A8137002ACA73 /* net_set.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A84DD0D56C63900B6F1A0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		158317A10CFB8626006F62B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157A84DE0D56C63900B6F1A0 /* shared_dns_info.defs in Sources */,
-				157A84DF0D56C63900B6F1A0 /* dnsinfo_copy.c in Sources */,
-				157A84E00D56C63900B6F1A0 /* dnsinfo_private.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A84F90D56C7E800B6F1A0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		158317A90CFB8639006F62B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				155281020E3E4A0F00C54315 /* ip_plugin.c in Sources */,
-				157A84FB0D56C7E800B6F1A0 /* dns-configuration.c in Sources */,
-				157A84FC0D56C7E800B6F1A0 /* set-hostname.c in Sources */,
-				15D48EC10F67061F00B4711E /* dnsinfo_create.c in Sources */,
-				15D48ED40F6707A600B4711E /* shared_dns_info.defs in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A85070D56C8AA00B6F1A0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EA4A108395BB00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157A85080D56C8AA00B6F1A0 /* ifnamer.c in Sources */,
+				1583EA4B108395BB00A3BC0C /* Localizable.strings in Resources */,
+				1583EA4C108395BB00A3BC0C /* NetworkInterface.strings in Resources */,
+				1583EA4D108395BB00A3BC0C /* NetworkConfiguration.plist in Resources */,
+				1583EA4E108395BB00A3BC0C /* get-mobility-info in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A85180D56C8E000B6F1A0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EADA108395BB00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157A85190D56C8E000B6F1A0 /* cache.c in Sources */,
-				157A851B0D56C8E000B6F1A0 /* ev_dlil.c in Sources */,
-				157A851C0D56C8E000B6F1A0 /* ev_ipv4.c in Sources */,
-				157A851D0D56C8E000B6F1A0 /* ev_ipv6.c in Sources */,
-				157A851E0D56C8E000B6F1A0 /* eventmon.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A85280D56C91100B6F1A0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EAE9108395BC00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157A85290D56C91100B6F1A0 /* linkconfig.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A85330D56C94F00B6F1A0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EB01108395BC00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157A85340D56C94F00B6F1A0 /* NetworkIdentification.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A853E0D56C96F00B6F1A0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EB10108395BC00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				157A853F0D56C96F00B6F1A0 /* prefsmon.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		1583172C0CFB80A1006F62B9 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EB1D108395BC00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1583172D0CFB80A1006F62B9 /* configd.m in Sources */,
-				1583172E0CFB80A1006F62B9 /* _SCD.c in Sources */,
-				1583172F0CFB80A1006F62B9 /* configd_server.c in Sources */,
-				158317300CFB80A1006F62B9 /* notify_server.c in Sources */,
-				158317310CFB80A1006F62B9 /* plugin_support.c in Sources */,
-				158317320CFB80A1006F62B9 /* session.c in Sources */,
-				158317330CFB80A1006F62B9 /* pattern.c in Sources */,
-				158317340CFB80A1006F62B9 /* _configopen.c in Sources */,
-				158317350CFB80A1006F62B9 /* _configclose.c in Sources */,
-				158317360CFB80A1006F62B9 /* _configlock.c in Sources */,
-				158317370CFB80A1006F62B9 /* _configunlock.c in Sources */,
-				158317380CFB80A1006F62B9 /* _configlist.c in Sources */,
-				158317390CFB80A1006F62B9 /* _configadd.c in Sources */,
-				1583173A0CFB80A1006F62B9 /* _configget.c in Sources */,
-				1583173B0CFB80A1006F62B9 /* _configset.c in Sources */,
-				1583173C0CFB80A1006F62B9 /* _configremove.c in Sources */,
-				1583173D0CFB80A1006F62B9 /* _configtouch.c in Sources */,
-				1583173E0CFB80A1006F62B9 /* _confignotify.c in Sources */,
-				1583173F0CFB80A1006F62B9 /* _notifyadd.c in Sources */,
-				158317400CFB80A1006F62B9 /* _notifyremove.c in Sources */,
-				158317410CFB80A1006F62B9 /* _notifychanges.c in Sources */,
-				158317420CFB80A1006F62B9 /* _notifyviaport.c in Sources */,
-				158317430CFB80A1006F62B9 /* _notifyviafd.c in Sources */,
-				158317440CFB80A1006F62B9 /* _notifyviasignal.c in Sources */,
-				158317450CFB80A1006F62B9 /* _notifycancel.c in Sources */,
-				158317460CFB80A1006F62B9 /* _snapshot.c in Sources */,
-				158317470CFB80A1006F62B9 /* config.defs in Sources */,
-				158317480CFB80A1006F62B9 /* dnsinfo_private.c in Sources */,
-				158317490CFB80A1006F62B9 /* dnsinfo_server.c in Sources */,
-				1583174A0CFB80A1006F62B9 /* shared_dns_info.defs in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		1583379D0CFB6B9E0033AB93 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EB2C108395BD00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1583379E0CFB6B9E0033AB93 /* SCHelper_server.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159C9B2C0DB68E2600BEEF10 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EB3B108395BD00A3BC0C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159C9B290DB68E0700BEEF10 /* atconfig.c in Sources */,
-				159C9B2A0DB68E0800BEEF10 /* cfManager.c in Sources */,
-				159C9B2D0DB68E3D00BEEF10 /* cache.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159C9B840DB68F0300BEEF10 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15A5A2180D5B94190087BDA0 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159C9B820DB68EE500BEEF10 /* kicker.c in Sources */,
+				15A5A2190D5B94190087BDA0 /* Localizable.strings in Resources */,
+				15A5A21A0D5B94190087BDA0 /* NetworkInterface.strings in Resources */,
+				15A5A21B0D5B94190087BDA0 /* NetworkConfiguration.plist in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53D107528BDA004F8947 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15DAD66807591A1A0084A6ED /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D540907528D3A004F8947 /* cache.c in Sources */,
-				159D540D07528DAE004F8947 /* ev_dlil.c in Sources */,
-				159D540F07528DB0004F8947 /* ev_ipv4.c in Sources */,
-				159D541107528DB2004F8947 /* ev_ipv6.c in Sources */,
-				159D541307528DB5004F8947 /* eventmon.c in Sources */,
+				15A6F7C40A4B266D00B907EA /* Localizable.strings in Resources */,
+				15DAD66B07591A1A0084A6ED /* NetworkInterface.strings in Resources */,
+				15DAD66907591A1A0084A6ED /* NetworkConfiguration.plist in Resources */,
+				15DAD66A07591A1A0084A6ED /* get-mobility-info in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53E207528C4A004F8947 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15FD72940754DA2B001CC321 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D541607528DF1004F8947 /* ifnamer.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53E907528C61004F8947 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15FD72A20754DA4C001CC321 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D541707528E05004F8947 /* ip_plugin.c in Sources */,
-				159D541807528E09004F8947 /* dns-configuration.c in Sources */,
-				154361E00752C81800A8EC6C /* set-hostname.c in Sources */,
-				1572EB7B0A506D3B00D02459 /* smb-configuration.c in Sources */,
-				15D48EBF0F67061600B4711E /* dnsinfo_create.c in Sources */,
-				15D48ED30F67079B00B4711E /* shared_dns_info.defs in Sources */,
-				1522FCFB0FA7FE4B00B24128 /* dnsinfo_flatfile.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53F007528C79004F8947 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15FD72B20754DA69001CC321 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D541B07528E4A004F8947 /* linkconfig.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D53F707528C95004F8947 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		15FD72C60754DA7E001CC321 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D541C07528E58004F8947 /* prefsmon.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		159D54AB07529FFF004F8947 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		F95B8A6B0B03F9D100993BA3 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				159D54AC07529FFF004F8947 /* configd.m in Sources */,
-				159D54AD07529FFF004F8947 /* _SCD.c in Sources */,
-				159D54AE07529FFF004F8947 /* configd_server.c in Sources */,
-				159D54AF07529FFF004F8947 /* notify_server.c in Sources */,
-				159D54B007529FFF004F8947 /* plugin_support.c in Sources */,
-				159D54B107529FFF004F8947 /* session.c in Sources */,
-				159D54B207529FFF004F8947 /* pattern.c in Sources */,
-				159D54B307529FFF004F8947 /* _configopen.c in Sources */,
-				159D54B407529FFF004F8947 /* _configclose.c in Sources */,
-				159D54B507529FFF004F8947 /* _configlock.c in Sources */,
-				159D54B607529FFF004F8947 /* _configunlock.c in Sources */,
-				159D54B707529FFF004F8947 /* _configlist.c in Sources */,
-				159D54B807529FFF004F8947 /* _configadd.c in Sources */,
-				159D54B907529FFF004F8947 /* _configget.c in Sources */,
-				159D54BA07529FFF004F8947 /* _configset.c in Sources */,
-				159D54BB07529FFF004F8947 /* _configremove.c in Sources */,
-				159D54BC07529FFF004F8947 /* _configtouch.c in Sources */,
-				159D54BD07529FFF004F8947 /* _confignotify.c in Sources */,
-				159D54BE07529FFF004F8947 /* _notifyadd.c in Sources */,
-				159D54BF07529FFF004F8947 /* _notifyremove.c in Sources */,
-				159D54C007529FFF004F8947 /* _notifychanges.c in Sources */,
-				159D54C107529FFF004F8947 /* _notifyviaport.c in Sources */,
-				159D54C207529FFF004F8947 /* _notifyviafd.c in Sources */,
-				159D54C307529FFF004F8947 /* _notifyviasignal.c in Sources */,
-				159D54C407529FFF004F8947 /* _notifycancel.c in Sources */,
-				159D54C507529FFF004F8947 /* _snapshot.c in Sources */,
-				159D54C607529FFF004F8947 /* config.defs in Sources */,
-				159D54C707529FFF004F8947 /* dnsinfo_private.c in Sources */,
-				159D54C807529FFF004F8947 /* dnsinfo_server.c in Sources */,
-				159D54C907529FFF004F8947 /* shared_dns_info.defs in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		15A5A21D0D5B94190087BDA0 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		151F63DB09328A3C0096DCC9 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				15A5A21E0D5B94190087BDA0 /* SCSchemaDefinitions.c in Sources */,
-				15A5A21F0D5B94190087BDA0 /* SCD.c in Sources */,
-				15A5A2200D5B94190087BDA0 /* SCDKeys.c in Sources */,
-				15A5A2210D5B94190087BDA0 /* SCDPrivate.c in Sources */,
-				15A5A2220D5B94190087BDA0 /* SCDPlugin.c in Sources */,
-				15A5A2230D5B94190087BDA0 /* SCDOpen.c in Sources */,
-				15A5A2240D5B94190087BDA0 /* SCDLock.c in Sources */,
-				15A5A2250D5B94190087BDA0 /* SCDUnlock.c in Sources */,
-				15A5A2260D5B94190087BDA0 /* SCDList.c in Sources */,
-				15A5A2270D5B94190087BDA0 /* SCDAdd.c in Sources */,
-				15A5A2280D5B94190087BDA0 /* SCDGet.c in Sources */,
-				15A5A2290D5B94190087BDA0 /* SCDSet.c in Sources */,
-				15A5A22A0D5B94190087BDA0 /* SCDRemove.c in Sources */,
-				15A5A22B0D5B94190087BDA0 /* SCDTouch.c in Sources */,
-				15A5A22C0D5B94190087BDA0 /* SCDNotify.c in Sources */,
-				15A5A22D0D5B94190087BDA0 /* SCDNotifierSetKeys.c in Sources */,
-				15A5A22E0D5B94190087BDA0 /* SCDNotifierAdd.c in Sources */,
-				15A5A22F0D5B94190087BDA0 /* SCDNotifierRemove.c in Sources */,
-				15A5A2300D5B94190087BDA0 /* SCDNotifierGetChanges.c in Sources */,
-				15A5A2310D5B94190087BDA0 /* SCDNotifierWait.c in Sources */,
-				15A5A2320D5B94190087BDA0 /* SCDNotifierInformViaCallback.c in Sources */,
-				15A5A2330D5B94190087BDA0 /* SCDNotifierInformViaMachPort.c in Sources */,
-				15A5A2340D5B94190087BDA0 /* SCDNotifierInformViaFD.c in Sources */,
-				15A5A2350D5B94190087BDA0 /* SCDNotifierInformViaSignal.c in Sources */,
-				15A5A2360D5B94190087BDA0 /* SCDNotifierCancel.c in Sources */,
-				15A5A2370D5B94190087BDA0 /* SCDSnapshot.c in Sources */,
-				15A5A2380D5B94190087BDA0 /* SCP.c in Sources */,
-				15A5A2390D5B94190087BDA0 /* SCPOpen.c in Sources */,
-				15A5A23A0D5B94190087BDA0 /* SCPLock.c in Sources */,
-				15A5A23B0D5B94190087BDA0 /* SCPUnlock.c in Sources */,
-				15A5A23C0D5B94190087BDA0 /* SCPList.c in Sources */,
-				15A5A23D0D5B94190087BDA0 /* SCPGet.c in Sources */,
-				15A5A23E0D5B94190087BDA0 /* SCPAdd.c in Sources */,
-				15A5A23F0D5B94190087BDA0 /* SCPSet.c in Sources */,
-				15A5A2400D5B94190087BDA0 /* SCPRemove.c in Sources */,
-				15A5A2410D5B94190087BDA0 /* SCPCommit.c in Sources */,
-				15A5A2420D5B94190087BDA0 /* SCPApply.c in Sources */,
-				15A5A2430D5B94190087BDA0 /* SCPPath.c in Sources */,
-				15A5A2450D5B94190087BDA0 /* SCDHostName.c in Sources */,
-				15A5A2460D5B94190087BDA0 /* SCLocation.c in Sources */,
-				15A5A2470D5B94190087BDA0 /* SCNetwork.c in Sources */,
-				15A5A2480D5B94190087BDA0 /* pppcontroller.defs in Sources */,
-				15A5A2490D5B94190087BDA0 /* SCNetworkConnection.c in Sources */,
-				15A5A24A0D5B94190087BDA0 /* SCNetworkConnectionPrivate.c in Sources */,
-				15A5A24B0D5B94190087BDA0 /* SCNetworkReachability.c in Sources */,
-				15A5A24C0D5B94190087BDA0 /* SCProxies.c in Sources */,
-				15A5A24D0D5B94190087BDA0 /* DHCP.c in Sources */,
-				15A5A24E0D5B94190087BDA0 /* moh.c in Sources */,
-				15A5A24F0D5B94190087BDA0 /* DeviceOnHold.c in Sources */,
-				15A5A2500D5B94190087BDA0 /* LinkConfiguration.c in Sources */,
-				15A5A2510D5B94190087BDA0 /* dy_framework.c in Sources */,
-				15A5A2530D5B94190087BDA0 /* config.defs in Sources */,
-				15A5A2540D5B94190087BDA0 /* SCPreferencesPathKey.c in Sources */,
-				15A5A2550D5B94190087BDA0 /* dnsinfo_private.c in Sources */,
-				15A5A2560D5B94190087BDA0 /* dnsinfo_copy.c in Sources */,
-				15A5A2570D5B94190087BDA0 /* shared_dns_info.defs in Sources */,
-				15A5A2580D5B94190087BDA0 /* SCNetworkConfigurationInternal.c in Sources */,
-				15A5A2590D5B94190087BDA0 /* SCNetworkInterface.c in Sources */,
-				15A5A25A0D5B94190087BDA0 /* SCNetworkProtocol.c in Sources */,
-				15A5A25B0D5B94190087BDA0 /* SCNetworkService.c in Sources */,
-				15A5A25C0D5B94190087BDA0 /* SCNetworkSet.c in Sources */,
-				15A5A25E0D5B94190087BDA0 /* helper_comm.c in Sources */,
-				15A5A25F0D5B94190087BDA0 /* SCHelper_client.c in Sources */,
-				15A5A2600D5B94190087BDA0 /* SCPreferencesKeychainPrivate.c in Sources */,
-				15A5A2610D5B94190087BDA0 /* SCNetworkSignature.c in Sources */,
+			);
+			inputPaths = (
+				SystemConfiguration.fproj/genSCPreferences.c,
+			);
+			outputPaths = (
+				"${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.h",
+				"${BUILT_PRODUCTS_DIR}/SCSchemaDefinitionsPrivate.h",
+				"${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.c",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "echo ${BUILT_PRODUCTS_DIR}\ncc -o ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} ${SRCROOT}/SystemConfiguration.fproj/genSCPreferences.c || exit 1\n${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} header   > ${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.h        || exit 1\n${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} private  > ${BUILT_PRODUCTS_DIR}/SCSchemaDefinitionsPrivate.h || exit 1\n${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME} cfile    > ${BUILT_PRODUCTS_DIR}/SCSchemaDefinitions.c        || exit 1\nexit 0";
 		};
-		15DAD5E4075913CE0084A6ED /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		153393E40D34999D00FE74E7 /* Update Headers */ = {
+			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				15DAD5E5075913CE0084A6ED /* shared_dns_info.defs in Sources */,
-				15DAD5E6075913CE0084A6ED /* dnsinfo_copy.c in Sources */,
-				15DAD5E7075913CE0084A6ED /* dnsinfo_private.c in Sources */,
+			);
+			inputPaths = (
+				"$(SRCROOT)/SystemConfiguration.fproj/update-headers",
+			);
+			name = "Update Headers";
+			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ -x ${SCRIPT_INPUT_FILE_0} ]; then\n\t${SCRIPT_INPUT_FILE_0} split\nfi\n";
 		};
-		15DAD66C07591A1A0084A6ED /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1572C5270CFB55B400E2776E /* get-mobility-info */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 8;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "get-mobility-info";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+			shellPath = /bin/sh;
+			shellScript = "mkdir -p \"${DSTROOT}/usr/local/bin\"\nln -fs \"${INSTALL_PATH}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/get-mobility-info\" \"${DSTROOT}/usr/local/bin/\"\n";
+			showEnvVarsInLog = 0;
+		};
+		1583EA49108395BB00A3BC0C /* Update Headers */ = {
+			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				15060818075A00A300B147BA /* SCSchemaDefinitions.c in Sources */,
-				15DAD66D07591A1A0084A6ED /* SCD.c in Sources */,
-				15DAD66E07591A1A0084A6ED /* SCDKeys.c in Sources */,
-				15DAD66F07591A1A0084A6ED /* SCDPrivate.c in Sources */,
-				15DAD67007591A1A0084A6ED /* SCDPlugin.c in Sources */,
-				15DAD67107591A1A0084A6ED /* SCDOpen.c in Sources */,
-				15DAD67207591A1A0084A6ED /* SCDLock.c in Sources */,
-				15DAD67307591A1A0084A6ED /* SCDUnlock.c in Sources */,
-				15DAD67407591A1A0084A6ED /* SCDList.c in Sources */,
-				15DAD67507591A1A0084A6ED /* SCDAdd.c in Sources */,
-				15DAD67607591A1A0084A6ED /* SCDGet.c in Sources */,
-				15DAD67707591A1A0084A6ED /* SCDSet.c in Sources */,
-				15DAD67807591A1A0084A6ED /* SCDRemove.c in Sources */,
-				15DAD67907591A1A0084A6ED /* SCDTouch.c in Sources */,
-				15DAD67A07591A1A0084A6ED /* SCDNotify.c in Sources */,
-				15DAD67B07591A1A0084A6ED /* SCDNotifierSetKeys.c in Sources */,
-				15DAD67C07591A1A0084A6ED /* SCDNotifierAdd.c in Sources */,
-				15DAD67D07591A1A0084A6ED /* SCDNotifierRemove.c in Sources */,
-				15DAD67E07591A1A0084A6ED /* SCDNotifierGetChanges.c in Sources */,
-				15DAD67F07591A1A0084A6ED /* SCDNotifierWait.c in Sources */,
-				15DAD68007591A1A0084A6ED /* SCDNotifierInformViaCallback.c in Sources */,
-				15DAD68107591A1A0084A6ED /* SCDNotifierInformViaMachPort.c in Sources */,
-				15DAD68207591A1A0084A6ED /* SCDNotifierInformViaFD.c in Sources */,
-				15DAD68307591A1A0084A6ED /* SCDNotifierInformViaSignal.c in Sources */,
-				15DAD68407591A1A0084A6ED /* SCDNotifierCancel.c in Sources */,
-				15DAD68507591A1A0084A6ED /* SCDSnapshot.c in Sources */,
-				15DAD68607591A1A0084A6ED /* SCP.c in Sources */,
-				15DAD68707591A1A0084A6ED /* SCPOpen.c in Sources */,
-				15DAD68807591A1A0084A6ED /* SCPLock.c in Sources */,
-				15DAD68907591A1A0084A6ED /* SCPUnlock.c in Sources */,
-				15DAD68A07591A1A0084A6ED /* SCPList.c in Sources */,
-				15DAD68B07591A1A0084A6ED /* SCPGet.c in Sources */,
-				15DAD68C07591A1A0084A6ED /* SCPAdd.c in Sources */,
-				15DAD68D07591A1A0084A6ED /* SCPSet.c in Sources */,
-				15DAD68E07591A1A0084A6ED /* SCPRemove.c in Sources */,
-				15DAD68F07591A1A0084A6ED /* SCPCommit.c in Sources */,
-				15DAD69007591A1A0084A6ED /* SCPApply.c in Sources */,
-				15DAD69107591A1A0084A6ED /* SCPPath.c in Sources */,
-				15DAD69207591A1A0084A6ED /* SCDConsoleUser.c in Sources */,
-				15DAD69307591A1A0084A6ED /* SCDHostName.c in Sources */,
-				15DAD69407591A1A0084A6ED /* SCLocation.c in Sources */,
-				15DAD69507591A1A0084A6ED /* SCNetwork.c in Sources */,
-				15DAD69607591A1A0084A6ED /* pppcontroller.defs in Sources */,
-				15DAD69707591A1A0084A6ED /* SCNetworkConnection.c in Sources */,
-				15A2972F0A13C08C009879B3 /* SCNetworkConnectionPrivate.c in Sources */,
-				15DAD69807591A1A0084A6ED /* SCNetworkReachability.c in Sources */,
-				15DAD69907591A1A0084A6ED /* SCProxies.c in Sources */,
-				15DAD69A07591A1A0084A6ED /* DHCP.c in Sources */,
-				15DAD69B07591A1A0084A6ED /* moh.c in Sources */,
-				15DAD69C07591A1A0084A6ED /* DeviceOnHold.c in Sources */,
-				15DAD69D07591A1A0084A6ED /* LinkConfiguration.c in Sources */,
-				15DAD69E07591A1A0084A6ED /* dy_framework.c in Sources */,
-				15DAD69F07591A1A0084A6ED /* VLANConfiguration.c in Sources */,
-				15DAD6A007591A1A0084A6ED /* config.defs in Sources */,
-				15DAD6A207591A1A0084A6ED /* SCPreferencesPathKey.c in Sources */,
-				15DAD6A307591A1A0084A6ED /* dnsinfo_private.c in Sources */,
-				15DAD6A407591A1A0084A6ED /* dnsinfo_copy.c in Sources */,
-				15DAD6A507591A1A0084A6ED /* shared_dns_info.defs in Sources */,
-				15DAD6A607591A1A0084A6ED /* SCNetworkConfigurationInternal.c in Sources */,
-				15DAD6A707591A1A0084A6ED /* SCNetworkInterface.c in Sources */,
-				15DAD6A807591A1A0084A6ED /* SCNetworkProtocol.c in Sources */,
-				15DAD6A907591A1A0084A6ED /* SCNetworkService.c in Sources */,
-				15DAD6AA07591A1A0084A6ED /* SCNetworkSet.c in Sources */,
-				15DAD6AB07591A1A0084A6ED /* BondConfiguration.c in Sources */,
-				15DAF2DA08466D4900D1B2BD /* helper_comm.c in Sources */,
-				15DAF2DC08466D4900D1B2BD /* SCHelper_client.c in Sources */,
-				152E68C30A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c in Sources */,
-				F95B8A430B03E07A00993BA3 /* SCNetworkSignature.c in Sources */,
+			);
+			inputPaths = (
+				"$(SRCROOT)/SystemConfiguration.fproj/update-headers",
+			);
+			name = "Update Headers";
+			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ -x ${SCRIPT_INPUT_FILE_0} ]; then\n\t${SCRIPT_INPUT_FILE_0} split\nfi\n";
 		};
-		F95B8A5C0B03F81400993BA3 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
+		1583EA95108395BB00A3BC0C /* get-mobility-info */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 8;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "get-mobility-info";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+			shellPath = /bin/sh;
+			shellScript = "mkdir -p \"${DSTROOT}/usr/local/bin\"\nln -fs \"${INSTALL_PATH}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/get-mobility-info\" \"${DSTROOT}/usr/local/bin/\"\n";
+			showEnvVarsInLog = 0;
+		};
+		15A5A2170D5B94190087BDA0 /* Update Headers */ = {
+			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				F95B8A690B03F9B500993BA3 /* NetworkIdentification.c in Sources */,
+			);
+			inputPaths = (
+				"$(SRCROOT)/SystemConfiguration.fproj/update-headers",
+			);
+			name = "Update Headers";
+			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ -x ${SCRIPT_INPUT_FILE_0} ]; then\n\t${SCRIPT_INPUT_FILE_0} split\nfi\n";
+			showEnvVarsInLog = 0;
 		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
-		150ECB300D0042DA0065E94D /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 151F5D990CCE98E50093AC3B /* SCMonitor */;
-			targetProxy = 150ECB2F0D0042DA0065E94D /* PBXContainerItemProxy */;
-		};
-		151FE37A0D5B713C000D6DB1 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 151FE2DD0D5B7046000D6DB1 /* configd_base-EmbeddedSimulator */;
-			targetProxy = 151FE3790D5B713C000D6DB1 /* PBXContainerItemProxy */;
-		};
-		1520A386084681350010B584 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1547001808455B98006787CE /* SCHelper */;
-			targetProxy = 1520A385084681350010B584 /* PBXContainerItemProxy */;
-		};
-		1521405B0E9400BF00DACD2C /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15213FF90E93E9F500DACD2C /* Logger.bundle */;
-			targetProxy = 1521405A0E9400BF00DACD2C /* PBXContainerItemProxy */;
-		};
-		1558480607550D470046C2E9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 159D549F07529FFF004F8947 /* configd */;
-			targetProxy = 1558480507550D470046C2E9 /* PBXContainerItemProxy */;
-		};
-		1558480807550D470046C2E9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1558481207550EC10046C2E9 /* scselect */;
-			targetProxy = 1558480707550D470046C2E9 /* PBXContainerItemProxy */;
+		15AC82480D376E2400A579D0 /* Update Headers */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"$(SRCROOT)/SystemConfiguration.fproj/update-headers",
+			);
+			name = "Update Headers";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ -x ${SCRIPT_INPUT_FILE_0} ]; then\n\t${SCRIPT_INPUT_FILE_0} clean\nfi\n";
+			showEnvVarsInLog = 0;
 		};
-		1558480A07550D470046C2E9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 155847430754FDCD0046C2E9 /* scutil */;
-			targetProxy = 1558480907550D470046C2E9 /* PBXContainerItemProxy */;
+		15DAD6AC07591A1A0084A6ED /* SystemConfiguration.order */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				/usr/local/lib/OrderFiles/SystemConfiguration.order,
+			);
+			name = SystemConfiguration.order;
+			outputPaths = (
+				"${OBJROOT}/SystemConfiguration.order",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ -r /usr/local/lib/OrderFiles/SystemConfiguration.order ]; then\n\tcp /usr/local/lib/OrderFiles/SystemConfiguration.order ${OBJROOT}/SystemConfiguration.order\nelse\n\ttouch ${OBJROOT}/SystemConfiguration.order\nfi";
+			showEnvVarsInLog = 0;
 		};
-		1558480F07550DD00046C2E9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 155847FA07550D210046C2E9 /* configd_executables */;
-			targetProxy = 1558480E07550DD00046C2E9 /* PBXContainerItemProxy */;
+		15DAD6B007591A1A0084A6ED /* get-mobility-info */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 8;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "get-mobility-info";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+			shellPath = /bin/sh;
+			shellScript = "mkdir -p \"${DSTROOT}/usr/local/bin\"\nln -fs \"${INSTALL_PATH}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/get-mobility-info\" \"${DSTROOT}/usr/local/bin/\"\n";
+			showEnvVarsInLog = 0;
 		};
-		156CA4A80EF8550800C59A18 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 156CA4790EF853BB00C59A18 /* Logger.bundle-Embedded */;
-			targetProxy = 156CA4A70EF8550800C59A18 /* PBXContainerItemProxy */;
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		151F5D970CCE98E50093AC3B /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				15FC130B0CCEA59E0013872C /* monitor.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
 		};
-		1574341F0D4A815E002ACA73 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157433F00D4A8137002ACA73 /* scutil-Embedded */;
-			targetProxy = 1574341E0D4A815E002ACA73 /* PBXContainerItemProxy */;
+		15213FF70E93E9F500DACD2C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				152140020E93EC6500DACD2C /* logger.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157434210D4A8166002ACA73 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157433DD0D4A8122002ACA73 /* scselect-Embedded */;
-			targetProxy = 157434200D4A8166002ACA73 /* PBXContainerItemProxy */;
+		1547001A08455B98006787CE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				15DAF2E108466D4900D1B2BD /* SCHelper_server.c in Sources */,
+				152E0E7F10FE820E00E402F2 /* helper.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A85480D56CA0B00B6F1A0 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157A84F40D56C7E800B6F1A0 /* IPMonitor-Embedded */;
-			targetProxy = 157A85470D56CA0B00B6F1A0 /* PBXContainerItemProxy */;
+		155847540754FDCD0046C2E9 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				155847550754FDCD0046C2E9 /* scutil.c in Sources */,
+				155847560754FDCD0046C2E9 /* commands.c in Sources */,
+				155847570754FDCD0046C2E9 /* dictionary.c in Sources */,
+				155847580754FDCD0046C2E9 /* session.c in Sources */,
+				155847590754FDCD0046C2E9 /* cache.c in Sources */,
+				1558475A0754FDCD0046C2E9 /* notifications.c in Sources */,
+				1558475B0754FDCD0046C2E9 /* tests.c in Sources */,
+				1558475C0754FDCD0046C2E9 /* prefs.c in Sources */,
+				1558475D0754FDCD0046C2E9 /* net.c in Sources */,
+				1558475E0754FDCD0046C2E9 /* net_interface.c in Sources */,
+				1558475F0754FDCD0046C2E9 /* net_protocol.c in Sources */,
+				155847600754FDCD0046C2E9 /* net_service.c in Sources */,
+				155847610754FDCD0046C2E9 /* net_set.c in Sources */,
+				72B43729113C7BFC00EBF1B6 /* nc.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A854A0D56CA2300B6F1A0 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157A85050D56C8AA00B6F1A0 /* InterfaceNamer-Embedded */;
-			targetProxy = 157A85490D56CA2300B6F1A0 /* PBXContainerItemProxy */;
+		1558481507550EC10046C2E9 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1558481607550EC10046C2E9 /* scselect.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A854C0D56CA5100B6F1A0 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157A85100D56C8E000B6F1A0 /* KernelEventMonitor-Embedded */;
-			targetProxy = 157A854B0D56CA5100B6F1A0 /* PBXContainerItemProxy */;
+		156CA47A0EF853BB00C59A18 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				156CA47B0EF853BB00C59A18 /* logger.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
 		};
-		157A854E0D56CA6F00B6F1A0 /* PBXTargetDependency */ = {
+		1572C4DE0CFB55B400E2776E /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1572C4DF0CFB55B400E2776E /* SCSchemaDefinitions.c in Sources */,
+				1572C4E00CFB55B400E2776E /* SCD.c in Sources */,
+				1572C4E10CFB55B400E2776E /* SCDKeys.c in Sources */,
+				1572C4E20CFB55B400E2776E /* SCDPrivate.c in Sources */,
+				1572C4E30CFB55B400E2776E /* SCDPlugin.c in Sources */,
+				1572C4E40CFB55B400E2776E /* SCDOpen.c in Sources */,
+				1572C4E50CFB55B400E2776E /* SCDLock.c in Sources */,
+				1572C4E60CFB55B400E2776E /* SCDUnlock.c in Sources */,
+				1572C4E70CFB55B400E2776E /* SCDList.c in Sources */,
+				1572C4E80CFB55B400E2776E /* SCDAdd.c in Sources */,
+				1572C4E90CFB55B400E2776E /* SCDGet.c in Sources */,
+				1572C4EA0CFB55B400E2776E /* SCDSet.c in Sources */,
+				1572C4EB0CFB55B400E2776E /* SCDRemove.c in Sources */,
+				1572C4EC0CFB55B400E2776E /* SCDTouch.c in Sources */,
+				1572C4ED0CFB55B400E2776E /* SCDNotify.c in Sources */,
+				1572C4EE0CFB55B400E2776E /* SCDNotifierSetKeys.c in Sources */,
+				1572C4EF0CFB55B400E2776E /* SCDNotifierAdd.c in Sources */,
+				1572C4F00CFB55B400E2776E /* SCDNotifierRemove.c in Sources */,
+				1572C4F10CFB55B400E2776E /* SCDNotifierGetChanges.c in Sources */,
+				1572C4F20CFB55B400E2776E /* SCDNotifierWait.c in Sources */,
+				1572C4F30CFB55B400E2776E /* SCDNotifierInformViaCallback.c in Sources */,
+				1572C4F40CFB55B400E2776E /* SCDNotifierInformViaMachPort.c in Sources */,
+				1572C4F50CFB55B400E2776E /* SCDNotifierInformViaFD.c in Sources */,
+				1572C4F60CFB55B400E2776E /* SCDNotifierInformViaSignal.c in Sources */,
+				1572C4F70CFB55B400E2776E /* SCDNotifierCancel.c in Sources */,
+				1572C4F80CFB55B400E2776E /* SCDSnapshot.c in Sources */,
+				1572C4F90CFB55B400E2776E /* SCP.c in Sources */,
+				1572C4FA0CFB55B400E2776E /* SCPOpen.c in Sources */,
+				1572C4FB0CFB55B400E2776E /* SCPLock.c in Sources */,
+				1572C4FC0CFB55B400E2776E /* SCPUnlock.c in Sources */,
+				1572C4FD0CFB55B400E2776E /* SCPList.c in Sources */,
+				1572C4FE0CFB55B400E2776E /* SCPGet.c in Sources */,
+				1572C4FF0CFB55B400E2776E /* SCPAdd.c in Sources */,
+				1572C5000CFB55B400E2776E /* SCPSet.c in Sources */,
+				1572C5010CFB55B400E2776E /* SCPRemove.c in Sources */,
+				1572C5020CFB55B400E2776E /* SCPCommit.c in Sources */,
+				1572C5030CFB55B400E2776E /* SCPApply.c in Sources */,
+				1572C5040CFB55B400E2776E /* SCPPath.c in Sources */,
+				1572C5060CFB55B400E2776E /* SCDHostName.c in Sources */,
+				1572C5070CFB55B400E2776E /* SCLocation.c in Sources */,
+				1572C5080CFB55B400E2776E /* SCNetwork.c in Sources */,
+				1572C5090CFB55B400E2776E /* pppcontroller.defs in Sources */,
+				1572C50A0CFB55B400E2776E /* SCNetworkConnection.c in Sources */,
+				1572C50B0CFB55B400E2776E /* SCNetworkConnectionPrivate.c in Sources */,
+				1572C50C0CFB55B400E2776E /* SCNetworkReachability.c in Sources */,
+				1572C50D0CFB55B400E2776E /* SCProxies.c in Sources */,
+				1572C50E0CFB55B400E2776E /* DHCP.c in Sources */,
+				1572C50F0CFB55B400E2776E /* moh.c in Sources */,
+				1572C5100CFB55B400E2776E /* DeviceOnHold.c in Sources */,
+				1572C5110CFB55B400E2776E /* LinkConfiguration.c in Sources */,
+				1572C5120CFB55B400E2776E /* dy_framework.c in Sources */,
+				1572C5140CFB55B400E2776E /* config.defs in Sources */,
+				1572C5150CFB55B400E2776E /* SCPreferencesPathKey.c in Sources */,
+				1572C5180CFB55B400E2776E /* shared_dns_info.defs in Sources */,
+				1572C5190CFB55B400E2776E /* SCNetworkConfigurationInternal.c in Sources */,
+				1572C51A0CFB55B400E2776E /* SCNetworkInterface.c in Sources */,
+				1572C51B0CFB55B400E2776E /* SCNetworkProtocol.c in Sources */,
+				1572C51C0CFB55B400E2776E /* SCNetworkService.c in Sources */,
+				1572C51D0CFB55B400E2776E /* SCNetworkSet.c in Sources */,
+				1572C5200CFB55B400E2776E /* SCHelper_client.c in Sources */,
+				1572C5210CFB55B400E2776E /* SCPreferencesKeychainPrivate.c in Sources */,
+				1572C5220CFB55B400E2776E /* SCNetworkSignature.c in Sources */,
+				15A1FF3310597F17004C9CC9 /* CaptiveNetwork.c in Sources */,
+				159A751E107FEAA400A57EAB /* VPNPrivate.c in Sources */,
+				159A7520107FEAA400A57EAB /* VPNConfiguration.c in Sources */,
+				15AAA7F6108E310700C2A607 /* VPNTunnel.c in Sources */,
+				158E595F1107CAE80062081E /* helper.defs in Sources */,
+				152691D81129EE8A006BD2D5 /* BondConfiguration.c in Sources */,
+				152691DB1129EEA6006BD2D5 /* BridgeConfiguration.c in Sources */,
+				152691DE1129EEC2006BD2D5 /* VLANConfiguration.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157433DF0D4A8122002ACA73 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157433E00D4A8122002ACA73 /* scselect.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157433FF0D4A8137002ACA73 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157434000D4A8137002ACA73 /* scutil.c in Sources */,
+				157434010D4A8137002ACA73 /* commands.c in Sources */,
+				157434020D4A8137002ACA73 /* dictionary.c in Sources */,
+				157434030D4A8137002ACA73 /* session.c in Sources */,
+				157434040D4A8137002ACA73 /* cache.c in Sources */,
+				157434050D4A8137002ACA73 /* notifications.c in Sources */,
+				157434060D4A8137002ACA73 /* tests.c in Sources */,
+				157434070D4A8137002ACA73 /* prefs.c in Sources */,
+				157434080D4A8137002ACA73 /* net.c in Sources */,
+				157434090D4A8137002ACA73 /* net_interface.c in Sources */,
+				1574340A0D4A8137002ACA73 /* net_protocol.c in Sources */,
+				1574340B0D4A8137002ACA73 /* net_service.c in Sources */,
+				1574340C0D4A8137002ACA73 /* net_set.c in Sources */,
+				72B4372B113C7BFC00EBF1B6 /* nc.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157A84DD0D56C63900B6F1A0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157A84DE0D56C63900B6F1A0 /* shared_dns_info.defs in Sources */,
+				157A84DF0D56C63900B6F1A0 /* dnsinfo_copy.c in Sources */,
+				157A84E00D56C63900B6F1A0 /* dnsinfo_private.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157A84F90D56C7E800B6F1A0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				155281020E3E4A0F00C54315 /* ip_plugin.c in Sources */,
+				157A84FB0D56C7E800B6F1A0 /* dns-configuration.c in Sources */,
+				1575FD2712CD15C60003D86E /* proxy-configuration.c in Sources */,
+				157A84FC0D56C7E800B6F1A0 /* set-hostname.c in Sources */,
+				15D48EC10F67061F00B4711E /* dnsinfo_create.c in Sources */,
+				15D48ED40F6707A600B4711E /* shared_dns_info.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157A85070D56C8AA00B6F1A0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157A85080D56C8AA00B6F1A0 /* ifnamer.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157A85180D56C8E000B6F1A0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157A85190D56C8E000B6F1A0 /* cache.c in Sources */,
+				157A851B0D56C8E000B6F1A0 /* ev_dlil.c in Sources */,
+				157A851C0D56C8E000B6F1A0 /* ev_ipv4.c in Sources */,
+				157A851D0D56C8E000B6F1A0 /* ev_ipv6.c in Sources */,
+				157A851E0D56C8E000B6F1A0 /* eventmon.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157A85280D56C91100B6F1A0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157A85290D56C91100B6F1A0 /* linkconfig.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157A85330D56C94F00B6F1A0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157A85340D56C94F00B6F1A0 /* NetworkIdentification.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		157A853E0D56C96F00B6F1A0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				157A853F0D56C96F00B6F1A0 /* prefsmon.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583172C0CFB80A1006F62B9 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583172D0CFB80A1006F62B9 /* configd.m in Sources */,
+				1583172E0CFB80A1006F62B9 /* _SCD.c in Sources */,
+				1583172F0CFB80A1006F62B9 /* configd_server.c in Sources */,
+				158317300CFB80A1006F62B9 /* notify_server.c in Sources */,
+				158317310CFB80A1006F62B9 /* plugin_support.c in Sources */,
+				158317320CFB80A1006F62B9 /* session.c in Sources */,
+				158317330CFB80A1006F62B9 /* pattern.c in Sources */,
+				158317340CFB80A1006F62B9 /* _configopen.c in Sources */,
+				158317350CFB80A1006F62B9 /* _configclose.c in Sources */,
+				158317360CFB80A1006F62B9 /* _configlock.c in Sources */,
+				158317370CFB80A1006F62B9 /* _configunlock.c in Sources */,
+				158317380CFB80A1006F62B9 /* _configlist.c in Sources */,
+				158317390CFB80A1006F62B9 /* _configadd.c in Sources */,
+				1583173A0CFB80A1006F62B9 /* _configget.c in Sources */,
+				1583173B0CFB80A1006F62B9 /* _configset.c in Sources */,
+				1583173C0CFB80A1006F62B9 /* _configremove.c in Sources */,
+				1583173D0CFB80A1006F62B9 /* _configtouch.c in Sources */,
+				1583173E0CFB80A1006F62B9 /* _confignotify.c in Sources */,
+				1583173F0CFB80A1006F62B9 /* _notifyadd.c in Sources */,
+				158317400CFB80A1006F62B9 /* _notifyremove.c in Sources */,
+				158317410CFB80A1006F62B9 /* _notifychanges.c in Sources */,
+				158317420CFB80A1006F62B9 /* _notifyviaport.c in Sources */,
+				158317430CFB80A1006F62B9 /* _notifyviafd.c in Sources */,
+				158317440CFB80A1006F62B9 /* _notifyviasignal.c in Sources */,
+				158317450CFB80A1006F62B9 /* _notifycancel.c in Sources */,
+				158317460CFB80A1006F62B9 /* _snapshot.c in Sources */,
+				158317470CFB80A1006F62B9 /* config.defs in Sources */,
+				158317480CFB80A1006F62B9 /* dnsinfo_private.c in Sources */,
+				158317490CFB80A1006F62B9 /* dnsinfo_server.c in Sources */,
+				1583174A0CFB80A1006F62B9 /* shared_dns_info.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583379D0CFB6B9E0033AB93 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583379E0CFB6B9E0033AB93 /* SCHelper_server.c in Sources */,
+				152E0E8010FE820E00E402F2 /* helper.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EA08108395BB00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EA09108395BB00A3BC0C /* shared_dns_info.defs in Sources */,
+				1583EA0A108395BB00A3BC0C /* dnsinfo_copy.c in Sources */,
+				1583EA0B108395BB00A3BC0C /* dnsinfo_private.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EA4F108395BB00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EA50108395BB00A3BC0C /* SCSchemaDefinitions.c in Sources */,
+				1583EA51108395BB00A3BC0C /* SCD.c in Sources */,
+				1583EA52108395BB00A3BC0C /* SCDKeys.c in Sources */,
+				1583EA53108395BB00A3BC0C /* SCDPrivate.c in Sources */,
+				1583EA54108395BB00A3BC0C /* SCDPlugin.c in Sources */,
+				1583EA55108395BB00A3BC0C /* SCDOpen.c in Sources */,
+				1583EA56108395BB00A3BC0C /* SCDLock.c in Sources */,
+				1583EA57108395BB00A3BC0C /* SCDUnlock.c in Sources */,
+				1583EA58108395BB00A3BC0C /* SCDList.c in Sources */,
+				1583EA59108395BB00A3BC0C /* SCDAdd.c in Sources */,
+				1583EA5A108395BB00A3BC0C /* SCDGet.c in Sources */,
+				1583EA5B108395BB00A3BC0C /* SCDSet.c in Sources */,
+				1583EA5C108395BB00A3BC0C /* SCDRemove.c in Sources */,
+				1583EA5D108395BB00A3BC0C /* SCDTouch.c in Sources */,
+				1583EA5E108395BB00A3BC0C /* SCDNotify.c in Sources */,
+				1583EA5F108395BB00A3BC0C /* SCDNotifierSetKeys.c in Sources */,
+				1583EA60108395BB00A3BC0C /* SCDNotifierAdd.c in Sources */,
+				1583EA61108395BB00A3BC0C /* SCDNotifierRemove.c in Sources */,
+				1583EA62108395BB00A3BC0C /* SCDNotifierGetChanges.c in Sources */,
+				1583EA63108395BB00A3BC0C /* SCDNotifierWait.c in Sources */,
+				1583EA64108395BB00A3BC0C /* SCDNotifierInformViaCallback.c in Sources */,
+				1583EA65108395BB00A3BC0C /* SCDNotifierInformViaMachPort.c in Sources */,
+				1583EA66108395BB00A3BC0C /* SCDNotifierInformViaFD.c in Sources */,
+				1583EA67108395BB00A3BC0C /* SCDNotifierInformViaSignal.c in Sources */,
+				1583EA68108395BB00A3BC0C /* SCDNotifierCancel.c in Sources */,
+				1583EA69108395BB00A3BC0C /* SCDSnapshot.c in Sources */,
+				1583EA6A108395BB00A3BC0C /* SCP.c in Sources */,
+				1583EA6B108395BB00A3BC0C /* SCPOpen.c in Sources */,
+				1583EA6C108395BB00A3BC0C /* SCPLock.c in Sources */,
+				1583EA6D108395BB00A3BC0C /* SCPUnlock.c in Sources */,
+				1583EA6E108395BB00A3BC0C /* SCPList.c in Sources */,
+				1583EA6F108395BB00A3BC0C /* SCPGet.c in Sources */,
+				1583EA70108395BB00A3BC0C /* SCPAdd.c in Sources */,
+				1583EA71108395BB00A3BC0C /* SCPSet.c in Sources */,
+				1583EA72108395BB00A3BC0C /* SCPRemove.c in Sources */,
+				1583EA73108395BB00A3BC0C /* SCPCommit.c in Sources */,
+				1583EA74108395BB00A3BC0C /* SCPApply.c in Sources */,
+				1583EA75108395BB00A3BC0C /* SCPPath.c in Sources */,
+				1583EA76108395BB00A3BC0C /* SCDHostName.c in Sources */,
+				1583EA77108395BB00A3BC0C /* SCLocation.c in Sources */,
+				1583EA78108395BB00A3BC0C /* SCNetwork.c in Sources */,
+				1583EA79108395BB00A3BC0C /* pppcontroller.defs in Sources */,
+				1583EA7A108395BB00A3BC0C /* SCNetworkConnection.c in Sources */,
+				1583EA7B108395BB00A3BC0C /* SCNetworkConnectionPrivate.c in Sources */,
+				1583EA7C108395BB00A3BC0C /* SCNetworkReachability.c in Sources */,
+				1583EA7D108395BB00A3BC0C /* SCProxies.c in Sources */,
+				1583EA7E108395BB00A3BC0C /* DHCP.c in Sources */,
+				1583EA7F108395BB00A3BC0C /* moh.c in Sources */,
+				1583EA80108395BB00A3BC0C /* DeviceOnHold.c in Sources */,
+				1583EA81108395BB00A3BC0C /* LinkConfiguration.c in Sources */,
+				1583EA82108395BB00A3BC0C /* dy_framework.c in Sources */,
+				1583EA83108395BB00A3BC0C /* config.defs in Sources */,
+				1583EA84108395BB00A3BC0C /* SCPreferencesPathKey.c in Sources */,
+				1583EA85108395BB00A3BC0C /* shared_dns_info.defs in Sources */,
+				1583EA86108395BB00A3BC0C /* SCNetworkConfigurationInternal.c in Sources */,
+				1583EA87108395BB00A3BC0C /* SCNetworkInterface.c in Sources */,
+				1583EA88108395BB00A3BC0C /* SCNetworkProtocol.c in Sources */,
+				1583EA89108395BB00A3BC0C /* SCNetworkService.c in Sources */,
+				1583EA8A108395BB00A3BC0C /* SCNetworkSet.c in Sources */,
+				1583EA8C108395BB00A3BC0C /* SCHelper_client.c in Sources */,
+				1583EA8D108395BB00A3BC0C /* SCPreferencesKeychainPrivate.c in Sources */,
+				1583EA8E108395BB00A3BC0C /* SCNetworkSignature.c in Sources */,
+				1583EA8F108395BB00A3BC0C /* CaptiveNetwork.c in Sources */,
+				158E59601107CAF10062081E /* helper.defs in Sources */,
+				152691D91129EE94006BD2D5 /* BondConfiguration.c in Sources */,
+				152691DD1129EEB1006BD2D5 /* BridgeConfiguration.c in Sources */,
+				152691E01129EECB006BD2D5 /* VLANConfiguration.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EA9F108395BB00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EAA0108395BB00A3BC0C /* SCHelper_server.c in Sources */,
+				152E0E8110FE820E00E402F2 /* helper.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EACF108395BB00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EAD0108395BB00A3BC0C /* ip_plugin.c in Sources */,
+				1583EAD1108395BB00A3BC0C /* dns-configuration.c in Sources */,
+				1575FD2B12CD15C60003D86E /* proxy-configuration.c in Sources */,
+				1583EAD2108395BB00A3BC0C /* set-hostname.c in Sources */,
+				1583EAD3108395BB00A3BC0C /* dnsinfo_create.c in Sources */,
+				1583EAD4108395BB00A3BC0C /* shared_dns_info.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EAE2108395BB00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EAE3108395BB00A3BC0C /* ifnamer.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EAF6108395BC00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EAF7108395BC00A3BC0C /* cache.c in Sources */,
+				1583EAF8108395BC00A3BC0C /* ev_dlil.c in Sources */,
+				1583EAF9108395BC00A3BC0C /* ev_ipv4.c in Sources */,
+				1583EAFA108395BC00A3BC0C /* ev_ipv6.c in Sources */,
+				1583EAFB108395BC00A3BC0C /* eventmon.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB09108395BC00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB0A108395BC00A3BC0C /* linkconfig.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB17108395BC00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB18108395BC00A3BC0C /* logger.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB25108395BD00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB26108395BD00A3BC0C /* NetworkIdentification.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB34108395BD00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB35108395BD00A3BC0C /* prefsmon.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB54108395BD00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB55108395BD00A3BC0C /* configd.m in Sources */,
+				1583EB56108395BD00A3BC0C /* _SCD.c in Sources */,
+				1583EB57108395BD00A3BC0C /* configd_server.c in Sources */,
+				1583EB58108395BD00A3BC0C /* notify_server.c in Sources */,
+				1583EB59108395BD00A3BC0C /* plugin_support.c in Sources */,
+				1583EB5A108395BD00A3BC0C /* session.c in Sources */,
+				1583EB5B108395BD00A3BC0C /* pattern.c in Sources */,
+				1583EB5C108395BD00A3BC0C /* _configopen.c in Sources */,
+				1583EB5D108395BD00A3BC0C /* _configclose.c in Sources */,
+				1583EB5E108395BD00A3BC0C /* _configlock.c in Sources */,
+				1583EB5F108395BD00A3BC0C /* _configunlock.c in Sources */,
+				1583EB60108395BD00A3BC0C /* _configlist.c in Sources */,
+				1583EB61108395BD00A3BC0C /* _configadd.c in Sources */,
+				1583EB62108395BD00A3BC0C /* _configget.c in Sources */,
+				1583EB63108395BD00A3BC0C /* _configset.c in Sources */,
+				1583EB64108395BD00A3BC0C /* _configremove.c in Sources */,
+				1583EB65108395BD00A3BC0C /* _configtouch.c in Sources */,
+				1583EB66108395BD00A3BC0C /* _confignotify.c in Sources */,
+				1583EB67108395BD00A3BC0C /* _notifyadd.c in Sources */,
+				1583EB68108395BD00A3BC0C /* _notifyremove.c in Sources */,
+				1583EB69108395BD00A3BC0C /* _notifychanges.c in Sources */,
+				1583EB6A108395BD00A3BC0C /* _notifyviaport.c in Sources */,
+				1583EB6B108395BD00A3BC0C /* _notifyviafd.c in Sources */,
+				1583EB6C108395BD00A3BC0C /* _notifyviasignal.c in Sources */,
+				1583EB6D108395BD00A3BC0C /* _notifycancel.c in Sources */,
+				1583EB6E108395BD00A3BC0C /* _snapshot.c in Sources */,
+				1583EB6F108395BD00A3BC0C /* config.defs in Sources */,
+				1583EB70108395BD00A3BC0C /* dnsinfo_private.c in Sources */,
+				1583EB71108395BD00A3BC0C /* dnsinfo_server.c in Sources */,
+				1583EB72108395BD00A3BC0C /* shared_dns_info.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EB88108395BE00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EB89108395BE00A3BC0C /* scselect.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1583EBA1108395BE00A3BC0C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1583EBA2108395BE00A3BC0C /* scutil.c in Sources */,
+				1583EBA3108395BE00A3BC0C /* commands.c in Sources */,
+				1583EBA4108395BE00A3BC0C /* dictionary.c in Sources */,
+				1583EBA5108395BE00A3BC0C /* session.c in Sources */,
+				1583EBA6108395BE00A3BC0C /* cache.c in Sources */,
+				1583EBA7108395BE00A3BC0C /* notifications.c in Sources */,
+				1583EBA8108395BE00A3BC0C /* tests.c in Sources */,
+				1583EBA9108395BE00A3BC0C /* prefs.c in Sources */,
+				1583EBAA108395BE00A3BC0C /* net.c in Sources */,
+				1583EBAB108395BE00A3BC0C /* net_interface.c in Sources */,
+				1583EBAC108395BE00A3BC0C /* net_protocol.c in Sources */,
+				1583EBAD108395BE00A3BC0C /* net_service.c in Sources */,
+				1583EBAE108395BE00A3BC0C /* net_set.c in Sources */,
+				15B274A5114467CD003414AD /* nc.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53D107528BDA004F8947 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D540907528D3A004F8947 /* cache.c in Sources */,
+				159D540D07528DAE004F8947 /* ev_dlil.c in Sources */,
+				159D540F07528DB0004F8947 /* ev_ipv4.c in Sources */,
+				159D541107528DB2004F8947 /* ev_ipv6.c in Sources */,
+				159D541307528DB5004F8947 /* eventmon.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53E207528C4A004F8947 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D541607528DF1004F8947 /* ifnamer.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53E907528C61004F8947 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D541707528E05004F8947 /* ip_plugin.c in Sources */,
+				159D541807528E09004F8947 /* dns-configuration.c in Sources */,
+				1575FD2912CD15C60003D86E /* proxy-configuration.c in Sources */,
+				154361E00752C81800A8EC6C /* set-hostname.c in Sources */,
+				1572EB7B0A506D3B00D02459 /* smb-configuration.c in Sources */,
+				15D48EBF0F67061600B4711E /* dnsinfo_create.c in Sources */,
+				15D48ED30F67079B00B4711E /* shared_dns_info.defs in Sources */,
+				1522FCFB0FA7FE4B00B24128 /* dnsinfo_flatfile.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53F007528C79004F8947 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D541B07528E4A004F8947 /* linkconfig.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D53F707528C95004F8947 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D541C07528E58004F8947 /* prefsmon.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		159D54AB07529FFF004F8947 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				159D54AC07529FFF004F8947 /* configd.m in Sources */,
+				159D54AD07529FFF004F8947 /* _SCD.c in Sources */,
+				159D54AE07529FFF004F8947 /* configd_server.c in Sources */,
+				159D54AF07529FFF004F8947 /* notify_server.c in Sources */,
+				159D54B007529FFF004F8947 /* plugin_support.c in Sources */,
+				159D54B107529FFF004F8947 /* session.c in Sources */,
+				159D54B207529FFF004F8947 /* pattern.c in Sources */,
+				159D54B307529FFF004F8947 /* _configopen.c in Sources */,
+				159D54B407529FFF004F8947 /* _configclose.c in Sources */,
+				159D54B507529FFF004F8947 /* _configlock.c in Sources */,
+				159D54B607529FFF004F8947 /* _configunlock.c in Sources */,
+				159D54B707529FFF004F8947 /* _configlist.c in Sources */,
+				159D54B807529FFF004F8947 /* _configadd.c in Sources */,
+				159D54B907529FFF004F8947 /* _configget.c in Sources */,
+				159D54BA07529FFF004F8947 /* _configset.c in Sources */,
+				159D54BB07529FFF004F8947 /* _configremove.c in Sources */,
+				159D54BC07529FFF004F8947 /* _configtouch.c in Sources */,
+				159D54BD07529FFF004F8947 /* _confignotify.c in Sources */,
+				159D54BE07529FFF004F8947 /* _notifyadd.c in Sources */,
+				159D54BF07529FFF004F8947 /* _notifyremove.c in Sources */,
+				159D54C007529FFF004F8947 /* _notifychanges.c in Sources */,
+				159D54C107529FFF004F8947 /* _notifyviaport.c in Sources */,
+				159D54C207529FFF004F8947 /* _notifyviafd.c in Sources */,
+				159D54C307529FFF004F8947 /* _notifyviasignal.c in Sources */,
+				159D54C407529FFF004F8947 /* _notifycancel.c in Sources */,
+				159D54C507529FFF004F8947 /* _snapshot.c in Sources */,
+				159D54C607529FFF004F8947 /* config.defs in Sources */,
+				159D54C707529FFF004F8947 /* dnsinfo_private.c in Sources */,
+				159D54C807529FFF004F8947 /* dnsinfo_server.c in Sources */,
+				159D54C907529FFF004F8947 /* shared_dns_info.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		15A5A21D0D5B94190087BDA0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				15A5A21E0D5B94190087BDA0 /* SCSchemaDefinitions.c in Sources */,
+				15A5A21F0D5B94190087BDA0 /* SCD.c in Sources */,
+				15A5A2200D5B94190087BDA0 /* SCDKeys.c in Sources */,
+				15A5A2210D5B94190087BDA0 /* SCDPrivate.c in Sources */,
+				15A5A2220D5B94190087BDA0 /* SCDPlugin.c in Sources */,
+				15A5A2230D5B94190087BDA0 /* SCDOpen.c in Sources */,
+				15A5A2240D5B94190087BDA0 /* SCDLock.c in Sources */,
+				15A5A2250D5B94190087BDA0 /* SCDUnlock.c in Sources */,
+				15A5A2260D5B94190087BDA0 /* SCDList.c in Sources */,
+				15A5A2270D5B94190087BDA0 /* SCDAdd.c in Sources */,
+				15A5A2280D5B94190087BDA0 /* SCDGet.c in Sources */,
+				15A5A2290D5B94190087BDA0 /* SCDSet.c in Sources */,
+				15A5A22A0D5B94190087BDA0 /* SCDRemove.c in Sources */,
+				15A5A22B0D5B94190087BDA0 /* SCDTouch.c in Sources */,
+				15A5A22C0D5B94190087BDA0 /* SCDNotify.c in Sources */,
+				15A5A22D0D5B94190087BDA0 /* SCDNotifierSetKeys.c in Sources */,
+				15A5A22E0D5B94190087BDA0 /* SCDNotifierAdd.c in Sources */,
+				15A5A22F0D5B94190087BDA0 /* SCDNotifierRemove.c in Sources */,
+				15A5A2300D5B94190087BDA0 /* SCDNotifierGetChanges.c in Sources */,
+				15A5A2310D5B94190087BDA0 /* SCDNotifierWait.c in Sources */,
+				15A5A2320D5B94190087BDA0 /* SCDNotifierInformViaCallback.c in Sources */,
+				15A5A2330D5B94190087BDA0 /* SCDNotifierInformViaMachPort.c in Sources */,
+				15A5A2340D5B94190087BDA0 /* SCDNotifierInformViaFD.c in Sources */,
+				15A5A2350D5B94190087BDA0 /* SCDNotifierInformViaSignal.c in Sources */,
+				15A5A2360D5B94190087BDA0 /* SCDNotifierCancel.c in Sources */,
+				15A5A2370D5B94190087BDA0 /* SCDSnapshot.c in Sources */,
+				15A5A2380D5B94190087BDA0 /* SCP.c in Sources */,
+				15A5A2390D5B94190087BDA0 /* SCPOpen.c in Sources */,
+				15A5A23A0D5B94190087BDA0 /* SCPLock.c in Sources */,
+				15A5A23B0D5B94190087BDA0 /* SCPUnlock.c in Sources */,
+				15A5A23C0D5B94190087BDA0 /* SCPList.c in Sources */,
+				15A5A23D0D5B94190087BDA0 /* SCPGet.c in Sources */,
+				15A5A23E0D5B94190087BDA0 /* SCPAdd.c in Sources */,
+				15A5A23F0D5B94190087BDA0 /* SCPSet.c in Sources */,
+				15A5A2400D5B94190087BDA0 /* SCPRemove.c in Sources */,
+				15A5A2410D5B94190087BDA0 /* SCPCommit.c in Sources */,
+				15A5A2420D5B94190087BDA0 /* SCPApply.c in Sources */,
+				15A5A2430D5B94190087BDA0 /* SCPPath.c in Sources */,
+				15A5A2450D5B94190087BDA0 /* SCDHostName.c in Sources */,
+				15A5A2460D5B94190087BDA0 /* SCLocation.c in Sources */,
+				15A5A2470D5B94190087BDA0 /* SCNetwork.c in Sources */,
+				15A5A2480D5B94190087BDA0 /* pppcontroller.defs in Sources */,
+				15A5A2490D5B94190087BDA0 /* SCNetworkConnection.c in Sources */,
+				15A5A24A0D5B94190087BDA0 /* SCNetworkConnectionPrivate.c in Sources */,
+				15A5A24B0D5B94190087BDA0 /* SCNetworkReachability.c in Sources */,
+				15A5A24C0D5B94190087BDA0 /* SCProxies.c in Sources */,
+				15A5A24D0D5B94190087BDA0 /* DHCP.c in Sources */,
+				15A5A24E0D5B94190087BDA0 /* moh.c in Sources */,
+				15A5A24F0D5B94190087BDA0 /* DeviceOnHold.c in Sources */,
+				15A5A2500D5B94190087BDA0 /* LinkConfiguration.c in Sources */,
+				15A5A2510D5B94190087BDA0 /* dy_framework.c in Sources */,
+				15A5A2530D5B94190087BDA0 /* config.defs in Sources */,
+				15A5A2540D5B94190087BDA0 /* SCPreferencesPathKey.c in Sources */,
+				15A5A2550D5B94190087BDA0 /* dnsinfo_private.c in Sources */,
+				15A5A2560D5B94190087BDA0 /* dnsinfo_copy.c in Sources */,
+				15A5A2570D5B94190087BDA0 /* shared_dns_info.defs in Sources */,
+				15A5A2580D5B94190087BDA0 /* SCNetworkConfigurationInternal.c in Sources */,
+				15A5A2590D5B94190087BDA0 /* SCNetworkInterface.c in Sources */,
+				15A5A25A0D5B94190087BDA0 /* SCNetworkProtocol.c in Sources */,
+				15A5A25B0D5B94190087BDA0 /* SCNetworkService.c in Sources */,
+				15A5A25C0D5B94190087BDA0 /* SCNetworkSet.c in Sources */,
+				15A5A25F0D5B94190087BDA0 /* SCHelper_client.c in Sources */,
+				15A5A2600D5B94190087BDA0 /* SCPreferencesKeychainPrivate.c in Sources */,
+				15A5A2610D5B94190087BDA0 /* SCNetworkSignature.c in Sources */,
+				15A1FF3510597F17004C9CC9 /* CaptiveNetwork.c in Sources */,
+				159A752C107FEAA400A57EAB /* VPNPrivate.c in Sources */,
+				159A752E107FEAA400A57EAB /* VPNConfiguration.c in Sources */,
+				158E59611107CAF40062081E /* helper.defs in Sources */,
+				152691DA1129EE98006BD2D5 /* BondConfiguration.c in Sources */,
+				152691DC1129EEAD006BD2D5 /* BridgeConfiguration.c in Sources */,
+				152691DF1129EEC8006BD2D5 /* VLANConfiguration.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		15DAD5E4075913CE0084A6ED /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				15DAD5E5075913CE0084A6ED /* shared_dns_info.defs in Sources */,
+				15DAD5E6075913CE0084A6ED /* dnsinfo_copy.c in Sources */,
+				15DAD5E7075913CE0084A6ED /* dnsinfo_private.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		15DAD66C07591A1A0084A6ED /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				15060818075A00A300B147BA /* SCSchemaDefinitions.c in Sources */,
+				15DAD66D07591A1A0084A6ED /* SCD.c in Sources */,
+				15DAD66E07591A1A0084A6ED /* SCDKeys.c in Sources */,
+				15DAD66F07591A1A0084A6ED /* SCDPrivate.c in Sources */,
+				15DAD67007591A1A0084A6ED /* SCDPlugin.c in Sources */,
+				15DAD67107591A1A0084A6ED /* SCDOpen.c in Sources */,
+				15DAD67207591A1A0084A6ED /* SCDLock.c in Sources */,
+				15DAD67307591A1A0084A6ED /* SCDUnlock.c in Sources */,
+				15DAD67407591A1A0084A6ED /* SCDList.c in Sources */,
+				15DAD67507591A1A0084A6ED /* SCDAdd.c in Sources */,
+				15DAD67607591A1A0084A6ED /* SCDGet.c in Sources */,
+				15DAD67707591A1A0084A6ED /* SCDSet.c in Sources */,
+				15DAD67807591A1A0084A6ED /* SCDRemove.c in Sources */,
+				15DAD67907591A1A0084A6ED /* SCDTouch.c in Sources */,
+				15DAD67A07591A1A0084A6ED /* SCDNotify.c in Sources */,
+				15DAD67B07591A1A0084A6ED /* SCDNotifierSetKeys.c in Sources */,
+				15DAD67C07591A1A0084A6ED /* SCDNotifierAdd.c in Sources */,
+				15DAD67D07591A1A0084A6ED /* SCDNotifierRemove.c in Sources */,
+				15DAD67E07591A1A0084A6ED /* SCDNotifierGetChanges.c in Sources */,
+				15DAD67F07591A1A0084A6ED /* SCDNotifierWait.c in Sources */,
+				15DAD68007591A1A0084A6ED /* SCDNotifierInformViaCallback.c in Sources */,
+				15DAD68107591A1A0084A6ED /* SCDNotifierInformViaMachPort.c in Sources */,
+				15DAD68207591A1A0084A6ED /* SCDNotifierInformViaFD.c in Sources */,
+				15DAD68307591A1A0084A6ED /* SCDNotifierInformViaSignal.c in Sources */,
+				15DAD68407591A1A0084A6ED /* SCDNotifierCancel.c in Sources */,
+				15DAD68507591A1A0084A6ED /* SCDSnapshot.c in Sources */,
+				15DAD68607591A1A0084A6ED /* SCP.c in Sources */,
+				15DAD68707591A1A0084A6ED /* SCPOpen.c in Sources */,
+				15DAD68807591A1A0084A6ED /* SCPLock.c in Sources */,
+				15DAD68907591A1A0084A6ED /* SCPUnlock.c in Sources */,
+				15DAD68A07591A1A0084A6ED /* SCPList.c in Sources */,
+				15DAD68B07591A1A0084A6ED /* SCPGet.c in Sources */,
+				15DAD68C07591A1A0084A6ED /* SCPAdd.c in Sources */,
+				15DAD68D07591A1A0084A6ED /* SCPSet.c in Sources */,
+				15DAD68E07591A1A0084A6ED /* SCPRemove.c in Sources */,
+				15DAD68F07591A1A0084A6ED /* SCPCommit.c in Sources */,
+				15DAD69007591A1A0084A6ED /* SCPApply.c in Sources */,
+				15DAD69107591A1A0084A6ED /* SCPPath.c in Sources */,
+				15DAD69207591A1A0084A6ED /* SCDConsoleUser.c in Sources */,
+				15DAD69307591A1A0084A6ED /* SCDHostName.c in Sources */,
+				15DAD69407591A1A0084A6ED /* SCLocation.c in Sources */,
+				15DAD69507591A1A0084A6ED /* SCNetwork.c in Sources */,
+				15DAD69607591A1A0084A6ED /* pppcontroller.defs in Sources */,
+				15DAD69707591A1A0084A6ED /* SCNetworkConnection.c in Sources */,
+				15A2972F0A13C08C009879B3 /* SCNetworkConnectionPrivate.c in Sources */,
+				15DAD69807591A1A0084A6ED /* SCNetworkReachability.c in Sources */,
+				15DAD69907591A1A0084A6ED /* SCProxies.c in Sources */,
+				15DAD69A07591A1A0084A6ED /* DHCP.c in Sources */,
+				15DAD69B07591A1A0084A6ED /* moh.c in Sources */,
+				15DAD69C07591A1A0084A6ED /* DeviceOnHold.c in Sources */,
+				15DAD69D07591A1A0084A6ED /* LinkConfiguration.c in Sources */,
+				15DAD69E07591A1A0084A6ED /* dy_framework.c in Sources */,
+				15DAD69F07591A1A0084A6ED /* VLANConfiguration.c in Sources */,
+				15DAD6A007591A1A0084A6ED /* config.defs in Sources */,
+				15DAD6A207591A1A0084A6ED /* SCPreferencesPathKey.c in Sources */,
+				15DAD6A507591A1A0084A6ED /* shared_dns_info.defs in Sources */,
+				15DAD6A607591A1A0084A6ED /* SCNetworkConfigurationInternal.c in Sources */,
+				15DAD6A707591A1A0084A6ED /* SCNetworkInterface.c in Sources */,
+				15DAD6A807591A1A0084A6ED /* SCNetworkProtocol.c in Sources */,
+				15DAD6A907591A1A0084A6ED /* SCNetworkService.c in Sources */,
+				15DAD6AA07591A1A0084A6ED /* SCNetworkSet.c in Sources */,
+				15DAD6AB07591A1A0084A6ED /* BondConfiguration.c in Sources */,
+				15FD7B3C101E439200C56621 /* BridgeConfiguration.c in Sources */,
+				15DAF2DC08466D4900D1B2BD /* SCHelper_client.c in Sources */,
+				152E68C30A2C89E30011FDA8 /* SCPreferencesKeychainPrivate.c in Sources */,
+				F95B8A430B03E07A00993BA3 /* SCNetworkSignature.c in Sources */,
+				159A7525107FEAA400A57EAB /* VPNPrivate.c in Sources */,
+				159A7527107FEAA400A57EAB /* VPNConfiguration.c in Sources */,
+				15AAA7F9108E310700C2A607 /* VPNTunnel.c in Sources */,
+				158E595E1107CAE40062081E /* helper.defs in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		F95B8A5C0B03F81400993BA3 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				F95B8A690B03F9B500993BA3 /* NetworkIdentification.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		150ECB300D0042DA0065E94D /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 151F5D990CCE98E50093AC3B /* SCMonitor */;
+			targetProxy = 150ECB2F0D0042DA0065E94D /* PBXContainerItemProxy */;
+		};
+		151FE37A0D5B713C000D6DB1 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 151FE2DD0D5B7046000D6DB1 /* configd_base-EmbeddedSimulator */;
+			targetProxy = 151FE3790D5B713C000D6DB1 /* PBXContainerItemProxy */;
+		};
+		1520A386084681350010B584 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1547001808455B98006787CE /* SCHelper */;
+			targetProxy = 1520A385084681350010B584 /* PBXContainerItemProxy */;
+		};
+		1521405B0E9400BF00DACD2C /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15213FF90E93E9F500DACD2C /* Logger.bundle */;
+			targetProxy = 1521405A0E9400BF00DACD2C /* PBXContainerItemProxy */;
+		};
+		1558480607550D470046C2E9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 159D549F07529FFF004F8947 /* configd */;
+			targetProxy = 1558480507550D470046C2E9 /* PBXContainerItemProxy */;
+		};
+		1558480807550D470046C2E9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1558481207550EC10046C2E9 /* scselect */;
+			targetProxy = 1558480707550D470046C2E9 /* PBXContainerItemProxy */;
+		};
+		1558480A07550D470046C2E9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 155847430754FDCD0046C2E9 /* scutil */;
+			targetProxy = 1558480907550D470046C2E9 /* PBXContainerItemProxy */;
+		};
+		1558480F07550DD00046C2E9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 155847FA07550D210046C2E9 /* configd_executables */;
+			targetProxy = 1558480E07550DD00046C2E9 /* PBXContainerItemProxy */;
+		};
+		156CA4A80EF8550800C59A18 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 156CA4790EF853BB00C59A18 /* Logger.bundle-Embedded */;
+			targetProxy = 156CA4A70EF8550800C59A18 /* PBXContainerItemProxy */;
+		};
+		1574341F0D4A815E002ACA73 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157433F00D4A8137002ACA73 /* scutil-Embedded */;
+			targetProxy = 1574341E0D4A815E002ACA73 /* PBXContainerItemProxy */;
+		};
+		157434210D4A8166002ACA73 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157433DD0D4A8122002ACA73 /* scselect-Embedded */;
+			targetProxy = 157434200D4A8166002ACA73 /* PBXContainerItemProxy */;
+		};
+		157A85480D56CA0B00B6F1A0 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157A84F40D56C7E800B6F1A0 /* IPMonitor-Embedded */;
+			targetProxy = 157A85470D56CA0B00B6F1A0 /* PBXContainerItemProxy */;
+		};
+		157A854A0D56CA2300B6F1A0 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157A85050D56C8AA00B6F1A0 /* InterfaceNamer-Embedded */;
+			targetProxy = 157A85490D56CA2300B6F1A0 /* PBXContainerItemProxy */;
+		};
+		157A854C0D56CA5100B6F1A0 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157A85100D56C8E000B6F1A0 /* KernelEventMonitor-Embedded */;
+			targetProxy = 157A854B0D56CA5100B6F1A0 /* PBXContainerItemProxy */;
+		};
+		157A854E0D56CA6F00B6F1A0 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			target = 157A85260D56C91100B6F1A0 /* LinkConfiguration-Embedded */;
 			targetProxy = 157A854D0D56CA6F00B6F1A0 /* PBXContainerItemProxy */;
 		};
-		157A85500D56CA8800B6F1A0 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157A85310D56C94F00B6F1A0 /* NetworkIdentification-Embedded */;
-			targetProxy = 157A854F0D56CA8800B6F1A0 /* PBXContainerItemProxy */;
+		157A85500D56CA8800B6F1A0 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157A85310D56C94F00B6F1A0 /* NetworkIdentification-Embedded */;
+			targetProxy = 157A854F0D56CA8800B6F1A0 /* PBXContainerItemProxy */;
+		};
+		157A85520D56CA9E00B6F1A0 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157A853C0D56C96F00B6F1A0 /* PreferencesMonitor-Embedded */;
+			targetProxy = 157A85510D56CA9E00B6F1A0 /* PBXContainerItemProxy */;
+		};
+		157A85540D56CACA00B6F1A0 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158317A80CFB8639006F62B9 /* PreferencesMonitor.bundle-Embedded */;
+			targetProxy = 157A85530D56CACA00B6F1A0 /* PBXContainerItemProxy */;
+		};
+		157BB8C0075924460025DA7A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15DAD63F07591A1A0084A6ED /* SystemConfiguration.framework */;
+			targetProxy = 157BB8BF075924460025DA7A /* PBXContainerItemProxy */;
+		};
+		157BB8C40759244B0025DA7A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157BB8AE075924360025DA7A /* configd_base */;
+			targetProxy = 157BB8C30759244B0025DA7A /* PBXContainerItemProxy */;
+		};
+		15828B070753B77E00AD4710 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15828AE60753B5F900AD4710 /* KernelEventMonitor.bundle */;
+			targetProxy = 15828B060753B77E00AD4710 /* PBXContainerItemProxy */;
+		};
+		158317100CFB77D1006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158316CF0CFB774B006F62B9 /* configd_base-Embedded */;
+			targetProxy = 1583170F0CFB77D1006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317120CFB77E1006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1572C4A60CFB55B400E2776E /* SystemConfiguration.framework-Embedded */;
+			targetProxy = 158317110CFB77E1006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317140CFB77E8006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158337990CFB6B9E0033AB93 /* SCHelper-Embedded */;
+			targetProxy = 158317130CFB77E8006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317160CFB783B006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158316E30CFB7761006F62B9 /* configd_plugins-Embedded */;
+			targetProxy = 158317150CFB783B006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317180CFB784D006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158317040CFB7782006F62B9 /* configd_executables-Embedded */;
+			targetProxy = 158317170CFB784D006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317660CFB80D5006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158317230CFB80A1006F62B9 /* configd-Embedded */;
+			targetProxy = 158317650CFB80D5006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317B30CFB8660006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158317A00CFB8626006F62B9 /* NetworkIdentification.bundle-Embedded */;
+			targetProxy = 158317B20CFB8660006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317B50CFB8660006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158317980CFB860C006F62B9 /* LinkConfiguration.bundle-Embedded */;
+			targetProxy = 158317B40CFB8660006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317B70CFB8660006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158317900CFB85F7006F62B9 /* KernelEventMonitor.bundle-Embedded */;
+			targetProxy = 158317B60CFB8660006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317B90CFB8660006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 158317870CFB85DD006F62B9 /* InterfaceNamer.bundle-Embedded */;
+			targetProxy = 158317B80CFB8660006F62B9 /* PBXContainerItemProxy */;
+		};
+		158317BB0CFB8660006F62B9 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583177D0CFB85C8006F62B9 /* IPMonitor.bundle-Embedded */;
+			targetProxy = 158317BA0CFB8660006F62B9 /* PBXContainerItemProxy */;
+		};
+		158AD9860754E72500124717 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15FD72A10754DA4C001CC321 /* IPMonitor.bundle */;
+			targetProxy = 158AD9850754E72500124717 /* PBXContainerItemProxy */;
+		};
+		158AD9880754E72500124717 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15FD72930754DA2B001CC321 /* InterfaceNamer.bundle */;
+			targetProxy = 158AD9870754E72500124717 /* PBXContainerItemProxy */;
+		};
+		158AD98C0754E72500124717 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15FD72B10754DA69001CC321 /* LinkConfiguration.bundle */;
+			targetProxy = 158AD98B0754E72500124717 /* PBXContainerItemProxy */;
+		};
+		158AD98E0754E72500124717 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15FD72C50754DA7E001CC321 /* PreferencesMonitor.bundle */;
+			targetProxy = 158AD98D0754E72500124717 /* PBXContainerItemProxy */;
+		};
+		159D542207528E85004F8947 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 159D53D307528BDA004F8947 /* KernelEventMonitor */;
+			targetProxy = 159D542107528E85004F8947 /* PBXContainerItemProxy */;
+		};
+		159D542607528E85004F8947 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 159D53E407528C4A004F8947 /* InterfaceNamer */;
+			targetProxy = 159D542507528E85004F8947 /* PBXContainerItemProxy */;
+		};
+		159D542807528E85004F8947 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 159D53EB07528C61004F8947 /* IPMonitor */;
+			targetProxy = 159D542707528E85004F8947 /* PBXContainerItemProxy */;
+		};
+		159D542A07528E85004F8947 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 159D53F207528C79004F8947 /* LinkConfiguration */;
+			targetProxy = 159D542907528E85004F8947 /* PBXContainerItemProxy */;
+		};
+		159D542C07528E85004F8947 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 159D53F907528C95004F8947 /* PreferencesMonitor */;
+			targetProxy = 159D542B07528E85004F8947 /* PBXContainerItemProxy */;
+		};
+		159D542E07529008004F8947 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 159D542007528E7C004F8947 /* configd_plugins */;
+			targetProxy = 159D542D07529008004F8947 /* PBXContainerItemProxy */;
+		};
+		15A5A2710D5B942D0087BDA0 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15A5A1E40D5B94190087BDA0 /* SystemConfiguration.framework-EmbeddedSimulator */;
+			targetProxy = 15A5A2700D5B942D0087BDA0 /* PBXContainerItemProxy */;
+		};
+		15AC515810839608004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583E9FD108395BB00A3BC0C /* configd_libSystem-EmbeddedOther */;
+			targetProxy = 15AC515710839608004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC515B1083960E004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EA11108395BB00A3BC0C /* configd_base-EmbeddedOther */;
+			targetProxy = 15AC515A1083960E004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC515D10839613004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EAAC108395BB00A3BC0C /* configd_plugins-EmbeddedOther */;
+			targetProxy = 15AC515C10839613004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC515F1083961E004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB41108395BD00A3BC0C /* configd_executables-EmbeddedOther */;
+			targetProxy = 15AC515E1083961E004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC516110839649004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EA04108395BB00A3BC0C /* DNSConfiguration-EmbeddedOther */;
+			targetProxy = 15AC516010839649004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC516310839666004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EA19108395BB00A3BC0C /* SystemConfiguration.framework-EmbeddedOther */;
+			targetProxy = 15AC516210839666004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC51651083966B004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EA9B108395BB00A3BC0C /* SCHelper-EmbeddedOther */;
+			targetProxy = 15AC51641083966B004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC516A108396B7004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB92108395BE00A3BC0C /* scutil-EmbeddedOther */;
+			targetProxy = 15AC5169108396B7004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC516C108396B7004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB86108395BE00A3BC0C /* scselect-EmbeddedOther */;
+			targetProxy = 15AC516B108396B7004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC516E108396B7004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB4B108395BD00A3BC0C /* configd-EmbeddedOther */;
+			targetProxy = 15AC516D108396B7004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5171108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB3A108395BD00A3BC0C /* PreferencesMonitor.bundle-EmbeddedOther */;
+			targetProxy = 15AC5170108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5173108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB32108395BD00A3BC0C /* PreferencesMonitor-EmbeddedOther */;
+			targetProxy = 15AC5172108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5175108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB2B108395BD00A3BC0C /* NetworkIdentification.bundle-EmbeddedOther */;
+			targetProxy = 15AC5174108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5177108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB23108395BD00A3BC0C /* NetworkIdentification-EmbeddedOther */;
+			targetProxy = 15AC5176108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5179108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB16108395BC00A3BC0C /* Logger.bundle-EmbeddedOther */;
+			targetProxy = 15AC5178108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC517B108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB0F108395BC00A3BC0C /* LinkConfiguration.bundle-EmbeddedOther */;
+			targetProxy = 15AC517A108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC517D108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB07108395BC00A3BC0C /* LinkConfiguration-EmbeddedOther */;
+			targetProxy = 15AC517C108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC517F108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EB00108395BC00A3BC0C /* KernelEventMonitor.bundle-EmbeddedOther */;
+			targetProxy = 15AC517E108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5181108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EAEF108395BC00A3BC0C /* KernelEventMonitor-EmbeddedOther */;
+			targetProxy = 15AC5180108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5183108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EAE8108395BC00A3BC0C /* InterfaceNamer.bundle-EmbeddedOther */;
+			targetProxy = 15AC5182108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5185108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EAE0108395BB00A3BC0C /* InterfaceNamer-EmbeddedOther */;
+			targetProxy = 15AC5184108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5187108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EAD9108395BB00A3BC0C /* IPMonitor.bundle-EmbeddedOther */;
+			targetProxy = 15AC5186108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15AC5189108396D2004A9ED5 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 1583EACA108395BB00A3BC0C /* IPMonitor-EmbeddedOther */;
+			targetProxy = 15AC5188108396D2004A9ED5 /* PBXContainerItemProxy */;
+		};
+		15C64A220F684C4900D78394 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15DAD5DF075913CE0084A6ED /* DNSConfiguration */;
+			targetProxy = 15C64A210F684C4900D78394 /* PBXContainerItemProxy */;
+		};
+		15C64A240F684C5700D78394 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15C64A1E0F684C3300D78394 /* configd_libSystem */;
+			targetProxy = 15C64A230F684C5700D78394 /* PBXContainerItemProxy */;
+		};
+		15C64A2F0F684C8300D78394 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 15C64A280F684C6B00D78394 /* configd_libSystem-Embedded */;
+			targetProxy = 15C64A2E0F684C8300D78394 /* PBXContainerItemProxy */;
+		};
+		15C64A310F684C8F00D78394 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 157A84D80D56C63900B6F1A0 /* DNSConfiguration-Embedded */;
+			targetProxy = 15C64A300F684C8F00D78394 /* PBXContainerItemProxy */;
+		};
+		F95B8A770B03FB9100993BA3 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = F95B8A6A0B03F9D100993BA3 /* NetworkIdentification.bundle */;
+			targetProxy = F95B8A760B03FB9100993BA3 /* PBXContainerItemProxy */;
+		};
+		F95B8A790B03FB9100993BA3 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = F95B8A5E0B03F81400993BA3 /* NetworkIdentification */;
+			targetProxy = F95B8A780B03FB9100993BA3 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		1577253606EFBF3100D7B52B /* NetworkInterface.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				1577252F06EFB96700D7B52B /* English */,
+			);
+			name = NetworkInterface.strings;
+			sourceTree = "<group>";
+		};
+		15A6F7C20A4B266D00B907EA /* Localizable.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				15A6F7C30A4B266D00B907EA /* English */,
+			);
+			name = Localizable.strings;
+			sourceTree = "<group>";
+		};
+		15FEE8180CD03CBB001312F9 /* Localizable.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				15FEE8160CD03CA3001312F9 /* English */,
+			);
+			name = Localizable.strings;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		151C1CC70CFB487000C5AFD6 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "configd (Aggregate/Embedded)";
+			};
+			name = Debug;
+		};
+		151C1CC80CFB487000C5AFD6 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "configd (Aggregate/Embedded)";
+			};
+			name = Release;
 		};
-		157A85520D56CA9E00B6F1A0 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157A853C0D56C96F00B6F1A0 /* PreferencesMonitor-Embedded */;
-			targetProxy = 157A85510D56CA9E00B6F1A0 /* PBXContainerItemProxy */;
+		151F5D9C0CCE98E60093AC3B /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INFOPLIST_FILE = SCMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /System/Library/UserEventPlugins;
+				PRODUCT_NAME = SCMonitor;
+				WRAPPER_EXTENSION = plugin;
+			};
+			name = Debug;
 		};
-		157A85540D56CACA00B6F1A0 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158317A80CFB8639006F62B9 /* PreferencesMonitor.bundle-Embedded */;
-			targetProxy = 157A85530D56CACA00B6F1A0 /* PBXContainerItemProxy */;
+		151F5D9D0CCE98E60093AC3B /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INFOPLIST_FILE = SCMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /System/Library/UserEventPlugins;
+				PRODUCT_NAME = SCMonitor;
+				WRAPPER_EXTENSION = plugin;
+			};
+			name = Release;
 		};
-		157BB8C0075924460025DA7A /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15DAD63F07591A1A0084A6ED /* SystemConfiguration.framework */;
-			targetProxy = 157BB8BF075924460025DA7A /* PBXContainerItemProxy */;
+		151F63DD09328A3C0096DCC9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				INSTALLHDRS_SCRIPT_PHASE = YES;
+				PRODUCT_NAME = genSCPreferences;
+				WARNING_CFLAGS = (
+					"-Wall",
+					"-Wno-four-char-constants",
+					"-Wno-unknown-pragmas",
+				);
+			};
+			name = Debug;
 		};
-		157BB8C40759244B0025DA7A /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157BB8AE075924360025DA7A /* configd_base */;
-			targetProxy = 157BB8C30759244B0025DA7A /* PBXContainerItemProxy */;
+		151F63DE09328A3C0096DCC9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				INSTALLHDRS_SCRIPT_PHASE = YES;
+				PRODUCT_NAME = genSCPreferences;
+				WARNING_CFLAGS = (
+					"-Wall",
+					"-Wno-four-char-constants",
+					"-Wno-unknown-pragmas",
+				);
+			};
+			name = Release;
 		};
-		15828B070753B77E00AD4710 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15828AE60753B5F900AD4710 /* KernelEventMonitor.bundle */;
-			targetProxy = 15828B060753B77E00AD4710 /* PBXContainerItemProxy */;
+		151FE2E50D5B7046000D6DB1 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15FD147B0D594FE700F9409C /* IndigoSDK.xcconfig */;
+			buildSettings = {
+				PRODUCT_NAME = "configd_base (EmbeddedSimulator)";
+			};
+			name = Debug;
 		};
-		158317100CFB77D1006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158316CF0CFB774B006F62B9 /* configd_base-Embedded */;
-			targetProxy = 1583170F0CFB77D1006F62B9 /* PBXContainerItemProxy */;
+		151FE2E60D5B7046000D6DB1 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15FD147B0D594FE700F9409C /* IndigoSDK.xcconfig */;
+			buildSettings = {
+				PRODUCT_NAME = "configd_base (EmbeddedSimulator)";
+			};
+			name = Release;
 		};
-		158317120CFB77E1006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1572C4A60CFB55B400E2776E /* SystemConfiguration.framework-Embedded */;
-			targetProxy = 158317110CFB77E1006F62B9 /* PBXContainerItemProxy */;
+		15213FFC0E93E9F600DACD2C /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/Logger/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = Logger;
+			};
+			name = Debug;
 		};
-		158317140CFB77E8006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158337990CFB6B9E0033AB93 /* SCHelper-Embedded */;
-			targetProxy = 158317130CFB77E8006F62B9 /* PBXContainerItemProxy */;
+		15213FFD0E93E9F600DACD2C /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/Logger/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = Logger;
+			};
+			name = Release;
 		};
-		158317160CFB783B006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158316E30CFB7761006F62B9 /* configd_plugins-Embedded */;
-			targetProxy = 158317150CFB783B006F62B9 /* PBXContainerItemProxy */;
+		156CA4830EF853BB00C59A18 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
+			buildSettings = {
+				INFOPLIST_FILE = "Plugins/Logger/Info-Embedded.plist";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = Logger;
+			};
+			name = Debug;
 		};
-		158317180CFB784D006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158317040CFB7782006F62B9 /* configd_executables-Embedded */;
-			targetProxy = 158317170CFB784D006F62B9 /* PBXContainerItemProxy */;
+		156CA4840EF853BB00C59A18 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
+			buildSettings = {
+				INFOPLIST_FILE = "Plugins/Logger/Info-Embedded.plist";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = Logger;
+			};
+			name = Release;
 		};
-		158317660CFB80D5006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158317230CFB80A1006F62B9 /* configd-Embedded */;
-			targetProxy = 158317650CFB80D5006F62B9 /* PBXContainerItemProxy */;
+		156EB5DB0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				BUILD_VARIANTS = (
+					normal,
+					debug,
+					profile,
+				);
+				GENERATE_PROFILING_CODE_profile = YES;
+				INSTALLHDRS_COPY_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/lib/system;
+				MACH_O_TYPE = mh_dylib;
+				OTHER_CFLAGS_debug = "-O0";
+				OTHER_LDFLAGS = (
+					"-umbrella",
+					System,
+				);
+				OTHER_MIGFLAGS = "-DLIBDNSINFO";
+				PRODUCT_NAME = libdnsinfo;
+				STRIP_INSTALLED_PRODUCT_debug = NO;
+				STRIP_INSTALLED_PRODUCT_normal = YES;
+				STRIP_INSTALLED_PRODUCT_profile = NO;
+			};
+			name = Debug;
+		};
+		156EB5DC0905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				BUILD_VARIANTS = (
+					normal,
+					debug,
+					profile,
+				);
+				GENERATE_PROFILING_CODE_profile = YES;
+				INSTALLHDRS_COPY_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/lib/system;
+				MACH_O_TYPE = mh_dylib;
+				OTHER_CFLAGS_debug = "-O0";
+				OTHER_CFLAGS_normal = "";
+				OTHER_CFLAGS_profile = "";
+				OTHER_LDFLAGS = (
+					"-umbrella",
+					System,
+				);
+				OTHER_MIGFLAGS = "-DLIBDNSINFO";
+				PRODUCT_NAME = libdnsinfo;
+				STRIP_INSTALLED_PRODUCT_debug = NO;
+				STRIP_INSTALLED_PRODUCT_normal = YES;
+				STRIP_INSTALLED_PRODUCT_profile = NO;
+			};
+			name = Release;
+		};
+		156EB5DF0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks",
+					"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks",
+				);
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = SystemConfiguration.fproj/Info.plist;
+				INSTALLHDRS_SCRIPT_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
+				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
+				PRODUCT_NAME = SystemConfiguration;
+				WRAPPER_EXTENSION = framework;
+			};
+			name = Debug;
+		};
+		156EB5E00905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks",
+					"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks",
+				);
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = SystemConfiguration.fproj/Info.plist;
+				INSTALLHDRS_SCRIPT_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
+				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
+				PRODUCT_NAME = SystemConfiguration;
+				SECTORDER_FLAGS = (
+					"-sectorder",
+					__TEXT,
+					__text,
+					"$(OBJROOT)/SystemConfiguration.order",
+				);
+				WRAPPER_EXTENSION = framework;
+			};
+			name = Release;
+		};
+		156EB5E30905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework/Versions/A/Resources";
+				PRODUCT_NAME = SCHelper;
+			};
+			name = Debug;
+		};
+		156EB5E40905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework/Versions/A/Resources";
+				PRODUCT_NAME = SCHelper;
+			};
+			name = Release;
 		};
-		158317B30CFB8660006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158317A00CFB8626006F62B9 /* NetworkIdentification.bundle-Embedded */;
-			targetProxy = 158317B20CFB8660006F62B9 /* PBXContainerItemProxy */;
+		156EB5E70905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = configd_base;
+			};
+			name = Debug;
 		};
-		158317B50CFB8660006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158317980CFB860C006F62B9 /* LinkConfiguration.bundle-Embedded */;
-			targetProxy = 158317B40CFB8660006F62B9 /* PBXContainerItemProxy */;
+		156EB5E80905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = configd_base;
+			};
+			name = Release;
 		};
-		158317B70CFB8660006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158317900CFB85F7006F62B9 /* KernelEventMonitor.bundle-Embedded */;
-			targetProxy = 158317B60CFB8660006F62B9 /* PBXContainerItemProxy */;
+		156EB5EF0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = IPMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Debug;
 		};
-		158317B90CFB8660006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 158317870CFB85DD006F62B9 /* InterfaceNamer.bundle-Embedded */;
-			targetProxy = 158317B80CFB8660006F62B9 /* PBXContainerItemProxy */;
+		156EB5F00905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = IPMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Release;
 		};
-		158317BB0CFB8660006F62B9 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1583177D0CFB85C8006F62B9 /* IPMonitor.bundle-Embedded */;
-			targetProxy = 158317BA0CFB8660006F62B9 /* PBXContainerItemProxy */;
+		156EB5F30905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = IPMonitor;
+			};
+			name = Debug;
 		};
-		158AD9860754E72500124717 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15FD72A10754DA4C001CC321 /* IPMonitor.bundle */;
-			targetProxy = 158AD9850754E72500124717 /* PBXContainerItemProxy */;
+		156EB5F40905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = IPMonitor;
+			};
+			name = Release;
 		};
-		158AD9880754E72500124717 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15FD72930754DA2B001CC321 /* InterfaceNamer.bundle */;
-			targetProxy = 158AD9870754E72500124717 /* PBXContainerItemProxy */;
+		156EB5F70905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = InterfaceNamer;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Debug;
 		};
-		158AD98C0754E72500124717 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15FD72B10754DA69001CC321 /* LinkConfiguration.bundle */;
-			targetProxy = 158AD98B0754E72500124717 /* PBXContainerItemProxy */;
+		156EB5F80905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = InterfaceNamer;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Release;
 		};
-		158AD98E0754E72500124717 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15FD72C50754DA7E001CC321 /* PreferencesMonitor.bundle */;
-			targetProxy = 158AD98D0754E72500124717 /* PBXContainerItemProxy */;
+		156EB5FB0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = InterfaceNamer;
+			};
+			name = Debug;
 		};
-		159D542207528E85004F8947 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 159D53D307528BDA004F8947 /* KernelEventMonitor */;
-			targetProxy = 159D542107528E85004F8947 /* PBXContainerItemProxy */;
+		156EB5FC0905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = InterfaceNamer;
+			};
+			name = Release;
 		};
-		159D542607528E85004F8947 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 159D53E407528C4A004F8947 /* InterfaceNamer */;
-			targetProxy = 159D542507528E85004F8947 /* PBXContainerItemProxy */;
+		156EB5FF0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = KernelEventMonitor;
+			};
+			name = Debug;
 		};
-		159D542807528E85004F8947 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 159D53EB07528C61004F8947 /* IPMonitor */;
-			targetProxy = 159D542707528E85004F8947 /* PBXContainerItemProxy */;
+		156EB6000905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = KernelEventMonitor;
+			};
+			name = Release;
 		};
-		159D542A07528E85004F8947 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 159D53F207528C79004F8947 /* LinkConfiguration */;
-			targetProxy = 159D542907528E85004F8947 /* PBXContainerItemProxy */;
+		156EB6030905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = KernelEventMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Debug;
 		};
-		159D542C07528E85004F8947 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 159D53F907528C95004F8947 /* PreferencesMonitor */;
-			targetProxy = 159D542B07528E85004F8947 /* PBXContainerItemProxy */;
+		156EB6040905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = KernelEventMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Release;
 		};
-		159D542E07529008004F8947 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 159D542007528E7C004F8947 /* configd_plugins */;
-			targetProxy = 159D542D07529008004F8947 /* PBXContainerItemProxy */;
+		156EB60F0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = LinkConfiguration;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Debug;
 		};
-		15A5A2710D5B942D0087BDA0 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15A5A1E40D5B94190087BDA0 /* SystemConfiguration.framework-EmbeddedSimulator */;
-			targetProxy = 15A5A2700D5B942D0087BDA0 /* PBXContainerItemProxy */;
+		156EB6100905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = LinkConfiguration;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Release;
 		};
-		15C64A220F684C4900D78394 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15DAD5DF075913CE0084A6ED /* DNSConfiguration */;
-			targetProxy = 15C64A210F684C4900D78394 /* PBXContainerItemProxy */;
+		156EB6130905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = LinkConfiguration;
+			};
+			name = Debug;
 		};
-		15C64A240F684C5700D78394 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15C64A1E0F684C3300D78394 /* configd_libSystem */;
-			targetProxy = 15C64A230F684C5700D78394 /* PBXContainerItemProxy */;
+		156EB6140905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = LinkConfiguration;
+			};
+			name = Release;
 		};
-		15C64A2F0F684C8300D78394 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 15C64A280F684C6B00D78394 /* configd_libSystem-Embedded */;
-			targetProxy = 15C64A2E0F684C8300D78394 /* PBXContainerItemProxy */;
+		156EB6170905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = PreferencesMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Debug;
 		};
-		15C64A310F684C8F00D78394 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 157A84D80D56C63900B6F1A0 /* DNSConfiguration-Embedded */;
-			targetProxy = 15C64A300F684C8F00D78394 /* PBXContainerItemProxy */;
+		156EB6180905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = PreferencesMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
+			};
+			name = Release;
+		};
+		156EB61B0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = PreferencesMonitor;
+			};
+			name = Debug;
 		};
-		F95B8A770B03FB9100993BA3 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = F95B8A6A0B03F9D100993BA3 /* NetworkIdentification.bundle */;
-			targetProxy = F95B8A760B03FB9100993BA3 /* PBXContainerItemProxy */;
+		156EB61C0905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = PreferencesMonitor;
+			};
+			name = Release;
 		};
-		F95B8A790B03FB9100993BA3 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = F95B8A5E0B03F81400993BA3 /* NetworkIdentification */;
-			targetProxy = F95B8A780B03FB9100993BA3 /* PBXContainerItemProxy */;
+		156EB61F0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = configd_plugins;
+			};
+			name = Debug;
 		};
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
-		1577253606EFBF3100D7B52B /* NetworkInterface.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				1577252F06EFB96700D7B52B /* English */,
-			);
-			name = NetworkInterface.strings;
-			sourceTree = "<group>";
+		156EB6200905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = configd_plugins;
+			};
+			name = Release;
 		};
-		15A6F7C20A4B266D00B907EA /* Localizable.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				15A6F7C30A4B266D00B907EA /* English */,
-			);
-			name = Localizable.strings;
-			sourceTree = "<group>";
+		156EB6230905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/libexec;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					/usr/local/lib/SystemConfiguration,
+				);
+				PRODUCT_NAME = configd;
+			};
+			name = Debug;
 		};
-		15FEE8180CD03CBB001312F9 /* Localizable.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				15FEE8160CD03CA3001312F9 /* English */,
-			);
-			name = Localizable.strings;
-			sourceTree = "<group>";
+		156EB6240905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "-";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/libexec;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					/usr/local/lib/SystemConfiguration,
+				);
+				PRODUCT_NAME = configd;
+			};
+			name = Release;
 		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		151C1CC70CFB487000C5AFD6 /* Debug */ = {
+		156EB6270905594A00EEF749 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				PRODUCT_NAME = "configd (Aggregate/Embedded)";
+				CODE_SIGN_IDENTITY = "-";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
+				INSTALL_PATH = /usr/sbin;
+				PRODUCT_NAME = scselect;
 			};
 			name = Debug;
 		};
-		151C1CC80CFB487000C5AFD6 /* Release */ = {
+		156EB6280905594A00EEF749 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				PRODUCT_NAME = "configd (Aggregate/Embedded)";
+				CODE_SIGN_IDENTITY = "-";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
+				INSTALL_PATH = /usr/sbin;
+				PRODUCT_NAME = scselect;
 			};
 			name = Release;
 		};
-		151F5D9C0CCE98E60093AC3B /* Debug */ = {
+		156EB62B0905594A00EEF749 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
+				CODE_SIGN_IDENTITY = "-";
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				INFOPLIST_FILE = SCMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /System/Library/UserEventPlugins;
-				PRODUCT_NAME = SCMonitor;
-				WRAPPER_EXTENSION = plugin;
+				INSTALL_PATH = /usr/sbin;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					/usr/local/lib/SystemConfiguration,
+				);
+				PRODUCT_NAME = scutil;
 			};
 			name = Debug;
 		};
-		151F5D9D0CCE98E60093AC3B /* Release */ = {
+		156EB62C0905594A00EEF749 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
+				CODE_SIGN_IDENTITY = "-";
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				INFOPLIST_FILE = SCMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /System/Library/UserEventPlugins;
-				PRODUCT_NAME = SCMonitor;
-				WRAPPER_EXTENSION = plugin;
+				INSTALL_PATH = /usr/sbin;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					/usr/local/lib/SystemConfiguration,
+				);
+				PRODUCT_NAME = scutil;
 			};
 			name = Release;
 		};
-		151F63DD09328A3C0096DCC9 /* Debug */ = {
+		156EB62F0905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = configd_executables;
+			};
+			name = Debug;
+		};
+		156EB6300905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = configd_executables;
+			};
+			name = Release;
+		};
+		156EB6330905594A00EEF749 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "configd (Aggregate)";
+			};
+			name = Debug;
+		};
+		156EB6340905594A00EEF749 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "configd (Aggregate)";
+			};
+			name = Release;
+		};
+		156EB63F0905594A00EEF749 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
-				INSTALLHDRS_SCRIPT_PHASE = YES;
-				PRODUCT_NAME = genSCPreferences;
+				CURRENT_PROJECT_VERSION = "$(RC_ProjectSourceVersion)";
+				DEAD_CODE_STRIPPING = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
+				GCC_OPTIMIZATION_LEVEL = 0;
+				INSTALL_GROUP = wheel;
+				INSTALL_MODE_FLAG = "u+s,ugo-w,o+rX";
+				INSTALL_OWNER = root;
+				INSTALL_PATH = /usr/sbin;
+				OTHER_CFLAGS = (
+					"-fconstant-cfstrings",
+					"-fstack-protector",
+					"-D_FORTIFY_SOURCE=2",
+				);
+				RUN_CLANG_STATIC_ANALYZER = YES;
+				VERSIONING_SYSTEM = "apple-generic";
 				WARNING_CFLAGS = (
 					"-Wall",
 					"-Wno-four-char-constants",
 					"-Wno-unknown-pragmas",
+					"-Wformat-security",
 				);
 			};
 			name = Debug;
 		};
-		151F63DE09328A3C0096DCC9 /* Release */ = {
+		156EB6400905594A00EEF749 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				INSTALLHDRS_SCRIPT_PHASE = YES;
-				PRODUCT_NAME = genSCPreferences;
+				CURRENT_PROJECT_VERSION = "$(RC_ProjectSourceVersion)";
+				DEAD_CODE_STRIPPING = YES;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
+				INSTALL_GROUP = wheel;
+				INSTALL_MODE_FLAG = "u+s,ugo-w,o+rX";
+				INSTALL_OWNER = root;
+				INSTALL_PATH = /usr/sbin;
+				OTHER_CFLAGS = (
+					"-fconstant-cfstrings",
+					"-fstack-protector",
+					"-D_FORTIFY_SOURCE=2",
+				);
+				VERSIONING_SYSTEM = "apple-generic";
 				WARNING_CFLAGS = (
 					"-Wall",
 					"-Wno-four-char-constants",
 					"-Wno-unknown-pragmas",
+					"-Wformat-security",
 				);
 			};
 			name = Release;
 		};
-		151FE2E50D5B7046000D6DB1 /* Debug */ = {
+		1572C52A0CFB55B400E2776E /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 15FD147B0D594FE700F9409C /* IndigoSDK.xcconfig */;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = "configd_base (EmbeddedSimulator)";
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = "SystemConfiguration.fproj/Info-Embedded.plist";
+				INSTALLHDRS_SCRIPT_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
+				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
+				PRODUCT_NAME = SystemConfiguration;
+				WRAPPER_EXTENSION = framework;
 			};
 			name = Debug;
 		};
-		151FE2E60D5B7046000D6DB1 /* Release */ = {
+		1572C52B0CFB55B400E2776E /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 15FD147B0D594FE700F9409C /* IndigoSDK.xcconfig */;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = "configd_base (EmbeddedSimulator)";
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = "SystemConfiguration.fproj/Info-Embedded.plist";
+				INSTALLHDRS_SCRIPT_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
+				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
+				PRODUCT_NAME = SystemConfiguration;
+				WRAPPER_EXTENSION = framework;
 			};
 			name = Release;
 		};
-		15213FFC0E93E9F600DACD2C /* Debug */ = {
+		157433E90D4A8122002ACA73 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/Logger/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = Logger;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
+				INSTALL_PATH = /usr/sbin;
+				PRODUCT_NAME = scselect;
 			};
 			name = Debug;
 		};
-		15213FFD0E93E9F600DACD2C /* Release */ = {
+		157433EA0D4A8122002ACA73 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/Logger/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = Logger;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
+				INSTALL_PATH = /usr/sbin;
+				PRODUCT_NAME = scselect;
 			};
 			name = Release;
 		};
-		156CA4830EF853BB00C59A18 /* Debug */ = {
+		157434170D4A8137002ACA73 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = "Plugins/Logger/Info-Embedded.plist";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = Logger;
+				INSTALL_PATH = /usr/sbin;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = scutil;
 			};
 			name = Debug;
 		};
-		156CA4840EF853BB00C59A18 /* Release */ = {
+		157434180D4A8137002ACA73 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = "Plugins/Logger/Info-Embedded.plist";
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = Logger;
+				INSTALL_PATH = /usr/sbin;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = scutil;
 			};
 			name = Release;
 		};
-		156EB5DB0905594A00EEF749 /* Debug */ = {
+		157A84E50D56C63900B6F1A0 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				BUILD_VARIANTS = (
 					normal,
 					debug,
 					profile,
 				);
-				COPY_PHASE_STRIP = NO;
 				GENERATE_PROFILING_CODE_profile = YES;
 				INSTALLHDRS_COPY_PHASE = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/system;
-				LIBRARY_STYLE = STATIC;
+				INSTALL_PATH = /usr/lib/system;
+				MACH_O_TYPE = mh_dylib;
 				OTHER_CFLAGS_debug = "-O0";
+				OTHER_CFLAGS_normal = "";
+				OTHER_CFLAGS_profile = "";
+				OTHER_LDFLAGS = (
+					"-umbrella",
+					System,
+				);
 				OTHER_MIGFLAGS = "-DLIBDNSINFO";
-				PRODUCT_NAME = dnsinfo;
-				STRIPFLAGS = "";
+				PRODUCT_NAME = libdnsinfo;
 				STRIP_INSTALLED_PRODUCT_debug = NO;
 				STRIP_INSTALLED_PRODUCT_normal = YES;
 				STRIP_INSTALLED_PRODUCT_profile = NO;
 			};
 			name = Debug;
 		};
-		156EB5DC0905594A00EEF749 /* Release */ = {
+		157A84E60D56C63900B6F1A0 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				BUILD_VARIANTS = (
 					normal,
@@ -4838,318 +6938,328 @@
 				GENERATE_PROFILING_CODE_profile = YES;
 				INSTALLHDRS_COPY_PHASE = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/system;
-				LIBRARY_STYLE = STATIC;
+				INSTALL_PATH = /usr/lib/system;
+				MACH_O_TYPE = mh_dylib;
 				OTHER_CFLAGS_debug = "-O0";
 				OTHER_CFLAGS_normal = "";
 				OTHER_CFLAGS_profile = "";
+				OTHER_LDFLAGS = (
+					"-umbrella",
+					System,
+				);
 				OTHER_MIGFLAGS = "-DLIBDNSINFO";
-				PRODUCT_NAME = dnsinfo;
-				STRIPFLAGS = "";
+				PRODUCT_NAME = libdnsinfo;
 				STRIP_INSTALLED_PRODUCT_debug = NO;
 				STRIP_INSTALLED_PRODUCT_normal = YES;
 				STRIP_INSTALLED_PRODUCT_profile = NO;
 			};
 			name = Release;
 		};
-		156EB5DF0905594A00EEF749 /* Debug */ = {
+		157A84FF0D56C7E800B6F1A0 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks";
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
-				INFOPLIST_FILE = SystemConfiguration.fproj/Info.plist;
-				INSTALLHDRS_SCRIPT_PHASE = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
-				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
-				PRODUCT_NAME = SystemConfiguration;
-				SECTORDER_FLAGS = (
-					"-sectorder",
-					__TEXT,
-					__text,
-					"$(OBJROOT)/SystemConfiguration.order",
-				);
-				WRAPPER_EXTENSION = framework;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = IPMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		156EB5E00905594A00EEF749 /* Release */ = {
+		157A85000D56C7E800B6F1A0 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks";
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
-				INFOPLIST_FILE = SystemConfiguration.fproj/Info.plist;
-				INSTALLHDRS_SCRIPT_PHASE = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
-				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
-				PRODUCT_NAME = SystemConfiguration;
-				SECTORDER_FLAGS = (
-					"-sectorder",
-					__TEXT,
-					__text,
-					"$(OBJROOT)/SystemConfiguration.order",
-				);
-				WRAPPER_EXTENSION = framework;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = IPMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		156EB5E30905594A00EEF749 /* Debug */ = {
+		157A850A0D56C8AA00B6F1A0 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework/Versions/A/Resources";
-				PRODUCT_NAME = SCHelper;
-				STRIPFLAGS = "-S";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = InterfaceNamer;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		156EB5E40905594A00EEF749 /* Release */ = {
+		157A850B0D56C8AA00B6F1A0 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = YES;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework/Versions/A/Resources";
-				PRODUCT_NAME = SCHelper;
-				STRIPFLAGS = "-S";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = InterfaceNamer;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		156EB5E70905594A00EEF749 /* Debug */ = {
+		157A85200D56C8E000B6F1A0 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = configd_base;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = KernelEventMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		156EB5E80905594A00EEF749 /* Release */ = {
+		157A85210D56C8E000B6F1A0 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = configd_base;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = KernelEventMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		156EB5EB0905594A00EEF749 /* Debug */ = {
+		157A852B0D56C91100B6F1A0 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
-				INFOPLIST_FILE = Plugins/ATconfig/Info.plist;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = ATconfig;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = LinkConfiguration;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		156EB5EC0905594A00EEF749 /* Release */ = {
+		157A852C0D56C91100B6F1A0 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
-				INFOPLIST_FILE = Plugins/ATconfig/Info.plist;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = ATconfig;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = LinkConfiguration;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		156EB5EF0905594A00EEF749 /* Debug */ = {
+		157A85360D56C94F00B6F1A0 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = IPMonitor;
+				PRODUCT_NAME = NetworkIdentification;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		156EB5F00905594A00EEF749 /* Release */ = {
+		157A85370D56C94F00B6F1A0 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = IPMonitor;
+				PRODUCT_NAME = NetworkIdentification;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		156EB5F30905594A00EEF749 /* Debug */ = {
+		157A85410D56C96F00B6F1A0 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = IPMonitor;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = PreferencesMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		156EB5F40905594A00EEF749 /* Release */ = {
+		157A85420D56C96F00B6F1A0 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = IPMonitor;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = PreferencesMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		156EB5F70905594A00EEF749 /* Debug */ = {
+		158316D90CFB774B006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = InterfaceNamer;
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wno-unknown-pragmas",
-				);
+				PRODUCT_NAME = "configd_base (Embedded)";
 			};
 			name = Debug;
 		};
-		156EB5F80905594A00EEF749 /* Release */ = {
+		158316DA0CFB774B006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = InterfaceNamer;
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wno-unknown-pragmas",
-				);
+				PRODUCT_NAME = "configd_base (Embedded)";
 			};
 			name = Release;
 		};
-		156EB5FB0905594A00EEF749 /* Debug */ = {
+		158317010CFB7761006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = InterfaceNamer;
+				PRODUCT_NAME = "configd_plugins (Embedded)";
 			};
 			name = Debug;
 		};
-		156EB5FC0905594A00EEF749 /* Release */ = {
+		158317020CFB7761006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = InterfaceNamer;
+				PRODUCT_NAME = "configd_plugins (Embedded)";
 			};
 			name = Release;
 		};
-		156EB5FF0905594A00EEF749 /* Debug */ = {
+		1583170C0CFB7782006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
+				PRODUCT_NAME = "configd_executables (Embedded)";
+			};
+			name = Debug;
+		};
+		1583170D0CFB7782006F62B9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "configd_executables (Embedded)";
+			};
+			name = Release;
+		};
+		1583175E0CFB80A1006F62B9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
+			buildSettings = {
+				APPLY_RULES_IN_COPY_FILES = YES;
+				CODE_SIGN_ENTITLEMENTS = configd.tproj/entitlements.plist;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = KernelEventMonitor;
+				INSTALL_PATH = /usr/libexec;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = configd;
 			};
 			name = Debug;
 		};
-		156EB6000905594A00EEF749 /* Release */ = {
+		1583175F0CFB80A1006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
+				APPLY_RULES_IN_COPY_FILES = YES;
+				CODE_SIGN_ENTITLEMENTS = configd.tproj/entitlements.plist;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = KernelEventMonitor;
+				INSTALL_PATH = /usr/libexec;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = configd;
 			};
 			name = Release;
 		};
-		156EB6030905594A00EEF749 /* Debug */ = {
+		158317810CFB85C8006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = KernelEventMonitor;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = IPMonitor;
 			};
 			name = Debug;
 		};
-		156EB6040905594A00EEF749 /* Release */ = {
+		158317820CFB85C8006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = KernelEventMonitor;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = IPMonitor;
 			};
 			name = Release;
 		};
-		156EB60B0905594A00EEF749 /* Debug */ = {
+		1583178A0CFB85DD006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/Kicker/Info.plist;
+				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = Kicker;
+				PRODUCT_NAME = InterfaceNamer;
 			};
 			name = Debug;
 		};
-		156EB60C0905594A00EEF749 /* Release */ = {
+		1583178B0CFB85DD006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/Kicker/Info.plist;
+				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = Kicker;
+				PRODUCT_NAME = InterfaceNamer;
 			};
 			name = Release;
 		};
-		156EB60F0905594A00EEF749 /* Debug */ = {
+		158317930CFB85F7006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = LinkConfiguration;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = KernelEventMonitor;
 			};
 			name = Debug;
 		};
-		156EB6100905594A00EEF749 /* Release */ = {
+		158317940CFB85F7006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = LinkConfiguration;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = KernelEventMonitor;
 			};
 			name = Release;
 		};
-		156EB6130905594A00EEF749 /* Debug */ = {
+		1583179B0CFB860C006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
@@ -5158,8 +7268,9 @@
 			};
 			name = Debug;
 		};
-		156EB6140905594A00EEF749 /* Release */ = {
+		1583179C0CFB860C006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
@@ -5168,30 +7279,31 @@
 			};
 			name = Release;
 		};
-		156EB6170905594A00EEF749 /* Debug */ = {
+		158317A30CFB8626006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
+				INFOPLIST_FILE = Plugins/NetworkIdentification/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = PreferencesMonitor;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = NetworkIdentification;
 			};
 			name = Debug;
 		};
-		156EB6180905594A00EEF749 /* Release */ = {
+		158317A40CFB8626006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
+				INFOPLIST_FILE = Plugins/NetworkIdentification/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = PreferencesMonitor;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = NetworkIdentification;
 			};
 			name = Release;
 		};
-		156EB61B0905594A00EEF749 /* Debug */ = {
+		158317AB0CFB8639006F62B9 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
@@ -5200,8 +7312,9 @@
 			};
 			name = Debug;
 		};
-		156EB61C0905594A00EEF749 /* Release */ = {
+		158317AC0CFB8639006F62B9 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
@@ -5210,214 +7323,141 @@
 			};
 			name = Release;
 		};
-		156EB61F0905594A00EEF749 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				PRODUCT_NAME = configd_plugins;
-			};
-			name = Debug;
-		};
-		156EB6200905594A00EEF749 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				PRODUCT_NAME = configd_plugins;
-			};
-			name = Release;
-		};
-		156EB6230905594A00EEF749 /* Debug */ = {
+		158337A70CFB6B9E0033AB93 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
+				APPLY_RULES_IN_COPY_FILES = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/libexec;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					/usr/local/lib/SystemConfiguration,
-				);
-				PRODUCT_NAME = configd;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework";
+				PRODUCT_NAME = SCHelper;
 			};
 			name = Debug;
 		};
-		156EB6240905594A00EEF749 /* Release */ = {
+		158337A80CFB6B9E0033AB93 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				DEAD_CODE_STRIPPING = YES;
+				APPLY_RULES_IN_COPY_FILES = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/libexec;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					/usr/local/lib/SystemConfiguration,
-				);
-				PRODUCT_NAME = configd;
-			};
-			name = Release;
-		};
-		156EB6270905594A00EEF749 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
-				INSTALL_PATH = /usr/sbin;
-				PRODUCT_NAME = scselect;
-				STRIPFLAGS = "-S";
-			};
-			name = Debug;
-		};
-		156EB6280905594A00EEF749 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = YES;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
-				INSTALL_PATH = /usr/sbin;
-				PRODUCT_NAME = scselect;
-				STRIPFLAGS = "-S";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework";
+				PRODUCT_NAME = SCHelper;
 			};
 			name = Release;
 		};
-		156EB62B0905594A00EEF749 /* Debug */ = {
+		1583E9EA1083959E00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/sbin;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					/usr/local/lib/SystemConfiguration,
-				);
-				PREBINDING = NO;
-				PRODUCT_NAME = scutil;
-				STRIPFLAGS = "-S";
+				PRODUCT_NAME = "configd (Aggregate/EmbeddedOther)";
 			};
 			name = Debug;
 		};
-		156EB62C0905594A00EEF749 /* Release */ = {
+		1583E9EB1083959E00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = YES;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/sbin;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					/usr/local/lib/SystemConfiguration,
-				);
-				PREBINDING = YES;
-				PRODUCT_NAME = scutil;
-				STRIPFLAGS = "-S";
+				PRODUCT_NAME = "configd (Aggregate/EmbeddedOther)";
 			};
 			name = Release;
 		};
-		156EB62F0905594A00EEF749 /* Debug */ = {
+		1583EA02108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = configd_executables;
+				INSTALL_PATH = /usr/local/lib/system;
+				PRODUCT_NAME = "configd_libSystem (EmbeddedOther)";
 			};
 			name = Debug;
 		};
-		156EB6300905594A00EEF749 /* Release */ = {
+		1583EA03108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = configd_executables;
+				INSTALL_PATH = /usr/local/lib/system;
+				PRODUCT_NAME = "configd_libSystem (EmbeddedOther)";
 			};
 			name = Release;
 		};
-		156EB6330905594A00EEF749 /* Debug */ = {
+		1583EA0E108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = "configd (Aggregate)";
+				BUILD_VARIANTS = (
+					normal,
+					debug,
+					profile,
+				);
+				GENERATE_PROFILING_CODE_profile = YES;
+				INSTALLHDRS_COPY_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/lib/system;
+				MACH_O_TYPE = mh_dylib;
+				OTHER_CFLAGS_debug = "-O0";
+				OTHER_CFLAGS_normal = "";
+				OTHER_CFLAGS_profile = "";
+				OTHER_LDFLAGS = (
+					"-umbrella",
+					System,
+				);
+				OTHER_MIGFLAGS = "-DLIBDNSINFO";
+				PRODUCT_NAME = dnsinfo;
+				STRIP_INSTALLED_PRODUCT_debug = NO;
+				STRIP_INSTALLED_PRODUCT_normal = YES;
+				STRIP_INSTALLED_PRODUCT_profile = NO;
 			};
 			name = Debug;
 		};
-		156EB6340905594A00EEF749 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				PRODUCT_NAME = "configd (Aggregate)";
-			};
-			name = Release;
-		};
-		156EB63F0905594A00EEF749 /* Debug */ = {
+		1583EA0F108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				CURRENT_PROJECT_VERSION = "$(RC_ProjectSourceVersion)";
-				DEAD_CODE_STRIPPING = YES;
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_GROUP = wheel;
-				INSTALL_MODE_FLAG = "u+s,ugo-w,o+rX";
-				INSTALL_OWNER = root;
-				INSTALL_PATH = /usr/sbin;
-				OTHER_CFLAGS = (
-					"-fconstant-cfstrings",
-					"-fstack-protector",
-					"-D_FORTIFY_SOURCE=2",
+				BUILD_VARIANTS = (
+					normal,
+					debug,
+					profile,
 				);
-				STRIPFLAGS = "-S";
-				VERSIONING_SYSTEM = "apple-generic";
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wno-four-char-constants",
-					"-Wno-unknown-pragmas",
-					"-Wformat-security",
+				GENERATE_PROFILING_CODE_profile = YES;
+				INSTALLHDRS_COPY_PHASE = YES;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = /usr/lib/system;
+				MACH_O_TYPE = mh_dylib;
+				OTHER_CFLAGS_debug = "-O0";
+				OTHER_CFLAGS_normal = "";
+				OTHER_CFLAGS_profile = "";
+				OTHER_LDFLAGS = (
+					"-umbrella",
+					System,
 				);
+				OTHER_MIGFLAGS = "-DLIBDNSINFO";
+				PRODUCT_NAME = dnsinfo;
+				STRIP_INSTALLED_PRODUCT_debug = NO;
+				STRIP_INSTALLED_PRODUCT_normal = YES;
+				STRIP_INSTALLED_PRODUCT_profile = NO;
 			};
-			name = Debug;
+			name = Release;
 		};
-		156EB6400905594A00EEF749 /* Release */ = {
+		1583EA17108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				CURRENT_PROJECT_VERSION = "$(RC_ProjectSourceVersion)";
-				DEAD_CODE_STRIPPING = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = "$(RC_ProjectSourceVersion)";
-				INSTALL_GROUP = wheel;
-				INSTALL_MODE_FLAG = "u+s,ugo-w,o+rX";
-				INSTALL_OWNER = root;
-				INSTALL_PATH = /usr/sbin;
-				OTHER_CFLAGS = (
-					"-fconstant-cfstrings",
-					"-fstack-protector",
-					"-D_FORTIFY_SOURCE=2",
-				);
-				STRIPFLAGS = "-S";
-				VERSIONING_SYSTEM = "apple-generic";
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wno-four-char-constants",
-					"-Wno-unknown-pragmas",
-					"-Wformat-security",
-				);
+				PRODUCT_NAME = "configd_base (EmbeddedOther)";
+			};
+			name = Debug;
+		};
+		1583EA18108395BB00A3BC0C /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "configd_base (EmbeddedOther)";
 			};
 			name = Release;
 		};
-		1572C52A0CFB55B400E2776E /* Debug */ = {
+		1583EA97108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
-				INFOPLIST_FILE = "SystemConfiguration.fproj/Info-Embedded.plist";
+				GCC_PREPROCESSOR_DEFINITIONS = TARGET_OS_EMBEDDED_OTHER;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = SystemConfiguration.fproj/Info.plist;
 				INSTALLHDRS_SCRIPT_PHASE = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
@@ -5427,13 +7467,13 @@
 			};
 			name = Debug;
 		};
-		1572C52B0CFB55B400E2776E /* Release */ = {
+		1583EA98108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
-				INFOPLIST_FILE = "SystemConfiguration.fproj/Info-Embedded.plist";
+				GCC_PREPROCESSOR_DEFINITIONS = TARGET_OS_EMBEDDED_OTHER;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = SystemConfiguration.fproj/Info.plist;
 				INSTALLHDRS_SCRIPT_PHASE = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
@@ -5443,524 +7483,455 @@
 			};
 			name = Release;
 		};
-		157433E90D4A8122002ACA73 /* Debug */ = {
+		1583EAA8108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
+				APPLY_RULES_IN_COPY_FILES = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
-				INSTALL_PATH = /usr/sbin;
-				PRODUCT_NAME = scselect;
-				STRIPFLAGS = "-S";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework";
+				PRODUCT_NAME = SCHelper;
 			};
 			name = Debug;
 		};
-		157433EA0D4A8122002ACA73 /* Release */ = {
+		1583EAA9108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				DEAD_CODE_STRIPPING = YES;
+				APPLY_RULES_IN_COPY_FILES = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
-				INSTALL_PATH = /usr/sbin;
-				PRODUCT_NAME = scselect;
-				STRIPFLAGS = "-S";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework";
+				PRODUCT_NAME = SCHelper;
 			};
 			name = Release;
 		};
-		157434170D4A8137002ACA73 /* Debug */ = {
+		1583EAC8108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/sbin;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
-				);
-				PREBINDING = NO;
-				PRODUCT_NAME = scutil;
-				STRIPFLAGS = "-S";
+				PRODUCT_NAME = "configd_plugins (EmbeddedOther)";
 			};
 			name = Debug;
 		};
-		157434180D4A8137002ACA73 /* Release */ = {
+		1583EAC9108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/sbin;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
-				);
-				PREBINDING = YES;
-				PRODUCT_NAME = scutil;
-				STRIPFLAGS = "-S";
+				PRODUCT_NAME = "configd_plugins (EmbeddedOther)";
 			};
 			name = Release;
 		};
-		157A84E50D56C63900B6F1A0 /* Debug */ = {
+		1583EAD6108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				BUILD_VARIANTS = (
-					normal,
-					debug,
-					profile,
-				);
-				COPY_PHASE_STRIP = NO;
-				GENERATE_PROFILING_CODE_profile = YES;
-				INSTALLHDRS_COPY_PHASE = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/system;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				OTHER_CFLAGS_debug = "-O0";
-				OTHER_CFLAGS_normal = "";
-				OTHER_CFLAGS_profile = "";
-				OTHER_MIGFLAGS = "-DLIBDNSINFO";
-				PRODUCT_NAME = dnsinfo;
-				STRIPFLAGS = "";
-				STRIP_INSTALLED_PRODUCT_debug = NO;
-				STRIP_INSTALLED_PRODUCT_normal = YES;
-				STRIP_INSTALLED_PRODUCT_profile = NO;
+				PRODUCT_NAME = IPMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		157A84E60D56C63900B6F1A0 /* Release */ = {
+		1583EAD7108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				BUILD_VARIANTS = (
-					normal,
-					debug,
-					profile,
-				);
-				COPY_PHASE_STRIP = YES;
-				GENERATE_PROFILING_CODE_profile = YES;
-				INSTALLHDRS_COPY_PHASE = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/system;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				OTHER_CFLAGS_debug = "-O0";
-				OTHER_CFLAGS_normal = "";
-				OTHER_CFLAGS_profile = "";
-				OTHER_MIGFLAGS = "-DLIBDNSINFO";
-				PRODUCT_NAME = dnsinfo;
-				STRIPFLAGS = "";
-				STRIP_INSTALLED_PRODUCT_debug = NO;
-				STRIP_INSTALLED_PRODUCT_normal = YES;
-				STRIP_INSTALLED_PRODUCT_profile = NO;
+				PRODUCT_NAME = IPMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		157A84FF0D56C7E800B6F1A0 /* Debug */ = {
+		1583EADC108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
 				PRODUCT_NAME = IPMonitor;
 			};
 			name = Debug;
 		};
-		157A85000D56C7E800B6F1A0 /* Release */ = {
+		1583EADD108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
 				PRODUCT_NAME = IPMonitor;
 			};
 			name = Release;
 		};
-		157A850A0D56C8AA00B6F1A0 /* Debug */ = {
+		1583EAE5108395BB00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
 				PRODUCT_NAME = InterfaceNamer;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		157A850B0D56C8AA00B6F1A0 /* Release */ = {
+		1583EAE6108395BB00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
 				PRODUCT_NAME = InterfaceNamer;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		157A85200D56C8E000B6F1A0 /* Debug */ = {
+		1583EAEB108395BC00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = KernelEventMonitor;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = InterfaceNamer;
 			};
 			name = Debug;
 		};
-		157A85210D56C8E000B6F1A0 /* Release */ = {
+		1583EAEC108395BC00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = KernelEventMonitor;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = InterfaceNamer;
 			};
 			name = Release;
 		};
-		157A852B0D56C91100B6F1A0 /* Debug */ = {
+		1583EAFD108395BC00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = LinkConfiguration;
+				PRODUCT_NAME = KernelEventMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		157A852C0D56C91100B6F1A0 /* Release */ = {
+		1583EAFE108395BC00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = LinkConfiguration;
+				PRODUCT_NAME = KernelEventMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		157A85360D56C94F00B6F1A0 /* Debug */ = {
+		1583EB03108395BC00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
+				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = NetworkIdentification;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = KernelEventMonitor;
 			};
 			name = Debug;
 		};
-		157A85370D56C94F00B6F1A0 /* Release */ = {
+		1583EB04108395BC00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
+				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
-				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = NetworkIdentification;
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = KernelEventMonitor;
 			};
 			name = Release;
 		};
-		157A85410D56C96F00B6F1A0 /* Debug */ = {
+		1583EB0C108395BC00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = PreferencesMonitor;
+				PRODUCT_NAME = LinkConfiguration;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		157A85420D56C96F00B6F1A0 /* Release */ = {
+		1583EB0D108395BC00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
-				PRODUCT_NAME = PreferencesMonitor;
-			};
-			name = Release;
-		};
-		158316D90CFB774B006F62B9 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				PRODUCT_NAME = "configd_base (Embedded)";
-			};
-			name = Debug;
-		};
-		158316DA0CFB774B006F62B9 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				PRODUCT_NAME = "configd_base (Embedded)";
+				PRODUCT_NAME = LinkConfiguration;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		158317010CFB7761006F62B9 /* Debug */ = {
+		1583EB12108395BC00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = "configd_plugins (Embedded)";
+				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = LinkConfiguration;
 			};
 			name = Debug;
 		};
-		158317020CFB7761006F62B9 /* Release */ = {
+		1583EB13108395BC00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = "configd_plugins (Embedded)";
+				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = LinkConfiguration;
 			};
 			name = Release;
 		};
-		1583170C0CFB7782006F62B9 /* Debug */ = {
+		1583EB1F108395BC00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = "configd_executables (Embedded)";
+				INFOPLIST_FILE = "Plugins/Logger/Info-Embedded.plist";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = Logger;
 			};
 			name = Debug;
 		};
-		1583170D0CFB7782006F62B9 /* Release */ = {
+		1583EB20108395BC00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				PRODUCT_NAME = "configd_executables (Embedded)";
+				INFOPLIST_FILE = "Plugins/Logger/Info-Embedded.plist";
+				INSTALL_MODE_FLAG = "a-w,a+rX";
+				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
+				PRODUCT_NAME = Logger;
 			};
 			name = Release;
 		};
-		1583175E0CFB80A1006F62B9 /* Debug */ = {
+		1583EB28108395BD00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				APPLY_RULES_IN_COPY_FILES = YES;
-				CODE_SIGN_ENTITLEMENTS = configd.tproj/entitlements.plist;
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/libexec;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
-				);
-				PRODUCT_NAME = configd;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = NetworkIdentification;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		1583175F0CFB80A1006F62B9 /* Release */ = {
+		1583EB29108395BD00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				APPLY_RULES_IN_COPY_FILES = YES;
-				CODE_SIGN_ENTITLEMENTS = configd.tproj/entitlements.plist;
-				DEAD_CODE_STRIPPING = YES;
-				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = /usr/libexec;
-				LIBRARY_SEARCH_PATHS = (
-					"$(SYMROOT)",
-					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
-				);
-				PRODUCT_NAME = configd;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = NetworkIdentification;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		158317810CFB85C8006F62B9 /* Debug */ = {
+		1583EB2E108395BD00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
+				INFOPLIST_FILE = Plugins/NetworkIdentification/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = IPMonitor;
+				PRODUCT_NAME = NetworkIdentification;
 			};
 			name = Debug;
 		};
-		158317820CFB85C8006F62B9 /* Release */ = {
+		1583EB2F108395BD00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/IPMonitor/Info.plist;
+				INFOPLIST_FILE = Plugins/NetworkIdentification/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = IPMonitor;
+				PRODUCT_NAME = NetworkIdentification;
 			};
 			name = Release;
 		};
-		1583178A0CFB85DD006F62B9 /* Debug */ = {
+		1583EB37108395BD00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = InterfaceNamer;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = PreferencesMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
-		1583178B0CFB85DD006F62B9 /* Release */ = {
+		1583EB38108395BD00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/InterfaceNamer/Info.plist;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = InterfaceNamer;
+				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
+				LIBRARY_STYLE = STATIC;
+				PRODUCT_NAME = PreferencesMonitor;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
-		158317930CFB85F7006F62B9 /* Debug */ = {
+		1583EB3D108395BD00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
+				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = KernelEventMonitor;
+				PRODUCT_NAME = PreferencesMonitor;
 			};
 			name = Debug;
 		};
-		158317940CFB85F7006F62B9 /* Release */ = {
+		1583EB3E108395BD00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/KernelEventMonitor/Info.plist;
+				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = KernelEventMonitor;
+				PRODUCT_NAME = PreferencesMonitor;
 			};
 			name = Release;
 		};
-		1583179B0CFB860C006F62B9 /* Debug */ = {
+		1583EB49108395BD00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = LinkConfiguration;
+				PRODUCT_NAME = "configd_executables (EmbeddedOther)";
 			};
 			name = Debug;
 		};
-		1583179C0CFB860C006F62B9 /* Release */ = {
+		1583EB4A108395BD00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/LinkConfiguration/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = LinkConfiguration;
+				PRODUCT_NAME = "configd_executables (EmbeddedOther)";
 			};
 			name = Release;
 		};
-		158317A30CFB8626006F62B9 /* Debug */ = {
+		1583EB82108395BD00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/NetworkIdentification/Info.plist;
+				APPLY_RULES_IN_COPY_FILES = YES;
+				CODE_SIGN_ENTITLEMENTS = configd.tproj/entitlements.plist;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				GCC_PREPROCESSOR_DEFINITIONS = TARGET_OS_EMBEDDED_OTHER;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = NetworkIdentification;
+				INSTALL_PATH = /usr/libexec;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = configd;
 			};
 			name = Debug;
 		};
-		158317A40CFB8626006F62B9 /* Release */ = {
+		1583EB83108395BD00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/NetworkIdentification/Info.plist;
+				APPLY_RULES_IN_COPY_FILES = YES;
+				CODE_SIGN_ENTITLEMENTS = configd.tproj/entitlements.plist;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				GCC_PREPROCESSOR_DEFINITIONS = TARGET_OS_EMBEDDED_OTHER;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = NetworkIdentification;
+				INSTALL_PATH = /usr/libexec;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = configd;
 			};
 			name = Release;
 		};
-		158317AB0CFB8639006F62B9 /* Debug */ = {
+		1583EB8E108395BE00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = PreferencesMonitor;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
+				INSTALL_PATH = /usr/sbin;
+				PRODUCT_NAME = scselect;
 			};
 			name = Debug;
 		};
-		158317AC0CFB8639006F62B9 /* Release */ = {
+		1583EB8F108395BE00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				INFOPLIST_FILE = Plugins/PreferencesMonitor/Info.plist;
-				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/SystemConfiguration";
-				PRODUCT_NAME = PreferencesMonitor;
+				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
+				INSTALL_MODE_FLAG = "a-w,a+rX,u+s";
+				INSTALL_PATH = /usr/sbin;
+				PRODUCT_NAME = scselect;
 			};
 			name = Release;
 		};
-		158337A70CFB6B9E0033AB93 /* Debug */ = {
+		1583EBB4108395BE00A3BC0C /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				APPLY_RULES_IN_COPY_FILES = YES;
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework";
-				PRODUCT_NAME = SCHelper;
-				STRIPFLAGS = "-S";
+				INSTALL_PATH = /usr/sbin;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = scutil;
 			};
 			name = Debug;
 		};
-		158337A80CFB6B9E0033AB93 /* Release */ = {
+		1583EBB5108395BE00A3BC0C /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
-				APPLY_RULES_IN_COPY_FILES = YES;
-				COPY_PHASE_STRIP = YES;
-				DEAD_CODE_STRIPPING = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(SYMROOT)";
-				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
-				INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Frameworks/SystemConfiguration.framework";
-				PRODUCT_NAME = SCHelper;
-				STRIPFLAGS = "-S";
+				INSTALL_PATH = /usr/sbin;
+				LIBRARY_SEARCH_PATHS = (
+					"$(SYMROOT)",
+					"$(SDKROOT)/usr/local/lib/SystemConfiguration",
+				);
+				PRODUCT_NAME = scutil;
 			};
 			name = Release;
 		};
@@ -5968,13 +7939,16 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15FD147B0D594FE700F9409C /* IndigoSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
 				INFOPLIST_FILE = "SystemConfiguration.fproj/Info-Embedded.plist";
 				INSTALLHDRS_SCRIPT_PHASE = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH_ACTUAL = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
 				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
+				OTHER_CFLAGS = (
+					"-idirafter",
+					"$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders",
+				);
 				PRODUCT_NAME = SystemConfiguration;
 				WRAPPER_EXTENSION = framework;
 			};
@@ -5984,13 +7958,16 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 15FD147B0D594FE700F9409C /* IndigoSDK.xcconfig */;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				HEADER_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
+				HEADER_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders";
 				INFOPLIST_FILE = "SystemConfiguration.fproj/Info-Embedded.plist";
 				INSTALLHDRS_SCRIPT_PHASE = YES;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH_ACTUAL = "$(SYSTEM_LIBRARY_DIR)/Frameworks";
 				LIBRARY_SEARCH_PATHS = "$(SYMROOT)";
+				OTHER_CFLAGS = (
+					"-idirafter",
+					"$(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/PrivateHeaders",
+				);
 				PRODUCT_NAME = SystemConfiguration;
 				WRAPPER_EXTENSION = framework;
 			};
@@ -6014,6 +7991,7 @@
 		};
 		15C64A2C0F684C6B00D78394 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				INSTALL_PATH = /usr/local/lib/system;
 				PRODUCT_NAME = "configd_libSystem (Embedded)";
@@ -6022,6 +8000,7 @@
 		};
 		15C64A2D0F684C6B00D78394 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 15AEABBC0DAD5B3000D1C969 /* AspenSDK.xcconfig */;
 			buildSettings = {
 				INSTALL_PATH = /usr/local/lib/system;
 				PRODUCT_NAME = "configd_libSystem (Embedded)";
@@ -6047,22 +8026,24 @@
 		F95B8A620B03F83200993BA3 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
 				PRODUCT_NAME = NetworkIdentification;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Debug;
 		};
 		F95B8A630B03F83200993BA3 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
 				INSTALL_MODE_FLAG = "a-w,a+rX";
 				INSTALL_PATH = /usr/local/lib/SystemConfiguration;
 				LIBRARY_STYLE = STATIC;
 				PRODUCT_NAME = NetworkIdentification;
+				STRIP_INSTALLED_PRODUCT = NO;
 			};
 			name = Release;
 		};
@@ -6179,15 +8160,6 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		156EB5EA0905594A00EEF749 /* Build configuration list for PBXNativeTarget "ATconfig.bundle" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				156EB5EB0905594A00EEF749 /* Debug */,
-				156EB5EC0905594A00EEF749 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
 		156EB5EE0905594A00EEF749 /* Build configuration list for PBXNativeTarget "IPMonitor" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
@@ -6242,15 +8214,6 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		156EB60A0905594A00EEF749 /* Build configuration list for PBXNativeTarget "Kicker.bundle" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				156EB60B0905594A00EEF749 /* Debug */,
-				156EB60C0905594A00EEF749 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
 		156EB60E0905594A00EEF749 /* Build configuration list for PBXNativeTarget "LinkConfiguration" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
@@ -6539,6 +8502,222 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
+		1583E9E91083959E00A3BC0C /* Build configuration list for PBXAggregateTarget "All-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583E9EA1083959E00A3BC0C /* Debug */,
+				1583E9EB1083959E00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EA01108395BB00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_libSystem-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EA02108395BB00A3BC0C /* Debug */,
+				1583EA03108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EA0D108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "DNSConfiguration-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EA0E108395BB00A3BC0C /* Debug */,
+				1583EA0F108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EA16108395BB00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_base-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EA17108395BB00A3BC0C /* Debug */,
+				1583EA18108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EA96108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "SystemConfiguration.framework-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EA97108395BB00A3BC0C /* Debug */,
+				1583EA98108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EAA7108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "SCHelper-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EAA8108395BB00A3BC0C /* Debug */,
+				1583EAA9108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EAC7108395BB00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_plugins-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EAC8108395BB00A3BC0C /* Debug */,
+				1583EAC9108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EAD5108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "IPMonitor-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EAD6108395BB00A3BC0C /* Debug */,
+				1583EAD7108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EADB108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "IPMonitor.bundle-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EADC108395BB00A3BC0C /* Debug */,
+				1583EADD108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EAE4108395BB00A3BC0C /* Build configuration list for PBXNativeTarget "InterfaceNamer-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EAE5108395BB00A3BC0C /* Debug */,
+				1583EAE6108395BB00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EAEA108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "InterfaceNamer.bundle-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EAEB108395BC00A3BC0C /* Debug */,
+				1583EAEC108395BC00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EAFC108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "KernelEventMonitor-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EAFD108395BC00A3BC0C /* Debug */,
+				1583EAFE108395BC00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB02108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "KernelEventMonitor.bundle-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB03108395BC00A3BC0C /* Debug */,
+				1583EB04108395BC00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB0B108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "LinkConfiguration-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB0C108395BC00A3BC0C /* Debug */,
+				1583EB0D108395BC00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB11108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "LinkConfiguration.bundle-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB12108395BC00A3BC0C /* Debug */,
+				1583EB13108395BC00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB1E108395BC00A3BC0C /* Build configuration list for PBXNativeTarget "Logger.bundle-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB1F108395BC00A3BC0C /* Debug */,
+				1583EB20108395BC00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB27108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "NetworkIdentification-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB28108395BD00A3BC0C /* Debug */,
+				1583EB29108395BD00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB2D108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "NetworkIdentification.bundle-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB2E108395BD00A3BC0C /* Debug */,
+				1583EB2F108395BD00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB36108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "PreferencesMonitor-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB37108395BD00A3BC0C /* Debug */,
+				1583EB38108395BD00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB3C108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "PreferencesMonitor.bundle-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB3D108395BD00A3BC0C /* Debug */,
+				1583EB3E108395BD00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB48108395BD00A3BC0C /* Build configuration list for PBXAggregateTarget "configd_executables-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB49108395BD00A3BC0C /* Debug */,
+				1583EB4A108395BD00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB81108395BD00A3BC0C /* Build configuration list for PBXNativeTarget "configd-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB82108395BD00A3BC0C /* Debug */,
+				1583EB83108395BD00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EB8D108395BE00A3BC0C /* Build configuration list for PBXNativeTarget "scselect-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EB8E108395BE00A3BC0C /* Debug */,
+				1583EB8F108395BE00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1583EBB3108395BE00A3BC0C /* Build configuration list for PBXNativeTarget "scutil-EmbeddedOther" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1583EBB4108395BE00A3BC0C /* Debug */,
+				1583EBB5108395BE00A3BC0C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 		15A5A2660D5B94190087BDA0 /* Build configuration list for PBXNativeTarget "SystemConfiguration.framework-EmbeddedSimulator" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
diff --git a/dnsinfo/dnsinfo.h b/dnsinfo/dnsinfo.h
index 792591e..8700305 100644
--- a/dnsinfo/dnsinfo.h
+++ b/dnsinfo/dnsinfo.h
@@ -35,6 +35,8 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 
+#define	DNSINFO_VERSION		20091104
+
 #define DEFAULT_SEARCH_ORDER    200000   /* search order for the "default" resolver domain name */
 
 #define	DNS_PTR(type, name)				\
@@ -68,16 +70,23 @@ typedef struct {
 	DNS_PTR(char *,			options);	/* options */
 	DNS_VAR(uint32_t,		timeout);	/* timeout */
 	DNS_VAR(uint32_t,		search_order);	/* search_order */
-	DNS_VAR(uint32_t,		reserved[8]);
+	DNS_VAR(uint32_t,		if_index);
+	DNS_VAR(uint32_t,		flags);
+	DNS_VAR(uint32_t,		reserved[6]);
 } dns_resolver_t;
 #pragma pack()
 
 
+#define DNS_RESOLVER_FLAGS_SCOPED	1
+
+
 #pragma pack(4)
 typedef struct {
-	DNS_VAR(int32_t,		n_resolver);	/* resolver configurations */
+	DNS_VAR(int32_t,		n_resolver);		/* resolver configurations */
 	DNS_PTR(dns_resolver_t **,	resolver);
-	DNS_VAR(uint32_t,		reserved[8]);
+	DNS_VAR(int32_t,		n_scoped_resolver);	/* "scoped" resolver configurations */
+	DNS_PTR(dns_resolver_t **,	scoped_resolver);
+	DNS_VAR(uint32_t,		reserved[5]);
 } dns_config_t;
 #pragma pack()
 
diff --git a/dnsinfo/dnsinfo_copy.c b/dnsinfo/dnsinfo_copy.c
index ab536e7..1a2ea6f 100644
--- a/dnsinfo/dnsinfo_copy.c
+++ b/dnsinfo/dnsinfo_copy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2006, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004, 2006, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -80,6 +80,9 @@ add_list(void **padding, uint32_t *n_padding, int32_t count, int32_t size, void
 }
 
 
+#define	DNS_CONFIG_BUF_MAX	1024*1024
+
+
 static _dns_config_buf_t *
 copy_dns_info()
 {
@@ -102,7 +105,7 @@ copy_dns_info()
 			}
 
 			// our [cached] server port is not valid
-			if (status != MACH_SEND_INVALID_DEST) {
+			if ((status != MACH_SEND_INVALID_DEST) && (status != MIG_SERVER_DIED)) {
 				// if we got an unexpected error, don't retry
 				fprintf(stderr,
 					"dns_configuration_copy shared_dns_infoGet(): %s\n",
@@ -133,15 +136,18 @@ copy_dns_info()
 	}
 
 	if (dataRef != NULL) {
-		if (dataLen >= sizeof(_dns_config_buf_t)) {
+		if ((dataLen >= sizeof(_dns_config_buf_t)) && (dataLen <= DNS_CONFIG_BUF_MAX)) {
 			_dns_config_buf_t	*config		= (_dns_config_buf_t *)dataRef;
-			uint32_t		len;
 			uint32_t		n_padding       = ntohl(config->n_padding);
 
-			len = dataLen + n_padding;
-			buf = malloc(len);
-			bcopy((void *)dataRef, buf, dataLen);
-			bzero(&buf[dataLen], n_padding);
+			if (n_padding <= (DNS_CONFIG_BUF_MAX - dataLen)) {
+				uint32_t	len;
+
+				len = dataLen + n_padding;
+				buf = malloc(len);
+				bcopy((void *)dataRef, buf, dataLen);
+				bzero(&buf[dataLen], n_padding);
+			}
 		}
 
 		status = vm_deallocate(mach_task_self(), (vm_address_t)dataRef, dataLen);
@@ -223,6 +229,14 @@ expand_resolver(_dns_resolver_buf_t *buf, uint32_t n_buf, void **padding, uint32
 
 	resolver->search_order = ntohl(resolver->search_order);
 
+	// initialize if_index
+
+	resolver->if_index = ntohl(resolver->if_index);
+
+	// initialize flags
+
+	resolver->flags = ntohl(resolver->flags);
+
 	// process resolver buffer "attribute" data
 
 	n_attribute = n_buf - sizeof(_dns_resolver_buf_t);
@@ -281,10 +295,11 @@ static dns_config_t *
 expand_config(_dns_config_buf_t *buf)
 {
 	dns_attribute_t		*attribute;
-	dns_config_t		*config		= (dns_config_t *)buf;
+	dns_config_t		*config			= (dns_config_t *)buf;
 	uint32_t		n_attribute;
 	uint32_t		n_padding;
-	int32_t			n_resolver      = 0;
+	int32_t			n_resolver		= 0;
+	int32_t			n_scoped_resolver	= 0;
 	void			*padding;
 
 	// establish padding
@@ -292,7 +307,7 @@ expand_config(_dns_config_buf_t *buf)
 	padding   = &buf->attribute[ntohl(buf->n_attribute)];
 	n_padding = ntohl(buf->n_padding);
 
-	// initialize resolver list
+	// initialize resolver lists
 
 	config->n_resolver = ntohl(config->n_resolver);
 	if (!add_list(&padding,
@@ -303,16 +318,27 @@ expand_config(_dns_config_buf_t *buf)
 		goto error;
 	}
 
+	config->n_scoped_resolver = ntohl(config->n_scoped_resolver);
+	if (!add_list(&padding,
+		      &n_padding,
+		      config->n_scoped_resolver,
+		      sizeof(DNS_PTR(dns_resolver_t *, x)),
+		      (void **)&config->scoped_resolver)) {
+		goto error;
+	}
+
 	// process configuration buffer "attribute" data
 
 	n_attribute = ntohl(buf->n_attribute);
 	attribute   = (dns_attribute_t *)&buf->attribute[0];
 
 	while (n_attribute >= sizeof(dns_attribute_t)) {
-		int32_t	attribute_length	= ntohl(attribute->length);
+		uint32_t	attribute_length	= ntohl(attribute->length);
+		uint32_t	attribute_type		= ntohl(attribute->type);
 
-		switch (ntohl(attribute->type)) {
-			case CONFIG_ATTRIBUTE_RESOLVER : {
+		switch (attribute_type) {
+			case CONFIG_ATTRIBUTE_RESOLVER :
+			case CONFIG_ATTRIBUTE_SCOPED_RESOLVER   : {
 				dns_resolver_t	*resolver;
 
 				// expand resolver buffer
@@ -327,7 +353,11 @@ expand_config(_dns_config_buf_t *buf)
 
 				// add resolver to config list
 
-				config->resolver[n_resolver++] = resolver;
+				if (attribute_type == CONFIG_ATTRIBUTE_RESOLVER) {
+					config->resolver[n_resolver++] = resolver;
+				} else {
+					config->scoped_resolver[n_scoped_resolver++] = resolver;
+				}
 
 				break;
 			}
@@ -344,6 +374,10 @@ expand_config(_dns_config_buf_t *buf)
 		goto error;
 	}
 
+	if (n_scoped_resolver != config->n_scoped_resolver) {
+		goto error;
+	}
+
 	return config;
 
     error :
@@ -355,7 +389,13 @@ expand_config(_dns_config_buf_t *buf)
 const char *
 dns_configuration_notify_key()
 {
-	return _dns_configuration_notify_key();
+	const char	*key;
+
+	// initialize runtime
+	pthread_once(&_dns_initialized, __dns_initialize);
+
+	key = _dns_configuration_notify_key();
+	return key;
 }
 
 
@@ -390,3 +430,20 @@ dns_configuration_free(dns_config_t *config)
 	free((void *)config);
 	return;
 }
+
+#ifdef MAIN
+
+int
+main(int argc, char **argv)
+{
+	dns_config_t	*config;
+
+	config = dns_configuration_copy();
+	if (config != NULL) {
+		dns_configuration_free(&config);
+	}
+
+	exit(0);
+}
+
+#endif
diff --git a/dnsinfo/dnsinfo_create.c b/dnsinfo/dnsinfo_create.c
index 6cd07e0..820797a 100644
--- a/dnsinfo/dnsinfo_create.c
+++ b/dnsinfo/dnsinfo_create.c
@@ -132,13 +132,21 @@ _dns_configuration_add_resolver(dns_create_config_t     *_config,
 		padding += ntohl(resolver->resolver.n_sortaddr) * sizeof(DNS_PTR(dns_sortaddr_t *, x));
 	}
 
-	config->config.n_resolver = htonl(ntohl(config->config.n_resolver) + 1);
-
-	config_add_attribute(_config,
-			     CONFIG_ATTRIBUTE_RESOLVER,
-			     sizeof(_dns_resolver_buf_t) + ntohl(resolver->n_attribute),
-			     (void *)resolver,
-			     padding);
+	if ((ntohl(resolver->resolver.flags) & DNS_RESOLVER_FLAGS_SCOPED) == 0) {
+		config->config.n_resolver = htonl(ntohl(config->config.n_resolver) + 1);
+		config_add_attribute(_config,
+				     CONFIG_ATTRIBUTE_RESOLVER,
+				     sizeof(_dns_resolver_buf_t) + ntohl(resolver->n_attribute),
+				     (void *)resolver,
+				     padding);
+	} else {
+		config->config.n_scoped_resolver = htonl(ntohl(config->config.n_scoped_resolver) + 1);
+		config_add_attribute(_config,
+				     CONFIG_ATTRIBUTE_SCOPED_RESOLVER,
+				     sizeof(_dns_resolver_buf_t) + ntohl(resolver->n_attribute),
+				     (void *)resolver,
+				     padding);
+	}
 
 	return;
 }
@@ -247,52 +255,51 @@ _dns_resolver_add_attribute(dns_create_resolver_t	*_resolver,
 
 
 void
-_dns_resolver_set_domain(dns_create_resolver_t *_resolver, const char *domain)
+_dns_resolver_add_nameserver(dns_create_resolver_t *_resolver, struct sockaddr *nameserver)
 {
-	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_DOMAIN, strlen(domain) + 1, (void *)domain);
+	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
+
+	resolver->resolver.n_nameserver = htonl(ntohl(resolver->resolver.n_nameserver) + 1);
+	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_ADDRESS, nameserver->sa_len, (void *)nameserver);
 	return;
 }
 
 
 void
-_dns_resolver_add_nameserver(dns_create_resolver_t *_resolver, struct sockaddr *nameserver)
+_dns_resolver_add_search(dns_create_resolver_t *_resolver, const char *search)
 {
 	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
 
-	resolver->resolver.n_nameserver = htonl(ntohl(resolver->resolver.n_nameserver) + 1);
-	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_ADDRESS, nameserver->sa_len, (void *)nameserver);
+	resolver->resolver.n_search = htonl(ntohl(resolver->resolver.n_search) + 1);
+	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_SEARCH, strlen(search) + 1, (void *)search);
 	return;
 }
 
 
 void
-_dns_resolver_set_port(dns_create_resolver_t *_resolver, uint16_t port)
+_dns_resolver_set_domain(dns_create_resolver_t *_resolver, const char *domain)
 {
-	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
-
-	resolver->resolver.port = htons(port);
+	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_DOMAIN, strlen(domain) + 1, (void *)domain);
 	return;
 }
 
 
 void
-_dns_resolver_add_search(dns_create_resolver_t *_resolver, const char *search)
+_dns_resolver_set_flags(dns_create_resolver_t *_resolver, uint32_t flags)
 {
 	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
 
-	resolver->resolver.n_search = htonl(ntohl(resolver->resolver.n_search) + 1);
-	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_SEARCH, strlen(search) + 1, (void *)search);
+	resolver->resolver.flags = htonl(flags);
 	return;
 }
 
 
 void
-_dns_resolver_add_sortaddr(dns_create_resolver_t *_resolver, dns_sortaddr_t *sortaddr)
+_dns_resolver_set_if_index(dns_create_resolver_t *_resolver, uint32_t if_index)
 {
 	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
 
-	resolver->resolver.n_sortaddr = htonl(ntohl(resolver->resolver.n_sortaddr) + 1);
-	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_SORTADDR, sizeof(dns_sortaddr_t), (void *)sortaddr);
+	resolver->resolver.if_index = htonl(if_index);
 	return;
 }
 
@@ -306,21 +313,42 @@ _dns_resolver_set_options(dns_create_resolver_t *_resolver, const char *options)
 
 
 void
-_dns_resolver_set_timeout(dns_create_resolver_t *_resolver, uint32_t timeout)
+_dns_resolver_set_order(dns_create_resolver_t *_resolver, uint32_t order)
 {
 	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
 
-	resolver->resolver.timeout = htonl(timeout);
+	resolver->resolver.search_order = htonl(order);
 	return;
 }
 
 
 void
-_dns_resolver_set_order(dns_create_resolver_t *_resolver, uint32_t order)
+_dns_resolver_set_port(dns_create_resolver_t *_resolver, uint16_t port)
 {
 	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
 
-	resolver->resolver.search_order = htonl(order);
+	resolver->resolver.port = htons(port);
+	return;
+}
+
+
+void
+_dns_resolver_add_sortaddr(dns_create_resolver_t *_resolver, dns_sortaddr_t *sortaddr)
+{
+	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
+
+	resolver->resolver.n_sortaddr = htonl(ntohl(resolver->resolver.n_sortaddr) + 1);
+	_dns_resolver_add_attribute(_resolver, RESOLVER_ATTRIBUTE_SORTADDR, sizeof(dns_sortaddr_t), (void *)sortaddr);
+	return;
+}
+
+
+void
+_dns_resolver_set_timeout(dns_create_resolver_t *_resolver, uint32_t timeout)
+{
+	_dns_resolver_buf_t	*resolver	= (_dns_resolver_buf_t *)*_resolver;
+
+	resolver->resolver.timeout = htonl(timeout);
 	return;
 }
 
diff --git a/dnsinfo/dnsinfo_create.h b/dnsinfo/dnsinfo_create.h
index 2e01860..5ad526d 100644
--- a/dnsinfo/dnsinfo_create.h
+++ b/dnsinfo/dnsinfo_create.h
@@ -91,11 +91,6 @@ void
 _dns_resolver_add_nameserver	(dns_create_resolver_t	*_resolver,
 				 struct sockaddr	*nameserver)		/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;
 
-__private_extern__
-void
-_dns_resolver_set_port		(dns_create_resolver_t	*_resolver,
-				 uint16_t		port)			/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;	// host byte order
-
 __private_extern__
 void
 _dns_resolver_add_search	(dns_create_resolver_t	*_resolver,
@@ -108,19 +103,34 @@ _dns_resolver_add_sortaddr	(dns_create_resolver_t	*_resolver,
 
 __private_extern__
 void
-_dns_resolver_set_options	(dns_create_resolver_t	*_resolver,
-				 const char		*options)		/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;
+_dns_resolver_set_flags		(dns_create_resolver_t	*_resolver,
+				 uint32_t		flags)			/*__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0)*/;
 
 __private_extern__
 void
-_dns_resolver_set_timeout	(dns_create_resolver_t	*_resolver,
-				 uint32_t		timeout)		/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;
+_dns_resolver_set_if_index	(dns_create_resolver_t	*_resolver,
+				 uint32_t		if_index)		/*__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0)*/;
+
+__private_extern__
+void
+_dns_resolver_set_options	(dns_create_resolver_t	*_resolver,
+				 const char		*options)		/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;
 
 __private_extern__
 void
 _dns_resolver_set_order		(dns_create_resolver_t	*_resolver,
 				 uint32_t		order)			/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;
 
+__private_extern__
+void
+_dns_resolver_set_port		(dns_create_resolver_t	*_resolver,
+				 uint16_t		port)			/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;	// host byte order
+
+__private_extern__
+void
+_dns_resolver_set_timeout	(dns_create_resolver_t	*_resolver,
+				 uint32_t		timeout)		/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;
+
 __private_extern__
 void
 _dns_resolver_free		(dns_create_resolver_t	*_resolver)		/*__OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0)*/;
diff --git a/dnsinfo/dnsinfo_flatfile.c b/dnsinfo/dnsinfo_flatfile.c
index 378be84..664fcb4 100644
--- a/dnsinfo/dnsinfo_flatfile.c
+++ b/dnsinfo/dnsinfo_flatfile.c
@@ -29,7 +29,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <net/if.h>
 #include <sys/dir.h>
+#include <sys/types.h>
+#include <sys/socket.h>
 #include <unistd.h>
 
 #include "dnsinfo.h"
@@ -37,14 +40,16 @@
 #include "dnsinfo_create.h"
 
 enum {
+	TOKEN_DOMAIN,
+	TOKEN_FLAGS,
+	TOKEN_INTERFACE,
 	TOKEN_NAMESERVER,
+	TOKEN_OPTIONS,
 	TOKEN_PORT,
-	TOKEN_DOMAIN,
 	TOKEN_SEARCH,
 	TOKEN_SEARCH_ORDER,
 	TOKEN_SORTLIST,
 	TOKEN_TIMEOUT,
-	TOKEN_OPTIONS,
 	TOKEN_MAX
 };
 
@@ -57,14 +62,16 @@ static const struct {
 	int		token;
 	int		max_count;
 } tokens [] = {
+	{ "domain",		TOKEN_DOMAIN,		1	},
+	{ "flags",		TOKEN_FLAGS,		1	},
+	{ "interface",		TOKEN_INTERFACE,	1	},
 	{ "nameserver",		TOKEN_NAMESERVER,	MAXNS	},
+	{ "options",		TOKEN_OPTIONS,		1	},
 	{ "port",		TOKEN_PORT,		1	},
-	{ "domain",		TOKEN_DOMAIN,		1	},
 	{ "search",		TOKEN_SEARCH,		1	},
 	{ "search_order",	TOKEN_SEARCH_ORDER,	1	},
 	{ "sortlist",		TOKEN_SORTLIST,		1	},
 	{ "timeout",		TOKEN_TIMEOUT,		1	},
-	{ "options",		TOKEN_OPTIONS,		1	},
 };
 
 
@@ -313,9 +320,47 @@ _dnsinfo_flatfile_create_resolver(const char *dir, const char *path)
 		}
 
 		switch (token) {
-			case TOKEN_DOMAIN:
-				_dns_resolver_set_domain(&res, word);
+			case TOKEN_DOMAIN: {
+				size_t	len;
+
+				len = strlen(word);
+				while ((len > 0) && (word[len - 1] == '.')) {
+					// trim trailing '.'
+					word[--len] = '\0';
+				}
+				if (len > 0) {
+					_dns_resolver_set_domain(&res, word);
+				}
 				break;
+			}
+
+			case TOKEN_FLAGS: {
+				uint32_t	flags	= 0;
+
+				while (word != NULL) {
+					if (word[0] != '\0') {
+						if (strcasecmp(word, "scoped") == 0) {
+							flags |= DNS_RESOLVER_FLAGS_SCOPED;
+						}
+					}
+					word = strsep(&lineptr, sep);
+				}
+
+				if (flags != 0) {
+					_dns_resolver_set_flags(&res, flags);
+				}
+				break;
+			}
+
+			case TOKEN_INTERFACE: {
+				unsigned int	if_index;
+
+				if_index = if_nametoindex(word);
+				if (if_index > 0) {
+					_dns_resolver_set_if_index(&res, if_index);
+				}
+				break;
+			}
 
 			case TOKEN_NAMESERVER: {
 				struct sockaddr	*sa;
@@ -328,6 +373,31 @@ _dnsinfo_flatfile_create_resolver(const char *dir, const char *path)
 				break;
 			}
 
+			case TOKEN_OPTIONS: {
+				char	*options	= NULL;
+
+				while (word != NULL) {
+					if (word[0] != '\0') {
+						if (options == NULL) {
+							options = malloc(len+1);
+							if (options == NULL) break;
+
+							strlcpy(options, word, len+1);
+						} else {
+							strlcat(options, " ", len+1);
+							strlcat(options, word, len+1);
+						}
+					}
+					word = strsep(&lineptr, sep);
+				}
+
+				if (options != NULL) {
+					_dns_resolver_set_options(&res, options);
+					free(options);
+				}
+				break;
+			}
+
 			case TOKEN_PORT: {
 				long	number	= -1;
 
@@ -342,12 +412,30 @@ _dnsinfo_flatfile_create_resolver(const char *dir, const char *path)
 
 				// multiple search domains are supported
 				while ((word != NULL) && (n++ < MAXDNSRCH)) {
-					_dns_resolver_add_search(&res, word);
+					size_t	len;
+
+					len = strlen(word);
+					while ((len > 0) && (word[len - 1] == '.')) {
+						// trim trailing '.'
+						word[--len] = '\0';
+					}
+					if (len > 0) {
+						_dns_resolver_add_search(&res, word);
+					}
 					word = strsep(&lineptr, sep);
 				}
 				break;
 			}
 
+			case TOKEN_SEARCH_ORDER: {
+				long	number	= -1;
+
+				number = strtol(word, NULL, 0);
+				if (number < 0 || number > UINT32_MAX) break;
+				_dns_resolver_set_order(&res, number);
+				break;
+			}
+
 			case TOKEN_SORTLIST: {
 				int	n	= 0;
 
@@ -363,10 +451,6 @@ _dnsinfo_flatfile_create_resolver(const char *dir, const char *path)
 				break;
 			}
 
-			case TOKEN_OPTIONS:
-				_dns_resolver_set_options(&res, lineptr);
-				break;
-
 			case TOKEN_TIMEOUT: {
 				long	number	= -1;
 
@@ -375,15 +459,6 @@ _dnsinfo_flatfile_create_resolver(const char *dir, const char *path)
 				_dns_resolver_set_timeout(&res, number);
 				break;
 			}
-
-			case TOKEN_SEARCH_ORDER: {
-				long	number	= -1;
-
-				number = strtol(word, NULL, 0);
-				if (number < 0 || number > UINT32_MAX) break;
-				_dns_resolver_set_order(&res, number);
-				break;
-			}
 		}
 	}
 	if (line != NULL) free(line);
@@ -442,7 +517,8 @@ _dnsinfo_flatfile_add_resolvers(dns_create_config_t *config)
 }
 
 
-#ifdef MAIN
+#ifdef	MAIN
+#undef	MAIN
 
 #include "dnsinfo_copy.c"
 
@@ -472,4 +548,5 @@ main(int argc, char **argv)
 
 	return 0;
 }
+
 #endif
diff --git a/dnsinfo/dnsinfo_private.c b/dnsinfo/dnsinfo_private.c
index 4d7c2dd..f7b256f 100644
--- a/dnsinfo/dnsinfo_private.c
+++ b/dnsinfo/dnsinfo_private.c
@@ -33,6 +33,7 @@
 #include <mach/mach.h>
 #include <mach/mach_error.h>
 #include <servers/bootstrap.h>
+#include <bootstrap_priv.h>
 
 #include "dnsinfo_private.h"
 #include "shared_dns_info_types.h"
@@ -59,11 +60,23 @@ _dns_configuration_server_port()
 		server_name = DNS_SERVER;
 	}
 
+#ifdef	BOOTSTRAP_PRIVILEGED_SERVER
+	status = bootstrap_look_up2(bootstrap_port,
+				    server_name,
+				    &server,
+				    0,
+				    BOOTSTRAP_PRIVILEGED_SERVER);
+#else	// BOOTSTRAP_PRIVILEGED_SERVER
 	status = bootstrap_look_up(bootstrap_port, server_name, &server);
+#endif	// BOOTSTRAP_PRIVILEGED_SERVER
+
 	switch (status) {
 		case BOOTSTRAP_SUCCESS :
 			/* service currently registered, "a good thing" (tm) */
 			break;
+		case BOOTSTRAP_NOT_PRIVILEGED :
+			/* the service is not privileged */
+			return MACH_PORT_NULL;
 		case BOOTSTRAP_UNKNOWN_SERVICE :
 			/* service not currently registered, try again later */
 			return MACH_PORT_NULL;
diff --git a/dnsinfo/dnsinfo_private.h b/dnsinfo/dnsinfo_private.h
index 52b885e..58128a8 100644
--- a/dnsinfo/dnsinfo_private.h
+++ b/dnsinfo/dnsinfo_private.h
@@ -56,23 +56,30 @@
  * +-------------------------------------------------------------------+
  * | struct _dns_config_buf_t                                          |
  * +-+-------------+---------------------------------------------------+
- * | | config      | struct dns_config_t			       |
- * | |		   +-+--------------+----------------------------------+
- * | |             | | n_resolver   | int32_t                          | <- # of name resolvers
- * | |		   | +--------------+----------------------------------+
- * | |             | | resolver     | dns_resolver_t **                | <- not used during creation, filled
- * | |             | |              |                                  |    in with pointer to a list of
- * | |		   | |		    |                                  |    resolver configurations which be
- * | |		   | |		    |                                  |    established in the "padding"
- * | |		   | +--------------+----------------------------------+
- * | |		   | | ...          | ...                              |
- * | +-------------+-+--------------+----------------------------------+
+ * | | config      | struct dns_config_t                               |
+ * | |             +-+-------------------+-----------------------------+
+ * | |             | | n_resolver        | int32_t                     | <- # of name resolvers
+ * | |             | +-------------------+-----------------------------+
+ * | |             | | resolver          | dns_resolver_t **           | <- not used during creation, filled
+ * | |             | |                   |                             |    in with pointer to a list of
+ * | |             | |                   |                             |    resolver configurations that will
+ * | |             | |                   |                             |    be established in the "padding"
+ * | |             | +-------------------+-----------------------------+
+ * | |             | | n_scoped_resolver | int32_t                     | <- # of name scoped resolvers
+ * | |             | +-------------------+-----------------------------+
+ * | |             | | scoped_resolver   | dns_resolver_t **           | <- not used during creation, filled
+ * | |             | |                   |                             |    in with pointer to a list of scoped
+ * | |             | |                   |                             |    resolver configurations  that will
+ * | |             | |                   |                             |    be established in the "padding"
+ * | |             | +-------------------+-----------------------------+
+ * | |             | | ...               | ...                         |
+ * | +-------------+-+-------------------+-----------------------------+
  * | | n_attribute | uint32_t                                          | <- how many bytes of "attribute"
- * | |		   |                                                   |    data is associated with the
- * | |		   |                                                   |    configuration
+ * | |             |                                                   |    data is associated with the
+ * | |             |                                                   |    configuration
  * |-+-------------+---------------------------------------------------+
  * | | n_padding   | uint32_t                                          | <- how many additional bytes
- * | |		   |                                                   |    for arrays (of pointers), ...
+ * | |             |                                                   |    for arrays (of pointers), ...
  * +-+-------------+---------------------------------------------------+
  * | struct dns_attribute_t                                            |
  * |-+-------------+---------------------------------------------------+
@@ -83,54 +90,54 @@
  * | | attribute   | struct _dns_resolver_buf_t                        | <- the attribute data (resolver configuration #1)
  * | |             +-+-------------+-----------------------------------+
  * | |             | | resolver    | struct dns_resolver_t             |
- * | |             | |		   +--------------+--------------------+
- * | |             | |		   | domain       | char *             | <- not used during creation,
- * | |             | |		   |              |                    |    filled in with pointer to
- * | |             | |		   |              |                    |    domain name in the "padding"
- * | |             | |		   +--------------+--------------------+
- * | |             | |		   | n_nameserver | int32_t            | <- # of name server addresses
- * | |             | |		   +--------------+--------------------+
- * | |             | |		   | nameserver   | struct sockaddr ** | <- not used during creation,
- * | |             | |		   |              |                    |    filled in with pointer to
- * | |             | |		   |              |                    |    a list of addresses which
- * | |             | |		   |              |                    |    will be established in the
- * | |             | |		   |              |                    |    "padding"
- * | |             | |		   +--------------+--------------------+
- * | |             | |		   | ...	                       |
+ * | |             | |             +--------------+--------------------+
+ * | |             | |             | domain       | char *             | <- not used during creation,
+ * | |             | |             |              |                    |    filled in with pointer to
+ * | |             | |             |              |                    |    domain name in the "padding"
+ * | |             | |             +--------------+--------------------+
+ * | |             | |             | n_nameserver | int32_t            | <- # of name server addresses
+ * | |             | |             +--------------+--------------------+
+ * | |             | |             | nameserver   | struct sockaddr ** | <- not used during creation,
+ * | |             | |             |              |                    |    filled in with pointer to
+ * | |             | |             |              |                    |    a list of addresses which
+ * | |             | |             |              |                    |    will be established in the
+ * | |             | |             |              |                    |    "padding"
+ * | |             | |             +--------------+--------------------+
+ * | |             | |             | ...                               |
  * | |             +-+-------------+--------------+--------------------+
  * | |             | | n_attribute | uint32_t                          |
  * | |             +-+-------------+-----------------------------------+
  * | |             | | attribute   | struct dns_attribute_t            |
- * | |             | |		   +-+-----------+---------------------+
- * | |             | |		   | | type      | uint32_t            | <- type of attribute (e.g. RESOLVER_ATTRIBUTE_DOMAIN)
- * | |             | |		   | +-----------+---------------------+
+ * | |             | |             +-+-----------+---------------------+
+ * | |             | |             | | type      | uint32_t            | <- type of attribute (e.g. RESOLVER_ATTRIBUTE_DOMAIN)
+ * | |             | |             | +-----------+---------------------+
  * | |             | |             | | length    | uint32_t            | <- length of the attribute
- * | |             | |		   | +-----------+---------------------+
- * | |             | |		   | | attribute |		       | <- the attribute data ("apple.com")
+ * | |             | |             | +-----------+---------------------+
+ * | |             | |             | | attribute |                     | <- the attribute data ("apple.com")
  * | |             +-+-------------+-------------+---------------------+
  * | |             | | attribute   | struct dns_attribute_t            |
- * | |             | |		   +-+-----------+---------------------+
- * | |             | |		   | | type      | uint32_t            | <- type of attribute (e.g. RESOLVER_ATTRIBUTE_ADDRESS)
- * | |             | |		   | +-----------+---------------------+
+ * | |             | |             +-+-----------+---------------------+
+ * | |             | |             | | type      | uint32_t            | <- type of attribute (e.g. RESOLVER_ATTRIBUTE_ADDRESS)
+ * | |             | |             | +-----------+---------------------+
  * | |             | |             | | length    | uint32_t            | <- length of the attribute
- * | |             | |		   | +-----------+---------------------+
- * | |             | |		   | | attribute |		       | <- the attribute data ("struct sockaddr_in" #1)
+ * | |             | |             | +-----------+---------------------+
+ * | |             | |             | | attribute |                     | <- the attribute data ("struct sockaddr_in" #1)
  * | |             +---------------+-----------------------------------+
  * | |             | | attribute   | struct dns_attribute_t            |
- * | |             | |		   +-+-----------+---------------------+
- * | |             | |		   | | type      | uint32_t            | <- type of attribute (e.g. RESOLVER_ATTRIBUTE_ADDRESS)
- * | |             | |		   | +-----------+---------------------+
+ * | |             | |             +-+-----------+---------------------+
+ * | |             | |             | | type      | uint32_t            | <- type of attribute (e.g. RESOLVER_ATTRIBUTE_ADDRESS)
+ * | |             | |             | +-----------+---------------------+
  * | |             | |             | | length    | uint32_t            | <- length of the attribute
- * | |             | |		   | +-----------+---------------------+
- * | |             | |		   | | attribute |		       | <- the attribute data ("struct sockaddr_in" #2)
+ * | |             | |             | +-----------+---------------------+
+ * | |             | |             | | attribute |                     | <- the attribute data ("struct sockaddr_in" #2)
  * | |             +---------------+-----------------------------------+
- * | |             | ...					       |
+ * | |             | ...                                               |
  * +-+-------------+---------------------------------------------------+
- * | | attribute   | struct _dns_resolver_buf_t		               | <- the attribute data (resolver configuration #2)
+ * | | attribute   | struct _dns_resolver_buf_t                        | <- the attribute data (resolver configuration #2)
  * | |             +---------------+-----------------------------------+
- * | |             | ...	    				       |
+ * | |             | ...                                               |
  * +---------------+---------------------------------------------------+
- * | | ...          						       |
+ * | | ...                                                             |
  * +---------------+---------------------------------------------------+
  *
  * When the data is unpacked the "n_padding" additional bytes
@@ -143,7 +150,8 @@
 
 // configuration buffer attributes
 enum {
-	CONFIG_ATTRIBUTE_RESOLVER	= 1
+	CONFIG_ATTRIBUTE_RESOLVER	= 1,
+	CONFIG_ATTRIBUTE_SCOPED_RESOLVER,
 };
 
 
@@ -153,7 +161,9 @@ enum {
 	RESOLVER_ATTRIBUTE_ADDRESS,
 	RESOLVER_ATTRIBUTE_SEARCH,
 	RESOLVER_ATTRIBUTE_SORTADDR,
-	RESOLVER_ATTRIBUTE_OPTIONS
+	RESOLVER_ATTRIBUTE_IF_INDEX,
+	RESOLVER_ATTRIBUTE_FLAGS,
+	RESOLVER_ATTRIBUTE_OPTIONS,
 };
 
 
diff --git a/get-mobility-info b/get-mobility-info
index f5e5cb8..adc3d6a 100755
--- a/get-mobility-info
+++ b/get-mobility-info
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright (c) 2004-2009 Apple Inc.
+# Copyright (c) 2004-2011 Apple Inc.
 #
 # get-mobility-info
 #
@@ -54,7 +54,10 @@ ps axlww						> ps			2>&1
 #
 # network interface configuration
 #
-ifconfig -a -b						> ifconfig		2>&1
+ifconfig -a -L -b -m -r -v				> ifconfig		2>&1
+if [ $? -ne 0 ]; then
+	ifconfig -a					> ifconfig		2>&1
+fi
 
 #
 # network route configuration
@@ -142,6 +145,7 @@ for f in										\
 	/Library/Preferences/SystemConfiguration/preferences.plist			\
 	/Library/Preferences/com.apple.alf.plist					\
 	/Library/Preferences/com.apple.sharing.firewall.plist				\
+	/Library/Preferences/com.apple.wwand.plist					\
 
 do
 	if [ -e "${f}" ]; then
@@ -150,6 +154,17 @@ do
 	fi
 done
 
+#
+# InternetSharing
+#
+if   [ -e /etc/bootpd.plist ]; then
+	cat /etc/bootpd.plist							> bootpd.plist			2>&1
+	cat /etc/com.apple.named.proxy.conf					> com.apple.named.proxy.conf	2>&1
+elif [ -e /Library/Preferences/SystemConfiguration/bootpd.plist ]; then
+	cat /Library/Preferences/SystemConfiguration/bootpd.plist		> bootpd.plist			2>&1
+	cat /Library/Preferences/SystemConfiguration/com.apple.named.proxy.conf	> com.apple.named.proxy.conf	2>&1
+fi
+
 #
 # configd's cache
 #
@@ -158,19 +173,34 @@ open
 snapshot
 quit
 _END_OF_INPUT
-if [ -f /var/tmp/configd-store.xml ]; then
-	cat /var/tmp/configd-store.xml			> configd-store.xml	2>&1
+if [ -f /var/tmp/configd-store.plist ]; then
+	cat /var/tmp/configd-store.plist		> configd-store.plist	2>&1
 fi
-if [ -f /var/tmp/configd-pattern.xml ]; then
-	cat /var/tmp/configd-pattern.xml		> configd-pattern.xml	2>&1
+if [ -f /var/tmp/configd-pattern.plist ]; then
+	cat /var/tmp/configd-pattern.plist		> configd-pattern.plist	2>&1
 fi
-if [ -f /var/tmp/configd-session.xml ]; then
-	cat /var/tmp/configd-session.xml		> configd-session.xml	2>&1
+if [ -f /var/tmp/configd-session.plist ]; then
+	cat /var/tmp/configd-session.plist		> configd-session.plist	2>&1
 fi
 if [ -f /var/tmp/configd-state ]; then
 	cat /var/tmp/configd-state			> configd-state		2>&1
 fi
 
+#
+# check configd's executable
+#
+if [ -x /usr/bin/codesign ]; then
+	echo  "#"									>> configd-state
+	echo  "# codesign --verbose --display --entitlements - /usr/libexec/configd"	>> configd-state
+	echo  "#"									>> configd-state
+	/usr/bin/codesign --verbose --display --entitlements - /usr/libexec/configd	>> configd-state 2>&1
+
+	echo  "#"									>> configd-state
+	echo  "# codesign --verbose --verify /usr/libexec/configd"			>> configd-state
+	echo  "#"									>> configd-state
+	/usr/bin/codesign --verbose --verify /usr/libexec/configd			>> configd-state 2>&1
+fi
+
 #
 # network reachability
 #
@@ -187,16 +217,39 @@ mount							> mounted-filesystems	2>&1
 #
 # mDNSResponder info
 #
-if [ -f /var/run/mDNSResponder.pid ]; then
-	${PRIV} kill -INFO `cat /var/run/mDNSResponder.pid`
+if [ -x /usr/bin/killall ]; then
+	${PRIV} killall -INFO mDNSResponder
+
+	# and wait a short amount of time for mDNSResponder
+	# to actually log the requested information
+	sleep 15
+fi
+
+#
+# awacsd info
+#
+if [ -x /usr/sbin/awacsd -a -x /usr/bin/killall ]; then
+	${PRIV} killall -INFO awacsd					2>/dev/null
+
+	# and wait a short amount of time for awacsd
+	# to actually log the requested information
+	sleep 1
 fi
 
 #
 # system log, kernel.log, early boot log messages
 #
 if [ -x /usr/bin/syslog ]; then
+	# save the recent activity
 	${PRIV} syslog | tail -n 25000					> syslog
+
+	# save just the "kernel" activity (in case some of the
+	# interesting/relevant message are before the messages
+	# captured above.
+	${PRIV} syslog -k Facility kern | tail -n 25000			> kernel
+
 	if [ -d /var/log/DiagnosticMessages ]; then
+		# save any MessageTracer activity
 		${PRIV} syslog	-d /var/log/DiagnosticMessages	\
 				-F raw				\
 				-T local			\
@@ -276,13 +329,6 @@ echo "# netstat -n -a -A"				>> network-statistics
 echo "#"						>> network-statistics
 netstat -n -a -A					>> network-statistics	2>&1
 
-if [ -x /usr/sbin/lsof ]; then
-	echo "#"					>> network-statistics
-	echo "# lsof -i -n -P"				>> network-statistics
-	echo "#"					>> network-statistics
-	${PRIV} lsof -i -n -P				>> network-statistics	2>&1
-fi
-
 echo "#"						>> network-statistics
 echo "# netstat -s"					>> network-statistics
 echo "#"						>> network-statistics
@@ -298,50 +344,66 @@ echo "# netstat -i -n -d"				>> network-statistics
 echo "#"						>> network-statistics
 netstat -i -n -d					>> network-statistics	2>&1
 
-if [ -x /sbin/ipfw ]; then
+if [ -x /usr/sbin/ndp ]; then
 	echo "#"					>> network-statistics
-	echo "# ipfw -at show"				>> network-statistics
+	echo "# ndp -n -a"				>> network-statistics
 	echo "#"					>> network-statistics
-	ipfw -at show					>> network-statistics	2>&1
-fi
+	ndp -n -a					>> network-statistics	2>&1
 
-if [ -x /usr/sbin/appletalk ]; then
 	echo "#"					>> network-statistics
-	echo "# appletalk -s"				>> network-statistics
+	echo "# ndp -n -p"				>> network-statistics
 	echo "#"					>> network-statistics
-	appletalk -s					>> network-statistics	2>&1
-fi
+	ndp -n -p					>> network-statistics	2>&1
 
-#
-# system usage statistics
-#
-echo "#"						>  system-statistics
-echo "# uptime"						>> system-statistics
-echo "#"						>> system-statistics
-uptime							>> system-statistics	2>&1
+	echo "#"					>> network-statistics
+	echo "# ndp -n -r"				>> network-statistics
+	echo "#"					>> network-statistics
+	ndp -n -r					>> network-statistics	2>&1
+fi
 
-echo "#"						>> system-statistics
-echo "# sysctl -a"					>> system-statistics
-echo "#"						>> system-statistics
-sysctl -a						>> system-statistics	2>&1
+if [ -x /sbin/ipfw ]; then
+	echo "#"					>> network-statistics
+	echo "# ipfw -at show"				>> network-statistics
+	echo "#"					>> network-statistics
+	${PRIV} ipfw -at show				>> network-statistics	2>&1
+fi
 
-echo "#"						>> system-statistics
-echo "# zprint"						>> system-statistics
-echo "#"						>> system-statistics
-zprint							>> system-statistics	2>&1
+if [ -x /sbin/pfctl ]; then
+	echo "#"					>  pf
+	echo "# pfctl -s all"				>> pf
+	echo "#"					>> pf
+	${PRIV} pfctl -s all				>> pf			2>&1
+	echo "=============================="		>> pf
+	echo "#"					>> pf
+	echo "# pfctl -s References"			>> pf
+	echo "#"					>> pf
+	${PRIV} pfctl -s References			>> pf			2>&1
+	for ANCHOR in `pfctl -s Anchors 2>/dev/null`
+	do
+		echo "=============================="	>> pf
+		echo "#"				>> pf
+		echo "# pfctl -a ${ANCHOR} -s all"	>> pf
+		echo "#"				>> pf
+		${PRIV} pfctl -a ${ANCHOR} -s all	>> pf			2>&1
+	done
+fi
 
-echo "#"						>> system-statistics
-echo "# top -l5 -s2"					>> system-statistics
-echo "#"						>> system-statistics
-echo ""
-echo "Please wait, collecting statistics"
-echo ""
-top -s 2 -l 5						>> system-statistics	2>&1
+if [ -x /usr/sbin/lsof ]; then
+	echo "#"					>> network-statistics
+	echo "# lsof -i -U -n -P"			>> network-statistics
+	echo "#"					>> network-statistics
+	${PRIV} lsof -i -U -n -P			>> network-statistics	2>&1
+fi
 
 #
 # DirectoryService info
 #
-if [ -x /usr/bin/dscacheutil ]; then
+if [ -x /usr/bin/odutil ]; then
+	echo "#"					>  od-info
+	echo "# odutil show all"			>> od-info
+	echo "#"					>> od-info
+	${PRIV} odutil show all				>> od-info		2>&1
+elif [ -x /usr/bin/dscacheutil ]; then
 	echo "#"					>  ds-info
 	echo "# dscacheutil -configuration"		>> ds-info
 	echo "#"					>> ds-info
@@ -419,44 +481,155 @@ fi
 #
 # BTMM configuration
 #
-DIG()
+
+BTMM_CLEANUP()
 {
-	/usr/bin/dig @pm-members.mac.com -y "${DOMAIN}:${TSIG}" +short "${1}" "${2}" 2>/dev/null
+	rm -f .btmmfifo .btmminfo .digsync
 }
 
-scutil <<_END_OF_INPUT					\
-| sed -n 's@.* : *\(.*\.members\.mac\.com\)$@\1@p'	\
-| sort							\
-| while read DOMAIN
-open
-show Setup:/Network/BackToMyMac
-quit
-_END_OF_INPUT
-do
-	echo ""							>> btmm
+BTMM_SETUP()
+{
+	BTMM_CLEANUP
+	mkfifo .btmmfifo
+
+	BTMMPORT=40000
+	while nc -6z ::1 "${PORT}"			> /dev/null	2>&1
+	do
+		BTMMPORT=$((PORT + 1))
+	done
+}
+
+BTMM_CHECKMACDOTCOM()
+{
+	TAIL=`echo "${1}" | cut -d. -f2-`
+	if [ "${TAIL}" = "members.mac.com" ]; then
+		return 0
+	fi
+
+	return 1
+}
+
+# get DNS info
+# params: QUERYNAME QUERYTYPE
+BTMM_DIG()
+{
+	rm -f .digsync
+	
+	nc -6 -l "${BTMMPORT}" < .btmmfifo			\
+	| openssl s_client	-connect "${HOSTPORT}" -quiet	> .btmmfifo	2>.digsync &
+	
+	N_RETRY=0
+	while [ $N_RETRY -lt 50 -a ! -s .digsync ]
+	do
+		N_RETRY=$((N_RETRY + 1))
+		sleep 0.1
+	done
+	
+	dig @::1	-p "${BTMMPORT}"		\
+			-y "${TSIG}"			\
+			+short				\
+			+tcp				\
+			"${1}" "${2}"			2>/dev/null
+	
+	wait %1
+}
+
+# get the unique identifier used to lookup the keychain item for a zone
+# params: ZONE
+BTMM_UNIQUEIDFROMZONE()
+{
+	BTMM_CHECKMACDOTCOM "${1}"
+	if [ $? -eq 0 ]; then
+		echo "dns:${1}"
+	else
+		echo "btmmdns:${1}"
+	fi
+}
+
+# get hostname, port, TSIG name and TSIG data from keychain 
+# params: UNIQUEID
+BTMM_GETINFO()
+{
+	${PRIV} security find-generic-password		\
+		-s "${1}"				\
+		-g /Library/Keychains/System.keychain	> .btmminfo	2>/dev/null
+	${PRIV} security find-generic-password		\
+		-s "${1}"				\
+		-g /Library/Keychains/System.keychain	\
+		2>&1					\
+	| sed -n 's/^password: \"\(.*\)\"$/\1/p'
+}
+
+# params: ZONE
+BTMM_URLISH()
+{
+	BTMM_CHECKMACDOTCOM "${1}"
+	if [ $? -eq 0 ]; then
+		echo "pm-members.mac.com.:443"
+	else
+		cat .btmminfo | sed -n 's/.*0x00000007 <blob>=\"\(.*\)\"/\1/p'
+	fi
+}
+
+BTMM_RELAYINFO()
+{
+	BTMM_CHECKMACDOTCOM "${1}"
+	if [ $? -eq 0 ]; then
+		return
+	fi
+	
+	SECRET=`BTMM_GETINFO "btmmrelay:${1}"`
+	
+	if [ -z "${SECRET}" ]; then
+		echo "  No Relay keychain item."		>> btmm
+		return
+	fi
+	
+	if [ `echo "${SECRET}" | wc -l` -ne 1 ]; then
+		echo "  More than one Relay keychain item."	>> btmm
+		return
+	fi
+	
+	URLISH=`BTMM_URLISH "${DOMAIN}"`
+	ACCOUNT=`cat .btmminfo | sed -n 's/.*\"acct\"<blob>=\"\(.*\)\"/\1/p'`
+	KEYHASH="[SHA-1:`echo ${SECRET} | openssl sha1`]"
+	echo "  RHP: ${URLISH}"					>> btmm
+	echo "  RAC: ${ACCOUNT}"				>> btmm
+	echo "  RKY: ${KEYHASH}"				>> btmm
+}
+
+BTMM_REPORTZONE()
+{
+	DOMAIN="${1}"
+	
+	echo							>> btmm
 	echo "${DOMAIN}"					>> btmm
+	
+	DNSID=`BTMM_UNIQUEIDFROMZONE "${DOMAIN}"`
+	SECRET=`BTMM_GETINFO "${DNSID}"`
 
-	# lookup TSIG in base64 format
-	TSIG=`								\
-		${PRIV} security find-generic-password			\
-			-s dns:${DOMAIN}				\
-			-g /Library/Keychains/System.keychain 2>&1	\
-		| grep "^password: "					\
-		| cut -d '"' -f 2					\
-		| cut -d '\' -f 1					\
-	     `
-	if [ -z "$TSIG" ]; then
-		echo "  No TSIG in system keychain."		>> btmm
-		continue
+	if [ -z "${SECRET}" ]; then
+		echo "  No DNS keychain item."			>> btmm
+		return
 	fi
-	if [ `echo "$TSIG" | wc -l` -ne 1 ] ; then
-		echo "  More than one TSIG in system keychain."	>> btmm
-		continue
+	
+	if [ `echo "${SECRET}" | wc -l` -ne 1 ]; then
+		echo "  More than one DNS keychain item."	>> btmm
+		return
 	fi
+	
+	URLISH=`BTMM_URLISH "${DOMAIN}"`
+	HOSTPORT=`echo "${URLISH}" | cut -d@ -f2`
+	ACCOUNT=`cat .btmminfo | sed -n 's/.*\"acct\"<blob>=\"\(.*\)\"/\1/p'`
+	TSIG="${ACCOUNT}:${SECRET}"
 
-	KEYHASH="[SHA-1:`echo ${TSIG} | openssl sha1`]"
+	KEYHASH="[SHA-1:`echo ${SECRET} | openssl sha1`]"
 	echo ""							>> btmm
-	echo "  KEY: ${KEYHASH}"				>> btmm
+	echo "  DHP: ${URLISH}"					>> btmm
+	echo "  DAC: ${ACCOUNT}"				>> btmm
+	echo "  DKY: ${KEYHASH}"				>> btmm
+	
+	BTMM_RELAYINFO "${DOMAIN}"
 
 	for TYPE in			\
 		_afpovertcp._tcp	\
@@ -467,7 +640,7 @@ do
 		_smb._tcp		\
 		_ssh._tcp
 	do
-		DIG "${TYPE}.${DOMAIN}" ptr	\
+		BTMM_DIG "${TYPE}.${DOMAIN}" ptr	\
 		| while read -r REG
 		do
 			echo ""					>> btmm
@@ -475,10 +648,10 @@ do
 			echo ""					>> btmm
 
 			INF_Q=`/bin/echo "${REG}" | sed -e "s/${TYPE}/_device-info._tcp/"`
-			INF=`DIG "${INF_Q}" txt`
+			INF=`BTMM_DIG "${INF_Q}" txt`
 			echo "    INF: ${INF}"			>> btmm
 
-			SRV=`DIG ${REG} srv`
+			SRV=`BTMM_DIG ${REG} srv`
 			SRV1=`/bin/echo "${SRV}" | head -1`
 			echo "    SRV: ${SRV1}"			>> btmm
 			SRV2=`/bin/echo "${SRV}" | tail +2`
@@ -488,7 +661,7 @@ do
 				| sed -e 's/^/  *****: /'	>> btmm
 			fi
 
-			TXT=`DIG ${REG} txt`
+			TXT=`BTMM_DIG ${REG} txt`
 			TXT1=`/bin/echo "${TXT}" | head -1`
 			echo "    TXT: ${TXT1}"			>> btmm
 			TXT2=`/bin/echo "${TXT}" | tail +2`
@@ -499,11 +672,11 @@ do
 
 			HOST=`/bin/echo "${SRV}" | cut -d ' ' -f 4-`
 			if [ -n "${HOST}" ]; then
-				V4=`DIG ${HOST} a`
-				V6=`DIG ${HOST} aaaa`
-				KRB=`DIG _kerberos.${HOST} txt`
-				TUN=`DIG _autotunnel._udp.${HOST} srv`
-				AT6=`DIG _autotunnel6.${HOST} aaaa`
+				V4=`BTMM_DIG ${HOST} a`
+				V6=`BTMM_DIG ${HOST} aaaa`
+				KRB=`BTMM_DIG _kerberos.${HOST} txt`
+				TUN=`BTMM_DIG _autotunnel._udp.${HOST} srv`
+				AT6=`BTMM_DIG _autotunnel6.${HOST} aaaa`
 			else
 				V4=""
 				V6=""
@@ -525,8 +698,8 @@ do
 
 				HOST=`/bin/echo "${TUN}" | cut -d ' ' -f 4-`
 				if [ -n "${HOST}" ]; then
-					V4=`DIG ${HOST} a`
-					V6=`DIG ${HOST} aaaa`
+					V4=`BTMM_DIG ${HOST} a`
+					V6=`BTMM_DIG ${HOST} aaaa`
 				fi
 				if [ -n "${V4}" ]; then
 					echo "     v4: ${V4}"	>> btmm
@@ -540,8 +713,24 @@ do
 			fi
 		done
 	done
+}
+
+BTMM_SETUP
+
+scutil <<_END_OF_INPUT \
+| sed -n 's@.* : *\(.*\)$@\1@p' \
+| sort \
+| while read DOMAIN
+open
+show Setup:/Network/BackToMyMac
+quit
+_END_OF_INPUT
+do
+	BTMM_REPORTZONE "$DOMAIN"
 done
 
+BTMM_CLEANUP
+
 #
 # collect crash reports
 #
@@ -551,6 +740,7 @@ for daemon in				\
 		eapolclient		\
 		mDNSResponder		\
 		mDNSResponderHelper	\
+		awacsd			\
 		pppd			\
 		racoon			\
 		socketfilterfw		\
@@ -558,21 +748,53 @@ for daemon in				\
 		SCMonitor		\
 
 do
-	/bin/ls -1	/Library/Logs/CrashReporter/${daemon}_*.crash		\
-			/Library/Logs/DiagnosticReports/${daemon}/*.crash	\
+	/bin/ls -1	/Library/Logs/DiagnosticReports/${daemon}_*.crash	\
+			/Library/Logs/CrashReporter/${daemon}_*.crash		\
 			2>/dev/null						\
 	| while read log
 	do
-		b="`basename ${log}`"
-		${PRIV} cat "${log}"			> "${b}"		2>&1
+		if [ -f "${log}" ]; then
+			b="`basename ${log}`"
+			${PRIV} cat "${log}"		> "${b}"		2>&1
+		fi
 	done
 done
 
+#
+# system usage statistics
+#
+echo "#"						>  system-statistics
+echo "# uptime"						>> system-statistics
+echo "#"						>> system-statistics
+uptime							>> system-statistics	2>&1
+
+echo "#"						>> system-statistics
+echo "# sysctl -a"					>> system-statistics
+echo "#"						>> system-statistics
+sysctl -a						>> system-statistics	2>&1
+
+echo "#"						>> system-statistics
+echo "# zprint"						>> system-statistics
+echo "#"						>> system-statistics
+zprint							>> system-statistics	2>&1
+
+echo "#"						>> system-statistics
+echo "# top -l5 -s2"					>> system-statistics
+echo "#"						>> system-statistics
+echo ""
+echo "Please wait, collecting statistics"
+echo ""
+top -s 2 -l 5						>> system-statistics	2>&1
+
 #
 # collect everything into a single archive
 #
 cd "${WORKDIR}/.."
-pax -w ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
+if [ -x /usr/bin/tar ]; then
+	tar -c ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
+else
+	pax -w ${GZ_OPT} -f "${ARCHIVE}" "${OUT}"
+fi
 rm -rf "${WORKDIR}"
 
 if [ ${UID} -eq 0 ]; then
diff --git a/scselect.tproj/scselect.c b/scselect.tproj/scselect.c
index 5c42fb3..7a89d37 100644
--- a/scselect.tproj/scselect.c
+++ b/scselect.tproj/scselect.c
@@ -291,10 +291,11 @@ main(int argc, char **argv)
 	}
 
 	if (argc == 1) {
-		SCPrint(TRUE, stderr, CFSTR("Set \"%@\" not available.\n\n"), newSet);
+		SCPrint(TRUE, stderr, CFSTR("Set \"%@\" not available.\n"), newSet);
+		exit(1);
 	}
 
-	SCPrint(TRUE, stderr,
+	SCPrint(TRUE, stdout,
 		CFSTR("Defined sets include:%s\n"),
 		(currentMatched > 0) ? " (* == current set)" : "");
 
@@ -303,7 +304,7 @@ main(int argc, char **argv)
 		CFDictionaryRef	dict = (CFDictionaryRef)setVals[i];
 		CFStringRef	udn  = CFDictionaryGetValue(dict, kSCPropUserDefinedName);
 
-		SCPrint(TRUE, stderr,
+		SCPrint(TRUE, stdout,
 			CFSTR(" %s %@\t(%@)\n"),
 			((currentMatched > 0) && CFEqual(key, current)) ? "*" : " ",
 			key,
@@ -312,19 +313,19 @@ main(int argc, char **argv)
 
 	switch (currentMatched) {
 		case -2 :
-			SCPrint(TRUE, stderr, CFSTR("\nCurrentSet not defined.\n"));
+			SCPrint(TRUE, stdout, CFSTR("\nCurrent set not defined.\n"));
 			break;
 		case -1 :
-			SCPrint(TRUE, stderr, CFSTR("\nCurrentSet \"%@\" may not be valid\n"), current);
+			SCPrint(TRUE, stdout, CFSTR("\nCurrent set \"%@\" may not be valid\n"), current);
 			break;
 		case  0 :
-			SCPrint(TRUE, stderr, CFSTR("\nCurrentSet \"%@\" not valid\n"), current);
+			SCPrint(TRUE, stdout, CFSTR("\nCurrent set \"%@\" not valid\n"), current);
 			break;
 		default :
 			break;
 	}
 
-	exit (1);
+	exit (0);
 
     found :
 
diff --git a/scutil.tproj/commands.c b/scutil.tproj/commands.c
index c7c8d70..59d929d 100644
--- a/scutil.tproj/commands.c
+++ b/scutil.tproj/commands.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -210,7 +210,7 @@ const cmdInfo commands_net[] = {
 		" remove set       [ <setName> | <set#> ]"					},
 
 	{ "select",	2,	3,	do_net_select,		7,	0,
-		" select interface <interfaceName> | <interface#> | $child | $service | $vlan | $bond <memberName>\n"
+		" select interface <interfaceName> | <interface#> | $child | $service | $vlan | $bond <memberName> | $bridge <memberName>\n"
 		" select protocol  <protocolType>\n"
 		" select service   <serviceName> | <service#>\n"
 		" select set       <setName> | <set#>"						},
@@ -219,7 +219,7 @@ const cmdInfo commands_net[] = {
 		" set interface context-sensitive-arguments (or ? for help)\n"
 		" set protocol  context-sensitive-arguments (or ? for help)\n"
 		" set service   [ name <serviceName> ] [ order new-order ] [ rank ("" | First | Last | Never) [temp] ]\n"
-		" set set       [ name setName ]"						},
+		" set set       [ name setName ] | [ current ]"					},
 
 	{ "show",	1,	2,	do_net_show,		9,	0,
 		" show interfaces\n"
@@ -396,6 +396,7 @@ do_readFile(int argc, char **argv)
 	/* allocate command input stream */
 	src = (InputRef)CFAllocatorAllocate(NULL, sizeof(Input), 0);
 	src->el = NULL;
+	src->h  = NULL;
 	src->fp = fopen(argv[0], "r");
 
 	if (src->fp == NULL) {
diff --git a/scutil.tproj/dictionary.c b/scutil.tproj/dictionary.c
index 032c591..396e3ab 100644
--- a/scutil.tproj/dictionary.c
+++ b/scutil.tproj/dictionary.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2009, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -176,7 +176,7 @@ do_dictSetKey(int argc, char **argv)
 	if (doArray) {
 		CFDictionarySetValue(newValue, key, array);
 		CFRelease(array);
-	} else {
+	} else if (val != NULL) {
 		CFDictionarySetValue(newValue, key, val);
 		CFRelease(val);
 	}
diff --git a/scutil.tproj/nc.c b/scutil.tproj/nc.c
new file mode 100644
index 0000000..48806d0
--- /dev/null
+++ b/scutil.tproj/nc.c
@@ -0,0 +1,772 @@
+/*
+ * Copyright (c) 2010-2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * Modification History
+ *
+ * March 1, 2010			Christophe Allie <callie@apple.com>
+ * - initial revision
+ * February 8, 2011			Kevin Wells <kcw@apple.com>
+ * - added "select" command
+ */
+
+
+#include "scutil.h"
+#include "nc.h"
+#include "prefs.h"
+
+#include <sys/time.h>
+
+
+static	SCNetworkConnectionRef	connectionRef	= NULL;
+static	int			n_callback	= 0;
+
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+my_CFRelease(void *t)
+{
+	void * * obj = (void * *)t;
+	if (obj && *obj) {
+		CFRelease(*obj);
+		*obj = NULL;
+	}
+	return;
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static CFStringRef
+nc_copy_serviceID(int argc, char **argv)
+{
+	CFStringRef		serviceIDRef	= NULL;
+
+	if (argc == 0) {
+		serviceIDRef = _copyStringFromSTDIN();
+	} else {
+		serviceIDRef = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
+	}
+
+	return serviceIDRef;
+}
+
+/* -----------------------------------------------------------------------------
+ ----------------------------------------------------------------------------- */
+static SCNetworkServiceRef
+nc_copy_service(SCNetworkSetRef set, CFStringRef identifier)
+{
+	CFIndex			i;
+	CFIndex			n;
+	SCNetworkServiceRef	selected	= NULL;
+	CFArrayRef		services;
+
+	services = SCNetworkConnectionCopyAvailableServices(set);
+	if (services == NULL) {
+		goto done;
+	}
+
+	n = CFArrayGetCount(services);
+
+	// try to select the service by its serviceID
+	for (i = 0; i < n; i++) {
+		SCNetworkServiceRef	service		= NULL;
+		CFStringRef		serviceID;
+
+		service = CFArrayGetValueAtIndex(services, i);
+		serviceID = SCNetworkServiceGetServiceID(service);
+		if (CFEqual(identifier, serviceID)) {
+			selected = service;
+			goto done;
+		}
+	}
+
+	// try to select the service by service name
+	for (i = 0; i < n; i++) {
+		SCNetworkServiceRef	service		= NULL;
+		CFStringRef		serviceName;
+
+		service = CFArrayGetValueAtIndex(services, i);
+		serviceName = SCNetworkServiceGetName(service);
+		if ((serviceName != NULL) && CFEqual(identifier, serviceName)) {
+			if (selected == NULL) {
+				selected = service;
+			} else {
+				// if multiple services match
+				selected = NULL;
+				SCPrint(TRUE, stdout, CFSTR("multiple services match\n"));
+				goto done;
+			}
+		}
+	}
+
+    done :
+
+	if (selected != NULL) CFRetain(selected);
+	if (services != NULL) CFRelease(services);
+	return selected;
+}
+
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static char *
+nc_status_string(SCNetworkConnectionStatus status)
+{
+	switch (status) {
+		case kSCNetworkConnectionInvalid:
+			return "Invalid";
+		case kSCNetworkConnectionDisconnected:
+			return "Disconnected";
+		case kSCNetworkConnectionConnecting:
+			return "Connecting";
+		case kSCNetworkConnectionConnected:
+			return "Connected";
+		case kSCNetworkConnectionDisconnecting:
+			return "Disconnecting";
+	}
+	return "Unknown";
+}
+
+static void
+nc_callback(SCNetworkConnectionRef connection, SCNetworkConnectionStatus status, void *info)
+{
+	int		*n		= (int *)info;
+	CFDictionaryRef	status_dict;
+
+	// report status
+	if (n != NULL) {
+		if (*n == 0) {
+			SCPrint(TRUE, stdout, CFSTR("Current status = "));
+		} else {
+			struct tm	tm_now;
+			struct timeval	tv_now;
+
+			(void)gettimeofday(&tv_now, NULL);
+			(void)localtime_r(&tv_now.tv_sec, &tm_now);
+
+			SCPrint(TRUE, stdout, CFSTR("\n*** %2d:%02d:%02d.%03d\n\n"),
+				tm_now.tm_hour,
+				tm_now.tm_min,
+				tm_now.tm_sec,
+				tv_now.tv_usec / 1000);
+			SCPrint(TRUE, stdout, CFSTR("Callback (%d) status = "), *n);
+		}
+		*n = *n + 1;
+	}
+	SCPrint(TRUE, stdout, CFSTR("%s%s%s\n"),
+		nc_status_string(status),
+		(status == kSCNetworkConnectionInvalid) ? ": "                     : "",
+		(status == kSCNetworkConnectionInvalid) ? SCErrorString(SCError()) : "");
+
+	// report extended status
+	status_dict = SCNetworkConnectionCopyExtendedStatus(connection);
+	if (status_dict) {
+		SCPrint(TRUE, stdout, CFSTR("Extended Status %@\n"), status_dict);
+		CFRelease(status_dict);
+	}
+
+	return;
+}
+
+static void
+nc_create_connection(int argc, char **argv, Boolean exit_on_failure)
+{
+	SCNetworkConnectionContext	context	= { 0, &n_callback, NULL, NULL, NULL };
+	SCNetworkServiceRef		service;
+	CFStringRef			serviceIDRef;
+
+	serviceIDRef = nc_copy_serviceID(argc, argv);
+	if (serviceIDRef == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("No service identifier\n"));
+		if (exit_on_failure)
+			exit(1);
+		return;
+	}
+
+	service = nc_copy_service(NULL, serviceIDRef);
+	CFRelease(serviceIDRef);
+	if (service == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("No service\n"));
+		if (exit_on_failure)
+			exit(1);
+		return;
+	}
+
+	connectionRef = SCNetworkConnectionCreateWithService(NULL, service, nc_callback, &context);
+	if (connectionRef == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("nc_create_connection SCNetworkConnectionCreateWithServiceID() failed to create connectionRef: %s\n"), SCErrorString(SCError()));
+		if (exit_on_failure)
+			exit(1);
+		return;
+	}
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_release_connection()
+{
+	my_CFRelease(&connectionRef);
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_start(int argc, char **argv)
+{
+	nc_create_connection(argc, argv, TRUE);
+
+	SCNetworkConnectionStart(connectionRef, 0, TRUE);
+
+	nc_release_connection();
+	exit(0);
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_stop(int argc, char **argv)
+{
+	nc_create_connection(argc, argv, TRUE);
+
+	SCNetworkConnectionStop(connectionRef, TRUE);
+
+	nc_release_connection();
+	exit(0);
+}
+
+/* -----------------------------------------------------------------------------
+ ----------------------------------------------------------------------------- */
+static void
+nc_suspend(int argc, char **argv)
+{
+	nc_create_connection(argc, argv, TRUE);
+
+	SCNetworkConnectionSuspend(connectionRef);
+
+	nc_release_connection();
+	exit(0);
+}
+
+/* -----------------------------------------------------------------------------
+ ----------------------------------------------------------------------------- */
+static void
+nc_resume(int argc, char **argv)
+{
+	nc_create_connection(argc, argv, TRUE);
+
+	SCNetworkConnectionResume(connectionRef);
+
+	nc_release_connection();
+	exit(0);
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_status(int argc, char **argv)
+{
+	SCNetworkConnectionStatus	status;
+
+	nc_create_connection(argc, argv, TRUE);
+
+	status = SCNetworkConnectionGetStatus(connectionRef);
+	nc_callback(connectionRef, status, NULL);
+
+	nc_release_connection();
+	exit(0);
+}
+
+static void
+nc_watch(int argc, char **argv)
+{
+	SCNetworkConnectionStatus	status;
+
+	nc_create_connection(argc, argv, TRUE);
+
+	status = SCNetworkConnectionGetStatus(connectionRef);
+
+	// report initial status
+	n_callback = 0;
+	nc_callback(connectionRef, status, &n_callback);
+
+	// setup watcher
+	if (doDispatch) {
+		if (!SCNetworkConnectionSetDispatchQueue(connectionRef, dispatch_get_current_queue())) {
+			printf("SCNetworkConnectionSetDispatchQueue() failed: %s\n", SCErrorString(SCError()));
+			exit(1);
+		}
+	} else {
+		if (!SCNetworkConnectionScheduleWithRunLoop(connectionRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) {
+			printf("SCNetworkConnectinScheduleWithRunLoop() failed: %s\n", SCErrorString(SCError()));
+			exit(1);
+		}
+	}
+
+	// wait for changes
+	CFRunLoopRun();
+
+	nc_release_connection();
+	exit(0);
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_statistics(int argc, char **argv)
+{
+	CFDictionaryRef stats_dict;
+
+	nc_create_connection(argc, argv, TRUE);
+
+	stats_dict = SCNetworkConnectionCopyStatistics(connectionRef);
+
+	if (stats_dict) {
+		SCPrint(TRUE, stdout, CFSTR("%@\n"), stats_dict);
+	} else {
+		SCPrint(TRUE, stdout, CFSTR("No statistics available\n"));
+	}
+
+	my_CFRelease(&stats_dict);
+
+	nc_release_connection();
+	exit(0);
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_ondemand(int argc, char **argv)
+{
+	int			exit_code	= 1;
+	CFStringRef		key		= NULL;
+	CFDictionaryRef		ondemand_dict	= NULL;
+	SCDynamicStoreRef	store;
+
+	store = SCDynamicStoreCreate(NULL, CFSTR("scutil --nc"), NULL, NULL);
+	if (store == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("do_nc_ondemand SCDynamicStoreCreate() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+
+	key = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL, kSCDynamicStoreDomainState, kSCEntNetOnDemand);
+	if (key == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("do_nc_ondemand SCDynamicStoreKeyCreateNetworkGlobalEntity() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+
+	ondemand_dict = SCDynamicStoreCopyValue(store, key);
+	if (ondemand_dict) {
+		SCPrint(TRUE, stdout, CFSTR("%@ %@\n"), kSCEntNetOnDemand, ondemand_dict);
+	} else {
+		SCPrint(TRUE, stdout, CFSTR("%@ not configured\n"), kSCEntNetOnDemand);
+	}
+
+	exit_code = 0;
+done:
+	my_CFRelease(&ondemand_dict);
+	my_CFRelease(&key);
+	my_CFRelease(&store);
+	exit(exit_code);
+}
+
+/* -----------------------------------------------------------------------------
+ Given a string 'key' and a string prefix 'prefix',
+ return the next component in the slash '/' separated
+ key.  If no slash follows the prefix, return NULL.
+
+ Examples:
+ 1. key = "a/b/c" prefix = "a/"    returns "b"
+ 2. key = "a/b/c" prefix = "a/b/"  returns NULL
+----------------------------------------------------------------------------- */
+CFStringRef parse_component(CFStringRef key, CFStringRef prefix)
+{
+	CFMutableStringRef	comp;
+	CFRange			range;
+
+	if (!CFStringHasPrefix(key, prefix))
+		return NULL;
+
+	comp = CFStringCreateMutableCopy(NULL, 0, key);
+	CFStringDelete(comp, CFRangeMake(0, CFStringGetLength(prefix)));
+	range = CFStringFind(comp, CFSTR("/"), 0);
+	if (range.location == kCFNotFound) {
+		CFRelease(comp);
+		return NULL;
+	}
+	range.length = CFStringGetLength(comp) - range.location;
+	CFStringDelete(comp, range);
+	return comp;
+}
+
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_list(int argc, char **argv)
+{
+	int			count;
+	int			exit_code	= 1;
+	int			i;
+	CFStringRef		key		= NULL;
+	CFMutableDictionaryRef	names		= NULL;
+	CFArrayRef		services	= NULL;
+	CFStringRef		setup		= NULL;
+	SCDynamicStoreRef	store;
+
+	store = SCDynamicStoreCreate(NULL, CFSTR("scutil --nc"), NULL, NULL);
+	if (store == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("nc_list SCDynamicStoreCreate() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+	key = SCDynamicStoreKeyCreateNetworkServiceEntity(0, kSCDynamicStoreDomainSetup, kSCCompAnyRegex, kSCEntNetInterface);
+	if (key == NULL ) {
+		SCPrint(TRUE, stderr, CFSTR("nc_list SCDynamicStoreKeyCreateNetworkServiceEntity() failed to create key string\n"));
+		goto done;
+	}
+	setup = SCDynamicStoreKeyCreate(0, CFSTR("%@/%@/%@/"), kSCDynamicStoreDomainSetup, kSCCompNetwork, kSCCompService);
+	if (setup == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("nc_list SCDynamicStoreKeyCreate() failed to create setup string\n"));
+		goto done;
+	}
+	names = CFDictionaryCreateMutable(NULL,
+					  0,
+					  &kCFTypeDictionaryKeyCallBacks,
+					  &kCFTypeDictionaryValueCallBacks);
+	if (names == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("nc_list CFDictionaryCreateMutable() failed to create names dictionary\n"));
+		goto done;
+	}
+	services = SCNetworkConnectionCopyAvailableServices(NULL);
+	if (services != NULL) {
+		count = CFArrayGetCount(services);
+
+		for (i = 0; i < count; i++) {
+			SCNetworkServiceRef	service;
+			CFStringRef		serviceID;
+			CFStringRef		serviceName;
+
+			service = CFArrayGetValueAtIndex(services, i);
+			serviceID = SCNetworkServiceGetServiceID(service);
+			serviceName = SCNetworkServiceGetName(service);
+			if (serviceName != NULL) {
+				CFDictionarySetValue(names, serviceID, serviceName);
+			}
+		}
+
+		CFRelease(services);
+	}
+
+	services = SCDynamicStoreCopyKeyList(store, key);
+	if (services == NULL ) {
+		SCPrint(TRUE, stderr, CFSTR("nc_list SCDynamicStoreCopyKeyList() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+
+	count = CFArrayGetCount(services);
+	for (i = 0; i < count; i++) {
+		CFStringRef serviceID;
+
+		serviceID = parse_component(CFArrayGetValueAtIndex(services, i), setup);
+		if (serviceID) {
+			CFStringRef	iftype;
+			CFStringRef	ifsubtype;
+			CFStringRef	interface_key	= NULL;
+			CFDictionaryRef	interface_dict	= NULL;
+			CFStringRef	service_name;
+
+			interface_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainSetup, serviceID, kSCEntNetInterface);
+			if (!interface_key)  {
+				SCPrint(TRUE, stderr, CFSTR("nc_list SCDynamicStoreKeyCreateNetworkServiceEntity() failed to interface key string\n"));
+				goto endloop;
+			}
+
+			interface_dict = SCDynamicStoreCopyValue(store, interface_key);
+			if (!interface_dict) {
+				SCPrint(TRUE, stderr, CFSTR("nc_list SCDynamicStoreCopyValue() to copy interface dictionary: %s\n"), SCErrorString(SCError()));
+				goto endloop;
+			}
+
+			iftype = CFDictionaryGetValue(interface_dict, kSCPropNetInterfaceType);
+			if (!iftype) {
+				// is that an error condition ???
+				goto endloop;
+			}
+
+			if (!CFEqual(iftype, kSCEntNetPPP) &&
+				!CFEqual(iftype, kSCEntNetIPSec) &&
+				!CFEqual(iftype, kSCEntNetVPN))
+				goto endloop;
+
+			ifsubtype = CFDictionaryGetValue(interface_dict, kSCPropNetInterfaceSubType);
+
+			service_name = CFDictionaryGetValue(names, serviceID);
+
+			SCPrint(TRUE, stdout, CFSTR("[%@%@%@] %@%s%@\n"),
+				iftype ? iftype : CFSTR("?"),
+				ifsubtype ? CFSTR("/") : CFSTR(""),
+				ifsubtype ? ifsubtype : CFSTR(""),
+				serviceID,
+				service_name ? " : " : "",
+				service_name ? service_name : CFSTR(""));
+
+		    endloop:
+			my_CFRelease(&interface_key);
+			my_CFRelease(&interface_dict);
+			my_CFRelease(&serviceID);
+		}
+	}
+
+	exit_code = 0;
+done:
+	my_CFRelease(&services);
+	my_CFRelease(&names);
+	my_CFRelease(&setup);
+	my_CFRelease(&key);
+	my_CFRelease(&store);
+	exit(exit_code);
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+static void
+nc_show(int argc, char **argv)
+{
+	SCDynamicStoreRef	store = NULL;
+	int			exit_code = 1;
+	CFStringRef		setup = NULL;
+	CFStringRef		serviceIDRef = NULL;
+	CFArrayRef		services = NULL;
+	CFStringRef		iftype = NULL;
+	CFStringRef		ifsubtype = NULL;
+	CFStringRef		interface_key = NULL;
+	CFDictionaryRef		interface_dict = NULL;
+	CFStringRef		type_entity_key = NULL;
+	CFStringRef		subtype_entity_key = NULL;
+	CFDictionaryRef		type_entity_dict = NULL;
+	CFDictionaryRef		subtype_entity_dict = NULL;
+
+	serviceIDRef = nc_copy_serviceID(argc, argv);
+	if (serviceIDRef == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("No service ID\n"));
+		goto done;
+	}
+
+	store = SCDynamicStoreCreate(NULL, CFSTR("scutil --nc"), NULL, NULL);
+	if (store == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("nc_show SCDynamicStoreCreate() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+
+	interface_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainSetup, serviceIDRef, kSCEntNetInterface);
+	if (!interface_key) {
+		SCPrint(TRUE, stderr, CFSTR("nc_show SCDynamicStoreKeyCreateNetworkServiceEntity() failed to create interface key\n"));
+		goto done;
+	}
+
+	interface_dict = SCDynamicStoreCopyValue(store, interface_key);
+	if (!interface_dict) {
+		SCPrint(TRUE, stdout, CFSTR("Interface dictionary missing for service ID : %@\n"), serviceIDRef);
+		goto done;
+	}
+
+	iftype = CFDictionaryGetValue(interface_dict, kSCPropNetInterfaceType);
+	if (!iftype) {
+		SCPrint(TRUE, stdout, CFSTR("Interface Type missing for service ID : %@\n"), serviceIDRef);
+		goto done;
+	}
+
+	if (!CFEqual(iftype, kSCEntNetPPP) &&
+		!CFEqual(iftype, kSCEntNetIPSec) &&
+		!CFEqual(iftype, kSCEntNetVPN)) {
+		SCPrint(TRUE, stdout, CFSTR("Interface Type [%@] invalid for service ID : %@\n"), iftype, serviceIDRef);
+		goto done;
+	}
+
+	ifsubtype = CFDictionaryGetValue(interface_dict, kSCPropNetInterfaceSubType);
+	SCPrint(TRUE, stdout, CFSTR("[%@%@%@] %@\n"),
+		iftype ? iftype : CFSTR("?"),
+		ifsubtype ? CFSTR("/") : CFSTR(""),
+		ifsubtype ? ifsubtype : CFSTR(""),
+		serviceIDRef);
+
+	type_entity_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainSetup, serviceIDRef, iftype);
+	if (!type_entity_key) {
+		SCPrint(TRUE, stderr, CFSTR("nc_show SCDynamicStoreKeyCreateNetworkServiceEntity() failed to create type entity key\n"));
+		goto done;
+	}
+	type_entity_dict = SCDynamicStoreCopyValue(store, type_entity_key);
+	if (!type_entity_dict) {
+		SCPrint(TRUE, stdout, CFSTR("%@ dictionary missing for service ID : %@\n"), iftype, serviceIDRef);
+	} else {
+		SCPrint(TRUE, stdout, CFSTR("%@ %@\n"), iftype, type_entity_dict);
+	}
+
+	if (ifsubtype) {
+		subtype_entity_key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainSetup, serviceIDRef, ifsubtype);
+		if (!subtype_entity_key) {
+			SCPrint(TRUE, stderr, CFSTR("nc_show SCDynamicStoreKeyCreateNetworkServiceEntity() failed to create subtype entity key\n"));
+			goto done;
+		}
+		subtype_entity_dict = SCDynamicStoreCopyValue(store, subtype_entity_key);
+		if (!subtype_entity_dict) {
+			//
+		}
+		else {
+			SCPrint(TRUE, stdout, CFSTR("%@ %@\n"), ifsubtype, subtype_entity_dict);
+		}
+	}
+
+	exit_code = 0;
+
+done:
+	my_CFRelease(&serviceIDRef);
+	my_CFRelease(&interface_key);
+	my_CFRelease(&interface_dict);
+	my_CFRelease(&type_entity_key);
+	my_CFRelease(&type_entity_dict);
+	my_CFRelease(&subtype_entity_key);
+	my_CFRelease(&subtype_entity_dict);
+	my_CFRelease(&services);
+	my_CFRelease(&setup);
+	my_CFRelease(&store);
+
+	exit(exit_code);
+}
+
+/* -----------------------------------------------------------------------------
+ ----------------------------------------------------------------------------- */
+static void
+nc_select(int argc, char **argv)
+{
+	SCNetworkSetRef		current_set;
+	int			exit_code	= 1;
+	SCNetworkServiceRef	service		= NULL;
+	CFStringRef		service_id;
+	Boolean			status;
+
+	service_id = nc_copy_serviceID(argc, argv);
+	if (service_id == NULL) {
+		SCPrint(TRUE, stderr, CFSTR("No service identifier\n"));
+		exit(exit_code);
+	}
+
+	do_prefs_init();	/* initialization */
+	do_prefs_open(0, NULL);	/* open default prefs */
+
+	current_set = SCNetworkSetCopyCurrent(prefs);
+	if (current_set == NULL) {
+		SCPrint(TRUE, stdout, CFSTR("nc_select SCNetworkSetCopyCurrent() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+
+	service = nc_copy_service(current_set, service_id);
+	if (service == NULL) {
+		SCPrint(TRUE, stdout, CFSTR("No service\n"));
+		goto done;
+	}
+
+#if !TARGET_OS_IPHONE
+	status = SCNetworkServiceSetEnabled(service, TRUE);
+	if (!status) {
+		SCPrint(TRUE, stdout, CFSTR("nc_select SCNetworkServiceSetEnabled() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+#else
+	status = SCNetworkSetSetSelectedVPNService(current_set, service);
+	if (!status) {
+		SCPrint(TRUE, stdout, CFSTR("nc_select SCNetworkSetSetSelectedVPNService() failed: %s\n"), SCErrorString(SCError()));
+		goto done;
+	}
+#endif
+
+	_prefs_save();
+	exit_code = 0;
+done:
+
+	my_CFRelease(&service_id);
+	my_CFRelease(&current_set);
+	_prefs_close();
+	exit(exit_code);
+}
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+typedef void (*nc_func) (int argc, char **argv);
+
+static const struct {
+	char		*cmd;
+	nc_func		func;
+} nc_cmds[] = {
+	{ "list",		nc_list		},
+	{ "ondemand",		nc_ondemand	},
+	{ "resume",		nc_resume	},
+	{ "select",		nc_select	},
+	{ "show",		nc_show		},
+	{ "start",		nc_start	},
+	{ "statistics",		nc_statistics	},
+	{ "status",		nc_status	},
+	{ "stop",		nc_stop		},
+	{ "suspend",		nc_suspend	},
+};
+#define	N_NC_CMNDS	(sizeof(nc_cmds) / sizeof(nc_cmds[0]))
+
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+int
+find_nc_cmd(char *cmd)
+{
+	int	i;
+
+	for (i = 0; i < (int)N_NC_CMNDS; i++) {
+		if (strcmp(cmd, nc_cmds[i].cmd) == 0) {
+			return i;
+		}
+	}
+
+	return -1;
+}
+
+
+/* -----------------------------------------------------------------------------
+----------------------------------------------------------------------------- */
+void
+do_nc_cmd(char *cmd, int argc, char **argv, Boolean watch)
+{
+	int	i;
+
+	i = find_nc_cmd(cmd);
+	if (i >= 0) {
+		nc_func	func;
+
+		func = nc_cmds[i].func;
+		if (watch && (func == nc_status)) {
+			func = nc_watch;
+		}
+		(*func)(argc, argv);
+	}
+	return;
+}
+
diff --git a/Plugins/ATconfig/cfManager.h b/scutil.tproj/nc.h
similarity index 64%
rename from Plugins/ATconfig/cfManager.h
rename to scutil.tproj/nc.h
index 6c28c2c..0541324 100644
--- a/Plugins/ATconfig/cfManager.h
+++ b/scutil.tproj/nc.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2010, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -24,29 +24,22 @@
 /*
  * Modification History
  *
- * July 17, 2000		Allan Nathanson <ajn@apple.com>
+ * March1, 2010			Christophe Allie <callie@apple.com>
  * - initial revision
  */
 
-#ifndef __CFMANAGER_H
-#define __CFMANAGER_H
+#ifndef _NC_H
+#define _NC_H
 
-#include <CoreFoundation/CoreFoundation.h>
 #include <sys/cdefs.h>
+#include <SystemConfiguration/SystemConfiguration.h>
 
 
 __BEGIN_DECLS
 
-#ifdef	NOTNOW
-CFArrayRef	configRead	__P((const char *path));
-#endif	/* NOTNOW */
-void		configWrite	__P((const char *path, CFArrayRef config));
-#ifdef	NOTNOW
-void		configSet	__P((CFMutableArrayRef config, CFStringRef key, CFStringRef value));
-void		configRemove	__P((CFMutableArrayRef config, CFStringRef key));
-#endif	/* NOTNOW */
+int find_nc_cmd(char *cmd);
+void do_nc_cmd(char *cmd, int argc, char **argv, Boolean watch);
 
 __END_DECLS
 
-
-#endif	/* __CFMANAGER_H */
+#endif /* !_NC_H */
diff --git a/scutil.tproj/net.c b/scutil.tproj/net.c
index c7825b9..550032d 100644
--- a/scutil.tproj/net.c
+++ b/scutil.tproj/net.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2007, 2009-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -251,10 +251,12 @@ _process_options(optionsRef options, int nOptions, int argc, char **argv, CFMuta
 
 				if        ((strcasecmp(argv[0], "disable") == 0) ||
 					   (strcasecmp(argv[0], "no"     ) == 0) ||
+					   (strcasecmp(argv[0], "off"    ) == 0) ||
 					   (strcasecmp(argv[0], "0"      ) == 0)) {
 					CFDictionarySetValue(newConfiguration, *(options[optionIndex].key), CFNumberRef_0);
 				} else if ((strcasecmp(argv[0], "enable") == 0) ||
 					   (strcasecmp(argv[0], "yes"   ) == 0) ||
+					   (strcasecmp(argv[0], "on"   ) == 0) ||
 					   (strcasecmp(argv[0], "1"     ) == 0)) {
 					CFDictionarySetValue(newConfiguration, *(options[optionIndex].key), CFNumberRef_1);
 				} else {
@@ -690,8 +692,9 @@ do_net_create(int argc, char **argv)
 		return;
 	}
 
-	if (*net_keys[i].create == NULL) {
+	if (net_keys[i].create == NULL) {
 		SCPrint(TRUE, stderr, CFSTR("create what?\n"));
+		return;
 	}
 
 	(*net_keys[i].create)(argc, argv);
@@ -716,8 +719,9 @@ do_net_disable(int argc, char **argv)
 		return;
 	}
 
-	if (*net_keys[i].disable == NULL) {
+	if (net_keys[i].disable == NULL) {
 		SCPrint(TRUE, stderr, CFSTR("disable what?\n"));
+		return;
 	}
 
 	(*net_keys[i].disable)(argc, argv);
@@ -742,8 +746,9 @@ do_net_enable(int argc, char **argv)
 		return;
 	}
 
-	if (*net_keys[i].enable == NULL) {
+	if (net_keys[i].enable == NULL) {
 		SCPrint(TRUE, stderr, CFSTR("enable what?\n"));
+		return;
 	}
 
 	(*net_keys[i].enable)(argc, argv);
@@ -768,8 +773,9 @@ do_net_remove(int argc, char **argv)
 		return;
 	}
 
-	if (*net_keys[i].remove == NULL) {
+	if (net_keys[i].remove == NULL) {
 		SCPrint(TRUE, stderr, CFSTR("remove what?\n"));
+		return;
 	}
 
 	(*net_keys[i].remove)(argc, argv);
@@ -796,6 +802,7 @@ do_net_select(int argc, char **argv)
 
 	if (*net_keys[i].select == NULL) {
 		SCPrint(TRUE, stderr, CFSTR("select what?\n"));
+		return;
 	}
 
 	(*net_keys[i].select)(argc, argv);
@@ -984,12 +991,12 @@ do_net_snapshot(int argc, char **argv)
 				return;
 			}
 
-			xmlData = CFPropertyListCreateXMLData(NULL, prefsPrivate->prefs);
+			xmlData = CFPropertyListCreateData(NULL, prefsPrivate->prefs, kCFPropertyListXMLFormat_v1_0, 0, NULL);
 			if (xmlData != NULL) {
 				(void) write(fd, CFDataGetBytePtr(xmlData), CFDataGetLength(xmlData));
 				CFRelease(xmlData);
 			} else {
-				SCPrint(TRUE, stdout, CFSTR("could not write snapshot: CFPropertyListCreateXMLData() failed\n"));
+				SCPrint(TRUE, stdout, CFSTR("could not write snapshot: CFPropertyListCreateData() failed\n"));
 			}
 
 			(void) close(fd);
diff --git a/scutil.tproj/net_interface.c b/scutil.tproj/net_interface.c
index 9cd9f38..4303b33 100644
--- a/scutil.tproj/net_interface.c
+++ b/scutil.tproj/net_interface.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -46,7 +46,7 @@ _copy_interfaces()
 	CFMutableArrayRef	interfaces;
 	CFArrayRef		real_interfaces;
 
-	real_interfaces = SCNetworkInterfaceCopyAll();
+	real_interfaces = _SCNetworkInterfaceCopyAllWithPreferences(prefs);
 	if (real_interfaces == NULL) {
 		SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError()));
 		return NULL;
@@ -61,6 +61,7 @@ _copy_interfaces()
 	CFRelease(real_interfaces);
 
 	// include pseudo interfaces
+	CFArrayAppendValue(interfaces, kSCNetworkInterfaceLoopback);
 	CFArrayAppendValue(interfaces, kSCNetworkInterfaceIPv4);
 
 	// include interfaces that we have created
@@ -116,8 +117,9 @@ _find_interface(int argc, char **argv, int *nArgs)
 		}
 
 		goto done;
-#if	!TARGET_OS_IPHONE
-	} else if (strcasecmp(argv[0], "$bond") == 0) {
+	}
+
+	else if (strcasecmp(argv[0], "$bond") == 0) {
 		CFStringRef	interfaceType;
 
 		if (net_interface == NULL) {
@@ -145,7 +147,39 @@ _find_interface(int argc, char **argv, int *nArgs)
 			goto done;
 		}
 		allowIndex = FALSE;
-	} else if (strcasecmp(argv[0], "$vlan") == 0) {
+	}
+
+	else if (strcasecmp(argv[0], "$bridge") == 0) {
+		CFStringRef	interfaceType;
+
+		if (net_interface == NULL) {
+			SCPrint(TRUE, stdout, CFSTR("interface not selected\n"));
+			goto done;
+		}
+
+		interfaceType = SCNetworkInterfaceGetInterfaceType(net_interface);
+		if (!CFEqual(interfaceType, kSCNetworkInterfaceTypeBridge)) {
+			SCPrint(TRUE, stdout, CFSTR("interface not Bridge\n"));
+			goto done;
+		}
+
+		if (argc < 2) {
+			SCPrint(TRUE, stdout, CFSTR("no member interface specified\n"));
+			return NULL;
+		}
+		argv++;
+		argc--;
+		if (nArgs != NULL) *nArgs += 1;
+
+		myInterfaces = SCBridgeInterfaceGetMemberInterfaces(net_interface);
+		if (myInterfaces == NULL) {
+			SCPrint(TRUE, stdout, CFSTR("no member interfaces\n"));
+			goto done;
+		}
+		allowIndex = FALSE;
+	}
+
+	else if (strcasecmp(argv[0], "$vlan") == 0) {
 		CFStringRef	interfaceType;
 
 		if (net_interface == NULL) {
@@ -165,7 +199,6 @@ _find_interface(int argc, char **argv, int *nArgs)
 		}
 
 		goto done;
-#endif	// !TARGET_OS_IPHONE
 	}
 
 	if ((myInterfaces == NULL) && (interfaces == NULL)) {
@@ -323,16 +356,18 @@ create_interface(int argc, char **argv)
 	argv++;
 	argc--;
 
-#if	!TARGET_OS_IPHONE
 	if (CFEqual(interfaceType, kSCNetworkInterfaceTypeBond)) {
 		SCPrint(TRUE, stdout, CFSTR("bond creation not yet supported\n"));
 		goto done;
 	}
+	if (CFEqual(interfaceType, kSCNetworkInterfaceTypeBridge)) {
+		SCPrint(TRUE, stdout, CFSTR("bridge creation not yet supported\n"));
+		goto done;
+	}
 	if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVLAN)) {
 		SCPrint(TRUE, stdout, CFSTR("vlan creation not yet supported\n"));
 		goto done;
 	}
-#endif	// !TARGET_OS_IPHONE
 
 	if (argc < 1) {
 		if (net_interface == NULL) {
@@ -451,10 +486,56 @@ _show_interface(SCNetworkInterfaceRef interface, CFStringRef prefix, Boolean sho
 	if (if_bsd_name != NULL) {
 		CFArrayRef	available;
 		CFDictionaryRef	active;
+		CFDictionaryRef	cap_current;
 		int		mtu_cur;
 		int		mtu_min;
 		int		mtu_max;
 
+		cap_current = SCNetworkInterfaceCopyCapability(interface, NULL);
+		if (cap_current != NULL) {
+			CFIndex			i;
+			CFArrayRef		cap_names;
+			CFMutableArrayRef	cap_sorted;
+			const void		**keys;
+			CFIndex			n;
+
+			n = CFDictionaryGetCount(cap_current);
+			keys = CFAllocatorAllocate(NULL, n * sizeof(CFStringRef), 0);
+			CFDictionaryGetKeysAndValues(cap_current, keys, NULL);
+			cap_names = CFArrayCreate(NULL, keys, n, &kCFTypeArrayCallBacks);
+			CFAllocatorDeallocate(NULL, keys);
+
+			cap_sorted = CFArrayCreateMutableCopy(NULL, 0, cap_names);
+			CFRelease(cap_names);
+
+			CFArraySortValues(cap_sorted, CFRangeMake(0, n), (CFComparatorFunction)CFStringCompare, NULL);
+
+			SCPrint(TRUE, stdout, CFSTR("%@  capabilities         = "), prefix);
+			for (i = 0; i < n; i++) {
+				CFStringRef	cap_name;
+				int		cap_val;
+				CFNumberRef	val	= NULL;
+
+				cap_name = CFArrayGetValueAtIndex(cap_sorted, i);
+				if (configuration != NULL) {
+					val = CFDictionaryGetValue(configuration, cap_name);
+				}
+				if (!isA_CFNumber(val)) {
+					val = CFDictionaryGetValue(cap_current, cap_name);
+				}
+
+				SCPrint(TRUE, stdout, CFSTR("%s%@%c"),
+					(i == 0) ? "" : ",",
+					cap_name,
+					(CFNumberGetValue(val, kCFNumberIntType, &cap_val) &&
+					 (cap_val != 0)) ? '+' : '-');
+			}
+			SCPrint(TRUE, stdout, CFSTR("\n"));
+
+			CFRelease(cap_sorted);
+			CFRelease(cap_current);
+		}
+
 		if (SCNetworkInterfaceCopyMTU(interface, &mtu_cur, &mtu_min, &mtu_max)) {
 			char	isCurrent	= '*';
 
@@ -587,7 +668,7 @@ _show_interface(SCNetworkInterfaceRef interface, CFStringRef prefix, Boolean sho
 
 						SCPrint(TRUE, stdout, CFSTR("\n"));
 					}
-					CFRelease(subtype_options);
+					if (subtype_options != NULL) CFRelease(subtype_options);
 				}
 				if (subtypes != NULL) CFRelease(subtypes);
 			}
@@ -840,21 +921,47 @@ show_interfaces(int argc, char **argv)
 }
 
 
-#pragma mark -
-#pragma mark Bond options
+/* -------------------- */
 
 
-#if	!TARGET_OS_IPHONE
+static void
+_replaceOne(const void *key, const void *value, void *context)
+{
+	CFMutableDictionaryRef	newConfiguration	= (CFMutableDictionaryRef)context;
+
+	CFDictionarySetValue(newConfiguration, key, value);
+	return;
+}
+
+
+static void
+updateInterfaceConfiguration(CFMutableDictionaryRef newConfiguration)
+{
+	CFDictionaryRef	configuration;
+
+	CFDictionaryRemoveAllValues(newConfiguration);
+
+	configuration = SCNetworkInterfaceGetConfiguration(net_interface);
+	if (configuration != NULL) {
+		CFDictionaryApplyFunction(configuration, _replaceOne, (void *)newConfiguration);
+	}
+
+	return;
+}
+
+
+#pragma mark -
+#pragma mark Bond options
 
 
 static options bondOptions[] = {
 	{ "mtu"       , NULL, isNumber     , &kSCPropNetEthernetMTU         , NULL, NULL },
-// xxx  { "+device"   , ... },
-// xxx  { "-device"   , ... },
+	// xxx  { "+device"   , ... },
+	// xxx  { "-device"   , ... },
 
 	{ "?"         , NULL , isHelp     , NULL                            , NULL,
-	    "\nBond configuration commands\n\n"
-	    " set interface [mtu n] [media type] [mediaopts opts]\n"
+		"\nBond configuration commands\n\n"
+		" set interface [mtu n] [media type] [mediaopts opts]\n"
 	}
 };
 #define	N_BOND_OPTIONS	(sizeof(bondOptions) / sizeof(bondOptions[0]))
@@ -884,7 +991,45 @@ set_interface_bond(int argc, char **argv, CFMutableDictionaryRef newConfiguratio
 }
 
 
-#endif	// !TARGET_OS_IPHONE
+#pragma mark -
+#pragma mark Bridge options
+
+
+static options bridgeOptions[] = {
+	{ "mtu"       , NULL, isNumber     , &kSCPropNetEthernetMTU         , NULL, NULL },
+// xxx  { "+device"   , ... },
+// xxx  { "-device"   , ... },
+
+	{ "?"         , NULL , isHelp     , NULL                            , NULL,
+	    "\nBridge configuration commands\n\n"
+	    " set interface [mtu n] [media type] [mediaopts opts]\n"
+	}
+};
+#define	N_BRIDGE_OPTIONS	(sizeof(bridgeOptions) / sizeof(bridgeOptions[0]))
+
+
+static Boolean
+set_interface_bridge(int argc, char **argv, CFMutableDictionaryRef newConfiguration)
+{
+	CFStringRef	interfaceName;
+	Boolean		ok;
+
+	interfaceName = SCNetworkInterfaceGetBSDName(net_interface);
+	if (interfaceName == NULL) {
+		SCPrint(TRUE, stdout, CFSTR("no BSD interface\n"));
+		return FALSE;
+	}
+
+	ok = _process_options(bridgeOptions, N_BRIDGE_OPTIONS, argc, argv, newConfiguration);
+	if (ok) {
+		// validate configuration
+		if (!validateMediaOptions(net_interface, newConfiguration)) {
+			return FALSE;
+		}
+	}
+
+	return ok;
+}
 
 
 #pragma mark -
@@ -932,11 +1077,60 @@ set_interface_airport(int argc, char **argv, CFMutableDictionaryRef newConfigura
 #pragma mark Ethernet options
 
 
+static int
+__doCapability(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
+{
+	Boolean	ok	= FALSE;
+
+	if (argc < 1) {
+		SCPrint(TRUE, stdout,
+			CFSTR("%s not specified\n"),
+			description != NULL ? description : "enable/disable");
+		return -1;
+	}
+
+	if (strlen(argv[0]) == 0) {
+		ok = SCNetworkInterfaceSetCapability(net_interface, key, NULL);
+	} else if ((strcasecmp(argv[0], "disable") == 0) ||
+		   (strcasecmp(argv[0], "no"     ) == 0) ||
+		   (strcasecmp(argv[0], "off"    ) == 0) ||
+		   (strcasecmp(argv[0], "0"      ) == 0)) {
+		ok = SCNetworkInterfaceSetCapability(net_interface, key, CFNumberRef_0);
+	} else if ((strcasecmp(argv[0], "enable") == 0) ||
+		   (strcasecmp(argv[0], "yes"   ) == 0) ||
+		   (strcasecmp(argv[0], "on"    ) == 0) ||
+		   (strcasecmp(argv[0], "1"     ) == 0)) {
+		ok = SCNetworkInterfaceSetCapability(net_interface, key, CFNumberRef_1);
+	} else {
+		SCPrint(TRUE, stdout, CFSTR("invalid value\n"));
+		return -1;
+	}
+
+	if (ok) {
+		updateInterfaceConfiguration(newConfiguration);
+	} else {
+		SCPrint(TRUE, stdout,
+			CFSTR("%@ not updated: %s\n"),
+			key,
+			SCErrorString(SCError()));
+		return -1;
+	}
+
+	return 1;
+}
+
+
 static options ethernetOptions[] = {
 	{ "mtu"       , NULL, isNumber     , &kSCPropNetEthernetMTU         , NULL, NULL },
 	{ "media"     , NULL, isString     , &kSCPropNetEthernetMediaSubType, NULL, NULL },
 	{ "mediaopt"  , NULL, isStringArray, &kSCPropNetEthernetMediaOptions, NULL, NULL },
 
+	{ "av"        , NULL, isOther      , &kSCPropNetEthernetCapabilityAV    , __doCapability, NULL },
+	{ "lro"       , NULL, isOther      , &kSCPropNetEthernetCapabilityLRO   , __doCapability, NULL },
+	{ "rxcsum"    , NULL, isOther      , &kSCPropNetEthernetCapabilityRXCSUM, __doCapability, NULL },
+	{ "tso"       , NULL, isOther      , &kSCPropNetEthernetCapabilityTSO   , __doCapability, NULL },
+	{ "txcsum"    , NULL, isOther      , &kSCPropNetEthernetCapabilityTXCSUM, __doCapability, NULL },
+
 	{ "?"         , NULL , isHelp     , NULL                            , NULL,
 	    "\nEthernet configuration commands\n\n"
 	    " set interface [mtu n] [media type] [mediaopts opts]\n"
@@ -973,44 +1167,18 @@ set_interface_ethernet(int argc, char **argv, CFMutableDictionaryRef newConfigur
 #pragma mark IPSec options
 
 
-static void
-replaceOne(const void *key, const void *value, void *context)
-{
-	CFMutableDictionaryRef	newConfiguration	= (CFMutableDictionaryRef)context;
-
-	CFDictionarySetValue(newConfiguration, key, value);
-	return;
-}
-
-
-static void
-updateInterfaceConfiguration(CFMutableDictionaryRef newConfiguration)
-{
-	CFDictionaryRef	configuration;
-
-	CFDictionaryRemoveAllValues(newConfiguration);
-
-	configuration = SCNetworkInterfaceGetConfiguration(net_interface);
-	if (configuration != NULL) {
-		CFDictionaryApplyFunction(configuration, replaceOne, (void *)newConfiguration);
-	}
-
-	return;
-}
-
-
 static int
 __doIPSecSharedSecret(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
 {
+	CFStringRef	encryptionType;
+
 	if (argc < 1) {
 		SCPrint(TRUE, stdout, CFSTR("IPSec shared secret not specified\n"));
 		return -1;
 	}
 
+	encryptionType = CFDictionaryGetValue(newConfiguration, kSCPropNetIPSecSharedSecretEncryption);
 	if (strlen(argv[0]) > 0) {
-		CFStringRef	encryptionType;
-
-		encryptionType = CFDictionaryGetValue(newConfiguration, kSCPropNetIPSecSharedSecretEncryption);
 		if (encryptionType == NULL) {
 			CFIndex			n;
 			CFMutableDataRef	pw;
@@ -1050,7 +1218,20 @@ __doIPSecSharedSecret(CFStringRef key, const char *description, void *info, int
 			return -1;
 		}
 	} else {
-		CFDictionaryRemoveValue(newConfiguration, key);
+		if (encryptionType == NULL) {
+			CFDictionaryRemoveValue(newConfiguration, key);
+		} else if (CFEqual(encryptionType, kSCValNetIPSecSharedSecretEncryptionKeychain)) {
+			Boolean		ok;
+			ok = SCNetworkInterfaceRemovePassword(net_interface, kSCNetworkInterfacePasswordTypeIPSecSharedSecret);
+			if (ok) {
+				updateInterfaceConfiguration(newConfiguration);
+			} else {
+				return -1;
+			}
+		} else {
+			SCPrint(TRUE, stdout, CFSTR("IPSec shared secret type \"%@\" not supported\n"), encryptionType);
+			return -1;
+		}
 	}
 
 	return 1;
@@ -1086,15 +1267,15 @@ __doIPSecSharedSecretType(CFStringRef key, const char *description, void *info,
 static int
 __doIPSecXAuthPassword(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
 {
+	CFStringRef	encryptionType;
+
 	if (argc < 1) {
 		SCPrint(TRUE, stdout, CFSTR("IPSec XAuth password not specified\n"));
 		return -1;
 	}
 
+	encryptionType = CFDictionaryGetValue(newConfiguration, kSCPropNetIPSecXAuthPasswordEncryption);
 	if (strlen(argv[0]) > 0) {
-		CFStringRef	encryptionType;
-
-		encryptionType = CFDictionaryGetValue(newConfiguration, kSCPropNetIPSecXAuthPasswordEncryption);
 		if (encryptionType == NULL) {
 			CFIndex			n;
 			CFMutableDataRef	pw;
@@ -1134,7 +1315,21 @@ __doIPSecXAuthPassword(CFStringRef key, const char *description, void *info, int
 			return -1;
 		}
 	} else {
-		CFDictionaryRemoveValue(newConfiguration, key);
+		if (encryptionType == NULL) {
+			CFDictionaryRemoveValue(newConfiguration, key);
+		} else if (CFEqual(encryptionType, kSCValNetIPSecXAuthPasswordEncryptionKeychain)) {
+			Boolean		ok;
+
+			ok = SCNetworkInterfaceRemovePassword(net_interface, kSCNetworkInterfacePasswordTypeIPSecXAuth);
+			if (ok) {
+				updateInterfaceConfiguration(newConfiguration);
+			} else {
+				return -1;
+			}
+		} else {
+			SCPrint(TRUE, stdout, CFSTR("IPSec XAuthPassword type \"%@\" not supported\n"), encryptionType);
+			return -1;
+		}
 	}
 
 	return 1;
@@ -1437,15 +1632,15 @@ set_interface_modem(int argc, char **argv, CFMutableDictionaryRef newConfigurati
 static int
 __doPPPAuthPW(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
 {
+	CFStringRef	encryptionType;
+
 	if (argc < 1) {
 		SCPrint(TRUE, stdout, CFSTR("PPP password not specified\n"));
 		return -1;
 	}
 
+	encryptionType = CFDictionaryGetValue(newConfiguration, kSCPropNetPPPAuthPasswordEncryption);
 	if (strlen(argv[0]) > 0) {
-		CFStringRef	encryptionType;
-
-		encryptionType = CFDictionaryGetValue(newConfiguration, kSCPropNetPPPAuthPasswordEncryption);
 		if (encryptionType == NULL) {
 			CFIndex			n;
 			CFMutableDataRef	pw;
@@ -1462,12 +1657,44 @@ __doPPPAuthPW(CFStringRef key, const char *description, void *info, int argc, ch
 
 			CFDictionarySetValue(newConfiguration, key, pw);
 			CFRelease(pw);
+		} else if (CFEqual(encryptionType, kSCValNetPPPAuthPasswordEncryptionKeychain)) {
+			Boolean		ok;
+			CFDataRef	pw;
+			CFStringRef	str;
+
+			str = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
+			pw = CFStringCreateExternalRepresentation(NULL, str, kCFStringEncodingUTF8, 0);
+			ok = SCNetworkInterfaceSetPassword(net_interface,
+							   kSCNetworkInterfacePasswordTypePPP,
+							   pw,
+							   NULL);
+			CFRelease(pw);
+			CFRelease(str);
+			if (ok) {
+				updateInterfaceConfiguration(newConfiguration);
+			} else {
+				return -1;
+			}
 		} else {
 			SCPrint(TRUE, stdout, CFSTR("PPP password type \"%@\" not supported\n"), encryptionType);
 			return -1;
 		}
 	} else {
-		CFDictionaryRemoveValue(newConfiguration, key);
+		if (encryptionType == NULL) {
+			CFDictionaryRemoveValue(newConfiguration, key);
+		} else if (CFEqual(encryptionType, kSCValNetPPPAuthPasswordEncryptionKeychain)) {
+			Boolean		ok;
+
+			ok = SCNetworkInterfaceRemovePassword(net_interface, kSCNetworkInterfacePasswordTypePPP);
+			if (ok) {
+				updateInterfaceConfiguration(newConfiguration);
+			} else {
+				return -1;
+			}
+		} else {
+			SCPrint(TRUE, stdout, CFSTR("PPP password type \"%@\" not supported\n"), encryptionType);
+			return -1;
+		}
 	}
 
 	return 1;
@@ -1739,9 +1966,6 @@ set_interface_ppp(int argc, char **argv, CFMutableDictionaryRef newConfiguration
 #pragma mark VLAN options
 
 
-#if	!TARGET_OS_IPHONE
-
-
 static Boolean
 set_interface_vlan(int argc, char **argv, CFMutableDictionaryRef newConfiguration)
 {
@@ -1751,7 +1975,161 @@ SCPrint(TRUE, stdout, CFSTR("vlan interface management not yet supported\n"));
 }
 
 
-#endif	// !TARGET_OS_IPHONE
+#pragma mark -
+#pragma mark VPN options
+
+
+static int
+__doVPNAuthPW(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
+{
+	CFStringRef	encryptionType;
+
+	if (argc < 1) {
+		SCPrint(TRUE, stdout, CFSTR("VPN password not specified\n"));
+		return -1;
+	}
+
+	encryptionType = CFDictionaryGetValue(newConfiguration, kSCPropNetVPNAuthPasswordEncryption);
+	if (strlen(argv[0]) > 0) {
+		if (encryptionType == NULL) {
+#ifdef	USE_INLINE_CFDATA
+			CFIndex			n;
+			CFMutableDataRef	pw;
+			CFStringRef		str;
+
+			str = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
+			n = CFStringGetLength(str);
+			pw = CFDataCreateMutable(NULL, n * sizeof(UniChar));
+			CFDataSetLength(pw, n * sizeof(UniChar));
+			CFStringGetCharacters(str,
+					      CFRangeMake(0, n),
+					      (UniChar *)CFDataGetMutableBytePtr(pw));
+			CFRelease(str);
+#else	// USE_INLINE_CFDATA
+			CFStringRef		pw;
+
+			pw = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
+#endif	// USE_INLINE_CFDATA
+
+			CFDictionarySetValue(newConfiguration, key, pw);
+			CFRelease(pw);
+		} else if (CFEqual(encryptionType, kSCValNetVPNAuthPasswordEncryptionKeychain)) {
+			Boolean		ok;
+			CFDataRef	pw;
+			CFStringRef	str;
+
+			str = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
+			pw = CFStringCreateExternalRepresentation(NULL, str, kCFStringEncodingUTF8, 0);
+			ok = SCNetworkInterfaceSetPassword(net_interface,
+							   kSCNetworkInterfacePasswordTypeVPN,
+							   pw,
+							   NULL);
+			CFRelease(pw);
+			CFRelease(str);
+			if (ok) {
+				updateInterfaceConfiguration(newConfiguration);
+			} else {
+				return -1;
+			}
+		} else {
+			SCPrint(TRUE, stdout, CFSTR("VPN password type \"%@\" not supported\n"), encryptionType);
+			return -1;
+		}
+	} else {
+		if (encryptionType == NULL) {
+			CFDictionaryRemoveValue(newConfiguration, key);
+		} else if (CFEqual(encryptionType, kSCValNetVPNAuthPasswordEncryptionKeychain)) {
+			Boolean		ok;
+
+			ok = SCNetworkInterfaceRemovePassword(net_interface, kSCNetworkInterfacePasswordTypeVPN);
+			if (ok) {
+				updateInterfaceConfiguration(newConfiguration);
+			} else {
+				return -1;
+			}
+		} else {
+			SCPrint(TRUE, stdout, CFSTR("PPP password type \"%@\" not supported\n"), encryptionType);
+			return -1;
+		}
+	}
+
+	return 1;
+}
+
+
+static int
+__doVPNAuthPWType(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
+{
+	if (argc < 1) {
+		SCPrint(TRUE, stdout, CFSTR("VPN password type mode not specified\n"));
+		return -1;
+	}
+
+	if (strlen(argv[0]) > 0) {
+		if (strcasecmp(argv[0], "keychain") == 0) {
+			CFDictionarySetValue(newConfiguration, key, kSCValNetVPNAuthPasswordEncryptionKeychain);
+		} else if (strcasecmp(argv[0], "prompt") == 0) {
+			CFDictionarySetValue(newConfiguration, key, kSCValNetVPNAuthPasswordEncryptionPrompt);
+		} else {
+			SCPrint(TRUE, stdout, CFSTR("invalid password type\n"));
+			return -1;
+		}
+	} else {
+		CFDictionaryRemoveValue(newConfiguration, key);
+	}
+
+	// encryption type changed, reset password
+	CFDictionaryRemoveValue(newConfiguration, kSCPropNetVPNAuthPassword);
+
+	return 1;
+}
+
+
+static selections vpnAuthenticationMethodSelections[] = {
+	{ CFSTR("Password")    , &kSCValNetVPNAuthenticationMethodPassword    , 0 },
+	{ CFSTR("Certificate") , &kSCValNetVPNAuthenticationMethodCertificate , 0 },
+	{ NULL                 , NULL                                         , 0 }
+};
+
+
+static options vpnOptions[] = {
+	{ "AuthName"                  , "account"     , isString     , &kSCPropNetVPNAuthName                  , NULL                , NULL                                      },
+	{   "Account"                 , "account"     , isString     , &kSCPropNetVPNAuthName                  , NULL                , NULL                                      },
+	{ "AuthPassword"              , "password"    , isOther      , &kSCPropNetVPNAuthPassword              , __doVPNAuthPW       , NULL                                      },
+	{   "Password"                , "password"    , isOther      , &kSCPropNetVPNAuthPassword              , __doVPNAuthPW       , NULL                                      },
+	{ "AuthPasswordEncryption"    , "type"        , isOther      , &kSCPropNetVPNAuthPasswordEncryption    , __doVPNAuthPWType   , NULL                                      },
+	{ "AuthenticationMethod"      , NULL          , isChooseOne  , &kSCPropNetVPNAuthenticationMethod      , NULL                , (void *)vpnAuthenticationMethodSelections },
+	{ "ConnectTime"               , "?time"       , isNumber     , &kSCPropNetVPNConnectTime               , NULL                , NULL                                      },
+	{ "DisconnectOnFastUserSwitch", NULL          , isBoolean    , &kSCPropNetVPNDisconnectOnFastUserSwitch, NULL                , NULL                                      },
+	{ "DisconnectOnIdle"          , NULL          , isBoolean    , &kSCPropNetVPNDisconnectOnIdle          , NULL                , NULL                                      },
+	{ "DisconnectOnIdleTimer"     , "timeout"     , isNumber     , &kSCPropNetVPNDisconnectOnIdleTimer     , NULL                , NULL                                      },
+	{ "DisconnectOnLogout"        , NULL          , isBoolean    , &kSCPropNetVPNDisconnectOnLogout        , NULL                , NULL                                      },
+	{ "DisconnectOnSleep"         , NULL          , isBoolean    , &kSCPropNetVPNDisconnectOnSleep         , NULL                , NULL                                      },
+	{ "Logfile"                   , "path"        , isString     , &kSCPropNetVPNLogfile                   , NULL                , NULL                                      },
+	{ "MTU"                       , NULL          , isNumber     , &kSCPropNetVPNMTU                       , NULL                , NULL                                      },
+	{ "RemoteAddress"             , "server"      , isString     , &kSCPropNetVPNRemoteAddress             , NULL                , NULL                                      },
+	{   "Server"                  , "server"      , isString     , &kSCPropNetVPNRemoteAddress             , NULL                , NULL                                      },
+	{ "VerboseLogging"            , NULL          , isBoolean    , &kSCPropNetVPNVerboseLogging            , NULL                , NULL                                      },
+
+	// --- Help ---
+	{ "?"                         , NULL          , isHelp       , NULL                                    , NULL                ,
+	    "\nVPN configuration commands\n\n"
+	    " set interface [Server server]\n"
+	    " set interface [Account account]\n"
+	    " set interface [Password password]\n"
+	}
+};
+#define	N_VPN_OPTIONS	(sizeof(vpnOptions) / sizeof(vpnOptions[0]))
+
+
+static Boolean
+set_interface_vpn(int argc, char **argv, CFMutableDictionaryRef newConfiguration)
+{
+	Boolean	ok;
+
+	ok = _process_options(vpnOptions, N_VPN_OPTIONS, argc, argv, newConfiguration);
+	return ok;
+}
 
 
 #pragma mark -
@@ -1803,12 +2181,14 @@ set_interface(int argc, char **argv)
 		ok = set_interface_airport(argc, argv, newConfiguration);
 	} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypePPP)) {
 		ok = set_interface_ppp(argc, argv, newConfiguration);
-#if	!TARGET_OS_IPHONE
 	} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypeBond)) {
 		ok = set_interface_bond(argc, argv, newConfiguration);
+	} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypeBridge)) {
+		ok = set_interface_bridge(argc, argv, newConfiguration);
 	} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVLAN)) {
 		ok = set_interface_vlan(argc, argv, newConfiguration);
-#endif	// !TARGET_OS_IPHONE
+	} else if (CFEqual(interfaceType, kSCNetworkInterfaceTypeVPN)) {
+		ok = set_interface_vpn(argc, argv, newConfiguration);
 	} else {
 		SCPrint(TRUE, stdout, CFSTR("this interfaces configuration cannot be changed\n"));
 	}
diff --git a/scutil.tproj/net_protocol.c b/scutil.tproj/net_protocol.c
index 0272c11..2da53af 100644
--- a/scutil.tproj/net_protocol.c
+++ b/scutil.tproj/net_protocol.c
@@ -417,128 +417,6 @@ select_protocol(int argc, char **argv)
 }
 
 
-#pragma mark -
-#pragma mark AppleTalk
-
-
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-
-
-static selections appletalkConfigMethods[] = {
-	{ CFSTR("node")      , &kSCValNetAppleTalkConfigMethodNode      , 0 },
-	{ CFSTR("router")    , &kSCValNetAppleTalkConfigMethodRouter    , 0 },
-	{ CFSTR("seedrouter"), &kSCValNetAppleTalkConfigMethodSeedRouter, 0 },
-	{ NULL               , NULL                                     , 0 }
-};
-
-
-static int
-__doAppleTalkConfigMethod(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
-{
-	CFStringRef	configMethod;
-
-	configMethod = CFDictionaryGetValue(newConfiguration, key);
-	if (!CFEqual(key, kSCValNetAppleTalkConfigMethodSeedRouter)) {
-		CFDictionaryRemoveValue(newConfiguration, kSCPropNetAppleTalkSeedZones);
-		CFDictionaryRemoveValue(newConfiguration, kSCPropNetAppleTalkSeedNetworkRange);
-	}
-
-	return 0;
-}
-
-
-static int
-__doAppleTalkNetworkRange(CFStringRef key, const char *description, void *info, int argc, char **argv, CFMutableDictionaryRef newConfiguration)
-{
-	if (argc < 1) {
-		SCPrint(TRUE, stdout, CFSTR("network range not specified\n"));
-		return -1;
-	}
-
-	if (strlen(argv[0]) > 0) {
-		CFArrayRef	array;
-		char		*cp;
-		CFNumberRef	range[2];
-
-		range[0] = _copy_number(argv[0]);
-		if (range[0] == NULL) {
-			SCPrint(TRUE, stdout, CFSTR("invalid start of range\n"));
-			return -1;
-		}
-
-		cp = strchr(argv[0], '-');
-		if (cp == NULL) {
-			range[1] = _copy_number(cp);
-			if (range[1] == NULL) {
-				CFRelease(range[0]);
-				SCPrint(TRUE, stdout, CFSTR("invalid end of range\n"));
-				return -1;
-			}
-		} else {
-			range[1] = CFRetain(range[0]);
-		}
-
-		array = CFArrayCreate(NULL,
-				      (const void **)range,
-				      sizeof(range)/sizeof(range[0]),
-				      &kCFTypeArrayCallBacks);
-		CFRelease(range[0]);
-		CFRelease(range[1]);
-
-		CFDictionarySetValue(newConfiguration, key, array);
-		CFRelease(array);
-	} else {
-		CFDictionaryRemoveValue(newConfiguration, key);
-	}
-
-	return 1;
-}
-
-
-static options appletalkOptions[] = {
-	{ "ConfigMethod"    , "configuration method"
-				       , isChooseOne  , &kSCPropNetAppleTalkConfigMethod    , __doAppleTalkConfigMethod, (void *)appletalkConfigMethods },
-	{   "config"        , "configuration method"
-				       , isChooseOne  , &kSCPropNetAppleTalkConfigMethod    , __doAppleTalkConfigMethod, (void *)appletalkConfigMethods },
-	{ "DefaultZone"     , "zone"   , isString     , &kSCPropNetAppleTalkDefaultZone     , NULL                     , NULL                           },
-	{ "NodeID"          , "node"   , isNumber     , &kSCPropNetAppleTalkNodeID          , NULL                     , NULL                           },
-	{   "node"          , "node"   , isNumber     , &kSCPropNetAppleTalkNodeID          , NULL                     , NULL                           },
-	{ "NetworkID"       , "network", isNumber     , &kSCPropNetAppleTalkNetworkID       , NULL                     , NULL                           },
-	{   "network"       , "network", isNumber     , &kSCPropNetAppleTalkNetworkID       , NULL                     , NULL                           },
-	{ "SeedNetworkRange", "range"  , isOther      , &kSCPropNetAppleTalkSeedNetworkRange, __doAppleTalkNetworkRange, NULL                           },
-	{ "SeedZones"       , "zone"   , isStringArray, &kSCPropNetAppleTalkSeedZones       , NULL                     , NULL                           },
-
-	{ "?"               , NULL   , isHelp       , NULL                                , NULL                     ,
-	    "\nAppleTalk configuration commands\n\n"
-	    " set protocol config {Node|Router|SeedRouter}\n"
-	    " set protocol defaultzone zone\n"
-	    " set protocol node id\n"
-	    " set protocol network id\n"
-	    "\n w/config=Node\n"
-	    "   None\n"
-	    "\n w/config=Router\n"
-	    "   None\n"
-	    "\n w/config=SeedRouter\n"
-	    "   set protocol seednetworkrange low[-high]\n"
-	    "   set protocol seedzones zone[,zone-2]\n"
-	}
-};
-#define	N_APPLETALK_OPTIONS	(sizeof(appletalkOptions) / sizeof(appletalkOptions[0]))
-
-
-static Boolean
-set_protocol_appletalk(int argc, char **argv, CFMutableDictionaryRef newConfiguration)
-{
-	Boolean	ok;
-
-	ok = _process_options(appletalkOptions, N_APPLETALK_OPTIONS, argc, argv, newConfiguration);
-	return ok;
-}
-
-
-#endif	// !TARGET_OS_IPHONE && INCLUDE_APPLETALK
-
-
 #pragma mark -
 #pragma mark DNS
 
@@ -714,6 +592,12 @@ static options dnsOptions[] = {
 	{ "ServerAddresses", "address", isOther, &kSCPropNetDNSServerAddresses, __doDNSServerAddresses, NULL },
 	{   "nameserver"   , "address", isOther, &kSCPropNetDNSServerAddresses, __doDNSServerAddresses, NULL },
 	{   "nameservers"  , "address", isOther, &kSCPropNetDNSServerAddresses, __doDNSServerAddresses, NULL },
+	{ "SupplementalMatchDomains",
+		"domain",
+		isOther,
+		&kSCPropNetDNSSupplementalMatchDomains,
+		__doDNSDomainArray,
+		NULL },
 
 	{ "?"              , NULL     , isHelp , NULL                         , NULL,
 	    "\nDNS configuration commands\n\n"
@@ -1598,10 +1482,6 @@ set_protocol(int argc, char **argv)
 		ok = set_protocol_ipv6(argc, argv, newConfiguration);
 	} else if (CFEqual(protocolType, kSCNetworkProtocolTypeProxies)) {
 		ok = set_protocol_proxies(argc, argv, newConfiguration);
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-	} else if (CFEqual(protocolType, kSCNetworkProtocolTypeAppleTalk)) {
-		ok = set_protocol_appletalk(argc, argv, newConfiguration);
-#endif	// !TARGET_OS_IPHONE && INCLUDE_APPLETALK
 #if	!TARGET_OS_IPHONE
 	} else if (CFEqual(protocolType, kSCNetworkProtocolTypeSMB)) {
 		ok = set_protocol_smb(argc, argv, newConfiguration);
@@ -1869,18 +1749,6 @@ _protocol_description(SCNetworkProtocolRef protocol, Boolean skipEmpty)
 					     CFStringGetLength(description) > 0 ? ", " : "",
 					     currentProxy->proxy);
 		}
-#if	!TARGET_OS_IPHONE && INCLUDE_APPLETALK
-	} else if (CFEqual(protocolType, kSCNetworkProtocolTypeAppleTalk)) {
-		CFStringRef	method;
-
-		method = CFDictionaryGetValue(configuration, kSCPropNetAppleTalkConfigMethod);
-		if (isA_CFString(method)) {
-			CFStringAppendFormat(description,
-					     NULL,
-					     CFSTR("%@"),
-					     method);
-		}
-#endif	// !TARGET_OS_IPHONE && INCLUDE_APPLETALK
 #if	!TARGET_OS_IPHONE
 	} else if (CFEqual(protocolType, kSCNetworkProtocolTypeSMB)) {
 		CFStringRef	name;
diff --git a/scutil.tproj/net_service.c b/scutil.tproj/net_service.c
index 4b096a9..5afdd08 100644
--- a/scutil.tproj/net_service.c
+++ b/scutil.tproj/net_service.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -40,39 +40,6 @@
 /* -------------------- */
 
 
-__private_extern__
-CFComparisonResult
-_compare_services(const void *val1, const void *val2, void *context)
-{
-	CFStringRef		id1;
-	CFStringRef		id2;
-	CFArrayRef		order	= (CFArrayRef)context;
-	SCNetworkServiceRef	s1	= (SCNetworkServiceRef)val1;
-	SCNetworkServiceRef	s2	= (SCNetworkServiceRef)val2;
-
-	id1 = SCNetworkServiceGetServiceID(s1);
-	id2 = SCNetworkServiceGetServiceID(s2);
-
-	if (order != NULL) {
-		CFIndex	o1;
-		CFIndex	o2;
-		CFRange	range;
-
-		range = CFRangeMake(0, CFArrayGetCount(order));
-		o1 = CFArrayGetFirstIndexOfValue(order, range, id1);
-		o2 = CFArrayGetFirstIndexOfValue(order, range, id2);
-
-		if (o1 > o2) {
-			return (o2 != kCFNotFound) ? kCFCompareGreaterThan : kCFCompareLessThan;
-		} else if (o1 < o2) {
-			return (o1 != kCFNotFound) ? kCFCompareLessThan    : kCFCompareGreaterThan;
-		}
-	}
-
-	return CFStringCompare(id1, id2, 0);
-}
-
-
 static SCNetworkServiceRef
 _find_service(char *match)
 {
@@ -975,7 +942,7 @@ show_services(int argc, char **argv)
 			sorted = CFArrayCreateMutableCopy(NULL, 0, services);
 			CFArraySortValues(sorted,
 					  CFRangeMake(0, CFArrayGetCount(sorted)),
-					  _compare_services,
+					  _SCNetworkServiceCompare,
 					  (void *)order);
 			CFRelease(services);
 			services = sorted;
diff --git a/scutil.tproj/net_service.h b/scutil.tproj/net_service.h
index 6043472..e67e81f 100644
--- a/scutil.tproj/net_service.h
+++ b/scutil.tproj/net_service.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2004, 2006, 2010 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -35,8 +35,6 @@
 
 __BEGIN_DECLS
 
-CFComparisonResult	_compare_services	(const void *val1, const void *val2, void *context);
-
 void	create_service		(int argc, char **argv);
 void	disable_service		(int argc, char **argv);
 void	enable_service		(int argc, char **argv);
diff --git a/scutil.tproj/net_set.c b/scutil.tproj/net_set.c
index fa528f4..6dfc9da 100644
--- a/scutil.tproj/net_set.c
+++ b/scutil.tproj/net_set.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2005, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2004, 2005, 2009-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -485,6 +485,12 @@ set_set(int argc, char **argv)
 
 				CFAllocatorDeallocate(NULL, setID);
 			}
+		} else if (strcmp(command, "current") == 0) {
+			ok = SCNetworkSetSetCurrent(net_set);
+			if (!ok) {
+				SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError()));
+				return;
+			}
 		} else {
 			SCPrint(TRUE, stdout, CFSTR("set what?\n"));
 		}
@@ -542,7 +548,7 @@ show_set(int argc, char **argv)
 			sorted = CFArrayCreateMutableCopy(NULL, 0, services);
 			CFArraySortValues(sorted,
 					  CFRangeMake(0, CFArrayGetCount(sorted)),
-					  _compare_services,
+					  _SCNetworkServiceCompare,
 					  (void *)order);
 			CFRelease(services);
 			services = sorted;
diff --git a/scutil.tproj/notifications.c b/scutil.tproj/notifications.c
index ad195e6..aadfbe0 100644
--- a/scutil.tproj/notifications.c
+++ b/scutil.tproj/notifications.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2008-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -244,30 +244,31 @@ static void *
 _watcher(void *arg)
 {
 	notifyRl = CFRunLoopGetCurrent();
-	if (!notifyRl) {
+	if (notifyRl == NULL) {
 		SCPrint(TRUE, stdout, CFSTR("  CFRunLoopGetCurrent() failed\n"));
 		return NULL;
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (doDispatch) {
 		if (!SCDynamicStoreSetDispatchQueue(store, dispatch_get_current_queue())) {
 			SCPrint(TRUE, stdout, CFSTR("  %s\n"), SCErrorString(SCError()));
+			notifyRl = NULL;
 			return NULL;
 		}
 		notifyRls = (CFRunLoopSourceRef)kCFNull;
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		notifyRls = SCDynamicStoreCreateRunLoopSource(NULL, store, 0);
-		if (!notifyRls) {
+		if (notifyRls == NULL) {
 			SCPrint(TRUE, stdout, CFSTR("  %s\n"), SCErrorString(SCError()));
+			notifyRl = NULL;
 			return NULL;
 		}
 		CFRunLoopAddSource(notifyRl, notifyRls, kCFRunLoopDefaultMode);
 	}
 
+	pthread_setname_np("n.watch");
 	CFRunLoopRun();
+	notifyRl = NULL;
 	return NULL;
 }
 
@@ -278,7 +279,8 @@ do_notify_watch(int argc, char **argv)
 	pthread_attr_t	tattr;
 	pthread_t	tid;
 
-	if (notifyRl) {
+	if (notifyRl != NULL) {
+		SCPrint(TRUE, stdout, CFSTR("already active\n"));
 		return;
 	}
 
@@ -325,20 +327,53 @@ notificationWatcherVerbose(SCDynamicStoreRef store, void *arg)
 }
 
 
+static void *
+_callback(void *arg)
+{
+	SCDynamicStoreCallBack_v1	func  = (SCDynamicStoreCallBack_v1)arg;
+
+	notifyRl = CFRunLoopGetCurrent();
+	if (notifyRl == NULL) {
+		SCPrint(TRUE, stdout, CFSTR("  CFRunLoopGetCurrent() failed\n"));
+		return NULL;
+	}
+
+	if (!SCDynamicStoreNotifyCallback(store, notifyRl, func, "Changed detected by callback handler!")) {
+		SCPrint(TRUE, stdout, CFSTR("  %s\n"), SCErrorString(SCError()));
+		notifyRl = NULL;
+		return NULL;
+	}
+
+	pthread_setname_np("n.callback");
+	CFRunLoopRun();
+	notifyRl = NULL;
+	return NULL;
+}
+
+
 __private_extern__
 void
 do_notify_callback(int argc, char **argv)
 {
 	SCDynamicStoreCallBack_v1	func  = notificationWatcher;
+	pthread_attr_t			tattr;
+	pthread_t			tid;
+
+	if (notifyRl != NULL) {
+		SCPrint(TRUE, stdout, CFSTR("already active\n"));
+		return;
+	}
 
 	if ((argc == 1) && (strcmp(argv[0], "verbose") == 0)) {
 		func = notificationWatcherVerbose;
 	}
 
-	if (!SCDynamicStoreNotifyCallback(store, CFRunLoopGetCurrent(), func, "Changed detected by callback handler!")) {
-		SCPrint(TRUE, stdout, CFSTR("  %s\n"), SCErrorString(SCError()));
-		return;
-	}
+	pthread_attr_init(&tattr);
+	pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM);
+	pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
+//      pthread_attr_setstacksize(&tattr, 96 * 1024); // each thread gets a 96K stack
+	pthread_create(&tid, &tattr, _callback, (void *)func);
+	pthread_attr_destroy(&tattr);
 
 	return;
 }
@@ -489,30 +524,26 @@ __private_extern__
 void
 do_notify_cancel(int argc, char **argv)
 {
-	if (notifyRls) {
-#if	!TARGET_OS_IPHONE
+	if (notifyRls != NULL) {
 		if (doDispatch) {
 			if (!SCDynamicStoreSetDispatchQueue(store, NULL)) {
 				SCPrint(TRUE, stdout, CFSTR("  %s\n"), SCErrorString(SCError()));
 				return;
 			}
-		} else
-#endif	// !TARGET_OS_IPHONE
-		{
+		} else {
 			CFRunLoopSourceInvalidate(notifyRls);
 			CFRelease(notifyRls);
 		}
 		notifyRls = NULL;
+	} else {
+		if (!SCDynamicStoreNotifyCancel(store)) {
+			SCPrint(TRUE, stdout, CFSTR("  %s\n"), SCErrorString(SCError()));
+			return;
+		}
 	}
 
-	if (notifyRl) {
+	if (notifyRl != NULL) {
 		CFRunLoopStop(notifyRl);
-		notifyRl  = NULL;
-	}
-
-	if (!SCDynamicStoreNotifyCancel(store)) {
-		SCPrint(TRUE, stdout, CFSTR("  %s\n"), SCErrorString(SCError()));
-		return;
 	}
 
 	if (oact != NULL) {
diff --git a/scutil.tproj/prefs.c b/scutil.tproj/prefs.c
index 1ecf86e..4e201e1 100644
--- a/scutil.tproj/prefs.c
+++ b/scutil.tproj/prefs.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2003-2008, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -133,15 +133,43 @@ __private_extern__
 Boolean
 _prefs_open(CFStringRef name, CFStringRef prefsID)
 {
-	if (geteuid() == 0) {
-		prefs = SCPreferencesCreate(NULL, name, prefsID);
-	} else {
+	CFMutableDictionaryRef	options		= NULL;
+	Boolean			useHelper	= FALSE;
+	Boolean			useOptions	= FALSE;
+
+	authorization = NULL;
+
+	if (geteuid() != 0) {
+		// if we need to use a helper
+		useHelper = TRUE;
+
 #if	!TARGET_OS_IPHONE
 		authorization = _createAuthorization();
-#else	/* !TARGET_OS_IPHONE */
-		authorization = NULL;
 #endif	/* !TARGET_OS_IPHONE */
+	}
+
+	if (getenv("SCPREFERENCES_REMOVE_WHEN_EMPTY") != NULL) {
+		// if we have options
+		useOptions = TRUE;
+
+		if (options == NULL) {
+			options = CFDictionaryCreateMutable(NULL,
+							    0,
+							    &kCFTypeDictionaryKeyCallBacks,
+							    &kCFTypeDictionaryValueCallBacks);
+		}
+		CFDictionarySetValue(options, kSCPreferencesOptionRemoveWhenEmpty, kCFBooleanTrue);
+	}
+
+	if (!useHelper && !useOptions) {
+		// if no helper/options needed
+		prefs = SCPreferencesCreate(NULL, name, prefsID);
+	} else if (!useOptions) {
+		// if no options needed
 		prefs = SCPreferencesCreateWithAuthorization(NULL, name, prefsID, authorization);
+	} else {
+		prefs = SCPreferencesCreateWithOptions(NULL, name, prefsID, authorization, options);
+		CFRelease(options);
 	}
 
 	if (prefs == NULL) {
@@ -241,27 +269,6 @@ _prefs_commitRequired(int argc, char **argv, const char *command)
 /* -------------------- */
 
 
-static CFStringRef
-_copyStringFromSTDIN()
-{
-	char		buf[1024];
-	size_t		len;
-	CFStringRef	utf8;
-
-	if (fgets(buf, sizeof(buf), stdin) == NULL) {
-		return NULL;
-	}
-
-	len = strlen(buf);
-	if (buf[len-1] == '\n') {
-		buf[--len] = '\0';
-	}
-
-	utf8 = CFStringCreateWithBytes(NULL, (UInt8 *)buf, len, kCFStringEncodingUTF8, TRUE);
-	return utf8;
-}
-
-
 static void
 get_ComputerName(int argc, char **argv)
 {
diff --git a/scutil.tproj/scutil.c b/scutil.tproj/scutil.c
index 08703da..c506724 100644
--- a/scutil.tproj/scutil.c
+++ b/scutil.tproj/scutil.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -45,6 +45,7 @@
  * - initial revision
  */
 
+#include <TargetConditionals.h>
 #include <ctype.h>
 #include <getopt.h>
 #include <stdio.h>
@@ -63,6 +64,7 @@
 #include "commands.h"
 #include "dictionary.h"
 #include "net.h"
+#include "nc.h"
 #include "prefs.h"
 #include "session.h"
 #include "tests.h"
@@ -99,10 +101,32 @@ static const struct option longopts[] = {
 	{ "prefs",		no_argument,		NULL,	0	},
 	{ "proxy",		no_argument,		NULL,	0	},
 	{ "set",		required_argument,	NULL,	0	},
+	{ "nc",			required_argument,	NULL,	0	},
 	{ NULL,			0,			NULL,	0	}
 };
 
 
+__private_extern__
+CFStringRef
+_copyStringFromSTDIN()
+{
+	char		buf[1024];
+	size_t		len;
+	CFStringRef	utf8;
+
+	if (fgets(buf, sizeof(buf), stdin) == NULL) {
+		return NULL;
+	}
+
+	len = strlen(buf);
+	if (buf[len-1] == '\n') {
+		buf[--len] = '\0';
+	}
+
+	utf8 = CFStringCreateWithBytes(NULL, (UInt8 *)buf, len, kCFStringEncodingUTF8, TRUE);
+	return utf8;
+}
+
 static char *
 getLine(char *buf, int len, InputRef src)
 {
@@ -133,7 +157,7 @@ getLine(char *buf, int len, InputRef src)
 		} while ((n != '\n') && (n != EOF));
 	}
 
-	if (src->h) {
+	if (src->h && (buf[0] != '\0')) {
 		HistEvent	ev;
 
 		history(src->h, &ev, H_ENTER, buf);
@@ -250,7 +274,7 @@ usage(const char *command)
 	SCPrint(TRUE, stderr, CFSTR("usage: %s\n"), command);
 	SCPrint(TRUE, stderr, CFSTR("\tinteractive access to the dynamic store.\n"));
 	SCPrint(TRUE, stderr, CFSTR("\n"));
-	SCPrint(TRUE, stderr, CFSTR("   or: %s --prefs\n"), command);
+	SCPrint(TRUE, stderr, CFSTR("   or: %s --prefs [preference-file]\n"), command);
 	SCPrint(TRUE, stderr, CFSTR("\tinteractive access to the [raw] stored preferences.\n"));
 	SCPrint(TRUE, stderr, CFSTR("\n"));
 	SCPrint(TRUE, stderr, CFSTR("   or: %s [-W] -r nodename\n"), command);
@@ -307,6 +331,7 @@ main(int argc, char * const argv[])
 	int			opti;
 	const char		*prog	= argv[0];
 	char			*set	= NULL;
+	char			*nc_cmd	= NULL;
 	InputRef		src;
 	int			timeout	= 15;	/* default timeout (in seconds) */
 	char			*wait	= NULL;
@@ -364,6 +389,9 @@ main(int argc, char * const argv[])
 			} else if (strcmp(longopts[opti].name, "set") == 0) {
 				set = optarg;
 				xStore++;
+			} else if (strcmp(longopts[opti].name, "nc") == 0) {
+				nc_cmd = optarg;
+				xStore++;
 			}
 			break;
 		case '?':
@@ -377,7 +405,6 @@ main(int argc, char * const argv[])
 		// if we are attempting to process more than one type of request
 		usage(prog);
 	}
-
 	/* are we checking (or watching) the reachability of a host/address */
 	if (doReach) {
 		if (argc < 1) {
@@ -427,6 +454,15 @@ main(int argc, char * const argv[])
 		/* NOT REACHED */
 	}
 
+	/* network connection commands */
+	if (nc_cmd) {
+		if (find_nc_cmd(nc_cmd) < 0) {
+			usage(prog);
+		}
+		do_nc_cmd(nc_cmd, argc, (char **)argv, watch);
+		/* NOT REACHED */
+	}
+
 	if (doNet) {
 		/* if we are going to be managing the network configuration */
 		commands  = (cmdInfo *)commands_net;
@@ -445,7 +481,7 @@ main(int argc, char * const argv[])
 
 		do_dictInit(0, NULL);	/* start with an empty dictionary */
 		do_prefs_init();	/* initialization */
-		do_prefs_open(0, NULL);	/* open default prefs */
+		do_prefs_open(argc, (char **)argv);	/* open prefs */
 	} else {
 		/* if we are going to be managing the dynamic store */
 		commands  = (cmdInfo *)commands_store;
diff --git a/scutil.tproj/scutil.h b/scutil.tproj/scutil.h
index 75bd7f4..cbffecf 100644
--- a/scutil.tproj/scutil.h
+++ b/scutil.tproj/scutil.h
@@ -64,7 +64,8 @@ extern CFMutableArrayRef	watchedPatterns;
 
 __BEGIN_DECLS
 
-Boolean	process_line			(InputRef	src);
+Boolean		process_line		(InputRef	src);
+CFStringRef	_copyStringFromSTDIN	();
 
 __END_DECLS
 
diff --git a/scutil.tproj/session.c b/scutil.tproj/session.c
index 0cba63e..6f00f38 100644
--- a/scutil.tproj/session.c
+++ b/scutil.tproj/session.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -35,6 +35,15 @@
 #include "session.h"
 #include "notifications.h"
 
+
+static void
+reconnected(SCDynamicStoreRef store, void *info)
+{
+	SCPrint(TRUE, stdout, CFSTR("SCDynamicStore server restarted, session reconnected\n"));
+	return;
+}
+
+
 __private_extern__
 void
 do_open(int argc, char **argv)
@@ -67,6 +76,8 @@ do_open(int argc, char **argv)
 		return;
 	}
 
+	(void) SCDynamicStoreSetDisconnectCallBack(store, reconnected);
+
 	watchedKeys     = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 	watchedPatterns = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
 
@@ -78,18 +89,22 @@ __private_extern__
 void
 do_close(int argc, char **argv)
 {
-	if (notifyRls) {
-		CFRunLoopSourceInvalidate(notifyRls);
-		CFRelease(notifyRls);
+	if (notifyRls != NULL) {
+		if (doDispatch) {
+			(void) SCDynamicStoreSetDispatchQueue(store, NULL);
+		} else {
+			CFRunLoopSourceInvalidate(notifyRls);
+			CFRelease(notifyRls);
+		}
 		notifyRls = NULL;
 	}
 
-	if (notifyRl) {
+	if (notifyRl != NULL) {
 		CFRunLoopStop(notifyRl);
 		notifyRl  = NULL;
 	}
 
-	if (store) {
+	if (store != NULL) {
 		CFRelease(store);
 		store = NULL;
 		CFRelease(watchedKeys);
diff --git a/scutil.tproj/tests.c b/scutil.tproj/tests.c
index cc9f95f..471ac4c 100644
--- a/scutil.tproj/tests.c
+++ b/scutil.tproj/tests.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2001, 2003-2005, 2007-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-2005, 2007-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -51,6 +51,8 @@
 static SCNetworkReachabilityRef
 _setupReachability(int argc, char **argv, SCNetworkReachabilityContext *context)
 {
+	char				*ip_address	= argv[0];
+	const char			*interface;
 	struct sockaddr_in		sin;
 	struct sockaddr_in6		sin6;
 	SCNetworkReachabilityRef	target	= NULL;
@@ -63,36 +65,120 @@ _setupReachability(int argc, char **argv, SCNetworkReachabilityContext *context)
 	sin6.sin6_len    = sizeof(sin6);
 	sin6.sin6_family = AF_INET6;
 
-	if (inet_aton(argv[0], &sin.sin_addr) == 1) {
+	interface = strchr(argv[0], '%');
+	if (interface != NULL) {
+		ip_address = strdup(argv[0]);
+		ip_address[interface - argv[0]] = '\0';
+		interface++;
+	}
+
+	if (inet_aton(ip_address, &sin.sin_addr) == 1) {
 		if (argc == 1) {
-			target = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&sin);
-			if (context != NULL) {
-				context->info = "by address";
+			if (interface == NULL) {
+				target = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&sin);
+				if (context != NULL) {
+					context->info = "by address";
+				}
+			} else {
+				CFDataRef		data;
+				CFStringRef		str;
+				CFMutableDictionaryRef	options;
+
+				if (if_nametoindex(interface) == 0) {
+					SCPrint(TRUE, stderr, CFSTR("No interface: %s\n"), interface);
+					exit(1);
+				}
+
+				options = CFDictionaryCreateMutable(NULL,
+								    0,
+								    &kCFTypeDictionaryKeyCallBacks,
+								    &kCFTypeDictionaryValueCallBacks);
+				data = CFDataCreate(NULL, (const UInt8 *)&sin, sizeof(sin));
+				CFDictionarySetValue(options, kSCNetworkReachabilityOptionRemoteAddress, data);
+				CFRelease(data);
+				str  = CFStringCreateWithCString(NULL, interface, kCFStringEncodingASCII);
+				CFDictionarySetValue(options, kSCNetworkReachabilityOptionInterface, str);
+				CFRelease(str);
+				target = SCNetworkReachabilityCreateWithOptions(NULL, options);
+				if (context != NULL) {
+					context->info = "by address w/scope";
+				}
+				CFRelease(options);
 			}
 		} else {
+			char			*remote_address	= argv[1];
+			const char		*interface2;
 			struct sockaddr_in	r_sin;
 
+			interface2 = strchr(argv[1], '%');
+			if (interface2 != NULL) {
+				remote_address = strdup(argv[1]);
+				remote_address[interface2 - argv[1]] = '\0';
+				interface2++;
+
+				if ((interface != NULL) && (strcmp(interface, interface2) != 0)) {
+					SCPrint(TRUE, stderr,
+						CFSTR("Interface mismatch \"%s\" != \"%s\"\n"),
+						interface,
+						interface2);
+					exit(1);
+				}
+
+				interface = interface2;
+			}
+
 			bzero(&r_sin, sizeof(r_sin));
 			r_sin.sin_len    = sizeof(r_sin);
 			r_sin.sin_family = AF_INET;
-			if (inet_aton(argv[1], &r_sin.sin_addr) == 0) {
-				SCPrint(TRUE, stderr, CFSTR("Could not interpret address \"%s\"\n"), argv[1]);
+			if (inet_aton(remote_address, &r_sin.sin_addr) == 0) {
+				SCPrint(TRUE, stderr, CFSTR("Could not interpret address \"%s\"\n"), remote_address);
 				exit(1);
 			}
 
-			target = SCNetworkReachabilityCreateWithAddressPair(NULL,
-									    (struct sockaddr *)&sin,
-									    (struct sockaddr *)&r_sin);
-			if (context != NULL) {
-				context->info = "by address pair";
+			if (remote_address != argv[1]) {
+				free(remote_address);
+			}
+
+			if (interface == NULL) {
+				target = SCNetworkReachabilityCreateWithAddressPair(NULL,
+										    (struct sockaddr *)&sin,
+										    (struct sockaddr *)&r_sin);
+				if (context != NULL) {
+					context->info = "by address pair";
+				}
+			} else {
+				CFDataRef		data;
+				CFStringRef		str;
+				CFMutableDictionaryRef	options;
+
+				if (if_nametoindex(interface) == 0) {
+					SCPrint(TRUE, stderr, CFSTR("No interface: %s\n"), interface);
+					exit(1);
+				}
+
+				options = CFDictionaryCreateMutable(NULL,
+								    0,
+								    &kCFTypeDictionaryKeyCallBacks,
+								    &kCFTypeDictionaryValueCallBacks);
+				data = CFDataCreate(NULL, (const UInt8 *)&sin, sizeof(sin));
+				CFDictionarySetValue(options, kSCNetworkReachabilityOptionLocalAddress, data);
+				CFRelease(data);
+				data = CFDataCreate(NULL, (const UInt8 *)&r_sin, sizeof(r_sin));
+				CFDictionarySetValue(options, kSCNetworkReachabilityOptionRemoteAddress, data);
+				CFRelease(data);
+				str  = CFStringCreateWithCString(NULL, interface, kCFStringEncodingASCII);
+				CFDictionarySetValue(options, kSCNetworkReachabilityOptionInterface, str);
+				CFRelease(str);
+				target = SCNetworkReachabilityCreateWithOptions(NULL, options);
+				if (context != NULL) {
+					context->info = "by address pair w/scope";
+				}
+				CFRelease(options);
 			}
 		}
 	} else if (inet_pton(AF_INET6, argv[0], &sin6.sin6_addr) == 1) {
-		char	*p;
-
-		p = strchr(argv[0], '%');
-		if (p != NULL) {
-			sin6.sin6_scope_id = if_nametoindex(p + 1);
+		if (interface != NULL) {
+			sin6.sin6_scope_id = if_nametoindex(interface);
 		}
 
 		if (argc == 1) {
@@ -111,9 +197,9 @@ _setupReachability(int argc, char **argv, SCNetworkReachabilityContext *context)
 				exit(1);
 			}
 
-			p = strchr(argv[1], '%');
-			if (p != NULL) {
-				r_sin6.sin6_scope_id = if_nametoindex(p + 1);
+			interface = strchr(argv[1], '%');
+			if (interface != NULL) {
+				r_sin6.sin6_scope_id = if_nametoindex(interface);
 			}
 
 			target = SCNetworkReachabilityCreateWithAddressPair(NULL,
@@ -151,8 +237,26 @@ _setupReachability(int argc, char **argv, SCNetworkReachabilityContext *context)
 				CFDataRef		data;
 				struct addrinfo		hints	= { 0 };
 				int			i;
+				int			n_hints	= 0;
 
 				for (i = 2; i < argc; i++) {
+					if (strcasecmp(argv[i], "interface") == 0) {
+						if (++i >= argc) {
+							SCPrint(TRUE, stderr, CFSTR("No interface\n"));
+							CFRelease(options);
+							exit(1);
+						}
+						if (if_nametoindex(argv[i]) == 0) {
+							SCPrint(TRUE, stderr, CFSTR("No interface: %s\n"), argv[i]);
+							CFRelease(options);
+							exit(1);
+						}
+						str  = CFStringCreateWithCString(NULL, argv[i], kCFStringEncodingASCII);
+						CFDictionarySetValue(options, kSCNetworkReachabilityOptionInterface, str);
+						CFRelease(str);
+						continue;
+					}
+
 					if (strcasecmp(argv[i], "AI_ADDRCONFIG") == 0) {
 						hints.ai_flags |= AI_ADDRCONFIG;
 					} else if (strcasecmp(argv[i], "AI_ALL") == 0) {
@@ -187,13 +291,17 @@ _setupReachability(int argc, char **argv, SCNetworkReachabilityContext *context)
 						hints.ai_protocol = IPPROTO_UDP;
 					} else {
 						SCPrint(TRUE, stderr, CFSTR("Unrecognized hint: %s\n"), argv[i]);
+						CFRelease(options);
 						exit(1);
 					}
+					n_hints++;
 				}
 
-				data = CFDataCreate(NULL, (const UInt8 *)&hints, sizeof(hints));
-				CFDictionarySetValue(options, kSCNetworkReachabilityOptionHints, data);
-				CFRelease(data);
+				if (n_hints > 0) {
+					data = CFDataCreate(NULL, (const UInt8 *)&hints, sizeof(hints));
+					CFDictionarySetValue(options, kSCNetworkReachabilityOptionHints, data);
+					CFRelease(data);
+				}
 			}
 			if (CFDictionaryGetCount(options) > 0) {
 				target = SCNetworkReachabilityCreateWithOptions(NULL, options);
@@ -202,12 +310,17 @@ _setupReachability(int argc, char **argv, SCNetworkReachabilityContext *context)
 				}
 			} else {
 				SCPrint(TRUE, stderr, CFSTR("Must specify nodename or servname\n"));
+				CFRelease(options);
 				exit(1);
 			}
 			CFRelease(options);
 		}
 	}
 
+	if (ip_address != argv[0]) {
+		free(ip_address);
+	}
+
 	return target;
 }
 
@@ -378,15 +491,12 @@ do_watchReachability(int argc, char **argv)
 		exit(1);
 	}
 
-#if	!TARGET_OS_IPHONE
 	if (doDispatch) {
 		if (!SCNetworkReachabilitySetDispatchQueue(target_async, dispatch_get_current_queue())) {
 			printf("SCNetworkReachabilitySetDispatchQueue() failed: %s\n", SCErrorString(SCError()));
 			exit(1);
 		}
-	} else
-#endif	// !TARGET_OS_IPHONE
-	{
+	} else {
 		if (!SCNetworkReachabilityScheduleWithRunLoop(target_async, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) {
 			printf("SCNetworkReachabilityScheduleWithRunLoop() failed: %s\n", SCErrorString(SCError()));
 			exit(1);
@@ -405,62 +515,107 @@ do_watchReachability(int argc, char **argv)
 }
 
 
-__private_extern__
-void
-do_showDNSConfiguration(int argc, char **argv)
+static void
+showResolver(dns_resolver_t *resolver, int index)
 {
-	dns_config_t	*dns_config;
+	int	i;
 
-	dns_config = dns_configuration_copy();
-	if (dns_config) {
-		int	n;
+	SCPrint(TRUE, stdout, CFSTR("\nresolver #%d\n"), index);
 
-		SCPrint(TRUE, stdout, CFSTR("DNS configuration\n"));
+	if (resolver->domain != NULL) {
+		SCPrint(TRUE, stdout, CFSTR("  domain   : %s\n"), resolver->domain);
+	}
 
-		for (n = 0; n < dns_config->n_resolver; n++) {
-			int		i;
-			dns_resolver_t	*resolver	= dns_config->resolver[n];
+	for (i = 0; i < resolver->n_search; i++) {
+		SCPrint(TRUE, stdout, CFSTR("  search domain[%d] : %s\n"), i, resolver->search[i]);
+	}
 
-			SCPrint(TRUE, stdout, CFSTR("\nresolver #%d\n"), n + 1);
+	for (i = 0; i < resolver->n_nameserver; i++) {
+		char	buf[128];
 
-			if (resolver->domain != NULL) {
-				SCPrint(TRUE, stdout, CFSTR("  domain : %s\n"), resolver->domain);
-			}
+		_SC_sockaddr_to_string(resolver->nameserver[i], buf, sizeof(buf));
+		SCPrint(TRUE, stdout, CFSTR("  nameserver[%d] : %s\n"), i, buf);
+	}
 
-			for (i = 0; i < resolver->n_search; i++) {
-				SCPrint(TRUE, stdout, CFSTR("  search domain[%d] : %s\n"), i, resolver->search[i]);
-			}
+	for (i = 0; i < resolver->n_sortaddr; i++) {
+		char	abuf[32];
+		char	mbuf[32];
 
-			for (i = 0; i < resolver->n_nameserver; i++) {
-				char	buf[128];
+		(void)inet_ntop(AF_INET, &resolver->sortaddr[i]->address, abuf, sizeof(abuf));
+		(void)inet_ntop(AF_INET, &resolver->sortaddr[i]->mask,    mbuf, sizeof(mbuf));
+		SCPrint(TRUE, stdout, CFSTR("  sortaddr[%d] : %s/%s\n"), i, abuf, mbuf);
+	}
 
-				_SC_sockaddr_to_string(resolver->nameserver[i], buf, sizeof(buf));
-				SCPrint(TRUE, stdout, CFSTR("  nameserver[%d] : %s\n"), i, buf);
-			}
+	if (resolver->options != NULL) {
+		SCPrint(TRUE, stdout, CFSTR("  options  : %s\n"), resolver->options);
+	}
 
-			for (i = 0; i < resolver->n_sortaddr; i++) {
-				char	abuf[32];
-				char	mbuf[32];
+	if (resolver->port != 0) {
+		SCPrint(TRUE, stdout, CFSTR("  port     : %hd\n"), resolver->port);
+	}
 
-				(void)inet_ntop(AF_INET, &resolver->sortaddr[i]->address, abuf, sizeof(abuf));
-				(void)inet_ntop(AF_INET, &resolver->sortaddr[i]->mask,    mbuf, sizeof(mbuf));
-				SCPrint(TRUE, stdout, CFSTR("  sortaddr[%d] : %s/%s\n"), i, abuf, mbuf);
-			}
+	if (resolver->timeout != 0) {
+		SCPrint(TRUE, stdout, CFSTR("  timeout  : %d\n"), resolver->timeout);
+	}
 
-			if (resolver->options != NULL) {
-				SCPrint(TRUE, stdout, CFSTR("  options : %s\n"), resolver->options);
-			}
+	if (resolver->if_index != 0) {
+		char	buf[IFNAMSIZ];
+		char	*if_name;
 
-			if (resolver->port != 0) {
-				SCPrint(TRUE, stdout, CFSTR("  port    : %hd\n"), resolver->port);
-			}
+		if_name = if_indextoname(resolver->if_index, buf);
+		SCPrint(TRUE, stdout, CFSTR("  if_index : %d (%s)\n"),
+			resolver->if_index,
+			(if_name != NULL) ? if_name : "?");
+	}
 
-			if (resolver->timeout != 0) {
-				SCPrint(TRUE, stdout, CFSTR("  timeout : %d\n"), resolver->timeout);
-			}
+	if (resolver->flags != 0) {
+		uint32_t	flags	= resolver->flags;
+
+		SCPrint(TRUE, stdout, CFSTR("  flags    : "));
+		if (flags & DNS_RESOLVER_FLAGS_SCOPED) {
+			SCPrint(TRUE, stdout, CFSTR("Scoped"));
+			flags &= ~DNS_RESOLVER_FLAGS_SCOPED;
+			SCPrint(flags != 0, stdout, CFSTR(","));
+		}
+		if (flags != 0) {
+			SCPrint(TRUE, stdout, CFSTR("0x%08x"), flags);
+		}
+		SCPrint(TRUE, stdout, CFSTR("\n"));
+	}
 
-			if (resolver->search_order != 0) {
-				SCPrint(TRUE, stdout, CFSTR("  order   : %d\n"), resolver->search_order);
+	if (resolver->search_order != 0) {
+		SCPrint(TRUE, stdout, CFSTR("  order    : %d\n"), resolver->search_order);
+	}
+
+	return;
+}
+
+
+__private_extern__
+void
+do_showDNSConfiguration(int argc, char **argv)
+{
+	dns_config_t	*dns_config;
+
+	dns_config = dns_configuration_copy();
+	if (dns_config) {
+		int	i;
+
+		SCPrint(TRUE, stdout, CFSTR("DNS configuration\n"));
+
+		for (i = 0; i < dns_config->n_resolver; i++) {
+			dns_resolver_t	*resolver	= dns_config->resolver[i];
+
+			showResolver(resolver, i + 1);
+		}
+
+		if ((dns_config->n_scoped_resolver > 0) && (dns_config->scoped_resolver != NULL)) {
+			SCPrint(TRUE, stdout, CFSTR("\nDNS configuration (for scoped queries)\n"));
+
+			for (i = 0; i < dns_config->n_scoped_resolver; i++) {
+				dns_resolver_t	*resolver	= dns_config->scoped_resolver[i];
+
+				showResolver(resolver, i + 1);
 			}
 		}
 
@@ -473,6 +628,24 @@ do_showDNSConfiguration(int argc, char **argv)
 }
 
 
+static void
+showProxy(CFDictionaryRef proxy)
+{
+	CFMutableDictionaryRef	cleaned	= NULL;
+
+	if (!_sc_debug) {
+		cleaned = CFDictionaryCreateMutableCopy(NULL, 0, proxy);
+		CFDictionaryRemoveValue(cleaned, kSCPropNetProxiesSupplemental);
+		CFDictionaryRemoveValue(cleaned, kSCPropNetProxiesScoped);
+		proxy = cleaned;
+	}
+
+	SCPrint(TRUE, stdout, CFSTR("%@\n"), proxy);
+	if (cleaned != NULL) CFRelease(cleaned);
+	return;
+}
+
+
 __private_extern__
 void
 do_showProxyConfiguration(int argc, char **argv)
@@ -481,7 +654,82 @@ do_showProxyConfiguration(int argc, char **argv)
 
 	proxies = SCDynamicStoreCopyProxies(NULL);
 	if (proxies != NULL) {
-		SCPrint(TRUE, stdout, CFSTR("%@\n"), proxies);
+		CFStringRef	interface	= NULL;
+		CFStringRef	server		= NULL;
+
+		while (argc > 0) {
+			if (strcasecmp(argv[0], "interface") == 0) {
+				argv++;
+				argc--;
+
+				if (argc < 1) {
+					SCPrint(TRUE, stderr, CFSTR("No interface\n"));
+					exit(1);
+				}
+
+				if (if_nametoindex(argv[0]) == 0) {
+					SCPrint(TRUE, stderr, CFSTR("No interface: %s\n"), argv[0]);
+					exit(1);
+				}
+
+				interface = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
+				argv++;
+				argc--;
+			} else {
+				if (server != NULL) {
+					CFRelease(server);
+				}
+
+				server = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
+				argv++;
+				argc--;
+			}
+		}
+
+		if ((server != NULL) || (interface != NULL)) {
+			CFArrayRef	matching;
+
+			matching = SCNetworkProxiesCopyMatching(proxies, server, interface);
+			if (matching != NULL) {
+				CFIndex	i;
+				CFIndex	n;
+
+				if (server != NULL) {
+					if (interface != NULL) {
+						SCPrint(TRUE, stdout,
+							CFSTR("server = %@, interface = %@\n"),
+							server,
+							interface);
+					} else {
+						SCPrint(TRUE, stdout,
+							CFSTR("server = %@\n"),
+							server);
+					}
+				} else {
+					SCPrint(TRUE, stdout,
+						CFSTR("interface = %@\n"),
+						interface);
+				}
+
+				n = CFArrayGetCount(matching);
+				for (i = 0; i < n; i++) {
+					CFDictionaryRef	proxy;
+
+					proxy = CFArrayGetValueAtIndex(matching, i);
+					SCPrint(TRUE, stdout, CFSTR("\nproxy #%d\n"), i + 1);
+					showProxy(proxy);
+				}
+
+				CFRelease(matching);
+			} else {
+				SCPrint(TRUE, stdout, CFSTR("No matching proxy configurations\n"));
+			}
+		} else {
+			showProxy(proxies);
+		}
+
+		if (interface != NULL) CFRelease(interface);
+		if (server != NULL) CFRelease(server);
 		CFRelease(proxies);
 	} else {
 		SCPrint(TRUE, stdout, CFSTR("No proxy configuration available\n"));
-- 
2.47.2