diff --git a/rover/include/roverapi/rover_grooveultrasonic.hpp b/rover/include/roverapi/rover_grooveultrasonic.hpp
new file mode 100644
index 0000000..d3a63a8
--- /dev/null
+++ b/rover/include/roverapi/rover_grooveultrasonic.hpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2017 FH Dortmund and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Description:
+ *     RoverGrooveUltrasonic API - Interfaces for Rover Groove ultrasonic sensor application development
+ *     Header file
+ *
+ * Contributors:
+ *    M.Ozcelikors <mozcelikors@gmail.com>, created RoverGrooveUltrasonic class 04.12.2017
+ *
+ */
+
+#ifndef ROVERAPI_ROVER_GROOVEULTRASONIC_HPP_
+#define ROVERAPI_ROVER_GROOVEULTRASONIC_HPP_
+
+#include <roverapi/rover_sensor.hpp>
+
+/**
+ * @brief Groove Sensor Pin for Front Sensor Socket (in wiringPi format)
+ */
+static const int SIG0 = 0; //BCM-17   ->  WiringPi 0   //Same as ECHO0 pin, if some one wants to replace front sr04 with groove sensor
+
+/**
+ *  @brief Groove Sensor Pin for Rear Sensor Socket (in wiringPi format)
+ */
+static const int SIG1 = 2; //BCM-27   ->  WiringPi 2   //Same as ECHO1 pin, if some one wants to replace back sr04 with groove sensor
+
+namespace rover
+{
+	/**
+	 * @brief RoverGrooveUltrasonic is a class that is inherited from RoverSensor abstract class. RoverGrooveUltrasonic class contains member functions and variables to set up and read from Groove ultrasonic sensors that are embedded on the rover.
+	 */
+	class RoverGrooveUltrasonic : public RoverSensor
+	{
+		private:
+			/**
+			 * @brief Sensor Identification
+			 */
+			RoverSensorID_t sensorID;
+
+			/**
+			 * @brief Signal pin
+			 */
+			int sigPin;
+
+		public:
+			/**
+			 * @brief Constructor for the RoverGrooveUltrasonic class
+			 * @param sensor_id Sensor to address
+			 */
+			explicit RoverGrooveUltrasonic (const RoverSensorID_t sensor_id);
+
+			/**
+			 * @brief Destructor for the RoverGrooveUltrasonic class
+			 */
+			~RoverGrooveUltrasonic();
+
+			/**
+			 * @brief Function to setup Groove Ultrasonic sensor
+			 * @return void
+			 */
+			void initialize (void);
+
+			/**
+			 * @brief Member function to read from Groove ultrasonic sensor given its sensor id.
+			 * @return sensor_val Sensor value read in centimeters from sensor
+			 */
+			float read (void);
+
+			/**
+			 * @brief Sets the private attribute sigPin for Groove Ultrasonic Sensor
+			 * @param sig_pin Pin in wiringPi format for Groove Ultrasonic Sensor
+			 * @return void
+			 */
+			void setSigPin (const int sig_pin);
+
+			/**
+			 * @brief Returns the private attribute sigPin for Groove Ultrasonic Sensor
+			 * @return sig_pin Pin in wiringPi format for Groove Ultrasonic Sensor
+			 */
+			int getSigPin (void);
+	};
+}
+
+
+
+#endif /* ROVERAPI_ROVER_GROOVEULTRASONIC_HPP_ */
diff --git a/rover/include/roverapi/rover_hcsr04.hpp b/rover/include/roverapi/rover_hcsr04.hpp
new file mode 100644
index 0000000..2f1374c
--- /dev/null
+++ b/rover/include/roverapi/rover_hcsr04.hpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2017 FH Dortmund and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Description:
+ *     RoverHCSR04 API - Interfaces for Rover ultrasonic sensor application development
+ *     Header file
+ *
+ * Contributors:
+ *    M.Ozcelikors <mozcelikors@gmail.com>, created RoverHCSR04 class 04.12.2017
+ *
+ */
+
+#ifndef ROVERAPI_ROVER_HCSR04_HPP_
+#define ROVERAPI_ROVER_HCSR04_HPP_
+
+#include <roverapi/rover_sensor.hpp>
+
+/**
+ *  @brief HC-SR04 Sensor Trigger Pin for Front Sensor Socket (in wiringPi format)
+ */
+static const int TRIG0 = 7; //BCM-4   ->  WiringPi 7
+/**
+ *  @brief HC-SR04 Sensor Echo Pin for Front Sensor Socket (in wiringPi format)
+ */
+static const int ECHO0 = 0; //BCM-17   ->  WiringPi 0
+
+/**
+ *  @brief HC-SR04 Sensor Trigger Pin for Rear Sensor Socket (in wiringPi format)
+ */
+static const int TRIG1 = 1; //BCM-18   ->  WiringPi 1
+/**
+ *  @brief HC-SR04 Sensor Echo Pin for Rear Sensor Socket (in wiringPi format)
+ */
+static const int ECHO1 = 2; //BCM-27   ->  WiringPi 2
+
+namespace rover
+{
+	/**
+	 * @brief RoverHCSR04 is a class that is inherited from RoverSensor abstract class. RoverHCSR04 class contains member functions and variables to set up and read from HCSR-04 ultrasonic sensors that are embedded on the rover.
+	 */
+	class RoverHCSR04 : public RoverSensor
+	{
+		private:
+			/**
+			 * @brief Sensor Identification
+			 */
+			RoverSensorID_t sensorID;
+
+			/**
+			 * @brief Trigger pin
+			 */
+			int trigPin;
+
+			/**
+			 * @brief Echo pin
+			 */
+			int echoPin;
+
+			/**
+			 * @brief Flag to hold if RoverHCSR04 is set up
+			 */
+			int ROVERHCSR04_SETUP_;
+
+		public:
+			/**
+			 * @brief Constructor for the RoverHCSR04 class
+			 * @param sensor_id Sensor to address
+			 */
+			explicit RoverHCSR04 (const RoverSensorID_t sensor_id);
+
+			/**
+			 * @brief Destructor for the RoverHCSR04 class
+			 */
+			~RoverHCSR04();
+
+			/**
+			 * @brief Function to setup HCSR04 sensor
+			 * @return void
+			 */
+			void initialize (void);
+
+			/**
+			 * @brief Member function to read from HC-SR04 ultrasonic sensor given its sensor id.
+			 * @return sensor_val Sensor value read in centimeters from sensor
+			 */
+			float read (void);
+
+			/**
+			 * @brief Sets the private attribute trigPin for HCSR04
+			 * @param trig_pin Pin in wiringPi format for HCSR04
+			 * @return void
+			 */
+			void setTrigPin (const int trig_pin);
+
+			/**
+			 * @brief Returns the private attribute trigPin for HCSR04
+			 * @return trig_pin Pin in wiringPi format for HCSR04
+			 */
+			int getTrigPin (void);
+
+			/**
+			 * @brief Sets the private attribute echoPin for HCSR04
+			 * @param echo_pin Pin in wiringPi format for HCSR04
+			 * @return void
+			 */
+			void setEchoPin (const int echo_pin);
+
+			/**
+			 * @brief Returns the private attribute echoPin for HCSR04
+			 * @return echo_pin Pin in wiringPi format for HCSR04
+			 */
+			int getEchoPin (void);
+
+	};
+}
+
+
+
+#endif /* ROVERAPI_ROVER_HCSR04_HPP_ */
diff --git a/rover/src/roverapi/rover_grooveultrasonic.cpp b/rover/src/roverapi/rover_grooveultrasonic.cpp
new file mode 100644
index 0000000..c8eef3f
--- /dev/null
+++ b/rover/src/roverapi/rover_grooveultrasonic.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2017 FH Dortmund and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Description:
+ *     RoverGrooveUltrasonic API - Interfaces for Rover Groove ultrasonic sensor application development
+ *
+ * Contributors:
+ *    M.Ozcelikors <mozcelikors@gmail.com>, created RoverGrooveUltrasonic class 04.12.2017
+ *
+ */
+
+#include <roverapi/rover_grooveultrasonic.hpp>
+#include <wiringPi.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+
+rover::RoverGrooveUltrasonic::RoverGrooveUltrasonic (const RoverSensorID_t sensor_id)
+{
+	this->sensorID = sensor_id;
+	if (this->sensorID == ROVER_FRONT)
+	{
+		this->sigPin = SIG1;
+	}
+	else if (this->sensorID == ROVER_REAR)
+	{
+		this->sigPin = SIG0;
+	}
+	else
+	{
+		printf ("Invalid Sensor ID for the Groove Ultrasonic Sensor to constructor RoverGrooveUltrasonic::RoverGrooveUltrasonic().\n");
+		// Adding a default value for the pin in case there is an error
+		this->sigPin = SIG1;
+	}
+}
+
+rover::RoverGrooveUltrasonic::~RoverGrooveUltrasonic(){}
+
+void rover::RoverGrooveUltrasonic::initialize (void)
+{
+
+}
+
+float rover::RoverGrooveUltrasonic::read (void)
+{
+	long startTime, stopTime, elapsedTime, distance = 0;
+	pinMode(this->sigPin, OUTPUT);
+	digitalWrite(this->sigPin, LOW);
+	delayMicroseconds(2);
+	digitalWrite(this->sigPin, HIGH);
+	delayMicroseconds(5);
+	digitalWrite(this->sigPin, LOW);
+	pinMode(this->sigPin,INPUT);
+
+	startTime = micros();
+	while (digitalRead(this->sigPin) == LOW  );
+	startTime = micros();
+	// For values above 40cm, groove sensor is unable to receive signals which causes it to stuck
+	// This is resolved by adding the timeout below.
+	// However, this timeout cause values bigger than 40 to fluctuate
+	while (digitalRead(this->sigPin) == HIGH && micros() < startTime + 100000);
+	stopTime = micros();
+	elapsedTime = stopTime - startTime;
+	distance = elapsedTime / 29 /2;
+	// The below protection is to ensure there is no value fluctuation
+	if (distance > 40 )
+		distance = 40;
+
+	return ((float)distance*1.0);
+}
+
+void rover::RoverGrooveUltrasonic::setSigPin (const int sig_pin)
+{
+	this->sigPin = sig_pin;
+}
+
+int rover::RoverGrooveUltrasonic::getSigPin (void)
+{
+	return this->sigPin;
+}
+
+
+
diff --git a/rover/src/roverapi/rover_hcsr04.cpp b/rover/src/roverapi/rover_hcsr04.cpp
new file mode 100644
index 0000000..c4bd02a
--- /dev/null
+++ b/rover/src/roverapi/rover_hcsr04.cpp
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2017 FH Dortmund and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Description:
+ *     RoverHCSR04 API - Interfaces for Rover ultrasonic sensor application development
+ *
+ * Contributors:
+ *    M.Ozcelikors <mozcelikors@gmail.com>, created RoverHCSR04 class 04.12.2017
+ *
+ */
+
+#include <roverapi/rover_hcsr04.hpp>
+#include <wiringPi.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+
+rover::RoverHCSR04::RoverHCSR04 (const RoverSensorID_t sensor_id)
+:ROVERHCSR04_SETUP_(0)
+{
+	this->sensorID = sensor_id;
+	if (this->sensorID == ROVER_FRONT)
+	{
+		this->trigPin = TRIG1;
+		this->echoPin = ECHO1;
+	}
+	else if (this->sensorID == ROVER_REAR)
+	{
+		this->trigPin = TRIG0;
+		this->echoPin = ECHO0;
+	}
+	else
+	{
+		printf ("Invalid Sensor ID for the Ultrasonic Sensor to constructor RoverHCSR04::RoverHCSR04().\n");
+		// Adding a default value for the pins in case there is an error
+		this->trigPin = TRIG0;
+		this->echoPin = ECHO0;
+	}
+}
+
+rover::RoverHCSR04::~RoverHCSR04(){}
+
+void rover::RoverHCSR04::initialize (void)
+{
+    pinMode(this->trigPin, OUTPUT);
+    pinMode(this->echoPin, INPUT);
+
+    //TRIG pin must start LOW
+    digitalWrite(this->trigPin, LOW);
+    delayMicroseconds(2);
+
+    this->ROVERHCSR04_SETUP_ = 1;
+}
+
+float rover::RoverHCSR04::read (void)
+{
+	if (this->ROVERHCSR04_SETUP_ != 1)
+	{
+		fprintf(stderr,"You havent set up RoverHCSR04. Use RoverHCSR04()::initialize() !\n");
+	}
+	else
+	{
+		int distance = 0;
+		//Send trig pulse
+		digitalWrite(this->trigPin, HIGH);
+		delayMicroseconds(10);
+		digitalWrite(this->trigPin, LOW);
+
+		//Wait for echo start
+		long startTime = micros();
+		while(digitalRead(this->echoPin) == LOW && micros() < startTime + 100000);
+
+		//Wait for echo end
+		startTime = micros();
+		while(digitalRead(this->echoPin) == HIGH);
+		long travelTime = micros() - startTime;
+
+		//Get distance in cm
+		distance = travelTime * 34300;
+		distance = distance / 1000000;
+		distance = distance / 2;
+		// The below protection is to ensure there is no value fluctuation due to timeout
+		if (distance > 40 )
+			distance = 40;
+
+		//	printf("dist=%d\n",distance);
+		return ((float) distance*1.0);
+	}
+}
+
+void rover::RoverHCSR04::setTrigPin (const int trig_pin)
+{
+	this->trigPin = trig_pin;
+}
+
+int rover::RoverHCSR04::getTrigPin (void)
+{
+	return this->trigPin;
+}
+
+void rover::RoverHCSR04::setEchoPin (const int echo_pin)
+{
+	this->echoPin = echo_pin;
+}
+
+int rover::RoverHCSR04::getEchoPin (void)
+{
+	return this->echoPin;
+}
+
