diff --git a/app/SandboxSetup/beamerlocationgui.cpp b/app/SandboxSetup/beamerlocationgui.cpp
index f0bc3a34c72ee32fbf49d0d055ddc2460153a5eb..378e6cc933e8017d5a17ddbe1bbb8fa3bdc1aea2 100644
--- a/app/SandboxSetup/beamerlocationgui.cpp
+++ b/app/SandboxSetup/beamerlocationgui.cpp
@@ -20,6 +20,7 @@ BeamerLocationGui::BeamerLocationGui(SandboxSetup *_setup, MonitorGui *_mg, QWid
     mg = _mg;
     winFullScreen = new QtFullScreen(mg->getResolution(), true, this);
     ui->setupUi(this);
+    ui->txtInstructions->setAlignment(Qt::AlignJustify);
     myThread = new RefreshFrame(this);
     timer = new QTimer(this);
     connect(timer, &QTimer::timeout, this, &BeamerLocationGui::refreshRoutine);
@@ -71,8 +72,15 @@ void BeamerLocationGui::startRoutine(){
     bases = std::vector<cv::Point3d>();
     capturedPoints = std::vector<cv::Point3f>();
     circle = std::vector<cv::Point3i>();
+    updateLabelSteps();
 
-    timer->start(200);
+    if(myThread->isRunning()){
+        myThread->exit(0);
+        myThread->wait();
+    }
+
+    if(!timer->isActive())
+        timer->start(100);
 
 }
 
@@ -126,13 +134,14 @@ void BeamerLocationGui::userValidePoint(){
     if(!circle.empty()){
 
         capturedPoints.push_back( beamer->deprojectPixel(circle.at(0), &depth, camera) );
+        updateLabelSteps();
 
         // enough points to perform linear regression and move into next step
         if(capturedPoints.size() >= beamer->MAX_LINEAR_LINE_POINTS){
 
             beamer->findLinearLineFrom(&capturedPoints, &bases, &directions);
-            capturedPoints = std::vector<cv::Point3f>();
-            circle = std::vector<cv::Point3i>();
+            capturedPoints.clear();
+            circle.clear();
             stepCross++;
 
             if((uint)stepCross >= crosses.size()){
@@ -145,18 +154,34 @@ void BeamerLocationGui::userValidePoint(){
 
 void BeamerLocationGui::endRoutine(){
 
-        timer->stop();
-        myThread->exit(0);
-        myThread->wait();
-
+    timer->stop();
+    myThread->exit(0);
+    myThread->wait();
 
     endSuccess = (bases.size() == beamer->MAX_LINEAR_LINE_POINTS && directions.size() == beamer->MAX_LINEAR_LINE_POINTS);
 
     if(endSuccess){
         // send to parent ReadyToValide
-        emit sendNotif();
+        emit sendNotif(1);
     }
     winFullScreen->close();
+
+    cv::Mat black = cv::Mat(1, 1, CV_8UC3, cv::Scalar(0, 0, 0));
+    QPixmap px = QPixmap::fromImage( QImage( (uchar *)black.data,
+                                             (int)black.cols,
+                                             (int)black.rows,
+                                             static_cast<int>(black.step.buf[0]),
+                                             QImage::Format_RGB888 ) );
+    ui->lblFrame->setPixmap(px);
+}
+
+
+void BeamerLocationGui::updateLabelSteps(){
+
+    int state = stepCross*beamer->MAX_LINEAR_LINE_POINTS + capturedPoints.size() + 1;
+    int max = crosses.size() * beamer->MAX_LINEAR_LINE_POINTS;
+    std::string msg = (state <= max) ? std::to_string(state)+"/"+std::to_string(max) : "Complet";
+    ui->lblSteps->setText( QString( msg.c_str() ) );
 }
 
 
@@ -164,3 +189,9 @@ void BeamerLocationGui::on_btnLock_clicked()
 {
     userValidePoint();
 }
+
+void BeamerLocationGui::on_btnRestart_clicked()
+{
+    emit sendNotif(0);
+    startRoutine();
+}
diff --git a/app/SandboxSetup/beamerlocationgui.h b/app/SandboxSetup/beamerlocationgui.h
index 2cf6ede1d3245a776d9b275efdca11d4d8bde353..b7e407abc3c4e12076040f358af16218b5f338ec 100644
--- a/app/SandboxSetup/beamerlocationgui.h
+++ b/app/SandboxSetup/beamerlocationgui.h
@@ -33,6 +33,8 @@ private slots:
 
     void on_btnLock_clicked();
 
+    void on_btnRestart_clicked();
+
 private:
     class RefreshFrame : public QThread
     {
@@ -69,6 +71,7 @@ private:
     void userValidePoint();
     void endRoutine();
     void refreshRoutine();
+    void updateLabelSteps();
 };
 
 #endif // BEAMERLOCATIONGUI_H
diff --git a/app/SandboxSetup/beamerlocationgui.ui b/app/SandboxSetup/beamerlocationgui.ui
index 092fa9252624f9866ab7548d1cb7c79d96885ff0..6bb6fc48258fd56b02b446aae0a552c959226e7d 100644
--- a/app/SandboxSetup/beamerlocationgui.ui
+++ b/app/SandboxSetup/beamerlocationgui.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>632</width>
-    <height>628</height>
+    <height>639</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -94,6 +94,35 @@ p, li { white-space: pre-wrap; }
     <bool>true</bool>
    </property>
   </widget>
+  <widget class="QLabel" name="lblSteps">
+   <property name="geometry">
+    <rect>
+     <x>416</x>
+     <y>20</y>
+     <width>101</width>
+     <height>20</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>0/0</string>
+   </property>
+   <property name="alignment">
+    <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="btnRestart">
+   <property name="geometry">
+    <rect>
+     <x>490</x>
+     <y>330</y>
+     <width>89</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Restart</string>
+   </property>
+  </widget>
  </widget>
  <resources/>
  <connections/>
diff --git a/app/SandboxSetup/camerafocus.cpp b/app/SandboxSetup/camerafocus.cpp
index 73af3992223cc3e5b79f336ccdce92a714eac7bb..8a8b2bfb01b70322046dd90f13ec9cb4905a37ca 100644
--- a/app/SandboxSetup/camerafocus.cpp
+++ b/app/SandboxSetup/camerafocus.cpp
@@ -109,8 +109,8 @@ void CameraFocus::refreshFrame(){
     cv::cvtColor(cannyGray, cannyRgb, CV_GRAY2BGR);
 
     if(!crc.empty()){
-        cv::circle(rgbFromGray, cv::Point(crc[0].x, crc[0].y), crc[0].z, cv::Scalar(0,255,0), 2);
-        cv::circle(cannyRgb, cv::Point(crc[0].x, crc[0].y), crc[0].z, cv::Scalar(0,255,0), 2);
+        cv::circle(rgbFromGray, cv::Point(crc[0].x, crc[0].y), crc[0].z, cv::Scalar(0,255,0), 3);
+        cv::circle(cannyRgb, cv::Point(crc[0].x, crc[0].y), crc[0].z, cv::Scalar(0,255,0), 3);
     }
 
     QImage img = QImage((uchar *)rgbFromGray.data, (int)rgbFromGray.cols, (int)rgbFromGray.rows, static_cast<int>(rgbFromGray.step.buf[0]), QImage::Format_RGB888);
diff --git a/app/SandboxSetup/croppingmask.cpp b/app/SandboxSetup/croppingmask.cpp
index 7d060c11b08a95f1c21a3c6d00806b8be424a11b..f96a754bbb6df7ed1aa01ca9a0f2694a38d62e90 100644
--- a/app/SandboxSetup/croppingmask.cpp
+++ b/app/SandboxSetup/croppingmask.cpp
@@ -9,6 +9,7 @@ CroppingMask::CroppingMask(SandboxSetup *sandbox, MonitorGui *_mg, QWidget *pare
     setup = sandbox;
     mg = _mg;
     ui->setupUi(this);
+    ui->txtInstructions->setAlignment(Qt::AlignJustify);
     maskEdit = new MaskEdit(ui->frame->geometry());
     ui->vLayout->addWidget(maskEdit, 1);
 
diff --git a/app/SandboxSetup/croppingmask.ui b/app/SandboxSetup/croppingmask.ui
index 3a098486be4a45bdf797d7430b9ea688c6fb2295..a1fb692813daae9e982f7aff515b173b5e8ecb4b 100644
--- a/app/SandboxSetup/croppingmask.ui
+++ b/app/SandboxSetup/croppingmask.ui
@@ -57,15 +57,18 @@
     <string>Instructions :</string>
    </property>
   </widget>
-  <widget class="QTextEdit" name="textEdit">
+  <widget class="QTextEdit" name="txtInstructions">
    <property name="geometry">
     <rect>
-     <x>60</x>
-     <y>400</y>
-     <width>441</width>
-     <height>121</height>
+     <x>40</x>
+     <y>390</y>
+     <width>561</width>
+     <height>91</height>
     </rect>
    </property>
+   <property name="readOnly">
+    <bool>true</bool>
+   </property>
    <property name="html">
     <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
 &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
diff --git a/app/SandboxSetup/initcamera.cpp b/app/SandboxSetup/initcamera.cpp
index 4861aea32ff6e75d8f0b1727023ddf5bcf0a2738..f1f397896ea2388d5f1cbf3b774b5a3e6aed8257 100644
--- a/app/SandboxSetup/initcamera.cpp
+++ b/app/SandboxSetup/initcamera.cpp
@@ -49,7 +49,7 @@ void InitCamera::setupCamera(){
 }
 
 void InitCamera::setupReady(){
-    emit sendNotif();
+    emit sendNotif(0);
 }
 
 
diff --git a/app/SandboxSetup/mainwindow.cpp b/app/SandboxSetup/mainwindow.cpp
index 0f17b0dbc3c506b746eec5902a74710d21ab1d99..0f3b4ccd26c7fbb5353004f514659ca064ada368 100644
--- a/app/SandboxSetup/mainwindow.cpp
+++ b/app/SandboxSetup/mainwindow.cpp
@@ -60,7 +60,7 @@ void MainWindow::closeEvent(QCloseEvent *event){
     QWidget::closeEvent(event);
 }
 
-void MainWindow::receiveNotif(){
+void MainWindow::receiveNotif(int state){
 
     // active app : InitCamera
     if( strcmp( applist.at(step)->metaObject()->className(), init->metaObject()->className() ) == 0 ){
@@ -69,7 +69,7 @@ void MainWindow::receiveNotif(){
     }
     // active app : BeamerLocation
     else if( strcmp( applist.at(step)->metaObject()->className(), bl->metaObject()->className() ) == 0 ){
-        ui->btnNext->setVisible(true);
+            ui->btnNext->setVisible(state);
     }
     // active app : SaveConfig
     else if( strcmp( applist.at(step)->metaObject()->className(), scfg->metaObject()->className() ) == 0 ){
diff --git a/app/SandboxSetup/mainwindow.h b/app/SandboxSetup/mainwindow.h
index a1a86ed76cf37680949696f6ff762b48fe7c67dc..d5d2de153b3f90553873a515c70ed790a3a9ee5f 100644
--- a/app/SandboxSetup/mainwindow.h
+++ b/app/SandboxSetup/mainwindow.h
@@ -33,7 +33,7 @@ private slots:
 
     void on_btnPrev_clicked();
 
-    void receiveNotif();
+    void receiveNotif(int state);
 
     void on_btnFinish_clicked();
 
diff --git a/app/SandboxSetup/monitorgui.cpp b/app/SandboxSetup/monitorgui.cpp
index 37d41d0715e890c1091229f300cde44b9dec0ccc..124b7dd71239e87a5b728ff2c73847c4159e7a42 100644
--- a/app/SandboxSetup/monitorgui.cpp
+++ b/app/SandboxSetup/monitorgui.cpp
@@ -23,6 +23,7 @@ MonitorGui::MonitorGui(SandboxSetup *_setup, QWidget *parent) :
         loadResolutionsOf(screens[0]);
         showMonitorsScreenshot(screens[0]);
     }
+    ui->txtInstructions->setAlignment(Qt::AlignJustify);
 }
 
 MonitorGui::~MonitorGui()
diff --git a/app/SandboxSetup/monitorgui.ui b/app/SandboxSetup/monitorgui.ui
index 58ef531033c67adbc66d80e9bddc78241166953e..7f9d0af4533d7dd2b8d4d4cc01c79c9583b255e9 100644
--- a/app/SandboxSetup/monitorgui.ui
+++ b/app/SandboxSetup/monitorgui.ui
@@ -75,13 +75,13 @@
     <bool>true</bool>
    </property>
   </widget>
-  <widget class="QTextEdit" name="textEdit">
+  <widget class="QTextEdit" name="txtInstructions">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>290</y>
-     <width>481</width>
-     <height>121</height>
+     <width>551</width>
+     <height>101</height>
     </rect>
    </property>
    <property name="readOnly">
@@ -95,10 +95,22 @@ p, li { white-space: pre-wrap; }
 &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;You must choose the ouput matching your beamer. &lt;/p&gt;
 &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
 &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Note :&lt;/p&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
 &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Your screens must be in extended mode (as if you have a large desktop that covers all of your screens).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
    </property>
   </widget>
+  <widget class="QLabel" name="label_3">
+   <property name="geometry">
+    <rect>
+     <x>40</x>
+     <y>270</y>
+     <width>131</width>
+     <height>17</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Insctructions :</string>
+   </property>
+  </widget>
  </widget>
  <resources/>
  <connections/>
diff --git a/app/SandboxSetup/projectiongui.cpp b/app/SandboxSetup/projectiongui.cpp
index f2a9a46a8c0b14e3de262365720367f1555e70ad..6f1a1a5235a5d143f7eaff4f666a1afcc3e15502 100644
--- a/app/SandboxSetup/projectiongui.cpp
+++ b/app/SandboxSetup/projectiongui.cpp
@@ -9,7 +9,7 @@ ProjectionGui::ProjectionGui(SandboxSetup *_setup, MonitorGui *_mg, QWidget *par
     mg = _mg;
     ui->setupUi(this);
     ui->lblFrame->setGeometry(0, 0, ui->fContainer->width(), ui->fContainer->height());
-
+    ui->txtInstructions->setAlignment(Qt::AlignJustify);
     blueScreen = new QtFullScreen(mg->getResolution(), true, this);
 
     frameTimer = new QTimer(this);
diff --git a/app/SandboxSetup/projectiongui.ui b/app/SandboxSetup/projectiongui.ui
index 8d5c9cbb582e2a9365e3b93d3308ba501e258d93..46ab5c4d3d91e085fd17e90eeed36d469def32d5 100644
--- a/app/SandboxSetup/projectiongui.ui
+++ b/app/SandboxSetup/projectiongui.ui
@@ -61,41 +61,60 @@
     <string>Start</string>
    </property>
   </widget>
-  <widget class="QLabel" name="label">
+  <widget class="QPushButton" name="btnStop">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
    <property name="geometry">
     <rect>
-     <x>40</x>
-     <y>360</y>
-     <width>441</width>
-     <height>61</height>
+     <x>520</x>
+     <y>90</y>
+     <width>89</width>
+     <height>25</height>
     </rect>
    </property>
    <property name="text">
-    <string>Project a blue screen on the previously selected output to help you setup your beamer manually</string>
+    <string>Stop</string>
    </property>
-   <property name="alignment">
-    <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+  </widget>
+  <widget class="QTextEdit" name="txtInstructions">
+   <property name="geometry">
+    <rect>
+     <x>30</x>
+     <y>370</y>
+     <width>581</width>
+     <height>101</height>
+    </rect>
    </property>
-   <property name="wordWrap">
+   <property name="readOnly">
     <bool>true</bool>
    </property>
-  </widget>
-  <widget class="QPushButton" name="btnStop">
-   <property name="enabled">
-    <bool>true</bool>
+   <property name="html">
+    <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Project a blue screen on the previously selected output to help you setup your beamer and camera manually. Adjust the position and orientation of your beamer to project the blue frame in your sandbox. Then adjust the position and oritentation of your camera to capture the blue screen projected. Try to set your camera, so the camera's point of view above is mostly filled with the blue screen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
    </property>
+  </widget>
+  <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
-     <x>520</x>
-     <y>90</y>
-     <width>89</width>
-     <height>25</height>
+     <x>30</x>
+     <y>350</y>
+     <width>91</width>
+     <height>17</height>
     </rect>
    </property>
    <property name="text">
-    <string>Stop</string>
+    <string>Instructions :</string>
    </property>
   </widget>
+  <zorder>txtInstructions</zorder>
+  <zorder>fContainer</zorder>
+  <zorder>btnStart</zorder>
+  <zorder>btnStop</zorder>
+  <zorder>label</zorder>
  </widget>
  <resources/>
  <connections/>
diff --git a/app/SandboxSetup/saveconfiggui.cpp b/app/SandboxSetup/saveconfiggui.cpp
index fc4d33af9e2f13045caac5d6cd76e336e603a7dc..16f341cd087d0cc08ba2b04d03364eee0a90f860 100644
--- a/app/SandboxSetup/saveconfiggui.cpp
+++ b/app/SandboxSetup/saveconfiggui.cpp
@@ -28,5 +28,5 @@ void SaveConfigGui::saveConfig(){
     }
     setup->getCamera()->stop();
     ui->lblMessage->setText(QString(msg.c_str()));
-    emit sendNotif();
+    emit sendNotif(0);
 }
diff --git a/app/SandboxSetup/subapp.h b/app/SandboxSetup/subapp.h
index 87be1c95da0a9781deb10396dc853491b26a77a6..858f2c387f08064d0abfb0fd2abcde101bbf4323 100644
--- a/app/SandboxSetup/subapp.h
+++ b/app/SandboxSetup/subapp.h
@@ -18,7 +18,7 @@ public:
     virtual void cancelRoutine();
 
 signals:
-    void sendNotif();
+    void sendNotif(int state);
 
 protected:
     bool endSuccess = false;
diff --git a/src/components/beamer.cpp b/src/components/beamer.cpp
index 72bdb572f6ffc051758e73f942d0e75803684f62..e65277d647e66cf83f10685a3357f7b0a85613b1 100644
--- a/src/components/beamer.cpp
+++ b/src/components/beamer.cpp
@@ -208,13 +208,13 @@ int LineLineIntersect(
     return (true);
 }
 
-
 cv::Mat Beamer::editContrast(cv::Mat image, double contrast, int brightness){
 
     cv::Mat new_image = cv::Mat::zeros( image.size(), image.type() );
     double alpha = contrast;
     int beta = brightness;
 
+    // source : https://docs.opencv.org/2.4/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html
     for( int y = 0; y < image.rows; y++ ) {
         for( int x = 0; x < image.cols; x++ ) {
             new_image.at<uchar>(y,x) = cv::saturate_cast<uchar>( alpha*image.at<uchar>(y,x) + beta );