diff --git a/groundStation/gui/MicroCART/MicroCART.pro b/groundStation/gui/MicroCART/MicroCART.pro
index 7bcc5c3748235674e09ec499d8dc0d2552a006a2..ba492f24e8855bb21479bf8986edfff51ecf9097 100644
--- a/groundStation/gui/MicroCART/MicroCART.pro
+++ b/groundStation/gui/MicroCART/MicroCART.pro
@@ -11,6 +11,8 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 TARGET = MicroCART
 TEMPLATE = app
 
+LIBS += ../../frontend.a
+INCLUDEPATH += ../../src/frontend/
 
 SOURCES += main.cpp\
         mainwindow.cpp \
diff --git a/groundStation/gui/MicroCART/MicroCART.pro.user b/groundStation/gui/MicroCART/MicroCART.pro.user
index d8c1922ddcfb5df26cdd3db8ab7cedc4d600084b..64f95e2421891e94b6aeb5445131054402b2452f 100644
--- a/groundStation/gui/MicroCART/MicroCART.pro.user
+++ b/groundStation/gui/MicroCART/MicroCART.pro.user
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.2.2, 2017-03-05T17:14:24. -->
+<!-- Written by QtCreator 3.2.2, 2017-03-06T11:03:28. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
@@ -8,7 +8,7 @@
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
-  <value type="int">-1</value>
+  <value type="int">0</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.EditorSettings</variable>
diff --git a/groundStation/gui/MicroCART/mainwindow.cpp b/groundStation/gui/MicroCART/mainwindow.cpp
index bb6976bd55acd667e0c09f19a927b16d062b9728..8df17de0b2c2edf292607a0e3cdc8d0526d30db3 100644
--- a/groundStation/gui/MicroCART/mainwindow.cpp
+++ b/groundStation/gui/MicroCART/mainwindow.cpp
@@ -10,7 +10,9 @@
 
 MainWindow::MainWindow(QWidget *parent) :
     QMainWindow(parent),
-    ui(new Ui::MainWindow)
+    ui(new Ui::MainWindow),
+    backendPid(0),
+    backendPipe(-1)
 {
     ui->setupUi(this);
 
@@ -27,8 +29,10 @@ MainWindow::MainWindow(QWidget *parent) :
     /* Connect tracker worker */
     connect(trackerWorker, SIGNAL (finished(float, float, float, float, float, float)),
             this, SLOT (updateTracker(float, float, float, float, float, float)));
-    connect(findChild<QPushButton *>("pbStart"), SIGNAL (clicked()), trackerWorker, SLOT (connectBackend()));
-    connect(findChild<QPushButton *>("pbConnect"), SIGNAL (clicked()), trackerWorker, SLOT (connectBackend()));
+
+    /* Connect and disconnect from backend when signals emitted */
+    connect(this, SIGNAL (connectWorkers()), trackerWorker, SLOT (connectBackend()));
+    connect(this, SIGNAL (disconnectWorkers()), trackerWorker, SLOT (disconnectBackend()));
 
     /* Create other workers and add them to the worker thread, then connect them */
 
@@ -41,6 +45,9 @@ MainWindow::MainWindow(QWidget *parent) :
     /* Start the things */
     trackerTimer->start(300);
     workerThread->start();
+
+    /* Create a timer to poll stdout and populate virtual console */
+    QTimer * consoleTimer = new QTimer(this);
 }
 
 MainWindow::~MainWindow()
@@ -48,6 +55,21 @@ MainWindow::~MainWindow()
     delete ui;
 }
 
+void MainWindow::updateConsole()
+{
+    if (backendPipe != -1) {
+        char buf[256];
+        size_t len = 0;
+        len = readBackend(backendPipe, buf, len);
+        printf("%d\n", len);
+        if (len > 0) {
+            printf("From pipe: %s", buf);
+            QLineEdit * con = findChild<QLineEdit *>("vConsole");
+            con->setText(con->text().append(buf));
+        }
+    }
+}
+
 void MainWindow::updateTracker(float x, float y, float z, float p, float r, float yaw)
 {
     findChild<QLineEdit *>("xLineEdit")->setText(QString::number(x));
@@ -60,9 +82,8 @@ void MainWindow::updateTracker(float x, float y, float z, float p, float r, floa
 
 void MainWindow::on_pbStart_clicked()
 {
-    this->backendPid = startBackend(findChild<QLineEdit *>("backendPath")->text().toStdString().c_str());
+    this->backendPid = startBackend(findChild<QLineEdit *>("backendPath")->text().toStdString().c_str(), &backendPipe);
     findChild<QPushButton *>("pbStart")->setEnabled(false);
-    findChild<QPushButton *>("pbConnect")->setEnabled(false);
     findChild<QPushButton *>("pbStop")->setEnabled(true);
     backendState = 1;
 }
@@ -72,12 +93,18 @@ void MainWindow::on_pbConnect_clicked()
     findChild<QPushButton *>("pbStart")->setEnabled(false);
     findChild<QPushButton *>("pbConnect")->setEnabled(false);
     findChild<QPushButton *>("pbStop")->setEnabled(true);
+    emit(connectWorkers());
     backendState = 1;
 }
 
 void MainWindow::on_pbStop_clicked()
 {
-    stopBackend(backendPid);
+    emit(disconnectWorkers());
+    if (backendPid) {
+        stopBackend(backendPid, backendPipe);
+        backendPipe = -1;
+        backendPid = 0;
+    }
     findChild<QPushButton *>("pbStart")->setEnabled(true);
     findChild<QPushButton *>("pbConnect")->setEnabled(true);
     findChild<QPushButton *>("pbStop")->setEnabled(false);
diff --git a/groundStation/gui/MicroCART/mainwindow.h b/groundStation/gui/MicroCART/mainwindow.h
index f54a88e37146462475bae4863964ea32c012c96d..042e5f73c30988c1581b28b221f2d7e76d2faed3 100644
--- a/groundStation/gui/MicroCART/mainwindow.h
+++ b/groundStation/gui/MicroCART/mainwindow.h
@@ -15,6 +15,10 @@ public:
     explicit MainWindow(QWidget *parent = 0);
     ~MainWindow();
 
+signals:
+    void connectWorkers();
+    void disconnectWorkers();
+
 private slots:
     void on_pbStart_clicked();
 
@@ -26,9 +30,12 @@ private slots:
 
     void updateTracker(float x, float y, float z, float p, float r, float yaw);
 
+    void updateConsole();
+
 private:
     Ui::MainWindow *ui;
     pid_t backendPid;
+    int backendPipe;
     int backendState;
 };
 
diff --git a/groundStation/gui/MicroCART/mainwindow.ui b/groundStation/gui/MicroCART/mainwindow.ui
index f2e2ab683d36f62894f5611a0dc9ca6cfe768592..5fc49d1e907b2b2a2f8e025d5c2eb14bf20edc59 100644
--- a/groundStation/gui/MicroCART/mainwindow.ui
+++ b/groundStation/gui/MicroCART/mainwindow.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>569</width>
-    <height>427</height>
+    <width>652</width>
+    <height>454</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -19,8 +19,8 @@
      <rect>
       <x>10</x>
       <y>10</y>
-      <width>531</width>
-      <height>281</height>
+      <width>461</width>
+      <height>341</height>
      </rect>
     </property>
     <property name="sizePolicy">
@@ -30,7 +30,7 @@
      </sizepolicy>
     </property>
     <property name="currentIndex">
-     <number>1</number>
+     <number>0</number>
     </property>
     <widget class="QWidget" name="backend">
      <attribute name="title">
@@ -42,7 +42,7 @@
         <x>0</x>
         <y>0</y>
         <width>451</width>
-        <height>231</height>
+        <height>296</height>
        </rect>
       </property>
       <layout class="QVBoxLayout" name="verticalLayout">
@@ -105,7 +105,7 @@
         </spacer>
        </item>
        <item>
-        <widget class="QTextEdit" name="textEdit">
+        <widget class="QTextEdit" name="vConsole">
          <property name="enabled">
           <bool>true</bool>
          </property>
@@ -233,7 +233,7 @@
     <property name="geometry">
      <rect>
       <x>10</x>
-      <y>290</y>
+      <y>350</y>
       <width>88</width>
       <height>34</height>
      </rect>
@@ -248,7 +248,7 @@
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>569</width>
+     <width>652</width>
      <height>30</height>
     </rect>
    </property>
diff --git a/groundStation/gui/MicroCART/trackerworker.cpp b/groundStation/gui/MicroCART/trackerworker.cpp
index 46bb0ab514a87cce4cc39c8ae052223c40340c9e..f5d3cda28a381f9c5e0b79a0ea9464c7896816c9 100644
--- a/groundStation/gui/MicroCART/trackerworker.cpp
+++ b/groundStation/gui/MicroCART/trackerworker.cpp
@@ -1,33 +1,37 @@
 #include "trackerworker.h"
 #include <QThread>
+#include "frontend_common.h"
+#include "frontend_tracker.h"
 
 TrackerWorker::TrackerWorker() :
-    QObject(), run(true)
+    QObject(), conn(NULL)
 {
 }
 
 TrackerWorker::~TrackerWorker()
 {
+    disconnectBackend();
 }
 
 void TrackerWorker::connectBackend()
 {
+    conn = ucart_backendConnect();
 }
 
 void TrackerWorker::disconnectBackend()
 {
+    if (conn) {
+         ucart_backendDisconnect(conn);
+         conn = NULL;
+    }
 }
 
 void TrackerWorker::process()
 {
-    /* Fake data. SAD! */
-    static float x = 1.0f, y = 2.0f, z = 3.0f, p = 4.0f, r = 5.0f, yaw = 6.0f;
-    x += 1.0;
-    y += 2.0;
-    z += 3.0;
-    p += 4.0;
-    r += 5.0;
-    yaw += 6.0;
+    if (conn) {
+        struct frontend_tracker_data td;
+        frontend_track(conn, &td);
 
-    emit finished(x, y, z, p, r, yaw);
+        emit finished(td.height, td.lateral, td.longitudinal, td.pitch, td.roll, td.yaw);
+    }
 }
diff --git a/groundStation/gui/MicroCART/trackerworker.h b/groundStation/gui/MicroCART/trackerworker.h
index dd72c9edf60b4dec586d6daa01ffb9f49c336d91..b263d6078751612cfab615e096b3776a87a6c971 100644
--- a/groundStation/gui/MicroCART/trackerworker.h
+++ b/groundStation/gui/MicroCART/trackerworker.h
@@ -3,6 +3,9 @@
 
 #include <QObject>
 
+#include "frontend_common.h"
+#include "frontend_tracker.h"
+
 class TrackerWorker : public QObject
 {
     Q_OBJECT
@@ -19,7 +22,7 @@ public slots:
     void disconnectBackend();
 
 private:
-    bool run;
+    struct backend_conn * conn;
 
 };
 #endif // TRACKERWORKER_H
diff --git a/groundStation/gui/MicroCART/wrappers.c b/groundStation/gui/MicroCART/wrappers.c
index f5e598c68b3b28b18537694edbaa60cd52bb14e8..45fdf0b28619f4d7d3cd6803239e6b0e2f999f62 100644
--- a/groundStation/gui/MicroCART/wrappers.c
+++ b/groundStation/gui/MicroCART/wrappers.c
@@ -1,24 +1,68 @@
 #include "wrappers.h"
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <sys/socket.h>
 #include <unistd.h>
 #include <signal.h>
+#include <err.h>
 #include <stdlib.h>
 
-int stopBackend(int pid)
+
+size_t readBackend(int fd, char * buf, size_t maxlen)
 {
+    int len = read(fd, buf, maxlen);
+    if (len < 0) {
+        len = 0;
+    }
+
+    return len;
+}
+
+int stopBackend(int pid, int pipefd)
+{
+    close(pipefd);
     kill(pid, SIGTERM);
     int status;
     wait(&status);
     return status;
 }
 
-int startBackend(const char * backend)
+int startBackend(const char * backend, int * pipefd)
 {
+    /* Create a pipe */
+    int pipe_fds[2];
+    if (pipe(pipe_fds)) {
+        warn("Failed to open pipe, cannot start backend!");
+        return -1;
+    }
+
     int pid = fork();
     if (!pid) {
-        execl(backend, "backEnd", NULL);
+        /* Child closes read end of pipe */
+        close(pipe_fds[0]);
+
+        write(pipe_fds[1], "From child", 11);
+        /* dup write end of pipe to stdout (FD 1), closing old stdout */
+        //dup2(pipe_fds[1], 1);
+        //dup2(pipe_fds[1], 2);
+
+        write(2, "Child stderr\n", 13);
+        printf("Child stdout\n");
+
+        /* Don't need whatever FD is in pipe_fds[1] anymore, since it is stdout now */
+        close(pipe_fds[1]);
+
+        execl(backend, "BackEnd", NULL);
         exit(0);
     }
+
+    /* Return the read end of the pipe in pipefd pointer */
+    *pipefd = pipe_fds[0];
+
+
+    /* Parent closes write end of the pipe */
+    close(pipe_fds[1]);
+
+
     return pid;
 }
diff --git a/groundStation/gui/MicroCART/wrappers.h b/groundStation/gui/MicroCART/wrappers.h
index eea3e1b1925af52a2a8fa62969694ea1abe043fe..6a29ecf90a9b59c71a3595242fa5fb31c68899e8 100644
--- a/groundStation/gui/MicroCART/wrappers.h
+++ b/groundStation/gui/MicroCART/wrappers.h
@@ -6,8 +6,11 @@ extern "C"
 {
 #endif
 
-int startBackend(const char * backend);
-int stopBackend(int pid);
+#include <stdio.h>
+
+int startBackend(const char * backend, int * pipefd);
+int stopBackend(int pid, int pipefd);
+size_t readBackend(int fd, char * buf, size_t maxlen);
 
 #ifdef __cplusplus
 }