diff --git a/PC/dl_nt.c b/PC/dl_nt.c
new file mode 100644
index 0000000..16b9319
--- /dev/null
+++ b/PC/dl_nt.c
@@ -0,0 +1,34 @@
+/*
+
+Entry point for the Windows NT DLL.
+
+About the only reason for having this, is so initall() can automatically
+be called, removing that burden (and possible source of frustration if 
+forgotten) from the programmer.
+
+*/
+#include "windows.h"
+
+/* NT and Python share these */
+#undef INCREF
+#undef DECREF
+#include "config.h"
+#include "allobjects.h"
+
+HMODULE PyWin_DLLhModule = NULL;
+
+BOOL	WINAPI	DllMain (HANDLE hInst, 
+						ULONG ul_reason_for_call,
+						LPVOID lpReserved)
+{
+	switch (ul_reason_for_call)
+	{
+		case DLL_PROCESS_ATTACH:
+			PyWin_DLLhModule = hInst;
+			initall();
+			break;
+		case DLL_PROCESS_DETACH:
+			break;
+	}
+	return TRUE;
+}
diff --git a/PC/getpath_nt.c b/PC/getpath_nt.c
new file mode 100644
index 0000000..045fc7c
--- /dev/null
+++ b/PC/getpath_nt.c
@@ -0,0 +1,178 @@
+#include "Python.h"
+#include "osdefs.h"
+#include <windows.h>
+
+#ifndef WIN32_PATCH_LEVEL
+#define WIN32_PATCH_LEVEL "000"
+#endif
+
+/* PREFIX and EXEC_PREFIX are meaningless on Windows */
+
+#ifndef PREFIX
+#define PREFIX ""
+#endif
+
+#ifndef EXEC_PREFIX
+#define EXEC_PREFIX ""
+#endif
+
+/*
+This is a special Win32 version of getpath.
+
+* There is no default path.  There is nothing even remotely resembling
+  a standard location.  Maybe later "Program Files/Python", but not yet.
+
+* The Registry is used as the primary store for the Python path.
+
+* The environment variable PYTHONPATH _overrides_ the registry.  This should
+  allow a "standard" Python environment, but allow you to manually setup
+  another (eg, a beta version).
+
+*/
+
+BOOL PyWin_IsWin32s()
+{
+	static BOOL bIsWin32s = -1; // flag as "not yet looked"
+
+	if (bIsWin32s==-1) {
+		OSVERSIONINFO ver;
+		ver.dwOSVersionInfoSize = sizeof(ver);
+		GetVersionEx(&ver);
+		bIsWin32s = ver.dwPlatformId == VER_PLATFORM_WIN32s;
+	}
+	return bIsWin32s;
+}
+
+/* Load a PYTHONPATH value from the registry
+   Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
+
+   Returns NULL, or a pointer that should be free'd.
+*/
+static char *
+getpythonregpath(HKEY keyBase, BOOL bWin32s)
+{
+	HKEY newKey = 0;
+	DWORD nameSize = 0;
+	DWORD dataSize = 0;
+	DWORD numEntries = 0;
+	LONG rc;
+	char *retval = NULL;
+	char *dataBuf;
+	if ((rc=RegOpenKey(keyBase, "Software\\Python\\PythonCore\\" WIN32_PATCH_LEVEL "\\PythonPath", 
+	                   &newKey))==ERROR_SUCCESS) {
+		RegQueryInfoKey(newKey, NULL, NULL, NULL, NULL, NULL, NULL, 
+		                &numEntries, &nameSize, &dataSize, NULL, NULL );
+	}
+	if (numEntries==0) {
+		if (newKey)
+			CloseHandle(newKey);
+		if ((rc=RegOpenKey(keyBase, "Software\\Python\\PythonPath", 
+		                   &newKey))==ERROR_SUCCESS) {
+			RegQueryInfoKey(newKey, NULL, NULL, NULL, NULL, NULL, NULL, 
+		       	            &numEntries, &nameSize, &dataSize, NULL, NULL );
+		}
+	}
+	if (bWin32s && numEntries==0 && dataSize==0) { /* must hardcode for Win32s */
+		numEntries = 1;
+		dataSize = 511;
+	}
+	if (numEntries) {
+		dataBuf = malloc(dataSize);
+		// on NT, datasize is unicode - ie, 2xstrlen,
+		// even when ascii string returned.
+		// presumably will be 1xstrlen on 95/win3.1
+		// Additionally, win32s doesnt work as expected, so
+		// the specific strlen() is required for 3.1.
+		rc = RegQueryValue(newKey, "", dataBuf, &dataSize);
+		if (rc==ERROR_SUCCESS) {
+			if (strlen(dataBuf)==0)
+				free(dataBuf);
+			else
+				retval = dataBuf; // caller will free
+		}
+		else
+			free(dataBuf);
+	}
+
+	if (newKey)
+		CloseHandle(newKey);
+	return retval;
+}
+/* Return the initial python search path.  This is called once from
+   initsys() to initialize sys.path.  The environment variable
+   PYTHONPATH is fetched and the default path appended.  The default
+   path may be passed to the preprocessor; if not, a system-dependent
+   default is used. */
+
+char *
+Py_GetPath()
+{
+	char *path = getenv("PYTHONPATH");
+	char *defpath = PYTHONPATH;
+	static char *buf = NULL;
+	char *p;
+	int n;
+
+	if (buf != NULL) {
+		free(buf);
+		buf = NULL;
+	}
+
+	if (path == NULL) {
+		char *machinePath, *userPath;
+		int machineLen, userLen;
+		/* lookup the registry */
+		BOOL bWin32s = PyWin_IsWin32s();
+
+		if (bWin32s) { /* are we running under Windows 3.1 Win32s */
+			/* only CLASSES_ROOT is supported */
+			machinePath = getpythonregpath(HKEY_CLASSES_ROOT, TRUE); 
+			userPath = NULL;
+		} else {
+			machinePath = getpythonregpath(HKEY_LOCAL_MACHINE, FALSE);
+			userPath = getpythonregpath(HKEY_CURRENT_USER, FALSE);
+		}
+		if (machinePath==NULL && userPath==NULL) return defpath;
+		machineLen = machinePath ? strlen(machinePath) : 0;
+		userLen = userPath ? strlen(userPath) : 0;
+		n = machineLen + userLen + 1;
+		// this is a memory leak, as Python never frees it.  Only ever called once, so big deal!
+		buf = malloc(n);
+		if (buf == NULL)
+			Py_FatalError("not enough memory to copy module search path");
+		p = buf;
+		*p = '\0';
+		if (machineLen) {
+			strcpy(p, machinePath);
+			p += machineLen;
+		}
+		if (userLen) {
+			if (machineLen)
+				*p++ = DELIM;
+			strcpy(p, userPath);
+		}
+		if (userPath) free(userPath);
+		if (machinePath) free(machinePath);
+	} else {
+		
+		buf = malloc(strlen(path)+1);
+		if (buf == NULL)
+			Py_FatalError("not enough memory to copy module search path");
+		strcpy(buf, path);
+	}
+	return buf;
+}
+
+/* Similar for Makefile variables $prefix and $exec_prefix */
+
+char *
+Py_GetPrefix()
+{
+	return PREFIX;
+}
+
+char *
+Py_GetExecPrefix()
+{
+	return EXEC_PREFIX;
+}
diff --git a/PC/import_nt.c b/PC/import_nt.c
new file mode 100644
index 0000000..cac4734
--- /dev/null
+++ b/PC/import_nt.c
@@ -0,0 +1,44 @@
+/********************************************************************
+
+ importnt.c 
+
+  Win32 specific import code.
+
+*/
+
+#include "allobjects.h"
+#include "osdefs.h"
+#include <windows.h>
+#include "import.h"
+#include "importdl.h"
+
+#ifndef WIN32_PATCH_LEVEL
+#define WIN32_PATCH_LEVEL "000"
+#endif
+
+extern BOOL PyWin_IsWin32s();
+
+FILE *PyWin_FindRegisteredModule( const char *moduleName, struct filedescr **ppFileDesc, char *pathBuf, int pathLen)
+{
+	char moduleKey[128];
+	struct filedescr *fdp = NULL;
+	FILE *fp;
+	int modNameSize = pathLen;
+	HKEY keyBase = PyWin_IsWin32s() ? HKEY_CLASSES_ROOT : HKEY_LOCAL_MACHINE;
+	strcpy(moduleKey, "Software\\Python\\PythonCore\\" WIN32_PATCH_LEVEL "\\Modules\\");
+	strcat(moduleKey, moduleName);
+	if (RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize)!=ERROR_SUCCESS)
+		return NULL;
+	// use the file extension to locate the type entry.
+	for (fdp = import_filetab; fdp->suffix != NULL; fdp++) {
+		int extLen=strlen(fdp->suffix);
+		if (modNameSize>extLen && strnicmp(pathBuf+(modNameSize-extLen-1),fdp->suffix,extLen)==0)
+			break;
+	}
+	if (fdp->suffix==NULL)
+		return NULL;
+	fp = fopen(pathBuf, fdp->mode);
+	if (fp != NULL)
+		*ppFileDesc = fdp;
+	return fp;
+}
diff --git a/PC/main_nt.c b/PC/main_nt.c
new file mode 100644
index 0000000..5b3db05
--- /dev/null
+++ b/PC/main_nt.c
@@ -0,0 +1,37 @@
+/* -*- C -*- ***********************************************
+Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
+The Netherlands.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/* Python interpreter main program */
+
+#define HAVE_CONFIG_H
+#include "Python.h"
+#undef main
+
+int
+main(argc, argv)
+	int argc;
+	char **argv;
+{
+	return Py_Main(argc, argv);
+}
