diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6f841ba..9c0ff40 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -58,8 +58,8 @@
 #add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
 add_definitions(-DBOOST_ALL_NO_LIB)
 set(Boost_USE_STATIC_LIBS ON)
-hunter_add_package(Boost COMPONENTS system thread iostreams)
-find_package(Boost REQUIRED system thread iostreams REQUIRED)
+hunter_add_package(Boost COMPONENTS system thread)
+find_package(Boost REQUIRED system thread REQUIRED)
 
 #Openssl
 hunter_add_package(OpenSSL)
@@ -69,7 +69,6 @@
 
 #g3 logging
 # G3logger does some unfortunate compile options, so cheat a little bit and copy/paste
-
 set(LOG_SRC ${CMAKE_CURRENT_SOURCE_DIR}/g3log/src)
 
 file(GLOB_RECURSE SRC_FILES ${LOG_SRC}/*.cpp ${LOG_SRC}/*.ipp)
@@ -85,6 +84,12 @@
 include_directories(${LOG_SRC})
 
 add_library(g3logger ${SRC_FILES})
+if(("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang"))
+    set_source_files_properties(g3log/src/logcapture.cpp PROPERTIES COMPILE_FLAGS -Wno-braced-scalar-init)
+    set_source_files_properties(g3log/src/filesink.cpp PROPERTIES COMPILE_FLAGS -Wno-braced-scalar-init)
+    set_source_files_properties(g3log/src/logworker.cpp PROPERTIES COMPILE_FLAGS -Wno-braced-scalar-init)
+endif()
+
 set_target_properties(g3logger PROPERTIES
     LINKER_LANGUAGE CXX
     OUTPUT_NAME g3logger
@@ -97,8 +102,8 @@
 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/crow/include)
 
 #Zlib
-#hunter_add_package(ZLIB)
-#find_package(ZLIB REQUIRED)
+hunter_add_package(ZLIB)
+find_package(ZLIB REQUIRED)
 
 # C++ GSL (Guideline support libraries)
 include_directories(gsl-lite/include)
@@ -135,6 +140,20 @@
 )
 
 set(UT_FILES
+    g3log/test_unit/test_cpp_future_concepts.cpp   
+    g3log/test_unit/tester_sharedlib.cpp  
+    # TODO(ed) figure out why this unit test has a main function in it
+    #g3log/test_unit/test_filechange.cpp  
+    g3log/test_unit/testing_helpers.h  
+    #TODO(ed)
+    #g3log/test_unit/test_linux_dynamic_loaded_sharedlib.cpp  
+    #g3log/test_unit/test_sink.cpp
+    g3log/test_unit/test_concept_sink.cpp  
+    g3log/test_unit/test_crashhandler_windows.cpp  
+    g3log/test_unit/tester_sharedlib.h    
+    g3log/test_unit/testing_helpers.cpp  
+    g3log/test_unit/test_io.cpp        
+    g3log/test_unit/test_message.cpp
     src/crowtest/crow_unittest.cpp
     src/gtest_main.cpp
     src/base64_test.cpp
@@ -142,6 +161,7 @@
     src/security_headers_middleware_test.cpp
     src/webassets_test.cpp
     src/crow_getroutes_test.cpp
+
     ${CMAKE_BINARY_DIR}/generated/blns.hpp
 )
 
@@ -160,11 +180,11 @@
 
     add_executable(unittest ${HDR_FILES} ${SRC_FILES} ${UT_FILES})
     target_link_libraries(unittest ${GMOCK_BOTH_LIBRARIES})
-    target_link_libraries(unittest Boost::system Boost::thread Boost::iostreams) 
+    target_link_libraries(unittest Boost::system Boost::thread) 
     target_link_libraries(unittest ${CMAKE_THREAD_LIBS_INIT})
     target_link_libraries(unittest OpenSSL::SSL OpenSSL::Crypto)
     target_link_libraries(unittest g3logger)
-    #target_link_libraries(unittest zlib)
+    target_link_libraries(unittest ${ZLIB_LIBRARIES})
     add_dependencies(unittest packagestaticcpp)
 endif(${BUILD_UT})
 
diff --git a/crow/include/crow/websocket.h b/crow/include/crow/websocket.h
index ac22d67..c148c37 100644
--- a/crow/include/crow/websocket.h
+++ b/crow/include/crow/websocket.h
@@ -113,7 +113,7 @@
   }
 
  protected:
-  std::string build_header(int opcode, size_t size) {
+  std::string build_header(int opcode, uint64_t size) {
     char buf[2 + 8] = "\x80\x00";
     buf[0] += opcode;
     if (size < 126) {
@@ -138,7 +138,7 @@
         "HTTP/1.1 101 Switching Protocols\r\n"
         "Upgrade: websocket\r\n"
         "Connection: Upgrade\r\n"
-        "Sec-WebSocket-Protocol: binary\n"  // TODO(ed): this hardcodes binary.
+        "Sec-WebSocket-Protocol: binary\n"  // TODO(ed): this hardcodes binary mode
                                             // find a better way
         "Sec-WebSocket-Accept: ";
     static std::string crlf = "\r\n";
diff --git a/docs/profile.md b/docs/profile.md
index b6a0019..848b275 100644
--- a/docs/profile.md
+++ b/docs/profile.md
@@ -5,4 +5,8 @@
 scp ed@hades.jf.intel.com:/home/ed/gperftools/.libs/libprofiler.so /tmp
 
 echo 1 >> /sys/module/video_drv/parameters/debug
-echo 8 > /proc/sys/kernel/printk
\ No newline at end of file
+echo 8 > /proc/sys/kernel/printk
+
+
+
+scp ed@hades.jf.intel.com:/home/ed/webserver/buildarm/getvideo /tmp -i /nv/.ssh/id_rsa && ./getvideo && scp screen.jpg ed@hades.jf.intel.com:~/screen.foo -i /nv/.ssh/id_rsa
\ No newline at end of file
diff --git a/g3log b/g3log
index a48a486..9f9062f 160000
--- a/g3log
+++ b/g3log
@@ -1 +1 @@
-Subproject commit a48a4860fd6acd94ef1bf66f398b7a8c6e096290
+Subproject commit 9f9062f45fa4cef05909b675ca5a9b82935c6869
diff --git a/include/crow/bmc_app_type.hpp b/include/crow/bmc_app_type.hpp
deleted file mode 100644
index 061143b..0000000
--- a/include/crow/bmc_app_type.hpp
+++ /dev/null
@@ -1,7 +0,0 @@
-#pragma once
-
-#include <crow/app.h>
-#include <token_authorization_middleware.hpp>
-#include <security_headers_middleware.hpp>
-
-using BmcAppType = crow::App<crow::TokenAuthorizationMiddleware, crow::SecurityHeadersMiddleware>;
\ No newline at end of file
diff --git a/include/g3log/generated_definitions.hpp b/include/g3log/generated_definitions.hpp
new file mode 100644
index 0000000..18433bb
--- /dev/null
+++ b/include/g3log/generated_definitions.hpp
@@ -0,0 +1,13 @@
+// AUTO GENERATED MACRO DEFINITIONS FOR G3LOG
+
+/** ==========================================================================
+* 2015 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
+* with no warranties. This code is yours to share, use and modify with no
+* strings attached and no restrictions or obligations.
+* 
+* For more information see g3log/LICENSE or refer refer to http://unlicense.org
+* ============================================================================*/
+#pragma once
+
+// CMake induced definitions below. See g3log/Options.cmake for details.
+
diff --git a/include/web_kvm.hpp b/include/web_kvm.hpp
index 65fe812..40c5128 100644
--- a/include/web_kvm.hpp
+++ b/include/web_kvm.hpp
@@ -1,8 +1,7 @@
+#include <crow/app.h>
 #include <boost/endian/arithmetic.hpp>
 #include <string>
 
-#include <crow/bmc_app_type.hpp>
-
 #include <video.h>
 
 namespace crow {
@@ -176,7 +175,8 @@
 
 connection_metadata meta;
 
-void request_routes(BmcAppType& app) {
+template <typename... Middlewares>
+void request_routes(Crow<Middlewares...>& app) {
   CROW_ROUTE(app, "/kvmws")
       .websocket()
       .onopen([&](crow::websocket::connection& conn) {
diff --git a/scripts/build_web_assets.py b/scripts/build_web_assets.py
index d820c5a..bb55694 100755
--- a/scripts/build_web_assets.py
+++ b/scripts/build_web_assets.py
@@ -215,7 +215,6 @@
                          "#include <crow/http_response.h>\n"
                          "\n"
                          "#include <crow/routing.h>\n"
-                         "#include <crow/bmc_app_type.hpp>\n"
                          "\n"
                          "namespace crow {\n"
                          "namespace webassets {\n"
diff --git a/scripts/run_clang_tidy.py b/scripts/run_clang_tidy.py
new file mode 100755
index 0000000..c42463b
--- /dev/null
+++ b/scripts/run_clang_tidy.py
@@ -0,0 +1,218 @@
+#!/usr/bin/env python3
+#
+# ===- run-clang-tidy.py - Parallel clang-tidy runner ---------*- python -*--===#
+#
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+# ===------------------------------------------------------------------------===#
+# FIXME: Integrate with clang-tidy-diff.py
+
+"""
+Parallel clang-tidy runner
+==========================
+
+Runs clang-tidy over all files in a compilation database. Requires clang-tidy
+and clang-apply-replacements in $PATH.
+
+Example invocations.
+- Run clang-tidy on all files in the current working directory with a default
+  set of checks and show warnings in the cpp files and all project headers.
+    run-clang-tidy.py $PWD
+
+- Fix all header guards.
+    run-clang-tidy.py -fix -checks=-*,llvm-header-guard
+
+- Fix all header guards included from clang-tidy and header guards
+  for clang-tidy headers.
+    run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \
+                      -header-filter=extra/clang-tidy
+
+Compilation database setup:
+http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
+"""
+
+import argparse
+import json
+import multiprocessing
+import os
+import queue
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+import threading
+
+
+def find_compilation_database(path):
+    """Adjusts the directory until a compilation database is found."""
+    result = './'
+    while not os.path.isfile(os.path.join(result, path)):
+        if os.path.realpath(result) == '/':
+            print('Error: could not find compilation database.')
+            sys.exit(1)
+        result += '../'
+    return os.path.realpath(result)
+
+
+def get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,
+                        header_filter, extra_arg, extra_arg_before, quiet):
+    """Gets a command line for clang-tidy."""
+    start = [clang_tidy_binary]
+    if header_filter is not None:
+        start.append('-header-filter=' + header_filter)
+    else:
+        # Show warnings in all in-project headers by default.
+        start.append('-header-filter=^' + build_path + '/.*')
+    if checks:
+        start.append('-checks=' + checks)
+    if tmpdir is not None:
+        start.append('-export-fixes')
+        # Get a temporary file. We immediately close the handle so clang-tidy can
+        # overwrite it.
+        (handle, name) = tempfile.mkstemp(suffix='.yaml', dir=tmpdir)
+        os.close(handle)
+        start.append(name)
+    for arg in extra_arg:
+        start.append('-extra-arg=%s' % arg)
+    for arg in extra_arg_before:
+        start.append('-extra-arg-before=%s' % arg)
+    start.append('-p=' + build_path)
+    if quiet:
+        start.append('-quiet')
+    start.append(f)
+    return start
+
+
+def apply_fixes(args, tmpdir):
+    """Calls clang-apply-fixes on a given directory. Deletes the dir when done."""
+    invocation = [args.clang_apply_replacements_binary]
+    if args.format:
+        invocation.append('-format')
+    invocation.append(tmpdir)
+    subprocess.call(invocation)
+    shutil.rmtree(tmpdir)
+
+
+def run_tidy(args, tmpdir, build_path, this_queue):
+    """Takes filenames out of queue and runs clang-tidy on them."""
+    while True:
+        name = this_queue.get()
+        invocation = get_tidy_invocation(
+            name, args.clang_tidy_binary, args.checks,
+                                         tmpdir, build_path, args.header_filter,
+                                         args.extra_arg, args.extra_arg_before,
+                                         args.quiet)
+        sys.stdout.write(' '.join(invocation) + '\n')
+        subprocess.call(invocation)
+        this_queue.task_done()
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Runs clang-tidy over all files '
+                                     'in a compilation database. Requires '
+                                     'clang-tidy and clang-apply-replacements in '
+                                     '$PATH.')
+    parser.add_argument('-clang-tidy-binary', metavar='PATH',
+                        default='clang-tidy',
+                        help='path to clang-tidy binary')
+    parser.add_argument('-clang-apply-replacements-binary', metavar='PATH',
+                        default='clang-apply-replacements',
+                        help='path to clang-apply-replacements binary')
+    parser.add_argument('-checks', default=None,
+                        help='checks filter, when not specified, use clang-tidy '
+                        'default')
+    parser.add_argument('-header-filter', default=None,
+                        help='regular expression matching the names of the '
+                        'headers to output diagnostics from. Diagnostics from '
+                        'the main file of each translation unit are always '
+                        'displayed.')
+    parser.add_argument('-j', type=int, default=0,
+                        help='number of tidy instances to be run in parallel.')
+    parser.add_argument('files', nargs='*', default=['.*'],
+                        help='files to be processed (regex on path)')
+    parser.add_argument('-fix', action='store_true', help='apply fix-its')
+    parser.add_argument('-format', action='store_true', help='Reformat code '
+                        'after applying fixes')
+    parser.add_argument('-p', dest='build_path',
+                        help='Path used to read a compile command database.')
+    parser.add_argument('-extra-arg', dest='extra_arg',
+                        action='append', default=[],
+                        help='Additional argument to append to the compiler '
+                        'command line.')
+    parser.add_argument('-extra-arg-before', dest='extra_arg_before',
+                        action='append', default=[],
+                        help='Additional argument to prepend to the compiler '
+                        'command line.')
+    parser.add_argument('-quiet', action='store_true',
+                        help='Run clang-tidy in quiet mode')
+    args = parser.parse_args()
+
+    db_path = 'compile_commands.json'
+
+    if args.build_path is not None:
+        build_path = args.build_path
+    else:
+        # Find our database
+        build_path = find_compilation_database(db_path)
+
+    try:
+        invocation = [args.clang_tidy_binary, '-list-checks']
+        invocation.append('-p=' + build_path)
+        if args.checks:
+            invocation.append('-checks=' + args.checks)
+        invocation.append('-')
+        print(subprocess.check_output(invocation))
+    except:
+        print("Unable to run clang-tidy.", file=sys.stderr)
+        sys.exit(1)
+
+    # Load the database and extract all files.
+    database = json.load(open(os.path.join(build_path, db_path)))
+    files = [entry['file'] for entry in database]
+
+    max_task = args.j
+    if max_task == 0:
+        max_task = multiprocessing.cpu_count()
+
+    tmpdir = None
+    if args.fix:
+        tmpdir = tempfile.mkdtemp()
+
+    # Build up a big regexy filter from all command line arguments.
+    file_name_re = re.compile('|'.join(args.files))
+
+    try:
+        # Spin up a bunch of tidy-launching threads.
+        this_queue = queue.Queue(max_task)
+        for _ in range(max_task):
+            t = threading.Thread(target=run_tidy,
+                                 args=(args, tmpdir, build_path, this_queue))
+            t.daemon = True
+            t.start()
+
+        # Fill the queue with files.
+        for name in files:
+            if file_name_re.search(name):
+                this_queue.put(name)
+
+        # Wait for all threads to be done.
+        this_queue.join()
+
+    except KeyboardInterrupt:
+        # This is a sad hack. Unfortunately subprocess goes
+        # bonkers with ctrl-c and we start forking merrily.
+        print('\nCtrl-C detected, goodbye.')
+        if args.fix:
+            shutil.rmtree(tmpdir)
+        os.kill(0, 9)
+
+    if args.fix:
+        print('Applying fixes ...')
+        apply_fixes(args, tmpdir)
+
+if __name__ == '__main__':
+    main()
diff --git a/scripts/run_clang_tidy.py.bak b/scripts/run_clang_tidy.py.bak
new file mode 100644
index 0000000..b45d714
--- /dev/null
+++ b/scripts/run_clang_tidy.py.bak
@@ -0,0 +1,217 @@
+#!/usr/bin/env python
+#
+#===- run-clang-tidy.py - Parallel clang-tidy runner ---------*- python -*--===#
+#
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+#===------------------------------------------------------------------------===#
+# FIXME: Integrate with clang-tidy-diff.py
+
+"""
+Parallel clang-tidy runner
+==========================
+
+Runs clang-tidy over all files in a compilation database. Requires clang-tidy
+and clang-apply-replacements in $PATH.
+
+Example invocations.
+- Run clang-tidy on all files in the current working directory with a default
+  set of checks and show warnings in the cpp files and all project headers.
+    run-clang-tidy.py $PWD
+
+- Fix all header guards.
+    run-clang-tidy.py -fix -checks=-*,llvm-header-guard
+
+- Fix all header guards included from clang-tidy and header guards
+  for clang-tidy headers.
+    run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \
+                      -header-filter=extra/clang-tidy
+
+Compilation database setup:
+http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
+"""
+
+import argparse
+import json
+import multiprocessing
+import os
+import Queue
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+import threading
+
+
+def find_compilation_database(path):
+  """Adjusts the directory until a compilation database is found."""
+  result = './'
+  while not os.path.isfile(os.path.join(result, path)):
+    if os.path.realpath(result) == '/':
+      print 'Error: could not find compilation database.'
+      sys.exit(1)
+    result += '../'
+  return os.path.realpath(result)
+
+
+def get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,
+                        header_filter, extra_arg, extra_arg_before, quiet):
+  """Gets a command line for clang-tidy."""
+  start = [clang_tidy_binary]
+  if header_filter is not None:
+    start.append('-header-filter=' + header_filter)
+  else:
+    # Show warnings in all in-project headers by default.
+    start.append('-header-filter=^' + build_path + '/.*')
+  if checks:
+    start.append('-checks=' + checks)
+  if tmpdir is not None:
+    start.append('-export-fixes')
+    # Get a temporary file. We immediately close the handle so clang-tidy can
+    # overwrite it.
+    (handle, name) = tempfile.mkstemp(suffix='.yaml', dir=tmpdir)
+    os.close(handle)
+    start.append(name)
+  for arg in extra_arg:
+      start.append('-extra-arg=%s' % arg)
+  for arg in extra_arg_before:
+      start.append('-extra-arg-before=%s' % arg)
+  start.append('-p=' + build_path)
+  if quiet:
+      start.append('-quiet')
+  start.append(f)
+  return start
+
+
+def apply_fixes(args, tmpdir):
+  """Calls clang-apply-fixes on a given directory. Deletes the dir when done."""
+  invocation = [args.clang_apply_replacements_binary]
+  if args.format:
+    invocation.append('-format')
+  invocation.append(tmpdir)
+  subprocess.call(invocation)
+  shutil.rmtree(tmpdir)
+
+
+def run_tidy(args, tmpdir, build_path, queue):
+  """Takes filenames out of queue and runs clang-tidy on them."""
+  while True:
+    name = queue.get()
+    invocation = get_tidy_invocation(name, args.clang_tidy_binary, args.checks,
+                                     tmpdir, build_path, args.header_filter,
+                                     args.extra_arg, args.extra_arg_before,
+                                     args.quiet)
+    sys.stdout.write(' '.join(invocation) + '\n')
+    subprocess.call(invocation)
+    queue.task_done()
+
+
+def main():
+  parser = argparse.ArgumentParser(description='Runs clang-tidy over all files '
+                                   'in a compilation database. Requires '
+                                   'clang-tidy and clang-apply-replacements in '
+                                   '$PATH.')
+  parser.add_argument('-clang-tidy-binary', metavar='PATH',
+                      default='clang-tidy',
+                      help='path to clang-tidy binary')
+  parser.add_argument('-clang-apply-replacements-binary', metavar='PATH',
+                      default='clang-apply-replacements',
+                      help='path to clang-apply-replacements binary')
+  parser.add_argument('-checks', default=None,
+                      help='checks filter, when not specified, use clang-tidy '
+                      'default')
+  parser.add_argument('-header-filter', default=None,
+                      help='regular expression matching the names of the '
+                      'headers to output diagnostics from. Diagnostics from '
+                      'the main file of each translation unit are always '
+                      'displayed.')
+  parser.add_argument('-j', type=int, default=0,
+                      help='number of tidy instances to be run in parallel.')
+  parser.add_argument('files', nargs='*', default=['.*'],
+                      help='files to be processed (regex on path)')
+  parser.add_argument('-fix', action='store_true', help='apply fix-its')
+  parser.add_argument('-format', action='store_true', help='Reformat code '
+                      'after applying fixes')
+  parser.add_argument('-p', dest='build_path',
+                      help='Path used to read a compile command database.')
+  parser.add_argument('-extra-arg', dest='extra_arg',
+                      action='append', default=[],
+                      help='Additional argument to append to the compiler '
+                      'command line.')
+  parser.add_argument('-extra-arg-before', dest='extra_arg_before',
+                      action='append', default=[],
+                      help='Additional argument to prepend to the compiler '
+                      'command line.')
+  parser.add_argument('-quiet', action='store_true',
+                      help='Run clang-tidy in quiet mode')
+  args = parser.parse_args()
+
+  db_path = 'compile_commands.json'
+
+  if args.build_path is not None:
+    build_path = args.build_path
+  else:
+    # Find our database
+    build_path = find_compilation_database(db_path)
+
+  try:
+    invocation = [args.clang_tidy_binary, '-list-checks']
+    invocation.append('-p=' + build_path)
+    if args.checks:
+      invocation.append('-checks=' + args.checks)
+    invocation.append('-')
+    print subprocess.check_output(invocation)
+  except:
+    print >>sys.stderr, "Unable to run clang-tidy."
+    sys.exit(1)
+
+  # Load the database and extract all files.
+  database = json.load(open(os.path.join(build_path, db_path)))
+  files = [entry['file'] for entry in database]
+
+  max_task = args.j
+  if max_task == 0:
+    max_task = multiprocessing.cpu_count()
+
+  tmpdir = None
+  if args.fix:
+    tmpdir = tempfile.mkdtemp()
+
+  # Build up a big regexy filter from all command line arguments.
+  file_name_re = re.compile('|'.join(args.files))
+
+  try:
+    # Spin up a bunch of tidy-launching threads.
+    queue = Queue.Queue(max_task)
+    for _ in range(max_task):
+      t = threading.Thread(target=run_tidy,
+                           args=(args, tmpdir, build_path, queue))
+      t.daemon = True
+      t.start()
+
+    # Fill the queue with files.
+    for name in files:
+      if file_name_re.search(name):
+        queue.put(name)
+
+    # Wait for all threads to be done.
+    queue.join()
+
+  except KeyboardInterrupt:
+    # This is a sad hack. Unfortunately subprocess goes
+    # bonkers with ctrl-c and we start forking merrily.
+    print '\nCtrl-C detected, goodbye.'
+    if args.fix:
+      shutil.rmtree(tmpdir)
+    os.kill(0, 9)
+
+  if args.fix:
+    print 'Applying fixes ...'
+    apply_fixes(args, tmpdir)
+
+if __name__ == '__main__':
+  main()
\ No newline at end of file
diff --git a/src/g3log/generated_definitions.hpp b/src/g3log/generated_definitions.hpp
new file mode 100644
index 0000000..18433bb
--- /dev/null
+++ b/src/g3log/generated_definitions.hpp
@@ -0,0 +1,13 @@
+// AUTO GENERATED MACRO DEFINITIONS FOR G3LOG
+
+/** ==========================================================================
+* 2015 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
+* with no warranties. This code is yours to share, use and modify with no
+* strings attached and no restrictions or obligations.
+* 
+* For more information see g3log/LICENSE or refer refer to http://unlicense.org
+* ============================================================================*/
+#pragma once
+
+// CMake induced definitions below. See g3log/Options.cmake for details.
+
diff --git a/src/getvideo_main.cpp b/src/getvideo_main.cpp
index 2259b8c..182e8ad 100644
--- a/src/getvideo_main.cpp
+++ b/src/getvideo_main.cpp
@@ -39,14 +39,14 @@
     std::cout << "Writing\n";
     
     int status;
-    /*
+    
     status = write(video_fd, reinterpret_cast<char*>(&image_info),
                         sizeof(image_info));
     if (status != 0) {
       std::cout << "Write failed.  Return: " << status <<"\n";
       perror("perror output:");
     }
-    */
+    
     std::cout << "Write done\n";
     //std::this_thread::sleep_for(std::chrono::milliseconds(2000));
     
@@ -64,8 +64,9 @@
       std::cout << std::hex << std::setfill('0') << std::setw(2)
                 << int(*(pt + i)) << " ";
     }
-    std::cout << "\n";
-    /*
+    
+    std::cout << "\nprinting buffer\n";
+    
     for(int i = 0; i < 1024; i++){
         if (i % 16 == 0){
           std::cout << "\n";
@@ -73,7 +74,7 @@
         std::cout << std::hex << std::setfill('0') << std::setw(2)
             << int(buffer[i]) << " ";
     }
-    */
+    
     buffer.resize(image_info.len);
     
     std::ofstream f("/tmp/screen.jpg",std::ios::out | std::ios::binary); 
diff --git a/src/security_headers_middleware_test.cpp b/src/security_headers_middleware_test.cpp
index 2364ab5..fc183e9 100644
--- a/src/security_headers_middleware_test.cpp
+++ b/src/security_headers_middleware_test.cpp
@@ -40,13 +40,13 @@
   c.connect(asio::ip::tcp::endpoint(asio::ip::address::from_string("127.0.0.1"),
                                     45451));
   c.send(asio::buffer(sendmsg));
-  auto received_count = c.receive(asio::buffer(buf));
+  c.receive(asio::buffer(buf));
   c.close();
   auto return_code = std::string(&buf[9], &buf[12]);
   EXPECT_EQ("200", return_code);
   std::string response(std::begin(buf), std::end(buf));
 
-  // This is a routine to split strings until a newline is hit
+  // This is a routine to split strings until a blank is hit
   // TODO(ed) this should really use the HTTP parser
   std::vector<std::string> headers;
   std::string::size_type pos = 0;
diff --git a/src/token_authorization_middleware_test.cpp b/src/token_authorization_middleware_test.cpp
index 68efe8f..00eed2f 100644
--- a/src/token_authorization_middleware_test.cpp
+++ b/src/token_authorization_middleware_test.cpp
@@ -24,7 +24,7 @@
     c.connect(asio::ip::tcp::endpoint(
         asio::ip::address::from_string("127.0.0.1"), 45451));
     c.send(asio::buffer(sendmsg));
-    auto received_count = c.receive(asio::buffer(buf, 2048));
+    c.receive(asio::buffer(buf, 2048));
     c.close();
     EXPECT_EQ("200", std::string(buf + 9, buf + 12));
   }
@@ -66,7 +66,7 @@
     }
   }
   c.send(asio::buffer(sendmsg));
-  auto received_count = c.receive(asio::buffer(buf, 2048));
+  c.receive(asio::buffer(buf, 2048));
   c.close();
   EXPECT_EQ("401", std::string(buf + 9, buf + 12));
 
@@ -95,7 +95,7 @@
     }
   }
   c.send(asio::buffer(sendmsg));
-  auto received_count = c.receive(asio::buffer(buf, 2048));
+  c.receive(asio::buffer(buf, 2048));
   c.close();
   EXPECT_EQ("401", std::string(buf + 9, buf + 12));
 
@@ -118,7 +118,7 @@
     c.connect(asio::ip::tcp::endpoint(
         asio::ip::address::from_string("127.0.0.1"), 45451));
     c.send(asio::buffer(sendmsg));
-    auto received_count = c.receive(asio::buffer(buf));
+    c.receive(asio::buffer(buf));
     c.close();
   };
 
@@ -193,7 +193,7 @@
     c.connect(asio::ip::tcp::endpoint(
         asio::ip::address::from_string("127.0.0.1"), 45451));
     c.send(asio::buffer(sendmsg));
-    auto received_count = c.receive(asio::buffer(buf));
+    c.receive(asio::buffer(buf));
     c.close();
   };
 
diff --git a/src/udpclient.cpp b/src/udpclient.cpp
index 772739b..cf9f3d1 100644
--- a/src/udpclient.cpp
+++ b/src/udpclient.cpp
@@ -85,7 +85,7 @@
     udp::endpoint sender_endpoint;
     size_t len =
         socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);
-
+    std::cout << len;
     for (auto character : recv_buf) {
       std::cout << std::hex << static_cast<unsigned>(character) << " ";
     }
diff --git a/src/webassets_test.cpp b/src/webassets_test.cpp
index 2157f03..8d0cfef 100644
--- a/src/webassets_test.cpp
+++ b/src/webassets_test.cpp
@@ -186,7 +186,6 @@
   while ((pos = response.find("\r\n", prev)) != std::string::npos) {
     auto this_string = response.substr(prev, pos - prev);
     if (this_string == "") {
-      prev = pos + 2;
       break;
     }
 
diff --git a/src/webserver_main.cpp b/src/webserver_main.cpp
index cf8500f..949bdc1 100644
--- a/src/webserver_main.cpp
+++ b/src/webserver_main.cpp
@@ -1,9 +1,7 @@
-#include <webassets.hpp>
 #include <web_kvm.hpp>
+#include <webassets.hpp>
 #include "ssl_key_handler.hpp"
 
-#include <crow/bmc_app_type.hpp>
-
 #include "crow/app.h"
 #include "crow/ci_map.h"
 #include "crow/common.h"
@@ -26,15 +24,15 @@
 #include "crow/utility.h"
 #include "crow/websocket.h"
 
-
 #include "color_cout_g3_sink.hpp"
 #include "webassets.hpp"
 
+#include "security_headers_middleware.hpp"
+#include "token_authorization_middleware.hpp"
 
 #include <boost/asio.hpp>
 #include <boost/endian/arithmetic.hpp>
 
-
 #include <iostream>
 #include <memory>
 #include <string>
@@ -52,13 +50,13 @@
   std::string ssl_pem_file("server.pem");
   ensuressl::ensure_openssl_key_present_and_valid(ssl_pem_file);
 
-  BmcAppType app;
+  crow::App<crow::TokenAuthorizationMiddleware, crow::SecurityHeadersMiddleware>
+      app;
 
   crow::webassets::request_routes(app);
   crow::kvm::request_routes(app);
 
   crow::logger::setLogLevel(crow::LogLevel::INFO);
-  app.debug_print();
   CROW_ROUTE(app, "/systeminfo")
   ([]() {
 
@@ -112,7 +110,7 @@
         size_t len =
             socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);
         // TODO(ed) THis is ugly.  Find a way to not make a copy (ie, use
-        // std::string::data() to 
+        // std::string::data() to
         std::string str(std::begin(recv_buf), std::end(recv_buf));
         LOG(DEBUG) << "Got " << str << "back \n";
         conn.send_binary(str);
diff --git a/static/js/angular-ui-router.js b/static/js/angular-ui-router.js
index d977aa9..e8f5787 100644
--- a/static/js/angular-ui-router.js
+++ b/static/js/angular-ui-router.js
@@ -1003,7 +1003,7 @@
     if (isDefined(paramVal)) paramVal = param.type.decode(paramVal);
     values[paramName] = param.value(paramVal);
   }
-  for (/**/; i < nTotal; i++) {
+  for (; i < nTotal; i++) {
     paramName = paramNames[i];
     values[paramName] = this.params[paramName].value(searchParams[paramName]);
     param = this.params[paramName];
