diff --git a/modules/corelib/corelib.otmod b/modules/corelib/corelib.otmod
index 842a206f..d158c2d2 100644
--- a/modules/corelib/corelib.otmod
+++ b/modules/corelib/corelib.otmod
@@ -24,3 +24,6 @@ Module
 
     dofile 'inputmessage'
     dofile 'outputmessage'
+
+  @onUnload: |
+    g_settings = nil
\ No newline at end of file
diff --git a/src/framework/core/application.cpp b/src/framework/core/application.cpp
index cd301404..ae07adbb 100644
--- a/src/framework/core/application.cpp
+++ b/src/framework/core/application.cpp
@@ -90,6 +90,9 @@ void Application::init(std::vector<std::string>& args)
 
     m_startupOptions = startupOptions;
 
+    // initialize configs
+    g_configs.init();
+
     // initialize resources
     g_resources.init(args[0].c_str());
 
@@ -125,11 +128,8 @@ void Application::terminate()
     Connection::terminate();
 #endif
 
-    // save configurations
-    ConfigPtr settings = g_configs.getSettings();
-    if(settings) {
-        settings->save();
-    }
+    // release configs
+    g_configs.terminate();
 
     // release resources
     g_resources.terminate();
diff --git a/src/framework/core/configmanager.cpp b/src/framework/core/configmanager.cpp
index b0b6e867..2e291ed8 100644
--- a/src/framework/core/configmanager.cpp
+++ b/src/framework/core/configmanager.cpp
@@ -24,11 +24,29 @@
 
 ConfigManager g_configs;
 
-ConfigManager::ConfigManager()
+void ConfigManager::init()
 {
     m_settings = ConfigPtr(new Config());
 }
 
+void ConfigManager::terminate()
+{
+    if(m_settings) {
+        // ensure settings are saved
+        m_settings->save();
+
+        m_settings->unload();
+        m_settings = nullptr;
+    }
+
+    for(ConfigPtr config : m_configs) {
+        config->unload();
+        config = nullptr;
+    }
+
+    m_configs.clear();
+}
+
 ConfigPtr ConfigManager::getSettings()
 {
     return m_settings;
@@ -79,6 +97,7 @@ bool ConfigManager::unload(const std::string& file)
     if(config) {
         config->unload();
         m_configs.remove(config);
+        config = nullptr;
         return true;
     }
     return false;
diff --git a/src/framework/core/configmanager.h b/src/framework/core/configmanager.h
index 81443751..a49f084b 100644
--- a/src/framework/core/configmanager.h
+++ b/src/framework/core/configmanager.h
@@ -29,7 +29,8 @@
 class ConfigManager
 {
 public:
-    ConfigManager();
+    void init();
+    void terminate();
 
     ConfigPtr getSettings();
     ConfigPtr get(const std::string& file);