diff --git a/doeditowners.cgi b/doeditowners.cgi
new file mode 100755
index 0000000000000000000000000000000000000000..b09d7298bdb2435df74a3d370126b9a197676450
--- /dev/null
+++ b/doeditowners.cgi
@@ -0,0 +1,72 @@
+#!/usr/bonsaitools/bin/perl -w
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public License
+# Version 1.0 (the "License"); you may not use this file except in
+# compliance with the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+# 
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+# License for the specific language governing rights and limitations
+# under the License.
+# 
+# The Original Code is the Bugzilla Bug Tracking System.
+# 
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are Copyright (C) 1998
+# Netscape Communications Corporation. All Rights Reserved.
+# 
+# Contributor(s): Sam Ziegler <sam@ziegler.org>
+
+use diagnostics;
+use strict;
+
+require "CGI.pl";
+
+# Shut up misguided -w warnings about "used only once":
+use vars %::COOKIE;
+
+
+confirm_login();
+
+print "Content-type: text/html\n\n";
+
+if (Param("maintainer") ne $::COOKIE{'Bugzilla_login'}) {
+    print "<H1>Sorry, you aren't the maintainer of this system.</H1>\n";
+    print "And so, you aren't allowed to edit the parameters of it.\n";
+    exit;
+}
+
+
+PutHeader("Saving new owners");
+
+SendSQL("select program, value, initialowner from components order by program, value");
+
+my @line;
+
+foreach my $key (keys(%::FORM)) {
+    $::FORM{url_decode($key)} = $::FORM{$key};
+}
+
+my @updates;
+my $curIndex = 0;
+
+while (@line = FetchSQLData()) {
+    my $curItem = "$line[0]_$line[1]";
+    if (exists $::FORM{$curItem}) {
+        $::FORM{$curItem} =~ s/\r\n/\n/;
+        if ($::FORM{$curItem} ne $line[2]) {
+            print "$line[0] : $line[1] is now owned by $::FORM{$curItem}.<BR>\n";
+            $updates[$curIndex++] = "update components set initialowner = '$::FORM{$curItem}' where program = '$line[0]' and value = '$line[1]'";
+        }
+    }
+}
+
+foreach my $update (@updates) {
+    SendSQL($update);
+}
+
+print "OK, done.<p>\n";
+print "<a href=editowners.cgi>Edit the owners some more.</a><p>\n";
+print "<a href=query.cgi>Go back to the query page.</a>\n";
diff --git a/editowners.cgi b/editowners.cgi
new file mode 100755
index 0000000000000000000000000000000000000000..1bfb6ac13606e2b63e65083b0137e91e14efd2e6
--- /dev/null
+++ b/editowners.cgi
@@ -0,0 +1,72 @@
+#!/usr/bonsaitools/bin/perl -w
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public License
+# Version 1.0 (the "License"); you may not use this file except in
+# compliance with the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+# 
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+# License for the specific language governing rights and limitations
+# under the License.
+# 
+# The Original Code is the Bugzilla Bug Tracking System.
+# 
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are Copyright (C) 1998
+# Netscape Communications Corporation. All Rights Reserved.
+# 
+# Contributor(s): Sam Ziegler <sam@ziegler.org>
+
+# Code derived from editparams.cgi
+
+use diagnostics;
+use strict;
+
+require "CGI.pl";
+
+# Shut up misguided -w warnings about "used only once":
+use vars %::COOKIE;
+
+confirm_login();
+
+print "Content-type: text/html\n\n";
+
+if (Param("maintainer") ne $::COOKIE{Bugzilla_login}) {
+    print "<H1>Sorry, you aren't the maintainer of this system.</H1>\n";
+    print "And so, you aren't allowed to edit the parameters of it.\n";
+    exit;
+}
+
+
+PutHeader("Edit Component Owners");
+
+print "This lets you edit the owners of the program components of bugzilla.\n";
+
+print "<form method=post action=doeditowners.cgi><table>\n";
+
+my $rowbreak = "<tr><td colspan=2><hr></td></tr>";
+
+SendSQL("select program, value, initialowner from components order by program, value");
+
+my @line;
+my $curProgram = "";
+
+while (@line = FetchSQLData()) {
+    if ($line[0] ne $curProgram) {
+        print $rowbreak;
+        print "<tr><th align=right valign=top>$line[0]:</th><td></td></tr>\n";
+        $curProgram = $line[0];
+    }
+    print "<tr><td valign = top>$line[1]</td><td><input size=80 ";
+    print "name=\"$line[0]_$line[1]\" value=\"$line[2]\"></td></tr>\n";
+}
+
+print "</table>\n";
+
+print "<input type=submit value=\"Submit changes\">\n";
+
+print "</form>\n";
+
+print "<p><a href=query.cgi>Skip all this, and go back to the query page</a>\n";
diff --git a/query.cgi b/query.cgi
index a8efd1fed56b9b4d0301ef8ab54c756079e896f9..5afafeaf4ec9e1b267a744b262400eb4b22f55f1 100755
--- a/query.cgi
+++ b/query.cgi
@@ -260,6 +260,7 @@ print "
 if (defined $::COOKIE{"Bugzilla_login"}) {
     if ($::COOKIE{"Bugzilla_login"} eq Param("maintainer")) {
         print "<a href=editparams.cgi>Edit Bugzilla operating parameters</a><br>\n";
+        print "<a href=editowners.cgi>Edit Bugzilla component owners</a><br>\n";
     }
     print "<a href=relogin.cgi>Log in as someone besides <b>$::COOKIE{'Bugzilla_login'}</b></a><br>\n";
 }