diff --git a/Doc/perl/python.perl b/Doc/perl/python.perl
index e5cfa67..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{
