diff --git a/drivers/display_bitsboard.cpp b/drivers/display_bitsboard.cpp
index d0cd269c77d778d88357539b3aa17335265b1658..200891cccf5fad60a5f8c0f40069316ad499f7bd 100644
--- a/drivers/display_bitsboard.cpp
+++ b/drivers/display_bitsboard.cpp
@@ -105,64 +105,36 @@ void TIM7_IRQHandler()
 
 namespace mxgui {
 
+void registerDisplayHook(DisplayManager& dm)
+{
+    dm.registerDisplay(&DisplayImpl::instance());
+}
+
 //
 // class DisplayImpl
 //
 
-DisplayImpl::DisplayImpl(): buffer(0), textColor(), font(miscFixed), last()
+DisplayImpl& DisplayImpl::instance()
 {
-    setTextColor(Color(black),Color(white));
-    {
-        FastInterruptDisableLock dLock;
-        RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
-        RCC->APB1ENR |= RCC_APB1ENR_SPI2EN | RCC_APB1ENR_TIM7EN;
-        sck::mode(Mode::ALTERNATE_OD);
-        sck::alternateFunction(5);
-        mosi::mode(Mode::ALTERNATE_OD);
-        mosi::alternateFunction(5);
-        dres::mode(Mode::OPEN_DRAIN);
-        nflm::mode(Mode::OPEN_DRAIN);
-        nm::mode(Mode::OPEN_DRAIN);
-        dispoff::mode(Mode::OPEN_DRAIN);
-    }
-
-    nflm::high();
-    nm::high();
-    dispoff::high();
-
-    dres::high();
-    delayUs(10);
-    dres::low();
-    delayUs(10);
-
-    framebuffer=new unsigned short[2048]; //256*128/16=2048
-    unsigned int bba=(reinterpret_cast<unsigned>(framebuffer)-0x20000000)*32;
-    framebufferBitBandAlias=reinterpret_cast<unsigned int*>(0x22000000+bba);
-    memset(framebuffer,0,4096);
+    static DisplayImpl instance;
+    return instance;
+}
 
-    TIM7->CR1=TIM_CR1_OPM;
-    TIM7->DIER=TIM_DIER_UIE;
-    TIM7->PSC=84-1; //84MHz/84=1MHz (1us resolution)
-    TIM7->CNT=0;
+void DisplayImpl::doTurnOn()
+{
+    dispoff::low();
+}
 
-    dmaRefill();
-    NVIC_SetPriority(DMA1_Stream4_IRQn,2);//High priority for DMA
-    NVIC_EnableIRQ(DMA1_Stream4_IRQn);
-    NVIC_SetPriority(TIM7_IRQn,3);//High priority for TIM7
-    NVIC_EnableIRQ(TIM7_IRQn);
+void DisplayImpl::doTurnOff()
+{
+    dispoff::high();
+}
 
-    SPI2->CR2=SPI_CR2_TXDMAEN;
-    SPI2->CR1=SPI_CR1_DFF      | //16bit mode
-              SPI_CR1_SSM      | //SS pin not connected to SPI
-              SPI_CR1_SSI      | //Internal SS signal pulled high
-              SPI_CR1_LSBFIRST | //Send LSB first
-              SPI_CR1_MSTR     | //Master mode
-              SPI_CR1_SPE      | //SPI enabled, master mode
-              SPI_CR1_BR_0     |
-              SPI_CR1_BR_1;      //42MHz/16=2.625MHz (/4 by the 4094)=0.66MHz
+void DisplayImpl::doSetBrightness(int brt) {}
 
-    Thread::sleep(500);
-    dispoff::low();
+pair<short int, short int> DisplayImpl::doGetSize() const
+{
+    return make_pair(height,width);
 }
 
 void DisplayImpl::write(Point p, const char *text)
@@ -195,6 +167,21 @@ void DisplayImpl::clear(Point p1, Point p2, Color color)
     while(it!=end()) *it=color;
 }
 
+void DisplayImpl::beginPixel() {}
+
+void DisplayImpl::setPixel(Point p, Color color)
+{
+    //if(p.x()<0 || p.y()<0 || p.x()>=width || p.y()>=height) return;
+    unsigned short x=p.x();
+    unsigned short y=p.y();
+    if(y>=64)
+    {
+        y-=64;
+        x+=256;
+    }
+    framebufferBitBandAlias[512*y+x]= color ? 0 : 1;
+}
+
 void DisplayImpl::line(Point a, Point b, Color color)
 {
     if(a.x()<0 || a.y()<0 || b.x()<0 || b.y()<0) return;
@@ -212,6 +199,17 @@ void DisplayImpl::scanLine(Point p, const Color *colors, unsigned short length)
     for(int i=0;i<length;i++) *it=colors[i];
 }
 
+Color *DisplayImpl::getScanLineBuffer()
+{
+    if(buffer==0) buffer=new Color[getWidth()];
+    return buffer;
+}
+
+void DisplayImpl::scanLineBuffer(Point p, unsigned short length)
+{
+    scanLine(p,buffer,length);
+}
+
 void DisplayImpl::drawImage(Point p, const ImageBase& img)
 {
     short int xEnd=p.x()+img.getWidth()-1;
@@ -241,25 +239,21 @@ void DisplayImpl::drawRectangle(Point a, Point b, Color c)
     line(Point(a.x(),b.y()),a,c);
 }
 
-void DisplayImpl::turnOn()
+void DisplayImpl::setTextColor(pair<Color,Color> colors)
 {
-    dispoff::low();
+    Font::generatePalette(textColor,colors.first,colors.second);
 }
 
-void DisplayImpl::turnOff()
+pair<Color,Color> DisplayImpl::getTextColor() const
 {
-    dispoff::high();
+    return make_pair(textColor[3],textColor[0]);
 }
 
-void DisplayImpl::setTextColor(Color fgcolor, Color bgcolor)
-{
-    Font::generatePalette(textColor,fgcolor,bgcolor);
-}
+void DisplayImpl::setFont(const Font& font) { this->font=font; }
 
-void DisplayImpl::setFont(const Font& font)
-{
-    this->font=font;
-}
+Font DisplayImpl::getFont() const { return font; }
+
+void DisplayImpl::update() {}
 
 DisplayImpl::pixel_iterator DisplayImpl::begin(Point p1, Point p2, IteratorDirection d)
 {
@@ -281,6 +275,67 @@ DisplayImpl::pixel_iterator DisplayImpl::begin(Point p1, Point p2, IteratorDirec
     return pixel_iterator(p1,p2,d,this);
 }
 
+DisplayImpl::~DisplayImpl()
+{
+    if(buffer) delete[] buffer;
+}
+
+DisplayImpl::DisplayImpl(): buffer(0), textColor(), font(miscFixed), last()
+{
+    setTextColor(make_pair(Color(black),Color(white)));
+    {
+        FastInterruptDisableLock dLock;
+        RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
+        RCC->APB1ENR |= RCC_APB1ENR_SPI2EN | RCC_APB1ENR_TIM7EN;
+        sck::mode(Mode::ALTERNATE_OD);
+        sck::alternateFunction(5);
+        mosi::mode(Mode::ALTERNATE_OD);
+        mosi::alternateFunction(5);
+        dres::mode(Mode::OPEN_DRAIN);
+        nflm::mode(Mode::OPEN_DRAIN);
+        nm::mode(Mode::OPEN_DRAIN);
+        dispoff::mode(Mode::OPEN_DRAIN);
+    }
+
+    nflm::high();
+    nm::high();
+    dispoff::high();
+
+    dres::high();
+    delayUs(10);
+    dres::low();
+    delayUs(10);
+
+    framebuffer=new unsigned short[2048]; //256*128/16=2048
+    unsigned int bba=(reinterpret_cast<unsigned>(framebuffer)-0x20000000)*32;
+    framebufferBitBandAlias=reinterpret_cast<unsigned int*>(0x22000000+bba);
+    memset(framebuffer,0,4096);
+
+    TIM7->CR1=TIM_CR1_OPM;
+    TIM7->DIER=TIM_DIER_UIE;
+    TIM7->PSC=84-1; //84MHz/84=1MHz (1us resolution)
+    TIM7->CNT=0;
+
+    dmaRefill();
+    NVIC_SetPriority(DMA1_Stream4_IRQn,2);//High priority for DMA
+    NVIC_EnableIRQ(DMA1_Stream4_IRQn);
+    NVIC_SetPriority(TIM7_IRQn,3);//High priority for TIM7
+    NVIC_EnableIRQ(TIM7_IRQn);
+
+    SPI2->CR2=SPI_CR2_TXDMAEN;
+    SPI2->CR1=SPI_CR1_DFF      | //16bit mode
+              SPI_CR1_SSM      | //SS pin not connected to SPI
+              SPI_CR1_SSI      | //Internal SS signal pulled high
+              SPI_CR1_LSBFIRST | //Send LSB first
+              SPI_CR1_MSTR     | //Master mode
+              SPI_CR1_SPE      | //SPI enabled, master mode
+              SPI_CR1_BR_0     |
+              SPI_CR1_BR_1;      //42MHz/16=2.625MHz (/4 by the 4094)=0.66MHz
+
+    Thread::sleep(500);
+    dispoff::low();
+}
+
 } //namespace mxgui
 
 #endif //_BOARD_BITSBOARD
diff --git a/drivers/display_bitsboard.h b/drivers/display_bitsboard.h
index e27a8d065a282d37d30049ea5f4f22271bff1597..168ff71c651ec8432b0d50132e22102d71e1f315 100644
--- a/drivers/display_bitsboard.h
+++ b/drivers/display_bitsboard.h
@@ -36,6 +36,7 @@
 #ifdef _BOARD_BITSBOARD
 
 #include <config/mxgui_settings.h>
+#include "display.h"
 #include "point.h"
 #include "color.h"
 #include "font.h"
@@ -52,22 +53,43 @@
 
 namespace mxgui {
 
-class DisplayImpl
+class DisplayImpl : public Display
 {
 public:
     /**
-     * Constructor.
-     * Do not instantiate objects of this type directly from application code,
-     * use Display::instance() instead.
+     * \return an instance to this class (singleton)
      */
-    DisplayImpl();
+    static DisplayImpl& instance();
+    
+    /**
+     * Turn the display On after it has been turned Off.
+     * Display initial state is On.
+     */
+    void doTurnOn() override;
+
+    /**
+     * Turn the display Off. It can be later turned back On.
+     */
+    void doTurnOff() override;
+    
+    /**
+     * Set display brightness. Depending on the underlying driver,
+     * may do nothing.
+     * \param brt from 0 to 100
+     */
+    void doSetBrightness(int brt) override;
+    
+    /**
+     * \return a pair with the display height and width
+     */
+    std::pair<short int, short int> doGetSize() const override;
     
     /**
      * Write text to the display. If text is too long it will be truncated
      * \param p point where the upper left corner of the text will be printed
      * \param text, text to print.
      */
-    void write(Point p, const char *text);
+    void write(Point p, const char *text) override;
 
     /**
      *  Write part of text to the display
@@ -78,13 +100,13 @@ public:
      * \param b Lower right corner of clipping rectangle
      * \param text text to write
      */
-    void clippedWrite(Point p, Point a, Point b, const char *text);
+    void clippedWrite(Point p, Point a, Point b, const char *text) override;
 
     /**
      * Clear the Display. The screen will be filled with the desired color
      * \param color fill color
      */
-    void clear(Color color);
+    void clear(Color color) override;
 
     /**
      * Clear an area of the screen
@@ -92,7 +114,7 @@ public:
      * \param p2 lower right corner of area to clear
      * \param color fill color
      */
-    void clear(Point p1, Point p2, Color color);
+    void clear(Point p1, Point p2, Color color) override;
 
     /**
      * This member function is used on some target displays to reset the
@@ -103,7 +125,7 @@ public:
      * member function, for example line(), you have to call beginPixel() again
      * before calling setPixel().
      */
-    void beginPixel() {}
+    void beginPixel() override;
 
     /**
      * Draw a pixel with desired color. You have to call beginPixel() once
@@ -111,18 +133,7 @@ public:
      * \param p point where to draw pixel
      * \param color pixel color
      */
-    void setPixel(Point p, Color color)
-    {
-        //if(p.x()<0 || p.y()<0 || p.x()>=width || p.y()>=height) return;
-        unsigned short x=p.x();
-        unsigned short y=p.y();
-        if(y>=64)
-        {
-            y-=64;
-            x+=256;
-        }
-        framebufferBitBandAlias[512*y+x]= color ? 0 : 1;
-    }
+    void setPixel(Point p, Color color) override;
 
     /**
      * Draw a line between point a and point b, with color c
@@ -130,7 +141,7 @@ public:
      * \param b second point
      * \param c line color
      */
-    void line(Point a, Point b, Color color);
+    void line(Point a, Point b, Color color) override;
 
     /**
      * Draw an horizontal line on screen.
@@ -141,17 +152,13 @@ public:
      * \param length length of colors array.
      * p.x()+length must be <= display.width()
      */
-    void scanLine(Point p, const Color *colors, unsigned short length);
+    void scanLine(Point p, const Color *colors, unsigned short length) override;
     
     /**
      * \return a buffer of length equal to this->getWidth() that can be used to
      * render a scanline.
      */
-    Color *getScanLineBuffer()
-    {
-        if(buffer==0) buffer=new Color[getWidth()];
-        return buffer;
-    }
+    Color *getScanLineBuffer() override;
     
     /**
      * Draw the content of the last getScanLineBuffer() on an horizontal line
@@ -160,17 +167,14 @@ public:
      * \param length length of colors array.
      * p.x()+length must be <= display.width()
      */
-    void scanLineBuffer(Point p, unsigned short length)
-    {
-        scanLine(p,buffer,length);
-    }
+    void scanLineBuffer(Point p, unsigned short length) override;
 
     /**
      * Draw an image on the screen
      * \param p point of the upper left corner where the image will be drawn
      * \param i image to draw
      */
-    void drawImage(Point p, const ImageBase& img);
+    void drawImage(Point p, const ImageBase& img) override;
 
     /**
      * Draw part of an image on the screen
@@ -181,7 +185,7 @@ public:
      * \param b Lower right corner of clipping rectangle
      * \param i Image to draw
      */
-    void clippedDrawImage(Point p, Point a, Point b, const ImageBase& img);
+    void clippedDrawImage(Point p, Point a, Point b, const ImageBase& img) override;
 
     /**
      * Draw a rectangle (not filled) with the desired color
@@ -189,71 +193,37 @@ public:
      * \param b lower right corner of the rectangle
      * \param c color of the line
      */
-    void drawRectangle(Point a, Point b, Color c);
-
-    /**
-     * \return the display's height
-     */
-    short int getHeight() const { return height; }
-
-    /**
-     * \return the display's width
-     */
-    short int getWidth() const { return width; }
-
-    /**
-     * Turn the display On after it has been turned Off.
-     * Display initial state is On.
-     */
-    void turnOn();
-
-    /**
-     * Turn the display Off. It can be later turned back On.
-     */
-    void turnOff();
-    
-    /**
-     * Set display brightness. Depending on the underlying driver,
-     * may do nothing.
-     * \param brt from 0 to 100
-     */
-    void setBrightness(int brt) {}
+    void drawRectangle(Point a, Point b, Color c) override;
 
     /**
      * Set colors used for writing text
      * \param fgcolor text color
      * \param bgcolor background color
      */
-    void setTextColor(Color fgcolor, Color bgcolor);
-
-    /**
-     * \return the current foreground color.
-     * The foreground color is used to draw text on screen
-     */
-    Color getForeground() const { return textColor[3]; }
+    void setTextColor(std::pair<Color,Color> colors) override;
 
-    /**
-     * \return the current background color.
-     * The foreground color is used to draw text on screen
+   /**
+     * \return a pair with the foreground and background colors.
+     * Those colors are used to draw text on screen
      */
-    Color getBackground() const { return textColor[0]; }
+    std::pair<Color,Color> getTextColor() const override;
 
     /**
      * Set the font used for writing text
      * \param font new font
      */
-    void setFont(const Font& font);
+    void setFont(const Font& font) override;
 
     /**
      * \return the current font used to draw text
      */
-    Font getFont() const { return font; }
+    Font getFont() const override;
 
     /**
      * Make all changes done to the display since the last call to update()
-     * visible. This backends require it.
+     * visible. This backends does not require it, so it is empty.
      */
-    void update() {}
+    void update() override;
 
     /**
      * Pixel iterator. A pixel iterator is an output iterator that allows to
@@ -427,12 +397,15 @@ public:
     /**
      * Destructor
      */
-    ~DisplayImpl()
-    {
-        if(buffer) delete[] buffer;
-    }
+    ~DisplayImpl() override;
 
 private:
+    /**
+     * Constructor.
+     * Do not instantiate objects of this type directly from application code.
+     */
+    DisplayImpl();
+    
     #if defined MXGUI_ORIENTATION_VERTICAL || \
         defined MXGUI_ORIENTATION_VERTICAL_MIRRORED
     static const short int width=128;