Index: /s10k/Vago/Vago.pro
===================================================================
--- /s10k/Vago/Vago.pro	(revision 1092)
+++ /s10k/Vago/Vago.pro	(revision 1093)
@@ -12,4 +12,5 @@
 }
 CONFIG   += c++14
+CONFIG   += quazip
 
 INCLUDEPATH += ./packageWizard
@@ -20,15 +21,9 @@
 INCLUDEPATH += ./windowMessagesWizard
 
+include(../CommonUtils/CommonUtils.pri)
+include(../CommonLibs/CommonLibs.pri)
+
 # Used this great tutorial to build zlib and quazip:
 # http://www.antonioborondo.com/2014/10/22/zipping-and-unzipping-files-with-qt/
-INCLUDEPATH += ../Libs/zlib-1.2.8
-LIBS += -L../Libs/zlib-1.2.8 -lz
-INCLUDEPATH += ../Libs/quazip-0.7.2/quazip
-win32 {
-LIBS += -L../Libs/quazip-0.7.2/quazip/release -lquazip
-}
-macx {
-LIBS += -L../Libs/quazip-0.7.2/quazip -lquazip
-}
 
 macx {
@@ -39,5 +34,4 @@
 INCLUDEPATH += ./libs/DropTableWidget
 INCLUDEPATH += ./libs/DropLineEdit
-INCLUDEPATH += ../Libs/pugixml
 
 win32 {
@@ -49,10 +43,8 @@
 
 SOURCES += \
-    util.cpp \
     preferences.cpp \
     manualcommands.cpp \
     mainwindow.cpp \
     main.cpp \
-    logger.cpp \
     converter.cpp \
     about.cpp \
@@ -75,7 +67,5 @@
     bgImageWizard/bgimagepagefinal.cpp \
     xmlToolsInterface/xmltoolsinterface.cpp \
-    libs/BasicXMLSyntaxHighlighter/BasicXMLSyntaxHighlighter.cpp \
     xmlToolsInterface/xmltoolsinterfacecommandpreview.cpp \
-    libs/LineNumberDisplay/LineNumberDisplay.cpp \
     abstractwizard.cpp \
     windowMessagesWizard/wmsetuppage.cpp \
@@ -86,12 +76,10 @@
     ./libs/DropTableWidget/droptablewidget.cpp \
     ./libs/DropLineEdit/droplineedit.cpp \
-    ../Libs/pugixml/pugixml.cpp
+    xmlParsers/projectfilevago.cpp
 
 HEADERS  += \
-    util.h \
     preferences.h \
     manualcommands.h \
     mainwindow.h \
-    logger.h \
     converter.h \
     about.h \
@@ -114,7 +102,5 @@
     bgImageWizard/bgimagepagefinal.h \
     xmlToolsInterface/xmltoolsinterface.h \
-    libs/BasicXMLSyntaxHighlighter/BasicXMLSyntaxHighlighter.h \
     xmlToolsInterface/xmltoolsinterfacecommandpreview.h \
-    libs/LineNumberDisplay/LineNumberDisplay.h \
     wizardfactory.h \
     abstractwizard.h \
@@ -126,5 +112,5 @@
     ./libs/DropTableWidget/droptablewidget.h \
     ./libs/DropLineEdit/droplineedit.h \
-    ../Libs/pugixml/pugixml.hpp
+    xmlParsers/projectfilevago.h
 
 FORMS    += \
Index: /s10k/Vago/abstractwizard.cpp
===================================================================
--- /s10k/Vago/abstractwizard.cpp	(revision 1092)
+++ /s10k/Vago/abstractwizard.cpp	(revision 1093)
@@ -1,10 +1,9 @@
 #include "abstractwizard.h"
 
-AbstractWizard::AbstractWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, const bool hasRestartButton)
+AbstractWizard::AbstractWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, const bool hasRestartButton)
 {
     this->appDir = appDir;
     this->workspaceWizardLocation=workspaceWizardLocation;
     this->vagoSettings=vagoSettings;
-    this->myLogger=myLogger;
     this->hasRestartButton = hasRestartButton;
     this->myWizard.setWindowFlags(Qt::Window); // add minimize button in QWizard
Index: /s10k/Vago/abstractwizard.h
===================================================================
--- /s10k/Vago/abstractwizard.h	(revision 1092)
+++ /s10k/Vago/abstractwizard.h	(revision 1093)
@@ -1,6 +1,4 @@
 #ifndef ABSTRACTWIZARD_H
 #define ABSTRACTWIZARD_H
-
-#include "logger.h"
 
 #include <QLabel>
@@ -24,8 +22,7 @@
     QString workspaceWizardLocation;
 	QSettings *vagoSettings;
-	Logger *myLogger;
     QString appDir;
 protected:
-    AbstractWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, const bool hasRestartButton);
+    AbstractWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, const bool hasRestartButton);
     virtual void exec()=0;
 	void showWizard(const QString &windowsTitle, const QString &windowsIcon);
Index: /s10k/Vago/bgImageWizard/bgimagepage2.cpp
===================================================================
--- /s10k/Vago/bgImageWizard/bgimagepage2.cpp	(revision 1092)
+++ /s10k/Vago/bgImageWizard/bgimagepage2.cpp	(revision 1093)
@@ -2,10 +2,9 @@
 #include "ui_bgimagepage2.h"
 
-BGImagePage2::BGImagePage2(Logger *myLogger, QWidget *parent) :
+BGImagePage2::BGImagePage2(QWidget *parent) :
     QWizardPage(parent),
     ui(new Ui::BGImagePage2)
 {
     ui->setupUi(this);
-    this->myLogger = myLogger;
 
     this->setTitle("Image to use as background");
@@ -46,5 +45,5 @@
 bool BGImagePage2::validateField(QString &field){
     if(field.isEmpty()){
-        Util::showErrorPopUp("You need to choose an image.");
+        Util::Dialogs::showError("You need to choose an image.");
         return false;
     }
@@ -66,10 +65,10 @@
         QImage myImage;
         if(!myImage.load(selectedImage)){
-            UtilVago::showAndLogErrorPopUp(this->myLogger,"Couldn't load image '" + Util::cutNameWithoutBackSlash(selectedImage) + "'. Is the image corrupt?");
+            UtilVago::showAndLogErrorPopUp("Couldn't load image '" + Util::FileSystem::cutNameWithoutBackSlash(selectedImage) + "'. Is the image corrupt?");
             return;
         }
 
         if(myImage.width() < 256 || myImage.height() < 256){
-            UtilVago::showAndLogErrorPopUp(this->myLogger,"Image '" + Util::cutNameWithoutBackSlash(selectedImage) +
+            UtilVago::showAndLogErrorPopUp("Image '" + Util::FileSystem::cutNameWithoutBackSlash(selectedImage) +
                                            "' does not have a width and height >= 256.");
             return;
Index: /s10k/Vago/bgImageWizard/bgimagepage2.h
===================================================================
--- /s10k/Vago/bgImageWizard/bgimagepage2.h	(revision 1092)
+++ /s10k/Vago/bgImageWizard/bgimagepage2.h	(revision 1093)
@@ -4,7 +4,7 @@
 #include <QWizardPage>
 #include <QBitmap>
+#include <QDateTime>
 
 #include "utilvago.h"
-#include "logger.h"
 
 namespace Ui {
@@ -17,5 +17,5 @@
     
 public:
-    explicit BGImagePage2(Logger *myLogger, QWidget *parent = 0);
+    explicit BGImagePage2(QWidget *parent = 0);
     ~BGImagePage2();
     
@@ -24,5 +24,4 @@
 
 private:
-    Logger *myLogger;
 
     Ui::BGImagePage2 *ui;
Index: /s10k/Vago/bgImageWizard/bgimagepage3.cpp
===================================================================
--- /s10k/Vago/bgImageWizard/bgimagepage3.cpp	(revision 1092)
+++ /s10k/Vago/bgImageWizard/bgimagepage3.cpp	(revision 1093)
@@ -52,6 +52,6 @@
 void BGImagePage3::on_leLevelId_textChanged(const QString &arg1)
 {
-    if(!arg1.isEmpty() && !Util::isStringInteger(arg1)){
-        Util::showErrorPopUp("Level id must be a number.");
+    if(!arg1.isEmpty() && !Util::Validation::isStringInteger(arg1)){
+        Util::Dialogs::showError("Level id must be a number.");
         ui->leLevelId->clear();
         return;
@@ -136,10 +136,10 @@
 
     if(ui->leImageName->text().trimmed().isEmpty()){
-        Util::showErrorPopUp("You need to input a name to the image!");
+        Util::Dialogs::showError("You need to input a name to the image!");
         return false;
     }
 
     if(ui->cbCreateTXMB->isChecked() && ui->leTXMBName->text().trimmed().isEmpty()){
-        Util::showErrorPopUp("You need to input a name to the TXMB file!");
+        Util::Dialogs::showError("You need to input a name to the TXMB file!");
         return false;
     }
Index: /s10k/Vago/bgImageWizard/bgimagepagefinal.cpp
===================================================================
--- /s10k/Vago/bgImageWizard/bgimagepagefinal.cpp	(revision 1092)
+++ /s10k/Vago/bgImageWizard/bgimagepagefinal.cpp	(revision 1093)
@@ -2,5 +2,5 @@
 #include "ui_BGImagePageFinal.h"
 
-BGImagePageFinal::BGImagePageFinal(QString appDir, Logger *myLogger, QString bgImagesLocation, QWidget *parent) :
+BGImagePageFinal::BGImagePageFinal(QString appDir, QString bgImagesLocation, QWidget *parent) :
     QWizardPage(parent),
     ui(new Ui::BGImagePageFinal)
@@ -8,8 +8,7 @@
     ui->setupUi(this);
     this->appDir = appDir;
-    this->myLogger = myLogger;
     this->bgImagesLocation = bgImagesLocation;
     this->oniSplitCommands = new QStringList();
-    this->myOniSplitConverter = new Converter(this->appDir, this->myLogger, this->oniSplitCommands);
+    this->myOniSplitConverter = new Converter(this->appDir, this->oniSplitCommands);
 
     ui->lbComplete->setText("<html>The wizard is now complete. The images have been created. "
@@ -65,5 +64,5 @@
 
         for(const QString &currentFile : imagesSplitted){
-            this->oniSplitCommands->append("-create:txmp " + Util::insertQuotes(this->bgImagesLocation) + " -format:bgr32 " + Util::insertQuotes(currentFile));
+            this->oniSplitCommands->append("-create:txmp " + Util::String::insertQuotes(this->bgImagesLocation) + " -format:bgr32 " + Util::String::insertQuotes(currentFile));
         }
 
@@ -77,5 +76,5 @@
             if(txmbXmlFile.isEmpty())
             {
-                UtilVago::showAndLogErrorPopUp(this->myLogger, "Couldn't create TXMB xml file!");
+                UtilVago::showAndLogErrorPopUp("Couldn't create TXMB xml file!");
                 return;
             }
@@ -83,5 +82,5 @@
             // Create TXMB oni files
             this->oniSplitCommands->clear();
-            this->oniSplitCommands->append("-create " + Util::insertQuotes(this->bgImagesLocation) + " " + Util::insertQuotes(txmbXmlFile));
+            this->oniSplitCommands->append("-create " + Util::String::insertQuotes(this->bgImagesLocation) + " " + Util::String::insertQuotes(txmbXmlFile));
             this->myOniSplitConverter->start();
             this->myOniSplitConverter->wait();
@@ -109,10 +108,10 @@
     {
         QFileInfo currImageFile(currSplittedImage);
-        texturesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(currImageFile.baseName()));
-    }
-
-    txmbNode.append_attribute("id").set_value(Util::qStrToCstr(levelId));
-
-    if(!doc.save_file(Util::qStrToCstr(filePath))){
+        texturesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(currImageFile.baseName()));
+    }
+
+    txmbNode.append_attribute("id").set_value(QSTR_TO_CSTR(levelId));
+
+    if(!doc.save_file(QSTR_TO_CSTR(filePath))){
         return "";
     }
@@ -148,5 +147,5 @@
 
             if(!dividedImage.save(imageDestinationPath)){
-                UtilVago::showAndLogErrorPopUp(this->myLogger, "Couldn't save image " + imageDestinationPath + "! Files weren't created correctly.");
+                UtilVago::showAndLogErrorPopUp("Couldn't save image " + imageDestinationPath + "! Files weren't created correctly.");
                 return QList<QString>();
             }
Index: /s10k/Vago/bgImageWizard/bgimagepagefinal.h
===================================================================
--- /s10k/Vago/bgImageWizard/bgimagepagefinal.h	(revision 1092)
+++ /s10k/Vago/bgImageWizard/bgimagepagefinal.h	(revision 1093)
@@ -4,5 +4,5 @@
 #include <QWizardPage>
 #include <QImage>
-#include <pugixml.hpp>
+#include <pugixml/pugixml.hpp>
 
 #include "utilvago.h"
@@ -18,5 +18,5 @@
 
 public:
-    explicit BGImagePageFinal(QString appDir, Logger *myLogger, QString bgImagesLocation, QWidget *parent = 0);
+    explicit BGImagePageFinal(QString appDir, QString bgImagesLocation, QWidget *parent = 0);
     ~BGImagePageFinal();
 
@@ -25,5 +25,4 @@
     QString appDir;
     QString bgImagesLocation;
-    Logger *myLogger;
     Converter *myOniSplitConverter;
     QStringList *oniSplitCommands;
Index: /s10k/Vago/bgImageWizard/bgimagewizard.cpp
===================================================================
--- /s10k/Vago/bgImageWizard/bgimagewizard.cpp	(revision 1092)
+++ /s10k/Vago/bgImageWizard/bgimagewizard.cpp	(revision 1093)
@@ -1,11 +1,10 @@
 #include "bgimagewizard.h"
 
-BGImageWizard::BGImageWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger)
-:AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, true)
+BGImageWizard::BGImageWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings)
+:AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, true)
 {
     this->appDir = appDir;
     this->workspaceWizardLocation=workspaceWizardLocation;
     this->vagoSettings=vagoSettings;
-    this->myLogger=myLogger;
     this->bgImagesLocation=this->workspaceWizardLocation+"/BGImages";
 }
@@ -13,7 +12,7 @@
 void BGImageWizard::exec(){
 
-    BGImagePage2 *page2 = new BGImagePage2(this->myLogger);
+    BGImagePage2 *page2 = new BGImagePage2();
     BGImagePage3 *page3 = new BGImagePage3();
-    BGImagePageFinal *pageFinal = new BGImagePageFinal(this->appDir, this->myLogger, this->bgImagesLocation);
+    BGImagePageFinal *pageFinal = new BGImagePageFinal(this->appDir, this->bgImagesLocation);
 
     this->myWizard.addPage
Index: /s10k/Vago/bgImageWizard/bgimagewizard.h
===================================================================
--- /s10k/Vago/bgImageWizard/bgimagewizard.h	(revision 1092)
+++ /s10k/Vago/bgImageWizard/bgimagewizard.h	(revision 1093)
@@ -11,5 +11,5 @@
 {
 protected:
-    BGImageWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger);
+    BGImageWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings);
     void exec();
 private:
Index: /s10k/Vago/converter.cpp
===================================================================
--- /s10k/Vago/converter.cpp	(revision 1092)
+++ /s10k/Vago/converter.cpp	(revision 1093)
@@ -1,14 +1,13 @@
 #include "converter.h"
 
-Converter::Converter(QString AppDir, Logger *myLogger, QStringList *myData)
+Converter::Converter(QString AppDir, QStringList *myData)
 {
     this->AppDir=AppDir;
-    this->myLogger=myLogger;
     this->myData=myData;
 }
 
 #ifdef Q_OS_WIN
-Converter::Converter(QString AppDir, Logger *myLogger, QStringList *myData, QWinTaskbarProgress *win7TaskBarProgress)
-    : Converter(AppDir, myLogger, myData)
+Converter::Converter(QString AppDir, QStringList *myData, QWinTaskbarProgress *win7TaskBarProgress)
+    : Converter(AppDir, myData)
 {
     this->win7TaskBarProgress = win7TaskBarProgress;
@@ -18,12 +17,12 @@
 void Converter::run()
 {
-    this->processHasKilled=false;
-    this->myProcess = new QProcess();
+    this->myProcess = std::make_unique<QProcess>();
     QString result = QString();
     QString errorMessage = "";
     int numErrors=0;
 
-    this->myLogger->writeString("Setting OniSplit process working dir to "+this->AppDir+".");
-    myProcess->setWorkingDirectory(this->AppDir); // Set working directory (for work with AEI2/Mac OS)
+    this->myProcess->setWorkingDirectory(this->AppDir); // Set working directory (for work with AEI2/Mac OS)
+
+    LOG_INFO << "Setting OniSplit process working dir to " + this->AppDir + ".";
 
 #ifdef Q_OS_WIN
@@ -65,5 +64,6 @@
             this->myProcess->waitForFinished(-1);
 
-            if(this->processHasKilled){ // If the process has killed there's no need to proceed with reading output or process more commands
+             // If the process has killed there's no need to proceed with reading output or process more commands
+            if(this->myProcess == nullptr){
 
 #ifdef Q_OS_WIN
@@ -73,5 +73,5 @@
 #endif
 
-                delete this->myProcess; //delete object and make pointer invalid
+                this->myProcess.reset(); //delete object and make pointer invalid
                 this->myData->clear(); //clean list
                 emit conversionAborted();
@@ -80,9 +80,9 @@
             }
 
-            result=this->myProcess->readAllStandardError();
+            result = this->myProcess->readAllStandardError();
 
             if(!result.isEmpty()){ //if(!result.startsWith("Importing",Qt::CaseSensitive) && !result.startsWith("Importing",Qt::CaseSensitive)){ //case sensitive is faster
                 //catch exception
-                myLogger->writeString("Oni Split Error: \n"+this->myData->at(i)+"\n"+result);
+                LOG_ERROR << "Oni Split Error: \n" + this->myData->at(i) + "\n" + result;
                 errorMessage=result;
                 numErrors++;
@@ -110,5 +110,5 @@
 #endif
 
-    delete this->myProcess; //delete object and make pointer invalid
+    this->myProcess.reset(); //delete object and make pointer invalid
     this->myData->clear(); //clean list
 
@@ -126,6 +126,9 @@
 // Kill the process if requested
 void Converter::terminateCurrProcess(){
-    this->myProcess->kill();
-    this->processHasKilled=true;
-    this->myLogger->writeString("Received signal to kill current OniSplit operation (user requested).");
+    if(this->myProcess != nullptr){
+        this->myProcess->kill();
+        this->myProcess.reset();
+    }
+
+    LOG_INFO << "Received signal to kill current OniSplit operation (user requested).";
 }
Index: /s10k/Vago/converter.h
===================================================================
--- /s10k/Vago/converter.h	(revision 1092)
+++ /s10k/Vago/converter.h	(revision 1093)
@@ -14,15 +14,13 @@
      Q_OBJECT
 public:
-    Converter(QString AppDir, Logger *myLogger, QStringList *myData);
+    Converter(QString AppDir, QStringList *myData);
 
     #ifdef Q_OS_WIN
-    Converter(QString AppDir, Logger *myLogger, QStringList *myData, QWinTaskbarProgress *win7TaskBarProgress);
+    Converter(QString AppDir, QStringList *myData, QWinTaskbarProgress *win7TaskBarProgress);
     #endif
 private:
     QString AppDir;
-    Logger *myLogger;
     QStringList *myData;
-    QProcess *myProcess;
-    bool processHasKilled;
+    std::unique_ptr<QProcess> myProcess;
     #ifdef Q_OS_WIN
     QWinTaskbarProgress *win7TaskBarProgress = nullptr;
Index: /s10k/Vago/libs/DropTableWidget/droptablewidget.cpp
===================================================================
--- /s10k/Vago/libs/DropTableWidget/droptablewidget.cpp	(revision 1092)
+++ /s10k/Vago/libs/DropTableWidget/droptablewidget.cpp	(revision 1093)
@@ -146,10 +146,12 @@
 
     int idxFileName=fileCommand.indexOf(this->item(row,0)->text()); //Search first for the file name
-    int fileAbsoluteStartIdx=Util::indexOfBackward(fileCommand,"\"",idxFileName);
+
+    int fileAbsoluteStartIdx=fileCommand.lastIndexOf("\"",idxFileName);
 
     fileCommand.remove(0,fileAbsoluteStartIdx);
-    int fileAbsoluteEndIdx=fileCommand.indexOf('"',1); //1 to find the end quoate and not the start
 
-    return fileCommand.remove(fileAbsoluteEndIdx,(fileCommand.size()-1)-fileAbsoluteEndIdx);
+    int fileAbsoluteEndIdx=fileCommand.indexOf('"',1); //1 to find the end quote and not the start
+
+    return fileCommand.remove(fileAbsoluteEndIdx+1,(fileCommand.size()-1)-fileAbsoluteEndIdx);
 }
 
@@ -161,5 +163,5 @@
     command.remove(fileAbsoluteEndIdx,command.size()-1);
 
-    int fileAbsoluteStartIdx=Util::indexOfBackward(command,"\"",command.size()-1)+1;
+    int fileAbsoluteStartIdx=command.lastIndexOf("\"",command.size()-1)+1;
 
     return command.remove(0,fileAbsoluteStartIdx);
Index: 0k/Vago/logger.cpp
===================================================================
--- /s10k/Vago/logger.cpp	(revision 1092)
+++ 	(revision )
@@ -1,41 +1,0 @@
-#include "logger.h"
-
-Logger::Logger(QString appDir, QString logFileName)
-{
-    myLogFile = std::make_unique<QFile>(appDir+"/"+logFileName);
-
-    if (!myLogFile->open(QIODevice::WriteOnly | QIODevice::Text)){ //open to write
-        return;
-    }
-
-    logStream = std::make_unique<QTextStream>(myLogFile.get());
-    //logStream->setCodec("UTF-8");
-}
-
-/**
-  ** Mutex makes it thread safe. (not sure if needed although)
-  **/
-void Logger::writeString(QString strToWrite){
-    mutex.lock();
-    *this->logStream << "--------------------------------------------";
-    *this->logStream << "\nEvent Start: " << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss") << "\n" << strToWrite << "\nEvent End.\n";
-    *this->logStream << "--------------------------------------------\n";
-    this->logStream->flush();
-    mutex.unlock();
-}
-
-/**
- ** Mutex makes it thread safe. (not sure if needed although)
- **/
-void Logger::writeBytes(QByteArray arrToWrite){
-    mutex.lock();
-    *this->logStream << "--------------------------------------------";
-    *this->logStream << "\nEvent Start: " << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss") << "\n" << arrToWrite << "\nEvent End.\n";
-    *this->logStream << "--------------------------------------------";
-    this->logStream->flush();
-    mutex.unlock();
-}
-
-Logger::~Logger(){
-
-}
Index: 0k/Vago/logger.h
===================================================================
--- /s10k/Vago/logger.h	(revision 1092)
+++ 	(revision )
@@ -1,22 +1,0 @@
-#ifndef LOGGER_H
-#define LOGGER_H
-#include <QFile>
-#include <QTextStream>
-#include <QMutex>
-#include <QDateTime>
-#include <memory>
-
-class Logger
-{
-public:
-    Logger(QString  appDir, QString logFileName);
-    ~Logger();
-    void writeString(QString strToWrite);
-    void writeBytes(QByteArray arrToWrite);
-private:
-    std::unique_ptr<QFile> myLogFile;
-    std::unique_ptr<QTextStream> logStream;
-    QMutex mutex; //mutex for control writes to the logs
-};
-
-#endif // LOGGER_H
Index: /s10k/Vago/mainwindow.cpp
===================================================================
--- /s10k/Vago/mainwindow.cpp	(revision 1092)
+++ /s10k/Vago/mainwindow.cpp	(revision 1093)
@@ -8,20 +8,24 @@
     ui(new Ui::MainWindow)
 {
+    // We use this appender because it is the native way to have \r\n in windows in plog library
+    // example: https://github.com/SergiusTheBest/plog/blob/master/samples/NativeEOL/Main.cpp
+    static plog::RollingFileAppender<plog::TxtFormatter, plog::NativeEOLConverter<>> fileAppender
+            (QSTR_TO_CSTR(Util::FileSystem::getAppPath() + "/" + GlobalVars::AppLogName), 1024*5 /* 5 Mb max log size */, 3);
+    plog::init(plog::info, &fileAppender);
+
     ui->setupUi(this);
 
-    this->myLogger = new Logger(UtilVago::getAppPath(), GlobalVars::AppLogName); //start logger
-
-    this->myLogger->writeString("Detected AppDir: "+UtilVago::getAppPath());
-    this->myLogger->writeString("True app dir: "+QDir::currentPath());
+    LOG_INFO << "Detected AppDir: " + UtilVago::getAppPath();
+    LOG_INFO << "True app dir: "+QDir::currentPath();
 
     setVagoWindowTitle();
 
     if(!QFile::exists(UtilVago::getOniSplitExecutableAbsolutePath())){
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "OniSplit not found. Please download it at "+GlobalVars::ModsDomain+" and put it the Vago's tools folder. \n\nProgram will now exit.");
+        UtilVago::showAndLogErrorPopUp("OniSplit not found. Please download it at "+GlobalVars::ModsDomain+" and put it the Vago's tools folder. \n\nProgram will now exit.");
         exit(1);
     }
 
     if(!QFile::exists(UtilVago::getXmlToolsExecutableAbsolutePath())){
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "XmlTools not found. Please download it at "+GlobalVars::ModsDomain+" and put it the Vago's tools folder. \n\nProgram will now exit.");
+        UtilVago::showAndLogErrorPopUp("XmlTools not found. Please download it at "+GlobalVars::ModsDomain+" and put it the Vago's tools folder. \n\nProgram will now exit.");
         exit(1);
     }
@@ -41,14 +45,14 @@
     if(!this->vagoSettings->contains("AeFolder")){
 
-        Util::showPopUp("Seems it's the first time you are executing Vago. \n\nPlease input your Anniversary Edition (AE) Folder.");
-        QString aefolder=Util::normalizePath(QFileDialog::getExistingDirectory(this,"Choose Anniversary Edition (AE) folder..."));
+        Util::Dialogs::showInfo("Seems it's the first time you are executing Vago. \n\nPlease input your Anniversary Edition (AE) Folder.");
+        QString aefolder=Util::FileSystem::normalizePath(QFileDialog::getExistingDirectory(this,"Choose Anniversary Edition (AE) folder..."));
 
         if(aefolder.isEmpty()){
-            UtilVago::showAndLogErrorPopUp(this->myLogger, "AE folder is mandatory. Application will now exit.");
+            UtilVago::showAndLogErrorPopUp("AE folder is mandatory. Application will now exit.");
             exit(1);
         }
 
         if(!aefolder.endsWith("AE")){
-            Util::showWarningPopUp("Seems the folder you selected isn't called 'AE'. \n\nIf you run in any problems you can always change it in Vago preferences window.");
+            Util::Dialogs::showWarning("Seems the folder you selected isn't called 'AE'. \n\nIf you run in any problems you can always change it in Vago preferences window.");
         }
 
@@ -177,5 +181,5 @@
 {
     delete ui;
-    this->myLogger->writeString("Application Exited.");
+    LOG_INFO << "Application Exited.";
 }
 
@@ -207,12 +211,12 @@
 
     //Create a thread for do the conversion in background
-    this->myConverter = new Converter(UtilVago::getAppPath(), this->myLogger, &this->listToProccess, this->win7TaskBarProgress);
+    this->myConverter = new Converter(UtilVago::getAppPath(), &this->listToProccess, this->win7TaskBarProgress);
 #else
-    this->myConverter = new Converter(UtilVago::getAppPath(), this->myLogger, &this->listToProccess);
+    this->myConverter = new Converter(UtilVago::getAppPath(), &this->listToProccess);
 #endif
 
     connectSlots();
 
-    this->myLogger->writeString("Application started.");
+    LOG_INFO << "Application started.";
 
     this->applicationIsFullyLoaded = true;
@@ -221,5 +225,5 @@
 
     if(!lastSavedProject.isEmpty() && this->vagoSettings->value("AskToOpenLastProject").toBool()){
-        if(Util::showQuestionPopUp(this,"Do you want to load latest project?\n\nLatest project was '" + Util::cutNameWithoutBackSlash(lastSavedProject) + "'.")){
+        if(Util::Dialogs::showQuestion(this,"Do you want to load latest project?\n\nLatest project was '" + Util::FileSystem::cutNameWithoutBackSlash(lastSavedProject) + "'.")){
             loadProjectState(lastSavedProject);
         }
@@ -243,5 +247,5 @@
 {
     // it deletes itself once closed
-    WizardFactory<PackageWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
+    WizardFactory<PackageWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings);
 }
 
@@ -249,5 +253,5 @@
 {
     // it deletes itself once closed
-    WizardFactory<SoundWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger, &this->commandMap);
+    WizardFactory<SoundWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, &this->commandMap);
 }
 
@@ -255,5 +259,5 @@
 {
     // it deletes itself once closed
-    WizardFactory<BGImageWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
+    WizardFactory<BGImageWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings);
 }
 
@@ -261,5 +265,5 @@
 {
     // it deletes itself once closed
-    WizardFactory<WmWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
+    WizardFactory<WmWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings);
 }
 
@@ -280,5 +284,5 @@
 
     if(!QProcess::startDetached(this->AeLocation+"/"+GlobalVars::OniExe,arguments,this->AeLocation)){
-        showErrStatusMessage("Oni could not be started!");
+        Util::StatusBar::showError(ui->statusBar, "Oni could not be started!");
     }
 }
@@ -289,5 +293,5 @@
 
     if(!QDesktopServices::openUrl("file:///"+this->AeLocation+"/AEInstaller/bin/AEInstaller2.jar")){
-        showErrStatusMessage("Could not start AE Installer!");
+        Util::StatusBar::showError(ui->statusBar, "Could not start AE Installer!");
     }
 }
@@ -303,5 +307,5 @@
     //We pass no parent because we want to have an independent window for XmlToolsInterface,
     //so we can minimize it or maximize indepently from the MainWindow
-    XmlToolsInterface *xmlToolsWindow = new XmlToolsInterface(this->myLogger);
+    XmlToolsInterface *xmlToolsWindow = new XmlToolsInterface();
     xmlToolsWindow->show(); //it destroys itself when finished.
 }
@@ -309,5 +313,5 @@
 void MainWindow::on_tbAbortConversion_clicked()
 {
-    if(Util::showQuestionPopUp(this,"Are you sure you want to abort the current conversion?")){
+    if(Util::Dialogs::showQuestion(this,"Are you sure you want to abort the current conversion?")){
         emit terminateCurrProcess();
     }
@@ -324,12 +328,12 @@
 }
 
+void MainWindow::on_cbSpecificFilesLevels_toggled(bool checked)
+{
+    ui->leSpecificFilesLevels->setEnabled(checked);
+}
+
 void MainWindow::on_cbWithAnimation_toggled(bool checked)
 {
     ui->leAnimationName->setEnabled(checked);
-}
-
-void MainWindow::on_cbSpecificFilesLevels_toggled(bool checked)
-{
-    ui->leSpecificFilesLevels->setEnabled(checked);
 }
 
@@ -357,13 +361,13 @@
 
         if(newVersion!=GlobalVars::AppVersion){
-            Util::showRichPopUp("There's a new version of Vago! (v"+newVersion+")<br/><br/>"+
-                                "You can download it <a href='"+GlobalVars::VagoWebUrl+"'>here</a>.");
+            Util::Dialogs::showRichInfo("There's a new version of Vago! (v"+newVersion+")<br/><br/>"+
+                                        "You can download it <a href='"+GlobalVars::VagoWebUrl+"'>here</a>.");
         }
         else{
-            Util::showPopUp("You are using last version.");
+            Util::Dialogs::showInfo("You are using last version.");
         }
     }
     else{
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "An error occurred checking last version:\n\n"+result->errorString());
+        UtilVago::showAndLogErrorPopUp("An error occurred checking last version:\n\n"+result->errorString());
     }
     result->deleteLater();
@@ -393,5 +397,5 @@
 {
     if(QString::compare(ui->cbFromLevels->currentText(),"ONI FILES",Qt::CaseSensitive)==0 && QString::compare(ui->cbToLevels->currentText(),"DAT",Qt::CaseSensitive)==0){ //CaseSensitive is faster)
-        addFilesSource(ui->twSourcesLevels,Util::multipleDirDialog("Choose folders with ONIs..."));
+        addFilesSource(ui->twSourcesLevels,Util::Dialogs::multipleDirSelection("Choose folders with ONIs..."));
     }
     else{
@@ -415,5 +419,5 @@
         myOutputFolder+="/"+QString(fromTo).replace(" / ","_").replace(" > "," - ");
     }
-    return Util::insertQuotes(myOutputFolder+"/");
+    return Util::String::insertQuotes(myOutputFolder+"/");
 }
 
@@ -428,10 +432,10 @@
     to = QString(fromTo).remove(0,fromTo.lastIndexOf("> ")+2); //+2 to start after "> "
 
-    //Pre-processing (check if the files/folders received are valid), e.g. check for ONI->DAT if are only given folders and not files
+    //Pre-processing (check if the files/folders received are valid), e.g. check for ONI FILES->DAT if are only given folders and not files
     if(from=="ONI FILES" && to=="DAT"){
         //check if it's a folder
-        foreach(QString myFile, files){
+        for(const QString &myFile : files){
             if(!QDir(myFile).exists()){
-                showErrStatusMessage("Only folders are allowed for this operation.");
+                Util::StatusBar::showError(ui->statusBar, "Only folders are allowed for this operation.");
                 return;
             }
@@ -440,8 +444,66 @@
     }
     else{
-        foreach(QString myFile, files){
+        for(const QString &myFile : files){
+
             //check if it's a file
             if(QDir(myFile).exists()){
-                showErrStatusMessage("Only files are allowed for this operation.");
+                Util::StatusBar::showError(ui->statusBar, "Only files are allowed for this operation.");
+                return;
+            }
+
+            // Check if the given files have the expected extensions
+            QFileInfo fileInfo(myFile);
+
+            QStringList expectedExtensions;
+
+            bool extensionIsValid = false;
+
+            if(
+                    from == "DAT / TXMP ONI" ||
+                    from == "DAT / SNDD ONI" ||
+                    from == "DAT / SUBT ONI"
+                    ){
+                expectedExtensions << "DAT" << "ONI";
+            }
+            else if(from == "TGA / DDS / PNG / JPG"){
+                expectedExtensions << "TGA" << "DDS" << "PNG" << "JPG";
+            }
+            else if(
+                    from == "TRAM ONI" ||
+                    from == "TRBS / ONCC ONI" ||
+                    from == "M3GM ONI" ||
+                    from == "ONWC ONI" ||
+                    from == "OBAN ONI (cam)" ||
+                    from == "AKEV ONI"
+                    ){
+                expectedExtensions << "ONI";
+            }
+            else if(from == "TRBS XML" || from == "MASTER XML"){
+                expectedExtensions << "XML";
+            }
+            else if(from == "TRBS DAE"){
+                expectedExtensions << "DAE";
+            }
+            else if(from == "FILM DAT"){
+                expectedExtensions << "DAT";
+            }
+            else if(from == "WAV / AIF"){
+                expectedExtensions << "WAV" << "AIF";
+            }
+            else{
+                expectedExtensions << from;
+            }
+
+            for(const QString &currExpectedExtension : expectedExtensions){
+                if(fileInfo.suffix().toUpper() == currExpectedExtension){
+                    extensionIsValid = true;
+                    break;
+                }
+            }
+
+            if(!extensionIsValid){
+                QString errorMsg = "Can't add the file '" + fileInfo.fileName() + "'. It isn't a " + expectedExtensions.join(" or ") + " file.";
+                Util::Dialogs::showError(errorMsg);
+                Util::StatusBar::showError(ui->statusBar, errorMsg);
                 return;
             }
@@ -455,7 +517,7 @@
 
     //if folder doesn't exist onisplit will create it for us :)
-    foreach(QString currentFile, files){
-
-        currentFile=Util::normalizeAndQuote(currentFile); //insert quotes ("") in file
+    for(QString currentFile : files){
+
+        currentFile=Util::FileSystem::normalizeAndQuote(currentFile); //insert quotes ("") in file
 
         if(lastFileName.isEmpty()){ //Optimization: all commands are the same for each file, just replace the filename
@@ -466,8 +528,8 @@
                 return; //stop adding files
             }
-            currentFile=Util::cutName(currentFile);
+            currentFile=Util::FileSystem::cutName(currentFile);
         }else{ //one parsing was already made just replace the filename by the old one in the command
 
-            currentFile=Util::cutName(currentFile);
+            currentFile=Util::FileSystem::cutName(currentFile);
 
             command.replace(lastFileName,currentFile,Qt::CaseSensitive); //case sentive is faster
@@ -503,17 +565,17 @@
     if(ui->gbTextures->isEnabled()){ //faster than compare strings (if is DAT/ONI)
 
-        if(ui->cbMipMapsTextures->isChecked()){
+        if(ui->cbMipMapsTextures->isEnabled() && ui->cbMipMapsTextures->isChecked()){
             command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbMipMapsTextures->text());
         }
 
-        if(ui->cbNoUwrap->isChecked()){
+        if(ui->cbNoUwrap->isEnabled() && ui->cbNoUwrap->isChecked()){
             command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbNoUwrap->text());
         }
 
-        if(ui->cbNoVwrap->isChecked()){
+        if(ui->cbNoVwrap->isEnabled() && ui->cbNoVwrap->isChecked()){
             command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbNoVwrap->text());
         }
 
-        if(ui->cbLarge->isChecked()){
+        if(ui->cbLarge->isEnabled() && ui->cbLarge->isChecked()){
             command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbLarge->text());
         }
@@ -521,7 +583,7 @@
         command+=" "+this->commandMap.value(tabTitle+"->"+getTextureRBCheckedTypeTexture()->text());
 
-        if(ui->cbEnvMap->isChecked()){
+        if(ui->cbEnvMap->isEnabled() && ui->cbEnvMap->isChecked()){
             if(ui->leEnvMapTexture->text().isEmpty()){
-                showErrStatusMessage("Checkbox '"+ui->cbEnvMap->text()+"' is selected. The name texture name cannot be empty.");
+                Util::StatusBar::showError(ui->statusBar, "Checkbox '"+ui->cbEnvMap->text()+"' is selected. The name texture name cannot be empty.");
                 return "";
             }
@@ -535,22 +597,26 @@
 QString MainWindow::fileParsingCharacters(QString tabTitle, QString myOutputFolder, QString from, QString to , QString file){
 
-    QString command=this->commandMap.value(tabTitle+"->"+from+"->"+to)+" "+myOutputFolder + " " + file ;
-
-
-    if(ui->cbCellShading->isChecked()){
-        command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbCellShading->text());
-    }
-
-    if(ui->cbNormals->isChecked()){
-        command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbNormals->text());
-    }
-
-    if(ui->cbWithTRBS_ONCC->isChecked()){
+    QString command=this->commandMap.value(tabTitle + "->" + from + "->" + to) + " " + myOutputFolder + " " + file ;
+
+
+    if(ui->cbCellShading->isEnabled() && ui->cbCellShading->isChecked()){
+        command+=" "+this->commandMap.value(tabTitle + "->" + ui->cbCellShading->text());
+    }
+
+    if(ui->cbNormals->isEnabled() && ui->cbNormals->isChecked()){
+        command+=" "+this->commandMap.value(tabTitle + "->" + ui->cbNormals->text());
+    }
+
+    if(ui->cbStandingPose->isEnabled() && ui->cbStandingPose->isChecked()){
+        command+=" "+this->commandMap.value(tabTitle + "->" + ui->cbStandingPose->text());
+    }
+
+    if(ui->cbWithTRBS_ONCC->isEnabled() && ui->cbWithTRBS_ONCC->isChecked()){
         if(ui->leTRBS_ONCC->text().isEmpty()){
-            showErrStatusMessage("Checkbox '"+ui->cbWithTRBS_ONCC->text()+"' is selected. The name cannot be empty.");
+            Util::StatusBar::showError(ui->statusBar, "Checkbox '" + ui->cbWithTRBS_ONCC->text() + "' is selected. The name cannot be empty.");
             return "";
         }
 
-        command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbWithTRBS_ONCC->text())+Util::normalizeAndQuote(ui->leTRBS_ONCC->text());
+        command+= " " + this->commandMap.value(tabTitle + "->" + ui->cbWithTRBS_ONCC->text()) + Util::FileSystem::normalizeAndQuote(ui->leTRBS_ONCC->text());
     }
 
@@ -563,17 +629,17 @@
     QString command=this->commandMap.value(tabTitle+"->"+from+"->"+to)+" "+myOutputFolder;
 
-    if(ui->cbTexture->isChecked()){
+    if(ui->cbTexture->isEnabled() && ui->cbTexture->isChecked()){
         if(ui->leTextureName->text().isEmpty()){
-            showErrStatusMessage("Checkbox '"+ui->cbTexture->text()+"' is selected. The file source cannot be empty.");
+            Util::StatusBar::showError(ui->statusBar, "Checkbox '"+ui->cbTexture->text()+"' is selected. The file source cannot be empty.");
             return "";
         }
         command+=" "+this->commandMap.value(tabTitle+"->"+ui->cbTexture->text()) + ui->leTextureName->text();
     }
-    else if(ui->cbWithAnimation->isChecked()){
+    else if(ui->cbWithAnimation->isEnabled() && ui->cbWithAnimation->isChecked()){
         if(ui->leAnimationName->text().isEmpty()){
-            showErrStatusMessage("Checkbox '"+ui->cbWithAnimation->text()+"' is selected. The file source cannot be empty.");
+            Util::StatusBar::showError(ui->statusBar, "Checkbox '"+ui->cbWithAnimation->text()+"' is selected. The file source cannot be empty.");
             return "";
         }
-        command+=" "+Util::normalizeAndQuote(ui->leAnimationName->text()) + " " + this->commandMap.value(tabTitle+"->"+ui->cbWithAnimation->text()) + file;
+        command+=" "+Util::FileSystem::normalizeAndQuote(ui->leAnimationName->text()) + " " + this->commandMap.value(tabTitle+"->"+ui->cbWithAnimation->text()) + file;
         return command;
     }
@@ -594,8 +660,8 @@
         command=this->commandMap.value(tabTitle+"->"+from+"->"+to);
 
-        if(ui->cbSpecificFilesLevels->isChecked()){
+        if(ui->cbSpecificFilesLevels->isEnabled() && ui->cbSpecificFilesLevels->isChecked()){
 
             if(ui->leSpecificFilesLevels->text().isEmpty()){
-                showErrStatusMessage("Checkbox '"+ui->cbSpecificFilesLevels->text()+"' is selected. The files pattern cannot be empty.");
+                Util::StatusBar::showError(ui->statusBar, "Checkbox '"+ui->cbSpecificFilesLevels->text()+"' is selected. The files pattern cannot be empty.");
                 return "";
             }
@@ -605,5 +671,5 @@
 
         if(from=="DAT" && to=="ONI FILES"){ // extract files to a subdir with the files name ex: level0_Final
-            command += " " + myOutputFolder.insert(myOutputFolder.size()-2,QString(Util::cutName(file)).replace(".dat","")) + " " + file;
+            command += " " + myOutputFolder.insert(myOutputFolder.size()-2,QString(Util::FileSystem::cutName(file)).replace(".dat","")) + " " + file;
         }
         else{
@@ -620,7 +686,7 @@
         }
 
-        if(ui->cbDatLevels->isChecked()){
+        if(ui->cbDatLevels->isEnabled() && ui->cbDatLevels->isChecked()){
             if(ui->leTargetDatLevels->text().isEmpty()){
-                showErrStatusMessage("Checkbox '"+ui->cbDatLevels->text()+"' is selected. The name cannot be empty.");
+                Util::StatusBar::showError(ui->statusBar, "Checkbox '"+ui->cbDatLevels->text()+"' is selected. The name cannot be empty.");
                 return "";
             }
@@ -632,12 +698,12 @@
         else{
             if(from=="ONI FILES"){
-                datName=QString(myOutputFolder).insert(myOutputFolder.size()-1,Util::cutName(file).remove("/")+".dat"); //if none iputted set the same name of input file
+                datName=QString(myOutputFolder).insert(myOutputFolder.size()-1,Util::FileSystem::cutName(file).remove("/")+".dat"); //if none iputted set the same name of input file
             }
             else if(from=="MASTER XML"){
-                datName=QString(myOutputFolder).insert(myOutputFolder.size()-1,Util::cutName(file).remove("/").replace(".xml",".dat",Qt::CaseInsensitive)); //if none iputted set the same name of input file
+                datName=QString(myOutputFolder).insert(myOutputFolder.size()-1,Util::FileSystem::cutName(file).remove("/").replace(".xml",".dat",Qt::CaseInsensitive)); //if none iputted set the same name of input file
             }
         }
         if(from=="ONI FILES"){
-            if(ui->actionWindows->isChecked()){ //is target plataform select windows?
+            if(ui->actionWindows->isEnabled() && ui->actionWindows->isChecked()){ //is target plataform select windows?
                 return command=this->commandMap.value(tabTitle+"->"+from+"->"+to+"(PC)")+" "+ file + " "+datName;
             }
@@ -647,5 +713,5 @@
         }
         else if(from=="MASTER XML"){
-            if(ui->actionWindows->isChecked()){ //is target plataform select windows?
+            if(ui->actionWindows->isEnabled() && ui->actionWindows->isChecked()){ //is target plataform select windows?
                 command+=this->commandMap.value(tabTitle+"->ONI FILES->"+to+"(PC)")+" "+myOutputFolder+" "+datName; //add second command
             }
@@ -656,17 +722,17 @@
     }
 
-    if(ui->cbBnvLevels->isChecked()){
-
-        if(ui->leBnvLevels->text().isEmpty()){
-            showErrStatusMessage("Checkbox '"+ui->cbBnvLevels->text()+"' is selected. The BNV file cannot be empty.");
+    if(ui->cbBnvLevels->isEnabled() && ui->cbBnvLevels->isChecked()){
+
+        if(ui->leBnvLevels->isEnabled() && ui->leBnvLevels->text().isEmpty()){
+            Util::StatusBar::showError(ui->statusBar, "Checkbox '"+ui->cbBnvLevels->text()+"' is selected. The BNV file cannot be empty.");
             return "";
         }
-        command+=" "+Util::normalizeAndQuote(ui->leBnvLevels->text());
-    }
-
-    if(ui->cbAdditionalSourcesLevels->isChecked()){
+        command+=" "+Util::FileSystem::normalizeAndQuote(ui->leBnvLevels->text());
+    }
+
+    if(ui->cbAdditionalSourcesLevels->isEnabled() && ui->cbAdditionalSourcesLevels->isChecked()){
 
         if(ui->leAdditSourcesLevels->text().isEmpty()){
-            showErrStatusMessage("Checkbox '"+ui->cbAdditionalSourcesLevels->text()+"' is selected. The source files cannot be empty.");
+            Util::StatusBar::showError(ui->statusBar, "Checkbox '"+ui->cbAdditionalSourcesLevels->text()+"' is selected. The source files cannot be empty.");
             return "";
         }
@@ -680,5 +746,5 @@
             nextIndex=additionalFiles.indexOf(";",currentIndex+1);
 
-            command += " "+Util::normalizeAndQuote(additionalFiles.mid(currentIndex,(nextIndex-currentIndex)));
+            command += " "+Util::FileSystem::normalizeAndQuote(additionalFiles.mid(currentIndex,(nextIndex-currentIndex)));
 
             if(nextIndex==-1){ //we got to the end, stop parsing
@@ -689,6 +755,6 @@
     }
 
-    if(ui->cbGridsLevels->isChecked()){
-        command+=GlobalVars::OniSplitProcSeparator+this->commandMap.value(tabTitle+"->"+ui->cbGridsLevels->text())+" "+Util::normalizeAndQuote(ui->leBnvLevels->text())+" "+file+" -out:"+myOutputFolder;
+    if(ui->cbGridsLevels->isEnabled() && ui->cbGridsLevels->isChecked()){
+        command+=GlobalVars::OniSplitProcSeparator+this->commandMap.value(tabTitle+"->"+ui->cbGridsLevels->text())+" "+Util::FileSystem::normalizeAndQuote(ui->leBnvLevels->text())+" "+file+" -out:"+myOutputFolder;
     }
 
@@ -743,10 +809,10 @@
 
     if(!ready){
-        showErrStatusMessage("Please add sources to convert first.");
+        Util::StatusBar::showError(ui->statusBar, "Please add sources to convert first.");
         return;
     }
 
     if(this->myBar->isVisible()){
-        Util::showErrorPopUp("Another conversion is progress. Please wait until it finishes.");
+        Util::Dialogs::showError("Another conversion is progress. Please wait until it finishes.");
         return;
     }
@@ -782,13 +848,13 @@
         if(numErrors>1){
             UtilVago::showErrorPopUpLogButton(result+"\n This is the last of "+sNumErrors+" errors.");
-            showErrStatusMessage("Something gone wrong. Check log file ("+sNumErrors+" errors).");
+            Util::StatusBar::showError(ui->statusBar, "Something gone wrong. Check log file ("+sNumErrors+" errors).");
         }
         else{
             UtilVago::showErrorPopUpLogButton(result);
-            showErrStatusMessage("Something gone wrong. Check log file.");
+            Util::StatusBar::showError(ui->statusBar, "Something gone wrong. Check log file.");
         }
     }
     else{
-        showSuccessStatusMessage("Everything went well!");
+        Util::StatusBar::showSuccess(ui->statusBar, "Everything went well!");
     }
 }
@@ -798,23 +864,5 @@
     ui->tbAbortConversion->hide();
 
-    showErrStatusMessage("Conversion was aborted.");
-}
-
-void MainWindow::showErrStatusMessage(QString message){
-
-    QPalette myPalete = QPalette();
-    myPalete.setColor( QPalette::WindowText, QColor(255,0,0));
-    statusBar()->setPalette( myPalete );
-    ui->statusBar->showMessage(message,10000); //display by 10 seconds
-
-}
-
-void MainWindow::showSuccessStatusMessage(QString message){
-
-    QPalette myPalete = QPalette();
-    myPalete.setColor( QPalette::WindowText, QColor(0,150,0));
-    statusBar()->setPalette( myPalete );
-    ui->statusBar->showMessage(message,10000); //display by 10 seconds
-
+    Util::StatusBar::showError(ui->statusBar, "Conversion was aborted.");
 }
 
@@ -865,4 +913,5 @@
     this->commandMap.insert("characters->"+ui->cbCellShading->text(),"-cel");
     this->commandMap.insert("characters->"+ui->cbNormals->text(),"-normals");
+    this->commandMap.insert("characters->"+ui->cbStandingPose->text(),"-noanim");
     //Possible Combinations
     this->commandMap.insertMulti("characters->TRAM ONI","XML / XML & DAE");
@@ -880,5 +929,5 @@
     this->commandMap.insert("objects->OBAN ONI (cam)->DAE","-extract:dae");
     this->commandMap.insert("objects->OBJ->M3GM ONI","-create:m3gm");
-    //######################Characters Options
+    //######################Objects Options
     this->commandMap.insert("objects->"+ui->cbTexture->text(),"-tex:");
     this->commandMap.insert("objects->"+ui->cbWithAnimation->text(),"-geom:");
@@ -967,10 +1016,11 @@
         identifier = ui->tabWidget->tabText(TexturesTabIndex);
 
-        //Options are only used for DAT/ONI -> Image
-        if(QString::compare(arg1,"DAT / ONI",Qt::CaseSensitive)==0){ //case sensitive is faster
+        //Options are only used for DAT/TXMP ONI -> Image
+        if(QString::compare(arg1,"DAT / TXMP ONI",Qt::CaseSensitive)==0){ //case sensitive is faster
             ui->gbTextures->setEnabled(false);
         }
         else{
             ui->gbTextures->setEnabled(true);
+            ui->leEnvMapTexture->setEnabled(ui->cbEnvMap->isChecked());
         }
     }
@@ -979,12 +1029,13 @@
 
         ui->cbWithTRBS_ONCC->setEnabled(false);
-        ui->cbWithTRBS_ONCC->setChecked(false);
         ui->cbCellShading->setEnabled(false);
-        ui->cbCellShading->setChecked(false);
         ui->cbNormals->setEnabled(false);
-        ui->cbNormals->setChecked(false);
-//#error add drag and drop to Extract TRAM with TRBS/ONCC
+        ui->cbStandingPose->setEnabled(false);
+        ui->leTRBS_ONCC->setEnabled(false);
+
+        //#error add drag and drop to Extract TRAM with TRBS/ONCC
         if(QString::compare(arg1,"TRAM ONI",Qt::CaseSensitive)==0){ //case sensitive is faster
             ui->cbWithTRBS_ONCC->setEnabled(true);
+            ui->leTRBS_ONCC->setEnabled(ui->cbWithTRBS_ONCC->isChecked());
         }
         else if(QString::compare(arg1,"TRBS DAE",Qt::CaseSensitive)==0){
@@ -992,4 +1043,7 @@
             ui->cbCellShading->setEnabled(true);
         }
+        else if(QString::compare(arg1,"TRBS / ONCC ONI",Qt::CaseSensitive)==0){
+            ui->cbStandingPose->setEnabled(true);
+        }
 
     }
@@ -998,13 +1052,15 @@
 
         ui->cbTexture->setEnabled(false);
-        ui->cbTexture->setChecked(false);
+        ui->leTextureName->setEnabled(false);
         ui->cbWithAnimation->setEnabled(false);
-        ui->cbWithAnimation->setChecked(false);
+        ui->leAnimationName->setEnabled(false);
 
         if(QString::compare(arg1,"M3GM ONI",Qt::CaseSensitive)==0){ //case sensitive is faster
             ui->cbWithAnimation->setEnabled(true);
+            ui->leAnimationName->setEnabled(ui->cbWithAnimation->isChecked());
         }
         else if(QString::compare(arg1,"OBJ",Qt::CaseSensitive)==0){
             ui->cbTexture->setEnabled(true);
+            ui->leTextureName->setEnabled(ui->cbTexture->isChecked());
         }
     }
@@ -1013,23 +1069,26 @@
 
         ui->cbSpecificFilesLevels->setEnabled(false);
-        ui->cbSpecificFilesLevels->setChecked(false);
+        ui->leSpecificFilesLevels->setEnabled(false);
         ui->cbDatLevels->setEnabled(false);
-        ui->cbDatLevels->setChecked(false);
+        ui->leTargetDatLevels->setEnabled(false);
         ui->cbBnvLevels->setEnabled(false);
-        ui->cbBnvLevels->setChecked(false);
+        ui->leBnvLevels->setEnabled(false);
         ui->cbAdditionalSourcesLevels->setEnabled(false);
-        ui->cbAdditionalSourcesLevels->setChecked(false);
+        ui->leAdditSourcesLevels->setEnabled(false);
         ui->cbGridsLevels->setEnabled(false);
-        ui->cbGridsLevels->setChecked(false);
 
         if(arg1=="DAT"){ //case sensitive is faster
             ui->cbSpecificFilesLevels->setEnabled(true);
+            ui->leSpecificFilesLevels->setEnabled( ui->cbSpecificFilesLevels->isChecked());
         }
         else if(arg1=="ONI FILES"){ //case sensitive is faster
             ui->cbDatLevels->setEnabled(true);
+            ui->leTargetDatLevels->setEnabled(ui->cbDatLevels->isChecked());
         }
         else if(arg1=="DAE"){
             ui->cbBnvLevels->setEnabled(true);
+            ui->leBnvLevels->setEnabled(ui->cbBnvLevels->isChecked());
             ui->cbAdditionalSourcesLevels->setEnabled(true);
+            ui->leAdditSourcesLevels->setEnabled(ui->cbAdditionalSourcesLevels->isChecked());
         }
     }
@@ -1132,5 +1191,5 @@
 
     if(size==0){
-        Util::showPopUp("Select a row first.");
+        Util::Dialogs::showInfo("Select a row first.");
         return;
     }
@@ -1146,5 +1205,5 @@
 
 
-    if(Util::showQuestionPopUp(this,"Are you sure you want to delete the selected rows?",defaultButton)){
+    if(Util::Dialogs::showQuestion(this,"Are you sure you want to delete the selected rows?",defaultButton)){
         for(int i=0; i<size; i++){
             //myTable->removeRow(myTable->selectedItems().at(size-i-1)->row());
@@ -1161,5 +1220,5 @@
 
     if(myTable->rowCount()==0){
-        Util::showPopUp("Nothing to clear.");
+        Util::Dialogs::showInfo("Nothing to clear.");
         return;
     }
@@ -1174,5 +1233,5 @@
 #endif
 
-    if(Util::showQuestionPopUp(this,"Are you sure you want to clear the content?",defaultButton)){
+    if(Util::Dialogs::showQuestion(this,"Are you sure you want to clear the content?",defaultButton)){
         clearTableNoPrompt(myTable);
         updateItemsLoaded(myTable);
@@ -1210,5 +1269,5 @@
 QMessageBox::StandardButton MainWindow::askToSaveCurrentProject(){
     QMessageBox::StandardButton result =
-            Util::showQuestionPopUpWithCancel(this,"There are unsaved changes. Do you want to save the current project?", QMessageBox::StandardButton::Yes);
+            Util::Dialogs::showQuestionWithCancel(this,"There are unsaved changes. Do you want to save the current project?", QMessageBox::StandardButton::Yes);
 
     if(result == QMessageBox::StandardButton::Yes){
@@ -1284,5 +1343,5 @@
     QString result=myProcess.readAllStandardOutput();
 
-    Util::showPopUp("This Vago version was built with base in OniSplit version "+GlobalVars::BuiltOniSplitVersion+"\n\nCurrent version is:\n"+result.trimmed());
+    Util::Dialogs::showInfo("This Vago version was built with base in OniSplit version "+GlobalVars::BuiltOniSplitVersion+"\n\nCurrent version is:\n"+result.trimmed());
 }
 
@@ -1295,5 +1354,5 @@
     QString result=myProcess.readLine();
 
-    Util::showPopUp("This Vago version was built with base in XmlTools version "+GlobalVars::BuiltXmlToolsVersion+"\n\nCurrent version is:\n"+result.trimmed());
+    Util::Dialogs::showInfo("This Vago version was built with base in XmlTools version "+GlobalVars::BuiltXmlToolsVersion+"\n\nCurrent version is:\n"+result.trimmed());
 }
 
@@ -1335,5 +1394,5 @@
     this->outputFolder=this->workspaceLocation;
     ui->tbOpenFolder->setToolTip("Open Vago workspace");
-    showSuccessStatusMessage("Vago is now outputting the NEW items for Vago workspace.");
+    Util::StatusBar::showSuccess(ui->statusBar, "Vago is now outputting the NEW items for Vago workspace.");
 }
 
@@ -1341,5 +1400,5 @@
 {
     QString newDir=QFileDialog::getExistingDirectory(this,"Choose the folder for output NEW files directly...",this->AeLocation+"/GameDataFolder");
-    newDir=Util::normalizePath(newDir);
+    newDir=Util::FileSystem::normalizePath(newDir);
 
     if(newDir.isEmpty()){
@@ -1358,7 +1417,7 @@
     this->outputFolder=newDir;
 
-    QString newDirName=Util::cutName(newDir);
+    QString newDirName=Util::FileSystem::cutName(newDir);
     ui->tbOpenFolder->setToolTip("Open "+newDirName+" output folder");
-    showSuccessStatusMessage("Vago is now outputting the NEW items for "+newDirName+".");
+    Util::StatusBar::showSuccess(ui->statusBar, "Vago is now outputting the NEW items for "+newDirName+".");
 }
 
@@ -1499,5 +1558,5 @@
     QList<int> selectedRows = QList<int>();
 
-    foreach(QModelIndex rowItem, myTable->selectionModel()->selectedRows()){
+    for(const QModelIndex &rowItem : myTable->selectionModel()->selectedRows()){
         selectedRows << rowItem.row();
     }
@@ -1537,5 +1596,5 @@
     //Can we change the settings? (the conversion must be the same)
     QString currentSettings = (getTypeConversion(myTable)); //call function at the mainWindow with a signal (different threads?)
-    foreach(int row, selectedRows){
+    for(const int row : selectedRows){
         if( myTable->item(row,1)->text() != currentSettings){ //If we find out any of the selected items can't be convert disable operation
             changeOptions->setEnabled(false);
@@ -1567,5 +1626,5 @@
 
         QApplication::clipboard()->setText(toCopy);
-        showSuccessStatusMessage(QString::number(size) + (size==1?" item ":" items ")+ "copied to the clipboard");
+        Util::StatusBar::showSuccess(ui->statusBar, QString::number(size) + (size==1?" item ":" items ")+ "copied to the clipboard");
     }
     else if(selectedOption==moveUp.get()){
@@ -1591,5 +1650,5 @@
 
         QString newDir=QFileDialog::getExistingDirectory(this,"Choose the folder for the output of the files selected...",this->AeLocation+"/GameDataFolder");
-        newDir=Util::normalizePath(newDir);
+        newDir=Util::FileSystem::normalizePath(newDir);
 
         if(newDir.isEmpty()){
@@ -1637,5 +1696,5 @@
 
         rowsWereChangedInDropTableWidget();
-        showSuccessStatusMessage(result);
+        Util::StatusBar::showSuccess(ui->statusBar, result);
     }
 }
@@ -1650,6 +1709,5 @@
     QString command;
 
-    foreach(int row, rows){
-
+    for(int row : rows){
         command=getCommand(myTable,getFileOutputFolder(fromTo,myTable->getOutputAbsolute(row)),from,to,myTable->getFileAbsolute(row));
 
@@ -1663,5 +1721,5 @@
 
     rowsWereChangedInDropTableWidget();
-    showSuccessStatusMessage(QString::number(rows.size()) + (rows.size()==1?" item ":" items ")+ "changed to the current settings");
+    Util::StatusBar::showSuccess(ui->statusBar, QString::number(rows.size()) + (rows.size()==1?" item ":" items ")+ "changed to the current settings");
 }
 
@@ -1670,5 +1728,5 @@
     QString command, currentAbsoluteFile, fromTo, from, to;
 
-    foreach(int row, rows){ //No optimization possible here, commands may be different
+    for(const int row : rows){ //No optimization possible here, commands may be different
         fromTo=myTable->item(row,1)->text();
         from = QString(fromTo).remove(fromTo.indexOf(" >"),fromTo.size()-1); //parse the string to get the from
@@ -1687,5 +1745,5 @@
 
     rowsWereChangedInDropTableWidget();
-    showSuccessStatusMessage(QString::number(rows.size()) + (rows.size()==1?" item ":" items ")+ "changed the output to "+(newOutput!=this->workspaceLocation?Util::cutName(newOutput):"Vago workspace"));
+    Util::StatusBar::showSuccess(ui->statusBar, QString::number(rows.size()) + (rows.size()==1?" item ":" items ")+ "changed the output to "+(newOutput!=this->workspaceLocation?Util::FileSystem::cutName(newOutput):"Vago workspace"));
 }
 
@@ -1771,119 +1829,98 @@
 void MainWindow::saveProjectState(const QString &filePath)
 {
-
-    QList<DropTableWidget*> tableWidgets = getAllTableWidgets();
-
-    pugi::xml_document doc;
-
-    pugi::xml_node rootNode = doc.append_child("VagoProject");
-    rootNode.append_attribute("vagoVersion").set_value(GlobalVars::LastCompatibleVersion.toUtf8().constData());
-
-    foreach(DropTableWidget* const &myTable, tableWidgets){
-        saveProjectWidget(rootNode, myTable);
-    }
-
-    if(!doc.save_file(filePath.toUtf8().constData(), PUGIXML_TEXT("\t"), pugi::format_default | pugi::format_write_bom, pugi::xml_encoding::encoding_utf8)){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "An error ocurred while trying to save the project file. Please try another path.");
-        return;
-    }
-
-    this->vagoSettings->setValue("LastProjectPath",QFileInfo(filePath).absoluteDir().path());
-
-    this->lastProjectFilePath = filePath;
-    this->unsavedChangesExist = false;
-
-    addNewRecentProject(filePath);
-
-    setVagoWindowTitle();
-
-    showSuccessStatusMessage("Project saved sucessfully.");
-}
-
-void MainWindow::saveProjectWidget(pugi::xml_node &rootNode, DropTableWidget* table)
-{
-    QString from;
-    QString to;
-    QString tabName = getTabNameByTableWidget(table);
-
-    pugi::xml_node currentNodeTable = rootNode.append_child("tempName");
-    pugi::xml_node options;
-
-    if(table==ui->twSourcesXML){ //So we only need to parse one command.
-        from = ui->cbFromXML->currentText().toUtf8().constData();
-        to = ui->cbToXML->currentText().toUtf8().constData();
-    }
-    else if(table==ui->twSourcesTextures){
-        from = ui->cbFromTextures->currentText().toUtf8().constData();
-        to = ui->cbToTextures->currentText().toUtf8().constData();
-        options = currentNodeTable.append_child("Options");
-        options.append_attribute("type").set_value(Util::qStrToCstr(getTextureRBCheckedTypeTexture()->text()));
-        options.append_attribute("genMipMaps").set_value(Util::boolToCstr(ui->cbMipMapsTextures->isChecked()));
-        options.append_attribute("noUwrap").set_value(Util::boolToCstr(ui->cbNoUwrap->isChecked()));
-        options.append_attribute("noVwrap").set_value(Util::boolToCstr(ui->cbNoVwrap->isChecked()));
-        options.append_attribute("large").set_value(Util::boolToCstr(ui->cbLarge->isChecked()));
-        options.append_attribute("envMap").set_value(Util::boolToCstr(ui->cbEnvMap->isChecked()));
-        options.append_attribute("envMapValue").set_value(Util::qStrToCstr(ui->leEnvMapTexture->text()));
-    }
-    else if(table==ui->twSourcesCharacters){
-        from = ui->cbFromCharacters->currentText().toUtf8().constData();
-        to = ui->cbToCharacters->currentText().toUtf8().constData();
-        options = currentNodeTable.append_child("Options");
-        options.append_attribute("cellShading").set_value(Util::boolToCstr(ui->cbCellShading->isChecked()));
-        options.append_attribute("normals").set_value(Util::boolToCstr(ui->cbNormals->isChecked()));
-        options.append_attribute("extractTRBSONCC").set_value(Util::boolToCstr(ui->cbWithTRBS_ONCC->isChecked()));
-        options.append_attribute("extractTRBSONCCValue").set_value(Util::qStrToCstr(ui->leTRBS_ONCC->text()));
-    }
-    else if(table==ui->twSourcesObjects){
-        from = ui->cbFromObjects->currentText().toUtf8().constData();
-        to = ui->cbToObjects->currentText().toUtf8().constData();
-        options = currentNodeTable.append_child("Options");
-        options.append_attribute("texture").set_value(Util::boolToCstr(ui->cbTexture->isChecked()));
-        options.append_attribute("textureValue").set_value(Util::qStrToCstr(ui->leTextureName->text()));
-        options.append_attribute("withAnimation").set_value(Util::boolToCstr(ui->cbWithAnimation->isChecked()));
-        options.append_attribute("withAnimationValue").set_value(Util::qStrToCstr(ui->leAnimationName->text()));
-    }
-    else if(table==ui->twSourcesLevels){
-        from = ui->cbFromLevels->currentText().toUtf8().constData();
-        to = ui->cbToLevels->currentText().toUtf8().constData();
-        options = currentNodeTable.append_child("Options");
-        options.append_attribute("extractWithFiles").set_value(Util::boolToCstr(ui->cbSpecificFilesLevels->isChecked()));
-        options.append_attribute("extractWithFilesValue").set_value(Util::qStrToCstr(ui->leSpecificFilesLevels->text()));
-        options.append_attribute("datFilename").set_value(Util::boolToCstr(ui->cbDatLevels->isChecked()));
-        options.append_attribute("datFilenameValue").set_value(Util::qStrToCstr(ui->leTargetDatLevels->text()));
-        options.append_attribute("bnvSource").set_value(Util::boolToCstr(ui->cbBnvLevels->isChecked()));
-        options.append_attribute("bnvSourceValue").set_value(Util::qStrToCstr(ui->leBnvLevels->text()));
-        options.append_attribute("generateGrids").set_value(Util::boolToCstr(ui->cbGridsLevels->isChecked()));
-        options.append_attribute("additionalSources").set_value(Util::boolToCstr(ui->cbAdditionalSourcesLevels->isChecked()));
-        options.append_attribute("additionalSourcesValue").set_value(Util::qStrToCstr(ui->leAdditSourcesLevels->text()));
-    }
-    else{
-        from = ui->cbFromMisc->currentText().toUtf8().constData();
-        to = ui->cbToMisc->currentText().toUtf8().constData();
-    }
-
-    currentNodeTable.set_name(tabName.toUtf8().constData());
-
-    currentNodeTable.append_attribute("from").set_value(from.toUtf8().constData());
-    currentNodeTable.append_attribute("to").set_value(to.toUtf8().constData());
-
-
-    for(int i=0; i<table->rowCount(); i++){
-
-        QString currFileFolder = table->item(i,0)->text();
-        QString currFromTo = table->item(i,1)->text();
-        QString currCommand = table->item(i,2)->text();
-
-        pugi::xml_node currentRow = currentNodeTable.append_child("Row");
-
-
-        currentRow.append_attribute("fileFolder").set_value(Util::qStrToCstr(currFileFolder));
-        currentRow.append_attribute("fromTo").set_value(Util::qStrToCstr(currFromTo));
-        currentRow.append_attribute("command").set_value(Util::qStrToCstr(currCommand));
-
-        if(table->item(i,2)->background()==table->disabledBackStyle){
-            currentRow.append_attribute("disabled").set_value(true);
-        }
-
-    }
+    try{
+        ProjectFileVago::saveProjectDataToFile(filePath, fetchCurrentProjectData());
+
+        this->vagoSettings->setValue("LastProjectPath",QFileInfo(filePath).absoluteDir().path());
+
+        this->lastProjectFilePath = filePath;
+        this->unsavedChangesExist = false;
+
+        addNewRecentProject(filePath);
+
+        setVagoWindowTitle();
+
+        Util::StatusBar::showSuccess(ui->statusBar, "Project saved sucessfully.");
+    }
+    catch(const std::exception& e){
+        QString errorMessage = "An error ocurred while trying to save the project file. Please try another path.";
+        UtilVago::showAndLogErrorPopUpLogButton(errorMessage);
+        Util::StatusBar::showError(ui->statusBar, "Couldn't save project file.");
+    }
+}
+
+ProjectFileVago::ProjectData MainWindow::fetchCurrentProjectData(){
+
+    ProjectFileVago::ProjectData currentProjectData;
+
+    auto fFetchTabGenericData =
+            [](ProjectFileVago::ProjectTable &projectTable,
+            const QComboBox * const cbFrom,
+            const QComboBox * const cbTo,
+            DropTableWidget const * const table) ->void{
+
+        projectTable.from = cbFrom->currentText();
+        projectTable.to = cbTo->currentText();
+
+        for(int i=0; i<table->rowCount(); i++){
+
+            ProjectFileVago::ProjectTableRow currentRow;
+
+            currentRow.fileFolder = table->item(i,0)->text();
+            currentRow.fromTo = table->item(i,1)->text();
+            currentRow.command= table->item(i,2)->text();
+
+            if(table->item(i,2)->background()==table->disabledBackStyle){
+                currentRow.isDisabled = true;
+            }
+
+            projectTable.rows.append(currentRow);
+        }
+    };
+
+    // XML tab
+    fFetchTabGenericData(currentProjectData.xmlTable, ui->cbFromXML, ui->cbToXML, ui->twSourcesXML);
+
+    // Textures tab
+    fFetchTabGenericData(currentProjectData.texturesTable, ui->cbFromTextures, ui->cbToTextures, ui->twSourcesTextures);
+    currentProjectData.texturesTable.rbTexturesType = getTextureRBCheckedTypeTexture()->text();
+    currentProjectData.texturesTable.cbGenMipMaps = ui->cbMipMapsTextures->isChecked();
+    currentProjectData.texturesTable.cbNoUwrap = ui->cbNoUwrap->isChecked();
+    currentProjectData.texturesTable.cbNoVwrap = ui->cbNoVwrap->isChecked();
+    currentProjectData.texturesTable.cbLarge = ui->cbLarge->isChecked();
+    currentProjectData.texturesTable.cbEnvMap = ui->cbEnvMap->isChecked();
+    currentProjectData.texturesTable.leEnvMapTexture = ui->leEnvMapTexture->text();
+
+    // Characters tab
+    fFetchTabGenericData(currentProjectData.charactersTable, ui->cbFromCharacters, ui->cbToCharacters, ui->twSourcesCharacters);
+    currentProjectData.charactersTable.cbCellShading = ui->cbCellShading->isChecked();
+    currentProjectData.charactersTable.cbNormals = ui->cbNormals->isChecked();
+    currentProjectData.charactersTable.cbStandingPose = ui->cbStandingPose->isChecked();
+    currentProjectData.charactersTable.cbWithTRBS_ONCC = ui->cbWithTRBS_ONCC->isChecked();
+    currentProjectData.charactersTable.leTRBS_ONCC = ui->leTRBS_ONCC->text();
+
+    // Objects tab
+    fFetchTabGenericData(currentProjectData.objectsTable, ui->cbFromObjects, ui->cbToObjects, ui->twSourcesObjects);
+    currentProjectData.objectsTable.cbTexture = ui->cbTexture->isChecked();
+    currentProjectData.objectsTable.leTextureName = ui->leTextureName->text();
+    currentProjectData.objectsTable.cbWithAnimation = ui->cbWithAnimation->isChecked();
+    currentProjectData.objectsTable.leAnimationName = ui->leAnimationName->text();
+
+    // Levels tab
+    fFetchTabGenericData(currentProjectData.levelsTable, ui->cbFromLevels, ui->cbToLevels, ui->twSourcesLevels);
+    currentProjectData.levelsTable.cbSpecificFilesLevels = ui->cbSpecificFilesLevels->isChecked();
+    currentProjectData.levelsTable.leSpecificFilesLevels = ui->leSpecificFilesLevels->text();
+    currentProjectData.levelsTable.cbDatLevels = ui->cbDatLevels->isChecked();
+    currentProjectData.levelsTable.leTargetDatLevels = ui->leTargetDatLevels->text();
+    currentProjectData.levelsTable.cbBnvLevels = ui->cbBnvLevels->isChecked();
+    currentProjectData.levelsTable.leBnvLevels = ui->leBnvLevels->text();
+    currentProjectData.levelsTable.cbGridsLevels = ui->cbGridsLevels->isChecked();
+    currentProjectData.levelsTable.cbAdditionalSourcesLevels = ui->cbAdditionalSourcesLevels->isChecked();
+    currentProjectData.levelsTable.leAdditSourcesLevels = ui->leAdditSourcesLevels->text();
+
+    // Misc tab
+    fFetchTabGenericData(currentProjectData.miscTable, ui->cbFromMisc, ui->cbToMisc, ui->twSourcesMisc);
+
+    return currentProjectData;
 }
 
@@ -1941,5 +1978,5 @@
     }
     else{
-        vagoTitle += Util::cutNameWithoutBackSlash(this->lastProjectFilePath);
+        vagoTitle += Util::FileSystem::cutNameWithoutBackSlash(this->lastProjectFilePath);
     }
 
@@ -2019,4 +2056,21 @@
 void MainWindow::loadProjectState(const QString &filePath)
 {
+
+    auto fLoadTabGenericData =
+            [this]( // we are capturing this only to call the addRowTable function...
+                const ProjectFileVago::ProjectTable &tableData,
+                DropTableWidget * const table,
+                QComboBox * const cbFrom,
+                QComboBox * const cbTo) -> void{
+
+        cbFrom->setCurrentText(tableData.from);
+        cbTo->setCurrentText(tableData.to);
+
+        // Add rows
+        for(const ProjectFileVago::ProjectTableRow &currentRow : tableData.rows){
+            addRowTable(table,currentRow.fileFolder,currentRow.fromTo,currentRow.command, currentRow.isDisabled);
+        }
+
+    };
 
     this->projectIsLoading = true;
@@ -2030,158 +2084,74 @@
     }
 
-    QString statusError = "Couldn't load project.";
-
-    pugi::xml_document doc;
-
-    pugi::xml_parse_result result = doc.load_file(Util::qStrToCstr(filePath));
-
-    if(result.status!=pugi::status_ok){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "An error ocurred while loading project file.\n" + QString(result.description()));
-        showErrStatusMessage(statusError);
+    try{
+        ProjectFileVago::ProjectData projectData = ProjectFileVago::readProjectDataFromFile(filePath);
+
+        // XML tab
+        fLoadTabGenericData(projectData.xmlTable, ui->twSourcesXML, ui->cbFromXML, ui->cbToXML);
+
+        // Textures tab
+        fLoadTabGenericData(projectData.texturesTable, ui->twSourcesTextures, ui->cbFromTextures, ui->cbToTextures);
+        getTextureRBTypeTextureByName(projectData.texturesTable.rbTexturesType)->setChecked(true);
+        ui->cbMipMapsTextures->setChecked(projectData.texturesTable.cbGenMipMaps);
+        ui->cbNoUwrap->setChecked(projectData.texturesTable.cbNoUwrap);
+        ui->cbNoVwrap->setChecked(projectData.texturesTable.cbNoVwrap);
+        ui->cbLarge->setChecked(projectData.texturesTable.cbLarge);
+        ui->cbEnvMap->setChecked(projectData.texturesTable.cbEnvMap);
+        ui->leEnvMapTexture->setText(projectData.texturesTable.leEnvMapTexture);
+
+        // Characters tab
+        fLoadTabGenericData(projectData.charactersTable, ui->twSourcesCharacters, ui->cbFromCharacters, ui->cbToCharacters);
+
+        ui->cbCellShading->setChecked(projectData.charactersTable.cbCellShading);
+        ui->cbNormals->setChecked(projectData.charactersTable.cbNormals);
+        ui->cbStandingPose->setChecked(projectData.charactersTable.cbStandingPose);
+        ui->cbWithTRBS_ONCC->setChecked(projectData.charactersTable.cbWithTRBS_ONCC);
+        ui->leTRBS_ONCC->setText(projectData.charactersTable.leTRBS_ONCC);
+
+        // Objects tab
+        fLoadTabGenericData(projectData.objectsTable, ui->twSourcesObjects, ui->cbFromObjects, ui->cbToObjects);
+
+        ui->cbTexture->setChecked(projectData.objectsTable.cbTexture);
+        ui->leTextureName->setText(projectData.objectsTable.leTextureName);
+        ui->cbWithAnimation->setChecked(projectData.objectsTable.cbWithAnimation);
+        ui->leAnimationName->setText(projectData.objectsTable.leAnimationName);
+
+        // Levels tab
+        fLoadTabGenericData(projectData.levelsTable, ui->twSourcesLevels, ui->cbFromLevels, ui->cbToLevels);
+
+        ui->cbSpecificFilesLevels->setChecked(projectData.levelsTable.cbSpecificFilesLevels);
+        ui->leSpecificFilesLevels->setText(projectData.levelsTable.leSpecificFilesLevels);
+        ui->cbDatLevels->setChecked(projectData.levelsTable.cbDatLevels);
+        ui->leTargetDatLevels->setText(projectData.levelsTable.leTargetDatLevels);
+        ui->cbBnvLevels->setChecked(projectData.levelsTable.cbBnvLevels);
+        ui->leBnvLevels->setText(projectData.levelsTable.leBnvLevels);
+        ui->cbGridsLevels->setChecked(projectData.levelsTable.cbGridsLevels);
+        ui->cbAdditionalSourcesLevels->setChecked(projectData.levelsTable.cbAdditionalSourcesLevels);
+        ui->leAdditSourcesLevels->setText(projectData.levelsTable.leAdditSourcesLevels);
+
+        // Misc tab
+        fLoadTabGenericData(projectData.miscTable, ui->twSourcesMisc, ui->cbFromMisc, ui->cbToMisc);
+
+        this->vagoSettings->setValue("LastProjectPath",QFileInfo(filePath).absoluteDir().path());
+
+        this->lastProjectFilePath = filePath;
+        this->unsavedChangesExist = false;
+
+        addNewRecentProject(filePath);
+
+        setVagoWindowTitle();
+
         this->projectIsLoading = false;
-        return;
-    }
-
-
-    if(QString(doc.root().first_child().name()) != "VagoProject"){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, QString(doc.root().name()) + "The file opened is not a valid VagoProject file. Load aborted.");
-        showErrStatusMessage(statusError);
+
+        Util::StatusBar::showSuccess(ui->statusBar, "Project loaded sucessfully.");
+    }
+    catch(const std::exception& e){
         this->projectIsLoading = false;
-        return;
-    }
-
-    QString projVagoVersion;
-
-    try{
-        projVagoVersion = QString(doc.select_node("/VagoProject/@vagoVersion").attribute().value());
-    }
-    catch (const pugi::xpath_exception& e)
-    {
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't find the vagoVersion of the current project. Load aborted.\n" + QString(e.what()));
-        showErrStatusMessage(statusError);
-        this->projectIsLoading = false;
-        return;
-    }
-
-    if(!projVagoVersion.startsWith(GlobalVars::LastCompatibleVersion)){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "The project that you are trying to load seems it is not compatible with your Vago Version. Please update Vago and try again.");
-        showErrStatusMessage(statusError);
-        this->projectIsLoading = false;
-        return;
-    }
-
-    // After the initial validations begin loading the project data
-
-    QList<DropTableWidget*> tableWidgets = getAllTableWidgets();
-
-    try{
-        foreach(DropTableWidget* const &myTable, tableWidgets){
-            loadProjectWidget(doc, myTable);
-        }
-    }
-    catch(const std::exception& e){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't load the vago project. Error: " + QString(e.what()));
-        showErrStatusMessage(statusError);
-        this->projectIsLoading = false;
-        return;
-    }
-
-    this->vagoSettings->setValue("LastProjectPath",QFileInfo(filePath).absoluteDir().path());
-
-    this->lastProjectFilePath = filePath;
-    this->unsavedChangesExist = false;
-
-    addNewRecentProject(filePath);
-
-    setVagoWindowTitle();
-
-    this->projectIsLoading = false;
-
-    showSuccessStatusMessage("Project loaded sucessfully.");
-}
-
-
-void MainWindow::loadProjectWidget(pugi::xml_document &doc, DropTableWidget* table)
-{
-    QString tabName = getTabNameByTableWidget(table);
-    QString from (doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/@from")).attribute().value());
-    QString to (doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/@to")).attribute().value());
-
-    if(table==ui->twSourcesXML){
-        ui->cbFromXML->setCurrentText(from);
-        on_cbFromXML_currentIndexChanged(from);
-        ui->cbToXML->setCurrentText(to);
-    }
-    else if(table==ui->twSourcesTextures){
-        //ui->cbFromTextures->setCurrentText(from);
-        on_cbFromTextures_currentIndexChanged(from);
-        ui->cbToTextures->setCurrentText(to);
-
-        getTextureRBTypeTextureByName((doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@type")).attribute().value()))->setChecked(true);
-        ui->cbMipMapsTextures->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@genMipMaps")).attribute().as_bool());
-        ui->cbNoUwrap->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@noUwrap")).attribute().as_bool());
-        ui->cbNoVwrap->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@noVwrap")).attribute().as_bool());
-        ui->cbLarge->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@large")).attribute().as_bool());
-        ui->cbEnvMap->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@envMap")).attribute().as_bool());
-        ui->leEnvMapTexture->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@envMapValue")).attribute().value()));
-    }
-    else if(table==ui->twSourcesCharacters){
-        ui->cbFromCharacters->setCurrentText(from);
-        on_cbFromCharacters_currentIndexChanged(from);
-        ui->cbToCharacters->setCurrentText(to);
-
-
-        ui->cbCellShading->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@cellShading")).attribute().as_bool());
-        ui->cbNormals->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@normals")).attribute().as_bool());
-        ui->cbWithTRBS_ONCC->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@extractTRBSONCC")).attribute().as_bool());
-        ui->leTRBS_ONCC->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@extractTRBSONCCValue")).attribute().value()));
-    }
-    else if(table==ui->twSourcesObjects){
-        ui->cbFromObjects->setCurrentText(from);
-        on_cbFromObjects_currentIndexChanged(from);
-        ui->cbToObjects->setCurrentText(to);
-
-        ui->cbTexture->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@texture")).attribute().as_bool());
-        ui->leTextureName->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@textureValue")).attribute().value()));
-        ui->cbWithAnimation->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@withAnimation")).attribute().as_bool());
-        ui->leAnimationName->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@withAnimationValue")).attribute().value()));
-    }
-    else if(table==ui->twSourcesLevels){
-        ui->cbFromLevels->setCurrentText(from);
-        on_cbFromLevels_currentIndexChanged(from);
-        ui->cbToLevels->setCurrentText(to);
-
-        ui->cbSpecificFilesLevels->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@extractWithFiles")).attribute().as_bool());
-        ui->leSpecificFilesLevels->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@extractWithFilesValue")).attribute().value()));
-        ui->cbDatLevels->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@datFilename")).attribute().as_bool());
-        ui->leTargetDatLevels->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@datFilenameValue")).attribute().value()));
-        ui->cbBnvLevels->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@bnvSource")).attribute().as_bool());
-        ui->leBnvLevels->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@bnvSourceValue")).attribute().value()));
-        ui->cbGridsLevels->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@generateGrids")).attribute().as_bool());
-        ui->cbAdditionalSourcesLevels->setChecked(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@additionalSources")).attribute().as_bool());
-        ui->leAdditSourcesLevels->setText(QString(doc.select_node(Util::qStrToCstr("/VagoProject/"+tabName+"/Options/@additionalSourcesValue")).attribute().value()));
-    }
-    else{
-        ui->cbFromMisc->setCurrentText(from);
-        on_cbFromMisc_currentIndexChanged(from);
-        ui->cbToMisc->setCurrentText(to);
-    }
-
-    // Clean previous rows
-    clearTableNoPrompt(table);
-
-    for(const pugi::xpath_node &xPathNode : doc.select_nodes(Util::qStrToCstr("/VagoProject/"+tabName+"/Row"))){
-        pugi::xml_node currNode = xPathNode.node();
-
-        QString currFileFolder = currNode.attribute("fileFolder").value();
-        QString currFromTo = currNode.attribute("fromTo").value();
-        QString currCommand = currNode.attribute("command").value();
-
-        bool isToDisable = false;
-        pugi::xml_attribute disabledAttr = currNode.attribute("disabled");
-        isToDisable = disabledAttr.empty() ? false : disabledAttr.as_bool();
-
-        addRowTable(table,currFileFolder,currFromTo,currCommand, isToDisable);
-    }
+        QString errorMessage = "Couldn't load the Vago project. Error: " + QString(e.what());
+        LOG_ERROR << errorMessage;
+        Util::Dialogs::showError(errorMessage);
+        Util::StatusBar::showError(ui->statusBar, "Couldn't load project.");
+    }
+
 }
 
Index: /s10k/Vago/mainwindow.h
===================================================================
--- /s10k/Vago/mainwindow.h	(revision 1092)
+++ /s10k/Vago/mainwindow.h	(revision 1093)
@@ -13,4 +13,5 @@
 #include "xmltoolsinterface.h"
 #include "wizardfactory.h"
+#include "xmlParsers/projectfilevago.h"
 
 #include <QMainWindow>
@@ -33,5 +34,5 @@
 #include <QScriptValueIterator>
 #include <droptablewidget.h>
-#include <pugixml.hpp>
+#include <pugixml/pugixml.hpp>
 #ifdef Q_OS_WIN
 #include <QWinTaskbarProgress>
@@ -170,41 +171,40 @@
     void on_cbWithTRBS_ONCC_toggled(bool checked);
 
+    void on_cbFromXML_currentIndexChanged(const QString &arg1);
+
+    void on_cbSpecificFilesLevels_toggled(bool checked);
+
+    void on_tbAbortConversion_clicked();
+
+    void on_tabWidget_currentChanged(int);
+
+    void on_actionSave_Project_triggered();
+
+    void on_actionSave_triggered();
+
+    void on_actionLoad_Project_triggered();
+
+    void on_actionProject1_triggered();
+
+    void on_actionProject2_triggered();
+
+    void on_actionProject3_triggered();
+
+    void on_actionProject4_triggered();
+
+    void on_actionProject5_triggered();
+
+    void on_actionBackground_Image_Wizard_triggered();
+
+    void on_actionNew_Project_triggered();
+
+    void on_tbXmlToolsInterface_clicked();
+
+    void on_actionWindow_Messages_Wizard_triggered();
+
     void on_cbWithAnimation_toggled(bool checked);
-
-    void on_cbFromXML_currentIndexChanged(const QString &arg1);
-
-    void on_cbSpecificFilesLevels_toggled(bool checked);
-
-    void on_tbAbortConversion_clicked();
-
-    void on_tabWidget_currentChanged(int);
-
-    void on_actionSave_Project_triggered();
-
-    void on_actionSave_triggered();
-
-    void on_actionLoad_Project_triggered();
-
-    void on_actionProject1_triggered();
-
-    void on_actionProject2_triggered();
-
-    void on_actionProject3_triggered();
-
-    void on_actionProject4_triggered();
-
-    void on_actionProject5_triggered();
-
-    void on_actionBackground_Image_Wizard_triggered();
-
-    void on_actionNew_Project_triggered();
-
-    void on_tbXmlToolsInterface_clicked();
-
-    void on_actionWindow_Messages_Wizard_triggered();
 
 private:
     Ui::MainWindow *ui;
-    Logger *myLogger;
     QString workspaceLocation; //Workspace location
     QString workspaceWizardsLocation; //Workspace wizard location
@@ -241,7 +241,6 @@
     enum {XMLTabIndex, TexturesTabIndex, CharactersTabIndex, ObjectsTabIndex, LevelsTabIndex, MiscTabIndex};
 
+private:
     void connectSlots();
-    void showErrStatusMessage(QString message);
-    void showSuccessStatusMessage(QString message);
     void mapCommands();
     void addRowTable(DropTableWidget *myTable, QString file, QString fromTo, QString command, bool isToDisabled=false);
@@ -256,8 +255,6 @@
     void setConverterButtonsSize();
     void saveProjectState(const QString &filePath);
-    void saveProjectWidget(pugi::xml_node &rootNode, DropTableWidget* table);
     void loadProjectState(const QString &filePath);
     void setVagoWindowTitle();
-    void loadProjectWidget(pugi::xml_document &doc, DropTableWidget* table);
     void saveRecentProjects();
     void loadRecentProjects();
@@ -284,4 +281,5 @@
     QList<DropTableWidget*> getAllTableWidgets();
     QMessageBox::StandardButton askToSaveCurrentProject();
+    ProjectFileVago::ProjectData fetchCurrentProjectData();
 
 signals:
Index: /s10k/Vago/mainwindow.ui
===================================================================
--- /s10k/Vago/mainwindow.ui	(revision 1092)
+++ /s10k/Vago/mainwindow.ui	(revision 1093)
@@ -701,4 +701,14 @@
           <layout class="QHBoxLayout" name="horizontalLayout_3">
            <item>
+            <widget class="QCheckBox" name="cbStandingPose">
+             <property name="toolTip">
+              <string>Export the model in a &quot;standing pose&quot;. If not checked model is exported in the &quot;wrapped form&quot; (all body parts set to 0)</string>
+             </property>
+             <property name="text">
+              <string>Standing Pose</string>
+             </property>
+            </widget>
+           </item>
+           <item>
             <widget class="QCheckBox" name="cbCellShading">
              <property name="enabled">
@@ -905,5 +915,5 @@
              </property>
              <property name="toolTip">
-              <string>Give model a texture. 
+              <string>Give model a texture.
 It's the name of a TXMP.oni file, don't include the extension.</string>
              </property>
@@ -922,6 +932,6 @@
              </property>
              <property name="toolTip">
-              <string>Give model a texture.
-It's the name of a TXMP.oni file, don't include the extension.</string>
+              <string>Extract M3GM.oni with an animation file (OBAN.oni).
+Add the full path to the OBAN.oni file (include extension).</string>
              </property>
              <property name="text">
@@ -936,6 +946,6 @@
              </property>
              <property name="toolTip">
-              <string>Give model a texture. 
-It's the name of a TXMP.oni file, don't include the extension.</string>
+              <string>Extract M3GM.oni with an animation file (OBAN.oni).
+Add the full path to the OBAN.oni file (include extension).</string>
              </property>
              <property name="placeholderText">
Index: /s10k/Vago/manualcommands.cpp
===================================================================
--- /s10k/Vago/manualcommands.cpp	(revision 1092)
+++ /s10k/Vago/manualcommands.cpp	(revision 1093)
@@ -45,5 +45,5 @@
 
     if(command.isEmpty()){
-        Util::showErrorPopUp("Please input a command first.");
+        Util::Dialogs::showError("Please input a command first.");
         return;
     }
@@ -86,5 +86,5 @@
 void ManualCommands::on_pbClear_clicked()
 {
-    if(Util::showQuestionPopUp(this,"Clear the output?")){
+    if(Util::Dialogs::showQuestion(this,"Clear the output?")){
         ui->ptOutput->clear();
     }
Index: /s10k/Vago/packageWizard/packagepage2.cpp
===================================================================
--- /s10k/Vago/packageWizard/packagepage2.cpp	(revision 1092)
+++ /s10k/Vago/packageWizard/packagepage2.cpp	(revision 1093)
@@ -6,10 +6,10 @@
 const QString PackagePage2::CacheFile = "nodes.json";
 
-PackagePage2::PackagePage2(Logger *myLogger, QWidget *parent) :
+PackagePage2::PackagePage2(QWidget *parent) :
     QWizardPage(parent),
     ui(new Ui::PackagePage2)
 {
     ui->setupUi(this);
-    this->myLogger=myLogger;
+
     this->setTitle("Mandatory Fields");
 
@@ -38,19 +38,19 @@
     QString number=ui->lePackageNumber->text();
 
-    bool emptyContent=Util::checkEmptySpaces(QStringList()<<modName<<authors<<version<<description<<number);
+    bool emptyContent=Util::Validation::checkEmptySpaces(QStringList()<<modName<<authors<<version<<description<<number);
 
 
     if(emptyContent){
-        Util::showErrorPopUp("You need to fill all fields first!");
+        Util::Dialogs::showError("You need to fill all fields first!");
         return false;
     }
 
     if(number.size()!=5){
-        Util::showErrorPopUp("Invalid number format. It should contain 5 numbers.");
+        Util::Dialogs::showError("Invalid number format. It should contain 5 numbers.");
         return false;
     }
 
-    if(!Util::isStringInteger(number)){
-        Util::showErrorPopUp("Number is not numeric.");
+    if(!Util::Validation::isStringInteger(number)){
+        Util::Dialogs::showError("Number is not numeric.");
         return false;
     }
@@ -68,15 +68,15 @@
     QString number = ui->lePackageNumber->text();
 
-    if(Util::checkEmptySpaces(QStringList(number))){
-        Util::showErrorPopUp("Number is empty. Please fill it first.");
+    if(Util::Validation::checkEmptySpaces(QStringList(number))){
+        Util::Dialogs::showError("Number is empty. Please fill it first.");
         return;
     }
 
     if(number.size()!=5){
-        Util::showErrorPopUp("Invalid number format. It should contain 5 numeric characters.");
+        Util::Dialogs::showError("Invalid number format. It should contain 5 numeric characters.");
         return;
     }
 
-    if(Util::isStringInteger(number)){
+    if(Util::Validation::isStringInteger(number)){
 
         bool necessaryToRedownload=false;
@@ -108,5 +108,5 @@
     }
     else{
-        Util::showErrorPopUp("Number is not numeric.");
+        Util::Dialogs::showError("Number is not numeric.");
     }
 }
@@ -124,5 +124,5 @@
 
         if(!file.open(QIODevice::WriteOnly)){
-            UtilVago::showAndLogErrorPopUp(this->myLogger, "Error fetching package data: creating cache file.");
+            UtilVago::showAndLogErrorPopUp("Error fetching package data: creating cache file.");
             return;
         }
@@ -132,5 +132,5 @@
         //Let's extract the cache data
         if(JlCompress::extractFile(GlobalVars::VagoTemporaryDir+"/"+this->ZipCacheFile, "/"+this->CacheFile ,GlobalVars::VagoTemporaryDir+"/"+this->CacheFile).isEmpty()){
-            UtilVago::showAndLogErrorPopUp(this->myLogger, "An error occurred while unzipping the package data.");
+            UtilVago::showAndLogErrorPopUp("An error occurred while unzipping the package data.");
         }
 
@@ -139,5 +139,5 @@
     }
     else{
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "An error occurred checking number availability:\n\n"+result->errorString());
+        UtilVago::showAndLogErrorPopUpLogButton("An error occurred checking number availability:\n\n"+result->errorString());
     }
 
@@ -150,5 +150,5 @@
     QFile file(GlobalVars::VagoTemporaryDir+"/"+this->CacheFile); //let's read the chache unzipped
     if(!file.open(QIODevice::ReadOnly)){
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "Error reading downloaded package cache data.");
+        UtilVago::showAndLogErrorPopUp("Error reading downloaded package cache data.");
         return;
     }
@@ -177,10 +177,10 @@
 
     if(!existingModName.isEmpty()){
-        Util::showRichErrorPopUp("Package "+packageNumber+" is already being used by the following mod:<br/><br/>"+
+        Util::Dialogs::showRichError("Package "+packageNumber+" is already being used by the following mod:<br/><br/>"+
                                  existingModName+"<br/><br/>"+
                                  "More information <a href='"+existingModUrl+"'>here</a>.");
     }
     else{
-        Util::showPopUp("It seems that the package number " + packageNumber + " is not being used yet! :)");
+        Util::Dialogs::showInfo("It seems that the package number " + packageNumber + " is not being used yet! :)");
     }
 }
Index: /s10k/Vago/packageWizard/packagepage2.h
===================================================================
--- /s10k/Vago/packageWizard/packagepage2.h	(revision 1092)
+++ /s10k/Vago/packageWizard/packagepage2.h	(revision 1093)
@@ -21,5 +21,5 @@
     
 public:
-    explicit PackagePage2(Logger *myLogger, QWidget *parent = 0);
+    explicit PackagePage2(QWidget *parent = 0);
 
     ~PackagePage2();
@@ -34,5 +34,4 @@
 private:
     Ui::PackagePage2 *ui;
-    Logger *myLogger;
     static const QString ZipCacheFile;
     static const QString CacheFile;
Index: /s10k/Vago/packageWizard/packagepage3.cpp
===================================================================
--- /s10k/Vago/packageWizard/packagepage3.cpp	(revision 1092)
+++ /s10k/Vago/packageWizard/packagepage3.cpp	(revision 1093)
@@ -33,15 +33,15 @@
     if(!field.isEmpty()){
 
-        QStringList list =Util::substring(field,",");
+        QStringList list =Util::String::substring(field,",");
 
         for(int i=0; i<list.size(); i++){
 
             if(list.at(i).isEmpty()){
-                Util::showErrorPopUp("There are commas without numbers in their sides.");
+                Util::Dialogs::showError("There are commas without numbers in their sides.");
                 return false;
             }
 
-            if(!Util::isStringInteger(list.at(i))){
-                Util::showErrorPopUp("Number is not numeric.");
+            if(!Util::Validation::isStringInteger(list.at(i))){
+                Util::Dialogs::showError("Number is not numeric.");
                 return false;
             }
@@ -49,5 +49,5 @@
             if(!isLevels){
                 if(list.at(i).size()!=5){
-                    Util::showErrorPopUp("You have invalid packages numbers. Each number must have 5 digits.");
+                    Util::Dialogs::showError("You have invalid packages numbers. Each number must have 5 digits.");
                     return false;
                 }
Index: /s10k/Vago/packageWizard/packagepage4.cpp
===================================================================
--- /s10k/Vago/packageWizard/packagepage4.cpp	(revision 1092)
+++ /s10k/Vago/packageWizard/packagepage4.cpp	(revision 1093)
@@ -69,7 +69,7 @@
 
     //Pre-processing (check if received only folders)
-    foreach(QString myFile, resources){
+    for(const QString &myFile : resources){
         if(!QDir(myFile).exists()){
-            Util::showErrorPopUp("Only folders are allowed for this operation.");
+            Util::Dialogs::showError("Only folders are allowed for this operation.");
             return;
         }
@@ -78,7 +78,7 @@
     QString type=ui->pbSwitchFiles->text().replace(" files","");
 
-    foreach(QString currentFolder, resources){
+    for(QString currentFolder: resources){
 
-        currentFolder=Util::normalizePath(currentFolder); //normalize path
+        currentFolder=Util::FileSystem::normalizePath(currentFolder); //normalize path
 
         //Get actual number rows
@@ -89,5 +89,5 @@
 
         //Add to table and list to
-        QTableWidgetItem *newFolder = new QTableWidgetItem(Util::cutName(currentFolder));
+        QTableWidgetItem *newFolder = new QTableWidgetItem(Util::FileSystem::cutName(currentFolder));
         QTableWidgetItem *newType = new QTableWidgetItem(type);
         QTableWidgetItem *newFullPath = new QTableWidgetItem(currentFolder);
@@ -139,11 +139,11 @@
 void PackagePage4::addTableContents(DropTableWidget *myTable){
     if(ui->pbSwitchFiles->text()==".oni files"){
-        addResourcesPackage(myTable,Util::multipleDirDialog("Choose folders with .oni files..."));
+        addResourcesPackage(myTable,Util::Dialogs::multipleDirSelection("Choose folders with .oni files..."));
     }
     else if(ui->pbSwitchFiles->text()==".bsl files"){
-        addResourcesPackage(myTable,Util::multipleDirDialog("Choose folders with .bsl files..."));
+        addResourcesPackage(myTable,Util::Dialogs::multipleDirSelection("Choose folders with .bsl files..."));
     }
     else{
-        addResourcesPackage(myTable,Util::multipleDirDialog("Choose folders with .oni-patch files..."));
+        addResourcesPackage(myTable,Util::Dialogs::multipleDirSelection("Choose folders with .oni-patch files..."));
     }
 }
@@ -153,9 +153,9 @@
 
     if(size==0){
-        Util::showPopUp("Select a row first.");
+        Util::Dialogs::showInfo("Select a row first.");
         return;
     }
 
-    if(Util::showQuestionPopUp(this,"Are you sure you want to delete the selected rows?")){
+    if(Util::Dialogs::showQuestion(this,"Are you sure you want to delete the selected rows?")){
         for(int i=0; i<size; i++){
             myTable->removeRow(myTable->selectionModel()->selectedRows().at(size-i-1).row());
@@ -166,5 +166,5 @@
 bool PackagePage4::validatePage(){
     if(ui->twCommon->rowCount()==0 && ui->twWindows->rowCount()==0 && ui->twMac->rowCount()==0){
-        Util::showErrorPopUp("You need to add some folders with resources first!");
+        Util::Dialogs::showError("You need to add some folders with resources first!");
         return false;
     }
Index: /s10k/Vago/packageWizard/packagewizard.cpp
===================================================================
--- /s10k/Vago/packageWizard/packagewizard.cpp	(revision 1092)
+++ /s10k/Vago/packageWizard/packagewizard.cpp	(revision 1093)
@@ -1,6 +1,6 @@
 #include "packagewizard.h"
 
-PackageWizard::PackageWizard(const QString &appDir, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger)
-    :AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, false)
+PackageWizard::PackageWizard(const QString &appDir, QString workspaceWizardLocation, QSettings *vagoSettings)
+    :AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, false)
 {
     this->packagesLocation=this->workspaceWizardLocation+"/Packages";
@@ -8,5 +8,5 @@
 
 void PackageWizard::exec(){
-    PackagePage2 *page2 = new PackagePage2(this->myLogger);
+    PackagePage2 *page2 = new PackagePage2();
     PackagePage3 *page3 = new PackagePage3();
     PackagePage4 *page4 = new PackagePage4();
@@ -58,5 +58,5 @@
     this->vagoSettings->setValue("PackageCreator/CreateZip",createZip);
 
-    const QString packageName=packageNumber+Util::fullTrim(modName);
+    const QString packageName=packageNumber+Util::String::fullTrim(modName);
 
     // Start package creation...
@@ -88,5 +88,5 @@
 
     if (!modInfo.open(QIODevice::WriteOnly | QIODevice::Text)){ //open to write
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "Couldn't create Mod_Info.cfg file when creating AE Package.");
+        UtilVago::showAndLogErrorPopUp("Couldn't create Mod_Info.cfg file when creating AE Package.");
         return;
     }
@@ -124,5 +124,5 @@
     if(createZip){
         if(!JlCompress::compressDir(this->packagesLocation+"/"+packageName+".zip", modDir)){
-            UtilVago::showAndLogErrorPopUp(this->myLogger, "An error occurred while zipping the package.");
+            UtilVago::showAndLogErrorPopUp("An error occurred while zipping the package.");
         }
     }
@@ -162,7 +162,7 @@
         }
         QDir().mkpath(path); //create path if doesn't exist
-        if(!Util::copyDir(sourceFolder,path,false)){//copy contents (creates dest destination automatically if not exists yet)
+        if(!Util::FileSystem::copyDir(sourceFolder,path,false)){//copy contents (creates dest destination automatically if not exists yet)
 
-         UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "An error occurred while copying the folder/files to the package folder: \n"
+         UtilVago::showAndLogErrorPopUpLogButton("An error occurred while copying the folder/files to the package folder: \n"
                                                         "Copying from "+sourceFolder+"\n to "+path);
         }
Index: /s10k/Vago/packageWizard/packagewizard.h
===================================================================
--- /s10k/Vago/packageWizard/packagewizard.h	(revision 1092)
+++ /s10k/Vago/packageWizard/packagewizard.h	(revision 1093)
@@ -20,5 +20,5 @@
     void beforeClose(QDialog::DialogCode resultStatus);
 protected:
-    PackageWizard(const QString &appDir, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger);
+    PackageWizard(const QString &appDir, QString workspaceWizardLocation, QSettings *vagoSettings);
     void exec();
 };
Index: /s10k/Vago/preferences.cpp
===================================================================
--- /s10k/Vago/preferences.cpp	(revision 1092)
+++ /s10k/Vago/preferences.cpp	(revision 1093)
@@ -38,25 +38,25 @@
 void Preferences::accept (){
     QStringList options;
-    QRect screenRes = Util::getScreenResolution();
+    QRect screenRes = Util::System::getScreenResolution();
 
     options << ui->leAEfolder->text() << ui->leWorkspace->text() << ui->leWidth->text() << ui->leHeight->text();
 
-    if(Util::checkEmptySpaces(options)){
-        Util::showErrorPopUp("Setting not saved! There are empty settings.");
+    if(Util::Validation::checkEmptySpaces(options)){
+        Util::Dialogs::showError("Setting not saved! There are empty settings.");
         return;
     }
 
-    if(Util::checkIfIntegers(QStringList() << ui->leWidth->text() << ui->leHeight->text() )){
-        Util::showErrorPopUp("Setting not saved! Width and Height must be numbers.");
+    if(Util::Validation::checkIfIntegers(QStringList() << ui->leWidth->text() << ui->leHeight->text() )){
+        Util::Dialogs::showError("Setting not saved! Width and Height must be numbers.");
         return;
     }
 
     if(ui->leWidth->text().toInt() > screenRes.width() || ui->leHeight->text().toInt() > screenRes.height()){
-        Util::showErrorPopUp("Setting not saved! Width or Height specified are greater than actual screen resolution.");
+        Util::Dialogs::showError("Setting not saved! Width or Height specified are greater than actual screen resolution.");
         return;
     }
 
     if(ui->leWidth->text().toInt() <= 0  || ui->leHeight->text().toInt() <= 0 ){
-        Util::showErrorPopUp("Settings not saved! Width and Height must be greater than 0.");
+        Util::Dialogs::showError("Settings not saved! Width and Height must be greater than 0.");
         return;
     }
@@ -74,5 +74,5 @@
 #endif
 
-    Util::showPopUp("You need to restart the application to all changes take effect.");
+    Util::Dialogs::showInfo("You need to restart the application to all changes take effect.");
 
     QDialog::accept();
@@ -82,5 +82,5 @@
 {
     QString newDir=QFileDialog::getExistingDirectory(this,"Choose workspace folder...");
-    newDir=Util::normalizePath(newDir);
+    newDir=Util::FileSystem::normalizePath(newDir);
 
     if(!newDir.isEmpty()){
@@ -92,5 +92,5 @@
 {
     QString newDir=QFileDialog::getExistingDirectory(this,"Choose AE folder...");
-    newDir=Util::normalizePath(newDir);
+    newDir=Util::FileSystem::normalizePath(newDir);
 
     if(!newDir.isEmpty()){
Index: /s10k/Vago/readme.txt
===================================================================
--- /s10k/Vago/readme.txt	(revision 1092)
+++ /s10k/Vago/readme.txt	(revision 1093)
@@ -1,5 +1,5 @@
 Readme.txt
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Vago GUI v1.3
+Vago GUI v1.4
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -37,4 +37,19 @@
 ----------------------------------
 Change Log:
+----------------------------------
+1.4, 30-12-2017
+- Fixed crash when abort window was confirmed after the conversion has finished
+- Replaced our custom log class by the plog library
+- Fixed paragraphs not being created in "Window messages wizard"
+- Added extensions validations to the conversions
+- Add "Standing Pose" to ONCC extraction (-noanim)
+- Fixed some inconsistencies of disabled options, now if a option changes states to invalid 
+(can't be used with current conversion), it is simply disabled and not used, but will remain 
+with the state unchanged (e.g. the checkbox may remain checked)
+- Fixed bug in Textures tab, options didn't get disabled once enabled (when TGA -> TXMP)
+- Added internal upgrade vago projects feature (so the vago projects can be updated over time depending on each 
+Vago version changes)
+- Some code refactoring to make the code more modular and easier to build (now uses s10k's "shared" libraries for 
+qtcreator projects)
 ----------------------------------
 1.3, 09-12-2016
Index: /s10k/Vago/soundWizard/soundpage2.cpp
===================================================================
--- /s10k/Vago/soundWizard/soundpage2.cpp	(revision 1092)
+++ /s10k/Vago/soundWizard/soundpage2.cpp	(revision 1093)
@@ -55,9 +55,9 @@
 
     if(size==0){
-        Util::showPopUp("Select a row first.");
+        Util::Dialogs::showInfo("Select a row first.");
         return;
     }
 
-    if(Util::showQuestionPopUp(this,"Are you sure you want to delete the selected rows?")){
+    if(Util::Dialogs::showQuestion(this,"Are you sure you want to delete the selected rows?")){
         for(int i=0; i<size; i++){
             ui->twSoundFiles->removeRow(ui->twSoundFiles->selectionModel()->selectedRows().at(size-i-1).row());
@@ -71,12 +71,12 @@
 
     //Pre-processing (check if received only folders)
-    foreach(QString myFile, resources){
+    for(const QString &myFile : resources){
         QString currFileExt="."+QFileInfo(myFile).completeSuffix();
         if(QDir(myFile).exists()){
-            Util::showErrorPopUp("Only files are allowed for this operation.");
+            Util::Dialogs::showError("Only files are allowed for this operation.");
             return;
         }
 
-        foreach(QString vext, this->allowedFiles){
+        for(QString vext : this->allowedFiles){
             vext.remove("*");
             if(currFileExt.endsWith(vext)){
@@ -87,5 +87,5 @@
 
         if(!fileExtValid){
-            Util::showErrorPopUp("Files must be in the follow formats:\n" +
+            Util::Dialogs::showError("Files must be in the follow formats:\n" +
                                  this->allowedFiles.join(" "));
             return;
@@ -93,5 +93,5 @@
     }
 
-    foreach(QString currentFile, resources){
+    for(const QString &currentFile : resources){
 
         //Get actual number rows
@@ -103,5 +103,5 @@
         //Add to table and list to
         QTableWidgetItem *newName = new QTableWidgetItem(QFileInfo(currentFile).baseName());
-        QTableWidgetItem *newFileLocation = new QTableWidgetItem(Util::normalizePath(currentFile));
+        QTableWidgetItem *newFileLocation = new QTableWidgetItem(Util::FileSystem::normalizePath(currentFile));
 
         myTable->setItem(twSize,0,newName);
@@ -125,5 +125,5 @@
 
     if(ui->twSoundFiles->rowCount()==0){
-        Util::showErrorPopUp("You need to add some sound files first!");
+        Util::Dialogs::showError("You need to add some sound files first!");
         return false;
     }
@@ -133,11 +133,11 @@
     }
 
-    if(ui->rbOther->isChecked() && Util::checkEmptySpaces(QStringList() << ui->leOtherLocation->text())){
-        Util::showErrorPopUp("Please input a directory to output the files.");
+    if(ui->rbOther->isChecked() && Util::Validation::checkEmptySpaces(QStringList() << ui->leOtherLocation->text())){
+        Util::Dialogs::showError("Please input a directory to output the files.");
         return false;
     }
 
     if(ui->rbOther->isChecked() && !QDir(ui->leOtherLocation->text()).exists()){
-        Util::showErrorPopUp("Invalid directory specified in other location. Please fix it.");
+        Util::Dialogs::showError("Invalid directory specified in other location. Please fix it.");
         return false;
     }
Index: /s10k/Vago/soundWizard/soundpage3.cpp
===================================================================
--- /s10k/Vago/soundWizard/soundpage3.cpp	(revision 1092)
+++ /s10k/Vago/soundWizard/soundpage3.cpp	(revision 1093)
@@ -34,11 +34,11 @@
                        << ui->leTreshold->text();
 
-    if(Util::checkEmptySpaces(leContents)){
-        Util::showErrorPopUp("Please fill all fields first!");
+    if(Util::Validation::checkEmptySpaces(leContents)){
+        Util::Dialogs::showError("Please fill all fields first!");
         return false;
     }
 
-    if(Util::checkIfDoubles(leContents)){
-        Util::showErrorPopUp("All fields must contains numbers!");
+    if(Util::Validation::checkIfDoubles(leContents)){
+        Util::Dialogs::showError("All fields must contains numbers!");
         return false;
     }
Index: /s10k/Vago/soundWizard/soundpage4.cpp
===================================================================
--- /s10k/Vago/soundWizard/soundpage4.cpp	(revision 1092)
+++ /s10k/Vago/soundWizard/soundpage4.cpp	(revision 1093)
@@ -30,11 +30,11 @@
                << ui->leWeight->text();
 
-    if(Util::checkEmptySpaces(leContents)){
-        Util::showErrorPopUp("Please fill all fields first!");
+    if(Util::Validation::checkEmptySpaces(leContents)){
+        Util::Dialogs::showError("Please fill all fields first!");
         return false;
     }
 
-    if(Util::checkIfDoubles(leContents)){
-        Util::showErrorPopUp("All fields must contains numbers!");
+    if(Util::Validation::checkIfDoubles(leContents)){
+        Util::Dialogs::showError("All fields must contains numbers!");
         return false;
     }
Index: /s10k/Vago/soundWizard/soundpage5.cpp
===================================================================
--- /s10k/Vago/soundWizard/soundpage5.cpp	(revision 1092)
+++ /s10k/Vago/soundWizard/soundpage5.cpp	(revision 1093)
@@ -29,11 +29,11 @@
                   ui->leImpactVelocity->text() << ui->leMinOcclusion->text();
 
-    if(Util::checkEmptySpaces(leContents)){
-        Util::showErrorPopUp("Please fill all fields first!");
+    if(Util::Validation::checkEmptySpaces(leContents)){
+        Util::Dialogs::showError("Please fill all fields first!");
         return false;
     }
 
-    if(Util::checkIfDoubles(leContents)){
-        Util::showErrorPopUp("All fields must contains numbers!");
+    if(Util::Validation::checkIfDoubles(leContents)){
+        Util::Dialogs::showError("All fields must contains numbers!");
         return false;
     }
Index: /s10k/Vago/soundWizard/soundpagefinal.cpp
===================================================================
--- /s10k/Vago/soundWizard/soundpagefinal.cpp	(revision 1092)
+++ /s10k/Vago/soundWizard/soundpagefinal.cpp	(revision 1093)
@@ -2,5 +2,5 @@
 #include "ui_soundpagefinal.h"
 
-SoundPageFinal::SoundPageFinal(QString AppDir, QString soundsLocation, DropTableWidget *page2Table, Logger *myLogger, QHash<QString, QString> *commandMap, QWidget *parent) :
+SoundPageFinal::SoundPageFinal(QString AppDir, QString soundsLocation, DropTableWidget *page2Table, QHash<QString, QString> *commandMap, QWidget *parent) :
     QWizardPage(parent),
     ui(new Ui::soundpagefinal)
@@ -9,11 +9,10 @@
     this->soundsLocation=soundsLocation;
     this->page2Table=page2Table;
-    this->myLogger=myLogger;
     this->commandMap=commandMap;
 
     this->xmlCommands = new QStringList();
     this->oniSplitCommands = new QStringList();
-    this->myXmlProcessor = new XmlProcessor(AppDir, this->myLogger,this->xmlCommands);
-    this->myConverter = new Converter(AppDir, this->myLogger,this->oniSplitCommands);
+    this->myXmlProcessor = new XmlProcessor(AppDir, this->xmlCommands);
+    this->myConverter = new Converter(AppDir,this->oniSplitCommands);
 
     ui->lbComplete->setText("<html>The wizard is now complete. The sounds have been converted. "
@@ -126,21 +125,21 @@
     }
 
-    sphereRadious=Util::normalizeDecimalSeparator(field("leSphereRadious").toString());
-    minElapsedTime=Util::normalizeDecimalSeparator(field("leMinElapsedTime").toString());
-    maxElapsedTime=Util::normalizeDecimalSeparator(field("leMaxElapsedTime").toString());
-    minVolumeDistance=Util::normalizeDecimalSeparator(field("leMinVolumeDistance").toString());
-    maxVolumeDistance=Util::normalizeDecimalSeparator(field("leMaxVolumeDistance").toString());
-    minOcclusion=Util::normalizeDecimalSeparator(field("leMinOcclusion").toString());
-    treshold=Util::normalizeDecimalSeparator(field("leTreshold").toString());
+    sphereRadious=Util::String::normalizeDecimalSeparator(field("leSphereRadious").toString());
+    minElapsedTime=Util::String::normalizeDecimalSeparator(field("leMinElapsedTime").toString());
+    maxElapsedTime=Util::String::normalizeDecimalSeparator(field("leMaxElapsedTime").toString());
+    minVolumeDistance=Util::String::normalizeDecimalSeparator(field("leMinVolumeDistance").toString());
+    maxVolumeDistance=Util::String::normalizeDecimalSeparator(field("leMaxVolumeDistance").toString());
+    minOcclusion=Util::String::normalizeDecimalSeparator(field("leMinOcclusion").toString());
+    treshold=Util::String::normalizeDecimalSeparator(field("leTreshold").toString());
 
     // Get data page 4
 
-    volume=Util::normalizeDecimalSeparator(field("leVolume").toString());
-    minVolume=Util::normalizeDecimalSeparator(field("leMinVolume").toString());
-    maxVolume=Util::normalizeDecimalSeparator(field("leMaxVolume").toString());
-    pitch=Util::normalizeDecimalSeparator(field("lePitch").toString());
-    minPitch=Util::normalizeDecimalSeparator(field("leMinPitch").toString());
-    maxPitch=Util::normalizeDecimalSeparator(field("leMaxPitch").toString());
-    weight=Util::normalizeDecimalSeparator(field("leWeight").toString());
+    volume=Util::String::normalizeDecimalSeparator(field("leVolume").toString());
+    minVolume=Util::String::normalizeDecimalSeparator(field("leMinVolume").toString());
+    maxVolume=Util::String::normalizeDecimalSeparator(field("leMaxVolume").toString());
+    pitch=Util::String::normalizeDecimalSeparator(field("lePitch").toString());
+    minPitch=Util::String::normalizeDecimalSeparator(field("leMinPitch").toString());
+    maxPitch=Util::String::normalizeDecimalSeparator(field("leMaxPitch").toString());
+    weight=Util::String::normalizeDecimalSeparator(field("leWeight").toString());
 
     preventRepeat=field("cbPreventRepeat").toBool();
@@ -176,22 +175,22 @@
     }
 
-    minVolumeDistanceImp=Util::normalizeDecimalSeparator(field("leMinVolumeDistanceImp").toString());
-    maxVolumeDistanceImp=Util::normalizeDecimalSeparator(field("leMaxVolumeDistanceImp").toString());
-    minAngleImp=Util::normalizeDecimalSeparator(field("leMinAngleImp").toString());
-    maxAngleImp=Util::normalizeDecimalSeparator(field("leMaxAngleImp").toString());
-    minAttenuationImp=Util::normalizeDecimalSeparator(field("leMinAttenuationImp").toString());
-    impactVelocityImp=Util::normalizeDecimalSeparator(field("leImpactVelocityImp").toString());
-    minOcclusionImp=Util::normalizeDecimalSeparator(field("leMinOcclusionImp").toString());
+    minVolumeDistanceImp=Util::String::normalizeDecimalSeparator(field("leMinVolumeDistanceImp").toString());
+    maxVolumeDistanceImp=Util::String::normalizeDecimalSeparator(field("leMaxVolumeDistanceImp").toString());
+    minAngleImp=Util::String::normalizeDecimalSeparator(field("leMinAngleImp").toString());
+    maxAngleImp=Util::String::normalizeDecimalSeparator(field("leMaxAngleImp").toString());
+    minAttenuationImp=Util::String::normalizeDecimalSeparator(field("leMinAttenuationImp").toString());
+    impactVelocityImp=Util::String::normalizeDecimalSeparator(field("leImpactVelocityImp").toString());
+    minOcclusionImp=Util::String::normalizeDecimalSeparator(field("leMinOcclusionImp").toString());
 
     //######################################################### Starting xml processing
 
     // Clean tmp dir
-    if(!Util::rmDir(GlobalVars::VagoTemporaryDir)){        
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't clean vago temp dir for complete sound wizard. Aborting.\n"+GlobalVars::VagoTemporaryDir);
+    if(!Util::FileSystem::rmDir(GlobalVars::VagoTemporaryDir)){
+        UtilVago::showAndLogErrorPopUpLogButton("Couldn't clean vago temp dir for complete sound wizard. Aborting.\n"+GlobalVars::VagoTemporaryDir);
         return;
     }
 
     if(!QDir(QDir::tempPath()).mkpath("VagoTemp")){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't reconstruct vago temp dir for complete sound wizard. Aborting.\n"+GlobalVars::VagoTemporaryDir);
+        UtilVago::showAndLogErrorPopUpLogButton("Couldn't reconstruct vago temp dir for complete sound wizard. Aborting.\n"+GlobalVars::VagoTemporaryDir);
     }
 
@@ -205,32 +204,32 @@
 
     (*this->xmlCommands)
-     << "--replace-all-values -e Priority -n "+Util::insertQuotes(priority)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e Flags -n "+(flags.join(" ").isEmpty() ? Util::insertQuotes("") : Util::insertQuotes(flags.join(" ")))+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e SphereRadius -n "+Util::insertQuotes(sphereRadious)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e Treshold -n "+Util::insertQuotes(treshold)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e MinOcclusion -n "+Util::insertQuotes(minOcclusion)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name ElapsedTime -e  Max -n "+Util::insertQuotes(maxElapsedTime)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name ElapsedTime -e  Min -n "+Util::insertQuotes(minElapsedTime)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Distance -e  Max -n "+Util::insertQuotes(maxVolumeDistance)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Distance -e  Min -n "+Util::insertQuotes(minVolumeDistance)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name SoundGroup -e  Volume -n "+Util::insertQuotes(volume)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name SoundGroup -e  Pitch -n "+Util::insertQuotes(pitch)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name SoundGroup -e  NumberOfChannels -n "+Util::insertQuotes(numberChannels)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Volume -e  Min -n "+Util::insertQuotes(minVolume)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Volume -e  Max -n "+Util::insertQuotes(maxVolume)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Pitch -e  Min -n "+Util::insertQuotes(minPitch)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Pitch -e  Max -n "+Util::insertQuotes(maxPitch)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e  Weight -n "+Util::insertQuotes(weight)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e  Priority -n "+Util::insertQuotes(priorityImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Distance -e  Min -n "+Util::insertQuotes(minVolumeDistanceImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Distance -e  Max -n "+Util::insertQuotes(maxVolumeDistanceImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Angle -e  Min -n "+Util::insertQuotes(minAngleImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values --parent-element-name Angle -e  Max -n "+Util::insertQuotes(maxAngleImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e  MinAttenuation -n "+Util::insertQuotes(minAttenuationImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e  ImpactVelocity -n "+Util::insertQuotes(impactVelocityImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e  MinOcclusion -n "+Util::insertQuotes(minOcclusionImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose";
+     << "--replace-all-values -e Priority -n "+Util::String::insertQuotes(priority)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e Flags -n "+(flags.join(" ").isEmpty() ? Util::String::insertQuotes("") : Util::String::insertQuotes(flags.join(" ")))+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e SphereRadius -n "+Util::String::insertQuotes(sphereRadious)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e Treshold -n "+Util::String::insertQuotes(treshold)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e MinOcclusion -n "+Util::String::insertQuotes(minOcclusion)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name ElapsedTime -e  Max -n "+Util::String::insertQuotes(maxElapsedTime)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name ElapsedTime -e  Min -n "+Util::String::insertQuotes(minElapsedTime)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Distance -e  Max -n "+Util::String::insertQuotes(maxVolumeDistance)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Distance -e  Min -n "+Util::String::insertQuotes(minVolumeDistance)+" -f "+Util::String::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name SoundGroup -e  Volume -n "+Util::String::insertQuotes(volume)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name SoundGroup -e  Pitch -n "+Util::String::insertQuotes(pitch)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name SoundGroup -e  NumberOfChannels -n "+Util::String::insertQuotes(numberChannels)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Volume -e  Min -n "+Util::String::insertQuotes(minVolume)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Volume -e  Max -n "+Util::String::insertQuotes(maxVolume)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Pitch -e  Min -n "+Util::String::insertQuotes(minPitch)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Pitch -e  Max -n "+Util::String::insertQuotes(maxPitch)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e  Weight -n "+Util::String::insertQuotes(weight)+" -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e  Priority -n "+Util::String::insertQuotes(priorityImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Distance -e  Min -n "+Util::String::insertQuotes(minVolumeDistanceImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Distance -e  Max -n "+Util::String::insertQuotes(maxVolumeDistanceImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Angle -e  Min -n "+Util::String::insertQuotes(minAngleImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values --parent-element-name Angle -e  Max -n "+Util::String::insertQuotes(maxAngleImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e  MinAttenuation -n "+Util::String::insertQuotes(minAttenuationImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e  ImpactVelocity -n "+Util::String::insertQuotes(impactVelocityImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e  MinOcclusion -n "+Util::String::insertQuotes(minOcclusionImp)+" -f "+Util::String::insertQuotes(impFileLocation)+" --no-backups --no-verbose";
 
     if(preventRepeat){
-        (*this->xmlCommands) << "--replace-all-values --parent-element-name SoundGroup -e Flags -n PreventRepeat -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose";
+        (*this->xmlCommands) << "--replace-all-values --parent-element-name SoundGroup -e Flags -n PreventRepeat -f "+Util::String::insertQuotes(grpFileLocation)+" --no-backups --no-verbose";
     }
 
@@ -245,5 +244,5 @@
     for(int i=0; i<this->page2Table->rowCount(); i++){
 
-        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(this->page2Table->item(i,1)->text()); // add location of sound file to convert
+        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::String::insertQuotes(outputFolder)+" "+Util::String::insertQuotes(this->page2Table->item(i,1)->text()); // add location of sound file to convert
 
         currFileName=this->page2Table->item(i,0)->text(); // get current file name
@@ -256,14 +255,14 @@
         QFile::copy(impFileLocation, currImpFileLocation);
 
-        (*this->xmlCommands) << "--replace-all-values -e BaseTrack1 -n "+Util::insertQuotes(currFileName)+" -f "+Util::insertQuotes(currAmbFileLocation)+" --no-backups --no-verbose" // process the xml
-                             << "--replace-all-values -e Sound -n "+Util::insertQuotes(currFileName)+" -f "+Util::insertQuotes(currGrpFileLocation)+" --no-backups --no-verbose"
-                             << "--replace-all-values -e Group -n "+Util::insertQuotes(currFileName)+" -f "+Util::insertQuotes(currImpFileLocation)+" --no-backups --no-verbose";
+        (*this->xmlCommands) << "--replace-all-values -e BaseTrack1 -n "+Util::String::insertQuotes(currFileName)+" -f "+Util::String::insertQuotes(currAmbFileLocation)+" --no-backups --no-verbose" // process the xml
+                             << "--replace-all-values -e Sound -n "+Util::String::insertQuotes(currFileName)+" -f "+Util::String::insertQuotes(currGrpFileLocation)+" --no-backups --no-verbose"
+                             << "--replace-all-values -e Group -n "+Util::String::insertQuotes(currFileName)+" -f "+Util::String::insertQuotes(currImpFileLocation)+" --no-backups --no-verbose";
 
         myXmlProcessor->start();
         myXmlProcessor->wait(); // Wait until all xml is edited
 
-        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(currAmbFileLocation);
-        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(currGrpFileLocation);
-        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(currImpFileLocation);
+        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::String::insertQuotes(outputFolder)+" "+Util::String::insertQuotes(currAmbFileLocation);
+        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::String::insertQuotes(outputFolder)+" "+Util::String::insertQuotes(currGrpFileLocation);
+        (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::String::insertQuotes(outputFolder)+" "+Util::String::insertQuotes(currImpFileLocation);
     }
 
Index: /s10k/Vago/soundWizard/soundpagefinal.h
===================================================================
--- /s10k/Vago/soundWizard/soundpagefinal.h	(revision 1092)
+++ /s10k/Vago/soundWizard/soundpagefinal.h	(revision 1093)
@@ -7,5 +7,4 @@
 #include <droptablewidget.h>
 
-#include "logger.h"
 #include "xmlprocessor.h"
 #include "converter.h"
@@ -20,5 +19,5 @@
     
 public:
-    explicit SoundPageFinal(QString AppDir, QString soundsLocation, DropTableWidget *page2Table, Logger *myLogger, QHash<QString, QString> *commandMap, QWidget *parent = 0);
+    explicit SoundPageFinal(QString AppDir, QString soundsLocation, DropTableWidget *page2Table, QHash<QString, QString> *commandMap, QWidget *parent = 0);
     ~SoundPageFinal();
     
@@ -27,5 +26,4 @@
     Ui::soundpagefinal *ui;
     DropTableWidget *page2Table;
-    Logger *myLogger;
     XmlProcessor *myXmlProcessor;
     Converter *myConverter;
Index: /s10k/Vago/soundWizard/soundwizard.cpp
===================================================================
--- /s10k/Vago/soundWizard/soundwizard.cpp	(revision 1092)
+++ /s10k/Vago/soundWizard/soundwizard.cpp	(revision 1093)
@@ -1,6 +1,6 @@
 #include "soundwizard.h"
 
-SoundWizard::SoundWizard(QString appDir, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, QHash<QString, QString> *commandMap)
-    :AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, true)
+SoundWizard::SoundWizard(QString appDir, QString workspaceWizardLocation, QSettings *vagoSettings, QHash<QString, QString> *commandMap)
+    :AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, true)
 {
     this->appDir=appDir;
@@ -14,5 +14,5 @@
     SoundPage4 *page4 = new SoundPage4();
     SoundPage5 *page5 = new SoundPage5();
-    SoundPageFinal *pageFinal = new SoundPageFinal(this->appDir, this->soundsLocation,page2->soundTable,this->myLogger, this->commandMap);
+    SoundPageFinal *pageFinal = new SoundPageFinal(this->appDir, this->soundsLocation,page2->soundTable, this->commandMap);
 
     this->myWizard.addPage
Index: /s10k/Vago/soundWizard/soundwizard.h
===================================================================
--- /s10k/Vago/soundWizard/soundwizard.h	(revision 1092)
+++ /s10k/Vago/soundWizard/soundwizard.h	(revision 1093)
@@ -14,5 +14,4 @@
 #include "util.h"
 #include "abstractwizard.h"
-#include "logger.h"
 #include "soundpage2.h"
 #include "soundpage3.h"
@@ -24,5 +23,5 @@
 {
 protected:
-    SoundWizard(QString appLocation, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, QHash<QString, QString> *commandMap);
+    SoundWizard(QString appLocation, QString workspaceWizardLocation, QSettings *vagoSettings, QHash<QString, QString> *commandMap);
     void exec();
     QHash<QString, QString> *commandMap;
Index: 0k/Vago/util.cpp
===================================================================
--- /s10k/Vago/util.cpp	(revision 1092)
+++ 	(revision )
@@ -1,250 +1,0 @@
-#include "util.h"
-
-namespace Util{
-
-QString normalizePath(QString path){
-    return path.replace("\\","/");
-}
-
-QString cutName(QString path){
-    return path.remove(0,path.lastIndexOf('/')).remove('"');
-}
-
-QString cutNameWithoutBackSlash(QString path){
-    return cutName(path).remove('/');
-}
-
-QString insertQuotes(const QString &currString){
-    return "\""+currString+"\"";
-}
-
-QString normalizeAndQuote(QString path){
-    return insertQuotes(normalizePath(path));
-}
-
-void showPopUp(const QString &message){
-    QMessageBox msgBox;
-    msgBox.setIcon(QMessageBox::Information);
-    msgBox.setText(message);
-    msgBox.exec();
-}
-
-void showRichPopUp(const QString &message){
-    QMessageBox msgBox;
-    msgBox.setTextFormat(Qt::RichText);
-    msgBox.setIcon(QMessageBox::Information);
-    msgBox.setText(message);
-    msgBox.exec();
-}
-
-void showWarningPopUp(const QString &message){
-    QMessageBox msgBox;
-    msgBox.setIcon(QMessageBox::Warning);
-    msgBox.setText(message);
-    msgBox.exec();
-}
-
-void showErrorPopUp(const QString &message){
-    QMessageBox msgBox;
-    msgBox.setIcon(QMessageBox::Critical);
-    msgBox.setText(message);
-    msgBox.exec();
-}
-
-void showRichErrorPopUp(const QString &message){
-    QMessageBox msgBox;
-    msgBox.setIcon(QMessageBox::Critical);
-    msgBox.setText(message);
-    msgBox.exec();
-}
-
-bool showQuestionPopUp(QWidget * parent, QString message, QMessageBox::StandardButton standardButton){
-    return QMessageBox::question (parent, "Are you sure?", message, QMessageBox::Yes | QMessageBox::No, standardButton)==QMessageBox::Yes;
-}
-
-QMessageBox::StandardButton showQuestionPopUpWithCancel(QWidget * parent, QString message, QMessageBox::StandardButton standardButton){
-    return QMessageBox::question (parent, "Are you sure?", message, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, standardButton);
-}
-
-QStringList multipleDirDialog(QString title){
-    QFileDialog w;
-
-    w.setFileMode(QFileDialog::DirectoryOnly);
-
-    w.setWindowTitle(title);
-
-    QListView *l = w.findChild<QListView*>("listView");
-
-    if (l) {
-        l->setSelectionMode(QAbstractItemView::MultiSelection);
-    }
-
-    QTreeView *t = w.findChild<QTreeView*>();
-
-    if (t) {
-        t->setSelectionMode(QAbstractItemView::MultiSelection);
-    }
-
-    if(w.exec()){ //if accepted
-        return w.selectedFiles();
-    }
-    return QStringList(); //return empty
-}
-
-bool checkEmptySpaces(QStringList toCheck){
-    foreach (QString current, toCheck){
-        if(current.trimmed().isEmpty()){
-            return true; //There are empty spaces
-        }
-    }
-    return false;
-}
-
-bool checkIfIntegers(QStringList toCheck){
-    foreach (QString current, toCheck){
-        if(!isStringInteger(current)){
-            return true; // Some aren't valid integers
-        }
-    }
-    return false;
-}
-
-bool checkIfDoubles(QStringList toCheck){
-    foreach (QString current, toCheck){
-        if(!isStringDouble(current)){
-            return true; // Some aren't valid doubles
-        }
-    }
-    return false;
-}
-
-bool isStringInteger(QString myString){
-    bool isNumber;
-
-    myString.toInt(&isNumber); //convert to int and see if it succeeds
-
-    return isNumber;
-}
-
-bool isStringDouble(QString myString){
-    bool isDouble;
-
-    myString.toDouble(&isDouble); //convert to double and see if it succeeds
-
-    return isDouble;
-}
-
-// Created from scratch
-bool copyDir(const QString &fromPath, QString toPath, const bool isRecursive){
-    QDir fromDir(fromPath);
-    QDir toDir(toPath);
-
-    if(!toDir.mkdir(fromDir.dirName())){ // create the folder in the destination
-        return false;
-    }
-
-    // Update toPath to include the folder from "fromPath"
-    toPath = toPath + "/" + fromDir.dirName();
-    toDir = QDir(toPath);
-
-    for(const QFileInfo &currFileInfo : fromDir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)){
-
-        if(currFileInfo.isFile()){
-
-            QFile destFile(toPath + "/" + currFileInfo.fileName());
-
-            if(!QFile::copy(currFileInfo.absoluteFilePath(),toPath + "/" + currFileInfo.fileName())){
-                return false;
-            }
-        }
-        else if(isRecursive && currFileInfo.isDir() && currFileInfo.absoluteFilePath() != fromDir.absolutePath()){
-
-            if(!copyDir(currFileInfo.absoluteFilePath(), toPath, isRecursive)){
-                return false;
-            }
-        }
-    }
-
-    return true;
-}
-
-//Copied from here: http://stackoverflow.com/questions/2536524/copy-directory-using-qt (ty roop)
-bool rmDir(const QString &dirPath)
-{
-    QDir dir(dirPath);
-    if (!dir.exists())
-        return true;
-    foreach(const QFileInfo &info, dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) {
-        if (info.isDir()) {
-            if (!rmDir(info.filePath()))
-                return false;
-        } else {
-            if (!dir.remove(info.fileName()))
-                return false;
-        }
-    }
-    QDir parentDir(QFileInfo(dirPath).path());
-    return parentDir.rmdir(QFileInfo(dirPath).fileName());
-}
-
-
-QString fullTrim(QString str) {
-
-    str = str.simplified(); //convert all invisible chars in normal whitespaces
-    str.replace( " ", "" );
-
-    return str;
-}
-
-//Searches for the QString "toSearch" in the "myString" variable backward
-//Returns the index of the first match or -1 if not found
-int indexOfBackward(QString myString, QString toSearch, int from){
-    int myStringSize=myString.size();
-    int toSearchSize=toSearch.size();
-
-    if(from==-1){
-        from=myStringSize;
-    }
-
-    int i=from;
-
-    while(i>=0){
-        for(int j=toSearchSize-1; j>=0; j--){
-            i--;
-            if(myString.at(i)!=toSearch.at(j)){
-                break;
-            }
-            if(j==0){
-                return i;
-            }
-        }
-    }
-
-    return -1;
-}
-
-QStringList substring(QString myString,QString separator, Qt::CaseSensitivity cs){
-    QStringList result = QStringList();
-    int currIdx=0, nextIdx=0;
-
-    while(true){
-        nextIdx=myString.indexOf(separator,currIdx,cs);
-        result << myString.mid(currIdx,nextIdx-currIdx);
-        if(nextIdx==-1) break;
-        currIdx=nextIdx+1;
-    }
-
-    return result;
-}
-
-QString normalizeDecimalSeparator(QString value){
-    return value.replace(',','.');
-}
-
-// From here: http://stackoverflow.com/questions/17893328/qt-getting-the-screen-resolution-without-the-extended-monitor ty Chris
-QRect getScreenResolution(){
-    QDesktopWidget widget;
-    return widget.availableGeometry(widget.primaryScreen()); // or screenGeometry(), depending on your needs
-}
-
-}
Index: 0k/Vago/util.h
===================================================================
--- /s10k/Vago/util.h	(revision 1092)
+++ 	(revision )
@@ -1,60 +1,0 @@
-#ifndef UTIL_H
-#define UTIL_H
-
-#include <QtGlobal> // for debug macros
-#ifdef QT_DEBUG
-    #include <QDebug>
-#endif
-#include <QString>
-#include <QMessageBox>
-#include <QFileDialog>
-#include <QListView>
-#include <QTreeView>
-#include <QDesktopServices>
-#include <QUrl>
-#include <QCoreApplication>
-#include <QDesktopWidget>
-#include <QSettings>
-#include <QXmlStreamReader>
-#include <memory>
-
-/**
-  Utilities functions (global)
-  **/
-namespace Util{
-QString normalizePath(QString path);
-QString cutName(QString path);
-QString cutNameWithoutBackSlash(QString path);
-QString insertQuotes(const QString &currString);
-QString normalizeAndQuote(QString path);
-QString fullTrim(QString str);
-QString normalizeDecimalSeparator(QString value);
-
-inline const char* qStrToCstr(const QString &currentString){
-    return currentString.toUtf8().constData();
-}
-
-inline const char* boolToCstr(bool currentBoolean){
-    return currentBoolean ? "true" : "false";
-}
-
-QStringList multipleDirDialog(QString title);
-QStringList substring(QString myString,QString separator,Qt::CaseSensitivity cs = Qt::CaseSensitive);
-int indexOfBackward(QString myString, QString toSearch, int from = -1);
-bool showQuestionPopUp(QWidget * parent, QString message, QMessageBox::StandardButton standardButton=QMessageBox::NoButton);
-QMessageBox::StandardButton showQuestionPopUpWithCancel(QWidget * parent, QString message, QMessageBox::StandardButton standardButton=QMessageBox::NoButton);
-bool checkEmptySpaces(QStringList toCheck);
-bool checkIfIntegers(QStringList toCheck);
-bool checkIfDoubles(QStringList toCheck);
-bool isStringInteger(QString myString);
-bool isStringDouble(QString myString);
-bool copyDir(const QString &fromPath, QString toPath, const bool isRecursive = false);
-bool rmDir(const QString &dirPath);
-QRect getScreenResolution();
-void showPopUp(const QString &message);
-void showRichPopUp(const QString &message);
-void showWarningPopUp(const QString &message);
-void showErrorPopUp(const QString &message);
-void showRichErrorPopUp(const QString &message);
-}
-#endif // UTIL_H
Index: /s10k/Vago/utilvago.cpp
===================================================================
--- /s10k/Vago/utilvago.cpp	(revision 1092)
+++ /s10k/Vago/utilvago.cpp	(revision 1093)
@@ -7,6 +7,6 @@
 }
 
-void showAndLogWarningPopUp(Logger *logger, const QString &message){
-    logger->writeString(message);
+void showAndLogWarningPopUp(const QString &message){
+    LOG_WARNING << message;
 
     QMessageBox msgBox;
@@ -30,7 +30,7 @@
 
 //Same of above but also writtes directly to the log file the error
-void showAndLogWarningPopUpLogButton(Logger *logger, const QString &message){
+void showAndLogWarningPopUpLogButton(const QString &message){
 
-    logger->writeString(message);
+    LOG_WARNING << message;
 
     QMessageBox msgBox;
@@ -45,7 +45,7 @@
 }
 
-void showAndLogErrorPopUp(Logger *logger, const QString &message){
+void showAndLogErrorPopUp(const QString &message){
 
-    logger->writeString(message);
+    LOG_ERROR << message;
 
     QMessageBox msgBox;
@@ -69,7 +69,7 @@
 
 //Same of above but also writtes directly to the log file the error
-void showAndLogErrorPopUpLogButton(Logger *logger, const QString &message){
+void showAndLogErrorPopUpLogButton(const QString &message){
 
-    logger->writeString(message);
+    LOG_ERROR << message;
 
     QMessageBox msgBox;
@@ -118,12 +118,12 @@
 
 #ifdef Q_OS_MAC
-    return getMonoExecutablePath() + " " + Util::insertQuotes(getOniSplitExecutableAbsolutePath());
+    return getMonoExecutablePath() + " " + Util::String::insertQuotes(getOniSplitExecutableAbsolutePath());
 #else
-    return Util::insertQuotes(getOniSplitExecutableAbsolutePath());
+    return Util::String::insertQuotes(getOniSplitExecutableAbsolutePath());
 #endif
 }
 
 QString getXmlToolsExecutable(){
-    return Util::insertQuotes(getXmlToolsExecutableAbsolutePath());
+    return Util::String::insertQuotes(getXmlToolsExecutableAbsolutePath());
 }
 
@@ -144,3 +144,7 @@
 #endif
 
+QString getDateTimeFormatForFilename(const QDateTime &currentDateTime){
+    return currentDateTime.toString("yyyy-MM-dd_hh-mm-ss");
 }
+
+}
Index: /s10k/Vago/utilvago.h
===================================================================
--- /s10k/Vago/utilvago.h	(revision 1092)
+++ /s10k/Vago/utilvago.h	(revision 1093)
@@ -2,11 +2,15 @@
 #define UTILVAGO_H
 
-#include "util.h"
-#include "logger.h"
+#include <util.h>
+#include <cpp17optional/optional.hpp>
+#include <plog/Log.h>
+#include <plog/Converters/NativeEOLConverter.h>
+
+#include <QDateTime>
 
 namespace GlobalVars{
 
-const QString AppVersion="1.3";
-const QString LastCompatibleVersion = "1.0";
+const QString AppVersion="1.4";
+const QString LastCompatibleVersion = "1.4";
 const QString ToolsFolder = "tools";
 const QString OniSplitString="OniSplit.exe";
@@ -46,10 +50,10 @@
 namespace UtilVago{
 void openLogFile();
-void showAndLogWarningPopUp(Logger *logger, const QString &message);
+void showAndLogWarningPopUp(const QString &message);
 void showWarningPopUpLogButton(const QString &message);
-void showAndLogWarningPopUpLogButton(Logger *logger, const QString &message);
-void showAndLogErrorPopUp(Logger *logger, const QString &message);
+void showAndLogWarningPopUpLogButton(const QString &message);
+void showAndLogErrorPopUp(const QString &message);
 void showErrorPopUpLogButton(const QString &message);
-void showAndLogErrorPopUpLogButton(Logger *logger, const QString &message);
+void showAndLogErrorPopUpLogButton(const QString &message);
 QString getOSIndependentAppPath();
 QString getAppPath();
@@ -61,4 +65,5 @@
 QString getMonoExecutablePath();
 #endif
+QString getDateTimeFormatForFilename(const QDateTime &currentDateTime);
 }
 
Index: /s10k/Vago/windowMessagesWizard/wmfinalpage.cpp
===================================================================
--- /s10k/Vago/windowMessagesWizard/wmfinalpage.cpp	(revision 1092)
+++ /s10k/Vago/windowMessagesWizard/wmfinalpage.cpp	(revision 1093)
@@ -2,13 +2,12 @@
 #include "ui_wmfinalpage.h"
 
-WmFinalPage::WmFinalPage(QString AppDir, QString wmLocation, Logger *myLogger, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent) :
+WmFinalPage::WmFinalPage(QString AppDir, QString wmLocation, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent) :
     QWizardPage(parent), ui(new Ui::wmfinalpage), pages(pages)
 {
     ui->setupUi(this);
     this->wmLocation=wmLocation;
-    this->myLogger=myLogger;
 
     this->oniSplitCommands = new QStringList();
-    this->myConverter = new Converter(AppDir, this->myLogger,this->oniSplitCommands);
+    this->myConverter = new Converter(AppDir, this->oniSplitCommands);
 
     ui->lbComplete->setText("<html>The wizard is now complete. The window messages have been converted. "
@@ -55,6 +54,6 @@
         typeNode = rootNode.append_child("OPge");
         typeNode.append_attribute("id").set_value(++globalSectionCounter);
-        typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("leLevelId").toString()));
-        typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(QString("#") + QString::number(++globalSectionCounter)));
+        typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("leLevelId").toString()));
+        typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(QString("#") + QString::number(++globalSectionCounter)));
         pugi::xml_node igpaNode = rootNode.append_child("IGPA");
         igpaNode.append_attribute("id").set_value(globalSectionCounter);
@@ -62,5 +61,5 @@
         currentIGPGId = globalSectionCounter;
         for(int i=0; i<this->pages.size(); i++){
-            pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+            pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         }
         break;
@@ -69,9 +68,9 @@
         typeNode = rootNode.append_child("DPge");
         typeNode.append_attribute("id").set_value(++globalSectionCounter);
-        typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("leLevelId").toString()));
-        typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("lePageNumber").toString()));
-        typeNode.append_child("IsLearnedMove").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(QString::number(static_cast<int>(field("cbIsLearnedMove").toBool()))));
-        currentIGPGId = globalSectionCounter;
-        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("leLevelId").toString()));
+        typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("lePageNumber").toString()));
+        typeNode.append_child("IsLearnedMove").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(QString::number(static_cast<int>(field("cbIsLearnedMove").toBool()))));
+        currentIGPGId = globalSectionCounter;
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         break;
     case  WINDOW_TYPE::HELP:
@@ -79,5 +78,5 @@
         typeNode.append_attribute("id").set_value(++globalSectionCounter);
         currentIGPGId = globalSectionCounter;
-        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         break;
     case  WINDOW_TYPE::TEXT_CONSOLE:
@@ -85,5 +84,5 @@
         typeNode = rootNode.append_child("TxtC");
         typeNode.append_attribute("id").set_value(++globalSectionCounter);
-        typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         pugi::xml_node igpaNode = rootNode.append_child("IGPA");
         igpaNode.append_attribute("id").set_value(globalSectionCounter);
@@ -91,5 +90,5 @@
         pugi::xml_node pagesNode = igpaNode.append_child("Pages");
         for(int i=0; i<this->pages.size(); i++){
-            pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+            pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         }
         break;
@@ -98,17 +97,17 @@
         typeNode = rootNode.append_child("WPge");
         typeNode.append_attribute("id").set_value(++globalSectionCounter);
-        typeNode.append_child("WeaponClass").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("leWeaponClassName").toString()));
-        currentIGPGId = globalSectionCounter;
-        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        typeNode.append_child("WeaponClass").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("leWeaponClassName").toString()));
+        currentIGPGId = globalSectionCounter;
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         break;
     case  WINDOW_TYPE::ITEM:
         typeNode = rootNode.append_child("IPge");
         typeNode.append_attribute("id").set_value(++globalSectionCounter);
-        typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("lePageNumber").toString()));
-        currentIGPGId = globalSectionCounter;
-        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("lePageNumber").toString()));
+        currentIGPGId = globalSectionCounter;
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         break;
     case WINDOW_TYPE::ENUM_END:
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "An error ocurred: WmFinalPage::startProcessing invalid WINDOW_TYPE");
+        UtilVago::showAndLogErrorPopUp("An error ocurred: WmFinalPage::startProcessing invalid WINDOW_TYPE");
         break;
     }
@@ -132,5 +131,5 @@
 
             this->oniSplitCommands->clear();
-            this->oniSplitCommands->append("-create:txmp " + Util::insertQuotes(this->wmLocation) + " -format:bgr32 " + Util::insertQuotes(imageLocation));
+            this->oniSplitCommands->append("-create:txmp " + Util::String::insertQuotes(this->wmLocation) + " -format:bgr32 " + Util::String::insertQuotes(imageLocation));
 
             this->myConverter->start(); // finally process the onisplit commands
@@ -152,7 +151,7 @@
         currentIGSAId = globalSectionCounter;
 
-        igpgNode.append_child("Image").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(imageTXMPName));
-        igpgNode.append_child("Text1").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
-        igpgNode.append_child("Text2").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        igpgNode.append_child("Image").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(imageTXMPName));
+        igpgNode.append_child("Text1").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
+        igpgNode.append_child("Text2").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
 
         // IGSA
@@ -166,5 +165,5 @@
 
         for(int i=0; i<mainTextNumberOfRows; i++){
-            igsaMainTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+            igsaMainTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         }
 
@@ -174,5 +173,5 @@
         pugi::xml_node igsaFooterTextStringsNode = igsaFooterTextNode.append_child("Strings");
         for(int i=0; i<footerTextNumberOfRows; i++){
-            igsaFooterTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+            igsaFooterTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
         }
 
@@ -202,11 +201,22 @@
 
                 pugi::xml_node igstMainTextFontNode = igstMainTextNode.append_child("Font");
-                igstMainTextFontNode.append_child("Family").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("TSFF" + format.font().family()));
-                igstMainTextFontNode.append_child("Style").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(style));
-                igstMainTextFontNode.append_child("Color").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(colorRGB));
-                igstMainTextFontNode.append_child("Size").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(QString::number(format.font().pointSize())));
+                igstMainTextFontNode.append_child("Family").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("TSFF" + format.font().family()));
+                igstMainTextFontNode.append_child("Style").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(style));
+                igstMainTextFontNode.append_child("Color").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(colorRGB));
+                igstMainTextFontNode.append_child("Size").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(QString::number(format.font().pointSize())));
                 igstMainTextFontNode.append_child("Flags").append_child(pugi::xml_node_type::node_pcdata).set_value("Family Style Color Size");
 
-                igstMainTextNode.append_child("Text").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(currentCursor.selection().toPlainText()));
+                QString currentRowText = currentCursor.selection().toPlainText();
+
+                pugi::xml_node currentIGStNode = igstMainTextNode.append_child("Text");
+
+                if(!currentRowText.trimmed().isEmpty()){
+                    currentIGStNode.append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(currentRowText));
+                }
+                else{
+                    // Empty paragraph use OniSplit correct representation (<Text xml:space="preserve"> </Text>)
+                    currentIGStNode.append_child(pugi::xml_node_type::node_pcdata).set_value(" ");
+                    currentIGStNode.append_attribute("xml:space").set_value("preserve");
+                }
             }
 
@@ -220,6 +230,6 @@
     }
 
-    if(!doc.save_file(Util::qStrToCstr(filePath))){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't create " + filePath + " file!");
+    if(!doc.save_file(QSTR_TO_CSTR(filePath))){
+        UtilVago::showAndLogErrorPopUpLogButton("Couldn't create " + filePath + " file!");
         return;
     }
@@ -227,5 +237,5 @@
     // Convert XML file to Oni
     this->oniSplitCommands->clear();
-    this->oniSplitCommands->append("-create " + Util::insertQuotes(this->wmLocation) + " " +  Util::insertQuotes(filePath));
+    this->oniSplitCommands->append("-create " + Util::String::insertQuotes(this->wmLocation) + " " +  Util::String::insertQuotes(filePath));
 
     this->myConverter->start(); // finally process the onisplit commands
Index: /s10k/Vago/windowMessagesWizard/wmfinalpage.h
===================================================================
--- /s10k/Vago/windowMessagesWizard/wmfinalpage.h	(revision 1092)
+++ /s10k/Vago/windowMessagesWizard/wmfinalpage.h	(revision 1093)
@@ -6,7 +6,6 @@
 #include <QUrl>
 #include <droptablewidget.h>
-#include <pugixml.hpp>
+#include <pugixml/pugixml.hpp>
 
-#include "logger.h"
 #include "xmlprocessor.h"
 #include "converter.h"
@@ -23,5 +22,5 @@
     
 public:
-    explicit WmFinalPage(QString AppDir, QString wmLocation, Logger *myLogger, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent = 0);
+    explicit WmFinalPage(QString AppDir, QString wmLocation, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent = 0);
     ~WmFinalPage();
     
@@ -29,5 +28,4 @@
     QString wmLocation;
     Ui::wmfinalpage *ui;
-    Logger *myLogger;
     Converter *myConverter;
     QStringList *oniSplitCommands;
Index: /s10k/Vago/windowMessagesWizard/wmformatpage.cpp
===================================================================
--- /s10k/Vago/windowMessagesWizard/wmformatpage.cpp	(revision 1092)
+++ /s10k/Vago/windowMessagesWizard/wmformatpage.cpp	(revision 1093)
@@ -2,11 +2,9 @@
 #include "ui_wmformatpage.h"
 
-WmFormatPage::WmFormatPage(Logger *myLogger, QWidget *parent) :
+WmFormatPage::WmFormatPage(QWidget *parent) :
     QWizardPage(parent),
     ui(new Ui::WmFormatPage)
 {
     ui->setupUi(this);
-
-    this->myLogger = myLogger;
 
     this->setTitle("Pages Formatting");
@@ -51,5 +49,5 @@
         break;
     case WINDOW_TYPE::ENUM_END:
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "An error ocurred: WmFormatPage::initializePage invalid WINDOW_TYPE");
+        UtilVago::showAndLogErrorPopUp("An error ocurred: WmFormatPage::initializePage invalid WINDOW_TYPE");
         break;
     }
@@ -72,5 +70,5 @@
                 )
         {
-            Util::showErrorPopUp("You need to fill at least one text section in all pages!");
+            Util::Dialogs::showError("You need to fill at least one text section in all pages!");
             return false;
         }
@@ -80,5 +78,5 @@
     // If we can add more than one page, ask the user if he already added them all
     if(ui->pbAddPageAfter->isEnabled()){
-        return Util::showQuestionPopUp(this, "Have you added all the window pages?");
+        return Util::Dialogs::showQuestion(this, "Have you added all the window pages?");
     }
 
@@ -126,5 +124,5 @@
         break;
     case WINDOW_TYPE::ENUM_END:
-        UtilVago::showAndLogErrorPopUp(this->myLogger, "An error ocurred: WmFormatPage::addPage invalid WINDOW_TYPE");
+        UtilVago::showAndLogErrorPopUp("An error ocurred: WmFormatPage::addPage invalid WINDOW_TYPE");
         break;
     }
@@ -190,5 +188,5 @@
 
     if(textEdits.size() == 0){
-        Util::showPopUp("Select some text first.");
+        Util::Dialogs::showInfo("Select some text first.");
         return;
     }
@@ -252,5 +250,5 @@
 
                 if(!ok){
-                    Util::showErrorPopUp("The inputted font size is not valid!");
+                    Util::Dialogs::showError("The inputted font size is not valid!");
                     ui->cbTextSize->setCurrentIndex(0); // reset to default number
                     return;
@@ -279,9 +277,9 @@
 {
     if(ui->twPages->count() <= 1){
-        Util::showErrorPopUp("You must have at least one page!");
+        Util::Dialogs::showError("You must have at least one page!");
         return;
     }
 
-    if(Util::showQuestionPopUp(this, "Are you sure do you want to delete the current page?")){
+    if(Util::Dialogs::showQuestion(this, "Are you sure do you want to delete the current page?")){
         int indexToDelete = ui->twPages->currentIndex();
 
Index: /s10k/Vago/windowMessagesWizard/wmformatpage.h
===================================================================
--- /s10k/Vago/windowMessagesWizard/wmformatpage.h	(revision 1092)
+++ /s10k/Vago/windowMessagesWizard/wmformatpage.h	(revision 1093)
@@ -20,5 +20,5 @@
     
 public:
-    explicit WmFormatPage(Logger *myLogger, QWidget *parent = 0);
+    explicit WmFormatPage(QWidget *parent = 0);
     QList<std::shared_ptr<WmPage> >& getCurrentPages();
 
@@ -56,5 +56,4 @@
     QList<std::shared_ptr<WmPage>> currentPages;
     bool windowsIsInitialized = false;
-    Logger *myLogger;
 
 private:
Index: /s10k/Vago/windowMessagesWizard/wmsetuppage.cpp
===================================================================
--- /s10k/Vago/windowMessagesWizard/wmsetuppage.cpp	(revision 1092)
+++ /s10k/Vago/windowMessagesWizard/wmsetuppage.cpp	(revision 1093)
@@ -46,6 +46,6 @@
     }
 
-    if(Util::checkEmptySpaces(stringsToCheck)){
-        Util::showErrorPopUp("You need to fill all fields first!");
+    if(Util::Validation::checkEmptySpaces(stringsToCheck)){
+        Util::Dialogs::showError("You need to fill all fields first!");
         return false;
     }
@@ -62,6 +62,6 @@
     }
 
-    if(!Util::isStringInteger(arg1)){
-        Util::showErrorPopUp("The level id inputted is invalid! It must be a number.");
+    if(!Util::Validation::isStringInteger(arg1)){
+        Util::Dialogs::showError("The level id inputted is invalid! It must be a number.");
         return;
     }
@@ -91,6 +91,6 @@
     }
 
-    if(!Util::isStringInteger(arg1)){
-        Util::showErrorPopUp("The page number inputted is invalid! It must be a number.");
+    if(!Util::Validation::isStringInteger(arg1)){
+        Util::Dialogs::showError("The page number inputted is invalid! It must be a number.");
         return;
     }
Index: /s10k/Vago/windowMessagesWizard/wmwizard.cpp
===================================================================
--- /s10k/Vago/windowMessagesWizard/wmwizard.cpp	(revision 1092)
+++ /s10k/Vago/windowMessagesWizard/wmwizard.cpp	(revision 1093)
@@ -1,6 +1,6 @@
 #include "wmwizard.h"
 
-WmWizard::WmWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger)
-:AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, true)
+WmWizard::WmWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings)
+:AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, true)
 {
     this->bgImagesLocation=this->workspaceWizardLocation+"/WindowMessages";
@@ -10,6 +10,6 @@
 
     WmSetupPage *setupPage = new WmSetupPage();
-    WmFormatPage *formatPage = new WmFormatPage(this->myLogger);
-    WmFinalPage *finalPage = new WmFinalPage(this->appDir, this->bgImagesLocation, this->myLogger, formatPage->getCurrentPages());
+    WmFormatPage *formatPage = new WmFormatPage();
+    WmFinalPage *finalPage = new WmFinalPage(this->appDir, this->bgImagesLocation, formatPage->getCurrentPages());
 
     this->myWizard.addPage
Index: /s10k/Vago/windowMessagesWizard/wmwizard.h
===================================================================
--- /s10k/Vago/windowMessagesWizard/wmwizard.h	(revision 1092)
+++ /s10k/Vago/windowMessagesWizard/wmwizard.h	(revision 1093)
@@ -11,5 +11,5 @@
 {
 protected:
-    WmWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger);
+    WmWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings);
     void exec();
 private:
Index: /s10k/Vago/wizardfactory.h
===================================================================
--- /s10k/Vago/wizardfactory.h	(revision 1092)
+++ /s10k/Vago/wizardfactory.h	(revision 1093)
@@ -9,6 +9,6 @@
 {
 public:
-    static void startInstance(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger){
-        (new WizardFactory<T>(appDir, workspaceWizardLocation, vagoSettings, myLogger))->exec();
+    static void startInstance(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings){
+        (new WizardFactory<T>(appDir, workspaceWizardLocation, vagoSettings))->exec();
     }
 private:
@@ -18,7 +18,6 @@
             const QString &appDir,
             const QString &workspaceWizardLocation,
-            QSettings *vagoSettings,
-            Logger *myLogger
-    ):T(appDir, workspaceWizardLocation, vagoSettings, myLogger){}
+            QSettings *vagoSettings
+    ):T(appDir, workspaceWizardLocation, vagoSettings){}
 };
 
@@ -28,6 +27,6 @@
 {
 public:
-    static void startInstance(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, QHash<QString, QString> *commandMap){
-        (new WizardFactory(appDir, workspaceWizardLocation, vagoSettings, myLogger, commandMap))->exec();
+    static void startInstance(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, QHash<QString, QString> *commandMap){
+        (new WizardFactory(appDir, workspaceWizardLocation, vagoSettings, commandMap))->exec();
     }
 private:
@@ -37,7 +36,6 @@
             const QString &workspaceWizardLocation,
             QSettings *vagoSettings,
-            Logger *myLogger,
             QHash<QString, QString> *commandMap
-    ):SoundWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, commandMap){}
+    ):SoundWizard(appDir, workspaceWizardLocation, vagoSettings, commandMap){}
 };
 
Index: /s10k/Vago/xmlParsers/projectfilevago.cpp
===================================================================
--- /s10k/Vago/xmlParsers/projectfilevago.cpp	(revision 1093)
+++ /s10k/Vago/xmlParsers/projectfilevago.cpp	(revision 1093)
@@ -0,0 +1,318 @@
+/*
+ *
+Copyright (C) 2017  Fábio Bento (random-guy)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+#include "projectfilevago.h"
+
+const QString ProjectFileVago::XMLTableName = "XML";
+const QString ProjectFileVago::TexturesTableName = "Textures";
+const QString ProjectFileVago::CharactersTableName = "Characters";
+const QString ProjectFileVago::ObjectsTableName = "Objects";
+const QString ProjectFileVago::LevelsTableName = "Levels";
+const QString ProjectFileVago::MiscTableName = "Misc";
+
+ProjectFileVago::ProjectData ProjectFileVago::readProjectDataFromFile(const QString &fileFullPath){
+
+    ProjectFileVago::ProjectData currentProjectData;
+
+    upgradeProjectFileIfNecessary(fileFullPath);
+
+    pugi::xml_document doc;
+
+    pugi::xml_parse_result result = doc.load_file(QSTR_TO_CSTR(fileFullPath));
+
+    if(result.status!=pugi::status_ok){
+        throw std::runtime_error(QSTR_TO_CSTR(QString("An error ocurred while loading project file.\n") + result.description()));
+    }
+
+    if(QString(doc.root().first_child().name()) != "VagoProject"){
+        throw std::runtime_error(QSTR_TO_CSTR(QString(doc.root().name()) + "The file opened is not a valid Vago project file. Load aborted."));
+    }
+
+    QString projVagoVersion;
+
+    try{
+        projVagoVersion = QString(doc.select_node("/VagoProject/@vagoVersion").attribute().value());
+    }
+    catch (const pugi::xpath_exception& e)
+    {
+        throw std::runtime_error(QSTR_TO_CSTR(QString("Couldn't find the vagoVersion of the current project. Load aborted.\n") + e.what()));
+    }
+
+    if(!projVagoVersion.startsWith(GlobalVars::LastCompatibleVersion)){
+        throw std::runtime_error("The project that you are trying to load seems it is not compatible with your Vago Version. Please update Vago and try again.");
+    }
+
+    // After the initial validations begin loading the project data
+
+    auto fFetchFromToForTab = [](pugi::xml_document &doc, const QString &tableName, ProjectTable &tableToInjectData) -> void{
+        tableToInjectData.from = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+tableName+"/@from")).attribute().value();
+        tableToInjectData.to = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+tableName+"/@to")).attribute().value();
+    };
+
+    auto fFetchTabTableRows = [](pugi::xml_document &doc, const QString &tableName) -> QVector<ProjectTableRow>{
+
+        QVector<ProjectTableRow> rows;
+
+        for(const pugi::xpath_node &xPathNode : doc.select_nodes(QSTR_TO_CSTR("/VagoProject/"+tableName+"/Row"))){
+
+            ProjectTableRow currentRow;
+
+            pugi::xml_node currNode = xPathNode.node();
+
+            currentRow.fileFolder = currNode.attribute("fileFolder").value();
+            currentRow.fromTo = currNode.attribute("fromTo").value();
+            currentRow.command = currNode.attribute("command").value();
+
+            pugi::xml_attribute disabledAttr = currNode.attribute("disabled");
+            currentRow.isDisabled = disabledAttr.empty() ? false : disabledAttr.as_bool();
+
+            rows.append(currentRow);
+        }
+
+        return rows;
+    };
+
+    QString currentTableName = XMLTableName;
+
+    // XML tab
+
+    fFetchFromToForTab(doc, currentTableName, currentProjectData.xmlTable);
+    currentProjectData.xmlTable.rows = fFetchTabTableRows(doc, currentTableName);
+
+    // Textures tab
+
+    currentTableName = TexturesTableName;
+
+    fFetchFromToForTab(doc, currentTableName, currentProjectData.texturesTable);
+
+    currentProjectData.texturesTable.rbTexturesType = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@type")).attribute().value();
+    currentProjectData.texturesTable.cbGenMipMaps = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@genMipMaps")).attribute().as_bool();
+    currentProjectData.texturesTable.cbNoUwrap = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@noUwrap")).attribute().as_bool();
+    currentProjectData.texturesTable.cbNoUwrap = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@noVwrap")).attribute().as_bool();
+    currentProjectData.texturesTable.cbLarge = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@large")).attribute().as_bool();
+    currentProjectData.texturesTable.cbEnvMap = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@envMap")).attribute().as_bool();
+    currentProjectData.texturesTable.leEnvMapTexture = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@envMapValue")).attribute().value();
+
+    currentProjectData.texturesTable.rows = fFetchTabTableRows(doc, currentTableName);
+
+    // Characters tab
+
+    currentTableName = CharactersTableName;
+
+    fFetchFromToForTab(doc, currentTableName, currentProjectData.charactersTable);
+
+    currentProjectData.charactersTable.cbCellShading = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@cellShading")).attribute().as_bool();
+    currentProjectData.charactersTable.cbNormals = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@normals")).attribute().as_bool();
+    currentProjectData.charactersTable.cbStandingPose = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@standingPose")).attribute().as_bool();
+    currentProjectData.charactersTable.cbWithTRBS_ONCC = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@extractTRBSONCC")).attribute().as_bool();
+    currentProjectData.charactersTable.leTRBS_ONCC = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@extractTRBSONCCValue")).attribute().value();
+
+    currentProjectData.charactersTable.rows = fFetchTabTableRows(doc, currentTableName);
+
+    // Objects tab
+
+    currentTableName = ObjectsTableName;
+
+    fFetchFromToForTab(doc, currentTableName, currentProjectData.objectsTable);
+
+    currentProjectData.objectsTable.cbTexture = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@texture")).attribute().as_bool();
+    currentProjectData.objectsTable.leTextureName = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@textureValue")).attribute().value();
+    currentProjectData.objectsTable.cbWithAnimation = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@withAnimation")).attribute().as_bool();
+    currentProjectData.objectsTable.leAnimationName = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@withAnimationValue")).attribute().value();
+
+    currentProjectData.objectsTable.rows = fFetchTabTableRows(doc, currentTableName);
+
+    // Levels tab
+
+    currentTableName = LevelsTableName;
+
+    fFetchFromToForTab(doc, currentTableName, currentProjectData.levelsTable);
+
+    currentProjectData.levelsTable.cbSpecificFilesLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@extractWithFiles")).attribute().as_bool();
+    currentProjectData.levelsTable.leSpecificFilesLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@extractWithFilesValue")).attribute().value();
+    currentProjectData.levelsTable.cbDatLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@datFilename")).attribute().as_bool();
+    currentProjectData.levelsTable.leTargetDatLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@datFilenameValue")).attribute().value();
+    currentProjectData.levelsTable.cbBnvLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@bnvSource")).attribute().as_bool();
+    currentProjectData.levelsTable.leBnvLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@bnvSourceValue")).attribute().value();
+    currentProjectData.levelsTable.cbGridsLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@generateGrids")).attribute().as_bool();
+    currentProjectData.levelsTable.cbAdditionalSourcesLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@additionalSources")).attribute().as_bool();
+    currentProjectData.levelsTable.leAdditSourcesLevels = doc.select_node(QSTR_TO_CSTR("/VagoProject/"+currentTableName+"/Options/@additionalSourcesValue")).attribute().value();
+
+    currentProjectData.levelsTable.rows = fFetchTabTableRows(doc, currentTableName);
+
+    // Misc tab
+
+    currentTableName = MiscTableName;
+
+    fFetchFromToForTab(doc, currentTableName, currentProjectData.miscTable);
+
+    currentProjectData.miscTable.rows = fFetchTabTableRows(doc, currentTableName);
+
+    return currentProjectData;
+}
+
+void ProjectFileVago::upgradeProjectFileIfNecessary(const QString &filePath){
+
+    pugi::xml_document doc;
+
+    pugi::xml_parse_result result = doc.load_file(QSTR_TO_CSTR(filePath));
+
+    if(result.status!=pugi::status_ok){
+        throw std::runtime_error(QSTR_TO_CSTR(QString("An error ocurred while loading project file.\n") + result.description()));
+    }
+
+    QString projectVersion = QString(doc.select_single_node("/VagoProject").node().attribute("vagoVersion").as_string());
+
+    // 1.4 added standing pose in characters tab (we need to add it in 1.0 projects)
+    if(projectVersion == "1.0"){
+
+        if(!Util::FileSystem::backupFile(filePath, filePath + UtilVago::getDateTimeFormatForFilename(QDateTime::currentDateTime()))){
+            QString errorMessage = "Couldn't backup the existing project file for version upgrade, program can't proceed.";
+            Util::Dialogs::showError(errorMessage);
+            LOG_FATAL << errorMessage;
+            exit(1);
+        }
+
+        // Update version
+        doc.select_single_node("/VagoProject").node().attribute("vagoVersion").set_value(QSTR_TO_CSTR(GlobalVars::LastCompatibleVersion));
+
+        // Add standing pose to characters options
+        doc.select_node("/VagoProject/Characters/Options").node().append_attribute("standingPose").set_value("false");
+
+        if(!doc.save_file(QSTR_TO_CSTR(filePath), PUGIXML_TEXT("\t"), pugi::format_default | pugi::format_write_bom, pugi::xml_encoding::encoding_utf8)){
+            throw std::runtime_error(QSTR_TO_CSTR("Error while saving: '" + filePath + "'. After file version upgrade."));
+        }
+    }
+    else if(projectVersion != GlobalVars::LastCompatibleVersion){
+        throw std::runtime_error("Can't load the project file, it is from an incompatible version. Probably newer?");
+    }
+}
+
+// Right now it always replaces totally the old file with new content (old content is not modified but replaced)
+void ProjectFileVago::saveProjectDataToFile(const QString &fileFullPath, const ProjectFileVago::ProjectData &newProjectData){
+    pugi::xml_document doc;
+    pugi::xml_node rootNode;
+
+    rootNode = doc.append_child("VagoProject"); // create
+
+    rootNode.append_attribute("vagoVersion").set_value(QSTR_TO_CSTR(GlobalVars::LastCompatibleVersion));
+
+    // Let's starting writting the GUI data
+
+    QString currentTableName;
+
+    // Returns node of the table
+    auto fWriteTabGenericData = [](pugi::xml_node &rootNode, const ProjectTable &table, const QString &tableName) -> pugi::xml_node{
+
+        pugi::xml_node rowsNode = rootNode.append_child(QSTR_TO_CSTR(tableName));
+
+        rowsNode.append_attribute("from").set_value(QSTR_TO_CSTR(table.from));
+        rowsNode.append_attribute("to").set_value(QSTR_TO_CSTR(table.to));
+
+        for(const ProjectTableRow &currRow : table.rows){
+
+            pugi::xml_node currentRow = rowsNode.append_child("Row");
+
+            currentRow.append_attribute("fileFolder").set_value(QSTR_TO_CSTR(currRow.fileFolder));
+            currentRow.append_attribute("fromTo").set_value(QSTR_TO_CSTR(currRow.fromTo));
+            currentRow.append_attribute("command").set_value(QSTR_TO_CSTR(currRow.command));
+
+            // Only necessary to add if it is infact disabled
+            if(currRow.isDisabled){
+                currentRow.append_attribute("disabled").set_value(currRow.isDisabled);
+            }
+        }
+
+        return rowsNode;
+    };
+
+    // XML tab
+
+    currentTableName = XMLTableName;
+
+    fWriteTabGenericData(rootNode, newProjectData.xmlTable, currentTableName);
+
+    // Textures tab
+
+    currentTableName = TexturesTableName;
+
+    pugi::xml_node currentNodeTable = fWriteTabGenericData(rootNode, newProjectData.texturesTable, currentTableName);
+
+    pugi::xml_node options = currentNodeTable.append_child("Options");
+    options.append_attribute("type").set_value(QSTR_TO_CSTR(newProjectData.texturesTable.rbTexturesType));
+    options.append_attribute("genMipMaps").set_value(Util::String::boolToCstr(newProjectData.texturesTable.cbGenMipMaps));
+    options.append_attribute("noUwrap").set_value(Util::String::boolToCstr(newProjectData.texturesTable.cbNoUwrap));
+    options.append_attribute("noVwrap").set_value(Util::String::boolToCstr(newProjectData.texturesTable.cbNoVwrap));
+    options.append_attribute("large").set_value(Util::String::boolToCstr(newProjectData.texturesTable.cbLarge));
+    options.append_attribute("envMap").set_value(Util::String::boolToCstr(newProjectData.texturesTable.cbEnvMap));
+    options.append_attribute("envMapValue").set_value(QSTR_TO_CSTR(newProjectData.texturesTable.leEnvMapTexture));
+
+    // Characters tab
+
+    currentTableName = CharactersTableName;
+
+    currentNodeTable = fWriteTabGenericData(rootNode, newProjectData.charactersTable, currentTableName);
+
+    options = currentNodeTable.append_child("Options");
+    options.append_attribute("cellShading").set_value(Util::String::boolToCstr(newProjectData.charactersTable.cbCellShading));
+    options.append_attribute("normals").set_value(Util::String::boolToCstr(newProjectData.charactersTable.cbNormals));
+    options.append_attribute("standingPose").set_value(Util::String::boolToCstr(newProjectData.charactersTable.cbStandingPose));
+    options.append_attribute("extractTRBSONCC").set_value(Util::String::boolToCstr(newProjectData.charactersTable.cbWithTRBS_ONCC));
+    options.append_attribute("extractTRBSONCCValue").set_value(QSTR_TO_CSTR(newProjectData.charactersTable.leTRBS_ONCC));
+
+    // Objects tab
+
+    currentTableName = ObjectsTableName;
+
+    currentNodeTable = fWriteTabGenericData(rootNode, newProjectData.objectsTable, currentTableName);
+
+    options = currentNodeTable.append_child("Options");
+    options.append_attribute("texture").set_value(Util::String::boolToCstr(newProjectData.objectsTable.cbTexture));
+    options.append_attribute("textureValue").set_value(QSTR_TO_CSTR(newProjectData.objectsTable.leTextureName));
+    options.append_attribute("withAnimation").set_value(Util::String::boolToCstr(newProjectData.objectsTable.cbWithAnimation));
+    options.append_attribute("withAnimationValue").set_value(QSTR_TO_CSTR(newProjectData.objectsTable.leAnimationName));
+
+    // Levels tab
+
+    currentTableName = ObjectsTableName;
+
+    currentNodeTable = fWriteTabGenericData(rootNode, newProjectData.levelsTable, currentTableName);
+
+    options = currentNodeTable.append_child("Options");
+    options.append_attribute("extractWithFiles").set_value(Util::String::boolToCstr(newProjectData.levelsTable.cbSpecificFilesLevels));
+    options.append_attribute("extractWithFilesValue").set_value(QSTR_TO_CSTR(newProjectData.levelsTable.leSpecificFilesLevels));
+    options.append_attribute("datFilename").set_value(Util::String::boolToCstr(newProjectData.levelsTable.cbDatLevels));
+    options.append_attribute("datFilenameValue").set_value(QSTR_TO_CSTR(newProjectData.levelsTable.leTargetDatLevels));
+    options.append_attribute("bnvSource").set_value(Util::String::boolToCstr(newProjectData.levelsTable.cbBnvLevels));
+    options.append_attribute("bnvSourceValue").set_value(QSTR_TO_CSTR(newProjectData.levelsTable.leBnvLevels));
+    options.append_attribute("generateGrids").set_value(Util::String::boolToCstr(newProjectData.levelsTable.cbGridsLevels));
+    options.append_attribute("additionalSources").set_value(Util::String::boolToCstr(newProjectData.levelsTable.cbAdditionalSourcesLevels));
+    options.append_attribute("additionalSourcesValue").set_value(QSTR_TO_CSTR(newProjectData.levelsTable.leAdditSourcesLevels));
+
+    // Misc tab
+
+    currentTableName = MiscTableName;
+
+    fWriteTabGenericData(rootNode, newProjectData.miscTable, currentTableName);
+
+    if(!doc.save_file(fileFullPath.toUtf8().constData(), PUGIXML_TEXT("\t"), pugi::format_default | pugi::format_write_bom, pugi::xml_encoding::encoding_utf8)){
+        throw std::runtime_error("An error ocurred while trying to save the project file. Please try another path.");
+    }
+
+}
Index: /s10k/Vago/xmlParsers/projectfilevago.h
===================================================================
--- /s10k/Vago/xmlParsers/projectfilevago.h	(revision 1093)
+++ /s10k/Vago/xmlParsers/projectfilevago.h	(revision 1093)
@@ -0,0 +1,109 @@
+/*
+ *
+Copyright (C) 2017  Fábio Bento (random-guy)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+#ifndef PROJECTFILEVAGO_H
+#define PROJECTFILEVAGO_H
+
+#include "utilvago.h"
+#include <pugixml/pugixml.hpp>
+
+class ProjectFileVago
+{
+
+public:
+
+    struct ProjectTableRow{
+      QString fileFolder;
+      QString fromTo;
+      QString command;
+      bool isDisabled = false;
+    };
+
+    struct ProjectTable{
+        QVector<ProjectTableRow> rows;
+        QString from;
+        QString to;
+    };
+
+    struct ProjectXMLTable : public ProjectTable{};
+
+    struct ProjectTexturesTable: public ProjectTable{
+        QString rbTexturesType;
+        bool cbGenMipMaps = false;
+        bool cbNoUwrap = false;
+        bool cbNoVwrap = false;
+        bool cbLarge = false;
+        bool cbEnvMap = false;
+        QString leEnvMapTexture;
+    };
+
+    struct ProjectCharactersTable : public ProjectTable{
+        bool cbCellShading = false;
+        bool cbNormals = false;
+        bool cbStandingPose = false;
+        bool cbWithTRBS_ONCC = false;
+        QString leTRBS_ONCC;
+    };
+
+    struct ProjectObjectsTable : public ProjectTable{
+        bool cbTexture = false;
+        QString leTextureName;
+        bool cbWithAnimation = false;
+        QString leAnimationName;
+    };
+
+    struct ProjectLevelsTable : public ProjectTable{
+        bool cbSpecificFilesLevels = false;
+        QString leSpecificFilesLevels;
+        bool cbDatLevels = false;
+        QString leTargetDatLevels;
+        bool cbBnvLevels = false;
+        QString leBnvLevels;
+        bool cbGridsLevels = false;
+        bool cbAdditionalSourcesLevels = false;
+        QString leAdditSourcesLevels;
+    };
+
+    struct ProjectMiscTable : public ProjectTable{};
+
+    struct ProjectData{
+        ProjectXMLTable xmlTable;
+        ProjectTexturesTable texturesTable;
+        ProjectCharactersTable charactersTable;
+        ProjectObjectsTable objectsTable;
+        ProjectLevelsTable levelsTable;
+        ProjectMiscTable miscTable;
+    };
+
+public:
+    ProjectFileVago() = delete;
+	static ProjectFileVago::ProjectData readProjectDataFromFile(const QString &fileFullPath);
+    static void saveProjectDataToFile(const QString &fileFullPath, const ProjectData &newProjectData);
+private:
+	static void upgradeProjectFileIfNecessary(const QString &filePath);
+private:
+    static const QString XMLTableName;
+    static const QString TexturesTableName;
+    static const QString CharactersTableName;
+    static const QString ObjectsTableName;
+    static const QString LevelsTableName;
+    static const QString MiscTableName;
+};
+
+#endif // PROJECTFILEVAGO_H
Index: /s10k/Vago/xmlToolsInterface/xmltoolsinterface.cpp
===================================================================
--- /s10k/Vago/xmlToolsInterface/xmltoolsinterface.cpp	(revision 1092)
+++ /s10k/Vago/xmlToolsInterface/xmltoolsinterface.cpp	(revision 1093)
@@ -2,5 +2,5 @@
 #include "ui_xmltoolsinterface.h"
 
-XmlToolsInterface::XmlToolsInterface(Logger *myLogger, QWidget *parent) :
+XmlToolsInterface::XmlToolsInterface(QWidget *parent) :
     QMainWindow(parent),
     ui(new Ui::XmlToolsInterface),
@@ -9,6 +9,5 @@
     ui->setupUi(this);
     this->setAttribute(Qt::WA_DeleteOnClose, true); //destroy itself once finished.
-    this->myLogger = myLogger;
-    this->xmlProcessor = new XmlProcessor(UtilVago::getAppPath(), this->myLogger, &this->listToProccess);
+    this->xmlProcessor = new XmlProcessor(UtilVago::getAppPath(), &this->listToProccess);
 
     // setup the correct input options for the current selection
@@ -162,6 +161,5 @@
     if(oldFile.exists()){
         if(!oldFile.remove()){
-            UtilVago::showAndLogErrorPopUpLogButton(this->myLogger,
-                                                    "Couldn't remove old temporary file to preview XML patch! Existing file:\n"
+            UtilVago::showAndLogErrorPopUpLogButton("Couldn't remove old temporary file to preview XML patch! Existing file:\n"
                                                     + previewFileLocation
                                                     );
@@ -170,6 +168,5 @@
 
     if(!QFile::copy(currentFileLocation, previewFileLocation)){
-        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger,
-                                                "Couldn't create temporary file to preview the XML patch!\nFrom: " +
+        UtilVago::showAndLogErrorPopUpLogButton("Couldn't create temporary file to preview the XML patch!\nFrom: " +
                                                 currentFileLocation +
                                                 "\nTo: " + previewFileLocation
@@ -204,15 +201,15 @@
 
     if(ui->leInputInputFiles->text().trimmed().isEmpty()){
-        Util::showErrorPopUp("You must provide an Input File!");
+        Util::Dialogs::showError("You must provide an Input File!");
         return false;
     }
 
     if(ui->rbFilterRelativeElements->isChecked() && ui->leFilterElement->text().trimmed().isEmpty()){
-        Util::showErrorPopUp("With Relative Elements checked you must provide a Element Name!");
+        Util::Dialogs::showError("With Relative Elements checked you must provide a Element Name!");
         return false;
     }
 
     if(ui->cbFilterParentElement->isChecked() && ui->leFilterParentElement->text().trimmed().isEmpty()){
-        Util::showErrorPopUp("Parent Element is checked but none was provided!");
+        Util::Dialogs::showError("Parent Element is checked but none was provided!");
         return false;
     }
@@ -221,5 +218,5 @@
         if(ui->leFilterAttributeName->text().trimmed().isEmpty())
         {
-            Util::showErrorPopUp("Attribute Name is checked but none was provided!");
+            Util::Dialogs::showError("Attribute Name is checked but none was provided!");
             return false;
         }
@@ -227,5 +224,5 @@
         if(ui->leFilterAttributeValue->text().trimmed().isEmpty())
         {
-            Util::showErrorPopUp("With Attribute Name checked you must provide a Attribute Value!");
+            Util::Dialogs::showError("With Attribute Name checked you must provide a Attribute Value!");
             return false;
         }
@@ -234,15 +231,15 @@
     if(ui->rbFilterXPathExpression->isChecked() && ui->leFilterXPathExpression->text().trimmed().isEmpty())
     {
-        Util::showErrorPopUp("X-Path Expression is checked but none was provided!");
+        Util::Dialogs::showError("X-Path Expression is checked but none was provided!");
         return false;
     }
 
     if(ui->cbXmlToolsOperation->currentText() == "Add Values" && ui->leInputNewValues->text().isEmpty()){
-        Util::showErrorPopUp(R"|(With "Add Values" operation selected you must provide the "New Value(s)" to be added.)|");
+        Util::Dialogs::showError(R"|(With "Add Values" operation selected you must provide the "New Value(s)" to be added.)|");
         return false;
     }
 
     if(ui->cbXmlToolsOperation->currentText() == "Remove Values" && ui->leInputCurrentValues->text().isEmpty()){
-        Util::showErrorPopUp(R"|(With "Remove Value" operation selected you must provide the "Current Value(s)" to be removed.)|");
+        Util::Dialogs::showError(R"|(With "Remove Value" operation selected you must provide the "Current Value(s)" to be removed.)|");
         return false;
     }
@@ -269,5 +266,5 @@
         // if there's a preview in progress don't display the message below
         if(!this->previewInProgress){
-            Util::showPopUp("File(s) processed with sucess!");
+            Util::Dialogs::showInfo("File(s) processed with sucess!");
         }
     }
@@ -305,42 +302,42 @@
 
     if(ui->leInputNewValues->isEnabled()){
-        currCommand += "--new-val " + Util::insertQuotes(ui->leInputNewValues->text()) + " ";
+        currCommand += "--new-val " + Util::String::insertQuotes(ui->leInputNewValues->text()) + " ";
     }
 
     if(ui->leInputCurrentValues->isEnabled()){
-        currCommand += "--current-val " + Util::insertQuotes(ui->leInputCurrentValues->text()) + " ";
+        currCommand += "--current-val " + Util::String::insertQuotes(ui->leInputCurrentValues->text()) + " ";
     }
 
     if(ui->leInputPositions->isEnabled() && !ui->leInputPositions->text().trimmed().isEmpty()){
-        currCommand += "--positions " + Util::insertQuotes(ui->leInputPositions->text()) + " ";
+        currCommand += "--positions " + Util::String::insertQuotes(ui->leInputPositions->text()) + " ";
     }
 
     if(ui->leInputDiffOldNewValue->isEnabled()){
-        currCommand += "--diff-old-new-val " + Util::insertQuotes(ui->leInputDiffOldNewValue->text()) + " ";
+        currCommand += "--diff-old-new-val " + Util::String::insertQuotes(ui->leInputDiffOldNewValue->text()) + " ";
     }
 
     if(ui->rbFilterRelativeElements->isChecked()){
         if(ui->leFilterElement->isEnabled()){
-            currCommand += "--element-name " + Util::insertQuotes(ui->leFilterElement->text()) + " ";
+            currCommand += "--element-name " + Util::String::insertQuotes(ui->leFilterElement->text()) + " ";
         }
         if(ui->leFilterParentElement->isEnabled()){
-            currCommand += "--parent-element-name " + Util::insertQuotes(ui->leFilterParentElement->text()) + " ";
+            currCommand += "--parent-element-name " + Util::String::insertQuotes(ui->leFilterParentElement->text()) + " ";
         }
         if(ui->leFilterAttributeName->isEnabled()){
-            currCommand += "--attribute-name " + Util::insertQuotes(ui->leFilterAttributeName->text()) + " ";
-            currCommand += "--attribute-value " + Util::insertQuotes(ui->leFilterAttributeValue->text()) + " ";
+            currCommand += "--attribute-name " + Util::String::insertQuotes(ui->leFilterAttributeName->text()) + " ";
+            currCommand += "--attribute-value " + Util::String::insertQuotes(ui->leFilterAttributeValue->text()) + " ";
         }
     }
     else{
         if(ui->leFilterXPathExpression->isEnabled()){
-            currCommand += "--xpath-expression " + Util::insertQuotes(ui->leFilterXPathExpression->text()) + " ";
+            currCommand += "--xpath-expression " + Util::String::insertQuotes(ui->leFilterXPathExpression->text()) + " ";
         }
     }
 
     if(alternativeFileLocation.isEmpty()){
-        currCommand += "--files " + Util::insertQuotes(ui->leInputInputFiles->text());
+        currCommand += "--files " + Util::String::insertQuotes(ui->leInputInputFiles->text());
     }
     else{
-        currCommand += "--files " + Util::insertQuotes(alternativeFileLocation);
+        currCommand += "--files " + Util::String::insertQuotes(alternativeFileLocation);
     }
 
Index: /s10k/Vago/xmlToolsInterface/xmltoolsinterface.h
===================================================================
--- /s10k/Vago/xmlToolsInterface/xmltoolsinterface.h	(revision 1092)
+++ /s10k/Vago/xmlToolsInterface/xmltoolsinterface.h	(revision 1093)
@@ -24,5 +24,5 @@
     
 public:
-    explicit XmlToolsInterface(Logger *myLogger, QWidget *parent = 0);
+    explicit XmlToolsInterface(QWidget *parent = 0);
     ~XmlToolsInterface();
 
@@ -73,5 +73,4 @@
 private:
     Ui::XmlToolsInterface *ui;
-    Logger *myLogger = nullptr;
     QStringList listToProccess; //commands to execute
     XmlProcessor *xmlProcessor = nullptr;
Index: /s10k/Vago/xmlToolsInterface/xmltoolsinterfacecommandpreview.cpp
===================================================================
--- /s10k/Vago/xmlToolsInterface/xmltoolsinterfacecommandpreview.cpp	(revision 1092)
+++ /s10k/Vago/xmlToolsInterface/xmltoolsinterfacecommandpreview.cpp	(revision 1093)
@@ -23,6 +23,6 @@
     ui->tePreviewFileText->setText(this->previewText);
 
-    highlighterCurrentFile = new BasicXMLSyntaxHighlighter(ui->teCurrentFileText);
-    highlighterPreviewFile = new BasicXMLSyntaxHighlighter(ui->tePreviewFileText);
+    highlighterCurrentFile.setDocument(ui->teCurrentFileText->document());
+    highlighterPreviewFile.setDocument(ui->tePreviewFileText->document());
 
     previewFile.close();
@@ -172,12 +172,10 @@
     }
 
-    highlighterPreviewFile->rehighlight();
-    highlighterCurrentFile->rehighlight();
+    highlighterPreviewFile.rehighlight();
+    highlighterCurrentFile.rehighlight();
 }
 
 XmlToolsInterfaceCommandPreview::~XmlToolsInterfaceCommandPreview()
 {
-    delete this->highlighterCurrentFile;
-    delete this->highlighterPreviewFile;
     delete this->lineNumberDisplayCurrentFile;
     delete this->lineNumberDisplayPreviewFile;
Index: /s10k/Vago/xmlToolsInterface/xmltoolsinterfacecommandpreview.h
===================================================================
--- /s10k/Vago/xmlToolsInterface/xmltoolsinterfacecommandpreview.h	(revision 1092)
+++ /s10k/Vago/xmlToolsInterface/xmltoolsinterfacecommandpreview.h	(revision 1093)
@@ -6,6 +6,6 @@
 #include <QScrollBar>
 
-#include "../libs/BasicXMLSyntaxHighlighter/BasicXMLSyntaxHighlighter.h"
-#include "../libs/LineNumberDisplay/LineNumberDisplay.h"
+#include <BasicXMLSyntaxHighlighter/BasicXMLSyntaxHighlighter.h>
+#include <LineNumberDisplay/LineNumberDisplay.h>
 #include "util.h"
 
@@ -24,6 +24,6 @@
 private:
     Ui::XmlToolsInterfaceCommandPreview *ui;
-    BasicXMLSyntaxHighlighter *highlighterCurrentFile;
-    BasicXMLSyntaxHighlighter *highlighterPreviewFile;
+    BasicXMLSyntaxHighlighter highlighterCurrentFile;
+    BasicXMLSyntaxHighlighter highlighterPreviewFile;
     LineNumberDisplay *lineNumberDisplayCurrentFile;
     LineNumberDisplay *lineNumberDisplayPreviewFile;
Index: /s10k/Vago/xmlprocessor.cpp
===================================================================
--- /s10k/Vago/xmlprocessor.cpp	(revision 1092)
+++ /s10k/Vago/xmlprocessor.cpp	(revision 1093)
@@ -1,8 +1,7 @@
 #include "xmlprocessor.h"
 
-XmlProcessor::XmlProcessor(QString AppDir, Logger *myLogger, QStringList *commands)
+XmlProcessor::XmlProcessor(QString AppDir, QStringList *commands)
 {
     this->AppDir=AppDir;
-    this->myLogger=myLogger;
     this->commands=commands;
 }
@@ -25,5 +24,5 @@
         if(!result.isEmpty()){
             //catch exception
-            myLogger->writeString("Xml Tools Error: \n"+this->commands->at(i)+"\n"+result);
+            LOG_ERROR << "Xml Tools Error: \n" + this->commands->at(i) + "\n"+result;
             errorMessage=result;
             numErrors++;
Index: /s10k/Vago/xmlprocessor.h
===================================================================
--- /s10k/Vago/xmlprocessor.h	(revision 1092)
+++ /s10k/Vago/xmlprocessor.h	(revision 1093)
@@ -10,8 +10,7 @@
      Q_OBJECT
 public:
-    XmlProcessor(QString AppDir, Logger *myLogger, QStringList *commands);
+    XmlProcessor(QString AppDir, QStringList *commands);
 private:
     QString AppDir;
-    Logger *myLogger;
     QStringList *commands;
 
