diff --git a/Doc/perl/python.perl b/Doc/perl/python.perl
index e5cfa677..4431ec7 100644
--- a/Doc/perl/python.perl
+++ b/Doc/perl/python.perl
@@ -41,15 +41,15 @@
     if ($OFF_SITE_LINK_ICON && ($url =~ /^[-a-zA-Z0-9.]+:/)) {
         # absolute URL; assume it points off-site
         my $icon = make_icon_filename($OFF_SITE_LINK_ICON);
-        return (" <img src='$icon'\n"
-                . "  border='0' class='offsitelink'"
+        return (" <img src=\"$icon\"\n"
+                . '  border="0" class="offsitelink"'
                 . ($OFF_SITE_LINK_ICON_HEIGHT
-                   ? " height='$OFF_SITE_LINK_ICON_HEIGHT'"
+                   ? " height=\"$OFF_SITE_LINK_ICON_HEIGHT\""
                    : '')
                 . ($OFF_SITE_LINK_ICON_WIDTH
-                   ? " width='$OFF_SITE_LINK_ICON_WIDTH'"
+                   ? " width=\"$OFF_SITE_LINK_ICON_WIDTH\""
                    : '')
-                . " alt='[off-site link]'\n"
+                . " alt=\"[off-site link]\"\n"
                 . "  >");
     }
     return '';
@@ -104,6 +104,7 @@
 
 $DEVELOPER_ADDRESS = '';
 $SHORT_VERSION = '';
+$RELEASE_INFO = '';
 $PACKAGE_VERSION = '';
 
 sub do_cmd_version{ $PACKAGE_VERSION . @_[0]; }
@@ -114,6 +115,12 @@
     return $_;
 }
 
+sub do_cmd_setreleaseinfo{
+    local($_) = @_;
+    $RELEASE_INFO = next_argument();
+    return $_;
+}
+
 sub do_cmd_setshortversion{
     local($_) = @_;
     $SHORT_VERSION = next_argument();
@@ -236,7 +243,7 @@
     my $module = next_argument();
     $key = $module
         unless $key;
-    return "<tt class='module'><a href='module-$key.html'>$module</a></tt>"
+    return "<tt class=\"module\"><a href=\"module-$key.html\">$module</a></tt>"
       . $_;
 }
 
@@ -244,8 +251,8 @@
     local($_) = @_;
     my $newsgroup = next_argument();
     my $icon = get_link_icon("news:$newsgroup");
-    my $stuff = "<a class='newsgroup' href='news:$newsgroup'>"
-      . "$newsgroup$icon</a>";
+    my $stuff = ("<a class=\"newsgroup\" href=\"news:$newsgroup\">"
+                 . "$newsgroup$icon</a>");
     return $stuff . $_;
 }
 
@@ -276,18 +283,16 @@
     local($_) = @_;
     my $page = next_argument();
     my $section = next_argument();
-    return "<span class='manpage'><i>$page</i>($section)</span>" . $_;
+    return "<span class=\"manpage\"><i>$page</i>($section)</span>" . $_;
 }
 
-$PEP_FORMAT = "http://python.sourceforge.net/peps/pep-XXXX.html";
-$RFC_FORMAT = "http://www.ietf.org/rfc/rfcXXXX.txt";
+$PEP_FORMAT = "http://python.sourceforge.net/peps/pep-%04d.html";
+#$RFC_FORMAT = "http://www.ietf.org/rfc/rfc%04d.txt";
+$RFC_FORMAT = "http://www.faqs.org/rfcs/rfc%d.html";
 
 sub get_rfc_url($$){
     my($rfcnum, $format) = @_;
-    $rfcnum = sprintf("%04d", $rfcnum);
-    $format = "$format";
-    $format =~ s/XXXX/$rfcnum/;
-    return $format;
+    return sprintf($format, $rfcnum);
 }
 
 sub do_cmd_pep{
@@ -323,13 +328,13 @@
     my $icon = get_link_icon($url);
     my $repl = '';
     if ($url) {
-        $repl = ("<em class='citetitle'><a\n"
-                 . " href='$url'\n"
-                 . " title='$title'\n"
+        $repl = ("<em class=\"citetitle\"><a\n"
+                 . " href=\"$url\"\n"
+                 . " title=\"$title\"\n"
                  . " >$title$icon</a></em>");
     }
     else {
-        $repl = "<em class='citetitle'\n >$title</em>";
+        $repl = "<em class=\"citetitle\"\n >$title</em>";
     }
     return $repl . $_;
 }
@@ -355,7 +360,7 @@
     if ($explanation) {
         $text = "$type in version $release:\n$explanation.";
     }
-    return "\n<span class='versionnote'>$text</span>\n" . $_;
+    return "\n<span class=\"versionnote\">$text</span>\n" . $_;
 }
 
 sub do_cmd_versionadded{
@@ -372,11 +377,11 @@
 sub do_cmd_platform{
     local($_) = @_;
     my $platform = next_argument();
-    $ModulePlatforms{"<tt class='module'>$THIS_MODULE</tt>"} = $platform;
+    $ModulePlatforms{"<tt class=\"module\">$THIS_MODULE</tt>"} = $platform;
     $platform = "Macintosh"
       if $platform eq 'Mac';
-    return "\n<p class='availability'>Availability: <span"
-      . "\n class='platform'>$platform</span>.</p>\n" . $_;
+    return "\n<p class=\"availability\">Availability: <span"
+      . "\n class=\"platform\">$platform</span>.</p>\n" . $_;
 }
 
 $IGNORE_PLATFORM_ANNOTATION = '';
@@ -445,7 +450,7 @@
 sub gen_link{
     my($node,$target) = @_;
     print INTLABELS "\$internal_labels{\"$target\"} = \"$URL/$node\";\n";
-    return "<a href='$node#$target'>";
+    return "<a href=\"$node#$target\">";
 }
 
 sub add_index_entry{
@@ -458,7 +463,7 @@
 
 sub new_link_info{
     my $name = "l2h-" . ++$globals{'max_id'};
-    my $aname = "<a name='$name'>";
+    my $aname = "<a name=\"$name\">";
     my $ahref = gen_link($CURRENT_FILE, $name);
     return ($name, $aname, $ahref);
 }
@@ -578,7 +583,7 @@
 define_indexing_macro('bifuncindex');
 sub idx_cmd_bifuncindex{
     my $str = next_argument();
-    add_index_entry("<tt class='function'>$str()</tt> (built-in function)",
+    add_index_entry("<tt class=\"function\">$str()</tt> (built-in function)",
                     @_[0]);
 }
 
@@ -620,7 +625,7 @@
     $INDEX_SUBITEM = "(in module $name)";
     print "[$name]";
     return make_mod_index_entry(
-        "<tt class='module'>$name</tt> (${word}module)", 'DEF');
+        "<tt class=\"module\">$name</tt> (${word}module)", 'DEF');
 }
 
 sub my_module_index_helper{
@@ -638,7 +643,7 @@
     my($word, $ahref) = @_;
     my $str = next_argument();
     $word = "$word " if $word;
-    $str = "<tt class='module'>$str</tt> (${word}module)";
+    $str = "<tt class=\"module\">$str</tt> (${word}module)";
     # can't use add_index_entry() since the 2nd arg to gen_index_id() is used;
     # just inline it all here
     $str = gen_index_id($str, 'REF');
@@ -712,7 +717,7 @@
     my $function_name = next_argument();
     my $arg_list = next_argument();
     my $idx = make_str_index_entry(
-        "<tt class='cfunction'>$function_name()</tt>" . get_indexsubitem());
+        "<tt class=\"cfunction\">$function_name()</tt>" . get_indexsubitem());
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;		# ???? - why both of these?
     my $result_rc = get_refcount($function_name, '');
@@ -741,7 +746,7 @@
 sub do_env_csimplemacrodesc{
     local($_) = @_;
     my $name = next_argument();
-    my $idx = make_str_index_entry("<tt class='macro'>$name</tt>");
+    my $idx = make_str_index_entry("<tt class=\"macro\">$name</tt>");
     return "<dl><dt><b>$idx</b>\n<dd>"
            . $_
            . '</dl>'
@@ -754,8 +759,8 @@
     $index_name = $type_name
       unless $index_name;
     my($name,$aname,$ahref) = new_link_info();
-    add_index_entry("<tt class='ctype'>$index_name</tt> (C type)", $ahref);
-    return "<dl><dt><b><tt class='ctype'>$aname$type_name</a></tt></b>\n<dd>"
+    add_index_entry("<tt class=\"ctype\">$index_name</tt> (C type)", $ahref);
+    return "<dl><dt><b><tt class=\"ctype\">$aname$type_name</a></tt></b>\n<dd>"
            . $_
            . '</dl>'
 }
@@ -764,7 +769,7 @@
     local($_) = @_;
     my $var_type = next_argument();
     my $var_name = next_argument();
-    my $idx = make_str_index_entry("<tt class='cdata'>$var_name</tt>"
+    my $idx = make_str_index_entry("<tt class=\"cdata\">$var_name</tt>"
 				   . get_indexsubitem());
     $idx =~ s/ \(.*\)//;
     return "<dl><dt>$var_type <b>$idx</b>\n"
@@ -783,7 +788,8 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = convert_args(next_argument());
-    my $idx = make_str_index_entry("<tt class='function'>$function_name()</tt>"
+    my $idx = make_str_index_entry("<tt class=\"function\">$function_name()"
+                                   . '</tt>'
 				   . get_indexsubitem());
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)<\/tt>/<\/tt>/;
@@ -794,7 +800,7 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = convert_args(next_argument());
-    return "<dl><dt><b><tt class='function'>$function_name</tt></b>"
+    return "<dl><dt><b><tt class=\"function\">$function_name</tt></b>"
       . "(<var>$arg_list</var>)\n"
       . '<dd>'
       . $_
@@ -805,7 +811,7 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = convert_args(next_argument());
-    my $prefix = "<tt class='function'>$function_name()</tt>";
+    my $prefix = "<tt class=\"function\">$function_name()</tt>";
     my $idx = make_str_index_entry($prefix . get_indexsubitem());
     $prefix =~ s/\(\)//;
 
@@ -816,7 +822,7 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = convert_args(next_argument());
-    my $prefix = "<tt class='function'>$function_name</tt>";
+    my $prefix = "<tt class=\"function\">$function_name</tt>";
 
     return "<dt><b>$prefix</b>(<var>$arg_list</var>)\n<dd>" . $_;
 }
@@ -833,12 +839,12 @@
     my $arg_list = next_argument();
     my $idx;
     if ($INDEX_OPCODES) {
-	$idx = make_str_index_entry("<tt class='opcode'>$opcode_name</tt>"
-                                    . " (byte code instruction)");
+	$idx = make_str_index_entry("<tt class=\"opcode\">$opcode_name</tt>"
+                                    . ' (byte code instruction)');
 	$idx =~ s/ \(byte code instruction\)//;
     }
     else {
-	$idx = "<tt class='opcode'>$opcode_name</tt>";
+	$idx = "<tt class=\"opcode\">$opcode_name</tt>";
     }
     my $stuff = "<dl><dt><b>$idx</b>";
     if ($arg_list) {
@@ -883,7 +889,7 @@
 sub do_env_excdesc{
     local($_) = @_;
     my $excname = next_argument();
-    my $idx = make_str_index_entry("<tt class='exception'>$excname</tt>");
+    my $idx = make_str_index_entry("<tt class=\"exception\">$excname</tt>");
     return "<dl><dt><b>exception $idx</b>\n<dd>" . $_ . '</dl>'
 }
 
@@ -895,7 +901,7 @@
     $THIS_CLASS = next_argument();
     my $arg_list = convert_args(next_argument());
     $idx = make_str_index_entry(
-		"<tt class='$what'>$THIS_CLASS</tt> ($what in $THIS_MODULE)" );
+	"<tt class=\"$what\">$THIS_CLASS</tt> ($what in $THIS_MODULE)" );
     $idx =~ s/ \(.*\)//;
     return ("<dl><dt><b>$what $idx</b>(<var>$arg_list</var>)\n<dd>"
             . $_
@@ -910,7 +916,7 @@
     local($_) = @_;
     $THIS_CLASS = next_argument();
     $idx = make_str_index_entry(
-		"<tt class='class'>$THIS_CLASS</tt> (class in $THIS_MODULE)" );
+	"<tt class=\"class\">$THIS_CLASS</tt> (class in $THIS_MODULE)");
     $idx =~ s/ \(.*\)//;
     return ("<dl><dt><b>class $idx</b>\n<dd>"
             . $_
@@ -933,7 +939,8 @@
     if ($class_name) {
 	$extra = " ($class_name method)";
     }
-    my $idx = make_str_index_entry("<tt class='method'>$method()</tt>$extra");
+    my $idx = make_str_index_entry(
+        "<tt class=\"method\">$method()</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dl><dt><b>$idx</b>(<var>$arg_list</var>)\n<dd>" . $_ . '</dl>';
@@ -951,7 +958,8 @@
     if ($class_name) {
 	$extra = " ($class_name method)";
     }
-    my $idx = make_str_index_entry("<tt class='method'>$method()</tt>$extra");
+    my $idx = make_str_index_entry(
+        "<tt class=\"method\">$method()</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dt><b>$idx</b>(<var>$arg_list</var>)\n<dd>"
@@ -988,7 +996,7 @@
     my $extra = '';
     $extra = " ($class attribute)"
         if ($class ne '');
-    my $idx = make_str_index_entry("<tt class='member'>$member</tt>$extra");
+    my $idx = make_str_index_entry("<tt class=\"member\">$member</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dl><dt><b>$idx</b>\n<dd>" . $_ . '</dl>';
@@ -1004,7 +1012,7 @@
     my $extra = '';
     $extra = " ($class attribute)"
         if ($class ne '');
-    my $idx = make_str_index_entry("<tt class='member'>$member</tt>$extra");
+    my $idx = make_str_index_entry("<tt class=\"member\">$member</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dt><b>$idx</b><dd>" . $_;
@@ -1014,7 +1022,7 @@
     local($_) = @_;
     next_optional_argument();
     my $member = next_argument();
-    return "<dl><dt><b><tt class='member'>$member</tt></b>\n<dd>"
+    return "<dl><dt><b><tt class=\"member\">$member</tt></b>\n<dd>"
            . $_
            . '</dl>';
 }
@@ -1024,7 +1032,7 @@
     local($_) = @_;
     next_optional_argument();
     my $member = next_argument();
-    return "<dt><b><tt class='member'>$member</tt></b><dd>" . $_;
+    return "<dt><b><tt class=\"member\">$member</tt></b><dd>" . $_;
 }
 
 @col_aligns = ('<td>', '<td>', '<td>', '<td>');
@@ -1119,7 +1127,7 @@
 	   . "\n      $th2<b>$h2</b>\&nbsp;</th>"
 	   . "\n      </tr>"
 	   . "\n    </thead>"
-	   . "\n  <tbody valign='baseline'>"
+	   . "\n  <tbody valign=\"baseline\">"
 	   . $_
 	   . "\n    </tbody>"
 	   . "\n</table>";
@@ -1168,7 +1176,7 @@
 	   . "\n      $th3<b>$h3</b>\&nbsp;</th>"
 	   . "\n      </tr>"
 	   . "\n    </thead>"
-	   . "\n  <tbody valign='baseline'>"
+	   . "\n  <tbody valign=\"baseline\">"
 	   . $_
 	   . "\n    </tbody>"
 	   . "\n</table>";
@@ -1222,7 +1230,7 @@
 	   . "\n      $th4<b>$h4</b>\&nbsp;</th>"
 	   . "\n      </tr>"
 	   . "\n    </thead>"
-	   . "\n  <tbody valign='baseline'>"
+	   . "\n  <tbody valign=\"baseline\">"
 	   . $_
 	   . "\n    </tbody>"
 	   . "\n</table>";
@@ -1285,11 +1293,13 @@
 	if ($t_authorURL) {
 	    my $href = translate_commands($t_authorURL);
 	    $href = make_named_href('author', $href,
-				    "<b><font size='+2'>$t_author</font></b>");
+				    "<b><font size=\"+2\">$t_author"
+                                    . '</font></b>');
 	    $the_title .= "\n<p>$href</p>";
 	}
         else {
-	    $the_title .= ("\n<p><b><font size='+2'>$t_author</font></b></p>");
+	    $the_title .= ("\n<p><b><font size=\"+2\">$t_author"
+                           . '</font></b></p>');
 	}
     }
     else {
@@ -1307,7 +1317,8 @@
     if ($t_date) {
 	$the_title .= "\n<p>";
 	if ($PACKAGE_VERSION) {
-	    $the_title .= "<strong>Release $PACKAGE_VERSION</strong><br>\n";
+	    $the_title .= ('<strong>Release '
+                           . "$PACKAGE_VERSION$RELEASE_INFO</strong><br>\n");
         }
 	$the_title .= "<strong>$t_date</strong></p>"
     }
@@ -1484,10 +1495,10 @@
 #
 
 sub do_env_seealso{
-    return "<div class='seealso'>\n  "
-      . "<p class='heading'><b>See Also:</b></p>\n"
-      . @_[0]
-      . '</div>';
+    return ("<div class=\"seealso\">\n  "
+            . "<p class=\"heading\"><b>See Also:</b></p>\n"
+            . @_[0]
+            . '</div>');
 }
 
 sub do_cmd_seemodule{
@@ -1503,11 +1514,11 @@
     if ($text =~ /\.$/) {
 	$period = '';
     }
-    return '<dl compact class="seemodule">'
-      . "\n    <dt>Module <b><tt class='module'><a href='module-$key.html'>"
-      . "$module</a></tt>:</b>"
-      . "\n    <dd>$text$period\n  </dl>"
-      . $_;
+    return ('<dl compact class="seemodule">'
+            . "\n    <dt>Module <b><tt class=\"module\">"
+            . "<a href=\"module-$key.html\">$module</a></tt>:</b>"
+            . "\n    <dd>$text$period\n  </dl>"
+            . $_);
 }
 
 sub strip_html_markup($){
@@ -1586,7 +1597,7 @@
 #
 
 sub do_env_definitions{
-    return "<dl class='definitions'>" . @_[0] . "</dl>\n";
+    return "<dl class=\"definitions\">" . @_[0] . "</dl>\n";
 }
 
 sub do_cmd_term{
