diff --git a/configs/system/pkgdb-sync-bugzilla b/configs/system/pkgdb-sync-bugzilla
new file mode 100755
index 0000000..85000f4
--- /dev/null
+++ b/configs/system/pkgdb-sync-bugzilla
@@ -0,0 +1,316 @@
+#!/usr/bin/python -tt
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2008  Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use, modify,
+# copy, or redistribute it subject to the terms and conditions of the GNU
+# General Public License v.2.  This program is distributed in the hope that it
+# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
+# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details.  You should have
+# received a copy of the GNU General Public License along with this program;
+# if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
+# Fifth Floor, Boston, MA 02110-1301, USA. Any Red Hat trademarks that are
+# incorporated in the source code or documentation are not subject to the GNU
+# General Public License and may only be used or replicated with the express
+# permission of Red Hat, Inc.
+#
+# Author(s): Toshio Kuratomi <tkuratom@redhat.com>
+#            Mike Watters <valholla@fedoraproject.org>
+#
+'''
+sync information from the packagedb into bugzilla
+
+This short script takes information about package onwership and imports it
+into bugzilla.
+'''
+__requires__ = 'TurboGears'
+import pkg_resources
+pkg_resources.require('CherryPy >= 2.0, < 3.0alpha')
+
+import sys
+import os
+import getopt
+import xmlrpclib
+import simplejson
+import urllib2
+import codecs
+from email.Message import Message
+
+import smtplib
+from fedora.client.fas2 import AccountSystem
+
+import turbogears
+from turbogears import config
+
+turbogears.update_config(configfile = "/etc/pkgdb-sync-bugzilla.cfg")
+from turbogears.database import session
+
+BZSERVER = config.get('bugzilla.url',
+        'https://bugdev.devel.redhat.com/bugzilla-cvs/xmlrpc.cgi')
+BZUSER = config.get('bugzilla.username')
+BZPASS = config.get('bugzilla.password')
+FASURL = config.get('fas.url')
+FASUSER = config.get('fas.username')
+FASPASS = config.get('fas.password')
+NOTIFYEMAIL = config.get('notify.email')
+PKGDBSERVER = config.get('pkgdbserver.url')
+DRY_RUN = config.get('debug', 'False')
+
+class DataChangedError(Exception):
+    '''Raised when data we are manipulating changes while we're modifying it.'''
+    pass
+
+class Bugzilla(object):
+
+    def __init__(self, bzServer, username, password):
+        self.userCache = {}
+        self.userCache['extras-qa@fedoraproject.org'] = {}
+        self.userCache['extras-qa@fedoraproject.org']['email'] = 'extras-qa@fedoraproject.org'
+        self.productCache = {}
+        self.bzXmlRpcServer = bzServer
+        self.username = username
+        self.password = password
+
+        self.server = xmlrpclib.Server(bzServer)
+
+        # Connect to the fedora account system
+        self.fas = AccountSystem(base_url=FASURL, username=FASUSER,
+                password=FASPASS)
+
+    def _get_bugzilla_email(self, username):
+        '''Return the bugzilla email address for a user.
+
+        First looks in a cache for a username => bugzilla email.  If not found,
+        reloads the cache from fas and tries again.
+        '''
+        try:
+            return self.userCache[username].lower()
+        except KeyError:
+            people = self.fas.people_by_id()
+            self.userCache = dict([(p['username'], p['bugzilla_email'])
+                            for p in people.values()])
+            return self.userCache[username].lower()
+
+    def add_edit_component(self, package, collection, owner, description,
+            qacontact=None, cclist=None):
+        '''Add or update a component to have the values specified.
+        '''
+        # Turn the cclist into something usable by bugzilla
+        if not cclist or 'people' not in cclist:
+            initialCCList = list()
+        else:
+            initialCCList = [self._get_bugzilla_email(cc) for cc in \
+                    cclist['people']]
+        # Add owner to the cclist so comaintainers taking over a bug don't
+        # have to do this manually
+        owner = self._get_bugzilla_email(owner)
+        if owner not in initialCCList:
+            initialCCList.append(owner)
+
+        # Lookup product
+        try:
+            product = self.productCache[collection]
+        except KeyError:
+            product = {}
+            try:
+                components = self.server.bugzilla.getProdCompDetails(collection,
+                                self.username, self.password)
+            except xmlrpclib.Fault, e:
+                # Output something useful in args
+                e.args = (e.faultCode, e.faultString)
+                raise
+            except xmlrpclib.ProtocolError, e:
+                e.args = ('ProtocolError', e.errcode, e.errmsg)
+                raise
+
+            # This changes from the form:
+            #   {'component': 'PackageName',
+            #   'initialowner': 'OwnerEmail',
+            #   'initialqacontact': 'QAContactEmail',
+            #   'description': 'One sentence summary'}
+            # to:
+            #   product['packagename'] = {'component': 'PackageName',
+            #     'initialowner': 'OwnerEmail',
+            #     'initialqacontact': 'QAContactEmail',
+            #     'description': 'One sentenct summary'}
+            # This allows us to check in a case insensitive manner for the
+            # package.
+            for record in components:
+                if not isinstance(record['component'], unicode):
+                    record['component'] = unicode(record['component'], 'utf-8')
+                try:
+                    record['description'] = unicode(record['description'], 'utf-8')
+                except TypeError:
+                    try:
+                        record['description'] = unicode(record['description'].data, 'utf-8')
+                    except:
+                        record['description'] = None
+                product[record['component'].lower()] = record
+
+            self.productCache[collection] = product
+
+        pkgKey = package.lower()
+        if pkgKey in product:
+            # edit the package information
+            data = {}
+
+            # Grab bugzilla email for things changable via xmlrpc
+            if qacontact:
+                qacontact = self._get_bugzilla_email(qacontact)
+            else:
+                qacontact = 'extras-qa@fedoraproject.org'
+
+            # Check for changes to the owner, qacontact, or description
+            if product[pkgKey]['initialowner'] != owner:
+                data['initialowner'] = owner
+
+            if product[pkgKey]['description'] != description:
+                data['description'] = description
+            if product[pkgKey]['initialqacontact'] != qacontact and (
+                    qacontact or product[pkgKey]['initialqacontact']):
+                data['initialqacontact'] = qacontact
+
+            if len(product[pkgKey]['initialcclist']) != len(initialCCList):
+                data['initialcclist'] = initialCCList
+            else:
+                for ccMember in product[pkgKey]['initialcclist']:
+                    if ccMember not in initialCCList:
+                        data['initialcclist'] = initialCCList
+                        break
+
+            if data:
+                ### FIXME: initialowner has been made mandatory for some
+                # reason.  Asking dkl why.
+                data['initialowner'] = owner
+
+                # Changes occurred.  Submit a request to change via xmlrpc
+                data['product'] = collection
+                data['component'] = product[pkgKey]['component']
+                if DRY_RUN:
+                    print '[EDITCOMP] Changing via editComponent(%s, %s, "xxxxx")' % (
+                            data, self.username)
+                    print '[EDITCOMP] Former values: %s|%s|%s|%s' % (
+                            product[pkgKey]['initialowner'],
+                            product[pkgKey]['description'],
+                            product[pkgKey]['initialqacontact'],
+                            product[pkgKey]['initialcclist'])
+
+                else:
+                    try:
+                        self.server.bugzilla.editComponent(data, self.username,
+                                self.password)
+                    except xmlrpclib.Fault, e:
+                        # Output something useful in args
+                        e.args = (data, e.faultCode, e.faultString)
+                        raise
+                    except xmlrpclib.ProtocolError, e:
+                        e.args = ('ProtocolError', e.errcode, e.errmsg)
+                        raise
+        else:
+            # Add component
+            if qacontact:
+                qacontact = self._get_bugzilla_email(qacontact)
+            else:
+                qacontact = 'extras-qa@fedoraproject.org'
+
+            data = {'product': collection,
+                'component': package,
+                'description': description,
+                'initialowner': owner,
+                'initialqacontact': qacontact}
+            if initialCCList:
+                data['initialcclist'] = initialCCList
+
+            if DRY_RUN:
+                print '[ADDCOMP] Adding new component AddComponent:(%s, %s, "xxxxx")' % (
+                        data, self.username)
+            else:
+                try:
+                    self.server.bugzilla.addComponent(data, self.username,
+                            self.password)
+                except xmlrpclib.Fault, e:
+                    # Output something useful in args
+                    e.args = (data, e.faultCode, e.faultString)
+                    raise
+
+def send_email(fromAddress, toAddress, subject, message):
+    '''Send an email if there's an error.
+    
+    This will be replaced by sending messages to a log later.
+    '''
+    msg = Message()
+    msg.add_header('To', toAddress)
+    msg.add_header('From', fromAddress)
+    msg.add_header('Subject', subject)
+    msg.set_payload(message)
+    smtp = smtplib.SMTP('bastion')
+    smtp.sendmail(fromAddress, [toAddress], msg.as_string())
+    smtp.quit()
+
+if __name__ == '__main__':
+    sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
+
+    opts, args = getopt.getopt(sys.argv[1:], '', ('usage', 'help'))
+    if len(args) > 0:
+        print '''
+Usage: bz-make-components.py
+
+Sync package information from the package database to bugzilla.
+'''
+        sys.exit(1)
+
+    # Initialize the connection to bugzilla
+    bugzilla = Bugzilla(BZSERVER, BZUSER, BZPASS)
+
+    # Non-fatal errors to alert people about
+    errors = []
+
+    # Get bugzilla information from the package database
+    ownerPage = urllib2.urlopen(PKGDBSERVER)
+    bugzillaData = simplejson.load(ownerPage)
+    ownerPage.close()
+    acls = bugzillaData['bugzillaAcls']
+    del bugzillaData
+
+    for product in acls.keys():
+        if product not in ('Fedora', 'Fedora EPEL'):
+            continue
+        for pkg in acls[product]:
+            pkgInfo = acls[product][pkg]
+            try:
+                bugzilla.add_edit_component(pkg, product,
+                        pkgInfo['owner'], pkgInfo['summary'],
+                        pkgInfo['qacontact'], pkgInfo['cclist'])
+            except ValueError, e:
+                # A username didn't have a bugzilla address
+                errors.append(str(e.args))
+            except DataChangedError, e:
+                # A Package or Collection was returned via xmlrpc but wasn't
+                # present when we tried to change it
+                errors.append(str(e.args))
+            except xmlrpclib.ProtocolError, e:
+                # Unrecoverable and likely means that nothing is going to
+                # succeed.
+                errors.append(str(e.args))
+                break
+            except xmlrpclib.Error, e:
+                # An error occurred in the xmlrpc call.  Shouldn't happen but
+                # we better see what it is
+                errors.append(str(e.args))
+
+    # Send notification of errors 
+    if errors:
+        #print '[DEBUG]', '\n'.join(errors)
+        send_email('accounts@fedoraproject.org',
+                NOTIFYEMAIL,
+                'Errors while syncing bugzilla with the PackageDB',
+'''
+The following errors were encountered while updating bugzilla with information
+from the Package Database.  Please have the problems taken care of:
+
+%s
+''' % ('\n'.join(errors),))
+
+    sys.exit(0)
diff --git a/configs/web/applications/pkgdb-prod.cfg.erb b/configs/web/applications/pkgdb-prod.cfg.erb
index 0d0ba5f..b814cd3 100644
--- a/configs/web/applications/pkgdb-prod.cfg.erb
+++ b/configs/web/applications/pkgdb-prod.cfg.erb
@@ -1,17 +1,13 @@
 [global]
-pkgdb.admin_grp = 'cvsadmin'
-pkgdb.pkger_grp = 'packager'
-
-fas.url = 'https://admin.fedoraproject.org/accounts/'
+fas.url='https://admin.fedoraproject.org/accounts/'
 fas.username = 'systems'
 fas.password = '<%= systemsUserPassword %>'
 
 bugzilla.url='https://bugzilla.redhat.com'
 #bugzilla.queryurl='https://bzprx.vip.phx.redhat.com'
-#bugzilla.queryurl='https://bugzilla.redhat.com'
+bugzilla.queryurl='https://bugzilla.redhat.com'
 bugzilla.user = '<%= bugzillaUser %>'
 bugzilla.password = '<%= bugzillaPassword %>'
-bugzilla.enable_modification = False
 
 # Koji configuration
 koji.huburl='https://koji.fedoraproject.org/kojihub'
@@ -31,32 +27,40 @@ mail.encoding = 'utf-8'
 mail.debug = False
 
 sqlalchemy.dburi="postgres://pkgdbadmin:<%= pkgdbPassword %>@db2/pkgdb"
-sqlalchemy.echo = 0
-sqlalchemy.pool_size=1
-sqlalchemy.max_overflow=1
-
 
 server.socket_port=8086
-server.socket_host="admin.fedoraproject.org"
-server.webpath="/pkgdb"
+server.thread_pool=50
+server.socket_queue_size=30
 
-server.thread_pool=1
-#server.socket_queue_size=30
-
-base_url_filter.on = True
-base_url_filter.use_x_forwarded_host = True
-base_url_filter.base_url = "https://admin.fedoraproject.org/pkgdb"
+#sqlalchemy.pool_size=5
+sqlalchemy.max_overflow=21
 
 # Enable the debug output at the end on pages.
-log_debug_info_filter.on = False
+# log_debug_info_filter.on = False
 
 server.environment="production"
+server.webpath="/pkgdb"
 autoreload.package="pkgdb"
 #session_filter.on = True
 
+sqlalchemy.echo = 0
+sqlalchemy.convert_unicode = True
+
+base_url_filter.on = True
+base_url_filter.use_x_forwarded_host = True
+base_url_filter.base_url = "https://admin.fedoraproject.org/pkgdb"
+
 # Set to True if you'd like to abort execution if a controller gets an
 # unexpected parameter. False by default
 tg.strict_parameters = True
+tg.ignore_parameters = ["_csrf_token"]
+
+log_debug_info_filter.on = False
+server.log_file = "server.log"
+server.log_to_screen = False
+
+# Make the session cookie only return to the host over an SSL link
+visit.cookie.secure = True
 
 # LOGGING
 # Logging configuration generally follows the style of the standard
@@ -64,50 +68,36 @@ tg.strict_parameters = True
 # log format messages, you need to use *() for formatting variables.
 # Deployment independent log configuration is in bodhi/config/log.cfg
 [logging]
-[[formatters]]
-# *(asctime)s can be added to these if not using apache logging
-[[[message_only]]]
-format='*(message)s'
- 
-[[[full_content]]]
-format='*(name)s *(levelname)s *(message)s'
- 
 [[handlers]]
-[[[cron_out]]]
-class='StreamHandler'
+
+[[[cron]]]
+args="('/var/log/pkgdb/cron.log', 'D', 2)"
+class='TimedRotatingFileHandler'
 level='DEBUG'
-args='(sys.stdout,)'
 formatter='full_content'
- 
+
 [[[debug_out]]]
-class='StreamHandler'
+args="('/var/log/pkgdb/server.log', 'D', 2)"
+class='TimedRotatingFileHandler'
 level='DEBUG'
-args='(sys.stdout,)'
 formatter='full_content'
- 
+
 [[[access_out]]]
-class='StreamHandler'
-level='INFO'
-args='(sys.stdout,)'
+args="('/var/log/pkgdb/access.log', 'D', 2)"
+class='TimedRotatingFileHandler'
+level='DEBUG'
 formatter='message_only'
- 
-[[[error_out]]]
-class='StreamHandler'
-level='ERROR'
-args='(sys.stdout,)'
-formatter='full_content'
- 
+
 [[loggers]]
 [[[pkgdb]]]
 level='DEBUG'
 qualname='pkgdb'
 handlers=['debug_out']
- 
+
 [[[allinfo]]]
 level='INFO'
-qualname='*'
 handlers=['debug_out']
- 
+
 [[[access]]]
 level='INFO'
 qualname='turbogears.access'
@@ -117,4 +107,4 @@ propagate=0
 [[[repo]]]
 level='DEBUG'
 qualname='pkgdb.repo'
-handlers=['cron_out']
+handlers=['cron']
diff --git a/configs/web/applications/pkgdb.conf.erb b/configs/web/applications/pkgdb.conf.erb
deleted file mode 100644
index 0cc492e..0000000
--- a/configs/web/applications/pkgdb.conf.erb
+++ /dev/null
@@ -1,17 +0,0 @@
-RewriteEngine on
-RewriteRule ^/pkgdb/static/(.*) /usr/share/fedora-packagedb/pkgdb/static/$1 [last]
-Alias /pkgdb/static /usr/share/fedora-packagedb/pkgdb/static
-
-WSGIDaemonProcess pkgdb user=apache group=apache maximum-requests=1000 display-name=pkgdb processes=2 threads=2
-WSGISocketPrefix run/wsgi
-WSGIRestrictStdout On
-WSGIRestrictSignal Off
-WSGIPythonOptimize 2
-
-WSGIScriptAlias /pkgdb /usr/sbin/pkgdb.wsgi/pkgdb
-
-<Location /pkgdb>
-    WSGIProcessGroup pkgdb
-    Order deny,allow
-    Allow from all
-</Location>
diff --git a/configs/web/applications/supervisord.conf b/configs/web/applications/supervisord.conf
index a05cf8e..b1a9792 100644
--- a/configs/web/applications/supervisord.conf
+++ b/configs/web/applications/supervisord.conf
@@ -60,6 +60,17 @@ stopsignal=TERM
 stopwaitsecs=10
 user=apache
 
+[program:packagedb]
+command=/usr/local/bin/startTurboGearsApp.sh /usr/sbin/start-pkgdb /etc/pkgdb.cfg
+priority=9
+autostart=true
+autorestart=true
+startsecs=10
+startretries=5
+stopsignal=TERM
+stopwaitsecs=10
+user=apache
+
 [program:mirrorlist_server]
 command=/usr/share/mirrormanager/mirrorlist-server/mirrorlist_server.py
 priority=1
diff --git a/manifests/services/pkgdb.pp b/manifests/services/pkgdb.pp
index 15d250c..e9ab709 100644
--- a/manifests/services/pkgdb.pp
+++ b/manifests/services/pkgdb.pp
@@ -8,26 +8,24 @@ class pkgdb-proxy inherits httpd {
 
 class pkgdb-server inherits turbogears {
 	$bugzillaUser='fedora-admin-xmlrpc@redhat.com'
-    include httpd
-    include mod_wsgi::module
+	include supervisorApp
     include fedora-packagedb-package
     include koji-package
 
-    apachetemplate { '/etc/httpd/conf.d/pkgdb.conf':
-        content => template('web/applications/pkgdb.conf.erb'),
-        require => Package['mod_wsgi']
-    }
-
 	templatefile { '/etc/pkgdb.cfg':
 		content => template('web/applications/pkgdb-prod.cfg.erb'),
-		notify => Service['httpd'],
-		require => Package['httpd'],
-		require => Package['fedora-packagedb'],
+		notify => Service['supervisord'],
 		owner => 48,
 		group => 'bzrpackagedb',
 		mode => '640'
 	}
 
+    # Note: This will move into the packagedb rpm soon.
+    script { '/usr/local/bin/pkgdb-sync-bugzilla':
+        source => 'system/pkgdb-sync-bugzilla',
+        owner => 'root',
+        group => 'root',
+    }
     templatefile { '/etc/pkgdb-sync-bugzilla.cfg':
         content => template('system/pkgdb-sync-bugzilla.cfg.erb'),
         owner => 'root',
@@ -64,9 +62,9 @@ class pkgdb-no-balance {
         hour => 1,
         ensure => present,
     }
-
+    # Note: path will change when it moves into the packagedb package.
     cron { sync-bugzilla:
-        command => "/usr/bin/pkgdb-sync-bugzilla > /dev/null 2> /dev/null",
+        command => "/usr/local/bin/pkgdb-sync-bugzilla > /dev/null 2> /dev/null",
         user => "root",
         minute => 10,
         ensure => present,
diff --git a/modules/haproxy/files/haproxy.cfg b/modules/haproxy/files/haproxy.cfg
index 98eb761..9249824 100644
--- a/modules/haproxy/files/haproxy.cfg
+++ b/modules/haproxy/files/haproxy.cfg
@@ -50,13 +50,13 @@ listen  mirror-lists 0.0.0.0:10002
  
 listen  pkgdb 0.0.0.0:10003
     balance roundrobin
-    server  app1 app1.fedora.phx.redhat.com:80 check inter 5s rise 2 fall 3
-    server  app2 app2.fedora.phx.redhat.com:80 check inter 5s rise 2 fall 3
-    server  app3 app3.fedora.phx.redhat.com:80 check inter 5s rise 2 fall 3
-    server  app4 app4.fedora.phx.redhat.com:80 check inter 5s rise 2 fall 3
-    server  app5 app5.vpn.fedoraproject.org:80 backup check inter 15s rise 2 fall 3
-    server  app6 app6.vpn.fedoraproject.org:80 backup check inter 15s rise 2 fall 3
-    server  bapp1 bapp1.vpn.fedoraproject.org:80 backup check inter 5s rise 2 fall 3
+    server  app1 app1.fedora.phx.redhat.com:8086 check inter 5s rise 2 fall 3
+    server  app2 app2.fedora.phx.redhat.com:8086 check inter 5s rise 2 fall 3
+    server  app3 app3.fedora.phx.redhat.com:8086 check inter 5s rise 2 fall 3
+    server  app4 app4.fedora.phx.redhat.com:8086 check inter 5s rise 2 fall 3
+    server  app5 app5.vpn.fedoraproject.org:8086 backup check inter 15s rise 2 fall 3
+    server  app6 app6.vpn.fedoraproject.org:8086 backup check inter 15s rise 2 fall 3
+    server  bapp1 bapp1.vpn.fedoraproject.org:8086 backup check inter 5s rise 2 fall 3
     option  httpchk GET /pkgdb
 
 listen  fas 0.0.0.0:10004
