diff --git a/configure.ac b/configure.ac
index ba54bcd..7f597d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -55,6 +55,8 @@ AC_ARG_WITH(nas,       AS_HELP_STRING([--without-nas],[do not use the NAS sound
             [if test "x$withval" = "xno"; then ac_cv_header_audio_audiolib_h=no; fi])
 AC_ARG_WITH(openal,    AS_HELP_STRING([--without-openal],[do not use OpenAL]),
             [if test "x$withval" = "xno"; then ac_cv_header_AL_al_h=no; ac_cv_header_OpenAL_al_h=no; fi])
+AC_ARG_WITH(dns-sd,    AS_HELP_STRING([--without-dns-sd],[do not use Bonjour]),
+            [if test "x$withval" = "xno"; then ac_cv_header_dns_sd_h=no; fi])
 AC_ARG_WITH(opengl,    AS_HELP_STRING([--without-opengl],[do not use OpenGL]))
 AC_ARG_WITH(openssl,   AS_HELP_STRING([--without-openssl],[do not use OpenSSL]),
             [if test "x$withval" = "xno"; then ac_cv_header_openssl_err_h=no; ac_cv_header_openssl_ssl_h=no; fi])
@@ -320,6 +322,7 @@ AC_CHECK_HEADERS(\
 	direct.h \
 	dirent.h \
 	dlfcn.h \
+	dns_sd.h \
 	elf.h \
 	float.h \
 	fnmatch.h \
@@ -1450,6 +1453,27 @@ WINE_NOTICE_WITH(openal,[test "x$ac_cv_lib_openal_alGetSource3i" != xyes],
                  [libopenal ${notice_platform}development files not found (or too old), OpenAL won't be supported.])
 test "x$ac_cv_lib_openal_alGetSource3i" = xyes || enable_openal32=${enable_openal32:-no}
 
+dnl **** Check for libdns_sd ****
+if test "$ac_cv_header_dns_sd_h" = "yes"
+then
+dnl Mac OS X has the dns functions in its main library libSystem
+dnl so we don't need to check for it
+    case $host_os in
+      darwin*|macosx*)
+        AC_SUBST(LIBDNSSD,"-lSystem.B");
+      *)
+        AC_CHECK_LIB(dns_sd,DNSServiceRegister,[AC_SUBST(LIBDNSSD,"-ldns_sd")]);
+    esac
+fi
+case $host_os in
+  darwin*|macosx*)
+;;
+  *)
+    WINE_NOTICE_WITH(openal,[test "x$ac_cv_lib_dns_sd_DNSServiceRegister" != xyes],
+                 [libdns_sd ${notice_platform}development files not found (or too old), mDNS won't be supported.])
+    test "x$ac_cv_lib_dns_sd_DNSServiceRegister" = xyes || enable_dns-sd=${enable_dns-sd:-no}
+esac
+
 dnl **** Check for libkstat ****
 if test "$ac_cv_header_kstat_h" = "yes"
 then
diff --git a/dlls/dnssd/Makefile.in b/dlls/dnssd/Makefile.in
new file mode 100644
index 0000000..d47be9c
--- /dev/null
+++ b/dlls/dnssd/Makefile.in
@@ -0,0 +1,14 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = dnssd.dll
+IMPORTS   = kernel32 ntdll
+EXTRALIBS = @LIBDNSSD@
+
+C_SRCS = \
+	dnssd.c
+
+@MAKE_DLL_RULES@
+
+@DEPENDENCIES@  # everything below this line is overwritten by make depend
diff --git a/dlls/dnssd/dnssd.c b/dlls/dnssd/dnssd.c
new file mode 100644
index 0000000..473e55f
--- /dev/null
+++ b/dlls/dnssd/dnssd.c
@@ -0,0 +1,277 @@
+/*
+ * dnssd.dll thunk. Wraps Win32 DNS-SD function calls around a native
+ * implementation.
+ *
+ * Copyright 2010 C.W. Betts
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+#include <string.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+#include <dns_sd.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL(dnssd);
+
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
+{
+    switch(fdwReason)
+    {
+        case DLL_WINE_PREATTACH:
+            return TRUE;  /* don't prefer native version */
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hInstDLL);
+            break;
+        case DLL_PROCESS_DETACH:
+            break;
+    }
+    return TRUE;
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceGetProperty (char *attr,\
+void *result, uint32_t *size)
+{
+    return DNSServiceGetProperty(attr, result, size);    
+}
+
+int CDECL wine_DNSServiceRefSockFD(DNSServiceRef sdRef)
+{
+    return DNSServiceRefSockFD(sdRef);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceProcessResult(DNSServiceRef sdRef)
+{
+    return DNSServiceProcessResult(sdRef);
+}
+
+
+void CDECL wine_DNSServiceRefDeallocate(DNSServiceRef sdRef)
+{
+    DNSServiceRefDeallocate(sdRef);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceEnumerateDomains\
+(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceDomainEnumReply callBack, void *context)
+{
+    return DNSServiceEnumerateDomains(sdref, flags, interfaceIndex, callback, context);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceRegister \
+(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, const char *regtype, const char *domain, const char *host, uint16_t port, uint16_t txtLen, const void *txtRecord, DNSServiceRegisterReply callBack, void *context)
+{
+    return DNSServiceRegister(sdRef, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context);
+}
+
+
+DNSServiceErrorType CDECL wine_DNSServiceAddRecord
+    (
+    DNSServiceRef                       sdRef,
+    DNSRecordRef                        *RecordRef,
+    DNSServiceFlags                     flags,
+    uint16_t                            rrtype,
+    uint16_t                            rdlen,
+    const void                          *rdata,
+    uint32_t                            ttl
+    )
+{
+    return DNSServiceAddRecord(sdRef, RecordRef, flags, rrtype, rdlen, rdata, ttl);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceUpdateRecord
+    (
+    DNSServiceRef sdRef,
+    DNSRecordRef RecordRef,
+    DNSServiceFlags flags,
+    uint16_t rdlen,
+    const void *rdata,
+    uint32_t ttl
+    )
+{
+    return DNSServiceUpdateRecord(sdRef, RecordRef, flags, rdlen, rdata, ttl);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceRemoveRecord \
+(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags)
+{
+    return DNSServiceRemoveRecord(sdRef, RecordRef, flags);
+}
+
+
+DNSServiceErrorType CDECL wine_DNSServiceBrowse
+    (
+    DNSServiceRef                       *sdRef,
+    DNSServiceFlags                     flags,
+    uint32_t                            interfaceIndex,
+    const char                          *regtype,
+    const char                          *domain,    /* may be NULL */
+    DNSServiceBrowseReply               callBack,
+    void                                *context    /* may be NULL */
+    )
+{
+    return DNSServiceBrowse(sdRef, flags, interfaceIndex, regtype, domain, callback, context);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceResolve
+    (
+    DNSServiceRef                       *sdRef,
+    DNSServiceFlags                     flags,
+    uint32_t                            interfaceIndex,
+    const char                          *name,
+    const char                          *regtype,
+    const char                          *domain,
+    DNSServiceResolveReply              callBack,
+    void                                *context  /* may be NULL */
+    )
+{
+    return DNSServiceResolve(sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceCreateConnection(DNSServiceRef *sdRef)
+{
+    return DNSServiceCrateConnection(sdRef);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceRegisterRecord
+    (
+    DNSServiceRef                       sdRef,
+    DNSRecordRef                        *RecordRef,
+    DNSServiceFlags                     flags,
+    uint32_t                            interfaceIndex,
+    const char                          *fullname,
+    uint16_t                            rrtype,
+    uint16_t                            rrclass,
+    uint16_t                            rdlen,
+    const void                          *rdata,
+    uint32_t                            ttl,
+    DNSServiceRegisterRecordReply       callBack,
+    void                                *context    /* may be NULL */
+    )
+{
+    return DNSServiceRegisterRecord(sdRef, RecordRef, flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata, ttl, callBack, context);
+}
+
+DNSServiceErrorType CDECL wine_DNSServiceQueryRecord
+    (
+    DNSServiceRef                       *sdRef,
+    DNSServiceFlags                     flags,
+    uint32_t                            interfaceIndex,
+    const char                          *fullname,
+    uint16_t                            rrtype,
+    uint16_t                            rrclass,
+    DNSServiceQueryRecordReply          callBack,
+    void                                *context  /* may be NULL */
+    );
+{
+    return DNSServiceQueryRecord(sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context);
+}
+
+void CDECL wine_DNSServiceReconfirmRecord
+    (
+    DNSServiceFlags                    flags,
+    uint32_t                           interfaceIndex,
+    const char                         *fullname,
+    uint16_t                           rrtype,
+    uint16_t                           rrclass,
+    uint16_t                           rdlen,
+    const void                         *rdata
+    )
+{
+    DNSServiceReconfirmRecord(flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata);
+}
+
+int CDECL wine_DNSServiceConstructFullName
+(char *fullName, const char *service, const char *regtype, const char *domain)
+{
+    return DNSServiceConstructFullName(fullName, service, regtype, domain);
+}
+
+void CDECL wine_TXTRecordCreate
+(TXTRecordRef *txtRecord, uint16_t bufferLen, void *buffer)
+{
+    TXTRecordCreate(txtRecord, bufferLen, buffer);
+}
+
+void CDECL wine_TXTRecordDeallocate(TXTRecordRef *txtRecord)
+{
+    TXTRecordDeallocate(txtRecord);
+}
+
+DNSServiceErrorType CDECL wine_TXTRecordSetValue
+(TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value)
+{
+    return TXTRecordSetValue(txtRecord, key, valueSize, value);
+}
+
+DNSServiceErrorType CDECL wine_TXTRecordRemoveValue
+(TXTRecordRef *txtRecord, const char *key)
+{
+    return TXTRecordRemoveValue(txtRecord, key);
+}
+
+uint16_t CDECL wine_TXTRecordGetLength(const TXTRecordRef *txtRecord)
+{
+    return TXTRecordGetLength(txtRecord);
+}
+
+const void * CDECL wine_TXTRecordGetBytesPtr(const TXTRecordRef *txtRecord)
+{
+    return TXTRecordGetBytesPtr(txtRecord);
+}
+
+int CDECL wine_TXTRecordContainsKey
+    (
+    uint16_t         txtLen,
+    const void       *txtRecord,
+    const char       *key
+    )
+{
+    return TXTRecordContainsKey(txtLen, txtRecord, key);
+}
+
+const void * CDECL wine_TXTRecordGetValuePtr
+    (uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen)
+{
+    return TXTRecordGetValuePtr(txtLen, txtRecord, key, valueLen);
+}
+
+uint16_t CDECL wine_TXTRecordGetCount
+    (
+    uint16_t         txtLen,
+    const void       *txtRecord
+    )
+{
+    return TXTRecordGetCount(txtLen, txtRecord);
+}
+
+DNSServiceErrorType CDECL wine_TXTRecordGetItemAtIndex
+    (
+    uint16_t         txtLen,
+    const void       *txtRecord,
+    uint16_t         index,
+    uint16_t         keyBufLen,
+    char             *key,
+    uint8_t          *valueLen,
+    const void       **value
+    )
+{
+    return TXTRecordGetItemAtIndex(txtLen, txtRecord, index, keyBufLen, key, valueLen, value);
+}
diff --git a/dlls/dnssd/dnssd.spec b/dlls/dnssd/dnssd.spec
new file mode 100644
index 0000000..589b705
--- /dev/null
+++ b/dlls/dnssd/dnssd.spec
@@ -0,0 +1,26 @@
+@ cdecl DNSServiceGetProperty(ptr ptr ptr) wine_DNSServiceGetProperty
+@ cdecl DNSServiceRefSockFD(ptr) wine_DNSServiceRefSockFD
+@ cdecl DNSServiceProcessResult(ptr) wine_DNSServiceProcessResult
+@ cdecl DNSServiceRefDeallocate(ptr) wine_DNSServiceRefDeallocate
+@ cdecl DNSServiceEnumerateDomains(ptr long long ptr ptr) wine_DNSServiceEnumerateDomains
+@ cdecl DNSServiceRegister(ptr long long str str str str short short ptr ptr ptr) wine_DNSServiceRegister
+@ cdecl DNSServiceAddRecord(ptr ptr long short short ptr long) wine_DNSServiceAddRecord
+@ cdecl DNSServiceUpdateRecord(ptr ptr long short ptr long) wine_DNSServiceUpdateRecord
+@ cdecl DNSServiceRemoveRecord(ptr ptr long) wine_DNSServiceRemoveRecord
+@ cdecl DNSServiceBrowse(ptr long long str str ptr ptr) wine_DNSServiceBrowse
+@ cdecl DNSServiceResolve(ptr long long str str str ptr ptr) wine_DNSServiceResolve
+@ cdecl DNSServiceCreateConnection(ptr) wine_DNSServiceCreateConnection
+@ cdecl DNSServiceRegisterRecord(ptr ptr long long str short short short ptr long ptr ptr) wine_DNSServiceRegisterRecord
+@ cdecl DNSServiceQueryRecord(ptr long long str short short ptr ptr) wine_DNSServiceQueryRecord
+@ cdecl DNSServiceReconfirmRecord(long long str short short short ptr) wine_DNSServiceReconfirmRecord
+@ cdecl DNSServiceConstructFullName(str str str str) wine_DNSServiceConstructFullName
+@ cdecl TXTRecordCreate(ptr short ptr) wine_TXTRecordCreate
+@ cdecl TXTRecordDeallocate(ptr) wine_TXTRecordDeallocate
+@ cdecl TXTRecordSetValue(ptr str char ptr) wine_TXTRecordSetValue
+@ cdecl TXTRecordRemoveValue(ptr str) wine_TXTRecordRemoveValue
+@ cdecl TXTRecordGetLength(ptr) wine_TXTRecordGetLength
+@ cdecl TXTRecordGetBytesPtr(ptr) wine_TXTRecordGetBytesPtr
+@ cdecl TXTRecordContainsKey(short ptr str) wine_TXTRecordContainsKey
+@ cdecl TXTRecordGetValuePtr(short ptr str char) wine_TXTRecordGetValuePtr
+@ cdecl TXTRecordGetCount(short ptr) wine_TXTRecordGetCount
+@ cdecl TXTRecordGetItemAtIndex(short ptr short short str ptr ptr) wine_TXTRecordGetItemAtIndex
