diff --git a/dlls/dplayx/Makefile.in b/dlls/dplayx/Makefile.in
index a1dcc1d6b8499d450f58710821c1b750295a37f6..dfa01a8b17d735a058915706e2c9541730376a84 100644
--- a/dlls/dplayx/Makefile.in
+++ b/dlls/dplayx/Makefile.in
@@ -13,7 +13,8 @@ C_SRCS = dplay.c \
          dplobby.c \
          dpclassfactory.c \
          dplayx_main.c \
-         dplayx_global.c
+         dplayx_global.c \
+         name_server.c
 
 
 @MAKE_DLL_RULES@
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c
index 3dfb0c4543c0c8f55e3bd310a6481bbc2661ae33..26f0473689ba7fbf9df33e61bc8b66087e2da4b0 100644
--- a/dlls/dplayx/dplay.c
+++ b/dlls/dplayx/dplay.c
@@ -1,6 +1,6 @@
 /* Direct Play 2,3,4 Implementation
  *
- * Copyright 1998,1999 - Peter Hunnisett
+ * Copyright 1998,1999,2000 - Peter Hunnisett
  *
  * <presently under construction - contact hunnise@nortelnetworks.com>
  *
@@ -8,6 +8,7 @@
 #include <string.h>
 
 #include "winerror.h"
+#include "winbase.h"
 #include "winnt.h"
 #include "winreg.h"
 #include "dplay.h"
@@ -16,6 +17,7 @@
 
 #include "dpinit.h"
 #include "dplayx_global.h"
+#include "name_server.h"
 
 /* FIXME: This stuff shouldn't really be here. It indicates a poor architectural coupling */
 #include "dplobby.h"
@@ -54,15 +56,26 @@ typedef struct tagDirectPlayIUnknownData
   CRITICAL_SECTION  DP_lock;
 } DirectPlayIUnknownData;
 
+typedef struct _enumSessionAsyncCallbackData
+{
+  LPDPENUMSESSIONSCALLBACK2 cb;
+  LPVOID lpContext;
+  DWORD dwTimeout;
+} EnumSessionAsyncCallbackData;
+
 /* Contains all dp1 and dp2 data members */
 typedef struct tagDirectPlay2Data
 {
-  BOOL dummy;
+  BOOL   bConnectionOpen;
+
+  HANDLE hEnumSessionThread;
+
+  EnumSessionAsyncCallbackData enumSessionAsyncCallbackData;
 } DirectPlay2Data;
 
 typedef struct tagDirectPlay3Data
 {
-  BOOL connectionInitialized;
+  BOOL bConnectionInitialized;
 } DirectPlay3Data;
 
 typedef struct tagDirectPlay4Data
@@ -142,6 +155,14 @@ BOOL DP_CreateDirectPlay2( LPVOID lpDP )
     return FALSE;
   }
 
+  This->dp2->bConnectionOpen = FALSE;
+
+  This->dp2->hEnumSessionThread = INVALID_HANDLE_VALUE;
+
+  This->dp2->enumSessionAsyncCallbackData.cb        = NULL; 
+  This->dp2->enumSessionAsyncCallbackData.lpContext = NULL;
+  This->dp2->enumSessionAsyncCallbackData.dwTimeout = INFINITE;
+
   return TRUE;
 }
 
@@ -149,6 +170,12 @@ BOOL DP_DestroyDirectPlay2( LPVOID lpDP )
 {
   ICOM_THIS(IDirectPlay2AImpl,lpDP);
 
+  if( This->dp2->hEnumSessionThread != INVALID_HANDLE_VALUE )
+  {
+    TerminateThread( This->dp2->hEnumSessionThread, 0 );
+    CloseHandle( This->dp2->hEnumSessionThread );
+  }
+  
   /* Delete the contents */
   HeapFree( GetProcessHeap(), 0, This->dp2 );
 
@@ -166,7 +193,7 @@ BOOL DP_CreateDirectPlay3( LPVOID lpDP )
     return FALSE;
   }
 
-  This->dp3->connectionInitialized = FALSE;
+  This->dp3->bConnectionInitialized = FALSE;
 
   return TRUE;
 }
@@ -608,7 +635,12 @@ static HRESULT WINAPI DirectPlay2AImpl_CreatePlayer
           ( LPDIRECTPLAY2A iface, LPDPID lpidPlayer, LPDPNAME lpPlayerName, HANDLE hEvent, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
 {
   ICOM_THIS(IDirectPlay2Impl,iface);
+
   FIXME("(%p)->(%p,%p,%d,%p,0x%08lx,0x%08lx): stub\n", This, lpidPlayer, lpPlayerName, hEvent, lpData, dwDataSize, dwFlags );
+
+  /* FIXME: Should send DPMSG_CREATEPLAYERORGROUP message to everyone, local and remote, that
+            belongs to this session */
+
   return DP_OK;
 }
 
@@ -718,12 +750,113 @@ static HRESULT WINAPI DirectPlay2WImpl_EnumPlayers
   return DP_OK;
 }
 
+void DP_SendSessionRequestBroadcast()
+{
+  FIXME( ": stub\n" );
+} 
+
+void DP_InvokeEnumSessionCallbacksA( LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
+                                     LPVOID lpContext )
+{
+  FIXME( ": stub\n" );
+}
+
+static DWORD CALLBACK DP_EnumSessionsSpwanThreadA( LPVOID lpContext )
+{
+  ICOM_THIS(IDirectPlay2Impl,lpContext);
+  DWORD dwTimeout = This->dp2->enumSessionAsyncCallbackData.dwTimeout;
+
+  TRACE( "->(%p)->(0x%08lx)\n", This, dwTimeout );
+
+  /* FIXME: Don't think this is exactly right. It'll do for now */
+  for( ;; )
+  {
+    /* 2: Send the broadcast for session enumeration */
+    DP_SendSessionRequestBroadcast( NULL, 0 ); /* Should pass lpsd */
+
+    SleepEx( dwTimeout, FALSE ); 
+
+    DP_InvokeEnumSessionCallbacksA( This->dp2->enumSessionAsyncCallbackData.cb,
+                                    This->dp2->enumSessionAsyncCallbackData.lpContext );
+  }
+
+  return 0;
+}
+
 static HRESULT WINAPI DirectPlay2AImpl_EnumSessions
           ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
             LPVOID lpContext, DWORD dwFlags )
 {
   ICOM_THIS(IDirectPlay2Impl,iface);
-  FIXME("(%p)->(%p,0x%08lx,%p,%p,0x%08lx): stub\n", This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags );
+
+  TRACE("(%p)->(%p,0x%08lx,%p,%p,0x%08lx)\n", This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags );
+
+  if( dwTimeout == 0 )
+  {
+    FIXME( ": should provide a dependent dwTimeout\n" );
+    dwTimeout = 5 * 1000; /* 5 seconds */
+  }
+
+  if( dwFlags & DPENUMSESSIONS_STOPASYNC )
+  {
+    /* Does a thread exist? If so we were doing an async enum session */
+    if( This->dp2->hEnumSessionThread != INVALID_HANDLE_VALUE )
+    {
+      /* FIXME: This needs to be send an event to the thread to clean itself up */
+      TerminateThread( This->dp2->hEnumSessionThread, 0 );
+      CloseHandle( This->dp2->hEnumSessionThread );
+
+      This->dp2->hEnumSessionThread = INVALID_HANDLE_VALUE;
+
+      This->dp2->enumSessionAsyncCallbackData.cb        = NULL;
+      This->dp2->enumSessionAsyncCallbackData.lpContext = NULL;
+      This->dp2->enumSessionAsyncCallbackData.dwTimeout = INFINITE;
+
+      return DP_OK;
+    }
+  
+    /* Indicate some sort of error... */
+    WARN( "STOPASYNC attempted when no async running\n" );  
+    return DP_OK;
+  }
+
+  /* FIXME: Interface locking sucks in this method */
+
+  if( ( dwFlags & DPENUMSESSIONS_ASYNC ) )
+  {
+    DWORD dwThreadId;
+ 
+    /* See if we've already created a thread to service this interface */
+    if( This->dp2->hEnumSessionThread == INVALID_HANDLE_VALUE )
+    {
+
+      This->dp2->enumSessionAsyncCallbackData.cb        = lpEnumSessionsCallback2;
+      This->dp2->enumSessionAsyncCallbackData.lpContext = lpContext;
+      This->dp2->enumSessionAsyncCallbackData.dwTimeout = dwTimeout;
+
+      TRACE( ": creating EnumSessions thread\n" );
+    
+      This->dp2->hEnumSessionThread = CreateThread( NULL,
+                                                    0,
+                                                    DP_EnumSessionsSpwanThreadA,
+                                                    This,
+                                                    0,
+                                                    &dwThreadId );
+    }
+
+    DP_InvokeEnumSessionCallbacksA( lpEnumSessionsCallback2, lpContext );
+  }
+  else
+  {
+    /* Send the broadcast for session enumeration */
+    /* FIXME: How to handle the replies? Queue? */
+    DP_SendSessionRequestBroadcast( lpsd, dwFlags );
+
+    SleepEx( dwTimeout, FALSE ); 
+ 
+    DP_InvokeEnumSessionCallbacksA( lpEnumSessionsCallback2, lpContext );
+  }
+
   return DP_OK;
 }
 
@@ -903,7 +1036,33 @@ static HRESULT WINAPI DirectPlay2AImpl_Open
           ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpsd, DWORD dwFlags )
 {
   ICOM_THIS(IDirectPlay2Impl,iface);
+
   FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpsd, dwFlags );
+
+  if( This->dp2->bConnectionOpen )
+  {
+    TRACE( ": rejecting already open connection.\n" );
+    return DPERR_ALREADYINITIALIZED;
+  }
+
+  /* When we open we need to stop any EnumSession activity */
+  IDirectPlayX_EnumSessions( iface, NULL, 0, NULL, NULL, DPENUMSESSIONS_STOPASYNC ); 
+
+  if( dwFlags & DPOPEN_CREATE )
+  {
+    dwFlags &= ~DPOPEN_CREATE;
+
+    /* Rightoo - this computer is the host and the local computer needs to be
+       the name server so that others can join this session */
+    DPLAYX_NS_SetLocalComputerAsNameServer( lpsd );
+
+  }
+
+  if( dwFlags )
+  {
+    ERR( ": ignored dwFlags 0x%08lx\n", dwFlags );
+  }
+
   return DP_OK;
 }
 
@@ -1105,12 +1264,13 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections
     HKEY hkResult;
     LPCSTR searchSubKey    = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers";
     LPSTR guidDataSubKey   = "Guid";
-    DWORD dwIndex, sizeOfSubKeyName=50;
     char subKeyName[51]; 
+    DWORD dwIndex, sizeOfSubKeyName=50;
+    FILETIME filetime;
 
     /* Need to loop over the service providers in the registry */
     if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey,
-                         0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS )
+                         0, KEY_READ, &hkResult ) != ERROR_SUCCESS )
     {
       /* Hmmm. Does this mean that there are no service providers? */
       ERR(": no service providers?\n");
@@ -1120,8 +1280,9 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections
 
     /* Traverse all the service providers we have available */
     for( dwIndex=0;
-         RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS;
-         ++dwIndex )
+         RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, 
+                        NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS;
+         ++dwIndex, sizeOfSubKeyName=51 )
     {
 
       HKEY     hkServiceProvider;
@@ -1139,7 +1300,7 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections
       TRACE(" this time through: %s\n", subKeyName );
 
       /* Get a handle for this particular service provider */
-      if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE,
+      if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ,
                          &hkServiceProvider ) != ERROR_SUCCESS )
       {
          ERR(": what the heck is going on?\n" );
@@ -1269,7 +1430,7 @@ static HRESULT WINAPI DirectPlay3AImpl_InitializeConnection
     return DPERR_INVALIDFLAGS;
   }
 
-  if( This->dp3->connectionInitialized == TRUE )
+  if( This->dp3->bConnectionInitialized == TRUE )
   {
     return DPERR_ALREADYINITIALIZED;
   }
@@ -1303,7 +1464,7 @@ static HRESULT WINAPI DirectPlay3AImpl_InitializeConnection
 #endif
 
   /* This interface is now initialized */
-  This->dp3->connectionInitialized = TRUE;
+  This->dp3->bConnectionInitialized = TRUE;
 
   return DP_OK;
 }
@@ -1320,7 +1481,11 @@ static HRESULT WINAPI DirectPlay3AImpl_SecureOpen
           ( LPDIRECTPLAY3A iface, LPCDPSESSIONDESC2 lpsd, DWORD dwFlags, LPCDPSECURITYDESC lpSecurity, LPCDPCREDENTIALS lpCredentials )
 {
   ICOM_THIS(IDirectPlay3Impl,iface);
+
   FIXME("(%p)->(%p,0x%08lx,%p,%p): stub\n", This, lpsd, dwFlags, lpSecurity, lpCredentials );
+
+  IDirectPlayX_EnumSessions( iface, NULL, 0, NULL, NULL, DPENUMSESSIONS_STOPASYNC );
+
   return DP_OK;
 }
 
@@ -1928,6 +2093,7 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback,
   DWORD  dwIndex;
   DWORD  sizeOfSubKeyName=50;
   char   subKeyName[51]; 
+  FILETIME filetime;
 
   TRACE(": lpEnumCallback=%p lpContext=%p\n", lpEnumCallback, lpContext );
 
@@ -1938,7 +2104,7 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback,
 
   /* Need to loop over the service providers in the registry */
   if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey,
-                       0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS )
+                       0, KEY_READ, &hkResult ) != ERROR_SUCCESS )
   {
     /* Hmmm. Does this mean that there are no service providers? */ 
     ERR(": no service providers?\n");
@@ -1947,8 +2113,9 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback,
 
   /* Traverse all the service providers we have available */
   for( dwIndex=0;
-       RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS;
-       ++dwIndex )
+       RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, 
+                      NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS;
+       ++dwIndex, sizeOfSubKeyName=50 )
   {
     LPSTR    majVerDataSubKey = "dwReserved1";  
     LPSTR    minVerDataSubKey = "dwReserved2";  
@@ -1963,7 +2130,7 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback,
     TRACE(" this time through: %s\n", subKeyName );
 
     /* Get a handle for this particular service provider */
-    if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE,
+    if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ,
                          &hkServiceProvider ) != ERROR_SUCCESS )
     {
       ERR(": what the heck is going on?\n" );
diff --git a/dlls/dplayx/dplobby.c b/dlls/dplayx/dplobby.c
index 3c6b9c7c5bc12534c90bb73592fc460582e01d20..805bb0000a9690294c71109cf4600bb79f71b4fe 100644
--- a/dlls/dplayx/dplobby.c
+++ b/dlls/dplayx/dplobby.c
@@ -1,6 +1,6 @@
 /* Direct Play Lobby 2 & 3 Implementation
  *
- * Copyright 1998,1999 - Peter Hunnisett
+ * Copyright 1998,1999,2000 - Peter Hunnisett
  *
  * <presently under construction - contact hunnise@nortelnetworks.com>
  *
@@ -843,6 +843,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes
   LPCSTR searchSubKey    = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers";
   DWORD  dwIndex, sizeOfSubKeyName=50;
   char   subKeyName[51];
+  FILETIME filetime;
 
   TRACE(" (%p)->(%p,%p,%p,0x%08lx)\n", This, lpEnumAddressTypeCallback, guidSP, lpContext, dwFlags );
 
@@ -863,7 +864,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes
 
     /* Need to loop over the service providers in the registry */
     if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey,
-                         0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS )
+                         0, KEY_READ, &hkResult ) != ERROR_SUCCESS )
     {
       /* Hmmm. Does this mean that there are no service providers? */
       ERR(": no service providers?\n");
@@ -872,8 +873,9 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes
 
     /* Traverse all the service providers we have available */
     for( dwIndex=0;
-         RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS;
-         ++dwIndex )
+         RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName,
+                        NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS;
+         ++dwIndex, sizeOfSubKeyName=50 )
     {
 
       HKEY     hkServiceProvider, hkServiceProviderAt;
@@ -885,12 +887,13 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes
       DWORD    dwAtIndex;
       LPSTR    atKey = "Address Types";
       LPSTR    guidDataSubKey   = "Guid";
+      FILETIME filetime;
 
 
       TRACE(" this time through: %s\n", subKeyName );
 
       /* Get a handle for this particular service provider */
-      if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE,
+      if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ,
                          &hkServiceProvider ) != ERROR_SUCCESS )
       {
          ERR(": what the heck is going on?\n" );
@@ -918,17 +921,18 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes
       }
 
       /* Get a handle for this particular service provider */
-      if( RegOpenKeyExA( hkServiceProvider, atKey, 0, KEY_QUERY_VALUE,
+      if( RegOpenKeyExA( hkServiceProvider, atKey, 0, KEY_READ,
                          &hkServiceProviderAt ) != ERROR_SUCCESS )
       {
-        WARN(": No Address Types registry data sub key/members\n" );
+        TRACE(": No Address Types registry data sub key/members\n" );
         break;
       }
 
       /* Traverse all the address type we have available */
       for( dwAtIndex=0;
-           RegEnumKeyA( hkServiceProviderAt, dwAtIndex, atSubKey, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS;
-           ++dwAtIndex )
+           RegEnumKeyExA( hkServiceProviderAt, dwAtIndex, atSubKey, &sizeOfSubKeyName,
+                          NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS;
+           ++dwAtIndex, sizeOfSubKeyName=50 )
       {
         TRACE( "Found Address Type GUID %s\n", atSubKey );
 
@@ -997,6 +1001,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications
   LPSTR guidDataSubKey   = "Guid";
   DWORD dwIndex, sizeOfSubKeyName=50;
   char subKeyName[51];
+  FILETIME filetime;
 
   TRACE("(%p)->(%p,%p,0x%08lx)\n", This, lpEnumLocalAppCallback, lpContext, dwFlags );
 
@@ -1012,7 +1017,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications
 
   /* Need to loop over the service providers in the registry */
   if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey,
-                     0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS )
+                     0, KEY_READ, &hkResult ) != ERROR_SUCCESS )
   {
     /* Hmmm. Does this mean that there are no service providers? */
     ERR(": no service providers?\n");
@@ -1021,8 +1026,8 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications
 
   /* Traverse all registered applications */
   for( dwIndex=0;
-       RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS;
-       ++dwIndex )
+       RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS;
+       ++dwIndex, sizeOfSubKeyName=50 )
   {
 
     HKEY       hkServiceProvider;
@@ -1035,7 +1040,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications
     TRACE(" this time through: %s\n", subKeyName );
 
     /* Get a handle for this particular service provider */
-    if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE,
+    if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ,
                        &hkServiceProvider ) != ERROR_SUCCESS )
     {
        ERR(": what the heck is going on?\n" );
diff --git a/dlls/dplayx/name_server.c b/dlls/dplayx/name_server.c
new file mode 100644
index 0000000000000000000000000000000000000000..57188aab5dbe6a1fcba955eea5f9ff9c57389a7e
--- /dev/null
+++ b/dlls/dplayx/name_server.c
@@ -0,0 +1,22 @@
+/* DPLAYX.DLL name server implementation
+ *
+ * Copyright 2000 - Peter Hunnisett
+ *
+ * <presently under construction - contact hunnise@nortelnetworks.com>
+ *
+ */
+ 
+/* NOTE: Methods with the NS_ prefix are name server methods */
+
+
+#include "debugtools.h"
+#include "name_server.h"
+
+DEFAULT_DEBUG_CHANNEL(dplay);
+
+
+void DPLAYX_NS_SetLocalComputerAsNameServer( LPDPSESSIONDESC2 lpsd )
+{
+  FIXME( ": (%p) stub\n", lpsd );
+}
+
diff --git a/dlls/dplayx/name_server.h b/dlls/dplayx/name_server.h
new file mode 100644
index 0000000000000000000000000000000000000000..b0404d6f9d3ae296787b61353161f71acceffbe1
--- /dev/null
+++ b/dlls/dplayx/name_server.h
@@ -0,0 +1,9 @@
+
+#ifndef __WINE_DPLAYX_NAMESERVER
+#define __WINE_DPLAYX_NAMESERVER
+
+#include "dplay.h"
+
+void DPLAYX_NS_SetLocalComputerAsNameServer( LPDPSESSIONDESC2 lpsd );
+
+#endif /* __WINE_DPLAYX_NAMESERVER */
diff --git a/documentation/status/directplay b/documentation/status/directplay
index b3ad62ac44c93c894f9f03b61676b7cc71d954d8..13f5703222ec0b85bbf66e38cf84a97e5decb17e 100644
--- a/documentation/status/directplay
+++ b/documentation/status/directplay
@@ -1,12 +1,35 @@
 This file contains information on the implementation of the direct play
-and direct play lobby features. 
+and direct play lobby features. There's lots to do and I'm not exactly
+implementing it overnight! Please lend a hand.
 
-Most methods and APIs are not implemented at this point. Examine the code
-to see what has been implemented.  Stay tuned for some information here once
-there is more implementation (and I figure out what the heck I'm doing).
+Most methods and APIs are but stubs at this point. Examine the code
+to see what has been implemented. Use -debugmsg +dplay to get a 
+reasonably thourough description of what's going on.
 
-The files are include/dplay.h, include/dplobby.h, multimedia/dplobby.c and multimedia/dplay.c. 
-The .c files will be moved to appropriate dll directories at some later time.
+Associated header files are include/dplay.h, include/dplobby.h.
+
+Implementation of the DPLAY and DPLAYX dlls are both in the dlls/dplayx
+directory.
+
+dplay.c: Implementation of all the direct play object interfaces.
+dplobby.c: Implementation of all the direct play lobby interfaces.
+dpclassfactory.c: Implementation of the COM class factory which can create either
+                  direct play lobby or direct play lobby interfaces.
+dplayx_global.c: Implementation of all things which are associated with dplay on
+                 the computer - ie shared resources and such. Methods in this
+                 compilation unit should not call anything out side this unit.
+name_server.c: Implementation of all things which are associated with the name
+               server functionality
+dplayx_main.c: LibMain executed for loading and unloading the dll. This will make
+               the call to dplayx_global.c to request initialization and destruction
+               of any global data.
+
+Presently the architectural relationship between this files is a little shakey, but
+isn't so sufficiently bad that it needs fixing yet.
+
+Everything right now will run in the context of the calling thread, but at some
+point in the future the code will actually be far enough along to create a thread
+for session management.
 
 I think I can safely say that any application which requires direct play
 or direct play lobby will not work at this point. Priority will be to get
@@ -42,12 +65,16 @@ TODO:
   - (done) Implement a lib main for the dplayx dll (required for RunApplication, etc.)
   - Figure out how to share the global memory correctly
   - Ensure that all dll stubs are present and the ordinals are correct
-  - (started)Implementation of functionality
+  - (started) Implementation of functionality
   - Addition of DirectX 7.0 functionality for direct play (try to catch that moving train)
   - bug fixes ;)
   - Implement some WineLib test programs using sdk programs as a skeleton
-  - Change all RegEnumKey calls to RegEnumKeyEx and change enumeration pattern to allow
-    error handling.
+  - (done) Change all RegEnumKey calls to RegEnumKeyEx.
+  - Change RegEnumKeyEx enumeration pattern to allow error handling.
+  - Add in appropriate RegCloseKey calls for all the opening we're doing...
+  - Fix all the buffer sizes for registry calls. They're off by one - but in a safe direction.
+  - Find out how to call the service provider dlls - they don't have a published interface!
+  - Fix race condition on interface destruction
 
 Programs to make work:
   - lserver.exe (from sdk)