diff --git a/Dockerfile b/Dockerfile
index 29aa1750b42f30fa3f3d210797b371e616bc265b..0eb7e3cdafbb734213a43917171d22f04e4c1eec 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -76,6 +76,10 @@ RUN DJANGO_SETTINGS_MODULE=${SETTINGS_MODULE} \
     DJANGO_DB_PASSWORD=fake_password \
     DJANGO_SECRET_KEY=fake_key \
     DJANGO_PRIMARY_FQDN=fake_fqdn \
+    LVALERT_USER=fake_user \
+    LVALERT_PASSWORD=fake_password \
+    LVALERT_SERVER=fake_server \
+    LVALERT_OVERSEER_PORT=2 \
     python manage.py collectstatic --noinput
 
 RUN rm -rf /app/logs/* /app/project_data/*
diff --git a/config/settings/base.py b/config/settings/base.py
index 674a006dfbbbad19ea4ca33d91ca8ad2a9129899..498600859ee0d6ae788a5cc32ee55a6019117ec3 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -86,13 +86,16 @@ SEND_PHONE_ALERTS = False
 SEND_EMAIL_ALERTS = False
 # Use LVAlert Overseer?
 USE_LVALERT_OVERSEER = True
-# LVAlert servers
-ALERT_XMPP_SERVERS = ["lvalert-test.cgca.uwm.edu"]
 # For each LVAlert server, a separate instance of LVAlert Overseer
 # must be running and listening on a distinct port.
-LVALERT_OVERSEER_PORTS = {
-    "lvalert-test.cgca.uwm.edu": 8001,
-}
+#   lvalert_server: LVAlert server which overseer sends messages to
+#   listen_port: port which that instance of overseer is listening on
+LVALERT_OVERSEER_INSTANCES = [
+    {
+        "lvalert_server": "lvalert-test.cgca.uwm.edu",
+        "listen_port": 8001,
+    },
+]
 
 # Access and authorization ----------------------------------------------------
 # Some proper names related to authorization
diff --git a/config/settings/container/base.py b/config/settings/container/base.py
index 59aeb9580eca20fb13c993100ff4531847f9b40b..0301054797f552cc70aa7d242f108f75f72342c5 100644
--- a/config/settings/container/base.py
+++ b/config/settings/container/base.py
@@ -26,6 +26,27 @@ SERVER_FQDN = os.environ.get('DJANGO_PRIMARY_FQDN', None)
 if SERVER_FQDN is None:
     raise ImproperlyConfigured('Could not get FQDN from envvars.')
 
+# Get LVAlert server
+lvalert_server = os.environ.get('LVALERT_SERVER', None)
+if lvalert_server is None:
+    raise ImproperlyConfigured('Could not get LVAlert server from envvars.')
+
+# Get LVAlert Overseer listen port
+lvalert_overseer_port = os.environ.get('LVALERT_OVERSEER_PORT', None)
+if lvalert_overseer_port is None:
+    raise ImproperlyConfigured('Could not get LVAlert overseer port '
+        'from envvars.')
+
+# Get LVAlert username
+lvalert_user = os.environ.get('LVALERT_USER', None)
+if lvalert_user is None:
+    raise ImproperlyConfigured('Could not get LVAlert username from envvars.')
+
+# Get LVAlert password
+lvalert_password = os.environ.get('LVALERT_PASSWORD', None)
+if lvalert_password is None:
+    raise ImproperlyConfigured('Could not get LVAlert password from envvars.')
+
 # Get Twilio account information from environment
 # FIXME
 TWILIO_ACCOUNT_SID = os.environ.get('DJANGO_TWILIO_ACCOUNT_SID', 'abcd')
@@ -49,6 +70,16 @@ DATABASES = {
 # Main server "hostname" - a little hacky but OK
 SERVER_HOSTNAME = SERVER_FQDN.split('.')[0]
 
+# LVAlert Overseer settings - get from environment
+LVALERT_OVERSEER_INSTANCES = [
+    {
+        "lvalert_server": lvalert_server,
+        "listen_port": int(lvalert_overseer_port),
+        "username": lvalert_user,
+        "password": lvalert_password,
+    },
+]
+
 # Use full client certificate to authenticate
 REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] = (
     'api.backends.GraceDbAuthenticatedAuthentication',
diff --git a/config/settings/container/production.py b/config/settings/container/production.py
index ccd2b765fab17ae08ec9d05116da5120fb0ed838..9c390c4fa990aee993d222b1a4befd43c54181d6 100644
--- a/config/settings/container/production.py
+++ b/config/settings/container/production.py
@@ -3,12 +3,6 @@ from .base import *
 
 DEBUG = False
 
-# LVAlert Overseer settings
-ALERT_XMPP_SERVERS = ["lvalert.cgca.uwm.edu"]
-LVALERT_OVERSEER_PORTS = {
-    "lvalert.cgca.uwm.edu": 8000,
-}
-
 # Turn on alerts
 SEND_XMPP_ALERTS = True
 SEND_PHONE_ALERTS = True
diff --git a/config/settings/vm/production.py b/config/settings/vm/production.py
index 5e61a408da9ba8390cc700d8461288b9d16a2fd0..b30c9859010c4636f12fdce1236557571102e6ac 100644
--- a/config/settings/vm/production.py
+++ b/config/settings/vm/production.py
@@ -4,10 +4,12 @@
 from .base import *
 
 # LVAlert Overseer settings
-ALERT_XMPP_SERVERS = ["lvalert.cgca.uwm.edu"]
-LVALERT_OVERSEER_PORTS = {
-    "lvalert.cgca.uwm.edu": 8000,
-}
+LVALERT_OVERSEER_INSTANCES = [
+    {
+        "lvalert_server": "lvalert.cgca.uwm.edu",
+        "listen_port": 8000,
+    },
+]
 
 # Turn on alerts
 SEND_XMPP_ALERTS = True
diff --git a/gracedb/alerts/lvalert.py b/gracedb/alerts/lvalert.py
index fb9256fd77390d0f6481bb6cbe858ea459e8bc07..71ee2a70ce8ab2229a5f78858f339b16509d9087 100644
--- a/gracedb/alerts/lvalert.py
+++ b/gracedb/alerts/lvalert.py
@@ -33,10 +33,20 @@ def send_with_lvalert_overseer(node_name, message, manager, port):
     return True if rdict.get('success', None) is not None else False
 
 
-def send_with_lvalert_client(node, message, server):
+def send_with_lvalert_client(node, message, server, username=None,
+    password=None, **kwargs):
+
+    # Set up for initializing LVAlertClient instance
+    client_settings = {
+        'server': server
+    }
+    if username is not None:
+        client_settings['username'] = username
+    if password is not None:
+        client_settings['password'] = password
 
     # Instantiate client
-    client = LVAlertClient(server=server)
+    client = LVAlertClient(**client_settings)
 
     # Client setup
     client.connect(reattempt=False)
@@ -46,6 +56,9 @@ def send_with_lvalert_client(node, message, server):
     # Send message
     client.publish(node, message)
 
+    # Disconnect
+    client.disconnect()
+
 
 # OLD
 def send_with_lvalert_send(node, message, server):
diff --git a/gracedb/alerts/xmpp.py b/gracedb/alerts/xmpp.py
index eca71885ba7592c27f2e6574825aba75796ff960..45cc29cd27cf5b2c6b30b453c7a8e4fd4c70aa24 100644
--- a/gracedb/alerts/xmpp.py
+++ b/gracedb/alerts/xmpp.py
@@ -102,8 +102,9 @@ def issue_xmpp_alerts(event_or_superevent, alert_type, serialized_object,
         manager = Manager()
 
     # Loop over LVAlert servers and nodes, issuing the alert to each
-    for server in settings.ALERT_XMPP_SERVERS:
-        port = settings.LVALERT_OVERSEER_PORTS[server]
+    for overseer_instance in settings.LVALERT_OVERSEER_INSTANCES:
+        server = overseer_instance.get('lvalert_server')
+        port = overseer_instance.get('listen_port')
         for node_name in node_names:
             
             # Calculate unique message_id and log
@@ -132,7 +133,10 @@ def issue_xmpp_alerts(event_or_superevent, alert_type, serialized_object,
             # use basic lvalert-client send
             if (not settings.USE_LVALERT_OVERSEER) or (not success):
                 try:
-                    send_with_lvalert_client(node_name, msg, server)
+                    lvalert_settings_dict = overseer_instance.copy()
+                    server = lvalert_settings_dict.pop('lvalert_server')
+                    send_with_lvalert_client(node_name, msg, server,
+                        **lvalert_settings_dict)
                 except Exception as e:
                     logger.critical(("issue_xmpp_alerts: error sending "
                         "message with lvalert client: {e}").format(e=e))
diff --git a/scripts/start_lvalert_overseer.sh b/scripts/start_lvalert_overseer.sh
new file mode 100755
index 0000000000000000000000000000000000000000..697b347487c47f86e0fd6d751dd742a82475127d
--- /dev/null
+++ b/scripts/start_lvalert_overseer.sh
@@ -0,0 +1,35 @@
+#! /usr/bin/env bash
+set -e
+
+# Ensure required environment variables are present
+if [[ -z "${LVALERT_USER}" ]]; then
+    echo "The environment variable \$LVALERT_USER must be set."
+    exit 1
+fi
+if [[ -z "${LVALERT_PASSWORD}" ]]; then
+    echo "The environment variable \$LVALERT_PASSWORD must be set."
+    exit 1
+fi
+if [[ -z "${LVALERT_SERVER}" ]]; then
+    echo "The environment variable \$LVALERT_SERVER must be set."
+    exit 1
+fi
+if [[ -z "${LVALERT_OVERSEER_PORT}" ]]; then
+    echo "The environment variable \$LVALERT_OVERSEER_PORT must be set."
+    exit 1
+fi
+
+# Get directory for logs
+LOG_DIR=$(dirname $(readlink -f "$0"))/../../logs
+
+# Run LVAlert Overseer
+lvalert_overseer --username="${LVALERT_USER}" \
+    --password="${LVALERT_PASSWORD}" \
+    --server="${LVALERT_SERVER}" \
+    --port="${LVALERT_OVERSEER_PORT}" \
+    --audit-filename="${LOG_DIR}/overseer_audit.log" \
+    --error-filename="${LOG_DIR}/overseer_error.log"
+
+#Send script to Tom with info about overseer stuff
+#fix lvalert failover to use - do we need .netrc file still? or can use env vars?
+#is the way in which the failover gets the credentials going to be any different from the way that the overseer script will?