diff --git a/vision/BinaryServer.cpp b/vision/BinaryServer.cpp
index 29deee9..18cf85b 100644
--- a/vision/BinaryServer.cpp
+++ b/vision/BinaryServer.cpp
@@ -18,7 +18,7 @@
 namespace frc971 {
 namespace vision {
 
-static void echo_read_cb(struct bufferevent *bev, void * /*ctx*/){
+static void echo_read_cb(struct bufferevent *bev, void * /*ctx*/) {
   struct evbuffer *input = bufferevent_get_input(bev);
   struct evbuffer *output = bufferevent_get_output(bev);
 
@@ -32,94 +32,98 @@
   evbuffer_add_buffer(output, input);
 }
 
-void BinaryServer::ErrorEvent(struct bufferevent *bev, short events){
-  if (events & BEV_EVENT_ERROR)
-    perror("Error from bufferevent");
+void BinaryServer::ErrorEvent(struct bufferevent *bev, short events) {
+  if (events & BEV_EVENT_ERROR) perror("Error from bufferevent");
   if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
     have_id = false;
     bufferevent_free(bev);
   }
 }
 
-void BinaryServer::Accept(struct evconnlistener *listener,
-    evutil_socket_t fd, struct sockaddr * /*address*/, int /*socklen*/){
+void BinaryServer::Accept(struct evconnlistener *listener, evutil_socket_t fd,
+                          struct sockaddr * /*address*/, int /*socklen*/) {
   struct event_base *base = evconnlistener_get_base(listener);
-  if(!have_id){
-    struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
+  if (!have_id) {
+    struct bufferevent *bev =
+        bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
     _output = bufferevent_get_output(bev);
     _bufev = bev;
     have_id = true;
     int no_delay_flag = 1;
-    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &no_delay_flag,  sizeof(no_delay_flag));
+    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &no_delay_flag,
+               sizeof(no_delay_flag));
 
     bufferevent_setcb(bev, echo_read_cb, NULL, StaticErrorEvent, this);
 
     bufferevent_enable(bev, EV_READ | EV_WRITE);
   }
 }
-static void accept_error_cb(struct evconnlistener *listener, void * /*ctx*/)
-{
+static void accept_error_cb(struct evconnlistener *listener, void * /*ctx*/) {
   struct event_base *base = evconnlistener_get_base(listener);
   int err = EVUTIL_SOCKET_ERROR();
   fprintf(stderr, "Got an error %d (%s) on the listener. "
-      "Shutting down.\n", err, evutil_socket_error_to_string(err));
+                  "Shutting down.\n",
+          err, evutil_socket_error_to_string(err));
 
   event_base_loopexit(base, NULL);
 }
 
-void BinaryServer::StartServer(uint16_t port){
+void BinaryServer::StartServer(uint16_t port) {
   _fd = socket(AF_INET, SOCK_STREAM, 0);
   struct sockaddr_in sin;
   memset(&sin, 0, sizeof(sin));
   sin.sin_family = AF_INET;
-  sin.sin_port = htons( port );
+  sin.sin_port = htons(port);
   sin.sin_addr.s_addr = inet_addr("0.0.0.0");
 
-  listener = evconnlistener_new_bind(_base, StaticAccept, this,
-      LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
-      (struct sockaddr *) (void *)&sin, sizeof(sin));
+  listener = evconnlistener_new_bind(
+      _base, StaticAccept, this, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
+      (struct sockaddr *)(void *)&sin, sizeof(sin));
 
   if (!listener) {
-    fprintf(stderr,"%s:%d: Couldn't create listener\n", __FILE__, __LINE__);
+    fprintf(stderr, "%s:%d: Couldn't create listener\n", __FILE__, __LINE__);
     exit(-1);
   }
 
   evconnlistener_set_error_cb(listener, accept_error_cb);
 }
 
-void BinaryServer::Notify(int fd,short /*what*/){
+void BinaryServer::Notify(int fd, short /*what*/) {
   char notes[4096];
-  int count = read(fd,notes,4096);
-  if(count == 0){
+  int count = read(fd, notes, 4096);
+  if (count == 0) {
     close(fd);
-    fprintf(stderr,"%s:%d: Error No cheeze from OpenCV task!!!\n",__FILE__,__LINE__);
+    fprintf(stderr, "%s:%d: Error No cheeze from OpenCV task!!!\n", __FILE__,
+            __LINE__);
     exit(-1);
   }
-  printf("notified!: %d\n",count);
-  if(have_id){
+  printf("notified!: %d\n", count);
+  if (have_id) {
     printf("got someone to read my stuff!\n");
     char *binary_data;
     size_t len;
-    if(_notify->GetData(&binary_data,&len)){
+    if (_notify->GetData(&binary_data, &len)) {
       printf("here is for sending\n");
-      evbuffer_add_reference(_output, binary_data, len, PacketNotifier::StaticDataSent,_notify);
-      printf("this is how sending went %d\n",bufferevent_flush(_bufev,EV_WRITE, BEV_FLUSH));
+      evbuffer_add_reference(_output, binary_data, len,
+                             PacketNotifier::StaticDataSent, _notify);
+      printf("this is how sending went %d\n",
+             bufferevent_flush(_bufev, EV_WRITE, BEV_FLUSH));
     }
   }
 }
 
-//Constructor
-BinaryServer::BinaryServer(uint16_t port, 
-    frc971::vision::PacketNotifier *notify) :
-  _base(event_base_new()) {
-    have_id = false;
-    StartServer(port);
-    _notify = notify;
-    frame_notify = event_new(_base, notify->RecieverFD(), 
-        EV_READ|EV_PERSIST, StaticNotify, this);
-    event_add(frame_notify,NULL);
-    event_base_dispatch(_base);
-  }
+// Constructor
+BinaryServer::BinaryServer(uint16_t port,
+                           frc971::vision::PacketNotifier *notify)
+    : _base(event_base_new()) {
+  have_id = false;
+  StartServer(port);
+  _notify = notify;
+  frame_notify = event_new(_base, notify->RecieverFD(), EV_READ | EV_PERSIST,
+                           StaticNotify, this);
+  event_add(frame_notify, NULL);
+  event_base_dispatch(_base);
+}
 
 }  // namespace vision
 }  // namespace frc971
