diff --git a/app/SandboxSetup/SandboxSetup.pro b/app/SandboxSetup/SandboxSetup.pro
index 7af29b715ca468f7dec4d23ce20f06ff9ae9f55f..f734889cd45bd7bd8103496c23d727c6d642c5b2 100644
--- a/app/SandboxSetup/SandboxSetup.pro
+++ b/app/SandboxSetup/SandboxSetup.pro
@@ -65,7 +65,10 @@ FORMS += \
 
 INCLUDEPATH += ../../inc
 
-LIBS += -L"../../build" -lsandbox -lrealsense2 -lyaml-cpp
+LIBS += -L"../../build" -lsandbox
+LIBS += -lrealsense2
+LIBS += -lyaml-cpp
+LIBS += -lXrandr -lX11
 LIBS += $(shell pkg-config --libs --cflags opencv)
 
 #QMAKE_CXXFLAGS += -fsanitize=address -fsanitize=leak -fsanitize=undefined
diff --git a/app/SandboxSetup/monitorgui.cpp b/app/SandboxSetup/monitorgui.cpp
index d2dbd2a6aae63cfec673a886e1a93a49aecab71c..3247aac86e39a944f563b75e03217695441ae1cd 100644
--- a/app/SandboxSetup/monitorgui.cpp
+++ b/app/SandboxSetup/monitorgui.cpp
@@ -1,5 +1,7 @@
 #include "monitorgui.h"
 #include "ui_monitorgui.h"
+#include <X11/Xlib.h>
+#include <X11/extensions/Xrandr.h>
 
 MonitorGui::MonitorGui(SandboxSetup *_setup, QWidget *parent) :
     SubApp("Monitors", "Cancel resolution", parent),
@@ -11,7 +13,7 @@ MonitorGui::MonitorGui(SandboxSetup *_setup, QWidget *parent) :
 
     std::string path = ".monitors.tmp";
     monitors = std::map<std::string, std::vector<std::string>>();
-    initMonitorMapWithFile(path);
+    initMonitorMap();
     QList<QScreen*> screens = QApplication::screens();
 
     for(int i=0; i<screens.size(); i++){
@@ -80,17 +82,40 @@ void MonitorGui::on_cbxOutputs_currentIndexChanged(int index)
     showMonitorsScreenshot(sc);
 }
 
+void MonitorGui::initMonitorMap(){
 
-void MonitorGui::initMonitorMapWithFile(std::string path){
+    Display *dp = XOpenDisplay(NULL);
+    if(dp){
+        XRRScreenResources *screen = XRRGetScreenResources (dp, DefaultRootWindow(dp));
 
-    // Save in file the monitors and their resolutions
-    int err = system( ("xrandr | sed -n '1!p' > " + path).c_str() );
-    if(err){
-        std::cout << "Couldn't get screens and their resolutions" << std::endl;
-        exit(err);
+        // 4 display ports
+        for(int i=0; i<screen->ncrtc; i++){
+            XRRCrtcInfo *info = XRRGetCrtcInfo (dp, screen, screen->crtcs[i]);
+
+            // 2 display port ON
+            for(int j=0; j<info->noutput; j++){
+
+                XRROutputInfo *output = XRRGetOutputInfo(dp, screen, info->outputs[j]);
+                if(output->nmode > 0){
+                    std::string key = std::string(output->name);
+                    monitors[key] = std::vector<std::string>();
+
+                    for(int k=0; k<output->nmode; k++){
+                        XRRModeInfo resolution = screen->modes[k];
+                        std::string res = std::string(std::to_string(resolution.width) + "x" + std::to_string(resolution.height));
+
+                        if(std::find(monitors[key].begin(), monitors[key].end(), res) == monitors[key].end())
+                            monitors[key].push_back(res);
+                    }
+                }
+                XRRFreeOutputInfo(output);
+            }
+            XRRFreeCrtcInfo(info);
+        }
+        XRRFreeScreenResources(screen);
+        XCloseDisplay(dp);
     }
-    loadResolutionsFromFile(path);
-    std::remove(path.c_str());
+
 }
 
 // load resolutions into GUI
@@ -119,31 +144,6 @@ std::vector<std::string> MonitorGui::splitResolution(std::string s){
     return res;
 }
 
-bool MonitorGui::isResolution(std::string s){
-    return splitResolution(s).size() == 2;
-}
-
-void MonitorGui::loadResolutionsFromFile(std::string path){
-    // Get monitors and their resolutions into a Map
-    std::ifstream infile(path);
-    std::string line;
-    std::string key;
-
-    while (std::getline(infile, line)){
-
-        std::istringstream iss(line);
-        std::string l;
-        iss >> l;
-
-        if(!isResolution(l)){
-            key = l;
-            monitors[key] = std::vector<std::string>();
-        }else{
-            monitors[key].push_back(l);
-        }
-    }
-}
-
 void MonitorGui::showMonitorsScreenshot(QScreen *screen){
     QPixmap px = screen->grabWindow(0);
     ui->lblScreenshot->setPixmap(px);
diff --git a/app/SandboxSetup/monitorgui.h b/app/SandboxSetup/monitorgui.h
index 6d9c0856dc6596c0963478b1a031d96afca7ed68..642272206139d76c9458033e49cf20e47908e57a 100644
--- a/app/SandboxSetup/monitorgui.h
+++ b/app/SandboxSetup/monitorgui.h
@@ -50,10 +50,8 @@ private:
     QScreen* getMonitor();
     void loadResolutionsOf(QScreen* screen);
     std::vector<std::string> splitResolution(std::string s);
-    bool isResolution(std::string s);
-    void loadResolutionsFromFile(std::string path);
-    void initMonitorMapWithFile(std::string path);
     void showMonitorsScreenshot(QScreen *screen);
+    void initMonitorMap();
 };
 
 #endif // MONITORGUI_H