diff --git a/contrib/README b/contrib/README
index 1ffef6df3254c252ab467242b21bafcec32a420d..32304cad218d5c0d8265b1b721b0528a7b0b0f5b 100644
--- a/contrib/README
+++ b/contrib/README
@@ -149,6 +149,10 @@ pgcrypto -
 	Cryptographic functions
 	by Marko Kreen <marko@l-t.ee>
 
+reindex - 
+	Reindexes a database
+	by Shaun Thomas <sthomas@townnews.com>
+
 pgstattuple -
 	A function returns the percentage of "dead" tuples in a table
 	by Tatsuo Ishii <t-ishii@sra.co.jp>
diff --git a/contrib/reindex/README b/contrib/reindex/README
new file mode 100644
index 0000000000000000000000000000000000000000..b2a92a39f952cd3d1c79e6cb65c96daaf4aa8d59
--- /dev/null
+++ b/contrib/reindex/README
@@ -0,0 +1,9 @@
+
+                                  reindex
+
+Indexes are known to grow over time.  Being as vacuum doesn't slow or
+clean up after this growth, and there is no command to reindex all tables
+in a database, it made sense to construct this utility to do it.
+
+Shaun Thomas <sthomas@townnews.com>
+
diff --git a/contrib/reindex/reindex b/contrib/reindex/reindex
new file mode 100644
index 0000000000000000000000000000000000000000..1eed1d0e2513db0afbc306e6bf3b647a8a3d9c7a
--- /dev/null
+++ b/contrib/reindex/reindex
@@ -0,0 +1,223 @@
+#!/bin/sh
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
+# Package : reindexdb                 Version : $Revision: 1.1 $
+# Date    : 05/08/2002                Author  : Shaun Thomas
+# Req     : psql, sh, perl, sed         Type  : Utility
+#
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
+# Function Definitions
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
+
+function usage()
+{
+  echo "$CMDNAME reindexes a PostgreSQL database."
+  echo
+  echo "Usage:"
+  echo "  $CMDNAME [options] [dbname]"
+  echo
+  echo "Options:"
+  echo "  -h, --host=HOSTNAME             Database server host"
+  echo "  -p, --port=PORT                 Database server port"
+  echo "  -U, --username=USERNAME         Username to connect as"
+  echo "  -W, --password                  Prompt for password"
+  echo "  -d, --dbname=DBNAME             Database to reindex"
+  echo "  -a, --all                       Reindex all databases"
+  echo "  -t, --table=TABLE               Reindex specific table only"
+  echo "  -i, --index=INDEX               Reindex specific index only"
+  echo "  -e, --echo                      Show the command being sent to the backend"
+  echo "  -q, --quiet                     Don't write any output"
+  echo
+  echo "Read the description of the SQL command REINDEX for details."
+  echo
+  exit 0
+}
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
+# Program Body
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
+
+CMDNAME=`basename "$0"`
+PATHNAME=`echo $0 | sed "s,$CMDNAME\$,,"`
+
+# Try valliantly to get the location of psql, since you can't ever
+# really know where it has been placed.  We'll start by trying the
+# path.  If that fails, we'll try the directory where this script
+# resides.  Then on to whereis, and finally locate.  Wish us luck.
+
+if x=`psql -V 2>/dev/null | grep psql`; then
+  PSQL='psql'
+elif [ -f ${PATHNAME}psql ]; then
+  PSQL=${PATHNAME}psql;
+elif x=`whereis -b psql 2>/dev/null | sed 's/.* //'`; then
+  PSQL=$x
+elif x=`locate -r bin/psql$ -n 1 2>/dev/null`; then
+  PSQL=$x
+else
+  echo "$CMDNAME: Could not find psql to talk to postgres installation."
+  echo "Please make sure psql is in your path, or that this script is in"
+  echo "the same directory as psql was installed."
+  exit 1
+fi
+
+# Now, go through all of our command-line options and get each operation
+# we said we'd accept in the usage listing.
+
+while [ "$#" -gt 0 ]
+do
+  # Show help.
+  case "$1" in
+    --help|-\?)
+      usage
+      exit 0
+      ;;
+
+  # All of the following are postgres options.  We can pass them on
+  # directly, without interpreting them in any way.  We don't care.
+  # Anything that allows a space, we'll get the next *two* arguments
+  # and make sure to pass those along.
+
+    --host|-h|-p|--port|-U|--username)
+      PSQLOPT="$PSQLOPT $1 $2"
+      shift
+      ;;
+    -h*|--host=*|-p*|--port=*|-U*|--username=*|-W|--password)
+      PSQLOPT="$PSQLOPT $1"
+      ;;
+
+  # From this point on, we're setting options that are required for
+  # or only valid in This script.  This includes which database(s) to
+  # reindex, which tables, or which indexes, and so on.
+
+    # Echoing.  We'll *not* use this in queries we use to get lists.
+    --echo|-e)
+      ECHOOPT="-e"
+      ;;
+
+    # Do not echo messages.  We'll direct all output to /dev/null.
+    --quiet|-q)
+      ECHOOPT="$ECHOOPT -o /dev/null"
+      quiet=1
+      ;;
+
+    # Reindex all databases, all tables, all applicable indexes.
+    --all|-a)
+      alldb=1
+      ;;
+
+    # Database to connect to, if not all of them.
+    --dbname|-d)
+      dbname="$2"
+      shift
+      ;;
+    -d*|--dbname=*)
+      dbname=`echo $1 | perl -pn -e 's/^--?d(bname=)?//'`
+      ;;
+
+    # Reindex specific Table.  Disables index reindexing.
+    --table|-t)
+      table="$2"
+      shift
+      ;;
+    -t*|--table=*)
+      table=`echo $1 | perl -pn -e 's/^--?t(able=)?//'`
+      ;;
+
+    # Reindex specific index.  Disables table reindexing.
+    --index|-i)
+      index="$2"
+      shift
+      ;;
+    -i*|--index=*)
+      index=`echo $1 | perl -pn -e 's/^--?i(ndex=)?//'`
+      ;;
+
+    # Yeah, no options?  Whine, and show usage.
+    -*)
+      echo "$CMDNAME: invalid option: $1" 1>&2
+      usage;
+      exit 1
+      ;;
+
+    # Finally, it's possible that the database name was just the last
+    # unlabeled option.  So, let's get that.
+    *)
+      dbname="$1"
+      ;;
+  esac
+
+  shift # Shift off each argument as we loop.
+
+done
+
+# Get a list of all databases we'll be using.  This first case is if we
+# were asked to do all databases.
+if [ "$alldb" ]; then
+
+  if [ "$dbname" ] || [ "$index" ] || [ "$table" ]; then
+    echo "$CMDNAME: cannot reindex all databases and a specific database," 1>&2
+    echo " table, or index at the same time." 1>&2
+    exit 1
+  fi
+
+  # Execute a command to pull back all databases the user specified can
+  # connect to.  That's the list we'll be using.  It's also why it's
+  # a good idea for this to be a super-user.
+  dbname=`$PSQL $PSQLOPT -q -t -A -d template1 -c 'SELECT datname FROM pg_database WHERE datallowconn'`
+
+# Ok, if it's not all databases, make sure at least one database is
+# specified before continuing.
+elif [ -z "$dbname" ]; then
+  echo "$CMDNAME: missing required argument: database name" 1>&2
+  usage;
+  exit 1
+fi
+
+# No.  We can't reindex a specific index and table at the same time.
+# Complain about this, and move on.
+if [ "$table" ] && [ "$index" ]; then
+  echo "$CMDNAME: cannot reindex a specific table and a specific index" 1>&2
+  echo "at the same time." 1>&2
+  exit 1
+fi
+
+# If index was set, reindex that index.
+if [ "$index" ]; then
+  $PSQL $PSQLOPT $ECHOOPT -c "REINDEX INDEX $index" -d $dbname
+
+# Ok, no index.  Is there a specific table to reindex?
+elif [ "$table" ]; then
+  $PSQL $PSQLOPT $ECHOOPT -c "REINDEX TABLE $table" -d $dbname
+
+# No specific table, no specific index, either we have a specific database,
+# or were told to do all databases.  Do it!
+else
+
+  sql="SELECT distinct tablename FROM pg_indexes WHERE tablename NOT LIKE 'pg_%'"
+  for db in $dbname; do
+
+    # Only print which database we're currently reindexing if not in
+    # quiet mode, and we're doing more than one database.
+    [ "$alldb" ] && [ -z "$quiet" ] && echo "Reindexing $db"
+
+    # Ok, reindex every table in the database.  Use the same method
+    # we used to get a list of databases, and get a list of tables in this
+    # database that we may reindex.
+    tables=`$PSQL $PSQLOPT -q -t -A -d $db -c "$sql"`
+    for tab in $tables; do
+      $PSQL $PSQLOPT $ECHOOPT -c "REINDEX TABLE $tab" -d $db
+    done
+
+  done
+
+fi
+
+# If any of the commands we've executed above failed in any way, bail
+# out with an error.
+if [ "$?" -ne 0 ]; then
+  echo "$CMDNAME: reindex $index $table $dbname failed" 1>&2
+  exit 1
+fi
+
+exit 0