diff --git a/groundStation/gui/MicroCART/mainwindow.cpp b/groundStation/gui/MicroCART/mainwindow.cpp
index e4916dcbeeb7a0dc8264ab3c655a55b2360ab878..e69b03a4fc52ed506cac172cb0b9887d444940fd 100644
--- a/groundStation/gui/MicroCART/mainwindow.cpp
+++ b/groundStation/gui/MicroCART/mainwindow.cpp
@@ -360,3 +360,36 @@ void MainWindow::on_pbInsertSetpoint_clicked()
             findChild<QLineEdit *>("zSetpoint")->text() + "]");
     setpointList->insertRow(current, new QStandardItem(str));
 }
+
+void MainWindow::on_pbSaveWaypoints_clicked()
+{
+    QString savePath = QFileDialog::getSaveFileName(this);
+
+    if (!savePath.isEmpty()) {
+        QFile f(savePath);
+        f.open(QIODevice::WriteOnly | QIODevice::Text);
+        for (int i= 0; i < setpointList->rowCount(); i++) {
+            f.write(setpointList->item(i)->text().toAscii());
+            f.write("\n");
+        }
+        f.close();
+    }
+}
+
+void MainWindow::on_pbLoadWaypoints_clicked()
+{
+    QString openPath = QFileDialog::getOpenFileName(this);
+
+    if (!openPath.isEmpty()) {
+        QFile f(openPath);
+        f.open(QIODevice::ReadOnly | QIODevice::Text);
+
+        setpointList->clear();
+        while (!f.atEnd()) {
+            QString line = f.readLine();
+            line.chop(1);
+            setpointList->appendRow(new QStandardItem(line));
+        }
+        f.close();
+    }
+}
diff --git a/groundStation/gui/MicroCART/mainwindow.h b/groundStation/gui/MicroCART/mainwindow.h
index 1e65d517480bb8ec8013f6be7ff1ded6f425d579..abdbd1d3d473d522203a8fe1df0d27f7592f3e44 100644
--- a/groundStation/gui/MicroCART/mainwindow.h
+++ b/groundStation/gui/MicroCART/mainwindow.h
@@ -65,6 +65,10 @@ private slots:
 
     void on_pbInsertSetpoint_clicked();
 
+    void on_pbSaveWaypoints_clicked();
+
+    void on_pbLoadWaypoints_clicked();
+
 private:
     Ui::MainWindow *ui;
     pid_t backendPid;