diff --git a/rover/include/roverapi/rover_display.hpp b/rover/include/roverapi/rover_display.hpp
new file mode 100644
index 0000000..eaada28
--- /dev/null
+++ b/rover/include/roverapi/rover_display.hpp
@@ -0,0 +1,164 @@
+/*
+ * 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:
+ *    Rover Display API - Interfaces for Rover display application development - Header file
+ *
+ * Usage Instructions:
+ *    1) One should set-up I2C on Raspberry Pi to run this script properly (taken from Adafruit):
+ *           1.1) Install necessary modules:
+ *                sudo apt-get install -y python-smbus
+ *                sudo apt-get install -y i2c-tools
+ *           1.2) In /etc/modules, add following lines:
+ *           	  i2c-bcm2708
+ *                i2c-dev
+ *           1.3) In /etc/modprobe.d/raspi-blacklist.conf, uncomment possible following lines:
+ *                blacklist spi-bcm2708
+ *                blacklist i2c-bcm2708
+ *           1.4) In /boot/config.txt, add following lines:
+ *                dtparam=i2c1=on
+ *                dtparam=i2c_arm=on
+ *           1.5) Then reboot
+ *                sudo reboot
+ *           1.6) To test I2C and see the addresses,
+ *                sudo i2cdetect -y 1
+ *    2) For cross-compilation using Eclipse IDE, make sure to follow the instructions located under readme.txt files
+ *       in drivers/oled_drivers:
+ *    	    Please note that in order to use OLED SSD1306 with I2C,
+ *		    one has to download bcm2835.c, bcm2835.h, and has access to current <linux/i2c-dev.h>.
+ *		    In case the compiler complains, please also download the newest i2c-dev.h and put it in drivers/oled_drivers folder.
+ *		    Download i2c-dev.h from: https://www.kernel.org/pub/linux/
+ *		    Download bcm2835.c and bcm2835.h from: https://github.com/hallard/ArduiPi_SSD1306
+ *
+ * Contributors:
+ *    M.Ozcelikors <mozcelikors@gmail.com>, created API 17.11.2017
+ *
+ */
+
+#ifndef API_ROVER_DISPLAY_HPP_
+#define API_ROVER_DISPLAY_HPP_
+
+#include <drivers/oled_drivers/Adafruit_SSD1306.h>
+
+#define NUMFLAKES 10
+#define XPOS 0
+#define YPOS 1
+#define DELTAY 2
+
+namespace rover
+{
+	/**
+	 * @brief Contains the member functions to control OLED display on the Rover. This class is a wrapper API for Adafruit_GFX and Adafruit_SSD1306 libraries.
+	 */
+	class RoverDisplay
+	{
+		private:
+			/**
+			 * @brief Object to handle OLED operations.
+			 */
+			Adafruit_SSD1306 my_display;
+
+		public:
+			/**
+			 * @brief Static definition to indicate BLACK color
+			 */
+			static const int BLACK_COLOR = 0;
+
+			/**
+			 * @brief Static definition to indicate WHITE color
+			 */
+			static const int WHITE_COLOR = 1;
+
+			/**
+			 * @brief Initializes the OLED display of the rover
+			 * @return void
+			 */
+			void initialize (void);
+
+			/**
+			 * @brief Displays the buffer contents on the OLED display
+			 * @return void
+			 */
+			void display (void);
+
+			/**
+			 * @brief Returns the display object
+			 * @return void
+			 */
+			Adafruit_SSD1306& getDisplay (void);
+
+			/**
+			 * @brief Clears the display
+			 * @return void
+			 */
+			void clearDisplay (void) ;
+
+			/**
+			 * @brief Draws a bitmap on the OLED display
+			 * @param x is the horizontal pixel location to start drawing bitmap
+			 * @param y is the vertical pixel location to start drawing bitmap
+			 * @param w is the width of bitmap in pixels
+			 * @param h is the height of bitmap in pixels
+			 * @param color is the color to draw the bitmap. RoverDisplay::BLACK_COLOR or RoverDisplay::WHITE_COLOR
+			 * @param bitmap is the unsigned integer array that contains the bitmap image.
+			 * @return void
+			 */
+			void drawBitmap (int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) ;
+
+			/**
+			 * @brief Sets the cursor to a position in order to start typing text.
+			 * @param x is the horizontal pixel location
+			 * @param y is the vertical pixel location
+			 * @return void
+			 */
+			void setCursor (int16_t x, int16_t y);
+
+			/**
+			 * @brief Sets the text size to one of the predefined sizes.
+			 * @param s is the size in unsigned integer type. Example values involve 1,2,3.
+			 * @return void
+			 */
+			void setTextSize (uint8_t s);
+
+			/**
+			 * @brief Sets the text color to either white or black
+			 * @param c is the textcolor in integer. RoverDisplay::BLACK_COLOR or RoverDisplay::WHITE_COLOR
+			 * @return void
+			 */
+			void setTextColor (uint16_t c);
+
+			/**
+			 * @brief Sets the text and background color color to either white or black
+			 * @param c is the text color in integer. RoverDisplay::BLACK_COLOR or RoverDisplay::WHITE_COLOR
+			 * @param c is the background color in integer. RoverDisplay::BLACK_COLOR or RoverDisplay::WHITE_COLOR
+			 * @return void
+			 */
+			void setTextColor (uint16_t c, uint16_t b);
+
+			/**
+			 * @brief Prints a string to OLED display starting from cursor location
+			 * @param string is the message to print to OLED display.
+			 * @return void
+			 */
+			void print (const char * string);
+
+			/**
+			 * @brief Draws a rectangle to OLED display
+			 * @param x is the horizontal pixel location to start drawing rectangle
+			 * @param y is the vertical pixel location to start drawing rectangle
+			 * @param w is the width of rectangle in pixels
+			 * @param h is the height of rectangle in pixels
+			 * @param color is the color to draw the rectangle. RoverDisplay::BLACK_COLOR or RoverDisplay::WHITE_COLOR
+			 * @return void
+			 */
+			void drawRect (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+	};
+}
+
+
+
+#endif /* API_ROVER_DISPLAY_HPP_ */
diff --git a/rover/src/roverapi/rover_display.cpp b/rover/src/roverapi/rover_display.cpp
new file mode 100644
index 0000000..dcb67ce
--- /dev/null
+++ b/rover/src/roverapi/rover_display.cpp
@@ -0,0 +1,138 @@
+/*
+ * 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:
+ *    Rover Display API - Interfaces for Rover display application development
+ *
+ * Usage Instructions:
+ *    1) One should set-up I2C on Raspberry Pi to run this script properly (taken from Adafruit):
+ *           1.1) Install necessary modules:
+ *                sudo apt-get install -y python-smbus
+ *                sudo apt-get install -y i2c-tools
+ *           1.2) In /etc/modules, add following lines:
+ *           	  i2c-bcm2708
+ *                i2c-dev
+ *           1.3) In /etc/modprobe.d/raspi-blacklist.conf, uncomment possible following lines:
+ *                blacklist spi-bcm2708
+ *                blacklist i2c-bcm2708
+ *           1.4) In /boot/config.txt, add following lines:
+ *                dtparam=i2c1=on
+ *                dtparam=i2c_arm=on
+ *           1.5) Then reboot
+ *                sudo reboot
+ *           1.6) To test I2C and see the addresses,
+ *                sudo i2cdetect -y 1
+ *    2) For cross-compilation using Eclipse IDE, make sure to follow the instructions located under readme.txt files
+ *       in drivers/oled_drivers:
+ *    	    Please note that in order to use OLED SSD1306 with I2C,
+ *		    one has to download bcm2835.c, bcm2835.h, and has access to current <linux/i2c-dev.h>.
+ *		    In case the compiler complains, please also download the newest i2c-dev.h and put it in drivers/oled_drivers folder.
+ *		    Download i2c-dev.h from: https://www.kernel.org/pub/linux/
+ *		    Download bcm2835.c and bcm2835.h from: https://github.com/hallard/ArduiPi_SSD1306
+ *
+ * Contributors:
+ *    M.Ozcelikors <mozcelikors@gmail.com>, created API 17.11.2017
+ *
+ */
+
+#include <roverapi/rover_display.hpp>
+
+#include <drivers/oled_drivers/ArduiPi_SSD1306.h>
+#include <drivers/oled_drivers/Adafruit_GFX.h>
+
+void rover::RoverDisplay::initialize(void)
+{
+	/* Type to describe default options for the OLED initialization */
+	struct s_opts
+	{
+		int oled;
+		int verbose;
+	};
+
+	/* Default options for the OLED initialization. */
+	s_opts local_opts = {
+		OLED_ADAFRUIT_I2C_128x64,		// Default oled
+		false							// Not verbose
+	};
+
+	/* I2C change parameters to fit to your LCD */
+	if ( !this->my_display.init(OLED_I2C_RESET, local_opts.oled) )
+		exit(EXIT_FAILURE);
+
+	this->my_display.begin();
+	this->my_display.clearDisplay();   // clears the screen and buffer
+}
+
+void rover::RoverDisplay::display(void)
+{
+
+	this->my_display.display();
+
+}
+
+void rover::RoverDisplay::clearDisplay(void)
+{
+
+	this->my_display.clearDisplay();
+
+}
+
+void rover::RoverDisplay::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
+{
+
+	this->my_display.drawBitmap(x, y, bitmap, w, h, color);
+
+}
+
+void rover::RoverDisplay::setCursor (int16_t x, int16_t y)
+{
+
+	this->my_display.setCursor (x, y);
+
+}
+
+void rover::RoverDisplay::setTextSize (uint8_t s)
+{
+
+	this->my_display.setTextSize (s);
+
+}
+
+void rover::RoverDisplay::setTextColor (uint16_t c)
+{
+
+	this->my_display.setTextColor (c);
+
+}
+
+void rover::RoverDisplay::setTextColor (uint16_t c, uint16_t b)
+{
+
+	this->my_display.setTextColor (c, b);
+
+}
+
+void rover::RoverDisplay::print (const char * string)
+{
+
+	this->my_display.print (string);
+
+}
+
+void rover::RoverDisplay::drawRect (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
+{
+
+	this->my_display.drawRect (x, y, w, h, color);
+
+}
+
+Adafruit_SSD1306& rover::RoverDisplay::getDisplay (void)
+{
+
+	return this->my_display;
+
+}
