Index: xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java
===================================================================
--- xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java	(revision 6802)
+++ xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java	(working copy)
@@ -255,6 +255,7 @@
      */
     public void updateSchema(XWikiContext context) throws HibernateException
     {
+        log.debug("updateSchema: context.database is:"+context.getDatabase());
         updateSchema(context, false);
     }
 
@@ -323,7 +324,7 @@
      * @return the database/schema name.
      * @since XWiki Core 1.1.2, XWiki Core 1.2M2
      */
-    protected String getSchemaFromWikiName(String wikiName, XWikiContext context)
+    protected String getSchemaFromWikiName(String wikiName, XWikiContext context) throws XWikiException
     {
         if (wikiName == null) {
             return null;
@@ -331,14 +332,36 @@
 
         DatabaseProduct databaseProduct = getDatabaseProductName(context);
 
-        if (databaseProduct == DatabaseProduct.DERBY) {
-            return wikiName.equalsIgnoreCase(context.getMainXWiki()) ? "APP" : wikiName.replace(
-                '-', '_');
-        } else if (databaseProduct == DatabaseProduct.HSQLDB) {
-            return wikiName.equalsIgnoreCase(context.getMainXWiki()) ? "PUBLIC" : wikiName
-                .replace('-', '_');
-        } else
-            return wikiName.replace('-', '_');
+        String retval  = wikiName.replace('-','_');
+        boolean isMain = wikiName.equalsIgnoreCase(context.getMainXWiki());
+        XWiki   wiki = context.getWiki();
+               
+        if (isMain) {
+            String configuredMainDatabaseSchemaName = wiki.Param("xwiki.db","");
+            if (configuredMainDatabaseSchemaName.length()!=0) {
+                retval=configuredMainDatabaseSchemaName;
+            }else{
+                if (databaseProduct == DatabaseProduct.DERBY) {
+                   retval="APP";    
+                }else if (databaseProduct == DatabaseProduct.HSQLDB) {
+                   retval = "PUBLIC";                   
+                }
+            }
+        }else{
+            // virtual
+            String configurableVirtualDabaseSchemaPrefix = 
+                                  wiki.Param("xwiki.virtual.db.prefix","");
+            if (configurableVirtualDabaseSchemaPrefix.length()!=0) {
+                retval = configurableVirtualDabaseSchemaPrefix + retval;
+            }
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("schema for wiki " + context.getDatabase()+" is "+retval);
+        }
+
+        return retval;
+                
     }
 
     /**
@@ -348,7 +371,7 @@
      * @return the database/schema name.
      * @since XWiki Core 1.1.2, XWiki Core 1.2M2
      */
-    protected String getSchemaFromWikiName(XWikiContext context)
+    protected String getSchemaFromWikiName(XWikiContext context) throws XWikiException
     {
         return getSchemaFromWikiName(context.getDatabase(), context);
     }
@@ -544,7 +567,7 @@
      */
     public void setDatabase(Session session, XWikiContext context) throws XWikiException
     {
-        if (isVirtual(context)) {
+        if (isVirtual(context)||context.getWiki().Param("xwiki.db")!=null) {
             try {
                 if (log.isDebugEnabled())
                     log.debug("Switch database to: " + context.getDatabase());
Index: xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java
===================================================================
--- xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java	(revision 6802)
+++ xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java	(working copy)
@@ -249,7 +249,7 @@
      */
     private static File tempDir = null;
 
-    private static String getConfigPath() throws NamingException
+    private static String getConfigPath() 
     {
         if (configPath == null) {
             try {
