--- ogitor/CMakeLists.txt.orig	2018-07-23 08:19:35.325648300 +0300
+++ ogitor/CMakeLists.txt	2018-07-23 08:23:41.393481100 +0300
@@ -52,7 +52,7 @@
 option(OGITOR_DOWNLOAD_SAMPLEMEDIA "Download and install sample media" TRUE)
 
 # Somehow, relative paths doesn't work on Linux when installing files..
-if(UNIX)
+if(UNIX OR MINGW)
     set(PREFIX ${CMAKE_INSTALL_PREFIX})
 else()
     set(PREFIX "./")
@@ -171,15 +171,15 @@
     # We are on Windows
     set(OGITOR_BIN_PATH "." CACHE PATH "Ogitor bin path" FORCE)
     set(OGITOR_RUN_PATH "." CACHE PATH "Ogitor run path" FORCE)
-    set(OGITOR_RESOURCE_PATH "." CACHE PATH "Ogitor resource path" FORCE)
-    set(OGITOR_LANGUAGE_PATH "../languages" CACHE PATH "Ogitor languages path" FORCE)
-    set(OGITOR_MEDIA_PATH "../Media" CACHE PATH "Ogitor media path" FORCE)
-    set(OGITOR_PROJECTS_PATH "../Projects" CACHE PATH "Ogitor Projects path" FORCE)
-    set(OGITOR_SCRIPTS_PATH "../Scripts" CACHE PATH "Ogitor scripts path" FORCE)
-    set(OGITOR_PLUGIN_PATH "../Plugins" CACHE PATH "Ogitor plugins path" FORCE)
-    set(OGITOR_PLUGIN_ICON_PATH "../Plugins/Icons" CACHE PATH "Ogitor plugins icon path" FORCE)
-    set(OGITOR_LIBOGREOFSPLUGIN_PATH "." CACHE PATH "libOgreOfsPlugin path" FORCE)
-	configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/Templates/resources.cfg.in ${CMAKE_INSTALL_PREFIX}/bin/resources.cfg)
+    set(OGITOR_RESOURCE_PATH "../share/ogitor" CACHE PATH "Ogitor resource path" FORCE)
+    set(OGITOR_LANGUAGE_PATH "../share/ogitor/languages" CACHE PATH "Ogitor languages path" FORCE)
+    set(OGITOR_MEDIA_PATH "../share/ogitor/Media" CACHE PATH "Ogitor media path" FORCE)
+    set(OGITOR_PROJECTS_PATH "../share/ogitor/Projects" CACHE PATH "Ogitor Projects path" FORCE)
+    set(OGITOR_SCRIPTS_PATH "../share/ogitor/Scripts" CACHE PATH "Ogitor scripts path" FORCE)
+    set(OGITOR_PLUGIN_PATH "${CMAKE_INSTALL_PREFIX}/lib/ogitor/" CACHE PATH "Ogitor plugins path" FORCE)
+    set(OGITOR_PLUGIN_ICON_PATH "../share/ogitor/Plugins/Icons" CACHE PATH "Ogitor plugins icon path" FORCE)
+    set(OGITOR_LIBOGREOFSPLUGIN_PATH "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "libOgreOfsPlugin path" FORCE)
+	configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/Templates/resources.cfg.in ${CMAKE_CURRENT_BINARY_DIR}/RunPath/bin/resources_ogitor.cfg)
 endif(UNIX)
 
 # hide advanced options
--- ogitor/qtOgitor/CMakeLists.txt.orig	2018-07-24 11:39:35.576965200 +0300
+++ ogitor/qtOgitor/CMakeLists.txt	2018-07-24 11:39:52.502995000 +0300
@@ -306,7 +306,7 @@
         if(UNIX)
             install(FILES ${QTOGITOR_TS_FILES} DESTINATION ${OGITOR_LANGUAGE_PATH})
         elseif(WIN32)
-            install(FILES ${QTOGITOR_TS_FILES} DESTINATION ${PREFIX})
+            install(FILES ${QTOGITOR_TS_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/ogitor/languages")
         endif(UNIX)
     endif()
 
--- ogitor/Ogitor/src/OgitorsRoot.cpp.orig	2018-07-23 15:09:46.089965200 +0300
+++ ogitor/Ogitor/src/OgitorsRoot.cpp	2018-07-23 15:11:01.470070700 +0300
@@ -756,9 +756,9 @@
 
 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
 #ifdef DEBUG
-        mSystem->GetFileList("../Plugins/*Script_d.dll", scriptPluginList);
+        mSystem->GetFileList("../lib/ogitor/*Script_d.dll", scriptPluginList);
 #else
-        mSystem->GetFileList("../Plugins/*Script.dll", scriptPluginList);
+        mSystem->GetFileList("../lib/ogitor/*Script.dll", scriptPluginList);
 #endif
 #elif OGRE_PLATFORM == OGRE_PLATFORM_LINUX
 #ifdef DEBUG
@@ -797,9 +797,9 @@
 
 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
 #ifdef DEBUG
-        mSystem->GetFileList("../Plugins/*_d.dll", pluginList);
+        mSystem->GetFileList("../lib/ogitor/*_d.dll", pluginList);
 #else
-        mSystem->GetFileList("../Plugins/*.dll", pluginList);
+        mSystem->GetFileList("../lib/ogitor/*.dll", pluginList);
 #endif
 #elif OGRE_PLATFORM == OGRE_PLATFORM_LINUX
 #ifdef DEBUG
--- ogitor/RunPath/CMakeLists.txt.orig	2018-07-23 15:39:46.701234300 +0300
+++ ogitor/RunPath/CMakeLists.txt	2018-07-23 15:40:53.331327600 +0300
@@ -3,7 +3,7 @@
 ###############################################################
 
 # Set media target directory
-if(WIN32)
+if(MSVC)
 	install(DIRECTORY ${CMAKE_SOURCE_DIR}/RunPath/
 		DESTINATION ${PREFIX}
 		CONFIGURATIONS Release RelWithDebInfo MinSizeRel
@@ -26,34 +26,28 @@
 		DESTINATION bin
 		CONFIGURATIONS Debug
 	)
-endif(WIN32)
+endif(MSVC)
 
-if(UNIX)
+if(UNIX OR MINGW)
 	install(DIRECTORY ${CMAKE_SOURCE_DIR}/RunPath/
 		DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ogitor
 		PATTERN "CMakeLists.txt" EXCLUDE
 		PATTERN "Debug" EXCLUDE
-        PATTERN "Projects" EXCLUDE
 		PATTERN "bin" EXCLUDE
 		PATTERN ".xml" EXCLUDE
 		PATTERN "Plugins/icon_backup" EXCLUDE
 	)
 
-    if(OGITOR_DIST)
-        install(FILES
-            ${CMAKE_BINARY_DIR}/RunPath/bin/resources.cfg
-            # Sample app only installed locally ?
-            #${CMAKE_CURRENT_SOURCE_DIR}/bin/SampleAppConfig.xml
-            #${CMAKE_CURRENT_SOURCE_DIR}/bin/SampleAppConfig_dist.xml
-            DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ogitor
-        )
-    else(OGITOR_DIST)
-        install(FILES ${CMAKE_SOURCE_DIR}/RunPath/bin/SampleAppConfig.xml
-            #${CMAKE_CURRENT_SOURCE_DIR}/bin/SampleAppConfig_dist.xml
-            DESTINATION bin
-        )
-    endif(OGITOR_DIST)
-endif(UNIX)
+    install(FILES
+        ${CMAKE_BINARY_DIR}/RunPath/bin/resources_ogitor.cfg
+        # Sample app only installed locally ?
+        #${CMAKE_CURRENT_SOURCE_DIR}/bin/SampleAppConfig.xml
+        #${CMAKE_CURRENT_SOURCE_DIR}/bin/SampleAppConfig_dist.xml
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
+    install(FILES ${CMAKE_SOURCE_DIR}/RunPath/bin/SampleAppConfig.xml
+        #${CMAKE_CURRENT_SOURCE_DIR}/bin/SampleAppConfig_dist.xml
+        DESTINATION bin)
+endif(UNIX OR MINGW)
 
 if (APPLE)
 	file(COPY Plugins/Icons DESTINATION ${CMAKE_BINARY_DIR}/Plugins)
--- ogitor/OgreOfsPlugin/CMakeLists.txt.orig	2018-07-23 15:45:49.631742400 +0300
+++ ogitor/OgreOfsPlugin/CMakeLists.txt	2018-07-23 15:46:03.981762500 +0300
@@ -22,7 +22,7 @@
 target_link_libraries(OgreOfsPlugin ${OGRE_LIBRARIES} OFS ${Boost_REGEX_LIBRARY})
 
 install(TARGETS OgreOfsPlugin
-        LIBRARY DESTINATION ${OGITOR_LIBOGREOFSPLUGIN_PATH}
-        ARCHIVE DESTINATION ${OGITOR_LIBOGREOFSPLUGIN_PATH}
+        LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
+        ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
         RUNTIME DESTINATION ${OGITOR_LIBOGREOFSPLUGIN_PATH})
 # vim: set sw=2 ts=2 noet:
--- ogitor/qtOgitor/src/main.cpp.orig	2018-07-24 11:44:37.148495800 +0300
+++ ogitor/qtOgitor/src/main.cpp	2018-07-24 11:44:44.355708400 +0300
@@ -70,7 +70,7 @@
 
     Ogre::ConfigFile cf;
     std::string cfPath = resourcePath();
-	cfPath.append("resources.cfg");
+	cfPath.append("resources_ogitor.cfg");
     cf.load(cfPath);
 
     // Go through all sections & settings in the file
