From b91c13e05416040b1f0d7b39c047280a88279747 Mon Sep 17 00:00:00 2001
From: Felipe Cecagno <fcecagno@gmail.com>
Date: Wed, 25 Jul 2018 15:14:55 -0300
Subject: [PATCH] update instructions and implementation of a working
 docker-compose (no recordings yet)

---
 DOCKER.md                                     |  282 ++--
 akka-bbb-apps/Dockerfile                      |    7 -
 akka-bbb-fsesl/Dockerfile                     |   36 +-
 akka-bbb-transcode/Dockerfile                 |   30 +-
 bbb-common-web/Dockerfile                     |    1 -
 bbb-fsesl-client/Dockerfile                   |   13 +
 bbb-webhooks/Dockerfile                       |    2 +-
 bbb-webhooks/application.js                   |    8 +-
 bbb-webhooks/callback_emitter.js              |    5 +-
 bbb-webhooks/config.js                        |    2 +
 .../config/custom-environment-variables.yml   |    4 -
 bbb-webhooks/config/monit-bbb-webhooks        |   12 -
 bbb-webhooks/config/upstart-bbb-webhooks.conf |   34 -
 bbb-webhooks/extra/events.js                  |    2 +-
 bbb-webhooks/package-lock.json                | 1427 ++++++++++-------
 bbb-webhooks/package.json                     |    3 +-
 bbb-webhooks/test/test.js                     |   12 +-
 bbb-webhooks/web_server.js                    |    3 +-
 bigbluebutton-html5/.dockerignore             |    1 -
 bigbluebutton-html5/Dockerfile                |   20 +-
 bigbluebutton-html5/docker-entrypoint.sh      |    5 +
 bigbluebutton-web/Dockerfile                  |   20 +-
 .../{entrypoint.sh => docker-entrypoint.sh}   |    5 +-
 .../grails-app/conf/Config.groovy             |    4 +-
 bigbluebutton-web/turn-stun-servers.xml.tmpl  |   53 +
 freeswitch.dockerfile                         |   21 -
 labs/bbb-webrtc-sfu/Dockerfile                |    6 +-
 .../config/custom-environment-variables.yml   |    2 -
 ...webrtc-sfu-run.sh => docker-entrypoint.sh} |    3 +-
 labs/docker/coturn/Dockerfile                 |   14 +
 labs/docker/coturn/turnserver.conf.tmpl       |   21 +
 labs/docker/docker-compose.yml                |  172 +-
 labs/docker/freeswitch/Dockerfile             |   21 +
 labs/docker/freeswitch/docker-entrypoint.sh   |   11 +
 labs/docker/freeswitch/event_socket_conf.xml  |   10 +
 labs/docker/kurento/Dockerfile                |    5 +-
 labs/docker/kurento/docker-entrypoint.sh      |   21 +
 labs/docker/kurento/entrypoint.sh             |   20 -
 .../docker/libreoffice/Dockerfile             |    7 +-
 labs/docker/libreoffice/docker-entrypoint.sh  |   12 +
 labs/docker/nginx/.dockerfile                 |    1 +
 labs/docker/nginx/Dockerfile                  |   17 +-
 .../nginx/{nginx.conf => nginx.conf.tmpl}     |  116 +-
 labs/docker/sbt/Dockerfile                    |    1 -
 libreoffice-run.sh                            |    7 -
 45 files changed, 1434 insertions(+), 1045 deletions(-)
 create mode 100644 bbb-fsesl-client/Dockerfile
 delete mode 100644 bbb-webhooks/config/custom-environment-variables.yml
 delete mode 100755 bbb-webhooks/config/monit-bbb-webhooks
 delete mode 100644 bbb-webhooks/config/upstart-bbb-webhooks.conf
 create mode 100755 bigbluebutton-html5/docker-entrypoint.sh
 rename bigbluebutton-web/{entrypoint.sh => docker-entrypoint.sh} (63%)
 create mode 100644 bigbluebutton-web/turn-stun-servers.xml.tmpl
 delete mode 100644 freeswitch.dockerfile
 rename labs/bbb-webrtc-sfu/{bbb-webrtc-sfu-run.sh => docker-entrypoint.sh} (62%)
 create mode 100644 labs/docker/coturn/Dockerfile
 create mode 100644 labs/docker/coturn/turnserver.conf.tmpl
 create mode 100644 labs/docker/freeswitch/Dockerfile
 create mode 100755 labs/docker/freeswitch/docker-entrypoint.sh
 create mode 100644 labs/docker/freeswitch/event_socket_conf.xml
 create mode 100755 labs/docker/kurento/docker-entrypoint.sh
 delete mode 100755 labs/docker/kurento/entrypoint.sh
 rename libreoffice.dockerfile => labs/docker/libreoffice/Dockerfile (57%)
 create mode 100755 labs/docker/libreoffice/docker-entrypoint.sh
 create mode 100644 labs/docker/nginx/.dockerfile
 rename labs/docker/nginx/{nginx.conf => nginx.conf.tmpl} (57%)
 delete mode 100755 libreoffice-run.sh

diff --git a/DOCKER.md b/DOCKER.md
index 5de8d5a538..67e33df986 100644
--- a/DOCKER.md
+++ b/DOCKER.md
@@ -1,125 +1,167 @@
-## BUILD
-```
-mconf@docker-bbb:~/bigbluebutton/bigbluebutton-html5$ docker build -t bbb-html5 .
-mconf@docker-bbb:~/bigbluebutton/labs/docker/sbt$ docker build -t 'sbt:0.13.8' .
-mconf@docker-bbb:~/bigbluebutton/bbb-common-message$ docker build -t 'bbb-common-message' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
-mconf@docker-bbb:~/bigbluebutton$ docker build -f akka-bbb-apps/Dockerfile -t bbb-apps-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
-mconf@docker-bbb:~/bigbluebutton$ docker build -f akka-bbb-transcode/Dockerfile -t bbb-transcode --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
-mconf@docker-bbb:~/bigbluebutton/bigbluebutton-web$ docker build -f Dockerfile -t bbb-web --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
-mconf@docker-bbb:~/bigbluebutton$ docker build -f freeswitch.dockerfile -t bbb-freeswitch .
-mconf@docker-bbb:~/bigbluebutton$ docker build -f akka-bbb-fsesl/Dockerfile -t bbb-fsesl-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
-mconf@docker-bbb:~/bigbluebutton$ docker build -f libreoffice.dockerfile -t libreoffice .
-mconf@docker-bbb:~/bigbluebutton/labs/bbb-webrtc-sfu$ docker build -t bbb-webrtc-sfu .
-mconf@docker-bbb:~/bigbluebutton/bbb-webhooks$ docker build -t bbb-webhooks .
-mconf@felipe-docker:~/bigbluebutton/labs/docker/kurento$ docker build -t kurento .
-docker build -t bbb-lti .
+## Build
+
+sbt is needed to build the Scala components
+```
+$ cd labs/docker/sbt/
+$ docker build -t 'sbt:0.13.8' .
+```
+
+Build libraries
+```
+$ cd bbb-common-message/
+$ docker build -t 'bbb-common-message' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
+
+$ cd bbb-common-web/
+$ docker build -t 'bbb-common-web' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
+
+$ cd bbb-fsesl-client/
+$ docker build -t 'bbb-fsesl-client' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
+```
+
+Build akka components
+```
+$ cd akka-bbb-apps/
+$ docker build -t bbb-apps-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
+
+# it's not needed, since we're setting up HTML5 only
+$ cd akka-bbb-transcode/
+$ docker build -t bbb-transcode --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
+
+$ cd akka-bbb-fsesl/
+$ docker build -t bbb-fsesl-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
+```
+
+Build bbb-web
+```
+$ cd bigbluebutton-web/
+$ docker build -t bbb-web --build-arg COMMON_VERSION=0.0.1-SNAPSHOT .
+```
+
+Build bbb-html5
+```
+$ cd bigbluebutton-html5/
+$ docker build -t bbb-html5 .
+```
+
+Build bbb-webrtc-sfu
+```
+$ cd labs/bbb-webrtc-sfu/
+$ docker build -t bbb-webrtc-sfu .
+```
+
+Build bbb-webhooks
+```
+$ cd bbb-webhooks/
+$ docker build -t bbb-webhooks .
+```
+
+Build Kurento Media Server
+```
+$ cd labs/docker/kurento/
+$ docker build -t kurento .
+```
+
+Build FreeSWITCH
+```
+$ cd labs/docker/freeswitch/
+$ docker build -t bbb-freeswitch .
+```
+
+Build nginx
+```
+$ cd labs/docker/nginx/
+$ docker build -t nginx .
+```
+
+Build nginx-dhp (used to generate the Diffie-Hellman file)
+```
+$ cd labs/docker/nginx-dhp/
+$ docker build -t nginx-dhp .
+```
+
+Build coturn
+```
+$ cd labs/docker/coturn
+$ docker build -t coturn .
+```
+
+(Optional) Build bbb-lti
+
+```
+$ cd bbb-lti/
+$ docker build -t bbb-lti .
 ```
 
 ## RUN
+
+Create a volume for the SSL certs
+
+```
+$ docker volume create docker_ssl-conf
+```
+
+Generate SSL certs
+
+```
+$ export SERVER_DOMAIN=felipe.dev.mconf.com
+$ docker run --rm -p 80:80 -v docker_ssl-conf:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain $SERVER_DOMAIN --standalone
+
+# certificate path: docker_ssl-conf/live/$SERVER_DOMAIN/fullchain.pem
+# key path: docker_ssl-conf/live/$SERVER_DOMAIN/privkey.pem
+```
+
+Generate Diffie-Hellman file
+
+```
+$ docker run --rm -v docker_ssl-conf:/data -it nginx-dhp
+
+# dh-param path: docker_ssl-conf/dhp-2048.pem
+```
+
+Create a volume for the static files
+
+```
+$ docker volume create docker_static
+$ cd bigbluebutton-config/web/
+$ docker run -d --rm --name nginx -v docker_static:/var/www/bigbluebutton-default nginx tail -f /dev/null
+$ docker cp . nginx:/var/www/bigbluebutton-default
+$ docker exec -it nginx chown -R www-data:www-data /var/www/bigbluebutton-default
+$ docker stop nginx
+
+```
+
+These are the instructions to run the containers individually
 ```
-docker run --rm --name bbb-lti -it -e SHARED_SECRET=123456 -e SERVER_DOMAIN=felipe-docker.mconf.com -e LTI_CONSUMERS=demo:welcome,consumer1:secret1 -p 8888:8080 bbb-lti
-# docker run --rm --name coturn -p 3478:3478 -p 3478:3478/udp -d kurento/coturn
-docker run --rm --name coturn --net host -d kurento/coturn
-docker run --rm --name haveged --privileged -d harbur/haveged
-docker run --rm --name mongo -d mongo:3.4
-docker run --rm --name redis -d redis
-# docker run --rm --name kurento -d kurento/kurento-media-server
-# docker run --rm --name kurento --net host -d kurento/kurento-media-server
-docker run --rm --name kurento --net host -d kurento
-docker run --rm --name bbb-html5 --link mongo --link redis -e MONGO_URL=mongodb://mongo/bbbhtml5 -e METEOR_SETTINGS="$(cat private/config/settings-production.json)" -e REDIS_HOST=redis -e ROOT_URL=http://127.0.0.1/html5client -d bbb-html5
-docker run --rm --name bbb-webhooks -p 3005:3005 --link redis -e REDIS_HOST=redis -d bbb-webhooks
-docker run --rm --name bbb-apps-akka --link redis -e REDIS_HOST=redis -d bbb-apps-akka
-docker run --rm --name bbb-transcode --link redis -e REDIS_HOST=redis -d bbb-transcode
-docker run --rm --name bbb-web --link redis -e REDIS_HOST=redis -e SERVER_URL=https://felipe-docker.mconf.com -d bbb-web
-docker run --rm --name greenlight -v $(pwd)/db/production:/usr/src/app/db/production --env-file greenlight.env -d bigbluebutton/greenlight
-docker run --rm --name bbb-freeswitch -d bbb-freeswitch
-docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=freeswitch -d bbb-fsesl-akka
-docker run --rm --name libreoffice -p 8100:8100 -d libreoffice
-# docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link kurento --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://kurento:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu
-docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://localhost:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu
-
-docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --webroot -w /var/www/bigbluebutton-default/
-docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --standalone
-
-openssl dhparam -out /root/dhp-2048.pem 2048
-
-docker run --rm --name nginx --link bbb-webhooks --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link greenlight -p 80:80 -p 443:443 -v ~/certs:/etc/letsencrypt -v $(pwd)/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/bigbluebutton-client/resources/config.xml.template:/var/www/bigbluebutton/client/conf/config.xml -d nginx
-
-docker exec -ti bbb-web cat webapps/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | grep '^securitySalt=' | cut -d'=' -f2
-docker exec -ti redis redis-cli monitor
-
-docker run --rm --name bbb-web --link redis -e -it bbb-web sh -c 'export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -DsecuritySalt=123456 -Dredis.host=redis -Dbigbluebutton.web.serverURL=https://felipe-docker.mconf.com"; sed -i "s|^securerandom\.source=.*|securerandom.source=file:/dev/./urandom|g" $JAVA_HOME/lib/security/java.security; exec catalina.sh run'
-
-
-docker run --rm -v vconfig:/data -ti tannerfe/alpine-openssl openssl dhparam -out /data/nginx/dhp-2048.pem 2048
-```
-
-## TODO
-- reboot libreoffice in case of failure
-- connect bbb-common-web to libreoffice running in a different container (decouple bbb-web from libreoffice); remove libreoffice from bbb-web image
-- configure ip on freeswitch
-v configure to connect to redis:
-  v akka-bbb-apps/src/main/resources/application.conf
-  v akka-bbb-fsesl/src/main/resources/application.conf
-  v akka-bbb-transcode/src/main/resources/application.conf
-  v bbb-webhooks/config_local.coffee.example
-  v bigbluebutton-html5/private/config/settings-production.json
-  v bigbluebutton-web/grails-app/conf/application.conf
-  v bigbluebutton-web/grails-app/conf/bigbluebutton.properties
-  v labs/bbb-webrtc-sfu/config/default.example.yml
-- set log filename on bigbluebutton-html5/private/config/settings-production.json to /dev/stdout
-- set freeswitch esl host on akka-bbb-fsesl/src/main/resources/application.conf to bbb-freeswitch
-- set server URL and secret on bigbluebutton-web/grails-app/conf/bigbluebutton.properties
-- set secret on bbb-webhooks/config_local.coffee.example
-- remove FileAppender from bigbluebutton-web/grails-app/conf/logback.xml
-- set kurentoUrl on labs/bbb-webrtc-sfu/config/default.example.yml to ws://kurento/kurento
-- recordings
-v reverse proxy using traefik (used nginx instead)
-- docker composer
-- UDP ports
-- generate dhparam
-- configure kurento public IP on bbb-webrtc-sfu
-- use config library to load the process.env automatically as it is on bbb-webrtc-sfu
-- configure custom params on the html5 client
-- configure udp ports on coturn
-- configure udp ports on kms
-- configure udp ports on freeswitch
-- explore using stunclient stun.l.google.com 19302 | grep 'Mapped address' | cut -d':' -f2 | sed 's/[[:blank:]]//g' to figure out the public IP
-- syncookies when using ufw
-
-Last minute notes:
-
-docker run --rm --name kurento --net host -d kurento
-docker run --rm --name mongo -d mongo:3.4
-docker run --rm --name redis -d redis
-docker run --rm --name coturn --net host -d kurento/coturn
-# docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link kurento --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://kurento:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu
-docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://felipe-docker.mconf.com:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu
-
-
-
-docker run --rm --name haveged --privileged -d harbur/haveged
-# docker run --rm --name kurento -d kurento/kurento-media-server
-# docker run --rm --name kurento --net host -d kurento/kurento-media-server
-docker run --rm --name kurento --net host -d kurento
-
-docker run --rm --name bbb-html5 --link mongo --link redis -e MONGO_URL=mongodb://mongo/bbbhtml5 -e METEOR_SETTINGS="$(cat private/config/settings-production.json)" -e REDIS_HOST=redis -e ROOT_URL=http://127.0.0.1/html5client -d bbb-html5
-docker run --rm --name bbb-webhooks --link redis -e REDIS_HOST=redis -d bbb-webhooks
-docker run --rm --name bbb-apps-akka --link redis -e REDIS_HOST=redis -d bbb-apps-akka
-docker run --rm --name bbb-transcode --link redis -e REDIS_HOST=redis -d bbb-transcode
-docker run --rm --name bbb-web --link redis -e REDIS_HOST=redis -e SERVER_URL=https://felipe-docker.mconf.com -d bbb-web
-docker run --rm --name greenlight -v $(pwd)/db/production:/usr/src/app/db/production --env-file greenlight.env -d bigbluebutton/greenlight
-docker run --rm --name bbb-freeswitch -d bbb-freeswitch
-docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=freeswitch -d bbb-fsesl-akka
-docker run --rm --name libreoffice -p 8100:8100 -d libreoffice
-
-docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --webroot -w /var/www/bigbluebutton-default/
-docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --standalone
-
-openssl dhparam -out /root/dhp-2048.pem 2048
-
-docker run --rm --name nginx --link bbb-webhooks --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link greenlight -p 80:80 -p 443:443 -v ~/certs:/etc/letsencrypt -v $(pwd)/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/bigbluebutton-client/resources/config.xml.template:/var/www/bigbluebutton/client/conf/config.xml -d nginx
-
-docker exec -ti bbb-web cat webapps/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | grep '^securitySalt=' | cut -d'=' -f2
-docker exec -ti redis redis-cli monitor
+$ export SERVER_DOMAIN=felipe.dev.mconf.com
+$ export EXTERNAL_IP=`dig +short $SERVER_DOMAIN`
+$ export SHARED_SECRET=`openssl rand -hex 16`
+$ export COTURN_REST_SECRET=`openssl rand -hex 16`
+$ export SCREENSHARE_EXTENSION_LINK=https://chrome.google.com/webstore/detail/mconf-screenshare/mbfngdphjegmlbfobcblikeefpidfncb
+$ export SCREENSHARE_EXTENSION_KEY=mbfngdphjegmlbfobcblikeefpidfncb
+
+$ docker run --rm --name mongo -d mongo:3.4
+
+$ docker run --rm --name redis -d redis
+
+$ docker run --rm --name bbb-html5 --link mongo --link redis -e MONGO_URL=mongodb://mongo/bbbhtml5 -e METEOR_SETTINGS_MODIFIER=".public.kurento.wsUrl = \"wss://${SERVER_DOMAIN}/bbb-webrtc-sfu\" | .public.kurento.enableVideo = true | .public.kurento.enableScreensharing = true | .public.kurento.chromeDefaultExtensionKey = \"${SCREENSHARE_EXTENSION_KEY}\" | .public.kurento.chromeDefaultExtensionLink = \"${SCREENSHARE_EXTENSION_LINK}\"" -e REDIS_HOST=redis -e ROOT_URL=http://127.0.0.1/html5client -d bbb-html5
+
+$ docker run --rm --name bbb-apps-akka --link redis -e REDIS_HOST=redis -d bbb-apps-akka
 
+$ docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=bbb-freeswitch -d bbb-fsesl-akka
+
+$ docker run --rm --name bbb-web --link redis -e REDIS_HOST=redis -e SERVER_DOMAIN=${SERVER_DOMAIN} -e SHARED_SECRET=${SHARED_SECRET} -e TURN_SECRET=${COTURN_REST_SECRET} -v bigbluebutton:/var/bigbluebutton -d bbb-web
+
+$ docker run --rm --name bbb-webrtc-sfu --link redis --link kurento -e KURENTO_IP=${EXTERNAL_IP} -e KURENTO_URL=ws://kurento:8888/kurento -e REDIS_HOST=redis -d bbb-webrtc-sfu
+
+$ docker run --rm --name coturn -v docker_ssl-conf:/etc/nginx/ssl -e SERVER_DOMAIN=${SERVER_DOMAIN} -e SSL_CERT_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem -e SSL_KEY_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem -e SSL_DHPARAM_PATH=/etc/nginx/ssl/dhp-2048.pem -e SECRET=${COTURN_REST_SECRET} -e EXTERNAL_IP=${EXTERNAL_IP} -e ENABLE_REST_API=1 -e PORT=3478 -e PORT_TLS=5349 -p 3478:3478/udp -p 3478:3478/tcp -p 5349:5349/tcp -d coturn
+
+$ docker run --rm --name bbb-freeswitch --link coturn -d bbb-freeswitch
+
+$ docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=freeswitch -d bbb-fsesl-akka
+
+$ docker run --rm --name nginx --link bbb-freeswitch --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link bbb-webhooks -p 80:80 -p 443:443 -v docker_static:/var/www/bigbluebutton-default -v docker_ssl-conf:/etc/nginx/ssl -e SERVER_DOMAIN=${SERVER_DOMAIN} -e SSL_CERT_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem -e SSL_KEY_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem -e SSL_DHPARAM_PATH=/etc/nginx/ssl/dhp-2048.pem -d nginx
+
+$ docker run --rm --name kurento -e KMS_STUN_IP=${EXTERNAL_IP} -e KMS_STUN_PORT=3478 -d kurento
+
+$ docker run --rm --name bbb-webhooks --link redis -e REDIS_HOST=redis -e SHARED_SECRET=${SHARED_SECRET} -d bbb-webhooks
+```
diff --git a/akka-bbb-apps/Dockerfile b/akka-bbb-apps/Dockerfile
index 003229be0f..e8adc296c1 100644
--- a/akka-bbb-apps/Dockerfile
+++ b/akka-bbb-apps/Dockerfile
@@ -21,11 +21,4 @@ COPY --from=builder /source/target/*.deb /root/
 
 RUN dpkg -i /root/*.deb
 
-#RUN dpkg -i /root/*.deb || true \
-# && apt-get update \
-# && apt-get -y -f install
-
 CMD ["/usr/share/bbb-apps-akka/bin/bbb-apps-akka"]
-
-# CMD ["sbt", "run"]
-
diff --git a/akka-bbb-fsesl/Dockerfile b/akka-bbb-fsesl/Dockerfile
index bf4fe7b5be..f1a7483010 100644
--- a/akka-bbb-fsesl/Dockerfile
+++ b/akka-bbb-fsesl/Dockerfile
@@ -1,31 +1,25 @@
-FROM sbt:0.13.8
+FROM bbb-fsesl-client AS builder
 
-ARG COMMON_VERSION
+ARG COMMON_VERSION=0.0.1-SNAPSHOT
 
-COPY ./bbb-common-message /bbb-common-message
-
-RUN cd /bbb-common-message \
- && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \
- && echo 'publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \
- && sbt compile \
- && sbt publishLocal
-
-COPY ./bbb-fsesl-client /bbb-fsesl-client
-
-RUN cd /bbb-fsesl-client \
- && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \
- && echo 'publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \
- && sbt compile \
- && sbt publishLocal
-
-COPY ./akka-bbb-fsesl /source
+COPY . /source
 
 RUN cd /source \
  && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \
  && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-fsesl-client[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \
  && sbt compile
 
-WORKDIR /source
+RUN apt-get update \
+ && apt-get -y install fakeroot
+
+RUN cd /source \
+ && sbt debian:packageBin
+
+# FROM ubuntu:16.04
+FROM openjdk:8-jre-slim-stretch
+
+COPY --from=builder /source/target/*.deb /root/
 
-CMD ["sbt", "run"]
+RUN dpkg -i /root/*.deb
 
+CMD ["/usr/share/bbb-fsesl-akka/bin/bbb-fsesl-akka"]
diff --git a/akka-bbb-transcode/Dockerfile b/akka-bbb-transcode/Dockerfile
index 5ed7784006..96225399a7 100644
--- a/akka-bbb-transcode/Dockerfile
+++ b/akka-bbb-transcode/Dockerfile
@@ -1,26 +1,26 @@
-FROM sbt:0.13.8
+FROM bbb-common-message AS builder
 
-ARG COMMON_VERSION
+ARG COMMON_VERSION=0.0.1-SNAPSHOT
 
-COPY ./bbb-common-message /bbb-common-message
-
-RUN cd /bbb-common-message \
- && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \
- && echo 'publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \
- && sbt compile \
- && sbt publishLocal
-
-COPY ./akka-bbb-transcode /source
+COPY . /source
 
 RUN cd /source \
- && find -name build.gradle -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^:]*\):.*|\1:$COMMON_VERSION'|g" {} \; \
  && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \
  && sbt compile
 
 RUN apt-get update \
- && apt-get -y install ffmpeg
+ && apt-get -y install fakeroot
 
-WORKDIR /source
+RUN cd /source \
+ && sbt debian:packageBin
 
-CMD ["sbt", "run"]
+# FROM ubuntu:16.04
+FROM openjdk:8-jre-slim-stretch
+
+COPY --from=builder /source/target/*.deb /root/
+
+RUN dpkg -i /root/*.deb \
+ && apt-get update \
+ && apt-get -y install ffmpeg
 
+CMD ["/usr/share/bbb-transcode-akka/bin/bbb-transcode-akka"]
diff --git a/bbb-common-web/Dockerfile b/bbb-common-web/Dockerfile
index c6b0c4b9ff..874219a3ba 100644
--- a/bbb-common-web/Dockerfile
+++ b/bbb-common-web/Dockerfile
@@ -11,4 +11,3 @@ RUN cd /bbb-common-web \
  && sbt compile \
  && sbt publish \
  && sbt publishLocal
-
diff --git a/bbb-fsesl-client/Dockerfile b/bbb-fsesl-client/Dockerfile
new file mode 100644
index 0000000000..c9fd93a841
--- /dev/null
+++ b/bbb-fsesl-client/Dockerfile
@@ -0,0 +1,13 @@
+FROM bbb-common-message
+
+ARG COMMON_VERSION
+
+COPY . /bbb-fsesl-client
+
+RUN cd /bbb-fsesl-client \
+ && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \
+ && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \
+ && echo 'publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \
+ && sbt compile \
+ && sbt publish \
+ && sbt publishLocal
diff --git a/bbb-webhooks/Dockerfile b/bbb-webhooks/Dockerfile
index 7e83f1aea3..39d1b3dc31 100644
--- a/bbb-webhooks/Dockerfile
+++ b/bbb-webhooks/Dockerfile
@@ -1,7 +1,7 @@
 FROM node:8
 
 ADD . /source
-RUN cp /source/config_local.coffee.example /source/config_local.coffee
+RUN cp /source/config_local.js.example /source/config_local.js
 
 ENV NODE_ENV production
 
diff --git a/bbb-webhooks/application.js b/bbb-webhooks/application.js
index 2817826712..12d9e74dd8 100644
--- a/bbb-webhooks/application.js
+++ b/bbb-webhooks/application.js
@@ -13,8 +13,12 @@ const async = require("async");
 module.exports = class Application {
 
   constructor() {
-    config.redis.pubSubClient = redis.createClient();
-    config.redis.client = redis.createClient()
+    let options = {
+      host : process.env.REDIS_HOST || config.redis.host,
+      port : process.env.REDIS_PORT || config.redis.port
+    };
+    config.redis.pubSubClient = redis.createClient(options);
+    config.redis.client = redis.createClient(options);
     this.webHooks = new WebHooks();
     this.webServer = new WebServer();
   }
diff --git a/bbb-webhooks/callback_emitter.js b/bbb-webhooks/callback_emitter.js
index 11416774cb..ab4cf34808 100644
--- a/bbb-webhooks/callback_emitter.js
+++ b/bbb-webhooks/callback_emitter.js
@@ -62,6 +62,7 @@ module.exports = class CallbackEmitter extends EventEmitter {
 
   _emitMessage(callback) {
     let data,requestOptions;
+    const sharedSecret = process.env.SHARED_SECRET || config.bbb.sharedSecret;
 
     if (config.bbb.auth2_0) {
       // Send data as a JSON
@@ -76,7 +77,7 @@ module.exports = class CallbackEmitter extends EventEmitter {
         method: "POST",
         form: data,
         auth: {
-          bearer: config.bbb.sharedSecret
+          bearer: sharedSecret
         }
       };
     }
@@ -89,7 +90,7 @@ module.exports = class CallbackEmitter extends EventEmitter {
       };
 
       // calculate the checksum
-      const checksum = Utils.checksum(`${this.callbackURL}${JSON.stringify(data)}${config.bbb.sharedSecret}`);
+      const checksum = Utils.checksum(`${this.callbackURL}${JSON.stringify(data)}${sharedSecret}`);
 
       // get the final callback URL, including the checksum
       const urlObj = url.parse(this.callbackURL, true);
diff --git a/bbb-webhooks/config.js b/bbb-webhooks/config.js
index 80845f1fc9..cfc7ccda07 100644
--- a/bbb-webhooks/config.js
+++ b/bbb-webhooks/config.js
@@ -51,6 +51,8 @@ config.mappings.timeout = 1000*60*60*24; // 24 hours, in ms
 
 // Redis
 config.redis = {};
+config.redis.host = '127.0.0.1';
+config.redis.port = 6379;
 config.redis.keys = {};
 config.redis.keys.hook = id => `bigbluebutton:webhooks:hook:${id}`;
 config.redis.keys.hooks = "bigbluebutton:webhooks:hooks";
diff --git a/bbb-webhooks/config/custom-environment-variables.yml b/bbb-webhooks/config/custom-environment-variables.yml
deleted file mode 100644
index eb173affbb..0000000000
--- a/bbb-webhooks/config/custom-environment-variables.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-config:
-  redis:
-    host: REDIS_HOST
-
diff --git a/bbb-webhooks/config/monit-bbb-webhooks b/bbb-webhooks/config/monit-bbb-webhooks
deleted file mode 100755
index 18e1f1e445..0000000000
--- a/bbb-webhooks/config/monit-bbb-webhooks
+++ /dev/null
@@ -1,12 +0,0 @@
-#!monit
-set logfile /var/log/monit.log
-
-check process bbb-webhooks with pidfile "/var/run/bbb-webhooks.pid"
-    start program = "/sbin/start bbb-webhooks"
-    stop program  = "/sbin/stop bbb-webhooks"
-
-    if failed port 3005 protocol HTTP
-        request /bigbluebutton/api/hooks/ping
-        with timeout 30 seconds
-        then restart
-    # if 5 restarts within 5 cycles then timeout
diff --git a/bbb-webhooks/config/upstart-bbb-webhooks.conf b/bbb-webhooks/config/upstart-bbb-webhooks.conf
deleted file mode 100644
index af2e506934..0000000000
--- a/bbb-webhooks/config/upstart-bbb-webhooks.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-# bbb-webhooks
-
-description "bbb-webhooks"
-author "BigBlueButton"
-
-start on (local-filesystems and net-device-up IFACE=eth3)
-stop on shutdown
-
-# respawn # we're using monit for it
-
-env USER=firstuser
-env APP=app.js
-env CMD_OPTS=""
-env SRC_DIR="/usr/local/bigbluebutton/bbb-webhooks"
-env LOGFILE="/var/log/bbb-webhooks.log"
-env NODE=/usr/local/bin/node
-env PIDFILE="/var/run/bbb-webhooks.pid"
-env NODE_ENV="production"
-
-script
-  cd $SRC_DIR
-  echo $$ > $PIDFILE
-  exec sudo -u $USER NODE_ENV=$NODE_ENV $NODE $APP $CMD_OPTS 1>> $LOGFILE 2>> $LOGFILE
-end script
-
-pre-start script
-    # Date format same as (new Date()).toISOString() for consistency
-    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> $LOGFILE
-end script
-
-pre-stop script
-    rm $PIDFILE
-    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> $LOGFILE
-end script
diff --git a/bbb-webhooks/extra/events.js b/bbb-webhooks/extra/events.js
index 9abaf828d5..c527879ac9 100644
--- a/bbb-webhooks/extra/events.js
+++ b/bbb-webhooks/extra/events.js
@@ -6,7 +6,7 @@ const redis = require("redis");
 const config = require('../config.js');
 var target_meeting = null;
 var events_printed = [];
-var subscriber = redis.createClient();
+var subscriber = redis.createClient(process.env.REDIS_PORT || config.redis.port, process.env.REDIS_HOST || config.redis.host);
 
 subscriber.on("psubscribe", function(channel, count) {
   console.log("subscribed to " + channel);
diff --git a/bbb-webhooks/package-lock.json b/bbb-webhooks/package-lock.json
index 756667bad9..d219d53434 100644
--- a/bbb-webhooks/package-lock.json
+++ b/bbb-webhooks/package-lock.json
@@ -4,42 +4,14 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
-    "accepts": {
-      "version": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz",
-      "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=",
-      "requires": {
-        "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz",
-        "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz"
-      },
-      "dependencies": {
-        "mime-db": {
-          "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz",
-          "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc="
-        },
-        "mime-types": {
-          "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz",
-          "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=",
-          "requires": {
-            "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz"
-          }
-        }
-      }
-    },
-    "asn1": {
-      "version": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz",
-      "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc="
-    },
-    "assert-plus": {
-      "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
-      "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA="
-    },
     "assertion-error": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
       "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw="
     },
     "async": {
-      "version": "https://registry.npmjs.org/async/-/async-0.9.0.tgz",
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz",
       "integrity": "sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc="
     },
     "asynckit": {
@@ -48,44 +20,152 @@
       "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
       "dev": true
     },
-    "aws-sign2": {
-      "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz",
-      "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM="
-    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
       "dev": true
     },
-    "bl": {
-      "version": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz",
-      "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=",
-      "requires": {
-        "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz"
-      }
-    },
     "body-parser": {
-      "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
-      "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
-      "requires": {
-        "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
-        "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
-        "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
-        "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
-        "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
-        "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
-        "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-        "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
-        "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
-        "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz"
-      }
-    },
-    "boom": {
-      "version": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz",
-      "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=",
+      "version": "1.18.3",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
       "requires": {
-        "hoek": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz"
+        "bytes": "3.0.0",
+        "content-type": "1.0.4",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.23",
+        "on-finished": "2.3.0",
+        "qs": "6.5.2",
+        "raw-body": "2.3.3",
+        "type-is": "1.6.16"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+        },
+        "content-type": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+          "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
+        "ee-first": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+          "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "requires": {
+            "depd": "1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": "1.5.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.23",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+          "requires": {
+            "safer-buffer": "2.1.2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        },
+        "media-typer": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+          "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+        },
+        "mime-db": {
+          "version": "1.35.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
+          "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg=="
+        },
+        "mime-types": {
+          "version": "2.1.19",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
+          "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
+          "requires": {
+            "mime-db": "1.35.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "on-finished": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+          "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+          "requires": {
+            "ee-first": "1.1.1"
+          }
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+        },
+        "raw-body": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+          "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+          "requires": {
+            "bytes": "3.0.0",
+            "http-errors": "1.6.3",
+            "iconv-lite": "0.4.23",
+            "unpipe": "1.0.0"
+          }
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+        },
+        "type-is": {
+          "version": "1.6.16",
+          "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+          "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+          "requires": {
+            "media-typer": "0.3.0",
+            "mime-types": "2.1.19"
+          }
+        },
+        "unpipe": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+          "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+        }
       }
     },
     "brace-expansion": {
@@ -104,45 +184,27 @@
       "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
       "dev": true
     },
-    "bytes": {
-      "version": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
-      "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
-    },
-    "caseless": {
-      "version": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz",
-      "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ="
-    },
-    "chai": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
-      "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
-      "requires": {
-        "assertion-error": "1.0.2",
-        "deep-eql": "0.1.3",
-        "type-detect": "1.0.0"
-      }
-    },
-    "charenc": {
-      "version": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
-      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
-    },
-    "coffee-script": {
-      "version": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.8.0.tgz",
-      "integrity": "sha1-nJ8dK0pSoADe0Vtll5FwNkgmPB0=",
+    "build": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/build/-/build-0.1.4.tgz",
+      "integrity": "sha1-cH/gJv/O3crL/c3zVur9pk8VEEY=",
       "requires": {
-        "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"
+        "cssmin": "0.3.2",
+        "jsmin": "1.0.1",
+        "jxLoader": "0.1.1",
+        "moo-server": "1.3.0",
+        "promised-io": "0.3.5",
+        "timespan": "2.3.0",
+        "uglify-js": "1.3.5",
+        "walker": "1.0.7",
+        "winston": "0.8.3",
+        "wrench": "1.3.9"
       }
     },
-    "colors": {
-      "version": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
-      "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w="
-    },
-    "combined-stream": {
-      "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
-      "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=",
-      "requires": {
-        "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
-      }
+    "check-error": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII="
     },
     "commander": {
       "version": "2.9.0",
@@ -165,22 +227,6 @@
       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
       "dev": true
     },
-    "content-disposition": {
-      "version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz",
-      "integrity": "sha1-QoT+auBjCHRjnkToCkGMKTQTXp4="
-    },
-    "content-type": {
-      "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
-      "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0="
-    },
-    "cookie": {
-      "version": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz",
-      "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE="
-    },
-    "cookie-signature": {
-      "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.5.tgz",
-      "integrity": "sha1-oSLj8VA+yg9TVXlbBxG7I2jUUPk="
-    },
     "cookiejar": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz",
@@ -189,82 +235,36 @@
     },
     "core-util-is": {
       "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "crc": {
-      "version": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
-      "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII="
-    },
-    "crypt": {
-      "version": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
-      "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
-    },
-    "cryptiles": {
-      "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz",
-      "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=",
-      "requires": {
-        "boom": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz"
-      }
-    },
-    "ctype": {
-      "version": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz",
-      "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8="
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
     },
-    "cycle": {
-      "version": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
-      "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
+    "cssmin": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.3.2.tgz",
+      "integrity": "sha1-3c5MVHtRCuDVlKjx+/iq+OLFwA0="
     },
     "debug": {
       "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
       "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=",
+      "dev": true,
       "requires": {
         "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
       }
     },
-    "deep-eql": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
-      "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
-      "requires": {
-        "type-detect": "0.1.1"
-      },
-      "dependencies": {
-        "type-detect": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
-          "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI="
-        }
-      }
-    },
     "deep-equal": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
       "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
     },
-    "delayed-stream": {
-      "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
-      "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8="
-    },
-    "depd": {
-      "version": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
-      "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
-    },
-    "destroy": {
-      "version": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
-      "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk="
-    },
     "diff": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
       "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k="
     },
-    "ee-first": {
-      "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
-    },
-    "escape-html": {
-      "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
-      "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A="
+    "double-ended-queue": {
+      "version": "2.1.0-0",
+      "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
+      "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw="
     },
     "escape-string-regexp": {
       "version": "1.0.5",
@@ -272,91 +272,260 @@
       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
       "dev": true
     },
-    "etag": {
-      "version": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
-      "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
-      "requires": {
-        "crc": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz"
-      }
-    },
     "express": {
-      "version": "https://registry.npmjs.org/express/-/express-4.10.2.tgz",
+      "version": "4.10.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.10.2.tgz",
       "integrity": "sha1-3wbd6U2WiTKCnUQKIATF7+ZElbA=",
       "requires": {
-        "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz",
-        "content-disposition": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz",
-        "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz",
-        "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.5.tgz",
-        "debug": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
-        "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
-        "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
-        "etag": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
-        "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.3.2.tgz",
-        "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
-        "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-        "merge-descriptors": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz",
-        "methods": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz",
-        "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz",
-        "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
-        "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz",
-        "proxy-addr": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz",
-        "qs": "https://registry.npmjs.org/qs/-/qs-2.3.2.tgz",
-        "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
-        "send": "https://registry.npmjs.org/send/-/send-0.10.1.tgz",
-        "serve-static": "https://registry.npmjs.org/serve-static/-/serve-static-1.7.2.tgz",
-        "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz",
-        "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
-        "vary": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz"
+        "accepts": "1.1.4",
+        "content-disposition": "0.5.0",
+        "cookie": "0.1.2",
+        "cookie-signature": "1.0.5",
+        "debug": "2.1.3",
+        "depd": "1.0.1",
+        "escape-html": "1.0.1",
+        "etag": "1.5.1",
+        "finalhandler": "0.3.2",
+        "fresh": "0.2.4",
+        "media-typer": "0.3.0",
+        "merge-descriptors": "0.0.2",
+        "methods": "1.1.0",
+        "on-finished": "2.1.1",
+        "parseurl": "1.3.2",
+        "path-to-regexp": "0.1.3",
+        "proxy-addr": "1.0.10",
+        "qs": "2.3.2",
+        "range-parser": "1.0.3",
+        "send": "0.10.1",
+        "serve-static": "1.7.2",
+        "type-is": "1.5.7",
+        "utils-merge": "1.0.0",
+        "vary": "1.0.1"
       },
       "dependencies": {
+        "accepts": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz",
+          "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=",
+          "requires": {
+            "mime-types": "2.0.14",
+            "negotiator": "0.4.9"
+          }
+        },
+        "content-disposition": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz",
+          "integrity": "sha1-QoT+auBjCHRjnkToCkGMKTQTXp4="
+        },
+        "cookie": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz",
+          "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE="
+        },
+        "cookie-signature": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.5.tgz",
+          "integrity": "sha1-oSLj8VA+yg9TVXlbBxG7I2jUUPk="
+        },
+        "crc": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
+          "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII="
+        },
         "debug": {
-          "version": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
           "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
           "requires": {
-            "ms": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz"
+            "ms": "0.7.0"
           }
         },
         "depd": {
-          "version": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
           "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo="
         },
+        "destroy": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
+          "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk="
+        },
         "ee-first": {
-          "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
           "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q="
         },
+        "escape-html": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
+          "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A="
+        },
+        "etag": {
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
+          "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
+          "requires": {
+            "crc": "3.2.1"
+          }
+        },
+        "finalhandler": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.3.2.tgz",
+          "integrity": "sha1-ezibD9Nkem+QvVZOImJL+KSnf7U=",
+          "requires": {
+            "debug": "2.1.3",
+            "escape-html": "1.0.1",
+            "on-finished": "2.1.1"
+          }
+        },
+        "forwarded": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+          "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+        },
+        "fresh": {
+          "version": "0.2.4",
+          "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
+          "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw="
+        },
+        "ipaddr.js": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz",
+          "integrity": "sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c="
+        },
+        "media-typer": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+          "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+        },
+        "merge-descriptors": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz",
+          "integrity": "sha1-w2pSp4FDdRPFcnXzndnTF1FKyMc="
+        },
+        "methods": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz",
+          "integrity": "sha1-XcpO4S31L/OwVhRZhqjwHLyGQ28="
+        },
+        "mime": {
+          "version": "1.2.11",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+          "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA="
+        },
         "mime-db": {
-          "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz",
+          "version": "1.12.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz",
           "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc="
         },
         "mime-types": {
-          "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz",
+          "version": "2.0.14",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz",
           "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=",
           "requires": {
-            "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz"
+            "mime-db": "1.12.0"
           }
         },
         "ms": {
-          "version": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
           "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M="
         },
+        "negotiator": {
+          "version": "0.4.9",
+          "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz",
+          "integrity": "sha1-kuRrbbU8fkIe1koryU8IvnYw3z8="
+        },
         "on-finished": {
-          "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz",
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz",
           "integrity": "sha1-+CyhyeOk8yhrG5k4YQ5bhja9PLI=",
           "requires": {
-            "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz"
+            "ee-first": "1.1.0"
+          }
+        },
+        "parseurl": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+          "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
+        },
+        "path-to-regexp": {
+          "version": "0.1.3",
+          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz",
+          "integrity": "sha1-IbmrgidCed4lsVbqCP0SylG4rss="
+        },
+        "proxy-addr": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz",
+          "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=",
+          "requires": {
+            "forwarded": "0.1.2",
+            "ipaddr.js": "1.0.5"
           }
         },
         "qs": {
-          "version": "https://registry.npmjs.org/qs/-/qs-2.3.2.tgz",
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.2.tgz",
           "integrity": "sha1-1F7CSeS5sCmvAIgpoQHV/36XJ5A="
         },
+        "range-parser": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
+          "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU="
+        },
+        "send": {
+          "version": "0.10.1",
+          "resolved": "https://registry.npmjs.org/send/-/send-0.10.1.tgz",
+          "integrity": "sha1-d0XFDscvEVEVmA6PsXmuwBkA4Io=",
+          "requires": {
+            "debug": "2.1.3",
+            "depd": "1.0.1",
+            "destroy": "1.0.3",
+            "escape-html": "1.0.1",
+            "etag": "1.5.1",
+            "fresh": "0.2.4",
+            "mime": "1.2.11",
+            "ms": "0.6.2",
+            "on-finished": "2.1.1",
+            "range-parser": "1.0.3"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "0.6.2",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz",
+              "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw="
+            }
+          }
+        },
+        "serve-static": {
+          "version": "1.7.2",
+          "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.7.2.tgz",
+          "integrity": "sha1-MWTOBtTmw0Wb3MnWAY+0+zXoSzk=",
+          "requires": {
+            "escape-html": "1.0.1",
+            "parseurl": "1.3.2",
+            "send": "0.10.1",
+            "utils-merge": "1.0.0"
+          }
+        },
         "type-is": {
-          "version": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz",
+          "version": "1.5.7",
+          "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz",
           "integrity": "sha1-uTaKWTzG730GReeLL0xky+zQXpA=",
           "requires": {
-            "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-            "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz"
+            "media-typer": "0.3.0",
+            "mime-types": "2.0.14"
           }
+        },
+        "utils-merge": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
+          "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg="
+        },
+        "vary": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz",
+          "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA="
         }
       }
     },
@@ -366,56 +535,6 @@
       "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
       "dev": true
     },
-    "eyes": {
-      "version": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
-      "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
-    },
-    "finalhandler": {
-      "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.3.2.tgz",
-      "integrity": "sha1-ezibD9Nkem+QvVZOImJL+KSnf7U=",
-      "requires": {
-        "debug": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
-        "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
-        "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
-          "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
-          "requires": {
-            "ms": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz"
-          }
-        },
-        "ee-first": {
-          "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
-          "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q="
-        },
-        "ms": {
-          "version": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
-          "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M="
-        },
-        "on-finished": {
-          "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz",
-          "integrity": "sha1-+CyhyeOk8yhrG5k4YQ5bhja9PLI=",
-          "requires": {
-            "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz"
-          }
-        }
-      }
-    },
-    "forever-agent": {
-      "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz",
-      "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA="
-    },
-    "form-data": {
-      "version": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz",
-      "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=",
-      "requires": {
-        "async": "https://registry.npmjs.org/async/-/async-0.9.0.tgz",
-        "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
-        "mime": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz"
-      }
-    },
     "formatio": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
@@ -430,20 +549,17 @@
       "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=",
       "dev": true
     },
-    "forwarded": {
-      "version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
-      "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M="
-    },
-    "fresh": {
-      "version": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
-      "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw="
-    },
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
       "dev": true
     },
+    "get-func-name": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE="
+    },
     "glob": {
       "version": "7.1.1",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
@@ -476,43 +592,6 @@
       "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
       "dev": true
     },
-    "hawk": {
-      "version": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
-      "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=",
-      "requires": {
-        "boom": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz",
-        "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz",
-        "hoek": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz",
-        "sntp": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz"
-      }
-    },
-    "hoek": {
-      "version": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz",
-      "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU="
-    },
-    "http-errors": {
-      "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
-      "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
-      "requires": {
-        "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
-        "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-        "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
-        "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz"
-      }
-    },
-    "http-signature": {
-      "version": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
-      "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=",
-      "requires": {
-        "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz",
-        "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
-        "ctype": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz"
-      }
-    },
-    "iconv-lite": {
-      "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
-      "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
-    },
     "inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -525,23 +604,22 @@
     },
     "inherits": {
       "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-    },
-    "ipaddr.js": {
-      "version": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz",
-      "integrity": "sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c="
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
     },
     "isarray": {
       "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
       "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
     },
-    "isstream": {
-      "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+    "js-yaml": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-0.3.7.tgz",
+      "integrity": "sha1-1znY7oZGHlSzVNan19HyrZoWf2I="
     },
-    "json-stringify-safe": {
-      "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+    "jsmin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/jsmin/-/jsmin-1.0.1.tgz",
+      "integrity": "sha1-570NzWSWw79IYyNb9GGj2YqjuYw="
     },
     "json3": {
       "version": "3.3.2",
@@ -554,8 +632,20 @@
       "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz",
       "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8="
     },
+    "jxLoader": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jxLoader/-/jxLoader-0.1.1.tgz",
+      "integrity": "sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0=",
+      "requires": {
+        "js-yaml": "0.3.7",
+        "moo-server": "1.3.0",
+        "promised-io": "0.3.5",
+        "walker": "1.0.7"
+      }
+    },
     "lodash": {
-      "version": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz",
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz",
       "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA="
     },
     "lodash._baseassign": {
@@ -603,6 +693,11 @@
         "lodash._isiterateecall": "3.0.9"
       }
     },
+    "lodash.get": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
+    },
     "lodash.isarguments": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
@@ -631,29 +726,23 @@
       "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.2.tgz",
       "integrity": "sha1-JpS5U8nqTQE+W4v7qJHJkQJbJik="
     },
-    "media-typer": {
-      "version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
-    },
-    "merge-descriptors": {
-      "version": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz",
-      "integrity": "sha1-w2pSp4FDdRPFcnXzndnTF1FKyMc="
-    },
-    "methods": {
-      "version": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz",
-      "integrity": "sha1-XcpO4S31L/OwVhRZhqjwHLyGQ28="
-    },
-    "mime": {
-      "version": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
-      "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA="
+    "makeerror": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+      "requires": {
+        "tmpl": "1.0.4"
+      }
     },
     "mime-db": {
       "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz",
-      "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg="
+      "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=",
+      "dev": true
     },
     "mime-types": {
       "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz",
       "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=",
+      "dev": true,
       "requires": {
         "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz"
       }
@@ -672,10 +761,6 @@
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
       "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
     },
-    "mkdirp": {
-      "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz",
-      "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc="
-    },
     "mocha": {
       "version": "3.5.0",
       "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz",
@@ -715,19 +800,21 @@
         }
       }
     },
+    "moo-server": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/moo-server/-/moo-server-1.3.0.tgz",
+      "integrity": "sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE="
+    },
     "ms": {
       "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
     },
     "native-promise-only": {
       "version": "0.8.1",
       "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
       "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
     },
-    "negotiator": {
-      "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz",
-      "integrity": "sha1-kuRrbbU8fkIe1koryU8IvnYw3z8="
-    },
     "nise": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/nise/-/nise-1.0.1.tgz",
@@ -755,25 +842,59 @@
       }
     },
     "nock": {
-      "version": "9.0.14",
-      "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.14.tgz",
-      "integrity": "sha1-IhFVAlMXPOKYvNifyoJeg4E8pys=",
+      "version": "9.4.3",
+      "resolved": "https://registry.npmjs.org/nock/-/nock-9.4.3.tgz",
+      "integrity": "sha512-inJFXR3REBvHbZy6nVVwaoKbVTR8Y4Ag051Y/pd2pNPy7HDYtQkenfilBwxToNsW9p1RTeBUml4SPK/mWrFihA==",
       "requires": {
-        "chai": "3.5.0",
-        "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
+        "chai": "4.1.2",
+        "debug": "3.1.0",
         "deep-equal": "1.0.1",
-        "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-        "lodash": "4.17.4",
+        "json-stringify-safe": "5.0.1",
+        "lodash": "4.17.10",
         "mkdirp": "0.5.1",
-        "propagate": "0.4.0",
-        "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
-        "semver": "5.4.1"
+        "propagate": "1.0.0",
+        "qs": "6.5.2",
+        "semver": "5.5.0"
       },
       "dependencies": {
+        "chai": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+          "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+          "requires": {
+            "assertion-error": "1.0.2",
+            "check-error": "1.0.2",
+            "deep-eql": "3.0.1",
+            "get-func-name": "2.0.0",
+            "pathval": "1.1.0",
+            "type-detect": "4.0.8"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-eql": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+          "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+          "requires": {
+            "type-detect": "4.0.8"
+          }
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+          "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+        },
         "lodash": {
-          "version": "4.17.4",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
-          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
         },
         "mkdirp": {
           "version": "0.5.1",
@@ -782,24 +903,34 @@
           "requires": {
             "minimist": "0.0.8"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "propagate": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz",
+          "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk="
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+        },
+        "semver": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+          "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+        },
+        "type-detect": {
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
         }
       }
     },
-    "node-uuid": {
-      "version": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
-      "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc="
-    },
-    "oauth-sign": {
-      "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz",
-      "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k="
-    },
-    "on-finished": {
-      "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "requires": {
-        "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
-      }
-    },
     "once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -809,23 +940,16 @@
         "wrappy": "1.0.2"
       }
     },
-    "parseurl": {
-      "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
-      "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY="
-    },
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
       "dev": true
     },
-    "path-to-regexp": {
-      "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz",
-      "integrity": "sha1-IbmrgidCed4lsVbqCP0SylG4rss="
-    },
-    "pkginfo": {
-      "version": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
-      "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE="
+    "pathval": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+      "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA="
     },
     "process-nextick-args": {
       "version": "1.0.7",
@@ -833,83 +957,259 @@
       "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
       "dev": true
     },
-    "propagate": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz",
-      "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE="
-    },
-    "proxy-addr": {
-      "version": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz",
-      "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=",
-      "requires": {
-        "forwarded": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
-        "ipaddr.js": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz"
-      }
+    "promised-io": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.5.tgz",
+      "integrity": "sha1-StIXuzZYvKrplGsXqGaOzYUeE1Y="
     },
-    "punycode": {
-      "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+    "psl": {
+      "version": "1.1.28",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.28.tgz",
+      "integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw=="
     },
     "qs": {
       "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
-      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
-    },
-    "range-parser": {
-      "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
-      "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU="
+      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+      "dev": true
     },
-    "raw-body": {
-      "version": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
-      "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=",
+    "redis": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
+      "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
       "requires": {
-        "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
-        "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
-        "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
+        "double-ended-queue": "2.1.0-0",
+        "redis-commands": "1.3.5",
+        "redis-parser": "2.6.0"
       }
     },
-    "readable-stream": {
-      "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-      "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
-      "requires": {
-        "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-        "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-        "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-        "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
-      }
+    "redis-commands": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz",
+      "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA=="
     },
-    "redis": {
-      "version": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz",
-      "integrity": "sha1-ZN92rQ/IrOuuvSoGReikj6xJGF4="
+    "redis-parser": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
+      "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs="
     },
     "request": {
-      "version": "https://registry.npmjs.org/request/-/request-2.47.0.tgz",
+      "version": "2.47.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.47.0.tgz",
       "integrity": "sha1-Cen9Gk/tZZOoBe+CArIPDF7LSF8=",
       "requires": {
-        "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz",
-        "bl": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz",
-        "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz",
-        "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
-        "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz",
-        "form-data": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz",
-        "hawk": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
-        "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
-        "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-        "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz",
-        "node-uuid": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
-        "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz",
-        "qs": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz",
-        "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-        "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
-        "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz"
+        "aws-sign2": "0.5.0",
+        "bl": "0.9.5",
+        "caseless": "0.6.0",
+        "combined-stream": "0.0.7",
+        "forever-agent": "0.5.2",
+        "form-data": "0.1.4",
+        "hawk": "1.1.1",
+        "http-signature": "0.10.1",
+        "json-stringify-safe": "5.0.1",
+        "mime-types": "1.0.2",
+        "node-uuid": "1.4.8",
+        "oauth-sign": "0.4.0",
+        "qs": "2.3.3",
+        "stringstream": "0.0.6",
+        "tough-cookie": "2.4.3",
+        "tunnel-agent": "0.4.3"
       },
       "dependencies": {
+        "asn1": {
+          "version": "0.1.11",
+          "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz",
+          "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc="
+        },
+        "assert-plus": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
+          "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA="
+        },
+        "aws-sign2": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz",
+          "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM="
+        },
+        "bl": {
+          "version": "0.9.5",
+          "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz",
+          "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=",
+          "requires": {
+            "readable-stream": "1.0.34"
+          }
+        },
+        "boom": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz",
+          "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=",
+          "requires": {
+            "hoek": "0.9.1"
+          }
+        },
+        "caseless": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz",
+          "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ="
+        },
+        "combined-stream": {
+          "version": "0.0.7",
+          "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
+          "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=",
+          "requires": {
+            "delayed-stream": "0.0.5"
+          }
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+          "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+        },
+        "cryptiles": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz",
+          "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=",
+          "requires": {
+            "boom": "0.4.2"
+          }
+        },
+        "ctype": {
+          "version": "0.5.3",
+          "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz",
+          "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8="
+        },
+        "delayed-stream": {
+          "version": "0.0.5",
+          "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
+          "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8="
+        },
+        "forever-agent": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz",
+          "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA="
+        },
+        "form-data": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz",
+          "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=",
+          "requires": {
+            "async": "0.9.0",
+            "combined-stream": "0.0.7",
+            "mime": "1.2.11"
+          }
+        },
+        "hawk": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
+          "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=",
+          "requires": {
+            "boom": "0.4.2",
+            "cryptiles": "0.2.2",
+            "hoek": "0.9.1",
+            "sntp": "0.2.4"
+          }
+        },
+        "hoek": {
+          "version": "0.9.1",
+          "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz",
+          "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU="
+        },
+        "http-signature": {
+          "version": "0.10.1",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
+          "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=",
+          "requires": {
+            "asn1": "0.1.11",
+            "assert-plus": "0.1.5",
+            "ctype": "0.5.3"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+          "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+        },
+        "mime": {
+          "version": "1.2.11",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+          "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA="
+        },
         "mime-types": {
-          "version": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz",
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz",
           "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4="
         },
+        "node-uuid": {
+          "version": "1.4.8",
+          "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+          "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc="
+        },
+        "oauth-sign": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz",
+          "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k="
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+        },
         "qs": {
-          "version": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz",
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz",
           "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ="
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "sntp": {
+          "version": "0.2.4",
+          "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz",
+          "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=",
+          "requires": {
+            "hoek": "0.9.1"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        },
+        "stringstream": {
+          "version": "0.0.6",
+          "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
+          "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA=="
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+          "requires": {
+            "psl": "1.1.28",
+            "punycode": "1.4.1"
+          }
+        },
+        "tunnel-agent": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+          "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us="
         }
       }
     },
@@ -919,142 +1219,75 @@
       "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
       "dev": true
     },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
     "samsam": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz",
       "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc="
     },
-    "semver": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
-      "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
-    },
-    "send": {
-      "version": "https://registry.npmjs.org/send/-/send-0.10.1.tgz",
-      "integrity": "sha1-d0XFDscvEVEVmA6PsXmuwBkA4Io=",
+    "sha1": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.0.tgz",
+      "integrity": "sha1-j8IEe+OezrHcVOv+NaUEmxigBAs=",
       "requires": {
-        "debug": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
-        "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
-        "destroy": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
-        "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
-        "etag": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
-        "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
-        "mime": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
-        "ms": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz",
-        "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz",
-        "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz"
+        "charenc": "0.0.2",
+        "crypt": "0.0.2"
       },
       "dependencies": {
-        "debug": {
-          "version": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
-          "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
-          "requires": {
-            "ms": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz"
-          },
-          "dependencies": {
-            "ms": {
-              "version": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
-              "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M="
-            }
-          }
-        },
-        "depd": {
-          "version": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
-          "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo="
+        "charenc": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+          "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
         },
-        "ee-first": {
-          "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
-          "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q="
-        },
-        "ms": {
-          "version": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz",
-          "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw="
-        },
-        "on-finished": {
-          "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz",
-          "integrity": "sha1-+CyhyeOk8yhrG5k4YQ5bhja9PLI=",
-          "requires": {
-            "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz"
-          }
+        "crypt": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+          "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
         }
       }
     },
-    "serve-static": {
-      "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.7.2.tgz",
-      "integrity": "sha1-MWTOBtTmw0Wb3MnWAY+0+zXoSzk=",
-      "requires": {
-        "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
-        "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
-        "send": "https://registry.npmjs.org/send/-/send-0.10.1.tgz",
-        "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz"
-      }
-    },
-    "setprototypeof": {
-      "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
-      "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
-    },
-    "sha1": {
-      "version": "https://registry.npmjs.org/sha1/-/sha1-1.1.0.tgz",
-      "integrity": "sha1-j8IEe+OezrHcVOv+NaUEmxigBAs=",
-      "requires": {
-        "charenc": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
-        "crypt": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz"
-      }
-    },
     "sinon": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.2.1.tgz",
-      "integrity": "sha512-KY3OLOWpek/I4NGAMHetuutVgS2aRgMR5g5/1LSYvPJ3qo2BopIvk3esFztPxF40RWf/NNNJzdFPriSkXUVK3A==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.3.0.tgz",
+      "integrity": "sha512-/flfGfIxIRXSvZBHJzIf3iAyGYkmMQq6SQjA0cx9SOuVuq+4ZPPO4LJtH1Ce0Lznax1KSG1U6Dad85wIcSW19w==",
       "requires": {
+        "build": "0.1.4",
         "diff": "3.2.0",
         "formatio": "1.2.0",
+        "lodash.get": "4.4.2",
         "lolex": "2.1.2",
         "native-promise-only": "0.8.1",
         "nise": "1.0.1",
         "path-to-regexp": "1.7.0",
         "samsam": "1.2.1",
         "text-encoding": "0.6.4",
-        "type-detect": "4.0.3"
+        "type-detect": "4.0.8"
       },
       "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        },
         "path-to-regexp": {
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
           "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
           "requires": {
-            "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
+            "isarray": "0.0.1"
           }
         },
         "type-detect": {
-          "version": "4.0.3",
-          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz",
-          "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo="
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
         }
       }
     },
-    "sntp": {
-      "version": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz",
-      "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=",
-      "requires": {
-        "hoek": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz"
-      }
-    },
-    "stack-trace": {
-      "version": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
-      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
-    },
-    "statuses": {
-      "version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
-      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
-    },
-    "string_decoder": {
-      "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-    },
-    "stringstream": {
-      "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
-    },
     "superagent": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.6.0.tgz",
@@ -1175,33 +1408,20 @@
       "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
       "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk="
     },
-    "tough-cookie": {
-      "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
-      "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
-      "requires": {
-        "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"
-      }
-    },
-    "tunnel-agent": {
-      "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
-      "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us="
-    },
-    "type-detect": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
-      "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI="
+    "timespan": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
+      "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk="
     },
-    "type-is": {
-      "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
-      "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
-      "requires": {
-        "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-        "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz"
-      }
+    "tmpl": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
     },
-    "unpipe": {
-      "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+    "uglify-js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz",
+      "integrity": "sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0="
     },
     "util-deprecate": {
       "version": "1.0.2",
@@ -1209,30 +1429,62 @@
       "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
       "dev": true
     },
-    "utils-merge": {
-      "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
-      "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg="
-    },
-    "vary": {
-      "version": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz",
-      "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA="
+    "walker": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+      "requires": {
+        "makeerror": "1.0.11"
+      }
     },
     "winston": {
-      "version": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz",
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz",
       "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=",
       "requires": {
-        "async": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
-        "colors": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
-        "cycle": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
-        "eyes": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
-        "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-        "pkginfo": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
-        "stack-trace": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz"
+        "async": "0.2.10",
+        "colors": "0.6.2",
+        "cycle": "1.0.3",
+        "eyes": "0.1.8",
+        "isstream": "0.1.2",
+        "pkginfo": "0.3.1",
+        "stack-trace": "0.0.10"
       },
       "dependencies": {
         "async": {
-          "version": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+          "version": "0.2.10",
+          "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
           "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
+        },
+        "colors": {
+          "version": "0.6.2",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+          "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w="
+        },
+        "cycle": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+          "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
+        },
+        "eyes": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+          "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+          "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+        },
+        "pkginfo": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
+          "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE="
+        },
+        "stack-trace": {
+          "version": "0.0.10",
+          "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+          "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
         }
       }
     },
@@ -1242,6 +1494,11 @@
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
       "dev": true
     },
+    "wrench": {
+      "version": "1.3.9",
+      "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.3.9.tgz",
+      "integrity": "sha1-bxPsNRRTF+spLKX2UxORskQRFBE="
+    },
     "xmldom": {
       "version": "0.1.27",
       "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
diff --git a/bbb-webhooks/package.json b/bbb-webhooks/package.json
index cbe8a8dc77..b6b938e669 100755
--- a/bbb-webhooks/package.json
+++ b/bbb-webhooks/package.json
@@ -10,11 +10,10 @@
   "dependencies": {
     "async": "0.9.0",
     "body-parser": "^1.9.2",
-    "coffee-script": "1.8.0",
     "express": "4.10.2",
     "lodash": "2.4.1",
     "nock": "^9.0.14",
-    "redis": "0.12.1",
+    "redis": "^2.8.0",
     "request": "2.47.0",
     "sha1": "1.1.0",
     "sinon": "^3.2.1",
diff --git a/bbb-webhooks/test/test.js b/bbb-webhooks/test/test.js
index 51b2d0ab20..460ce5af88 100644
--- a/bbb-webhooks/test/test.js
+++ b/bbb-webhooks/test/test.js
@@ -9,6 +9,8 @@ const Helpers = require('./helpers.js')
 const sinon = require('sinon');
 const winston = require('winston');
 
+const sharedSecret = process.env.SHARED_SECRET || sharedSecrett;
+
 // Block winston from logging
 Logger.remove(winston.transports.Console);
 describe('bbb-webhooks tests', () => {
@@ -38,7 +40,7 @@ describe('bbb-webhooks tests', () => {
 
   describe('GET /hooks/list permanent', () => {
     it('should list permanent hook', (done) => {
-      let getUrl = utils.checksumAPI(Helpers.url + Helpers.listUrl, config.bbb.sharedSecret);
+      let getUrl = utils.checksumAPI(Helpers.url + Helpers.listUrl, sharedSecrett);
       getUrl = Helpers.listUrl + '?checksum=' + getUrl
 
       request(Helpers.url)
@@ -62,7 +64,7 @@ describe('bbb-webhooks tests', () => {
       Hook.removeSubscription(hooks[hooks.length-1].id, () => { done(); });
     });
     it('should create a hook', (done) => {
-      let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl, config.bbb.sharedSecret);
+      let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl, sharedSecrett);
       getUrl = Helpers.createUrl + '&checksum=' + getUrl
 
       request(Helpers.url)
@@ -87,7 +89,7 @@ describe('bbb-webhooks tests', () => {
     it('should destroy a hook', (done) => {
       const hooks = Hook.allGlobalSync();
       const hook = hooks[hooks.length-1].id;
-      let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyUrl(hook), config.bbb.sharedSecret);
+      let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyUrl(hook), sharedSecrett);
       getUrl = Helpers.destroyUrl(hook) + '&checksum=' + getUrl
 
       request(Helpers.url)
@@ -103,7 +105,7 @@ describe('bbb-webhooks tests', () => {
 
   describe('GET /hooks/destroy permanent hook', () => {
     it('should not destroy the permanent hook', (done) => {
-      let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyPermanent, config.bbb.sharedSecret);
+      let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyPermanent, sharedSecrett);
       getUrl = Helpers.destroyPermanent + '&checksum=' + getUrl
       request(Helpers.url)
       .get(getUrl)
@@ -126,7 +128,7 @@ describe('bbb-webhooks tests', () => {
       Hook.removeSubscription(hooks[hooks.length-1].id, () => { done(); });
     });
     it('should create a hook with getRaw=true', (done) => {
-      let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl + Helpers.createRaw, config.bbb.sharedSecret);
+      let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl + Helpers.createRaw, sharedSecrett);
       getUrl = Helpers.createUrl + '&checksum=' + getUrl + Helpers.createRaw
 
       request(Helpers.url)
diff --git a/bbb-webhooks/web_server.js b/bbb-webhooks/web_server.js
index e0f77f0b40..be5a005783 100644
--- a/bbb-webhooks/web_server.js
+++ b/bbb-webhooks/web_server.js
@@ -144,8 +144,9 @@ module.exports = class WebServer {
   _validateChecksum(req, res, next) {
     const urlObj = url.parse(req.url, true);
     const checksum = urlObj.query["checksum"];
+    const sharedSecret = process.env.SHARED_SECRET || config.bbb.sharedSecret;
 
-    if (checksum === Utils.checksumAPI(req.url, config.bbb.sharedSecret)) {
+    if (checksum === Utils.checksumAPI(req.url, sharedSecret)) {
       next();
     } else {
       Logger.info("[WebServer] checksum check failed, sending a checksumError response");
diff --git a/bigbluebutton-html5/.dockerignore b/bigbluebutton-html5/.dockerignore
index a1bdef1424..bf9b07fdc2 100644
--- a/bigbluebutton-html5/.dockerignore
+++ b/bigbluebutton-html5/.dockerignore
@@ -1,3 +1,2 @@
-private/config/settings-production.json
 Dockerfile
 Dockerfile.dev
diff --git a/bigbluebutton-html5/Dockerfile b/bigbluebutton-html5/Dockerfile
index 94d070ac51..8e4b24cb17 100644
--- a/bigbluebutton-html5/Dockerfile
+++ b/bigbluebutton-html5/Dockerfile
@@ -1,13 +1,17 @@
 FROM node:8
 
-COPY . /source
-
 RUN set -x \
  && curl -sL https://install.meteor.com | sed s/--progress-bar/-sL/g | /bin/sh \
- && useradd -m -G users -s /bin/bash meteor \
- && chown -R meteor:meteor /source
+ && useradd -m -G users -s /bin/bash meteor
 
-RUN mkdir /app \
+RUN apt-get update && apt-get -y install jq
+
+COPY . /source
+
+RUN cd /source \
+ && mv docker-entrypoint.sh /usr/local/bin/ \
+ && chown -R meteor:meteor . \
+ && mkdir /app \
  && chown -R meteor:meteor /app
 
 USER meteor
@@ -26,9 +30,9 @@ WORKDIR /app/bundle
 
 ENV MONGO_URL=mongodb://mongo:27017/html5client \
     PORT=3000 \
-    ROOT_URL=http://localhost:3000
+    ROOT_URL=http://localhost:3000 \
+    METEOR_SETTINGS_MODIFIER=.
 
 EXPOSE 3000
 
-CMD ["node", "main.js"]
-
+CMD ["docker-entrypoint.sh"]
diff --git a/bigbluebutton-html5/docker-entrypoint.sh b/bigbluebutton-html5/docker-entrypoint.sh
new file mode 100755
index 0000000000..576313a793
--- /dev/null
+++ b/bigbluebutton-html5/docker-entrypoint.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -e
+
+export METEOR_SETTINGS=` jq "${METEOR_SETTINGS_MODIFIER}" /source/private/config/settings-production.json `
+
+node main.js
diff --git a/bigbluebutton-web/Dockerfile b/bigbluebutton-web/Dockerfile
index 74ec97ba02..a980f59723 100644
--- a/bigbluebutton-web/Dockerfile
+++ b/bigbluebutton-web/Dockerfile
@@ -30,10 +30,19 @@ FROM tomcat:7-jre8
 
 WORKDIR $CATALINA_HOME
 
+ENV DOCKERIZE_VERSION v0.6.1
+RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+  && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+  && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
+
+ENV DEBIAN_FRONTEND noninteractive
 RUN apt-get update \
- && apt-get -y install imagemagick xpdf-utils libreoffice ttf-liberation psmisc fonts-crosextra-carlito fonts-crosextra-caladea unzip
+ && apt-get -y install imagemagick xpdf-utils netcat libreoffice ttf-liberation fonts-crosextra-carlito fonts-crosextra-caladea unzip procps \
+ && wget http://ftp.us.debian.org/debian/pool/main/libj/libjpeg8/libjpeg8_8d-1+deb7u1_amd64.deb \
+ && dpkg -i libjpeg8*.deb \
+ && rm libjpeg8*.deb
 
-RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200 bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \
+RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200-dev bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \
  && wget http://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O- | apt-key add - \
  && apt-get update \
  && apt-get -y install bbb-swftools
@@ -46,7 +55,10 @@ COPY --from=builder /source/target/bigbluebutton-0.9.0.war webapps/bigbluebutton
 RUN unzip -q webapps/bigbluebutton.war -d webapps/bigbluebutton \
  && rm webapps/bigbluebutton.war
 
-COPY entrypoint.sh .
+COPY turn-stun-servers.xml.tmpl turn-stun-servers.xml.tmpl
 
-CMD ["./entrypoint.sh"]
+COPY docker-entrypoint.sh /usr/local/bin/
 
+CMD [ "dockerize", \
+  "-template", "turn-stun-servers.xml.tmpl:webapps/bigbluebutton/WEB-INF/spring/turn-stun-servers.xml", \
+  "docker-entrypoint.sh" ]
diff --git a/bigbluebutton-web/entrypoint.sh b/bigbluebutton-web/docker-entrypoint.sh
similarity index 63%
rename from bigbluebutton-web/entrypoint.sh
rename to bigbluebutton-web/docker-entrypoint.sh
index 02092041cd..2c57dc634c 100755
--- a/bigbluebutton-web/entrypoint.sh
+++ b/bigbluebutton-web/docker-entrypoint.sh
@@ -11,8 +11,7 @@ mkdir -p /var/bigbluebutton/published
 mkdir -p /var/bigbluebutton/deleted
 mkdir -p /var/bigbluebutton/unpublished
 
-export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -DsecuritySalt=$SHARED_SECRET -Dredis.host=redis -Dbigbluebutton.web.serverURL=https://$SERVER_DOMAIN"
-sed -i "s|^securerandom\.source=.*|securerandom.source=file:/dev/./urandom|g" $JAVA_HOME/lib/security/java.security
+export JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -DsecuritySalt=${SHARED_SECRET} -Dredis.host=redis -Dbigbluebutton.web.serverURL=https://${SERVER_DOMAIN} -DattendeesJoinViaHTML5Client=true -DmoderatorsJoinViaHTML5Client=true -DsvgImagesRequired=true"
+sed -i "s|^securerandom\.source=.*|securerandom.source=file:/dev/urandom|g" ${JAVA_HOME}/lib/security/java.security
 
 catalina.sh run
-
diff --git a/bigbluebutton-web/grails-app/conf/Config.groovy b/bigbluebutton-web/grails-app/conf/Config.groovy
index cd9d36a9d3..d03d3eb93f 100755
--- a/bigbluebutton-web/grails-app/conf/Config.groovy
+++ b/bigbluebutton-web/grails-app/conf/Config.groovy
@@ -130,5 +130,7 @@ log4j = {
            'org.hibernate',
            'net.sf.ehcache.hibernate'
 
-    debug  'org.bigbluebutton'
+    debug  'org.bigbluebutton',
+           'grails.app.controllers',
+           'grails.app.services',
 }
diff --git a/bigbluebutton-web/turn-stun-servers.xml.tmpl b/bigbluebutton-web/turn-stun-servers.xml.tmpl
new file mode 100644
index 0000000000..238ca04544
--- /dev/null
+++ b/bigbluebutton-web/turn-stun-servers.xml.tmpl
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+
+Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below).
+
+This program is free software; you can redistribute it and/or modify it under the
+terms of the GNU Lesser General Public License as published by the Free Software
+Foundation; either version 3.0 of the License, or (at your option) any later
+version.
+
+BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.springframework.org/schema/beans
+            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+            ">
+
+    <bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer">
+        <constructor-arg index="0" value="{{ .Env.TURN_SECRET }}"/>
+        <constructor-arg index="1" value="turn:{{ .Env.SERVER_DOMAIN }}:3478"/>
+        <constructor-arg index="2" value="86400"/>
+    </bean>
+
+    <bean id="turn2" class="org.bigbluebutton.web.services.turn.TurnServer">
+        <constructor-arg index="0" value="{{ .Env.TURN_SECRET }}"/>
+        <constructor-arg index="1" value="turn:{{ .Env.SERVER_DOMAIN }}:5349?transport=tcp"/>
+        <constructor-arg index="2" value="86400"/>
+    </bean>
+
+    <bean id="stunTurnService" class="org.bigbluebutton.web.services.turn.StunTurnService">
+        <property name="stunServers">
+            <set/>
+        </property>
+        <property name="turnServers">
+            <set>
+                <ref bean="turn1" />
+                <ref bean="turn2" />
+            </set>
+        </property>
+        <property name="remoteIceCandidates">
+            <set/>
+        </property>
+    </bean>
+</beans>
diff --git a/freeswitch.dockerfile b/freeswitch.dockerfile
deleted file mode 100644
index 98c26a9080..0000000000
--- a/freeswitch.dockerfile
+++ /dev/null
@@ -1,21 +0,0 @@
-FROM ubuntu:16.04
-
-ENV DEBIAN_FRONTEND noninteractive
-
-RUN apt-get update \
- && apt-get -y install wget libedit-dev
-
-RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200 bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \
- && wget http://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O- | apt-key add - \
- && apt-get update \
- && apt-get -y install bbb-freeswitch-core
-
-RUN apt-get -y install xmlstarlet \
- && xmlstarlet edit --inplace --update "//param[@name='listen-ip']/@value" --value "0.0.0.0" /opt/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml
-
-EXPOSE 8021
-EXPOSE 5060
-EXPOSE 5066
-EXPOSE 7443
-
-CMD [ "/opt/freeswitch/bin/freeswitch" ]
diff --git a/labs/bbb-webrtc-sfu/Dockerfile b/labs/bbb-webrtc-sfu/Dockerfile
index 54ce0eca12..b0cfd9d4f1 100644
--- a/labs/bbb-webrtc-sfu/Dockerfile
+++ b/labs/bbb-webrtc-sfu/Dockerfile
@@ -6,12 +6,10 @@ RUN cp /source/config/default.example.yml /source/config/production.yml
 ENV NODE_ENV production
 
 RUN cd /source \
+ && mv docker-entrypoint.sh /usr/local/bin/ \
  && npm install \
  && npm cache clear --force
 
 WORKDIR /source
 
-EXPOSE 3008
-
-CMD [ "./bbb-webrtc-sfu-run.sh" ]
-
+CMD [ "docker-entrypoint.sh" ]
diff --git a/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml b/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml
index 081fc75102..322efff11b 100644
--- a/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml
+++ b/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml
@@ -1,5 +1,3 @@
 kurentoUrl: KURENTO_URL
 kurentoIp: KURENTO_IP
-localIpAddress: TRANSCODE_IP
 redisHost: REDIS_HOST
-
diff --git a/labs/bbb-webrtc-sfu/bbb-webrtc-sfu-run.sh b/labs/bbb-webrtc-sfu/docker-entrypoint.sh
similarity index 62%
rename from labs/bbb-webrtc-sfu/bbb-webrtc-sfu-run.sh
rename to labs/bbb-webrtc-sfu/docker-entrypoint.sh
index 45c1c36112..5f513af89e 100755
--- a/labs/bbb-webrtc-sfu/bbb-webrtc-sfu-run.sh
+++ b/labs/bbb-webrtc-sfu/docker-entrypoint.sh
@@ -3,6 +3,5 @@
 CONTAINER_IP=$(hostname -I | awk '{print $1}')
 
 sed -i "s|^\(localIpAddress\):.*|\1: \"$CONTAINER_IP\"|g" config/production.yml
-sed -i "s|^\(kurentoIp\):.*|\1: \"$KURENTO_IP\"|g" config/production.yml
 
-node server.js
+npm start
diff --git a/labs/docker/coturn/Dockerfile b/labs/docker/coturn/Dockerfile
new file mode 100644
index 0000000000..aa4912ae02
--- /dev/null
+++ b/labs/docker/coturn/Dockerfile
@@ -0,0 +1,14 @@
+FROM ubuntu:16.04
+
+RUN apt-get update && apt-get install -y coturn wget
+
+ENV DOCKERIZE_VERSION v0.6.1
+RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+  && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+  && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
+
+COPY ./turnserver.conf.tmpl /etc/turnserver.conf.tmpl
+
+CMD [ "dockerize", \
+  "-template", "/etc/turnserver.conf.tmpl:/etc/turnserver.conf", \
+  "turnserver", "--syslog" ]
diff --git a/labs/docker/coturn/turnserver.conf.tmpl b/labs/docker/coturn/turnserver.conf.tmpl
new file mode 100644
index 0000000000..209455fa3f
--- /dev/null
+++ b/labs/docker/coturn/turnserver.conf.tmpl
@@ -0,0 +1,21 @@
+listening-port={{ .Env.PORT }}
+tls-listening-port={{ .Env.PORT_TLS}}
+min-port=49152
+max-port=65535
+fingerprint
+lt-cred-mech
+realm={{ .Env.SERVER_DOMAIN }}
+cert={{ .Env.SSL_CERT_PATH }}
+pkey={{ .Env.SSL_KEY_PATH }}
+cipher-list="ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AES256"
+dh-file={{ .Env.SSL_DHPARAM_PATH }}
+no-tlsv1
+no-tlsv1_1
+external-ip={{ .Env.EXTERNAL_IP }}
+
+{{ if isTrue .Env.ENABLE_REST_API }}
+use-auth-secret
+static-auth-secret={{ .Env.SECRET }}
+{{ else }}
+user={{ .Env.LT_USER }}:{{ .Env.LT_SECRET }}
+{{ end }}
diff --git a/labs/docker/docker-compose.yml b/labs/docker/docker-compose.yml
index 1dbfdfcef9..875777117c 100644
--- a/labs/docker/docker-compose.yml
+++ b/labs/docker/docker-compose.yml
@@ -1,28 +1,32 @@
 version: '2'
 
-services:
-#  nginx-dhp:
-#    image: nginx-dhp
-#    volumes:
-#      - config-nginx-dhp:/data
-
-#  nginx-ssl:
-#    image: certbot/certbot
-#    ports:
-#      - 80:80
-#    volumes:
-#      - config-nginx-ssl:/etc/letsencrypt
-#    command: certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain ${SERVER_DOMAIN} --standalone
+# export SERVER_DOMAIN=felipe.dev.mconf.com
+# export EXTERNAL_IP=`dig +short $SERVER_DOMAIN`
+# export SHARED_SECRET=`openssl rand -hex 16`
+# export COTURN_REST_SECRET=`openssl rand -hex 16`
+# export SCREENSHARE_EXTENSION_LINK=https://chrome.google.com/webstore/detail/mconf-screenshare/mbfngdphjegmlbfobcblikeefpidfncb
+# export SCREENSHARE_EXTENSION_KEY=mbfngdphjegmlbfobcblikeefpidfncb
 
-#  mongo:
-#    image: mongo:3.4
-#    restart: unless-stopped
+services:
+  mongo:
+    image: mongo:3.4
+    restart: unless-stopped
 
   redis:
     image: redis
     restart: unless-stopped
-    volumes:
-      - recordings-redis:/data
+
+  bbb-html5:
+    image: bbb-html5
+    restart: unless-stopped
+    links:
+      - mongo
+      - redis
+    environment:
+      MONGO_URL: mongodb://mongo/bbbhtml5
+      METEOR_SETTINGS_MODIFIER: ".public.kurento.wsUrl = \"wss://${SERVER_DOMAIN}/bbb-webrtc-sfu\" | .public.kurento.enableVideo = true | .public.kurento.enableScreensharing = true | .public.kurento.chromeDefaultExtensionKey = \"${SCREENSHARE_EXTENSION_KEY}\" | .public.kurento.chromeDefaultExtensionLink = \"${SCREENSHARE_EXTENSION_LINK}\""
+      REDIS_HOST: redis
+      ROOT_URL: http://127.0.0.1/html5client
 
   bbb-webhooks:
     image: bbb-webhooks
@@ -31,35 +35,80 @@ services:
       - redis
     environment:
       REDIS_HOST: redis
+      SHARED_SECRET: ${SHARED_SECRET}
 
-#  coturn:
-#    image: kurento/coturn
-#    restart: unless-stopped
-#    network_mode: host
+  bbb-freeswitch:
+    image: bbb-freeswitch
+    restart: unless-stopped
+    links:
+      - coturn
 
-#  kurento:
-#    image: kurento
-#    restart: unless-stopped
-#    network_mode: host
+  bbb-webrtc-sfu:
+    image: bbb-webrtc-sfu
+    restart: unless-stopped
+    links:
+      - redis
+      - kurento
+    environment:
+      KURENTO_IP: ${EXTERNAL_IP}
+      KURENTO_URL: ws://kurento:8888/kurento
+      REDIS_HOST: redis
 
-#  bbb-apps-akka:
-#    image: bbb-apps-akka
-#    restart: unless-stopped
-#    links:
-#      - redis
-#    environment:
-#      JAVA_OPTS: -Dredis.host=redis
+  coturn:
+    image: coturn
+    restart: unless-stopped
+    volumes:
+      - ssl-conf:/etc/nginx/ssl
+    environment:
+      SERVER_DOMAIN: ${SERVER_DOMAIN}
+      SSL_CERT_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem
+      SSL_KEY_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem
+      SSL_DHPARAM_PATH: /etc/nginx/ssl/dhp-2048.pem
+      SECRET: ${COTURN_REST_SECRET}
+      EXTERNAL_IP: ${EXTERNAL_IP}
+      ENABLE_REST_API: 1
+      PORT: 3478
+      PORT_TLS: 5349
+    ports:
+      - 3478:3478/udp
+      - 3478:3478/tcp
+      - 5349:5349/tcp
 
-#  bbb-web:
-#    image: bbb-web
-#    restart: unless-stopped
-#    links:
-#      - redis
-#    volumes:
-#      - recordings-storage:/var/bigbluebutton
-#    environment:
-#      SERVER_DOMAIN: ${SERVER_DOMAIN}
-#      SHARED_SECRET: ${SHARED_SECRET}
+  kurento:
+    image: kurento
+    restart: unless-stopped
+    environment:
+      KMS_STUN_IP: ${EXTERNAL_IP}
+      KMS_STUN_PORT: 3478
+
+  bbb-apps-akka:
+    image: bbb-apps-akka
+    restart: unless-stopped
+    links:
+      - redis
+    environment:
+      JAVA_OPTS: -Dredis.host=redis
+
+  bbb-fsesl-akka:
+    image: bbb-fsesl-akka
+    restart: unless-stopped
+    links:
+      - bbb-freeswitch
+      - redis
+    environment:
+      JAVA_OPTS: -Dredis.host=redis -Dfreeswitch.esl.host=bbb-freeswitch
+
+  bbb-web:
+    image: bbb-web
+    restart: unless-stopped
+    links:
+      - redis
+    volumes:
+      - bigbluebutton:/var/bigbluebutton
+    environment:
+      SERVER_DOMAIN: ${SERVER_DOMAIN}
+      SHARED_SECRET: ${SHARED_SECRET}
+      TURN_SECRET: ${COTURN_REST_SECRET}
 
 #  greenlight-env:
 #    image: bigbluebutton/greenlight
@@ -67,11 +116,11 @@ services:
 #      - config-greenlight:/data
 #    command: rake secret > /data/env
 
-  greenlight:
-    image: bigbluebutton/greenlight
-    restart: unless-stopped
-    volumes:
-      - db-greenlight:/usr/src/app/db/production
+#  greenlight:
+#    image: bigbluebutton/greenlight
+#    restart: unless-stopped
+#    volumes:
+#      - db-greenlight:/usr/src/app/db/production
 
   nginx:
     image: nginx
@@ -81,22 +130,23 @@ services:
       - bbb-web
       - bbb-html5
       - bbb-webrtc-sfu
-      - greenlight
+      - bbb-freeswitch
+#      - greenlight
     ports:
       - 80:80
       - 443:443
     volumes:
-      - config-nginx-ssl:/etc/letsencrypt
-      - config-nginx-dhp/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem
-    
-
-
-docker run --rm --name nginx --link bbb-webhooks --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link greenlight -p 80:80 -p 443:443 -v ~/certs:/etc/letsencrypt -v $(pwd)/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/bigbluebutton-client/resources/config.xml.template:/var/www/bigbluebutton/client/conf/config.xml -d nginx
+      - ssl-conf:/etc/nginx/ssl
+      - static:/var/www/bigbluebutton-default
+    environment:
+      SERVER_DOMAIN: ${SERVER_DOMAIN}
+      SSL_CERT_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem
+      SSL_KEY_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem
+      SSL_DHPARAM_PATH: /etc/nginx/ssl/dhp-2048.pem
 
 volumes:
-  config-nginx-dhp:
-  config-nginx-ssl:
-  config-greenlight:
-  recordings-redis:
-  recordings-storage:
-  db-greenlight:
+  ssl-conf:
+    driver: local    
+  static:
+    driver: local    
+  bigbluebutton:
diff --git a/labs/docker/freeswitch/Dockerfile b/labs/docker/freeswitch/Dockerfile
new file mode 100644
index 0000000000..8e0636bea9
--- /dev/null
+++ b/labs/docker/freeswitch/Dockerfile
@@ -0,0 +1,21 @@
+FROM ubuntu:16.04
+
+ENV DEBIAN_FRONTEND noninteractive
+
+RUN apt-get update \
+ && apt-get -y install wget libedit-dev xmlstarlet
+
+RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200-dev bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \
+ && wget http://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O- | apt-key add - \
+ && apt-get update \
+ && apt-get -y install bbb-freeswitch-core
+
+EXPOSE 8021
+EXPOSE 5060
+EXPOSE 5066
+EXPOSE 7443
+
+COPY docker-entrypoint.sh /usr/local/bin/
+COPY event_socket_conf.xml /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml
+
+CMD [ "docker-entrypoint.sh" ]
diff --git a/labs/docker/freeswitch/docker-entrypoint.sh b/labs/docker/freeswitch/docker-entrypoint.sh
new file mode 100755
index 0000000000..68472535f6
--- /dev/null
+++ b/labs/docker/freeswitch/docker-entrypoint.sh
@@ -0,0 +1,11 @@
+#!/bin/bash -xe
+
+IP=$(hostname -I | cut -d' ' -f1)
+
+xmlstarlet edit --inplace --update '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "external_rtp_ip=")]/@data' --value "stun:coturn" /opt/freeswitch/conf/vars.xml
+xmlstarlet edit --inplace --update '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "external_sip_ip=")]/@data' --value "stun:coturn" /opt/freeswitch/conf/vars.xml
+xmlstarlet edit --inplace --update '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "local_ip_v4=")]/@data' --value "${IP}" /opt/freeswitch/conf/vars.xml
+xmlstarlet edit --inplace --update '//param[@name="ws-binding"]/@value' --value ":7443" /opt/freeswitch/conf/sip_profiles/external.xml
+xmlstarlet edit --inplace --update '//param[@name="ws-binding"]/@name' --value "wss-binding" /opt/freeswitch/conf/sip_profiles/external.xml
+
+/opt/freeswitch/bin/freeswitch
diff --git a/labs/docker/freeswitch/event_socket_conf.xml b/labs/docker/freeswitch/event_socket_conf.xml
new file mode 100644
index 0000000000..c10b16fb1b
--- /dev/null
+++ b/labs/docker/freeswitch/event_socket_conf.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<configuration name="event_socket.conf" description="Socket Client">
+  <settings>
+    <param name="nat-map" value="false"/>
+    <param name="listen-ip" value="0.0.0.0"/>
+    <param name="listen-port" value="8021"/>
+    <param name="password" value="ClueCon"/>
+    <param name="apply-inbound-acl" value="localnet.auto"/>
+  </settings>
+</configuration>
diff --git a/labs/docker/kurento/Dockerfile b/labs/docker/kurento/Dockerfile
index 635c347fd2..528aa57eb3 100644
--- a/labs/docker/kurento/Dockerfile
+++ b/labs/docker/kurento/Dockerfile
@@ -17,12 +17,11 @@ RUN apt-get update \
 
 EXPOSE 8888
 
-COPY ./entrypoint.sh /entrypoint.sh
+COPY ./docker-entrypoint.sh /usr/local/bin/
 COPY ./healthchecker.sh /healthchecker.sh
 
 HEALTHCHECK --start-period=15s --interval=30s --timeout=3s --retries=1 CMD /healthchecker.sh
 
 ENV GST_DEBUG=Kurento*:5
 
-ENTRYPOINT ["/entrypoint.sh"]
-
+ENTRYPOINT ["docker-entrypoint.sh"]
diff --git a/labs/docker/kurento/docker-entrypoint.sh b/labs/docker/kurento/docker-entrypoint.sh
new file mode 100755
index 0000000000..c700df012b
--- /dev/null
+++ b/labs/docker/kurento/docker-entrypoint.sh
@@ -0,0 +1,21 @@
+#!/bin/bash -x
+set -e
+
+apt-get install -y openh264-gst-plugins-bad-1.5
+
+echo | tee /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
+
+if [ -n "$KMS_TURN_URL" ]; then
+  echo "turnURL=$KMS_TURN_URL" | tee -a /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
+fi
+
+if [ -n "$KMS_STUN_IP" -a -n "$KMS_STUN_PORT" ]; then
+  # Generate WebRtcEndpoint configuration
+  echo "stunServerAddress=$KMS_STUN_IP" | tee -a /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
+  echo "stunServerPort=$KMS_STUN_PORT" | tee -a /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
+fi
+
+# Remove ipv6 local loop until ipv6 is supported
+cat /etc/hosts | sed '/::1/d' | tee /etc/hosts > /dev/null
+
+exec /usr/bin/kurento-media-server "$@"
diff --git a/labs/docker/kurento/entrypoint.sh b/labs/docker/kurento/entrypoint.sh
deleted file mode 100755
index cacc90dc62..0000000000
--- a/labs/docker/kurento/entrypoint.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash -x
-set -e
-
-apt-get install -y openh264-gst-plugins-bad-1.5
-
-if [ -n "$KMS_TURN_URL" ]; then
-  echo "turnURL=$KMS_TURN_URL" > /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
-fi
-
-if [ -n "$KMS_STUN_IP" -a -n "$KMS_STUN_PORT" ]; then
-  # Generate WebRtcEndpoint configuration
-  echo "stunServerAddress=$KMS_STUN_IP" > /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
-  echo "stunServerPort=$KMS_STUN_PORT" >> /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
-fi
-
-# Remove ipv6 local loop until ipv6 is supported
-cat /etc/hosts | sed '/::1/d' | tee /etc/hosts > /dev/null
-
-exec /usr/bin/kurento-media-server "$@"
-
diff --git a/libreoffice.dockerfile b/labs/docker/libreoffice/Dockerfile
similarity index 57%
rename from libreoffice.dockerfile
rename to labs/docker/libreoffice/Dockerfile
index c02a5a138c..d86e888234 100644
--- a/libreoffice.dockerfile
+++ b/labs/docker/libreoffice/Dockerfile
@@ -5,9 +5,8 @@ ENV DEBIAN_FRONTEND noninteractive
 RUN apt-get update \
  && apt-get -y install libreoffice fonts-* hyphen-*
 
-EXPOSE 8100
+ENV PORT 8100
 
-COPY ./libreoffice-run.sh /libreoffice-run.sh
-
-CMD [ "/libreoffice-run.sh" ]
+COPY ./docker-entrypoint.sh /docker-entrypoint.sh
 
+CMD [ "./docker-entrypoint.sh" ]
diff --git a/labs/docker/libreoffice/docker-entrypoint.sh b/labs/docker/libreoffice/docker-entrypoint.sh
new file mode 100755
index 0000000000..e55c77c7a1
--- /dev/null
+++ b/labs/docker/libreoffice/docker-entrypoint.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+IP=$(hostname -I | cut -d' ' -f1)
+
+while : ; do
+    /usr/lib/libreoffice/program/soffice.bin --headless --nologo --nofirststartwizard "--accept=socket,host=${IP},port=${PORT};urp" --pidfile=/var/run/soffice.pid
+    EXIT_CODE=$?
+    [[ $EXIT_CODE == 81 ]] || break
+    echo "Exit code is $EXIT_CODE, restarting..."
+done
+
+    
diff --git a/labs/docker/nginx/.dockerfile b/labs/docker/nginx/.dockerfile
new file mode 100644
index 0000000000..94143827ed
--- /dev/null
+++ b/labs/docker/nginx/.dockerfile
@@ -0,0 +1 @@
+Dockerfile
diff --git a/labs/docker/nginx/Dockerfile b/labs/docker/nginx/Dockerfile
index b36d8fa8cb..5e87e99b36 100644
--- a/labs/docker/nginx/Dockerfile
+++ b/labs/docker/nginx/Dockerfile
@@ -1,6 +1,21 @@
 FROM nginx
 
-COPY ./nginx.conf /etc/nginx/nginx.conf
+RUN apt-get update && apt-get install -y wget
+
+ENV DOCKERIZE_VERSION v0.6.1
+RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+  && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+  && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
+
+COPY ./nginx.conf.tmpl /etc/nginx/nginx.conf.tmpl
 COPY ./config.xml /var/www/bigbluebutton/client/conf/config.xml
 
+RUN touch /var/log/nginx/error.log /var/log/nginx/access.log /var/log/nginx/bigbluebutton.access.log
+
+#  "-stdout", "/var/log/nginx/access.log", \
+#  "-stdout", "/var/log/nginx/bigbluebutton.access.log", \
+#  "-stderr", "/var/log/nginx/error.log", \
 
+CMD [ "dockerize", \
+  "-template", "/etc/nginx/nginx.conf.tmpl:/etc/nginx/nginx.conf", \
+  "nginx", "-g", "daemon off;" ]
diff --git a/labs/docker/nginx/nginx.conf b/labs/docker/nginx/nginx.conf.tmpl
similarity index 57%
rename from labs/docker/nginx/nginx.conf
rename to labs/docker/nginx/nginx.conf.tmpl
index 8cc5431620..590e2d93d6 100644
--- a/labs/docker/nginx/nginx.conf
+++ b/labs/docker/nginx/nginx.conf.tmpl
@@ -48,18 +48,18 @@ http {
     server {
         listen   80;
         listen [::]:80;
-        server_name felipe-docker.mconf.com;
+        server_name {{ .Env.SERVER_DOMAIN }};
         listen 443 ssl;
         listen [::]:443 ssl;
-        ssl_certificate /etc/letsencrypt/live/felipe-docker.mconf.com/fullchain.pem;
-        ssl_certificate_key /etc/letsencrypt/live/felipe-docker.mconf.com/privkey.pem;
+        ssl_certificate {{ .Env.SSL_CERT_PATH }};
+        ssl_certificate_key {{ .Env.SSL_KEY_PATH }};
         ssl_session_cache shared:SSL:10m;
         ssl_session_timeout 10m;
         # need TLSv1 for the Java calls for the API, otherwise it would be removed
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
         ssl_prefer_server_ciphers on;
-        ssl_dhparam /etc/nginx/ssl/dhp-2048.pem;
+        ssl_dhparam {{ .Env.SSL_DHPARAM_PATH }};
         ssl_ecdh_curve secp384r1;
         ssl_session_tickets off;
         ssl_stapling on;
@@ -68,42 +68,6 @@ http {
 
         access_log  /var/log/nginx/bigbluebutton.access.log;
 
-        # Handle RTMPT (RTMP Tunneling).  Forwards requests
-        # to Red5 on port 5080
-        location ~ (/open/|/close/|/idle/|/send/|/fcs/) {
-            proxy_pass     http://127.0.0.1:5080;
-            proxy_redirect     off;
-            proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
-
-            client_max_body_size       10m;
-            client_body_buffer_size    128k;
-
-            proxy_connect_timeout      90;
-            proxy_send_timeout     90;
-            proxy_read_timeout     90;
-
-            proxy_buffering    off;
-            keepalive_requests     1000000000;
-        }
-
-        # Handle desktop sharing tunneling.  Forwards
-        # requests to Red5 on port 5080.
-        location /deskshare {
-            proxy_pass     http://127.0.0.1:5080;
-            proxy_redirect     default;
-            proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
-            client_max_body_size       10m;
-            client_body_buffer_size    128k;
-            proxy_connect_timeout      90;
-            proxy_send_timeout     90;
-            proxy_read_timeout     90;
-            proxy_buffer_size      4k;
-            proxy_buffers      4 32k;
-            proxy_busy_buffers_size    64k;
-            proxy_temp_file_write_size 64k;
-            include    fastcgi_params;
-        }    
-
         # BigBlueButton landing page.
         location / {
             root   /var/www/bigbluebutton-default;
@@ -111,14 +75,6 @@ http {
             expires 1m;
         }
 
-        # BigBlueButton.html is here so we can expire it every 1 minute to
-        # prevent caching.
-        location /client/BigBlueButton.html {
-            root    /var/www/bigbluebutton;
-            index  index.html index.htm;
-            expires 1m;
-        }
-
         # BigBlueButton Flash client.
         location /client {
             root    /var/www/bigbluebutton;
@@ -139,26 +95,8 @@ http {
             index  index.html index.htm;
         }
 
-        # Handle desktop sharing tunneling.  Forwards
-        # requests to Red5 on port 5080.
-        location /screenshare {
-            proxy_pass     http://127.0.0.1:5080;
-            proxy_redirect     default;
-            proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
-            client_max_body_size       10m;
-            client_body_buffer_size    128k;
-            proxy_connect_timeout      90;
-            proxy_send_timeout     90;
-            proxy_read_timeout     90;
-            proxy_buffer_size      4k;
-            proxy_buffers      4 32k;
-            proxy_busy_buffers_size    64k;
-            proxy_temp_file_write_size 64k;
-            include    fastcgi_params;
-        }
-
         location /ws {
-            proxy_pass https://45.55.44.165:7443;
+            proxy_pass https://bbb-freeswitch:7443;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "Upgrade";
@@ -226,28 +164,28 @@ http {
             proxy_pass http://bbb-html5:3000;
         }
 
-        # Routes requests to Greenlight based on the '/b' prefix
-        location /b {
-            proxy_pass          http://greenlight:80;
-            proxy_set_header    Host              $host;
-            proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
-            proxy_set_header    X-Forwarded-Proto $scheme;
-            proxy_http_version  1.1;
-        }
-
-        location /b/cable {
-            proxy_pass          http://greenlight:80;
-            proxy_set_header    Host              $host;
-            proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
-            proxy_set_header    X-Forwarded-Proto $scheme;
-            proxy_set_header    Upgrade           $http_upgrade;
-            proxy_set_header    Connection        "Upgrade";
-            proxy_http_version  1.1;
-            proxy_read_timeout  6h;
-            proxy_send_timeout  6h;
-            client_body_timeout 6h;
-            send_timeout        6h;
-        }
+#        # Routes requests to Greenlight based on the '/b' prefix
+#        location /b {
+#            proxy_pass          http://greenlight:80;
+#            proxy_set_header    Host              $host;
+#            proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
+#            proxy_set_header    X-Forwarded-Proto $scheme;
+#            proxy_http_version  1.1;
+#        }
+#
+#        location /b/cable {
+#            proxy_pass          http://greenlight:80;
+#            proxy_set_header    Host              $host;
+#            proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
+#            proxy_set_header    X-Forwarded-Proto $scheme;
+#            proxy_set_header    Upgrade           $http_upgrade;
+#            proxy_set_header    Connection        "Upgrade";
+#            proxy_http_version  1.1;
+#            proxy_read_timeout  6h;
+#            proxy_send_timeout  6h;
+#            client_body_timeout 6h;
+#            send_timeout        6h;
+#        }
 
         # Redirect server error pages to the static page /50x.html
         #
diff --git a/labs/docker/sbt/Dockerfile b/labs/docker/sbt/Dockerfile
index 522324ccbc..99e285c61d 100644
--- a/labs/docker/sbt/Dockerfile
+++ b/labs/docker/sbt/Dockerfile
@@ -12,4 +12,3 @@ RUN curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_V
 RUN echo 'resolvers += "Artima Maven Repository" at "http://repo.artima.com/releases"' | tee -a ~/.sbt/0.13/global.sbt
 
 WORKDIR /root
-
diff --git a/libreoffice-run.sh b/libreoffice-run.sh
deleted file mode 100755
index f865abb737..0000000000
--- a/libreoffice-run.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash -e
-
-CONTAINER_IP=$(hostname -I)
-echo "Listening to $CONTAINER_IP"
-
-/usr/lib/libreoffice/program/soffice.bin --headless --nologo --nofirststartwizard "--accept=socket,host=$CONTAINER_IP,port=8100;urp" --pidfile=/var/run/soffice.pid
-
-- 
GitLab