Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 33903)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 33904)
@@ -214,4 +214,18 @@
     else
         RTPrintf("Config file:     %lS\n", settingsFilePath.raw());
+
+    Bstr snapshotFolder;
+    rc = machine->COMGETTER(SnapshotFolder)(snapshotFolder.asOutParam());
+    if (details == VMINFO_MACHINEREADABLE)
+        RTPrintf("SnapFldr=\"%lS\"\n", snapshotFolder.raw());
+    else
+        RTPrintf("Snapshot folder: %lS\n", snapshotFolder.raw());
+
+    Bstr logFolder;
+    rc = machine->COMGETTER(LogFolder)(logFolder.asOutParam());
+    if (details == VMINFO_MACHINEREADABLE)
+        RTPrintf("LogFldr=\"%lS\"\n", logFolder.raw());
+    else
+        RTPrintf("Log folder:      %lS\n", logFolder.raw());
 
     Bstr strHardwareUuid;
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 33903)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 33904)
@@ -293,8 +293,11 @@
 
         mUserData->s.strName = strName;
-        mUserData->s.fNameSync = true;
-
-        /* initialize the default snapshots folder
-         * (note: depends on the name value set above!) */
+
+        // the "name sync" flag determines whether the machine directory gets renamed along
+        // with the machine file; say so if the settings file name is the same as the
+        // settings file parent directory (machine directory)
+        mUserData->s.fNameSync = isInOwnDir();
+
+        // initialize the default snapshots folder
         rc = COMSETTER(SnapshotFolder)(NULL);
         AssertComRC(rc);
@@ -2083,5 +2086,7 @@
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    mUserData->m_strSnapshotFolderFull.cloneTo(aSnapshotFolder);
+    Utf8Str strFullSnapshotFolder;
+    calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
+    strFullSnapshotFolder.cloneTo(aSnapshotFolder);
 
     return S_OK;
@@ -2111,18 +2116,10 @@
 
     Utf8Str strSnapshotFolder0(aSnapshotFolder);       // keep original
+
     Utf8Str strSnapshotFolder(strSnapshotFolder0);
-
     if (strSnapshotFolder.isEmpty())
-    {
-        if (isInOwnDir())
-            /* the default snapshots folder is 'Snapshots' in the machine dir */
-            strSnapshotFolder = "Snapshots";
-        else
-            /* the default snapshots folder is {UUID}, for backwards
-             * compatibility and to resolve conflicts */
-            strSnapshotFolder = Utf8StrFmt("{%RTuuid}", mData->mUuid.raw());
-    }
-
-    int vrc = calculateFullPath(strSnapshotFolder, strSnapshotFolder);
+        strSnapshotFolder = "Snapshots";
+    int vrc = calculateFullPath(strSnapshotFolder,
+                                strSnapshotFolder);
     if (RT_FAILURE(vrc))
         return setError(E_FAIL,
@@ -2132,6 +2129,6 @@
     setModified(IsModified_MachineData);
     mUserData.backup();
-    mUserData->s.strSnapshotFolder = strSnapshotFolder0;
-    mUserData->m_strSnapshotFolderFull = strSnapshotFolder;
+
+    copyPathRelativeToMachine(strSnapshotFolder, mUserData->s.strSnapshotFolder);
 
     return S_OK;
@@ -2340,6 +2337,5 @@
     Utf8Str logFolder;
     getLogFolder(logFolder);
-
-    Bstr (logFolder).cloneTo(aLogFolder);
+    logFolder.cloneTo(aLogFolder);
 
     return S_OK;
@@ -3591,9 +3587,12 @@
         }
 
+        Utf8Str strFullSnapshotFolder;
+        calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
+
         ComObjPtr<Medium> diff;
         diff.createObject();
         rc = diff->init(mParent,
                         medium->getPreferredDiffFormat(),
-                        Utf8Str(mUserData->m_strSnapshotFolderFull).append(RTPATH_SLASH_STR),
+                        strFullSnapshotFolder.append(RTPATH_SLASH_STR),
                         medium->getFirstRegistryMachineId(),         // store this diff in the same registry as the parent
                         &fNeedsGlobalSaveSettings);
@@ -4535,16 +4534,15 @@
          * there (we don't check for errors because the user might have
          * some private files there that we don't want to delete) */
-        Assert(mUserData->m_strSnapshotFolderFull.length());
-        if (RTDirExists(mUserData->m_strSnapshotFolderFull.c_str()))
-            RTDirRemove(mUserData->m_strSnapshotFolderFull.c_str());
-
-        /* delete the directory that contains the settings file, but only
-         * if it matches the VM name (i.e. a structure created by default in
-         * prepareSaveSettings()) */
-        {
-            Utf8Str settingsDir;
-            if (isInOwnDir(&settingsDir))
-                RTDirRemove(settingsDir.c_str());
-        }
+        Utf8Str strFullSnapshotFolder;
+        calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
+        Assert(!strFullSnapshotFolder.isEmpty());
+        if (RTDirExists(strFullSnapshotFolder.c_str()))
+            RTDirRemove(strFullSnapshotFolder.c_str());
+
+        // delete the directory that contains the settings file, but only
+        // if it matches the VM name
+        Utf8Str settingsDir;
+        if (isInOwnDir(&settingsDir))
+            RTDirRemove(settingsDir.c_str());
     }
 
@@ -5816,9 +5814,6 @@
         aLogFolder = settingsDir;
     else
-    {
         /* Log folder is <Machines>/<VM_SnapshotFolder>/Logs */
-        Assert(!mUserData->m_strSnapshotFolderFull.isEmpty());
-        aLogFolder = mUserData->m_strSnapshotFolderFull;
-    }
+        calculateFullPath(mUserData->s.strSnapshotFolder, aLogFolder);
 
     aLogFolder.append(RTPATH_DELIMITER);
@@ -7717,5 +7712,5 @@
             }
 
-            /* update m_strConfigFileFull amd mConfigFile */
+            // update m_strConfigFileFull amd mConfigFile
             mData->m_strConfigFileFull = newConfigFile;
             // compute the relative path too
@@ -7731,15 +7726,4 @@
                 if (pfNeedsGlobalSaveSettings)
                     *pfNeedsGlobalSaveSettings = true;
-            }
-
-            /* update the snapshot folder */
-            if (RTPathStartsWith(mUserData->m_strSnapshotFolderFull.c_str(),
-                                 configDir.c_str()))
-            {
-                mUserData->m_strSnapshotFolderFull = Utf8StrFmt("%s%s",
-                                                                newConfigDir.c_str(),
-                                                                mUserData->m_strSnapshotFolderFull.c_str() + configDir.length());
-                copyPathRelativeToMachine(mUserData->m_strSnapshotFolderFull,
-                                          mUserData->s.strSnapshotFolder);
             }
 
@@ -8601,9 +8585,12 @@
                                         aWeight);        // weight
 
+            Utf8Str strFullSnapshotFolder;
+            calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
+
             ComObjPtr<Medium> diff;
             diff.createObject();
             rc = diff->init(mParent,
                             pMedium->getPreferredDiffFormat(),
-                            Utf8Str(mUserData->m_strSnapshotFolderFull).append(RTPATH_SLASH_STR),
+                            strFullSnapshotFolder.append(RTPATH_SLASH_STR),
                             pMedium->getFirstRegistryMachineId(),        // store the diff in the same registry as the parent
                             pfNeedsSaveSettings);
@@ -9230,6 +9217,6 @@
 /**
  *  Returns true if the settings file is located in the directory named exactly
- *  as the machine. This will be true if the machine settings structure was
- *  created by default in #openConfigLoader().
+ *  as the machine; this means, among other things, that the machine directory
+ *  should be auto-renamed.
  *
  *  @param aSettingsDir if not NULL, the full machine settings file directory
@@ -9241,18 +9228,17 @@
 bool Machine::isInOwnDir(Utf8Str *aSettingsDir /* = NULL */) const
 {
-    Utf8Str settingsDir = mData->m_strConfigFileFull;
-    settingsDir.stripFilename();
-    Utf8Str strDirName = RTPathFilename(settingsDir.c_str());
-
-    AssertReturn(!strDirName.isEmpty(), false);
-
-    /* if we don't rename anything on name change, return false shortly */
-    if (!mUserData->s.fNameSync)
-        return false;
-
+    Utf8Str strMachineDirName(mData->m_strConfigFileFull);  // path/to/machinesfolder/vmname/vmname.vbox
+    strMachineDirName.stripFilename();                      // path/to/machinesfolder/vmname
     if (aSettingsDir)
-        *aSettingsDir = settingsDir;
-
-    return strDirName == mUserData->s.strName;
+        *aSettingsDir = strMachineDirName;
+    strMachineDirName.stripPath();                          // vmname
+    Utf8Str strConfigFileOnly(mData->m_strConfigFileFull);  // path/to/machinesfolder/vmname/vmname.vbox
+    strConfigFileOnly.stripPath()                           // vmname.vbox
+                     .stripExt();                           // vmname
+
+    AssertReturn(!strMachineDirName.isEmpty(), false);
+    AssertReturn(!strConfigFileOnly.isEmpty(), false);
+
+    return strMachineDirName == strConfigFileOnly;
 }
 
@@ -10557,7 +10543,10 @@
     if (mData->mMachineState == MachineState_Paused)
     {
+        Utf8Str strFullSnapshotFolder;
+        calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
         stateFilePath = Utf8StrFmt("%s%c{%RTuuid}.sav",
-                                   mUserData->m_strSnapshotFolderFull.c_str(),
-                                   RTPATH_DELIMITER, mData->mUuid.raw());
+                                   strFullSnapshotFolder.c_str(),
+                                   RTPATH_DELIMITER,
+                                   mData->mUuid.raw());
     }
 
@@ -10925,5 +10914,5 @@
  *  @note Locks this object for reading.
  */
-HRESULT SessionMachine::onNATRedirectRuleChange(INetworkAdapter *networkAdapter, BOOL aNatRuleRemove, IN_BSTR aRuleName, 
+HRESULT SessionMachine::onNATRedirectRuleChange(INetworkAdapter *networkAdapter, BOOL aNatRuleRemove, IN_BSTR aRuleName,
                                  NATProtocol_T aProto, IN_BSTR aHostIp, LONG aHostPort, IN_BSTR aGuestIp, LONG aGuestPort)
 {
Index: /trunk/src/VBox/Main/SnapshotImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/SnapshotImpl.cpp	(revision 33903)
+++ /trunk/src/VBox/Main/SnapshotImpl.cpp	(revision 33904)
@@ -1386,6 +1386,8 @@
          || mData->mMachineState == MachineState_Saved)
     {
+        Utf8Str strFullSnapshotFolder;
+        calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
         strStateFilePath = Utf8StrFmt("%s%c{%RTuuid}.sav",
-                                      mUserData->m_strSnapshotFolderFull.c_str(),
+                                      strFullSnapshotFolder.c_str(),
                                       RTPATH_DELIMITER,
                                       snapshotId.raw());
@@ -1855,6 +1857,8 @@
                 Utf8Str snapStateFilePath = aTask.pSnapshot->stateFilePath();
 
+                Utf8Str strFullSnapshotFolder;
+                calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
                 Utf8Str stateFilePath = Utf8StrFmt("%s%c{%RTuuid}.sav",
-                                                   mUserData->m_strSnapshotFolderFull.c_str(),
+                                                   strFullSnapshotFolder.c_str(),
                                                    RTPATH_DELIMITER,
                                                    mData->mUuid.raw());
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 33903)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 33904)
@@ -1667,9 +1667,7 @@
         <link to="#registerMachine"/>.
 
-        The specified settings file name can be absolute
-        (full path) or relative to the <link to="IVirtualBox::homeFolder">
-          VirtualBox home directory</link>. This file must exist
-        and must be a valid machine settings file whose contents
-        will be used to construct the machine object.
+        The specified settings file name must be fully qualified.
+        The file must exist and be a valid machine XML settings file
+        whose contents will be used to construct the machine object.
 
         <result name="VBOX_E_FILE_ERROR">
Index: /trunk/src/VBox/Main/include/MachineImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MachineImpl.h	(revision 33903)
+++ /trunk/src/VBox/Main/include/MachineImpl.h	(revision 33904)
@@ -215,5 +215,4 @@
     {
         settings::MachineUserData s;
-        Utf8Str m_strSnapshotFolderFull;
     };
 
@@ -614,5 +613,5 @@
     // callback handlers
     virtual HRESULT onNetworkAdapterChange(INetworkAdapter * /* networkAdapter */, BOOL /* changeAdapter */) { return S_OK; }
-    virtual HRESULT onNATRedirectRuleChange(INetworkAdapter * /* networkAdapter */, BOOL /* Remove */, IN_BSTR /* Rule name */, 
+    virtual HRESULT onNATRedirectRuleChange(INetworkAdapter * /* networkAdapter */, BOOL /* Remove */, IN_BSTR /* Rule name */,
                                  NATProtocol_T /* proto */, IN_BSTR /* host ip */, LONG /* host port */, IN_BSTR /* guest ip */, LONG /* guest port */) { return S_OK; }
     virtual HRESULT onSerialPortChange(ISerialPort * /* serialPort */) { return S_OK; }
@@ -957,5 +956,5 @@
 
     HRESULT onNetworkAdapterChange(INetworkAdapter *networkAdapter, BOOL changeAdapter);
-    HRESULT onNATRedirectRuleChange(INetworkAdapter *networkAdapter, BOOL aNatRuleRemove, IN_BSTR aRuleName, 
+    HRESULT onNATRedirectRuleChange(INetworkAdapter *networkAdapter, BOOL aNatRuleRemove, IN_BSTR aRuleName,
                                  NATProtocol_T aProto, IN_BSTR aHostIp, LONG aHostPort, IN_BSTR aGuestIp, LONG aGuestPort);
     HRESULT onStorageControllerChange();
