diff --git a/cpp/Scan.cpp b/cpp/Scan.cpp
new file mode 100644
index 0000000..597603b
--- /dev/null
+++ b/cpp/Scan.cpp
@@ -0,0 +1,109 @@
+/**
+*
+* \mainpage BreezySLAM: Simple, efficient SLAM in C++
+*
+* Scan.cpp - implementation for Scan class
+*
+* Copyright (C) 2014 Simon D. Levy
+
+* This code is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation, either version 3 of the
+* License, or (at your option) any later version.
+*
+* This code 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 Lesser General Public License
+* along with this code. If not, see .
+*/
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+using namespace std;
+
+#include "coreslam.h"
+
+#include "Velocities.hpp"
+#include "Laser.hpp"
+#include "Scan.hpp"
+
+/**
+* A class for Lidar scans.
+*/
+
+Scan::Scan(Laser * laser, int span)
+{
+ this->init(laser, span);
+}
+
+Scan::Scan(Laser * laser)
+{
+ this->init(laser, 1);
+}
+
+
+void Scan::init(Laser * laser, int span)
+{
+ this->scan = new scan_t;
+
+ scan_init(this->scan, laser->laser->scan_size, span);
+
+ this->laser = new laser_t;
+ memcpy(this->laser, laser->laser, sizeof(laser_t));
+}
+
+Scan::~Scan(void)
+{
+ scan_free(this->scan);
+ delete this->scan;
+}
+
+
+void
+Scan::update(
+ int * scanvals_mm,
+ double hole_width_millimeters,
+ Velocities & velocities)
+{
+ scan_update(
+ this->scan,
+ scanvals_mm,
+ *this->laser,
+ hole_width_millimeters,
+ velocities.dxy_mm,
+ velocities.dtheta_degrees);
+}
+void
+Scan::update(
+ int * scanvals_mm,
+ double hole_width_millimeters)
+{
+ scan_update(
+ this->scan,
+ scanvals_mm,
+ *this->laser,
+ hole_width_millimeters,
+ 0,
+ 0);
+}
+
+ostream& operator<< (ostream & out, Scan & scan)
+{
+ char str[512];
+
+ scan_string(*scan.scan, str);
+
+ out << str;
+
+ return out;
+}
+
+