Index: /trunk/doc/manual/en_US/SDKRef.xml
===================================================================
--- /trunk/doc/manual/en_US/SDKRef.xml	(revision 55630)
+++ /trunk/doc/manual/en_US/SDKRef.xml	(revision 55631)
@@ -4295,8 +4295,6 @@
                 <xref linkend="IGuestSession__symlinkRead"
                 xreflabel="IGuestSession::symlinkRead()" />,
-                <xref linkend="IGuestSession__symlinkRemoveDirectory"
-                xreflabel="IGuestSession::symlinkRemoveDirectory()" /> and
-                <xref linkend="IGuestSession__symlinkRemoveFile"
-                xreflabel="IGuestSession::symlinkRemoveFile()" /> are not
+                IGuestSession::symlinkRemoveDirectory() and
+                IGuestSession::symlinkRemoveFile() are not
                 implemented yet.</para>
               </listitem>
@@ -4306,8 +4304,6 @@
                 <xref linkend="IGuestSession__directoryRemoveRecursive"
                 xreflabel="IGuestSession::directoryRemoveRecursive()" />,
-                <xref linkend="IGuestSession__directoryRename"
-                xreflabel="IGuestSession::directoryRename()" /> and
-                <xref linkend="IGuestSession__directorySetACL"
-                xreflabel="IGuestSession::directorySetACL()" /> are not
+                IGuestSession::directoryRename() and
+                IGuestSession::directorySetACL() are not
                 implemented yet.</para>
               </listitem>
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp	(revision 55630)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp	(revision 55631)
@@ -1722,4 +1722,16 @@
 
 
+/** bird: This is just a code conversion tool, flags are better defined by
+ *        the preprocessor, in general.  But the code was using obsoleted
+ *        main flags for internal purposes (in a uint32_t) without passing them
+ *        along, or it seemed that way.  Enum means compiler checks types. */
+enum gctlCopyFlags
+{
+    kGctlCopyFlags_None         = 0,
+    kGctlCopyFlags_Recursive    = RT_BIT(1),
+    kGctlCopyFlags_FollowLinks  = RT_BIT(2)
+};
+
+
 /**
  * Creates a copy context structure which then can be used with various
@@ -1977,9 +1989,9 @@
     {
         BOOL fDirExists = FALSE;
-        HRESULT rc = pContext->pCmdCtx->pGuestSession->DirectoryExists(Bstr(pszDir).raw(), &fDirExists);
-        if (FAILED(rc))
+        HRESULT rc = pContext->pCmdCtx->pGuestSession->DirectoryExists(Bstr(pszDir).raw(), FALSE /*followSymlinks*/, &fDirExists);
+        if (SUCCEEDED(rc))
+            *fExists = fDirExists != FALSE;
+        else
             vrc = gctlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
-        else
-            *fExists = fDirExists ? true : false;
     }
     else
@@ -2044,9 +2056,9 @@
     {
         BOOL fFileExists = FALSE;
-        HRESULT rc = pContext->pCmdCtx->pGuestSession->FileExists(Bstr(pszFile).raw(), &fFileExists);
-        if (FAILED(rc))
+        HRESULT rc = pContext->pCmdCtx->pGuestSession->FileExists(Bstr(pszFile).raw(), FALSE /*followSymlinks*/, &fFileExists);
+        if (SUCCEEDED(rc))
+            *fExists = fFileExists != FALSE;
+        else
             vrc = gctlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
-        else
-            *fExists = fFileExists ? true : false;
     }
     else
@@ -2096,14 +2108,14 @@
  * @param   pszFileSource           Source file to copy to the destination.
  * @param   pszFileDest             Name of copied file on the destination.
- * @param   fFlags                  Copy flags. No supported at the moment and needs
- *                                  to be set to 0.
+ * @param   enmFlags                Copy flags. No supported at the moment and
+ *                                  needs to be set to 0.
  */
 static int gctlCopyFileToDest(PCOPYCONTEXT pContext, const char *pszFileSource,
-                              const char *pszFileDest, uint32_t fFlags)
+                              const char *pszFileDest, gctlCopyFlags enmFlags)
 {
     AssertPtrReturn(pContext, VERR_INVALID_POINTER);
     AssertPtrReturn(pszFileSource, VERR_INVALID_POINTER);
     AssertPtrReturn(pszFileDest, VERR_INVALID_POINTER);
-    AssertReturn(!fFlags, VERR_INVALID_POINTER); /* No flags supported yet. */
+    AssertReturn(enmFlags == kGctlCopyFlags_None, VERR_INVALID_PARAMETER); /* No flags supported yet. */
 
     if (pContext->pCmdCtx->cVerbose > 1)
@@ -2119,15 +2131,15 @@
     if (pContext->fHostToGuest)
     {
-        SafeArray<CopyFileFlag_T> copyFlags;
-        rc = pContext->pCmdCtx->pGuestSession->CopyTo(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
-                                               ComSafeArrayAsInParam(copyFlags),
-                                               pProgress.asOutParam());
+        SafeArray<FileCopyFlag_T> copyFlags;
+        rc = pContext->pCmdCtx->pGuestSession->FileCopyToGuest(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
+                                                               ComSafeArrayAsInParam(copyFlags),
+                                                               pProgress.asOutParam());
     }
     else
     {
-        SafeArray<CopyFileFlag_T> copyFlags;
-        rc = pContext->pCmdCtx->pGuestSession->CopyFrom(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
-                                               ComSafeArrayAsInParam(copyFlags),
-                                               pProgress.asOutParam());
+        SafeArray<FileCopyFlag_T> copyFlags;
+        rc = pContext->pCmdCtx->pGuestSession->FileCopyFromGuest(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
+                                                                 ComSafeArrayAsInParam(copyFlags),
+                                                                 pProgress.asOutParam());
     }
 
@@ -2158,5 +2170,5 @@
  * @param   pszFilter               DOS-style wildcard filter (?, *).  Optional.
  * @param   pszDest                 Destination directory on the guest.
- * @param   fFlags                  Copy flags, such as recursive copying.
+ * @param   enmFlags                Copy flags, such as recursive copying.
  * @param   pszSubDir               Current sub directory to handle. Needs to NULL and only
  *                                  is needed for recursion.
@@ -2164,5 +2176,5 @@
 static int gctlCopyDirToGuest(PCOPYCONTEXT pContext,
                               const char *pszSource, const char *pszFilter,
-                              const char *pszDest, uint32_t fFlags,
+                              const char *pszDest, enum gctlCopyFlags enmFlags,
                               const char *pszSubDir /* For recursion. */)
 {
@@ -2229,5 +2241,5 @@
                         RTPrintf("Directory: %s\n", DirEntry.szName);
 
-                    if (fFlags & CopyFileFlag_Recursive)
+                    if (enmFlags & kGctlCopyFlags_Recursive)
                     {
                         char *pszNewSub = NULL;
@@ -2244,5 +2256,5 @@
                             vrc = gctlCopyDirToGuest(pContext,
                                                      pszSource, pszFilter,
-                                                     pszDest, fFlags, pszNewSub);
+                                                     pszDest, enmFlags, pszNewSub);
                             RTStrFree(pszNewSub);
                         }
@@ -2254,6 +2266,6 @@
 
                 case RTDIRENTRYTYPE_SYMLINK:
-                    if (   (fFlags & CopyFileFlag_Recursive)
-                        && (fFlags & CopyFileFlag_FollowLinks))
+                    if (   (enmFlags & kGctlCopyFlags_Recursive)
+                        && (enmFlags & kGctlCopyFlags_FollowLinks))
                     {
                         /* Fall through to next case is intentional. */
@@ -2298,5 +2310,5 @@
                             {
                                 vrc = gctlCopyFileToDest(pContext, pszFileSource,
-                                                        pszFileDest, 0 /* Flags */);
+                                                         pszFileDest, kGctlCopyFlags_None);
                                 RTStrFree(pszFileDest);
                             }
@@ -2327,5 +2339,5 @@
  * @param   pszFilter               DOS-style wildcard filter (?, *).  Optional.
  * @param   pszDest                 Destination directory on the host.
- * @param   fFlags                  Copy flags, such as recursive copying.
+ * @param   enmFlags                Copy flags, such as recursive copying.
  * @param   pszSubDir               Current sub directory to handle. Needs to NULL and only
  *                                  is needed for recursion.
@@ -2333,5 +2345,5 @@
 static int gctlCopyDirToHost(PCOPYCONTEXT pContext,
                              const char *pszSource, const char *pszFilter,
-                             const char *pszDest, uint32_t fFlags,
+                             const char *pszDest, gctlCopyFlags enmFlags,
                              const char *pszSubDir /* For recursion. */)
 {
@@ -2396,5 +2408,5 @@
                 }
 
-                if (fFlags & CopyFileFlag_Recursive)
+                if (enmFlags & kGctlCopyFlags_Recursive)
                 {
                     Utf8Str strDir(strName);
@@ -2411,5 +2423,5 @@
                         vrc = gctlCopyDirToHost(pContext,
                                                 pszSource, pszFilter,
-                                                pszDest, fFlags, pszNewSub);
+                                                pszDest, enmFlags, pszNewSub);
                         RTStrFree(pszNewSub);
                     }
@@ -2421,6 +2433,6 @@
 
             case FsObjType_Symlink:
-                if (   (fFlags & CopyFileFlag_Recursive)
-                    && (fFlags & CopyFileFlag_FollowLinks))
+                if (   (enmFlags & kGctlCopyFlags_Recursive)
+                    && (enmFlags & kGctlCopyFlags_FollowLinks))
                 {
                     /* Fall through to next case is intentional. */
@@ -2468,5 +2480,5 @@
                         {
                             vrc = gctlCopyFileToDest(pContext, pszFileSource,
-                                                    pszFileDest, 0 /* Flags */);
+                                                     pszFileDest, kGctlCopyFlags_None);
                             RTStrFree(pszFileDest);
                         }
@@ -2533,15 +2545,15 @@
  * @param   pszDest                 Destination directory where to copy in the source
  *                                  source directory.
- * @param   fFlags                  Copy flags, such as recursive copying.
+ * @param   enmFlags                Copy flags, such as recursive copying.
  */
 static int gctlCopyDirToDest(PCOPYCONTEXT pContext,
                              const char *pszSource, const char *pszFilter,
-                             const char *pszDest, uint32_t fFlags)
+                             const char *pszDest, enum gctlCopyFlags enmFlags)
 {
     if (pContext->fHostToGuest)
         return gctlCopyDirToGuest(pContext, pszSource, pszFilter,
-                                  pszDest, fFlags, NULL /* Sub directory, only for recursion. */);
+                                  pszDest, enmFlags, NULL /* Sub directory, only for recursion. */);
     return gctlCopyDirToHost(pContext, pszSource, pszFilter,
-                             pszDest, fFlags, NULL /* Sub directory, only for recursion. */);
+                             pszDest, enmFlags, NULL /* Sub directory, only for recursion. */);
 }
 
@@ -2643,5 +2655,5 @@
     Utf8Str strSource;
     const char *pszDst = NULL;
-    uint32_t fFlags = CopyFileFlag_None;
+    enum gctlCopyFlags enmFlags = kGctlCopyFlags_None;
     bool fCopyRecursive = false;
     bool fDryRun = false;
@@ -2663,9 +2675,9 @@
 
             case GETOPTDEF_COPY_FOLLOW:
-                fFlags |= CopyFileFlag_FollowLinks;
+                enmFlags = (enum gctlCopyFlags)((uint32_t)enmFlags | kGctlCopyFlags_FollowLinks);
                 break;
 
             case 'R': /* Recursive processing */
-                fFlags |= CopyFileFlag_Recursive;
+                enmFlags = (enum gctlCopyFlags)((uint32_t)enmFlags | kGctlCopyFlags_Recursive);
                 break;
 
@@ -2827,5 +2839,5 @@
                     if (RT_SUCCESS(vrc))
                     {
-                        vrc = gctlCopyFileToDest(pContext, pszSource, pszDstFile, 0 /* Flags */);
+                        vrc = gctlCopyFileToDest(pContext, pszSource, pszDstFile, kGctlCopyFlags_None);
                         RTStrFree(pszDstFile);
                     }
@@ -2836,5 +2848,5 @@
                 {
                     /* Directory (with filter?). */
-                    vrc = gctlCopyDirToDest(pContext, pszSource, pszFilter, pszDst, fFlags);
+                    vrc = gctlCopyDirToDest(pContext, pszSource, pszFilter, pszDst, enmFlags);
                 }
             }
@@ -3138,8 +3150,8 @@
                 try
                 {
-                    /** @todo How does IGuestSession::FileRemove work with read-only files? Do we
+                    /** @todo How does IGuestSession::FsObjRemove work with read-only files? Do we
                      *        need to do some chmod or whatever to better emulate the --force flag? */
                     HRESULT rc;
-                    CHECK_ERROR(pCtx->pGuestSession, FileRemove(Bstr(ValueUnion.psz).raw()));
+                    CHECK_ERROR(pCtx->pGuestSession, FsObjRemove(Bstr(ValueUnion.psz).raw()));
                     if (FAILED(rc) && !fForce)
                         return RTEXITCODE_FAILURE;
@@ -3180,10 +3192,10 @@
     std::vector< Utf8Str > vecSources;
     const char *pszDst = NULL;
-    com::SafeArray<PathRenameFlag_T> aRenameFlags;
+    com::SafeArray<FsObjRenameFlag_T> aRenameFlags;
 
     try
     {
         /** @todo Make flags configurable. */
-        aRenameFlags.push_back(PathRenameFlag_NoReplace);
+        aRenameFlags.push_back(FsObjRenameFlag_NoReplace);
 
         while (   (ch = RTGetOpt(&GetState, &ValueUnion))
@@ -3236,7 +3248,7 @@
     if (cSources > 1)
     {
-        ComPtr<IGuestFsObjInfo> pFsObjInfo;
-        rc = pCtx->pGuestSession->DirectoryQueryInfo(Bstr(pszDst).raw(), pFsObjInfo.asOutParam());
-        if (FAILED(rc))
+        BOOL fExists = FALSE;
+        rc = pCtx->pGuestSession->DirectoryExists(Bstr(pszDst).raw(), FALSE /*followSymlinks*/, &fExists);
+        if (FAILED(rc) || !fExists)
             return RTMsgErrorExit(RTEXITCODE_FAILURE, "Destination must be a directory when specifying multiple sources\n");
     }
@@ -3252,19 +3264,11 @@
            && !g_fGuestCtrlCanceled)
     {
-        bool fSourceIsDirectory = false;
         Utf8Str strCurSource = (*it);
 
-        /** @todo Slooooow, but works for now. */
-        /** @todo r=bird: Need an interface for querying info on a file system
-         *        object, not just files or directories exclusively.  You also may
-         *        want to take symbolic links into account somewhere along the line,
-         *        though preferrably on the guest end of things... */
         ComPtr<IGuestFsObjInfo> pFsObjInfo;
-        rc = pCtx->pGuestSession->FileQueryInfo(Bstr(strCurSource).raw(), pFsObjInfo.asOutParam());
-        if (FAILED(rc))
-        {
-            rc = pCtx->pGuestSession->DirectoryQueryInfo(Bstr(strCurSource).raw(), pFsObjInfo.asOutParam());
-            fSourceIsDirectory = SUCCEEDED(rc);
-        }
+        FsObjType enmObjType;
+        rc = pCtx->pGuestSession->FsObjQueryInfo(Bstr(strCurSource).raw(), FALSE /*followSymlinks*/, pFsObjInfo.asOutParam());
+        if (SUCCEEDED(rc))
+            rc = pFsObjInfo->COMGETTER(Type)(&enmObjType);
         if (FAILED(rc))
         {
@@ -3278,14 +3282,14 @@
         if (pCtx->cVerbose > 1)
             RTPrintf("Renaming %s \"%s\" to \"%s\" ...\n",
-                     fSourceIsDirectory ? "directory" : "file",
+                     enmObjType == FsObjType_Directory ? "directory" : "file",
                      strCurSource.c_str(), pszDst);
 
         if (!fDryrun)
         {
-            if (fSourceIsDirectory)
-            {
-                CHECK_ERROR_BREAK(pCtx->pGuestSession, DirectoryRename(Bstr(strCurSource).raw(),
-                                                                       Bstr(pszDst).raw(),
-                                                                       ComSafeArrayAsInParam(aRenameFlags)));
+            if (enmObjType == FsObjType_Directory)
+            {
+                CHECK_ERROR_BREAK(pCtx->pGuestSession, FsObjRename(Bstr(strCurSource).raw(),
+                                                                   Bstr(pszDst).raw(),
+                                                                   ComSafeArrayAsInParam(aRenameFlags)));
 
                 /* Break here, since it makes no sense to rename mroe than one source to
@@ -3300,7 +3304,7 @@
             }
             else
-                CHECK_ERROR_BREAK(pCtx->pGuestSession, FileRename(Bstr(strCurSource).raw(),
-                                                                  Bstr(pszDst).raw(),
-                                                                  ComSafeArrayAsInParam(aRenameFlags)));
+                CHECK_ERROR_BREAK(pCtx->pGuestSession, FsObjRename(Bstr(strCurSource).raw(),
+                                                                   Bstr(pszDst).raw(),
+                                                                   ComSafeArrayAsInParam(aRenameFlags)));
         }
 
@@ -3498,8 +3502,5 @@
 
         ComPtr<IGuestFsObjInfo> pFsObjInfo;
-        rc = pCtx->pGuestSession->FileQueryInfo(Bstr(it->first).raw(), pFsObjInfo.asOutParam());
-        if (FAILED(rc))
-            rc = pCtx->pGuestSession->DirectoryQueryInfo(Bstr(it->first).raw(), pFsObjInfo.asOutParam());
-
+        rc = pCtx->pGuestSession->FsObjQueryInfo(Bstr(it->first).raw(), FALSE /*followSymlinks*/, pFsObjInfo.asOutParam());
         if (FAILED(rc))
         {
@@ -3514,5 +3515,5 @@
         {
             FsObjType_T objType;
-            pFsObjInfo->COMGETTER(Type)(&objType);
+            pFsObjInfo->COMGETTER(Type)(&objType); /** @todo What about error checking? */
             switch (objType)
             {
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 55630)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 55631)
@@ -9980,9 +9980,9 @@
 
   <enum
-    name="FileSeekType"
-    uuid="1b73f4f3-3515-4073-a506-76878d9e2541"
+    name="FileSeekOrigin"
+    uuid="939ba94f-497a-4119-ebd3-d193e176c98e"
     >
     <desc>
-      File seeking types.
+      What a file seek (<link to="IFile::seek"/>) is relative to.
     </desc>
 
@@ -9992,4 +9992,8 @@
     <const name="Current"               value="1">
       <desc>Seek from the current file position.</desc>
+    </const>
+    <const name="End"                   value="2">
+      <desc>Seek relative to the end of the file.  To seek to the position two
+        bytes from the end of the file, specify -2 as the seek offset.</desc>
     </const>
   </enum>
@@ -10115,24 +10119,65 @@
 
   <enum
-    name="CopyFileFlag"
-    uuid="23f79fdf-738a-493d-b80b-42d607c9b916"
+    name="FileCopyFlag"
+    uuid="791909d7-4c64-2fa4-4303-adb10658d347"
     >
     <desc>
       File copying flags.
+      <note>Not flags are implemented yet.</note>
     </desc>
     <const name="None"                  value="0">
       <desc>No flag set.</desc>
     </const>
-    <const name="Recursive"             value="1">
-      <desc>Copy directories recursively.
-        This flag is not implemented yet.</desc>
-    </const>
-    <const name="Update"                value="2">
-      <desc>Only copy when the source file is newer than the destination file
-        or when the destination file is missing. This flag is not implemented
-        yet.</desc>
-    </const>
-    <const name="FollowLinks"           value="4">
-      <desc>Follow symbolic links. This flag is not implemented yet.</desc>
+    <const name="NoReplace"             value="1">
+      <!-- Would make more sense to not replace by default, however we the GAs
+           only supports replacing as of writing, so we currently have no choice. -->
+      <desc>
+        Do not replace the destination file if it exists.
+        <note>This flag is not implemented yet.</note>
+      </desc>
+    </const>
+    <const name="FollowLinks"           value="2">
+      <desc>
+        Follow symbolic links.
+        <note>This flag is not implemented yet.</note>
+      </desc>
+    </const>
+    <const name="Update"                value="4">
+      <desc>
+        Only copy when the source file is newer than the destination file
+        or when the destination file is missing.
+        <note>This flag is not implemented yet.</note>
+      </desc>
+    </const>
+  </enum>
+
+  <enum
+    name="FsObjMoveFlags"
+    uuid="98fdd11f-4063-ac60-5737-e49092aab95f"
+    >
+    <desc>
+      File moving flags.
+    </desc>
+    <const name="None"                  value="0">
+      <desc>No flag set.</desc>
+    </const>
+    <const name="Replace"               value="1">
+      <desc>
+        Replace the destination file, symlink, etc if it exists, however this
+        does not allow replacing any directories.
+      </desc>
+    </const>
+    <const name="FollowLinks"           value="2">
+      <desc>
+        Follow symbolic links in the final components or not (only applied to
+        the given source and target paths, not to anything else).
+      </desc>
+    </const>
+    <const name="AllowDirectoryMoves"   value="4">
+      <desc>
+        Allow moving directories accross file system boundraries. Because it
+        is could be a big undertaking, we require extra assurance that we
+        should do it when requested.
+      </desc>
     </const>
   </enum>
@@ -10154,4 +10199,21 @@
 
   <enum
+    name="DirectoryCopyFlags"
+    uuid="cc500f0c-4a54-88c9-56b3-7e9310416da7"
+    >
+    <desc>
+      Directory copying flags.
+      <note>Not flags are implemented yet.</note>
+    </desc>
+    <const name="None"                  value="0">
+      <desc>No flag set.</desc>
+    </const>
+    <const name="CopyIntoExisting"      value="1">
+      <desc>Allow copying into an existing destination directory.</desc>
+    </const>
+    <!-- Later, basically have to see what cp and xcopy offers. -->
+  </enum>
+
+  <enum
     name="DirectoryRemoveRecFlag"
     uuid="455aabf0-7692-48f6-9061-f21579b65769"
@@ -10159,4 +10221,9 @@
     <desc>
       Directory recursive removement flags.
+      <note>
+        WARNING!! THE FLAGS ARE CURRENTLY IGNORED. THE METHOD APPLIES
+                  <link to="DirectoryRemoveRecFlag_ContentAndDir"/> REGARDLESS
+                  OF THE INPUT.
+      </note>
     </desc>
 
@@ -10173,22 +10240,18 @@
 
   <enum
-    name="PathRenameFlag"
-    uuid="f3baa09f-c758-453d-b91c-c7787d76351d"
+    name="FsObjRenameFlag"
+    uuid="59bbf3a1-4e23-d7cf-05d5-ccae32080ed2"
     >
     <desc>
-      Path renaming flags.
-    </desc>
-
-    <const name="None"                  value="0">
-      <desc>No flag set.</desc>
-    </const>
-    <const name="NoReplace"             value="1">
-      <desc>Do not replace anything.</desc>
-    </const>
-    <const name="Replace"               value="2">
-      <desc>This will replace attempt any target which isn't a directory.</desc>
-    </const>
-    <const name="NoSymlinks"            value="4">
-      <desc>Don't allow symbolic links as part of the path.</desc>
+      Flags for use when renaming file system objects (files, directories,
+      symlink, etc), see <link to="IGuestSession::fsObjRename"/>.
+    </desc>
+
+    <const name="NoReplace"             value="0">
+      <desc>Do not replace any destination object.</desc>
+    </const>
+    <const name="Replace"               value="1">
+      <desc>This will attempt to replace any destination object other except
+        directories. (The default is to fail if the destination exists.)</desc>
     </const>
   </enum>
@@ -10266,5 +10329,6 @@
     >
     <desc>
-      Symbolic link types.
+      Symbolic link types.  This is significant when creating links on the
+      Windows platform, ignored elsewhere.
     </desc>
 
@@ -10276,5 +10340,5 @@
     </const>
     <const name="File"                  value="2">
-      <desc>The link targets a file (or whatever else).</desc>
+      <desc>The link targets a file (or whatever else except directories).</desc>
     </const>
   </enum>
@@ -10387,4 +10451,108 @@
         aren't active yet.
       </desc>
+    </const>
+  </enum>
+
+  <enum
+    name="FileAccessMode"
+    uuid="231a578f-47fb-ea30-3b3e-8489558227f0"
+    >
+    <desc>
+      File open access mode for use with <link to="IGuestSession::fileOpen"/>
+      and <link to="IGuestSession::fileOpenEx"/>.
+    </desc>
+    <const name="ReadOnly"   value="1">
+      <desc>Open the file only with read access.</desc>
+    </const>
+    <const name="WriteOnly"  value="2">
+      <desc>Open the file only with write access.</desc>
+    </const>
+    <const name="ReadWrite"  value="3">
+      <desc>Open the file with both read and write access.</desc>
+    </const>
+    <const name="AppendOnly" value="4">
+      <desc>Open the file for appending only, no read or seek access.
+        <note>Not yet implemented.</note>
+      </desc>
+    </const>
+    <const name="AppendRead" value="5">
+      <desc>Open the file for appending and read.  Writes always goes to the
+        end of the file while reads are done at the current or specified file
+        position.
+        <note>Not yet implemented.</note>
+      </desc>
+    </const>
+  </enum>
+
+  <enum
+    name="FileOpenAction"
+    uuid="12bc97e2-4fc6-a8b4-4f84-0cbf4ab970d2"
+    >
+    <desc>
+      What action <link to="IGuestSession::fileOpen"/> and <link to="IGuestSession::fileOpenEx"/>
+      should take whether the file being opened exists or not.
+    </desc>
+    <const name="OpenExisting"            value="1">
+      <desc>Opens an existing file, fails if no file exists. (Was "oe".)</desc>
+    </const>
+    <const name="OpenOrCreate"            value="2">
+      <desc>Opens an existing file, creates a new one if no file exists. (Was "oc".)</desc>
+    </const>
+    <const name="CreateNew"               value="3">
+      <desc>Creates a new file is no file exists, fails if there is a file there already. (Was "ce".)</desc>
+    </const>
+    <const name="CreateOrReplace"         value="4">
+      <desc>
+        Creates a new file, replace any existing file. (Was "ca".)
+        <note>
+          Currently undefined whether we will inherit mode and ACLs from the
+          existing file or replace them.
+        </note>
+      </desc>
+    </const>
+    <const name="OpenExistingTruncated"   value="5">
+      <desc>Opens and truncate an existing file, fails if no file exists. (Was "ot".)</desc>
+    </const>
+    <const name="AppendOrCreate"          value="99">
+      <desc>Opens an existing file and places the file pointer at the end of
+        the file, creates the file if it does not exist.  This action implies
+        write access. (Was "ca".)
+        <note>
+          <!-- @todo r=bird: See iprt/file.h, RTFILE_O_APPEND - not an action/disposition!
+              Moving the file pointer to the end, is almost fine, but impliying 'write' access
+              isn't. That is something that is exclusively reserved for the opening mode. -->
+          Deprecated. Only here for historical reasons. Do not use!
+        </note>
+      </desc>
+    </const>
+  </enum>
+
+  <enum
+    name="FileSharingMode"
+    uuid="f87dfe58-425b-c5ba-7d6d-22adeea25de1"
+    >
+    <desc>
+      File sharing mode for <link to="IGuestSession::fileOpenEx"/>.
+    </desc>
+    <const name="Read"        value="1">
+      <desc>Only share read access to the file.</desc>
+    </const>
+    <const name="Write"       value="2">
+      <desc>Only share write access to the file.</desc>
+    </const>
+    <const name="ReadWrite"   value="3">
+      <desc>Share both read and write access to the file, but deny deletion.</desc>
+    </const>
+    <const name="Delete"      value="4">
+      <desc>Only share delete access, denying read and write.</desc>
+    </const>
+    <const name="ReadDelete"  value="5">
+      <desc>Share read and delete access to the file, denying writing.</desc>
+    </const>
+    <const name="WriteDelete" value="6">
+      <desc>Share write and delete access to the file, denying reading.</desc>
+    </const>
+    <const name="All"         value="7">
+      <desc>Share all access, i.e. read, write and delete, to the file.</desc>
     </const>
   </enum>
@@ -10497,4 +10665,5 @@
       <desc>Don't allow symbolic links as part of the path.</desc>
     </const>
+<!-- r=bird: need a "NoFollowSymlinks" value here.  IPRT probably needs that too. -->
   </enum>
 
@@ -10799,5 +10968,5 @@
   <interface
     name="IGuestSession" extends="$unknown"
-    uuid="c003c35e-4dc4-4111-4771-51befc3c1d30"
+    uuid="91306653-4e3a-88cb-a809-85ae64ceb4fd"
     wsmap="managed"
     >
@@ -10866,5 +11035,5 @@
         Returns the session timeout (in ms).
         <result name="E_NOTIMPL">
-          The method is not implemented yet.
+          This attribute is not implemented yet.
         </result>
       </desc>
@@ -10918,4 +11087,12 @@
       </desc>
     </attribute>
+    <attribute name="currentDirectory" type="wstring">
+      <desc>
+        The current directory of the session.  Guest path style.
+        <result name="E_NOTIMPL">
+          This attribute is not implemented yet.
+        </result>
+      </desc>
+    </attribute>
     <attribute name="directories" type="IGuestDirectory" readonly="yes" safearray="yes">
       <desc>
@@ -10943,45 +11120,77 @@
     </method>
 
-    <method name="copyFrom">
-      <desc>
-        Copies a file from guest to the host.
-
-        <result name="VBOX_E_IPRT_ERROR">
-          Error starting the copy operation.
+    <!-- Directory related methods.  -->
+
+    <method name="directoryCopy">
+      <desc>
+        Recursively copies a directory from one guest location to another.
+
+        <result name="E_NOTIMPL">
+          Not yet implemented.
         </result>
       </desc>
       <param name="source" type="wstring" dir="in">
-        <desc>Source file in the guest to copy to the host.</desc>
-      </param>
-      <param name="dest" type="wstring" dir="in">
-        <desc>Destination file name on the host.</desc>
-      </param>
-      <param name="flags" type="CopyFileFlag" dir="in" safearray="yes">
-        <desc>Copy flags; see <link to="CopyFileFlag"/> for more information.</desc>
+        <desc>The path to the directory to copy (in the guest).  Guest path style.</desc>
+      </param>
+      <param name="destination" type="wstring" dir="in">
+        <desc>The path to the target directory (in the guest).  Unless the
+          <link to="DirectoryCopyFlags::CopyIntoExisting"/> flag is given, the
+          directory shall not already exist.  Guest path style.</desc>
+      </param>
+      <param name="flags" type="DirectoryCopyFlags" dir="in" safearray="yes">
+        <desc>Zero or more <link to="DirectoryCopyFlags"/> values.</desc>
       </param>
       <param name="progress" type="IProgress" dir="return">
-        <desc>Progress object to track the operation completion.</desc>
-      </param>
-    </method>
-
-    <method name="copyTo">
-      <desc>
-        Copies a file from host to the guest.
-
-        <result name="VBOX_E_IPRT_ERROR">
-          Error starting the copy operation.
+        <desc>Progress object to track the operation to completion.</desc>
+      </param>
+    </method>
+
+    <method name="directoryCopyFromGuest">
+      <desc>
+        Recursively copies a directory from the guest to the host.
+
+        <result name="E_NOTIMPL">
+          Not yet implemented.
         </result>
       </desc>
       <param name="source" type="wstring" dir="in">
-        <desc>Source file on the host to copy to the guest.</desc>
-      </param>
-      <param name="dest" type="wstring" dir="in">
-        <desc>Destination file name in the guest.</desc>
-      </param>
-      <param name="flags" type="CopyFileFlag" dir="in" safearray="yes">
-        <desc>Copy flags; see <link to="CopyFileFlag"/> for more information.</desc>
+        <desc>Path to the directory on the guest side that should be copied to
+          the host.  Guest path style.</desc>
+      </param>
+      <param name="destination" type="wstring" dir="in">
+        <desc>Where to put the directory on the host.  Unless the
+          <link to="DirectoryCopyFlags::CopyIntoExisting"/> flag is given, the
+          directory shall not already exist.  Host path style.</desc>
+      </param>
+      <param name="flags" type="DirectoryCopyFlags" dir="in" safearray="yes">
+        <desc>Zero or more <link to="DirectoryCopyFlags"/> values.</desc>
       </param>
       <param name="progress" type="IProgress" dir="return">
-        <desc>Progress object to track the operation completion.</desc>
+        <desc>Progress object to track the operation to completion.</desc>
+      </param>
+    </method>
+
+    <method name="directoryCopyToGuest">
+      <desc>
+        Recursively copies a directory from the host to the guest.
+
+        <result name="E_NOTIMPL">
+          Not yet implemented.
+        </result>
+      </desc>
+      <param name="source" type="wstring" dir="in">
+        <desc>Path to the directory on the host side that should be copied to
+          the guest.  Host path style.</desc>
+      </param>
+      <param name="destination" type="wstring" dir="in">
+        <desc>Where to put the file in the guest. Unless the
+          <link to="DirectoryCopyFlags::CopyIntoExisting"/> flag is given, the
+          directory shall not already exist.  Guest style path.</desc>
+      </param>
+      <param name="flags" type="DirectoryCopyFlags" dir="in" safearray="yes">
+        <desc>Zero or more <link to="DirectoryCopyFlags"/> values.</desc>
+      </param>
+      <param name="progress" type="IProgress" dir="return">
+        <desc>Progress object to track the operation to completion.</desc>
       </param>
     </method>
@@ -10989,5 +11198,5 @@
     <method name="directoryCreate">
       <desc>
-        Create a directory in the guest.
+        Creates a directory in the guest.
 
         <result name="VBOX_E_IPRT_ERROR">
@@ -10996,11 +11205,16 @@
       </desc>
       <param name="path" type="wstring" dir="in">
-        <desc>Full path of directory to create.</desc>
+        <desc>Path to the directory directory to be created. Guest path style.</desc>
       </param>
       <param name="mode" type="unsigned long" dir="in">
-        <desc>File creation mode.</desc>
+        <desc>
+          The UNIX-style access mode mask to create the directory with.
+          Whether/how all three access groups and associated access rights are
+          realized is guest OS dependent.  The API does the best it can on each
+          OS.
+        </desc>
       </param>
       <param name="flags" type="DirectoryCreateFlag" dir="in" safearray="yes">
-        <desc>Creation flags; see <link to="DirectoryCreateFlag"/> for more information.</desc>
+        <desc>Zero or more <link to="DirectoryCreateFlag"/> flags.</desc>
       </param>
     </method>
@@ -11008,5 +11222,5 @@
     <method name="directoryCreateTemp">
       <desc>
-        Create a temporary directory in the guest.
+        Creates a temporary directory in the guest.
 
         <result name="VBOX_E_NOT_SUPPORTED">
@@ -11031,21 +11245,30 @@
       </param>
       <param name="mode" type="unsigned long" dir="in">
-        <desc>The mode of the directory to create. Use 0700 unless there are
-          reasons not to. This parameter is ignored if "secure" is specified.
-          </desc>
+        <desc>
+          The UNIX-style access mode mask to create the directory with.
+          Whether/how all three access groups and associated access rights are
+          realized is guest OS dependent.  The API does the best it can on each
+          OS.
+
+          This parameter is ignore if the @a secure parameter is set to @c true.
+          <note>It is strongly recommended to use 0700.</note>
+        </desc>
       </param>
       <param name="path" type="wstring" dir="in">
-        <desc>The absolute path to create the temporary directory in.</desc>
+        <desc>The path to the directory in which the temporary directory should
+          be created. Guest path style.</desc>
       </param>
       <param name="secure" type="boolean" dir="in">
-        <desc>Whether to fail if the directory can not be securely created.
+        <desc>
+          Whether to fail if the directory can not be securely created.
           Currently this means that another unprivileged user cannot
           manipulate the path specified or remove the temporary directory
           after it has been created. Also causes the mode specified to be
-          ignored. May not be supported on all guest types.</desc>
+          ignored. May not be supported on all guest types.
+        </desc>
       </param>
       <param name="directory" type="wstring" dir="return">
-        <desc>On success this will contain the name of the directory created
-          with full path.</desc>
+        <desc>On success this will contain the full path to the created
+          directory. Guest path style.</desc>
       </param>
     </method>
@@ -11060,5 +11283,13 @@
       </desc>
       <param name="path" type="wstring" dir="in">
-        <desc>Directory to check existence for.</desc>
+        <desc>Path to the directory to check if exists. Guest path style.</desc>
+      </param>
+      <param name="followSymlinks" type="boolean" dir="in">
+        <desc>
+          If @c true, symbolic links in the final component will be followed
+          and the existance of the symlink target made the question for this method.
+          If @c false, a symbolic link in the final component will make the
+          method return @c false (because a symlink isn't a directory).
+         </desc>
       </param>
       <param name="exists" type="boolean" dir="return">
@@ -11069,6 +11300,9 @@
     <method name="directoryOpen">
       <desc>
-        Opens a directory and creates a <link to="IGuestDirectory"/> object that
-        can be used for further operations.
+        Opens a directory in the guest and creates a <link to="IGuestDirectory"/>
+        object that can be used for further operations.
+
+        <note>This method follows symbolic links by default at the moment, this
+          may change in the future.</note>
 
         <result name="VBOX_E_OBJECT_NOT_FOUND">
@@ -11080,11 +11314,12 @@
       </desc>
       <param name="path" type="wstring" dir="in">
-        <desc>Full path to file to open.</desc>
+        <desc>Path to the directory to open. Guest path style.</desc>
       </param>
       <param name="filter" type="wstring" dir="in">
-        <desc>Open filter to apply. This can include wildcards like ? and *.</desc>
+        <desc>Optional directory listing filter to apply.  This uses the DOS/NT
+          style wildcard characters '?' and '*'.</desc>
       </param>
       <param name="flags" type="DirectoryOpenFlag" dir="in" safearray="yes">
-        <desc>Open flags; see <link to="DirectoryOpenFlag"/> for more information.</desc>
+        <desc>Zero or more <link to="DirectoryOpenFlag"/> flags.</desc>
       </param>
       <param name="directory" type="IGuestDirectory" dir="return">
@@ -11093,41 +11328,43 @@
     </method>
 
-    <method name="directoryQueryInfo">
-      <desc>
-        Queries information about a directory in the guest.
-
-        <result name="VBOX_E_OBJECT_NOT_FOUND">
-          Directory to query information for was not found.
-        </result>
-        <result name="VBOX_E_IPRT_ERROR">
-          Error querying information.
-        </result>
+    <method name="directoryRemove">
+      <desc>
+        Removes a guest directory if empty.
+
+        <note>Symbolic links in the final component will not be followed,
+          instead an not-a-directory error is reported.</note>
       </desc>
       <param name="path" type="wstring" dir="in">
-        <desc>Directory to query information for.</desc>
-      </param>
-      <param name="info" type="IGuestFsObjInfo" dir="return">
-        <desc><link to="IGuestFsObjInfo"/> object containing the queried information.</desc>
-      </param>
-    </method>
-
-    <method name="directoryRemove">
-      <desc>
-        Removes a guest directory if not empty.
+        <desc>Path to the directory that should be removed. Guest path style.</desc>
+      </param>
+    </method>
+
+    <method name="directoryRemoveRecursive">
+      <desc>
+        Removes a guest directory recursively.
+
+<!--  Add this back when the warning can be removed:
+        Unless <link to="DirectoryRemoveRecFlag_ContentAndDir"/> or
+        <link to="DirectoryRemoveRecFlag_ContentOnly"/> is given, only the
+        directory structure is removed.  Which means it will fail if there are
+        directories which are not empty in the directory tree @a path points to.
+-->
+
+        <note> WARNING!! THE FLAGS ARE NOT CURRENTLY IMPLEMENTED.  THE IMPLEMENTATION
+          WORKS AS IF FLAGS WAS SET TO <link to="DirectoryRemoveRecFlag_ContentAndDir"/>.
+        </note>
+
+        <note>If the final path component is a symbolic link, this method will
+          fail as it can only be applied to directories.</note>
       </desc>
       <param name="path" type="wstring" dir="in">
-        <desc>Full path of directory to remove.</desc>
-      </param>
-    </method>
-
-    <method name="directoryRemoveRecursive">
-      <desc>
-        Removes a guest directory recursively.
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>Full path of directory to remove recursively.</desc>
+        <desc>Path of the directory that is to be removed recursively. Guest
+          path style.</desc>
       </param>
       <param name="flags" type="DirectoryRemoveRecFlag" dir="in" safearray="yes">
-        <desc>Remove flags; see <link to="DirectoryRemoveRecFlag"/> for more information.</desc>
+        <desc>Zero or more <link to="DirectoryRemoveRecFlag"/> flags.
+          <note>WARNING! SPECIFYING <link to="DirectoryRemoveRecFlag::ContentAndDir"/> IS
+             MANDATORY AT THE MOMENT!!</note>
+        </desc>
       </param>
       <param name="progress" type="IProgress" dir="return">
@@ -11137,34 +11374,5 @@
     </method>
 
-    <method name="directoryRename">
-      <desc>
-        Renames a directory in the guest.
-      </desc>
-      <param name="source" type="wstring" dir="in">
-        <desc>Source directory to rename.</desc>
-      </param>
-      <param name="dest" type="wstring" dir="in">
-        <desc>Destination directory to rename the source to.</desc>
-      </param>
-      <param name="flags" type="PathRenameFlag" dir="in" safearray="yes">
-        <desc>Rename flags; see <link to="PathRenameFlag"/> for more information.</desc>
-      </param>
-    </method>
-
-    <method name="directorySetACL">
-      <desc>
-        Sets the ACL (Access Control List) of a guest directory.
-
-        <result name="E_NOTIMPL">
-          The method is not implemented yet.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>Full path of directory to set the ACL for.</desc>
-      </param>
-      <param name="acl" type="wstring" dir="in">
-        <desc>Actual ACL string to set. Must comply with the guest OS.</desc>
-      </param>
-    </method>
+    <!-- Environment related methods.  -->
 
     <method name="environmentScheduleSet">
@@ -11239,4 +11447,86 @@
     </method>
 
+    <!-- File related methods. -->
+
+    <method name="fileCopy">
+      <desc>
+        Copies a file from one guest location to another.
+
+        <note>Will overwrite the destination file unless
+          <link to="FileCopyFlag::NoReplace"/> is specified.</note>
+
+        <result name="E_NOTIMPL">
+          Not yet implemented.
+        </result>
+      </desc>
+      <param name="source" type="wstring" dir="in">
+        <desc>The path to the file to copy (in the guest).  Guest path style.</desc>
+      </param>
+      <param name="destination" type="wstring" dir="in">
+        <desc>The path to the target file (in the guest).  This cannot be a
+          directory.  Guest path style.</desc>
+      </param>
+      <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+        <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+      </param>
+      <param name="progress" type="IProgress" dir="return">
+        <desc>Progress object to track the operation to completion.</desc>
+      </param>
+    </method>
+
+    <method name="fileCopyFromGuest">
+      <desc>
+        Copies a file from the guest to the host.
+
+        <note>Will overwrite the destination file unless
+          <link to="FileCopyFlag::NoReplace"/> is specified.</note>
+
+        <result name="VBOX_E_IPRT_ERROR">
+          Error starting the copy operation.
+        </result>
+      </desc>
+      <param name="source" type="wstring" dir="in">
+        <desc>Path to the file on the guest side that should be copied to the
+          host.  Guest path style.</desc>
+      </param>
+      <param name="destination" type="wstring" dir="in">
+        <desc>Where to put the file on the host (file, not directory). Host
+          path style.</desc>
+      </param>
+      <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+        <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+      </param>
+      <param name="progress" type="IProgress" dir="return">
+        <desc>Progress object to track the operation to completion.</desc>
+      </param>
+    </method>
+
+    <method name="fileCopyToGuest">
+      <desc>
+        Copies a file from the host to the guest.
+
+        <note>Will overwrite the destination file unless
+          <link to="FileCopyFlag::NoReplace"/> is specified.</note>
+
+        <result name="VBOX_E_IPRT_ERROR">
+          Error starting the copy operation.
+        </result>
+      </desc>
+      <param name="source" type="wstring" dir="in">
+        <desc>Path to the file on the host side that should be copied to the
+          guest.  Host path style.</desc>
+      </param>
+      <param name="destination" type="wstring" dir="in">
+        <desc>Where to put the file in the guest (file, not directory).  Guest
+          style path.</desc>
+      </param>
+      <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+        <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+      </param>
+      <param name="progress" type="IProgress" dir="return">
+        <desc>Progress object to track the operation to completion.</desc>
+      </param>
+    </method>
+
     <method name="fileCreateTemp">
       <desc>
@@ -11245,5 +11535,5 @@
         <result name="VBOX_E_NOT_SUPPORTED">
           The operation is not possible as requested on this particular
-          guest type.
+          guest OS.
         </result>
         <result name="E_INVALIDARG">
@@ -11265,10 +11555,17 @@
       </param>
       <param name="mode" type="unsigned long" dir="in">
-        <desc>The mode of the file to create. Use 0700 unless there are
-          reasons not to. This parameter is ignored if "secure" is specified.
-         </desc>
+        <desc>
+          The UNIX-style access mode mask to create the file with.
+          Whether/how all three access groups and associated access rights are
+          realized is guest OS dependent.  The API does the best it can on each
+          OS.
+
+          This parameter is ignore if the @a secure parameter is set to @c true.
+          <note>It is strongly recommended to use 0600.</note>
+        </desc>
       </param>
       <param name="path" type="wstring" dir="in">
-        <desc>The absolute path to create the temporary file in.</desc>
+        <desc>The path to the directory in which the temporary file should be
+          created.</desc>
       </param>
       <param name="secure" type="boolean" dir="in">
@@ -11288,5 +11585,5 @@
     <method name="fileExists">
       <desc>
-        Checks whether a file exists in the guest or not.
+        Checks whether a regular file exists in the guest or not.
 
         <result name="VBOX_E_IPRT_ERROR">
@@ -11295,5 +11592,153 @@
       </desc>
       <param name="path" type="wstring" dir="in">
-        <desc>File to check existence for.</desc>
+        <desc>Path to the alleged regular file.  Guest path style.</desc>
+      </param>
+      <param name="followSymlinks" type="boolean" dir="in">
+        <desc>
+          If @c true, symbolic links in the final component will be followed
+          and the existance of the symlink target made the question for this method.
+          If @c false, a symbolic link in the final component will make the
+          method return @c false (because a symlink isn't a regular file).
+         </desc>
+      </param>
+      <param name="exists" type="boolean" dir="return">
+        <desc>Returns @c true if the file exists, @c false if not.  @c false is
+          also return if this @a path does not point to a file object.</desc>
+      </param>
+    </method>
+
+    <method name="fileOpen">
+      <desc>
+        Opens a file and creates a <link to="IGuestFile"/> object that
+        can be used for further operations.
+
+        <result name="VBOX_E_OBJECT_NOT_FOUND">
+          File to open was not found.
+        </result>
+        <result name="VBOX_E_IPRT_ERROR">
+          Error while opening the file.
+        </result>
+      </desc>
+      <param name="path" type="wstring" dir="in">
+        <desc>Path to file to open.  Guest path style.</desc>
+      </param>
+      <param name="accessMode" type="FileAccessMode" dir="in">
+        <desc>The file access mode (read, write and/or append).
+          See <link to="FileAccessMode"/> for details.</desc>
+      </param>
+      <param name="openAction" type="FileOpenAction" dir="in">
+        <desc>What action to take depending on whether the file exists or not.
+          See <link to="FileOpenAction"/> for details.</desc>
+      </param>
+      <param name="creationMode" type="unsigned long" dir="in">
+        <desc>
+          The UNIX-style access mode mask to create the file with if @a openAction
+          requested the file to be created (otherwise ignored).  Whether/how all
+          three access groups and associated access rights are realized is guest
+          OS dependent.  The API does the best it can on each OS.
+        </desc>
+      </param>
+      <param name="file" type="IGuestFile" dir="return">
+        <desc><link to="IGuestFile"/> object representing the opened file.</desc>
+      </param>
+    </method>
+
+    <method name="fileOpenEx">
+      <desc>
+        Opens a file and creates a <link to="IGuestFile"/> object that
+        can be used for further operations, extended version.
+
+        <result name="VBOX_E_OBJECT_NOT_FOUND">
+          File to open was not found.
+        </result>
+        <result name="VBOX_E_IPRT_ERROR">
+          Error while opening the file.
+        </result>
+      </desc>
+      <param name="path" type="wstring" dir="in">
+        <desc>Path to file to open.  Guest path style.</desc>
+      </param>
+      <param name="accessMode" type="FileAccessMode" dir="in">
+        <desc>The file access mode (read, write and/or append).
+          See <link to="FileAccessMode"/> for details.</desc>
+      </param>
+      <param name="openAction" type="FileOpenAction" dir="in">
+        <desc>What action to take depending on whether the file exists or not.
+          See <link to="FileOpenAction"/> for details.</desc>
+      </param>
+      <param name="sharingMode" type="FileSharingMode" dir="in">
+        <desc>The file sharing mode in the guest. This parameter is currently
+          ignore for all guest OSes.  It will in the future be implemented for
+          Windows, OS/2 and maybe Solaris guests only, the others will ignore it.
+          Use <link to="FileSharingMode::All"/>.
+        </desc>
+      </param>
+      <param name="creationMode" type="unsigned long" dir="in">
+        <desc>
+          The UNIX-style access mode mask to create the file with if @a openAction
+          requested the file to be created (otherwise ignored).  Whether/how all
+          three access groups and associated access rights are realized is guest
+          OS dependent.  The API does the best it can on each OS.
+        </desc>
+      </param>
+<!-- r=bird: Use case for the 'offset' parameter, please? I see no possible rational, especially with readAt/writeAt/seek handy.
+             Or is this an alternative way of doing "append" accessMode?  Anyway, it's pretty harmless... -->
+      <param name="offset" type="long long" dir="in">
+        <desc>The initial read/write offset (in bytes).</desc>
+      </param>
+      <param name="file" type="IGuestFile" dir="return">
+        <desc><link to="IGuestFile"/> object representing the opened file.</desc>
+      </param>
+    </method>
+
+    <method name="fileQuerySize">
+      <desc>
+        Queries the size of a regular file in the guest.
+
+        <result name="VBOX_E_OBJECT_NOT_FOUND">
+          File to was not found.
+        </result>
+        <result name="VBOX_E_IPRT_ERROR">
+          Error querying file size.
+        </result>
+      </desc>
+      <param name="path" type="wstring" dir="in">
+        <desc>Path to the file which size is requested.  Guest path style.</desc>
+      </param>
+      <param name="followSymlinks" type="boolean" dir="in">
+        <desc>
+           It @c true, symbolic links in the final path component will be
+           followed to their target, and the size of the target is returned.
+           If @c false, symbolic links in the final path component will make
+           the method call fail (symblink is not a regular file).
+         </desc>
+      </param>
+      <param name="size" type="long long" dir="return">
+        <desc>Queried file size.</desc>
+      </param>
+    </method>
+
+    <!-- File System Object Level -->
+
+    <method name="fsObjExists">
+      <desc>
+        Checks whether a file system object (file, directory, etc) exists in
+        the guest or not.
+
+        <result name="VBOX_E_IPRT_ERROR">
+          Error while checking existence of the file specified.
+        </result>
+      </desc>
+      <param name="path" type="wstring" dir="in">
+        <desc>Path to the file system object to check the existance of.  Guest
+          path style.</desc>
+      </param>
+      <param name="followSymlinks" type="boolean" dir="in">
+        <desc>
+           If @c true, symbolic links in the final component will be followed
+           and the method will instead check if the target exists.
+           If @c false, symbolic links in the final component will satisfy the
+           method and it will return @c true in @a exists.
+         </desc>
       </param>
       <param name="exists" type="boolean" dir="return">
@@ -11302,221 +11747,5 @@
     </method>
 
-    <method name="fileRemove">
-      <desc>
-        Removes a single file in the guest.
-
-        <result name="VBOX_E_OBJECT_NOT_FOUND">
-          File to remove was not found.
-        </result>
-        <result name="VBOX_E_IPRT_ERROR">
-          Error while removing the file.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>Path to the file to remove.</desc>
-      </param>
-    </method>
-
-    <method name="fileOpen">
-      <desc>
-        Opens a file and creates a <link to="IGuestFile"/> object that
-        can be used for further operations.
-
-        <result name="VBOX_E_OBJECT_NOT_FOUND">
-          File to open was not found.
-        </result>
-        <result name="VBOX_E_IPRT_ERROR">
-          Error while opening the file.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>Full path to file to open.</desc>
-      </param>
-      <param name="openMode" type="wstring" dir="in">
-        <desc>The file opening mode. This describes the wanted access to a file, whereas
-          the parameter must be one of the following:
-          <ul>
-            <li><tt>"r"</tt>: Opens a file for reading.</li>
-            <li><tt>"r+"</tt>: Opens a file for reading and writing.</li>
-            <li><tt>"w"</tt>: Opens a file for writing.</li>
-            <li><tt>"w+"</tt>: Opens a file for writing and reading.</li>
-          </ul>
-        </desc>
-      </param>
-      <param name="disposition" type="wstring" dir="in">
-        <desc>The file disposition. This describes the action to take in case a
-          file exists or does not exist, whereas the parameter must be one of the
-          following:
-          <ul>
-            <li><tt>"ca"</tt>: Creates a new file, always. Overwrites an existing file.</li>
-            <li><tt>"ce"</tt>: Creates a new file if it does not exist. Fail if exist.</li>
-            <li><tt>"oa"</tt>: Opens an existing file and places the file pointer at the
-              end of the file, if opened with write access. Create the file if it does not exist.</li>
-            <li><tt>"oc"</tt>: Opens an existing file or create it if it does not exist.</li>
-            <li><tt>"oe"</tt>: Opens an existing file or fail if it does not exist.</li>
-            <li><tt>"ot"</tt>: Opens and truncate an existing file or fail if it does not exist.</li>
-          </ul>
-        </desc>
-      </param>
-      <param name="creationMode" type="unsigned long" dir="in">
-        <desc>The mode to create the file with. Must be a three-digit octal number which
-          represents the access rights for the file.</desc>
-      </param>
-      <param name="file" type="IGuestFile" dir="return">
-        <desc><link to="IGuestFile"/> object representing the opened file.</desc>
-      </param>
-    </method>
-
-    <method name="fileOpenEx">
-      <desc>
-        Opens a file and creates a <link to="IGuestFile"/> object that
-        can be used for further operations, extended version.
-
-        <result name="VBOX_E_OBJECT_NOT_FOUND">
-          File to open was not found.
-        </result>
-        <result name="VBOX_E_IPRT_ERROR">
-          Error while opening the file.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>Full path to file to open.</desc>
-      </param>
-      <param name="openMode" type="wstring" dir="in">
-        <desc>The file opening mode. This describes the wanted access to a file, whereas
-          the parameter must be one of the following:
-          <ul>
-            <li><tt>"r"</tt>: Opens a file for reading.</li>
-            <li><tt>"r+"</tt>: Opens a file for reading and writing.</li>
-            <li><tt>"w"</tt>: Opens a file for writing.</li>
-            <li><tt>"w+"</tt>: Opens a file for writing and reading.</li>
-          </ul>
-        </desc>
-      </param>
-      <param name="disposition" type="wstring" dir="in">
-        <desc>The file disposition. This describes the action to take in case a
-          file exists or does not exist, whereas the parameter must be one of the
-          following:
-          <ul>
-            <li><tt>"ca"</tt>: Creates a new file, always. Overwrites an existing file.</li>
-            <li><tt>"ce"</tt>: Creates a new file if it does not exist. Fail if exist.</li>
-            <li><tt>"oa"</tt>: Opens an existing file and places the file pointer at the
-              end of the file, if opened with write access. Create the file if it does not exist.</li>
-            <li><tt>"oc"</tt>: Opens an existing file or create it if it does not exist.</li>
-            <li><tt>"oe"</tt>: Opens an existing file or fail if it does not exist.</li>
-            <li><tt>"ot"</tt>: Opens and truncate an existing file or fail if it does not exist.</li>
-          </ul>
-        </desc>
-      </param>
-      <param name="sharingMode" type="wstring" dir="in">
-        <desc>The file sharing mode in the guest. This parameter
-          is not implemented yet. Pass an empty string here.</desc>
-      </param>
-      <param name="creationMode" type="unsigned long" dir="in">
-        <desc>The mode to create the file with. Must be a three-digit octal number which
-          represents the access rights for the file.</desc>
-      </param>
-      <param name="offset" type="long long" dir="in">
-        <desc>The initial read/write offset (in bytes).</desc>
-      </param>
-      <param name="file" type="IGuestFile" dir="return">
-        <desc><link to="IGuestFile"/> object representing the opened file.</desc>
-      </param>
-    </method>
-
-    <method name="fileQueryInfo">
-      <desc>
-        Queries information about a file in the guest.
-
-        <result name="VBOX_E_OBJECT_NOT_FOUND">
-          File to query information for was not found.
-        </result>
-        <result name="VBOX_E_IPRT_ERROR">
-          Error querying information.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>File to query information for.</desc>
-      </param>
-      <param name="info" type="IGuestFsObjInfo" dir="return">
-        <desc><link to="IGuestFsObjInfo"/> object containing the queried information.</desc>
-      </param>
-    </method>
-
-    <method name="fileQuerySize">
-      <desc>
-        Queries the size of a file in the guest.
-
-        <result name="VBOX_E_OBJECT_NOT_FOUND">
-          File to rename was not found.
-        </result>
-        <result name="VBOX_E_IPRT_ERROR">
-          Error querying file size.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>File to query the size for.</desc>
-      </param>
-      <param name="size" type="long long" dir="return">
-        <desc>Queried file size.</desc>
-      </param>
-    </method>
-
-    <method name="fileRename">
-      <desc>
-        Renames a file in the guest.
-      </desc>
-      <param name="source" type="wstring" dir="in">
-        <desc>Source file to rename.</desc>
-      </param>
-      <param name="dest" type="wstring" dir="in">
-        <desc>Destination file to rename the source to.</desc>
-      </param>
-      <param name="flags" type="PathRenameFlag" dir="in" safearray="yes">
-        <desc>Rename flags; see <link to="PathRenameFlag"/> for more information.</desc>
-      </param>
-    </method>
-
-    <method name="fileSetACL">
-      <desc>
-        Sets the ACL (Access Control List) of a file in the guest.
-
-        <result name="E_NOTIMPL">
-          The method is not implemented yet.
-        </result>
-      </desc>
-      <param name="file" type="wstring" dir="in">
-        <desc>Full path of file to set the ACL for.</desc>
-      </param>
-      <param name="acl" type="wstring" dir="in">
-        <desc>Actual ACL string to set. Must comply with the guest OS.</desc>
-      </param>
-    </method>
-
-    <method name="fsExists">
-      <desc>
-        Checks whether a file system object (file, directory, etc) exists in
-        the guest or not.
-
-        <result name="VBOX_E_IPRT_ERROR">
-          Error while checking existence of the file specified.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>Path to the file system object to check the existance of.</desc>
-      </param>
-      <param name="followSymlinks" type="boolean" dir="in">
-        <desc>
-           If @c true symbolic links will be followed and the target must
-           exists and be accessible, otherwise, if @c false we'll be happy
-           with a dangling symbolic link.
-         </desc>
-      </param>
-      <param name="exists" type="boolean" dir="return">
-        <desc>Returns @c true if the file exists, @c false if not.</desc>
-      </param>
-    </method>
-
-    <method name="fsQueryInfo">
+    <method name="fsObjQueryInfo">
       <desc>
         Queries information about a file system object (file, directory, etc)
@@ -11531,5 +11760,6 @@
       </desc>
       <param name="path" type="wstring" dir="in">
-        <desc>Path to the file system object to gather information about</desc>
+        <desc>Path to the file system object to gather information about.
+          Guest path style.</desc>
       </param>
       <param name="followSymlinks" type="boolean" dir="in">
@@ -11544,4 +11774,112 @@
       </param>
     </method>
+
+    <method name="fsObjRemove">
+      <desc>
+        Removes a file system object (file, symlink, etc) in the guest.  Will
+        not work on directories, use <link to="IGuestSession::directoryRemove"/>
+        to remove directories.
+
+        <note>This method will remove symbolic links in the final path
+          component, not follow them.</note>
+
+        <result name="E_NOTIMPL">
+          The method has not been implemented yet.
+        </result>
+        <result name="VBOX_E_OBJECT_NOT_FOUND">
+          The file system object was not found.
+        </result>
+        <result name="VBOX_E_IPRT_ERROR">
+          For most other errors. We know this is unhelpful, will fix shortly...
+        </result>
+      </desc>
+      <param name="path" type="wstring" dir="in">
+        <desc>Path to the file system object to remove.  Guest style path.</desc>
+      </param>
+    </method>
+
+    <method name="fsObjRename">
+      <desc>
+        Renames a file system object (file, directory, symlink, etc) in the
+        guest.
+
+        <result name="VBOX_E_OBJECT_NOT_FOUND">
+          The file system object was not found.
+        </result>
+        <result name="VBOX_E_IPRT_ERROR">
+          For most other errors. We know this is unhelpful, will fix shortly...
+        </result>
+      </desc>
+      <param name="oldPath" type="wstring" dir="in">
+        <desc>The current path to the object.  Guest path style.</desc>
+      </param>
+      <param name="newPath" type="wstring" dir="in">
+        <desc>The new path to the object.  Guest path style.</desc>
+      </param>
+      <param name="flags" type="FsObjRenameFlag" dir="in" safearray="yes">
+        <desc>Zero or more <link to="FsObjRenameFlag"/> values.</desc>
+      </param>
+    </method>
+
+    <method name="fsObjMove">
+      <desc>
+        Moves a file system object (file, directory, symlink, etc) from one
+        guest location to another.
+
+        This differs from <link to="IGuestSession::fsObjRename"/> in that it
+        can move accross file system boundraries.  In that case it will
+        perform a copy and then delete the original.  For directories, this
+        can take a while and is subject to races.
+
+        <result name="E_NOTIMPL">
+          Not yet implemented.
+        </result>
+      </desc>
+      <param name="source" type="wstring" dir="in">
+        <desc>Path to the file to move.  Guest path style.</desc>
+      </param>
+      <param name="destination" type="wstring" dir="in">
+        <desc>Where to move the file to (file, not directory).  Guest path
+          style.</desc>
+      </param>
+      <param name="flags" type="FsObjMoveFlags" dir="in" safearray="yes">
+        <desc>Zero or more <link to="FsObjMoveFlags"/> values.</desc>
+      </param>
+      <param name="progress" type="IProgress" dir="return">
+        <desc>Progress object to track the operation to completion.</desc>
+      </param>
+    </method>
+
+    <method name="fsObjSetACL">
+      <desc>
+        Sets the access control list (ACL) of a file system object (file,
+        directory, etc) in the guest.
+
+        <result name="E_NOTIMPL">
+          The method is not implemented yet.
+        </result>
+      </desc>
+      <param name="path" type="wstring" dir="in">
+        <desc>Full path of the file system object which ACL to set</desc>
+      </param>
+      <param name="followSymlinks" type="boolean" dir="in">
+        <desc>
+          If @c true symbolic links in the final component will be followed,
+          otherwise, if @c false, the method will work directly on a symbolic
+          link in the final component.
+         </desc>
+      </param>
+      <param name="acl" type="wstring" dir="in">
+        <desc>The ACL specification string. To-be-defined.</desc>
+      </param>
+      <param name="mode" type="unsigned long" dir="in">
+        <desc>UNIX-style mode mask to use if @a acl is empty. As mention in
+          <link to="IGuestSession::directoryCreate"/> this is realized on
+          a best effort basis and the exact behavior depends on the Guest OS.
+        </desc>
+      </param>
+    </method>
+
+    <!-- Process methods -->
 
     <method name="processCreate">
@@ -11708,4 +12046,6 @@
     </method>
 
+    <!-- Symbolic link methods -->
+
     <method name="symlinkCreate">
       <desc>
@@ -11716,14 +12056,19 @@
         </result>
       </desc>
-      <param name="source" type="wstring" dir="in">
-        <desc>The name of the symbolic link.</desc>
+      <param name="symlink" type="wstring" dir="in">
+        <desc>Path to the symbolic link that should be created.  Guest path
+          style.</desc>
       </param>
       <param name="target" type="wstring" dir="in">
-        <desc>The path to the symbolic link target.</desc>
+        <desc>
+          The path to the symbolic link target.  If not an absolute, this will
+          be relative to the @a symlink location at access time.  Guest path
+          style.
+        </desc>
       </param>
       <param name="type" type="SymlinkType" dir="in">
         <desc>
-          The symbolic link type;
-          see <link to="SymlinkReadFlag"/> for more information.
+          The symbolic link type (mainly for Windows). See <link to="SymlinkType"/>
+          for more information.
         </desc>
       </param>
@@ -11739,8 +12084,13 @@
       </desc>
       <param name="symlink" type="wstring" dir="in">
-        <desc>Symbolic link to check existence for.</desc>
+        <desc>Path to the alleged symbolic link.  Guest path style.</desc>
       </param>
       <param name="exists" type="boolean" dir="return">
-        <desc>Returns @c true if the symbolic link exists, @c false if not.</desc>
+        <desc>
+          Returns @c true if the symbolic link exists.  Returns @c false if it
+          does not exist, if the file system object identified by the path is
+          not a symbolic link, or if the object type is inaccessible to the
+          user, or if the @a symlink argument is empty.
+        </desc>
       </param>
     </method>
@@ -11748,5 +12098,5 @@
     <method name="symlinkRead">
       <desc>
-        Reads a symbolic link in the guest.
+        Reads the target value of a symbolic link in the guest.
 
         <result name="E_NOTIMPL">
@@ -11755,43 +12105,15 @@
       </desc>
       <param name="symlink" type="wstring" dir="in">
-        <desc>Full path to symbolic link to read.</desc>
+        <desc>Path to the symbolic link to read.</desc>
       </param>
       <param name="flags" type="SymlinkReadFlag" dir="in" safearray="yes">
-        <desc>
-          Read flags; see <link to="SymlinkReadFlag"/> for more information.
-        </desc>
+        <desc>Zero or more <link to="SymlinkReadFlag"/> values.</desc>
       </param>
       <param name="target" type="wstring" dir="return">
-        <desc>
-          Target of the symbolic link pointing to, if found.
-        </desc>
-      </param>
-    </method>
-
-    <method name="symlinkRemoveDirectory">
-      <desc>
-        Removes a symbolic link in the guest if it's a directory.
-
-        <result name="E_NOTIMPL">
-          The method is not implemented yet.
-        </result>
-      </desc>
-      <param name="path" type="wstring" dir="in">
-        <desc>Symbolic link to remove.</desc>
-      </param>
-    </method>
-
-    <method name="symlinkRemoveFile">
-      <desc>
-        Removes a symbolic link in the guest if it's a file.
-
-        <result name="E_NOTIMPL">
-          The method is not implemented yet.
-        </result>
-      </desc>
-      <param name="file" type="wstring" dir="in">
-        <desc>Symbolic link to remove.</desc>
-      </param>
-    </method>
+        <desc>Target value of the symbolic link.  Guest path style.</desc>
+      </param>
+    </method>
+
+    <!-- Session wait methods -->
 
     <method name="waitFor">
@@ -12057,13 +12379,9 @@
 
     <attribute name="directoryName" type="wstring" readonly="yes">
-      <desc>
-        Full path of directory.
-      </desc>
+      <desc>The path specified when opening the directory.</desc>
     </attribute>
 
     <attribute name="filter" type="wstring" readonly="yes">
-      <desc>
-        The open filter.
-      </desc>
+      <desc>Directory listing filter to (specified when opening the directory).</desc>
     </attribute>
 
@@ -12087,4 +12405,9 @@
       </param>
     </method>
+
+    <!-- Would be useful to add queryInfo() and setACL() here later, but at
+         present IPRT isn't doing a race free job with the former and doesn't
+         have the latter.  So, let it be for now. -->
+
   </interface>
 
@@ -12103,5 +12426,5 @@
   <interface
     name="IFile" extends="$unknown"
-    uuid="5ec56ea3-b55d-4bdb-8c4f-5f9fb26b894b"
+    uuid="540804bf-4ca6-dd43-800c-bfb9765f96fe"
     wsmap="managed"
     >
@@ -12109,48 +12432,57 @@
       Abstract parent interface for files handled by VirtualBox.
     </desc>
+
+    <attribute name="eventSource" type="IEventSource" readonly="yes">
+      <desc>
+        Event source for file events.
+      </desc>
+    </attribute>
+    <attribute name="id" type="unsigned long" readonly="yes">
+      <desc>
+        The ID VirtualBox internally assigned to the open file.
+      </desc>
+    </attribute>
+    <attribute name="initialSize" type="long long" readonly="yes">
+      <desc>
+        The initial size in bytes when opened.
+      </desc>
+    </attribute>
+    <attribute name="offset" type="long long" readonly="yes">
+      <desc>
+        The current file position.
+
+        The file current position always applies to the <link to="IFile::read"/>
+        method, which updates it upon return.  Same goes for the <link to="IFile::write"/>
+        method except when <link to="IFile::accessMode"/> is <link to="FileAccessMode::AppendOnly"/>
+        or <link to="FileAccessMode::AppendRead"/>, where it will always write
+        to the end of the file and will leave this attribute unchanged.
+
+        The <link to="IFile::seek"/> is used to change this attribute without
+        transfering any file data like read and write does.
+      </desc>
+    </attribute>
+    <attribute name="status" type="FileStatus" readonly="yes">
+      <desc>
+        Current file status.
+      </desc>
+    </attribute>
+
+    <!-- The following attributes just remembers the fileOpen parameters for you.
+         Nice for introspection and probably doesn't cost us much. -->
+    <attribute name="fileName" type="wstring" readonly="yes">
+      <desc>Full path of the actual file name of this file.
+        <!-- r=bird: The 'actual' file name is too tough, we cannot guarentee
+                     that on unix guests.  Seeing how IGuestDirectory did things,
+                     I'm questioning the 'Full path' part too.   Not urgent to check. -->
+      </desc>
+    </attribute>
     <attribute name="creationMode" type="unsigned long" readonly="yes">
-      <desc>
-        The creation mode.
-      </desc>
-    </attribute>
-    <attribute name="disposition" type="wstring" readonly="yes">
-      <desc>
-        The disposition mode.
-      </desc>
-    </attribute>
-    <attribute name="eventSource" type="IEventSource" readonly="yes">
-      <desc>
-        Event source for file events.
-      </desc>
-    </attribute>
-    <attribute name="fileName" type="wstring" readonly="yes">
-      <desc>
-        Full path of the actual file name of this file.
-      </desc>
-    </attribute>
-    <attribute name="id" type="unsigned long" readonly="yes">
-      <desc>
-        The file's ID.
-      </desc>
-    </attribute>
-    <attribute name="initialSize" type="long long" readonly="yes">
-      <desc>
-        The initial size in bytes when opened.
-      </desc>
-    </attribute>
-    <attribute name="openMode" type="wstring" readonly="yes">
-      <desc>
-        The open mode.
-      </desc>
-    </attribute>
-    <attribute name="offset" type="long long" readonly="yes">
-      <desc>
-        Current read/write offset in bytes.
-      </desc>
-    </attribute>
-    <attribute name="status" type="FileStatus" readonly="yes">
-      <desc>
-        Current file status.
-      </desc>
+      <desc>The UNIX-style creation mode specified when opening the file.</desc>
+    </attribute>
+    <attribute name="openAction" type="FileOpenAction" readonly="yes">
+      <desc>The opening action specified when opening the file.</desc>
+    </attribute>
+    <attribute name="accessMode" type="FileAccessMode" readonly="yes">
+      <desc>The file access mode.</desc>
     </attribute>
 
@@ -12176,7 +12508,11 @@
     </method>
 
-    <method name="read">
-      <desc>
-        Reads data from this file.
+    <method name="querySize">
+      <!-- Can also be gotten via seek(Current, 0), but this is easier to us.
+           This is a query method both to match IGuestSession::fileQuerySize to
+           highlight that it is a value that is not cacheable as others may be
+           changing the file concurrently (image reading /var/log/messages). -->
+      <desc>
+        Queries the current file size.
 
         <result name="E_NOTIMPL">
@@ -12184,4 +12520,17 @@
         </result>
       </desc>
+      <param name="size" type="long long" dir="return">
+        <desc>Queried file size.</desc>
+      </param>
+    </method>
+
+    <method name="read">
+      <desc>
+        Reads data from this file.
+
+        <result name="E_NOTIMPL">
+          The method is not implemented yet.
+        </result>
+      </desc>
       <param name="toRead" type="unsigned long" dir="in">
         <desc>Number of bytes to read.</desc>
@@ -12225,5 +12574,27 @@
     <method name="seek">
       <desc>
-        Changes the read and write position of this file.
+        Changes the current file position of this file.
+
+        The file current position always applies to the <link to="IFile::read"/>
+        method.  Same for the <link to="IFile::write"/> method it except when
+        the <link to="IFile::accessMode"/> is <link to="FileAccessMode::AppendOnly"/>
+        or <link to="FileAccessMode::AppendRead"/>.
+      </desc>
+      <param name="offset" type="long long" dir="in">
+        <desc>Offset to seek relative to the position specified by @a whence.</desc>
+      </param>
+      <param name="whence" type="FileSeekOrigin" dir="in">
+        <desc>
+          One of the <link to="FileSeekOrigin"/> seek starting points.
+        </desc>
+      </param>
+      <param name="newOffset" type="long long" dir="return">
+        <desc>The new file offset after the seek operation.</desc>
+      </param>
+    </method>
+
+    <method name="setACL">
+      <desc>
+        Sets the ACL of this file.
 
         <result name="E_NOTIMPL">
@@ -12231,17 +12602,18 @@
         </result>
       </desc>
-      <param name="offset" type="long long" dir="in">
-        <desc>Offset to seek.</desc>
-      </param>
-      <param name="whence" type="FileSeekType" dir="in">
-        <desc>
-          Seek mode; see <link to="FileSeekType"/> for more information.
-        </desc>
-      </param>
-    </method>
-
-    <method name="setACL">
-      <desc>
-        Sets the ACL of this file.
+      <param name="acl" type="wstring" dir="in">
+        <desc>The ACL specification string. To-be-defined.</desc>
+      </param>
+      <param name="mode" type="unsigned long" dir="in">
+        <desc>UNIX-style mode mask to use if @a acl is empty. As mention in
+          <link to="IGuestSession::directoryCreate"/> this is realized on
+          a best effort basis and the exact behavior depends on the Guest OS.
+        </desc>
+      </param>
+    </method>
+
+    <method name="setSize">
+      <desc>
+        Changes the file size.
 
         <result name="E_NOTIMPL">
@@ -12249,6 +12621,6 @@
         </result>
       </desc>
-      <param name="acl" type="wstring" dir="in">
-        <desc>ACL string to set.</desc>
+      <param name="size" type="long long" dir="in">
+        <desc>The new file size.</desc>
       </param>
     </method>
@@ -12307,5 +12679,5 @@
   <interface
     name="IGuestFile" extends="IFile"
-    uuid="b68f642c-49db-d699-db5c-bcb01c08e95f"
+    uuid="92f21dc0-44de-1653-b717-2ebf0ca9b664"
     wsmap="managed"
     >
Index: /trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h
===================================================================
--- /trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h	(revision 55630)
+++ /trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h	(revision 55631)
@@ -599,11 +599,14 @@
     /** The filename. */
     Utf8Str                 mFileName;
-    /** Then file's opening mode. */
-    Utf8Str                 mOpenMode;
-    /** The file's disposition mode. */
-    Utf8Str                 mDisposition;
-    /** The file's sharing mode.
-     **@todo Not implemented yet.*/
-    Utf8Str                 mSharingMode;
+    /** The file access mode. */
+    FileAccessMode_T        mAccessMode;
+    /** String translation of mFileAccessMode for the GAs. */
+    const char             *mpszAccessMode;
+    /** The file open action.  */
+    FileOpenAction_T        mOpenAction;
+    /** String translation of mOpenAction for the GAs. */
+    const char             *mpszOpenAction;
+    /** The file sharing mode. */
+    FileSharingMode_T       mSharingMode;
     /** Octal creation mode. */
     uint32_t                mCreationMode;
Index: /trunk/src/VBox/Main/include/GuestFileImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/GuestFileImpl.h	(revision 55630)
+++ /trunk/src/VBox/Main/include/GuestFileImpl.h	(revision 55631)
@@ -72,21 +72,22 @@
 private:
 
-    /** Wrapped @name IGuestFile properties.
+    /** @name Wrapped IGuestFile properties.
      * @{ */
     HRESULT getCreationMode(ULONG *aCreationMode);
-    HRESULT getDisposition(com::Utf8Str &aDisposition);
     HRESULT getEventSource(ComPtr<IEventSource> &aEventSource);
-    HRESULT getFileName(com::Utf8Str &aFileName);
     HRESULT getId(ULONG *aId);
     HRESULT getInitialSize(LONG64 *aInitialSize);
-    HRESULT getOpenMode(com::Utf8Str &aOpenMode);
     HRESULT getOffset(LONG64 *aOffset);
     HRESULT getStatus(FileStatus_T *aStatus);
+    HRESULT getFileName(com::Utf8Str &aFileName);
+    HRESULT getAccessMode(FileAccessMode_T *aAccessMode);
+    HRESULT getOpenAction(FileOpenAction_T *aOpenAction);
     /** @}  */
 
-    /** Wrapped @name IGuestFile methods.
+    /** @name Wrapped IGuestFile methods.
      * @{ */
     HRESULT close();
     HRESULT queryInfo(ComPtr<IFsObjInfo> &aObjInfo);
+    HRESULT querySize(LONG64 *aSize);
     HRESULT read(ULONG aToRead,
                  ULONG aTimeoutMS,
@@ -97,6 +98,9 @@
                    std::vector<BYTE> &aData);
     HRESULT seek(LONG64 aOffset,
-                 FileSeekType_T aWhence);
-    HRESULT setACL(const com::Utf8Str &aAcl);
+                 FileSeekOrigin_T aWhence,
+                 LONG64 *aNewOffset);
+    HRESULT setACL(const com::Utf8Str &aAcl,
+                   ULONG aMode);
+    HRESULT setSize(LONG64 aSize);
     HRESULT write(const std::vector<BYTE> &aData,
                   ULONG aTimeoutMS,
Index: /trunk/src/VBox/Main/include/GuestSessionImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/GuestSessionImpl.h	(revision 55630)
+++ /trunk/src/VBox/Main/include/GuestSessionImpl.h	(revision 55631)
@@ -273,4 +273,6 @@
     HRESULT getProcesses(std::vector<ComPtr<IGuestProcess> > &aProcesses);
     HRESULT getPathStyle(PathStyle_T *aPathStyle);
+    HRESULT getCurrentDirectory(com::Utf8Str &aCurrentDirectory);
+    HRESULT setCurrentDirectory(const com::Utf8Str &aCurrentDirectory);
     HRESULT getDirectories(std::vector<ComPtr<IGuestDirectory> > &aDirectories);
     HRESULT getFiles(std::vector<ComPtr<IGuestFile> > &aFiles);
@@ -281,12 +283,17 @@
      * @{ */
     HRESULT close();
-    HRESULT copyFrom(const com::Utf8Str &aSource,
-                     const com::Utf8Str &aDest,
-                     const std::vector<CopyFileFlag_T> &aFlags,
-                     ComPtr<IProgress> &aProgress);
-    HRESULT copyTo(const com::Utf8Str &aSource,
-                   const com::Utf8Str &aDest,
-                   const std::vector<CopyFileFlag_T> &aFlags,
-                   ComPtr<IProgress> &aProgress);
+
+    HRESULT directoryCopy(const com::Utf8Str &aSource,
+                          const com::Utf8Str &aDestination,
+                          const std::vector<DirectoryCopyFlags_T> &aFlags,
+                          ComPtr<IProgress> &aProgress);
+    HRESULT directoryCopyFromGuest(const com::Utf8Str &aSource,
+                                   const com::Utf8Str &aDestination,
+                                   const std::vector<DirectoryCopyFlags_T> &aFlags,
+                                   ComPtr<IProgress> &aProgress);
+    HRESULT directoryCopyToGuest(const com::Utf8Str &aSource,
+                                 const com::Utf8Str &aDestination,
+                                 const std::vector<DirectoryCopyFlags_T> &aFlags,
+                                 ComPtr<IProgress> &aProgress);
     HRESULT directoryCreate(const com::Utf8Str &aPath,
                             ULONG aMode,
@@ -298,4 +305,5 @@
                                 com::Utf8Str &aDirectory);
     HRESULT directoryExists(const com::Utf8Str &aPath,
+                            BOOL aFollowSymlinks,
                             BOOL *aExists);
     HRESULT directoryOpen(const com::Utf8Str &aPath,
@@ -303,15 +311,8 @@
                           const std::vector<DirectoryOpenFlag_T> &aFlags,
                           ComPtr<IGuestDirectory> &aDirectory);
-    HRESULT directoryQueryInfo(const com::Utf8Str &aPath,
-                               ComPtr<IGuestFsObjInfo> &aInfo);
     HRESULT directoryRemove(const com::Utf8Str &aPath);
     HRESULT directoryRemoveRecursive(const com::Utf8Str &aPath,
                                      const std::vector<DirectoryRemoveRecFlag_T> &aFlags,
                                      ComPtr<IProgress> &aProgress);
-    HRESULT directoryRename(const com::Utf8Str &aSource,
-                            const com::Utf8Str &aDest,
-                            const std::vector<PathRenameFlag_T> &aFlags);
-    HRESULT directorySetACL(const com::Utf8Str &aPath,
-                             const com::Utf8Str &aAcl);
     HRESULT environmentScheduleSet(const com::Utf8Str &aName,
                                    const com::Utf8Str &aValue);
@@ -321,4 +322,17 @@
     HRESULT environmentDoesBaseVariableExist(const com::Utf8Str &aName,
                                              BOOL *aExists);
+
+    HRESULT fileCopy(const com::Utf8Str &aSource,
+                     const com::Utf8Str &aDestination,
+                     const std::vector<FileCopyFlag_T> &aFlags,
+                     ComPtr<IProgress> &aProgress);
+    HRESULT fileCopyToGuest(const com::Utf8Str &aSource,
+                            const com::Utf8Str &aDestination,
+                            const std::vector<FileCopyFlag_T> &aFlags,
+                            ComPtr<IProgress> &aProgress);
+    HRESULT fileCopyFromGuest(const com::Utf8Str &aSource,
+                              const com::Utf8Str &aDestination,
+                              const std::vector<FileCopyFlag_T> &aFlags,
+                              ComPtr<IProgress> &aProgress);
     HRESULT fileCreateTemp(const com::Utf8Str &aTemplateName,
                            ULONG aMode,
@@ -327,33 +341,39 @@
                            ComPtr<IGuestFile> &aFile);
     HRESULT fileExists(const com::Utf8Str &aPath,
+                       BOOL aFollowSymlinks,
                        BOOL *aExists);
-    HRESULT fileRemove(const com::Utf8Str &aPath);
     HRESULT fileOpen(const com::Utf8Str &aPath,
-                     const com::Utf8Str &aOpenMode,
-                     const com::Utf8Str &aDisposition,
+                     FileAccessMode_T aAccessMode,
+                     FileOpenAction_T aOpenAction,
                      ULONG aCreationMode,
                      ComPtr<IGuestFile> &aFile);
     HRESULT fileOpenEx(const com::Utf8Str &aPath,
-                       const com::Utf8Str &aOpenMode,
-                       const com::Utf8Str &aDisposition,
-                       const com::Utf8Str &aSharingMode,
+                       FileAccessMode_T aAccessMode,
+                       FileOpenAction_T aOpenAction,
+                       FileSharingMode_T aSharingMode,
                        ULONG aCreationMode,
                        LONG64 aOffset,
                        ComPtr<IGuestFile> &aFile);
-    HRESULT fileQueryInfo(const com::Utf8Str &aPath,
-                          ComPtr<IGuestFsObjInfo> &aInfo);
     HRESULT fileQuerySize(const com::Utf8Str &aPath,
+                          BOOL aFollowSymlinks,
                           LONG64 *aSize);
-    HRESULT fileRename(const com::Utf8Str &aSource,
-                       const com::Utf8Str &aDest,
-                       const std::vector<PathRenameFlag_T> &aFlags);
-    HRESULT fileSetACL(const com::Utf8Str &aFile,
-                       const com::Utf8Str &aAcl);
-    HRESULT fsExists(const com::Utf8Str &aPath,
-                     BOOL aFollowSymlinks,
-                     BOOL *pfExists);
-    HRESULT fsQueryInfo(const com::Utf8Str &aPath,
+    HRESULT fsObjExists(const com::Utf8Str &aPath,
                         BOOL aFollowSymlinks,
-                        ComPtr<IGuestFsObjInfo> &aInfo);
+                        BOOL *pfExists);
+    HRESULT fsObjQueryInfo(const com::Utf8Str &aPath,
+                           BOOL aFollowSymlinks,
+                           ComPtr<IGuestFsObjInfo> &aInfo);
+    HRESULT fsObjRemove(const com::Utf8Str &aPath);
+    HRESULT fsObjRename(const com::Utf8Str &aOldPath,
+                        const com::Utf8Str &aNewPath,
+                        const std::vector<FsObjRenameFlag_T> &aFlags);
+    HRESULT fsObjMove(const com::Utf8Str &aSource,
+                      const com::Utf8Str &aDestination,
+                      const std::vector<FsObjMoveFlags_T> &aFlags,
+                      ComPtr<IProgress> &aProgress);
+    HRESULT fsObjSetACL(const com::Utf8Str &aPath,
+                        BOOL aFollowSymlinks,
+                        const com::Utf8Str &aAcl,
+                        ULONG aMode);
     HRESULT processCreate(const com::Utf8Str &aCommand,
                           const std::vector<com::Utf8Str> &aArguments,
@@ -380,6 +400,4 @@
                         const std::vector<SymlinkReadFlag_T> &aFlags,
                         com::Utf8Str &aTarget);
-    HRESULT symlinkRemoveDirectory(const com::Utf8Str &aPath);
-    HRESULT symlinkRemoveFile(const com::Utf8Str &aFile);
     HRESULT waitFor(ULONG aWaitFor,
                     ULONG aTimeoutMS,
@@ -422,5 +440,5 @@
     int                     i_fileOpenInternal(const GuestFileOpenInfo &openInfo, ComObjPtr<GuestFile> &pFile, int *pGuestRc);
     int                     i_fileQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks, GuestFsObjData &objData, int *pGuestRc);
-    int                     i_fileQuerySizeInternal(const Utf8Str &strPath, int64_t *pllSize, int *pGuestRc);
+    int                     i_fileQuerySizeInternal(const Utf8Str &strPath, bool fFollowSymlinks, int64_t *pllSize, int *pGuestRc);
     int                     i_fsQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks, GuestFsObjData &objData, int *pGuestRc);
     const GuestCredentials &i_getCredentials(void);
Index: /trunk/src/VBox/Main/src-client/GuestFileImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/GuestFileImpl.cpp	(revision 55630)
+++ /trunk/src/VBox/Main/src-client/GuestFileImpl.cpp	(revision 55631)
@@ -254,5 +254,5 @@
 }
 
-HRESULT GuestFile::getDisposition(com::Utf8Str &aDisposition)
+HRESULT GuestFile::getOpenAction(FileOpenAction_T *aOpenAction)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -261,5 +261,5 @@
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    aDisposition = mData.mOpenInfo.mDisposition;
+    *aOpenAction = mData.mOpenInfo.mOpenAction;
 
     return S_OK;
@@ -331,5 +331,5 @@
 }
 
-HRESULT GuestFile::getOpenMode(com::Utf8Str &aOpenMode)
+HRESULT GuestFile::getAccessMode(FileAccessMode_T *aAccessMode)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -338,5 +338,5 @@
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    aOpenMode = mData.mOpenInfo.mOpenMode;
+    *aAccessMode = mData.mOpenInfo.mAccessMode;
 
     return S_OK;
@@ -694,7 +694,8 @@
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    LogFlowThisFunc(("strFile=%s, strOpenMode=%s, strDisposition=%s, uCreationMode=%RU32, uOffset=%RU64\n",
-                     mData.mOpenInfo.mFileName.c_str(), mData.mOpenInfo.mOpenMode.c_str(),
-                     mData.mOpenInfo.mDisposition.c_str(), mData.mOpenInfo.mCreationMode, mData.mOpenInfo.mInitialOffset));
+    LogFlowThisFunc(("strFile=%s, enmAccessMode=%d (%s) enmOpenAction=%d (%s) uCreationMode=%RU32, uOffset=%RU64\n",
+                     mData.mOpenInfo.mFileName.c_str(), mData.mOpenInfo.mAccessMode, mData.mOpenInfo.mpszAccessMode,
+                     mData.mOpenInfo.mOpenAction, mData.mOpenInfo.mpszOpenAction, mData.mOpenInfo.mCreationMode,
+                     mData.mOpenInfo.mInitialOffset));
     int vrc;
 
@@ -721,10 +722,7 @@
     paParms[i++].setPointer((void*)mData.mOpenInfo.mFileName.c_str(),
                             (ULONG)mData.mOpenInfo.mFileName.length() + 1);
-    paParms[i++].setPointer((void*)mData.mOpenInfo.mOpenMode.c_str(),
-                            (ULONG)mData.mOpenInfo.mOpenMode.length() + 1);
-    paParms[i++].setPointer((void*)mData.mOpenInfo.mDisposition.c_str(),
-                            (ULONG)mData.mOpenInfo.mDisposition.length() + 1);
-    paParms[i++].setPointer((void*)mData.mOpenInfo.mSharingMode.c_str(),
-                            (ULONG)mData.mOpenInfo.mSharingMode.length() + 1);
+    paParms[i++].setString(mData.mOpenInfo.mpszAccessMode);
+    paParms[i++].setString(mData.mOpenInfo.mpszOpenAction);
+    paParms[i++].setString(""); /** @todo sharing mode. */
     paParms[i++].setUInt32(mData.mOpenInfo.mCreationMode);
     paParms[i++].setUInt64(mData.mOpenInfo.mInitialOffset);
@@ -1265,4 +1263,13 @@
 }
 
+HRESULT GuestFile::querySize(LONG64 *aSize)
+{
+#ifndef VBOX_WITH_GUEST_CONTROL
+    ReturnComNotImplemented();
+#else
+    ReturnComNotImplemented();
+#endif /* VBOX_WITH_GUEST_CONTROL */
+}
+
 HRESULT GuestFile::read(ULONG aToRead, ULONG aTimeoutMS, std::vector<BYTE> &aData)
 {
@@ -1344,5 +1351,5 @@
 }
 
-HRESULT GuestFile::seek(LONG64 aOffset, FileSeekType_T aWhence)
+HRESULT GuestFile::seek(LONG64 aOffset, FileSeekOrigin_T aWhence, LONG64 *aNewOffset)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -1356,10 +1363,14 @@
     switch (aWhence)
     {
-        case FileSeekType_Set:
+        case FileSeekOrigin_Set:
             eSeekType = GUEST_FILE_SEEKTYPE_BEGIN;
             break;
 
-        case FileSeekType_Current:
+        case FileSeekOrigin_Current:
             eSeekType = GUEST_FILE_SEEKTYPE_CURRENT;
+            break;
+
+        case FileSeekOrigin_End:
+            eSeekType = GUEST_FILE_SEEKTYPE_END;
             break;
 
@@ -1369,7 +1380,10 @@
     }
 
+    uint64_t uNewOffset;
     int vrc = i_seekAt(aOffset, eSeekType,
-                       30 * 1000 /* 30s timeout */, NULL /* puOffset */);
-    if (RT_FAILURE(vrc))
+                       30 * 1000 /* 30s timeout */, &uNewOffset);
+    if (RT_SUCCESS(vrc))
+        *aNewOffset = RT_MIN(uNewOffset, (uint64_t)INT64_MAX);
+    else
     {
         switch (vrc)
@@ -1388,5 +1402,14 @@
 }
 
-HRESULT GuestFile::setACL(const com::Utf8Str &aAcl)
+HRESULT GuestFile::setACL(const com::Utf8Str &aAcl, ULONG aMode)
+{
+#ifndef VBOX_WITH_GUEST_CONTROL
+    ReturnComNotImplemented();
+#else
+    ReturnComNotImplemented();
+#endif /* VBOX_WITH_GUEST_CONTROL */
+}
+
+HRESULT GuestFile::setSize(LONG64 aSize)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
Index: /trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp	(revision 55630)
+++ /trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp	(revision 55631)
@@ -574,4 +574,14 @@
 }
 
+HRESULT GuestSession::getCurrentDirectory(com::Utf8Str &aCurrentDirectory)
+{
+    ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::setCurrentDirectory(const com::Utf8Str &aCurrentDirectory)
+{
+    ReturnComNotImplemented();
+}
+
 HRESULT GuestSession::getDirectories(std::vector<ComPtr<IGuestDirectory> > &aDirectories)
 {
@@ -1290,7 +1300,7 @@
                                      ComObjPtr<GuestFile> &pFile, int *pGuestRc)
 {
-    LogFlowThisFunc(("strPath=%s, strOpenMode=%s, strDisposition=%s, uCreationMode=%x, uOffset=%RU64\n",
-                     openInfo.mFileName.c_str(), openInfo.mOpenMode.c_str(), openInfo.mDisposition.c_str(),
-                     openInfo.mCreationMode, openInfo.mInitialOffset));
+    LogFlowThisFunc(("strFile=%s, enmAccessMode=%d (%s) enmOpenAction=%d (%s) uCreationMode=%RU32, uOffset=%RU64\n",
+                     openInfo.mFileName.c_str(), openInfo.mAccessMode, openInfo.mpszAccessMode,
+                     openInfo.mOpenAction, openInfo.mpszOpenAction, openInfo.mCreationMode, openInfo.mInitialOffset));
 
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -1404,10 +1414,10 @@
 }
 
-int GuestSession::i_fileQuerySizeInternal(const Utf8Str &strPath, int64_t *pllSize, int *pGuestRc)
+int GuestSession::i_fileQuerySizeInternal(const Utf8Str &strPath, bool fFollowSymlinks, int64_t *pllSize, int *pGuestRc)
 {
     AssertPtrReturn(pllSize, VERR_INVALID_POINTER);
 
     GuestFsObjData objData;
-    int vrc = i_fileQueryInfoInternal(strPath, false /*fFollowSymlinks*/, objData, pGuestRc);
+    int vrc = i_fileQueryInfoInternal(strPath, fFollowSymlinks, objData, pGuestRc);
     if (RT_SUCCESS(vrc))
         *pllSize = objData.mObjectSize;
@@ -2486,7 +2496,13 @@
 }
 
-HRESULT GuestSession::copyFrom(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
-                               const std::vector<CopyFileFlag_T> &aFlags,
-                               ComPtr<IProgress> &aProgress)
+HRESULT GuestSession::fileCopy(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+                               const std::vector<FileCopyFlag_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+    ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::fileCopyFromGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
+                                        const std::vector<FileCopyFlag_T> &aFlags,
+                                        ComPtr<IProgress> &aProgress)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -2501,5 +2517,5 @@
         return setError(E_INVALIDARG, tr("No destination specified"));
 
-    uint32_t fFlags = CopyFileFlag_None;
+    uint32_t fFlags = FileCopyFlag_None;
     if (aFlags.size())
     {
@@ -2507,4 +2523,5 @@
             fFlags |= aFlags[i];
     }
+/** @todo r=bird: fend off flags we don't implement here!  */
 
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -2535,6 +2552,6 @@
 }
 
-HRESULT GuestSession::copyTo(const com::Utf8Str &aSource, const com::Utf8Str &aDest, const std::vector<CopyFileFlag_T> &aFlags,
-                             ComPtr<IProgress> &aProgress)
+HRESULT GuestSession::fileCopyToGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
+                                      const std::vector<FileCopyFlag_T> &aFlags, ComPtr<IProgress> &aProgress)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -2549,5 +2566,5 @@
         return setError(E_INVALIDARG, tr("No destination specified"));
 
-    uint32_t fFlags = CopyFileFlag_None;
+    uint32_t fFlags = FileCopyFlag_None;
     if (aFlags.size())
     {
@@ -2555,4 +2572,5 @@
             fFlags |= aFlags[i];
     }
+/** @todo r=bird: fend off flags we don't implement here!  */
 
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -2586,4 +2604,22 @@
 }
 
+HRESULT GuestSession::directoryCopy(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+                                    const std::vector<DirectoryCopyFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+    ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::directoryCopyFromGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+                                             const std::vector<DirectoryCopyFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+    ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::directoryCopyToGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+                                           const std::vector<DirectoryCopyFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+    ReturnComNotImplemented();
+}
+
 HRESULT GuestSession::directoryCreate(const com::Utf8Str &aPath, ULONG aMode,
                                       const std::vector<DirectoryCreateFlag_T> &aFlags)
@@ -2677,5 +2713,5 @@
 }
 
-HRESULT GuestSession::directoryExists(const com::Utf8Str &aPath, BOOL *aExists)
+HRESULT GuestSession::directoryExists(const com::Utf8Str &aPath, BOOL aFollowSymlinks, BOOL *aExists)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -2690,9 +2726,11 @@
 
     GuestFsObjData objData; int guestRc;
-    int rc = i_directoryQueryInfoInternal(aPath, false /*fFollowSymlinks*/, objData, &guestRc);
+    int rc = i_directoryQueryInfoInternal(aPath, aFollowSymlinks != FALSE, objData, &guestRc);
     if (RT_SUCCESS(rc))
         *aExists = objData.mType == FsObjType_Directory;
     else
     {
+        /** @todo r=bird: Looks like this code raises errors if the directory doesn't
+         *        exist... That's of course not right. */
         switch (rc)
         {
@@ -2773,59 +2811,4 @@
 }
 
-HRESULT GuestSession::directoryQueryInfo(const com::Utf8Str &aPath, ComPtr<IGuestFsObjInfo> &aInfo)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No directory to query information for specified"));
-
-    HRESULT hr = S_OK;
-
-    GuestFsObjData objData; int guestRc;
-    int vrc = i_directoryQueryInfoInternal(aPath, false /*fFollowSymlinks*/, objData, &guestRc);
-    if (RT_SUCCESS(vrc))
-    {
-        if (objData.mType == FsObjType_Directory)
-        {
-            ComObjPtr<GuestFsObjInfo> pFsObjInfo;
-            hr = pFsObjInfo.createObject();
-            if (FAILED(hr)) return hr;
-
-            vrc = pFsObjInfo->init(objData);
-            if (RT_SUCCESS(vrc))
-            {
-                hr = pFsObjInfo.queryInterfaceTo(aInfo.asOutParam());
-                if (FAILED(hr)) return hr;
-            }
-        }
-    }
-
-    if (RT_FAILURE(vrc))
-    {
-        switch (vrc)
-        {
-            case VERR_GSTCTL_GUEST_ERROR:
-                hr = GuestProcess::i_setErrorExternal(this, guestRc);
-                break;
-
-            case VERR_NOT_A_DIRECTORY:
-                hr = setError(VBOX_E_IPRT_ERROR, tr("Element \"%s\" exists but is not a directory"),
-                                                    aPath.c_str());
-                break;
-
-            default:
-                hr = setError(VBOX_E_IPRT_ERROR, tr("Querying directory information for \"%s\" failed: %Rrc"),
-                              aPath.c_str(), vrc);
-                break;
-        }
-    }
-
-    return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
 HRESULT GuestSession::directoryRemove(const com::Utf8Str &aPath)
 {
@@ -2881,4 +2864,7 @@
     if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
         return setError(E_INVALIDARG, tr("No directory to remove recursively specified"));
+
+/** @todo r=bird: Must check that the flags matches the hardcoded behavior
+ *        further down!! */
 
     HRESULT hr = i_isReadyExternal();
@@ -2933,64 +2919,4 @@
 
     return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::directoryRename(const com::Utf8Str &aSource,
-                                      const com::Utf8Str &aDest,
-                                      const std::vector<PathRenameFlag_T> &aFlags)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    if (RT_UNLIKELY((aSource.c_str()) == NULL || *(aSource.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No source directory to rename specified"));
-
-    if (RT_UNLIKELY((aDest.c_str()) == NULL || *(aDest.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No destination directory to rename the source to specified"));
-
-    HRESULT hr = i_isReadyExternal();
-    if (FAILED(hr))
-        return hr;
-
-    /* No flags; only remove the directory when empty. */
-    uint32_t uFlags = 0;
-
-    int guestRc;
-    int vrc = i_pathRenameInternal(aSource, aDest, uFlags, &guestRc);
-    if (RT_FAILURE(vrc))
-    {
-        switch (vrc)
-        {
-            case VERR_NOT_SUPPORTED:
-                hr = setError(VBOX_E_IPRT_ERROR,
-                              tr("Handling renaming guest directories not supported by installed Guest Additions"));
-                break;
-
-            case VERR_GSTCTL_GUEST_ERROR:
-                hr = setError(VBOX_E_IPRT_ERROR,
-                              tr("Renaming guest directory failed: %Rrc"), guestRc);
-                break;
-
-            default:
-                hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest directory \"%s\" failed: %Rrc"),
-                              aSource.c_str(), vrc);
-                break;
-        }
-    }
-
-    return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::directorySetACL(const com::Utf8Str &aPath, const com::Utf8Str &aAcl)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    ReturnComNotImplemented();
 #endif /* VBOX_WITH_GUEST_CONTROL */
 }
@@ -3138,16 +3064,17 @@
 }
 
-HRESULT GuestSession::fileExists(const com::Utf8Str &aPath, BOOL *aExists)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
+HRESULT GuestSession::fileExists(const com::Utf8Str &aPath, BOOL aFollowSymlinks, BOOL *aExists)
+{
+#ifndef VBOX_WITH_GUEST_CONTROL
+    ReturnComNotImplemented();
+#else
+    LogFlowThisFuncEnter();
+
+/** @todo r=bird: Treat empty file with a FALSE return. */
     if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
         return setError(E_INVALIDARG, tr("No file to check existence for specified"));
 
     GuestFsObjData objData; int guestRc;
-    int vrc = i_fileQueryInfoInternal(aPath, false /*fFollowSymlinks*/, objData, &guestRc);
+    int vrc = i_fileQueryInfoInternal(aPath, aFollowSymlinks != FALSE, objData, &guestRc);
     if (RT_SUCCESS(vrc))
     {
@@ -3164,4 +3091,6 @@
             break;
 
+/** @todo r=bird: what about VERR_PATH_NOT_FOUND and VERR_FILE_NOT_FOUND?
+ *        Where does that get converted to *aExists = FALSE? */
         case VERR_NOT_A_FILE:
             *aExists = FALSE;
@@ -3178,38 +3107,5 @@
 }
 
-HRESULT GuestSession::fileRemove(const com::Utf8Str &aPath)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No file to remove specified"));
-
-    HRESULT hr = S_OK;
-
-    int guestRc;
-    int vrc = i_fileRemoveInternal(aPath, &guestRc);
-    if (RT_FAILURE(vrc))
-    {
-        switch (vrc)
-        {
-            case VERR_GSTCTL_GUEST_ERROR:
-                hr = GuestProcess::i_setErrorExternal(this, guestRc);
-                break;
-
-            default:
-                hr = setError(VBOX_E_IPRT_ERROR, tr("Removing file \"%s\" failed: %Rrc"),
-                              aPath.c_str(), vrc);
-                break;
-        }
-    }
-
-    return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::fileOpen(const com::Utf8Str &aPath, const com::Utf8Str &aOpenMode, const com::Utf8Str &aDisposition,
+HRESULT GuestSession::fileOpen(const com::Utf8Str &aPath, FileAccessMode_T aAccessMode, FileOpenAction_T aOpenAction,
                                ULONG aCreationMode, ComPtr<IGuestFile> &aFile)
 {
@@ -3218,16 +3114,10 @@
 #else
     LogFlowThisFuncEnter();
-
-    Utf8Str strSharingMode = ""; /* Sharing mode is ignored. */
-
-    return fileOpenEx(aPath, aOpenMode, aDisposition, strSharingMode, aCreationMode,
-                      0 /* aOffset */, aFile);
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::fileOpenEx(const com::Utf8Str &aPath, const com::Utf8Str &aOpenMode, const com::Utf8Str &aDisposition,
-                                 const com::Utf8Str &aSharingMode, ULONG aCreationMode, LONG64 aOffset,
-                                 ComPtr<IGuestFile> &aFile)
-
+    return fileOpenEx(aPath, aAccessMode, aOpenAction, FileSharingMode_All, aCreationMode, 0 /* aOffset */, aFile);
+#endif /* VBOX_WITH_GUEST_CONTROL */
+}
+
+HRESULT GuestSession::fileOpenEx(const com::Utf8Str &aPath, FileAccessMode_T aAccessMode, FileOpenAction_T aOpenAction,
+                                 FileSharingMode_T aSharingMode, ULONG aCreationMode, LONG64 aOffset, ComPtr<IGuestFile> &aFile)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -3238,9 +3128,4 @@
     if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
         return setError(E_INVALIDARG, tr("No file to open specified"));
-    if (RT_UNLIKELY((aOpenMode.c_str()) == NULL || *(aOpenMode.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No open mode specified"));
-    if (RT_UNLIKELY((aDisposition.c_str()) == NULL || *(aDisposition.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No disposition mode specified"));
-    /* aSharingMode is optional. */
 
     HRESULT hr = i_isReadyExternal();
@@ -3248,25 +3133,60 @@
         return hr;
 
-    /** @todo Validate creation mode. */
-    uint32_t uCreationMode = 0;
-
     GuestFileOpenInfo openInfo;
     openInfo.mFileName = aPath;
-    openInfo.mOpenMode = aOpenMode;
-    openInfo.mDisposition = aDisposition;
-    openInfo.mSharingMode = aSharingMode;
     openInfo.mCreationMode = aCreationMode;
     openInfo.mInitialOffset = aOffset;
 
-    uint64_t uFlagsIgnored;
-    int vrc = RTFileModeToFlagsEx(openInfo.mOpenMode.c_str(),
-                                  openInfo.mDisposition.c_str(),
-                                  openInfo.mSharingMode.c_str(),
-                                  &uFlagsIgnored);
-    if (RT_FAILURE(vrc))
-        return setError(E_INVALIDARG, tr("Invalid open mode / disposition / sharing mode specified"));
-
-    ComObjPtr <GuestFile> pFile; int guestRc;
-    vrc = i_fileOpenInternal(openInfo, pFile, &guestRc);
+    /* convert + validate aAccessMode to the old format. */
+    openInfo.mAccessMode = aAccessMode;
+    switch (aAccessMode)
+    {
+        case (FileAccessMode_T)FileAccessMode_ReadOnly:  openInfo.mpszAccessMode = "r"; break;
+        case (FileAccessMode_T)FileAccessMode_WriteOnly: openInfo.mpszAccessMode = "w"; break;
+        case (FileAccessMode_T)FileAccessMode_ReadWrite: openInfo.mpszAccessMode = "r+"; break;
+        case (FileAccessMode_T)FileAccessMode_AppendOnly:
+            /* fall thru */
+        case (FileAccessMode_T)FileAccessMode_AppendRead:
+            return setError(E_NOTIMPL, tr("Append access modes are not yet implemented"));
+        default:
+            return setError(E_INVALIDARG, tr("Unknown FileAccessMode value %u (%#x)"), aAccessMode, aAccessMode);
+    }
+
+    /* convert + validate aOpenAction to the old format. */
+    openInfo.mOpenAction = aOpenAction;
+    switch (aOpenAction)
+    {
+        case (FileOpenAction_T)FileOpenAction_OpenExisting:          openInfo.mpszOpenAction = "oe"; break;
+        case (FileOpenAction_T)FileOpenAction_OpenOrCreate:          openInfo.mpszOpenAction = "oc"; break;
+        case (FileOpenAction_T)FileOpenAction_CreateNew:             openInfo.mpszOpenAction = "ce"; break;
+        case (FileOpenAction_T)FileOpenAction_CreateOrReplace:       openInfo.mpszOpenAction = "ca"; break;
+        case (FileOpenAction_T)FileOpenAction_OpenExistingTruncated: openInfo.mpszOpenAction = "ot"; break;
+        case (FileOpenAction_T)FileOpenAction_AppendOrCreate:
+            openInfo.mpszOpenAction = "ca"; /** @todo get rid of this one and implement AppendOnly/AppendRead. */
+            break;
+        default:
+            return setError(E_INVALIDARG, tr("Unknown FileOpenAction value %u (%#x)"), aAccessMode, aAccessMode);
+    }
+
+    /* validate aSharingMode */
+    openInfo.mSharingMode = aSharingMode;
+    switch (aSharingMode)
+    {
+        case (FileSharingMode_T)FileSharingMode_All: /* OK */ break;
+        case (FileSharingMode_T)FileSharingMode_Read:
+        case (FileSharingMode_T)FileSharingMode_Write:
+        case (FileSharingMode_T)FileSharingMode_ReadWrite:
+        case (FileSharingMode_T)FileSharingMode_Delete:
+        case (FileSharingMode_T)FileSharingMode_ReadDelete:
+        case (FileSharingMode_T)FileSharingMode_WriteDelete:
+            return setError(E_NOTIMPL, tr("Only FileSharingMode_All is currently implemented"));
+
+        default:
+            return setError(E_INVALIDARG, tr("Unknown FileOpenAction value %u (%#x)"), aAccessMode, aAccessMode);
+    }
+
+    ComObjPtr <GuestFile> pFile;
+    int guestRc;
+    int vrc = i_fileOpenInternal(openInfo, pFile, &guestRc);
     if (RT_SUCCESS(vrc))
         /* Return directory object to the caller. */
@@ -3296,56 +3216,5 @@
 }
 
-HRESULT GuestSession::fileQueryInfo(const com::Utf8Str &aPath, ComPtr<IGuestFsObjInfo> &aInfo)
-
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No file to query information for specified"));
-
-    HRESULT hr = S_OK;
-
-    GuestFsObjData objData; int guestRc;
-    int vrc = i_fileQueryInfoInternal(aPath, false /*fFollowSymlinks*/, objData, &guestRc);
-    if (RT_SUCCESS(vrc))
-    {
-        ComObjPtr<GuestFsObjInfo> pFsObjInfo;
-        hr = pFsObjInfo.createObject();
-        if (FAILED(hr)) return hr;
-
-        vrc = pFsObjInfo->init(objData);
-        if (RT_SUCCESS(vrc))
-        {
-            hr = pFsObjInfo.queryInterfaceTo(aInfo.asOutParam());
-            if (FAILED(hr)) return hr;
-        }
-    }
-
-    if (RT_FAILURE(vrc))
-    {
-        switch (vrc)
-        {
-            case VERR_GSTCTL_GUEST_ERROR:
-                hr = GuestProcess::i_setErrorExternal(this, guestRc);
-                break;
-
-            case VERR_NOT_A_FILE:
-                hr = setError(VBOX_E_IPRT_ERROR, tr("Element exists but is not a file"));
-                break;
-
-            default:
-               hr = setError(VBOX_E_IPRT_ERROR, tr("Querying file information failed: %Rrc"), vrc);
-               break;
-        }
-    }
-
-    return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::fileQuerySize(const com::Utf8Str &aPath, LONG64 *aSize)
+HRESULT GuestSession::fileQuerySize(const com::Utf8Str &aPath, BOOL aFollowSymlinks, LONG64 *aSize)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -3360,5 +3229,5 @@
 
     int64_t llSize; int guestRc;
-    int vrc = i_fileQuerySizeInternal(aPath, &llSize, &guestRc);
+    int vrc = i_fileQuerySizeInternal(aPath, aFollowSymlinks != FALSE,  &llSize, &guestRc);
     if (RT_SUCCESS(vrc))
         *aSize = llSize;
@@ -3381,65 +3250,5 @@
 }
 
-HRESULT GuestSession::fileRename(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
-                                 const std::vector<PathRenameFlag_T> &aFlags)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    if (RT_UNLIKELY((aSource.c_str()) == NULL || *(aSource.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No source file to rename specified"));
-
-    if (RT_UNLIKELY((aDest.c_str()) == NULL || *(aDest.c_str()) == '\0'))
-        return setError(E_INVALIDARG, tr("No destination file to rename the source to specified"));
-
-    HRESULT hr = i_isReadyExternal();
-    if (FAILED(hr))
-        return hr;
-
-    /* No flags; only remove the directory when empty. */
-    uint32_t uFlags = 0;
-
-    int guestRc;
-    int vrc = i_pathRenameInternal(aSource, aDest, uFlags, &guestRc);
-    if (RT_FAILURE(vrc))
-    {
-        switch (vrc)
-        {
-            case VERR_NOT_SUPPORTED:
-                hr = setError(VBOX_E_IPRT_ERROR,
-                              tr("Handling renaming guest files not supported by installed Guest Additions"));
-                break;
-
-            case VERR_GSTCTL_GUEST_ERROR:
-                /** @todo Proper guestRc to text translation needed. */
-                hr = setError(VBOX_E_IPRT_ERROR,
-                              tr("Renaming guest file failed: %Rrc"), guestRc);
-                break;
-
-            default:
-                hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest file \"%s\" failed: %Rrc"),
-                              aSource.c_str(), vrc);
-                break;
-        }
-    }
-
-    return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::fileSetACL(const com::Utf8Str &aFile, const com::Utf8Str &aAcl)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::fsExists(const com::Utf8Str &aPath, BOOL aFollowSymlinks, BOOL *aExists)
+HRESULT GuestSession::fsObjExists(const com::Utf8Str &aPath, BOOL aFollowSymlinks, BOOL *aExists)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -3474,5 +3283,5 @@
 }
 
-HRESULT GuestSession::fsQueryInfo(const com::Utf8Str &aPath, BOOL aFollowSymlinks, ComPtr<IGuestFsObjInfo> &aInfo)
+HRESULT GuestSession::fsObjQueryInfo(const com::Utf8Str &aPath, BOOL aFollowSymlinks, ComPtr<IGuestFsObjInfo> &aInfo)
 {
 #ifndef VBOX_WITH_GUEST_CONTROL
@@ -3511,4 +3320,111 @@
 #endif /* VBOX_WITH_GUEST_CONTROL */
 }
+
+HRESULT GuestSession::fsObjRemove(const com::Utf8Str &aPath)
+{
+#ifndef VBOX_WITH_GUEST_CONTROL
+    ReturnComNotImplemented();
+#else
+    LogFlowThisFuncEnter();
+
+    if (RT_UNLIKELY(aPath.isEmpty()))
+        return setError(E_INVALIDARG, tr("Empty path specified"));
+
+    HRESULT hr = S_OK;
+
+    int guestRc;
+    int vrc = i_fileRemoveInternal(aPath, &guestRc);
+    if (RT_FAILURE(vrc))
+    {
+        switch (vrc)
+        {
+            case VERR_GSTCTL_GUEST_ERROR:
+                hr = GuestProcess::i_setErrorExternal(this, guestRc);
+                break;
+
+            default:
+                hr = setError(VBOX_E_IPRT_ERROR, tr("Removing file \"%s\" failed: %Rrc"),
+                              aPath.c_str(), vrc);
+                break;
+        }
+    }
+
+    return hr;
+#endif /* VBOX_WITH_GUEST_CONTROL */
+}
+
+HRESULT GuestSession::fsObjRename(const com::Utf8Str &aSource,
+                                  const com::Utf8Str &aDestination,
+                                  const std::vector<FsObjRenameFlag_T> &aFlags)
+{
+#ifndef VBOX_WITH_GUEST_CONTROL
+    ReturnComNotImplemented();
+#else
+    LogFlowThisFuncEnter();
+
+    if (RT_UNLIKELY(aSource.isEmpty()))
+        return setError(E_INVALIDARG, tr("No source path specified"));
+
+    if (RT_UNLIKELY(aDestination.isEmpty()))
+        return setError(E_INVALIDARG, tr("No destination path specified"));
+
+    HRESULT hr = i_isReadyExternal();
+    if (FAILED(hr))
+        return hr;
+
+    /* Combine, validate and convert flags. */
+    uint32_t fApiFlags = 0;
+    for (size_t i = 0; i < aFlags.size(); i++)
+        fApiFlags |= aFlags[i];
+    if (fApiFlags & ~((uint32_t)FsObjRenameFlag_NoReplace | (uint32_t)FsObjRenameFlag_Replace))
+        return setError(E_INVALIDARG, tr("Unknown rename flag: %#x"), fApiFlags);
+
+    AssertCompile(FsObjRenameFlag_NoReplace == 0);
+    AssertCompile(FsObjRenameFlag_Replace != 0);
+    uint32_t fBackend;
+    if ((fApiFlags & ((uint32_t)FsObjRenameFlag_NoReplace | (uint32_t)FsObjRenameFlag_Replace)) == FsObjRenameFlag_Replace)
+        fBackend = PATHRENAME_FLAG_REPLACE;
+    else
+        fBackend = PATHRENAME_FLAG_NO_REPLACE;
+
+    /* Call worker to do the job. */
+    int guestRc;
+    int vrc = i_pathRenameInternal(aSource, aDestination, fBackend, &guestRc);
+    if (RT_FAILURE(vrc))
+    {
+        switch (vrc)
+        {
+            case VERR_NOT_SUPPORTED:
+                hr = setError(VBOX_E_IPRT_ERROR,
+                              tr("Handling renaming guest directories not supported by installed Guest Additions"));
+                break;
+
+            case VERR_GSTCTL_GUEST_ERROR:
+                hr = setError(VBOX_E_IPRT_ERROR,
+                              tr("Renaming guest directory failed: %Rrc"), guestRc);
+                break;
+
+            default:
+                hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest directory \"%s\" failed: %Rrc"),
+                              aSource.c_str(), vrc);
+                break;
+        }
+    }
+
+    return hr;
+#endif /* VBOX_WITH_GUEST_CONTROL */
+}
+
+HRESULT GuestSession::fsObjMove(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+                                const std::vector<FsObjMoveFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+    ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::fsObjSetACL(const com::Utf8Str &aPath, BOOL aFollowSymlinks, const com::Utf8Str &aAcl, ULONG aMode)
+{
+    ReturnComNotImplemented();
+}
+
 
 HRESULT GuestSession::processCreate(const com::Utf8Str &aExecutable, const std::vector<com::Utf8Str> &aArguments,
@@ -3704,26 +3620,4 @@
 }
 
-HRESULT GuestSession::symlinkRemoveDirectory(const com::Utf8Str &aPath)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::symlinkRemoveFile(const com::Utf8Str &aFile)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
-    ReturnComNotImplemented();
-#else
-    LogFlowThisFuncEnter();
-
-    ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
 HRESULT GuestSession::waitFor(ULONG aWaitFor, ULONG aTimeoutMS, GuestSessionWaitResult_T *aReason)
 {
Index: /trunk/src/VBox/Main/src-client/GuestSessionImplTasks.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/GuestSessionImplTasks.cpp	(revision 55630)
+++ /trunk/src/VBox/Main/src-client/GuestSessionImplTasks.cpp	(revision 55631)
@@ -937,5 +937,5 @@
             SessionTaskCopyTo *pTask = new SessionTaskCopyTo(pSession /* GuestSession */,
                                                              &pISO->file, cbOffset, cbSize,
-                                                             strFileDest, CopyFileFlag_None);
+                                                             strFileDest, FileCopyFlag_None);
             AssertPtrReturn(pTask, VERR_NO_MEMORY);
 
@@ -973,5 +973,5 @@
         GuestFsObjData objData;
         int64_t cbSizeOnGuest; int guestRc;
-        rc = pSession->i_fileQuerySizeInternal(strFileDest, &cbSizeOnGuest, &guestRc);
+        rc = pSession->i_fileQuerySizeInternal(strFileDest, false /*fFollowSymlinks*/, &cbSizeOnGuest, &guestRc);
         if (   RT_SUCCESS(rc)
             && cbSize == (uint64_t)cbSizeOnGuest)
