diff --git a/mainwindow.cpp b/mainwindow.cpp
index b804dd9..b13b18b 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -1,45 +1,67 @@
 #include "mainwindow.h"
-#include "ui_mainwindow.h"
-#include "sparrowrenderer.h"
+#include <QtCore/QVariant>
+#include <QtWidgets/QAction>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QButtonGroup>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QHeaderView>
+#include <QtWidgets/QMainWindow>
+#include <QtWidgets/QMenu>
+#include <QtWidgets/QMenuBar>
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QWidget>
+#include "modulewidget.h"
+#include "resourcewidget.h"
+#include "myglwidget.h"
 
-MainWindow::MainWindow(QWidget *parent) :
-    QMainWindow(parent),
-    ui(new Ui::MainWindow)
+MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
 {
-    ui->setupUi(this);
+    setWindowTitle("SparrowRenderer");
+    resize(800, 600);
+
+    // modules widget
+    moduleWidget = new ModuleWidget(this);
+    addDockWidget(Qt::LeftDockWidgetArea, moduleWidget);
+
+    // resources widget
+    resourceWidget = new ResourceWidget(this);
+    addDockWidget(Qt::RightDockWidgetArea, resourceWidget);
+
+    // opengl widget
+    openGLWidget = new OpenGLWidget(this);
+    openGLWidget->setRenderer(moduleWidget);
+    setCentralWidget(openGLWidget);
+
+    // actions
+    actionExit = new QAction(this);
+    actionExit->setText("Exit");
+
+    actionShowModuleWidget = new QAction(this);
+    actionShowModuleWidget->setText("Modules");
+    actionShowModuleWidget->setEnabled(false);
+
+    // menubar
+    menuBar = new QMenuBar(this);
+    menuBar->setGeometry(QRect(0, 0, 800, 22));
+    menuMenu = new QMenu(menuBar);
+    menuMenu->setTitle("Main menu");
+    menuMenu->addAction(actionShowModuleWidget);
+    menuMenu->addAction(actionExit);
+    menuBar->addAction(menuMenu->menuAction());
+    menuBar->setNativeMenuBar(false);
+    setMenuBar(menuBar);
+
+    // connect signals to slots
+    QObject::connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));
+    QObject::connect(moduleWidget, SIGNAL(visibilityChanged(bool)), actionShowModuleWidget, SLOT(setDisabled(bool)));
+    QObject::connect(actionShowModuleWidget, SIGNAL(triggered()), this, SLOT(reopenModuleWidget()));
+    QObject::connect(openGLWidget, SIGNAL(modulesChanged()), moduleWidget, SLOT(updateList()));
+    QObject::connect(openGLWidget, SIGNAL(modulesChanged()), resourceWidget, SLOT(updateList()));
+
+    QMetaObject::connectSlotsByName(this);
 }
 
-MainWindow::~MainWindow()
+void MainWindow::reopenModuleWidget()
 {
-    delete ui;
-}
-
-void MainWindow::dockWidgetClosed()
-{
-    emit(ui->dockWidget->setVisible(true));
-}
-
-void MainWindow::updateTree()
-{
-    QTreeWidget* tree = ui->treeWidget;
-    SparrowRenderer* renderer = ui->openGLWidget->getRenderer();
-    tree->clear();
-    for(int i=0; i<renderer->getNbModules(); ++i)
-    {
-        std::string moduleName = renderer->getModuleName(i);
-        QTreeWidgetItem* item = new QTreeWidgetItem();
-        item->setText(0, QString(moduleName.c_str()));
-        tree->addTopLevelItem(item);
-    }
-}
-
-void MainWindow::moduleSetEnabled(QTreeWidgetItem* item, int button)
-{
-    SparrowRenderer* renderer = ui->openGLWidget->getRenderer();
-    std::string name = item->text(0).toStdString();
-    if(renderer->isModuleEnabled(name))
-        renderer->disableModule(name);
-    else
-        renderer->enableModule(name);
-    ui->openGLWidget->updateGL();
+    emit(moduleWidget->setVisible(true));
 }
diff --git a/mainwindow.h b/mainwindow.h
index c494f43..440a9f9 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -3,7 +3,9 @@
 
 #include <QMainWindow>
 
-class QTreeWidgetItem;
+class OpenGLWidget;
+class ModuleWidget;
+class ResourceWidget;
 
 namespace Ui {
 class MainWindow;
@@ -15,15 +17,18 @@ class MainWindow : public QMainWindow
 
 public:
     explicit MainWindow(QWidget *parent = 0);
-    ~MainWindow();
 
 private:
-    Ui::MainWindow *ui;
+    QAction *actionExit;
+    QAction *actionShowModuleWidget;
+    QMenuBar *menuBar;
+    QMenu *menuMenu;
+    OpenGLWidget *openGLWidget;
+    ModuleWidget *moduleWidget;
+    ResourceWidget *resourceWidget;
 
-public slots:
-    void dockWidgetClosed();
-    void updateTree();
-    void moduleSetEnabled(QTreeWidgetItem* item, int button);
+private slots:
+    void reopenModuleWidget();
 };
 
 #endif // MAINWINDOW_H
diff --git a/mainwindow.ui b/mainwindow.ui
deleted file mode 100644
index 634380d..0000000
--- a/mainwindow.ui
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>854</width>
-    <height>510</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>MainWindow</string>
-  </property>
-  <widget class="QWidget" name="centralWidget">
-   <layout class="QHBoxLayout" name="horizontalLayout">
-    <property name="spacing">
-     <number>0</number>
-    </property>
-    <property name="leftMargin">
-     <number>0</number>
-    </property>
-    <property name="topMargin">
-     <number>0</number>
-    </property>
-    <property name="rightMargin">
-     <number>0</number>
-    </property>
-    <property name="bottomMargin">
-     <number>0</number>
-    </property>
-    <item>
-     <widget class="MyGLWidget" name="openGLWidget"/>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QMenuBar" name="menuBar">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>854</width>
-     <height>21</height>
-    </rect>
-   </property>
-   <widget class="QMenu" name="menuMenu">
-    <property name="title">
-     <string>menu</string>
-    </property>
-    <addaction name="actionShow_control_panel"/>
-    <addaction name="actionExit"/>
-   </widget>
-   <addaction name="menuMenu"/>
-  </widget>
-  <widget class="QDockWidget" name="dockWidget">
-   <attribute name="dockWidgetArea">
-    <number>1</number>
-   </attribute>
-   <widget class="QWidget" name="dockWidgetContents">
-    <layout class="QVBoxLayout" name="verticalLayout">
-     <property name="spacing">
-      <number>0</number>
-     </property>
-     <property name="leftMargin">
-      <number>0</number>
-     </property>
-     <property name="topMargin">
-      <number>0</number>
-     </property>
-     <property name="rightMargin">
-      <number>0</number>
-     </property>
-     <property name="bottomMargin">
-      <number>0</number>
-     </property>
-     <item>
-      <widget class="QTreeWidget" name="treeWidget">
-       <column>
-        <property name="text">
-         <string notr="true">rendering pipeline</string>
-        </property>
-       </column>
-      </widget>
-     </item>
-    </layout>
-   </widget>
-  </widget>
-  <action name="actionExit">
-   <property name="text">
-    <string>exit</string>
-   </property>
-  </action>
-  <action name="actionShow_control_panel">
-   <property name="enabled">
-    <bool>false</bool>
-   </property>
-   <property name="text">
-    <string>show control panel</string>
-   </property>
-  </action>
- </widget>
- <layoutdefault spacing="6" margin="11"/>
- <customwidgets>
-  <customwidget>
-   <class>MyGLWidget</class>
-   <extends>QOpenGLWidget</extends>
-   <header>myglwidget.h</header>
-   <slots>
-    <signal>modulesChanged()</signal>
-   </slots>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections>
-  <connection>
-   <sender>actionExit</sender>
-   <signal>triggered()</signal>
-   <receiver>MainWindow</receiver>
-   <slot>close()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>426</x>
-     <y>254</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>dockWidget</sender>
-   <signal>visibilityChanged(bool)</signal>
-   <receiver>actionShow_control_panel</receiver>
-   <slot>setDisabled(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>127</x>
-     <y>265</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionShow_control_panel</sender>
-   <signal>triggered()</signal>
-   <receiver>MainWindow</receiver>
-   <slot>dockWidgetClosed()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>426</x>
-     <y>254</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>openGLWidget</sender>
-   <signal>modulesChanged()</signal>
-   <receiver>MainWindow</receiver>
-   <slot>updateTree()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>555</x>
-     <y>265</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>426</x>
-     <y>254</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>treeWidget</sender>
-   <signal>itemClicked(QTreeWidgetItem*,int)</signal>
-   <receiver>MainWindow</receiver>
-   <slot>moduleSetEnabled(QTreeWidgetItem*,int)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>127</x>
-     <y>276</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>426</x>
-     <y>254</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
- <slots>
-  <slot>dockWidgetClosed()</slot>
-  <slot>updateTree()</slot>
-  <slot>moduleSetEnabled(QTreeWidgetItem*,int)</slot>
- </slots>
-</ui>
diff --git a/modulewidget.cpp b/modulewidget.cpp
new file mode 100644
index 0000000..dbcd09a
--- /dev/null
+++ b/modulewidget.cpp
@@ -0,0 +1,33 @@
+#include "modulewidget.h"
+#include "ui_modulewidget.h"
+
+ModuleWidget::ModuleWidget(QWidget *parent) :
+    QDockWidget(parent),
+    ui(new Ui::ModuleWidget)
+{
+    ui->setupUi(this);
+}
+
+ModuleWidget::~ModuleWidget()
+{
+    delete ui;
+}
+
+void ModuleWidget::updateList()
+{
+    QListWidget* list = ui->listWidget;
+    list->clear();
+    for(ModuleNode& m : modules)
+        list->addItem(new QListWidgetItem(QString(m.name.c_str())));
+}
+
+/*void ModuleWidget::moduleSetEnabled(QTreeWidgetItem* item, int button)
+{
+    SparrowRenderer* renderer = ui->openGLWidget->getRenderer();
+    std::string name = item->text(0).toStdString();
+    if(renderer->isModuleEnabled(name))
+        renderer->disableModule(name);
+    else
+        renderer->enableModule(name);
+    ui->openGLWidget->updateGL();
+}*/
diff --git a/modulewidget.h b/modulewidget.h
new file mode 100644
index 0000000..df402f8
--- /dev/null
+++ b/modulewidget.h
@@ -0,0 +1,26 @@
+#ifndef MODULEWIDGET_H
+#define MODULEWIDGET_H
+
+#include <QDockWidget>
+#include "sparrowrenderer.h"
+
+namespace Ui {
+class ModuleWidget;
+}
+
+class ModuleWidget : public QDockWidget, public SparrowRenderer
+{
+    Q_OBJECT
+
+public:
+    explicit ModuleWidget(QWidget *parent = 0);
+    ~ModuleWidget();
+
+private:
+    Ui::ModuleWidget *ui;
+
+public slots:
+    void updateList();
+};
+
+#endif // MODULEWIDGET_H
diff --git a/modulewidget.ui b/modulewidget.ui
new file mode 100644
index 0000000..1f606d2
--- /dev/null
+++ b/modulewidget.ui
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ModuleWidget</class>
+ <widget class="QDockWidget" name="ModuleWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>141</width>
+    <height>392</height>
+   </rect>
+  </property>
+  <property name="allowedAreas">
+   <set>Qt::LeftDockWidgetArea</set>
+  </property>
+  <property name="windowTitle">
+   <string>Modules</string>
+  </property>
+  <widget class="QWidget" name="dockWidgetContents">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="spacing">
+     <number>0</number>
+    </property>
+    <property name="leftMargin">
+     <number>0</number>
+    </property>
+    <property name="topMargin">
+     <number>0</number>
+    </property>
+    <property name="rightMargin">
+     <number>0</number>
+    </property>
+    <property name="bottomMargin">
+     <number>0</number>
+    </property>
+    <item>
+     <widget class="QListWidget" name="listWidget"/>
+    </item>
+    <item>
+     <widget class="QWidget" name="widget" native="true">
+      <layout class="QGridLayout" name="gridLayout">
+       <item row="0" column="0">
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>157</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/myglwidget.cpp b/myglwidget.cpp
index f573c14..4b6808d 100644
--- a/myglwidget.cpp
+++ b/myglwidget.cpp
@@ -20,26 +20,25 @@
 #include <QKeyEvent>
 #include <QMouseEvent>
 
-MyGLWidget::MyGLWidget(QWidget *parent) :
+OpenGLWidget::OpenGLWidget(QWidget *parent) :
     QGLWidget(parent),
     renderer(NULL),
     controller(NULL)
 {}
 
-MyGLWidget::~MyGLWidget()
+OpenGLWidget::~OpenGLWidget()
 {
-    if(renderer != NULL)
-        delete(renderer);
+    renderer->destroyGL();
     if(controller != NULL)
         delete(controller);
 }
 
-SparrowRenderer* MyGLWidget::getRenderer()
+void OpenGLWidget::setRenderer(SparrowRenderer* myRenderer)
 {
-    return renderer;
+    renderer = myRenderer;
 }
 
-void MyGLWidget::loadResources()
+void OpenGLWidget::loadResources()
 {
     std::string filenames[6] = {
         "../data/skybox_ft", "../data/skybox_bk",
@@ -59,7 +58,7 @@ void MyGLWidget::loadResources()
     ResourceBase::setShader("phong", new Shader(vertSource, fragSource));
 }
 
-void MyGLWidget::buildScene()
+void OpenGLWidget::buildScene()
 {
     // camera positionning
     Camera* cam = renderer->getCamera();
@@ -94,59 +93,57 @@ void MyGLWidget::buildScene()
     emit modulesChanged();
 }
 
-void MyGLWidget::initializeGL()
+void OpenGLWidget::initializeGL()
 {
-    if(renderer != NULL)
-        delete(renderer);
-    renderer = new SparrowRenderer(width(), height());
+    renderer->initGL(width(), height());
     loadResources();
     buildScene();
     controller = new FocusController(new glm::vec3(0));
     controller->setCamera(renderer->getCamera());
 }
 
-void MyGLWidget::resizeGL(int width, int height)
+void OpenGLWidget::resizeGL(int width, int height)
 {
     renderer->resize(width, height);
     updateGL();
 }
 
-void MyGLWidget::paintGL()
+void OpenGLWidget::paintGL()
 {
     renderer->render();
 }
 
-void MyGLWidget::mouseMoveEvent(QMouseEvent *e)
+void OpenGLWidget::mouseMoveEvent(QMouseEvent *e)
 {
     controller->mouseMove(e->pos().x() - last.x(), e->pos().y() - last.y());
     last = e->pos();
     updateGL();
 }
 
-void MyGLWidget::mousePressEvent(QMouseEvent* e)
+void OpenGLWidget::mousePressEvent(QMouseEvent* e)
 {
     controller->mouseEvent(e->button(), true);
     last = e->pos();
     updateGL();
 }
-void MyGLWidget::mouseReleaseEvent(QMouseEvent* e)
+void OpenGLWidget::mouseReleaseEvent(QMouseEvent* e)
 {
     controller->mouseEvent(e->button(), false);
     updateGL();
 }
 
-void MyGLWidget::wheelEvent(QWheelEvent *e)
+void OpenGLWidget::wheelEvent(QWheelEvent *e)
 {
     controller->mouseWheelEvent(e->delta());
     updateGL();
 }
 
-void MyGLWidget::keyPressEvent(QKeyEvent *e)
+void OpenGLWidget::keyPressEvent(QKeyEvent *e)
 {
     controller->mouseEvent(e->key(), true);
     updateGL();
 }
-void MyGLWidget::keyReleaseEvent(QKeyEvent *e)
+void OpenGLWidget::keyReleaseEvent(QKeyEvent *e)
 {
     controller->mouseEvent(e->key(), false);
     updateGL();
diff --git a/myglwidget.h b/myglwidget.h
index b929319..35cc2ea 100644
--- a/myglwidget.h
+++ b/myglwidget.h
@@ -10,7 +10,7 @@ namespace Ui {
 class MyGLWidget;
 }
 
-class MyGLWidget : public QGLWidget
+class OpenGLWidget : public QGLWidget
 {
     Q_OBJECT
 
@@ -19,10 +19,9 @@ class MyGLWidget : public QGLWidget
     QPoint last;
 
 public:
-    explicit MyGLWidget(QWidget *parent = 0);
-    ~MyGLWidget();
-
-    SparrowRenderer* getRenderer();
+    explicit OpenGLWidget(QWidget *parent = 0);
+    ~OpenGLWidget();
+    void setRenderer(SparrowRenderer* myRenderer);
 
 protected:
     void initializeGL();
diff --git a/resourcebase.h b/resourcebase.h
index 9886ad3..5dd5fb3 100644
--- a/resourcebase.h
+++ b/resourcebase.h
@@ -26,7 +26,7 @@ public:
     static Shader* getShader(const std::string &shaderName);
     static Entity* getEntity(const std::string &entityName);
 
-private:
+protected:
     template <typename T>
     class DataBase
     {
@@ -42,7 +42,10 @@ private:
 
         T* get(const std::string &name)
         {
-            return data[name];
+            if(data.count(name))
+                return data[name];
+            else
+                return NULL;
         }
     };
 
diff --git a/resourcewidget.cpp b/resourcewidget.cpp
new file mode 100644
index 0000000..0e445f4
--- /dev/null
+++ b/resourcewidget.cpp
@@ -0,0 +1,76 @@
+#include "resourcewidget.h"
+#include "ui_resourcewidget.h"
+#include <iostream>
+
+ResourceWidget::ResourceWidget(QWidget *parent) :
+    QDockWidget(parent),
+    ui(new Ui::ResourceWidget)
+{
+    ui->setupUi(this);
+    ui->treeWidget->resresizeColumnToContents(0);
+    ui->treeWidget->header()->setStretchLastSection(false);
+}
+
+ResourceWidget::~ResourceWidget()
+{
+    delete ui;
+}
+
+void ResourceWidget::updateList()
+{
+    QTreeWidget* tree = ui->treeWidget;
+    for(QTreeWidgetItemIterator it(tree); *it; ++it)
+    {
+        QTreeWidgetItem* item = *it;
+        if(item->parent())
+            continue;
+        item->setBackgroundColor(0, QColor(180, 220, 255));
+        item->setExpanded(true);
+        QString text = item->text(0);
+        if (text == "Textures")
+        {
+            for(std::string &name : textures.names)
+            {
+                QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
+                myItem->setText(0, QString(name.c_str()));
+                tree->addTopLevelItem(myItem);
+            }
+        }
+        else if(text == "Meshes")
+        {
+            for(std::string &name : meshes.names)
+            {
+                QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
+                myItem->setText(0, QString(name.c_str()));
+                tree->addTopLevelItem(myItem);
+            }
+        }
+        else if(text == "Materials")
+        {
+            for(std::string &name : materials.names)
+            {
+                QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
+                myItem->setText(0, QString(name.c_str()));
+                tree->addTopLevelItem(myItem);
+            }
+        }
+        else if(text == "Shaders")
+        {
+            for(std::string &name : shaders.names)
+            {
+                QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
+                myItem->setText(0, QString(name.c_str()));
+                tree->addTopLevelItem(myItem);
+            }
+        }
+        else if(text == "Entities")
+        {
+            for(std::string &name : entities.names)
+            {
+                QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
+                myItem->setText(0, QString(name.c_str()));
+                tree->addTopLevelItem(myItem);
+            }
+        }
+    }
+}
diff --git a/resourcewidget.h b/resourcewidget.h
new file mode 100644
index 0000000..bfa6a18
--- /dev/null
+++ b/resourcewidget.h
@@ -0,0 +1,26 @@
+#ifndef RESOURCEWIDGET_H
+#define RESOURCEWIDGET_H
+
+#include <QDockWidget>
+#include "resourcebase.h"
+
+namespace Ui {
+class ResourceWidget;
+}
+
+class ResourceWidget : public QDockWidget, public ResourceBase
+{
+    Q_OBJECT
+
+public:
+    explicit ResourceWidget(QWidget *parent = 0);
+    ~ResourceWidget();
+
+private:
+    Ui::ResourceWidget *ui;
+
+public slots:
+    void updateList();
+};
+
+#endif // RESOURCEWIDGET_H
diff --git a/resourcewidget.ui b/resourcewidget.ui
new file mode 100644
index 0000000..1e2e2ec
--- /dev/null
+++ b/resourcewidget.ui
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ResourceWidget</class>
+ <widget class="QDockWidget" name="ResourceWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>171</width>
+    <height>411</height>
+   </rect>
+  </property>
+  <property name="allowedAreas">
+   <set>Qt::RightDockWidgetArea</set>
+  </property>
+  <property name="windowTitle">
+   <string>Resources</string>
+  </property>
+  <widget class="QWidget" name="dockWidgetContents">
+   <layout class="QHBoxLayout" name="horizontalLayout">
+    <property name="spacing">
+     <number>0</number>
+    </property>
+    <property name="leftMargin">
+     <number>0</number>
+    </property>
+    <property name="topMargin">
+     <number>0</number>
+    </property>
+    <property name="rightMargin">
+     <number>0</number>
+    </property>
+    <property name="bottomMargin">
+     <number>0</number>
+    </property>
+    <item>
+     <widget class="QTreeWidget" name="treeWidget">
+      <property name="alternatingRowColors">
+       <bool>false</bool>
+      </property>
+      <property name="autoExpandDelay">
+       <number>-1</number>
+      </property>
+      <property name="indentation">
+       <number>20</number>
+      </property>
+      <property name="rootIsDecorated">
+       <bool>false</bool>
+      </property>
+      <attribute name="headerVisible">
+       <bool>false</bool>
+      </attribute>
+      <attribute name="headerStretchLastSection">
+       <bool>false</bool>
+      </attribute>
+      <column>
+       <property name="text">
+        <string>name</string>
+       </property>
+      </column>
+      <item>
+       <property name="text">
+        <string>Textures</string>
+       </property>
+      </item>
+      <item>
+       <property name="text">
+        <string>Meshes</string>
+       </property>
+      </item>
+      <item>
+       <property name="text">
+        <string>Materials</string>
+       </property>
+      </item>
+      <item>
+       <property name="text">
+        <string>Shaders</string>
+       </property>
+      </item>
+      <item>
+       <property name="text">
+        <string>Entities</string>
+       </property>
+      </item>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/sparrowRenderer.pro b/sparrowRenderer.pro
index 05e79e1..0b3c01c 100644
--- a/sparrowRenderer.pro
+++ b/sparrowRenderer.pro
@@ -40,7 +40,9 @@ SOURCES += main.cpp\
     focuscontroller.cpp \
     phongmodule.cpp \
     skyboxmodule.cpp \
-    basicmodule.cpp
+    basicmodule.cpp \
+    resourcewidget.cpp \
+    modulewidget.cpp
 
 HEADERS += mainwindow.h \
     myglwidget.h \
@@ -64,9 +66,13 @@ HEADERS += mainwindow.h \
     skyboxmodule.h \
     basicmodule.h \
     module.h \
-    resource.h
+    resource.h \
+    resourcewidget.h \
+    modulewidget.h
 
-FORMS   += mainwindow.ui
+FORMS   += \
+    resourcewidget.ui \
+    modulewidget.ui
 
 OTHER_FILES += *.frag *.vert *.glsl *.todo
 
diff --git a/sparrowrenderer.cpp b/sparrowrenderer.cpp
index 83b4555..fe513e8 100644
--- a/sparrowrenderer.cpp
+++ b/sparrowrenderer.cpp
@@ -7,7 +7,7 @@
 
 // main methods
 
-SparrowRenderer::SparrowRenderer(int width, int height) : camera(width, height)
+void SparrowRenderer::initGL(int width, int height)
 {
     glewExperimental = GL_TRUE;
     GLenum err = glewInit();
@@ -30,7 +30,12 @@ SparrowRenderer::SparrowRenderer(int width, int height) : camera(width, height)
     glAssert(glEnable(GL_DEPTH_TEST));
     glAssert(glEnable(GL_CULL_FACE));
     glAssert(glEnable(GL_TEXTURE_2D));
-    glAssert(glViewport(0, 0, width, height));
+    resize(width, height);
+}
+
+void SparrowRenderer::destroyGL()
+{
+
 }
 
 void SparrowRenderer::resize(int width, int height)
diff --git a/sparrowrenderer.h b/sparrowrenderer.h
index fe7c823..66de07a 100644
--- a/sparrowrenderer.h
+++ b/sparrowrenderer.h
@@ -9,22 +9,10 @@ class Module;
 
 class SparrowRenderer
 {
-    typedef struct s_moduleNode{
-        Module* module;
-        std::string name;
-        bool isEnabled;
-
-        s_moduleNode(Module* myModule, const std::string &myName) : module(myModule), name(myName), isEnabled(true) {}
-    } ModuleNode;
-
-    std::list<ModuleNode>::iterator getModuleNode(std::string name);
-
-    Camera camera;
-    std::list<ModuleNode> modules;
 public:
-
     // main methods
-    SparrowRenderer(int width, int height);
+    void initGL(int width, int height);
+    void destroyGL();
     void resize(int width, int height);
     void render();
 
@@ -46,6 +34,20 @@ public:
 
     // camera methods
     Camera* getCamera();
+
+protected:
+    typedef struct s_moduleNode{
+        Module* module;
+        std::string name;
+        bool isEnabled;
+
+        s_moduleNode(Module* myModule, const std::string &myName) : module(myModule), name(myName), isEnabled(true) {}
+    } ModuleNode;
+
+    Camera camera;
+    std::list<ModuleNode> modules;
+
+    std::list<ModuleNode>::iterator getModuleNode(std::string name);
 };
 
 #endif // SPARROWRENDERER_H