Index: include/celtool/initapp.h
===================================================================
--- include/celtool/initapp.h	(revision 2418)
+++ include/celtool/initapp.h	(working copy)
@@ -40,7 +40,7 @@
 {
 private:
   typedef csInitializer superclass;
-
+  static bool LoadCelVfs(iObjectRegistry* r);
 protected:
   static void setup_plugin_dirs(iObjectRegistry*, char const* detected_dir);
 
@@ -110,6 +110,28 @@
    * terminate the list with #CS_REQUEST_END.
    */
   static bool RequestPlugins(iObjectRegistry*,csArray<csPluginRequest> const&);
+  
+  /**
+   * A convenience function to load an vfs configuration file from real path
+   * directly.
+   *
+   * Note vfs must already be initialized when calling this.
+  */
+  static bool LoadMountsFromFile(iObjectRegistry* r, char const* configPath);
+
+  /**
+   * A replacement for csInitializer::SetupConfigManager() which makes sure
+   * cel vfs path is loaded so it can load config file from cel vfs.
+   * 
+   * Mostly intended for cel apps, although any application that wants to
+   * use cel vfs can use this. (note celInitializer::RequestPlugins will
+   * also load cel vfs, so its not really necessary unless you really need to
+   * load the config file from cel vfs).
+   *
+   * Other than this does the same as the csInitializer function.
+  */ 
+  static bool SetupConfigManager (iObjectRegistry* r, char const* configName, 
+		  	          char const* AppID = 0);
 };
 
 #endif // __CELTOOL_INITAPP_H__
Index: libs/celtool/initapp.cpp
===================================================================
--- libs/celtool/initapp.cpp	(revision 2418)
+++ libs/celtool/initapp.cpp	(working copy)
@@ -18,12 +18,21 @@
 
 #include "celtool/initapp.h"
 #include <csutil/syspath.h>
+#include "iutil/cfgmgr.h"
 
+#include "csutil/verbosity.h"
+#include "csutil/cfgacc.h"
+#include "csutil/cfgfile.h"
+#include "csutil/cmdline.h"
+#include "csutil/csshlib.h"
+
 // Recurse into subdirectories when scanning for plugins? Disabled presently
 // because some developers run CEL programs from within the source tree, and it
 // can be quite costly to recurse over the entire tree.
 #define CEL_PLUGIN_SCAN_RECURSE false
 
+static bool cel_config_done = false;
+
 void celInitializer::setup_plugin_dirs(iObjectRegistry* r, char const* dir0)
 {
   static bool done = false;
@@ -71,6 +80,7 @@
 bool celInitializer::RequestPluginsV(iObjectRegistry* r, va_list args)
 {
   SetupCelPluginDirs(r);
+  LoadCelVfs(r);
   return superclass::RequestPluginsV(r, args);
 }
 
@@ -78,5 +88,105 @@
   csArray<csPluginRequest> const& a)
 {
   SetupCelPluginDirs(r);
+  // find and add cel vfs file if its not done already
+  LoadCelVfs(r);
   return superclass::RequestPlugins(r, a);
 }
+
+bool celInitializer::LoadMountsFromFile(iObjectRegistry* r, char const* configPath)
+{
+  csRef<iConfigManager> cfg_mgr = CS_QUERY_REGISTRY(r,iConfigManager);
+  csRef<iVFS> vfs = CS_QUERY_REGISTRY(r,iVFS);
+  csRef<iConfigFile> vfs_file = cfg_mgr->AddDomain(configPath,NULL,0);
+  vfs->LoadMountsFromFile(vfs_file);
+  return true;
+}
+
+#ifdef CS_DEBUG
+#define CS_LOAD_LIB_VERBOSE true
+#else
+#define CS_LOAD_LIB_VERBOSE false
+#endif
+
+static void SetupPluginLoadErrVerbosity(iObjectRegistry* r)
+{
+  csRef<iVerbosityManager> verbosemgr (
+    CS_QUERY_REGISTRY(r, iVerbosityManager));
+  bool verbose = CS_LOAD_LIB_VERBOSE;
+  if (verbosemgr.IsValid())
+    verbose = verbosemgr->Enabled("loadlib");
+  csSetLoadLibraryVerbose (verbose);
+}
+
+bool celInitializer::LoadCelVfs(iObjectRegistry* r)
+{
+  if (cel_config_done) return true;
+  // find and add cel vfs file
+  csString cel_env (getenv ("CEL"));
+  if (cel_env.IsEmpty())
+    LoadMountsFromFile(r,"/etc/cel/vfs.cfg");
+  else
+    LoadMountsFromFile(r,cel_env+csString("vfs.cfg"));
+  cel_config_done = true;
+  return true;
+}
+
+bool celInitializer::SetupConfigManager (
+  iObjectRegistry* r, char const* configName, char const* AppID)
+{
+  SetupPluginLoadErrVerbosity(r);
+  
+  if (AppID == 0)
+    AppID = GetDefaultAppID();
+
+  // @@@ Is this ugly? Do we need a better, more generalized way of doing this?
+  // The reason that the VFS plugin is required
+  // this early is that both the application configuration file and the
+  // configuration file for other plugins may (and almost always do) reside on
+  // a VFS volume.
+
+  csRef<iVFS> VFS = SetupVFS(r);
+
+  LoadCelVfs(r);
+
+  csRef<iConfigManager> Config (CS_QUERY_REGISTRY (r, iConfigManager));
+  csRef<iConfigFile> cfg = Config->GetDynamicDomain ();
+  Config->SetDomainPriority (cfg, iConfigManager::ConfigPriorityApplication);
+
+  // Initialize application configuration file
+  if (configName)
+    if (!cfg->Load (configName, VFS))
+      return false;
+
+  // Check if the user-specific config domain should be used.
+  {
+    csConfigAccess cfgacc (r, "/config/system.cfg");
+    if (cfgacc->GetBool ("System.UserConfig", true))
+    {
+      // Open the user-specific, application-neutral config domain.
+      cfg = csGetPlatformConfig ("CrystalSpace.Global");
+      Config->AddDomain (cfg, iConfigManager::ConfigPriorityUserGlobal);
+
+      // Open the user-and-application-specific config domain.
+      const char* appid = cfgacc->GetStr ("System.ApplicationID", AppID);
+      cfg = csGetPlatformConfig (appid);
+      Config->AddDomain (cfg, iConfigManager::ConfigPriorityUserApp);
+      Config->SetDynamicDomain (cfg);
+    }
+  }
+
+  // Handle command line config settings
+  {
+    csRef<iCommandLineParser> cmdline = 
+      csQueryRegistry<iCommandLineParser> (r);
+    if (cmdline.IsValid())
+    {
+      csRef<csConfigFile> cmdlineConfig;
+      cmdlineConfig.AttachNew (new csConfigFile);
+      cmdlineConfig->ParseCommandLine (cmdline, VFS);
+      Config->AddDomain (cmdlineConfig, iConfigManager::ConfigPriorityCmdLine);
+    }
+  }
+
+  return true;
+}
Index: apps/celtest/celtest.cpp
===================================================================
--- apps/celtest/celtest.cpp	(revision 2418)
+++ apps/celtest/celtest.cpp	(working copy)
@@ -358,13 +358,12 @@
 {
   csDebuggingGraph::SetupGraph (object_reg);
 
-  if (!csInitializer::SetupConfigManager (object_reg,
+  if (!celInitializer::SetupConfigManager (object_reg,
   	"/celconfig/celtest.cfg"))
   {
     return ReportError ("Can't setup config file!");
   }
 
-
   if (!celInitializer::RequestPlugins (object_reg,
   	CS_REQUEST_VFS,
 	CS_REQUEST_OPENGL3D,
