diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst
index 662407a6b3a35d7125c82b9f0bd04abe66eff776..549a92286d54d1f76d82144251425fbbe1670222 100644
--- a/Doc/tutorial/inputoutput.rst
+++ b/Doc/tutorial/inputoutput.rst
@@ -152,9 +152,9 @@ Positional and keyword arguments can be arbitrarily combined::
                                                           other='Georg'))
    The story of Bill, Manfred, and Georg.
 
-An optional ``':'`` and format specifier can follow the field name. This also
+An optional ``':'`` and format specifier can follow the field name. This allows
 greater control over how the value is formatted.  The following example
-truncates the Pi to three places after the decimal.
+truncates Pi to three places after the decimal.
 
    >>> import math
    >>> print('The value of PI is approximately {0:.3f}.'.format(math.pi))
@@ -208,8 +208,8 @@ operation. For example::
    The value of PI is approximately 3.142.
 
 Since :meth:`str.format` is quite new, a lot of Python code still uses the ``%``
-operator. However, because this old style of formatting will eventually removed
-from the language :meth:`str.format` should generally be used.
+operator. However, because this old style of formatting will eventually be
+removed from the language, :meth:`str.format` should generally be used.
 
 More information can be found in the :ref:`old-string-formatting` section.
 
diff --git a/Lib/inspect.py b/Lib/inspect.py
index fe3ffc7de5d62a8f1cd3f1c68d41e849677c2c5a..9a84de3af599f4c5ff98520851cb9b2b8dae659e 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -994,7 +994,10 @@ def getinnerframes(tb, context=1):
         tb = tb.tb_next
     return framelist
 
-currentframe = sys._getframe
+if hasattr(sys, '_getframe'):
+    currentframe = sys._getframe
+else:
+    currentframe = lambda _=None: None
 
 def stack(context=1):
     """Return a list of records for the stack above the caller's frame."""
diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py
index fb227fec8d0a8b4e02eac89c9e6221a7d236bac3..1d9ff4340c99c4f3639eb503c197bf9d97b93ec2 100644
--- a/Lib/webbrowser.py
+++ b/Lib/webbrowser.py
@@ -56,7 +56,7 @@ def get(using=None):
 # It is recommended one does "import webbrowser" and uses webbrowser.open(url)
 # instead of "from webbrowser import *".
 
-def open(url, new=0, autoraise=1):
+def open(url, new=0, autoraise=True):
     for name in _tryorder:
         browser = get(name)
         if browser.open(url, new, autoraise):
@@ -145,7 +145,7 @@ class BaseBrowser(object):
         self.name = name
         self.basename = name
 
-    def open(self, url, new=0, autoraise=1):
+    def open(self, url, new=0, autoraise=True):
         raise NotImplementedError
 
     def open_new(self, url):
@@ -169,7 +169,7 @@ class GenericBrowser(BaseBrowser):
             self.args = name[1:]
         self.basename = os.path.basename(self.name)
 
-    def open(self, url, new=0, autoraise=1):
+    def open(self, url, new=0, autoraise=True):
         cmdline = [self.name] + [arg.replace("%s", url)
                                  for arg in self.args]
         try:
@@ -186,7 +186,7 @@ class BackgroundBrowser(GenericBrowser):
     """Class for all browsers which are to be started in the
        background."""
 
-    def open(self, url, new=0, autoraise=1):
+    def open(self, url, new=0, autoraise=True):
         cmdline = [self.name] + [arg.replace("%s", url)
                                  for arg in self.args]
         try:
@@ -217,7 +217,7 @@ class UnixBrowser(BaseBrowser):
         raise_opt = []
         if remote and self.raise_opts:
             # use autoraise argument only for remote invocation
-            autoraise = int(bool(autoraise))
+            autoraise = int(autoraise)
             opt = self.raise_opts[autoraise]
             if opt: raise_opt = [opt]
 
@@ -257,7 +257,7 @@ class UnixBrowser(BaseBrowser):
         else:
             return not p.wait()
 
-    def open(self, url, new=0, autoraise=1):
+    def open(self, url, new=0, autoraise=True):
         if new == 0:
             action = self.remote_action
         elif new == 1:
@@ -341,7 +341,7 @@ class Konqueror(BaseBrowser):
     for more information on the Konqueror remote-control interface.
     """
 
-    def open(self, url, new=0, autoraise=1):
+    def open(self, url, new=0, autoraise=True):
         # XXX Currently I know no way to prevent KFM from opening a new win.
         if new == 2:
             action = "newTab"
@@ -429,7 +429,7 @@ class Grail(BaseBrowser):
         s.close()
         return 1
 
-    def open(self, url, new=0, autoraise=1):
+    def open(self, url, new=0, autoraise=True):
         if new:
             ok = self._remote("LOADNEW " + url)
         else:
@@ -512,7 +512,7 @@ if os.environ.get("TERM"):
 
 if sys.platform[:3] == "win":
     class WindowsDefault(BaseBrowser):
-        def open(self, url, new=0, autoraise=1):
+        def open(self, url, new=0, autoraise=True):
             try:
                 os.startfile(url)
             except WindowsError:
@@ -546,7 +546,7 @@ except ImportError:
     pass
 else:
     class InternetConfig(BaseBrowser):
-        def open(self, url, new=0, autoraise=1):
+        def open(self, url, new=0, autoraise=True):
             ic.launchurl(url)
             return True # Any way to get status?
 
@@ -567,7 +567,7 @@ if sys.platform == 'darwin':
         def __init__(self, name):
             self.name = name
 
-        def open(self, url, new=0, autoraise=1):
+        def open(self, url, new=0, autoraise=True):
             assert "'" not in url
             # hack for local urls
             if not ':' in url:
diff --git a/Misc/build.sh b/Misc/build.sh
index 5b4a38627e2bdebd9f125d5f03212f8a236e8005..409b346618f7e87b1ee977d685f32ef36bd41d62 100755
--- a/Misc/build.sh
+++ b/Misc/build.sh
@@ -4,9 +4,11 @@
 ## does this:
 ##   svn up ; ./configure ; make ; make test ; make install ; cd Doc ; make
 ##
-## Logs are kept and rsync'ed to the host.  If there are test failure(s),
+## Logs are kept and rsync'ed to the webhost.  If there are test failure(s),
 ## information about the failure(s) is mailed.
 ##
+## The user must be a member of the webmaster group locally and on webhost.
+##
 ## This script is run on the PSF's machine as user neal via crontab.
 ##
 ## Yes, this script would probably be easier in python, but then
@@ -76,7 +78,8 @@ ALWAYS_SKIP="-x $_ALWAYS_SKIP"
 # Skip these tests altogether when looking for leaks.  These tests
 # do not need to be stored above in LEAKY_TESTS too.
 # test_logging causes hangs, skip it.
-LEAKY_SKIPS="-x test_logging $_ALWAYS_SKIP"
+# KBK 21Apr09: test_httpservers causes hangs, skip for now.
+LEAKY_SKIPS="-x test_compiler test_logging test_httpservers"
 
 # Change this flag to "yes" for old releases to only update/build the docs.
 BUILD_DISABLED="no"
@@ -133,9 +136,14 @@ mail_on_failure() {
 
 ## setup
 cd $DIR
+make clobber /dev/null 2>&1
+cp -p Modules/Setup.dist Modules/Setup
+# But maybe there was no Makefile - we are only building docs. Clear build:
+rm -rf build/
 mkdir -p build
-rm -f $RESULT_FILE build/*.out
 rm -rf $INSTALL_DIR
+## get the path we are building
+repo_path=$(grep "url=" .svn/entries | sed -e s/\\W*url=// -e s/\"//g)
 
 ## create results file
 TITLE="Automated Python Build Results"
@@ -153,6 +161,8 @@ echo "  </tr><tr>" >> $RESULT_FILE
 echo "    <td>Hostname:</td><td>`uname -n`</td>" >> $RESULT_FILE
 echo "  </tr><tr>" >> $RESULT_FILE
 echo "    <td>Platform:</td><td>`uname -srmpo`</td>" >> $RESULT_FILE
+echo "  </tr><tr>" >> $RESULT_FILE
+echo "    <td>URL:</td><td>$repo_path</td>" >> $RESULT_FILE
 echo "  </tr>" >> $RESULT_FILE
 echo "</table>" >> $RESULT_FILE
 echo "<ul>" >> $RESULT_FILE
@@ -223,7 +233,7 @@ if [ $err = 0 -a "$BUILD_DISABLED" != "yes" ]; then
             start=`current_time`
             ## ensure that the reflog exists so the grep doesn't fail
             touch $REFLOG
-            $PYTHON $REGRTEST_ARGS -R 4:3:$REFLOG -u network,urlfetch $LEAKY_SKIPS >& build/$F
+            $PYTHON $REGRTEST_ARGS -R 4:3:$REFLOG -u network $LEAKY_SKIPS >& build/$F
             LEAK_PAT="($LEAKY_TESTS|sum=0)"
             NUM_FAILURES=`egrep -vc "$LEAK_PAT" $REFLOG`
             place_summary_first build/$F
@@ -259,13 +269,13 @@ start=`current_time`
 # which will definitely fail with a conflict. 
 #CONFLICTED_FILE=commontex/boilerplate.tex
 #conflict_count=`grep -c "<<<" $CONFLICTED_FILE`
-make clean
 conflict_count=0
 if [ $conflict_count != 0 ]; then
     echo "Conflict detected in $CONFLICTED_FILE.  Doc build skipped." > ../build/$F
     err=1
 else
-    make checkout update html >& ../build/$F
+    make clean > ../build/$F 2>&1
+    make checkout update html >> ../build/$F 2>&1
     err=$?
 fi
 update_status "Making doc" "$F" $start
@@ -279,6 +289,8 @@ echo "</body>" >> $RESULT_FILE
 echo "</html>" >> $RESULT_FILE
 
 ## copy results
+chgrp -R webmaster build/html
+chmod -R g+w build/html
 rsync $RSYNC_OPTS build/html/* $REMOTE_SYSTEM:$REMOTE_DIR
 cd ../build
 rsync $RSYNC_OPTS index.html *.out $REMOTE_SYSTEM:$REMOTE_DIR/results/
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 907ccf242064f6d1634b40efc7c9ae66aa960a58..03f2010ed50bd2577f591f227412a11e8f6b1646 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -718,7 +718,7 @@ PyDict_GetItem(PyObject *op, PyObject *key)
 	   running "python -Wi" for an example related to string interning.
 	   Let's just hope that no exception occurs then...  This must be
 	   _PyThreadState_Current and not PyThreadState_GET() because in debug
-	   mode, it complains if tstate is NULL. */
+	   mode, the latter complains if tstate is NULL. */
 	tstate = _PyThreadState_Current;
 	if (tstate != NULL && tstate->curexc_type != NULL) {
 		/* preserve the existing exception */
diff --git a/Python/import.c b/Python/import.c
index 0d50f5bddb72b98020498876bd382cb49af7d3bf..2ae5fa7f6fb6df10ee400046505bf01e127573c6 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1783,7 +1783,7 @@ static int init_builtin(char *); /* Forward */
    its module object WITH INCREMENTED REFERENCE COUNT */
 
 static PyObject *
-load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
+load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
 {
 	PyObject *modules;
 	PyObject *m;
@@ -1804,27 +1804,27 @@ load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
 	switch (type) {
 
 	case PY_SOURCE:
-		m = load_source_module(name, buf, fp);
+		m = load_source_module(name, pathname, fp);
 		break;
 
 	case PY_COMPILED:
-		m = load_compiled_module(name, buf, fp);
+		m = load_compiled_module(name, pathname, fp);
 		break;
 
 #ifdef HAVE_DYNAMIC_LOADING
 	case C_EXTENSION:
-		m = _PyImport_LoadDynamicModule(name, buf, fp);
+		m = _PyImport_LoadDynamicModule(name, pathname, fp);
 		break;
 #endif
 
 	case PKG_DIRECTORY:
-		m = load_package(name, buf);
+		m = load_package(name, pathname);
 		break;
 
 	case C_BUILTIN:
 	case PY_FROZEN:
-		if (buf != NULL && buf[0] != '\0')
-			name = buf;
+		if (pathname != NULL && pathname[0] != '\0')
+			name = pathname;
 		if (type == C_BUILTIN)
 			err = init_builtin(name);
 		else