diff --git a/vision/PacketNotifier.cpp b/vision/PacketNotifier.cpp
new file mode 100644
index 0000000..ca62f5f
--- /dev/null
+++ b/vision/PacketNotifier.cpp
@@ -0,0 +1,78 @@
+#include "vision/PacketNotifier.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <string.h>
+
+namespace frc971 {
+namespace vision {
+	
+void PacketNotifier::RegisterSender(){
+	close(fd[1]);
+}
+void PacketNotifier::RegisterReciever(){
+	close(fd[0]);
+}
+PacketNotifier *PacketNotifier::MMap(size_t data_size){
+	PacketNotifier *data;
+	data = (PacketNotifier *)mmap(NULL, ((data_size * 3 + 4095 + sizeof(PacketNotifier)) / 4096) * 4096, 
+			PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+	data->data_size = data_size;
+	socketpair(PF_LOCAL, SOCK_STREAM, 0, data->fd);
+	for(int i = 0;i < 3;i++){
+		data->buffs[i] = (uint8_t *)data + (sizeof(PacketNotifier) + i * data_size);
+	}
+	void *place = &(data->mutex);
+	*((int *)place) = 0; // The Mutex class needs a placement new operator. (you know, keep the masses happy);
+	data->in_flight = false;
+	data->to_send = -1;
+	data->sending = -1;
+	return data;
+}
+void *PacketNotifier::GetBuffer(){
+	mutex.Lock();
+	for(int i = 0; i < 3 ; i++){ //search for open spot.
+		if(i != sending && i != to_send){ //open
+			filling = i;
+			mutex.Unlock();
+			printf("leasing out to fill buff # %d\n",i);
+			return buffs[i];
+		}
+	}
+	mutex.Unlock();
+	printf("Error in the fabric of the universe\n");
+	exit(-42);
+}
+void PacketNotifier::Notify(){
+	mutex.Lock();
+	to_send = filling;
+	filling = -1;
+	mutex.Unlock();
+	// wall error
+	if(write(fd[0],"\n",1)) {}
+}
+
+void PacketNotifier::DataSent(const void * /*data*/, size_t /*datalen*/){
+	printf("packet_sent: %d; fill: %d; to_send: %d \n",sending,filling,to_send);
+	mutex.Lock();
+	sending = -1;
+	mutex.Unlock();
+	in_flight = false;
+}
+bool PacketNotifier::GetData(char **place_to_put,size_t *length){
+	if(in_flight) return false;
+	mutex.Lock();
+	*length = data_size;
+	*place_to_put = (char *)buffs[to_send];
+	sending = to_send;
+	to_send = -1;
+	mutex.Unlock();
+	in_flight = true;
+	return true;
+}
+
+}  // namespace vision
+}  // namespace frc971
+
