diff --git a/src/algorithms/PVT/libs/gpx_printer.cc b/src/algorithms/PVT/libs/gpx_printer.cc
new file mode 100644
index 000000000..2960e6e7c
--- /dev/null
+++ b/src/algorithms/PVT/libs/gpx_printer.cc
@@ -0,0 +1,176 @@
+/*!
+ * \file gpx_printer.cc
+ * \brief Interface of a class that prints PVT information to a gpx file
+ * \author Álvaro Cebrián Juan, 2018. acebrianjuan(at)gmail.com
+ *
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ * Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see .
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include "gpx_printer.h"
+#include
+#include
+#include
+
+using google::LogMessage;
+
+bool Gpx_Printer::set_headers(std::string filename, bool time_tag_name)
+{
+ boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time();
+ tm timeinfo = boost::posix_time::to_tm(pt);
+
+ if (time_tag_name)
+ {
+ std::stringstream strm0;
+ const int year = timeinfo.tm_year - 100;
+ strm0 << year;
+ const int month = timeinfo.tm_mon + 1;
+ if (month < 10)
+ {
+ strm0 << "0";
+ }
+ strm0 << month;
+ const int day = timeinfo.tm_mday;
+ if (day < 10)
+ {
+ strm0 << "0";
+ }
+ strm0 << day << "_";
+ const int hour = timeinfo.tm_hour;
+ if (hour < 10)
+ {
+ strm0 << "0";
+ }
+ strm0 << hour;
+ const int min = timeinfo.tm_min;
+ if (min < 10)
+ {
+ strm0 << "0";
+ }
+ strm0 << min;
+ const int sec = timeinfo.tm_sec;
+ if (sec < 10)
+ {
+ strm0 << "0";
+ }
+ strm0 << sec;
+
+ gpx_filename = filename + "_" + strm0.str() + ".gpx";
+ }
+ else
+ {
+ gpx_filename = filename + ".gpx";
+ }
+ gpx_file.open(gpx_filename.c_str());
+
+ if (gpx_file.is_open())
+ {
+ DLOG(INFO) << "GPX printer writing on " << filename.c_str();
+ // Set iostream numeric format and precision
+ gpx_file.setf(gpx_file.fixed, gpx_file.floatfield);
+ gpx_file << std::setprecision(14);
+ gpx_file << "" << std::endl
+ << "" << std::endl
+ << "" << std::endl
+ << "" << std::endl;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+bool Gpx_Printer::print_position(const std::shared_ptr& position, bool print_average_values)
+{
+ double latitude;
+ double longitude;
+ double height;
+
+ positions_printed = true;
+
+ std::shared_ptr position_ = position;
+
+ if (print_average_values == false)
+ {
+ latitude = position_->get_latitude();
+ longitude = position_->get_longitude();
+ height = position_->get_height();
+ }
+ else
+ {
+ latitude = position_->get_avg_latitude();
+ longitude = position_->get_avg_longitude();
+ height = position_->get_avg_height();
+ }
+
+ if (gpx_file.is_open())
+ {
+ gpx_file << "" << height << "" << std::endl;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+bool Gpx_Printer::close_file()
+{
+ if (gpx_file.is_open())
+ {
+ gpx_file << "" << std::endl
+ << "" << std::endl
+ << "";
+ gpx_file.close();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+Gpx_Printer::Gpx_Printer()
+{
+ positions_printed = false;
+}
+
+
+Gpx_Printer::~Gpx_Printer()
+{
+ close_file();
+ if (!positions_printed)
+ {
+ if (remove(gpx_filename.c_str()) != 0) LOG(INFO) << "Error deleting temporary GPX file";
+ }
+}
diff --git a/src/algorithms/PVT/libs/gpx_printer.h b/src/algorithms/PVT/libs/gpx_printer.h
new file mode 100644
index 000000000..f7415cf71
--- /dev/null
+++ b/src/algorithms/PVT/libs/gpx_printer.h
@@ -0,0 +1,62 @@
+/*!
+ * \file gpx_printer.h
+ * \brief Interface of a class that prints PVT information to a gpx file
+ * \author Álvaro Cebrián Juan, 2018. acebrianjuan(at)gmail.com
+ *
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ * Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see .
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#ifndef GNSS_SDR_GPX_PRINTER_H_
+#define GNSS_SDR_GPX_PRINTER_H_
+
+#include "pvt_solution.h"
+#include
+#include
+#include
+
+
+/*!
+ * \brief Prints PVT information to GPX format file
+ *
+ * See http://www.topografix.com/gpx.asp
+ */
+class Gpx_Printer
+{
+private:
+ std::ofstream gpx_file;
+ bool positions_printed;
+ std::string gpx_filename;
+
+public:
+ Gpx_Printer();
+ ~Gpx_Printer();
+ bool set_headers(std::string filename, bool time_tag_name = true);
+ bool print_position(const std::shared_ptr& position, bool print_average_values);
+ bool close_file();
+};
+
+#endif